Class: Coinbase::Wallet
- Inherits:
-
Object
- Object
- Coinbase::Wallet
- Defined in:
- lib/coinbase/wallet.rb
Overview
A representation of a Wallet. Wallets come with a single default Address, but can expand to have a set of Addresses, each of which can hold a balance of one or more Assets. Wallets can create new Addresses, list their addresses, list their balances, and transfer Assets to other Addresses. Wallets should be created through User#create_wallet or User#import_wallet.
Defined Under Namespace
Classes: Data
Instance Method Summary collapse
-
#create_address ⇒ Address
Creates a new Address in the Wallet.
-
#default_address ⇒ Address
Returns the default address of the Wallet.
-
#export ⇒ Data
Exports the Wallet’s data to a Data object.
-
#get_address(address_id) ⇒ Address
Returns the Address with the given ID.
-
#get_balance(asset_id) ⇒ BigDecimal
Returns the balance of the provided Asset.
-
#initialize(model, seed: nil, address_count: 0) ⇒ Wallet
constructor
Returns a new Wallet object.
-
#list_addresses ⇒ Array<Address>
Returns the list of Addresses in the Wallet.
-
#list_balances ⇒ BalanceMap
Returns the list of balances of this Wallet.
-
#network_id ⇒ Symbol
Returns the Network ID of the Wallet.
-
#transfer(amount, asset_id, destination) ⇒ Transfer
Transfers the given amount of the given Asset to the given address.
-
#wallet_id ⇒ String
Returns the Wallet ID.
Constructor Details
#initialize(model, seed: nil, address_count: 0) ⇒ Wallet
Returns a new Wallet object. Do not use this method directly. Instead, use User#create_wallet or User#import_wallet.
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/coinbase/wallet.rb', line 22 def initialize(model, seed: nil, address_count: 0) raise ArgumentError, 'Seed must be 32 bytes' if !seed.nil? && seed.length != 64 @model = model @master = seed.nil? ? MoneyTree::Master.new : MoneyTree::Master.new(seed_hex: seed) # TODO: Make Network an argument to the constructor. @network_id = :base_sepolia @addresses = [] # TODO: Adjust derivation path prefix based on network protocol. @address_path_prefix = "m/44'/60'/0'/0" @address_index = 0 if address_count.positive? address_count.times { derive_address } else create_address # Update the model to reflect the new default address. update_model end end |
Instance Method Details
#create_address ⇒ Address
Creates a new Address in the Wallet.
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/coinbase/wallet.rb', line 60 def create_address key = derive_key attestation = create_attestation(key) public_key = key.public_key.compressed.unpack1('H*') opts = { create_address_request: { public_key: public_key, attestation: attestation } } address_model = addresses_api.create_address(wallet_id, opts) cache_address(address_model, key) end |
#default_address ⇒ Address
Returns the default address of the Wallet.
78 79 80 |
# File 'lib/coinbase/wallet.rb', line 78 def default_address @addresses.find { |address| address.address_id == @model.default_address.address_id } end |
#export ⇒ Data
Exports the Wallet’s data to a Data object.
153 154 155 |
# File 'lib/coinbase/wallet.rb', line 153 def export Data.new(wallet_id: wallet_id, seed: @master.seed_hex) end |
#get_address(address_id) ⇒ Address
Returns the Address with the given ID.
85 86 87 |
# File 'lib/coinbase/wallet.rb', line 85 def get_address(address_id) @addresses.find { |address| address.address_id == address_id } end |
#get_balance(asset_id) ⇒ BigDecimal
Returns the balance of the provided Asset. Balances are aggregated across all Addresses in the Wallet.
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/coinbase/wallet.rb', line 105 def get_balance(asset_id) normalized_asset_id = if i[wei gwei].include?(asset_id) :eth else asset_id end response = wallets_api.get_wallet_balance(wallet_id, normalized_asset_id.to_s) return BigDecimal('0') if response.nil? amount = BigDecimal(response.amount) case asset_id when :eth amount / BigDecimal(Coinbase::WEI_PER_ETHER.to_s) when :gwei amount / BigDecimal(Coinbase::GWEI_PER_ETHER.to_s) when :usdc amount / BigDecimal(Coinbase::ATOMIC_UNITS_PER_USDC.to_s) else amount end end |
#list_addresses ⇒ Array<Address>
Returns the list of Addresses in the Wallet.
91 92 93 |
# File 'lib/coinbase/wallet.rb', line 91 def list_addresses @addresses end |
#list_balances ⇒ BalanceMap
Returns the list of balances of this Wallet. Balances are aggregated across all Addresses in the Wallet.
97 98 99 100 |
# File 'lib/coinbase/wallet.rb', line 97 def list_balances response = wallets_api.list_wallet_balances(wallet_id) Coinbase.to_balance_map(response) end |
#network_id ⇒ Symbol
Returns the Network ID of the Wallet.
54 55 56 |
# File 'lib/coinbase/wallet.rb', line 54 def network_id Coinbase.to_sym(@model.network_id) end |
#transfer(amount, asset_id, destination) ⇒ Transfer
Transfers the given amount of the given Asset to the given address. Only same-Network Transfers are supported. Currently only the default_address is used to source the Transfer.
137 138 139 140 141 142 143 144 145 146 147 148 149 |
# File 'lib/coinbase/wallet.rb', line 137 def transfer(amount, asset_id, destination) if destination.is_a?(Wallet) raise ArgumentError, 'Transfer must be on the same Network' if destination.network_id != @network_id destination = destination.default_address.address_id elsif destination.is_a?(Address) raise ArgumentError, 'Transfer must be on the same Network' if destination.network_id != @network_id destination = destination.address_id end default_address.transfer(amount, asset_id, destination) end |
#wallet_id ⇒ String
Returns the Wallet ID.
48 49 50 |
# File 'lib/coinbase/wallet.rb', line 48 def wallet_id @model.id end |