Class: Coinbase::Address

Inherits:
Object
  • Object
show all
Defined in:
lib/coinbase/address.rb

Overview

A representation of a blockchain Address, which is a user-controlled account on a Network. Addresses are used to send and receive Assets, and should be created using Wallet#create_address. Addresses require an Eth::Key to sign transaction data.

Instance Method Summary collapse

Constructor Details

#initialize(model, key) ⇒ Address

Returns a new Address object. Do not use this method directly. Instead, use Wallet#create_address, or use the Wallet’s default_address.

Parameters:



19
20
21
22
# File 'lib/coinbase/address.rb', line 19

def initialize(model, key)
  @model = model
  @key = key
end

Instance Method Details

#balance(asset_id) ⇒ BigDecimal

Returns the balance of the provided Asset.

Parameters:

  • asset_id (Symbol)

    The Asset to retrieve the balance for

Returns:

  • (BigDecimal)

    The balance of the Asset



56
57
58
59
60
61
62
63
64
# File 'lib/coinbase/address.rb', line 56

def balance(asset_id)
  response = Coinbase.call_api do
    addresses_api.get_address_balance(wallet_id, id, Coinbase::Asset.primary_denomination(asset_id).to_s)
  end

  return BigDecimal('0') if response.nil?

  Coinbase::Balance.from_model_and_asset_id(response, asset_id).amount
end

#balancesBalanceMap

Returns the balances of the Address.

Returns:

  • (BalanceMap)

    The balances of the Address, keyed by asset ID. Ether balances are denominated in ETH.



45
46
47
48
49
50
51
# File 'lib/coinbase/address.rb', line 45

def balances
  response = Coinbase.call_api do
    addresses_api.list_address_balances(wallet_id, id)
  end

  Coinbase::BalanceMap.from_balances(response.data)
end

#exportString

Exports the Address’s private key to a hex string.

Returns:

  • (String)

    The Address’s private key as a hex String



144
145
146
# File 'lib/coinbase/address.rb', line 144

def export
  @key.private_hex
end

#faucetCoinbase::FaucetTransaction

Requests funds for the address from the faucet and returns the faucet transaction. This is only supported on testnet networks.

Returns:

Raises:



136
137
138
139
140
# File 'lib/coinbase/address.rb', line 136

def faucet
  Coinbase.call_api do
    Coinbase::FaucetTransaction.new(addresses_api.request_faucet_funds(wallet_id, id))
  end
end

#idString

Returns the Address ID.

Returns:

  • (String)

    The Address ID



38
39
40
# File 'lib/coinbase/address.rb', line 38

def id
  @model.address_id
end

#inspectString

Same as to_s.

Returns:

  • (String)

    a String representation of the Address



127
128
129
# File 'lib/coinbase/address.rb', line 127

def inspect
  to_s
end

#network_idSymbol

Returns the Network ID of the Address.

Returns:

  • (Symbol)

    The Network ID



26
27
28
# File 'lib/coinbase/address.rb', line 26

def network_id
  Coinbase.to_sym(@model.network_id)
end

#to_sString

Returns a String representation of the Address.

Returns:

  • (String)

    a String representation of the Address



121
122
123
# File 'lib/coinbase/address.rb', line 121

def to_s
  "Coinbase::Address{id: '#{id}', network_id: '#{network_id}', wallet_id: '#{wallet_id}'}"
end

#transfer(amount, asset_id, destination) ⇒ String

Transfers the given amount of the given Asset to the given address. Only same-Network Transfers are supported.

Parameters:

  • amount (Integer, Float, BigDecimal)

    The amount of the Asset to send.

  • asset_id (Symbol)

    The ID of the Asset to send. For Ether, :eth, :gwei, and :wei are supported.

  • destination (Wallet | Address | String)

    The destination of the transfer. If a Wallet, sends to the Wallet’s default address. If a String, interprets it as the address ID.

Returns:

  • (String)

    The hash of the Transfer transaction.

Raises:

  • (ArgumentError)


72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/coinbase/address.rb', line 72

def transfer(amount, asset_id, destination)
  raise ArgumentError, "Unsupported asset: #{asset_id}" unless Coinbase::Asset.supported?(asset_id)

  if destination.is_a?(Wallet)
    raise ArgumentError, 'Transfer must be on the same Network' if destination.network_id != network_id

    destination = destination.default_address.id
  elsif destination.is_a?(Address)
    raise ArgumentError, 'Transfer must be on the same Network' if destination.network_id != network_id

    destination = destination.id
  end

  current_balance = balance(asset_id)
  if current_balance < amount
    raise ArgumentError, "Insufficient funds: #{amount} requested, but only #{current_balance} available"
  end

  create_transfer_request = {
    amount: Coinbase::Asset.to_atomic_amount(amount, asset_id).to_i.to_s,
    network_id: network_id,
    asset_id: Coinbase::Asset.primary_denomination(asset_id).to_s,
    destination: destination
  }

  transfer_model = Coinbase.call_api do
    transfers_api.create_transfer(wallet_id, id, create_transfer_request)
  end

  transfer = Coinbase::Transfer.new(transfer_model)

  transaction = transfer.transaction
  transaction.sign(@key)

  signed_payload = transaction.hex

  broadcast_transfer_request = {
    signed_payload: signed_payload
  }

  transfer_model = Coinbase.call_api do
    transfers_api.broadcast_transfer(wallet_id, id, transfer.id, broadcast_transfer_request)
  end

  Coinbase::Transfer.new(transfer_model)
end

#transfersArray<Coinbase::Transfer>

Returns all of the transfers associated with the address.

Returns:



150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/coinbase/address.rb', line 150

def transfers
  transfers = []
  page = nil

  loop do
    puts "fetch transfers page: #{page}"
    response = Coinbase.call_api do
      transfers_api.list_transfers(wallet_id, id, { limit: 100, page: page })
    end

    transfers.concat(response.data.map { |transfer| Coinbase::Transfer.new(transfer) }) if response.data

    break unless response.has_more

    page = response.next_page
  end

  transfers
end

#wallet_idString

Returns the Wallet ID of the Address.

Returns:

  • (String)

    The Wallet ID



32
33
34
# File 'lib/coinbase/address.rb', line 32

def wallet_id
  @model.wallet_id
end