coinbase-sdk 0.5.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/coinbase/address/wallet_address.rb +70 -1
  3. data/lib/coinbase/address.rb +5 -1
  4. data/lib/coinbase/client/api/external_addresses_api.rb +0 -79
  5. data/lib/coinbase/client/api/smart_contracts_api.rb +332 -0
  6. data/lib/coinbase/client/api/stake_api.rb +0 -8
  7. data/lib/coinbase/client/api/transaction_history_api.rb +101 -0
  8. data/lib/coinbase/client/api/users_api.rb +79 -0
  9. data/lib/coinbase/client/api/validators_api.rb +4 -4
  10. data/lib/coinbase/client/api/wallets_api.rb +4 -4
  11. data/lib/coinbase/client/api/webhooks_api.rb +72 -2
  12. data/lib/coinbase/client/models/create_smart_contract_request.rb +259 -0
  13. data/lib/coinbase/client/models/create_wallet_webhook_request.rb +232 -0
  14. data/lib/coinbase/client/models/create_webhook_request.rb +10 -8
  15. data/lib/coinbase/client/models/deploy_smart_contract_request.rb +222 -0
  16. data/lib/coinbase/client/models/multi_token_contract_options.rb +223 -0
  17. data/lib/coinbase/client/models/network_identifier.rb +2 -1
  18. data/lib/coinbase/client/models/nft_contract_options.rb +257 -0
  19. data/lib/coinbase/client/models/smart_contract.rb +378 -0
  20. data/lib/coinbase/client/models/smart_contract_list.rb +257 -0
  21. data/lib/coinbase/client/models/smart_contract_options.rb +107 -0
  22. data/lib/coinbase/client/models/smart_contract_type.rb +42 -0
  23. data/lib/coinbase/client/models/staking_balance.rb +2 -2
  24. data/lib/coinbase/client/models/staking_reward.rb +2 -2
  25. data/lib/coinbase/client/models/token_contract_options.rb +257 -0
  26. data/lib/coinbase/client/models/update_webhook_request.rb +10 -8
  27. data/lib/coinbase/client/models/user.rb +231 -0
  28. data/lib/coinbase/client/models/webhook.rb +10 -1
  29. data/lib/coinbase/client/models/webhook_event_type.rb +2 -1
  30. data/lib/coinbase/client/models/webhook_event_type_filter.rb +105 -0
  31. data/lib/coinbase/client/models/webhook_wallet_activity_filter.rb +228 -0
  32. data/lib/coinbase/client.rb +15 -0
  33. data/lib/coinbase/contract_invocation.rb +16 -17
  34. data/lib/coinbase/smart_contract.rb +264 -39
  35. data/lib/coinbase/transaction.rb +3 -0
  36. data/lib/coinbase/transfer.rb +1 -1
  37. data/lib/coinbase/version.rb +1 -1
  38. data/lib/coinbase/wallet.rb +45 -2
  39. data/lib/coinbase/webhook.rb +3 -7
  40. metadata +18 -2
@@ -37,12 +37,14 @@ Coinbase::Client.autoload :CreateAddressRequest, 'coinbase/client/models/create_
37
37
  Coinbase::Client.autoload :CreateContractInvocationRequest, 'coinbase/client/models/create_contract_invocation_request'
38
38
  Coinbase::Client.autoload :CreatePayloadSignatureRequest, 'coinbase/client/models/create_payload_signature_request'
39
39
  Coinbase::Client.autoload :CreateServerSignerRequest, 'coinbase/client/models/create_server_signer_request'
40
+ Coinbase::Client.autoload :CreateSmartContractRequest, 'coinbase/client/models/create_smart_contract_request'
40
41
  Coinbase::Client.autoload :CreateStakingOperationRequest, 'coinbase/client/models/create_staking_operation_request'
41
42
  Coinbase::Client.autoload :CreateTradeRequest, 'coinbase/client/models/create_trade_request'
