coinbase-sdk 0.0.7 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/lib/coinbase/address/external_address.rb +173 -0
  3. data/lib/coinbase/address/wallet_address.rb +219 -0
  4. data/lib/coinbase/address.rb +32 -219
  5. data/lib/coinbase/asset.rb +76 -66
  6. data/lib/coinbase/authenticator.rb +2 -0
  7. data/lib/coinbase/balance.rb +10 -6
  8. data/lib/coinbase/client/api/addresses_api.rb +1 -1
  9. data/lib/coinbase/client/api/assets_api.rb +91 -0
  10. data/lib/coinbase/client/api/external_addresses_api.rb +242 -0
  11. data/lib/coinbase/client/api/server_signers_api.rb +1 -1
  12. data/lib/coinbase/client/api/stake_api.rb +157 -7
  13. data/lib/coinbase/client/api/trades_api.rb +1 -1
  14. data/lib/coinbase/client/api/transfers_api.rb +1 -1
  15. data/lib/coinbase/client/api/users_api.rb +1 -1
  16. data/lib/coinbase/client/api/wallets_api.rb +1 -1
  17. data/lib/coinbase/client/api_client.rb +3 -3
  18. data/lib/coinbase/client/api_error.rb +1 -1
  19. data/lib/coinbase/client/configuration.rb +1 -1
  20. data/lib/coinbase/client/models/address.rb +1 -1
  21. data/lib/coinbase/client/models/address_balance_list.rb +1 -1
  22. data/lib/coinbase/client/models/address_list.rb +1 -1
  23. data/lib/coinbase/client/models/asset.rb +1 -1
  24. data/lib/coinbase/client/models/balance.rb +1 -1
  25. data/lib/coinbase/client/models/broadcast_trade_request.rb +1 -1
  26. data/lib/coinbase/client/models/broadcast_transfer_request.rb +1 -1
  27. data/lib/coinbase/client/models/build_staking_operation_request.rb +1 -1
  28. data/lib/coinbase/client/models/create_address_request.rb +1 -1
  29. data/lib/coinbase/client/models/create_server_signer_request.rb +22 -5
  30. data/lib/coinbase/client/models/create_trade_request.rb +1 -1
  31. data/lib/coinbase/client/models/create_transfer_request.rb +1 -1
  32. data/lib/coinbase/client/models/create_wallet_request.rb +1 -1
  33. data/lib/coinbase/client/models/create_wallet_request_wallet.rb +1 -1
  34. data/lib/coinbase/client/models/error.rb +1 -1
  35. data/lib/coinbase/client/models/faucet_transaction.rb +23 -5
  36. data/lib/coinbase/client/models/feature.rb +1 -1
  37. data/lib/coinbase/client/models/fetch_staking_rewards200_response.rb +258 -0
  38. data/lib/coinbase/client/models/fetch_staking_rewards_request.rb +330 -0
  39. data/lib/coinbase/client/models/get_staking_context_request.rb +274 -0
  40. data/lib/coinbase/client/models/partial_eth_staking_context.rb +254 -0
  41. data/lib/coinbase/client/models/seed_creation_event.rb +1 -1
  42. data/lib/coinbase/client/models/seed_creation_event_result.rb +1 -1
  43. data/lib/coinbase/client/models/server_signer.rb +22 -5
  44. data/lib/coinbase/client/models/server_signer_event.rb +1 -1
  45. data/lib/coinbase/client/models/server_signer_event_event.rb +1 -1
  46. data/lib/coinbase/client/models/server_signer_event_list.rb +1 -1
  47. data/lib/coinbase/client/models/server_signer_list.rb +1 -1
  48. data/lib/coinbase/client/models/signature_creation_event.rb +1 -1
  49. data/lib/coinbase/client/models/signature_creation_event_result.rb +1 -1
  50. data/lib/coinbase/client/models/{request_faucet_funds200_response.rb → staking_context.rb} +16 -16
  51. data/lib/coinbase/client/models/staking_context_context.rb +104 -0
  52. data/lib/coinbase/client/models/staking_operation.rb +15 -12
  53. data/lib/coinbase/client/models/staking_reward.rb +324 -0
  54. data/lib/coinbase/client/models/staking_reward_format.rb +40 -0
  55. data/lib/coinbase/client/models/trade.rb +1 -1
  56. data/lib/coinbase/client/models/trade_list.rb +1 -1
  57. data/lib/coinbase/client/models/transaction.rb +1 -1
  58. data/lib/coinbase/client/models/transaction_type.rb +1 -1
  59. data/lib/coinbase/client/models/transfer.rb +1 -1
  60. data/lib/coinbase/client/models/transfer_list.rb +1 -1
  61. data/lib/coinbase/client/models/user.rb +1 -1
  62. data/lib/coinbase/client/models/wallet.rb +1 -1
  63. data/lib/coinbase/client/models/wallet_list.rb +1 -1
  64. data/lib/coinbase/client/version.rb +1 -1
  65. data/lib/coinbase/client.rb +11 -1
  66. data/lib/coinbase/constants.rb +2 -27
  67. data/lib/coinbase/errors.rb +56 -64
  68. data/lib/coinbase/faucet_transaction.rb +5 -4
  69. data/lib/coinbase/network.rb +6 -20
  70. data/lib/coinbase/pagination.rb +26 -0
  71. data/lib/coinbase/staking_operation.rb +29 -0
  72. data/lib/coinbase/staking_reward.rb +79 -0
  73. data/lib/coinbase/transaction.rb +6 -0
  74. data/lib/coinbase/user.rb +5 -51
  75. data/lib/coinbase/wallet.rb +97 -102
  76. data/lib/coinbase.rb +19 -11
  77. metadata +17 -17
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'digest'
4
- require 'jimson'
5
4
  require 'json'
