UNPKG

ox

Version:

Ethereum Standard Library

101 lines 4.75 kB
import * as AbiParameters from '../core/AbiParameters.js'; /** * Encodes a set of ERC-7821 calls. * * @example * ```ts twoslash * import { Calls } from 'ox/erc7821' * * const calls = Calls.encode([ * { * data: '0xdeadbeef', * to: '0xcafebabecafebabecafebabecafebabecafebabe', * value: 1n, * }, * { * data: '0xcafebabe', * to: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', * value: 2n, * }, * ]) * // @log: '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000cafebabecafebabecafebabecafebabecafebabe0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000deadbeef000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cafebabe' * ``` * * @param calls - Calls to encode. * @param options - Options for the encoding. * @returns The encoded calls. */ export function encode(calls, options = {}) { const { opData } = options; return AbiParameters.encode(getAbiParameters({ opData: !!opData }), [ calls.map((call) => ({ target: call.to, value: call.value ?? 0n, data: call.data ?? '0x', })), ...(opData ? [opData] : []), ]); } /** * Gets the ABI parameters for the ERC-7821 calls. * * @example * ```ts twoslash * import { Calls } from 'ox/erc7821' * * const abiParameters = Calls.getAbiParameters({ opData: true }) * ``` * * @param options - Options. * @returns The ABI parameters. */ export function getAbiParameters(options = {}) { const { opData } = options; return AbiParameters.from([ 'struct Call { address target; uint256 value; bytes data; }', 'Call[] calls', ...(opData ? ['bytes opData'] : []), ]); } /** * Decodes a set of ERC-7821 calls from encoded data. * * @example * ```ts twoslash * import { Calls } from 'ox/erc7821' * * const data = Calls.decode('0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000cafebabecafebabecafebabecafebabecafebabe000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004deadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004cafebabe00000000000000000000000000000000000000000000000000000000') * // @log: { * // @log: calls: [ * // @log: { * // @log: data: '0xdeadbeef', * // @log: to: '0xcafebabecafebabecafebabecafebabecafebabe', * // @log: value: 1n, * // @log: }, * // @log: { * // @log: data: '0xcafebabe', * // @log: to: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', * // @log: value: 2n, * // @log: }, * // @log: ] * // @log: } * ``` * * @param data - The encoded calls data. * @param options - Options for decoding. * @returns The decoded calls and optional opData. */ export function decode(data, options = {}) { const { opData: withOpData = false } = options; const decoded = AbiParameters.decode(getAbiParameters({ opData: withOpData }), data); const [encodedCalls, opData] = decoded; const calls = encodedCalls.map((call) => ({ to: call.target, value: call.value, data: call.data, })); return withOpData ? { calls, opData: opData === '0x' ? undefined : opData } : { calls }; } //# sourceMappingURL=Calls.js.map