42
43
  Coinbase::Client.autoload :CreateTransferRequest, 'coinbase/client/models/create_transfer_request'
43
44
  Coinbase::Client.autoload :CreateWalletRequest, 'coinbase/client/models/create_wallet_request'
44
45
  Coinbase::Client.autoload :CreateWalletRequestWallet, 'coinbase/client/models/create_wallet_request_wallet'
45
46
  Coinbase::Client.autoload :CreateWebhookRequest, 'coinbase/client/models/create_webhook_request'
47
+ Coinbase::Client.autoload :DeploySmartContractRequest, 'coinbase/client/models/deploy_smart_contract_request'
46
48
  Coinbase::Client.autoload :ERC20TransferEvent, 'coinbase/client/models/erc20_transfer_event'
47
49
  Coinbase::Client.autoload :ERC721TransferEvent, 'coinbase/client/models/erc721_transfer_event'
48
50
  Coinbase::Client.autoload :Error, 'coinbase/client/models/error'
@@ -58,6 +60,8 @@ Coinbase::Client.autoload :FetchStakingRewards200Response, 'coinbase/client/mode
58
60
  Coinbase::Client.autoload :FetchStakingRewardsRequest, 'coinbase/client/models/fetch_staking_rewards_request'
59
61
  Coinbase::Client.autoload :GetStakingContextRequest, 'coinbase/client/models/get_staking_context_request'
60
62
  Coinbase::Client.autoload :HistoricalBalance, 'coinbase/client/models/historical_balance'
63
+ Coinbase::Client.autoload :MultiTokenContractOptions, 'coinbase/client/models/multi_token_contract_options'
64
+ Coinbase::Client.autoload :NFTContractOptions, 'coinbase/client/models/nft_contract_options'
61
65
  Coinbase::Client.autoload :Network, 'coinbase/client/models/network'
62
66
  Coinbase::Client.autoload :NetworkIdentifier, 'coinbase/client/models/network_identifier'
63
67
  Coinbase::Client.autoload :PayloadSignature, 'coinbase/client/models/payload_signature'
@@ -72,6 +76,10 @@ Coinbase::Client.autoload :ServerSignerList, 'coinbase/client/models/server_sign
72
76
  Coinbase::Client.autoload :SignatureCreationEvent, 'coinbase/client/models/signature_creation_event'
73
77
  Coinbase::Client.autoload :SignatureCreationEventResult, 'coinbase/client/models/signature_creation_event_result'
74
78
  Coinbase::Client.autoload :SignedVoluntaryExitMessageMetadata, 'coinbase/client/models/signed_voluntary_exit_message_metadata'
79
+ Coinbase::Client.autoload :SmartContract, 'coinbase/client/models/smart_contract'
80
+ Coinbase::Client.autoload :SmartContractList, 'coinbase/client/models/smart_contract_list'
81
+ Coinbase::Client.autoload :SmartContractOptions, 'coinbase/client/models/smart_contract_options'
82
+ Coinbase::Client.autoload :SmartContractType, 'coinbase/client/models/smart_contract_type'
75
83
  Coinbase::Client.autoload :SponsoredSend, 'coinbase/client/models/sponsored_send'
76
84
  Coinbase::Client.autoload :StakingBalance, 'coinbase/client/models/staking_balance'
77
85
  Coinbase::Client.autoload :StakingContext, 'coinbase/client/models/staking_context'
@@ -81,6 +89,7 @@ Coinbase::Client.autoload :StakingOperationMetadata, 'coinbase/client/models/sta
81
89
  Coinbase::Client.autoload :StakingReward, 'coinbase/client/models/staking_reward'
82
90
  Coinbase::Client.autoload :StakingRewardFormat, 'coinbase/client/models/staking_reward_format'
83
91
  Coinbase::Client.autoload :StakingRewardUSDValue, 'coinbase/client/models/staking_reward_usd_value'
