ox
Version:
Ethereum Standard Library
112 lines • 5.11 kB
JavaScript
import * as AbiParameters from '../core/AbiParameters.js';
/** Cached ABI parameters for ERC-7821 calls without `opData`. */
const callsParameters = /*#__PURE__*/ AbiParameters.from([
'struct Call { address target; uint256 value; bytes data; }',
'Call[] calls',
]);
/** Cached ABI parameters for ERC-7821 calls with `opData`. */
const callsWithOpDataParameters = /*#__PURE__*/ AbiParameters.from([
'struct Call { address target; uint256 value; bytes data; }',
'Call[] calls',
'bytes opData',
]);
/**
* 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 opData ? callsWithOpDataParameters : callsParameters;
}
/**
* 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