namillum
Version:
Bubble Protocol SDK
530 lines (339 loc) • 14.4 kB
Markdown
# @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.