92
+ Coinbase::Client.autoload :TokenContractOptions, 'coinbase/client/models/token_contract_options'
84
93
  Coinbase::Client.autoload :Trade, 'coinbase/client/models/trade'
85
94
  Coinbase::Client.autoload :TradeList, 'coinbase/client/models/trade_list'
86
95
  Coinbase::Client.autoload :Transaction, 'coinbase/client/models/transaction'
@@ -89,6 +98,7 @@ Coinbase::Client.autoload :TransactionType, 'coinbase/client/models/transaction_
89
98
  Coinbase::Client.autoload :Transfer, 'coinbase/client/models/transfer'
90
99
  Coinbase::Client.autoload :TransferList, 'coinbase/client/models/transfer_list'
91
100
  Coinbase::Client.autoload :UpdateWebhookRequest, 'coinbase/client/models/update_webhook_request'
101
+ Coinbase::Client.autoload :User, 'coinbase/client/models/user'
92
102
  Coinbase::Client.autoload :Validator, 'coinbase/client/models/validator'
93
103
  Coinbase::Client.autoload :ValidatorDetails, 'coinbase/client/models/validator_details'
94
104
  Coinbase::Client.autoload :ValidatorList, 'coinbase/client/models/validator_list'
@@ -98,7 +108,9 @@ Coinbase::Client.autoload :WalletList, 'coinbase/client/models/wallet_list'
98
108
  Coinbase::Client.autoload :Webhook, 'coinbase/client/models/webhook'
99
109
  Coinbase::Client.autoload :WebhookEventFilter, 'coinbase/client/models/webhook_event_filter'
100
110
  Coinbase::Client.autoload :WebhookEventType, 'coinbase/client/models/webhook_event_type'
111
+ Coinbase::Client.autoload :WebhookEventTypeFilter, 'coinbase/client/models/webhook_event_type_filter'
101
112
  Coinbase::Client.autoload :WebhookList, 'coinbase/client/models/webhook_list'
113
+ Coinbase::Client.autoload :WebhookWalletActivityFilter, 'coinbase/client/models/webhook_wallet_activity_filter'
102
114
 
103
115
  # APIs
104
116
  Coinbase::Client.autoload :AddressesApi, 'coinbase/client/api/addresses_api'
@@ -109,9 +121,12 @@ Coinbase::Client.autoload :ContractInvocationsApi, 'coinbase/client/api/contract
109
121
  Coinbase::Client.autoload :ExternalAddressesApi, 'coinbase/client/api/external_addresses_api'
110
122
  Coinbase::Client.autoload :NetworksApi, 'coinbase/client/api/networks_api'
111
123
  Coinbase::Client.autoload :ServerSignersApi, 'coinbase/client/api/server_signers_api'
124
+ Coinbase::Client.autoload :SmartContractsApi, 'coinbase/client/api/smart_contracts_api'
112
125
  Coinbase::Client.autoload :StakeApi, 'coinbase/client/api/stake_api'
113
126
  Coinbase::Client.autoload :TradesApi, 'coinbase/client/api/trades_api'
127
+ Coinbase::Client.autoload :TransactionHistoryApi, 'coinbase/client/api/transaction_history_api'
114
128
  Coinbase::Client.autoload :TransfersApi, 'coinbase/client/api/transfers_api'
129
+ Coinbase::Client.autoload :UsersApi, 'coinbase/client/api/users_api'
115
130
  Coinbase::Client.autoload :ValidatorsApi, 'coinbase/client/api/validators_api'
116
131
  Coinbase::Client.autoload :WalletStakeApi, 'coinbase/client/api/wallet_stake_api'
117
132
  Coinbase::Client.autoload :WalletsApi, 'coinbase/client/api/wallets_api'
@@ -25,31 +25,30 @@ module Coinbase
25
25
  address_id:,
26
26
  wallet_id:,
27
27
  contract_address:,
28
- abi:,
29
28
  method:,
