tangany 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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"