coinbase-sdk 0.0.13 → 0.0.16

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/lib/coinbase/address/external_address.rb +3 -166
  3. data/lib/coinbase/address/wallet_address.rb +51 -4
  4. data/lib/coinbase/address.rb +164 -0
  5. data/lib/coinbase/client/api/assets_api.rb +2 -2
  6. data/lib/coinbase/client/api/contract_events_api.rb +121 -0
  7. data/lib/coinbase/client/api/external_addresses_api.rb +85 -0
  8. data/lib/coinbase/client/api/networks_api.rb +85 -0
  9. data/lib/coinbase/client/api/stake_api.rb +361 -0
  10. data/lib/coinbase/client/api/webhooks_api.rb +286 -0
  11. data/lib/coinbase/client/models/address_historical_balance_list.rb +258 -0
  12. data/lib/coinbase/client/models/broadcast_staking_operation_request.rb +239 -0
  13. data/lib/coinbase/client/models/contract_event.rb +336 -0
  14. data/lib/coinbase/client/models/contract_event_list.rb +259 -0
  15. data/lib/coinbase/client/models/create_staking_operation_request.rb +274 -0
  16. data/lib/coinbase/client/models/create_transfer_request.rb +14 -4
  17. data/lib/coinbase/client/models/create_webhook_request.rb +282 -0
  18. data/lib/coinbase/client/models/ethereum_validator.rb +374 -0
  19. data/lib/coinbase/client/models/feature_set.rb +307 -0
  20. data/lib/coinbase/client/models/fetch_historical_staking_balances200_response.rb +258 -0
  21. data/lib/coinbase/client/models/get_validator200_response.rb +221 -0
  22. data/lib/coinbase/client/models/get_validator200_response_validator.rb +214 -0
  23. data/lib/coinbase/client/models/historical_balance.rb +273 -0
  24. data/lib/coinbase/client/models/network.rb +355 -0
  25. data/lib/coinbase/client/models/network_identifier.rb +44 -0
  26. data/lib/coinbase/client/models/sponsored_send.rb +338 -0
  27. data/lib/coinbase/client/models/staking_balance.rb +289 -0
  28. data/lib/coinbase/client/models/staking_context_context.rb +222 -74
  29. data/lib/coinbase/client/models/staking_operation.rb +15 -5
  30. data/lib/coinbase/client/models/staking_reward.rb +22 -6
  31. data/lib/coinbase/client/models/staking_reward_format.rb +2 -1
  32. data/lib/coinbase/client/models/staking_reward_usd_value.rb +257 -0
  33. data/lib/coinbase/client/models/transaction.rb +2 -2
  34. data/lib/coinbase/client/models/transaction_type.rb +2 -1
  35. data/lib/coinbase/client/models/transfer.rb +29 -24
  36. data/lib/coinbase/client/models/update_webhook_request.rb +289 -0
  37. data/lib/coinbase/client/models/validator_list_data.rb +216 -0
  38. data/lib/coinbase/client/models/wallet.rb +13 -16
  39. data/lib/coinbase/client/models/webhook.rb +299 -0
  40. data/lib/coinbase/client/models/webhook_event_filter.rb +236 -0
  41. data/lib/coinbase/client/models/webhook_event_type.rb +42 -0
  42. data/lib/coinbase/client/models/webhook_list.rb +244 -0
  43. data/lib/coinbase/client.rb +22 -3
  44. data/lib/coinbase/errors.rb +7 -0
  45. data/lib/coinbase/historical_balance.rb +53 -0
  46. data/lib/coinbase/middleware.rb +12 -0
  47. data/lib/coinbase/server_signer.rb +14 -3
  48. data/lib/coinbase/sponsored_send.rb +110 -0
  49. data/lib/coinbase/staking_balance.rb +86 -0
  50. data/lib/coinbase/staking_operation.rb +106 -5
  51. data/lib/coinbase/staking_reward.rb +18 -0
  52. data/lib/coinbase/trade.rb +1 -1
  53. data/lib/coinbase/transaction.rb +7 -3
  54. data/lib/coinbase/transfer.rb +56 -29
  55. data/lib/coinbase/wallet/data.rb +31 -0
  56. data/lib/coinbase/wallet.rb +91 -46
  57. data/lib/coinbase.rb +17 -4
  58. metadata +74 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6ea6f3f49e4b03f6131d891a1e628b9bed3a60b40b0a640358b5cc85ff4075ab