30
- amount:,
31
- asset_id:,
32
29
  network:,
33
- args: {}
30
+ args: {},
31
+ amount: nil,
32
+ abi: nil,
33
+ asset_id: nil
34
34
  )
35
- atomic_amount = nil
35
+ req = {
36
+ method: method,
37
+ args: args.to_json,
38
+ contract_address: contract_address
39
+ }
36
40
 
41
+ req[:abi] = abi.to_json unless abi.nil?
42
+
43
+ # For payable contract invocations, convert the amount to atomic units of specified asset.
37
44
  if amount && asset_id && network
38
- network = Coinbase::Network.from_id(network)
39
- asset = network.get_asset(asset_id)
40
- atomic_amount = asset.to_atomic_amount(amount).to_i_to_s
45
+ asset = Coinbase::Asset.fetch(network, asset_id)
46
+
47
+ req[:amount] = asset.to_atomic_amount(amount).to_i.to_s
41
48
  end
42
49
 
43
50
  model = Coinbase.call_api do
44
- contract_invocation_api.create_contract_invocation(
45
- wallet_id,
46
- address_id,
47
- contract_address: contract_address,
48
- abi: abi.to_json,
49
- method: method,
50
- args: args.to_json,
51
- amount: atomic_amount
52
- )
51
+ contract_invocation_api.create_contract_invocation(wallet_id, address_id, **req)
53
52
  end
54
53
 
55
54
  new(model)
@@ -23,63 +23,118 @@ module Coinbase
23
23
  )
24
24
  Coinbase::Pagination.enumerate(
25
25
  lambda { |page|
26
- list_events_page(network_id, protocol_name, contract_address, contract_name, event_name, from_block_height,
27
- to_block_height, page)
26
+ list_events_page(
27
+ network_id,
28
+ protocol_name,
29
+ contract_address,
30
+ contract_name,
31
+ event_name,
32
+ from_block_height,
33
+ to_block_height,
34
+ page
35
+ )
28
36
  }
29
37
  ) do |contract_event|
30
38
  Coinbase::ContractEvent.new(contract_event)
31
39
  end
32
40
  end
33
41
 
34
- # Returns a new SmartContract object.
35
- # @param model [Coinbase::Client::SmartContract] The underlying SmartContract object
36
- def initialize(model)
37
- @model = model
38
- end
42
+ # Creates a new ERC20 token contract, that can subsequently be deployed to
43
+ # the blockchain.
44
+ # @param address_id [String] The address ID of deployer
45
+ # @param wallet_id [String] The wallet ID of the deployer
46
+ # @param name [String] The name of the token
47
+ # @param symbol [String] The symbol of the token
48
+ # @param total_supply [String] The total supply of the token, denominate in whole units.
49
+ # @return [SmartContract] The new ERC20 Token SmartContract object
50
+ def self.create_token_contract(
51
+ address_id:,
52
+ wallet_id:,
53
+ name:,
54
+ symbol:,
55
+ total_supply:
56
+ )
57
+ contract = Coinbase.call_api do
58
+ smart_contracts_api.create_smart_contract(
59
+ wallet_id,
60
+ address_id,
61
+ {
62
+ type: Coinbase::Client::SmartContractType::ERC20,
63
+ options: Coinbase::Client::TokenContractOptions.new(
64
+ name: name,
65
+ symbol: symbol,
66
+ total_supply: BigDecimal(total_supply).to_i.to_s
67
+ ).to_body
68
+ }
69
+ )
70
+ end
39
71
 
40
- # Returns the network ID of the SmartContract.
41
- # @return [String] The network ID
42
- def network_id
43
- Coinbase.to_sym(@model.network_id)
72
+ new(contract)
44
73
  end
45
74
 