6
5
  require 'money-tree'
7
6
  require 'securerandom'
@@ -9,14 +8,14 @@ require 'securerandom'
9
8
  module Coinbase
10
9
  # A representation of a Wallet. Wallets come with a single default Address, but can expand to have a set of Addresses,
11
10
  # each of which can hold a balance of one or more Assets. Wallets can create new Addresses, list their addresses,
12
- # list their balances, and transfer Assets to other Addresses. Wallets should be created through User#create_wallet or
13
- # User#import_wallet.
11
+ # list their balances, and transfer Assets to other Addresses.
14
12
  class Wallet
15
- attr_reader :addresses, :model
16
-
17
13
  # The maximum number of addresses in a Wallet.
18
14
  MAX_ADDRESSES = 20
19
15
 
16
+ # The maximum number of wallets to fetch in a single page.
17
+ PAGE_LIMIT = 100
18
+
20
19
  # A representation of ServerSigner status in a Wallet.
21
20
  module ServerSignerStatus
22
21
  # The Wallet is awaiting seed creation by the ServerSigner. At this point,
@@ -39,11 +38,31 @@ module Coinbase
39
38
  wallets_api.get_wallet(data.wallet_id)
40
39
  end
41
40
 
42
- address_list = Coinbase.call_api do
43
- addresses_api.list_addresses(model.id, { limit: MAX_ADDRESSES })
41
+ new(model, seed: data.seed)
42
+ end
43
+
44
+ # Enumerates the wallets for the requesting user.
45
+ # The result is an enumerator that lazily fetches from the server, and can be iterated over,
46
+ # converted to an array, etc...
47
+ # @return [Enumerable<Coinbase::Wallet>] Enumerator that returns wallets
48
+ def list
49
+ Coinbase::Pagination.enumerate(lambda(&method(:fetch_wallets_page))) do |wallet|
50
+ Coinbase::Wallet.new(wallet, seed: '')
51
+ end
52
+ end
53
+
54
+ # Fetches a Wallet by its ID.
55
+ # The returned wallet can be immediately used for signing operations if backed by a server signer.
56
+ # If the wallet is not backed by a server signer, the wallet's seed will need to be set before
57
+ # it can be used for signing operations.
58
+ # @param wallet_id [String] The ID of the Wallet to fetch
59
+ # @return [Coinbase::Wallet] The fetched Wallet
60
+ def fetch(wallet_id)
61
+ model = Coinbase.call_api do
62
+ wallets_api.get_wallet(wallet_id)
44
63
  end