4
- data.tar.gz: 92d2b00b3dac22f12173f9b6a7860889b7d9e64966e55cf7ba175a3728f43be3
3
+ metadata.gz: addb2d81db155719e42cf1c4057498fc8094fcf436e3a67276870b3ff77a2d69
4
+ data.tar.gz: 6e1a0078557be2d0fe83979c66ec9415e77edbef0b6f72ef510d69aaf7580041
5
5
  SHA512:
6
- metadata.gz: c4a96ebe5f58f569419d2911aab739706d4176fb403b2283d8b44d29f36768bcf2588088f1870cbabc7a7f4941d12a9d796565e60c126014c48b318725fb8d13
7
- data.tar.gz: d97661b3ab9abb774561a307bb228c1d3795077777001ca5b6657f2205cf81f8674f68ef4bb9dff4b01623cfffa5c2835e26e58d26dbbf51a8bfcd70b13edc52
6
+ metadata.gz: 22648511bb07f598908f4b81fc87a8d06279e122b809d21a294e38b48cd54c65490a7c5009ebf6e013baffd8de7fba174017dbe6f75777e489646d9b735c885a
7
+ data.tar.gz: 623ecc923feb473a6a491ae07a536216ac5bf7f5648bf6e9eab8eca956ce88232973d98a376c67a61f71fade05587ba6e07300f7766d7ba3436397fce55ea994
@@ -3,171 +3,8 @@
3
3
  require 'date'
4
4
 
5
5
  module Coinbase
6
- # A representation of a blockchain Address that do not belong to a Coinbase::Wallet.
7
- # External addresses can be used to fetch balances, request funds from the faucet, etc...,
6
+ # A representation of a blockchain Address that does not belong to a Coinbase::Wallet.
7
+ # External addresses can be used to fetch balances, request funds from the faucet, etc.,
8
8
  # but cannot be used to sign transactions.
