Resumen

Dai.js soporta el uso de múltiples cuentas \(es decir, llaves privadas\) con una única instancia de Maker. Las cuentas pueden ser especificadas en las opciones para Maker.create o con el método addAccount.

Llama a useAccount para alternar a usar una cuenta por su nombre, o useAccountWithAddress para alternar a usar una cuenta por su address y las llamadas posteriores utilizarán esa cuenta como firmante de la transacción.

Cuando se crea la instancia de Maker por primera vez, si existe, utilizará la cuenta llamada default (por defecto), caso contrario utilizará la primer cuenta que esté en la lista.

const maker = await Maker.create({
  url: '<http://localhost:2000>',
  accounts: {
    other: {type: privateKey, key: someOtherKey},
    default: {type: privateKey, key: myKey}
  }
});

await maker.addAccount('yetAnother', {type: privateKey, key: thirdKey});

const cdp1 = await maker.openCdp(); // owned by "default"

maker.useAccount('other');
const cdp2 = await maker.openCdp(); // owned by "other"

maker.useAccount('yetAnother');
const cdp3 = await maker.openCdp(); // owned by "yetAnother"

await maker.addAccount({type: privateKey, key: fourthAccount.key}); // the name argument is optional
maker.useAccountWithAddress(fourthAccount.address);
const cdp4 = await maker.openCdp(); //owned by the fourth account

Puedes chequear la cuenta actual con currentAccount y currentAddress:

> maker.currentAccount()
{ name: 'other', type: 'privateKey', address: '0xfff...' }
> maker.currentAddress()
'0xfff...'

Tipos de Cuentas

Además del tipo de cuenta privateKey, hay otros dos tipos que se encuentran integrados:

const maker = await Maker.create({
  url: '<http://localhost:2000>',
  accounts: {
    // this will be the first account from the provider at
    // localhost:2000
    first: {type: 'provider'},

    // this will be the current account in MetaMask, and it
    // will send its transactions through MetaMask
    second: {type: 'browser'},

    // this account will send its transactions through the
    // provider at localhost:2000
    third: {type: 'privateKey', key: myPrivateKey}
  }
})

Wallets de Hardware

Los plugins pueden agregar tipos de cuenta adicionales. Actualmente hay dos plugins de este tipo para el soporte de wallet de hardware:

import TrezorPlugin from '@makerdao/dai-plugin-trezor-web';
import LedgerPlugin from '@makerdao/dai-plugin-ledger-web';

const maker = await Maker.create({
  plugins: [
    TrezorPlugin,
    LedgerPlugin,
  ],
  accounts: {
    // default derivation path is "44'/60'/0'/0/0"
    myTrezor: {type: 'trezor', path: derivationPath1},
    myLedger: {type: 'ledger', path: derivationPath2}
  }
});

Demo - "Modelo de Demostración"

Instala la aplicación de demo de múltiples cuentas para ver esta funcionalidad en acción.