46
- # Returns the protocol name of the SmartContract.
47
- # @return [String] The protocol name
48
- def protocol_name
49
- @model.protocol_name
50
- end
75
+ # Creates a new ERC721 token contract, that can subsequently be deployed to
76
+ # the blockchain.
77
+ # @param address_id [String] The address ID of deployer
78
+ # @param wallet_id [String] The wallet ID of the deployer
79
+ # @param name [String] The name of the token
80
+ # @param symbol [String] The symbol of the token
81
+ # @param base_uri [String] The base URI for the token metadata
82
+ # @return [SmartContract] The new ERC721 Token SmartContract object
83
+ def self.create_nft_contract(
84
+ address_id:,
85
+ wallet_id:,
86
+ name:,
87
+ symbol:,
88
+ base_uri:
89
+ )
90
+ contract = Coinbase.call_api do
91
+ smart_contracts_api.create_smart_contract(
92
+ wallet_id,
93
+ address_id,
94
+ {
95
+ type: Coinbase::Client::SmartContractType::ERC721,
96
+ options: Coinbase::Client::NFTContractOptions.new(
97
+ name: name,
98
+ symbol: symbol,
99
+ base_uri: base_uri
100
+ ).to_body
101
+ }
102
+ )
103
+ end
51
104
 
52
- # Returns the contract name of the SmartContract.
53
- # @return [String] The contract name
54
- def contract_name
55
- @model.contract_name
105
+ new(contract)
56
106
  end
57
107
 
58
- # Returns the address of the SmartContract.
59
- # @return [String] The contract address
60
- def address
61
- @model.address
62
- end
63
-
64
- # Returns a string representation of the SmartContract.
65
- # @return [String] a string representation of the SmartContract
66
- def to_s
67
- "Coinbase::SmartContract{
68
- network_id: '#{network_id}',
69
- protocol_name: '#{protocol_name}',
70
- contract_name: '#{contract_name}',
71
- address: '#{address}'}"
72
- end
108
+ def self.create_multi_token_contract(
109
+ address_id:,
110
+ wallet_id:,
111
+ uri:
112
+ )
113
+ contract = Coinbase.call_api do
114
+ smart_contracts_api.create_smart_contract(
115
+ wallet_id,
116
+ address_id,
117
+ {
118
+ type: Coinbase::Client::SmartContractType::ERC1155,
119
+ options: Coinbase::Client::MultiTokenContractOptions.new(
120
+ uri: uri
121
+ ).to_body
122
+ }
123
+ )
124
+ end
73
125
 
74
- # Same as to_s.
75
- # @return [String] a string representation of the SmartContract
76
- def inspect
77
- to_s
126
+ new(contract)
78
127
  end
79
128
 
80
129
  def self.contract_events_api
81
130
  Coinbase::Client::ContractEventsApi.new(Coinbase.configuration.api_client)
82
131
  end
132
+ private_class_method :contract_events_api
133
+
134
+ def self.smart_contracts_api
135
+ Coinbase::Client::SmartContractsApi.new(Coinbase.configuration.api_client)
136
+ end
137
+ private_class_method :smart_contracts_api
83
138
 
84
139
  def self.list_events_page(
85
140
  network_id,
@@ -102,5 +157,175 @@ module Coinbase
102
157
  { next_page: page }
103
158
  )
104
159
  end