9
- class ExternalAddress < Address
10
- # Builds a stake operation for the supplied asset. The stake operation
11
- # may take a few minutes to complete in the case when infrastructure is spun up.
12
- # @param amount [Integer,String,BigDecimal] The amount of the asset to stake
13
- # @param asset_id [Symbol] The asset to stake
14
- # @param mode [Symbol] The staking mode. Defaults to :default.
15
- # @param options [Hash] Additional options for the stake operation
16
- # @return [Coinbase::StakingOperation] The stake operation
17
- def build_stake_operation(amount, asset_id, mode: :default, options: {})
18
- validate_can_stake!(amount, asset_id, mode, options)
19
-
20
- build_staking_operation(amount, asset_id, 'stake', mode: mode, options: options)
21
- end
22
-
23
- # Builds an unstake operation for the supplied asset.
24
- # @param amount [Integer,String,BigDecimal] The amount of the asset to unstake
25
- # @param asset_id [Symbol] The asset to unstake
26
- # @param mode [Symbol] The staking mode. Defaults to :default.
27
- # @param options [Hash] Additional options for the unstake operation
28
- # @return [Coinbase::StakingOperation] The unstake operation
29
- def build_unstake_operation(amount, asset_id, mode: :default, options: {})
30
- validate_can_unstake!(amount, asset_id, mode, options)
31
-
32
- build_staking_operation(amount, asset_id, 'unstake', mode: mode, options: options)
33
- end
34
-
35
- # Builds an claim_stake operation for the supplied asset.
36
- # @param amount [Integer,String,BigDecimal] The amount of the asset to claim
37
- # @param asset_id [Symbol] The asset to claim
38
- # @param mode [Symbol] The staking mode. Defaults to :default.
39
- # @param options [Hash] Additional options for the claim_stake operation
40
- # @return [Coinbase::StakingOperation] The claim_stake operation
41
- def build_claim_stake_operation(amount, asset_id, mode: :default, options: {})
42
- validate_can_claim_stake!(amount, asset_id, mode, options)
43
-
44
- build_staking_operation(amount, asset_id, 'claim_stake', mode: mode, options: options)
45
- end
46
-
47
- # Retrieves the balances used for staking for the supplied asset.
48
- # @param asset_id [Symbol] The asset to retrieve staking balances for
49
- # @param mode [Symbol] The staking mode. Defaults to :default.
50
- # @param options [Hash] Additional options for the staking operation
51
- # @return [Hash] The staking balances
52
- # @return [BigDecimal] :stakeable_balance The amount of the asset that can be staked
53
- # @return [BigDecimal] :unstakeable_balance The amount of the asset that is currently staked and cannot be unstaked
54
- # @return [BigDecimal] :claimable_balance The amount of the asset that can be claimed
55
- def staking_balances(asset_id, mode: :default, options: {})
56
- context_model = Coinbase.call_api do
57
- stake_api.get_staking_context(
58
- {
59
- asset_id: asset_id,
60
- network_id: Coinbase.normalize_network(network_id),
61
- address_id: id,
62
- options: {
63
- mode: mode
64
- }.merge(options)
65
- }
66
- )
67
- end.context
68
-
69
- {
70
- stakeable_balance: Coinbase::Balance.from_model_and_asset_id(
71
- context_model.stakeable_balance,
72
- asset_id
73
- ).amount,
74
- unstakeable_balance: Coinbase::Balance.from_model_and_asset_id(
75
- context_model.unstakeable_balance,
76
- asset_id
77
- ).amount,
78
- claimable_balance: Coinbase::Balance.from_model_and_asset_id(
79
- context_model.claimable_balance,
80
- asset_id
81
- ).amount
82
- }
83
- end
84
-
85
- # Retrieves the stakeable balance for the supplied asset.
86
- # @param asset_id [Symbol] The asset to retrieve the stakeable balance for
87
- # @param mode [Symbol] The staking mode. Defaults to :default.
88
- # @param options [Hash] Additional options for the staking operation
89
- # @return [BigDecimal] The stakeable balance
90
- def stakeable_balance(asset_id, mode: :default, options: {})
91
- staking_balances(asset_id, mode: mode, options: options)[:stakeable_balance]
92
- end
93
-
94
- # Retrieves the unstakeable balance for the supplied asset.
95
- # @param asset_id [Symbol] The asset to retrieve the unstakeable balance for
96
- # @param mode [Symbol] The staking mode. Defaults to :default.
97
- # @param options [Hash] Additional options for the staking operation
98
- # @return [BigDecimal] The unstakeable balance
99
- def unstakeable_balance(asset_id, mode: :default, options: {})
100
- staking_balances(asset_id, mode: mode, options: options)[:unstakeable_balance]
101
- end
102
-
103
- # Retrieves the claimable balance for the supplied asset.
104
- # @param asset_id [Symbol] The asset to retrieve the claimable balance for
105
- # @param mode [Symbol] The staking mode. Defaults to :default.
106
- # @param options [Hash] Additional options for the staking operation
107
- # @return [BigDecimal] The claimable balance
108
- def claimable_balance(asset_id, mode: :default, options: {})
109
- staking_balances(asset_id, mode: mode, options: options)[:claimable_balance]
110
- end
111
-
112
- # Lists the staking rewards for the address.
113
- # @param asset_id [Symbol] The asset to retrieve staking rewards for
114
- # @param start_time [Time] The start time for the rewards. Defaults to 1 month ago.
115
- # @param end_time [Time] The end time for the rewards. Defaults to the current time.
116
- # @param format [Symbol] The format to return the rewards in. Defaults to :usd.
117
- # @return [Enumerable<Coinbase::StakingReward>] The staking rewards
118
- def staking_rewards(asset_id, start_time: DateTime.now.prev_month(1), end_time: DateTime.now, format: :usd)
119
- StakingReward.list(
120
- network_id,
121
- asset_id,
122
- [id],
123
- start_time: start_time,
124
- end_time: end_time,
125
- format: format
126
- )
127
- end
128
-
129
- private
130
-
131
- def validate_can_stake!(amount, asset_id, mode, options)
132
- stakeable_balance = stakeable_balance(asset_id, mode: mode, options: options)
133
-
134
- raise InsufficientFundsError.new(amount, stakeable_balance) unless stakeable_balance >= amount
135
- end
136
-
137
- def validate_can_unstake!(amount, asset_id, mode, options)
138
- unstakeable_balance = unstakeable_balance(asset_id, mode: mode, options: options)
139
-
140
- raise InsufficientFundsError.new(amount, unstakeable_balance) unless unstakeable_balance >= amount
141
- end
142
-
143
- def validate_can_claim_stake!(amount, asset_id, mode, options)
144
- claimable_balance = claimable_balance(asset_id, mode: mode, options: options)
145
-
146
- raise InsufficientFundsError.new(amount, claimable_balance) unless claimable_balance >= amount
147
- end
148
-
149
- def build_staking_operation(amount, asset_id, action, mode: :default, options: {})
150
- operation_model = Coinbase.call_api do
151
- asset = Coinbase::Asset.fetch(network_id, asset_id)
152
- stake_api.build_staking_operation(
153
- {
154
- asset_id: asset.primary_denomination.to_s,
155
- address_id: id,
156
- action: action,
157
- network_id: Coinbase.normalize_network(network_id),
158
- options: {
159
- amount: asset.to_atomic_amount(amount).to_i.to_s,
160
- mode: mode
161
- }.merge(options)
162
- }
163
- )
164
- end
165
-
166
- StakingOperation.new(operation_model)
167
- end
168
-
169
- def stake_api
170
- @stake_api ||= Coinbase::Client::StakeApi.new(Coinbase.configuration.api_client)
171
- end
172
- end
9
+ class ExternalAddress < Address; end
173
10
  end
