@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.
Files changed (154) hide show
  1. package/README.md +183 -0
  2. package/dist/ACTPClient.d.ts +52 -0
  3. package/dist/ACTPClient.d.ts.map +1 -0
  4. package/dist/ACTPClient.js +120 -0
  5. package/dist/ACTPClient.js.map +1 -0
  6. package/dist/abi/ACTPKernel.json +1340 -0
  7. package/dist/abi/ERC20.json +38 -0
  8. package/dist/abi/EscrowVault.json +64 -0
  9. package/dist/builders/DeliveryProofBuilder.d.ts +37 -0
  10. package/dist/builders/DeliveryProofBuilder.d.ts.map +1 -0
  11. package/dist/builders/DeliveryProofBuilder.js +165 -0
  12. package/dist/builders/DeliveryProofBuilder.js.map +1 -0
  13. package/dist/builders/QuoteBuilder.d.ts +68 -0
  14. package/dist/builders/QuoteBuilder.d.ts.map +1 -0
  15. package/dist/builders/QuoteBuilder.js +255 -0
  16. package/dist/builders/QuoteBuilder.js.map +1 -0
  17. package/dist/builders/index.d.ts +3 -0
  18. package/dist/builders/index.d.ts.map +1 -0
  19. package/dist/builders/index.js +10 -0
  20. package/dist/builders/index.js.map +1 -0
  21. package/dist/config/networks.d.ts +27 -0
  22. package/dist/config/networks.d.ts.map +1 -0
  23. package/dist/config/networks.js +103 -0
  24. package/dist/config/networks.js.map +1 -0
  25. package/dist/errors/index.d.ts +38 -0
  26. package/dist/errors/index.d.ts.map +1 -0
  27. package/dist/errors/index.js +87 -0
  28. package/dist/errors/index.js.map +1 -0
  29. package/dist/index.d.ts +19 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +68 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/protocol/ACTPKernel.d.ts +30 -0
  34. package/dist/protocol/ACTPKernel.d.ts.map +1 -0
  35. package/dist/protocol/ACTPKernel.js +261 -0
  36. package/dist/protocol/ACTPKernel.js.map +1 -0
  37. package/dist/protocol/EASHelper.d.ts +23 -0
  38. package/dist/protocol/EASHelper.d.ts.map +1 -0
  39. package/dist/protocol/EASHelper.js +106 -0
  40. package/dist/protocol/EASHelper.js.map +1 -0
  41. package/dist/protocol/EscrowVault.d.ts +24 -0
  42. package/dist/protocol/EscrowVault.d.ts.map +1 -0
  43. package/dist/protocol/EscrowVault.js +114 -0
  44. package/dist/protocol/EscrowVault.js.map +1 -0
  45. package/dist/protocol/EventMonitor.d.ts +18 -0
  46. package/dist/protocol/EventMonitor.d.ts.map +1 -0
  47. package/dist/protocol/EventMonitor.js +92 -0
  48. package/dist/protocol/EventMonitor.js.map +1 -0
  49. package/dist/protocol/MessageSigner.d.ts +23 -0
  50. package/dist/protocol/MessageSigner.d.ts.map +1 -0
  51. package/dist/protocol/MessageSigner.js +178 -0
  52. package/dist/protocol/MessageSigner.js.map +1 -0
  53. package/dist/protocol/ProofGenerator.d.ts +22 -0
  54. package/dist/protocol/ProofGenerator.d.ts.map +1 -0
  55. package/dist/protocol/ProofGenerator.js +64 -0
  56. package/dist/protocol/ProofGenerator.js.map +1 -0
  57. package/dist/protocol/QuoteBuilder.d.ts +2 -0
  58. package/dist/protocol/QuoteBuilder.d.ts.map +1 -0
  59. package/dist/protocol/QuoteBuilder.js +7 -0
  60. package/dist/protocol/QuoteBuilder.js.map +1 -0
  61. package/dist/types/eip712.d.ts +106 -0
  62. package/dist/types/eip712.d.ts.map +1 -0
  63. package/dist/types/eip712.js +84 -0
  64. package/dist/types/eip712.js.map +1 -0
  65. package/dist/types/escrow.d.ts +18 -0
  66. package/dist/types/escrow.d.ts.map +1 -0
  67. package/dist/types/escrow.js +3 -0
  68. package/dist/types/escrow.js.map +1 -0
  69. package/dist/types/index.d.ts +6 -0
  70. package/dist/types/index.d.ts.map +1 -0
  71. package/dist/types/index.js +22 -0
  72. package/dist/types/index.js.map +1 -0
  73. package/dist/types/message.d.ts +109 -0
  74. package/dist/types/message.d.ts.map +1 -0
  75. package/dist/types/message.js +3 -0
  76. package/dist/types/message.js.map +1 -0
  77. package/dist/types/state.d.ts +19 -0
  78. package/dist/types/state.d.ts.map +1 -0
  79. package/dist/types/state.js +49 -0
  80. package/dist/types/state.js.map +1 -0
  81. package/dist/types/transaction.d.ts +36 -0
  82. package/dist/types/transaction.d.ts.map +1 -0
  83. package/dist/types/transaction.js +3 -0
  84. package/dist/types/transaction.js.map +1 -0
  85. package/dist/utils/IPFSClient.d.ts +37 -0
  86. package/dist/utils/IPFSClient.d.ts.map +1 -0
  87. package/dist/utils/IPFSClient.js +128 -0
  88. package/dist/utils/IPFSClient.js.map +1 -0
  89. package/dist/utils/NonceManager.d.ts +34 -0
  90. package/dist/utils/NonceManager.d.ts.map +1 -0
  91. package/dist/utils/NonceManager.js +114 -0
  92. package/dist/utils/NonceManager.js.map +1 -0
  93. package/dist/utils/ReceivedNonceTracker.d.ts +35 -0
  94. package/dist/utils/ReceivedNonceTracker.d.ts.map +1 -0
  95. package/dist/utils/ReceivedNonceTracker.js +196 -0
  96. package/dist/utils/ReceivedNonceTracker.js.map +1 -0
  97. package/dist/utils/canonicalJson.d.ts +4 -0
  98. package/dist/utils/canonicalJson.d.ts.map +1 -0
  99. package/dist/utils/canonicalJson.js +21 -0
  100. package/dist/utils/canonicalJson.js.map +1 -0
  101. package/dist/utils/computeTypeHash.d.ts +3 -0
  102. package/dist/utils/computeTypeHash.d.ts.map +1 -0
  103. package/dist/utils/computeTypeHash.js +30 -0
  104. package/dist/utils/computeTypeHash.js.map +1 -0
  105. package/dist/utils/validation.d.ts +6 -0
  106. package/dist/utils/validation.d.ts.map +1 -0
  107. package/dist/utils/validation.js +46 -0
  108. package/dist/utils/validation.js.map +1 -0
  109. package/package.json +73 -0
  110. package/src/ACTPClient.ts +276 -0
  111. package/src/__tests__/ProofGenerator.test.ts +124 -0
  112. package/src/__tests__/QuoteBuilder.test.ts +516 -0
  113. package/src/__tests__/StateMachine.test.ts +82 -0
  114. package/src/__tests__/builders/DeliveryProofBuilder.test.ts +581 -0
  115. package/src/__tests__/integration/ACTPClient.test.ts +263 -0
  116. package/src/__tests__/integration.test.ts +289 -0
  117. package/src/__tests__/protocol/EASHelper.test.ts +472 -0
  118. package/src/__tests__/protocol/EventMonitor.test.ts +382 -0
  119. package/src/__tests__/security/ACTPKernel.security.test.ts +1167 -0
  120. package/src/__tests__/security/EscrowVault.security.test.ts +570 -0
  121. package/src/__tests__/security/MessageSigner.security.test.ts +286 -0
  122. package/src/__tests__/security/NonceReplay.security.test.ts +501 -0
  123. package/src/__tests__/security/validation.security.test.ts +376 -0
  124. package/src/__tests__/utils/IPFSClient.test.ts +262 -0
  125. package/src/__tests__/utils/NonceManager.test.ts +205 -0
  126. package/src/__tests__/utils/canonicalJson.test.ts +153 -0
  127. package/src/abi/ACTPKernel.json +1340 -0
  128. package/src/abi/ERC20.json +40 -0
  129. package/src/abi/EscrowVault.json +66 -0
  130. package/src/builders/DeliveryProofBuilder.ts +326 -0
  131. package/src/builders/QuoteBuilder.ts +483 -0
  132. package/src/builders/index.ts +17 -0
  133. package/src/config/networks.ts +165 -0
  134. package/src/errors/index.ts +130 -0
  135. package/src/index.ts +108 -0
  136. package/src/protocol/ACTPKernel.ts +625 -0
  137. package/src/protocol/EASHelper.ts +197 -0
  138. package/src/protocol/EscrowVault.ts +237 -0
  139. package/src/protocol/EventMonitor.ts +161 -0
  140. package/src/protocol/MessageSigner.ts +336 -0
  141. package/src/protocol/ProofGenerator.ts +119 -0
  142. package/src/protocol/QuoteBuilder.ts +15 -0
  143. package/src/types/eip712.ts +175 -0
  144. package/src/types/escrow.ts +26 -0
  145. package/src/types/index.ts +10 -0
  146. package/src/types/message.ts +145 -0
  147. package/src/types/state.ts +77 -0
  148. package/src/types/transaction.ts +54 -0
  149. package/src/utils/IPFSClient.ts +248 -0
  150. package/src/utils/NonceManager.ts +293 -0
  151. package/src/utils/ReceivedNonceTracker.ts +397 -0
  152. package/src/utils/canonicalJson.ts +38 -0
  153. package/src/utils/computeTypeHash.ts +50 -0
  154. package/src/utils/validation.ts +82 -0
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ACTPKernel = void 0;
7
+ const ethers_1 = require("ethers");
8
+ const ACTPKernel_json_1 = __importDefault(require("../abi/ACTPKernel.json"));
9
+ const types_1 = require("../types");
10
+ const errors_1 = require("../errors");
11
+ const validation_1 = require("../utils/validation");
12
+ class ACTPKernel {
13
+ constructor(address, signer, gasSettings) {
14
+ this.address = address;
15
+ this.contract = new ethers_1.Contract(address, ACTPKernel_json_1.default, signer);
16
+ this.gasSettings = gasSettings;
17
+ }
18
+ getAddress() {
19
+ return this.address;
20
+ }
21
+ getGasBufferMultiplier(operation) {
22
+ const buffers = {
23
+ 'createTransaction': 1.15,
24
+ 'transitionState': 1.20,
25
+ 'releaseEscrow': 1.30,
26
+ 'raiseDispute': 1.25,
27
+ 'resolveDispute': 1.30,
28
+ 'cancelTransaction': 1.15,
29
+ 'anchorAttestation': 1.15
30
+ };
31
+ return buffers[operation] || 1.20;
32
+ }
33
+ buildTxOptions(estimatedGas, operation = 'default') {
34
+ const bufferMultiplier = this.getGasBufferMultiplier(operation);
35
+ const options = {
36
+ gasLimit: (estimatedGas * BigInt(Math.round(bufferMultiplier * 100))) / 100n
37
+ };
38
+ if (this.gasSettings?.maxFeePerGas) {
39
+ options.maxFeePerGas = this.gasSettings.maxFeePerGas;
40
+ }
41
+ if (this.gasSettings?.maxPriorityFeePerGas) {
42
+ options.maxPriorityFeePerGas = this.gasSettings.maxPriorityFeePerGas;
43
+ }
44
+ return options;
45
+ }
46
+ async createTransaction(params) {
47
+ const { provider, requester, amount, deadline, disputeWindow, metadata = '0x0000000000000000000000000000000000000000000000000000000000000000' } = params;
48
+ (0, validation_1.validateAddress)(provider, 'provider');
49
+ (0, validation_1.validateAddress)(requester, 'requester');
50
+ (0, validation_1.validateAmount)(amount, 'amount');
51
+ (0, validation_1.validateDeadline)(deadline, 'deadline');
52
+ (0, validation_1.validateDisputeWindow)(disputeWindow, 'disputeWindow');
53
+ try {
54
+ const createTxFunc = this.contract.getFunction('createTransaction');
55
+ const estimatedGas = await createTxFunc.estimateGas(provider, requester, amount, deadline, disputeWindow, metadata);
56
+ const txOptions = this.buildTxOptions(estimatedGas, 'createTransaction');
57
+ const tx = await createTxFunc(provider, requester, amount, deadline, disputeWindow, metadata, txOptions);
58
+ const receipt = await tx.wait(2);
59
+ if (!receipt) {
60
+ throw new Error('Transaction receipt not available');
61
+ }
62
+ for (const log of receipt.logs) {
63
+ try {
64
+ const parsedLog = this.contract.interface.parseLog({
65
+ topics: [...log.topics],
66
+ data: log.data
67
+ });
68
+ if (parsedLog && parsedLog.name === 'TransactionCreated') {
69
+ return parsedLog.args.transactionId || parsedLog.args[0];
70
+ }
71
+ }
72
+ catch (e) {
73
+ continue;
74
+ }
75
+ }
76
+ throw new Error('TransactionCreated event not found in receipt');
77
+ }
78
+ catch (error) {
79
+ throw new errors_1.TransactionRevertedError(error.transactionHash, error.reason || error.message);
80
+ }
81
+ }
82
+ async transitionState(txId, newState, proof = '0x') {
83
+ (0, validation_1.validateTxId)(txId, 'txId');
84
+ const currentTx = await this.getTransaction(txId);
85
+ if (!types_1.StateMachine.isValidTransition(currentTx.state, newState)) {
86
+ const validStates = types_1.StateMachine.getNextValidStates(currentTx.state).map((s) => types_1.State[s]);
87
+ throw new errors_1.InvalidStateTransitionError(currentTx.state, newState, validStates);
88
+ }
89
+ try {
90
+ const transitionFunc = this.contract.getFunction('transitionState');
91
+ const estimatedGas = await transitionFunc.estimateGas(txId, newState, proof);
92
+ const txOptions = this.buildTxOptions(estimatedGas, 'transitionState');
93
+ const tx = await transitionFunc(txId, newState, proof, txOptions);
94
+ await tx.wait(2);
95
+ }
96
+ catch (error) {
97
+ throw new errors_1.TransactionRevertedError(error.transactionHash, error.reason || error.message);
98
+ }
99
+ }
100
+ async submitQuote(txId, quoteHash) {
101
+ (0, validation_1.validateTxId)(txId, 'txId');
102
+ if (!/^0x[a-fA-F0-9]{64}$/.test(quoteHash)) {
103
+ throw new errors_1.ValidationError('quoteHash', 'Must be valid bytes32 hex string');
104
+ }
105
+ if (quoteHash === '0x0000000000000000000000000000000000000000000000000000000000000000') {
106
+ throw new errors_1.ValidationError('quoteHash', 'Cannot be zero hash');
107
+ }
108
+ const currentTx = await this.getTransaction(txId);
109
+ if (currentTx.state !== types_1.State.INITIATED) {
110
+ throw new errors_1.InvalidStateTransitionError(currentTx.state, types_1.State.QUOTED, ['INITIATED']);
111
+ }
112
+ const abiCoder = ethers_1.AbiCoder.defaultAbiCoder();
113
+ const proof = abiCoder.encode(['bytes32'], [quoteHash]);
114
+ await this.transitionState(txId, types_1.State.QUOTED, proof);
115
+ }
116
+ async linkEscrow(txId, escrowContract, escrowId) {
117
+ (0, validation_1.validateTxId)(txId, 'txId');
118
+ (0, validation_1.validateAddress)(escrowContract, 'escrowContract');
119
+ (0, validation_1.validateTxId)(escrowId, 'escrowId');
120
+ try {
121
+ const linkEscrowFunc = this.contract.getFunction('linkEscrow');
122
+ const estimatedGas = await linkEscrowFunc.estimateGas(txId, escrowContract, escrowId);
123
+ const txOptions = this.buildTxOptions(estimatedGas, 'transitionState');
124
+ const tx = await linkEscrowFunc(txId, escrowContract, escrowId, txOptions);
125
+ await tx.wait(2);
126
+ }
127
+ catch (error) {
128
+ throw new errors_1.TransactionRevertedError(error.transactionHash, error.reason || error.message);
129
+ }
130
+ }
131
+ async releaseMilestone(txId, milestoneId, amount) {
132
+ (0, validation_1.validateTxId)(txId, 'txId');
133
+ (0, validation_1.validateAmount)(amount, 'amount');
134
+ if (milestoneId < 0) {
135
+ throw new errors_1.ValidationError('milestoneId', 'Milestone ID cannot be negative');
136
+ }
137
+ try {
138
+ const releaseMilestoneFunc = this.contract.getFunction('releaseMilestone');
139
+ const estimatedGas = await releaseMilestoneFunc.estimateGas(txId, milestoneId, amount);
140
+ const txOptions = this.buildTxOptions(estimatedGas, 'releaseEscrow');
141
+ const tx = await releaseMilestoneFunc(txId, milestoneId, amount, txOptions);
142
+ await tx.wait(2);
143
+ }
144
+ catch (error) {
145
+ throw new errors_1.TransactionRevertedError(error.transactionHash, error.reason || error.message);
146
+ }
147
+ }
148
+ async releaseEscrow(txId) {
149
+ (0, validation_1.validateTxId)(txId, 'txId');
150
+ try {
151
+ const releaseEscrowFunc = this.contract.getFunction('releaseEscrow');
152
+ const estimatedGas = await releaseEscrowFunc.estimateGas(txId);
153
+ const txOptions = this.buildTxOptions(estimatedGas, 'releaseEscrow');
154
+ const tx = await releaseEscrowFunc(txId, txOptions);
155
+ await tx.wait(2);
156
+ }
157
+ catch (error) {
158
+ throw new errors_1.TransactionRevertedError(error.transactionHash, error.reason || error.message);
159
+ }
160
+ }
161
+ async getTransaction(txId) {
162
+ const txData = await this.contract.getTransaction(txId);
163
+ if (txData.createdAt === 0 || txData.createdAt === 0n) {
164
+ throw new errors_1.TransactionNotFoundError(txId);
165
+ }
166
+ return {
167
+ txId: txData.transactionId,
168
+ requester: txData.requester,
169
+ provider: txData.provider,
170
+ amount: txData.amount,
171
+ state: (typeof txData.state === 'bigint' ? Number(txData.state) : txData.state),
172
+ createdAt: typeof txData.createdAt === 'bigint' ? Number(txData.createdAt) : txData.createdAt,
173
+ deadline: typeof txData.deadline === 'bigint' ? Number(txData.deadline) : txData.deadline,
174
+ disputeWindow: typeof txData.disputeWindow === 'bigint' ? Number(txData.disputeWindow) : txData.disputeWindow,
175
+ escrowContract: txData.escrowContract,
176
+ escrowId: txData.escrowId,
177
+ metadata: txData.metadata || txData.serviceHash
178
+ };
179
+ }
180
+ async getEconomicParams() {
181
+ const params = await this.contract.getEconomicParams();
182
+ return {
183
+ baseFeeNumerator: Number(params.platformFeeBps || params[0]),
184
+ baseFeeDenominator: 10000,
185
+ feeRecipient: params.feeRecipient || params[2],
186
+ requesterPenaltyBps: Number(params.requesterPenaltyBps || params[1]),
187
+ providerPenaltyBps: 0
188
+ };
189
+ }
190
+ async estimateCreateTransaction(params) {
191
+ const { provider, requester, amount, deadline, disputeWindow, metadata = '0x0000000000000000000000000000000000000000000000000000000000000000' } = params;
192
+ const createTxFunc = this.contract.getFunction('createTransaction');
193
+ return await createTxFunc.estimateGas(provider, requester, amount, deadline, disputeWindow, metadata);
194
+ }
195
+ async raiseDispute(txId, reason, evidence) {
196
+ (0, validation_1.validateTxId)(txId, 'txId');
197
+ const abiCoder = ethers_1.AbiCoder.defaultAbiCoder();
198
+ const proofData = abiCoder.encode(['string', 'string'], [reason, evidence]);
199
+ try {
200
+ const transitionFunc = this.contract.getFunction('transitionState');
201
+ const estimatedGas = await transitionFunc.estimateGas(txId, types_1.State.DISPUTED, proofData);
202
+ const txOptions = this.buildTxOptions(estimatedGas, 'raiseDispute');
203
+ const tx = await transitionFunc(txId, types_1.State.DISPUTED, proofData, txOptions);
204
+ await tx.wait(2);
205
+ }
206
+ catch (error) {
207
+ throw new errors_1.TransactionRevertedError(error.transactionHash, error.reason || error.message);
208
+ }
209
+ }
210
+ async resolveDispute(txId, resolution) {
211
+ (0, validation_1.validateTxId)(txId, 'txId');
212
+ const { requesterAmount, providerAmount, mediatorAmount, mediator } = resolution;
213
+ if (requesterAmount < 0n || providerAmount < 0n || mediatorAmount < 0n) {
214
+ throw new Error('Dispute resolution amounts cannot be negative');
215
+ }
216
+ if (mediatorAmount > 0n) {
217
+ if (!mediator) {
218
+ throw new Error('Mediator address required when mediator amount > 0');
219
+ }
220
+ (0, validation_1.validateAddress)(mediator, 'mediator');
221
+ }
222
+ const abiCoder = ethers_1.AbiCoder.defaultAbiCoder();
223
+ const proofData = abiCoder.encode(['uint256', 'uint256', 'uint256', 'address'], [
224
+ requesterAmount,
225
+ providerAmount,
226
+ mediatorAmount,
227
+ mediator || ethers_1.ethers.getAddress('0x0000000000000000000000000000000000000000')
228
+ ]);
229
+ try {
230
+ const transitionFunc = this.contract.getFunction('transitionState');
231
+ const estimatedGas = await transitionFunc.estimateGas(txId, types_1.State.SETTLED, proofData);
232
+ const txOptions = this.buildTxOptions(estimatedGas, 'resolveDispute');
233
+ const tx = await transitionFunc(txId, types_1.State.SETTLED, proofData, txOptions);
234
+ await tx.wait(2);
235
+ }
236
+ catch (error) {
237
+ throw new errors_1.TransactionRevertedError(error.transactionHash, error.reason || error.message);
238
+ }
239
+ }
240
+ async settleDispute(txId, resolution) {
241
+ return this.resolveDispute(txId, resolution);
242
+ }
243
+ async anchorAttestation(txId, attestationUID) {
244
+ (0, validation_1.validateTxId)(txId, 'txId');
245
+ if (!attestationUID || !/^0x[a-fA-F0-9]{64}$/.test(attestationUID)) {
246
+ throw new errors_1.ValidationError('attestationUID', 'Must be 32-byte hex string (0x...)');
247
+ }
248
+ try {
249
+ const anchorFunc = this.contract.getFunction('anchorAttestation');
250
+ const estimatedGas = await anchorFunc.estimateGas(txId, attestationUID);
251
+ const txOptions = this.buildTxOptions(estimatedGas, 'anchorAttestation');
252
+ const tx = await anchorFunc(txId, attestationUID, txOptions);
253
+ await tx.wait(2);
254
+ }
255
+ catch (error) {
256
+ throw new errors_1.TransactionRevertedError(error.transactionHash, error.reason || error.message);
257
+ }
258
+ }
259
+ }
260
+ exports.ACTPKernel = ACTPKernel;
261
+ //# sourceMappingURL=ACTPKernel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ACTPKernel.js","sourceRoot":"","sources":["../../src/protocol/ACTPKernel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { Signer } from 'ethers';
2
+ import { DeliveryProof } from '../types';
3
+ export interface EASConfig {
4
+ contractAddress: string;
5
+ deliveryProofSchemaId: string;
6
+ }
7
+ export interface AttestationResponse {
8
+ uid: string;
9
+ transactionHash: string;
10
+ }
11
+ export declare class EASHelper {
12
+ private readonly config;
13
+ private readonly eas;
14
+ constructor(signer: Signer, config: EASConfig);
15
+ attestDeliveryProof(proof: DeliveryProof, recipient: string, options?: {
16
+ expirationTime?: number;
17
+ revocable?: boolean;
18
+ }): Promise<AttestationResponse>;
19
+ revokeAttestation(uid: string): Promise<string>;
20
+ getAttestation(uid: string): Promise<any>;
21
+ verifyDeliveryAttestation(txId: string, attestationUID: string): Promise<boolean>;
22
+ }
23
+ //# sourceMappingURL=EASHelper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EASHelper.d.ts","sourceRoot":"","sources":["../../src/protocol/EASHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,MAAM,EAA0B,MAAM,QAAQ,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;CACzB;AAYD,qBAAa,SAAS;IAGQ,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAW;gBAEnB,MAAM,EAAE,MAAM,EAAmB,MAAM,EAAE,SAAS;IAOxD,mBAAmB,CACvB,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GACzD,OAAO,CAAC,mBAAmB,CAAC;IAoDzB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY/C,cAAc,CAAC,GAAG,EAAE,MAAM;IAqB1B,yBAAyB,CAC7B,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC;CAsEpB"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EASHelper = void 0;
4
+ const ethers_1 = require("ethers");
5
+ const eip712_1 = require("../types/eip712");
6
+ const EAS_ABI = [
7
+ 'event Attested(address indexed attester, bytes32 indexed uid, bytes32 indexed schema)',
8
+ 'function attest(tuple(bytes32 schema, tuple(address recipient, uint64 expirationTime, bool revocable, bytes32 refUID, bytes data) data) request) external returns (bytes32)',
9
+ 'function revoke(tuple(bytes32 schema, bytes32 uid) request) external returns (bytes32)',
10
+ 'function getAttestation(bytes32 uid) external view returns (tuple(bytes32 uid, bytes32 schema, address recipient, address attester, uint64 time, uint64 expirationTime, bool revocable, bytes32 refUID, bytes data, uint32 bump))'
11
+ ];
12
+ class EASHelper {
13
+ constructor(signer, config) {
14
+ this.config = config;
15
+ this.eas = new ethers_1.Contract(config.contractAddress, EAS_ABI, signer);
16
+ }
17
+ async attestDeliveryProof(proof, recipient, options) {
18
+ const { expirationTime = 0, revocable = true } = options || {};
19
+ const proofData = (0, eip712_1.deliveryProofDataFromProof)(proof);
20
+ const abiCoder = ethers_1.AbiCoder.defaultAbiCoder();
21
+ const encodedData = abiCoder.encode(['bytes32', 'bytes32', 'uint256', 'string', 'uint256', 'string'], [
22
+ proofData.txId,
23
+ proofData.contentHash,
24
+ proofData.timestamp,
25
+ proofData.deliveryUrl || '',
26
+ proofData.size,
27
+ proofData.mimeType
28
+ ]);
29
+ const tx = await this.eas.attest({
30
+ schema: this.config.deliveryProofSchemaId,
31
+ data: {
32
+ recipient,
33
+ expirationTime,
34
+ revocable,
35
+ refUID: proof.txId,
36
+ data: encodedData
37
+ }
38
+ });
39
+ const receipt = await tx.wait();
40
+ const attestedLog = receipt?.logs?.find((log) => {
41
+ try {
42
+ const parsed = this.eas.interface.parseLog(log);
43
+ return parsed?.name === 'Attested';
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ });
49
+ const uid = attestedLog
50
+ ? this.eas.interface.parseLog(attestedLog)?.args?.uid
51
+ : (0, ethers_1.zeroPadValue)('0x00', 32);
52
+ return {
53
+ uid,
54
+ transactionHash: receipt.transactionHash
55
+ };
56
+ }
57
+ async revokeAttestation(uid) {
58
+ const tx = await this.eas.revoke({
59
+ schema: this.config.deliveryProofSchemaId,
60
+ uid
61
+ });
62
+ const receipt = await tx.wait();
63
+ return receipt.transactionHash;
64
+ }
65
+ async getAttestation(uid) {
66
+ return await this.eas.getAttestation(uid);
67
+ }
68
+ async verifyDeliveryAttestation(txId, attestationUID) {
69
+ const attestation = await this.eas.getAttestation(attestationUID);
70
+ if (attestation.uid !== attestationUID) {
71
+ throw new Error(`Attestation not found: ${attestationUID}`);
72
+ }
73
+ if (attestation.schema !== this.config.deliveryProofSchemaId) {
74
+ throw new Error(`Schema UID mismatch: expected canonical delivery schema ${this.config.deliveryProofSchemaId}, ` +
75
+ `got ${attestation.schema}. Attestation may be from a different schema!`);
76
+ }
77
+ const isRevoked = attestation.revocationTime > 0n;
78
+ if (isRevoked) {
79
+ throw new Error(`Attestation has been revoked: ${attestationUID} (revoked at timestamp ${attestation.revocationTime})`);
80
+ }
81
+ if (attestation.expirationTime > 0n) {
82
+ const now = Math.floor(Date.now() / 1000);
83
+ if (Number(attestation.expirationTime) < now) {
84
+ throw new Error(`Attestation has expired: ${attestationUID} (expired at ${attestation.expirationTime})`);
85
+ }
86
+ }
87
+ let attestedTxId;
88
+ try {
89
+ const abiCoder = ethers_1.AbiCoder.defaultAbiCoder();
90
+ const decoded = abiCoder.decode(['bytes32', 'bytes32', 'uint256', 'string', 'uint256', 'string'], attestation.data);
91
+ attestedTxId = decoded[0];
92
+ }
93
+ catch (error) {
94
+ throw new Error(`Attestation data format mismatch: cannot decode attestation ${attestationUID}. ` +
95
+ `Expected AIP-4 delivery proof schema format. ` +
96
+ `Original error: ${error.message}`);
97
+ }
98
+ if (attestedTxId !== txId) {
99
+ throw new Error(`Attestation txId mismatch: expected ${txId}, got ${attestedTxId}. ` +
100
+ `Provider may be attempting to use attestation from different transaction!`);
101
+ }
102
+ return true;
103
+ }
104
+ }
105
+ exports.EASHelper = EASHelper;
106
+ //# sourceMappingURL=EASHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EASHelper.js","sourceRoot":"","sources":["../../src/protocol/EASHelper.ts"],"names":[],"mappings":";;;AAAA,mCAAkE;AAElE,4CAA6D;AAe7D,MAAM,OAAO,GAAG;IACd,uFAAuF;IACvF,6KAA6K;IAC7K,wFAAwF;IACxF,mOAAmO;CACpO,CAAC;AAEF,MAAa,SAAS;IAGpB,YAAY,MAAc,EAAmB,MAAiB;QAAjB,WAAM,GAAN,MAAM,CAAW;QAC5D,IAAI,CAAC,GAAG,GAAG,IAAI,iBAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACnE,CAAC;IAKD,KAAK,CAAC,mBAAmB,CACvB,KAAoB,EACpB,SAAiB,EACjB,OAA0D;QAE1D,MAAM,EAAE,cAAc,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QAC/D,MAAM,SAAS,GAAG,IAAA,mCAA0B,EAAC,KAAK,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,iBAAQ,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CACjC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAChE;YACE,SAAS,CAAC,IAAI;YACd,SAAS,CAAC,WAAW;YACrB,SAAS,CAAC,SAAS;YACnB,SAAS,CAAC,WAAW,IAAI,EAAE;YAC3B,SAAS,CAAC,IAAI;YACd,SAAS,CAAC,QAAQ;SACnB,CACF,CAAC;QAEF,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB;YACzC,IAAI,EAAE;gBACJ,SAAS;gBACT,cAAc;gBACd,SAAS;gBACT,MAAM,EAAE,KAAK,CAAC,IAAI;gBAClB,IAAI,EAAE,WAAW;aAClB;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhC,MAAM,WAAW,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE;YACnD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAChD,OAAO,MAAM,EAAE,IAAI,KAAK,UAAU,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,WAAW;YACrB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG;YACrD,CAAC,CAAC,IAAA,qBAAY,EAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAE7B,OAAO;YACL,GAAG;YACH,eAAe,EAAE,OAAO,CAAC,eAAe;SACzC,CAAC;IACJ,CAAC;IAKD,KAAK,CAAC,iBAAiB,CAAC,GAAW;QACjC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB;YACzC,GAAG;SACJ,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC,eAAe,CAAC;IACjC,CAAC;IAKD,KAAK,CAAC,cAAc,CAAC,GAAW;QAC9B,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAmBD,KAAK,CAAC,yBAAyB,CAC7B,IAAY,EACZ,cAAsB;QAGtB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAGlE,IAAI,WAAW,CAAC,GAAG,KAAK,cAAc,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,0BAA0B,cAAc,EAAE,CAAC,CAAC;QAC9D,CAAC;QAID,IAAI,WAAW,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CACb,2DAA2D,IAAI,CAAC,MAAM,CAAC,qBAAqB,IAAI;gBAChG,OAAO,WAAW,CAAC,MAAM,+CAA+C,CACzE,CAAC;QACJ,CAAC;QAMD,MAAM,SAAS,GAAG,WAAW,CAAC,cAAc,GAAG,EAAE,CAAC;QAClD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,iCAAiC,cAAc,0BAA0B,WAAW,CAAC,cAAc,GAAG,CACvG,CAAC;QACJ,CAAC;QAKD,IAAI,WAAW,CAAC,cAAc,GAAG,EAAE,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAC1C,IAAI,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,GAAG,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CACb,4BAA4B,cAAc,gBAAgB,WAAW,CAAC,cAAc,GAAG,CACxF,CAAC;YACJ,CAAC;QACH,CAAC;QAID,IAAI,YAAoB,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,iBAAQ,CAAC,eAAe,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAC7B,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAChE,WAAW,CAAC,IAAI,CACjB,CAAC;YACF,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,+DAA+D,cAAc,IAAI;gBACjF,+CAA+C;gBAC/C,mBAAmB,KAAK,CAAC,OAAO,EAAE,CACnC,CAAC;QACJ,CAAC;QAGD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,uCAAuC,IAAI,SAAS,YAAY,IAAI;gBACpE,2EAA2E,CAC5E,CAAC;QACJ,CAAC;QAGD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA5KD,8BA4KC"}
@@ -0,0 +1,24 @@
1
+ import { Signer } from 'ethers';
2
+ import { Escrow } from '../types';
3
+ interface GasOptions {
4
+ maxFeePerGas?: bigint;
5
+ maxPriorityFeePerGas?: bigint;
6
+ }
7
+ export declare class EscrowVault {
8
+ private readonly address;
9
+ private readonly signer;
10
+ private contract;
11
+ private readonly gasSettings?;
12
+ constructor(address: string, signer: Signer, gasSettings?: GasOptions);
13
+ private getGasBufferMultiplier;
14
+ private buildTxOptions;
15
+ getAddress(): string;
16
+ approveToken(tokenAddress: string, amount: bigint): Promise<void>;
17
+ getEscrow(escrowId: string): Promise<Escrow>;
18
+ getEscrowBalance(escrowId: string): Promise<bigint>;
19
+ releaseEscrow(escrowId: string, recipients: string[], amounts: bigint[]): Promise<void>;
20
+ getTokenBalance(tokenAddress: string, account: string): Promise<bigint>;
21
+ getTokenAllowance(tokenAddress: string, owner: string, spender: string): Promise<bigint>;
22
+ }
23
+ export {};
24
+ //# sourceMappingURL=EscrowVault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EscrowVault.d.ts","sourceRoot":"","sources":["../../src/protocol/EscrowVault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,MAAM,EAAE,MAAM,QAAQ,CAAC;AAG1C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAWlC,UAAU,UAAU;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAiBD,qBAAa,WAAW;IAKpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAa;gBAGvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EAC/B,WAAW,CAAC,EAAE,UAAU;IAW1B,OAAO,CAAC,sBAAsB;IAa9B,OAAO,CAAC,cAAc;IAoBtB,UAAU,IAAI,MAAM;IA0Bd,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyCjE,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkB5C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASnD,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,IAAI,CAAC;IAqCV,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQvE,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC;CAInB"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.EscrowVault = void 0;
7
+ const ethers_1 = require("ethers");
8
+ const EscrowVault_json_1 = __importDefault(require("../abi/EscrowVault.json"));
9
+ const ERC20_json_1 = __importDefault(require("../abi/ERC20.json"));
10
+ const errors_1 = require("../errors");
11
+ const validation_1 = require("../utils/validation");
12
+ class EscrowVault {
13
+ constructor(address, signer, gasSettings) {
14
+ this.address = address;
15
+ this.signer = signer;
16
+ this.contract = new ethers_1.Contract(address, EscrowVault_json_1.default, signer);
17
+ this.gasSettings = gasSettings;
18
+ }
19
+ getGasBufferMultiplier(operation) {
20
+ const buffers = {
21
+ 'releaseEscrow': 1.30,
22
+ 'approveToken': 1.20
23
+ };
24
+ return buffers[operation] || 1.20;
25
+ }
26
+ buildTxOptions(estimatedGas, operation = 'default') {
27
+ const bufferMultiplier = this.getGasBufferMultiplier(operation);
28
+ const options = {
29
+ gasLimit: (estimatedGas * BigInt(Math.round(bufferMultiplier * 100))) / 100n
30
+ };
31
+ if (this.gasSettings?.maxFeePerGas) {
32
+ options.maxFeePerGas = this.gasSettings.maxFeePerGas;
33
+ }
34
+ if (this.gasSettings?.maxPriorityFeePerGas) {
35
+ options.maxPriorityFeePerGas = this.gasSettings.maxPriorityFeePerGas;
36
+ }
37
+ return options;
38
+ }
39
+ getAddress() {
40
+ return this.address;
41
+ }
42
+ async approveToken(tokenAddress, amount) {
43
+ (0, validation_1.validateAddress)(tokenAddress, 'tokenAddress');
44
+ (0, validation_1.validateAmount)(amount, 'amount');
45
+ const tokenContract = new ethers_1.Contract(tokenAddress, ERC20_json_1.default, this.signer);
46
+ try {
47
+ const currentAllowance = await tokenContract.allowance(await this.signer.getAddress(), this.address);
48
+ if (currentAllowance < amount) {
49
+ const approveFunc = tokenContract.getFunction('approve');
50
+ if (currentAllowance > 0n) {
51
+ const resetGas = await approveFunc.estimateGas(this.address, 0);
52
+ const resetTx = await approveFunc(this.address, 0, this.buildTxOptions(resetGas, 'approveToken'));
53
+ await resetTx.wait();
54
+ }
55
+ const approveGas = await approveFunc.estimateGas(this.address, amount);
56
+ const approveTx = await approveFunc(this.address, amount, this.buildTxOptions(approveGas, 'approveToken'));
57
+ await approveTx.wait();
58
+ }
59
+ }
60
+ catch (error) {
61
+ throw new errors_1.TransactionRevertedError(error.transactionHash, `Token approval failed: ${error.reason || error.message}`);
62
+ }
63
+ }
64
+ async getEscrow(escrowId) {
65
+ const escrowData = await this.contract.escrows(escrowId);
66
+ return {
67
+ escrowId,
68
+ kernel: escrowData.kernel,
69
+ txId: escrowData.txId,
70
+ token: escrowData.token,
71
+ amount: escrowData.amount,
72
+ beneficiary: escrowData.beneficiary,
73
+ createdAt: 0,
74
+ released: escrowData.released
75
+ };
76
+ }
77
+ async getEscrowBalance(escrowId) {
78
+ const escrow = await this.getEscrow(escrowId);
79
+ return escrow.amount;
80
+ }
81
+ async releaseEscrow(escrowId, recipients, amounts) {
82
+ (0, validation_1.validateTxId)(escrowId, 'escrowId');
83
+ if (recipients.length !== amounts.length) {
84
+ throw new errors_1.ValidationError('recipients/amounts', 'Recipients and amounts length mismatch');
85
+ }
86
+ if (recipients.length === 0) {
87
+ throw new errors_1.ValidationError('recipients', 'Must provide at least one recipient');
88
+ }
89
+ recipients.forEach((recipient, i) => {
90
+ (0, validation_1.validateAddress)(recipient, `recipients[${i}]`);
91
+ (0, validation_1.validateAmount)(amounts[i], `amounts[${i}]`);
92
+ });
93
+ try {
94
+ const disburseFunc = this.contract.getFunction('disburse');
95
+ const estimatedGas = await disburseFunc.estimateGas(escrowId, recipients, amounts);
96
+ const txOptions = this.buildTxOptions(estimatedGas, 'releaseEscrow');
97
+ const tx = await disburseFunc(escrowId, recipients, amounts, txOptions);
98
+ await tx.wait();
99
+ }
100
+ catch (error) {
101
+ throw new errors_1.TransactionRevertedError(error.transactionHash, error.reason || error.message);
102
+ }
103
+ }
104
+ async getTokenBalance(tokenAddress, account) {
105
+ const tokenContract = new ethers_1.Contract(tokenAddress, ERC20_json_1.default, this.signer);
106
+ return await tokenContract.balanceOf(account);
107
+ }
108
+ async getTokenAllowance(tokenAddress, owner, spender) {
109
+ const tokenContract = new ethers_1.Contract(tokenAddress, ERC20_json_1.default, this.signer);
110
+ return await tokenContract.allowance(owner, spender);
111
+ }
112
+ }
113
+ exports.EscrowVault = EscrowVault;
114
+ //# sourceMappingURL=EscrowVault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EscrowVault.js","sourceRoot":"","sources":["../../src/protocol/EscrowVault.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { Contract } from 'ethers';
2
+ import { State, Transaction } from '../types';
3
+ export declare class EventMonitor {
4
+ private readonly kernelContract;
5
+ constructor(kernelContract: Contract, _escrowContract: Contract);
6
+ watchTransaction(txId: string, callback: (state: State) => void): () => void;
7
+ waitForState(txId: string, targetState: State, timeoutMs?: number): Promise<void>;
8
+ getTransactionHistory(address: string, role?: 'requester' | 'provider'): Promise<Transaction[]>;
9
+ onTransactionCreated(callback: (tx: {
10
+ txId: string;
11
+ provider: string;
12
+ requester: string;
13
+ amount: bigint;
14
+ }) => void): () => void;
15
+ onStateChanged(callback: (txId: string, from: State, to: State) => void): () => void;
16
+ onEscrowReleased(callback: (txId: string, amount: bigint) => void): () => void;
17
+ }
18
+ //# sourceMappingURL=EventMonitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventMonitor.d.ts","sourceRoot":"","sources":["../../src/protocol/EventMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAY,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAK9C,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,QAAQ,EACzC,eAAe,EAAE,QAAQ;IAO3B,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM,IAAI;IAkBtE,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,KAAK,EAClB,SAAS,GAAE,MAAc,GACxB,OAAO,CAAC,IAAI,CAAC;IAqBV,qBAAqB,CACzB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,WAAW,GAAG,UAAwB,GAC3C,OAAO,CAAC,WAAW,EAAE,CAAC;IAwCzB,oBAAoB,CAClB,QAAQ,EAAE,CAAC,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAC5F,MAAM,IAAI;IAuBb,cAAc,CACZ,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,KAAK,IAAI,GACvD,MAAM,IAAI;IAiBb,gBAAgB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;CAa/E"}