160
+ private_class_method :list_events_page
161
+
162
+ # Returns a new SmartContract object.
163
+ # @param model [Coinbase::Client::SmartContract] The underlying SmartContract object
164
+ def initialize(model)
165
+ raise unless model.is_a?(Coinbase::Client::SmartContract)
166
+
167
+ @model = model
168
+ end
169
+
170
+ # Returns the SmartContract ID.
171
+ # NOTE: This is not the contract address and is primarily used before
172
+ # the contract is deployed.
173
+ # @return [String] The SmartContract ID
174
+ def id
175
+ @model.smart_contract_id
176
+ end
177
+
178
+ # Returns the Network of the SmartContract.
179
+ # @return [Coinbase::Network] The Network
180
+ def network
181
+ @network ||= Coinbase::Network.from_id(@model.network_id)
182
+ end
183
+
184
+ # Returns the contract address of the SmartContract.
185
+ # @return [String] The contract address
186
+ def contract_address
187
+ @model.contract_address
188
+ end
189
+
190
+ # Returns the address of the deployer of the SmartContract.
191
+ # @return [String] The deployer address
192
+ def deployer_address
193
+ @model.deployer_address
194
+ end
195
+
196
+ # Returns the ABI of the Smart Contract.
197
+ # @return [Array<Hash>] The ABI
198
+ def abi
199
+ JSON.parse(@model.abi)
200
+ end
201
+
202
+ # Returns the ID of the wallet that deployed the SmartContract.
203
+ # @return [String] The wallet ID
204
+ def wallet_id
205
+ @model.wallet_id
206
+ end
207
+
208
+ # Returns the type of the SmartContract.
209
+ # @return [Coinbase::Client::SmartContractType] The SmartContract type
210
+ def type
211
+ @model.type
212
+ end
213
+
214
+ # Returns the options of the SmartContract.
215
+ # @return [Coinbase::Client::SmartContractOptions] The SmartContract options
216
+ def options
217
+ @model.options
218
+ end
219
+
220
+ # Returns the transaction.
221
+ # @return [Coinbase::Transaction] The SmartContracy deployment transaction
222
+ def transaction
223
+ @transaction ||= Coinbase::Transaction.new(@model.transaction)
224
+ end
225
+
226
+ # Returns the status of the SmartContract.
227
+ # @return [String] The status
228
+ def status
229
+ transaction.status
230
+ end
231
+
232
+ # Signs the SmartContract deployment transaction with the given key.
233
+ # This is required before broadcasting the SmartContract.
234
+ # @param key [Eth::Key] The key to sign the SmartContract with
235
+ # @return [SmartContract] The SmartContract object
236
+ # @raise [RuntimeError] If the key is not an Eth::Key
237
+ # @raise [Coinbase::AlreadySignedError] If the SmartContract has already been signed
238
+ def sign(key)
239
+ raise unless key.is_a?(Eth::Key)
240
+
241
+ transaction.sign(key)
242
+ end
243
+
244
+ # Deploys the signed SmartContract to the blockchain.
245
+ # @return [SmartContract] The SmartContract object
246
+ # @raise [Coinbase::TransactionNotSignedError] If the SmartContract has not been signed
247
+ def deploy!
248
+ raise TransactionNotSignedError unless transaction.signed?
249
+
250
+ @model = Coinbase.call_api do
251
+ smart_contracts_api.deploy_smart_contract(
252
+ wallet_id,
253
+ deployer_address,
254
+ id,
255
+ { signed_payload: transaction.signature }
256
+ )
257
+ end
258
+
259
+ @transaction = Coinbase::Transaction.new(@model.transaction)
260
+
261
+ self
262
+ end
263
+
264
+ # Reloads the Smart Contract model with the latest version from the server side.
265
+ # @return [SmartContract] The most recent version of Smart Contract from the server
266
+ def reload
267
+ @model = Coinbase.call_api do
268
+ smart_contracts_api.get_smart_contract(
269
+ wallet_id,
270
+ deployer_address,
271
+ id
272
+ )
273
+ end
274
+
275
+ @transaction = Coinbase::Transaction.new(@model.transaction)
276
+
277
+ self
278
+ end
279
+
280
+ # Waits until the Smart Contract deployment is signed or failed by polling the server at the given interval.
281
+ # @param interval_seconds [Integer] The interval at which to poll the server, in seconds
282
+ # @param timeout_seconds [Integer] The maximum amount of time to wait for the Smart Contract,
283
+ # deployment to land on-chain, in seconds
284
+ # @return [SmartContract] The completed Smart Contract object
285
+ # @raise [Timeout::Error] if the Contract Invocation takes longer than the given timeout
286
+ def wait!(interval_seconds = 0.2, timeout_seconds = 20)
287
+ start_time = Time.now
288
+
289
+ loop do
290
+ reload
291
+
292
+ return self if transaction.terminal_state?
293
+
294
+ if Time.now - start_time > timeout_seconds
295
+ raise Timeout::Error,
296
+ 'SmartContract deployment timed out. Try waiting again.'
297
+ end
298
+
299
+ self.sleep interval_seconds
300
+ end
301
+
302
+ self
303
+ end
304
+
305
+ # Same as to_s.
306
+ # @return [String] a string representation of the SmartContract
307
+ def inspect
308
+ to_s
309
+ end
310
+
311
+ # Returns a string representation of the SmartContract.
312
+ # @return [String] a string representation of the SmartContract
313
+ def to_s
314
+ Coinbase.pretty_print_object(
315
+ self.class,
316
+ network: network.id,
317
+ contract_address: contract_address,
318
+ deployer_address: deployer_address,
319
+ type: type,
320
+ status: status,
321
+ options: Coinbase.pretty_print_object('Options', **options)
322
+ )
323
+ end
324
+
325
+ private
326
+
327
+ def smart_contracts_api
328
+ @smart_contracts_api ||= Coinbase::Client::SmartContractsApi.new(Coinbase.configuration.api_client)
329
+ end
105
330
  end