@@ -39,8 +39,11 @@ module Coinbase
39
39
  # @param asset_id [Symbol] The ID of the Asset to send. For Ether, :eth, :gwei, and :wei are supported.
40
40
  # @param destination [Wallet | Address | String] The destination of the transfer. If a Wallet, sends to the Wallet's
41
41
  # default address. If a String, interprets it as the address ID.
42
+ # @param gasless [Boolean] Whether gas fee for the transfer should be covered by Coinbase.
43
+ # Defaults to false. Check the API documentation for network and asset support.
44
+ # Whether the transfer should be gasless. Defaults to false.
42
45
  # @return [Coinbase::Transfer] The Transfer object.
43
- def transfer(amount, asset_id, destination)
46
+ def transfer(amount, asset_id, destination, gasless: false)
44
47
  ensure_can_sign!
45
48
  ensure_sufficient_balance!(amount, asset_id)
46
49
 
@@ -50,14 +53,14 @@ module Coinbase
50
53
  asset_id: asset_id,
51
54
  destination: destination,
52
55
  network_id: network_id,
53
- wallet_id: wallet_id
56
+ wallet_id: wallet_id,
57
+ gasless: gasless
54
58
  )
55
59
 
56
60
  # If a server signer is managing keys, it will sign and broadcast the underlying transfer transaction out of band.
57
61
  return transfer if Coinbase.use_server_signer?
58
62
 
59
- transfer.transaction.sign(@key)
60
-
63
+ transfer.sign(@key)
61
64
  transfer.broadcast!
62
65
  transfer
63
66
  end
@@ -92,6 +95,42 @@ module Coinbase
92
95
  trade
93
96
  end
94
97
 
98
+ # Stakes the given amount of the given Asset
99
+ # @param amount [Integer, Float, BigDecimal] The amount of the Asset to stake.
100
+ # @param asset_id [Symbol] The ID of the Asset to stake. For Ether, :eth, :gwei, and :wei are supported.
101
+ # @param mode [Symbol] The staking mode. Defaults to :default.
102
+ # @param options [Hash] Additional options for the stake operation
103
+ # @return [Coinbase::StakingOperation] The staking operation
104
+ def stake(amount, asset_id, mode: :default, options: {})
105
+ validate_can_perform_staking_action!(amount, asset_id, 'stakeable_balance', mode, options)
106
+
107
+ complete_staking_operation(amount, asset_id, 'stake', mode: mode, options: options)
108
+ end
109
+
110
+ # Unstakes the given amount of the given Asset
111
+ # @param amount [Integer, Float, BigDecimal] The amount of the Asset to unstake.
112
+ # @param asset_id [Symbol] The ID of the Asset to stake. For Ether, :eth, :gwei, and :wei are supported.
113
+ # @param mode [Symbol] The staking mode. Defaults to :default.
114
+ # @param options [Hash] Additional options for the stake operation
115
+ # @return [Coinbase::StakingOperation] The staking operation
116
+ def unstake(amount, asset_id, mode: :default, options: {})
117
+ validate_can_perform_staking_action!(amount, asset_id, 'unstakeable_balance', mode, options)
118
+
119
+ complete_staking_operation(amount, asset_id, 'unstake', mode: mode, options: options)
120
+ end
121
+
122
+ # Claims the given amount of the given Asset
123
+ # @param amount [Integer, Float, BigDecimal] The amount of the Asset to claim.
124
+ # @param asset_id [Symbol] The ID of the Asset to stake. For Ether, :eth, :gwei, and :wei are supported.
125
+ # @param mode [Symbol] The staking mode. Defaults to :default.
126
+ # @param options [Hash] Additional options for the stake operation
127
+ # @return [Coinbase::StakingOperation] The staking operation
128
+ def claim_stake(amount, asset_id, mode: :default, options: {})
129
+ validate_can_perform_staking_action!(amount, asset_id, 'claimable_balance', mode, options)
130
+
131
+ complete_staking_operation(amount, asset_id, 'claim_stake', mode: mode, options: options)
132
+ end
133
+
95
134
  # Returns whether the Address has a private key backing it to sign transactions.
