coinbase-sdk 0.0.14 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/coinbase/address/wallet_address.rb +31 -21
- data/lib/coinbase/address.rb +51 -17
- data/lib/coinbase/asset.rb +11 -8
- data/lib/coinbase/client/api/contract_events_api.rb +17 -9
- data/lib/coinbase/client/api/external_addresses_api.rb +85 -0
- data/lib/coinbase/client/api/networks_api.rb +85 -0
- data/lib/coinbase/client/api/stake_api.rb +74 -195
- data/lib/coinbase/client/api/validators_api.rb +2 -2
- data/lib/coinbase/client/api/wallet_stake_api.rb +263 -0
- data/lib/coinbase/client/models/address.rb +21 -4
- data/lib/coinbase/client/models/{native_eth_staking_context.rb → address_historical_balance_list.rb} +39 -35
- data/lib/coinbase/client/models/contract_event.rb +99 -8
- data/lib/coinbase/client/models/create_address_request.rb +14 -4
- data/lib/coinbase/client/models/create_transfer_request.rb +14 -4
- data/lib/coinbase/client/models/ethereum_validator_metadata.rb +11 -11
- data/lib/coinbase/client/models/feature.rb +2 -1
- data/lib/coinbase/client/models/feature_set.rb +307 -0
- data/lib/coinbase/client/models/{partial_eth_staking_context.rb → fetch_historical_staking_balances200_response.rb} +39 -35
- data/lib/coinbase/client/models/historical_balance.rb +273 -0
- data/lib/coinbase/client/models/network.rb +365 -0
- data/lib/coinbase/client/models/network_identifier.rb +44 -0
- data/lib/coinbase/client/models/sponsored_send.rb +338 -0
- data/lib/coinbase/client/models/staking_balance.rb +289 -0
- data/lib/coinbase/client/models/staking_context_context.rb +222 -74
- data/lib/coinbase/client/models/staking_operation.rb +2 -2
- data/lib/coinbase/client/models/staking_reward.rb +22 -6
- data/lib/coinbase/client/models/staking_reward_format.rb +2 -1
- data/lib/coinbase/client/models/staking_reward_usd_value.rb +257 -0
- data/lib/coinbase/client/models/transaction.rb +17 -7
- data/lib/coinbase/client/models/transaction_type.rb +2 -1
- data/lib/coinbase/client/models/transfer.rb +101 -8
- data/lib/coinbase/client/models/validator.rb +23 -2
- data/lib/coinbase/client/models/validator_status.rb +52 -0
- data/lib/coinbase/client/models/wallet.rb +13 -16
- data/lib/coinbase/client/models/webhook_event_type.rb +2 -1
- data/lib/coinbase/client.rb +12 -3
- data/lib/coinbase/constants.rb +0 -10
- data/lib/coinbase/contract_event.rb +104 -0
- data/lib/coinbase/correlation.rb +30 -0
- data/lib/coinbase/destination.rb +11 -9
- data/lib/coinbase/errors.rb +14 -0
- data/lib/coinbase/historical_balance.rb +53 -0
- data/lib/coinbase/middleware.rb +2 -0
- data/lib/coinbase/network.rb +103 -20
- data/lib/coinbase/server_signer.rb +14 -3
- data/lib/coinbase/smart_contract.rb +106 -0
- data/lib/coinbase/sponsored_send.rb +110 -0
- data/lib/coinbase/staking_balance.rb +92 -0
- data/lib/coinbase/staking_operation.rb +134 -36
- data/lib/coinbase/staking_reward.rb +18 -0
- data/lib/coinbase/trade.rb +10 -9
- data/lib/coinbase/transaction.rb +13 -3
- data/lib/coinbase/transfer.rb +65 -36
- data/lib/coinbase/validator.rb +18 -10
- data/lib/coinbase/version.rb +5 -0
- data/lib/coinbase/wallet/data.rb +31 -0
- data/lib/coinbase/wallet.rb +143 -182
- data/lib/coinbase/webhook.rb +181 -0
- data/lib/coinbase.rb +64 -21
- metadata +51 -5
- data/lib/coinbase/user.rb +0 -65
data/lib/coinbase/wallet.rb
CHANGED
@@ -5,25 +5,18 @@ require 'json'
|
|
5
5
|
require 'money-tree'
|
6
6
|
require 'securerandom'
|
7
7
|
|
8
|
+
require_relative 'wallet/data'
|
9
|
+
|
8
10
|
module Coinbase
|
9
11
|
# A representation of a Wallet. Wallets come with a single default Address, but can expand to have a set of Addresses,
|
10
12
|
# each of which can hold a balance of one or more Assets. Wallets can create new Addresses, list their addresses,
|
11
13
|
# list their balances, and transfer Assets to other Addresses.
|
12
14
|
class Wallet
|
15
|
+
extend Forwardable
|
16
|
+
|
13
17
|
# The maximum number of addresses in a Wallet.
|
14
18
|
MAX_ADDRESSES = 20
|
15
19
|
|
16
|
-
# A representation of ServerSigner status in a Wallet.
|
17
|
-
module ServerSignerStatus
|
18
|
-
# The Wallet is awaiting seed creation by the ServerSigner. At this point,
|
19
|
-
# the Wallet cannot create addresses or sign transactions.
|
20
|
-
PENDING = 'pending_seed_creation'
|
21
|
-
|
22
|
-
# The Wallet has an associated seed created by the ServerSigner. It is ready
|
23
|
-
# to create addresses and sign transactions.
|
24
|
-
ACTIVE = 'active_seed'
|
25
|
-
end
|
26
|
-
|
27
20
|
class << self
|
28
21
|
# Imports a Wallet from previously exported wallet data.
|
29
22
|
# @param data [Coinbase::Wallet::Data] the Wallet data to import
|
@@ -43,7 +36,7 @@ module Coinbase
|
|
43
36
|
# converted to an array, etc...
|
44
37
|
# @return [Enumerable<Coinbase::Wallet>] Enumerator that returns wallets
|
45
38
|
def list
|
46
|
-
Coinbase::Pagination.enumerate(
|
39
|
+
Coinbase::Pagination.enumerate(method(:fetch_wallets_page)) do |wallet|
|
47
40
|
Coinbase::Wallet.new(wallet, seed: '')
|
48
41
|
end
|
49
42
|
end
|
@@ -63,18 +56,19 @@ module Coinbase
|
|
63
56
|
end
|
64
57
|
|
65
58
|
# Creates a new Wallet on the specified Network and generate a default address for it.
|
66
|
-
# @param
|
59
|
+
# @param network [Coinbase::Network, Symbol] (Optional) The network object or ID to create the
|
60
|
+
# Wallet on. When omitted this uses the SDK configured default network.
|
67
61
|
# @param interval_seconds [Integer] The interval at which to poll the CDPService for the Wallet to
|
68
62
|
# have an active seed, if using a ServerSigner, in seconds
|
69
63
|
# @param timeout_seconds [Integer] The maximum amount of time to wait for the ServerSigner to
|
70
64
|
# create a seed for the Wallet, in seconds
|
71
65
|
# @return [Coinbase::Wallet] the new Wallet
|
72
|
-
def create(
|
66
|
+
def create(network: Coinbase.default_network, interval_seconds: 0.2, timeout_seconds: 20)
|
73
67
|
model = Coinbase.call_api do
|
74
68
|
wallets_api.create_wallet(
|
75
69
|
create_wallet_request: {
|
76
70
|
wallet: {
|
77
|
-
network_id: Coinbase.normalize_network(
|
71
|
+
network_id: Coinbase.normalize_network(network),
|
78
72
|
use_server_signer: Coinbase.use_server_signer?
|
79
73
|
}
|
80
74
|
}
|
@@ -107,7 +101,7 @@ module Coinbase
|
|
107
101
|
wallets_api.get_wallet(wallet_id)
|
108
102
|
end
|
109
103
|
|
110
|
-
return self if model.server_signer_status ==
|
104
|
+
return self if model.server_signer_status == ServerSigner::Status::ACTIVE
|
111
105
|
|
112
106
|
if Time.now - start_time > timeout_seconds
|
113
107
|
raise Timeout::Error, 'Wallet creation timed out. Check status of your Server-Signer'
|
@@ -132,8 +126,7 @@ module Coinbase
|
|
132
126
|
end
|
133
127
|
end
|
134
128
|
|
135
|
-
# Returns a new Wallet object. Do not use this method directly. Instead
|
136
|
-
# User#import_wallet.
|
129
|
+
# Returns a new Wallet object. Do not use this method directly. Instead use Coinbase::Wallet.create.
|
137
130
|
# @param model [Coinbase::Client::Wallet] The underlying Wallet object
|
138
131
|
# @param seed [String] (Optional) The seed to use for the Wallet. Expects a 32-byte hexadecimal with no 0x prefix.
|
139
132
|
# If nil, a new seed will be generated. If the empty string, no seed is generated, and the Wallet will be
|
@@ -149,19 +142,98 @@ module Coinbase
|
|
149
142
|
@master = master_node(seed)
|
150
143
|
end
|
151
144
|
|
145
|
+
# @!method transfer
|
146
|
+
# Transfers the amount of the Asset from the default address to the specified destination.
|
147
|
+
# @param amount [Integer, Float, BigDecimal] The amount of the Asset to send
|
148
|
+
# @param asset_id [Symbol] The ID of the Asset to send
|
149
|
+
# @param destination [Wallet | Address | String] The destination of the transfer.
|
150
|
+
# If a Wallet, sends to the Wallet's default address.
|
151
|
+
# If a String, interprets it as the address ID.
|
152
|
+
# @param gasless [Boolean] Whether the transfer should be gasless. Defaults to false.
|
153
|
+
# @return [Coinbase::Transfer] The Transfer object.
|
154
|
+
# (see Coinbase::Address::WalletAddress#transfer)
|
155
|
+
|
156
|
+
# @!method trade
|
157
|
+
# Trades the specified amount from one asset to another using the default address.
|
158
|
+
# @param amount [Integer, Float, BigDecimal] The amount of the Asset to send.
|
159
|
+
# @param from_asset_id [Symbol] The ID of the Asset to trade from.
|
160
|
+
# @param to_asset_id [Symbol] The ID of the Asset to trade to.
|
161
|
+
# default address. If a String, interprets it as the address ID.
|
162
|
+
# @return [Coinbase::Trade] The Trade object.
|
163
|
+
|
164
|
+
# @!method faucet
|
165
|
+
# Requests funds from the faucet for the Wallet's default address and returns the faucet transaction.
|
166
|
+
# This is only supported on testnet networks.
|
167
|
+
# @return [Coinbase::FaucetTransaction] The successful faucet transaction
|
168
|
+
# @raise [Coinbase::FaucetLimitReachedError] If the faucet limit has been reached for the address or user.
|
169
|
+
# @raise [Coinbase::Client::ApiError] If an unexpected error occurs while requesting faucet funds.
|
170
|
+
|
171
|
+
# @!method stake
|
172
|
+
# Stakes the given amount of the given Asset for the default address.
|
173
|
+
# @param amount [Integer, Float, BigDecimal] The amount of the Asset to stake.
|
174
|
+
# @param asset_id [Symbol] The ID of the Asset to stake.
|
175
|
+
# @param mode [Symbol] (Optional) The staking mode. Defaults to :default.
|
176
|
+
# @param options [Hash] (Optional) Additional options for the staking operation.
|
177
|
+
# @return [Coinbase::StakingOperation] The stake operation
|
178
|
+
|
179
|
+
# @!method unstake
|
180
|
+
# Unstakes the given amount of the given Asset on the default address.
|
181
|
+
# @param amount [Integer, Float, BigDecimal] The amount of the Asset to unstake.
|
182
|
+
# @param asset_id [Symbol] The ID of the Asset to unstake.
|
183
|
+
# @param mode [Symbol] (Optional) The staking mode. Defaults to :default.
|
184
|
+
# @param options [Hash] (Optional) Additional options for the unstaking operation.
|
185
|
+
# @return [Coinbase::StakingOperation] The unstake operation
|
186
|
+
|
187
|
+
# @!method claim_stake
|
188
|
+
# Claims stake of the given amount of the given Asset for the default address.
|
189
|
+
# @param amount [Integer, Float, BigDecimal] The amount of the Asset to claim_stake.
|
190
|
+
# @param asset_id [Symbol] The ID of the Asset to claim_stake.
|
191
|
+
# @param mode [Symbol] (Optional) The staking mode. Defaults to :default.
|
192
|
+
# @param options [Hash] (Optional) Additional options for the unstaking operation.
|
193
|
+
# @return [Coinbase::StakingOperation] The claim_stake operation
|
194
|
+
|
195
|
+
# @!method staking_balances
|
196
|
+
# Retrieves the balances used for staking for the supplied asset for the default address.
|
197
|
+
# @param asset_id [Symbol] The asset to retrieve staking balances for
|
198
|
+
# @param mode [Symbol] The staking mode. Defaults to :default.
|
199
|
+
# @param options [Hash] Additional options for the staking operation
|
200
|
+
# @return [Hash] The staking balances
|
201
|
+
# @return [BigDecimal] :stakeable_balance The amount of the asset that can be staked
|
202
|
+
# @return [BigDecimal] :unstakeable_balance The amount of the asset that is currently staked and cannot be unstaked
|
203
|
+
# @return [BigDecimal] :claimable_balance The amount of the asset that can be claimed
|
204
|
+
|
205
|
+
# @!method stakeable_balance
|
206
|
+
# Retrieves the stakeable balance of the supplied asset for the default address.
|
207
|
+
# @param asset_id [Symbol] The asset to retrieve the stakeable balance for
|
208
|
+
# @param mode [Symbol] The staking mode. Defaults to :default.
|
209
|
+
# @param options [Hash] Additional options for the staking operation
|
210
|
+
# @return [BigDecimal] The stakeable balance
|
211
|
+
|
212
|
+
# @!method unstakeable_balance
|
213
|
+
# Retrieves the unstakeable balance for the supplied asset.
|
214
|
+
# Currently only the default_address is used to source the unstakeable balance.
|
215
|
+
# @param asset_id [Symbol] The asset to retrieve the unstakeable balance for
|
216
|
+
# @param mode [Symbol] The staking mode. Defaults to :default.
|
217
|
+
# @param options [Hash] Additional options for the staking operation
|
218
|
+
# @return [BigDecimal] The unstakeable balance
|
219
|
+
|
220
|
+
# @!method claimable_balance
|
221
|
+
# Retrieves the claimable balance for the supplied asset.
|
222
|
+
# Currently only the default_address is used to source the claimable balance.
|
223
|
+
# @param asset_id [Symbol] The asset to retrieve the claimable balance for
|
224
|
+
# @param mode [Symbol] The staking mode. Defaults to :default.
|
225
|
+
# @param options [Hash] Additional options for the staking operation
|
226
|
+
# @return [BigDecimal] The claimable balance
|
227
|
+
|
228
|
+
def_delegators :default_address, :transfer, :trade, :faucet, :stake, :unstake, :claim_stake, :staking_balances,
|
229
|
+
:stakeable_balance, :unstakeable_balance, :claimable_balance
|
230
|
+
|
152
231
|
# Returns the addresses belonging to the Wallet.
|
153
232
|
# @return [Array<Coinbase::WalletAddress>] The addresses belonging to the Wallet
|
154
233
|
def addresses
|
155
|
-
@addresses
|
156
|
-
address_list = Coinbase.call_api do
|
157
|
-
addresses_api.list_addresses(@model.id, { limit: MAX_ADDRESSES })
|
158
|
-
end
|
234
|
+
return @addresses unless @addresses.nil?
|
159
235
|
|
160
|
-
|
161
|
-
address_list.data.each_with_index.map do |address_model, index|
|
162
|
-
build_wallet_address(address_model, index)
|
163
|
-
end
|
164
|
-
end
|
236
|
+
set_addresses
|
165
237
|
end
|
166
238
|
|
167
239
|
# Returns the Wallet ID.
|
@@ -170,10 +242,10 @@ module Coinbase
|
|
170
242
|
@model.id
|
171
243
|
end
|
172
244
|
|
173
|
-
# Returns the Network
|
174
|
-
# @return [
|
175
|
-
def
|
176
|
-
Coinbase.
|
245
|
+
# Returns the Network of the Wallet.
|
246
|
+
# @return [Coinbase::Network] The Network of the Wallet
|
247
|
+
def network
|
248
|
+
@network ||= Coinbase::Network.from_id(@model.network_id)
|
177
249
|
end
|
178
250
|
|
179
251
|
# Returns the ServerSigner Status of the Wallet.
|
@@ -207,7 +279,12 @@ module Coinbase
|
|
207
279
|
# Creates a new Address in the Wallet.
|
208
280
|
# @return [Address] The new Address
|
209
281
|
def create_address
|
210
|
-
|
282
|
+
req = {}
|
283
|
+
|
284
|
+
# Ensure that the address cache is set before creating a new address.
|
285
|
+
# This ensures that for a server signer, the addresses have been loaded and we
|
286
|
+
# can create a new address and add it to a cache.
|
287
|
+
set_addresses if @addresses.nil?
|
211
288
|
|
212
289
|
unless Coinbase.use_server_signer?
|
213
290
|
# The index for the next address is the number of addresses already registered.
|
@@ -215,22 +292,25 @@ module Coinbase
|
|
215
292
|
|
216
293
|
key = derive_key(private_key_index)
|
217
294
|
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
}
|
295
|
+
req = {
|
296
|
+
public_key: key.public_key.compressed.unpack1('H*'),
|
297
|
+
attestation: create_attestation(key),
|
298
|
+
address_index: private_key_index
|
223
299
|
}
|
224
300
|
end
|
225
301
|
|
226
302
|
address_model = Coinbase.call_api do
|
227
|
-
addresses_api.create_address(id,
|
303
|
+
addresses_api.create_address(id, { create_address_request: req })
|
228
304
|
end
|
229
305
|
|
230
|
-
#
|
306
|
+
# Default address can be nil because either this is the first address being
|
307
|
+
# created for this wallet or the addresses cache has not yet been loaded.
|
308
|
+
|
309
|
+
# If the default address is nil, we must reload the wallet model after creating
|
310
|
+
# the address, in order for the default address to be set.
|
231
311
|
reload if default_address.nil?
|
232
312
|
|
233
|
-
#
|
313
|
+
# The addreses cache is already created, so we can add the new address to the cache.
|
234
314
|
address = WalletAddress.new(address_model, key)
|
235
315
|
@addresses << address
|
236
316
|
address
|
@@ -272,106 +352,8 @@ module Coinbase
|
|
272
352
|
Coinbase::Balance.from_model_and_asset_id(response, asset_id).amount
|
273
353
|
end
|
274
354
|
|
275
|
-
# Transfers the given amount of the given Asset to the specified address or wallet.
|
276
|
-
# Only same-network Transfers are supported. Currently only the default_address is used to source the Transfer.
|
277
|
-
# @param amount [Integer, Float, BigDecimal] The amount of the Asset to send
|
278
|
-
# @param asset_id [Symbol] The ID of the Asset to send
|
279
|
-
# @param destination [Wallet | Address | String] The destination of the transfer. If a Wallet, sends to the Wallet's
|
280
|
-
# default address. If a String, interprets it as the address ID.
|
281
|
-
# @return [Coinbase::Transfer] The Transfer object.
|
282
|
-
def transfer(amount, asset_id, destination)
|
283
|
-
default_address.transfer(amount, asset_id, destination)
|
284
|
-
end
|
285
|
-
|
286
|
-
# Trades the given amount of the given Asset for another Asset.
|
287
|
-
# Currently only the default_address is used to source the Trade
|
288
|
-
# @param amount [Integer, Float, BigDecimal] The amount of the Asset to send.
|
289
|
-
# @param from_asset_id [Symbol] The ID of the Asset to trade from. For Ether, :eth, :gwei, and :wei are supported.
|
290
|
-
# @param to_asset_id [Symbol] The ID of the Asset to trade to. For Ether, :eth, :gwei, and :wei are supported.
|
291
|
-
# default address. If a String, interprets it as the address ID.
|
292
|
-
# @return [Coinbase::Trade] The Trade object.
|
293
|
-
def trade(amount, from_asset_id, to_asset_id)
|
294
|
-
default_address.trade(amount, from_asset_id, to_asset_id)
|
295
|
-
end
|
296
|
-
|
297
|
-
# Stakes the given amount of the given Asset.
|
298
|
-
# Currently only the default_address is used to source the Stake.
|
299
|
-
# @param amount [Integer, Float, BigDecimal] The amount of the Asset to stake.
|
300
|
-
# @param asset_id [Symbol] The ID of the Asset to stake.
|
301
|
-
# @param mode [Symbol] (Optional) The staking mode. Defaults to :default.
|
302
|
-
# @param options [Hash] (Optional) Additional options for the staking operation.
|
303
|
-
# @return [Coinbase::StakingOperation] The stake operation
|
304
|
-
def stake(amount, asset_id, mode: :default, options: {})
|
305
|
-
default_address.stake(amount, asset_id, mode: mode, options: options)
|
306
|
-
end
|
307
|
-
|
308
|
-
# Unstakes the given amount of the given Asset.
|
309
|
-
# Currently only the default_address is used to source the Unstake.
|
310
|
-
# @param amount [Integer, Float, BigDecimal] The amount of the Asset to unstake.
|
311
|
-
# @param asset_id [Symbol] The ID of the Asset to unstake.
|
312
|
-
# @param mode [Symbol] (Optional) The staking mode. Defaults to :default.
|
313
|
-
# @param options [Hash] (Optional) Additional options for the unstaking operation.
|
314
|
-
# @return [Coinbase::StakingOperation] The unstake operation
|
315
|
-
def unstake(amount, asset_id, mode: :default, options: {})
|
316
|
-
default_address.unstake(amount, asset_id, mode: mode, options: options)
|
317
|
-
end
|
318
|
-
|
319
|
-
# Claims stake of the given amount of the given Asset.
|
320
|
-
# Currently only the default_address is used as the source for claim_stake.
|
321
|
-
# @param amount [Integer, Float, BigDecimal] The amount of the Asset to claim_stake.
|
322
|
-
# @param asset_id [Symbol] The ID of the Asset to claim_stake.
|
323
|
-
# @param mode [Symbol] (Optional) The staking mode. Defaults to :default.
|
324
|
-
# @param options [Hash] (Optional) Additional options for the unstaking operation.
|
325
|
-
# @return [Coinbase::StakingOperation] The claim_stake operation
|
326
|
-
def claim_stake(amount, asset_id, mode: :default, options: {})
|
327
|
-
default_address.claim_stake(amount, asset_id, mode: mode, options: options)
|
328
|
-
end
|
329
|
-
|
330
|
-
# Retrieves the balances used for staking for the supplied asset.
|
331
|
-
# Currently only the default_address is used to source the staking balances.
|
332
|
-
# @param asset_id [Symbol] The asset to retrieve staking balances for
|
333
|
-
# @param mode [Symbol] The staking mode. Defaults to :default.
|
334
|
-
# @param options [Hash] Additional options for the staking operation
|
335
|
-
# @return [Hash] The staking balances
|
336
|
-
# @return [BigDecimal] :stakeable_balance The amount of the asset that can be staked
|
337
|
-
# @return [BigDecimal] :unstakeable_balance The amount of the asset that is currently staked and cannot be unstaked
|
338
|
-
# @return [BigDecimal] :claimable_balance The amount of the asset that can be claimed
|
339
|
-
def staking_balances(asset_id, mode: :default, options: {})
|
340
|
-
default_address.staking_balances(asset_id, mode: mode, options: options)
|
341
|
-
end
|
342
|
-
|
343
|
-
# Retrieves the stakeable balance for the supplied asset.
|
344
|
-
# Currently only the default_address is used to source the stakeable balance.
|
345
|
-
# @param asset_id [Symbol] The asset to retrieve the stakeable balance for
|
346
|
-
# @param mode [Symbol] The staking mode. Defaults to :default.
|
347
|
-
# @param options [Hash] Additional options for the staking operation
|
348
|
-
# @return [BigDecimal] The stakeable balance
|
349
|
-
def stakeable_balance(asset_id, mode: :default, options: {})
|
350
|
-
default_address.stakeable_balance(asset_id, mode: mode, options: options)
|
351
|
-
end
|
352
|
-
|
353
|
-
# Retrieves the unstakeable balance for the supplied asset.
|
354
|
-
# Currently only the default_address is used to source the unstakeable balance.
|
355
|
-
# @param asset_id [Symbol] The asset to retrieve the unstakeable balance for
|
356
|
-
# @param mode [Symbol] The staking mode. Defaults to :default.
|
357
|
-
# @param options [Hash] Additional options for the staking operation
|
358
|
-
# @return [BigDecimal] The unstakeable balance
|
359
|
-
def unstakeable_balance(asset_id, mode: :default, options: {})
|
360
|
-
default_address.unstakeable_balance(asset_id, mode: mode, options: options)
|
361
|
-
end
|
362
|
-
|
363
|
-
# Retrieves the claimable balance for the supplied asset.
|
364
|
-
# Currently only the default_address is used to source the claimable balance.
|
365
|
-
# @param asset_id [Symbol] The asset to retrieve the claimable balance for
|
366
|
-
# @param mode [Symbol] The staking mode. Defaults to :default.
|
367
|
-
# @param options [Hash] Additional options for the staking operation
|
368
|
-
# @return [BigDecimal] The claimable balance
|
369
|
-
def claimable_balance(asset_id, mode: :default, options: {})
|
370
|
-
default_address.claimable_balance(asset_id, mode: mode, options: options)
|
371
|
-
end
|
372
|
-
|
373
355
|
# Exports the Wallet's data to a Data object.
|
374
|
-
# @return [Data] The Wallet data
|
356
|
+
# @return [Coinbase::Wallet::Data] The Wallet data
|
375
357
|
def export
|
376
358
|
# TODO: Improve this check by relying on the backend data to decide whether a wallet is server-signer backed.
|
377
359
|
raise 'Cannot export data for Server-Signer backed Wallet' if Coinbase.use_server_signer?
|
@@ -381,11 +363,6 @@ module Coinbase
|
|
381
363
|
Data.new(wallet_id: id, seed: @master.seed_hex)
|
382
364
|
end
|
383
365
|
|
384
|
-
# Requests funds from the faucet for the Wallet's default address and returns the faucet transaction.
|
385
|
-
# This is only supported on testnet networks.
|
386
|
-
# @return [Coinbase::FaucetTransaction] The successful faucet transaction
|
387
|
-
# @raise [Coinbase::FaucetLimitReachedError] If the faucet limit has been reached for the address or user.
|
388
|
-
# @raise [Coinbase::Client::ApiError] If an unexpected error occurs while requesting faucet funds.
|
389
366
|
def faucet
|
390
367
|
Coinbase.call_api do
|
391
368
|
Coinbase::FaucetTransaction.new(addresses_api.request_faucet_funds(id, default_address.id))
|
@@ -433,9 +410,7 @@ module Coinbase
|
|
433
410
|
iv: iv
|
434
411
|
}
|
435
412
|
|
436
|
-
File.
|
437
|
-
file.write(JSON.pretty_generate(existing_seeds_in_store))
|
438
|
-
end
|
413
|
+
File.write(file_path, JSON.pretty_generate(existing_seeds_in_store))
|
439
414
|
|
440
415
|
"Successfully saved seed for wallet #{id} to #{file_path}."
|
441
416
|
end
|
@@ -482,8 +457,12 @@ module Coinbase
|
|
482
457
|
# Returns a String representation of the Wallet.
|
483
458
|
# @return [String] a String representation of the Wallet
|
484
459
|
def to_s
|
485
|
-
|
486
|
-
|
460
|
+
Coinbase.pretty_print_object(
|
461
|
+
self.class,
|
462
|
+
id: id,
|
463
|
+
network_id: network.id,
|
464
|
+
default_address: @model.default_address&.address_id
|
465
|
+
)
|
487
466
|
end
|
488
467
|
|
489
468
|
# Same as to_s.
|
@@ -492,32 +471,6 @@ module Coinbase
|
|
492
471
|
to_s
|
493
472
|
end
|
494
473
|
|
495
|
-
# The data required to recreate a Wallet.
|
496
|
-
class Data
|
497
|
-
attr_reader :wallet_id, :seed
|
498
|
-
|
499
|
-
# Returns a new Data object.
|
500
|
-
# @param wallet_id [String] The ID of the Wallet
|
501
|
-
# @param seed [String] The seed of the Wallet
|
502
|
-
def initialize(wallet_id:, seed:)
|
503
|
-
@wallet_id = wallet_id
|
504
|
-
@seed = seed
|
505
|
-
end
|
506
|
-
|
507
|
-
# Converts the Data object to a Hash.
|
508
|
-
# @return [Hash] The Hash representation of the Data object
|
509
|
-
def to_hash
|
510
|
-
{ wallet_id: wallet_id, seed: seed }
|
511
|
-
end
|
512
|
-
|
513
|
-
# Creates a Data object from the given Hash.
|
514
|
-
# @param data [Hash] The Hash to create the Data object from
|
515
|
-
# @return [Data] The new Data object
|
516
|
-
def self.from_hash(data)
|
517
|
-
Data.new(wallet_id: data['wallet_id'], seed: data['seed'])
|
518
|
-
end
|
519
|
-
end
|
520
|
-
|
521
474
|
private
|
522
475
|
|
523
476
|
# Reloads the Wallet with the latest data.
|
@@ -538,13 +491,11 @@ module Coinbase
|
|
538
491
|
end
|
539
492
|
|
540
493
|
def address_path_prefix
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
raise ArgumentError, "Unsupported network ID: #{network_id}"
|
547
|
-
end
|
494
|
+
if network.address_path_prefix.nil? || network.address_path_prefix.empty?
|
495
|
+
raise ArgumentError, "Cannot create address for network #{network.id}"
|
496
|
+
end
|
497
|
+
|
498
|
+
network.address_path_prefix
|
548
499
|
end
|
549
500
|
|
550
501
|
# Derives a key for the given address index.
|
@@ -626,5 +577,15 @@ module Coinbase
|
|
626
577
|
def wallets_api
|
627
578
|
@wallets_api ||= Coinbase::Client::WalletsApi.new(Coinbase.configuration.api_client)
|
628
579
|
end
|
580
|
+
|
581
|
+
def set_addresses
|
582
|
+
address_list = Coinbase.call_api do
|
583
|
+
addresses_api.list_addresses(@model.id, { limit: MAX_ADDRESSES })
|
584
|
+
end
|
585
|
+
|
586
|
+
@addresses = address_list.data.each_with_index.map do |address_model, index|
|
587
|
+
build_wallet_address(address_model, index)
|
588
|
+
end
|
589
|
+
end
|
629
590
|
end
|
630
591
|
end
|
@@ -0,0 +1,181 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Coinbase
|
4
|
+
# A representation of a Webhook.
|
5
|
+
# This class provides methods to create, list, update, and delete webhooks
|
6
|
+
# that are used to receive notifications of specific events.
|
7
|
+
class Webhook
|
8
|
+
# Event type for ERC20 transfer
|
9
|
+
ERC20_TRANSFER_EVENT = 'erc20_transfer'
|
10
|
+
|
11
|
+
# Event type for ERC721 transfer
|
12
|
+
ERC721_TRANSFER_EVENT = 'erc721_transfer'
|
13
|
+
|
14
|
+
class << self
|
15
|
+
# Creates a new webhook for a specified network.
|
16
|
+
#
|
17
|
+
# @param network_id [String] The network ID for which the webhook is created.
|
18
|
+
# @param notification_uri [String] The URI where notifications should be sent.
|
19
|
+
# @param event_type [String] The type of event for the webhook. Must be one of the following:
|
20
|
+
# - `Coinbase::Webhook::ERC20_TRANSFER_EVENT`
|
21
|
+
# - `Coinbase::Webhook::ERC721_TRANSFER_EVENT`
|
22
|
+
# @param event_filters [Array<Hash>] Filters applied to the events that determine
|
23
|
+
# which specific events trigger the webhook. Each filter should be a hash that
|
24
|
+
# can include keys like `contract_address`, `from_address`, or `to_address`.
|
25
|
+
# @return [Coinbase::Webhook] A new instance of Webhook.
|
26
|
+
#
|
27
|
+
# @example Create a new webhook
|
28
|
+
# webhook = Coinbase::Webhook.create(
|
29
|
+
# network_id: :ethereum_mainnet,
|
30
|
+
# notification_uri: 'https://example.com/callback',
|
31
|
+
# event_type: 'transaction',
|
32
|
+
# event_filters: [{ 'contract_address' => '0x...', 'from_address' => '0x...', 'to_address' => '0x...' }]
|
33
|
+
# )
|
34
|
+
def create(network_id:, notification_uri:, event_type:, event_filters:)
|
35
|
+
model = Coinbase.call_api do
|
36
|
+
webhooks_api.create_webhook(
|
37
|
+
create_webhook_request: {
|
38
|
+
network_id: Coinbase.normalize_network(network_id),
|
39
|
+
notification_uri: notification_uri,
|
40
|
+
event_type: event_type,
|
41
|
+
event_filters: event_filters
|
42
|
+
}
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
new(model)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Enumerates the webhooks.
|
50
|
+
# The result is an enumerator that lazily fetches from the server, and can be iterated over,
|
51
|
+
# converted to an array, etc...
|
52
|
+
# @return [Enumerable<Coinbase::Webhook>] Enumerator that returns webhooks
|
53
|
+
def list
|
54
|
+
Coinbase::Pagination.enumerate(method(:fetch_webhooks_page).to_proc) do |webhook|
|
55
|
+
Coinbase::Webhook.new(webhook)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def webhooks_api
|
62
|
+
Coinbase::Client::WebhooksApi.new(Coinbase.configuration.api_client)
|
63
|
+
end
|
64
|
+
|
65
|
+
def fetch_webhooks_page(page)
|
66
|
+
webhooks_api.list_webhooks({ limit: DEFAULT_PAGE_LIMIT, page: page })
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Initializes a new Webhook object.
|
71
|
+
#
|
72
|
+
# @param model [Coinbase::Client::Webhook] The underlying Webhook object.
|
73
|
+
# @raise [ArgumentError] If the model is not a Coinbase::Client::Webhook.
|
74
|
+
def initialize(model)
|
75
|
+
raise ArgumentError, 'model must be a Webhook' unless model.is_a?(Coinbase::Client::Webhook)
|
76
|
+
|
77
|
+
@model = model
|
78
|
+
end
|
79
|
+
|
80
|
+
# Returns the ID of the webhook.
|
81
|
+
#
|
82
|
+
# @return [String] The ID of the webhook.
|
83
|
+
def id
|
84
|
+
@model.id
|
85
|
+
end
|
86
|
+
|
87
|
+
# Returns the network ID associated with the webhook.
|
88
|
+
#
|
89
|
+
# @return [Symbol] The network ID of the webhook.
|
90
|
+
def network_id
|
91
|
+
Coinbase.to_sym(@model.network_id)
|
92
|
+
end
|
93
|
+
|
94
|
+
# Returns the notification URI of the webhook.
|
95
|
+
#
|
96
|
+
# @return [String] The URI where notifications are sent.
|
97
|
+
def notification_uri
|
98
|
+
@model.notification_uri
|
99
|
+
end
|
100
|
+
|
101
|
+
# Returns the event type of the webhook.
|
102
|
+
#
|
103
|
+
# @return [String] The type of event the webhook listens for.
|
104
|
+
def event_type
|
105
|
+
@model.event_type
|
106
|
+
end
|
107
|
+
|
108
|
+
# Returns the event filters applied to the webhook.
|
109
|
+
#
|
110
|
+
# @return [Array<Coinbase::Client::WebhookEventFilter>] An array of event filters used by the webhook.
|
111
|
+
def event_filters
|
112
|
+
@model.event_filters
|
113
|
+
end
|
114
|
+
|
115
|
+
# Updates the webhook with a new notification URI.
|
116
|
+
#
|
117
|
+
# @param notification_uri [String] The new URI for webhook notifications.
|
118
|
+
# @return [self] Returns the updated Webhook object.
|
119
|
+
#
|
120
|
+
# @example Update the notification URI of a webhook
|
121
|
+
# webhook.update(notification_uri: 'https://new-url.com/callback')
|
122
|
+
def update(notification_uri:)
|
123
|
+
model = Coinbase.call_api do
|
124
|
+
webhooks_api.update_webhook(
|
125
|
+
id,
|
126
|
+
update_webhook_request: {
|
127
|
+
network_id: network_id,
|
128
|
+
notification_uri: notification_uri,
|
129
|
+
event_type: event_type,
|
130
|
+
event_filters: event_filters.map(&:to_hash)
|
131
|
+
}
|
132
|
+
)
|
133
|
+
end
|
134
|
+
|
135
|
+
@model = model
|
136
|
+
|
137
|
+
self
|
138
|
+
end
|
139
|
+
|
140
|
+
# Deletes the webhook.
|
141
|
+
#
|
142
|
+
# @return [self] Returns the Webhook object with nil attributes.
|
143
|
+
#
|
144
|
+
# @example Delete a webhook
|
145
|
+
# webhook.delete
|
146
|
+
def delete
|
147
|
+
Coinbase.call_api do
|
148
|
+
webhooks_api.delete_webhook(id)
|
149
|
+
end
|
150
|
+
|
151
|
+
@model = nil
|
152
|
+
|
153
|
+
self
|
154
|
+
end
|
155
|
+
|
156
|
+
# Returns a String representation of the Webhook.
|
157
|
+
# @return [String] a String representation of the Webhook
|
158
|
+
def to_s
|
159
|
+
Coinbase.pretty_print_object(
|
160
|
+
self.class,
|
161
|
+
id: @model.id,
|
162
|
+
network_id: @model.network_id,
|
163
|
+
event_type: @model.event_type,
|
164
|
+
notification_uri: @model.notification_uri,
|
165
|
+
event_filters: @model.event_filters.map(&:to_hash).to_json
|
166
|
+
)
|
167
|
+
end
|
168
|
+
|
169
|
+
# Same as to_s.
|
170
|
+
# @return [String] a String representation of the Webhook
|
171
|
+
def inspect
|
172
|
+
to_s
|
173
|
+
end
|
174
|
+
|
175
|
+
private
|
176
|
+
|
177
|
+
def webhooks_api
|
178
|
+
@webhooks_api ||= Coinbase::Client::WebhooksApi.new(Coinbase.configuration.api_client)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|