@agirails/sdk 2.0.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +183 -0
- package/dist/ACTPClient.d.ts +52 -0
- package/dist/ACTPClient.d.ts.map +1 -0
- package/dist/ACTPClient.js +120 -0
- package/dist/ACTPClient.js.map +1 -0
- package/dist/abi/ACTPKernel.json +1340 -0
- package/dist/abi/ERC20.json +38 -0
- package/dist/abi/EscrowVault.json +64 -0
- package/dist/builders/DeliveryProofBuilder.d.ts +37 -0
- package/dist/builders/DeliveryProofBuilder.d.ts.map +1 -0
- package/dist/builders/DeliveryProofBuilder.js +165 -0
- package/dist/builders/DeliveryProofBuilder.js.map +1 -0
- package/dist/builders/QuoteBuilder.d.ts +68 -0
- package/dist/builders/QuoteBuilder.d.ts.map +1 -0
- package/dist/builders/QuoteBuilder.js +255 -0
- package/dist/builders/QuoteBuilder.js.map +1 -0
- package/dist/builders/index.d.ts +3 -0
- package/dist/builders/index.d.ts.map +1 -0
- package/dist/builders/index.js +10 -0
- package/dist/builders/index.js.map +1 -0
- package/dist/config/networks.d.ts +27 -0
- package/dist/config/networks.d.ts.map +1 -0
- package/dist/config/networks.js +103 -0
- package/dist/config/networks.js.map +1 -0
- package/dist/errors/index.d.ts +38 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +87 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/ACTPKernel.d.ts +30 -0
- package/dist/protocol/ACTPKernel.d.ts.map +1 -0
- package/dist/protocol/ACTPKernel.js +261 -0
- package/dist/protocol/ACTPKernel.js.map +1 -0
- package/dist/protocol/EASHelper.d.ts +23 -0
- package/dist/protocol/EASHelper.d.ts.map +1 -0
- package/dist/protocol/EASHelper.js +106 -0
- package/dist/protocol/EASHelper.js.map +1 -0
- package/dist/protocol/EscrowVault.d.ts +24 -0
- package/dist/protocol/EscrowVault.d.ts.map +1 -0
- package/dist/protocol/EscrowVault.js +114 -0
- package/dist/protocol/EscrowVault.js.map +1 -0
- package/dist/protocol/EventMonitor.d.ts +18 -0
- package/dist/protocol/EventMonitor.d.ts.map +1 -0
- package/dist/protocol/EventMonitor.js +92 -0
- package/dist/protocol/EventMonitor.js.map +1 -0
- package/dist/protocol/MessageSigner.d.ts +23 -0
- package/dist/protocol/MessageSigner.d.ts.map +1 -0
- package/dist/protocol/MessageSigner.js +178 -0
- package/dist/protocol/MessageSigner.js.map +1 -0
- package/dist/protocol/ProofGenerator.d.ts +22 -0
- package/dist/protocol/ProofGenerator.d.ts.map +1 -0
- package/dist/protocol/ProofGenerator.js +64 -0
- package/dist/protocol/ProofGenerator.js.map +1 -0
- package/dist/protocol/QuoteBuilder.d.ts +2 -0
- package/dist/protocol/QuoteBuilder.d.ts.map +1 -0
- package/dist/protocol/QuoteBuilder.js +7 -0
- package/dist/protocol/QuoteBuilder.js.map +1 -0
- package/dist/types/eip712.d.ts +106 -0
- package/dist/types/eip712.d.ts.map +1 -0
- package/dist/types/eip712.js +84 -0
- package/dist/types/eip712.js.map +1 -0
- package/dist/types/escrow.d.ts +18 -0
- package/dist/types/escrow.d.ts.map +1 -0
- package/dist/types/escrow.js +3 -0
- package/dist/types/escrow.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +22 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/message.d.ts +109 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/message.js +3 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/state.d.ts +19 -0
- package/dist/types/state.d.ts.map +1 -0
- package/dist/types/state.js +49 -0
- package/dist/types/state.js.map +1 -0
- package/dist/types/transaction.d.ts +36 -0
- package/dist/types/transaction.d.ts.map +1 -0
- package/dist/types/transaction.js +3 -0
- package/dist/types/transaction.js.map +1 -0
- package/dist/utils/IPFSClient.d.ts +37 -0
- package/dist/utils/IPFSClient.d.ts.map +1 -0
- package/dist/utils/IPFSClient.js +128 -0
- package/dist/utils/IPFSClient.js.map +1 -0
- package/dist/utils/NonceManager.d.ts +34 -0
- package/dist/utils/NonceManager.d.ts.map +1 -0
- package/dist/utils/NonceManager.js +114 -0
- package/dist/utils/NonceManager.js.map +1 -0
- package/dist/utils/ReceivedNonceTracker.d.ts +35 -0
- package/dist/utils/ReceivedNonceTracker.d.ts.map +1 -0
- package/dist/utils/ReceivedNonceTracker.js +196 -0
- package/dist/utils/ReceivedNonceTracker.js.map +1 -0
- package/dist/utils/canonicalJson.d.ts +4 -0
- package/dist/utils/canonicalJson.d.ts.map +1 -0
- package/dist/utils/canonicalJson.js +21 -0
- package/dist/utils/canonicalJson.js.map +1 -0
- package/dist/utils/computeTypeHash.d.ts +3 -0
- package/dist/utils/computeTypeHash.d.ts.map +1 -0
- package/dist/utils/computeTypeHash.js +30 -0
- package/dist/utils/computeTypeHash.js.map +1 -0
- package/dist/utils/validation.d.ts +6 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +46 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +73 -0
- package/src/ACTPClient.ts +276 -0
- package/src/__tests__/ProofGenerator.test.ts +124 -0
- package/src/__tests__/QuoteBuilder.test.ts +516 -0
- package/src/__tests__/StateMachine.test.ts +82 -0
- package/src/__tests__/builders/DeliveryProofBuilder.test.ts +581 -0
- package/src/__tests__/integration/ACTPClient.test.ts +263 -0
- package/src/__tests__/integration.test.ts +289 -0
- package/src/__tests__/protocol/EASHelper.test.ts +472 -0
- package/src/__tests__/protocol/EventMonitor.test.ts +382 -0
- package/src/__tests__/security/ACTPKernel.security.test.ts +1167 -0
- package/src/__tests__/security/EscrowVault.security.test.ts +570 -0
- package/src/__tests__/security/MessageSigner.security.test.ts +286 -0
- package/src/__tests__/security/NonceReplay.security.test.ts +501 -0
- package/src/__tests__/security/validation.security.test.ts +376 -0
- package/src/__tests__/utils/IPFSClient.test.ts +262 -0
- package/src/__tests__/utils/NonceManager.test.ts +205 -0
- package/src/__tests__/utils/canonicalJson.test.ts +153 -0
- package/src/abi/ACTPKernel.json +1340 -0
- package/src/abi/ERC20.json +40 -0
- package/src/abi/EscrowVault.json +66 -0
- package/src/builders/DeliveryProofBuilder.ts +326 -0
- package/src/builders/QuoteBuilder.ts +483 -0
- package/src/builders/index.ts +17 -0
- package/src/config/networks.ts +165 -0
- package/src/errors/index.ts +130 -0
- package/src/index.ts +108 -0
- package/src/protocol/ACTPKernel.ts +625 -0
- package/src/protocol/EASHelper.ts +197 -0
- package/src/protocol/EscrowVault.ts +237 -0
- package/src/protocol/EventMonitor.ts +161 -0
- package/src/protocol/MessageSigner.ts +336 -0
- package/src/protocol/ProofGenerator.ts +119 -0
- package/src/protocol/QuoteBuilder.ts +15 -0
- package/src/types/eip712.ts +175 -0
- package/src/types/escrow.ts +26 -0
- package/src/types/index.ts +10 -0
- package/src/types/message.ts +145 -0
- package/src/types/state.ts +77 -0
- package/src/types/transaction.ts +54 -0
- package/src/utils/IPFSClient.ts +248 -0
- package/src/utils/NonceManager.ts +293 -0
- package/src/utils/ReceivedNonceTracker.ts +397 -0
- package/src/utils/canonicalJson.ts +38 -0
- package/src/utils/computeTypeHash.ts +50 -0
- package/src/utils/validation.ts +82 -0
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventMonitor Test Suite
|
|
3
|
+
*
|
|
4
|
+
* Coverage Target: 80%+ (statements, functions, lines, branches)
|
|
5
|
+
*
|
|
6
|
+
* Test Categories:
|
|
7
|
+
* 1. Event Watching (3 tests)
|
|
8
|
+
* 2. State Monitoring (3 tests)
|
|
9
|
+
* 3. Transaction History (3 tests)
|
|
10
|
+
* 4. Event Subscriptions (3 tests)
|
|
11
|
+
*
|
|
12
|
+
* References:
|
|
13
|
+
* - EventMonitor.ts implementation
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { EventMonitor } from '../../protocol/EventMonitor';
|
|
17
|
+
import { State } from '../../types';
|
|
18
|
+
|
|
19
|
+
// Mock contract
|
|
20
|
+
const mockKernelContract = {
|
|
21
|
+
filters: {
|
|
22
|
+
StateTransitioned: jest.fn(),
|
|
23
|
+
TransactionCreated: jest.fn(),
|
|
24
|
+
EscrowReleased: jest.fn()
|
|
25
|
+
},
|
|
26
|
+
on: jest.fn(),
|
|
27
|
+
off: jest.fn(),
|
|
28
|
+
queryFilter: jest.fn(),
|
|
29
|
+
transactions: jest.fn()
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const mockEscrowContract = {};
|
|
33
|
+
|
|
34
|
+
describe('EventMonitor - Event Watching & Subscriptions', () => {
|
|
35
|
+
let eventMonitor: EventMonitor;
|
|
36
|
+
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
jest.clearAllMocks();
|
|
39
|
+
eventMonitor = new EventMonitor(
|
|
40
|
+
mockKernelContract as any,
|
|
41
|
+
mockEscrowContract as any
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
describe('watchTransaction - Event Listening', () => {
|
|
46
|
+
it('should set up event listener for transaction state changes', () => {
|
|
47
|
+
const txId = '0x' + '1'.repeat(64);
|
|
48
|
+
const mockFilter = { address: 'mock-filter' };
|
|
49
|
+
const callback = jest.fn();
|
|
50
|
+
|
|
51
|
+
mockKernelContract.filters.StateTransitioned.mockReturnValue(mockFilter);
|
|
52
|
+
|
|
53
|
+
const cleanup = eventMonitor.watchTransaction(txId, callback);
|
|
54
|
+
|
|
55
|
+
expect(mockKernelContract.filters.StateTransitioned).toHaveBeenCalledWith(txId);
|
|
56
|
+
expect(mockKernelContract.on).toHaveBeenCalledWith(mockFilter, expect.any(Function));
|
|
57
|
+
expect(typeof cleanup).toBe('function');
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('should invoke callback when state transition event occurs', () => {
|
|
61
|
+
const txId = '0x' + '1'.repeat(64);
|
|
62
|
+
const mockFilter = { address: 'mock-filter' };
|
|
63
|
+
const callback = jest.fn();
|
|
64
|
+
|
|
65
|
+
mockKernelContract.filters.StateTransitioned.mockReturnValue(mockFilter);
|
|
66
|
+
|
|
67
|
+
let eventListener: any;
|
|
68
|
+
mockKernelContract.on.mockImplementation((_filter, listener) => {
|
|
69
|
+
eventListener = listener;
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
eventMonitor.watchTransaction(txId, callback);
|
|
73
|
+
|
|
74
|
+
// Simulate state transition event
|
|
75
|
+
const mockEvent = { blockNumber: 12345 };
|
|
76
|
+
eventListener(txId, State.INITIATED, State.QUOTED, mockEvent);
|
|
77
|
+
|
|
78
|
+
expect(callback).toHaveBeenCalledWith(State.QUOTED);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it('should remove event listener when cleanup function is called', () => {
|
|
82
|
+
const txId = '0x' + '1'.repeat(64);
|
|
83
|
+
const mockFilter = { address: 'mock-filter' };
|
|
84
|
+
const callback = jest.fn();
|
|
85
|
+
|
|
86
|
+
mockKernelContract.filters.StateTransitioned.mockReturnValue(mockFilter);
|
|
87
|
+
|
|
88
|
+
const cleanup = eventMonitor.watchTransaction(txId, callback);
|
|
89
|
+
cleanup();
|
|
90
|
+
|
|
91
|
+
expect(mockKernelContract.off).toHaveBeenCalledWith(mockFilter, expect.any(Function));
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe('waitForState - Async State Monitoring', () => {
|
|
96
|
+
it('should resolve when target state is reached', async () => {
|
|
97
|
+
const txId = '0x' + '1'.repeat(64);
|
|
98
|
+
const mockFilter = { address: 'mock-filter' };
|
|
99
|
+
|
|
100
|
+
mockKernelContract.filters.StateTransitioned.mockReturnValue(mockFilter);
|
|
101
|
+
|
|
102
|
+
let eventListener: any;
|
|
103
|
+
mockKernelContract.on.mockImplementation((_filter, listener) => {
|
|
104
|
+
eventListener = listener;
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
const waitPromise = eventMonitor.waitForState(txId, State.DELIVERED, 5000);
|
|
108
|
+
|
|
109
|
+
// Simulate state transition to target state
|
|
110
|
+
setTimeout(() => {
|
|
111
|
+
const mockEvent = { blockNumber: 12345 };
|
|
112
|
+
eventListener(txId, State.IN_PROGRESS, State.DELIVERED, mockEvent);
|
|
113
|
+
}, 100);
|
|
114
|
+
|
|
115
|
+
await expect(waitPromise).resolves.toBeUndefined();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('should reject with timeout error if target state not reached', async () => {
|
|
119
|
+
const txId = '0x' + '1'.repeat(64);
|
|
120
|
+
const mockFilter = { address: 'mock-filter' };
|
|
121
|
+
|
|
122
|
+
mockKernelContract.filters.StateTransitioned.mockReturnValue(mockFilter);
|
|
123
|
+
|
|
124
|
+
const waitPromise = eventMonitor.waitForState(txId, State.DELIVERED, 100);
|
|
125
|
+
|
|
126
|
+
await expect(waitPromise).rejects.toThrow('Timeout waiting for state DELIVERED');
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('should ignore non-matching state transitions', async () => {
|
|
130
|
+
const txId = '0x' + '1'.repeat(64);
|
|
131
|
+
const mockFilter = { address: 'mock-filter' };
|
|
132
|
+
|
|
133
|
+
mockKernelContract.filters.StateTransitioned.mockReturnValue(mockFilter);
|
|
134
|
+
|
|
135
|
+
let eventListener: any;
|
|
136
|
+
mockKernelContract.on.mockImplementation((_filter, listener) => {
|
|
137
|
+
eventListener = listener;
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
const waitPromise = eventMonitor.waitForState(txId, State.DELIVERED, 1000);
|
|
141
|
+
|
|
142
|
+
// Simulate state transitions to non-target states
|
|
143
|
+
setTimeout(() => {
|
|
144
|
+
const mockEvent = { blockNumber: 12345 };
|
|
145
|
+
eventListener(txId, State.INITIATED, State.QUOTED, mockEvent);
|
|
146
|
+
eventListener(txId, State.QUOTED, State.COMMITTED, mockEvent);
|
|
147
|
+
}, 100);
|
|
148
|
+
|
|
149
|
+
// Then emit target state
|
|
150
|
+
setTimeout(() => {
|
|
151
|
+
const mockEvent = { blockNumber: 12346 };
|
|
152
|
+
eventListener(txId, State.COMMITTED, State.DELIVERED, mockEvent);
|
|
153
|
+
}, 200);
|
|
154
|
+
|
|
155
|
+
await expect(waitPromise).resolves.toBeUndefined();
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
describe('getTransactionHistory - Historical Data', () => {
|
|
160
|
+
it('should fetch transaction history for requester', async () => {
|
|
161
|
+
const requesterAddress = '0x' + 'a'.repeat(40);
|
|
162
|
+
const mockFilter = { address: 'mock-filter' };
|
|
163
|
+
|
|
164
|
+
mockKernelContract.filters.TransactionCreated.mockReturnValue(mockFilter);
|
|
165
|
+
|
|
166
|
+
const mockEvents = [
|
|
167
|
+
{
|
|
168
|
+
args: {
|
|
169
|
+
transactionId: '0x' + '1'.repeat(64)
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
args: {
|
|
174
|
+
transactionId: '0x' + '2'.repeat(64)
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
];
|
|
178
|
+
|
|
179
|
+
mockKernelContract.queryFilter.mockResolvedValue(mockEvents);
|
|
180
|
+
|
|
181
|
+
mockKernelContract.transactions.mockImplementation((txId: string) => {
|
|
182
|
+
return Promise.resolve({
|
|
183
|
+
transactionId: txId,
|
|
184
|
+
requester: requesterAddress,
|
|
185
|
+
provider: '0x' + 'b'.repeat(40),
|
|
186
|
+
amount: BigInt('100000000'),
|
|
187
|
+
state: State.INITIATED,
|
|
188
|
+
createdAt: BigInt(Math.floor(Date.now() / 1000)),
|
|
189
|
+
deadline: BigInt(Math.floor(Date.now() / 1000) + 86400),
|
|
190
|
+
disputeWindow: BigInt(7200),
|
|
191
|
+
escrowContract: '0x' + 'c'.repeat(40),
|
|
192
|
+
escrowId: '0x' + '3'.repeat(64),
|
|
193
|
+
serviceHash: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
const transactions = await eventMonitor.getTransactionHistory(requesterAddress, 'requester');
|
|
198
|
+
|
|
199
|
+
expect(mockKernelContract.filters.TransactionCreated).toHaveBeenCalledWith(null, null, requesterAddress);
|
|
200
|
+
expect(transactions).toHaveLength(2);
|
|
201
|
+
expect(transactions[0].txId).toBe('0x' + '1'.repeat(64));
|
|
202
|
+
expect(transactions[1].txId).toBe('0x' + '2'.repeat(64));
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('should fetch transaction history for provider', async () => {
|
|
206
|
+
const providerAddress = '0x' + 'b'.repeat(40);
|
|
207
|
+
const mockFilter = { address: 'mock-filter' };
|
|
208
|
+
|
|
209
|
+
mockKernelContract.filters.TransactionCreated.mockReturnValue(mockFilter);
|
|
210
|
+
mockKernelContract.queryFilter.mockResolvedValue([]);
|
|
211
|
+
|
|
212
|
+
await eventMonitor.getTransactionHistory(providerAddress, 'provider');
|
|
213
|
+
|
|
214
|
+
expect(mockKernelContract.filters.TransactionCreated).toHaveBeenCalledWith(null, providerAddress, null);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('should default to requester role if not specified', async () => {
|
|
218
|
+
const address = '0x' + 'a'.repeat(40);
|
|
219
|
+
const mockFilter = { address: 'mock-filter' };
|
|
220
|
+
|
|
221
|
+
mockKernelContract.filters.TransactionCreated.mockReturnValue(mockFilter);
|
|
222
|
+
mockKernelContract.queryFilter.mockResolvedValue([]);
|
|
223
|
+
|
|
224
|
+
await eventMonitor.getTransactionHistory(address);
|
|
225
|
+
|
|
226
|
+
expect(mockKernelContract.filters.TransactionCreated).toHaveBeenCalledWith(null, null, address);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
describe('onTransactionCreated - Event Subscription', () => {
|
|
231
|
+
it('should subscribe to transaction creation events', () => {
|
|
232
|
+
const mockFilter = { address: 'mock-filter' };
|
|
233
|
+
const callback = jest.fn();
|
|
234
|
+
|
|
235
|
+
mockKernelContract.filters.TransactionCreated.mockReturnValue(mockFilter);
|
|
236
|
+
|
|
237
|
+
const cleanup = eventMonitor.onTransactionCreated(callback);
|
|
238
|
+
|
|
239
|
+
expect(mockKernelContract.filters.TransactionCreated).toHaveBeenCalledWith();
|
|
240
|
+
expect(mockKernelContract.on).toHaveBeenCalledWith(mockFilter, expect.any(Function));
|
|
241
|
+
expect(typeof cleanup).toBe('function');
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it('should invoke callback when transaction is created', () => {
|
|
245
|
+
const mockFilter = { address: 'mock-filter' };
|
|
246
|
+
const callback = jest.fn();
|
|
247
|
+
|
|
248
|
+
mockKernelContract.filters.TransactionCreated.mockReturnValue(mockFilter);
|
|
249
|
+
|
|
250
|
+
let eventListener: any;
|
|
251
|
+
mockKernelContract.on.mockImplementation((_filter, listener) => {
|
|
252
|
+
eventListener = listener;
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
eventMonitor.onTransactionCreated(callback);
|
|
256
|
+
|
|
257
|
+
// Simulate TransactionCreated event
|
|
258
|
+
const mockEvent = { blockNumber: 12345 };
|
|
259
|
+
const txId = '0x' + '1'.repeat(64);
|
|
260
|
+
const provider = '0x' + 'b'.repeat(40);
|
|
261
|
+
const requester = '0x' + 'a'.repeat(40);
|
|
262
|
+
const amount = BigInt('100000000');
|
|
263
|
+
|
|
264
|
+
eventListener(txId, provider, requester, amount, mockEvent);
|
|
265
|
+
|
|
266
|
+
expect(callback).toHaveBeenCalledWith({
|
|
267
|
+
txId,
|
|
268
|
+
provider,
|
|
269
|
+
requester,
|
|
270
|
+
amount
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
it('should remove listener when cleanup function is called', () => {
|
|
275
|
+
const mockFilter = { address: 'mock-filter' };
|
|
276
|
+
const callback = jest.fn();
|
|
277
|
+
|
|
278
|
+
mockKernelContract.filters.TransactionCreated.mockReturnValue(mockFilter);
|
|
279
|
+
|
|
280
|
+
const cleanup = eventMonitor.onTransactionCreated(callback);
|
|
281
|
+
cleanup();
|
|
282
|
+
|
|
283
|
+
expect(mockKernelContract.off).toHaveBeenCalledWith(mockFilter, expect.any(Function));
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
describe('onStateChanged - State Change Subscription', () => {
|
|
288
|
+
it('should subscribe to state change events', () => {
|
|
289
|
+
const mockFilter = { address: 'mock-filter' };
|
|
290
|
+
const callback = jest.fn();
|
|
291
|
+
|
|
292
|
+
mockKernelContract.filters.StateTransitioned.mockReturnValue(mockFilter);
|
|
293
|
+
|
|
294
|
+
const cleanup = eventMonitor.onStateChanged(callback);
|
|
295
|
+
|
|
296
|
+
expect(mockKernelContract.filters.StateTransitioned).toHaveBeenCalledWith();
|
|
297
|
+
expect(mockKernelContract.on).toHaveBeenCalledWith(mockFilter, expect.any(Function));
|
|
298
|
+
expect(typeof cleanup).toBe('function');
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
it('should invoke callback with state transition details', () => {
|
|
302
|
+
const mockFilter = { address: 'mock-filter' };
|
|
303
|
+
const callback = jest.fn();
|
|
304
|
+
|
|
305
|
+
mockKernelContract.filters.StateTransitioned.mockReturnValue(mockFilter);
|
|
306
|
+
|
|
307
|
+
let eventListener: any;
|
|
308
|
+
mockKernelContract.on.mockImplementation((_filter, listener) => {
|
|
309
|
+
eventListener = listener;
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
eventMonitor.onStateChanged(callback);
|
|
313
|
+
|
|
314
|
+
// Simulate StateTransitioned event
|
|
315
|
+
const txId = '0x' + '1'.repeat(64);
|
|
316
|
+
eventListener(txId, State.INITIATED, State.QUOTED);
|
|
317
|
+
|
|
318
|
+
expect(callback).toHaveBeenCalledWith(txId, State.INITIATED, State.QUOTED);
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
it('should remove listener when cleanup function is called', () => {
|
|
322
|
+
const mockFilter = { address: 'mock-filter' };
|
|
323
|
+
const callback = jest.fn();
|
|
324
|
+
|
|
325
|
+
mockKernelContract.filters.StateTransitioned.mockReturnValue(mockFilter);
|
|
326
|
+
|
|
327
|
+
const cleanup = eventMonitor.onStateChanged(callback);
|
|
328
|
+
cleanup();
|
|
329
|
+
|
|
330
|
+
expect(mockKernelContract.off).toHaveBeenCalledWith(mockFilter, expect.any(Function));
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
describe('onEscrowReleased - Escrow Release Subscription', () => {
|
|
335
|
+
it('should subscribe to escrow release events', () => {
|
|
336
|
+
const mockFilter = { address: 'mock-filter' };
|
|
337
|
+
const callback = jest.fn();
|
|
338
|
+
|
|
339
|
+
mockKernelContract.filters.EscrowReleased.mockReturnValue(mockFilter);
|
|
340
|
+
|
|
341
|
+
const cleanup = eventMonitor.onEscrowReleased(callback);
|
|
342
|
+
|
|
343
|
+
expect(mockKernelContract.filters.EscrowReleased).toHaveBeenCalledWith();
|
|
344
|
+
expect(mockKernelContract.on).toHaveBeenCalledWith(mockFilter, expect.any(Function));
|
|
345
|
+
expect(typeof cleanup).toBe('function');
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
it('should invoke callback when escrow is released', () => {
|
|
349
|
+
const mockFilter = { address: 'mock-filter' };
|
|
350
|
+
const callback = jest.fn();
|
|
351
|
+
|
|
352
|
+
mockKernelContract.filters.EscrowReleased.mockReturnValue(mockFilter);
|
|
353
|
+
|
|
354
|
+
let eventListener: any;
|
|
355
|
+
mockKernelContract.on.mockImplementation((_filter, listener) => {
|
|
356
|
+
eventListener = listener;
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
eventMonitor.onEscrowReleased(callback);
|
|
360
|
+
|
|
361
|
+
// Simulate EscrowReleased event
|
|
362
|
+
const txId = '0x' + '1'.repeat(64);
|
|
363
|
+
const amount = BigInt('100000000');
|
|
364
|
+
|
|
365
|
+
eventListener(txId, amount);
|
|
366
|
+
|
|
367
|
+
expect(callback).toHaveBeenCalledWith(txId, amount);
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
it('should remove listener when cleanup function is called', () => {
|
|
371
|
+
const mockFilter = { address: 'mock-filter' };
|
|
372
|
+
const callback = jest.fn();
|
|
373
|
+
|
|
374
|
+
mockKernelContract.filters.EscrowReleased.mockReturnValue(mockFilter);
|
|
375
|
+
|
|
376
|
+
const cleanup = eventMonitor.onEscrowReleased(callback);
|
|
377
|
+
cleanup();
|
|
378
|
+
|
|
379
|
+
expect(mockKernelContract.off).toHaveBeenCalledWith(mockFilter, expect.any(Function));
|
|
380
|
+
});
|
|
381
|
+
});
|
|
382
|
+
});
|