UNPKG

ox

Version:

Ethereum Standard Library

1,547 lines (1,430 loc) 59.5 kB
import { Abi, AbiEvent, Hex } from 'ox' import { describe, expect, test } from 'vp/test' import { wagmiContractConfig } from '../../../test/constants/abis.js' import { address } from '../../../test/constants/addresses.js' import { anvilMainnet } from '../../../test/prool.js' describe('assertArgs', () => { test('default', () => { const abiEvent = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 value)', ) const args = AbiEvent.decode(abiEvent, { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], }) AbiEvent.assertArgs(abiEvent, args, { from: '0xa5cc3c03994db5b0d9a5eedd10cabab0813678ac', to: '0xa5cc3c03994db5b0d9a5eedd10cabab0813678ac', value: 1n, }) }) test('default', () => { const abiEvent = AbiEvent.from( 'event Transfer(address indexed, address indexed, uint256)', ) const args = AbiEvent.decode(abiEvent, { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], }) AbiEvent.assertArgs(abiEvent, args, [ '0xa5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0xa5cc3c03994db5b0d9a5eedd10cabab0813678ac', 1n, ]) }) test('error: args mismatch, named', () => { const abiEvent = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 value)', ) const args = AbiEvent.decode(abiEvent, { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ad', ], }) expect(() => AbiEvent.assertArgs(abiEvent, args, { from: '0xa5cc3c03994db5b0d9a5eedd10cabab0813678ad', to: '0xa5cc3c03994db5b0d9a5eedd10cabab0813678ac', value: 1n, }), ).toThrowErrorMatchingInlineSnapshot(` [AbiEvent.ArgsMismatchError: Given arguments do not match the expected arguments. Event: event Transfer(address indexed from, address indexed to, uint256 value) Expected Arguments: from: 0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC to: 0xa5Cc3C03994DB5B0d9a5EEdD10CaBab0813678ad value: 1 Given Arguments: from: 0xa5cc3c03994db5b0d9a5eedd10cabab0813678ad to: 0xa5cc3c03994db5b0d9a5eedd10cabab0813678ac value: 1] `) }) test('error: args mismatch, unnamed', () => { const abiEvent = AbiEvent.from( 'event Transfer(address indexed, address indexed, uint256)', ) const args = AbiEvent.decode(abiEvent, { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], }) expect(() => AbiEvent.assertArgs(abiEvent, args, [ '0xa5cc3c03994db5b0d9a5eedd10cabab0813678ad', ]), ).toThrowErrorMatchingInlineSnapshot(` [AbiEvent.ArgsMismatchError: Given arguments do not match the expected arguments. Event: event Transfer(address indexed, address indexed, uint256) Expected Arguments: 0: 0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC 1: 0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC 2: 1 Given Arguments: 0: 0xa5cc3c03994db5b0d9a5eedd10cabab0813678ad] `) }) test('error: args mismatch, string', () => { const abiEvent = AbiEvent.from('event Transfer(string indexed a)') const args = AbiEvent.decode(abiEvent, { topics: [ '0x7cebee4ee226a36ff8751d9d69bb8265f5138c825f8c25d7ebdd60d972ffe5be', '0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8', ], }) expect(() => AbiEvent.assertArgs(abiEvent, args, { a: '0xdeadbeef', }), ).toThrowErrorMatchingInlineSnapshot(` [AbiEvent.ArgsMismatchError: Given arguments do not match the expected arguments. Event: event Transfer(string indexed a) Expected Arguments: a: 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8 Given Arguments: a: 0xdeadbeef] `) }) test('error: input not found, named', () => { const abiEvent = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 value)', ) const args = AbiEvent.decode(abiEvent, { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], }) expect(() => AbiEvent.assertArgs(abiEvent, args, { // @ts-expect-error a: 'b', from: '0xa5cc3c03994db5b0d9a5eedd10cabab0813678ad', to: '0xa5cc3c03994db5b0d9a5eedd10cabab0813678ac', value: 1n, }), ).toThrowErrorMatchingInlineSnapshot( `[AbiEvent.InputNotFoundError: Parameter "a" not found on \`event Transfer(address indexed from, address indexed to, uint256 value)\`.]`, ) }) test('error: input not found, unnamed', () => { const abiEvent = AbiEvent.from( 'event Transfer(address indexed, address indexed, uint256)', ) const args = AbiEvent.decode(abiEvent, { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], }) expect(() => // @ts-expect-error AbiEvent.assertArgs(abiEvent, args, [ '0xa5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0xa5cc3c03994db5b0d9a5eedd10cabab0813678ac', 1n, 1n, ]), ).toThrowErrorMatchingInlineSnapshot( `[AbiEvent.InputNotFoundError: Parameter "3" not found on \`event Transfer(address indexed, address indexed, uint256)\`.]`, ) }) test('error: provided args, but no actual event args', () => { const abiEvent = AbiEvent.from('event Transfer()') const args = AbiEvent.decode(abiEvent, { topics: [ '0x406dade31f7ae4b5dbc276258c28dde5ae6d5c2773c5745802c493a2360e55e0', ], }) expect(() => // @ts-expect-error AbiEvent.assertArgs(abiEvent, args, { from: '0xa5cc3c03994db5b0d9a5eedd10cabab0813678az', to: '0xa5cc3c03994db5b0d9a5eedd10cabab0813678ac', value: 1n, }), ).toThrowErrorMatchingInlineSnapshot(` [AbiEvent.ArgsMismatchError: Given arguments do not match the expected arguments. Event: event Transfer() Expected Arguments: None Given Arguments: from: 0xa5cc3c03994db5b0d9a5eedd10cabab0813678az to: 0xa5cc3c03994db5b0d9a5eedd10cabab0813678ac value: 1] `) }) }) describe('decode', () => { test('behavior: named', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 value)', ) const decoded = AbiEvent.decode(transfer, { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], }) expect(decoded).toMatchInlineSnapshot(` { "from": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "to": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "value": 1n, } `) }) test('behavior: unnamed', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed, address indexed, uint256)', ) const decoded = AbiEvent.decode(transfer, { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], }) expect(decoded).toMatchInlineSnapshot(` [ "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", 1n, ] `) }) test('behavior: named + unnamed', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256)', ) const decoded = AbiEvent.decode(transfer, { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], }) expect(decoded).toMatchInlineSnapshot(` { "2": 1n, "from": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "to": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", } `) }) test('behavior: named + unnamed', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed, uint256 value)', ) const decoded = AbiEvent.decode(transfer, { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], }) expect(decoded).toMatchInlineSnapshot(` { "1": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "from": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "value": 1n, } `) }) test('behavior: named + unnamed', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed, uint256 value, uint256)', ) const decoded = AbiEvent.decode(transfer, { data: '0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001', topics: [ '0x9ed053bb818ff08b8353cd46f78db1f0799f31c9e4458fdb425c10eccd2efc44', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], }) expect(decoded).toMatchInlineSnapshot(` { "1": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "3": 1n, "from": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "value": 1n, } `) }) test('behavior: string inputs', () => { const transfer = AbiEvent.from('event Transfer(string indexed a)') const decoded = AbiEvent.decode(transfer, { topics: [ '0x7cebee4ee226a36ff8751d9d69bb8265f5138c825f8c25d7ebdd60d972ffe5be', '0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8', ], }) expect(decoded).toMatchInlineSnapshot(` { "a": "0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8", } `) }) test('error: topics mismatch, named', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address to, uint256 indexed value)', ) expect(() => AbiEvent.decode(transfer, { topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], }), ).toThrowErrorMatchingInlineSnapshot( `[AbiEvent.TopicsMismatchError: Expected a topic for indexed event parameter "value" for "event Transfer(address indexed from, address to, uint256 indexed value)".]`, ) }) test('error: topics mismatch, unnamed', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed, address, uint256 indexed)', ) expect(() => AbiEvent.decode(transfer, { topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], }), ).toThrowErrorMatchingInlineSnapshot( `[AbiEvent.TopicsMismatchError: Expected a topic for indexed event parameter for "event Transfer(address indexed, address, uint256 indexed)".]`, ) }) test('error: data mismatch', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address to, uint256 value)', ) expect(() => AbiEvent.decode(transfer, { data: '0x0000000000000000000000000000000000000000000000000000000023c34600', topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266', '0x00000000000000000000000070e8a65d014918798ba424110d5df658cde1cc58', ], }), ).toThrowErrorMatchingInlineSnapshot( ` [AbiEvent.DataMismatchError: Data size of 32 bytes is too small for non-indexed event parameters. Non-indexed Parameters: (address to, uint256 value) Data: 0x0000000000000000000000000000000000000000000000000000000023c34600 (32 bytes)] `, ) }) test('error: data mismatch', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address to, uint256 value)', ) expect(() => AbiEvent.decode(transfer, { topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266', '0x00000000000000000000000070e8a65d014918798ba424110d5df658cde1cc58', ], }), ).toThrowErrorMatchingInlineSnapshot( ` [AbiEvent.DataMismatchError: Data size of 0 bytes is too small for non-indexed event parameters. Non-indexed Parameters: (address to, uint256 value) Data: 0x (0 bytes)] `, ) }) test('error: invalid data size', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 value)', ) expect(() => AbiEvent.decode(transfer, { data: '0x01', topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045', '0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266', ], }), ).toThrowErrorMatchingInlineSnapshot( ` [AbiEvent.DataMismatchError: Data size of 1 bytes is too small for non-indexed event parameters. Non-indexed Parameters: (uint256 value) Data: 0x01 (1 bytes)] `, ) }) test('error: invalid boolean', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, bool sender)', ) expect(() => AbiEvent.decode(transfer, { data: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', topics: [ '0x3da3cd3cf420c78f8981e7afeefa0eab1f0de0eb56e78ad9ba918ed01c0b402f', '0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045', '0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266', ], }), ).toThrowErrorMatchingInlineSnapshot( ` [Bytes.InvalidBytesBooleanError: Bytes value \`221,242,82,173,27,226,200,155,105,194,176,104,252,55,141,170,149,43,167,241,99,196,161,22,40,245,90,77,245,35,179,239\` is not a valid boolean. The bytes array must contain a single byte of either a \`0\` or \`1\` value.] `, ) }) test('error: event selector topic mismatch', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, bool sender)', ) expect(() => AbiEvent.decode(transfer, { topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045', '0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266', ], }), ).toThrowErrorMatchingInlineSnapshot( ` [AbiEvent.SelectorTopicMismatchError: topics[0]="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" does not match the expected topics[0]="0x3da3cd3cf420c78f8981e7afeefa0eab1f0de0eb56e78ad9ba918ed01c0b402f". Event: event Transfer(address indexed from, address indexed to, bool sender) Selector: 0x3da3cd3cf420c78f8981e7afeefa0eab1f0de0eb56e78ad9ba918ed01c0b402f] `, ) }) test('behavior: overload with abi', () => { const abi = Abi.from([ 'event Transfer(address indexed from, address indexed to, uint256 value)', ]) const log = { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], } as const // Test both overload patterns const abiEvent = AbiEvent.fromAbi(abi, 'Transfer') const decoded1 = AbiEvent.decode(abiEvent, log) const decoded2 = AbiEvent.decode(abi, 'Transfer', log) expect(decoded1).toEqual(decoded2) expect(decoded2).toMatchInlineSnapshot(` { "from": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "to": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "value": 1n, } `) }) test('behavior: overload with hex selector', () => { const abi = Abi.from([ 'event Transfer(address indexed from, address indexed to, uint256 value)', ]) const log = { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], } as const // Test with hex selector const decoded = AbiEvent.decode( abi, '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', log, ) expect(decoded).toMatchInlineSnapshot(` { "from": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "to": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "value": 1n, } `) }) test('behavior: anonymous event', () => { const abiEvent = AbiEvent.from({ type: 'event', name: 'Transfer', anonymous: true, inputs: [ { name: 'from', type: 'address', indexed: true }, { name: 'to', type: 'address', indexed: true }, { name: 'value', type: 'uint256', indexed: false }, ], }) const decoded = AbiEvent.decode(abiEvent, { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ad', ], }) expect(decoded).toMatchInlineSnapshot(` { "from": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "to": "0xa5Cc3C03994DB5B0d9a5EEdD10CaBab0813678ad", "value": 1n, } `) }) }) describe('decodeLog', () => { test('behavior: decodes event from selector topic', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 value)', ) const decoded = AbiEvent.decodeLog([transfer], { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ AbiEvent.getSelector(transfer), '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], }) expect(decoded).toMatchInlineSnapshot(` { "args": { "from": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "to": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "value": 1n, }, "event": { "hash": "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "inputs": [ { "indexed": true, "name": "from", "type": "address", }, { "indexed": true, "name": "to", "type": "address", }, { "name": "value", "type": "uint256", }, ], "name": "Transfer", "type": "event", }, } `) }) test('error: selector topic not found', () => { const transfer = AbiEvent.from('event Transfer(address indexed from)') expect(() => AbiEvent.decodeLog([transfer], { data: '0x', topics: [] })) .toThrowErrorMatchingInlineSnapshot(` [AbiEvent.SelectorTopicNotFoundError: Selector topic not found.] `) }) }) describe('extractLogs', () => { test('behavior: decodes matching logs', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 value)', ) const log = { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ AbiEvent.getSelector(transfer), '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], } as const const decoded = AbiEvent.extractLogs([transfer], [log]) expect(decoded).toMatchInlineSnapshot(` [ { "args": { "from": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "to": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "value": 1n, }, "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "eventName": "Transfer", "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac", "0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac", ], }, ] `) }) test('behavior: skips non-matching logs in strict mode', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 value)', ) const approval = AbiEvent.from( 'event Approval(address indexed owner, address indexed spender, uint256 value)', ) const decoded = AbiEvent.extractLogs( [transfer], [ { data: '0x', topics: [AbiEvent.getSelector(approval)], }, { data: '0x', topics: [], }, ], ) expect(decoded).toMatchInlineSnapshot(`[]`) }) test('behavior: filters by event name', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 value)', ) const approval = AbiEvent.from( 'event Approval(address indexed owner, address indexed spender, uint256 value)', ) const decoded = AbiEvent.extractLogs( [transfer, approval], [ { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ AbiEvent.getSelector(transfer), '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ad', ], }, { data: '0x0000000000000000000000000000000000000000000000000000000000000002', topics: [ AbiEvent.getSelector(approval), '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ad', ], }, ], { eventName: 'Approval' }, ) expect(decoded).toMatchInlineSnapshot(` [ { "args": { "owner": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "spender": "0xa5Cc3C03994DB5B0d9a5EEdD10CaBab0813678ad", "value": 2n, }, "data": "0x0000000000000000000000000000000000000000000000000000000000000002", "eventName": "Approval", "topics": [ "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", "0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac", "0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ad", ], }, ] `) }) test('behavior: filters by arguments', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 value)', ) const decoded = AbiEvent.extractLogs( [transfer], [ { data: '0x0000000000000000000000000000000000000000000000000000000000000001', topics: [ AbiEvent.getSelector(transfer), '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ad', ], }, { data: '0x0000000000000000000000000000000000000000000000000000000000000002', topics: [ AbiEvent.getSelector(transfer), '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ad', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], }, ], { args: { from: '0xa5CC3c03994Db5b0D9a5eeDd10CaBaB0813678Ac', }, }, ) expect(decoded).toMatchInlineSnapshot(` [ { "args": { "from": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "to": "0xa5Cc3C03994DB5B0d9a5EEdD10CaBab0813678ad", "value": 1n, }, "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "eventName": "Transfer", "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac", "0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ad", ], }, ] `) }) test('behavior: tries ABI events with matching selectors', () => { const erc20Transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 value)', ) const erc721Transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)', ) const decoded = AbiEvent.extractLogs( [erc20Transfer, erc721Transfer], [ { data: '0x', topics: [ AbiEvent.getSelector(erc721Transfer), '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ad', '0x0000000000000000000000000000000000000000000000000000000000000001', ], }, ], ) expect(decoded).toMatchInlineSnapshot(` [ { "args": { "from": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "to": "0xa5Cc3C03994DB5B0d9a5EEdD10CaBab0813678ad", "tokenId": 1n, }, "data": "0x", "eventName": "Transfer", "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac", "0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ad", "0x0000000000000000000000000000000000000000000000000000000000000001", ], }, ] `) }) test('behavior: non-strict mode decodes missing indexed topics from data', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 value)', ) const decoded = AbiEvent.extractLogs( [transfer], [ { data: '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ad0000000000000000000000000000000000000000000000000000000000000001', topics: [ AbiEvent.getSelector(transfer), '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', ], }, ], { strict: false }, ) expect(decoded).toMatchInlineSnapshot(` [ { "args": { "from": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "to": "0xa5Cc3C03994DB5B0d9a5EEdD10CaBab0813678ad", "value": 1n, }, "data": "0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ad0000000000000000000000000000000000000000000000000000000000000001", "eventName": "Transfer", "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac", ], }, ] `) }) test('behavior: non-strict mode returns partial logs when decoding fails', () => { const transfer = AbiEvent.from('event Transfer(address indexed from)') const decoded = AbiEvent.extractLogs( [transfer], [ { data: '0x', topics: [AbiEvent.getSelector(transfer), '0xdead'], }, ], { strict: false }, ) expect(decoded).toMatchInlineSnapshot(` [ { "args": {}, "data": "0x", "eventName": "Transfer", "topics": [ "0x2d339b1e3334d3f43e7aa6d5b1fa3ca5e4228b2dd547d1710c726019d98e53fa", "0xdead", ], }, ] `) }) test('behavior: formats RPC logs', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 value)', ) const decoded = AbiEvent.extractLogs( [transfer], [ { address: '0xfba3912ca04dd458c843e2ee08967fc04f3579c2', blockHash: '0xabe69134e80a12f6a93d0aa18215b5b86c2fb338bae911790ca374a8716e01a4', blockNumber: '0x12d846c', data: '0x0000000000000000000000000000000000000000000000000000000000000001', logIndex: '0x10f', removed: false, topics: [ AbiEvent.getSelector(transfer), '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac', '0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ad', ], transactionHash: '0xcfa52db0bc2cb5bdcb2c5bd8816df7a2f018a0e3964ab1ef4d794cf327966e93', transactionIndex: '0x91', }, ], ) expect(decoded).toMatchInlineSnapshot(` [ { "address": "0xfba3912ca04dd458c843e2ee08967fc04f3579c2", "args": { "from": "0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC", "to": "0xa5Cc3C03994DB5B0d9a5EEdD10CaBab0813678ad", "value": 1n, }, "blockHash": "0xabe69134e80a12f6a93d0aa18215b5b86c2fb338bae911790ca374a8716e01a4", "blockNumber": 19760236n, "blockTimestamp": undefined, "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "eventName": "Transfer", "logIndex": 271, "removed": false, "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac", "0x000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ad", ], "transactionHash": "0xcfa52db0bc2cb5bdcb2c5bd8816df7a2f018a0e3964ab1ef4d794cf327966e93", "transactionIndex": 145, }, ] `) }) }) describe('encode', () => { test('default', () => { const transfer = AbiEvent.from('event Transfer()') expect(AbiEvent.encode(transfer)).toMatchInlineSnapshot(` { "topics": [ "0x406dade31f7ae4b5dbc276258c28dde5ae6d5c2773c5745802c493a2360e55e0", ], } `) }) test('behavior: no hash', () => { const transfer = AbiEvent.from('event Transfer()') expect(AbiEvent.encode({ ...transfer, hash: undefined })) .toMatchInlineSnapshot(` { "topics": [ "0x406dade31f7ae4b5dbc276258c28dde5ae6d5c2773c5745802c493a2360e55e0", ], } `) }) test('behavior: multiple inputs, no args', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed a, address indexed b, uint256 c)', ) expect(AbiEvent.encode(transfer)).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", ], } `) }) test('behavior: multiple inputs, with args, named', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed a, address indexed b, uint256 c)', ) expect( AbiEvent.encode(transfer, { a: '0x0000000000000000000000000000000000000000', }), ).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x0000000000000000000000000000000000000000000000000000000000000000", null, ], } `) expect( AbiEvent.encode(transfer, { b: '0x0000000000000000000000000000000000000000', }), ).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", null, "0x0000000000000000000000000000000000000000000000000000000000000000", ], } `) expect( AbiEvent.encode(transfer, { a: '0x0000000000000000000000000000000000000000', b: '0x0000000000000000000000000000000000000000', }), ).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", ], } `) expect( AbiEvent.encode(transfer, { a: null, b: '0x0000000000000000000000000000000000000000', }), ).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", null, "0x0000000000000000000000000000000000000000000000000000000000000000", ], } `) expect( AbiEvent.encode(transfer, { a: ['0x0000000000000000000000000000000000000000', address.vitalik], b: '0x0000000000000000000000000000000000000000', }), ).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", [ "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045", ], "0x0000000000000000000000000000000000000000000000000000000000000000", ], } `) }) test('behavior: multiple inputs, with args, unnamed', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed, address indexed, uint256 )', ) expect( AbiEvent.encode(transfer, ['0x0000000000000000000000000000000000000000']), ).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x0000000000000000000000000000000000000000000000000000000000000000", null, ], } `) expect( AbiEvent.encode(transfer, [ null, '0x0000000000000000000000000000000000000000', ]), ).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", null, "0x0000000000000000000000000000000000000000000000000000000000000000", ], } `) expect( AbiEvent.encode(transfer, [ '0x0000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000', ]), ).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", ], } `) expect( AbiEvent.encode(transfer, [ ['0x0000000000000000000000000000000000000000', address.vitalik], '0x0000000000000000000000000000000000000000', ]), ).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", [ "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045", ], "0x0000000000000000000000000000000000000000000000000000000000000000", ], } `) }) test('behavior: multiple inputs, with args, partially named', () => { const transfer = AbiEvent.from( 'event Transfer(address indexed a, address indexed, uint256 c)', ) expect( AbiEvent.encode(transfer, { a: '0x0000000000000000000000000000000000000000', }), ).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x0000000000000000000000000000000000000000000000000000000000000000", null, ], } `) expect( AbiEvent.encode(transfer, { 1: '0x0000000000000000000000000000000000000000', }), ).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", null, "0x0000000000000000000000000000000000000000000000000000000000000000", ], } `) expect( AbiEvent.encode(transfer, { a: '0x0000000000000000000000000000000000000000', 1: '0x0000000000000000000000000000000000000000', }), ).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", ], } `) expect( AbiEvent.encode(transfer, { a: null, 1: '0x0000000000000000000000000000000000000000', }), ).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", null, "0x0000000000000000000000000000000000000000000000000000000000000000", ], } `) expect( AbiEvent.encode(transfer, { a: ['0x0000000000000000000000000000000000000000', address.vitalik], 1: '0x0000000000000000000000000000000000000000', }), ).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", [ "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045", ], "0x0000000000000000000000000000000000000000000000000000000000000000", ], } `) }) test('behavior: string inputs', () => { const transfer = AbiEvent.from('event Transfer(string indexed a, string b)') expect( AbiEvent.encode(transfer, { a: 'hello', }), ).toMatchInlineSnapshot(` { "topics": [ "0x89525573e05dbc5f7f7f72e98f8145459e8b183e54c819fa7029f09a04115d89", "0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8", ], } `) }) test('behavior: leading non-indexed inputs', () => { const transfer = AbiEvent.from( 'event Transfer(uint256 a, string indexed b)', ) expect( AbiEvent.encode(transfer, { b: 'hello', }), ).toMatchInlineSnapshot(` { "topics": [ "0x9060fea662832699cca863409e283b48eb088414dc780c4d43afe69caefee4b5", "0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8", ], } `) }) test('behavior: network', async () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 indexed value)', ) const { topics } = AbiEvent.encode(transfer) const logs = await anvilMainnet.request({ method: 'eth_getLogs', params: [ { address: '0xfba3912ca04dd458c843e2ee08967fc04f3579c2', fromBlock: Hex.fromNumber(19760235n), toBlock: Hex.fromNumber(19760240n), topics, }, ], }) expect(AbiEvent.decode(transfer, logs[0]!)).toMatchInlineSnapshot(` { "from": "0x0000000000000000000000000000000000000000", "to": "0x0C04D9e9278EC5e4D424476D3Ebec70Cb5d648D1", "value": 603n, } `) }) test('error: tuple input', () => { const transfer = AbiEvent.from( 'event Transfer((string) indexed a, string b)', ) expect(() => AbiEvent.encode(transfer, { a: ['hello'], }), ).toThrowErrorMatchingInlineSnapshot( `[AbiEvent.FilterTypeNotSupportedError: Filter type "tuple" is not supported.]`, ) }) test('error: array input', () => { const transfer = AbiEvent.from( 'event Transfer(uint256[] indexed a, string b)', ) expect(() => AbiEvent.encode(transfer, { a: [1n], }), ).toThrowErrorMatchingInlineSnapshot( `[AbiEvent.FilterTypeNotSupportedError: Filter type "uint256[]" is not supported.]`, ) }) test('behavior: network', async () => { const transfer = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 value)', ) const { topics } = AbiEvent.encode(transfer) const logs = await anvilMainnet.request({ method: 'eth_getLogs', params: [{ topics }], }) expect(AbiEvent.decode(transfer, logs[0]!)).toMatchInlineSnapshot(` { "from": "0x634cf119d1964b88a426E1E782Bd09f37b51d949", "to": "0xB77c2290C5e5ACD8Ca4778876b3CAaE593741BAB", "value": 714357880932609n, } `) }) test('https://github.com/wevm/viem/issues/3278', () => { const event = AbiEvent.from('event test(uint32 indexed val)') expect( AbiEvent.encode(event, { val: 0, }), ).toMatchInlineSnapshot(` { "topics": [ "0xe3cff634ef3ac1857ee74821b8b4103c803384af6152771eef3a2a92bdda6db6", "0x0000000000000000000000000000000000000000000000000000000000000000", ], } `) }) test('behavior: overload with abi', () => { const abi = Abi.from([ 'event Transfer(address indexed from, address indexed to, uint256 value)', ]) // Test both overload patterns const abiEvent = AbiEvent.fromAbi(abi, 'Transfer') const result1 = AbiEvent.encode(abiEvent, { from: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', }) const result2 = AbiEvent.encode(abi, 'Transfer', { from: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', }) expect(result1).toEqual(result2) expect(result2).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", "0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8", ], } `) }) test('behavior: overload with abi - no args', () => { const abi = Abi.from(['event Transfer()']) // Test both overload patterns const abiEvent = AbiEvent.fromAbi(abi, 'Transfer') const result1 = AbiEvent.encode(abiEvent) const result2 = AbiEvent.encode(abi, 'Transfer') expect(result1).toEqual(result2) expect(result2).toMatchInlineSnapshot(` { "topics": [ "0x406dade31f7ae4b5dbc276258c28dde5ae6d5c2773c5745802c493a2360e55e0", ], } `) }) test('behavior: overload with array args', () => { const abi = Abi.from([ 'event Transfer(address indexed, address indexed, uint256)', ]) // Test both overload patterns with unnamed args const abiEvent = AbiEvent.fromAbi(abi, 'Transfer') const result1 = AbiEvent.encode(abiEvent, [ '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', ]) const result2 = AbiEvent.encode(abi, 'Transfer', [ '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', ]) expect(result1).toEqual(result2) expect(result2).toMatchInlineSnapshot(` { "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", "0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8", ], } `) }) }) describe('format', () => { test('default', () => { const transfer = AbiEvent.from({ type: 'event', name: 'Transfer', inputs: [ { name: 'from', type: 'address', indexed: true }, { name: 'to', type: 'address', indexed: true }, { name: 'value', type: 'uint256' }, ], }) const formatted = AbiEvent.format(transfer) expect(formatted).toMatchInlineSnapshot( `"event Transfer(address indexed from, address indexed to, uint256 value)"`, ) }) }) describe('from', () => { test('default', () => { { const abiItem = AbiEvent.from({ type: 'event', name: 'Transfer', inputs: [ { name: 'from', type: 'address', indexed: true }, { name: 'to', type: 'address', indexed: true }, { name: 'value', type: 'uint256' }, ], }) expect(abiItem).toMatchInlineSnapshot(` { "hash": "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "inputs": [ { "indexed": true, "name": "from", "type": "address", }, { "indexed": true, "name": "to", "type": "address", }, { "name": "value", "type": "uint256", }, ], "name": "Transfer", "type": "event", } `) } { const abiItem = AbiEvent.from( 'event Transfer(address indexed from, address indexed to, uint256 value)', ) expect(abiItem).toMatchInlineSnapshot(` { "hash": "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "inputs": [ { "indexed": true, "name": "from", "type": "address", }, { "indexed": true, "name": "to", "type": "address", }, { "name": "value", "type": "uint256", }, ], "name": "Transfer", "type": "event", } `) } }) test('options: prepare', () => { const abiItem = AbiEvent.from( { type: 'event', name: 'Transfer', inputs: [ { name: 'from', type: 'address', indexed: true }, { name: 'to', type: 'address', indexed: true }, { name: 'value', type: 'uint256' }, ], }, { prepare: false }, ) expect(abiItem).toMatchInlineSnapshot(` { "inputs": [ { "indexed": true, "name": "from", "type": "address", }, { "indexed": true, "name": "to", "type": "address", }, { "name": "value", "type": "uint256", }, ], "name": "Transfer", "type": "event", } `) }) }) describe('fromAbi', () => { test('default', () => { expect(AbiEvent.fromAbi(wagmiContractConfig.abi, 'Approval')) .toMatchInlineSnapshot(` { "anon