coinbase-sdk 0.0.14 → 0.1.0
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/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
@@ -0,0 +1,106 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Coinbase
|
4
|
+
# A representation of a SmartContract on the blockchain.
|
5
|
+
class SmartContract
|
6
|
+
# Returns a list of ContractEvents for the provided network, contract, and event details.
|
7
|
+
# @param network_id [Symbol] The network ID
|
8
|
+
# @param protocol_name [String] The protocol name
|
9
|
+
# @param contract_address [String] The contract address
|
10
|
+
# @param contract_name [String] The contract name
|
11
|
+
# @param event_name [String] The event name
|
12
|
+
# @param from_block_height [Integer] The start block height
|
13
|
+
# @param to_block_height [Integer] The end block height
|
14
|
+
# @return [Enumerable<Coinbase::ContractEvent>] The contract events
|
15
|
+
def self.list_events(
|
16
|
+
network_id:,
|
17
|
+
protocol_name:,
|
18
|
+
contract_address:,
|
19
|
+
contract_name:,
|
20
|
+
event_name:,
|
21
|
+
from_block_height:,
|
22
|
+
to_block_height:
|
23
|
+
)
|
24
|
+
Coinbase::Pagination.enumerate(
|
25
|
+
lambda { |page|
|
26
|
+
list_events_page(network_id, protocol_name, contract_address, contract_name, event_name, from_block_height,
|
27
|
+
to_block_height, page)
|
28
|
+
}
|
29
|
+
) do |contract_event|
|
30
|
+
Coinbase::ContractEvent.new(contract_event)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns a new SmartContract object.
|
35
|
+
# @param model [Coinbase::Client::SmartContract] The underlying SmartContract object
|
36
|
+
def initialize(model)
|
37
|
+
@model = model
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns the network ID of the SmartContract.
|
41
|
+
# @return [String] The network ID
|
42
|
+
def network_id
|
43
|
+
Coinbase.to_sym(@model.network_id)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Returns the protocol name of the SmartContract.
|
47
|
+
# @return [String] The protocol name
|
48
|
+
def protocol_name
|
49
|
+
@model.protocol_name
|
50
|
+
end
|
51
|
+
|
52
|
+
# Returns the contract name of the SmartContract.
|
53
|
+
# @return [String] The contract name
|
54
|
+
def contract_name
|
55
|
+
@model.contract_name
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns the address of the SmartContract.
|
59
|
+
# @return [String] The contract address
|
60
|
+
def address
|
61
|
+
@model.address
|
62
|
+
end
|
63
|
+
|
64
|
+
# Returns a string representation of the SmartContract.
|
65
|
+
# @return [String] a string representation of the SmartContract
|
66
|
+
def to_s
|
67
|
+
"Coinbase::SmartContract{
|
68
|
+
network_id: '#{network_id}',
|
69
|
+
protocol_name: '#{protocol_name}',
|
70
|
+
contract_name: '#{contract_name}',
|
71
|
+
address: '#{address}'}"
|
72
|
+
end
|
73
|
+
|
74
|
+
# Same as to_s.
|
75
|
+
# @return [String] a string representation of the SmartContract
|
76
|
+
def inspect
|
77
|
+
to_s
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.contract_events_api
|
81
|
+
Coinbase::Client::ContractEventsApi.new(Coinbase.configuration.api_client)
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.list_events_page(
|
85
|
+
network_id,
|
86
|
+
protocol_name,
|
87
|
+
contract_address,
|
88
|
+
contract_name,
|
89
|
+
event_name,
|
90
|
+
from_block_height,
|
91
|
+
to_block_height,
|
92
|
+
page
|
93
|
+
)
|
94
|
+
contract_events_api.list_contract_events(
|
95
|
+
Coinbase.normalize_network(network_id),
|
96
|
+
protocol_name,
|
97
|
+
contract_address,
|
98
|
+
contract_name,
|
99
|
+
event_name,
|
100
|
+
from_block_height,
|
101
|
+
to_block_height,
|
102
|
+
{ next_page: page }
|
103
|
+
)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eth'
|
4
|
+
|
5
|
+
module Coinbase
|
6
|
+
# A representation of an onchain Sponsored Send.
|
7
|
+
# Sponsored Sends should be constructed via higher level abstractions like Transfer.
|
8
|
+
class SponsoredSend
|
9
|
+
# A representation of a Transaction status.
|
10
|
+
module Status
|
11
|
+
# The SponsoredSend is awaiting being signed.
|
12
|
+
PENDING = 'pending'
|
13
|
+
|
14
|
+
# The Sponsored Send has been signed, but has not been submitted to be
|
15
|
+
# built into a transaction yet.
|
16
|
+
SIGNED = 'signed'
|
17
|
+
|
18
|
+
# The Sponsored Send has been submitted to be built into a transaction,
|
19
|
+
# that the sponsor will sign and submit to the network.
|
20
|
+
# At this point, transaction hashes may not yet be assigned.
|
21
|
+
SUBMITTED = 'submitted'
|
22
|
+
|
23
|
+
# The Sponsored Send's corresponding transaction is complete and has
|
24
|
+
# confirmed on the Network.
|
25
|
+
COMPLETE = 'complete'
|
26
|
+
|
27
|
+
# The Sponsored Send has failed for some reason.
|
28
|
+
FAILED = 'failed'
|
29
|
+
|
30
|
+
# The states that are considered terminal on-chain.
|
31
|
+
TERMINAL_STATES = [COMPLETE, FAILED].freeze
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns a new SponsoredSend object. Do not use this method directly.
|
35
|
+
# @param model [Coinbase::Client::SponsoredSend] The underlying SponsoredSend object
|
36
|
+
def initialize(model)
|
37
|
+
raise unless model.is_a?(Coinbase::Client::SponsoredSend)
|
38
|
+
|
39
|
+
@model = model
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns the Keccak256 hash of the typed data. This payload must be signed
|
43
|
+
# by the sender to be used as an approval in the EIP-3009 transaction.
|
44
|
+
# @return [String] The Keccak256 hash of the typed data
|
45
|
+
def typed_data_hash
|
46
|
+
@model.typed_data_hash
|
47
|
+
end
|
48
|
+
|
49
|
+
# Returns the signature of the typed data.
|
50
|
+
def signature
|
51
|
+
@signature ||= @model.signature
|
52
|
+
end
|
53
|
+
|
54
|
+
# Signs the Transaction with the provided key and returns the hex signing payload.
|
55
|
+
# @return [String] The hex-encoded signed payload
|
56
|
+
def sign(key)
|
57
|
+
raise unless key.is_a?(Eth::Key)
|
58
|
+
raise Coinbase::AlreadySignedError if signed?
|
59
|
+
|
60
|
+
@signature = Eth::Util.prefix_hex(key.sign(Eth::Util.hex_to_bin(typed_data_hash)))
|
61
|
+
end
|
62
|
+
|
63
|
+
# Returns whether the Transaction has been signed.
|
64
|
+
# @return [Boolean] Whether the Transaction has been signed
|
65
|
+
def signed?
|
66
|
+
!signature.nil?
|
67
|
+
end
|
68
|
+
|
69
|
+
# Returns the status of the Transaction.
|
70
|
+
# @return [Symbol] The status
|
71
|
+
def status
|
72
|
+
@model.status
|
73
|
+
end
|
74
|
+
|
75
|
+
# Returns whether the Sponsored Send is in a terminal state.
|
76
|
+
# @return [Boolean] Whether the Transaction is in a terminal state
|
77
|
+
def terminal_state?
|
78
|
+
Status::TERMINAL_STATES.include?(status)
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns the Transaction Hash of the Transaction.
|
82
|
+
# @return [String] The Transaction Hash
|
83
|
+
def transaction_hash
|
84
|
+
@model.transaction_hash
|
85
|
+
end
|
86
|
+
|
87
|
+
# Returns the link to the transaction on the blockchain explorer.
|
88
|
+
# @return [String] The link to the transaction on the blockchain explorer
|
89
|
+
def transaction_link
|
90
|
+
@model.transaction_link
|
91
|
+
end
|
92
|
+
|
93
|
+
# Returns a String representation of the SponsoredSend.
|
94
|
+
# @return [String] a String representation of the SponsoredSend
|
95
|
+
def to_s
|
96
|
+
Coinbase.pretty_print_object(
|
97
|
+
self.class,
|
98
|
+
status: status,
|
99
|
+
transaction_hash: transaction_hash,
|
100
|
+
transaction_link: transaction_link
|
101
|
+
)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Same as to_s.
|
105
|
+
# @return [String] a String representation of the SponsoredSend
|
106
|
+
def inspect
|
107
|
+
to_s
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
module Coinbase
|
6
|
+
# A representation of a staking balance on a network for a given asset.
|
7
|
+
class StakingBalance
|
8
|
+
# Returns a list of StakingBalance for the provided network, asset, and addresses.
|
9
|
+
# @param network [Coinbase::Network, Symbol] The Network or Network ID
|
10
|
+
# @param asset_id [Symbol] The asset ID
|
11
|
+
# @param address_id [String] The address ID
|
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
|
+
# @return [Enumerable<Coinbase::StakingBalance>] The staking balances
|
15
|
+
def self.list(network, asset_id, address_id, start_time: DateTime.now.prev_month(1), end_time: DateTime.now)
|
16
|
+
network = Coinbase::Network.from_id(network)
|
17
|
+
|
18
|
+
Coinbase::Pagination.enumerate(
|
19
|
+
->(page) { list_page(network, asset_id, address_id, start_time, end_time, page) }
|
20
|
+
) do |staking_balance|
|
21
|
+
new(staking_balance)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns a new StakingBalance object.
|
26
|
+
# @param model [Coinbase::Client::StakingBalance] The underlying StakingBalance object
|
27
|
+
def initialize(model)
|
28
|
+
@model = model
|
29
|
+
end
|
30
|
+
|
31
|
+
# Returns the date of the StakingBalance.
|
32
|
+
# @return [Time] The date
|
33
|
+
def date
|
34
|
+
@model.date
|
35
|
+
end
|
36
|
+
|
37
|
+
# Returns the onchain address of the StakingBalance.
|
38
|
+
# @return [Time] The onchain address
|
39
|
+
def address
|
40
|
+
@model.address
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns the bonded stake as a Balance
|
44
|
+
# @return [Balance] The bonded stake
|
45
|
+
def bonded_stake
|
46
|
+
@bonded_stake ||= Balance.from_model(@model.bonded_stake)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Returns the unbonded balance as a Balance
|
50
|
+
# @return [Balance] The unbonded balance
|
51
|
+
def unbonded_balance
|
52
|
+
@unbonded_balance ||= Balance.from_model(@model.unbonded_balance)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns the participant type of the StakingBalance.
|
56
|
+
# @return [String] The participant type
|
57
|
+
def participant_type
|
58
|
+
@model.participant_type
|
59
|
+
end
|
60
|
+
|
61
|
+
# Returns a string representation of the StakingBalance.
|
62
|
+
# @return [String] a string representation of the StakingBalance
|
63
|
+
def to_s
|
64
|
+
"Coinbase::StakingBalance{date: '#{date}' address: '#{address}'}"
|
65
|
+
end
|
66
|
+
|
67
|
+
# Same as to_s.
|
68
|
+
# @return [String] a string representation of the StakingBalance
|
69
|
+
def inspect
|
70
|
+
to_s
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.stake_api
|
74
|
+
Coinbase::Client::StakeApi.new(Coinbase.configuration.api_client)
|
75
|
+
end
|
76
|
+
|
77
|
+
private_class_method :stake_api
|
78
|
+
|
79
|
+
def self.list_page(network, asset_id, address_id, start_time, end_time, page)
|
80
|
+
stake_api.fetch_historical_staking_balances(
|
81
|
+
network.normalized_id,
|
82
|
+
asset_id,
|
83
|
+
address_id,
|
84
|
+
start_time.iso8601,
|
85
|
+
end_time.iso8601,
|
86
|
+
{ next_page: page }
|
87
|
+
)
|
88
|
+
end
|
89
|
+
|
90
|
+
private_class_method :list_page
|
91
|
+
end
|
92
|
+
end
|
@@ -11,22 +11,24 @@ module Coinbase
|
|
11
11
|
|
12
12
|
# Builds an ephemeral staking operation this is intended to be called via an Address or Wallet.
|
13
13
|
# @param amount [BigDecimal] The amount to stake, in the primary denomination of the asset
|
14
|
-
# @param
|
14
|
+
# @param network [Coinbase::Network, Symbol] The Network or Network ID
|
15
15
|
# @param asset_id [Symbol] The Asset ID
|
16
16
|
# @param address_id [String] The Address ID
|
17
17
|
# @param action [Symbol] The action to perform
|
18
18
|
# @param mode [Symbol] The staking mode
|
19
19
|
# @param options [Hash] Additional options
|
20
20
|
# @return [Coinbase::StakingOperation] The staking operation
|
21
|
-
def self.build(amount,
|
21
|
+
def self.build(amount, network, asset_id, address_id, action, mode, options)
|
22
|
+
network = Coinbase::Network.from_id(network)
|
23
|
+
asset = network.get_asset(asset_id)
|
24
|
+
|
22
25
|
model = Coinbase.call_api do
|
23
|
-
asset = Coinbase::Asset.fetch(network_id, asset_id)
|
24
26
|
stake_api.build_staking_operation(
|
25
27
|
{
|
26
28
|
asset_id: asset.primary_denomination.to_s,
|
27
29
|
address_id: address_id,
|
28
30
|
action: action,
|
29
|
-
network_id: Coinbase.normalize_network(
|
31
|
+
network_id: Coinbase.normalize_network(network),
|
30
32
|
options: {
|
31
33
|
amount: asset.to_atomic_amount(amount).to_i.to_s,
|
32
34
|
mode: mode
|
@@ -40,7 +42,7 @@ module Coinbase
|
|
40
42
|
|
41
43
|
# Creates a persisted staking operation this is intended to be called via an Address or Wallet.
|
42
44
|
# @param amount [BigDecimal] The amount to stake, in the primary denomination of the asset
|
43
|
-
# @param
|
45
|
+
# @param network [Coinbase::Network, Symbol] The Network or Network ID
|
44
46
|
# @param asset_id [Symbol] The Asset ID
|
45
47
|
# @param address_id [String] The Address ID
|
46
48
|
# @param wallet_id [String] The Wallet ID
|
@@ -48,17 +50,19 @@ module Coinbase
|
|
48
50
|
# @param mode [Symbol] The staking mode
|
49
51
|
# @param options [Hash] Additional options
|
50
52
|
# @return [Coinbase::StakingOperation] The staking operation
|
51
|
-
def self.create(amount,
|
53
|
+
def self.create(amount, network, asset_id, address_id, wallet_id, action, mode, options)
|
54
|
+
network = Coinbase::Network.from_id(network)
|
55
|
+
asset = network.get_asset(asset_id)
|
56
|
+
|
52
57
|
model = Coinbase.call_api do
|
53
|
-
|
54
|
-
stake_api.create_staking_operation(
|
58
|
+
wallet_stake_api.create_staking_operation(
|
55
59
|
wallet_id,
|
56
60
|
address_id,
|
57
61
|
{
|
58
62
|
asset_id: asset.primary_denomination.to_s,
|
59
63
|
address_id: address_id,
|
60
64
|
action: action,
|
61
|
-
network_id: Coinbase.normalize_network(
|
65
|
+
network_id: Coinbase.normalize_network(network),
|
62
66
|
options: {
|
63
67
|
amount: asset.to_atomic_amount(amount).to_i.to_s,
|
64
68
|
mode: mode
|
@@ -70,10 +74,24 @@ module Coinbase
|
|
70
74
|
new(model)
|
71
75
|
end
|
72
76
|
|
77
|
+
def self.stake_api
|
78
|
+
Coinbase::Client::StakeApi.new(Coinbase.configuration.api_client)
|
79
|
+
end
|
80
|
+
|
81
|
+
private_class_method :stake_api
|
82
|
+
|
83
|
+
def self.wallet_stake_api
|
84
|
+
Coinbase::Client::WalletStakeApi.new(Coinbase.configuration.api_client)
|
85
|
+
end
|
86
|
+
|
87
|
+
private_class_method :wallet_stake_api
|
88
|
+
|
73
89
|
# Returns a new StakingOperation object.
|
74
90
|
# @param model [Coinbase::Client::StakingOperation] The underlying StakingOperation object
|
75
91
|
def initialize(model)
|
76
|
-
|
92
|
+
@model = model
|
93
|
+
@transactions ||= []
|
94
|
+
update_transactions(model.transactions)
|
77
95
|
end
|
78
96
|
|
79
97
|
# Returns the Staking Operation ID.
|
@@ -82,10 +100,10 @@ module Coinbase
|
|
82
100
|
@model.id
|
83
101
|
end
|
84
102
|
|
85
|
-
# Returns the Network
|
86
|
-
# @return [
|
87
|
-
def
|
88
|
-
Coinbase.
|
103
|
+
# Returns the Network of the Staking Operation.
|
104
|
+
# @return [Coinbase::Network] The Network
|
105
|
+
def network
|
106
|
+
@network ||= Coinbase::Network.from_id(@model.network_id)
|
89
107
|
end
|
90
108
|
|
91
109
|
# Returns the Address ID of the Staking Operation.
|
@@ -100,18 +118,48 @@ module Coinbase
|
|
100
118
|
@model.status
|
101
119
|
end
|
102
120
|
|
121
|
+
# Returns whether the Staking Operation is in a terminal state.
|
122
|
+
# @return [Boolean] Whether the Staking Operation is in a terminal state
|
123
|
+
def terminal_state?
|
124
|
+
failed? || completed?
|
125
|
+
end
|
126
|
+
|
127
|
+
# Returns whether the Staking Operation is in a failed state.
|
128
|
+
# @return [Boolean] Whether the Staking Operation is in a failed state
|
129
|
+
def failed?
|
130
|
+
status == 'failed'
|
131
|
+
end
|
132
|
+
|
133
|
+
# Returns whether the Staking Operation is in a complete state.
|
134
|
+
# @return [Boolean] Whether the Staking Operation is in a complete state
|
135
|
+
def completed?
|
136
|
+
status == 'complete'
|
137
|
+
end
|
138
|
+
|
139
|
+
# Returns a String representation of the Staking Operation.
|
140
|
+
# @return [String] a String representation of the Staking Operation
|
141
|
+
def to_s
|
142
|
+
Coinbase.pretty_print_object(
|
143
|
+
self.class,
|
144
|
+
id: id,
|
145
|
+
status: status,
|
146
|
+
network_id: network.id,
|
147
|
+
address_id: address_id
|
148
|
+
)
|
149
|
+
end
|
150
|
+
|
103
151
|
# Returns the Wallet ID of the Staking Operation.
|
104
152
|
# @return [String] The Wallet ID
|
105
153
|
def wallet_id
|
106
154
|
@model.wallet_id
|
107
155
|
end
|
108
156
|
|
109
|
-
# Waits until the Staking Operation is completed or failed by polling its status at the given interval.
|
110
|
-
# Timeout::Error if the Staking Operation takes longer than the given timeout.
|
157
|
+
# Waits until the Staking Operation is completed or failed by polling its status at the given interval.
|
111
158
|
# @param interval_seconds [Integer] The interval at which to poll, in seconds
|
112
159
|
# @param timeout_seconds [Integer] The maximum amount of time
|
113
160
|
# to wait for the StakingOperation to complete, in seconds
|
114
161
|
# @return [StakingOperation] The completed StakingOperation object
|
162
|
+
# @raise [Timeout::Error] if the Staking Operation takes longer than the given timeout.
|
115
163
|
def wait!(interval_seconds = 5, timeout_seconds = 3600)
|
116
164
|
start_time = Time.now
|
117
165
|
|
@@ -119,7 +167,7 @@ module Coinbase
|
|
119
167
|
reload
|
120
168
|
|
121
169
|
# Wait for the Staking Operation to be in a terminal state.
|
122
|
-
break if
|
170
|
+
break if terminal_state?
|
123
171
|
|
124
172
|
raise Timeout::Error, 'Staking Operation timed out' if Time.now - start_time > timeout_seconds
|
125
173
|
|
@@ -129,18 +177,58 @@ module Coinbase
|
|
129
177
|
self
|
130
178
|
end
|
131
179
|
|
180
|
+
# Complete helps the Staking Operation reach complete state, by polling its status at the given interval, signing
|
181
|
+
# and broadcasting any available transaction.
|
182
|
+
# @param key [Eth::Key] The key to sign the Staking Operation transactions with
|
183
|
+
# @param interval_seconds [Integer] The interval at which to poll, in seconds
|
184
|
+
# @param timeout_seconds [Integer] The maximum amount of time
|
185
|
+
# to wait for the StakingOperation to complete, in seconds
|
186
|
+
# @return [StakingOperation] The completed StakingOperation object
|
187
|
+
# @raise [Timeout::Error] if the Staking Operation takes longer than the given timeout.
|
188
|
+
def complete(key, interval_seconds: 5, timeout_seconds: 600)
|
189
|
+
start_time = Time.now
|
190
|
+
|
191
|
+
loop do
|
192
|
+
@transactions.each_with_index do |transaction, i|
|
193
|
+
next if transaction.signed?
|
194
|
+
|
195
|
+
transaction.sign(key)
|
196
|
+
@model = Coinbase.call_api do
|
197
|
+
stake_api.broadcast_staking_operation(
|
198
|
+
wallet_id,
|
199
|
+
address_id,
|
200
|
+
id,
|
201
|
+
{ signed_payload: transaction.raw.hex, transaction_index: i }
|
202
|
+
)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
return self if terminal_state?
|
207
|
+
|
208
|
+
reload
|
209
|
+
|
210
|
+
raise Timeout::Error, 'Staking Operation timed out' if Time.now - start_time > timeout_seconds
|
211
|
+
|
212
|
+
sleep interval_seconds
|
213
|
+
end
|
214
|
+
|
215
|
+
self
|
216
|
+
end
|
217
|
+
|
132
218
|
# Fetch the StakingOperation with the provided network, address and staking operation ID.
|
133
|
-
# @param
|
219
|
+
# @param network [Coinbase::Network, Symbol] The Network or Network ID
|
134
220
|
# @param address_id [Symbol] The Address ID
|
135
221
|
# @param id [String] The ID of the StakingOperation
|
136
222
|
# @param wallet_id [String] The optional Wallet ID
|
137
223
|
# @return [Coinbase::StakingOperation] The staking operation
|
138
|
-
def self.fetch(
|
224
|
+
def self.fetch(network, address_id, id, wallet_id: nil)
|
225
|
+
network = Coinbase::Network.from_id(network)
|
226
|
+
|
139
227
|
staking_operation_model = Coinbase.call_api do
|
140
228
|
if wallet_id.nil?
|
141
|
-
stake_api.get_external_staking_operation(
|
229
|
+
stake_api.get_external_staking_operation(network.id, address_id, id)
|
142
230
|
else
|
143
|
-
|
231
|
+
wallet_stake_api.get_staking_operation(wallet_id, address_id, id)
|
144
232
|
end
|
145
233
|
end
|
146
234
|
|
@@ -160,13 +248,15 @@ module Coinbase
|
|
160
248
|
def reload
|
161
249
|
@model = Coinbase.call_api do
|
162
250
|
if wallet_id.nil?
|
163
|
-
stake_api.get_external_staking_operation(
|
251
|
+
stake_api.get_external_staking_operation(network.id, address_id, id)
|
164
252
|
else
|
165
|
-
|
253
|
+
wallet_stake_api.get_staking_operation(wallet_id, address_id, id)
|
166
254
|
end
|
167
255
|
end
|
168
256
|
|
169
|
-
|
257
|
+
update_transactions(@model.transactions)
|
258
|
+
|
259
|
+
self
|
170
260
|
end
|
171
261
|
|
172
262
|
# Fetches the presigned_voluntary exit messages for the staking operation
|
@@ -191,7 +281,7 @@ module Coinbase
|
|
191
281
|
raise TransactionNotSignedError unless transaction.signed?
|
192
282
|
|
193
283
|
Coinbase.call_api do
|
194
|
-
|
284
|
+
wallet_stake_api.broadcast_staking_operation(
|
195
285
|
wallet_id,
|
196
286
|
address_id,
|
197
287
|
id,
|
@@ -203,24 +293,32 @@ module Coinbase
|
|
203
293
|
self
|
204
294
|
end
|
205
295
|
|
206
|
-
def self.stake_api
|
207
|
-
Coinbase::Client::StakeApi.new(Coinbase.configuration.api_client)
|
208
|
-
end
|
209
|
-
|
210
296
|
private
|
211
297
|
|
212
298
|
def stake_api
|
213
|
-
@stake_api ||=
|
299
|
+
@stake_api ||= Coinbase::Client::StakeApi.new(Coinbase.configuration.api_client)
|
214
300
|
end
|
215
301
|
|
216
|
-
def
|
217
|
-
@
|
218
|
-
|
219
|
-
|
220
|
-
|
302
|
+
def wallet_stake_api
|
303
|
+
@wallet_stake_api ||= Coinbase::Client::WalletStakeApi.new(Coinbase.configuration.api_client)
|
304
|
+
end
|
305
|
+
|
306
|
+
def update_transactions(transactions)
|
307
|
+
# Only overwrite the transactions if the response is populated.
|
308
|
+
return unless transactions && !transactions.empty?
|
309
|
+
|
310
|
+
# Create a set of existing unsigned payloads to avoid duplicates.
|
311
|
+
existing_unsigned_payloads = Set.new
|
312
|
+
@transactions.each do |transaction|
|
313
|
+
existing_unsigned_payloads.add(transaction.unsigned_payload)
|
221
314
|
end
|
222
315
|
|
223
|
-
|
316
|
+
# Add transactions that are not already in the transactions array.
|
317
|
+
transactions.each do |transaction_model|
|
318
|
+
unless existing_unsigned_payloads.include?(transaction_model.unsigned_payload)
|
319
|
+
@transactions << Transaction.new(transaction_model)
|
320
|
+
end
|
321
|
+
end
|
224
322
|
end
|
225
323
|
end
|
226
324
|
end
|
@@ -53,6 +53,24 @@ module Coinbase
|
|
53
53
|
@model.address_id
|
54
54
|
end
|
55
55
|
|
56
|
+
# Returns the USD value of the StakingReward.
|
57
|
+
# @return [BigDecimal] The USD value
|
58
|
+
def usd_value
|
59
|
+
BigDecimal(@model.usd_value.amount.to_i) / BigDecimal(100)
|
60
|
+
end
|
61
|
+
|
62
|
+
# Returns the USD conversion price of the StakingReward.
|
63
|
+
# @return [BigDecimal] The USD conversion price
|
64
|
+
def usd_conversion_price
|
65
|
+
BigDecimal(@model.usd_value.conversion_price.to_i)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Returns the USD conversion time of the StakingReward.
|
69
|
+
# @return [Time] The USD conversion time
|
70
|
+
def usd_conversion_time
|
71
|
+
@model.usd_value.conversion_time
|
72
|
+
end
|
73
|
+
|
56
74
|
# Returns a string representation of the StakingReward.
|
57
75
|
# @return [String] a string representation of the StakingReward
|
58
76
|
def to_s
|
data/lib/coinbase/trade.rb
CHANGED
@@ -15,12 +15,13 @@ module Coinbase
|
|
15
15
|
# @param from_asset_id [Symbol] The Asset ID of the Asset to trade from
|
16
16
|
# @param to_asset_id [Symbol] The Asset ID of the Asset to trade to
|
17
17
|
# @param amount [BigDecimal] The amount of the Asset to send
|
18
|
-
# @param
|
18
|
+
# @param network [Coinbase::Network, Symbol] The Network or Network ID of the Asset
|
19
19
|
# @param wallet_id [String] The Wallet ID of the sending Wallet
|
20
20
|
# @return [Send] The new pending Send object
|
21
|
-
def create(address_id:, from_asset_id:, to_asset_id:, amount:,
|
22
|
-
|
23
|
-
|
21
|
+
def create(address_id:, from_asset_id:, to_asset_id:, amount:, network:, wallet_id:)
|
22
|
+
network = Coinbase::Network.from_id(network)
|
23
|
+
from_asset = network.get_asset(from_asset_id)
|
24
|
+
to_asset = network.get_asset(to_asset_id)
|
24
25
|
|
25
26
|
model = Coinbase.call_api do
|
26
27
|
trades_api.create_trade(
|
@@ -75,10 +76,10 @@ module Coinbase
|
|
75
76
|
@model.trade_id
|
76
77
|
end
|
77
78
|
|
78
|
-
# Returns the Network
|
79
|
-
# @return [
|
80
|
-
def
|
81
|
-
Coinbase.
|
79
|
+
# Returns the Network of the Trade.
|
80
|
+
# @return [Coinbase::Network] The Network the Trade is on
|
81
|
+
def network
|
82
|
+
@network ||= Coinbase::Network.from_id(@model.network_id)
|
82
83
|
end
|
83
84
|
|
84
85
|
# Returns the Wallet ID of the Trade.
|
@@ -198,7 +199,7 @@ module Coinbase
|
|
198
199
|
# Returns a String representation of the Trade.
|
199
200
|
# @return [String] a String representation of the Trade
|
200
201
|
def to_s
|
201
|
-
"Coinbase::Trade{transfer_id: '#{id}', network_id: '#{
|
202
|
+
"Coinbase::Trade{transfer_id: '#{id}', network_id: '#{network.id}', " \
|
202
203
|
"address_id: '#{address_id}', from_asset_id: '#{from_asset_id}', " \
|
203
204
|
"to_asset_id: '#{to_asset_id}', from_amount: '#{from_amount}', " \
|
204
205
|
"to_amount: '#{to_amount}' status: '#{status}'}"
|