UNPKG

namillum

Version:
530 lines (339 loc) 14.4 kB
# @zilliqa-js/account > Classes for managing accounts and account-related actions. ## Interfaces ```typescript export interface TxReceipt { success: boolean; cumulative_gas: number; } interface TxParams { version: number; toAddr: string; amount: BN; gasPrice: BN; gasLimit: Long; code?: string; data?: string; receipt?: TxReceipt; nonce?: number; pubKey?: string; signature?: string; } ``` When you give `nonce`, you should give `pubKey` together. ## Classes ### `Account` Class for managing an account (i.e., a private/public keypair). #### `Account(privateKey: string, nonce?: number): Account` ##### Parameters - `privateKey`: `string` - hex-encoded private key - `nonce`: `number` (optional) - the current nonce ##### Returns - `Account` - an `Account` instance. #### Members ##### `privateKey: string` ##### `publicKey: string` ##### `address: string` ##### `nonce: number` #### Static Methods ##### `static fromFile(file: string, passphrase: string): Promise<Account>` Generates an account from any JSON-encoded string that complies with the [Web3 Secret Storage definition](https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition). ###### Parameters - `file`: `string` - JSON-encoded string containing the keystore file. - `passphrase`: `string` - passphrase used to encrypt the file. ###### Returns - `Promise<Account>` - an `Account` instance, initialised with the details provided by the keystore file. #### Instance Methods ##### `toFile(passphrase: string, kdf: 'pbkdf2' |'scrypt' = 'scrypt'): Promise<Account>` Encrypts and JSON-encodes the account. Complies with the [Web3 Secret Storage definition](https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition). ###### Parameters - `passphrase`: `string` - passphrase used to encrypt the file. - `kdf`: `'pbkdf2' | 'scrypt'` - the key derivation function to use for encryption. ###### Returns - `Promise<string>` - the JSON-encoded string of the keystore file. ##### `signTransaction(bytes: Buffer): string` Signs arbitrary bytes (most often transactions) using a Schnorr signing scheme. ###### Parameters - `bytes`: `Buffer` - a `Buffer` of the `protobuf` encoded transaction bytes. ###### Returns - `string` - hex-encoded signature over the bytes, using the instance private key. ### `Wallet` Class for managing multiple accounts. #### `Wallet(provider: Provider, accounts?: Account[] = []): Wallet` ##### Parameters - `provider`: `Provider` - a Provider instance (see `@zilliqa-js/core`). Required for signing. - `accounts`: `Account[]` (optional) - an array of `Account` instances to pre-populate the wallet with. ##### Returns - `Wallet` #### Members ##### `accounts: { [address: string]: Account }` An object consisting of `address: Account` KV pairs. By default, an empty object. ##### `defaultAccount: Account` The default account used for signing transactions. By default, `undefined`. It is set to the `0`-indexed account when a `Wallet` instance is constructed. #### Instance methods ##### `create(): void` Creates a new keypair with a randomly-generated private key. The new account is accessible by address. This method mutates the `Wallet` instance. ###### Parameters None ###### Returns - `string` - address of the new account. ##### `addByPrivateKey(privateKey: string): string` Adds an `Account` to the `Wallet`. ###### Parameters - `privateKey`: `string` - hex-encoded private key. ###### Returns - `string` - the corresponing address, computer from the private key. ##### `addByKeystore(keystore: string, passphrase: string): Promise<string>` Adds an account by keystore. This method is asynchronous and returns a `Promise<string>`, in order not to block on the underlying decryption operation. ###### Parameters - `keystore`: `string` - JSON-encoded keystore file. - `passphrase`: `string` - the passphrase used to encode the keystore file. ###### Returns - `Promise<string>` - the corresponding address. ##### `addByMnemonic(phrase: string, index: number = 0): string` Adds an `Account` by use of a mnemonic as specified in BIP-32 and BIP-39 ###### Parameters - `phrase`: `string` - the 12-word mnemonic to use. - `index`: `number` (Optional) - the index of the child key. ###### Returns - `string` - the corresponding address. ##### `export(address: string, passphrase, string, kdf: 'pbkdf2' | 'scrypt'): Promise<string>` - Exports an `Account` to a keystore file, encrypted with a passphrase. ###### Parameters - `address`: `string` - the address of the selected account. - `passphrase`: `string` - the passphrase to encrypt the `Account` with. - `kdf`: `'pbkdf2' | 'scrypt'` - key derivation function. ###### Returns - `Promise<string>` - the JSON-encoded keystore file. ##### `remove(address: string): boolean` - Exports an `Account` to a keystore file, encrypted with a passphrase. ###### Parameters - `address`: `string` - the address of the account to remove. ###### Returns - `boolean` - whether the `Account` was successfully removed. ##### `setDefault(address: string): void` Sets the default account to sign with. ###### Parameters - `address`: `string` - the address of the account to set as default. ###### Returns - `void` ##### `sign(transaction: Transaction, offlineSign?: boolean): Promise<Transaction>` Sign a `Transaction` with the default `Account`. This method is asynchronous as it will attempt to obtain the `nonce` from the `Provider`. There is an offline mode that can be activated manually by setting the optional `offlineSign` parameter. ###### Parameters - `transaction`: `Transaction` - a `Transaction` instance. - `offlineSign`: `boolean` (optional) - toggles offline signing on/off. Defaults to `false` if the field is not set. If explicitly set to `true`, offline mode is used and does not require internet connection to sign a transaction. ###### Note\*\*: In offline mode, the nonce must be explicitly set in the Transacti object. ###### Returns - `Promise<Transaction>` - a signed transaction. ##### `signWith(transaction: Transaction, address: string, offlineSign?: boolean): Promise<Transaction>` Sign a `Transaction` with the chosen `Account`. This method is asynchronous as it will attempt to obtain the `nonce` from the `Provider`. There is an offline mode that can be activated manually by setting the optional `offlineSign` parameter. ###### Parameters - `transaction`: `Transaction` - a `Transaction` instance. - `address`: `string` - the address of the `Account` to be used for signing. - `offlineSign`: `boolean` (optional) - toggles offline signing on/off. Defaults to `false` if the field is not set. If explicitly set to `true`, offline mode is used and does not require internet connection to sign a transaction. ###### Note\*\*: In offline mode, the nonce must be explicitly set in the Transacti object. ###### Returns - `Promise<Transaction>` - a signed transaction. ##### `signBatch(txList: Transaction[]): Promise<Transaction[]>` Sign a list of `Transaction` with the default `Account`. This method is asynchronous as it will attempt to obtain the `nonce` from the `Provider`. ###### Parameters - `txList`: `Transaction[]` - a list of `Transaction` instances. ###### Returns - `Promise<Transaction[]>` - a list of signed transactions. ###### Example ```js // zilliqa, wallet obj declaration omitted for clarity let txList = []; for (let i = 0; i < 2; i++) { // create a new transaction object const tx = zilliqa.transactions.new( { version: VERSION, toAddr: "0xA54E49719267E8312510D7b78598ceF16ff127CE", amount: new BN(units.toQa("1", units.Units.Zil)), gasPrice: units.toQa("2000", units.Units.Li), gasLimit: Long.fromNumber(1), }, false ); txList.push(tx); } // sign the batch transactions sequentially const batchResult = await zilliqa.wallet.signBatch(txList); for (const signedTx of batchResult) { // nonce must be different console.log("The signed transaction nonce is: %o", signedTx.nonce); console.log("The signed transaction signature is: %o\n", signedTx.signature); } ``` ### `Transaction` A class that represents a single `Transaction` on the Zilliqa network. It is a functor. Its purpose is to encode the possible states a Transaction can be in: Confirmed, Rejected, Pending, or Initialised (i.e., not broadcasted). #### Members ##### `bytes: Buffer` A getter `protobuf` that returns a `Buffer` of `protobuf`-encoded bytes. This is a convenience member that allows a `Transaction` to be signed easily. ##### `senderAddress: string` A getter than computes the address of the `Transaction` sender. If there is no sender public key set, returns `0x00000000000000000000000000000000000000000000`. ##### `txParams: TxParams` A getter that returns the current `TxParams`. #### Static Methods ##### `static confirm(params: TxParams, provider: Provider): Transaction` Instantiates a `Transaction` in `Confirmed` state. ###### Parameters - `params`: `TxParams` - core fields to initialise the `Transaction` with. - `provider`: `Provider` - a `Provider` instance. ###### Returns - `Transaction` - the newly-Instantiated `Transaction`. ###### Example ```typescript import { HTTPProvider } from "@zilliqa-js/core"; import { Transaction } from "@zilliqa-js/account"; const txParams = { version: 0, toAddr: "20_byte_hex_string", amount: new BN(8), gasPrice: new BN(100), gasLimit: Long.fromNumber(888), }; const tx = Transaction.confirm(txParams, new HTTPProvider("http://my-api.com")); expect(tx.isConfirmed()).toBeTruthy(); ``` ##### `static reject(params: TxParams, provider: Provider): Transaction` Instantiates a `Transaction` in `Rejected` state. ###### Parameters - `params`: `TxParams` - core fields to initialise the `Transaction` with. - `provider`: `Provider` - a `Provider` instance. ###### Returns - `Transaction` - the newly-Instantiated `Transaction`. ###### Example ```typescript import { HTTPProvider } from "@zilliqa-js/core"; import { Transaction } from "@zilliqa-js/account"; const txParams = { version: 0, toAddr: "20_byte_hex_string", amount: new BN(8), gasPrice: new BN(100), gasLimit: Long.fromNumber(888), }; const tx = Transaction.reject(txParams, new HTTPProvider("http://my-api.com")); expect(tx.isRejected()).toBeTruthy(); ``` #### Instance Methods ##### `confirm(txHash: string, maxAttempts: number = 33, interval: number = 1000): Promise<Transaction>` Checks whether the `Transaction` is confirmed on the blockchain, by verifying the its `receipt` status (`boolean`). This method uses an exponential backoff to poll the lookup node. By default, the number of attempts made is 33, with a starting interval of 1000ms. ###### Parameters - `txHash`: `string` - the transaction hash to use for polling. - `maxAttempts`: `number = 33` (Optional) - the maximum number of attempts before setting status as `Rejected`. - `interval`: `number = 1000` (Optional) - the initial interval. This grows exponentially between attempts. ###### Returns - `Promise<Transaction>` - `Transaction` with its status confirmed onchain. ###### Example ```typescript import { HTTPProvider } from '@zilliqa-js/core'; import { Transaction } from '@zilliqa-js/account'; // hash can be obtained from CreateTransaction const my_hash = 'some_known_tx_hash'; conts tx = new Transaction(params, new HTTPProvider('http://my-api.com')); tx.confirm(some_hash) .map((tx) => // do something) .catch((err) => // handle the error); ``` ##### `blockConfirm(txHash: string, maxblockCount: number = 4, interval: number = 1000): Promise<Transaction>` Checks whether the `Transaction` is confirmed on the blockchain, by verifying the its `receipt` status (`boolean`). This method uses latest blockNumber to get the transaction receipt, which is more frendily to remote lookup node. By default, the number of blockCount is 4, with a starting interval of 1000ms. The member `Transaction.blockConfirmation` will count the block numbers during the process. ###### Parameters - `txHash`: `string` - the transaction hash to use for polling. - `maxblockCount`: `number = 4` (Optional) - the maximum number of block count before setting status as `Rejected`. - `interval`: `number = 1000` (Optional) - the initial interval. This grows exponentially between attempts. ###### Returns - `Promise<Transaction>` - `Transaction` with its status confirmed onchain. ###### Example ```typescript import { HTTPProvider } from '@zilliqa-js/core'; import { Transaction } from '@zilliqa-js/account'; // hash can be obtained from CreateTransaction const my_hash = 'some_known_tx_hash'; conts tx = new Transaction(params, new HTTPProvider('http://my-api.com')); tx.blockConfirm(some_hash) .map((tx) => // do something) .catch((err) => // handle the error); ``` ##### `map(txHash): Transaction` Maps over the transaction, taking a callback that accepts `TxParams`. The user may freely mutate the Transaction, and will receive the newly-mutated transaction. The object returned is merged into the target `Transaction`. ###### Parameters - `fn`: `(prev: TxParams) => TxParams)` - the transaction hash to use for polling. exponentially between attempts. ###### Returns - `Transaction`. ###### Example ```typescript import { HTTPProvider } from '@zilliqa-js/core'; import { Transaction } from '@zilliqa-js/account'; // hash can be obtained from CreateTransaction const my_hash = 'some_known_tx_hash'; let tx = new Transaction(params, new HTTPProvider('http://my-api.com')); async () => { try { tx = await tx.confirm(some_hash); if (tx.isConfirmed()) { .map((tx) => { // do something, but must always return `TxParams`. // generally, you should avoid performing side effects in `map`. return tx }); } } catch (err) { // handle this error somehow } }(); ``` ### Functions #### `encodeTransactionProto(tx: TxParams): Buffer` Encodes a transaction with `protobuf` and returns its bytes as a Buffer. Used for providing a payload to `signTransaction`. ##### Parameters - `tx`: `TxParams` - plain object containing core transaction fields that must be used when generating a signature. ##### Returns - `Buffer` - the bytes of the `protobuf`-serialised transaction fields.