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:



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:



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:

Returns:



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:

  • (String)

    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:

  • (Array<String>)

    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:

Raises:

  • (ArgumentError)


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:

  • wallet (Coinbase::Wallet)

    The wallet model to save.

  • encrypt (bool) (defaults to: false)

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

Returns:



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:

  • (String)

    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:

  • (String)

    the User ID



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

def user_id
  @model.id
end