96
135
  # @return [Boolean] Whether the Address has a private key backing it to sign transactions.
97
136
  def can_sign?
@@ -144,5 +183,13 @@ module Coinbase
144
183
 
145
184
  raise InsufficientFundsError.new(amount, current_balance)
146
185
  end
186
+
187
+ def complete_staking_operation(amount, asset_id, action, mode: :default, options: {})
188
+ op = StakingOperation.create(amount, network_id, asset_id, id, wallet_id, action, mode, options)
189
+ op.transactions.each do |transaction|
190
+ transaction.sign(@key)
191
+ end
192
+ op.broadcast!
193
+ end
147
194
  end
148
195
  end
@@ -62,6 +62,18 @@ module Coinbase
62
62
  Coinbase::Balance.from_model_and_asset_id(response, asset_id).amount
63
63
  end
64
64
 
65
+ # Enumerates the historical balances for a given asset belonging of address.
66
+ # The result is an enumerator that lazily fetches from the server, and can be iterated over,
67
+ # converted to an array, etc...
68
+ # @return [Enumerable<Coinbase::HistoricalBalance>] Enumerator that returns historical_balance
69
+ def historical_balances(asset_id)
70
+ Coinbase::Pagination.enumerate(
71
+ ->(page) { list_page(asset_id, page) }
72
+ ) do |historical_balance|
73
+ Coinbase::HistoricalBalance.from_model(historical_balance)
74
+ end
75
+ end
76
+
65
77
  # Requests funds for the address from the faucet and returns the faucet transaction.
66
78
  # This is only supported on testnet networks.
67
79
  # @return [Coinbase::FaucetTransaction] The successful faucet transaction
@@ -75,10 +87,162 @@ module Coinbase
75
87
  end
76
88
  end
77
89
 
