diff --git a/typescript/aqua/src/aqua-protocol-contract/events/docked-event.test.ts b/typescript/aqua/src/aqua-protocol-contract/events/docked-event.test.ts new file mode 100644 index 0000000..c700ad8 --- /dev/null +++ b/typescript/aqua/src/aqua-protocol-contract/events/docked-event.test.ts @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: LicenseRef-Degensoft-Aqua-Source-1.1 + +import { describe, it, expect } from 'vitest' +import type { Log } from 'viem' +import { Address, HexString } from '@1inch/sdk-core' +import { trim0x } from '@1inch/byte-utils' +import { DockedEvent } from './docked-event' + +describe('DockedEvent', () => { + const mockMaker = '0x961da14c99217789106f0c246c0f66b49fe266ff' + const mockApp = '0x51b66446ebb060cb0571a6fcbccde855d091dc16' + const mockStrategyHash = '0x2d142ba44ee9104f8cd702bfe7520e64eb8531c5e4e4ded80c6a93cf5a3d113e' + + describe('constructor', () => { + it('should create DockedEvent instance', () => { + const event = new DockedEvent( + new Address(mockMaker), + new Address(mockApp), + new HexString(mockStrategyHash), + ) + + expect(event.maker.toString()).toBe(mockMaker.toLowerCase()) + expect(event.app.toString()).toBe(mockApp.toLowerCase()) + expect(event.strategyHash.toString()).toBe(mockStrategyHash) + }) + }) + + describe('fromLog', () => { + it('should decode valid docked event log from real blockchain data', () => { + const log: Log = { + address: '0xfa3c23da986b3596ee7177434ad8e4406068a3e5' as `0x${string}`, + topics: [ + '0xd173a1d140c154eb1ce9298d251d5eb8c4089cc2d16e70f1067bdc810c6fe004' as `0x${string}`, + ], + data: '0x0000000000000000000000008b83c50040c743e99bd47f4327bfcf7913c505b40000000000000000000000000cc85a15477539958d622a2735a3477d7d329c89fed4c945f2dc5747956337cf623dceacca130714540e70742e63456d3daf2400' as `0x${string}`, + blockNumber: 23841073n, + transactionHash: + '0xb4231e80752dac59d01480454fe85cde374ea087176158ba0ac8315aecf3fde0' as `0x${string}`, + transactionIndex: 0, + blockHash: + '0x23820c2a5de498bc0c87469392eac0c456ce3712ae3872cd32055b9a17a405c7' as `0x${string}`, + logIndex: 0, + removed: false, + } + + const event = DockedEvent.fromLog(log) + + expect(event.maker.toString()).toBe('0x8b83c50040c743e99bd47f4327bfcf7913c505b4') + expect(event.app.toString()).toBe('0x0cc85a15477539958d622a2735a3477d7d329c89') + expect(event.strategyHash.toString()).toBe( + '0xfed4c945f2dc5747956337cf623dceacca130714540e70742e63456d3daf2400', + ) + }) + + it('should decode valid docked event log', () => { + const log: Log = { + address: mockApp as `0x${string}`, + topics: [DockedEvent.TOPIC.toString() as `0x${string}`], + data: `0x${trim0x(mockMaker).padStart(64, '0')}${trim0x(mockApp).padStart(64, '0')}${trim0x(mockStrategyHash)}` as `0x${string}`, + blockNumber: 1n, + transactionHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + const event = DockedEvent.fromLog(log) + + expect(event.maker.toString()).toBe(mockMaker.toLowerCase()) + expect(event.app.toString()).toBe(mockApp.toLowerCase()) + expect(event.strategyHash.toString()).toBe(mockStrategyHash) + }) + + it('should throw on invalid topic', () => { + const log: Log = { + address: mockApp as `0x${string}`, + topics: ['0xdeadbeef' as `0x${string}`], + data: `0x${trim0x(mockMaker).padStart(64, '0')}${trim0x(mockApp).padStart(64, '0')}${trim0x(mockStrategyHash)}` as `0x${string}`, + blockNumber: 1n, + transactionHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + expect(() => DockedEvent.fromLog(log)).toThrow() + }) + + it('should throw on missing data', () => { + const log: Log = { + address: mockApp as `0x${string}`, + topics: [DockedEvent.TOPIC.toString() as `0x${string}`], + data: '0x' as `0x${string}`, + blockNumber: 1n, + transactionHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + expect(() => DockedEvent.fromLog(log)).toThrow() + }) + + it('should throw on invalid data format', () => { + const log: Log = { + address: mockApp as `0x${string}`, + topics: [DockedEvent.TOPIC.toString() as `0x${string}`], + data: '0xinvalid' as `0x${string}`, + blockNumber: 1n, + transactionHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + expect(() => DockedEvent.fromLog(log)).toThrow() + }) + }) +}) diff --git a/typescript/aqua/src/aqua-protocol-contract/events/pulled-event.test.ts b/typescript/aqua/src/aqua-protocol-contract/events/pulled-event.test.ts new file mode 100644 index 0000000..ec19135 --- /dev/null +++ b/typescript/aqua/src/aqua-protocol-contract/events/pulled-event.test.ts @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: LicenseRef-Degensoft-Aqua-Source-1.1 + +import { describe, it, expect } from 'vitest' +import type { Log } from 'viem' +import { Address, HexString } from '@1inch/sdk-core' +import { trim0x } from '@1inch/byte-utils' +import { PulledEvent } from './pulled-event' + +describe('PulledEvent', () => { + const mockMaker = '0x961da14c99217789106f0c246c0f66b49fe266ff' + const mockApp = '0x51b66446ebb060cb0571a6fcbccde855d091dc16' + const mockStrategyHash = '0x2d142ba44ee9104f8cd702bfe7520e64eb8531c5e4e4ded80c6a93cf5a3d113e' + const mockToken = '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913' + const mockAmount = 750000n + + describe('constructor', () => { + it('should create PulledEvent instance', () => { + const event = new PulledEvent( + new Address(mockMaker), + new Address(mockApp), + new HexString(mockStrategyHash), + new Address(mockToken), + mockAmount, + ) + + expect(event.maker.toString()).toBe(mockMaker.toLowerCase()) + expect(event.app.toString()).toBe(mockApp.toLowerCase()) + expect(event.strategyHash.toString()).toBe(mockStrategyHash) + expect(event.token.toString()).toBe(mockToken.toLowerCase()) + expect(event.amount).toBe(mockAmount) + }) + }) + + describe('fromLog', () => { + it('should decode valid pulled event log with realistic blockchain data', () => { + const log: Log = { + address: '0x51b66446Ebb060cb0571a6fcbCcde855D091DC16' as `0x${string}`, + topics: [PulledEvent.TOPIC.toString() as `0x${string}`], + data: '0x000000000000000000000000961da14c99217789106f0c246c0f66b49fe266ff00000000000000000000000051b66446ebb060cb0571a6fcbccde855d091dc162d142ba44ee9104f8cd702bfe7520e64eb8531c5e4e4ded80c6a93cf5a3d113e000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000b71b0' as `0x${string}`, + blockNumber: 38041057n, + transactionHash: ('0x' + '2'.padStart(64, '0')) as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + const event = PulledEvent.fromLog(log) + + expect(event.maker.toString()).toBe('0x961da14c99217789106f0c246c0f66b49fe266ff') + expect(event.app.toString()).toBe('0x51b66446ebb060cb0571a6fcbccde855d091dc16') + expect(event.strategyHash.toString()).toBe( + '0x2d142ba44ee9104f8cd702bfe7520e64eb8531c5e4e4ded80c6a93cf5a3d113e', + ) + expect(event.token.toString()).toBe('0x833589fcd6edb6e08f4c7c32d4f71b54bda02913') + expect(event.amount).toBe(750000n) + }) + + it('should decode valid pulled event log', () => { + const log: Log = { + address: mockApp as `0x${string}`, + topics: [PulledEvent.TOPIC.toString() as `0x${string}`], + data: `0x${trim0x(mockMaker).padStart(64, '0')}${trim0x(mockApp).padStart(64, '0')}${trim0x(mockStrategyHash)}${trim0x(mockToken).padStart(64, '0')}${mockAmount.toString(16).padStart(64, '0')}` as `0x${string}`, + blockNumber: 1n, + transactionHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + const event = PulledEvent.fromLog(log) + + expect(event.maker.toString()).toBe(mockMaker.toLowerCase()) + expect(event.app.toString()).toBe(mockApp.toLowerCase()) + expect(event.strategyHash.toString()).toBe(mockStrategyHash) + expect(event.token.toString()).toBe(mockToken.toLowerCase()) + expect(event.amount).toBe(mockAmount) + }) + + it('should decode pulled event with large amount', () => { + const largeAmount = 1000000000000000000n + + const log: Log = { + address: mockApp as `0x${string}`, + topics: [PulledEvent.TOPIC.toString() as `0x${string}`], + data: `0x${trim0x(mockMaker).padStart(64, '0')}${trim0x(mockApp).padStart(64, '0')}${trim0x(mockStrategyHash)}${trim0x(mockToken).padStart(64, '0')}${largeAmount.toString(16).padStart(64, '0')}` as `0x${string}`, + blockNumber: 1n, + transactionHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + const event = PulledEvent.fromLog(log) + expect(event.amount).toBe(largeAmount) + }) + + it('should throw on invalid topic', () => { + const log: Log = { + address: mockApp as `0x${string}`, + topics: ['0xdeadbeef' as `0x${string}`], + data: `0x${'0'.padStart(320, '0')}` as `0x${string}`, + blockNumber: 1n, + transactionHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + expect(() => PulledEvent.fromLog(log)).toThrow() + }) + + it('should throw on missing data', () => { + const log: Log = { + address: mockApp as `0x${string}`, + topics: [PulledEvent.TOPIC.toString() as `0x${string}`], + data: '0x' as `0x${string}`, + blockNumber: 1n, + transactionHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + expect(() => PulledEvent.fromLog(log)).toThrow() + }) + + it('should throw on invalid data format', () => { + const log: Log = { + address: mockApp as `0x${string}`, + topics: [PulledEvent.TOPIC.toString() as `0x${string}`], + data: '0xinvalid' as `0x${string}`, + blockNumber: 1n, + transactionHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + expect(() => PulledEvent.fromLog(log)).toThrow() + }) + }) +}) diff --git a/typescript/aqua/src/aqua-protocol-contract/events/pushed-event.test.ts b/typescript/aqua/src/aqua-protocol-contract/events/pushed-event.test.ts new file mode 100644 index 0000000..f5a25b4 --- /dev/null +++ b/typescript/aqua/src/aqua-protocol-contract/events/pushed-event.test.ts @@ -0,0 +1,173 @@ +// SPDX-License-Identifier: LicenseRef-Degensoft-Aqua-Source-1.1 + +import { describe, it, expect } from 'vitest' +import type { Log } from 'viem' +import { Address, HexString } from '@1inch/sdk-core' +import { PushedEvent } from './pushed-event' + +describe('PushedEvent', () => { + const mockMaker = '0x961da14c99217789106f0c246c0f66b49fe266ff' + const mockApp = '0x51b66446ebb060cb0571a6fcbccde855d091dc16' + const mockStrategyHash = '0x2d142ba44ee9104f8cd702bfe7520e64eb8531c5e4e4ded80c6a93cf5a3d113e' + const mockToken = '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913' + const mockAmount = 1000000n + + describe('constructor', () => { + it('should create PushedEvent instance', () => { + const event = new PushedEvent( + new Address(mockMaker), + new Address(mockApp), + new HexString(mockStrategyHash), + new Address(mockToken), + mockAmount, + ) + + expect(event.maker.toString()).toBe(mockMaker.toLowerCase()) + expect(event.app.toString()).toBe(mockApp.toLowerCase()) + expect(event.strategyHash.toString()).toBe(mockStrategyHash) + expect(event.token.toString()).toBe(mockToken.toLowerCase()) + expect(event.amount).toBe(mockAmount) + }) + }) + + describe('fromLog', () => { + it('should decode valid pushed event log from real blockchain data', () => { + const log: Log = { + address: '0x51b66446Ebb060cb0571a6fcbCcde855D091DC16' as `0x${string}`, + topics: [ + '0x3f18354abbd5306dd1665c2c90f614a4559e39dd620d04fbe5458e613b6588f3' as `0x${string}`, + ], + data: '0x000000000000000000000000961da14c99217789106f0c246c0f66b49fe266ff000000000000000000000000774d0b2991e1af5303ea6c054c78fa856d0f550c2d142ba44ee9104f8cd702bfe7520e64eb8531c5e4e4ded80c6a93cf5a3d113e000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000f4240' as `0x${string}`, + blockNumber: 38041056n, + transactionHash: + '0x3643966559066142bd0ed23dd9f7834087c7c7a95930219a59924c37b9e4a1bc' as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 2, + removed: false, + } + + const event = PushedEvent.fromLog(log) + + expect(event.maker.toString()).toBe('0x961da14c99217789106f0c246c0f66b49fe266ff') + expect(event.app.toString()).toBe('0x774d0b2991e1af5303ea6c054c78fa856d0f550c') + expect(event.strategyHash.toString()).toBe( + '0x2d142ba44ee9104f8cd702bfe7520e64eb8531c5e4e4ded80c6a93cf5a3d113e', + ) + expect(event.token.toString()).toBe('0x833589fcd6edb6e08f4c7c32d4f71b54bda02913') + expect(event.amount).toBe(1000000n) + }) + + it('should decode multiple pushed events from same transaction', () => { + const logs: Log[] = [ + { + address: '0x51b66446ebb060cb0571a6fcbccde855d091dc16' as `0x${string}`, + topics: [ + '0x3f18354abbd5306dd1665c2c90f614a4559e39dd620d04fbe5458e613b6588f3' as `0x${string}`, + ], + data: '0x000000000000000000000000961da14c99217789106f0c246c0f66b49fe266ff000000000000000000000000774d0b2991e1af5303ea6c054c78fa856d0f550c2d142ba44ee9104f8cd702bfe7520e64eb8531c5e4e4ded80c6a93cf5a3d113e000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000f4240' as `0x${string}`, + blockNumber: 38041056n, + transactionHash: + '0x3643966559066142bd0ed23dd9f7834087c7c7a95930219a59924c37b9e4a1bc' as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + }, + { + address: '0x51b66446ebb060cb0571a6fcbccde855d091dc16' as `0x${string}`, + topics: [ + '0x3f18354abbd5306dd1665c2c90f614a4559e39dd620d04fbe5458e613b6588f3' as `0x${string}`, + ], + data: '0x000000000000000000000000961da14c99217789106f0c246c0f66b49fe266ff000000000000000000000000774d0b2991e1af5303ea6c054c78fa856d0f550c2d142ba44ee9104f8cd702bfe7520e64eb8531c5e4e4ded80c6a93cf5a3d113e000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000000000000000000000000000000000000001e848' as `0x${string}`, + blockNumber: 38041056n, + transactionHash: + '0x3643966559066142bd0ed23dd9f7834087c7c7a95930219a59924c37b9e4a1bc' as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 1, + removed: false, + }, + { + address: '0x51b66446ebb060cb0571a6fcbccde855d091dc16' as `0x${string}`, + topics: [ + '0x3f18354abbd5306dd1665c2c90f614a4559e39dd620d04fbe5458e613b6588f3' as `0x${string}`, + ], + data: '0x000000000000000000000000961da14c99217789106f0c246c0f66b49fe266ff000000000000000000000000774d0b2991e1af5303ea6c054c78fa856d0f550c2d142ba44ee9104f8cd702bfe7520e64eb8531c5e4e4ded80c6a93cf5a3d113e000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000000000000000000000000000000000000002dc6c' as `0x${string}`, + blockNumber: 38041056n, + transactionHash: + '0x3643966559066142bd0ed23dd9f7834087c7c7a95930219a59924c37b9e4a1bc' as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 2, + removed: false, + }, + ] + + const events = logs.map((log) => PushedEvent.fromLog(log)) + + expect(events).toHaveLength(3) + + events.forEach((event) => { + expect(event.maker.toString()).toBe('0x961da14c99217789106f0c246c0f66b49fe266ff') + expect(event.app.toString()).toBe('0x774d0b2991e1af5303ea6c054c78fa856d0f550c') + expect(event.strategyHash.toString()).toBe( + '0x2d142ba44ee9104f8cd702bfe7520e64eb8531c5e4e4ded80c6a93cf5a3d113e', + ) + expect(event.token.toString()).toBe('0x833589fcd6edb6e08f4c7c32d4f71b54bda02913') + }) + + expect(events[0].amount).toBe(1000000n) + expect(events[1].amount).toBe(125000n) + expect(events[2].amount).toBe(187500n) + }) + + it('should throw on invalid topic', () => { + const log: Log = { + address: mockApp as `0x${string}`, + topics: ['0xdeadbeef' as `0x${string}`], + data: `0x${'0'.padStart(320, '0')}` as `0x${string}`, + blockNumber: 1n, + transactionHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + expect(() => PushedEvent.fromLog(log)).toThrow() + }) + + it('should throw on missing data', () => { + const log: Log = { + address: mockApp as `0x${string}`, + topics: [PushedEvent.TOPIC.toString() as `0x${string}`], + data: '0x' as `0x${string}`, + blockNumber: 1n, + transactionHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + expect(() => PushedEvent.fromLog(log)).toThrow() + }) + + it('should throw on invalid data format', () => { + const log: Log = { + address: mockApp as `0x${string}`, + topics: [PushedEvent.TOPIC.toString() as `0x${string}`], + data: '0xnotvalid' as `0x${string}`, + blockNumber: 1n, + transactionHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + expect(() => PushedEvent.fromLog(log)).toThrow() + }) + }) +}) diff --git a/typescript/aqua/src/aqua-protocol-contract/events/shipped-event.test.ts b/typescript/aqua/src/aqua-protocol-contract/events/shipped-event.test.ts new file mode 100644 index 0000000..0d79693 --- /dev/null +++ b/typescript/aqua/src/aqua-protocol-contract/events/shipped-event.test.ts @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: LicenseRef-Degensoft-Aqua-Source-1.1 + +import { describe, it, expect } from 'vitest' +import type { Log } from 'viem' +import { Address, HexString } from '@1inch/sdk-core' +import { ShippedEvent } from './shipped-event' + +describe('ShippedEvent', () => { + const mockMaker = '0x1234567890123456789012345678901234567890' + const mockApp = '0xabcdefabcdefabcdefabcdefabcdefabcdefabcd' + const mockStrategyHash = `0x${'0'.padStart(64, '0')}` + const mockStrategy = `0x${'1'.padStart(128, '1')}` + + describe('constructor', () => { + it('should create ShippedEvent instance', () => { + const event = new ShippedEvent( + new Address(mockMaker), + new Address(mockApp), + new HexString(mockStrategyHash), + new HexString(mockStrategy), + ) + + expect(event.maker.toString()).toBe(mockMaker.toLowerCase()) + expect(event.app.toString()).toBe(mockApp.toLowerCase()) + expect(event.strategyHash.toString()).toBe(mockStrategyHash) + expect(event.strategy.toString()).toBe(mockStrategy) + }) + }) + + describe('fromLog', () => { + it('should decode valid shipped event log', () => { + const log: Log = { + address: '0x774d0b2991e1af5303ea6c054c78fa856d0f550c' as `0x${string}`, + topics: [ + '0xdc3622e06fb145651f567d421c9ef261d71d43e3778b761907bc0d70d42e52b0' as `0x${string}`, + ], + data: '0x000000000000000000000000961da14c99217789106f0c246c0f66b49fe266ff000000000000000000000000774d0b2991e1af5303ea6c054c78fa856d0f550c2d142ba44ee9104f8cd702bfe7520e64eb8531c5e4e4ded80c6a93cf5a3d113e000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000961da14c99217789106f0c246c0f66b49fe266ff10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001e1504000186a010001414535441424c452d313736323837313434373737300000' as `0x${string}`, + blockNumber: 38041056n, + transactionHash: + '0x3643966559066142bd0ed23dd9f7834087c7c7a95930219a59924c37b9e4a1bc' as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + const event = ShippedEvent.fromLog(log) + + expect(event.maker.toString()).toBe('0x961da14c99217789106f0c246c0f66b49fe266ff') + expect(event.app.toString()).toBe('0x774d0b2991e1af5303ea6c054c78fa856d0f550c') + expect(event.strategyHash.toString()).toBe( + '0x2d142ba44ee9104f8cd702bfe7520e64eb8531c5e4e4ded80c6a93cf5a3d113e', + ) + expect(event.strategy.toString().startsWith('0x')).toBe(true) + expect(event.strategy.toString()).toBe( + '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000961da14c99217789106f0c246c0f66b49fe266ff10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001e1504000186a010001414535441424c452d313736323837313434373737300000', + ) + }) + + it('should throw on invalid topic', () => { + const log: Log = { + address: '0x774d0b2991e1af5303ea6c054c78fa856d0f550c' as `0x${string}`, + topics: ['0x0000asadasd' as `0x${string}`], + data: '0x000000000000000000000000961da14c99217789106f0c246c0f66b49fe266ff000000000000000000000000774d0b2991e1af5303ea6c054c78fa856d0f550c2d142ba44ee9104f8cd702bfe7520e64eb8531c5e4e4ded80c6a93cf5a3d113e000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000961da14c99217789106f0c246c0f66b49fe266ff10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001e1504000186a010001414535441424c452d313736323837313434373737300000' as `0x${string}`, + blockNumber: 38041056n, + transactionHash: + '0x3643966559066142bd0ed23dd9f7834087c7c7a95930219a59924c37b9e4a1bc' as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + expect(() => ShippedEvent.fromLog(log)).toThrow() + }) + + it('should throw on missing data', () => { + const log: Log = { + address: mockApp as `0x${string}`, + topics: [ShippedEvent.TOPIC.toString() as `0x${string}`], + data: '0x' as `0x${string}`, + blockNumber: 38041056n, + transactionHash: + '0x3643966559066142bd0ed23dd9f7834087c7c7a95930219a59924c37b9e4a1bc' as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + expect(() => ShippedEvent.fromLog(log)).toThrow() + }) + + it('should throw on invalid data format', () => { + const log: Log = { + address: '0x774d0b2991e1af5303ea6c054c78fa856d0f550c' as `0x${string}`, + topics: [ + '0xdc3622e06fb145651f567d421c9ef261d71d43e3778b761907bc0d70d42e52b0' as `0x${string}`, + ], + data: '0xinvalid' as `0x${string}`, + blockNumber: 38041056n, + transactionHash: + '0x3643966559066142bd0ed23dd9f7834087c7c7a95930219a59924c37b9e4a1bc' as `0x${string}`, + transactionIndex: 0, + blockHash: `0x${'0'.padStart(64, '0')}` as `0x${string}`, + logIndex: 0, + removed: false, + } + + expect(() => ShippedEvent.fromLog(log)).toThrow() + }) + }) +})