tangany 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +7 -0
  2. data/.reek.yml +4 -0
  3. data/.rspec +3 -0
  4. data/.rubycritic.yml +7 -0
  5. data/.sasori/Dockerfile +51 -0
  6. data/.simplecov +13 -0
  7. data/CHANGELOG.md +5 -0
  8. data/CODE_OF_CONDUCT.md +84 -0
  9. data/Gemfile +20 -0
  10. data/Gemfile.lock +210 -0
  11. data/LICENSE.txt +21 -0
  12. data/README.md +410 -0
  13. data/Rakefile +133 -0
  14. data/bin/console +22 -0
  15. data/bin/setup +8 -0
  16. data/bin/test-live +170 -0
  17. data/lib/config/chains.json +22 -0
  18. data/lib/tangany/application_contract.rb +19 -0
  19. data/lib/tangany/collection.rb +13 -0
  20. data/lib/tangany/config.rb +24 -0
  21. data/lib/tangany/custody/client.rb +37 -0
  22. data/lib/tangany/custody/collection.rb +17 -0
  23. data/lib/tangany/custody/contracts/wallets/create.rb +23 -0
  24. data/lib/tangany/custody/contracts/wallets/list.rb +37 -0
  25. data/lib/tangany/custody/contracts/wallets/update.rb +21 -0
  26. data/lib/tangany/custody/contracts/wallets.rb +3 -0
  27. data/lib/tangany/custody/contracts.rb +1 -0
  28. data/lib/tangany/custody/objects/wallet.rb +17 -0
  29. data/lib/tangany/custody/objects/wallet_recovery.rb +10 -0
  30. data/lib/tangany/custody/objects/wallet_status.rb +10 -0
  31. data/lib/tangany/custody/objects.rb +3 -0
  32. data/lib/tangany/custody/resource.rb +29 -0
  33. data/lib/tangany/custody/resources/wallet_statuses_resource.rb +9 -0
  34. data/lib/tangany/custody/resources/wallets_resource.rb +34 -0
  35. data/lib/tangany/custody/resources.rb +2 -0
  36. data/lib/tangany/custody.rb +7 -0
  37. data/lib/tangany/customers/application_contract.rb +6 -0
  38. data/lib/tangany/customers/client.rb +37 -0
  39. data/lib/tangany/customers/collection.rb +16 -0
  40. data/lib/tangany/customers/contracts/customers/create.rb +17 -0
  41. data/lib/tangany/customers/contracts/customers/create_schemas/contract.rb +21 -0
  42. data/lib/tangany/customers/contracts/customers/create_schemas/customer.rb +34 -0
  43. data/lib/tangany/customers/contracts/customers/list.rb +17 -0
  44. data/lib/tangany/customers/contracts/customers/update.rb +14 -0
  45. data/lib/tangany/customers/contracts/customers/update_schemas/customer.rb +15 -0
  46. data/lib/tangany/customers/contracts/customers.rb +3 -0
  47. data/lib/tangany/customers/contracts/natural_persons/create.rb +23 -0
  48. data/lib/tangany/customers/contracts/natural_persons/create_schemas/address.rb +23 -0
  49. data/lib/tangany/customers/contracts/natural_persons/create_schemas/document.rb +25 -0
  50. data/lib/tangany/customers/contracts/natural_persons/create_schemas/kyc.rb +24 -0
  51. data/lib/tangany/customers/contracts/natural_persons/create_schemas/natural_person.rb +44 -0
  52. data/lib/tangany/customers/contracts/natural_persons/create_schemas/pep.rb +22 -0
  53. data/lib/tangany/customers/contracts/natural_persons/create_schemas/sanctions.rb +22 -0
  54. data/lib/tangany/customers/contracts/natural_persons/list.rb +17 -0
  55. data/lib/tangany/customers/contracts/natural_persons/update.rb +14 -0
  56. data/lib/tangany/customers/contracts/natural_persons/update_schemas/natural_person.rb +15 -0
  57. data/lib/tangany/customers/contracts/natural_persons.rb +3 -0
  58. data/lib/tangany/customers/contracts/wallet_links/create.rb +28 -0
  59. data/lib/tangany/customers/contracts/wallet_links/list.rb +17 -0
  60. data/lib/tangany/customers/contracts/wallet_links.rb +2 -0
  61. data/lib/tangany/customers/contracts.rb +3 -0
  62. data/lib/tangany/customers/objects/address.rb +11 -0
  63. data/lib/tangany/customers/objects/contract.rb +13 -0
  64. data/lib/tangany/customers/objects/customer.rb +14 -0
  65. data/lib/tangany/customers/objects/document.rb +17 -0
  66. data/lib/tangany/customers/objects/kyc.rb +16 -0
  67. data/lib/tangany/customers/objects/natural_person.rb +30 -0
  68. data/lib/tangany/customers/objects/pep.rb +12 -0
  69. data/lib/tangany/customers/objects/sanctions.rb +12 -0
  70. data/lib/tangany/customers/objects/wallet_link.rb +14 -0
  71. data/lib/tangany/customers/objects.rb +5 -0
  72. data/lib/tangany/customers/resource.rb +11 -0
  73. data/lib/tangany/customers/resources/customers_resource.rb +27 -0
  74. data/lib/tangany/customers/resources/natural_persons_resource.rb +26 -0
  75. data/lib/tangany/customers/resources/wallet_links_resource.rb +37 -0
  76. data/lib/tangany/customers/resources.rb +3 -0
  77. data/lib/tangany/customers.rb +8 -0
  78. data/lib/tangany/error.rb +34 -0
  79. data/lib/tangany/json_patch.rb +65 -0
  80. data/lib/tangany/object.rb +43 -0
  81. data/lib/tangany/operation.rb +10 -0
  82. data/lib/tangany/resource.rb +80 -0
  83. data/lib/tangany/types.rb +7 -0
  84. data/lib/tangany/version.rb +3 -0
  85. data/lib/tangany.rb +47 -0
  86. data/sig/tangany.rbs +4 -0
  87. metadata +217 -0