90
+ # Builds a stake operation for the supplied asset. The stake operation
91
+ # may take a few minutes to complete in the case when infrastructure is spun up.
92
+ # @param amount [Integer,String,BigDecimal] The amount of the asset to stake
93
+ # @param asset_id [Symbol] The asset to stake
94
+ # @param mode [Symbol] The staking mode. Defaults to :default.
95
+ # @param options [Hash] Additional options for the stake operation
96
+ # @return [Coinbase::StakingOperation] The stake operation
97
+ def build_stake_operation(amount, asset_id, mode: :default, options: {})
98
+ validate_can_perform_staking_action!(amount, asset_id, 'stakeable_balance', mode, options)
99
+
100
+ StakingOperation.build(amount, network_id, asset_id, id, 'stake', mode, options)
101
+ end
102
+
103
+ # Builds an unstake operation for the supplied asset.
104
+ # @param amount [Integer,String,BigDecimal] The amount of the asset to unstake
105
+ # @param asset_id [Symbol] The asset to unstake
106
+ # @param mode [Symbol] The staking mode. Defaults to :default.
107
+ # @param options [Hash] Additional options for the unstake operation
108
+ # @return [Coinbase::StakingOperation] The unstake operation
109
+ def build_unstake_operation(amount, asset_id, mode: :default, options: {})
110
+ validate_can_perform_staking_action!(amount, asset_id, 'unstakeable_balance', mode, options)
111
+
112
+ StakingOperation.build(amount, network_id, asset_id, id, 'unstake', mode, options)
113
+ end
114
+
115
+ # Builds a claim_stake operation for the supplied asset.
116
+ # @param amount [Integer,String,BigDecimal] The amount of the asset to claim
117
+ # @param asset_id [Symbol] The asset to claim
118
+ # @param mode [Symbol] The staking mode. Defaults to :default.
119
+ # @param options [Hash] Additional options for the claim_stake operation
120
+ # @return [Coinbase::StakingOperation] The claim_stake operation
121
+ def build_claim_stake_operation(amount, asset_id, mode: :default, options: {})
122
+ validate_can_perform_staking_action!(amount, asset_id, 'claimable_balance', mode, options)
123
+
124
+ StakingOperation.build(amount, network_id, asset_id, id, 'claim_stake', mode, options)
125
+ end
126
+
127
+ # Retrieves the balances used for staking for the supplied asset.
128
+ # @param asset_id [Symbol] The asset to retrieve staking balances for
129
+ # @param mode [Symbol] The staking mode. Defaults to :default.
130
+ # @param options [Hash] Additional options for the staking operation
131
+ # @return [Hash] The staking balances
132
+ # @return [BigDecimal] :stakeable_balance The amount of the asset that can be staked
133
+ # @return [BigDecimal] :unstakeable_balance The amount of the asset that is currently staked and cannot be unstaked
134
+ # @return [BigDecimal] :claimable_balance The amount of the asset that can be claimed
135
+ def staking_balances(asset_id, mode: :default, options: {})
136
+ context_model = Coinbase.call_api do
137
+ stake_api.get_staking_context(
138
+ {
139
+ asset_id: asset_id,
140
+ network_id: Coinbase.normalize_network(network_id),
141
+ address_id: id,
142
+ options: {
143
+ mode: mode
144
+ }.merge(options)
145
+ }
146
+ )
147
+ end.context
148
+
149
+ {
150
+ stakeable_balance: Coinbase::Balance.from_model_and_asset_id(
151
+ context_model.stakeable_balance,
152
+ asset_id
153
+ ).amount,
154
+ unstakeable_balance: Coinbase::Balance.from_model_and_asset_id(
155
+ context_model.unstakeable_balance,
156
+ asset_id
157
+ ).amount,
158
+ claimable_balance: Coinbase::Balance.from_model_and_asset_id(
159
+ context_model.claimable_balance,
160
+ asset_id
161
+ ).amount
162
+ }
163
+ end
164
+
165
+ # Retrieves the stakeable balance for the supplied asset.
166
+ # @param asset_id [Symbol] The asset to retrieve the stakeable balance for
167
+ # @param mode [Symbol] The staking mode. Defaults to :default.
168
+ # @param options [Hash] Additional options for the staking operation
169
+ # @return [BigDecimal] The stakeable balance
170
+ def stakeable_balance(asset_id, mode: :default, options: {})
171
+ staking_balances(asset_id, mode: mode, options: options)[:stakeable_balance]
172
+ end
173
+
174
+ # Retrieves the unstakeable balance for the supplied asset.
175
+ # @param asset_id [Symbol] The asset to retrieve the unstakeable balance for
176
+ # @param mode [Symbol] The staking mode. Defaults to :default.
177
+ # @param options [Hash] Additional options for the staking operation
178
+ # @return [BigDecimal] The unstakeable balance
179
+ def unstakeable_balance(asset_id, mode: :default, options: {})
180
+ staking_balances(asset_id, mode: mode, options: options)[:unstakeable_balance]
181
+ end
182
+
183
+ # Retrieves the claimable balance for the supplied asset.
184
+ # @param asset_id [Symbol] The asset to retrieve the claimable balance for
185
+ # @param mode [Symbol] The staking mode. Defaults to :default.
186
+ # @param options [Hash] Additional options for the staking operation
187
+ # @return [BigDecimal] The claimable balance
188
+ def claimable_balance(asset_id, mode: :default, options: {})
189
+ staking_balances(asset_id, mode: mode, options: options)[:claimable_balance]
190
+ end
191
+
192
+ # Lists the staking rewards for the address.
193
+ # @param asset_id [Symbol] The asset to retrieve staking rewards for
194
+ # @param start_time [Time] The start time for the rewards. Defaults to 1 week ago.
195
+ # @param end_time [Time] The end time for the rewards. Defaults to the current time.
196
+ # @param format [Symbol] The format to return the rewards in. Defaults to :usd.
197
+ # @return [Enumerable<Coinbase::StakingReward>] The staking rewards
198
+ def staking_rewards(asset_id, start_time: DateTime.now.prev_week(1), end_time: DateTime.now, format: :usd)
199
+ StakingReward.list(
200
+ network_id,
201
+ asset_id,
202
+ [id],
203
+ start_time: start_time,
204
+ end_time: end_time,
205
+ format: format
206
+ )
207
+ end
208
+
209
+ # Fetches the historical staking balances for the address.
210
+ # @param asset_id [Symbol] The asset to retrieve staking rewards for
211
+ # @param start_time [Time] The start time for the rewards. Defaults to 1 week ago.
212
+ # @param end_time [Time] The end time for the rewards. Defaults to the current time.
213
+ # @return [Enumerable<Coinbase::StakingBalance>] The staking rewards
214
+ def historical_staking_balances(asset_id, start_time: DateTime.now.prev_week(1), end_time: DateTime.now)
215
+ StakingBalance.list(
216
+ network_id,
217
+ asset_id,
218
+ id,
219
+ start_time: start_time,
220
+ end_time: end_time
221
+ )
222
+ end
223
+
78
224
  private
