UNPKG

ox

Version:

Ethereum Standard Library

87 lines 2.56 kB
import * as abitype from 'abitype'; import * as AbiItem from './AbiItem.js'; import * as AbiParameters from './AbiParameters.js'; import * as Hex from './Hex.js'; /** @internal */ export function decode(abiConstructor, options) { const { bytecode } = options; if (abiConstructor.inputs.length === 0) return undefined; const data = options.data.replace(bytecode, '0x'); return AbiParameters.decode(abiConstructor.inputs, data); } /** * ABI-encodes the provided constructor input (`inputs`). * * @example * ```ts twoslash * import { AbiConstructor } from 'ox' * * const constructor = AbiConstructor.from('constructor(address, uint256)') * * const data = AbiConstructor.encode(constructor, { * bytecode: '0x...', * args: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 123n], * }) * ``` * * @example * ### End-to-end * * Below is an end-to-end example of using `AbiConstructor.encode` to encode the constructor of a contract and deploy it. * * ```ts twoslash * import 'ox/window' * import { AbiConstructor, Hex } from 'ox' * * // 1. Instantiate the ABI Constructor. * const constructor = AbiConstructor.from( * 'constructor(address owner, uint256 amount)', * ) * * // 2. Encode the ABI Constructor. * const data = AbiConstructor.encode(constructor, { * bytecode: '0x...', * args: ['0xd8da6bf26964af9d7eed9e03e53415d37aa96045', 123n], * }) * * // 3. Deploy the contract. * const hash = await window.ethereum!.request({ * method: 'eth_sendTransaction', * params: [{ data }], * }) * ``` * * :::note * * For simplicity, the above example uses `window.ethereum.request`, but you can use any * type of JSON-RPC interface. * * ::: * * @param abiConstructor - The ABI Constructor to encode. * @param options - Encoding options. * @returns The encoded constructor. */ export function encode(abiConstructor, options) { const { bytecode, args } = options; return Hex.concat(bytecode, abiConstructor.inputs?.length && args?.length ? AbiParameters.encode(abiConstructor.inputs, args) : '0x'); } /** @internal */ export function format(abiConstructor) { return abitype.formatAbiItem(abiConstructor); } /** @internal */ export function from(abiConstructor) { return AbiItem.from(abiConstructor); } /** @internal */ export function fromAbi(abi) { const item = abi.find((item) => item.type === 'constructor'); if (!item) throw new AbiItem.NotFoundError({ name: 'constructor' }); return item; } //# sourceMappingURL=AbiConstructor.js.map