45
64
 
46
- new(model, seed: data.seed, address_models: address_list.data)
65
+ new(model, seed: '')
47
66
  end
48
67
 
49
68
  # Creates a new Wallet on the specified Network and generate a default address for it.
@@ -58,7 +77,7 @@ module Coinbase
58
77
  wallets_api.create_wallet(
59
78
  create_wallet_request: {
60
79
  wallet: {
61
- network_id: network_id,
80
+ network_id: Coinbase.normalize_network(network_id),
62
81
  use_server_signer: Coinbase.use_server_signer?
63
82
  }
64
83
  }
@@ -103,7 +122,6 @@ module Coinbase
103
122
  self
104
123
  end
105
124
 
106
- # TODO: Memoize these objects in a thread-safe way at the top-level.
107
125
  def addresses_api
108
126
  Coinbase::Client::AddressesApi.new(Coinbase.configuration.api_client)
109
127
  end
@@ -111,6 +129,10 @@ module Coinbase
111
129
  def wallets_api
112
130
  Coinbase::Client::WalletsApi.new(Coinbase.configuration.api_client)
113
131
  end
132
+
133
+ def fetch_wallets_page(page)
134
+ wallets_api.list_wallets({ limit: PAGE_LIMIT, page: page })
135
+ end
114
136
  end
115
137
 
116
138
  # Returns a new Wallet object. Do not use this method directly. Instead, use User#create_wallet or
@@ -119,21 +141,30 @@ module Coinbase
119
141
  # @param seed [String] (Optional) The seed to use for the Wallet. Expects a 32-byte hexadecimal with no 0x prefix.
120
142
  # If nil, a new seed will be generated. If the empty string, no seed is generated, and the Wallet will be
121
143
  # instantiated without a seed and its corresponding private keys.
122
- # @param address_models [Array<Coinbase::Client::Address>] (Optional) The models of the addresses already registered
123
144
  # with the Wallet. If not provided, the Wallet will derive the first default address.
124
- # @param client [Jimson::Client] (Optional) The JSON RPC client to use for interacting with the Network
125
- def initialize(model, seed: nil, address_models: [])
126
- validate_seed_and_address_models(seed, address_models) unless Coinbase.use_server_signer?
145
+ def initialize(model, seed: nil)
146
+ raise ArgumentError, 'model must be a Wallet' unless model.is_a?(Coinbase::Client::Wallet)
127
147
 
128
148
  @model = model
129
- @addresses = []
130
149
 
131
- unless Coinbase.use_server_signer?
132
- @master = master_node(seed)
133
- @private_key_index = 0
134
- end
150
+ return if Coinbase.use_server_signer?
151
+
152
+ @master = master_node(seed)
153
+ end
154
+
155
+ # Returns the addresses belonging to the Wallet.
156
+ # @return [Array<Coinbase::WalletAddress>] The addresses belonging to the Wallet
157
+ def addresses
158
+ @addresses ||= begin
159
+ address_list = Coinbase.call_api do
160
+ addresses_api.list_addresses(@model.id, { limit: MAX_ADDRESSES })
161
+ end
135
162
 
136
- derive_addresses(address_models)
163
+ # Build the WalletAddress objects, injecting the key if available.
164
+ address_list.data.each_with_index.map do |address_model, index|
165
+ build_wallet_address(address_model, index)
166
+ end
167
+ end
137
168
  end
138
169
 
139
170
  # Returns the Wallet ID.
@@ -157,18 +188,22 @@ module Coinbase
157
188
  # Sets the seed of the Wallet. This seed is used to derive keys and sign transactions.
158
189
  # @param seed [String] The seed to set. Expects a 32-byte hexadecimal with no 0x prefix.
159
190
  def seed=(seed)
160
- raise ArgumentError, 'Seed must be 32 bytes' if seed.length != 64
161
- raise 'Seed is already set' unless @master.nil?
162
- raise 'Cannot set seed for Wallet with non-zero private key index' if @private_key_index.positive?
191
+ raise ArgumentError, 'Seed must not be empty' if seed.nil? || seed.empty?
192
+ raise StandardError, 'Seed is already set' unless @master.nil?
193
+
194
+ @master = master_node(seed)
163
195
 
164
- @master = MoneyTree::Master.new(seed_hex: seed)
196
+ # If the addresses are not loaded the keys will be set on them whenever they are loaded.
197
+ return if @addresses.nil?
165
198
 
166
- @addresses.each do
167
- key = derive_key
168
- a = address(key.address.to_s)
169
- raise "Seed does not match wallet; cannot find address #{key.address}" if a.nil?
199
+ # If addresses are already loaded, set the keys on each address.
200
+ addresses.each_with_index.each do |address, index|
201
+ key = derive_key(index)
170
202
 
171
- a.key = key
203
+ # If we derive a key the derived address must match the address from the API.
204
+ raise StandardError, 'Seed does not match wallet' unless address.id == key.address.to_s
205
+
206
+ address.key = key
172
207
  end
173
208
  end
174
209
 
@@ -178,7 +213,10 @@ module Coinbase
178
213
  opts = { create_address_request: {} }
179
214
 
180
215
  unless Coinbase.use_server_signer?
181
- key = derive_key
216
+ # The index for the next address is the number of addresses already registered.
217
+ private_key_index = addresses.count
218
+
219
+ key = derive_key(private_key_index)
182
220
 
183
221
  opts = {
184
222
  create_address_request: {
@@ -193,9 +231,12 @@ module Coinbase
193
231
  end
194
232
 
195
233
  # Auto-reload wallet to set default address on first address creation.
196
- reload if addresses.empty?
234
+ reload if default_address.nil?
197
235
 
198
- cache_address(address_model, key)
236
+ # Cache the address in our memoized list
237
+ address = WalletAddress.new(address_model, key)
238
+ @addresses << address
239
+ address
199
240
  end
200
241
 
201
242
  # Returns the default address of the Wallet.
@@ -208,7 +249,7 @@ module Coinbase
208
249
  # @param address_id [String] The ID of the Address to retrieve
209
250
  # @return [Address] The Address
210
251
  def address(address_id)
211
- @addresses.find { |address| address.id == address_id }
252
+ addresses.find { |address| address.id == address_id }
212
253
  end
213
254
 
214
255
  # Returns the list of balances of this Wallet. Balances are aggregated across all Addresses in the Wallet.
@@ -413,85 +454,35 @@ module Coinbase
413
454
  end
414
455
  end
415
456
 
457
+ # Returns the master node for the given seed.
416
458
  def master_node(seed)
417
459
  return MoneyTree::Master.new if seed.nil?
418
460
  return nil if seed.empty?
419
461
 
462
+ validate_seed(seed)
463
+
420
464
  MoneyTree::Master.new(seed_hex: seed)
421
465
  end
422
466
 
423
467
  def address_path_prefix
424
- # TODO: Add support for other networks.
468
+ # TODO: Push this logic to the backend.
425
469
  @address_path_prefix ||= case network_id.to_s.split('_').first
426
- when 'base'
470
+ when 'base', 'ethereum'
427
471
  "m/44'/60'/0'/0"
428
472
  else
429
473
  raise ArgumentError, "Unsupported network ID: #{network_id}"
430
474
  end
431
475
  end
432
476
 
433
- # Derives the registered Addresses in the Wallet.
434
- # @param address_models [Array<Coinbase::Client::Address>] The models of the addresses already registered with the
435
- # Wallet
436
- def derive_addresses(address_models)
437
- return unless address_models.any?
438
-
439
- # Create a map tracking which addresses are already registered with the Wallet.
440
- address_map = build_address_map(address_models)
441
-
442
- address_models.each do |address_model|
443
- # Derive the addresses using the provided models.
444
- derive_address(address_map, address_model)
445
- end
446
- end
447
-
448
- # Derives an already registered Address in the Wallet.
449
- # @param address_map [Hash<String, Boolean>] The map of registered Address IDs
450
- # @param address_model [Coinbase::Client::Address] The Address model
451
- # @return [Address] The new Address
452
- def derive_address(address_map, address_model)
453
- key = @master.nil? ? nil : derive_key
454
-
455
- unless key.nil?
456
- address_from_key = key.address.to_s
457
- raise 'Invalid address' if address_map[address_from_key].nil?
458
- end
459
-
460
- cache_address(address_model, key)
461
- end
462
-
463
- # Derives a key for an already registered Address in the Wallet.
477
+ # Derives a key for the given address index.
464
478
  # @return [Eth::Key] The new key
465
- def derive_key
479
+ def derive_key(index)
466
480
  raise 'Cannot derive key for Wallet without seed loaded' if @master.nil?
467
481
 
468
- path = "#{address_path_prefix}/#{@private_key_index}"
482
+ path = "#{address_path_prefix}/#{index}"
469
483
  private_key = @master.node_for_path(path).private_key.to_hex
470
- @private_key_index += 1
471
- Eth::Key.new(priv: private_key)
472
- end
473
-
474
- # Caches an Address on the client-side and increments the address index.
475
- # @param address_model [Coinbase::Client::Address] The Address model
476
- # @param key [Eth::Key] The private key of the Address
477
- # @return [Address] The new Address
478
- def cache_address(address_model, key)
479
- address = Address.new(address_model, key)
480
- @addresses << address
481
- address
482
- end
483
484
 
484
- # Builds a Hash of the registered Addresses.
485
- # @param address_models [Array<Coinbase::Client::Address>] The models of the addresses already registered with the
486
- # Wallet
487
- # @return [Hash<String, Boolean>] The Hash of registered Addresses
488
- def build_address_map(address_models)
489
- address_map = {}
490
- address_models.each do |address_model|
491
- address_map[address_model.address_id] = true
492
- end
493
-
494
- address_map
485
+ Eth::Key.new(priv: private_key)
495
486
  end
496
487
 
497
488
  # Creates an attestation for the Address currently being created.
@@ -520,16 +511,9 @@ module Coinbase
520
511
 
521
512
  # Validates the seed and address models passed to the constructor.
522
513
  # @param seed [String] The seed to use for the Wallet
523
- # @param address_models [Array<Coinbase::Client::Address>] The models of the addresses already registered with the
524
- # Wallet
525
- def validate_seed_and_address_models(seed, address_models)
526
- raise ArgumentError, 'Seed must be 32 bytes' if !seed.nil? && !seed.empty? && seed.length != 64
527
-
528
- raise ArgumentError, 'Seed must be present if address_models are provided' if seed.nil? && address_models.any?
529
-
530
- return unless !seed.nil? && seed.empty? && address_models.empty?
531
-
532
- raise ArgumentError, 'Seed must be empty if address_models are not provided'
514
+ # @raise [ArgumentError] If the seed is invalid
515
+ def validate_seed(seed)
516
+ raise ArgumentError, 'Seed must be 32 bytes' unless seed.length == 64
533
517
  end
534
518
 
535
519
  # Loads the Hash of Wallet seeds from the given file.
@@ -551,6 +535,17 @@ module Coinbase
551
535
  pk.dh_compute_key(public_key)
552
536
  end
553
537
 
538
+ def build_wallet_address(address_model, index)
539
+ # Return an unhydrated wallet address is no master seed is set.
540
+ return WalletAddress.new(address_model, nil) if @master.nil?
541
+
542
+ key = derive_key(index)
543
+
544
+ raise StandardError, 'Seed does not match wallet' unless address_model.address_id == key.address.to_s
545
+
546
+ WalletAddress.new(address_model, key)
547
+ end
548
+
554
549
  def addresses_api
555
550
  @addresses_api ||= Coinbase::Client::AddressesApi.new(Coinbase.configuration.api_client)
556
551
  end
data/lib/coinbase.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'coinbase/address'
4
+ require_relative 'coinbase/address/wallet_address'
5
+ require_relative 'coinbase/address/external_address'
4
6
  require_relative 'coinbase/asset'
5
7
  require_relative 'coinbase/authenticator'
6
8
  require_relative 'coinbase/balance'
@@ -11,12 +13,15 @@ require_relative 'coinbase/errors'
11
13
  require_relative 'coinbase/faucet_transaction'
12
14
  require_relative 'coinbase/middleware'
13
15
  require_relative 'coinbase/network'
16
+ require_relative 'coinbase/pagination'
14
17
  require_relative 'coinbase/trade'
15
18
  require_relative 'coinbase/transfer'
16
19
  require_relative 'coinbase/transaction'
17
20
  require_relative 'coinbase/user'
18
21
  require_relative 'coinbase/wallet'
19
22
  require_relative 'coinbase/server_signer'
23
+ require_relative 'coinbase/staking_operation'
24
+ require_relative 'coinbase/staking_reward'
20
25
  require 'json'
21
26
 
22
27
  # The Coinbase SDK.
@@ -55,13 +60,10 @@ module Coinbase
55
60
 
56
61
  # Configuration object for the Coinbase SDK.
57
62
  class Configuration
58
- attr_reader :base_sepolia_rpc_url, :base_sepolia_client
59
63
  attr_accessor :api_url, :api_key_name, :api_key_private_key, :debug_api, :use_server_signer
60
64
 
61
65
  # Initializes the configuration object.
62
66
  def initialize
63
- @base_sepolia_rpc_url = 'https://sepolia.base.org'
64
- @base_sepolia_client = Jimson::Client.new(@base_sepolia_rpc_url)
65
67
  @api_url = 'https://api.cdp.coinbase.com'
66
68
  @debug_api = false
67
69
  @use_server_signer = false
@@ -82,13 +84,6 @@ module Coinbase
82
84
  @api_key_private_key = data['privateKey']
83
85
  end
84
86
 
85
- # Sets the Base Sepolia RPC URL.
86
- # @param new_base_sepolia_rpc_url [String] the new Base Sepolia RPC URL
87
- def base_sepolia_rpc_url=(new_base_sepolia_rpc_url)
88
- @base_sepolia_rpc_url = new_base_sepolia_rpc_url
89
- @base_sepolia_client = Jimson::Client.new(@base_sepolia_rpc_url)
90
- end
91
-
92
87
  # Returns the API client.
93
88
  # @return [Coinbase::Client::ApiClient] the API client
94
89
  def api_client
@@ -109,6 +104,13 @@ module Coinbase
109
104
  value.to_s.gsub('-', '_').to_sym
110
105
  end
111
106
 
107
+ # Converts a network symbol to a string, replacing underscores with hyphens.
108
+ # @param network_sym [Symbol] the network symbol to convert
109
+ # @return [String] the converted string
110
+ def self.normalize_network(network_sym)
111
+ network_sym.to_s.gsub(/_/, '-')
112
+ end
113
+
112
114
  # Loads the default user.
113
115
  # @return [Coinbase::User] the default user
114
116
  def self.load_default_user
@@ -122,7 +124,7 @@ module Coinbase
122
124
  def self.call_api
123
125
  yield
124
126
  rescue Coinbase::Client::ApiError => e
125
- raise Coinbase::APIError.from_error(e)
127
+ raise Coinbase::APIError.from_error(e), cause: nil
126
128
  rescue StandardError => e
127
129
  raise e
128
130
  end
@@ -132,4 +134,10 @@ module Coinbase
132
134
  def self.use_server_signer?
133
135
  Coinbase.configuration.use_server_signer
134
136
  end
137
+
138
+ # Returns whether the SDK is configured.
139
+ # @return [bool] whether the SDK is configured
140
+ def self.configured?
141
+ !Coinbase.configuration.api_key_name.nil? && !Coinbase.configuration.api_key_private_key.nil?
142
+ end
135
143
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coinbase-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuga Cohler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-11 00:00:00.000000000 Z
11
+ date: 2024-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bigdecimal
@@ -66,20 +66,6 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: jimson
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: jwt
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -242,12 +228,16 @@ extra_rdoc_files: []
242
228
  files:
243
229
  - lib/coinbase.rb
244
230
  - lib/coinbase/address.rb
231
+ - lib/coinbase/address/external_address.rb
232
+ - lib/coinbase/address/wallet_address.rb
245
233
  - lib/coinbase/asset.rb
246
234
  - lib/coinbase/authenticator.rb
247
235
  - lib/coinbase/balance.rb
248
236
  - lib/coinbase/balance_map.rb
249
237
  - lib/coinbase/client.rb
250
238
  - lib/coinbase/client/api/addresses_api.rb
239
+ - lib/coinbase/client/api/assets_api.rb
240
+ - lib/coinbase/client/api/external_addresses_api.rb
251
241
  - lib/coinbase/client/api/server_signers_api.rb
252
242
  - lib/coinbase/client/api/stake_api.rb
253
243
  - lib/coinbase/client/api/trades_api.rb
@@ -274,7 +264,10 @@ files:
274
264
  - lib/coinbase/client/models/error.rb
275
265
  - lib/coinbase/client/models/faucet_transaction.rb
276
266
  - lib/coinbase/client/models/feature.rb
277
- - lib/coinbase/client/models/request_faucet_funds200_response.rb
267
+ - lib/coinbase/client/models/fetch_staking_rewards200_response.rb
268
+ - lib/coinbase/client/models/fetch_staking_rewards_request.rb
269
+ - lib/coinbase/client/models/get_staking_context_request.rb
270
+ - lib/coinbase/client/models/partial_eth_staking_context.rb
278
271
  - lib/coinbase/client/models/seed_creation_event.rb
279
272
  - lib/coinbase/client/models/seed_creation_event_result.rb
280
273
  - lib/coinbase/client/models/server_signer.rb
@@ -284,7 +277,11 @@ files:
284
277
  - lib/coinbase/client/models/server_signer_list.rb
285
278
  - lib/coinbase/client/models/signature_creation_event.rb
286
279
  - lib/coinbase/client/models/signature_creation_event_result.rb
280
+ - lib/coinbase/client/models/staking_context.rb
281
+ - lib/coinbase/client/models/staking_context_context.rb
287
282
  - lib/coinbase/client/models/staking_operation.rb
283
+ - lib/coinbase/client/models/staking_reward.rb
284
+ - lib/coinbase/client/models/staking_reward_format.rb
288
285
  - lib/coinbase/client/models/trade.rb
289
286
  - lib/coinbase/client/models/trade_list.rb
290
287
  - lib/coinbase/client/models/transaction.rb
@@ -300,7 +297,10 @@ files:
300
297
  - lib/coinbase/faucet_transaction.rb
301
298
  - lib/coinbase/middleware.rb
302
299
  - lib/coinbase/network.rb
300
+ - lib/coinbase/pagination.rb
303
301
  - lib/coinbase/server_signer.rb
302
+ - lib/coinbase/staking_operation.rb
303
+ - lib/coinbase/staking_reward.rb
304
304
  - lib/coinbase/trade.rb
305
305
  - lib/coinbase/transaction.rb
306
306
  - lib/coinbase/transfer.rb