79
225
 
226
+ def validate_can_perform_staking_action!(amount, asset_id, balance_type, mode, options)
227
+ current_staking_balance = staking_balances(asset_id, mode: mode, options: options)[balance_type.to_sym]
228
+ raise InsufficientFundsError.new(amount, current_staking_balance) unless current_staking_balance >= amount
229
+ end
230
+
80
231
  def addresses_api
81
232
  @addresses_api ||= Coinbase::Client::ExternalAddressesApi.new(Coinbase.configuration.api_client)
82
233
  end
234
+
235
+ def stake_api
236
+ @stake_api ||= Coinbase::Client::StakeApi.new(Coinbase.configuration.api_client)
237
+ end
238
+
239
+ def list_page(asset_id, page)
240
+ addresses_api.list_address_historical_balance(
241
+ Coinbase.normalize_network(network_id),
242
+ id,
243
+ Coinbase::Asset.primary_denomination(asset_id).to_s,
244
+ { limit: DEFAULT_PAGE_LIMIT, page: page }
245
+ )
246
+ end
83
247
  end
84
248
  end
@@ -22,7 +22,7 @@ module Coinbase::Client
22
22
  # Get the asset for the specified asset ID.
23
23
  # Get the asset for the specified asset ID.
24
24
  # @param network_id [String] The ID of the blockchain network
25
- # @param asset_id [String] The ID of the asset to fetch
25
+ # @param asset_id [String] The ID of the asset to fetch. This could be a symbol or an ERC20 contract address.
26
26
  # @param [Hash] opts the optional parameters
27
27
  # @return [Asset]
28
28
  def get_asset(network_id, asset_id, opts = {})
@@ -33,7 +33,7 @@ module Coinbase::Client
33
33
  # Get the asset for the specified asset ID.
34
34
  # Get the asset for the specified asset ID.
35
35
  # @param network_id [String] The ID of the blockchain network
36
- # @param asset_id [String] The ID of the asset to fetch
36
+ # @param asset_id [String] The ID of the asset to fetch. This could be a symbol or an ERC20 contract address.
37
37
  # @param [Hash] opts the optional parameters
38
38
  # @return [Array<(Asset, Integer, Hash)>] Asset data, response status code and response headers
39
39
  def get_asset_with_http_info(network_id, asset_id, opts = {})
