@atumlabs/payment-gateway-client 1.0.2 → 2.1.0
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/CHANGELOG.md +39 -0
- package/README.md +127 -51
- package/THIRD-PARTY-NOTICES.txt +45 -0
- package/dist/cli/payment-status.js +1288 -668
- package/dist/cli/quote-status.js +1288 -668
- package/dist/cli/request-quote.js +1289 -669
- package/dist/cli/send-payment.js +1339 -687
- package/dist/index.d.ts +242 -174
- package/dist/index.js +1371 -648
- package/docs/idempotency.md +62 -0
- package/package.json +17 -6
- /package/{LICENSE.md → LICENSE} +0 -0
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2026 Atum Labs, Inc. All rights reserved.
|
|
4
|
+
* Proprietary and confidential.
|
|
5
|
+
* Access and use are governed by the LICENSE file distributed with this package.
|
|
6
|
+
* Do not remove, alter, or obscure this notice.
|
|
7
|
+
*/
|
|
2
8
|
"use strict";
|
|
3
9
|
var __create = Object.create;
|
|
4
10
|
var __defProp = Object.defineProperty;
|
|
@@ -26,8 +32,378 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
32
|
mod
|
|
27
33
|
));
|
|
28
34
|
|
|
29
|
-
// ../contracts/
|
|
35
|
+
// ../contracts/tvm/escrow-encoding/typescript/dist/chain-id.js
|
|
36
|
+
var require_chain_id = __commonJS({
|
|
37
|
+
"../contracts/tvm/escrow-encoding/typescript/dist/chain-id.js"(exports2) {
|
|
38
|
+
"use strict";
|
|
39
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
40
|
+
exports2.maskChainId = maskChainId2;
|
|
41
|
+
function maskChainId2(chainId) {
|
|
42
|
+
return (chainId & 4294967295) >>> 0;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// ../contracts/tvm/escrow-encoding/typescript/dist/tron-address.js
|
|
48
|
+
var require_tron_address = __commonJS({
|
|
49
|
+
"../contracts/tvm/escrow-encoding/typescript/dist/tron-address.js"(exports2) {
|
|
50
|
+
"use strict";
|
|
51
|
+
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
52
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
53
|
+
};
|
|
54
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
55
|
+
exports2.base58ToHex = base58ToHex2;
|
|
56
|
+
exports2.normalizeAddress = normalizeAddress2;
|
|
57
|
+
var ethers_1 = require("ethers");
|
|
58
|
+
var bs58_1 = __importDefault(require("bs58"));
|
|
59
|
+
var TVM_MAINNET_PREFIX = "41";
|
|
60
|
+
function base58ToHex2(base58Address) {
|
|
61
|
+
if (!base58Address || !base58Address.startsWith("T")) {
|
|
62
|
+
throw new Error(`Invalid Tron base58 address: ${base58Address}`);
|
|
63
|
+
}
|
|
64
|
+
const decoded = bs58_1.default.decode(base58Address);
|
|
65
|
+
if (decoded.length !== 25) {
|
|
66
|
+
throw new Error(`Invalid Tron base58 length (expected 25 bytes): ${base58Address}`);
|
|
67
|
+
}
|
|
68
|
+
const payload = decoded.slice(0, 21);
|
|
69
|
+
const checksum = (0, ethers_1.hexlify)(decoded.slice(21)).slice(2);
|
|
70
|
+
const computed = (0, ethers_1.sha256)((0, ethers_1.sha256)(payload)).slice(2, 10);
|
|
71
|
+
if (checksum !== computed) {
|
|
72
|
+
throw new Error(`Invalid Tron base58 checksum: ${base58Address}`);
|
|
73
|
+
}
|
|
74
|
+
return (0, ethers_1.hexlify)(payload).slice(2);
|
|
75
|
+
}
|
|
76
|
+
function normalizeAddress2(address) {
|
|
77
|
+
if (!address) {
|
|
78
|
+
throw new Error("Empty address");
|
|
79
|
+
}
|
|
80
|
+
let hexAddress = address;
|
|
81
|
+
if (address.startsWith("T")) {
|
|
82
|
+
hexAddress = base58ToHex2(address);
|
|
83
|
+
}
|
|
84
|
+
hexAddress = hexAddress.replace(/^0x/, "");
|
|
85
|
+
if (hexAddress.startsWith(TVM_MAINNET_PREFIX)) {
|
|
86
|
+
hexAddress = hexAddress.substring(2);
|
|
87
|
+
}
|
|
88
|
+
if (hexAddress.length !== 40) {
|
|
89
|
+
throw new Error(`Invalid address length: expected 40 chars, got ${hexAddress.length}`);
|
|
90
|
+
}
|
|
91
|
+
if (!/^[0-9a-fA-F]{40}$/.test(hexAddress)) {
|
|
92
|
+
throw new Error("Invalid hex address format");
|
|
93
|
+
}
|
|
94
|
+
return "0x" + hexAddress.toLowerCase();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// ../contracts/tvm/escrow-encoding/typescript/dist/reserve-encoder.js
|
|
100
|
+
var require_reserve_encoder = __commonJS({
|
|
101
|
+
"../contracts/tvm/escrow-encoding/typescript/dist/reserve-encoder.js"(exports2) {
|
|
102
|
+
"use strict";
|
|
103
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
104
|
+
exports2.computeReserveDigest = computeReserveDigest;
|
|
105
|
+
var ethers_1 = require("ethers");
|
|
106
|
+
var chain_id_1 = require_chain_id();
|
|
107
|
+
var RESERVE_WITNESS_TYPES = {
|
|
108
|
+
ReserveWitness: [
|
|
109
|
+
{ name: "paymentId", type: "bytes32" },
|
|
110
|
+
{ name: "settler", type: "address" }
|
|
111
|
+
]
|
|
112
|
+
};
|
|
113
|
+
function computeReserveDigest(input) {
|
|
114
|
+
const domain = {
|
|
115
|
+
name: "Escrow",
|
|
116
|
+
version: "3",
|
|
117
|
+
chainId: (0, chain_id_1.maskChainId)(input.chainId),
|
|
118
|
+
verifyingContract: input.escrowContract
|
|
119
|
+
};
|
|
120
|
+
return ethers_1.TypedDataEncoder.hash(domain, RESERVE_WITNESS_TYPES, {
|
|
121
|
+
paymentId: input.paymentId,
|
|
122
|
+
settler: input.settler
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// ../contracts/tvm/escrow-encoding/typescript/dist/payment-id.js
|
|
30
129
|
var require_payment_id = __commonJS({
|
|
130
|
+
"../contracts/tvm/escrow-encoding/typescript/dist/payment-id.js"(exports2) {
|
|
131
|
+
"use strict";
|
|
132
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
133
|
+
exports2.computePaymentId = computePaymentId;
|
|
134
|
+
var ethers_1 = require("ethers");
|
|
135
|
+
var tron_address_1 = require_tron_address();
|
|
136
|
+
function computePaymentId(depositor, signature, nonce) {
|
|
137
|
+
if (!/^[0-9]+$/.test(nonce)) {
|
|
138
|
+
throw new Error(`invalid nonce (expected base-10 decimal): ${nonce}`);
|
|
139
|
+
}
|
|
140
|
+
const encoded = ethers_1.AbiCoder.defaultAbiCoder().encode(["address", "bytes", "uint256"], [(0, tron_address_1.normalizeAddress)(depositor), signature, nonce]);
|
|
141
|
+
return (0, ethers_1.keccak256)(encoded);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// ../contracts/tvm/escrow-encoding/typescript/dist/deposit-encoder.js
|
|
147
|
+
var require_deposit_encoder = __commonJS({
|
|
148
|
+
"../contracts/tvm/escrow-encoding/typescript/dist/deposit-encoder.js"(exports2) {
|
|
149
|
+
"use strict";
|
|
150
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
151
|
+
exports2.createTvmPermitWitnessTransferFromPrehash = createTvmPermitWitnessTransferFromPrehash2;
|
|
152
|
+
exports2.hashTvmPermitWitnessTransferFrom = hashTvmPermitWitnessTransferFrom2;
|
|
153
|
+
var ethers_1 = require("ethers");
|
|
154
|
+
var chain_id_1 = require_chain_id();
|
|
155
|
+
var tron_address_1 = require_tron_address();
|
|
156
|
+
var PERMIT_WITNESS_TYPES_V2 = {
|
|
157
|
+
PermitWitnessTransferFrom: [
|
|
158
|
+
{ name: "permitted", type: "TokenPermissions" },
|
|
159
|
+
{ name: "spender", type: "address" },
|
|
160
|
+
{ name: "nonce", type: "uint256" },
|
|
161
|
+
{ name: "deadline", type: "uint256" },
|
|
162
|
+
{ name: "witness", type: "DepositWitness" }
|
|
163
|
+
],
|
|
164
|
+
TokenPermissions: [
|
|
165
|
+
{ name: "token", type: "address" },
|
|
166
|
+
{ name: "amount", type: "uint256" }
|
|
167
|
+
],
|
|
168
|
+
DepositWitness: [
|
|
169
|
+
{ name: "reserver", type: "address" },
|
|
170
|
+
{ name: "releaser", type: "address" }
|
|
171
|
+
]
|
|
172
|
+
};
|
|
173
|
+
function createTvmPermitWitnessTransferFromPrehash2(params) {
|
|
174
|
+
const maskedChainId = (0, chain_id_1.maskChainId)(params.chainId);
|
|
175
|
+
return {
|
|
176
|
+
types: PERMIT_WITNESS_TYPES_V2,
|
|
177
|
+
primaryType: "PermitWitnessTransferFrom",
|
|
178
|
+
domain: {
|
|
179
|
+
name: "Permit2",
|
|
180
|
+
chainId: `0x${maskedChainId.toString(16)}`,
|
|
181
|
+
verifyingContract: (0, tron_address_1.normalizeAddress)(params.permit2Address)
|
|
182
|
+
},
|
|
183
|
+
message: {
|
|
184
|
+
permitted: {
|
|
185
|
+
token: (0, tron_address_1.normalizeAddress)(params.tokenAddress),
|
|
186
|
+
amount: params.amount
|
|
187
|
+
},
|
|
188
|
+
spender: (0, tron_address_1.normalizeAddress)(params.spenderAddress),
|
|
189
|
+
nonce: params.nonce.toString(),
|
|
190
|
+
deadline: params.deadline.toString(),
|
|
191
|
+
witness: {
|
|
192
|
+
reserver: (0, tron_address_1.normalizeAddress)(params.reserverAddress),
|
|
193
|
+
releaser: (0, tron_address_1.normalizeAddress)(params.releaserAddress)
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
function hashTvmPermitWitnessTransferFrom2(prehash) {
|
|
199
|
+
return ethers_1.TypedDataEncoder.hash(prehash.domain, prehash.types, prehash.message);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
// ../contracts/tvm/escrow-encoding/typescript/dist/index.js
|
|
205
|
+
var require_dist = __commonJS({
|
|
206
|
+
"../contracts/tvm/escrow-encoding/typescript/dist/index.js"(exports2) {
|
|
207
|
+
"use strict";
|
|
208
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
209
|
+
exports2.hashTvmPermitWitnessTransferFrom = exports2.createTvmPermitWitnessTransferFromPrehash = exports2.computePaymentId = exports2.computeReserveDigest = exports2.normalizeAddress = exports2.base58ToHex = exports2.maskChainId = void 0;
|
|
210
|
+
var chain_id_1 = require_chain_id();
|
|
211
|
+
Object.defineProperty(exports2, "maskChainId", { enumerable: true, get: function() {
|
|
212
|
+
return chain_id_1.maskChainId;
|
|
213
|
+
} });
|
|
214
|
+
var tron_address_1 = require_tron_address();
|
|
215
|
+
Object.defineProperty(exports2, "base58ToHex", { enumerable: true, get: function() {
|
|
216
|
+
return tron_address_1.base58ToHex;
|
|
217
|
+
} });
|
|
218
|
+
Object.defineProperty(exports2, "normalizeAddress", { enumerable: true, get: function() {
|
|
219
|
+
return tron_address_1.normalizeAddress;
|
|
220
|
+
} });
|
|
221
|
+
var reserve_encoder_1 = require_reserve_encoder();
|
|
222
|
+
Object.defineProperty(exports2, "computeReserveDigest", { enumerable: true, get: function() {
|
|
223
|
+
return reserve_encoder_1.computeReserveDigest;
|
|
224
|
+
} });
|
|
225
|
+
var payment_id_1 = require_payment_id();
|
|
226
|
+
Object.defineProperty(exports2, "computePaymentId", { enumerable: true, get: function() {
|
|
227
|
+
return payment_id_1.computePaymentId;
|
|
228
|
+
} });
|
|
229
|
+
var deposit_encoder_1 = require_deposit_encoder();
|
|
230
|
+
Object.defineProperty(exports2, "createTvmPermitWitnessTransferFromPrehash", { enumerable: true, get: function() {
|
|
231
|
+
return deposit_encoder_1.createTvmPermitWitnessTransferFromPrehash;
|
|
232
|
+
} });
|
|
233
|
+
Object.defineProperty(exports2, "hashTvmPermitWitnessTransferFrom", { enumerable: true, get: function() {
|
|
234
|
+
return deposit_encoder_1.hashTvmPermitWitnessTransferFrom;
|
|
235
|
+
} });
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
// ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/types.js
|
|
240
|
+
var require_types = __commonJS({
|
|
241
|
+
"../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/types.js"(exports2) {
|
|
242
|
+
"use strict";
|
|
243
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
// ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/utils.js
|
|
248
|
+
var require_utils = __commonJS({
|
|
249
|
+
"../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/utils.js"(exports2) {
|
|
250
|
+
"use strict";
|
|
251
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
252
|
+
exports2.SOLANA_REPLAY_SLOTS = exports2.PERMIT_NONCE_DOMAIN = exports2.REPLAY_HORIZON_SECS = void 0;
|
|
253
|
+
exports2.resolvePermitDeadline = resolvePermitDeadline;
|
|
254
|
+
exports2.generatePermitNonce = generatePermitNonce;
|
|
255
|
+
exports2.resolvePermitNonce = resolvePermitNonce;
|
|
256
|
+
exports2.deterministicPermitNonce = deterministicPermitNonce2;
|
|
257
|
+
exports2.deterministicSolanaNonce = deterministicSolanaNonce2;
|
|
258
|
+
exports2.sameAddress = sameAddress;
|
|
259
|
+
exports2.assertKeyMatchesSender = assertKeyMatchesSender2;
|
|
260
|
+
exports2.assertToken = assertToken;
|
|
261
|
+
exports2.assertAmountMatches = assertAmountMatches;
|
|
262
|
+
exports2.assertFresh = assertFresh;
|
|
263
|
+
exports2.assertSpender = assertSpender;
|
|
264
|
+
exports2.assertWitnessRoles = assertWitnessRoles;
|
|
265
|
+
exports2.assertRolePairComplete = assertRolePairComplete;
|
|
266
|
+
exports2.nowSec = nowSec;
|
|
267
|
+
var ethers_1 = require("ethers");
|
|
268
|
+
exports2.REPLAY_HORIZON_SECS = 128;
|
|
269
|
+
function resolvePermitDeadline(deadline) {
|
|
270
|
+
return BigInt(deadline);
|
|
271
|
+
}
|
|
272
|
+
function generatePermitNonce() {
|
|
273
|
+
const rand = new Uint32Array(1);
|
|
274
|
+
globalThis.crypto.getRandomValues(rand);
|
|
275
|
+
return (BigInt(Date.now()) << 32n) + BigInt(rand[0]);
|
|
276
|
+
}
|
|
277
|
+
function resolvePermitNonce(nonce) {
|
|
278
|
+
return BigInt(nonce);
|
|
279
|
+
}
|
|
280
|
+
exports2.PERMIT_NONCE_DOMAIN = "atum-permit:v1:";
|
|
281
|
+
exports2.SOLANA_REPLAY_SLOTS = 235n;
|
|
282
|
+
var SOLANA_BUCKET_BITS = 17n;
|
|
283
|
+
function canonicalDepositor(depositor) {
|
|
284
|
+
const lower = depositor.toLowerCase();
|
|
285
|
+
return lower.startsWith("0x") ? lower : depositor;
|
|
286
|
+
}
|
|
287
|
+
function permitNonceSeed(requestId, depositor) {
|
|
288
|
+
if (!requestId) {
|
|
289
|
+
throw new Error("sender_auth: request_id is required to derive a deterministic permit nonce");
|
|
290
|
+
}
|
|
291
|
+
return BigInt((0, ethers_1.keccak256)((0, ethers_1.toUtf8Bytes)(`${exports2.PERMIT_NONCE_DOMAIN}${requestId}:${canonicalDepositor(depositor)}`)));
|
|
292
|
+
}
|
|
293
|
+
function deterministicPermitNonce2(params) {
|
|
294
|
+
return permitNonceSeed(params.requestId, params.depositor);
|
|
295
|
+
}
|
|
296
|
+
function deterministicSolanaNonce2(params) {
|
|
297
|
+
const seed = permitNonceSeed(params.requestId, params.depositor);
|
|
298
|
+
const slot = seed % exports2.SOLANA_REPLAY_SLOTS;
|
|
299
|
+
const bucket = (seed >> 8n) % (1n << SOLANA_BUCKET_BITS);
|
|
300
|
+
return bucket << 32n | slot;
|
|
301
|
+
}
|
|
302
|
+
function sameAddress(a, b) {
|
|
303
|
+
if (a.startsWith("0x") && b.startsWith("0x")) {
|
|
304
|
+
return a.toLowerCase() === b.toLowerCase();
|
|
305
|
+
}
|
|
306
|
+
return a === b;
|
|
307
|
+
}
|
|
308
|
+
function assertKeyMatchesSender2(matches, sender, derived) {
|
|
309
|
+
if (!matches) {
|
|
310
|
+
throw new Error(`sender_auth: private key derives ${derived}, not the expected sender ${sender}`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
function assertToken(token, sourceAsset, normalize) {
|
|
314
|
+
if (!sameAddress(token, normalize(sourceAsset))) {
|
|
315
|
+
throw new Error("sender_auth: permit token does not match the source asset");
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
function assertAmountMatches(amount, maxSourceAmount) {
|
|
319
|
+
if (BigInt(amount) !== BigInt(maxSourceAmount)) {
|
|
320
|
+
throw new Error("sender_auth: permit amount does not match max_source_amount");
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
function assertFresh(deadlineSec, nowSec2) {
|
|
324
|
+
if (deadlineSec <= nowSec2) {
|
|
325
|
+
throw new Error("sender_auth: permit deadline is not in the future");
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
function assertSpender(spender, escrow, normalize) {
|
|
329
|
+
if (!sameAddress(spender, normalize(escrow))) {
|
|
330
|
+
throw new Error("sender_auth: permit spender is not the source escrow");
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
function assertWitnessRoles(reserver, releaser, expectedReserver, expectedReleaser, normalize) {
|
|
334
|
+
if (!sameAddress(reserver, normalize(expectedReserver)) || !sameAddress(releaser, normalize(expectedReleaser))) {
|
|
335
|
+
throw new Error("sender_auth: deposit witness roles do not match the challenge");
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
function assertRolePairComplete(reserver, releaser) {
|
|
339
|
+
if (reserver === void 0 !== (releaser === void 0)) {
|
|
340
|
+
throw new Error("sender_auth: reserver and releaser must be supplied together");
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
function nowSec() {
|
|
344
|
+
return Math.floor(Date.now() / 1e3);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
// ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/chain-id.js
|
|
350
|
+
var require_chain_id2 = __commonJS({
|
|
351
|
+
"../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/chain-id.js"(exports2) {
|
|
352
|
+
"use strict";
|
|
353
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
354
|
+
exports2.TRON_PERMIT2_FALLBACKS = exports2.TRON_CHAIN_IDS = void 0;
|
|
355
|
+
exports2.namespaceOf = namespaceOf;
|
|
356
|
+
exports2.evmChainId = evmChainId;
|
|
357
|
+
exports2.tronNumericChainId = tronNumericChainId;
|
|
358
|
+
exports2.resolveTronPermit2 = resolveTronPermit2;
|
|
359
|
+
exports2.clusterIdFromName = clusterIdFromName;
|
|
360
|
+
function namespaceOf(network) {
|
|
361
|
+
return network.split(":")[0];
|
|
362
|
+
}
|
|
363
|
+
function evmChainId(network) {
|
|
364
|
+
const match = /^eip155:([0-9]+)$/.exec(network);
|
|
365
|
+
if (!match) {
|
|
366
|
+
throw new Error(`sender_auth: expected an eip155 network, got ${network}`);
|
|
367
|
+
}
|
|
368
|
+
return Number(match[1]);
|
|
369
|
+
}
|
|
370
|
+
exports2.TRON_CHAIN_IDS = {
|
|
371
|
+
mainnet: 728126428,
|
|
372
|
+
shasta: 2494104990
|
|
373
|
+
};
|
|
374
|
+
function tronNumericChainId(network) {
|
|
375
|
+
const cluster = network.split(":")[1];
|
|
376
|
+
const id = exports2.TRON_CHAIN_IDS[cluster ?? ""];
|
|
377
|
+
if (id === void 0) {
|
|
378
|
+
throw new Error(`sender_auth: unsupported Tron network '${network}'`);
|
|
379
|
+
}
|
|
380
|
+
return id;
|
|
381
|
+
}
|
|
382
|
+
exports2.TRON_PERMIT2_FALLBACKS = {
|
|
383
|
+
"tron:mainnet": "TJhMXTHQHeQyMD7TcKQFqAePNgG4b31H9m",
|
|
384
|
+
"tron:shasta": "TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp"
|
|
385
|
+
};
|
|
386
|
+
function resolveTronPermit2(network) {
|
|
387
|
+
const resolved = exports2.TRON_PERMIT2_FALLBACKS[network];
|
|
388
|
+
if (!resolved) {
|
|
389
|
+
throw new Error(`sender_auth: no Permit2 address known for Tron network '${network}'`);
|
|
390
|
+
}
|
|
391
|
+
return resolved;
|
|
392
|
+
}
|
|
393
|
+
function clusterIdFromName(name) {
|
|
394
|
+
const encoded = new TextEncoder().encode(name);
|
|
395
|
+
if (encoded.length > 32) {
|
|
396
|
+
throw new Error(`sender_auth: Solana cluster name too long (${encoded.length} > 32 bytes): ${name}`);
|
|
397
|
+
}
|
|
398
|
+
const out = new Uint8Array(32);
|
|
399
|
+
out.set(encoded);
|
|
400
|
+
return out;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
// ../contracts/evm/escrow-encoding/typescript/dist/payment-id.js
|
|
406
|
+
var require_payment_id2 = __commonJS({
|
|
31
407
|
"../contracts/evm/escrow-encoding/typescript/dist/payment-id.js"(exports2) {
|
|
32
408
|
"use strict";
|
|
33
409
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
@@ -343,339 +719,390 @@ var require_escrow_abi = __commonJS({
|
|
|
343
719
|
});
|
|
344
720
|
|
|
345
721
|
// ../contracts/evm/escrow-encoding/typescript/dist/reserve-encoder.js
|
|
346
|
-
var require_reserve_encoder = __commonJS({
|
|
347
|
-
"../contracts/evm/escrow-encoding/typescript/dist/reserve-encoder.js"(exports2) {
|
|
348
|
-
"use strict";
|
|
349
|
-
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
350
|
-
exports2.computeReserveDigest = computeReserveDigest;
|
|
351
|
-
var ethers_1 = require("ethers");
|
|
352
|
-
var permit_types_1 = require_permit_types();
|
|
353
|
-
function computeReserveDigest(input) {
|
|
354
|
-
const domain = (0, permit_types_1.createEscrowDomain)(input.chainId, input.escrowContract);
|
|
355
|
-
return ethers_1.TypedDataEncoder.hash(domain, permit_types_1.RESERVE_WITNESS_TYPES, {
|
|
356
|
-
paymentId: input.paymentId,
|
|
357
|
-
settler: input.settler
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
// ../contracts/evm/escrow-encoding/typescript/dist/deposit-encoder.js
|
|
364
|
-
var require_deposit_encoder = __commonJS({
|
|
365
|
-
"../contracts/evm/escrow-encoding/typescript/dist/deposit-encoder.js"(exports2) {
|
|
366
|
-
"use strict";
|
|
367
|
-
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
368
|
-
exports2.PERMIT2_CONTRACT_ADDRESS = void 0;
|
|
369
|
-
exports2.createPermitWitnessTransferFromPrehash = createPermitWitnessTransferFromPrehash2;
|
|
370
|
-
exports2.hashPermitWitnessTransferFrom = hashPermitWitnessTransferFrom2;
|
|
371
|
-
var ethers_1 = require("ethers");
|
|
372
|
-
var permit_types_1 = require_permit_types();
|
|
373
|
-
exports2.PERMIT2_CONTRACT_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3";
|
|
374
|
-
function createPermitWitnessTransferFromPrehash2(params) {
|
|
375
|
-
return {
|
|
376
|
-
types: permit_types_1.PERMIT_WITNESS_TYPES_V2,
|
|
377
|
-
primaryType: "PermitWitnessTransferFrom",
|
|
378
|
-
domain: {
|
|
379
|
-
name: "Permit2",
|
|
380
|
-
chainId: `0x${params.chainId.toString(16)}`,
|
|
381
|
-
verifyingContract: params.verifyingContract
|
|
382
|
-
},
|
|
383
|
-
message: {
|
|
384
|
-
permitted: {
|
|
385
|
-
token: params.token,
|
|
386
|
-
amount: params.amount
|
|
387
|
-
},
|
|
388
|
-
spender: params.spender,
|
|
389
|
-
nonce: params.nonce.toString(),
|
|
390
|
-
deadline: params.deadline.toString(),
|
|
391
|
-
witness: {
|
|
392
|
-
reserver: params.reserver,
|
|
393
|
-
releaser: params.releaser
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
};
|
|
397
|
-
}
|
|
398
|
-
function hashPermitWitnessTransferFrom2(prehash) {
|
|
399
|
-
return ethers_1.TypedDataEncoder.hash(prehash.domain, prehash.types, prehash.message);
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
});
|
|
403
|
-
|
|
404
|
-
// ../contracts/evm/escrow-encoding/typescript/dist/index.js
|
|
405
|
-
var require_dist = __commonJS({
|
|
406
|
-
"../contracts/evm/escrow-encoding/typescript/dist/index.js"(exports2) {
|
|
407
|
-
"use strict";
|
|
408
|
-
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
409
|
-
exports2.PERMIT2_CONTRACT_ADDRESS = exports2.hashPermitWitnessTransferFrom = exports2.createPermitWitnessTransferFromPrehash = exports2.computeReserveDigest = exports2.ESCROW_V3_ABI_JSON = exports2.ESCROW_V2_ABI_JSON = exports2.ESCROW_ABI_JSON = exports2.ESCROW_ABI = exports2.REFUND_WITNESS_TYPES = exports2.RELEASE_WITNESS_TYPES = exports2.RESERVE_WITNESS_TYPES = exports2.createEscrowDomain = exports2.createPermit2Domain = exports2.PERMIT_WITNESS_TYPES_V2 = exports2.PERMIT_WITNESS_TYPES = exports2.generateNonce = exports2.computePaymentIdV2 = exports2.computePaymentId = void 0;
|
|
410
|
-
var payment_id_1 = require_payment_id();
|
|
411
|
-
Object.defineProperty(exports2, "computePaymentId", { enumerable: true, get: function() {
|
|
412
|
-
return payment_id_1.computePaymentId;
|
|
413
|
-
} });
|
|
414
|
-
Object.defineProperty(exports2, "computePaymentIdV2", { enumerable: true, get: function() {
|
|
415
|
-
return payment_id_1.computePaymentIdV2;
|
|
416
|
-
} });
|
|
417
|
-
var nonce_generator_1 = require_nonce_generator();
|
|
418
|
-
Object.defineProperty(exports2, "generateNonce", { enumerable: true, get: function() {
|
|
419
|
-
return nonce_generator_1.generateNonce;
|
|
420
|
-
} });
|
|
421
|
-
var permit_types_1 = require_permit_types();
|
|
422
|
-
Object.defineProperty(exports2, "PERMIT_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
423
|
-
return permit_types_1.PERMIT_WITNESS_TYPES;
|
|
424
|
-
} });
|
|
425
|
-
Object.defineProperty(exports2, "PERMIT_WITNESS_TYPES_V2", { enumerable: true, get: function() {
|
|
426
|
-
return permit_types_1.PERMIT_WITNESS_TYPES_V2;
|
|
427
|
-
} });
|
|
428
|
-
Object.defineProperty(exports2, "createPermit2Domain", { enumerable: true, get: function() {
|
|
429
|
-
return permit_types_1.createPermit2Domain;
|
|
430
|
-
} });
|
|
431
|
-
Object.defineProperty(exports2, "createEscrowDomain", { enumerable: true, get: function() {
|
|
432
|
-
return permit_types_1.createEscrowDomain;
|
|
433
|
-
} });
|
|
434
|
-
Object.defineProperty(exports2, "RESERVE_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
435
|
-
return permit_types_1.RESERVE_WITNESS_TYPES;
|
|
436
|
-
} });
|
|
437
|
-
Object.defineProperty(exports2, "RELEASE_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
438
|
-
return permit_types_1.RELEASE_WITNESS_TYPES;
|
|
439
|
-
} });
|
|
440
|
-
Object.defineProperty(exports2, "REFUND_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
441
|
-
return permit_types_1.REFUND_WITNESS_TYPES;
|
|
442
|
-
} });
|
|
443
|
-
var escrow_abi_1 = require_escrow_abi();
|
|
444
|
-
Object.defineProperty(exports2, "ESCROW_ABI", { enumerable: true, get: function() {
|
|
445
|
-
return escrow_abi_1.ESCROW_ABI;
|
|
446
|
-
} });
|
|
447
|
-
Object.defineProperty(exports2, "ESCROW_ABI_JSON", { enumerable: true, get: function() {
|
|
448
|
-
return escrow_abi_1.ESCROW_ABI_JSON;
|
|
449
|
-
} });
|
|
450
|
-
Object.defineProperty(exports2, "ESCROW_V2_ABI_JSON", { enumerable: true, get: function() {
|
|
451
|
-
return escrow_abi_1.ESCROW_V2_ABI_JSON;
|
|
452
|
-
} });
|
|
453
|
-
Object.defineProperty(exports2, "ESCROW_V3_ABI_JSON", { enumerable: true, get: function() {
|
|
454
|
-
return escrow_abi_1.ESCROW_V3_ABI_JSON;
|
|
455
|
-
} });
|
|
456
|
-
var reserve_encoder_1 = require_reserve_encoder();
|
|
457
|
-
Object.defineProperty(exports2, "computeReserveDigest", { enumerable: true, get: function() {
|
|
458
|
-
return reserve_encoder_1.computeReserveDigest;
|
|
459
|
-
} });
|
|
460
|
-
var deposit_encoder_1 = require_deposit_encoder();
|
|
461
|
-
Object.defineProperty(exports2, "createPermitWitnessTransferFromPrehash", { enumerable: true, get: function() {
|
|
462
|
-
return deposit_encoder_1.createPermitWitnessTransferFromPrehash;
|
|
463
|
-
} });
|
|
464
|
-
Object.defineProperty(exports2, "hashPermitWitnessTransferFrom", { enumerable: true, get: function() {
|
|
465
|
-
return deposit_encoder_1.hashPermitWitnessTransferFrom;
|
|
466
|
-
} });
|
|
467
|
-
Object.defineProperty(exports2, "PERMIT2_CONTRACT_ADDRESS", { enumerable: true, get: function() {
|
|
468
|
-
return deposit_encoder_1.PERMIT2_CONTRACT_ADDRESS;
|
|
469
|
-
} });
|
|
470
|
-
}
|
|
471
|
-
});
|
|
472
|
-
|
|
473
|
-
// ../contracts/tvm/escrow-encoding/typescript/dist/chain-id.js
|
|
474
|
-
var require_chain_id = __commonJS({
|
|
475
|
-
"../contracts/tvm/escrow-encoding/typescript/dist/chain-id.js"(exports2) {
|
|
476
|
-
"use strict";
|
|
477
|
-
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
478
|
-
exports2.maskChainId = maskChainId2;
|
|
479
|
-
function maskChainId2(chainId) {
|
|
480
|
-
return (chainId & 4294967295) >>> 0;
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
});
|
|
484
|
-
|
|
485
|
-
// ../contracts/tvm/escrow-encoding/typescript/dist/tron-address.js
|
|
486
|
-
var require_tron_address = __commonJS({
|
|
487
|
-
"../contracts/tvm/escrow-encoding/typescript/dist/tron-address.js"(exports2) {
|
|
488
|
-
"use strict";
|
|
489
|
-
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
490
|
-
return mod && mod.__esModule ? mod : { "default": mod };
|
|
491
|
-
};
|
|
492
|
-
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
493
|
-
exports2.base58ToHex = base58ToHex2;
|
|
494
|
-
exports2.normalizeAddress = normalizeAddress2;
|
|
495
|
-
var ethers_1 = require("ethers");
|
|
496
|
-
var bs58_1 = __importDefault(require("bs58"));
|
|
497
|
-
var TVM_MAINNET_PREFIX = "41";
|
|
498
|
-
function base58ToHex2(base58Address) {
|
|
499
|
-
if (!base58Address || !base58Address.startsWith("T")) {
|
|
500
|
-
throw new Error(`Invalid Tron base58 address: ${base58Address}`);
|
|
501
|
-
}
|
|
502
|
-
const decoded = bs58_1.default.decode(base58Address);
|
|
503
|
-
if (decoded.length !== 25) {
|
|
504
|
-
throw new Error(`Invalid Tron base58 length (expected 25 bytes): ${base58Address}`);
|
|
505
|
-
}
|
|
506
|
-
const payload = decoded.slice(0, 21);
|
|
507
|
-
const checksum = (0, ethers_1.hexlify)(decoded.slice(21)).slice(2);
|
|
508
|
-
const computed = (0, ethers_1.sha256)((0, ethers_1.sha256)(payload)).slice(2, 10);
|
|
509
|
-
if (checksum !== computed) {
|
|
510
|
-
throw new Error(`Invalid Tron base58 checksum: ${base58Address}`);
|
|
511
|
-
}
|
|
512
|
-
return (0, ethers_1.hexlify)(payload).slice(2);
|
|
513
|
-
}
|
|
514
|
-
function normalizeAddress2(address) {
|
|
515
|
-
if (!address) {
|
|
516
|
-
throw new Error("Empty address");
|
|
517
|
-
}
|
|
518
|
-
let hexAddress = address;
|
|
519
|
-
if (address.startsWith("T")) {
|
|
520
|
-
hexAddress = base58ToHex2(address);
|
|
521
|
-
}
|
|
522
|
-
hexAddress = hexAddress.replace(/^0x/, "");
|
|
523
|
-
if (hexAddress.startsWith(TVM_MAINNET_PREFIX)) {
|
|
524
|
-
hexAddress = hexAddress.substring(2);
|
|
525
|
-
}
|
|
526
|
-
if (hexAddress.length !== 40) {
|
|
527
|
-
throw new Error(`Invalid address length: expected 40 chars, got ${hexAddress.length}`);
|
|
528
|
-
}
|
|
529
|
-
if (!/^[0-9a-fA-F]{40}$/.test(hexAddress)) {
|
|
530
|
-
throw new Error("Invalid hex address format");
|
|
531
|
-
}
|
|
532
|
-
return "0x" + hexAddress.toLowerCase();
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
});
|
|
536
|
-
|
|
537
|
-
// ../contracts/tvm/escrow-encoding/typescript/dist/reserve-encoder.js
|
|
538
722
|
var require_reserve_encoder2 = __commonJS({
|
|
539
|
-
"../contracts/
|
|
540
|
-
"use strict";
|
|
541
|
-
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
542
|
-
exports2.computeReserveDigest = computeReserveDigest;
|
|
543
|
-
var ethers_1 = require("ethers");
|
|
544
|
-
var chain_id_1 = require_chain_id();
|
|
545
|
-
var RESERVE_WITNESS_TYPES = {
|
|
546
|
-
ReserveWitness: [
|
|
547
|
-
{ name: "paymentId", type: "bytes32" },
|
|
548
|
-
{ name: "settler", type: "address" }
|
|
549
|
-
]
|
|
550
|
-
};
|
|
551
|
-
function computeReserveDigest(input) {
|
|
552
|
-
const domain = {
|
|
553
|
-
name: "Escrow",
|
|
554
|
-
version: "3",
|
|
555
|
-
chainId: (0, chain_id_1.maskChainId)(input.chainId),
|
|
556
|
-
verifyingContract: input.escrowContract
|
|
557
|
-
};
|
|
558
|
-
return ethers_1.TypedDataEncoder.hash(domain, RESERVE_WITNESS_TYPES, {
|
|
559
|
-
paymentId: input.paymentId,
|
|
560
|
-
settler: input.settler
|
|
561
|
-
});
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
});
|
|
565
|
-
|
|
566
|
-
// ../contracts/tvm/escrow-encoding/typescript/dist/payment-id.js
|
|
567
|
-
var require_payment_id2 = __commonJS({
|
|
568
|
-
"../contracts/tvm/escrow-encoding/typescript/dist/payment-id.js"(exports2) {
|
|
723
|
+
"../contracts/evm/escrow-encoding/typescript/dist/reserve-encoder.js"(exports2) {
|
|
569
724
|
"use strict";
|
|
570
725
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
571
|
-
exports2.
|
|
726
|
+
exports2.computeReserveDigest = computeReserveDigest;
|
|
572
727
|
var ethers_1 = require("ethers");
|
|
573
|
-
var
|
|
574
|
-
function
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
728
|
+
var permit_types_1 = require_permit_types();
|
|
729
|
+
function computeReserveDigest(input) {
|
|
730
|
+
const domain = (0, permit_types_1.createEscrowDomain)(input.chainId, input.escrowContract);
|
|
731
|
+
return ethers_1.TypedDataEncoder.hash(domain, permit_types_1.RESERVE_WITNESS_TYPES, {
|
|
732
|
+
paymentId: input.paymentId,
|
|
733
|
+
settler: input.settler
|
|
734
|
+
});
|
|
580
735
|
}
|
|
581
736
|
}
|
|
582
737
|
});
|
|
583
738
|
|
|
584
|
-
// ../contracts/
|
|
739
|
+
// ../contracts/evm/escrow-encoding/typescript/dist/deposit-encoder.js
|
|
585
740
|
var require_deposit_encoder2 = __commonJS({
|
|
586
|
-
"../contracts/
|
|
741
|
+
"../contracts/evm/escrow-encoding/typescript/dist/deposit-encoder.js"(exports2) {
|
|
587
742
|
"use strict";
|
|
588
743
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
589
|
-
exports2.
|
|
590
|
-
exports2.
|
|
744
|
+
exports2.PERMIT2_CONTRACT_ADDRESS = void 0;
|
|
745
|
+
exports2.createPermitWitnessTransferFromPrehash = createPermitWitnessTransferFromPrehash2;
|
|
746
|
+
exports2.hashPermitWitnessTransferFrom = hashPermitWitnessTransferFrom2;
|
|
591
747
|
var ethers_1 = require("ethers");
|
|
592
|
-
var
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
PermitWitnessTransferFrom: [
|
|
596
|
-
{ name: "permitted", type: "TokenPermissions" },
|
|
597
|
-
{ name: "spender", type: "address" },
|
|
598
|
-
{ name: "nonce", type: "uint256" },
|
|
599
|
-
{ name: "deadline", type: "uint256" },
|
|
600
|
-
{ name: "witness", type: "DepositWitness" }
|
|
601
|
-
],
|
|
602
|
-
TokenPermissions: [
|
|
603
|
-
{ name: "token", type: "address" },
|
|
604
|
-
{ name: "amount", type: "uint256" }
|
|
605
|
-
],
|
|
606
|
-
DepositWitness: [
|
|
607
|
-
{ name: "reserver", type: "address" },
|
|
608
|
-
{ name: "releaser", type: "address" }
|
|
609
|
-
]
|
|
610
|
-
};
|
|
611
|
-
function createTvmPermitWitnessTransferFromPrehash2(params) {
|
|
612
|
-
const maskedChainId = (0, chain_id_1.maskChainId)(params.chainId);
|
|
748
|
+
var permit_types_1 = require_permit_types();
|
|
749
|
+
exports2.PERMIT2_CONTRACT_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3";
|
|
750
|
+
function createPermitWitnessTransferFromPrehash2(params) {
|
|
613
751
|
return {
|
|
614
|
-
types: PERMIT_WITNESS_TYPES_V2,
|
|
752
|
+
types: permit_types_1.PERMIT_WITNESS_TYPES_V2,
|
|
615
753
|
primaryType: "PermitWitnessTransferFrom",
|
|
616
754
|
domain: {
|
|
617
755
|
name: "Permit2",
|
|
618
|
-
chainId: `0x${
|
|
619
|
-
verifyingContract:
|
|
756
|
+
chainId: `0x${params.chainId.toString(16)}`,
|
|
757
|
+
verifyingContract: params.verifyingContract
|
|
620
758
|
},
|
|
621
759
|
message: {
|
|
622
760
|
permitted: {
|
|
623
|
-
token:
|
|
761
|
+
token: params.token,
|
|
624
762
|
amount: params.amount
|
|
625
763
|
},
|
|
626
|
-
spender:
|
|
764
|
+
spender: params.spender,
|
|
627
765
|
nonce: params.nonce.toString(),
|
|
628
766
|
deadline: params.deadline.toString(),
|
|
629
767
|
witness: {
|
|
630
|
-
reserver:
|
|
631
|
-
releaser:
|
|
768
|
+
reserver: params.reserver,
|
|
769
|
+
releaser: params.releaser
|
|
632
770
|
}
|
|
633
771
|
}
|
|
634
772
|
};
|
|
635
773
|
}
|
|
636
|
-
function
|
|
774
|
+
function hashPermitWitnessTransferFrom2(prehash) {
|
|
637
775
|
return ethers_1.TypedDataEncoder.hash(prehash.domain, prehash.types, prehash.message);
|
|
638
776
|
}
|
|
639
777
|
}
|
|
640
778
|
});
|
|
641
779
|
|
|
642
|
-
// ../contracts/
|
|
780
|
+
// ../contracts/evm/escrow-encoding/typescript/dist/index.js
|
|
643
781
|
var require_dist2 = __commonJS({
|
|
644
|
-
"../contracts/
|
|
782
|
+
"../contracts/evm/escrow-encoding/typescript/dist/index.js"(exports2) {
|
|
645
783
|
"use strict";
|
|
646
784
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
647
|
-
exports2.
|
|
648
|
-
var
|
|
649
|
-
Object.defineProperty(exports2, "
|
|
650
|
-
return
|
|
785
|
+
exports2.PERMIT2_CONTRACT_ADDRESS = exports2.hashPermitWitnessTransferFrom = exports2.createPermitWitnessTransferFromPrehash = exports2.computeReserveDigest = exports2.ESCROW_V3_ABI_JSON = exports2.ESCROW_V2_ABI_JSON = exports2.ESCROW_ABI_JSON = exports2.ESCROW_ABI = exports2.REFUND_WITNESS_TYPES = exports2.RELEASE_WITNESS_TYPES = exports2.RESERVE_WITNESS_TYPES = exports2.createEscrowDomain = exports2.createPermit2Domain = exports2.PERMIT_WITNESS_TYPES_V2 = exports2.PERMIT_WITNESS_TYPES = exports2.generateNonce = exports2.computePaymentIdV2 = exports2.computePaymentId = void 0;
|
|
786
|
+
var payment_id_1 = require_payment_id2();
|
|
787
|
+
Object.defineProperty(exports2, "computePaymentId", { enumerable: true, get: function() {
|
|
788
|
+
return payment_id_1.computePaymentId;
|
|
651
789
|
} });
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
return tron_address_1.base58ToHex;
|
|
790
|
+
Object.defineProperty(exports2, "computePaymentIdV2", { enumerable: true, get: function() {
|
|
791
|
+
return payment_id_1.computePaymentIdV2;
|
|
655
792
|
} });
|
|
656
|
-
|
|
657
|
-
|
|
793
|
+
var nonce_generator_1 = require_nonce_generator();
|
|
794
|
+
Object.defineProperty(exports2, "generateNonce", { enumerable: true, get: function() {
|
|
795
|
+
return nonce_generator_1.generateNonce;
|
|
796
|
+
} });
|
|
797
|
+
var permit_types_1 = require_permit_types();
|
|
798
|
+
Object.defineProperty(exports2, "PERMIT_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
799
|
+
return permit_types_1.PERMIT_WITNESS_TYPES;
|
|
800
|
+
} });
|
|
801
|
+
Object.defineProperty(exports2, "PERMIT_WITNESS_TYPES_V2", { enumerable: true, get: function() {
|
|
802
|
+
return permit_types_1.PERMIT_WITNESS_TYPES_V2;
|
|
803
|
+
} });
|
|
804
|
+
Object.defineProperty(exports2, "createPermit2Domain", { enumerable: true, get: function() {
|
|
805
|
+
return permit_types_1.createPermit2Domain;
|
|
806
|
+
} });
|
|
807
|
+
Object.defineProperty(exports2, "createEscrowDomain", { enumerable: true, get: function() {
|
|
808
|
+
return permit_types_1.createEscrowDomain;
|
|
809
|
+
} });
|
|
810
|
+
Object.defineProperty(exports2, "RESERVE_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
811
|
+
return permit_types_1.RESERVE_WITNESS_TYPES;
|
|
812
|
+
} });
|
|
813
|
+
Object.defineProperty(exports2, "RELEASE_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
814
|
+
return permit_types_1.RELEASE_WITNESS_TYPES;
|
|
815
|
+
} });
|
|
816
|
+
Object.defineProperty(exports2, "REFUND_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
817
|
+
return permit_types_1.REFUND_WITNESS_TYPES;
|
|
818
|
+
} });
|
|
819
|
+
var escrow_abi_1 = require_escrow_abi();
|
|
820
|
+
Object.defineProperty(exports2, "ESCROW_ABI", { enumerable: true, get: function() {
|
|
821
|
+
return escrow_abi_1.ESCROW_ABI;
|
|
822
|
+
} });
|
|
823
|
+
Object.defineProperty(exports2, "ESCROW_ABI_JSON", { enumerable: true, get: function() {
|
|
824
|
+
return escrow_abi_1.ESCROW_ABI_JSON;
|
|
825
|
+
} });
|
|
826
|
+
Object.defineProperty(exports2, "ESCROW_V2_ABI_JSON", { enumerable: true, get: function() {
|
|
827
|
+
return escrow_abi_1.ESCROW_V2_ABI_JSON;
|
|
828
|
+
} });
|
|
829
|
+
Object.defineProperty(exports2, "ESCROW_V3_ABI_JSON", { enumerable: true, get: function() {
|
|
830
|
+
return escrow_abi_1.ESCROW_V3_ABI_JSON;
|
|
658
831
|
} });
|
|
659
832
|
var reserve_encoder_1 = require_reserve_encoder2();
|
|
660
833
|
Object.defineProperty(exports2, "computeReserveDigest", { enumerable: true, get: function() {
|
|
661
834
|
return reserve_encoder_1.computeReserveDigest;
|
|
662
835
|
} });
|
|
663
|
-
var payment_id_1 = require_payment_id2();
|
|
664
|
-
Object.defineProperty(exports2, "computePaymentId", { enumerable: true, get: function() {
|
|
665
|
-
return payment_id_1.computePaymentId;
|
|
666
|
-
} });
|
|
667
836
|
var deposit_encoder_1 = require_deposit_encoder2();
|
|
668
|
-
Object.defineProperty(exports2, "
|
|
669
|
-
return deposit_encoder_1.
|
|
837
|
+
Object.defineProperty(exports2, "createPermitWitnessTransferFromPrehash", { enumerable: true, get: function() {
|
|
838
|
+
return deposit_encoder_1.createPermitWitnessTransferFromPrehash;
|
|
670
839
|
} });
|
|
671
|
-
Object.defineProperty(exports2, "
|
|
672
|
-
return deposit_encoder_1.
|
|
840
|
+
Object.defineProperty(exports2, "hashPermitWitnessTransferFrom", { enumerable: true, get: function() {
|
|
841
|
+
return deposit_encoder_1.hashPermitWitnessTransferFrom;
|
|
842
|
+
} });
|
|
843
|
+
Object.defineProperty(exports2, "PERMIT2_CONTRACT_ADDRESS", { enumerable: true, get: function() {
|
|
844
|
+
return deposit_encoder_1.PERMIT2_CONTRACT_ADDRESS;
|
|
673
845
|
} });
|
|
674
846
|
}
|
|
675
847
|
});
|
|
676
848
|
|
|
677
|
-
// ../
|
|
849
|
+
// ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/errors.js
|
|
678
850
|
var require_errors = __commonJS({
|
|
851
|
+
"../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/errors.js"(exports2) {
|
|
852
|
+
"use strict";
|
|
853
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
854
|
+
exports2.SignerMismatchError = exports2.RecoveryFailedError = exports2.MalformedPrehashError = void 0;
|
|
855
|
+
var MalformedPrehashError = class extends Error {
|
|
856
|
+
constructor(message = "sender_auth: malformed message_prehash") {
|
|
857
|
+
super(message);
|
|
858
|
+
this.name = "MalformedPrehashError";
|
|
859
|
+
}
|
|
860
|
+
};
|
|
861
|
+
exports2.MalformedPrehashError = MalformedPrehashError;
|
|
862
|
+
var RecoveryFailedError = class extends Error {
|
|
863
|
+
constructor(message = "sender_auth: could not recover a signer from the signed message") {
|
|
864
|
+
super(message);
|
|
865
|
+
this.name = "RecoveryFailedError";
|
|
866
|
+
}
|
|
867
|
+
};
|
|
868
|
+
exports2.RecoveryFailedError = RecoveryFailedError;
|
|
869
|
+
var SignerMismatchError = class extends Error {
|
|
870
|
+
constructor(message = "sender_auth: recovered signer does not match source.account") {
|
|
871
|
+
super(message);
|
|
872
|
+
this.name = "SignerMismatchError";
|
|
873
|
+
}
|
|
874
|
+
};
|
|
875
|
+
exports2.SignerMismatchError = SignerMismatchError;
|
|
876
|
+
}
|
|
877
|
+
});
|
|
878
|
+
|
|
879
|
+
// ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/evm.js
|
|
880
|
+
var require_evm = __commonJS({
|
|
881
|
+
"../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/evm.js"(exports2) {
|
|
882
|
+
"use strict";
|
|
883
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
884
|
+
exports2.evmAdapter = void 0;
|
|
885
|
+
var ethers_1 = require("ethers");
|
|
886
|
+
var evm_escrow_encoding_1 = require_dist2();
|
|
887
|
+
var utils_js_1 = require_utils();
|
|
888
|
+
var errors_js_1 = require_errors();
|
|
889
|
+
var chain_id_js_1 = require_chain_id2();
|
|
890
|
+
exports2.evmAdapter = {
|
|
891
|
+
async buildAuthMessage({ sourceAsset, maxSourceAmount, sourceDefaults, deadline, nonce }) {
|
|
892
|
+
if (nonce === void 0) {
|
|
893
|
+
throw new Error("sender_auth: buildAuthMessage requires an explicit nonce \u2014 derive it deterministically from a stable request id (e.g. the challenge id) so retries reproduce the same permit; pass generatePermitNonce() only for genuinely one-shot builds");
|
|
894
|
+
}
|
|
895
|
+
if (deadline === void 0) {
|
|
896
|
+
throw new Error("sender_auth: buildAuthMessage requires an explicit permit deadline (absolute Unix seconds) \u2014 the low-level builder does not default it; derive it from the payment's fulfillment/settlement deadline in the calling layer (pgc/mppx)");
|
|
897
|
+
}
|
|
898
|
+
const sourceChainId = sourceAsset.split("/")[0];
|
|
899
|
+
const chainIdNum = parseInt(sourceChainId.split(":")[1]);
|
|
900
|
+
const tokenAddress = sourceAsset.split("/")[1].split(":")[1];
|
|
901
|
+
const permitParams = {
|
|
902
|
+
chainId: chainIdNum,
|
|
903
|
+
verifyingContract: evm_escrow_encoding_1.PERMIT2_CONTRACT_ADDRESS,
|
|
904
|
+
token: tokenAddress,
|
|
905
|
+
amount: maxSourceAmount,
|
|
906
|
+
spender: sourceDefaults.escrowContract,
|
|
907
|
+
nonce: (0, utils_js_1.resolvePermitNonce)(nonce),
|
|
908
|
+
deadline: (0, utils_js_1.resolvePermitDeadline)(deadline),
|
|
909
|
+
reserver: sourceDefaults.quoteSelector,
|
|
910
|
+
releaser: sourceDefaults.fulfillmentVerifierAccount
|
|
911
|
+
};
|
|
912
|
+
const messagePrehash = (0, evm_escrow_encoding_1.createPermitWitnessTransferFromPrehash)(permitParams);
|
|
913
|
+
const messageHash = (0, evm_escrow_encoding_1.hashPermitWitnessTransferFrom)(messagePrehash);
|
|
914
|
+
return { messageScheme: "EVM_PERMIT2", messageHash, messagePrehash: JSON.stringify(messagePrehash) };
|
|
915
|
+
},
|
|
916
|
+
async sign(signedMessage, privateKey) {
|
|
917
|
+
if (!signedMessage.message_prehash) {
|
|
918
|
+
throw new Error("EVM adapter sign(): signed_messages[i].message_prehash is required");
|
|
919
|
+
}
|
|
920
|
+
const prehash = JSON.parse(signedMessage.message_prehash);
|
|
921
|
+
const wallet = new ethers_1.Wallet(privateKey);
|
|
922
|
+
return wallet.signTypedData(prehash.domain, prehash.types, prehash.message);
|
|
923
|
+
},
|
|
924
|
+
recoverSigner(signed, source) {
|
|
925
|
+
let recovered;
|
|
926
|
+
try {
|
|
927
|
+
recovered = (0, ethers_1.recoverAddress)(signed.message, signed.signature);
|
|
928
|
+
} catch (e) {
|
|
929
|
+
throw new errors_js_1.RecoveryFailedError(`sender_auth: could not recover a signer: ${e.message}`);
|
|
930
|
+
}
|
|
931
|
+
if (!(0, utils_js_1.sameAddress)(recovered, source.account)) {
|
|
932
|
+
throw new errors_js_1.SignerMismatchError(`sender_auth: recovered ${recovered}, not source.account`);
|
|
933
|
+
}
|
|
934
|
+
return source.account;
|
|
935
|
+
},
|
|
936
|
+
recoverAndVerify(signed, source, expected) {
|
|
937
|
+
let canonical;
|
|
938
|
+
let msg;
|
|
939
|
+
try {
|
|
940
|
+
msg = JSON.parse(signed.message_prehash).message;
|
|
941
|
+
canonical = (0, evm_escrow_encoding_1.createPermitWitnessTransferFromPrehash)({
|
|
942
|
+
chainId: (0, chain_id_js_1.evmChainId)(source.network),
|
|
943
|
+
verifyingContract: evm_escrow_encoding_1.PERMIT2_CONTRACT_ADDRESS,
|
|
944
|
+
token: msg.permitted.token,
|
|
945
|
+
amount: msg.permitted.amount,
|
|
946
|
+
spender: msg.spender,
|
|
947
|
+
nonce: BigInt(msg.nonce),
|
|
948
|
+
deadline: BigInt(msg.deadline),
|
|
949
|
+
reserver: msg.witness.reserver,
|
|
950
|
+
releaser: msg.witness.releaser
|
|
951
|
+
});
|
|
952
|
+
} catch {
|
|
953
|
+
throw new errors_js_1.MalformedPrehashError();
|
|
954
|
+
}
|
|
955
|
+
let recovered;
|
|
956
|
+
try {
|
|
957
|
+
recovered = (0, ethers_1.verifyTypedData)(canonical.domain, canonical.types, canonical.message, signed.signature);
|
|
958
|
+
} catch {
|
|
959
|
+
throw new Error("sender_auth: deposit signature does not recover to source.account");
|
|
960
|
+
}
|
|
961
|
+
if (!(0, utils_js_1.sameAddress)(recovered, source.account)) {
|
|
962
|
+
throw new Error("sender_auth: deposit signature does not recover to source.account");
|
|
963
|
+
}
|
|
964
|
+
const deadlineSec = Number(msg.deadline);
|
|
965
|
+
(0, utils_js_1.assertToken)(msg.permitted.token, source.asset, (a) => a);
|
|
966
|
+
(0, utils_js_1.assertAmountMatches)(msg.permitted.amount, expected.maxSourceAmount);
|
|
967
|
+
(0, utils_js_1.assertFresh)(deadlineSec, expected.nowSec ?? (0, utils_js_1.nowSec)());
|
|
968
|
+
if (expected.escrowContract !== void 0) {
|
|
969
|
+
(0, utils_js_1.assertSpender)(msg.spender, expected.escrowContract, (a) => a);
|
|
970
|
+
}
|
|
971
|
+
(0, utils_js_1.assertRolePairComplete)(expected.reserver, expected.releaser);
|
|
972
|
+
if (expected.reserver !== void 0 && expected.releaser !== void 0) {
|
|
973
|
+
(0, utils_js_1.assertWitnessRoles)(msg.witness.reserver, msg.witness.releaser, expected.reserver, expected.releaser, (a) => a);
|
|
974
|
+
}
|
|
975
|
+
return {
|
|
976
|
+
amount: msg.permitted.amount,
|
|
977
|
+
deadlineSec,
|
|
978
|
+
permit: {
|
|
979
|
+
scheme: "EVM_PERMIT2",
|
|
980
|
+
token: msg.permitted.token,
|
|
981
|
+
amount: msg.permitted.amount,
|
|
982
|
+
deadlineSec,
|
|
983
|
+
reserver: msg.witness.reserver,
|
|
984
|
+
releaser: msg.witness.releaser,
|
|
985
|
+
spender: msg.spender
|
|
986
|
+
}
|
|
987
|
+
};
|
|
988
|
+
}
|
|
989
|
+
};
|
|
990
|
+
}
|
|
991
|
+
});
|
|
992
|
+
|
|
993
|
+
// ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/tron.js
|
|
994
|
+
var require_tron = __commonJS({
|
|
995
|
+
"../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/tron.js"(exports2) {
|
|
996
|
+
"use strict";
|
|
997
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
998
|
+
exports2.tronAdapter = void 0;
|
|
999
|
+
var ethers_1 = require("ethers");
|
|
1000
|
+
var tvm_escrow_encoding_1 = require_dist();
|
|
1001
|
+
var utils_js_1 = require_utils();
|
|
1002
|
+
var errors_js_1 = require_errors();
|
|
1003
|
+
var chain_id_js_1 = require_chain_id2();
|
|
1004
|
+
exports2.tronAdapter = {
|
|
1005
|
+
async buildAuthMessage({ sourceAsset, maxSourceAmount, sourceDefaults, deadline, nonce }) {
|
|
1006
|
+
if (nonce === void 0) {
|
|
1007
|
+
throw new Error("sender_auth: buildAuthMessage requires an explicit nonce \u2014 derive it deterministically from a stable request id (e.g. the challenge id) so retries reproduce the same permit; pass generatePermitNonce() only for genuinely one-shot builds");
|
|
1008
|
+
}
|
|
1009
|
+
if (deadline === void 0) {
|
|
1010
|
+
throw new Error("sender_auth: buildAuthMessage requires an explicit permit deadline (absolute Unix seconds) \u2014 the low-level builder does not default it; derive it from the payment's fulfillment/settlement deadline in the calling layer (pgc/mppx)");
|
|
1011
|
+
}
|
|
1012
|
+
const sourceChainId = sourceAsset.split("/")[0];
|
|
1013
|
+
const tokenAddress = sourceAsset.split("/")[1].split(":")[1];
|
|
1014
|
+
const permit2Address = sourceDefaults.permit2Contract ?? (0, chain_id_js_1.resolveTronPermit2)(sourceChainId);
|
|
1015
|
+
const tvmParams = {
|
|
1016
|
+
chainId: (0, chain_id_js_1.tronNumericChainId)(sourceChainId),
|
|
1017
|
+
permit2Address,
|
|
1018
|
+
tokenAddress,
|
|
1019
|
+
amount: maxSourceAmount,
|
|
1020
|
+
spenderAddress: sourceDefaults.escrowContract,
|
|
1021
|
+
nonce: (0, utils_js_1.resolvePermitNonce)(nonce),
|
|
1022
|
+
deadline: (0, utils_js_1.resolvePermitDeadline)(deadline),
|
|
1023
|
+
reserverAddress: sourceDefaults.quoteSelector,
|
|
1024
|
+
releaserAddress: sourceDefaults.fulfillmentVerifierAccount
|
|
1025
|
+
};
|
|
1026
|
+
const messagePrehash = (0, tvm_escrow_encoding_1.createTvmPermitWitnessTransferFromPrehash)(tvmParams);
|
|
1027
|
+
const messageHash = (0, tvm_escrow_encoding_1.hashTvmPermitWitnessTransferFrom)(messagePrehash);
|
|
1028
|
+
return { messageScheme: "EVM_PERMIT2", messageHash, messagePrehash: JSON.stringify(messagePrehash) };
|
|
1029
|
+
},
|
|
1030
|
+
async sign(signedMessage, privateKey) {
|
|
1031
|
+
const wallet = new ethers_1.Wallet(privateKey.startsWith("0x") ? privateKey : "0x" + privateKey);
|
|
1032
|
+
return wallet.signingKey.sign(signedMessage.message).serialized;
|
|
1033
|
+
},
|
|
1034
|
+
recoverSigner(signed, source) {
|
|
1035
|
+
let recovered;
|
|
1036
|
+
try {
|
|
1037
|
+
recovered = (0, ethers_1.recoverAddress)(signed.message, signed.signature);
|
|
1038
|
+
} catch (e) {
|
|
1039
|
+
throw new errors_js_1.RecoveryFailedError(`sender_auth: could not recover a signer: ${e.message}`);
|
|
1040
|
+
}
|
|
1041
|
+
if (!(0, utils_js_1.sameAddress)(recovered, (0, tvm_escrow_encoding_1.normalizeAddress)(source.account))) {
|
|
1042
|
+
throw new errors_js_1.SignerMismatchError(`sender_auth: recovered ${recovered}, not source.account`);
|
|
1043
|
+
}
|
|
1044
|
+
return source.account;
|
|
1045
|
+
},
|
|
1046
|
+
recoverAndVerify(signed, source, expected) {
|
|
1047
|
+
let msg;
|
|
1048
|
+
let digest;
|
|
1049
|
+
try {
|
|
1050
|
+
msg = JSON.parse(signed.message_prehash).message;
|
|
1051
|
+
const canonical = (0, tvm_escrow_encoding_1.createTvmPermitWitnessTransferFromPrehash)({
|
|
1052
|
+
chainId: (0, chain_id_js_1.tronNumericChainId)(source.network),
|
|
1053
|
+
permit2Address: (0, chain_id_js_1.resolveTronPermit2)(source.network),
|
|
1054
|
+
tokenAddress: msg.permitted.token,
|
|
1055
|
+
amount: msg.permitted.amount,
|
|
1056
|
+
spenderAddress: msg.spender,
|
|
1057
|
+
nonce: BigInt(msg.nonce),
|
|
1058
|
+
deadline: BigInt(msg.deadline),
|
|
1059
|
+
reserverAddress: msg.witness.reserver,
|
|
1060
|
+
releaserAddress: msg.witness.releaser
|
|
1061
|
+
});
|
|
1062
|
+
digest = (0, tvm_escrow_encoding_1.hashTvmPermitWitnessTransferFrom)(canonical);
|
|
1063
|
+
} catch {
|
|
1064
|
+
throw new errors_js_1.MalformedPrehashError();
|
|
1065
|
+
}
|
|
1066
|
+
let recovered;
|
|
1067
|
+
try {
|
|
1068
|
+
recovered = (0, ethers_1.recoverAddress)(digest, signed.signature);
|
|
1069
|
+
} catch {
|
|
1070
|
+
throw new Error("sender_auth: deposit signature does not recover to source.account");
|
|
1071
|
+
}
|
|
1072
|
+
if (!(0, utils_js_1.sameAddress)(recovered, (0, tvm_escrow_encoding_1.normalizeAddress)(source.account))) {
|
|
1073
|
+
throw new Error("sender_auth: deposit signature does not recover to source.account");
|
|
1074
|
+
}
|
|
1075
|
+
const deadlineSec = Number(msg.deadline);
|
|
1076
|
+
(0, utils_js_1.assertToken)(msg.permitted.token, source.asset, tvm_escrow_encoding_1.normalizeAddress);
|
|
1077
|
+
(0, utils_js_1.assertAmountMatches)(msg.permitted.amount, expected.maxSourceAmount);
|
|
1078
|
+
(0, utils_js_1.assertFresh)(deadlineSec, expected.nowSec ?? (0, utils_js_1.nowSec)());
|
|
1079
|
+
if (expected.escrowContract !== void 0) {
|
|
1080
|
+
(0, utils_js_1.assertSpender)(msg.spender, expected.escrowContract, tvm_escrow_encoding_1.normalizeAddress);
|
|
1081
|
+
}
|
|
1082
|
+
(0, utils_js_1.assertRolePairComplete)(expected.reserver, expected.releaser);
|
|
1083
|
+
if (expected.reserver !== void 0 && expected.releaser !== void 0) {
|
|
1084
|
+
(0, utils_js_1.assertWitnessRoles)(msg.witness.reserver, msg.witness.releaser, expected.reserver, expected.releaser, tvm_escrow_encoding_1.normalizeAddress);
|
|
1085
|
+
}
|
|
1086
|
+
return {
|
|
1087
|
+
amount: msg.permitted.amount,
|
|
1088
|
+
deadlineSec,
|
|
1089
|
+
permit: {
|
|
1090
|
+
scheme: "EVM_PERMIT2",
|
|
1091
|
+
token: msg.permitted.token,
|
|
1092
|
+
amount: msg.permitted.amount,
|
|
1093
|
+
deadlineSec,
|
|
1094
|
+
reserver: msg.witness.reserver,
|
|
1095
|
+
releaser: msg.witness.releaser,
|
|
1096
|
+
spender: msg.spender
|
|
1097
|
+
}
|
|
1098
|
+
};
|
|
1099
|
+
}
|
|
1100
|
+
};
|
|
1101
|
+
}
|
|
1102
|
+
});
|
|
1103
|
+
|
|
1104
|
+
// ../contracts/svm/escrow-encoding/typescript/dist/errors.js
|
|
1105
|
+
var require_errors2 = __commonJS({
|
|
679
1106
|
"../contracts/svm/escrow-encoding/typescript/dist/errors.js"(exports2) {
|
|
680
1107
|
"use strict";
|
|
681
1108
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
@@ -777,8 +1204,8 @@ var require_pubkey = __commonJS({
|
|
|
777
1204
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
778
1205
|
exports2.Pubkey = void 0;
|
|
779
1206
|
var bs58_1 = __importDefault(require("bs58"));
|
|
780
|
-
var errors_1 =
|
|
781
|
-
var
|
|
1207
|
+
var errors_1 = require_errors2();
|
|
1208
|
+
var Pubkey2 = class _Pubkey {
|
|
782
1209
|
constructor(data) {
|
|
783
1210
|
if (data.length !== 32) {
|
|
784
1211
|
throw new errors_1.InvalidPubkeyLengthError();
|
|
@@ -871,7 +1298,7 @@ var require_pubkey = __commonJS({
|
|
|
871
1298
|
return this.data.every((b, i) => b === other.data[i]);
|
|
872
1299
|
}
|
|
873
1300
|
};
|
|
874
|
-
exports2.Pubkey =
|
|
1301
|
+
exports2.Pubkey = Pubkey2;
|
|
875
1302
|
}
|
|
876
1303
|
});
|
|
877
1304
|
|
|
@@ -983,7 +1410,7 @@ var require_cryptoNode = __commonJS({
|
|
|
983
1410
|
});
|
|
984
1411
|
|
|
985
1412
|
// ../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/utils.js
|
|
986
|
-
var
|
|
1413
|
+
var require_utils2 = __commonJS({
|
|
987
1414
|
"../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/utils.js"(exports2) {
|
|
988
1415
|
"use strict";
|
|
989
1416
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
@@ -1232,7 +1659,7 @@ var require_sha3 = __commonJS({
|
|
|
1232
1659
|
exports2.shake256 = exports2.shake128 = exports2.keccak_512 = exports2.keccak_384 = exports2.keccak_256 = exports2.keccak_224 = exports2.sha3_512 = exports2.sha3_384 = exports2.sha3_256 = exports2.sha3_224 = exports2.Keccak = void 0;
|
|
1233
1660
|
exports2.keccakP = keccakP;
|
|
1234
1661
|
var _u64_ts_1 = require_u64();
|
|
1235
|
-
var utils_ts_1 =
|
|
1662
|
+
var utils_ts_1 = require_utils2();
|
|
1236
1663
|
var _0n = BigInt(0);
|
|
1237
1664
|
var _1n = BigInt(1);
|
|
1238
1665
|
var _2n = BigInt(2);
|
|
@@ -1497,7 +1924,7 @@ var require_deposit_encoder3 = __commonJS({
|
|
|
1497
1924
|
exports2.computeDepositHash = computeDepositHash2;
|
|
1498
1925
|
var encoding_utils_1 = require_encoding_utils();
|
|
1499
1926
|
var escrow_domain_1 = require_escrow_domain();
|
|
1500
|
-
var errors_1 =
|
|
1927
|
+
var errors_1 = require_errors2();
|
|
1501
1928
|
function computeDepositHash2(params, domain) {
|
|
1502
1929
|
if (params.paymentId.length !== 32 || (0, encoding_utils_1.isZeroBytes32)(params.paymentId)) {
|
|
1503
1930
|
throw new errors_1.ZeroPaymentIdError();
|
|
@@ -1525,7 +1952,7 @@ var require_reserve_encoder3 = __commonJS({
|
|
|
1525
1952
|
exports2.computeReserveHash = computeReserveHash;
|
|
1526
1953
|
var encoding_utils_1 = require_encoding_utils();
|
|
1527
1954
|
var escrow_domain_1 = require_escrow_domain();
|
|
1528
|
-
var errors_1 =
|
|
1955
|
+
var errors_1 = require_errors2();
|
|
1529
1956
|
function computeReserveHash(params, domain) {
|
|
1530
1957
|
if (params.depositHash.length !== 32 || (0, encoding_utils_1.isZeroBytes32)(params.depositHash)) {
|
|
1531
1958
|
throw new errors_1.ZeroDepositHashError();
|
|
@@ -1545,7 +1972,7 @@ var require_release_encoder = __commonJS({
|
|
|
1545
1972
|
exports2.computeReleaseHash = computeReleaseHash;
|
|
1546
1973
|
var encoding_utils_1 = require_encoding_utils();
|
|
1547
1974
|
var escrow_domain_1 = require_escrow_domain();
|
|
1548
|
-
var errors_1 =
|
|
1975
|
+
var errors_1 = require_errors2();
|
|
1549
1976
|
function computeReleaseHash(params, domain) {
|
|
1550
1977
|
if (params.depositHash.length !== 32 || (0, encoding_utils_1.isZeroBytes32)(params.depositHash)) {
|
|
1551
1978
|
throw new errors_1.ZeroDepositHashError();
|
|
@@ -1563,7 +1990,7 @@ var require_refund_encoder = __commonJS({
|
|
|
1563
1990
|
exports2.computeRefundHash = computeRefundHash;
|
|
1564
1991
|
var encoding_utils_1 = require_encoding_utils();
|
|
1565
1992
|
var escrow_domain_1 = require_escrow_domain();
|
|
1566
|
-
var errors_1 =
|
|
1993
|
+
var errors_1 = require_errors2();
|
|
1567
1994
|
function computeRefundHash(params, domain) {
|
|
1568
1995
|
if (params.depositHash.length !== 32 || (0, encoding_utils_1.isZeroBytes32)(params.depositHash)) {
|
|
1569
1996
|
throw new errors_1.ZeroDepositHashError();
|
|
@@ -1624,7 +2051,7 @@ var require_dist3 = __commonJS({
|
|
|
1624
2051
|
Object.defineProperty(exports2, "escrowDomainPrefixBytes", { enumerable: true, get: function() {
|
|
1625
2052
|
return escrow_domain_1.escrowDomainPrefixBytes;
|
|
1626
2053
|
} });
|
|
1627
|
-
var errors_1 =
|
|
2054
|
+
var errors_1 = require_errors2();
|
|
1628
2055
|
Object.defineProperty(exports2, "EncodingError", { enumerable: true, get: function() {
|
|
1629
2056
|
return errors_1.EncodingError;
|
|
1630
2057
|
} });
|
|
@@ -1669,23 +2096,338 @@ var require_dist3 = __commonJS({
|
|
|
1669
2096
|
Object.defineProperty(exports2, "computeReserveHash", { enumerable: true, get: function() {
|
|
1670
2097
|
return reserve_encoder_1.computeReserveHash;
|
|
1671
2098
|
} });
|
|
1672
|
-
var release_encoder_1 = require_release_encoder();
|
|
1673
|
-
Object.defineProperty(exports2, "computeReleaseHash", { enumerable: true, get: function() {
|
|
1674
|
-
return release_encoder_1.computeReleaseHash;
|
|
2099
|
+
var release_encoder_1 = require_release_encoder();
|
|
2100
|
+
Object.defineProperty(exports2, "computeReleaseHash", { enumerable: true, get: function() {
|
|
2101
|
+
return release_encoder_1.computeReleaseHash;
|
|
2102
|
+
} });
|
|
2103
|
+
var refund_encoder_1 = require_refund_encoder();
|
|
2104
|
+
Object.defineProperty(exports2, "computeRefundHash", { enumerable: true, get: function() {
|
|
2105
|
+
return refund_encoder_1.computeRefundHash;
|
|
2106
|
+
} });
|
|
2107
|
+
var nonce_generator_1 = require_nonce_generator2();
|
|
2108
|
+
Object.defineProperty(exports2, "generateNonce", { enumerable: true, get: function() {
|
|
2109
|
+
return nonce_generator_1.generateNonce;
|
|
2110
|
+
} });
|
|
2111
|
+
Object.defineProperty(exports2, "REPLAY_SLOTS", { enumerable: true, get: function() {
|
|
2112
|
+
return nonce_generator_1.REPLAY_SLOTS;
|
|
2113
|
+
} });
|
|
2114
|
+
Object.defineProperty(exports2, "MAX_VALID_SLOT", { enumerable: true, get: function() {
|
|
2115
|
+
return nonce_generator_1.MAX_VALID_SLOT;
|
|
2116
|
+
} });
|
|
2117
|
+
}
|
|
2118
|
+
});
|
|
2119
|
+
|
|
2120
|
+
// ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/solana.js
|
|
2121
|
+
var require_solana = __commonJS({
|
|
2122
|
+
"../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/solana.js"(exports2) {
|
|
2123
|
+
"use strict";
|
|
2124
|
+
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
2125
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
2126
|
+
};
|
|
2127
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
2128
|
+
exports2.solanaAdapter = void 0;
|
|
2129
|
+
var ethers_1 = require("ethers");
|
|
2130
|
+
var tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
2131
|
+
var bs58_1 = __importDefault(require("bs58"));
|
|
2132
|
+
var solana_escrow_encoding_1 = require_dist3();
|
|
2133
|
+
var utils_js_1 = require_utils();
|
|
2134
|
+
var errors_js_1 = require_errors();
|
|
2135
|
+
var chain_id_js_1 = require_chain_id2();
|
|
2136
|
+
var idAddr = (a) => a;
|
|
2137
|
+
function generateSolanaPaymentIdV3(requestId) {
|
|
2138
|
+
return (0, ethers_1.keccak256)((0, ethers_1.toUtf8Bytes)(requestId));
|
|
2139
|
+
}
|
|
2140
|
+
function hashDeposit(prehash, domain) {
|
|
2141
|
+
return (0, ethers_1.hexlify)((0, solana_escrow_encoding_1.computeDepositHash)({
|
|
2142
|
+
paymentId: (0, ethers_1.getBytes)(prehash.payment_id),
|
|
2143
|
+
depositor: solana_escrow_encoding_1.Pubkey.fromBase58(prehash.depositor),
|
|
2144
|
+
mint: solana_escrow_encoding_1.Pubkey.fromBase58(prehash.mint),
|
|
2145
|
+
amount: BigInt(prehash.amount),
|
|
2146
|
+
reserver: solana_escrow_encoding_1.Pubkey.fromBase58(prehash.reserver),
|
|
2147
|
+
releaser: solana_escrow_encoding_1.Pubkey.fromBase58(prehash.releaser),
|
|
2148
|
+
nonce: BigInt(prehash.nonce),
|
|
2149
|
+
issuedAt: BigInt(prehash.issued_at),
|
|
2150
|
+
deadline: BigInt(prehash.deadline)
|
|
2151
|
+
}, domain));
|
|
2152
|
+
}
|
|
2153
|
+
function domainFrom(defaults) {
|
|
2154
|
+
if (!defaults.escrowContract) {
|
|
2155
|
+
throw new Error("sender_auth: Solana source requires escrowContract (escrow program id) for the deposit-hash domain");
|
|
2156
|
+
}
|
|
2157
|
+
if (!defaults.svmSignatureClusterId || defaults.svmSignatureDomainVersion == null) {
|
|
2158
|
+
throw new Error("sender_auth: Solana source requires svmSignatureClusterId and svmSignatureDomainVersion (V3 escrow domain separation)");
|
|
2159
|
+
}
|
|
2160
|
+
return {
|
|
2161
|
+
clusterId: (0, chain_id_js_1.clusterIdFromName)(defaults.svmSignatureClusterId),
|
|
2162
|
+
signatureDomainVersion: defaults.svmSignatureDomainVersion,
|
|
2163
|
+
programId: solana_escrow_encoding_1.Pubkey.fromBase58(defaults.escrowContract)
|
|
2164
|
+
};
|
|
2165
|
+
}
|
|
2166
|
+
exports2.solanaAdapter = {
|
|
2167
|
+
async buildAuthMessage({ sourceAsset, depositor, maxSourceAmount, requestId, sourceDefaults, nonce, solanaClockReader }) {
|
|
2168
|
+
if (!requestId) {
|
|
2169
|
+
throw new Error("sender_auth: request_id is required");
|
|
2170
|
+
}
|
|
2171
|
+
const sourceChainId = sourceAsset.split("/")[0];
|
|
2172
|
+
const tokenMint = sourceAsset.split("/")[1].split(":")[1];
|
|
2173
|
+
const depositNonce = nonce !== void 0 ? BigInt(nonce) : (0, solana_escrow_encoding_1.generateNonce)();
|
|
2174
|
+
if (nonce !== void 0) {
|
|
2175
|
+
if (depositNonce < 0n || depositNonce >= 1n << 64n) {
|
|
2176
|
+
throw new Error("sender_auth: Solana nonce must fit an unsigned 64-bit integer (0 <= nonce < 2^64)");
|
|
2177
|
+
}
|
|
2178
|
+
if ((depositNonce & 0xffn) >= utils_js_1.SOLANA_REPLAY_SLOTS) {
|
|
2179
|
+
throw new Error(`sender_auth: Solana nonce low byte (replay slot = nonce & 0xFF = ${depositNonce & 0xffn}) must be < ${utils_js_1.SOLANA_REPLAY_SLOTS}; slots ${utils_js_1.SOLANA_REPLAY_SLOTS}-255 are reserved`);
|
|
2180
|
+
}
|
|
2181
|
+
}
|
|
2182
|
+
const issuedAt = solanaClockReader ? await solanaClockReader(sourceChainId) : BigInt(Math.floor(Date.now() / 1e3));
|
|
2183
|
+
const deadline = issuedAt + BigInt(utils_js_1.REPLAY_HORIZON_SECS - 8);
|
|
2184
|
+
const paymentId = generateSolanaPaymentIdV3(requestId);
|
|
2185
|
+
const prehash = {
|
|
2186
|
+
payment_id: paymentId,
|
|
2187
|
+
depositor,
|
|
2188
|
+
mint: tokenMint,
|
|
2189
|
+
amount: BigInt(maxSourceAmount).toString(),
|
|
2190
|
+
reserver: sourceDefaults.quoteSelector,
|
|
2191
|
+
releaser: sourceDefaults.fulfillmentVerifierAccount,
|
|
2192
|
+
nonce: depositNonce.toString(),
|
|
2193
|
+
issued_at: issuedAt.toString(),
|
|
2194
|
+
deadline: deadline.toString()
|
|
2195
|
+
};
|
|
2196
|
+
const depositHash = hashDeposit(prehash, domainFrom(sourceDefaults));
|
|
2197
|
+
return { messageScheme: "SOLANA", messageHash: depositHash, messagePrehash: JSON.stringify(prehash) };
|
|
2198
|
+
},
|
|
2199
|
+
async sign(signedMessage, privateKey) {
|
|
2200
|
+
const messageBytes = (0, ethers_1.getBytes)(signedMessage.message);
|
|
2201
|
+
const secretKey = secretKeyFromPrivate2(privateKey);
|
|
2202
|
+
const sig = tweetnacl_1.default.sign.detached(messageBytes, secretKey);
|
|
2203
|
+
return "0x" + Buffer.from(sig).toString("hex");
|
|
2204
|
+
},
|
|
2205
|
+
deriveDelegateSigner(privateKey) {
|
|
2206
|
+
return bs58_1.default.encode(tweetnacl_1.default.sign.keyPair.fromSecretKey(secretKeyFromPrivate2(privateKey)).publicKey);
|
|
2207
|
+
},
|
|
2208
|
+
recoverSigner(signed, source) {
|
|
2209
|
+
const provided = signed.payload?.delegate_signer;
|
|
2210
|
+
if (provided !== void 0 && provided !== source.account) {
|
|
2211
|
+
throw new errors_js_1.SignerMismatchError(`sender_auth: delegate_signer ${provided} != source.account`);
|
|
2212
|
+
}
|
|
2213
|
+
const signer = provided ?? source.account;
|
|
2214
|
+
let pub;
|
|
2215
|
+
let msg;
|
|
2216
|
+
let sig;
|
|
2217
|
+
try {
|
|
2218
|
+
pub = bs58_1.default.decode(signer);
|
|
2219
|
+
msg = (0, ethers_1.getBytes)(signed.message);
|
|
2220
|
+
sig = (0, ethers_1.getBytes)(signed.signature);
|
|
2221
|
+
} catch {
|
|
2222
|
+
throw new errors_js_1.RecoveryFailedError("sender_auth: malformed Solana pubkey/message/signature encoding");
|
|
2223
|
+
}
|
|
2224
|
+
if (pub.length !== 32 || msg.length !== 32 || sig.length !== 64) {
|
|
2225
|
+
throw new errors_js_1.RecoveryFailedError("sender_auth: Solana pubkey must be 32 bytes, message 32, signature 64");
|
|
2226
|
+
}
|
|
2227
|
+
let ok = false;
|
|
2228
|
+
try {
|
|
2229
|
+
ok = tweetnacl_1.default.sign.detached.verify(msg, sig, pub);
|
|
2230
|
+
} catch {
|
|
2231
|
+
ok = false;
|
|
2232
|
+
}
|
|
2233
|
+
if (!ok) {
|
|
2234
|
+
throw new errors_js_1.SignerMismatchError("sender_auth: ed25519 verification failed");
|
|
2235
|
+
}
|
|
2236
|
+
return source.account;
|
|
2237
|
+
},
|
|
2238
|
+
recoverAndVerify(signed, source, expected) {
|
|
2239
|
+
let prehash;
|
|
2240
|
+
let canonicalHash;
|
|
2241
|
+
try {
|
|
2242
|
+
prehash = JSON.parse(signed.message_prehash);
|
|
2243
|
+
canonicalHash = hashDeposit(prehash, domainFrom(expected));
|
|
2244
|
+
} catch {
|
|
2245
|
+
throw new errors_js_1.MalformedPrehashError();
|
|
2246
|
+
}
|
|
2247
|
+
if (canonicalHash.toLowerCase() !== signed.message.toLowerCase()) {
|
|
2248
|
+
throw new Error("sender_auth: deposit hash does not match the signed message");
|
|
2249
|
+
}
|
|
2250
|
+
const delegateSigner = signed.payload?.delegate_signer;
|
|
2251
|
+
if (!delegateSigner) {
|
|
2252
|
+
throw new Error("sender_auth: Solana credential is missing delegate_signer");
|
|
2253
|
+
}
|
|
2254
|
+
let verified = false;
|
|
2255
|
+
try {
|
|
2256
|
+
verified = tweetnacl_1.default.sign.detached.verify((0, ethers_1.getBytes)(signed.message), (0, ethers_1.getBytes)(signed.signature), bs58_1.default.decode(delegateSigner));
|
|
2257
|
+
} catch {
|
|
2258
|
+
verified = false;
|
|
2259
|
+
}
|
|
2260
|
+
if (!verified || delegateSigner !== source.account || prehash.depositor !== source.account) {
|
|
2261
|
+
throw new Error("sender_auth: deposit signature does not recover to source.account");
|
|
2262
|
+
}
|
|
2263
|
+
const deadlineSec = Number(prehash.deadline);
|
|
2264
|
+
(0, utils_js_1.assertToken)(prehash.mint, source.asset, idAddr);
|
|
2265
|
+
(0, utils_js_1.assertAmountMatches)(prehash.amount, expected.maxSourceAmount);
|
|
2266
|
+
(0, utils_js_1.assertRolePairComplete)(expected.reserver, expected.releaser);
|
|
2267
|
+
if (expected.reserver !== void 0 && expected.releaser !== void 0) {
|
|
2268
|
+
(0, utils_js_1.assertWitnessRoles)(prehash.reserver, prehash.releaser, expected.reserver, expected.releaser, idAddr);
|
|
2269
|
+
}
|
|
2270
|
+
return {
|
|
2271
|
+
amount: prehash.amount,
|
|
2272
|
+
deadlineSec,
|
|
2273
|
+
permit: {
|
|
2274
|
+
scheme: "SOLANA",
|
|
2275
|
+
token: prehash.mint,
|
|
2276
|
+
amount: prehash.amount,
|
|
2277
|
+
deadlineSec,
|
|
2278
|
+
reserver: prehash.reserver,
|
|
2279
|
+
releaser: prehash.releaser,
|
|
2280
|
+
depositor: prehash.depositor
|
|
2281
|
+
}
|
|
2282
|
+
};
|
|
2283
|
+
}
|
|
2284
|
+
};
|
|
2285
|
+
function secretKeyFromPrivate2(privateKey) {
|
|
2286
|
+
if (/^[0-9a-fA-F]{64}$/.test(privateKey)) {
|
|
2287
|
+
const seed = new Uint8Array(32);
|
|
2288
|
+
for (let i = 0; i < 32; i++) {
|
|
2289
|
+
seed[i] = parseInt(privateKey.substring(i * 2, i * 2 + 2), 16);
|
|
2290
|
+
}
|
|
2291
|
+
return tweetnacl_1.default.sign.keyPair.fromSeed(seed).secretKey;
|
|
2292
|
+
}
|
|
2293
|
+
const decoded = bs58_1.default.decode(privateKey);
|
|
2294
|
+
if (decoded.length === 64)
|
|
2295
|
+
return decoded;
|
|
2296
|
+
if (decoded.length === 32)
|
|
2297
|
+
return tweetnacl_1.default.sign.keyPair.fromSeed(decoded).secretKey;
|
|
2298
|
+
throw new Error(`Invalid Solana private key length: expected 32 or 64 bytes, got ${decoded.length}`);
|
|
2299
|
+
}
|
|
2300
|
+
}
|
|
2301
|
+
});
|
|
2302
|
+
|
|
2303
|
+
// ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/index.js
|
|
2304
|
+
var require_adapters = __commonJS({
|
|
2305
|
+
"../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/index.js"(exports2) {
|
|
2306
|
+
"use strict";
|
|
2307
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
2308
|
+
exports2.getChainAdapter = getChainAdapter2;
|
|
2309
|
+
var chain_id_js_1 = require_chain_id2();
|
|
2310
|
+
var evm_js_1 = require_evm();
|
|
2311
|
+
var tron_js_1 = require_tron();
|
|
2312
|
+
var solana_js_1 = require_solana();
|
|
2313
|
+
var adapters2 = {
|
|
2314
|
+
eip155: evm_js_1.evmAdapter,
|
|
2315
|
+
tron: tron_js_1.tronAdapter,
|
|
2316
|
+
solana: solana_js_1.solanaAdapter
|
|
2317
|
+
};
|
|
2318
|
+
function getChainAdapter2(caip2) {
|
|
2319
|
+
const adapter = adapters2[(0, chain_id_js_1.namespaceOf)(caip2)];
|
|
2320
|
+
if (!adapter) {
|
|
2321
|
+
throw new Error(`sender_auth: unsupported source chain '${caip2}'`);
|
|
2322
|
+
}
|
|
2323
|
+
return adapter;
|
|
2324
|
+
}
|
|
2325
|
+
}
|
|
2326
|
+
});
|
|
2327
|
+
|
|
2328
|
+
// ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/verify.js
|
|
2329
|
+
var require_verify = __commonJS({
|
|
2330
|
+
"../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/verify.js"(exports2) {
|
|
2331
|
+
"use strict";
|
|
2332
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
2333
|
+
exports2.verifyPaymentRequest = verifyPaymentRequest;
|
|
2334
|
+
var index_js_1 = require_adapters();
|
|
2335
|
+
function parseSourceAsset(assetIdentifier) {
|
|
2336
|
+
const parts = assetIdentifier.split("/");
|
|
2337
|
+
const nsParts = parts[1]?.split(":");
|
|
2338
|
+
if (parts.length < 2 || !nsParts || nsParts.length < 2 || !nsParts[1]) {
|
|
2339
|
+
throw new Error(`sender_auth: invalid source asset "${assetIdentifier}"`);
|
|
2340
|
+
}
|
|
2341
|
+
return { network: parts[0], asset: nsParts[1] };
|
|
2342
|
+
}
|
|
2343
|
+
function verifyPaymentRequest(request2, expected = {}) {
|
|
2344
|
+
const senderAuth = request2.sender_auth;
|
|
2345
|
+
if (!senderAuth?.signed_messages?.length) {
|
|
2346
|
+
throw new Error("sender_auth: request has no signed_messages to verify");
|
|
2347
|
+
}
|
|
2348
|
+
if (!request2.source) {
|
|
2349
|
+
throw new Error("sender_auth: request has no source");
|
|
2350
|
+
}
|
|
2351
|
+
const requestSource = parseSourceAsset(request2.source.asset_identifier);
|
|
2352
|
+
const { sourceAsset, network: networkOverride, maxSourceAmount: amountOverride, ...scheme } = expected;
|
|
2353
|
+
const network = networkOverride ?? requestSource.network;
|
|
2354
|
+
const asset = sourceAsset ?? requestSource.asset;
|
|
2355
|
+
const maxSourceAmount = amountOverride ?? request2.max_source_amount ?? "0";
|
|
2356
|
+
const source = { network, asset, account: request2.source.account };
|
|
2357
|
+
const perMessage = { ...scheme, maxSourceAmount };
|
|
2358
|
+
const adapter = (0, index_js_1.getChainAdapter)(network);
|
|
2359
|
+
const results = senderAuth.signed_messages.map((m) => adapter.recoverAndVerify(m, source, perMessage));
|
|
2360
|
+
return { results, recoveredAccount: source.account };
|
|
2361
|
+
}
|
|
2362
|
+
}
|
|
2363
|
+
});
|
|
2364
|
+
|
|
2365
|
+
// ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/signer.js
|
|
2366
|
+
var require_signer = __commonJS({
|
|
2367
|
+
"../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/signer.js"(exports2) {
|
|
2368
|
+
"use strict";
|
|
2369
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
2370
|
+
exports2.localKeySigner = localKeySigner2;
|
|
2371
|
+
var index_js_1 = require_adapters();
|
|
2372
|
+
function localKeySigner2(network, privateKey) {
|
|
2373
|
+
const adapter = (0, index_js_1.getChainAdapter)(network);
|
|
2374
|
+
return {
|
|
2375
|
+
async sign(signedMessage) {
|
|
2376
|
+
const signature = await adapter.sign(signedMessage, privateKey);
|
|
2377
|
+
const delegateSigner = adapter.deriveDelegateSigner?.(privateKey);
|
|
2378
|
+
return delegateSigner !== void 0 ? { signature, delegateSigner } : { signature };
|
|
2379
|
+
}
|
|
2380
|
+
};
|
|
2381
|
+
}
|
|
2382
|
+
}
|
|
2383
|
+
});
|
|
2384
|
+
|
|
2385
|
+
// ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/index.js
|
|
2386
|
+
var require_dist4 = __commonJS({
|
|
2387
|
+
"../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/index.js"(exports2) {
|
|
2388
|
+
"use strict";
|
|
2389
|
+
var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
|
|
2390
|
+
if (k2 === void 0) k2 = k;
|
|
2391
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
2392
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
2393
|
+
desc = { enumerable: true, get: function() {
|
|
2394
|
+
return m[k];
|
|
2395
|
+
} };
|
|
2396
|
+
}
|
|
2397
|
+
Object.defineProperty(o, k2, desc);
|
|
2398
|
+
}) : (function(o, m, k, k2) {
|
|
2399
|
+
if (k2 === void 0) k2 = k;
|
|
2400
|
+
o[k2] = m[k];
|
|
2401
|
+
}));
|
|
2402
|
+
var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) {
|
|
2403
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);
|
|
2404
|
+
};
|
|
2405
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
2406
|
+
exports2.localKeySigner = exports2.SignerMismatchError = exports2.RecoveryFailedError = exports2.MalformedPrehashError = exports2.verifyPaymentRequest = exports2.getChainAdapter = void 0;
|
|
2407
|
+
__exportStar(require_types(), exports2);
|
|
2408
|
+
__exportStar(require_utils(), exports2);
|
|
2409
|
+
__exportStar(require_chain_id2(), exports2);
|
|
2410
|
+
var index_js_1 = require_adapters();
|
|
2411
|
+
Object.defineProperty(exports2, "getChainAdapter", { enumerable: true, get: function() {
|
|
2412
|
+
return index_js_1.getChainAdapter;
|
|
2413
|
+
} });
|
|
2414
|
+
var verify_js_1 = require_verify();
|
|
2415
|
+
Object.defineProperty(exports2, "verifyPaymentRequest", { enumerable: true, get: function() {
|
|
2416
|
+
return verify_js_1.verifyPaymentRequest;
|
|
1675
2417
|
} });
|
|
1676
|
-
var
|
|
1677
|
-
Object.defineProperty(exports2, "
|
|
1678
|
-
return
|
|
2418
|
+
var errors_js_1 = require_errors();
|
|
2419
|
+
Object.defineProperty(exports2, "MalformedPrehashError", { enumerable: true, get: function() {
|
|
2420
|
+
return errors_js_1.MalformedPrehashError;
|
|
1679
2421
|
} });
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
return nonce_generator_1.generateNonce;
|
|
2422
|
+
Object.defineProperty(exports2, "RecoveryFailedError", { enumerable: true, get: function() {
|
|
2423
|
+
return errors_js_1.RecoveryFailedError;
|
|
1683
2424
|
} });
|
|
1684
|
-
Object.defineProperty(exports2, "
|
|
1685
|
-
return
|
|
2425
|
+
Object.defineProperty(exports2, "SignerMismatchError", { enumerable: true, get: function() {
|
|
2426
|
+
return errors_js_1.SignerMismatchError;
|
|
1686
2427
|
} });
|
|
1687
|
-
|
|
1688
|
-
|
|
2428
|
+
var signer_js_1 = require_signer();
|
|
2429
|
+
Object.defineProperty(exports2, "localKeySigner", { enumerable: true, get: function() {
|
|
2430
|
+
return signer_js_1.localKeySigner;
|
|
1689
2431
|
} });
|
|
1690
2432
|
}
|
|
1691
2433
|
});
|
|
@@ -1709,7 +2451,7 @@ var Interceptors = class {
|
|
|
1709
2451
|
}
|
|
1710
2452
|
};
|
|
1711
2453
|
var OpenAPI = {
|
|
1712
|
-
BASE: "https://
|
|
2454
|
+
BASE: "https://payment-gw.production-mainnet.atum.xyz",
|
|
1713
2455
|
CREDENTIALS: "include",
|
|
1714
2456
|
ENCODE_PATH: void 0,
|
|
1715
2457
|
HEADERS: void 0,
|
|
@@ -1726,8 +2468,8 @@ var OpenAPI = {
|
|
|
1726
2468
|
|
|
1727
2469
|
// src/generated/core/BaseHttpRequest.ts
|
|
1728
2470
|
var BaseHttpRequest = class {
|
|
1729
|
-
constructor(
|
|
1730
|
-
this.config =
|
|
2471
|
+
constructor(config2) {
|
|
2472
|
+
this.config = config2;
|
|
1731
2473
|
}
|
|
1732
2474
|
};
|
|
1733
2475
|
|
|
@@ -1878,15 +2620,15 @@ var getQueryString = (params) => {
|
|
|
1878
2620
|
Object.entries(params).forEach(([key, value]) => encodePair(key, value));
|
|
1879
2621
|
return qs.length ? `?${qs.join("&")}` : "";
|
|
1880
2622
|
};
|
|
1881
|
-
var getUrl = (
|
|
1882
|
-
const encoder =
|
|
1883
|
-
const path = options.url.replace("{api-version}",
|
|
2623
|
+
var getUrl = (config2, options) => {
|
|
2624
|
+
const encoder = config2.ENCODE_PATH || encodeURI;
|
|
2625
|
+
const path = options.url.replace("{api-version}", config2.VERSION).replace(/{(.*?)}/g, (substring, group) => {
|
|
1884
2626
|
if (options.path?.hasOwnProperty(group)) {
|
|
1885
2627
|
return encoder(String(options.path[group]));
|
|
1886
2628
|
}
|
|
1887
2629
|
return substring;
|
|
1888
2630
|
});
|
|
1889
|
-
const url =
|
|
2631
|
+
const url = config2.BASE + path;
|
|
1890
2632
|
return options.query ? url + getQueryString(options.query) : url;
|
|
1891
2633
|
};
|
|
1892
2634
|
var getFormData = (options) => {
|
|
@@ -1916,12 +2658,12 @@ var resolve = async (options, resolver) => {
|
|
|
1916
2658
|
}
|
|
1917
2659
|
return resolver;
|
|
1918
2660
|
};
|
|
1919
|
-
var getHeaders = async (
|
|
2661
|
+
var getHeaders = async (config2, options) => {
|
|
1920
2662
|
const [token, username, password, additionalHeaders] = await Promise.all([
|
|
1921
|
-
resolve(options,
|
|
1922
|
-
resolve(options,
|
|
1923
|
-
resolve(options,
|
|
1924
|
-
resolve(options,
|
|
2663
|
+
resolve(options, config2.TOKEN),
|
|
2664
|
+
resolve(options, config2.USERNAME),
|
|
2665
|
+
resolve(options, config2.PASSWORD),
|
|
2666
|
+
resolve(options, config2.HEADERS)
|
|
1925
2667
|
]);
|
|
1926
2668
|
const headers = Object.entries({
|
|
1927
2669
|
Accept: "application/json",
|
|
@@ -1961,7 +2703,7 @@ var getRequestBody = (options) => {
|
|
|
1961
2703
|
}
|
|
1962
2704
|
return void 0;
|
|
1963
2705
|
};
|
|
1964
|
-
var sendRequest = async (
|
|
2706
|
+
var sendRequest = async (config2, options, url, body, formData, headers, onCancel, axiosClient) => {
|
|
1965
2707
|
const controller = new AbortController();
|
|
1966
2708
|
let requestConfig = {
|
|
1967
2709
|
data: body ?? formData,
|
|
@@ -1969,10 +2711,10 @@ var sendRequest = async (config, options, url, body, formData, headers, onCancel
|
|
|
1969
2711
|
method: options.method,
|
|
1970
2712
|
signal: controller.signal,
|
|
1971
2713
|
url,
|
|
1972
|
-
withCredentials:
|
|
2714
|
+
withCredentials: config2.WITH_CREDENTIALS
|
|
1973
2715
|
};
|
|
1974
2716
|
onCancel(() => controller.abort());
|
|
1975
|
-
for (const fn of
|
|
2717
|
+
for (const fn of config2.interceptors.request._fns) {
|
|
1976
2718
|
requestConfig = await fn(requestConfig);
|
|
1977
2719
|
}
|
|
1978
2720
|
try {
|
|
@@ -2065,16 +2807,16 @@ var catchErrorCodes = (options, result) => {
|
|
|
2065
2807
|
);
|
|
2066
2808
|
}
|
|
2067
2809
|
};
|
|
2068
|
-
var request = (
|
|
2810
|
+
var request = (config2, options, axiosClient = import_axios.default) => {
|
|
2069
2811
|
return new CancelablePromise(async (resolve2, reject, onCancel) => {
|
|
2070
2812
|
try {
|
|
2071
|
-
const url = getUrl(
|
|
2813
|
+
const url = getUrl(config2, options);
|
|
2072
2814
|
const formData = getFormData(options);
|
|
2073
2815
|
const body = getRequestBody(options);
|
|
2074
|
-
const headers = await getHeaders(
|
|
2816
|
+
const headers = await getHeaders(config2, options);
|
|
2075
2817
|
if (!onCancel.isCancelled) {
|
|
2076
|
-
let response = await sendRequest(
|
|
2077
|
-
for (const fn of
|
|
2818
|
+
let response = await sendRequest(config2, options, url, body, formData, headers, onCancel, axiosClient);
|
|
2819
|
+
for (const fn of config2.interceptors.response._fns) {
|
|
2078
2820
|
response = await fn(response);
|
|
2079
2821
|
}
|
|
2080
2822
|
const responseBody = getResponseBody(response);
|
|
@@ -2097,8 +2839,8 @@ var request = (config, options, axiosClient = import_axios.default) => {
|
|
|
2097
2839
|
|
|
2098
2840
|
// src/generated/core/AxiosHttpRequest.ts
|
|
2099
2841
|
var AxiosHttpRequest = class extends BaseHttpRequest {
|
|
2100
|
-
constructor(
|
|
2101
|
-
super(
|
|
2842
|
+
constructor(config2) {
|
|
2843
|
+
super(config2);
|
|
2102
2844
|
}
|
|
2103
2845
|
/**
|
|
2104
2846
|
* Request method
|
|
@@ -2141,7 +2883,11 @@ var PaymentsService = class {
|
|
|
2141
2883
|
mediaType: "application/json",
|
|
2142
2884
|
errors: {
|
|
2143
2885
|
400: "Invalid request",
|
|
2144
|
-
|
|
2886
|
+
401: "Signature or sender authorization could not be verified",
|
|
2887
|
+
403: "Payment declined during counterparty authorization",
|
|
2888
|
+
413: "Payment request too large to process",
|
|
2889
|
+
500: "Internal server error",
|
|
2890
|
+
503: "A dependency is temporarily unavailable"
|
|
2145
2891
|
}
|
|
2146
2892
|
});
|
|
2147
2893
|
}
|
|
@@ -2274,6 +3020,7 @@ var AuthorizationsService = class {
|
|
|
2274
3020
|
errors: {
|
|
2275
3021
|
400: "Invalid payment request",
|
|
2276
3022
|
404: "Counterparty not found (no registration for the resolved DID)",
|
|
3023
|
+
500: "Internal server error",
|
|
2277
3024
|
502: "Counterparty webhook error (HTTP error or connection failure)",
|
|
2278
3025
|
504: "Authorization timed out (counterparty did not respond)"
|
|
2279
3026
|
}
|
|
@@ -2425,20 +3172,20 @@ var HealthService = class {
|
|
|
2425
3172
|
|
|
2426
3173
|
// src/generated/PaymentGatewayClient.ts
|
|
2427
3174
|
var PaymentGatewayClient = class {
|
|
2428
|
-
constructor(
|
|
3175
|
+
constructor(config2, HttpRequest = AxiosHttpRequest) {
|
|
2429
3176
|
this.request = new HttpRequest({
|
|
2430
|
-
BASE:
|
|
2431
|
-
VERSION:
|
|
2432
|
-
WITH_CREDENTIALS:
|
|
2433
|
-
CREDENTIALS:
|
|
2434
|
-
TOKEN:
|
|
2435
|
-
USERNAME:
|
|
2436
|
-
PASSWORD:
|
|
2437
|
-
HEADERS:
|
|
2438
|
-
ENCODE_PATH:
|
|
3177
|
+
BASE: config2?.BASE ?? "https://payment-gw.production-mainnet.atum.xyz",
|
|
3178
|
+
VERSION: config2?.VERSION ?? "1.0.0",
|
|
3179
|
+
WITH_CREDENTIALS: config2?.WITH_CREDENTIALS ?? false,
|
|
3180
|
+
CREDENTIALS: config2?.CREDENTIALS ?? "include",
|
|
3181
|
+
TOKEN: config2?.TOKEN,
|
|
3182
|
+
USERNAME: config2?.USERNAME,
|
|
3183
|
+
PASSWORD: config2?.PASSWORD,
|
|
3184
|
+
HEADERS: config2?.HEADERS,
|
|
3185
|
+
ENCODE_PATH: config2?.ENCODE_PATH,
|
|
2439
3186
|
interceptors: {
|
|
2440
|
-
request:
|
|
2441
|
-
response:
|
|
3187
|
+
request: config2?.interceptors?.request ?? new Interceptors(),
|
|
3188
|
+
response: config2?.interceptors?.response ?? new Interceptors()
|
|
2442
3189
|
}
|
|
2443
3190
|
});
|
|
2444
3191
|
this.authorizations = new AuthorizationsService(this.request);
|
|
@@ -2449,57 +3196,18 @@ var PaymentGatewayClient = class {
|
|
|
2449
3196
|
};
|
|
2450
3197
|
|
|
2451
3198
|
// src/chain-adapters/evm.ts
|
|
2452
|
-
var
|
|
3199
|
+
var import_ethers = require("ethers");
|
|
2453
3200
|
|
|
2454
3201
|
// src/chain-adapters/types.ts
|
|
2455
|
-
var PERMIT_DEADLINE = BigInt(1924991999);
|
|
2456
|
-
function resolvePermitDeadline(deadlineSeconds) {
|
|
2457
|
-
if (deadlineSeconds !== void 0) {
|
|
2458
|
-
return BigInt(Math.floor(Date.now() / 1e3) + deadlineSeconds);
|
|
2459
|
-
}
|
|
2460
|
-
return PERMIT_DEADLINE;
|
|
2461
|
-
}
|
|
2462
|
-
function generatePermitNonce() {
|
|
2463
|
-
const rand = new Uint32Array(1);
|
|
2464
|
-
globalThis.crypto.getRandomValues(rand);
|
|
2465
|
-
return (BigInt(Date.now()) << 32n) + BigInt(rand[0]);
|
|
2466
|
-
}
|
|
2467
3202
|
function assertKeyMatchesSender(matches, sender, derived) {
|
|
2468
3203
|
if (!matches) {
|
|
2469
3204
|
throw new Error(`The private key derives ${derived}, which does not match the sender address ${sender}`);
|
|
2470
3205
|
}
|
|
2471
3206
|
}
|
|
2472
3207
|
|
|
2473
|
-
// src/sender_auth_schemes/evm_permit2.ts
|
|
2474
|
-
var import_ethers = require("ethers");
|
|
2475
|
-
var import_evm_escrow_encoding = __toESM(require_dist());
|
|
2476
|
-
|
|
2477
3208
|
// src/chain-adapters/evm.ts
|
|
2478
3209
|
var evmAdapter = {
|
|
2479
3210
|
turnkeyAddressFormat: "ADDRESS_FORMAT_ETHEREUM",
|
|
2480
|
-
async buildAuthMessage({ sourceAsset, fulfillmentAmount, sourceDefaults, deadlineSeconds }) {
|
|
2481
|
-
const sourceChainId = sourceAsset.split("/")[0];
|
|
2482
|
-
const chainIdNum = parseInt(sourceChainId.split(":")[1]);
|
|
2483
|
-
const tokenAddress = sourceAsset.split("/")[1].split(":")[1];
|
|
2484
|
-
const permitParams = {
|
|
2485
|
-
chainId: chainIdNum,
|
|
2486
|
-
verifyingContract: import_evm_escrow_encoding.PERMIT2_CONTRACT_ADDRESS,
|
|
2487
|
-
token: tokenAddress,
|
|
2488
|
-
amount: fulfillmentAmount,
|
|
2489
|
-
spender: sourceDefaults.escrowContract,
|
|
2490
|
-
nonce: generatePermitNonce(),
|
|
2491
|
-
deadline: resolvePermitDeadline(deadlineSeconds),
|
|
2492
|
-
reserver: sourceDefaults.quoteSelector,
|
|
2493
|
-
releaser: sourceDefaults.fulfillmentVerifierAccount
|
|
2494
|
-
};
|
|
2495
|
-
const messagePrehash = (0, import_evm_escrow_encoding.createPermitWitnessTransferFromPrehash)(permitParams);
|
|
2496
|
-
const messageHash = (0, import_evm_escrow_encoding.hashPermitWitnessTransferFrom)(messagePrehash);
|
|
2497
|
-
return {
|
|
2498
|
-
messageScheme: "EVM_PERMIT2",
|
|
2499
|
-
messageHash,
|
|
2500
|
-
messagePrehash: JSON.stringify(messagePrehash)
|
|
2501
|
-
};
|
|
2502
|
-
},
|
|
2503
3211
|
formatPrivateKey(key) {
|
|
2504
3212
|
return key.startsWith("0x") ? key : "0x" + key;
|
|
2505
3213
|
},
|
|
@@ -2510,78 +3218,22 @@ var evmAdapter = {
|
|
|
2510
3218
|
throw new Error("Invalid private key");
|
|
2511
3219
|
}
|
|
2512
3220
|
},
|
|
2513
|
-
/**
|
|
2514
|
-
* Sign the Permit2 PermitWitnessTransferFrom typed data via standard
|
|
2515
|
-
* EIP-712 signing. The prehash is already shaped for direct consumption
|
|
2516
|
-
* by ethers' signTypedData (Permit2 domain has no version/salt; types
|
|
2517
|
-
* omits EIP712Domain since ethers generates that from the domain object).
|
|
2518
|
-
*/
|
|
2519
|
-
async sign(signedMessage, privateKey) {
|
|
2520
|
-
if (!signedMessage.message_prehash) {
|
|
2521
|
-
throw new Error("EVM adapter sign(): signed_messages[i].message_prehash is required");
|
|
2522
|
-
}
|
|
2523
|
-
const prehash = JSON.parse(signedMessage.message_prehash);
|
|
2524
|
-
const wallet = new import_ethers2.ethers.Wallet(privateKey);
|
|
2525
|
-
return wallet.signTypedData(prehash.domain, prehash.types, prehash.message);
|
|
2526
|
-
},
|
|
2527
3221
|
// Called after validatePrivateKey, so ethers.Wallet won't echo a malformed key.
|
|
2528
3222
|
verifyAddressMatchesKey(privateKey, address) {
|
|
2529
|
-
const derived = new
|
|
3223
|
+
const derived = new import_ethers.ethers.Wallet(privateKey).address;
|
|
2530
3224
|
assertKeyMatchesSender(derived.toLowerCase() === address.toLowerCase(), address, derived);
|
|
2531
3225
|
}
|
|
2532
3226
|
};
|
|
2533
3227
|
|
|
2534
3228
|
// src/chain-adapters/tron.ts
|
|
2535
|
-
var
|
|
3229
|
+
var import_ethers2 = require("ethers");
|
|
2536
3230
|
|
|
2537
3231
|
// src/sender_auth_schemes/tron.ts
|
|
2538
|
-
var import_tvm_escrow_encoding = __toESM(
|
|
3232
|
+
var import_tvm_escrow_encoding = __toESM(require_dist());
|
|
2539
3233
|
|
|
2540
3234
|
// src/chain-adapters/tron.ts
|
|
2541
|
-
var CHAIN_ID_MAP = {
|
|
2542
|
-
"shasta": 2494104990,
|
|
2543
|
-
"mainnet": 728126428
|
|
2544
|
-
};
|
|
2545
|
-
var PERMIT2_FALLBACKS = {
|
|
2546
|
-
"tron:shasta": "TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp",
|
|
2547
|
-
"tron:mainnet": "TJhMXTHQHeQyMD7TcKQFqAePNgG4b31H9m"
|
|
2548
|
-
};
|
|
2549
3235
|
var tronAdapter = {
|
|
2550
3236
|
turnkeyAddressFormat: "ADDRESS_FORMAT_TRON",
|
|
2551
|
-
async buildAuthMessage({ sourceAsset, fulfillmentAmount, sourceDefaults, deadlineSeconds }) {
|
|
2552
|
-
const sourceChainId = sourceAsset.split("/")[0];
|
|
2553
|
-
const chainName = sourceChainId.split(":")[1];
|
|
2554
|
-
const chainIdNum = CHAIN_ID_MAP[chainName];
|
|
2555
|
-
if (!chainIdNum) {
|
|
2556
|
-
throw new Error(`Unsupported Tron chain: ${chainName}`);
|
|
2557
|
-
}
|
|
2558
|
-
const tokenAddress = sourceAsset.split("/")[1].split(":")[1];
|
|
2559
|
-
let permit2Address = sourceDefaults.permit2Contract;
|
|
2560
|
-
if (permit2Address === void 0) {
|
|
2561
|
-
permit2Address = PERMIT2_FALLBACKS[sourceChainId];
|
|
2562
|
-
if (!permit2Address) {
|
|
2563
|
-
throw new Error(`don't know Permit2 address for chain ${sourceChainId}`);
|
|
2564
|
-
}
|
|
2565
|
-
}
|
|
2566
|
-
const tvmParams = {
|
|
2567
|
-
chainId: chainIdNum,
|
|
2568
|
-
permit2Address,
|
|
2569
|
-
tokenAddress,
|
|
2570
|
-
amount: fulfillmentAmount,
|
|
2571
|
-
spenderAddress: sourceDefaults.escrowContract,
|
|
2572
|
-
nonce: generatePermitNonce(),
|
|
2573
|
-
deadline: resolvePermitDeadline(deadlineSeconds),
|
|
2574
|
-
reserverAddress: sourceDefaults.quoteSelector,
|
|
2575
|
-
releaserAddress: sourceDefaults.fulfillmentVerifierAccount
|
|
2576
|
-
};
|
|
2577
|
-
const messagePrehash = (0, import_tvm_escrow_encoding.createTvmPermitWitnessTransferFromPrehash)(tvmParams);
|
|
2578
|
-
const messageHash = (0, import_tvm_escrow_encoding.hashTvmPermitWitnessTransferFrom)(messagePrehash);
|
|
2579
|
-
return {
|
|
2580
|
-
messageScheme: "EVM_PERMIT2",
|
|
2581
|
-
messageHash,
|
|
2582
|
-
messagePrehash: JSON.stringify(messagePrehash)
|
|
2583
|
-
};
|
|
2584
|
-
},
|
|
2585
3237
|
resolveContractOverrides(sourceDefaults) {
|
|
2586
3238
|
return {
|
|
2587
3239
|
quote_selector: (0, import_tvm_escrow_encoding.normalizeAddress)(sourceDefaults.quoteSelector),
|
|
@@ -2601,89 +3253,62 @@ var tronAdapter = {
|
|
|
2601
3253
|
throw new Error("Invalid private key");
|
|
2602
3254
|
}
|
|
2603
3255
|
},
|
|
2604
|
-
/**
|
|
2605
|
-
* Tron uses TIP-712 typed-data — same wire format as EIP-712. The prehash
|
|
2606
|
-
* built by createTvmPermitWitnessTransferFromPrehash is now directly
|
|
2607
|
-
* consumable by `wallet.signTypedData(prehash.domain, prehash.types,
|
|
2608
|
-
* prehash.message)`, but this adapter (an internal SDK helper) stays on the
|
|
2609
|
-
* raw-hash sign for parity with the EVM adapter — e2e tests use ethers
|
|
2610
|
-
* directly when they need the typed-data path.
|
|
2611
|
-
*/
|
|
2612
|
-
async sign(signedMessage, privateKey) {
|
|
2613
|
-
const wallet = new import_ethers3.ethers.Wallet(privateKey.startsWith("0x") ? privateKey : "0x" + privateKey);
|
|
2614
|
-
return wallet.signingKey.sign(signedMessage.message).serialized;
|
|
2615
|
-
},
|
|
2616
3256
|
// Tron addresses are the same secp256k1-derived 20 bytes as EVM. Compare the
|
|
2617
3257
|
// derived hex directly against the canonical sender; do NOT run normalizeAddress
|
|
2618
3258
|
// on the derived side — it strips a leading 41, which would corrupt an address
|
|
2619
3259
|
// whose first byte is 0x41.
|
|
2620
3260
|
verifyAddressMatchesKey(privateKey, address) {
|
|
2621
3261
|
const key = privateKey.startsWith("0x") ? privateKey : "0x" + privateKey;
|
|
2622
|
-
const derived = new
|
|
3262
|
+
const derived = new import_ethers2.ethers.Wallet(key).address;
|
|
2623
3263
|
assertKeyMatchesSender(derived.toLowerCase() === (0, import_tvm_escrow_encoding.normalizeAddress)(address), address, derived);
|
|
2624
3264
|
}
|
|
2625
3265
|
};
|
|
2626
3266
|
|
|
2627
3267
|
// src/chain-adapters/solana.ts
|
|
2628
3268
|
var import_tweetnacl = __toESM(require("tweetnacl"));
|
|
2629
|
-
var import_bs582 = __toESM(require("bs58"));
|
|
2630
|
-
var import_solana_escrow_encoding2 = __toESM(require_dist3());
|
|
2631
|
-
|
|
2632
|
-
// src/sender_auth_schemes/solana.ts
|
|
2633
|
-
var import_ethers4 = require("ethers");
|
|
2634
3269
|
var import_bs58 = __toESM(require("bs58"));
|
|
2635
|
-
var
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
}
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
mint: params.mint,
|
|
2648
|
-
amount: params.amount.toString(),
|
|
2649
|
-
reserver: params.reserver,
|
|
2650
|
-
releaser: params.releaser,
|
|
2651
|
-
nonce: params.nonce.toString(),
|
|
2652
|
-
issued_at: params.issuedAt.toString(),
|
|
2653
|
-
deadline: params.deadline.toString()
|
|
2654
|
-
};
|
|
2655
|
-
}
|
|
2656
|
-
function generateSolanaNonce() {
|
|
2657
|
-
return (0, import_solana_escrow_encoding.generateNonce)();
|
|
2658
|
-
}
|
|
2659
|
-
function clusterIdFromName(name) {
|
|
2660
|
-
const encoded = new TextEncoder().encode(name);
|
|
2661
|
-
if (encoded.length > 32) {
|
|
2662
|
-
throw new Error(`cluster name too long for cluster_id: ${name} (${encoded.length} > 32 bytes)`);
|
|
2663
|
-
}
|
|
2664
|
-
const out = new Uint8Array(32);
|
|
2665
|
-
out.set(encoded);
|
|
2666
|
-
return out;
|
|
3270
|
+
var solanaAdapter = {
|
|
3271
|
+
turnkeyAddressFormat: "ADDRESS_FORMAT_SOLANA",
|
|
3272
|
+
formatPrivateKey(key) {
|
|
3273
|
+
return key.startsWith("0x") ? key.slice(2) : key;
|
|
3274
|
+
},
|
|
3275
|
+
verifyAddressMatchesKey(privateKey, address) {
|
|
3276
|
+
const derived = deriveSolanaAddress(privateKey);
|
|
3277
|
+
assertKeyMatchesSender(derived === address, address, derived);
|
|
3278
|
+
}
|
|
3279
|
+
};
|
|
3280
|
+
function deriveSolanaAddress(privateKey) {
|
|
3281
|
+
return import_bs58.default.encode(import_tweetnacl.default.sign.keyPair.fromSecretKey(secretKeyFromPrivate(privateKey)).publicKey);
|
|
2667
3282
|
}
|
|
2668
|
-
function
|
|
2669
|
-
|
|
3283
|
+
function secretKeyFromPrivate(privateKey) {
|
|
3284
|
+
if (/^[0-9a-fA-F]{64}$/.test(privateKey)) {
|
|
3285
|
+
const seed = new Uint8Array(32);
|
|
3286
|
+
for (let i = 0; i < 32; i++) {
|
|
3287
|
+
seed[i] = parseInt(privateKey.substring(i * 2, i * 2 + 2), 16);
|
|
3288
|
+
}
|
|
3289
|
+
return import_tweetnacl.default.sign.keyPair.fromSeed(seed).secretKey;
|
|
3290
|
+
}
|
|
3291
|
+
const decoded = import_bs58.default.decode(privateKey);
|
|
3292
|
+
if (decoded.length === 64) {
|
|
3293
|
+
return decoded;
|
|
3294
|
+
}
|
|
3295
|
+
if (decoded.length === 32) {
|
|
3296
|
+
return import_tweetnacl.default.sign.keyPair.fromSeed(decoded).secretKey;
|
|
3297
|
+
}
|
|
3298
|
+
throw new Error(`Invalid Solana private key length: expected 32 or 64 bytes, got ${decoded.length}`);
|
|
2670
3299
|
}
|
|
2671
|
-
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
},
|
|
2684
|
-
domain
|
|
2685
|
-
);
|
|
2686
|
-
return bytesToHex(hash);
|
|
3300
|
+
|
|
3301
|
+
// src/chain-adapters/index.ts
|
|
3302
|
+
var adapters = {
|
|
3303
|
+
"eip155": evmAdapter,
|
|
3304
|
+
"tron": tronAdapter,
|
|
3305
|
+
"solana": solanaAdapter
|
|
3306
|
+
};
|
|
3307
|
+
function getChainAdapter(sourceChainId) {
|
|
3308
|
+
const prefix = sourceChainId.split(":")[0];
|
|
3309
|
+
const adapter = adapters[prefix];
|
|
3310
|
+
if (!adapter) throw new Error(`Unsupported source chain: ${sourceChainId}`);
|
|
3311
|
+
return adapter;
|
|
2687
3312
|
}
|
|
2688
3313
|
|
|
2689
3314
|
// src/chain-adapters/solana-clock.ts
|
|
@@ -2753,118 +3378,25 @@ async function resolveSolanaIssuedAt(opts) {
|
|
|
2753
3378
|
return BigInt(Math.floor(Date.now() / 1e3)) - SOLANA_ISSUED_AT_FALLBACK_SKEW_SECS;
|
|
2754
3379
|
}
|
|
2755
3380
|
|
|
2756
|
-
// src/
|
|
2757
|
-
var
|
|
2758
|
-
turnkeyAddressFormat: "ADDRESS_FORMAT_SOLANA",
|
|
2759
|
-
async buildAuthMessage({ sourceAsset, depositor, fulfillmentAmount, requestId, sourceDefaults, solanaRpcUrl, solanaClockReader, solanaLogger }) {
|
|
2760
|
-
const sourceChainId = sourceAsset.split("/")[0];
|
|
2761
|
-
const tokenMint = sourceAsset.split("/")[1].split(":")[1];
|
|
2762
|
-
const nonce = generateSolanaNonce();
|
|
2763
|
-
const issuedAt = await resolveSolanaIssuedAt({
|
|
2764
|
-
sourceChainId,
|
|
2765
|
-
rpcUrlOverride: solanaRpcUrl,
|
|
2766
|
-
reader: solanaClockReader,
|
|
2767
|
-
logger: solanaLogger
|
|
2768
|
-
});
|
|
2769
|
-
const deadline = issuedAt + BigInt(REPLAY_HORIZON_SECS - 8);
|
|
2770
|
-
const solanaParams = {
|
|
2771
|
-
depositor,
|
|
2772
|
-
mint: tokenMint,
|
|
2773
|
-
amount: BigInt(fulfillmentAmount),
|
|
2774
|
-
reserver: sourceDefaults.quoteSelector,
|
|
2775
|
-
releaser: sourceDefaults.fulfillmentVerifierAccount,
|
|
2776
|
-
nonce,
|
|
2777
|
-
issuedAt,
|
|
2778
|
-
deadline,
|
|
2779
|
-
requestId
|
|
2780
|
-
};
|
|
2781
|
-
const paymentId = generateSolanaPaymentIdV3(requestId);
|
|
2782
|
-
const prehash = createSolanaDepositPrehash(paymentId, solanaParams);
|
|
2783
|
-
if (!sourceDefaults.svmSignatureClusterId || sourceDefaults.svmSignatureDomainVersion == null) {
|
|
2784
|
-
throw new Error(
|
|
2785
|
-
"Solana source requires svm_signature_cluster_id and svm_signature_domain_version from payment-gw /defaults (V3 escrow domain separation). Is the gateway on V3?"
|
|
2786
|
-
);
|
|
2787
|
-
}
|
|
2788
|
-
const domain = {
|
|
2789
|
-
clusterId: clusterIdFromName(sourceDefaults.svmSignatureClusterId),
|
|
2790
|
-
signatureDomainVersion: sourceDefaults.svmSignatureDomainVersion,
|
|
2791
|
-
programId: import_solana_escrow_encoding2.Pubkey.fromBase58(sourceDefaults.escrowContract)
|
|
2792
|
-
};
|
|
2793
|
-
const depositHash = hashSolanaDepositV3(prehash, domain);
|
|
2794
|
-
return {
|
|
2795
|
-
messageScheme: "SOLANA",
|
|
2796
|
-
messageHash: depositHash,
|
|
2797
|
-
messagePrehash: JSON.stringify(prehash)
|
|
2798
|
-
};
|
|
2799
|
-
},
|
|
2800
|
-
formatPrivateKey(key) {
|
|
2801
|
-
return key.startsWith("0x") ? key.slice(2) : key;
|
|
2802
|
-
},
|
|
2803
|
-
/**
|
|
2804
|
-
* Solana has no EIP-712-style typed-data standard. The prehash structure
|
|
2805
|
-
* still describes what was hashed (for debugging / wallet UX), but the
|
|
2806
|
-
* canonical signing input is the chain-specific digest already in
|
|
2807
|
-
* signedMessage.message. We sign that with ed25519.
|
|
2808
|
-
*/
|
|
2809
|
-
async sign(signedMessage, privateKey) {
|
|
2810
|
-
const messageBytes = new Uint8Array(Buffer.from(signedMessage.message.replace("0x", ""), "hex"));
|
|
2811
|
-
const secretKey = secretKeyFromPrivate(privateKey);
|
|
2812
|
-
const sig = import_tweetnacl.default.sign.detached(messageBytes, secretKey);
|
|
2813
|
-
return "0x" + Buffer.from(sig).toString("hex");
|
|
2814
|
-
},
|
|
2815
|
-
/**
|
|
2816
|
-
* Solana Ed25519 signatures are not public-key-recoverable (unlike EVM
|
|
2817
|
-
* secp256k1, where ecrecover derives the signer from the signature). The
|
|
2818
|
-
* on-chain Ed25519 verify instruction must therefore be given the signer's
|
|
2819
|
-
* public key explicitly, so we ship it as signed_messages[0].payload.delegate_signer.
|
|
2820
|
-
* In the self-custody CLI flow the signer is the depositor itself, so this
|
|
2821
|
-
* equals source.account.
|
|
2822
|
-
*/
|
|
2823
|
-
deriveDelegateSigner(privateKey) {
|
|
2824
|
-
return deriveSolanaAddress(privateKey);
|
|
2825
|
-
},
|
|
2826
|
-
verifyAddressMatchesKey(privateKey, address) {
|
|
2827
|
-
const derived = deriveSolanaAddress(privateKey);
|
|
2828
|
-
assertKeyMatchesSender(derived === address, address, derived);
|
|
2829
|
-
}
|
|
2830
|
-
};
|
|
2831
|
-
function deriveSolanaAddress(privateKey) {
|
|
2832
|
-
return import_bs582.default.encode(import_tweetnacl.default.sign.keyPair.fromSecretKey(secretKeyFromPrivate(privateKey)).publicKey);
|
|
2833
|
-
}
|
|
2834
|
-
function secretKeyFromPrivate(privateKey) {
|
|
2835
|
-
if (/^[0-9a-fA-F]{64}$/.test(privateKey)) {
|
|
2836
|
-
const seed = new Uint8Array(32);
|
|
2837
|
-
for (let i = 0; i < 32; i++) {
|
|
2838
|
-
seed[i] = parseInt(privateKey.substring(i * 2, i * 2 + 2), 16);
|
|
2839
|
-
}
|
|
2840
|
-
return import_tweetnacl.default.sign.keyPair.fromSeed(seed).secretKey;
|
|
2841
|
-
}
|
|
2842
|
-
const decoded = import_bs582.default.decode(privateKey);
|
|
2843
|
-
if (decoded.length === 64) {
|
|
2844
|
-
return decoded;
|
|
2845
|
-
}
|
|
2846
|
-
if (decoded.length === 32) {
|
|
2847
|
-
return import_tweetnacl.default.sign.keyPair.fromSeed(decoded).secretKey;
|
|
2848
|
-
}
|
|
2849
|
-
throw new Error(`Invalid Solana private key length: expected 32 or 64 bytes, got ${decoded.length}`);
|
|
2850
|
-
}
|
|
3381
|
+
// src/index.ts
|
|
3382
|
+
var import_payment_request_sender_auth2 = __toESM(require_dist4());
|
|
2851
3383
|
|
|
2852
|
-
// src/
|
|
2853
|
-
var
|
|
2854
|
-
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
2859
|
-
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
}
|
|
3384
|
+
// src/sender_auth_schemes/evm_permit2.ts
|
|
3385
|
+
var import_ethers3 = require("ethers");
|
|
3386
|
+
var import_evm_escrow_encoding = __toESM(require_dist2());
|
|
3387
|
+
|
|
3388
|
+
// src/sender_auth_schemes/solana.ts
|
|
3389
|
+
var import_ethers4 = require("ethers");
|
|
3390
|
+
var import_bs582 = __toESM(require("bs58"));
|
|
3391
|
+
var import_solana_escrow_encoding = __toESM(require_dist3());
|
|
3392
|
+
|
|
3393
|
+
// src/signers/raw.ts
|
|
3394
|
+
var import_payment_request_sender_auth = __toESM(require_dist4());
|
|
2864
3395
|
|
|
2865
3396
|
// src/index.ts
|
|
2866
3397
|
var PAYMENT_REQUEST_VERSION = "1.0";
|
|
2867
|
-
var defaultGateway = "https://payment-
|
|
3398
|
+
var defaultGateway = "https://payment-gw.production-testnet.atum.xyz";
|
|
3399
|
+
var OpenAPI2 = { ...OpenAPI, BASE: defaultGateway };
|
|
2868
3400
|
var DEFAULT_QUOTE_DEADLINE_SECONDS = 5;
|
|
2869
3401
|
var DEFAULT_FULFILLMENT_DEADLINE_SECONDS = 3600;
|
|
2870
3402
|
var DEFAULT_PAYMENT_QUOTE_DEADLINE_SECONDS = 10;
|
|
@@ -2889,16 +3421,74 @@ function resolveDeadlines(params, defaultQuoteSeconds) {
|
|
|
2889
3421
|
`quoteDeadlineSeconds (${quoteDeadlineSeconds}) must be strictly less than fulfillmentDeadlineSeconds (${fulfillmentDeadlineSeconds}). The gateway rejects a quote_deadline that is not before fulfillment_deadline.`
|
|
2890
3422
|
);
|
|
2891
3423
|
}
|
|
2892
|
-
const now = Date.now();
|
|
3424
|
+
const now = (params.now ?? Date.now)();
|
|
2893
3425
|
return {
|
|
2894
3426
|
quote_deadline: new Date(now + quoteDeadlineSeconds * 1e3).toISOString(),
|
|
2895
3427
|
fulfillment_deadline: new Date(now + fulfillmentDeadlineSeconds * 1e3).toISOString()
|
|
2896
3428
|
};
|
|
2897
3429
|
}
|
|
3430
|
+
async function assemblePaymentRequest(params) {
|
|
3431
|
+
const sourceChainId = params.sourceAsset.split("/")[0];
|
|
3432
|
+
const namespace = sourceChainId.split(":")[0];
|
|
3433
|
+
const adapter = getChainAdapter(sourceChainId);
|
|
3434
|
+
const nonce = params.nonce ?? (namespace === "solana" ? (0, import_payment_request_sender_auth2.deterministicSolanaNonce)({ requestId: params.requestId, depositor: params.depositor }) : (0, import_payment_request_sender_auth2.deterministicPermitNonce)({ requestId: params.requestId, depositor: params.depositor }));
|
|
3435
|
+
const auth = await (0, import_payment_request_sender_auth2.getChainAdapter)(sourceChainId).buildAuthMessage({
|
|
3436
|
+
sourceAsset: params.sourceAsset,
|
|
3437
|
+
depositor: params.depositor,
|
|
3438
|
+
// The gateway pins the signed deposit amount to max_source_amount (the cap).
|
|
3439
|
+
maxSourceAmount: params.maxSourceAmount,
|
|
3440
|
+
requestId: params.requestId,
|
|
3441
|
+
sourceDefaults: params.sourceDefaults,
|
|
3442
|
+
deadline: params.deadline,
|
|
3443
|
+
nonce,
|
|
3444
|
+
...namespace === "solana" ? {
|
|
3445
|
+
solanaClockReader: (chainId) => resolveSolanaIssuedAt({
|
|
3446
|
+
sourceChainId: chainId,
|
|
3447
|
+
rpcUrlOverride: params.solanaRpcUrl,
|
|
3448
|
+
reader: params.solanaClockReader
|
|
3449
|
+
})
|
|
3450
|
+
} : {}
|
|
3451
|
+
});
|
|
3452
|
+
const contractOverrides = adapter.resolveContractOverrides?.(params.sourceDefaults);
|
|
3453
|
+
return {
|
|
3454
|
+
version: params.version ?? PAYMENT_REQUEST_VERSION,
|
|
3455
|
+
request_id: params.requestId,
|
|
3456
|
+
source: {
|
|
3457
|
+
asset_identifier: params.sourceAsset,
|
|
3458
|
+
account: params.depositor
|
|
3459
|
+
},
|
|
3460
|
+
destination: [{
|
|
3461
|
+
asset_identifier: params.destinationAsset,
|
|
3462
|
+
account: params.destinationAccount
|
|
3463
|
+
}],
|
|
3464
|
+
fulfillment_amount: params.fulfillmentAmount,
|
|
3465
|
+
max_source_amount: params.maxSourceAmount,
|
|
3466
|
+
quote_deadline: params.quoteDeadline,
|
|
3467
|
+
fulfillment_deadline: params.fulfillmentDeadline,
|
|
3468
|
+
escrow_contract_address: params.sourceDefaults.escrowContract,
|
|
3469
|
+
quote_selector: contractOverrides?.quote_selector ?? params.sourceDefaults.quoteSelector,
|
|
3470
|
+
fulfillment_verifier: contractOverrides?.fulfillment_verifier ?? {
|
|
3471
|
+
account: params.sourceDefaults.fulfillmentVerifierAccount,
|
|
3472
|
+
endpoint: params.sourceDefaults.fulfillmentVerifierEndpoint
|
|
3473
|
+
},
|
|
3474
|
+
fulfillment_proxy: params.fulfillmentProxy,
|
|
3475
|
+
...params.settlerRequirements ? { settler_requirements: params.settlerRequirements } : {},
|
|
3476
|
+
sender_auth: {
|
|
3477
|
+
message_scheme: auth.messageScheme,
|
|
3478
|
+
signed_messages: [{
|
|
3479
|
+
message: auth.messageHash,
|
|
3480
|
+
message_prehash: auth.messagePrehash,
|
|
3481
|
+
signature: ""
|
|
3482
|
+
}]
|
|
3483
|
+
}
|
|
3484
|
+
};
|
|
3485
|
+
}
|
|
2898
3486
|
var PaymentGatewayClient2 = class extends PaymentGatewayClient {
|
|
2899
|
-
constructor(
|
|
2900
|
-
|
|
2901
|
-
|
|
3487
|
+
constructor(config2, HttpRequest = AxiosHttpRequest) {
|
|
3488
|
+
const envBase = (typeof process !== "undefined" ? process.env.GATEWAY_URL : void 0)?.trim();
|
|
3489
|
+
const base = config2?.BASE ?? (envBase || defaultGateway);
|
|
3490
|
+
super({ ...config2, BASE: base }, HttpRequest);
|
|
3491
|
+
this.baseUrl = base;
|
|
2902
3492
|
}
|
|
2903
3493
|
/**
|
|
2904
3494
|
* Fetches chain defaults from the payment gateway.
|
|
@@ -2955,64 +3545,84 @@ var PaymentGatewayClient2 = class extends PaymentGatewayClient {
|
|
|
2955
3545
|
}
|
|
2956
3546
|
/**
|
|
2957
3547
|
* Prepares a payment request with defaults, ready for signing.
|
|
2958
|
-
*
|
|
3548
|
+
*
|
|
3549
|
+
* By default this resolves the corridor addresses from the gateway `/defaults`
|
|
3550
|
+
* endpoint. It reaches the gateway only for what the caller has NOT already
|
|
3551
|
+
* supplied via `resolvedDefaults`: supply `resolvedDefaults.source` to skip the
|
|
3552
|
+
* source-chain fetch and `resolvedDefaults.destination` to skip the destination
|
|
3553
|
+
* fetch. Supplying both builds the request **entirely offline** (no network) —
|
|
3554
|
+
* how a caller that already holds the corridor addresses (e.g. from a signed
|
|
3555
|
+
* challenge) constructs and signs a request without gateway access. Such a
|
|
3556
|
+
* caller typically also injects `now` so the deadlines are deterministic.
|
|
3557
|
+
*
|
|
3558
|
+
* @example Minimal — fetch corridor addresses from the gateway, then sign
|
|
3559
|
+
* ```ts
|
|
3560
|
+
* const client = new PaymentGatewayClient({ BASE: "https://gateway.example.com" });
|
|
3561
|
+
*
|
|
3562
|
+
* const request = await client.preparePaymentRequest({
|
|
3563
|
+
* depositor: "0xPayerAddress",
|
|
3564
|
+
* sourceAsset: "eip155:8453/erc20:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", // USDC on Base
|
|
3565
|
+
* destinationAccount: "0xMerchantAddress",
|
|
3566
|
+
* destinationAsset: "eip155:42161/erc20:0xaf88d065e77c8cC2239327C5EDb3A432268e5831", // USDC on Arbitrum
|
|
3567
|
+
* fulfillmentAmount: "10000000", // 10 USDC (6 decimals)
|
|
3568
|
+
* });
|
|
3569
|
+
* // max_source_amount, deadlines, request id, and nonce are all defaulted.
|
|
3570
|
+
*
|
|
3571
|
+
* const signer = createSenderSigner("eip155:8453", { provider: "raw", privateKey });
|
|
3572
|
+
* await signPaymentRequest(request, signer); // fills sender_auth, ready to submit
|
|
3573
|
+
* ```
|
|
3574
|
+
*
|
|
2959
3575
|
* @param params Payment parameters
|
|
2960
3576
|
* @returns A complete PaymentRequest object without the signature
|
|
2961
3577
|
*/
|
|
2962
3578
|
async preparePaymentRequest(params) {
|
|
2963
|
-
const
|
|
3579
|
+
const now = (params.now ?? Date.now)();
|
|
3580
|
+
const { quote_deadline, fulfillment_deadline } = resolveDeadlines({ ...params, now: () => now }, DEFAULT_PAYMENT_QUOTE_DEADLINE_SECONDS);
|
|
2964
3581
|
const sourceChainId = params.sourceAsset.split("/")[0];
|
|
2965
3582
|
const destChainId = params.destinationAsset.split("/")[0];
|
|
2966
|
-
const [sourceDefaults,
|
|
2967
|
-
this.fetchChainDefaults(sourceChainId),
|
|
2968
|
-
this.fetchChainDefaults(destChainId)
|
|
3583
|
+
const [sourceDefaults, fulfillmentProxy] = await Promise.all([
|
|
3584
|
+
params.resolvedDefaults?.source ?? this.fetchChainDefaults(sourceChainId),
|
|
3585
|
+
params.resolvedDefaults?.destination?.fulfillmentProxy ?? this.fetchChainDefaults(destChainId).then((d) => d.fulfillmentProxy)
|
|
2969
3586
|
]);
|
|
2970
|
-
|
|
2971
|
-
|
|
2972
|
-
|
|
2973
|
-
|
|
3587
|
+
if (!params.requestId) {
|
|
3588
|
+
throw new Error(
|
|
3589
|
+
"payment-gateway-client: requestId is required \u2014 it is the idempotency key that seeds the deterministic deposit nonce; supply a stable id per logical payment and reuse it on retry"
|
|
3590
|
+
);
|
|
3591
|
+
}
|
|
3592
|
+
const requestId = params.requestId;
|
|
3593
|
+
const sourceNamespace = sourceChainId.split(":")[0];
|
|
3594
|
+
let permitDeadline;
|
|
3595
|
+
if (sourceNamespace !== "solana") {
|
|
3596
|
+
const fulfillmentMs = Date.parse(fulfillment_deadline);
|
|
3597
|
+
if (params.deadlineSeconds !== void 0) {
|
|
3598
|
+
permitDeadline = Math.ceil(now / 1e3) + Math.ceil(params.deadlineSeconds);
|
|
3599
|
+
if (permitDeadline * 1e3 < fulfillmentMs) {
|
|
3600
|
+
throw new Error(
|
|
3601
|
+
`payment-gateway-client: deadlineSeconds (${params.deadlineSeconds}) expires the deposit permit before settlement (fulfillmentDeadlineSeconds). The permit must stay valid until settlement \u2014 pass a deadlineSeconds at least as long as fulfillmentDeadlineSeconds, or omit it to derive it from fulfillment_deadline automatically.`
|
|
3602
|
+
);
|
|
3603
|
+
}
|
|
3604
|
+
} else {
|
|
3605
|
+
permitDeadline = Math.floor(fulfillmentMs / 1e3) + 1;
|
|
3606
|
+
}
|
|
3607
|
+
}
|
|
3608
|
+
return assemblePaymentRequest({
|
|
2974
3609
|
depositor: params.depositor,
|
|
2975
3610
|
fulfillmentAmount: params.fulfillmentAmount,
|
|
3611
|
+
sourceAsset: params.sourceAsset,
|
|
3612
|
+
destinationAccount: params.destinationAccount,
|
|
3613
|
+
destinationAsset: params.destinationAsset,
|
|
3614
|
+
maxSourceAmount: params.maxSourceAmount ?? defaultMaxSourceAmount(params.fulfillmentAmount),
|
|
2976
3615
|
requestId,
|
|
3616
|
+
quoteDeadline: quote_deadline,
|
|
3617
|
+
fulfillmentDeadline: fulfillment_deadline,
|
|
2977
3618
|
sourceDefaults,
|
|
2978
|
-
|
|
2979
|
-
|
|
3619
|
+
fulfillmentProxy,
|
|
3620
|
+
nonce: params.nonce,
|
|
3621
|
+
deadline: permitDeadline,
|
|
3622
|
+
solanaRpcUrl: params.solanaRpcUrl,
|
|
3623
|
+
solanaClockReader: params.solanaClockReader,
|
|
3624
|
+
settlerRequirements: params.settlerRequirements
|
|
2980
3625
|
});
|
|
2981
|
-
const contractOverrides = adapter.resolveContractOverrides?.(sourceDefaults);
|
|
2982
|
-
return {
|
|
2983
|
-
version: PAYMENT_REQUEST_VERSION,
|
|
2984
|
-
request_id: requestId,
|
|
2985
|
-
source: {
|
|
2986
|
-
asset_identifier: params.sourceAsset,
|
|
2987
|
-
account: params.depositor
|
|
2988
|
-
},
|
|
2989
|
-
destination: [{
|
|
2990
|
-
asset_identifier: params.destinationAsset,
|
|
2991
|
-
account: params.destinationAccount
|
|
2992
|
-
}],
|
|
2993
|
-
fulfillment_amount: params.fulfillmentAmount,
|
|
2994
|
-
max_source_amount: params.maxSourceAmount ?? defaultMaxSourceAmount(params.fulfillmentAmount),
|
|
2995
|
-
// REQUIRED (the gateway injects no defaults). Callers can widen the window via
|
|
2996
|
-
// quoteDeadlineSeconds / fulfillmentDeadlineSeconds, e.g. for slow Turnkey signing.
|
|
2997
|
-
quote_deadline,
|
|
2998
|
-
fulfillment_deadline,
|
|
2999
|
-
escrow_contract_address: sourceDefaults.escrowContract,
|
|
3000
|
-
quote_selector: contractOverrides?.quote_selector ?? sourceDefaults.quoteSelector,
|
|
3001
|
-
fulfillment_verifier: contractOverrides?.fulfillment_verifier ?? {
|
|
3002
|
-
account: sourceDefaults.fulfillmentVerifierAccount,
|
|
3003
|
-
endpoint: sourceDefaults.fulfillmentVerifierEndpoint
|
|
3004
|
-
},
|
|
3005
|
-
fulfillment_proxy: destDefaults.fulfillmentProxy,
|
|
3006
|
-
...params.settlerRequirements ? { settler_requirements: params.settlerRequirements } : {},
|
|
3007
|
-
sender_auth: {
|
|
3008
|
-
message_scheme: auth.messageScheme,
|
|
3009
|
-
signed_messages: [{
|
|
3010
|
-
message: auth.messageHash,
|
|
3011
|
-
message_prehash: auth.messagePrehash,
|
|
3012
|
-
signature: ""
|
|
3013
|
-
}]
|
|
3014
|
-
}
|
|
3015
|
-
};
|
|
3016
3626
|
}
|
|
3017
3627
|
/**
|
|
3018
3628
|
* Prepares a quote-request body (`CreateQuoteRequest`), ready to POST to
|
|
@@ -3103,12 +3713,22 @@ function parseSeconds(optionName) {
|
|
|
3103
3713
|
};
|
|
3104
3714
|
}
|
|
3105
3715
|
|
|
3716
|
+
// src/version.ts
|
|
3717
|
+
var PACKAGE_VERSION = true ? "2.1.0" : "0.0.0-dev";
|
|
3718
|
+
|
|
3719
|
+
// src/cli/load-env.ts
|
|
3720
|
+
var import_dotenv = require("dotenv");
|
|
3721
|
+
function loadCliEnv() {
|
|
3722
|
+
(0, import_dotenv.config)({ override: false, quiet: true });
|
|
3723
|
+
}
|
|
3724
|
+
|
|
3106
3725
|
// src/cli/request-quote.ts
|
|
3726
|
+
loadCliEnv();
|
|
3107
3727
|
function collect(value, previous) {
|
|
3108
3728
|
return previous.concat([value]);
|
|
3109
3729
|
}
|
|
3110
3730
|
var program = new import_commander.Command();
|
|
3111
|
-
program.name("request-quote").description("Open a quote-request batch on the Atum Payment Gateway and print the collected quotes (no signing required)").version(
|
|
3731
|
+
program.name("request-quote").description("Open a quote-request batch on the Atum Payment Gateway and print the collected quotes (no signing required)").version(PACKAGE_VERSION).argument("<sender>", "Depositor / originator address (e.g., 0xF0D0...) \u2014 the source account").argument("<amount>", "Fulfillment amount to receive at destination (smallest units, e.g. 100000 for 0.10 USDC)").argument("<sourceAsset>", "Source asset in CAIP-19 format").argument("<receiver>", "Destination account address").argument("<destinationAsset>", "Destination asset in CAIP-19 format").option("--gateway <url>", "Payment gateway URL (overrides GATEWAY_URL env; default: production-testnet)").option("--request-id <id>", "Custom request ID (overrides prefix)").option("--request-id-prefix <prefix>", "Custom request ID prefix (default: quote-gw-cli)").option("--no-wait", "Return immediately (202 + quote_request_id) instead of blocking for collected quotes").option("--max-source-amount <amount>", "Cap on what to spend from source (smallest units); quotes above it are filtered").option("--quote-deadline-seconds <n>", `Collection window length in seconds (default: ${DEFAULT_QUOTE_DEADLINE_SECONDS})`, parseSeconds("--quote-deadline-seconds")).option("--fulfillment-deadline-seconds <n>", `Settlement horizon in seconds (default: ${DEFAULT_FULFILLMENT_DEADLINE_SECONDS})`, parseSeconds("--fulfillment-deadline-seconds")).option("--whitelistSettler <did>", "Settler DID to whitelist (repeatable)", collect, []).addHelpText("after", `
|
|
3112
3732
|
CAIP-19 Examples:
|
|
3113
3733
|
EVM ERC20: eip155:42161/erc20:0xaf88d065e77c8cC2239327C5EDb3A432268e5831
|
|
3114
3734
|
Tron TRC20: tron:shasta/trc20:TG3XXyExBkPp9nzdajDZsozEu4BkaSJozs
|
|
@@ -3127,7 +3747,7 @@ Demo across environments (only --gateway changes):
|
|
|
3127
3747
|
"eip155:42220/erc20:0x08F18B729A1C1cB74A2c904b4E995f605d0d1958"
|
|
3128
3748
|
|
|
3129
3749
|
# 2) deployed testnet (default gateway is testnet)
|
|
3130
|
-
request-quote --gateway https://payment-
|
|
3750
|
+
request-quote --gateway https://payment-gw.production-testnet.atum.xyz \\
|
|
3131
3751
|
<sender> <amount> <sourceAsset> <receiver> <destinationAsset>
|
|
3132
3752
|
|
|
3133
3753
|
Output (mirrors send-payment):
|