106
331
  end
@@ -147,6 +147,9 @@ module Coinbase
147
147
  # Signs the Transaction with the provided key and returns the hex signing payload.
148
148
  # @return [String] The hex-encoded signed payload
149
149
  def sign(key)
150
+ raise 'Invalid key type' unless key.is_a?(Eth::Key)
151
+ raise Coinbase::AlreadySignedError if signed?
152
+
150
153
  raw.sign(key)
151
154
 
152
155
  signature
@@ -84,7 +84,7 @@ module Coinbase
84
84
  end
85
85
 
86
86
  # Returns the Network of the Transfer.
87
- # @return [Symbol] The Network
87
+ # @return [Coinbase::Network] The Network
88
88
  def network
89
89
  @network ||= Coinbase::Network.from_id(@model.network_id)
90
90
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Coinbase
4
- VERSION = '0.5.0'
4
+ VERSION = '0.7.0'
5
5
  end
@@ -234,10 +234,33 @@ module Coinbase
234
234
  # @!method invoke_contract
235
235
  # Invokes a contract with the given ABI, method, and arguments.
236
236
  # @param abi [Array<Hash>] The ABI of the contract
237
- #
237
+
238
+ # @!method deploy_token
239
+ # Deploys a new ERC20 token contract with the given name, symbol, and total supply.
240
+ # @param name [String] The name of the token.
241
+ # @param symbol [String] The symbol of the token.
242
+ # @param total_supply [Integer, BigDecimal] The total supply of the token, denominated in
243
+ # whole units.
244
+ # @return [Coinbase::SmartContract] The deployed token contract.
245
+ # @raise [AddressCannotSignError] if the Address does not have a private key backing it.
246
+
247
+ # @!method deploy_nft
248
+ # Deploys a new ERC721 NFT contract with the given name, symbol, and base URI.
249
+ # @param name [String] The name of the NFT contract.
250
+ # @param symbol [String] The symbol of the NFT contract.
251
+ # @param base_uri [String] The base URI for the NFT contract.
252
+ # @return [Coinbase::SmartContract] The deployed NFT contract.
253
+ # @raise [AddressCannotSignError] if the Address does not have a private key backing it.
254
+
255
+ # @!method deploy_multi_token
256
+ # Deploys a new ERC1155 multi-token contract with the given URI.
257
+ # @param uri [String] The URI for the token metadata, where {id} will be replaced with the token ID.
258
+ # @return [Coinbase::SmartContract] The deployed multi-token contract.
259
+ # @raise [AddressCannotSignError] if the Address does not have a private key backing it.
238
260
 