@@ -0,0 +1,121 @@
1
+ =begin
2
+ #Coinbase Platform API
3
+
4
+ #This is the OpenAPI 3.0 specification for the Coinbase Platform APIs, used in conjunction with the Coinbase Platform SDKs.
5
+
6
+ The version of the OpenAPI document: 0.0.1-alpha
7
+ Contact: yuga.cohler@coinbase.com
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.6.0
10
+
11
+ =end
12
+
13
+ require 'cgi'
14
+
15
+ module Coinbase::Client
16
+ class ContractEventsApi
17
+ attr_accessor :api_client
18
+
19
+ def initialize(api_client = ApiClient.default)
20
+ @api_client = api_client
21
+ end
22
+ # Get contract events
23
+ # Retrieve events for a specific contract
24
+ # @param network_id [String] Unique identifier for the blockchain network
25
+ # @param protocol_name [String] Case-sensitive name of the blockchain protocol
26
+ # @param contract_address [String] EVM address of the smart contract (42 characters, including &#39;0x&#39;, in lowercase)
27
+ # @param from_block_height [Integer] Lower bound of the block range to query (inclusive)
28
+ # @param to_block_height [Integer] Upper bound of the block range to query (inclusive)
29
+ # @param [Hash] opts the optional parameters
30
+ # @option opts [String] :contract_name Case-sensitive name of the specific contract within the project
31
+ # @option opts [String] :event_name Case-sensitive name of the event to filter for in the contract&#39;s logs
32
+ # @option opts [String] :next_page Pagination token for retrieving the next set of results
33
+ # @return [ContractEventList]
34
+ def list_contract_events(network_id, protocol_name, contract_address, from_block_height, to_block_height, opts = {})
35
+ data, _status_code, _headers = list_contract_events_with_http_info(network_id, protocol_name, contract_address, from_block_height, to_block_height, opts)
36
+ data
37
+ end
38
+
39
+ # Get contract events
40
+ # Retrieve events for a specific contract
41
+ # @param network_id [String] Unique identifier for the blockchain network
42
+ # @param protocol_name [String] Case-sensitive name of the blockchain protocol
43
+ # @param contract_address [String] EVM address of the smart contract (42 characters, including &#39;0x&#39;, in lowercase)
44
+ # @param from_block_height [Integer] Lower bound of the block range to query (inclusive)
45
+ # @param to_block_height [Integer] Upper bound of the block range to query (inclusive)
46
+ # @param [Hash] opts the optional parameters
47
+ # @option opts [String] :contract_name Case-sensitive name of the specific contract within the project
48
+ # @option opts [String] :event_name Case-sensitive name of the event to filter for in the contract&#39;s logs
49
+ # @option opts [String] :next_page Pagination token for retrieving the next set of results
50
+ # @return [Array<(ContractEventList, Integer, Hash)>] ContractEventList data, response status code and response headers
51
+ def list_contract_events_with_http_info(network_id, protocol_name, contract_address, from_block_height, to_block_height, opts = {})
52
+ if @api_client.config.debugging
53
+ @api_client.config.logger.debug 'Calling API: ContractEventsApi.list_contract_events ...'
54
+ end
55
+ # verify the required parameter 'network_id' is set
56
+ if @api_client.config.client_side_validation && network_id.nil?
57
+ fail ArgumentError, "Missing the required parameter 'network_id' when calling ContractEventsApi.list_contract_events"
58
+ end
59
+ # verify the required parameter 'protocol_name' is set
60
+ if @api_client.config.client_side_validation && protocol_name.nil?
61
+ fail ArgumentError, "Missing the required parameter 'protocol_name' when calling ContractEventsApi.list_contract_events"
62
+ end
63
+ # verify the required parameter 'contract_address' is set
64
+ if @api_client.config.client_side_validation && contract_address.nil?
65
+ fail ArgumentError, "Missing the required parameter 'contract_address' when calling ContractEventsApi.list_contract_events"
66
+ end
67
+ # verify the required parameter 'from_block_height' is set
68
+ if @api_client.config.client_side_validation && from_block_height.nil?
69
+ fail ArgumentError, "Missing the required parameter 'from_block_height' when calling ContractEventsApi.list_contract_events"
70
+ end
71
+ # verify the required parameter 'to_block_height' is set
72
+ if @api_client.config.client_side_validation && to_block_height.nil?
73
+ fail ArgumentError, "Missing the required parameter 'to_block_height' when calling ContractEventsApi.list_contract_events"
74
+ end
75
+ # resource path
76
+ local_var_path = '/v1/networks/{network_id}/smart_contracts/{contract_address}/events'.sub('{' + 'network_id' + '}', CGI.escape(network_id.to_s)).sub('{' + 'contract_address' + '}', CGI.escape(contract_address.to_s))
77
+
78
+ # query parameters
79
+ query_params = opts[:query_params] || {}
80
+ query_params[:'protocol_name'] = protocol_name
81
+ query_params[:'from_block_height'] = from_block_height
82
+ query_params[:'to_block_height'] = to_block_height
83
+ query_params[:'contract_name'] = opts[:'contract_name'] if !opts[:'contract_name'].nil?
84
+ query_params[:'event_name'] = opts[:'event_name'] if !opts[:'event_name'].nil?
85
+ query_params[:'next_page'] = opts[:'next_page'] if !opts[:'next_page'].nil?
86
+
87
+ # header parameters
88
+ header_params = opts[:header_params] || {}
89
+ # HTTP header 'Accept' (if needed)
90
+ header_params['Accept'] = @api_client.select_header_accept(['application/json'])
91
+
92
+ # form parameters
93
+ form_params = opts[:form_params] || {}
94
+
95
+ # http body (model)
96
+ post_body = opts[:debug_body]
97
+
98
+ # return_type
99
+ return_type = opts[:debug_return_type] || 'ContractEventList'
100
+
101
+ # auth_names
102
+ auth_names = opts[:debug_auth_names] || []
103
+
104
+ new_options = opts.merge(
105
+ :operation => :"ContractEventsApi.list_contract_events",
106
+ :header_params => header_params,
107
+ :query_params => query_params,
108
+ :form_params => form_params,
109
+ :body => post_body,
110
+ :auth_names => auth_names,
111
+ :return_type => return_type
112
+ )
113
+
114
+ data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
115
+ if @api_client.config.debugging
116
+ @api_client.config.logger.debug "API called: ContractEventsApi#list_contract_events\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
117
+ end
118
+ return data, status_code, headers
119
+ end
120
+ end
121
+ end