UNPKG

ox

Version:

Ethereum Standard Library

182 lines (174 loc) 4.84 kB
import { describe, expect, test } from 'vp/test' import * as z_Log from '../Log.js' import * as z from 'zod/mini' const address = '0x0000000000000000000000000000000000000000' const blockHash = `0x${'11'.repeat(32)}` as const const transactionHash = `0x${'22'.repeat(32)}` as const const topic = `0x${'33'.repeat(32)}` as const describe('Log', () => { test('decodes and encodes logs', () => { expect( z.decode(z_Log.Log, { address, blockHash, blockNumber: '0x12d846c', blockTimestamp: '0x1', data: '0xdeadbeef', logIndex: '0x10f', topics: [topic], transactionHash, transactionIndex: '0x91', removed: false, }), ).toMatchInlineSnapshot(` { "address": "0x0000000000000000000000000000000000000000", "blockHash": "0x1111111111111111111111111111111111111111111111111111111111111111", "blockNumber": 19760236n, "blockTimestamp": 1n, "data": "0xdeadbeef", "logIndex": 271, "removed": false, "topics": [ "0x3333333333333333333333333333333333333333333333333333333333333333", ], "transactionHash": "0x2222222222222222222222222222222222222222222222222222222222222222", "transactionIndex": 145, } `) expect( z.encode(z_Log.Log, { address, blockHash, blockNumber: 19760236n, blockTimestamp: 1n, data: '0xdeadbeef', logIndex: 271, topics: [topic], transactionHash, transactionIndex: 145, removed: false, }), ).toMatchInlineSnapshot(` { "address": "0x0000000000000000000000000000000000000000", "blockHash": "0x1111111111111111111111111111111111111111111111111111111111111111", "blockNumber": "0x12d846c", "blockTimestamp": "0x1", "data": "0xdeadbeef", "logIndex": "0x10f", "removed": false, "topics": [ "0x3333333333333333333333333333333333333333333333333333333333333333", ], "transactionHash": "0x2222222222222222222222222222222222222222222222222222222222222222", "transactionIndex": "0x91", } `) }) test('decodes pending logs', () => { expect( z.decode(z_Log.Pending, { address, blockHash: null, blockNumber: null, blockTimestamp: null, data: '0xdeadbeef', logIndex: null, topics: [topic], transactionHash: null, transactionIndex: null, removed: false, }), ).toMatchInlineSnapshot(` { "address": "0x0000000000000000000000000000000000000000", "blockHash": null, "blockNumber": null, "blockTimestamp": null, "data": "0xdeadbeef", "logIndex": null, "removed": false, "topics": [ "0x3333333333333333333333333333333333333333333333333333333333333333", ], "transactionHash": null, "transactionIndex": null, } `) }) test('LogToRpc accepts numberish encode inputs', () => { const decoded = { address, blockHash, blockNumber: 19760236n, blockTimestamp: 1n, data: '0xdeadbeef', logIndex: 271, topics: [topic], transactionHash, transactionIndex: 145, removed: false, } as const const expected = z.encode(z_Log.Log, { ...decoded, topics: [topic] }) expect( z.encode(z_Log.LogToRpc, { ...decoded, topics: [topic], blockNumber: 19760236, blockTimestamp: 1, }), ).toEqual(expected) expect( z.encode(z_Log.LogToRpc, { ...decoded, topics: [topic], blockNumber: '0x12d846c', blockTimestamp: '0x1', }), ).toEqual(expected) }) test('decodes logs with no topics', () => { expect( z.decode(z_Log.Log, { address, blockHash, blockNumber: '0x12d846c', data: '0xdeadbeef', logIndex: '0x10f', topics: [], transactionHash, transactionIndex: '0x91', removed: false, }).topics, ).toEqual([]) }) test('rejects invalid topics and quantities', () => { expect( z.safeDecode(z_Log.Log, { address, blockHash, blockNumber: '0x1', data: '0x', logIndex: '0x0', topics: ['0xz'], transactionHash, transactionIndex: '0x0', removed: false, }).success, ).toBe(false) expect( z.safeDecode(z_Log.Log, { address, blockHash, blockNumber: '0x', data: '0x', logIndex: '0x0', topics: [topic], transactionHash, transactionIndex: '0x0', removed: false, }).success, ).toBe(false) }) })