coinbase-sdk 0.0.7 → 0.0.9
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.
- checksums.yaml +4 -4
- data/lib/coinbase/address/external_address.rb +173 -0
- data/lib/coinbase/address/wallet_address.rb +219 -0
- data/lib/coinbase/address.rb +32 -219
- data/lib/coinbase/asset.rb +76 -66
- data/lib/coinbase/authenticator.rb +2 -0
- data/lib/coinbase/balance.rb +10 -6
- data/lib/coinbase/client/api/addresses_api.rb +1 -1
- data/lib/coinbase/client/api/assets_api.rb +91 -0
- data/lib/coinbase/client/api/external_addresses_api.rb +242 -0
- data/lib/coinbase/client/api/server_signers_api.rb +1 -1
- data/lib/coinbase/client/api/stake_api.rb +157 -7
- data/lib/coinbase/client/api/trades_api.rb +1 -1
- data/lib/coinbase/client/api/transfers_api.rb +1 -1
- data/lib/coinbase/client/api/users_api.rb +1 -1
- data/lib/coinbase/client/api/wallets_api.rb +1 -1
- data/lib/coinbase/client/api_client.rb +3 -3
- data/lib/coinbase/client/api_error.rb +1 -1
- data/lib/coinbase/client/configuration.rb +1 -1
- data/lib/coinbase/client/models/address.rb +1 -1
- data/lib/coinbase/client/models/address_balance_list.rb +1 -1
- data/lib/coinbase/client/models/address_list.rb +1 -1
- data/lib/coinbase/client/models/asset.rb +1 -1
- data/lib/coinbase/client/models/balance.rb +1 -1
- data/lib/coinbase/client/models/broadcast_trade_request.rb +1 -1
- data/lib/coinbase/client/models/broadcast_transfer_request.rb +1 -1
- data/lib/coinbase/client/models/build_staking_operation_request.rb +1 -1
- data/lib/coinbase/client/models/create_address_request.rb +1 -1
- data/lib/coinbase/client/models/create_server_signer_request.rb +22 -5
- data/lib/coinbase/client/models/create_trade_request.rb +1 -1
- data/lib/coinbase/client/models/create_transfer_request.rb +1 -1
- data/lib/coinbase/client/models/create_wallet_request.rb +1 -1
- data/lib/coinbase/client/models/create_wallet_request_wallet.rb +1 -1
- data/lib/coinbase/client/models/error.rb +1 -1
- data/lib/coinbase/client/models/faucet_transaction.rb +23 -5
- data/lib/coinbase/client/models/feature.rb +1 -1
- data/lib/coinbase/client/models/fetch_staking_rewards200_response.rb +258 -0
- data/lib/coinbase/client/models/fetch_staking_rewards_request.rb +330 -0
- data/lib/coinbase/client/models/get_staking_context_request.rb +274 -0
- data/lib/coinbase/client/models/partial_eth_staking_context.rb +254 -0
- data/lib/coinbase/client/models/seed_creation_event.rb +1 -1
- data/lib/coinbase/client/models/seed_creation_event_result.rb +1 -1
- data/lib/coinbase/client/models/server_signer.rb +22 -5
- data/lib/coinbase/client/models/server_signer_event.rb +1 -1
- data/lib/coinbase/client/models/server_signer_event_event.rb +1 -1
- data/lib/coinbase/client/models/server_signer_event_list.rb +1 -1
- data/lib/coinbase/client/models/server_signer_list.rb +1 -1
- data/lib/coinbase/client/models/signature_creation_event.rb +1 -1
- data/lib/coinbase/client/models/signature_creation_event_result.rb +1 -1
- data/lib/coinbase/client/models/{request_faucet_funds200_response.rb → staking_context.rb} +16 -16
- data/lib/coinbase/client/models/staking_context_context.rb +104 -0
- data/lib/coinbase/client/models/staking_operation.rb +15 -12
- data/lib/coinbase/client/models/staking_reward.rb +324 -0
- data/lib/coinbase/client/models/staking_reward_format.rb +40 -0
- data/lib/coinbase/client/models/trade.rb +1 -1
- data/lib/coinbase/client/models/trade_list.rb +1 -1
- data/lib/coinbase/client/models/transaction.rb +1 -1
- data/lib/coinbase/client/models/transaction_type.rb +1 -1
- data/lib/coinbase/client/models/transfer.rb +1 -1
- data/lib/coinbase/client/models/transfer_list.rb +1 -1
- data/lib/coinbase/client/models/user.rb +1 -1
- data/lib/coinbase/client/models/wallet.rb +1 -1
- data/lib/coinbase/client/models/wallet_list.rb +1 -1
- data/lib/coinbase/client/version.rb +1 -1
- data/lib/coinbase/client.rb +11 -1
- data/lib/coinbase/constants.rb +2 -27
- data/lib/coinbase/errors.rb +56 -64
- data/lib/coinbase/faucet_transaction.rb +5 -4
- data/lib/coinbase/network.rb +6 -20
- data/lib/coinbase/pagination.rb +26 -0
- data/lib/coinbase/staking_operation.rb +29 -0
- data/lib/coinbase/staking_reward.rb +79 -0
- data/lib/coinbase/transaction.rb +6 -0
- data/lib/coinbase/user.rb +5 -51
- data/lib/coinbase/wallet.rb +97 -102
- data/lib/coinbase.rb +19 -11
- metadata +17 -17
data/lib/coinbase/errors.rb
CHANGED
@@ -6,97 +6,63 @@ require 'json'
|
|
6
6
|
module Coinbase
|
7
7
|
# A wrapper for API errors to provide more context.
|
8
8
|
class APIError < StandardError
|
9
|
-
attr_reader :http_code, :api_code, :api_message
|
9
|
+
attr_reader :http_code, :api_code, :api_message, :handled
|
10
10
|
|
11
11
|
# Initializes a new APIError object.
|
12
12
|
# @param err [Coinbase::Client::APIError] The underlying error object.
|
13
|
-
def initialize(err)
|
14
|
-
super
|
13
|
+
def initialize(err, code: nil, message: nil, unhandled: false)
|
15
14
|
@http_code = err.code
|
15
|
+
@api_code = code
|
16
|
+
@api_message = message
|
17
|
+
@handled = code && message && !unhandled
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
body = JSON.parse(err.response_body)
|
20
|
-
@api_code = body['code']
|
21
|
-
@api_message = body['message']
|
19
|
+
super(err)
|
22
20
|
end
|
23
21
|
|
24
22
|
# Creates a specific APIError based on the API error code.
|
25
23
|
# @param err [Coinbase::Client::APIError] The underlying error object.
|
26
24
|
# @return [APIError] The specific APIError object.
|
27
|
-
# rubocop:disable Metrics/MethodLength
|
28
25
|
def self.from_error(err)
|
29
26
|
raise ArgumentError, 'Argument must be a Coinbase::Client::APIError' unless err.is_a? Coinbase::Client::ApiError
|
30
27
|
return APIError.new(err) unless err.response_body
|
31
28
|
|
32
|
-
|
29
|
+
begin
|
30
|
+
body = JSON.parse(err.response_body)
|
31
|
+
rescue JSON::ParserError
|
32
|
+
return APIError.new(err)
|
33
|
+
end
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
when 'internal'
|
40
|
-
InternalError.new(err)
|
41
|
-
when 'not_found'
|
42
|
-
NotFoundError.new(err)
|
43
|
-
when 'invalid_wallet_id'
|
44
|
-
InvalidWalletIDError.new(err)
|
45
|
-
when 'invalid_address_id'
|
46
|
-
InvalidAddressIDError.new(err)
|
47
|
-
when 'invalid_wallet'
|
48
|
-
InvalidWalletError.new(err)
|
49
|
-
when 'invalid_address'
|
50
|
-
InvalidAddressError.new(err)
|
51
|
-
when 'invalid_amount'
|
52
|
-
InvalidAmountError.new(err)
|
53
|
-
when 'invalid_transfer_id'
|
54
|
-
InvalidTransferIDError.new(err)
|
55
|
-
when 'invalid_page_token'
|
56
|
-
InvalidPageError.new(err)
|
57
|
-
when 'invalid_page_limit'
|
58
|
-
InvalidLimitError.new(err)
|
59
|
-
when 'already_exists'
|
60
|
-
AlreadyExistsError.new(err)
|
61
|
-
when 'malformed_request'
|
62
|
-
MalformedRequestError.new(err)
|
63
|
-
when 'unsupported_asset'
|
64
|
-
UnsupportedAssetError.new(err)
|
65
|
-
when 'invalid_asset_id'
|
66
|
-
InvalidAssetIDError.new(err)
|
67
|
-
when 'invalid_destination'
|
68
|
-
InvalidDestinationError.new(err)
|
69
|
-
when 'invalid_network_id'
|
70
|
-
InvalidNetworkIDError.new(err)
|
71
|
-
when 'resource_exhausted'
|
72
|
-
ResourceExhaustedError.new(err)
|
73
|
-
when 'faucet_limit_reached'
|
74
|
-
FaucetLimitReachedError.new(err)
|
75
|
-
when 'invalid_signed_payload'
|
76
|
-
InvalidSignedPayloadError.new(err)
|
77
|
-
when 'invalid_transfer_status'
|
78
|
-
InvalidTransferStatusError.new(err)
|
79
|
-
when 'network_feature_unsupported'
|
80
|
-
NetworkFeatureUnsupportedError.new(err)
|
35
|
+
message = body['message']
|
36
|
+
code = body['code']
|
37
|
+
|
38
|
+
if ERROR_CODE_TO_ERROR_CLASS.key?(code)
|
39
|
+
ERROR_CODE_TO_ERROR_CLASS[code].new(err, code: code, message: message)
|
81
40
|
else
|
82
|
-
APIError.new(err)
|
41
|
+
APIError.new(err, code: code, message: message, unhandled: true)
|
83
42
|
end
|
84
43
|
end
|
85
|
-
# rubocop:enable Metrics/MethodLength
|
86
44
|
|
87
|
-
#
|
88
|
-
# @return [String] a String representation of the APIError
|
45
|
+
# Override to_s to display a friendly error message
|
89
46
|
def to_s
|
90
|
-
|
47
|
+
# For handled errors, display just the API message as that provides sufficient context.
|
48
|
+
return api_message if handled
|
49
|
+
|
50
|
+
# For unhandled errors, display the full error message
|
51
|
+
super
|
91
52
|
end
|
92
53
|
|
93
|
-
# Same as to_s.
|
94
|
-
# @return [String] a String representation of the APIError
|
95
54
|
def inspect
|
96
55
|
to_s
|
97
56
|
end
|
98
57
|
end
|
99
58
|
|
59
|
+
# An error raised when an operation is attempted with insufficient funds.
|
60
|
+
class InsufficientFundsError < StandardError
|
61
|
+
def initialize(expected, exact, msg = 'Insufficient funds')
|
62
|
+
super("#{msg}: have #{exact}, need #{expected}.")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
100
66
|
class UnimplementedError < APIError; end
|
101
67
|
class UnauthorizedError < APIError; end
|
102
68
|
class InternalError < APIError; end
|
@@ -120,4 +86,30 @@ module Coinbase
|
|
120
86
|
class InvalidSignedPayloadError < APIError; end
|
121
87
|
class InvalidTransferStatusError < APIError; end
|
122
88
|
class NetworkFeatureUnsupportedError < APIError; end
|
89
|
+
|
90
|
+
ERROR_CODE_TO_ERROR_CLASS = {
|
91
|
+
'unimplemented' => UnimplementedError,
|
92
|
+
'unauthorized' => UnauthorizedError,
|
93
|
+
'internal' => InternalError,
|
94
|
+
'not_found' => NotFoundError,
|
95
|
+
'invalid_wallet_id' => InvalidWalletIDError,
|
96
|
+
'invalid_address_id' => InvalidAddressIDError,
|
97
|
+
'invalid_wallet' => InvalidWalletError,
|
98
|
+
'invalid_address' => InvalidAddressError,
|
99
|
+
'invalid_amount' => InvalidAmountError,
|
100
|
+
'invalid_transfer_id' => InvalidTransferIDError,
|
101
|
+
'invalid_page_token' => InvalidPageError,
|
102
|
+
'invalid_page_limit' => InvalidLimitError,
|
103
|
+
'already_exists' => AlreadyExistsError,
|
104
|
+
'malformed_request' => MalformedRequestError,
|
105
|
+
'unsupported_asset' => UnsupportedAssetError,
|
106
|
+
'invalid_asset_id' => InvalidAssetIDError,
|
107
|
+
'invalid_destination' => InvalidDestinationError,
|
108
|
+
'invalid_network_id' => InvalidNetworkIDError,
|
109
|
+
'resource_exhausted' => ResourceExhaustedError,
|
110
|
+
'faucet_limit_reached' => FaucetLimitReachedError,
|
111
|
+
'invalid_signed_payload' => InvalidSignedPayloadError,
|
112
|
+
'invalid_transfer_status' => InvalidTransferStatusError,
|
113
|
+
'network_feature_unsupported' => NetworkFeatureUnsupportedError
|
114
|
+
}.freeze
|
123
115
|
end
|
@@ -12,8 +12,6 @@ module Coinbase
|
|
12
12
|
@model = model
|
13
13
|
end
|
14
14
|
|
15
|
-
attr_reader :model
|
16
|
-
|
17
15
|
# Returns the transaction hash.
|
18
16
|
# @return [String] The onchain transaction hash
|
19
17
|
def transaction_hash
|
@@ -23,8 +21,7 @@ module Coinbase
|
|
23
21
|
# Returns the link to the transaction on the blockchain explorer.
|
24
22
|
# @return [String] The link to the transaction on the blockchain explorer
|
25
23
|
def transaction_link
|
26
|
-
|
27
|
-
"https://sepolia.basescan.org/tx/#{transaction_hash}"
|
24
|
+
model.transaction_link
|
28
25
|
end
|
29
26
|
|
30
27
|
# Returns a String representation of the FaucetTransaction.
|
@@ -38,5 +35,9 @@ module Coinbase
|
|
38
35
|
def inspect
|
39
36
|
to_s
|
40
37
|
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
attr_reader :model
|
41
42
|
end
|
42
43
|
end
|
data/lib/coinbase/network.rb
CHANGED
@@ -12,31 +12,15 @@ module Coinbase
|
|
12
12
|
# @param protocol_family [String] The protocol family to which the Network belongs
|
13
13
|
# (e.g., "evm")
|
14
14
|
# @param is_testnet [Boolean] Whether the Network is a testnet
|
15
|
-
# @param assets [Array<Asset>] The Assets supported by the Network
|
16
15
|
# @param native_asset_id [String] The ID of the Network's native Asset
|
17
16
|
# @param chain_id [Integer] The Chain ID of the Network
|
18
|
-
def initialize(network_id:, display_name:, protocol_family:, is_testnet:,
|
17
|
+
def initialize(network_id:, display_name:, protocol_family:, is_testnet:, native_asset_id:, chain_id:)
|
19
18
|
@network_id = network_id
|
20
19
|
@display_name = display_name
|
21
20
|
@protocol_family = protocol_family
|
22
21
|
@is_testnet = is_testnet
|
22
|
+
@native_asset_id = native_asset_id
|
23
23
|
@chain_id = chain_id
|
24
|
-
|
25
|
-
@asset_map = {}
|
26
|
-
assets.each do |asset|
|
27
|
-
@asset_map[asset.asset_id] = asset
|
28
|
-
end
|
29
|
-
|
30
|
-
raise ArgumentError, 'Native Asset not found' unless @asset_map.key?(native_asset_id)
|
31
|
-
|
32
|
-
@native_asset = @asset_map[native_asset_id]
|
33
|
-
end
|
34
|
-
|
35
|
-
# Lists the Assets supported by the Network.
|
36
|
-
#
|
37
|
-
# @return [Array<Asset>] The Assets supported by the Network
|
38
|
-
def list_assets
|
39
|
-
@asset_map.values
|
40
24
|
end
|
41
25
|
|
42
26
|
# Gets the Asset with the given ID.
|
@@ -44,12 +28,14 @@ module Coinbase
|
|
44
28
|
# @param asset_id [Symbol] The ID of the Asset
|
45
29
|
# @return [Asset] The Asset with the given ID
|
46
30
|
def get_asset(asset_id)
|
47
|
-
@
|
31
|
+
Asset.fetch(@network_id, asset_id)
|
48
32
|
end
|
49
33
|
|
50
34
|
# Gets the native Asset of the Network.
|
51
35
|
#
|
52
36
|
# @return [Asset] The native Asset of the Network
|
53
|
-
|
37
|
+
def native_asset
|
38
|
+
@native_asset ||= get_asset(@native_asset_id)
|
39
|
+
end
|
54
40
|
end
|
55
41
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Coinbase
|
4
|
+
# A module of helper methods for paginating through resources.
|
5
|
+
module Pagination
|
6
|
+
def self.enumerate(fetcher, &build_resource)
|
7
|
+
Enumerator.new do |yielder|
|
8
|
+
page = nil
|
9
|
+
|
10
|
+
loop do
|
11
|
+
response = Coinbase.call_api { fetcher.call(page) }
|
12
|
+
|
13
|
+
break if response.data.empty?
|
14
|
+
|
15
|
+
response.data.each do |model|
|
16
|
+
yielder << build_resource.call(model)
|
17
|
+
end
|
18
|
+
|
19
|
+
break unless response.has_more
|
20
|
+
|
21
|
+
page = response.next_page
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Coinbase
|
4
|
+
# A representation of a staking operation (stake, unstake, claim rewards, etc). It
|
5
|
+
# may have multiple steps with some being transactions to sign, and others to wait.
|
6
|
+
# @attr_reader [Array<Coinbase::Transaction>] transactions The list of current
|
7
|
+
# transactions associated with the operation
|
8
|
+
class StakingOperation
|
9
|
+
attr_reader :transactions
|
10
|
+
|
11
|
+
# Returns a new StakingOperation object.
|
12
|
+
# @param model [Coinbase::Client::StakingOperation] The underlying StakingOperation object
|
13
|
+
def initialize(model)
|
14
|
+
@model = model
|
15
|
+
|
16
|
+
@transactions = model.transactions.map do |transaction_model|
|
17
|
+
Transaction.new(transaction_model)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Signs the Open Transactions with the provided key
|
22
|
+
# @param key [Eth::Key] The key to sign the transactions with
|
23
|
+
def sign(key)
|
24
|
+
transactions.each do |transaction|
|
25
|
+
transaction.sign(key) unless transaction.signed?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
module Coinbase
|
6
|
+
# A representation of a staking reward earned on a network for a given asset.
|
7
|
+
class StakingReward
|
8
|
+
# Returns a list of StakingRewards for the provided network, asset, and addresses.
|
9
|
+
# @param network_id [Symbol] The network ID
|
10
|
+
# @param asset_id [Symbol] The asset ID
|
11
|
+
# @param address_ids [Array<String>] The address IDs
|
12
|
+
# @param start_time [Time] The start time. Defaults to one month ago.
|
13
|
+
# @param end_time [Time] The end time. Defaults to the current time.
|
14
|
+
# @param format [Symbol] The format to return the rewards in. (:usd, :native) Defaults to :usd.
|
15
|
+
# @return [Enumerable<Coinbase::StakingReward>] The staking rewards
|
16
|
+
def self.list(network_id, asset_id, address_ids, start_time: DateTime.now.prev_month(1), end_time: DateTime.now,
|
17
|
+
format: :usd)
|
18
|
+
asset = Coinbase.call_api do
|
19
|
+
Asset.fetch(network_id, asset_id)
|
20
|
+
end
|
21
|
+
Coinbase::Pagination.enumerate(
|
22
|
+
->(page) { list_page(network_id, asset_id, address_ids, start_time, end_time, page, format) }
|
23
|
+
) do |staking_reward|
|
24
|
+
new(staking_reward, asset, format)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns a new StakingReward object.
|
29
|
+
# @param model [Coinbase::Client::StakingReward] The underlying StakingReward object
|
30
|
+
def initialize(model, asset, format)
|
31
|
+
@model = model
|
32
|
+
@asset = asset
|
33
|
+
@format = format
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns the amount of the StakingReward.
|
37
|
+
# @return [BigDecimal] The amount
|
38
|
+
def amount
|
39
|
+
return BigDecimal(@model.amount.to_i) / BigDecimal(100) if @format == :usd
|
40
|
+
|
41
|
+
@asset.from_atomic_amount(@model.amount.to_i)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns the date of the StakingReward.
|
45
|
+
# @return [Time] The date
|
46
|
+
def date
|
47
|
+
@model.date
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns a string representation of the StakingReward.
|
51
|
+
# @return [String] a string representation of the StakingReward
|
52
|
+
def to_s
|
53
|
+
"Coinbase::StakingReward{amount: '#{amount}'}"
|
54
|
+
end
|
55
|
+
|
56
|
+
# Same as to_s.
|
57
|
+
# @return [String] a string representation of the StakingReward
|
58
|
+
def inspect
|
59
|
+
to_s
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.stake_api
|
63
|
+
Coinbase::Client::StakeApi.new(Coinbase.configuration.api_client)
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.list_page(network_id, asset_id, address_ids, start_time, end_time, page, format)
|
67
|
+
req = {
|
68
|
+
network_id: Coinbase.normalize_network(network_id),
|
69
|
+
asset_id: asset_id,
|
70
|
+
address_ids: address_ids,
|
71
|
+
start_time: start_time.iso8601,
|
72
|
+
end_time: end_time.iso8601,
|
73
|
+
format: format,
|
74
|
+
next_page: page
|
75
|
+
}
|
76
|
+
stake_api.fetch_staking_rewards(req)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/lib/coinbase/transaction.rb
CHANGED
@@ -110,6 +110,12 @@ module Coinbase
|
|
110
110
|
raw.hex
|
111
111
|
end
|
112
112
|
|
113
|
+
# Returns whether the Transaction has been signed.
|
114
|
+
# @return [Boolean] Whether the Transaction has been signed
|
115
|
+
def signed?
|
116
|
+
Eth::Tx.signed?(raw)
|
117
|
+
end
|
118
|
+
|
113
119
|
# Returns a String representation of the Transaction.
|
114
120
|
# @return [String] a String representation of the Transaction
|
115
121
|
def to_s
|
data/lib/coinbase/user.rb
CHANGED
@@ -37,53 +37,17 @@ module Coinbase
|
|
37
37
|
Wallet.import(data)
|
38
38
|
end
|
39
39
|
|
40
|
-
#
|
41
|
-
# @
|
42
|
-
|
43
|
-
|
44
|
-
# any.
|
45
|
-
def wallets(page_size: 10, next_page_token: nil)
|
46
|
-
opts = {
|
47
|
-
limit: page_size
|
48
|
-
}
|
49
|
-
|
50
|
-
opts[:page] = next_page_token unless next_page_token.nil?
|
51
|
-
|
52
|
-
wallet_list = Coinbase.call_api do
|
53
|
-
wallets_api.list_wallets(opts)
|
54
|
-
end
|
55
|
-
|
56
|
-
# A map from wallet_id to address models.
|
57
|
-
address_model_map = {}
|
58
|
-
|
59
|
-
wallet_list.data.each do |wallet_model|
|
60
|
-
addresses_list = Coinbase.call_api do
|
61
|
-
addresses_api.list_addresses(wallet_model.id, { limit: Coinbase::Wallet::MAX_ADDRESSES })
|
62
|
-
end
|
63
|
-
|
64
|
-
address_model_map[wallet_model.id] = addresses_list.data
|
65
|
-
end
|
66
|
-
|
67
|
-
wallets = wallet_list.data.map do |wallet_model|
|
68
|
-
Wallet.new(wallet_model, seed: '', address_models: address_model_map[wallet_model.id])
|
69
|
-
end
|
70
|
-
|
71
|
-
[wallets, wallet_list.next_page]
|
40
|
+
# Enumerates the Wallets belonging to the User.
|
41
|
+
# @return [Enumerator<Coinbase::Wallet>] the Wallets belonging to the User
|
42
|
+
def wallets
|
43
|
+
Wallet.list
|
72
44
|
end
|
73
45
|
|
74
46
|
# Returns the Wallet with the given ID.
|
75
47
|
# @param wallet_id [String] the ID of the Wallet
|
76
48
|
# @return [Coinbase::Wallet] the unhydrated Wallet
|
77
49
|
def wallet(wallet_id)
|
78
|
-
|
79
|
-
wallets_api.get_wallet(wallet_id)
|
80
|
-
end
|
81
|
-
|
82
|
-
addresses_list = Coinbase.call_api do
|
83
|
-
addresses_api.list_addresses(wallet_model.id, { limit: Coinbase::Wallet::MAX_ADDRESSES })
|
84
|
-
end
|
85
|
-
|
86
|
-
Wallet.new(wallet_model, seed: '', address_models: addresses_list.data)
|
50
|
+
Wallet.fetch(wallet_id)
|
87
51
|
end
|
88
52
|
|
89
53
|
# Returns a string representation of the User.
|
@@ -97,15 +61,5 @@ module Coinbase
|
|
97
61
|
def inspect
|
98
62
|
to_s
|
99
63
|
end
|
100
|
-
|
101
|
-
private
|
102
|
-
|
103
|
-
def addresses_api
|
104
|
-
@addresses_api ||= Coinbase::Client::AddressesApi.new(Coinbase.configuration.api_client)
|
105
|
-
end
|
106
|
-
|
107
|
-
def wallets_api
|
108
|
-
@wallets_api ||= Coinbase::Client::WalletsApi.new(Coinbase.configuration.api_client)
|
109
|
-
end
|
110
64
|
end
|
111
65
|
end
|