239
261
  def_delegators :default_address, :transfer, :trade, :faucet, :stake, :unstake, :claim_stake, :staking_balances,
240
- :stakeable_balance, :unstakeable_balance, :claimable_balance, :sign_payload, :invoke_contract
262
+ :stakeable_balance, :unstakeable_balance, :claimable_balance, :sign_payload, :invoke_contract,
263
+ :deploy_token, :deploy_nft, :deploy_multi_token
241
264
 
242
265
  # Returns the addresses belonging to the Wallet.
243
266
  # @return [Array<Coinbase::WalletAddress>] The addresses belonging to the Wallet
@@ -459,6 +482,22 @@ module Coinbase
459
482
  "Successfully loaded seed for wallet #{id} from #{file_path}."
460
483
  end
461
484
 
485
+ # Creates a new webhook on the current wallet for tracking wallet activity events.
486
+ #
487
+ # @param notification_uri [String] The URI to which the webhook notifications will be sent.
488
+ #
489
+ # @return [Coinbase::Client::Webhook] The newly created webhook instance.
490
+ def create_webhook(notification_uri:)
491
+ Coinbase.call_api do
492
+ webhooks_api.create_wallet_webhook(
493
+ id,
494
+ create_wallet_webhook_request: {
495
+ notification_uri: notification_uri
496
+ }
497
+ )
498
+ end
499
+ end
500
+
462
501
  # Returns a String representation of the Wallet.
463
502
  # @return [String] a String representation of the Wallet
464
503
  def to_s
@@ -583,6 +622,10 @@ module Coinbase
583
622
  @wallets_api ||= Coinbase::Client::WalletsApi.new(Coinbase.configuration.api_client)
584
623
  end
585
624
 
625
+ def webhooks_api
626
+ @webhooks_api ||= Coinbase::Client::WebhooksApi.new(Coinbase.configuration.api_client)
627
+ end
628
+
586
629
  def set_addresses
587
630
  address_list = Coinbase.call_api do
588
631
  addresses_api.list_addresses(@model.id, { limit: MAX_ADDRESSES })
@@ -22,8 +22,6 @@ module Coinbase
22
22
  # @param event_filters [Array<Hash>] Filters applied to the events that determine
23
23
  # which specific events trigger the webhook. Each filter should be a hash that
24
24
  # can include keys like `contract_address`, `from_address`, or `to_address`.
25
- # @param signature_header [String] The custom header to be used for x-webhook-signature header on callbacks,
26
- # so developers can verify the requests are coming from Coinbase.
27
25
  # @return [Coinbase::Webhook] A new instance of Webhook.
28
26
  #
29
27
  # @example Create a new webhook
@@ -31,18 +29,16 @@ module Coinbase
31
29
  # network_id: :ethereum_mainnet,
32
30
  # notification_uri: 'https://example.com/callback',
33
31
  # event_type: 'transaction',
34
- # event_filters: [{ 'contract_address' => '0x...', 'from_address' => '0x...', 'to_address' => '0x...' }],
35
- # signature_header: 'example_header'
32
+ # event_filters: [{ 'contract_address' => '0x...', 'from_address' => '0x...', 'to_address' => '0x...' }]
36
33
  # )
37
- def create(network_id:, notification_uri:, event_type:, event_filters:, signature_header: '')
34
+ def create(network_id:, notification_uri:, event_type:, event_filters:)
38
35
  model = Coinbase.call_api do
39
36
  webhooks_api.create_webhook(
40
37
  create_webhook_request: {
41
38
  network_id: Coinbase.normalize_network(network_id),
42
39
  notification_uri: notification_uri,
43
40
  event_type: event_type,
44
- event_filters: event_filters,
45
- signature_header: signature_header
41
+ event_filters: event_filters
46
42
  }
47
43
  )
48
44
  end