zksync-ethers
Version:
A Web3 library for interacting with the ZkSync Layer 2 scaling solution.
185 lines (184 loc) • 6.06 kB
TypeScript
import { TransactionBuilder, PayloadSigner } from './types';
/**
* Signs the `payload` using an ECDSA private key.
*
* @param payload The payload that needs to be signed.
* @param secret The ECDSA private key.
*
* @example Sign EIP712 transaction hash.
*
* import { EIP712Signer, types, utils } from "zksync-ethers";
*
* const PRIVATE_KEY = "<PRIVATE_KEY>";
*
* const tx: types.TransactionRequest = {
* chainId: 270,
* from: ADDRESS,
* to: "<RECEIVER>",
* value: 7_000_000_000,
* };
*
* const txHash = EIP712Signer.getSignedDigest(tx);
* const result = await utils.signPayloadWithECDSA(txHash, PRIVATE_KEY);
*
* @example Sign message hash.
*
* import { utils } from "zksync-ethers";
* import { hashMessage } from "ethers";
*
* const PRIVATE_KEY = "<PRIVATE_KEY>";
*
* const message = 'Hello World!';
* const messageHash = hashMessage(message);
*
* const result = await utils.signPayloadWithECDSA(messageHash, PRIVATE_KEY);
*
* @example Sign typed data hash.
*
* import { utils } from "zksync-ethers";
* import { TypedDataEncoder } from "ethers";
*
* const PRIVATE_KEY = "<PRIVATE_KEY>";
*
* const typedDataHash = TypedDataEncoder.hash(
* {name: 'Example', version: '1', chainId: 270},
* {
* Person: [
* {name: 'name', type: 'string'},
* {name: 'age', type: 'uint8'},
* ],
* },
* {name: 'John', age: 30}
* );
* const result = await utils.signPayloadWithECDSA(typedDataHash, PRIVATE_KEY);
*/
export declare const signPayloadWithECDSA: PayloadSigner;
/**
* Signs the `payload` using multiple ECDSA private keys.
* The signature is generated by concatenating signatures created by signing with each key individually.
* The length of the resulting signature should be `secrets.length * 65 + 2`.
*
* @param payload The payload that needs to be signed.
* @param secret The list of the ECDSA private keys.
*
* @throws {Error} If the `secret` is not an array of at least two elements.
*
* @example Sign EIP712 transaction hash.
*
* import { EIP712Signer, types, utils } from "zksync-ethers";
*
* const PRIVATE_KEY1 = "<PRIVATE_KEY1>";
* const PRIVATE_KEY2 = "<PRIVATE_KEY2>";
*
* const tx: types.TransactionRequest = {
* chainId: 270,
* from: ADDRESS,
* to: "<RECEIVER>",
* value: 7_000_000_000,
* };
*
* const txHash = EIP712Signer.getSignedDigest(tx);
* const result = await utils.signPayloadWithMultipleECDSA(typedDataHash, [PRIVATE_KEY1, PRIVATE_KEY2]);
*
* @example Sign message hash.
*
* import { utils } from "zksync-ethers";
* import { hashMessage } from "ethers";
*
* const PRIVATE_KEY1 = "<PRIVATE_KEY1>";
* const PRIVATE_KEY2 = "<PRIVATE_KEY2>";
*
* const message = 'Hello World!';
* const messageHash = hashMessage(message);
*
* const result = await utils.signPayloadWithMultipleECDSA(typedDataHash, [PRIVATE_KEY1, PRIVATE_KEY2]);
*
* @example Sign typed data hash.
*
* import { utils } from "zksync-ethers";
* import { TypedDataEncoder } from "ethers";
*
* const PRIVATE_KEY1 = "<PRIVATE_KEY1>";
* const PRIVATE_KEY2 = "<PRIVATE_KEY2>";
*
* const typedDataHash = TypedDataEncoder.hash(
* {name: 'Example', version: '1', chainId: 270},
* {
* Person: [
* {name: 'name', type: 'string'},
* {name: 'age', type: 'uint8'},
* ],
* },
* {name: 'John', age: 30}
* );
* const result = await utils.signPayloadWithMultipleECDSA(typedDataHash, [PRIVATE_KEY1, PRIVATE_KEY2]);
*/
export declare const signPayloadWithMultipleECDSA: PayloadSigner;
/**
* Populates missing properties meant for signing using an ECDSA private key:
*
* - Populates `from` using the address derived from the ECDSA private key.
* - Populates `nonce` via `provider.getTransactionCount(tx.from, "pending")`.
* - Populates `gasLimit` via `provider.estimateGas(tx)`. If `tx.from` is not EOA, the estimation is done with address
* derived from the ECDSA private key.
* - Populates `chainId` via `provider.getNetwork()`.
* - Populates `type` with `utils.EIP712_TX_TYPE`.
* - Populates `value` by converting to `bigint` if set, otherwise to `0n`.
* - Populates `data` with `0x`.
* - Populates `customData` with `{factoryDeps=[], gasPerPubdata=utils.DEFAULT_GAS_PER_PUBDATA_LIMIT}`.
*
* @param tx The transaction that needs to be populated.
* @param [secret] The ECDSA private key used for populating the transaction.
* @param [provider] The provider is used to fetch data from the network if it is required for signing.
*
* @throws {Error} Requires `provider` to be set.
*
* @example
*
* import { Provider, types, utils } from "zksync-ethers";
*
* const PRIVATE_KEY = "<PRIVATE_KEY>";
*
* const provider = Provider.getDefaultProvider(types.Network.Sepolia);
*
* const populatedTx = await utils.populateTransactionECDSA(
* {
* chainId: 270,
* to: "<RECEIVER>",
* value: 7_000_000_000,
* },
* PRIVATE_KEY,
* provider
* );
*/
export declare const populateTransactionECDSA: TransactionBuilder;
/**
* Populates missing properties meant for signing using multiple ECDSA private keys.
* It uses {@link populateTransactionECDSA}, where the address of the first ECDSA key is set as the `secret` argument.
*
* @param tx The transaction that needs to be populated.
* @param [secret] The list of the ECDSA private keys used for populating the transaction.
* @param [provider] The provider is used to fetch data from the network if it is required for signing.
*
* @throws {Error} The `secret` must be an array of at least two elements.
*
* @example
*
* import { Provider, types, utils } from "zksync-ethers";
*
* const PRIVATE_KEY1 = "<PRIVATE_KEY1>";
* const PRIVATE_KEY2 = "<PRIVATE_KEY2>";
*
* const provider = Provider.getDefaultProvider(types.Network.Sepolia);
*
* const populatedTx = await utils.populateTransactionMultisigECDSA(
* {
* chainId: 270,
* to: "<RECEIVER>",
* value: 7_000_000_000,
* },
* [PRIVATE_KEY1, PRIVATE_KEY2],
* provider
* );
*/
export declare const populateTransactionMultisigECDSA: TransactionBuilder;