Class: Coinbase::User

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

Overview

A representation of a User. Users have Wallets, which can hold balances of Assets. Access the default User through Coinbase#default_user.

Instance Method Summary collapse

Constructor Details

#initialize(model) ⇒ User

Returns a new User object. Do not use this method directly. Instead, use Coinbase#default_user.

Parameters:

  • the underlying User object



12
13
14
# File 'lib/coinbase/user.rb', line 12

def initialize(model)
  @model = model
end

Instance Method Details

#create_walletCoinbase::Wallet

Creates a new Wallet belonging to the User.

Returns:

  • the new Wallet



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/coinbase/user.rb', line 24

def create_wallet
  create_wallet_request = {
    wallet: {
      # TODO: Don't hardcode this.
      network_id: 'base-sepolia'
    }
  }
  opts = { create_wallet_request: create_wallet_request }

  model = Coinbase.call_api do
    wallets_api.create_wallet(opts)
  end

  Wallet.new(model)
end

#import_wallet(data) ⇒ Coinbase::Wallet

Imports a Wallet belonging to the User.

Parameters:

  • the Wallet data to import

Returns:

  • the imported Wallet



43
44
45
46
47
48
49
50
51
52
53
# File 'lib/coinbase/user.rb', line 43

def import_wallet(data)
  model = Coinbase.call_api do
    wallets_api.get_wallet(data.wallet_id)
  end

  address_count = Coinbase.call_api do
    addresses_api.list_addresses(model.id).total_count
  end

  Wallet.new(model, seed: data.seed, address_count: address_count)
end

#inspectString

Same as to_s.

Returns:

  • a string representation of the User



149
150
151
# File 'lib/coinbase/user.rb', line 149

def inspect
  to_s
end

#list_wallet_idsArray<String>

Lists the IDs of the Wallets belonging to the User.

Returns:

  • the IDs of the Wallets belonging to the User



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

def list_wallet_ids
  wallets = Coinbase.call_api do
    wallets_api.list_wallets
  end

  wallets.data.map(&:id)
end

#load_walletsMap<String>Coinbase::Wallet

Loads all wallets belonging to the User with backup persisted to the local file system.

Returns:

  • the map of wallet_ids to the wallets.

Raises:



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/coinbase/user.rb', line 110

def load_wallets
  existing_seeds_in_store = existing_seeds
  raise ArgumentError, 'Backup file not found' if existing_seeds_in_store == {}

  wallets = {}
  existing_seeds_in_store.each do |wallet_id, seed_data|
    seed = seed_data['seed']
    raise ArgumentError, 'Malformed backup data' if seed.nil? || seed == ''

    if seed_data['encrypted']
      shared_secret = store_encryption_key
      raise ArgumentError, 'Malformed encrypted seed data' if seed_data['iv'] == '' ||
                                                              seed_data['auth_tag'] == ''

      cipher = OpenSSL::Cipher.new('aes-256-gcm').decrypt
      cipher.key = OpenSSL::Digest.digest('SHA256', shared_secret)
      iv = [seed_data['iv']].pack('H*')
      cipher.iv = iv
      auth_tag = [seed_data['auth_tag']].pack('H*')
      cipher.auth_tag = auth_tag
      cipher.auth_data = ''
      hex_decoded_data = [seed_data['seed']].pack('H*')
      seed = cipher.update(hex_decoded_data) + cipher.final
    end

    data = Coinbase::Wallet::Data.new(wallet_id: wallet_id, seed: seed)
    wallets[wallet_id] = import_wallet(data)
  end
  wallets
end

#save_wallet(wallet, encrypt: false) ⇒ Coinbase::Wallet

Saves a wallet to local file system. Wallet saved this way can be re-instantiated with load_wallets function, provided the backup_file is available. This is an insecure method of storing wallet seeds and should only be used for development purposes. If you call save_wallet twice with wallets containing the same wallet_id, the backup will be overwritten during the second attempt. The default backup_file is seeds.json in the root folder. It can be configured by changing Coinbase.configuration.backup_file_path.

encrypted or not. Data is unencrypted by default.

Parameters:

  • The wallet model to save.

  • (defaults to: false)

    (Optional) Boolean representing whether the backup persisted to local file system should be

Returns:

  • the saved wallet.



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
# File 'lib/coinbase/user.rb', line 76

def save_wallet(wallet, encrypt: false)
  existing_seeds_in_store = existing_seeds
  data = wallet.export
  seed_to_store = data.seed
  auth_tag = ''
  iv = ''
  if encrypt
    shared_secret = store_encryption_key
    cipher = OpenSSL::Cipher.new('aes-256-gcm').encrypt
    cipher.key = OpenSSL::Digest.digest('SHA256', shared_secret)
    iv = cipher.random_iv
    cipher.iv = iv
    cipher.auth_data = ''
    encrypted_data = cipher.update(data.seed) + cipher.final
    auth_tag = cipher.auth_tag.unpack1('H*')
    iv = iv.unpack1('H*')
    seed_to_store = encrypted_data.unpack1('H*')
  end

  existing_seeds_in_store[data.wallet_id] = {
    seed: seed_to_store,
    encrypted: encrypt,
    auth_tag: auth_tag,
    iv: iv
  }

  File.open(Coinbase.configuration.backup_file_path, 'w') do |file|
    file.write(JSON.pretty_generate(existing_seeds_in_store))
  end
  wallet
end

#to_sString

Returns a string representation of the User.

Returns:

  • a string representation of the User



143
144
145
# File 'lib/coinbase/user.rb', line 143

def to_s
  "Coinbase::User{user_id: '#{user_id}'}"
end

#user_idString

Returns the User ID.

Returns:

  • the User ID



18
19
20
# File 'lib/coinbase/user.rb', line 18

def user_id
  @model.id
end