@@ -0,0 +1,17 @@
1
+ module Tangany
2
+ module Customers
3
+ module Contracts
4
+ module Customers
5
+ class List < ApplicationContract
6
+ schema do
7
+ config.validate_keys = true
8
+
9
+ optional(:pageToken).maybe(:string)
10
+ optional(:limit).filled(:integer, gteq?: 1, lteq?: 100)
11
+ optional(:sort).filled(:string, included_in?: ALLOWED_SORTS)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ require_relative "create"
2
+ require_relative "update_schemas/customer"
3
+
4
+ module Tangany
5
+ module Customers
6
+ module Contracts
7
+ module Customers
8
+ class Update < Create
9
+ schema(UpdateSchemas::Customer.schema) { config.validate_keys = true }
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ require_relative "../create_schemas/customer"
2
+
3
+ module Tangany
4
+ module Customers
5
+ module Contracts
6
+ module Customers
7
+ module UpdateSchemas
8
+ module Customer
9
+ include CreateSchemas::Customer
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ require_relative "customers/create"
2
+ require_relative "customers/list"
3
+ require_relative "customers/update"
@@ -0,0 +1,23 @@
1
+ require_relative "create_schemas/natural_person"
2
+
3
+ module Tangany
4
+ module Customers
5
+ module Contracts
6
+ module NaturalPersons
7
+ class Create < ApplicationContract
8
+ schema(CreateSchemas::NaturalPerson.schema) { config.validate_keys = true }
9
+
10
+ rule(pep: :source) do
11
+ key.failure("must be present if pep.isExposed is true") if values.dig(:pep, :isExposed) && !value
12
+ key.failure("must not be present if pep.isExposed is false") if !values.dig(:pep, :isExposed) && value
13
+ end
14
+
15
+ rule(sanctions: :source) do
16
+ key.failure("must be present if sanctions.isSanctioned is true") if values.dig(:sanctions, :isSanctioned) && !value
17
+ key.failure("must not be present if sanctions.isSanctioned is false") if !values.dig(:sanctions, :isSanctioned) && value
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ module Tangany
2
+ module Customers
3
+ module Contracts
4
+ module NaturalPersons
5
+ module CreateSchemas
6
+ module Address
7
+ class << self
8
+ def schema
9
+ Dry::Schema.Params do
10
+ required(:country).filled(:string, format?: Tangany::ApplicationContract::COUNTRY_CODE_REGEX)
11
+ required(:city).filled(:string, max_size?: 255)
12
+ required(:postcode).filled(:string, max_size?: 255)
13
+ required(:streetName).filled(:string, max_size?: 255)
14
+ required(:streetNumber).filled(:string, max_size?: 255)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ module Tangany
2
+ module Customers
3
+ module Contracts
4
+ module NaturalPersons
5
+ module CreateSchemas
6
+ module Document
7
+ class << self
8
+ def schema
9
+ Dry::Schema.Params do
10
+ required(:country).filled(:string, format?: Tangany::ApplicationContract::COUNTRY_CODE_REGEX)
11
+ required(:nationality).filled(:string, format?: Tangany::ApplicationContract::COUNTRY_CODE_REGEX)
12
+ required(:number).filled(:string, max_size?: 255)
13
+ required(:issuedBy).filled(:string, max_size?: 255)
14
+ required(:issueDate).filled(:string, format?: Tangany::ApplicationContract::DATE_REGEX)
15
+ required(:validUntil).filled(:string, format?: Tangany::ApplicationContract::DATE_REGEX)
16
+ required(:type).filled(:string, included_in?: Tangany::Customers::Document::ALLOWED_TYPES)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ require_relative "document"
2
+
3
+ module Tangany
4
+ module Customers
5
+ module Contracts
6
+ module NaturalPersons
7
+ module CreateSchemas
8
+ module Kyc
9
+ class << self
10
+ def schema
11
+ Dry::Schema.Params do
12
+ required(:id).filled(:string, max_size?: 255)
13
+ required(:date).filled(:string, format?: Tangany::ApplicationContract::DATE_REGEX)
14
+ required(:method).filled(:string, included_in?: Tangany::Customers::Kyc::ALLOWED_METHODS)
15
+ optional(:document).hash(Document.schema)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,44 @@
1
+ require_relative "address"
2
+ require_relative "kyc"
3
+ require_relative "pep"
4
+ require_relative "sanctions"
5
+
6
+ module Tangany
7
+ module Customers
8
+ module Contracts
9
+ module NaturalPersons
10
+ module CreateSchemas
11
+ module NaturalPerson
12
+ module ClassMethods
13
+ def schema
14
+ Dry::Schema.Params do
15
+ required(:id).filled(:string, max_size?: 40)
16
+ optional(:title).maybe(:string, max_size?: 255)
17
+ required(:firstName).filled(:string, max_size?: 255)
18
+ required(:lastName).filled(:string, max_size?: 255)
19
+ optional(:gender).maybe(:string, included_in?: Tangany::Customers::NaturalPerson::ALLOWED_GENDERS)
20
+ required(:birthDate).filled(:string, format?: Tangany::ApplicationContract::DATE_REGEX)
21
+ required(:birthPlace).filled(:string, max_size?: 255)
22
+ required(:birthCountry).filled(:string, format?: Tangany::ApplicationContract::COUNTRY_CODE_REGEX)
23
+ optional(:birthName).maybe(:string, max_size?: 255)
24
+ optional(:nationality).maybe(:string, format?: Tangany::ApplicationContract::COUNTRY_CODE_REGEX)
25
+ optional(:address).hash(Address.schema)
26
+ optional(:email).maybe(:string, max_size?: 255)
27
+ optional(:kyc).hash(Kyc.schema)
28
+ optional(:pep).hash(Pep.schema)
29
+ optional(:sanctions).hash(Sanctions.schema)
30
+ end
31
+ end
32
+ end
33
+
34
+ extend ClassMethods
35
+
36
+ def self.included(base)
37
+ base.extend(ClassMethods)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,22 @@
1
+ module Tangany
2
+ module Customers
3
+ module Contracts
4
+ module NaturalPersons
5
+ module CreateSchemas
6
+ module Pep
7
+ class << self
8
+ def schema
9
+ Dry::Schema.Params do
10
+ required(:checkDate).filled(:string, format?: Tangany::ApplicationContract::DATETIME_REGEX)
11
+ required(:isExposed).filled(:bool)
12
+ optional(:source).maybe(:string, max_size?: 255)
13
+ optional(:reason).maybe(:string, max_size?: 255)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ module Tangany
2
+ module Customers
3
+ module Contracts
4
+ module NaturalPersons
5
+ module CreateSchemas
6
+ module Sanctions
7
+ class << self
8
+ def schema
9
+ Dry::Schema.Params do
10
+ required(:checkDate).filled(:string, format?: Tangany::ApplicationContract::DATETIME_REGEX)
11
+ required(:isSanctioned).filled(:bool)
12
+ optional(:source).maybe(:string, max_size?: 255)
13
+ optional(:reason).maybe(:string, max_size?: 255)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ module Tangany
2
+ module Customers
3
+ module Contracts
4
+ module NaturalPersons
5
+ class List < ApplicationContract
6
+ schema do
7
+ config.validate_keys = true
8
+
9
+ optional(:pageToken).maybe(:string)
10
+ optional(:limit).filled(:integer, gteq?: 1, lteq?: 100)
11
+ optional(:sort).filled(:string, included_in?: ALLOWED_SORTS)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ require_relative "create"
2
+ require_relative "update_schemas/natural_person"
3
+
4
+ module Tangany
5
+ module Customers
6
+ module Contracts
7
+ module NaturalPersons
8
+ class Update < Create
9
+ schema(UpdateSchemas::NaturalPerson.schema) { config.validate_keys = true }
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ require_relative "../create_schemas/natural_person"
2
+
3
+ module Tangany
4
+ module Customers
5
+ module Contracts
6
+ module NaturalPersons
7
+ module UpdateSchemas
8
+ module NaturalPerson
9
+ include CreateSchemas::NaturalPerson
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ require_relative "natural_persons/create"
2
+ require_relative "natural_persons/list"
3
+ require_relative "natural_persons/update"
@@ -0,0 +1,28 @@
1
+ module Tangany
2
+ module Customers
3
+ module Contracts
4
+ module WalletLinks
5
+ class Create < ApplicationContract
6
+ ALLOWED_TYPES = ["waas"].freeze
7
+
8
+ schema do
9
+ config.validate_keys = true
10
+
11
+ required(:id).filled(:string, max_size?: 40)
12
+ optional(:address).filled(:string, format?: ApplicationContract::ETHEREUM_ADDRESS_REGEX)
13
+ optional(:wallet).filled(:string)
14
+ required(:assetId).filled(:string, included_in?: Tangany::Customers::WalletLink::ALLOWED_CHAIN_IDS)
15
+ optional(:assignment).hash do
16
+ required(:customerId).filled(:string)
17
+ end
18
+ end
19
+
20
+ rule do
21
+ key.failure("one ne of address or wallet must be present") if !values[:address] && !values[:wallet]
22
+ key.failure("only one of address or wallet must be present") if values[:address] && values[:wallet]
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,17 @@
1
+ module Tangany
2
+ module Customers
3
+ module Contracts
4
+ module WalletLinks
5
+ class List < ApplicationContract
6
+ schema do
7
+ config.validate_keys = true
8
+
9
+ optional(:limit).filled(:integer, gt?: 0, lteq?: 100)
10
+ optional(:sort).filled(:string, included_in?: ALLOWED_SORTS)
11
+ optional(:pageToken).maybe(:string)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,2 @@
1
+ require_relative "wallet_links/create"
2
+ require_relative "wallet_links/list"
@@ -0,0 +1,3 @@
1
+ require_relative "contracts/customers"
2
+ require_relative "contracts/natural_persons"
3
+ require_relative "contracts/wallet_links"
@@ -0,0 +1,11 @@
1
+ module Tangany
2
+ module Customers
3
+ class Address < Object
4
+ attribute :country, Types::String
5
+ attribute :city, Types::String
6
+ attribute :postcode, Types::String
7
+ attribute :streetName, Types::String
8
+ attribute :streetNumber, Types::String
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ module Tangany
2
+ module Customers
3
+ class Contract < Object
4
+ ALLOWED_TYPES = %w[standard].freeze
5
+
6
+ attribute :type, Types::String
7
+ attribute :signedDate, Types::Date
8
+ attribute? :cancelledDate, Types::Date.optional
9
+
10
+ to_date :signedDate, :cancelledDate
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module Tangany
2
+ module Customers
3
+ class Customer < Object
4
+ attribute :id, Types::String
5
+ attribute :owner do
6
+ attribute :entityId, Types::String
7
+ end
8
+ attribute :authorized, Types::Array do
9
+ attribute :entityId, Types::String
10
+ end
11
+ attribute :contracts, Types::Array.of(Contract)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ module Tangany
2
+ module Customers
3
+ class Document < Object
4
+ ALLOWED_TYPES = %w[id_card passport other].freeze
5
+
6
+ attribute :country, Types::String
7
+ attribute :nationality, Types::String
8
+ attribute :number, Types::String
9
+ attribute :issuedBy, Types::String
10
+ attribute :issueDate, Types::Date
11
+ attribute :validUntil, Types::Date
12
+ attribute :type, Types::String
13
+
14
+ to_date :issueDate, :validUntil
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ require_relative "document"
2
+
3
+ module Tangany
4
+ module Customers
5
+ class Kyc < Object
6
+ ALLOWED_METHODS = %w[video_ident id_copy auto_ident in_person].freeze
7
+
8
+ attribute :id, Types::String
9
+ attribute :date, Types::DateTime
10
+ attribute :method, Types::String
11
+ attribute? :document, Document
12
+
13
+ to_datetime :date
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,30 @@
1
+ require_relative "address"
2
+ require_relative "kyc"
3
+ require_relative "pep"
4
+ require_relative "sanctions"
5
+
6
+ module Tangany
7
+ module Customers
8
+ class NaturalPerson < Object
9
+ ALLOWED_GENDERS = %w[F M X].freeze
10
+
11
+ attribute :id, Types::String
12
+ attribute? :title, Types::String.optional
13
+ attribute :firstName, Types::String
14
+ attribute :lastName, Types::String
15
+ attribute? :gender, Types::String.optional
16
+ attribute :birthDate, Types::Date
17
+ attribute :birthPlace, Types::String
18
+ attribute :birthCountry, Types::String
19
+ attribute? :birthName, Types::String.optional
20
+ attribute? :nationality, Types::String.optional
21
+ attribute? :address, Address
22
+ attribute? :email, Types::String.optional
23
+ attribute? :kyc, Kyc
24
+ attribute? :pep, Pep
25
+ attribute? :sanctions, Sanctions
26
+
27
+ to_date :birthDate
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,12 @@
1
+ module Tangany
2
+ module Customers
3
+ class Pep < Object
4
+ attribute :checkDate, Types::DateTime
5
+ attribute :isExposed, Types::Bool
6
+ attribute? :source, Types::String.optional
7
+ attribute? :reason, Types::String.optional
8
+
9
+ to_datetime :checkDate
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Tangany
2
+ module Customers
3
+ class Sanctions < Object
4
+ attribute :checkDate, Types::DateTime
5
+ attribute :isSanctioned, Types::Bool
6
+ attribute? :source, Types::String.optional
7
+ attribute? :reason, Types::String.optional
8
+
9
+ to_datetime :checkDate
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ module Tangany
2
+ module Customers
3
+ class WalletLink < Object
4
+ ALLOWED_CHAIN_IDS = Tangany.chains.map { |chain| chain["asset_id"] }.freeze
5
+
6
+ attribute :id, Types::String
7
+ attribute :address, Types::String
8
+ attribute :assetId, Types::String
9
+ attribute? :assignment do
10
+ attribute :customerId, Types::String
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ require_relative "objects/contract"
2
+ require_relative "objects/natural_person"
3
+ require_relative "objects/wallet_link"
4
+
5
+ require_relative "objects/customer"
@@ -0,0 +1,11 @@
1
+ module Tangany
2
+ module Customers
3
+ class Resource < Tangany::Resource
4
+ private
5
+
6
+ def default_headers
7
+ {"tangany-subscription" => client.subscription}
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+ module Tangany
2
+ module Customers
3
+ class CustomersResource < Resource
4
+ BASE_PATH = "customers"
5
+
6
+ def create(**params)
7
+ Customer.new(post_request(BASE_PATH, body: sanitize_params!(params).to_json).body)
8
+ end
9
+
10
+ def delete(customer_id)
11
+ delete_request("#{BASE_PATH}/#{customer_id}")
12
+ end
13
+
14
+ def list(**params)
15
+ Collection.from_response(get_request(BASE_PATH, params: sanitize_params!(params)), type: Customer)
16
+ end
17
+
18
+ def retrieve(customer_id)
19
+ Customer.new(get_request("#{BASE_PATH}/#{customer_id}").body)
20
+ end
21
+
22
+ def update(customer_id, **params)
23
+ Customer.new(put_request("#{BASE_PATH}/#{customer_id}", body: sanitize_params!(params).to_json).body)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ module Tangany
2
+ module Customers
3
+ class NaturalPersonsResource < Resource
4
+ BASE_PATH = "entities/natural-persons"
5
+ def create(**params)
6
+ NaturalPerson.new(post_request(BASE_PATH, body: sanitize_params!(params).to_json).body)
7
+ end
8
+
9
+ def delete(entity_id)
10
+ delete_request("#{BASE_PATH}/#{entity_id}")
11
+ end
12
+
13
+ def list(**params)
14
+ Collection.from_response(get_request(BASE_PATH, params: sanitize_params!(params)), type: NaturalPerson)
15
+ end
16
+
17
+ def retrieve(entity_id)
18
+ NaturalPerson.new(get_request("#{BASE_PATH}/#{entity_id}").body)
19
+ end
20
+
21
+ def update(entity_id, **params)
22
+ NaturalPerson.new(put_request("#{BASE_PATH}/#{entity_id}", body: sanitize_params!(params).to_json).body)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ module Tangany
2
+ module Customers
3
+ class WalletLinksResource < Resource
4
+ BASE_PATH = "wallet-links"
5
+
6
+ def create(**params)
7
+ contract_hash = sanitize_params!(params)
8
+ WalletLink.new(post_request(BASE_PATH, body: prepare_create_hash(contract_hash).to_json).body)
9
+ end
10
+
11
+ def delete(wallet_link_id)
12
+ delete_request("#{BASE_PATH}/#{wallet_link_id}")
13
+ end
14
+
15
+ def list(**params)
16
+ Collection.from_response(get_request(BASE_PATH, params: sanitize_params!(params)), type: WalletLink)
17
+ end
18
+
19
+ def retrieve(wallet_link_id)
20
+ WalletLink.new(get_request("#{BASE_PATH}/#{wallet_link_id}").body)
21
+ end
22
+
23
+ private
24
+
25
+ def prepare_create_hash(hash)
26
+ # TODO: derive wallet address from secp256k1 public key instead of using the Custody API
27
+ if hash[:wallet]
28
+ custody_client = Tangany::Custody::Client.new
29
+ wallet_status = custody_client.wallet_statuses(asset_id: hash[:assetId]).retrieve(hash[:wallet])
30
+ hash[:address] = wallet_status.address
31
+ hash.delete(:wallet)
32
+ end
33
+ hash
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ require_relative "resources/customers_resource"
2
+ require_relative "resources/natural_persons_resource"
3
+ require_relative "resources/wallet_links_resource"
@@ -0,0 +1,8 @@
1
+ require_relative "customers/application_contract"
2
+ require_relative "customers/client"
3
+ require_relative "customers/collection"
4
+ require_relative "customers/objects"
5
+ require_relative "customers/resource"
6
+
7
+ require_relative "customers/contracts"
8
+ require_relative "customers/resources"