@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.
@@ -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;
@@ -33,8 +39,378 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
33
39
  mod
34
40
  ));
35
41
 
36
- // ../contracts/evm/escrow-encoding/typescript/dist/payment-id.js
42
+ // ../contracts/tvm/escrow-encoding/typescript/dist/chain-id.js
43
+ var require_chain_id = __commonJS({
44
+ "../contracts/tvm/escrow-encoding/typescript/dist/chain-id.js"(exports2) {
45
+ "use strict";
46
+ Object.defineProperty(exports2, "__esModule", { value: true });
47
+ exports2.maskChainId = maskChainId2;
48
+ function maskChainId2(chainId) {
49
+ return (chainId & 4294967295) >>> 0;
50
+ }
51
+ }
52
+ });
53
+
54
+ // ../contracts/tvm/escrow-encoding/typescript/dist/tron-address.js
55
+ var require_tron_address = __commonJS({
56
+ "../contracts/tvm/escrow-encoding/typescript/dist/tron-address.js"(exports2) {
57
+ "use strict";
58
+ var __importDefault = exports2 && exports2.__importDefault || function(mod) {
59
+ return mod && mod.__esModule ? mod : { "default": mod };
60
+ };
61
+ Object.defineProperty(exports2, "__esModule", { value: true });
62
+ exports2.base58ToHex = base58ToHex2;
63
+ exports2.normalizeAddress = normalizeAddress2;
64
+ var ethers_1 = require("ethers");
65
+ var bs58_1 = __importDefault(require("bs58"));
66
+ var TVM_MAINNET_PREFIX = "41";
67
+ function base58ToHex2(base58Address) {
68
+ if (!base58Address || !base58Address.startsWith("T")) {
69
+ throw new Error(`Invalid Tron base58 address: ${base58Address}`);
70
+ }
71
+ const decoded = bs58_1.default.decode(base58Address);
72
+ if (decoded.length !== 25) {
73
+ throw new Error(`Invalid Tron base58 length (expected 25 bytes): ${base58Address}`);
74
+ }
75
+ const payload = decoded.slice(0, 21);
76
+ const checksum = (0, ethers_1.hexlify)(decoded.slice(21)).slice(2);
77
+ const computed = (0, ethers_1.sha256)((0, ethers_1.sha256)(payload)).slice(2, 10);
78
+ if (checksum !== computed) {
79
+ throw new Error(`Invalid Tron base58 checksum: ${base58Address}`);
80
+ }
81
+ return (0, ethers_1.hexlify)(payload).slice(2);
82
+ }
83
+ function normalizeAddress2(address) {
84
+ if (!address) {
85
+ throw new Error("Empty address");
86
+ }
87
+ let hexAddress = address;
88
+ if (address.startsWith("T")) {
89
+ hexAddress = base58ToHex2(address);
90
+ }
91
+ hexAddress = hexAddress.replace(/^0x/, "");
92
+ if (hexAddress.startsWith(TVM_MAINNET_PREFIX)) {
93
+ hexAddress = hexAddress.substring(2);
94
+ }
95
+ if (hexAddress.length !== 40) {
96
+ throw new Error(`Invalid address length: expected 40 chars, got ${hexAddress.length}`);
97
+ }
98
+ if (!/^[0-9a-fA-F]{40}$/.test(hexAddress)) {
99
+ throw new Error("Invalid hex address format");
100
+ }
101
+ return "0x" + hexAddress.toLowerCase();
102
+ }
103
+ }
104
+ });
105
+
106
+ // ../contracts/tvm/escrow-encoding/typescript/dist/reserve-encoder.js
107
+ var require_reserve_encoder = __commonJS({
108
+ "../contracts/tvm/escrow-encoding/typescript/dist/reserve-encoder.js"(exports2) {
109
+ "use strict";
110
+ Object.defineProperty(exports2, "__esModule", { value: true });
111
+ exports2.computeReserveDigest = computeReserveDigest;
112
+ var ethers_1 = require("ethers");
113
+ var chain_id_1 = require_chain_id();
114
+ var RESERVE_WITNESS_TYPES = {
115
+ ReserveWitness: [
116
+ { name: "paymentId", type: "bytes32" },
117
+ { name: "settler", type: "address" }
118
+ ]
119
+ };
120
+ function computeReserveDigest(input) {
121
+ const domain = {
122
+ name: "Escrow",
123
+ version: "3",
124
+ chainId: (0, chain_id_1.maskChainId)(input.chainId),
125
+ verifyingContract: input.escrowContract
126
+ };
127
+ return ethers_1.TypedDataEncoder.hash(domain, RESERVE_WITNESS_TYPES, {
128
+ paymentId: input.paymentId,
129
+ settler: input.settler
130
+ });
131
+ }
132
+ }
133
+ });
134
+
135
+ // ../contracts/tvm/escrow-encoding/typescript/dist/payment-id.js
37
136
  var require_payment_id = __commonJS({
137
+ "../contracts/tvm/escrow-encoding/typescript/dist/payment-id.js"(exports2) {
138
+ "use strict";
139
+ Object.defineProperty(exports2, "__esModule", { value: true });
140
+ exports2.computePaymentId = computePaymentId;
141
+ var ethers_1 = require("ethers");
142
+ var tron_address_1 = require_tron_address();
143
+ function computePaymentId(depositor, signature, nonce) {
144
+ if (!/^[0-9]+$/.test(nonce)) {
145
+ throw new Error(`invalid nonce (expected base-10 decimal): ${nonce}`);
146
+ }
147
+ const encoded = ethers_1.AbiCoder.defaultAbiCoder().encode(["address", "bytes", "uint256"], [(0, tron_address_1.normalizeAddress)(depositor), signature, nonce]);
148
+ return (0, ethers_1.keccak256)(encoded);
149
+ }
150
+ }
151
+ });
152
+
153
+ // ../contracts/tvm/escrow-encoding/typescript/dist/deposit-encoder.js
154
+ var require_deposit_encoder = __commonJS({
155
+ "../contracts/tvm/escrow-encoding/typescript/dist/deposit-encoder.js"(exports2) {
156
+ "use strict";
157
+ Object.defineProperty(exports2, "__esModule", { value: true });
158
+ exports2.createTvmPermitWitnessTransferFromPrehash = createTvmPermitWitnessTransferFromPrehash2;
159
+ exports2.hashTvmPermitWitnessTransferFrom = hashTvmPermitWitnessTransferFrom2;
160
+ var ethers_1 = require("ethers");
161
+ var chain_id_1 = require_chain_id();
162
+ var tron_address_1 = require_tron_address();
163
+ var PERMIT_WITNESS_TYPES_V2 = {
164
+ PermitWitnessTransferFrom: [
165
+ { name: "permitted", type: "TokenPermissions" },
166
+ { name: "spender", type: "address" },
167
+ { name: "nonce", type: "uint256" },
168
+ { name: "deadline", type: "uint256" },
169
+ { name: "witness", type: "DepositWitness" }
170
+ ],
171
+ TokenPermissions: [
172
+ { name: "token", type: "address" },
173
+ { name: "amount", type: "uint256" }
174
+ ],
175
+ DepositWitness: [
176
+ { name: "reserver", type: "address" },
177
+ { name: "releaser", type: "address" }
178
+ ]
179
+ };
180
+ function createTvmPermitWitnessTransferFromPrehash2(params) {
181
+ const maskedChainId = (0, chain_id_1.maskChainId)(params.chainId);
182
+ return {
183
+ types: PERMIT_WITNESS_TYPES_V2,
184
+ primaryType: "PermitWitnessTransferFrom",
185
+ domain: {
186
+ name: "Permit2",
187
+ chainId: `0x${maskedChainId.toString(16)}`,
188
+ verifyingContract: (0, tron_address_1.normalizeAddress)(params.permit2Address)
189
+ },
190
+ message: {
191
+ permitted: {
192
+ token: (0, tron_address_1.normalizeAddress)(params.tokenAddress),
193
+ amount: params.amount
194
+ },
195
+ spender: (0, tron_address_1.normalizeAddress)(params.spenderAddress),
196
+ nonce: params.nonce.toString(),
197
+ deadline: params.deadline.toString(),
198
+ witness: {
199
+ reserver: (0, tron_address_1.normalizeAddress)(params.reserverAddress),
200
+ releaser: (0, tron_address_1.normalizeAddress)(params.releaserAddress)
201
+ }
202
+ }
203
+ };
204
+ }
205
+ function hashTvmPermitWitnessTransferFrom2(prehash) {
206
+ return ethers_1.TypedDataEncoder.hash(prehash.domain, prehash.types, prehash.message);
207
+ }
208
+ }
209
+ });
210
+
211
+ // ../contracts/tvm/escrow-encoding/typescript/dist/index.js
212
+ var require_dist = __commonJS({
213
+ "../contracts/tvm/escrow-encoding/typescript/dist/index.js"(exports2) {
214
+ "use strict";
215
+ Object.defineProperty(exports2, "__esModule", { value: true });
216
+ exports2.hashTvmPermitWitnessTransferFrom = exports2.createTvmPermitWitnessTransferFromPrehash = exports2.computePaymentId = exports2.computeReserveDigest = exports2.normalizeAddress = exports2.base58ToHex = exports2.maskChainId = void 0;
217
+ var chain_id_1 = require_chain_id();
218
+ Object.defineProperty(exports2, "maskChainId", { enumerable: true, get: function() {
219
+ return chain_id_1.maskChainId;
220
+ } });
221
+ var tron_address_1 = require_tron_address();
222
+ Object.defineProperty(exports2, "base58ToHex", { enumerable: true, get: function() {
223
+ return tron_address_1.base58ToHex;
224
+ } });
225
+ Object.defineProperty(exports2, "normalizeAddress", { enumerable: true, get: function() {
226
+ return tron_address_1.normalizeAddress;
227
+ } });
228
+ var reserve_encoder_1 = require_reserve_encoder();
229
+ Object.defineProperty(exports2, "computeReserveDigest", { enumerable: true, get: function() {
230
+ return reserve_encoder_1.computeReserveDigest;
231
+ } });
232
+ var payment_id_1 = require_payment_id();
233
+ Object.defineProperty(exports2, "computePaymentId", { enumerable: true, get: function() {
234
+ return payment_id_1.computePaymentId;
235
+ } });
236
+ var deposit_encoder_1 = require_deposit_encoder();
237
+ Object.defineProperty(exports2, "createTvmPermitWitnessTransferFromPrehash", { enumerable: true, get: function() {
238
+ return deposit_encoder_1.createTvmPermitWitnessTransferFromPrehash;
239
+ } });
240
+ Object.defineProperty(exports2, "hashTvmPermitWitnessTransferFrom", { enumerable: true, get: function() {
241
+ return deposit_encoder_1.hashTvmPermitWitnessTransferFrom;
242
+ } });
243
+ }
244
+ });
245
+
246
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/types.js
247
+ var require_types = __commonJS({
248
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/types.js"(exports2) {
249
+ "use strict";
250
+ Object.defineProperty(exports2, "__esModule", { value: true });
251
+ }
252
+ });
253
+
254
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/utils.js
255
+ var require_utils = __commonJS({
256
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/utils.js"(exports2) {
257
+ "use strict";
258
+ Object.defineProperty(exports2, "__esModule", { value: true });
259
+ exports2.SOLANA_REPLAY_SLOTS = exports2.PERMIT_NONCE_DOMAIN = exports2.REPLAY_HORIZON_SECS = void 0;
260
+ exports2.resolvePermitDeadline = resolvePermitDeadline;
261
+ exports2.generatePermitNonce = generatePermitNonce;
262
+ exports2.resolvePermitNonce = resolvePermitNonce;
263
+ exports2.deterministicPermitNonce = deterministicPermitNonce2;
264
+ exports2.deterministicSolanaNonce = deterministicSolanaNonce2;
265
+ exports2.sameAddress = sameAddress;
266
+ exports2.assertKeyMatchesSender = assertKeyMatchesSender2;
267
+ exports2.assertToken = assertToken;
268
+ exports2.assertAmountMatches = assertAmountMatches;
269
+ exports2.assertFresh = assertFresh;
270
+ exports2.assertSpender = assertSpender;
271
+ exports2.assertWitnessRoles = assertWitnessRoles;
272
+ exports2.assertRolePairComplete = assertRolePairComplete;
273
+ exports2.nowSec = nowSec;
274
+ var ethers_1 = require("ethers");
275
+ exports2.REPLAY_HORIZON_SECS = 128;
276
+ function resolvePermitDeadline(deadline) {
277
+ return BigInt(deadline);
278
+ }
279
+ function generatePermitNonce() {
280
+ const rand = new Uint32Array(1);
281
+ globalThis.crypto.getRandomValues(rand);
282
+ return (BigInt(Date.now()) << 32n) + BigInt(rand[0]);
283
+ }
284
+ function resolvePermitNonce(nonce) {
285
+ return BigInt(nonce);
286
+ }
287
+ exports2.PERMIT_NONCE_DOMAIN = "atum-permit:v1:";
288
+ exports2.SOLANA_REPLAY_SLOTS = 235n;
289
+ var SOLANA_BUCKET_BITS = 17n;
290
+ function canonicalDepositor(depositor) {
291
+ const lower = depositor.toLowerCase();
292
+ return lower.startsWith("0x") ? lower : depositor;
293
+ }
294
+ function permitNonceSeed(requestId, depositor) {
295
+ if (!requestId) {
296
+ throw new Error("sender_auth: request_id is required to derive a deterministic permit nonce");
297
+ }
298
+ return BigInt((0, ethers_1.keccak256)((0, ethers_1.toUtf8Bytes)(`${exports2.PERMIT_NONCE_DOMAIN}${requestId}:${canonicalDepositor(depositor)}`)));
299
+ }
300
+ function deterministicPermitNonce2(params) {
301
+ return permitNonceSeed(params.requestId, params.depositor);
302
+ }
303
+ function deterministicSolanaNonce2(params) {
304
+ const seed = permitNonceSeed(params.requestId, params.depositor);
305
+ const slot = seed % exports2.SOLANA_REPLAY_SLOTS;
306
+ const bucket = (seed >> 8n) % (1n << SOLANA_BUCKET_BITS);
307
+ return bucket << 32n | slot;
308
+ }
309
+ function sameAddress(a, b) {
310
+ if (a.startsWith("0x") && b.startsWith("0x")) {
311
+ return a.toLowerCase() === b.toLowerCase();
312
+ }
313
+ return a === b;
314
+ }
315
+ function assertKeyMatchesSender2(matches, sender, derived) {
316
+ if (!matches) {
317
+ throw new Error(`sender_auth: private key derives ${derived}, not the expected sender ${sender}`);
318
+ }
319
+ }
320
+ function assertToken(token, sourceAsset, normalize) {
321
+ if (!sameAddress(token, normalize(sourceAsset))) {
322
+ throw new Error("sender_auth: permit token does not match the source asset");
323
+ }
324
+ }
325
+ function assertAmountMatches(amount, maxSourceAmount) {
326
+ if (BigInt(amount) !== BigInt(maxSourceAmount)) {
327
+ throw new Error("sender_auth: permit amount does not match max_source_amount");
328
+ }
329
+ }
330
+ function assertFresh(deadlineSec, nowSec2) {
331
+ if (deadlineSec <= nowSec2) {
332
+ throw new Error("sender_auth: permit deadline is not in the future");
333
+ }
334
+ }
335
+ function assertSpender(spender, escrow, normalize) {
336
+ if (!sameAddress(spender, normalize(escrow))) {
337
+ throw new Error("sender_auth: permit spender is not the source escrow");
338
+ }
339
+ }
340
+ function assertWitnessRoles(reserver, releaser, expectedReserver, expectedReleaser, normalize) {
341
+ if (!sameAddress(reserver, normalize(expectedReserver)) || !sameAddress(releaser, normalize(expectedReleaser))) {
342
+ throw new Error("sender_auth: deposit witness roles do not match the challenge");
343
+ }
344
+ }
345
+ function assertRolePairComplete(reserver, releaser) {
346
+ if (reserver === void 0 !== (releaser === void 0)) {
347
+ throw new Error("sender_auth: reserver and releaser must be supplied together");
348
+ }
349
+ }
350
+ function nowSec() {
351
+ return Math.floor(Date.now() / 1e3);
352
+ }
353
+ }
354
+ });
355
+
356
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/chain-id.js
357
+ var require_chain_id2 = __commonJS({
358
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/chain-id.js"(exports2) {
359
+ "use strict";
360
+ Object.defineProperty(exports2, "__esModule", { value: true });
361
+ exports2.TRON_PERMIT2_FALLBACKS = exports2.TRON_CHAIN_IDS = void 0;
362
+ exports2.namespaceOf = namespaceOf;
363
+ exports2.evmChainId = evmChainId;
364
+ exports2.tronNumericChainId = tronNumericChainId;
365
+ exports2.resolveTronPermit2 = resolveTronPermit2;
366
+ exports2.clusterIdFromName = clusterIdFromName;
367
+ function namespaceOf(network) {
368
+ return network.split(":")[0];
369
+ }
370
+ function evmChainId(network) {
371
+ const match = /^eip155:([0-9]+)$/.exec(network);
372
+ if (!match) {
373
+ throw new Error(`sender_auth: expected an eip155 network, got ${network}`);
374
+ }
375
+ return Number(match[1]);
376
+ }
377
+ exports2.TRON_CHAIN_IDS = {
378
+ mainnet: 728126428,
379
+ shasta: 2494104990
380
+ };
381
+ function tronNumericChainId(network) {
382
+ const cluster = network.split(":")[1];
383
+ const id = exports2.TRON_CHAIN_IDS[cluster ?? ""];
384
+ if (id === void 0) {
385
+ throw new Error(`sender_auth: unsupported Tron network '${network}'`);
386
+ }
387
+ return id;
388
+ }
389
+ exports2.TRON_PERMIT2_FALLBACKS = {
390
+ "tron:mainnet": "TJhMXTHQHeQyMD7TcKQFqAePNgG4b31H9m",
391
+ "tron:shasta": "TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp"
392
+ };
393
+ function resolveTronPermit2(network) {
394
+ const resolved = exports2.TRON_PERMIT2_FALLBACKS[network];
395
+ if (!resolved) {
396
+ throw new Error(`sender_auth: no Permit2 address known for Tron network '${network}'`);
397
+ }
398
+ return resolved;
399
+ }
400
+ function clusterIdFromName(name) {
401
+ const encoded = new TextEncoder().encode(name);
402
+ if (encoded.length > 32) {
403
+ throw new Error(`sender_auth: Solana cluster name too long (${encoded.length} > 32 bytes): ${name}`);
404
+ }
405
+ const out = new Uint8Array(32);
406
+ out.set(encoded);
407
+ return out;
408
+ }
409
+ }
410
+ });
411
+
412
+ // ../contracts/evm/escrow-encoding/typescript/dist/payment-id.js
413
+ var require_payment_id2 = __commonJS({
38
414
  "../contracts/evm/escrow-encoding/typescript/dist/payment-id.js"(exports2) {
39
415
  "use strict";
40
416
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -350,7 +726,7 @@ var require_escrow_abi = __commonJS({
350
726
  });
351
727
 
352
728
  // ../contracts/evm/escrow-encoding/typescript/dist/reserve-encoder.js
353
- var require_reserve_encoder = __commonJS({
729
+ var require_reserve_encoder2 = __commonJS({
354
730
  "../contracts/evm/escrow-encoding/typescript/dist/reserve-encoder.js"(exports2) {
355
731
  "use strict";
356
732
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -368,7 +744,7 @@ var require_reserve_encoder = __commonJS({
368
744
  });
369
745
 
370
746
  // ../contracts/evm/escrow-encoding/typescript/dist/deposit-encoder.js
371
- var require_deposit_encoder = __commonJS({
747
+ var require_deposit_encoder2 = __commonJS({
372
748
  "../contracts/evm/escrow-encoding/typescript/dist/deposit-encoder.js"(exports2) {
373
749
  "use strict";
374
750
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -389,300 +765,351 @@ var require_deposit_encoder = __commonJS({
389
765
  },
390
766
  message: {
391
767
  permitted: {
392
- token: params.token,
393
- amount: params.amount
394
- },
395
- spender: params.spender,
396
- nonce: params.nonce.toString(),
397
- deadline: params.deadline.toString(),
398
- witness: {
399
- reserver: params.reserver,
400
- releaser: params.releaser
401
- }
402
- }
403
- };
404
- }
405
- function hashPermitWitnessTransferFrom2(prehash) {
406
- return ethers_1.TypedDataEncoder.hash(prehash.domain, prehash.types, prehash.message);
407
- }
408
- }
409
- });
410
-
411
- // ../contracts/evm/escrow-encoding/typescript/dist/index.js
412
- var require_dist = __commonJS({
413
- "../contracts/evm/escrow-encoding/typescript/dist/index.js"(exports2) {
414
- "use strict";
415
- Object.defineProperty(exports2, "__esModule", { value: true });
416
- 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;
417
- var payment_id_1 = require_payment_id();
418
- Object.defineProperty(exports2, "computePaymentId", { enumerable: true, get: function() {
419
- return payment_id_1.computePaymentId;
420
- } });
421
- Object.defineProperty(exports2, "computePaymentIdV2", { enumerable: true, get: function() {
422
- return payment_id_1.computePaymentIdV2;
423
- } });
424
- var nonce_generator_1 = require_nonce_generator();
425
- Object.defineProperty(exports2, "generateNonce", { enumerable: true, get: function() {
426
- return nonce_generator_1.generateNonce;
427
- } });
428
- var permit_types_1 = require_permit_types();
429
- Object.defineProperty(exports2, "PERMIT_WITNESS_TYPES", { enumerable: true, get: function() {
430
- return permit_types_1.PERMIT_WITNESS_TYPES;
431
- } });
432
- Object.defineProperty(exports2, "PERMIT_WITNESS_TYPES_V2", { enumerable: true, get: function() {
433
- return permit_types_1.PERMIT_WITNESS_TYPES_V2;
434
- } });
435
- Object.defineProperty(exports2, "createPermit2Domain", { enumerable: true, get: function() {
436
- return permit_types_1.createPermit2Domain;
437
- } });
438
- Object.defineProperty(exports2, "createEscrowDomain", { enumerable: true, get: function() {
439
- return permit_types_1.createEscrowDomain;
440
- } });
441
- Object.defineProperty(exports2, "RESERVE_WITNESS_TYPES", { enumerable: true, get: function() {
442
- return permit_types_1.RESERVE_WITNESS_TYPES;
443
- } });
444
- Object.defineProperty(exports2, "RELEASE_WITNESS_TYPES", { enumerable: true, get: function() {
445
- return permit_types_1.RELEASE_WITNESS_TYPES;
446
- } });
447
- Object.defineProperty(exports2, "REFUND_WITNESS_TYPES", { enumerable: true, get: function() {
448
- return permit_types_1.REFUND_WITNESS_TYPES;
449
- } });
450
- var escrow_abi_1 = require_escrow_abi();
451
- Object.defineProperty(exports2, "ESCROW_ABI", { enumerable: true, get: function() {
452
- return escrow_abi_1.ESCROW_ABI;
453
- } });
454
- Object.defineProperty(exports2, "ESCROW_ABI_JSON", { enumerable: true, get: function() {
455
- return escrow_abi_1.ESCROW_ABI_JSON;
456
- } });
457
- Object.defineProperty(exports2, "ESCROW_V2_ABI_JSON", { enumerable: true, get: function() {
458
- return escrow_abi_1.ESCROW_V2_ABI_JSON;
459
- } });
460
- Object.defineProperty(exports2, "ESCROW_V3_ABI_JSON", { enumerable: true, get: function() {
461
- return escrow_abi_1.ESCROW_V3_ABI_JSON;
462
- } });
463
- var reserve_encoder_1 = require_reserve_encoder();
464
- Object.defineProperty(exports2, "computeReserveDigest", { enumerable: true, get: function() {
465
- return reserve_encoder_1.computeReserveDigest;
466
- } });
467
- var deposit_encoder_1 = require_deposit_encoder();
468
- Object.defineProperty(exports2, "createPermitWitnessTransferFromPrehash", { enumerable: true, get: function() {
469
- return deposit_encoder_1.createPermitWitnessTransferFromPrehash;
470
- } });
471
- Object.defineProperty(exports2, "hashPermitWitnessTransferFrom", { enumerable: true, get: function() {
472
- return deposit_encoder_1.hashPermitWitnessTransferFrom;
473
- } });
474
- Object.defineProperty(exports2, "PERMIT2_CONTRACT_ADDRESS", { enumerable: true, get: function() {
475
- return deposit_encoder_1.PERMIT2_CONTRACT_ADDRESS;
476
- } });
477
- }
478
- });
479
-
480
- // ../contracts/tvm/escrow-encoding/typescript/dist/chain-id.js
481
- var require_chain_id = __commonJS({
482
- "../contracts/tvm/escrow-encoding/typescript/dist/chain-id.js"(exports2) {
483
- "use strict";
484
- Object.defineProperty(exports2, "__esModule", { value: true });
485
- exports2.maskChainId = maskChainId2;
486
- function maskChainId2(chainId) {
487
- return (chainId & 4294967295) >>> 0;
488
- }
489
- }
490
- });
491
-
492
- // ../contracts/tvm/escrow-encoding/typescript/dist/tron-address.js
493
- var require_tron_address = __commonJS({
494
- "../contracts/tvm/escrow-encoding/typescript/dist/tron-address.js"(exports2) {
495
- "use strict";
496
- var __importDefault = exports2 && exports2.__importDefault || function(mod) {
497
- return mod && mod.__esModule ? mod : { "default": mod };
498
- };
499
- Object.defineProperty(exports2, "__esModule", { value: true });
500
- exports2.base58ToHex = base58ToHex2;
501
- exports2.normalizeAddress = normalizeAddress2;
502
- var ethers_1 = require("ethers");
503
- var bs58_1 = __importDefault(require("bs58"));
504
- var TVM_MAINNET_PREFIX = "41";
505
- function base58ToHex2(base58Address) {
506
- if (!base58Address || !base58Address.startsWith("T")) {
507
- throw new Error(`Invalid Tron base58 address: ${base58Address}`);
508
- }
509
- const decoded = bs58_1.default.decode(base58Address);
510
- if (decoded.length !== 25) {
511
- throw new Error(`Invalid Tron base58 length (expected 25 bytes): ${base58Address}`);
512
- }
513
- const payload = decoded.slice(0, 21);
514
- const checksum = (0, ethers_1.hexlify)(decoded.slice(21)).slice(2);
515
- const computed = (0, ethers_1.sha256)((0, ethers_1.sha256)(payload)).slice(2, 10);
516
- if (checksum !== computed) {
517
- throw new Error(`Invalid Tron base58 checksum: ${base58Address}`);
518
- }
519
- return (0, ethers_1.hexlify)(payload).slice(2);
520
- }
521
- function normalizeAddress2(address) {
522
- if (!address) {
523
- throw new Error("Empty address");
524
- }
525
- let hexAddress = address;
526
- if (address.startsWith("T")) {
527
- hexAddress = base58ToHex2(address);
528
- }
529
- hexAddress = hexAddress.replace(/^0x/, "");
530
- if (hexAddress.startsWith(TVM_MAINNET_PREFIX)) {
531
- hexAddress = hexAddress.substring(2);
532
- }
533
- if (hexAddress.length !== 40) {
534
- throw new Error(`Invalid address length: expected 40 chars, got ${hexAddress.length}`);
535
- }
536
- if (!/^[0-9a-fA-F]{40}$/.test(hexAddress)) {
537
- throw new Error("Invalid hex address format");
538
- }
539
- return "0x" + hexAddress.toLowerCase();
540
- }
541
- }
542
- });
543
-
544
- // ../contracts/tvm/escrow-encoding/typescript/dist/reserve-encoder.js
545
- var require_reserve_encoder2 = __commonJS({
546
- "../contracts/tvm/escrow-encoding/typescript/dist/reserve-encoder.js"(exports2) {
547
- "use strict";
548
- Object.defineProperty(exports2, "__esModule", { value: true });
549
- exports2.computeReserveDigest = computeReserveDigest;
550
- var ethers_1 = require("ethers");
551
- var chain_id_1 = require_chain_id();
552
- var RESERVE_WITNESS_TYPES = {
553
- ReserveWitness: [
554
- { name: "paymentId", type: "bytes32" },
555
- { name: "settler", type: "address" }
556
- ]
557
- };
558
- function computeReserveDigest(input) {
559
- const domain = {
560
- name: "Escrow",
561
- version: "3",
562
- chainId: (0, chain_id_1.maskChainId)(input.chainId),
563
- verifyingContract: input.escrowContract
564
- };
565
- return ethers_1.TypedDataEncoder.hash(domain, RESERVE_WITNESS_TYPES, {
566
- paymentId: input.paymentId,
567
- settler: input.settler
568
- });
569
- }
570
- }
571
- });
572
-
573
- // ../contracts/tvm/escrow-encoding/typescript/dist/payment-id.js
574
- var require_payment_id2 = __commonJS({
575
- "../contracts/tvm/escrow-encoding/typescript/dist/payment-id.js"(exports2) {
576
- "use strict";
577
- Object.defineProperty(exports2, "__esModule", { value: true });
578
- exports2.computePaymentId = computePaymentId;
579
- var ethers_1 = require("ethers");
580
- var tron_address_1 = require_tron_address();
581
- function computePaymentId(depositor, signature, nonce) {
582
- if (!/^[0-9]+$/.test(nonce)) {
583
- throw new Error(`invalid nonce (expected base-10 decimal): ${nonce}`);
584
- }
585
- const encoded = ethers_1.AbiCoder.defaultAbiCoder().encode(["address", "bytes", "uint256"], [(0, tron_address_1.normalizeAddress)(depositor), signature, nonce]);
586
- return (0, ethers_1.keccak256)(encoded);
587
- }
588
- }
589
- });
590
-
591
- // ../contracts/tvm/escrow-encoding/typescript/dist/deposit-encoder.js
592
- var require_deposit_encoder2 = __commonJS({
593
- "../contracts/tvm/escrow-encoding/typescript/dist/deposit-encoder.js"(exports2) {
594
- "use strict";
595
- Object.defineProperty(exports2, "__esModule", { value: true });
596
- exports2.createTvmPermitWitnessTransferFromPrehash = createTvmPermitWitnessTransferFromPrehash2;
597
- exports2.hashTvmPermitWitnessTransferFrom = hashTvmPermitWitnessTransferFrom2;
598
- var ethers_1 = require("ethers");
599
- var chain_id_1 = require_chain_id();
600
- var tron_address_1 = require_tron_address();
601
- var PERMIT_WITNESS_TYPES_V2 = {
602
- PermitWitnessTransferFrom: [
603
- { name: "permitted", type: "TokenPermissions" },
604
- { name: "spender", type: "address" },
605
- { name: "nonce", type: "uint256" },
606
- { name: "deadline", type: "uint256" },
607
- { name: "witness", type: "DepositWitness" }
608
- ],
609
- TokenPermissions: [
610
- { name: "token", type: "address" },
611
- { name: "amount", type: "uint256" }
612
- ],
613
- DepositWitness: [
614
- { name: "reserver", type: "address" },
615
- { name: "releaser", type: "address" }
616
- ]
617
- };
618
- function createTvmPermitWitnessTransferFromPrehash2(params) {
619
- const maskedChainId = (0, chain_id_1.maskChainId)(params.chainId);
620
- return {
621
- types: PERMIT_WITNESS_TYPES_V2,
622
- primaryType: "PermitWitnessTransferFrom",
623
- domain: {
624
- name: "Permit2",
625
- chainId: `0x${maskedChainId.toString(16)}`,
626
- verifyingContract: (0, tron_address_1.normalizeAddress)(params.permit2Address)
627
- },
628
- message: {
629
- permitted: {
630
- token: (0, tron_address_1.normalizeAddress)(params.tokenAddress),
768
+ token: params.token,
631
769
  amount: params.amount
632
770
  },
633
- spender: (0, tron_address_1.normalizeAddress)(params.spenderAddress),
771
+ spender: params.spender,
634
772
  nonce: params.nonce.toString(),
635
773
  deadline: params.deadline.toString(),
636
774
  witness: {
637
- reserver: (0, tron_address_1.normalizeAddress)(params.reserverAddress),
638
- releaser: (0, tron_address_1.normalizeAddress)(params.releaserAddress)
775
+ reserver: params.reserver,
776
+ releaser: params.releaser
639
777
  }
640
778
  }
641
779
  };
642
780
  }
643
- function hashTvmPermitWitnessTransferFrom2(prehash) {
781
+ function hashPermitWitnessTransferFrom2(prehash) {
644
782
  return ethers_1.TypedDataEncoder.hash(prehash.domain, prehash.types, prehash.message);
645
783
  }
646
784
  }
647
785
  });
648
786
 
649
- // ../contracts/tvm/escrow-encoding/typescript/dist/index.js
787
+ // ../contracts/evm/escrow-encoding/typescript/dist/index.js
650
788
  var require_dist2 = __commonJS({
651
- "../contracts/tvm/escrow-encoding/typescript/dist/index.js"(exports2) {
789
+ "../contracts/evm/escrow-encoding/typescript/dist/index.js"(exports2) {
652
790
  "use strict";
653
791
  Object.defineProperty(exports2, "__esModule", { value: true });
654
- exports2.hashTvmPermitWitnessTransferFrom = exports2.createTvmPermitWitnessTransferFromPrehash = exports2.computePaymentId = exports2.computeReserveDigest = exports2.normalizeAddress = exports2.base58ToHex = exports2.maskChainId = void 0;
655
- var chain_id_1 = require_chain_id();
656
- Object.defineProperty(exports2, "maskChainId", { enumerable: true, get: function() {
657
- return chain_id_1.maskChainId;
792
+ 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;
793
+ var payment_id_1 = require_payment_id2();
794
+ Object.defineProperty(exports2, "computePaymentId", { enumerable: true, get: function() {
795
+ return payment_id_1.computePaymentId;
658
796
  } });
659
- var tron_address_1 = require_tron_address();
660
- Object.defineProperty(exports2, "base58ToHex", { enumerable: true, get: function() {
661
- return tron_address_1.base58ToHex;
797
+ Object.defineProperty(exports2, "computePaymentIdV2", { enumerable: true, get: function() {
798
+ return payment_id_1.computePaymentIdV2;
662
799
  } });
663
- Object.defineProperty(exports2, "normalizeAddress", { enumerable: true, get: function() {
664
- return tron_address_1.normalizeAddress;
800
+ var nonce_generator_1 = require_nonce_generator();
801
+ Object.defineProperty(exports2, "generateNonce", { enumerable: true, get: function() {
802
+ return nonce_generator_1.generateNonce;
803
+ } });
804
+ var permit_types_1 = require_permit_types();
805
+ Object.defineProperty(exports2, "PERMIT_WITNESS_TYPES", { enumerable: true, get: function() {
806
+ return permit_types_1.PERMIT_WITNESS_TYPES;
807
+ } });
808
+ Object.defineProperty(exports2, "PERMIT_WITNESS_TYPES_V2", { enumerable: true, get: function() {
809
+ return permit_types_1.PERMIT_WITNESS_TYPES_V2;
810
+ } });
811
+ Object.defineProperty(exports2, "createPermit2Domain", { enumerable: true, get: function() {
812
+ return permit_types_1.createPermit2Domain;
813
+ } });
814
+ Object.defineProperty(exports2, "createEscrowDomain", { enumerable: true, get: function() {
815
+ return permit_types_1.createEscrowDomain;
816
+ } });
817
+ Object.defineProperty(exports2, "RESERVE_WITNESS_TYPES", { enumerable: true, get: function() {
818
+ return permit_types_1.RESERVE_WITNESS_TYPES;
819
+ } });
820
+ Object.defineProperty(exports2, "RELEASE_WITNESS_TYPES", { enumerable: true, get: function() {
821
+ return permit_types_1.RELEASE_WITNESS_TYPES;
822
+ } });
823
+ Object.defineProperty(exports2, "REFUND_WITNESS_TYPES", { enumerable: true, get: function() {
824
+ return permit_types_1.REFUND_WITNESS_TYPES;
825
+ } });
826
+ var escrow_abi_1 = require_escrow_abi();
827
+ Object.defineProperty(exports2, "ESCROW_ABI", { enumerable: true, get: function() {
828
+ return escrow_abi_1.ESCROW_ABI;
829
+ } });
830
+ Object.defineProperty(exports2, "ESCROW_ABI_JSON", { enumerable: true, get: function() {
831
+ return escrow_abi_1.ESCROW_ABI_JSON;
832
+ } });
833
+ Object.defineProperty(exports2, "ESCROW_V2_ABI_JSON", { enumerable: true, get: function() {
834
+ return escrow_abi_1.ESCROW_V2_ABI_JSON;
835
+ } });
836
+ Object.defineProperty(exports2, "ESCROW_V3_ABI_JSON", { enumerable: true, get: function() {
837
+ return escrow_abi_1.ESCROW_V3_ABI_JSON;
665
838
  } });
666
839
  var reserve_encoder_1 = require_reserve_encoder2();
667
840
  Object.defineProperty(exports2, "computeReserveDigest", { enumerable: true, get: function() {
668
841
  return reserve_encoder_1.computeReserveDigest;
669
842
  } });
670
- var payment_id_1 = require_payment_id2();
671
- Object.defineProperty(exports2, "computePaymentId", { enumerable: true, get: function() {
672
- return payment_id_1.computePaymentId;
673
- } });
674
843
  var deposit_encoder_1 = require_deposit_encoder2();
675
- Object.defineProperty(exports2, "createTvmPermitWitnessTransferFromPrehash", { enumerable: true, get: function() {
676
- return deposit_encoder_1.createTvmPermitWitnessTransferFromPrehash;
844
+ Object.defineProperty(exports2, "createPermitWitnessTransferFromPrehash", { enumerable: true, get: function() {
845
+ return deposit_encoder_1.createPermitWitnessTransferFromPrehash;
677
846
  } });
678
- Object.defineProperty(exports2, "hashTvmPermitWitnessTransferFrom", { enumerable: true, get: function() {
679
- return deposit_encoder_1.hashTvmPermitWitnessTransferFrom;
847
+ Object.defineProperty(exports2, "hashPermitWitnessTransferFrom", { enumerable: true, get: function() {
848
+ return deposit_encoder_1.hashPermitWitnessTransferFrom;
849
+ } });
850
+ Object.defineProperty(exports2, "PERMIT2_CONTRACT_ADDRESS", { enumerable: true, get: function() {
851
+ return deposit_encoder_1.PERMIT2_CONTRACT_ADDRESS;
680
852
  } });
681
853
  }
682
854
  });
683
855
 
684
- // ../contracts/svm/escrow-encoding/typescript/dist/errors.js
856
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/errors.js
685
857
  var require_errors = __commonJS({
858
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/errors.js"(exports2) {
859
+ "use strict";
860
+ Object.defineProperty(exports2, "__esModule", { value: true });
861
+ exports2.SignerMismatchError = exports2.RecoveryFailedError = exports2.MalformedPrehashError = void 0;
862
+ var MalformedPrehashError = class extends Error {
863
+ constructor(message = "sender_auth: malformed message_prehash") {
864
+ super(message);
865
+ this.name = "MalformedPrehashError";
866
+ }
867
+ };
868
+ exports2.MalformedPrehashError = MalformedPrehashError;
869
+ var RecoveryFailedError = class extends Error {
870
+ constructor(message = "sender_auth: could not recover a signer from the signed message") {
871
+ super(message);
872
+ this.name = "RecoveryFailedError";
873
+ }
874
+ };
875
+ exports2.RecoveryFailedError = RecoveryFailedError;
876
+ var SignerMismatchError = class extends Error {
877
+ constructor(message = "sender_auth: recovered signer does not match source.account") {
878
+ super(message);
879
+ this.name = "SignerMismatchError";
880
+ }
881
+ };
882
+ exports2.SignerMismatchError = SignerMismatchError;
883
+ }
884
+ });
885
+
886
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/evm.js
887
+ var require_evm = __commonJS({
888
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/evm.js"(exports2) {
889
+ "use strict";
890
+ Object.defineProperty(exports2, "__esModule", { value: true });
891
+ exports2.evmAdapter = void 0;
892
+ var ethers_1 = require("ethers");
893
+ var evm_escrow_encoding_1 = require_dist2();
894
+ var utils_js_1 = require_utils();
895
+ var errors_js_1 = require_errors();
896
+ var chain_id_js_1 = require_chain_id2();
897
+ exports2.evmAdapter = {
898
+ async buildAuthMessage({ sourceAsset, maxSourceAmount, sourceDefaults, deadline, nonce }) {
899
+ if (nonce === void 0) {
900
+ 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");
901
+ }
902
+ if (deadline === void 0) {
903
+ 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)");
904
+ }
905
+ const sourceChainId = sourceAsset.split("/")[0];
906
+ const chainIdNum = parseInt(sourceChainId.split(":")[1]);
907
+ const tokenAddress = sourceAsset.split("/")[1].split(":")[1];
908
+ const permitParams = {
909
+ chainId: chainIdNum,
910
+ verifyingContract: evm_escrow_encoding_1.PERMIT2_CONTRACT_ADDRESS,
911
+ token: tokenAddress,
912
+ amount: maxSourceAmount,
913
+ spender: sourceDefaults.escrowContract,
914
+ nonce: (0, utils_js_1.resolvePermitNonce)(nonce),
915
+ deadline: (0, utils_js_1.resolvePermitDeadline)(deadline),
916
+ reserver: sourceDefaults.quoteSelector,
917
+ releaser: sourceDefaults.fulfillmentVerifierAccount
918
+ };
919
+ const messagePrehash = (0, evm_escrow_encoding_1.createPermitWitnessTransferFromPrehash)(permitParams);
920
+ const messageHash = (0, evm_escrow_encoding_1.hashPermitWitnessTransferFrom)(messagePrehash);
921
+ return { messageScheme: "EVM_PERMIT2", messageHash, messagePrehash: JSON.stringify(messagePrehash) };
922
+ },
923
+ async sign(signedMessage, privateKey) {
924
+ if (!signedMessage.message_prehash) {
925
+ throw new Error("EVM adapter sign(): signed_messages[i].message_prehash is required");
926
+ }
927
+ const prehash = JSON.parse(signedMessage.message_prehash);
928
+ const wallet = new ethers_1.Wallet(privateKey);
929
+ return wallet.signTypedData(prehash.domain, prehash.types, prehash.message);
930
+ },
931
+ recoverSigner(signed, source) {
932
+ let recovered;
933
+ try {
934
+ recovered = (0, ethers_1.recoverAddress)(signed.message, signed.signature);
935
+ } catch (e) {
936
+ throw new errors_js_1.RecoveryFailedError(`sender_auth: could not recover a signer: ${e.message}`);
937
+ }
938
+ if (!(0, utils_js_1.sameAddress)(recovered, source.account)) {
939
+ throw new errors_js_1.SignerMismatchError(`sender_auth: recovered ${recovered}, not source.account`);
940
+ }
941
+ return source.account;
942
+ },
943
+ recoverAndVerify(signed, source, expected) {
944
+ let canonical;
945
+ let msg;
946
+ try {
947
+ msg = JSON.parse(signed.message_prehash).message;
948
+ canonical = (0, evm_escrow_encoding_1.createPermitWitnessTransferFromPrehash)({
949
+ chainId: (0, chain_id_js_1.evmChainId)(source.network),
950
+ verifyingContract: evm_escrow_encoding_1.PERMIT2_CONTRACT_ADDRESS,
951
+ token: msg.permitted.token,
952
+ amount: msg.permitted.amount,
953
+ spender: msg.spender,
954
+ nonce: BigInt(msg.nonce),
955
+ deadline: BigInt(msg.deadline),
956
+ reserver: msg.witness.reserver,
957
+ releaser: msg.witness.releaser
958
+ });
959
+ } catch {
960
+ throw new errors_js_1.MalformedPrehashError();
961
+ }
962
+ let recovered;
963
+ try {
964
+ recovered = (0, ethers_1.verifyTypedData)(canonical.domain, canonical.types, canonical.message, signed.signature);
965
+ } catch {
966
+ throw new Error("sender_auth: deposit signature does not recover to source.account");
967
+ }
968
+ if (!(0, utils_js_1.sameAddress)(recovered, source.account)) {
969
+ throw new Error("sender_auth: deposit signature does not recover to source.account");
970
+ }
971
+ const deadlineSec = Number(msg.deadline);
972
+ (0, utils_js_1.assertToken)(msg.permitted.token, source.asset, (a) => a);
973
+ (0, utils_js_1.assertAmountMatches)(msg.permitted.amount, expected.maxSourceAmount);
974
+ (0, utils_js_1.assertFresh)(deadlineSec, expected.nowSec ?? (0, utils_js_1.nowSec)());
975
+ if (expected.escrowContract !== void 0) {
976
+ (0, utils_js_1.assertSpender)(msg.spender, expected.escrowContract, (a) => a);
977
+ }
978
+ (0, utils_js_1.assertRolePairComplete)(expected.reserver, expected.releaser);
979
+ if (expected.reserver !== void 0 && expected.releaser !== void 0) {
980
+ (0, utils_js_1.assertWitnessRoles)(msg.witness.reserver, msg.witness.releaser, expected.reserver, expected.releaser, (a) => a);
981
+ }
982
+ return {
983
+ amount: msg.permitted.amount,
984
+ deadlineSec,
985
+ permit: {
986
+ scheme: "EVM_PERMIT2",
987
+ token: msg.permitted.token,
988
+ amount: msg.permitted.amount,
989
+ deadlineSec,
990
+ reserver: msg.witness.reserver,
991
+ releaser: msg.witness.releaser,
992
+ spender: msg.spender
993
+ }
994
+ };
995
+ }
996
+ };
997
+ }
998
+ });
999
+
1000
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/tron.js
1001
+ var require_tron = __commonJS({
1002
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/tron.js"(exports2) {
1003
+ "use strict";
1004
+ Object.defineProperty(exports2, "__esModule", { value: true });
1005
+ exports2.tronAdapter = void 0;
1006
+ var ethers_1 = require("ethers");
1007
+ var tvm_escrow_encoding_1 = require_dist();
1008
+ var utils_js_1 = require_utils();
1009
+ var errors_js_1 = require_errors();
1010
+ var chain_id_js_1 = require_chain_id2();
1011
+ exports2.tronAdapter = {
1012
+ async buildAuthMessage({ sourceAsset, maxSourceAmount, sourceDefaults, deadline, nonce }) {
1013
+ if (nonce === void 0) {
1014
+ 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");
1015
+ }
1016
+ if (deadline === void 0) {
1017
+ 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)");
1018
+ }
1019
+ const sourceChainId = sourceAsset.split("/")[0];
1020
+ const tokenAddress = sourceAsset.split("/")[1].split(":")[1];
1021
+ const permit2Address = sourceDefaults.permit2Contract ?? (0, chain_id_js_1.resolveTronPermit2)(sourceChainId);
1022
+ const tvmParams = {
1023
+ chainId: (0, chain_id_js_1.tronNumericChainId)(sourceChainId),
1024
+ permit2Address,
1025
+ tokenAddress,
1026
+ amount: maxSourceAmount,
1027
+ spenderAddress: sourceDefaults.escrowContract,
1028
+ nonce: (0, utils_js_1.resolvePermitNonce)(nonce),
1029
+ deadline: (0, utils_js_1.resolvePermitDeadline)(deadline),
1030
+ reserverAddress: sourceDefaults.quoteSelector,
1031
+ releaserAddress: sourceDefaults.fulfillmentVerifierAccount
1032
+ };
1033
+ const messagePrehash = (0, tvm_escrow_encoding_1.createTvmPermitWitnessTransferFromPrehash)(tvmParams);
1034
+ const messageHash = (0, tvm_escrow_encoding_1.hashTvmPermitWitnessTransferFrom)(messagePrehash);
1035
+ return { messageScheme: "EVM_PERMIT2", messageHash, messagePrehash: JSON.stringify(messagePrehash) };
1036
+ },
1037
+ async sign(signedMessage, privateKey) {
1038
+ const wallet = new ethers_1.Wallet(privateKey.startsWith("0x") ? privateKey : "0x" + privateKey);
1039
+ return wallet.signingKey.sign(signedMessage.message).serialized;
1040
+ },
1041
+ recoverSigner(signed, source) {
1042
+ let recovered;
1043
+ try {
1044
+ recovered = (0, ethers_1.recoverAddress)(signed.message, signed.signature);
1045
+ } catch (e) {
1046
+ throw new errors_js_1.RecoveryFailedError(`sender_auth: could not recover a signer: ${e.message}`);
1047
+ }
1048
+ if (!(0, utils_js_1.sameAddress)(recovered, (0, tvm_escrow_encoding_1.normalizeAddress)(source.account))) {
1049
+ throw new errors_js_1.SignerMismatchError(`sender_auth: recovered ${recovered}, not source.account`);
1050
+ }
1051
+ return source.account;
1052
+ },
1053
+ recoverAndVerify(signed, source, expected) {
1054
+ let msg;
1055
+ let digest;
1056
+ try {
1057
+ msg = JSON.parse(signed.message_prehash).message;
1058
+ const canonical = (0, tvm_escrow_encoding_1.createTvmPermitWitnessTransferFromPrehash)({
1059
+ chainId: (0, chain_id_js_1.tronNumericChainId)(source.network),
1060
+ permit2Address: (0, chain_id_js_1.resolveTronPermit2)(source.network),
1061
+ tokenAddress: msg.permitted.token,
1062
+ amount: msg.permitted.amount,
1063
+ spenderAddress: msg.spender,
1064
+ nonce: BigInt(msg.nonce),
1065
+ deadline: BigInt(msg.deadline),
1066
+ reserverAddress: msg.witness.reserver,
1067
+ releaserAddress: msg.witness.releaser
1068
+ });
1069
+ digest = (0, tvm_escrow_encoding_1.hashTvmPermitWitnessTransferFrom)(canonical);
1070
+ } catch {
1071
+ throw new errors_js_1.MalformedPrehashError();
1072
+ }
1073
+ let recovered;
1074
+ try {
1075
+ recovered = (0, ethers_1.recoverAddress)(digest, signed.signature);
1076
+ } catch {
1077
+ throw new Error("sender_auth: deposit signature does not recover to source.account");
1078
+ }
1079
+ if (!(0, utils_js_1.sameAddress)(recovered, (0, tvm_escrow_encoding_1.normalizeAddress)(source.account))) {
1080
+ throw new Error("sender_auth: deposit signature does not recover to source.account");
1081
+ }
1082
+ const deadlineSec = Number(msg.deadline);
1083
+ (0, utils_js_1.assertToken)(msg.permitted.token, source.asset, tvm_escrow_encoding_1.normalizeAddress);
1084
+ (0, utils_js_1.assertAmountMatches)(msg.permitted.amount, expected.maxSourceAmount);
1085
+ (0, utils_js_1.assertFresh)(deadlineSec, expected.nowSec ?? (0, utils_js_1.nowSec)());
1086
+ if (expected.escrowContract !== void 0) {
1087
+ (0, utils_js_1.assertSpender)(msg.spender, expected.escrowContract, tvm_escrow_encoding_1.normalizeAddress);
1088
+ }
1089
+ (0, utils_js_1.assertRolePairComplete)(expected.reserver, expected.releaser);
1090
+ if (expected.reserver !== void 0 && expected.releaser !== void 0) {
1091
+ (0, utils_js_1.assertWitnessRoles)(msg.witness.reserver, msg.witness.releaser, expected.reserver, expected.releaser, tvm_escrow_encoding_1.normalizeAddress);
1092
+ }
1093
+ return {
1094
+ amount: msg.permitted.amount,
1095
+ deadlineSec,
1096
+ permit: {
1097
+ scheme: "EVM_PERMIT2",
1098
+ token: msg.permitted.token,
1099
+ amount: msg.permitted.amount,
1100
+ deadlineSec,
1101
+ reserver: msg.witness.reserver,
1102
+ releaser: msg.witness.releaser,
1103
+ spender: msg.spender
1104
+ }
1105
+ };
1106
+ }
1107
+ };
1108
+ }
1109
+ });
1110
+
1111
+ // ../contracts/svm/escrow-encoding/typescript/dist/errors.js
1112
+ var require_errors2 = __commonJS({
686
1113
  "../contracts/svm/escrow-encoding/typescript/dist/errors.js"(exports2) {
687
1114
  "use strict";
688
1115
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -784,8 +1211,8 @@ var require_pubkey = __commonJS({
784
1211
  Object.defineProperty(exports2, "__esModule", { value: true });
785
1212
  exports2.Pubkey = void 0;
786
1213
  var bs58_1 = __importDefault(require("bs58"));
787
- var errors_1 = require_errors();
788
- var Pubkey3 = class _Pubkey {
1214
+ var errors_1 = require_errors2();
1215
+ var Pubkey2 = class _Pubkey {
789
1216
  constructor(data) {
790
1217
  if (data.length !== 32) {
791
1218
  throw new errors_1.InvalidPubkeyLengthError();
@@ -878,7 +1305,7 @@ var require_pubkey = __commonJS({
878
1305
  return this.data.every((b, i) => b === other.data[i]);
879
1306
  }
880
1307
  };
881
- exports2.Pubkey = Pubkey3;
1308
+ exports2.Pubkey = Pubkey2;
882
1309
  }
883
1310
  });
884
1311
 
@@ -990,7 +1417,7 @@ var require_cryptoNode = __commonJS({
990
1417
  });
991
1418
 
992
1419
  // ../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/utils.js
993
- var require_utils = __commonJS({
1420
+ var require_utils2 = __commonJS({
994
1421
  "../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/utils.js"(exports2) {
995
1422
  "use strict";
996
1423
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -1239,7 +1666,7 @@ var require_sha3 = __commonJS({
1239
1666
  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;
1240
1667
  exports2.keccakP = keccakP;
1241
1668
  var _u64_ts_1 = require_u64();
1242
- var utils_ts_1 = require_utils();
1669
+ var utils_ts_1 = require_utils2();
1243
1670
  var _0n = BigInt(0);
1244
1671
  var _1n = BigInt(1);
1245
1672
  var _2n = BigInt(2);
@@ -1504,7 +1931,7 @@ var require_deposit_encoder3 = __commonJS({
1504
1931
  exports2.computeDepositHash = computeDepositHash2;
1505
1932
  var encoding_utils_1 = require_encoding_utils();
1506
1933
  var escrow_domain_1 = require_escrow_domain();
1507
- var errors_1 = require_errors();
1934
+ var errors_1 = require_errors2();
1508
1935
  function computeDepositHash2(params, domain) {
1509
1936
  if (params.paymentId.length !== 32 || (0, encoding_utils_1.isZeroBytes32)(params.paymentId)) {
1510
1937
  throw new errors_1.ZeroPaymentIdError();
@@ -1532,7 +1959,7 @@ var require_reserve_encoder3 = __commonJS({
1532
1959
  exports2.computeReserveHash = computeReserveHash;
1533
1960
  var encoding_utils_1 = require_encoding_utils();
1534
1961
  var escrow_domain_1 = require_escrow_domain();
1535
- var errors_1 = require_errors();
1962
+ var errors_1 = require_errors2();
1536
1963
  function computeReserveHash(params, domain) {
1537
1964
  if (params.depositHash.length !== 32 || (0, encoding_utils_1.isZeroBytes32)(params.depositHash)) {
1538
1965
  throw new errors_1.ZeroDepositHashError();
@@ -1552,7 +1979,7 @@ var require_release_encoder = __commonJS({
1552
1979
  exports2.computeReleaseHash = computeReleaseHash;
1553
1980
  var encoding_utils_1 = require_encoding_utils();
1554
1981
  var escrow_domain_1 = require_escrow_domain();
1555
- var errors_1 = require_errors();
1982
+ var errors_1 = require_errors2();
1556
1983
  function computeReleaseHash(params, domain) {
1557
1984
  if (params.depositHash.length !== 32 || (0, encoding_utils_1.isZeroBytes32)(params.depositHash)) {
1558
1985
  throw new errors_1.ZeroDepositHashError();
@@ -1570,7 +1997,7 @@ var require_refund_encoder = __commonJS({
1570
1997
  exports2.computeRefundHash = computeRefundHash;
1571
1998
  var encoding_utils_1 = require_encoding_utils();
1572
1999
  var escrow_domain_1 = require_escrow_domain();
1573
- var errors_1 = require_errors();
2000
+ var errors_1 = require_errors2();
1574
2001
  function computeRefundHash(params, domain) {
1575
2002
  if (params.depositHash.length !== 32 || (0, encoding_utils_1.isZeroBytes32)(params.depositHash)) {
1576
2003
  throw new errors_1.ZeroDepositHashError();
@@ -1631,7 +2058,7 @@ var require_dist3 = __commonJS({
1631
2058
  Object.defineProperty(exports2, "escrowDomainPrefixBytes", { enumerable: true, get: function() {
1632
2059
  return escrow_domain_1.escrowDomainPrefixBytes;
1633
2060
  } });
1634
- var errors_1 = require_errors();
2061
+ var errors_1 = require_errors2();
1635
2062
  Object.defineProperty(exports2, "EncodingError", { enumerable: true, get: function() {
1636
2063
  return errors_1.EncodingError;
1637
2064
  } });
@@ -1676,29 +2103,344 @@ var require_dist3 = __commonJS({
1676
2103
  Object.defineProperty(exports2, "computeReserveHash", { enumerable: true, get: function() {
1677
2104
  return reserve_encoder_1.computeReserveHash;
1678
2105
  } });
1679
- var release_encoder_1 = require_release_encoder();
1680
- Object.defineProperty(exports2, "computeReleaseHash", { enumerable: true, get: function() {
1681
- return release_encoder_1.computeReleaseHash;
2106
+ var release_encoder_1 = require_release_encoder();
2107
+ Object.defineProperty(exports2, "computeReleaseHash", { enumerable: true, get: function() {
2108
+ return release_encoder_1.computeReleaseHash;
2109
+ } });
2110
+ var refund_encoder_1 = require_refund_encoder();
2111
+ Object.defineProperty(exports2, "computeRefundHash", { enumerable: true, get: function() {
2112
+ return refund_encoder_1.computeRefundHash;
2113
+ } });
2114
+ var nonce_generator_1 = require_nonce_generator2();
2115
+ Object.defineProperty(exports2, "generateNonce", { enumerable: true, get: function() {
2116
+ return nonce_generator_1.generateNonce;
2117
+ } });
2118
+ Object.defineProperty(exports2, "REPLAY_SLOTS", { enumerable: true, get: function() {
2119
+ return nonce_generator_1.REPLAY_SLOTS;
2120
+ } });
2121
+ Object.defineProperty(exports2, "MAX_VALID_SLOT", { enumerable: true, get: function() {
2122
+ return nonce_generator_1.MAX_VALID_SLOT;
2123
+ } });
2124
+ }
2125
+ });
2126
+
2127
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/solana.js
2128
+ var require_solana = __commonJS({
2129
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/solana.js"(exports2) {
2130
+ "use strict";
2131
+ var __importDefault = exports2 && exports2.__importDefault || function(mod) {
2132
+ return mod && mod.__esModule ? mod : { "default": mod };
2133
+ };
2134
+ Object.defineProperty(exports2, "__esModule", { value: true });
2135
+ exports2.solanaAdapter = void 0;
2136
+ var ethers_1 = require("ethers");
2137
+ var tweetnacl_1 = __importDefault(require("tweetnacl"));
2138
+ var bs58_1 = __importDefault(require("bs58"));
2139
+ var solana_escrow_encoding_1 = require_dist3();
2140
+ var utils_js_1 = require_utils();
2141
+ var errors_js_1 = require_errors();
2142
+ var chain_id_js_1 = require_chain_id2();
2143
+ var idAddr = (a) => a;
2144
+ function generateSolanaPaymentIdV3(requestId) {
2145
+ return (0, ethers_1.keccak256)((0, ethers_1.toUtf8Bytes)(requestId));
2146
+ }
2147
+ function hashDeposit(prehash, domain) {
2148
+ return (0, ethers_1.hexlify)((0, solana_escrow_encoding_1.computeDepositHash)({
2149
+ paymentId: (0, ethers_1.getBytes)(prehash.payment_id),
2150
+ depositor: solana_escrow_encoding_1.Pubkey.fromBase58(prehash.depositor),
2151
+ mint: solana_escrow_encoding_1.Pubkey.fromBase58(prehash.mint),
2152
+ amount: BigInt(prehash.amount),
2153
+ reserver: solana_escrow_encoding_1.Pubkey.fromBase58(prehash.reserver),
2154
+ releaser: solana_escrow_encoding_1.Pubkey.fromBase58(prehash.releaser),
2155
+ nonce: BigInt(prehash.nonce),
2156
+ issuedAt: BigInt(prehash.issued_at),
2157
+ deadline: BigInt(prehash.deadline)
2158
+ }, domain));
2159
+ }
2160
+ function domainFrom(defaults) {
2161
+ if (!defaults.escrowContract) {
2162
+ throw new Error("sender_auth: Solana source requires escrowContract (escrow program id) for the deposit-hash domain");
2163
+ }
2164
+ if (!defaults.svmSignatureClusterId || defaults.svmSignatureDomainVersion == null) {
2165
+ throw new Error("sender_auth: Solana source requires svmSignatureClusterId and svmSignatureDomainVersion (V3 escrow domain separation)");
2166
+ }
2167
+ return {
2168
+ clusterId: (0, chain_id_js_1.clusterIdFromName)(defaults.svmSignatureClusterId),
2169
+ signatureDomainVersion: defaults.svmSignatureDomainVersion,
2170
+ programId: solana_escrow_encoding_1.Pubkey.fromBase58(defaults.escrowContract)
2171
+ };
2172
+ }
2173
+ exports2.solanaAdapter = {
2174
+ async buildAuthMessage({ sourceAsset, depositor, maxSourceAmount, requestId, sourceDefaults, nonce, solanaClockReader }) {
2175
+ if (!requestId) {
2176
+ throw new Error("sender_auth: request_id is required");
2177
+ }
2178
+ const sourceChainId = sourceAsset.split("/")[0];
2179
+ const tokenMint = sourceAsset.split("/")[1].split(":")[1];
2180
+ const depositNonce = nonce !== void 0 ? BigInt(nonce) : (0, solana_escrow_encoding_1.generateNonce)();
2181
+ if (nonce !== void 0) {
2182
+ if (depositNonce < 0n || depositNonce >= 1n << 64n) {
2183
+ throw new Error("sender_auth: Solana nonce must fit an unsigned 64-bit integer (0 <= nonce < 2^64)");
2184
+ }
2185
+ if ((depositNonce & 0xffn) >= utils_js_1.SOLANA_REPLAY_SLOTS) {
2186
+ 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`);
2187
+ }
2188
+ }
2189
+ const issuedAt = solanaClockReader ? await solanaClockReader(sourceChainId) : BigInt(Math.floor(Date.now() / 1e3));
2190
+ const deadline = issuedAt + BigInt(utils_js_1.REPLAY_HORIZON_SECS - 8);
2191
+ const paymentId = generateSolanaPaymentIdV3(requestId);
2192
+ const prehash = {
2193
+ payment_id: paymentId,
2194
+ depositor,
2195
+ mint: tokenMint,
2196
+ amount: BigInt(maxSourceAmount).toString(),
2197
+ reserver: sourceDefaults.quoteSelector,
2198
+ releaser: sourceDefaults.fulfillmentVerifierAccount,
2199
+ nonce: depositNonce.toString(),
2200
+ issued_at: issuedAt.toString(),
2201
+ deadline: deadline.toString()
2202
+ };
2203
+ const depositHash = hashDeposit(prehash, domainFrom(sourceDefaults));
2204
+ return { messageScheme: "SOLANA", messageHash: depositHash, messagePrehash: JSON.stringify(prehash) };
2205
+ },
2206
+ async sign(signedMessage, privateKey) {
2207
+ const messageBytes = (0, ethers_1.getBytes)(signedMessage.message);
2208
+ const secretKey = secretKeyFromPrivate2(privateKey);
2209
+ const sig = tweetnacl_1.default.sign.detached(messageBytes, secretKey);
2210
+ return "0x" + Buffer.from(sig).toString("hex");
2211
+ },
2212
+ deriveDelegateSigner(privateKey) {
2213
+ return bs58_1.default.encode(tweetnacl_1.default.sign.keyPair.fromSecretKey(secretKeyFromPrivate2(privateKey)).publicKey);
2214
+ },
2215
+ recoverSigner(signed, source) {
2216
+ const provided = signed.payload?.delegate_signer;
2217
+ if (provided !== void 0 && provided !== source.account) {
2218
+ throw new errors_js_1.SignerMismatchError(`sender_auth: delegate_signer ${provided} != source.account`);
2219
+ }
2220
+ const signer = provided ?? source.account;
2221
+ let pub;
2222
+ let msg;
2223
+ let sig;
2224
+ try {
2225
+ pub = bs58_1.default.decode(signer);
2226
+ msg = (0, ethers_1.getBytes)(signed.message);
2227
+ sig = (0, ethers_1.getBytes)(signed.signature);
2228
+ } catch {
2229
+ throw new errors_js_1.RecoveryFailedError("sender_auth: malformed Solana pubkey/message/signature encoding");
2230
+ }
2231
+ if (pub.length !== 32 || msg.length !== 32 || sig.length !== 64) {
2232
+ throw new errors_js_1.RecoveryFailedError("sender_auth: Solana pubkey must be 32 bytes, message 32, signature 64");
2233
+ }
2234
+ let ok = false;
2235
+ try {
2236
+ ok = tweetnacl_1.default.sign.detached.verify(msg, sig, pub);
2237
+ } catch {
2238
+ ok = false;
2239
+ }
2240
+ if (!ok) {
2241
+ throw new errors_js_1.SignerMismatchError("sender_auth: ed25519 verification failed");
2242
+ }
2243
+ return source.account;
2244
+ },
2245
+ recoverAndVerify(signed, source, expected) {
2246
+ let prehash;
2247
+ let canonicalHash;
2248
+ try {
2249
+ prehash = JSON.parse(signed.message_prehash);
2250
+ canonicalHash = hashDeposit(prehash, domainFrom(expected));
2251
+ } catch {
2252
+ throw new errors_js_1.MalformedPrehashError();
2253
+ }
2254
+ if (canonicalHash.toLowerCase() !== signed.message.toLowerCase()) {
2255
+ throw new Error("sender_auth: deposit hash does not match the signed message");
2256
+ }
2257
+ const delegateSigner = signed.payload?.delegate_signer;
2258
+ if (!delegateSigner) {
2259
+ throw new Error("sender_auth: Solana credential is missing delegate_signer");
2260
+ }
2261
+ let verified = false;
2262
+ try {
2263
+ verified = tweetnacl_1.default.sign.detached.verify((0, ethers_1.getBytes)(signed.message), (0, ethers_1.getBytes)(signed.signature), bs58_1.default.decode(delegateSigner));
2264
+ } catch {
2265
+ verified = false;
2266
+ }
2267
+ if (!verified || delegateSigner !== source.account || prehash.depositor !== source.account) {
2268
+ throw new Error("sender_auth: deposit signature does not recover to source.account");
2269
+ }
2270
+ const deadlineSec = Number(prehash.deadline);
2271
+ (0, utils_js_1.assertToken)(prehash.mint, source.asset, idAddr);
2272
+ (0, utils_js_1.assertAmountMatches)(prehash.amount, expected.maxSourceAmount);
2273
+ (0, utils_js_1.assertRolePairComplete)(expected.reserver, expected.releaser);
2274
+ if (expected.reserver !== void 0 && expected.releaser !== void 0) {
2275
+ (0, utils_js_1.assertWitnessRoles)(prehash.reserver, prehash.releaser, expected.reserver, expected.releaser, idAddr);
2276
+ }
2277
+ return {
2278
+ amount: prehash.amount,
2279
+ deadlineSec,
2280
+ permit: {
2281
+ scheme: "SOLANA",
2282
+ token: prehash.mint,
2283
+ amount: prehash.amount,
2284
+ deadlineSec,
2285
+ reserver: prehash.reserver,
2286
+ releaser: prehash.releaser,
2287
+ depositor: prehash.depositor
2288
+ }
2289
+ };
2290
+ }
2291
+ };
2292
+ function secretKeyFromPrivate2(privateKey) {
2293
+ if (/^[0-9a-fA-F]{64}$/.test(privateKey)) {
2294
+ const seed = new Uint8Array(32);
2295
+ for (let i = 0; i < 32; i++) {
2296
+ seed[i] = parseInt(privateKey.substring(i * 2, i * 2 + 2), 16);
2297
+ }
2298
+ return tweetnacl_1.default.sign.keyPair.fromSeed(seed).secretKey;
2299
+ }
2300
+ const decoded = bs58_1.default.decode(privateKey);
2301
+ if (decoded.length === 64)
2302
+ return decoded;
2303
+ if (decoded.length === 32)
2304
+ return tweetnacl_1.default.sign.keyPair.fromSeed(decoded).secretKey;
2305
+ throw new Error(`Invalid Solana private key length: expected 32 or 64 bytes, got ${decoded.length}`);
2306
+ }
2307
+ }
2308
+ });
2309
+
2310
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/index.js
2311
+ var require_adapters = __commonJS({
2312
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/index.js"(exports2) {
2313
+ "use strict";
2314
+ Object.defineProperty(exports2, "__esModule", { value: true });
2315
+ exports2.getChainAdapter = getChainAdapter2;
2316
+ var chain_id_js_1 = require_chain_id2();
2317
+ var evm_js_1 = require_evm();
2318
+ var tron_js_1 = require_tron();
2319
+ var solana_js_1 = require_solana();
2320
+ var adapters2 = {
2321
+ eip155: evm_js_1.evmAdapter,
2322
+ tron: tron_js_1.tronAdapter,
2323
+ solana: solana_js_1.solanaAdapter
2324
+ };
2325
+ function getChainAdapter2(caip2) {
2326
+ const adapter = adapters2[(0, chain_id_js_1.namespaceOf)(caip2)];
2327
+ if (!adapter) {
2328
+ throw new Error(`sender_auth: unsupported source chain '${caip2}'`);
2329
+ }
2330
+ return adapter;
2331
+ }
2332
+ }
2333
+ });
2334
+
2335
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/verify.js
2336
+ var require_verify = __commonJS({
2337
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/verify.js"(exports2) {
2338
+ "use strict";
2339
+ Object.defineProperty(exports2, "__esModule", { value: true });
2340
+ exports2.verifyPaymentRequest = verifyPaymentRequest;
2341
+ var index_js_1 = require_adapters();
2342
+ function parseSourceAsset(assetIdentifier) {
2343
+ const parts = assetIdentifier.split("/");
2344
+ const nsParts = parts[1]?.split(":");
2345
+ if (parts.length < 2 || !nsParts || nsParts.length < 2 || !nsParts[1]) {
2346
+ throw new Error(`sender_auth: invalid source asset "${assetIdentifier}"`);
2347
+ }
2348
+ return { network: parts[0], asset: nsParts[1] };
2349
+ }
2350
+ function verifyPaymentRequest(request2, expected = {}) {
2351
+ const senderAuth = request2.sender_auth;
2352
+ if (!senderAuth?.signed_messages?.length) {
2353
+ throw new Error("sender_auth: request has no signed_messages to verify");
2354
+ }
2355
+ if (!request2.source) {
2356
+ throw new Error("sender_auth: request has no source");
2357
+ }
2358
+ const requestSource = parseSourceAsset(request2.source.asset_identifier);
2359
+ const { sourceAsset, network: networkOverride, maxSourceAmount: amountOverride, ...scheme } = expected;
2360
+ const network = networkOverride ?? requestSource.network;
2361
+ const asset = sourceAsset ?? requestSource.asset;
2362
+ const maxSourceAmount = amountOverride ?? request2.max_source_amount ?? "0";
2363
+ const source = { network, asset, account: request2.source.account };
2364
+ const perMessage = { ...scheme, maxSourceAmount };
2365
+ const adapter = (0, index_js_1.getChainAdapter)(network);
2366
+ const results = senderAuth.signed_messages.map((m) => adapter.recoverAndVerify(m, source, perMessage));
2367
+ return { results, recoveredAccount: source.account };
2368
+ }
2369
+ }
2370
+ });
2371
+
2372
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/signer.js
2373
+ var require_signer = __commonJS({
2374
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/signer.js"(exports2) {
2375
+ "use strict";
2376
+ Object.defineProperty(exports2, "__esModule", { value: true });
2377
+ exports2.localKeySigner = localKeySigner2;
2378
+ var index_js_1 = require_adapters();
2379
+ function localKeySigner2(network, privateKey) {
2380
+ const adapter = (0, index_js_1.getChainAdapter)(network);
2381
+ return {
2382
+ async sign(signedMessage) {
2383
+ const signature = await adapter.sign(signedMessage, privateKey);
2384
+ const delegateSigner = adapter.deriveDelegateSigner?.(privateKey);
2385
+ return delegateSigner !== void 0 ? { signature, delegateSigner } : { signature };
2386
+ }
2387
+ };
2388
+ }
2389
+ }
2390
+ });
2391
+
2392
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/index.js
2393
+ var require_dist4 = __commonJS({
2394
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/index.js"(exports2) {
2395
+ "use strict";
2396
+ var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
2397
+ if (k2 === void 0) k2 = k;
2398
+ var desc = Object.getOwnPropertyDescriptor(m, k);
2399
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
2400
+ desc = { enumerable: true, get: function() {
2401
+ return m[k];
2402
+ } };
2403
+ }
2404
+ Object.defineProperty(o, k2, desc);
2405
+ }) : (function(o, m, k, k2) {
2406
+ if (k2 === void 0) k2 = k;
2407
+ o[k2] = m[k];
2408
+ }));
2409
+ var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) {
2410
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);
2411
+ };
2412
+ Object.defineProperty(exports2, "__esModule", { value: true });
2413
+ exports2.localKeySigner = exports2.SignerMismatchError = exports2.RecoveryFailedError = exports2.MalformedPrehashError = exports2.verifyPaymentRequest = exports2.getChainAdapter = void 0;
2414
+ __exportStar(require_types(), exports2);
2415
+ __exportStar(require_utils(), exports2);
2416
+ __exportStar(require_chain_id2(), exports2);
2417
+ var index_js_1 = require_adapters();
2418
+ Object.defineProperty(exports2, "getChainAdapter", { enumerable: true, get: function() {
2419
+ return index_js_1.getChainAdapter;
2420
+ } });
2421
+ var verify_js_1 = require_verify();
2422
+ Object.defineProperty(exports2, "verifyPaymentRequest", { enumerable: true, get: function() {
2423
+ return verify_js_1.verifyPaymentRequest;
1682
2424
  } });
1683
- var refund_encoder_1 = require_refund_encoder();
1684
- Object.defineProperty(exports2, "computeRefundHash", { enumerable: true, get: function() {
1685
- return refund_encoder_1.computeRefundHash;
2425
+ var errors_js_1 = require_errors();
2426
+ Object.defineProperty(exports2, "MalformedPrehashError", { enumerable: true, get: function() {
2427
+ return errors_js_1.MalformedPrehashError;
1686
2428
  } });
1687
- var nonce_generator_1 = require_nonce_generator2();
1688
- Object.defineProperty(exports2, "generateNonce", { enumerable: true, get: function() {
1689
- return nonce_generator_1.generateNonce;
2429
+ Object.defineProperty(exports2, "RecoveryFailedError", { enumerable: true, get: function() {
2430
+ return errors_js_1.RecoveryFailedError;
1690
2431
  } });
1691
- Object.defineProperty(exports2, "REPLAY_SLOTS", { enumerable: true, get: function() {
1692
- return nonce_generator_1.REPLAY_SLOTS;
2432
+ Object.defineProperty(exports2, "SignerMismatchError", { enumerable: true, get: function() {
2433
+ return errors_js_1.SignerMismatchError;
1693
2434
  } });
1694
- Object.defineProperty(exports2, "MAX_VALID_SLOT", { enumerable: true, get: function() {
1695
- return nonce_generator_1.MAX_VALID_SLOT;
2435
+ var signer_js_1 = require_signer();
2436
+ Object.defineProperty(exports2, "localKeySigner", { enumerable: true, get: function() {
2437
+ return signer_js_1.localKeySigner;
1696
2438
  } });
1697
2439
  }
1698
2440
  });
1699
2441
 
1700
2442
  // ../key-management/common/typescript/dist/errors.js
1701
- var require_errors2 = __commonJS({
2443
+ var require_errors3 = __commonJS({
1702
2444
  "../key-management/common/typescript/dist/errors.js"(exports2) {
1703
2445
  "use strict";
1704
2446
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -1762,7 +2504,7 @@ var require_errors2 = __commonJS({
1762
2504
  });
1763
2505
 
1764
2506
  // ../key-management/common/typescript/dist/types.js
1765
- var require_types = __commonJS({
2507
+ var require_types2 = __commonJS({
1766
2508
  "../key-management/common/typescript/dist/types.js"(exports2) {
1767
2509
  "use strict";
1768
2510
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -1794,7 +2536,7 @@ var require_policy = __commonJS({
1794
2536
  });
1795
2537
 
1796
2538
  // ../key-management/common/typescript/dist/index.js
1797
- var require_dist4 = __commonJS({
2539
+ var require_dist5 = __commonJS({
1798
2540
  "../key-management/common/typescript/dist/index.js"(exports2) {
1799
2541
  "use strict";
1800
2542
  var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
@@ -1814,8 +2556,8 @@ var require_dist4 = __commonJS({
1814
2556
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);
1815
2557
  };
1816
2558
  Object.defineProperty(exports2, "__esModule", { value: true });
1817
- __exportStar(require_errors2(), exports2);
1818
- __exportStar(require_types(), exports2);
2559
+ __exportStar(require_errors3(), exports2);
2560
+ __exportStar(require_types2(), exports2);
1819
2561
  __exportStar(require_policy(), exports2);
1820
2562
  }
1821
2563
  });
@@ -1936,7 +2678,7 @@ var require_client = __commonJS({
1936
2678
  Object.defineProperty(exports2, "__esModule", { value: true });
1937
2679
  exports2.TurnkeyClient = void 0;
1938
2680
  var promises_1 = require("timers/promises");
1939
- var km_core_1 = require_dist4();
2681
+ var km_core_1 = require_dist5();
1940
2682
  var constants_1 = require_constants();
1941
2683
  var logger_1 = require_logger();
1942
2684
  var meter_1 = require_meter();
@@ -2297,7 +3039,7 @@ var require_signer_base = __commonJS({
2297
3039
  Object.defineProperty(exports2, "__esModule", { value: true });
2298
3040
  exports2.resolveTurnkeyAccountAddress = resolveTurnkeyAccountAddress;
2299
3041
  var promises_1 = require("timers/promises");
2300
- var km_core_1 = require_dist4();
3042
+ var km_core_1 = require_dist5();
2301
3043
  var constants_1 = require_constants();
2302
3044
  var DISCOVERY_BACKOFF_MS = constants_1.TURNKEY_RETRY_BACKOFF_MS;
2303
3045
  async function resolveTurnkeyAccountAddress(deps, addressFormat) {
@@ -2355,7 +3097,7 @@ var require_secp256k1_helpers = __commonJS({
2355
3097
  exports2.signSecp256k1PreimageAndVerify = signSecp256k1PreimageAndVerify;
2356
3098
  exports2.bytesFromHexOrBytes = bytesFromHexOrBytes;
2357
3099
  var ethers_1 = require("ethers");
2358
- var km_core_1 = require_dist4();
3100
+ var km_core_1 = require_dist5();
2359
3101
  async function signSecp256k1PreimageAndVerify(client, signWith, preimage, expectedEvmAddrLower) {
2360
3102
  const preimageHex = (0, ethers_1.hexlify)(preimage).slice(2);
2361
3103
  const { r, s, v } = await client.signRawPayload({
@@ -2388,13 +3130,13 @@ var require_secp256k1_helpers = __commonJS({
2388
3130
  });
2389
3131
 
2390
3132
  // ../key-management/providers/turnkey/typescript/dist/chains/evm.js
2391
- var require_evm = __commonJS({
3133
+ var require_evm2 = __commonJS({
2392
3134
  "../key-management/providers/turnkey/typescript/dist/chains/evm.js"(exports2) {
2393
3135
  "use strict";
2394
3136
  Object.defineProperty(exports2, "__esModule", { value: true });
2395
3137
  exports2.TurnkeyEvmSigner = void 0;
2396
3138
  var ethers_1 = require("ethers");
2397
- var km_core_1 = require_dist4();
3139
+ var km_core_1 = require_dist5();
2398
3140
  var signer_base_1 = require_signer_base();
2399
3141
  var secp256k1_helpers_1 = require_secp256k1_helpers();
2400
3142
  var ADDRESS_FORMAT = "ADDRESS_FORMAT_ETHEREUM";
@@ -2511,7 +3253,7 @@ ${msgBytes.length}`);
2511
3253
  });
2512
3254
 
2513
3255
  // ../key-management/providers/turnkey/typescript/dist/chains/solana.js
2514
- var require_solana = __commonJS({
3256
+ var require_solana2 = __commonJS({
2515
3257
  "../key-management/providers/turnkey/typescript/dist/chains/solana.js"(exports2) {
2516
3258
  "use strict";
2517
3259
  var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
@@ -2558,7 +3300,7 @@ var require_solana = __commonJS({
2558
3300
  exports2.TurnkeySolanaSigner = void 0;
2559
3301
  var web3_js_1 = require("@solana/web3.js");
2560
3302
  var bs58_1 = __importDefault(require("bs58"));
2561
- var km_core_1 = require_dist4();
3303
+ var km_core_1 = require_dist5();
2562
3304
  var signer_base_1 = require_signer_base();
2563
3305
  var ADDRESS_FORMAT = "ADDRESS_FORMAT_SOLANA";
2564
3306
  var TurnkeySolanaSigner2 = class {
@@ -2643,7 +3385,7 @@ var require_solana = __commonJS({
2643
3385
  });
2644
3386
 
2645
3387
  // ../key-management/providers/turnkey/typescript/dist/chains/tron.js
2646
- var require_tron = __commonJS({
3388
+ var require_tron2 = __commonJS({
2647
3389
  "../key-management/providers/turnkey/typescript/dist/chains/tron.js"(exports2) {
2648
3390
  "use strict";
2649
3391
  var __importDefault = exports2 && exports2.__importDefault || function(mod) {
@@ -2655,7 +3397,7 @@ var require_tron = __commonJS({
2655
3397
  var bs58_1 = __importDefault(require("bs58"));
2656
3398
  var ethers_1 = require("ethers");
2657
3399
  var node_crypto_1 = require("crypto");
2658
- var km_core_1 = require_dist4();
3400
+ var km_core_1 = require_dist5();
2659
3401
  var signer_base_1 = require_signer_base();
2660
3402
  var secp256k1_helpers_1 = require_secp256k1_helpers();
2661
3403
  var ADDRESS_FORMAT = "ADDRESS_FORMAT_TRON";
@@ -2795,9 +3537,20 @@ var require_sub_organizations = __commonJS({
2795
3537
  exports2.listSubOrganizations = listSubOrganizations;
2796
3538
  exports2.deleteSubOrganization = deleteSubOrganization;
2797
3539
  async function createSubOrganization(client, input) {
3540
+ const rootUsers = input.rootUsers.map((u) => ({
3541
+ userName: u.userName,
3542
+ ...u.userEmail ? { userEmail: u.userEmail } : {},
3543
+ apiKeys: (u.apiKeys ?? []).map((k) => ({
3544
+ apiKeyName: k.apiKeyName,
3545
+ publicKey: k.publicKey,
3546
+ curveType: k.curveType ?? "API_KEY_CURVE_P256"
3547
+ })),
3548
+ authenticators: u.authenticators ?? [],
3549
+ oauthProviders: []
3550
+ }));
2798
3551
  const params = {
2799
3552
  subOrganizationName: input.subOrganizationName,
2800
- rootUsers: input.rootUsers,
3553
+ rootUsers,
2801
3554
  rootQuorumThreshold: input.rootQuorumThreshold,
2802
3555
  wallet: input.wallet ? {
2803
3556
  walletName: input.wallet.walletName,
@@ -2818,8 +3571,8 @@ var require_sub_organizations = __commonJS({
2818
3571
  const out = await client.query("/public/v1/query/list_suborgs");
2819
3572
  return (out.organizationIds ?? []).map((id) => ({ subOrganizationId: id }));
2820
3573
  }
2821
- async function deleteSubOrganization(client, subOrganizationId) {
2822
- await client.executeActivity("ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION", "delete_sub_organization", { subOrganizationId, deleteWithoutExport: true });
3574
+ async function deleteSubOrganization(client, opts = {}) {
3575
+ await client.executeActivity("ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION", "delete_sub_organization", { deleteWithoutExport: opts.deleteWithoutExport ?? false });
2823
3576
  }
2824
3577
  }
2825
3578
  });
@@ -3299,6 +4052,19 @@ var require_sender_policies = __commonJS({
3299
4052
  condition: `activity.type == 'ACTIVITY_TYPE_SIGN_TRANSACTION_V2' && solana.tx.instructions.all(i, i.program_key in [${list}])`,
3300
4053
  notes: "Sender Solana deposit txs invoke ComputeBudget + Ed25519Program + Atum escrow only."
3301
4054
  });
4055
+ const solCap = extras.solanaMaxNativeValue ?? "10000000";
4056
+ policies.push({
4057
+ policyName: `maxNativeValue (${chain.chainId})`,
4058
+ effect: "EFFECT_DENY",
4059
+ condition: `activity.type == 'ACTIVITY_TYPE_SIGN_TRANSACTION_V2' && solana.tx.transfers.any(t, t.amount > ${solCap})`,
4060
+ notes: "Caps native SOL (lamports); default 10,000,000 (0.01 SOL) ATA-rent headroom."
4061
+ });
4062
+ policies.push({
4063
+ policyName: `denySplTransfers (${chain.chainId})`,
4064
+ effect: "EFFECT_DENY",
4065
+ condition: `activity.type == 'ACTIVITY_TYPE_SIGN_TRANSACTION_V2' && solana.tx.spl_transfers.any(t, !(t.to in []))`,
4066
+ notes: "Denies all top-level SPL transfers; the sender moves tokens only via escrow CPI."
4067
+ });
3302
4068
  }
3303
4069
  }
3304
4070
  policies.push({
@@ -3419,7 +4185,7 @@ var require_extras_policies = __commonJS({
3419
4185
  validateAddressMap(obj.allowedTrc20Recipients, "allowedTrc20Recipients", TRON_ADDRESS, source);
3420
4186
  }
3421
4187
  if (obj.allowedSplRecipients != null) {
3422
- validateAddressMap(obj.allowedSplRecipients, "allowedSplRecipients", /^[1-9A-HJ-NP-Za-km-z]{32,44}$/, source);
4188
+ validateAddressMap(obj.allowedSplRecipients, "allowedSplRecipients", /^[1-9A-HJ-NP-Za-km-z]{32,44}$/, source, true);
3423
4189
  }
3424
4190
  if (obj.evmCaps != null) {
3425
4191
  validateCapMap(obj.evmCaps, "evmCaps", ["maxGasLimit", "maxFeePerGasWei"], source);
@@ -3450,12 +4216,12 @@ var require_extras_policies = __commonJS({
3450
4216
  }
3451
4217
  }
3452
4218
  }
3453
- function validateAddressMap(map, field, pattern, source) {
4219
+ function validateAddressMap(map, field, pattern, source, allowEmpty = false) {
3454
4220
  if (typeof map !== "object" || map == null || Array.isArray(map)) {
3455
4221
  throw new Error(`${source}: ${field} must be a map keyed by chain name.`);
3456
4222
  }
3457
4223
  for (const [chainKey, list] of Object.entries(map)) {
3458
- if (!Array.isArray(list) || list.length === 0) {
4224
+ if (!Array.isArray(list) || !allowEmpty && list.length === 0) {
3459
4225
  throw new Error(`${source}: ${field}.${chainKey} must be a non-empty list of addresses.`);
3460
4226
  }
3461
4227
  for (const addr of list) {
@@ -3530,6 +4296,10 @@ var require_extras_policies = __commonJS({
3530
4296
  const jobs = [];
3531
4297
  for (const [chainKey, recipients] of Object.entries(extras.allowedSplRecipients)) {
3532
4298
  const chainId = resolveChainId("allowedSplRecipients", chainKey, "solana:");
4299
+ if (recipients.length === 0) {
4300
+ out.push(buildSplRecipientPolicy(chainId, []));
4301
+ continue;
4302
+ }
3533
4303
  const mints = ctx.solanaMintsByChainKey[chainKey] ?? [];
3534
4304
  if (mints.length === 0) {
3535
4305
  throw new Error(`allowedSplRecipients.${chainKey} requires the Solana chain "${chainKey}" to expose at least one asset mint; got 0.`);
@@ -3597,7 +4367,7 @@ var require_extras_policies = __commonJS({
3597
4367
  policyName: `allowedSplRecipients (${chainId})`,
3598
4368
  effect: "EFFECT_DENY",
3599
4369
  condition: `activity.type == 'ACTIVITY_TYPE_SIGN_TRANSACTION_V2' && solana.tx.spl_transfers.any(t, !(t.to in [${list}]))`,
3600
- notes: "Denies any top-level SPL transfer to a destination ATA outside the allowlist."
4370
+ notes: allowedAtas.length === 0 ? "Denies ALL top-level SPL transfers (empty allowlist \u2014 no destination is permitted)." : "Denies any top-level SPL transfer to a destination ATA outside the allowlist."
3601
4371
  };
3602
4372
  }
3603
4373
  }
@@ -3675,7 +4445,7 @@ var require_admin = __commonJS({
3675
4445
  });
3676
4446
 
3677
4447
  // ../key-management/providers/turnkey/typescript/dist/index.js
3678
- var require_dist5 = __commonJS({
4448
+ var require_dist6 = __commonJS({
3679
4449
  "../key-management/providers/turnkey/typescript/dist/index.js"(exports2) {
3680
4450
  "use strict";
3681
4451
  var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
@@ -3730,15 +4500,15 @@ var require_dist5 = __commonJS({
3730
4500
  Object.defineProperty(exports2, "noopMeter", { enumerable: true, get: function() {
3731
4501
  return meter_1.noopMeter;
3732
4502
  } });
3733
- var evm_1 = require_evm();
4503
+ var evm_1 = require_evm2();
3734
4504
  Object.defineProperty(exports2, "TurnkeyEvmSigner", { enumerable: true, get: function() {
3735
4505
  return evm_1.TurnkeyEvmSigner;
3736
4506
  } });
3737
- var solana_1 = require_solana();
4507
+ var solana_1 = require_solana2();
3738
4508
  Object.defineProperty(exports2, "TurnkeySolanaSigner", { enumerable: true, get: function() {
3739
4509
  return solana_1.TurnkeySolanaSigner;
3740
4510
  } });
3741
- var tron_1 = require_tron();
4511
+ var tron_1 = require_tron2();
3742
4512
  Object.defineProperty(exports2, "TurnkeyTronSigner", { enumerable: true, get: function() {
3743
4513
  return tron_1.TurnkeyTronSigner;
3744
4514
  } });
@@ -3853,7 +4623,7 @@ var import_turnkey_signer, TURNKEY_API_URL, DEFAULTS;
3853
4623
  var init_turnkey_impl = __esm({
3854
4624
  "src/signers/turnkey-impl.ts"() {
3855
4625
  "use strict";
3856
- import_turnkey_signer = __toESM(require_dist5());
4626
+ import_turnkey_signer = __toESM(require_dist6());
3857
4627
  TURNKEY_API_URL = "https://api.turnkey.com";
3858
4628
  DEFAULTS = {
3859
4629
  concurrencyLimit: 10,
@@ -3882,7 +4652,7 @@ var Interceptors = class {
3882
4652
  }
3883
4653
  };
3884
4654
  var OpenAPI = {
3885
- BASE: "https://api.atum.network",
4655
+ BASE: "https://payment-gw.production-mainnet.atum.xyz",
3886
4656
  CREDENTIALS: "include",
3887
4657
  ENCODE_PATH: void 0,
3888
4658
  HEADERS: void 0,
@@ -3899,8 +4669,8 @@ var OpenAPI = {
3899
4669
 
3900
4670
  // src/generated/core/BaseHttpRequest.ts
3901
4671
  var BaseHttpRequest = class {
3902
- constructor(config) {
3903
- this.config = config;
4672
+ constructor(config2) {
4673
+ this.config = config2;
3904
4674
  }
3905
4675
  };
3906
4676
 
@@ -4051,15 +4821,15 @@ var getQueryString = (params) => {
4051
4821
  Object.entries(params).forEach(([key, value]) => encodePair(key, value));
4052
4822
  return qs.length ? `?${qs.join("&")}` : "";
4053
4823
  };
4054
- var getUrl = (config, options) => {
4055
- const encoder = config.ENCODE_PATH || encodeURI;
4056
- const path = options.url.replace("{api-version}", config.VERSION).replace(/{(.*?)}/g, (substring, group) => {
4824
+ var getUrl = (config2, options) => {
4825
+ const encoder = config2.ENCODE_PATH || encodeURI;
4826
+ const path = options.url.replace("{api-version}", config2.VERSION).replace(/{(.*?)}/g, (substring, group) => {
4057
4827
  if (options.path?.hasOwnProperty(group)) {
4058
4828
  return encoder(String(options.path[group]));
4059
4829
  }
4060
4830
  return substring;
4061
4831
  });
4062
- const url = config.BASE + path;
4832
+ const url = config2.BASE + path;
4063
4833
  return options.query ? url + getQueryString(options.query) : url;
4064
4834
  };
4065
4835
  var getFormData = (options) => {
@@ -4089,12 +4859,12 @@ var resolve = async (options, resolver) => {
4089
4859
  }
4090
4860
  return resolver;
4091
4861
  };
4092
- var getHeaders = async (config, options) => {
4862
+ var getHeaders = async (config2, options) => {
4093
4863
  const [token, username, password, additionalHeaders] = await Promise.all([
4094
- resolve(options, config.TOKEN),
4095
- resolve(options, config.USERNAME),
4096
- resolve(options, config.PASSWORD),
4097
- resolve(options, config.HEADERS)
4864
+ resolve(options, config2.TOKEN),
4865
+ resolve(options, config2.USERNAME),
4866
+ resolve(options, config2.PASSWORD),
4867
+ resolve(options, config2.HEADERS)
4098
4868
  ]);
4099
4869
  const headers = Object.entries({
4100
4870
  Accept: "application/json",
@@ -4134,7 +4904,7 @@ var getRequestBody = (options) => {
4134
4904
  }
4135
4905
  return void 0;
4136
4906
  };
4137
- var sendRequest = async (config, options, url, body, formData, headers, onCancel, axiosClient) => {
4907
+ var sendRequest = async (config2, options, url, body, formData, headers, onCancel, axiosClient) => {
4138
4908
  const controller = new AbortController();
4139
4909
  let requestConfig = {
4140
4910
  data: body ?? formData,
@@ -4142,10 +4912,10 @@ var sendRequest = async (config, options, url, body, formData, headers, onCancel
4142
4912
  method: options.method,
4143
4913
  signal: controller.signal,
4144
4914
  url,
4145
- withCredentials: config.WITH_CREDENTIALS
4915
+ withCredentials: config2.WITH_CREDENTIALS
4146
4916
  };
4147
4917
  onCancel(() => controller.abort());
4148
- for (const fn of config.interceptors.request._fns) {
4918
+ for (const fn of config2.interceptors.request._fns) {
4149
4919
  requestConfig = await fn(requestConfig);
4150
4920
  }
4151
4921
  try {
@@ -4238,16 +5008,16 @@ var catchErrorCodes = (options, result) => {
4238
5008
  );
4239
5009
  }
4240
5010
  };
4241
- var request = (config, options, axiosClient = import_axios.default) => {
5011
+ var request = (config2, options, axiosClient = import_axios.default) => {
4242
5012
  return new CancelablePromise(async (resolve2, reject, onCancel) => {
4243
5013
  try {
4244
- const url = getUrl(config, options);
5014
+ const url = getUrl(config2, options);
4245
5015
  const formData = getFormData(options);
4246
5016
  const body = getRequestBody(options);
4247
- const headers = await getHeaders(config, options);
5017
+ const headers = await getHeaders(config2, options);
4248
5018
  if (!onCancel.isCancelled) {
4249
- let response = await sendRequest(config, options, url, body, formData, headers, onCancel, axiosClient);
4250
- for (const fn of config.interceptors.response._fns) {
5019
+ let response = await sendRequest(config2, options, url, body, formData, headers, onCancel, axiosClient);
5020
+ for (const fn of config2.interceptors.response._fns) {
4251
5021
  response = await fn(response);
4252
5022
  }
4253
5023
  const responseBody = getResponseBody(response);
@@ -4270,8 +5040,8 @@ var request = (config, options, axiosClient = import_axios.default) => {
4270
5040
 
4271
5041
  // src/generated/core/AxiosHttpRequest.ts
4272
5042
  var AxiosHttpRequest = class extends BaseHttpRequest {
4273
- constructor(config) {
4274
- super(config);
5043
+ constructor(config2) {
5044
+ super(config2);
4275
5045
  }
4276
5046
  /**
4277
5047
  * Request method
@@ -4314,7 +5084,11 @@ var PaymentsService = class {
4314
5084
  mediaType: "application/json",
4315
5085
  errors: {
4316
5086
  400: "Invalid request",
4317
- 500: "Internal server error"
5087
+ 401: "Signature or sender authorization could not be verified",
5088
+ 403: "Payment declined during counterparty authorization",
5089
+ 413: "Payment request too large to process",
5090
+ 500: "Internal server error",
5091
+ 503: "A dependency is temporarily unavailable"
4318
5092
  }
4319
5093
  });
4320
5094
  }
@@ -4447,6 +5221,7 @@ var AuthorizationsService = class {
4447
5221
  errors: {
4448
5222
  400: "Invalid payment request",
4449
5223
  404: "Counterparty not found (no registration for the resolved DID)",
5224
+ 500: "Internal server error",
4450
5225
  502: "Counterparty webhook error (HTTP error or connection failure)",
4451
5226
  504: "Authorization timed out (counterparty did not respond)"
4452
5227
  }
@@ -4598,20 +5373,20 @@ var HealthService = class {
4598
5373
 
4599
5374
  // src/generated/PaymentGatewayClient.ts
4600
5375
  var PaymentGatewayClient = class {
4601
- constructor(config, HttpRequest = AxiosHttpRequest) {
5376
+ constructor(config2, HttpRequest = AxiosHttpRequest) {
4602
5377
  this.request = new HttpRequest({
4603
- BASE: config?.BASE ?? "https://api.atum.network",
4604
- VERSION: config?.VERSION ?? "1.0.0",
4605
- WITH_CREDENTIALS: config?.WITH_CREDENTIALS ?? false,
4606
- CREDENTIALS: config?.CREDENTIALS ?? "include",
4607
- TOKEN: config?.TOKEN,
4608
- USERNAME: config?.USERNAME,
4609
- PASSWORD: config?.PASSWORD,
4610
- HEADERS: config?.HEADERS,
4611
- ENCODE_PATH: config?.ENCODE_PATH,
5378
+ BASE: config2?.BASE ?? "https://payment-gw.production-mainnet.atum.xyz",
5379
+ VERSION: config2?.VERSION ?? "1.0.0",
5380
+ WITH_CREDENTIALS: config2?.WITH_CREDENTIALS ?? false,
5381
+ CREDENTIALS: config2?.CREDENTIALS ?? "include",
5382
+ TOKEN: config2?.TOKEN,
5383
+ USERNAME: config2?.USERNAME,
5384
+ PASSWORD: config2?.PASSWORD,
5385
+ HEADERS: config2?.HEADERS,
5386
+ ENCODE_PATH: config2?.ENCODE_PATH,
4612
5387
  interceptors: {
4613
- request: config?.interceptors?.request ?? new Interceptors(),
4614
- response: config?.interceptors?.response ?? new Interceptors()
5388
+ request: config2?.interceptors?.request ?? new Interceptors(),
5389
+ response: config2?.interceptors?.response ?? new Interceptors()
4615
5390
  }
4616
5391
  });
4617
5392
  this.authorizations = new AuthorizationsService(this.request);
@@ -4622,57 +5397,18 @@ var PaymentGatewayClient = class {
4622
5397
  };
4623
5398
 
4624
5399
  // src/chain-adapters/evm.ts
4625
- var import_ethers2 = require("ethers");
5400
+ var import_ethers = require("ethers");
4626
5401
 
4627
5402
  // src/chain-adapters/types.ts
4628
- var PERMIT_DEADLINE = BigInt(1924991999);
4629
- function resolvePermitDeadline(deadlineSeconds) {
4630
- if (deadlineSeconds !== void 0) {
4631
- return BigInt(Math.floor(Date.now() / 1e3) + deadlineSeconds);
4632
- }
4633
- return PERMIT_DEADLINE;
4634
- }
4635
- function generatePermitNonce() {
4636
- const rand = new Uint32Array(1);
4637
- globalThis.crypto.getRandomValues(rand);
4638
- return (BigInt(Date.now()) << 32n) + BigInt(rand[0]);
4639
- }
4640
5403
  function assertKeyMatchesSender(matches, sender, derived) {
4641
5404
  if (!matches) {
4642
5405
  throw new Error(`The private key derives ${derived}, which does not match the sender address ${sender}`);
4643
5406
  }
4644
5407
  }
4645
5408
 
4646
- // src/sender_auth_schemes/evm_permit2.ts
4647
- var import_ethers = require("ethers");
4648
- var import_evm_escrow_encoding = __toESM(require_dist());
4649
-
4650
5409
  // src/chain-adapters/evm.ts
4651
5410
  var evmAdapter = {
4652
5411
  turnkeyAddressFormat: "ADDRESS_FORMAT_ETHEREUM",
4653
- async buildAuthMessage({ sourceAsset, fulfillmentAmount, sourceDefaults, deadlineSeconds }) {
4654
- const sourceChainId = sourceAsset.split("/")[0];
4655
- const chainIdNum = parseInt(sourceChainId.split(":")[1]);
4656
- const tokenAddress = sourceAsset.split("/")[1].split(":")[1];
4657
- const permitParams = {
4658
- chainId: chainIdNum,
4659
- verifyingContract: import_evm_escrow_encoding.PERMIT2_CONTRACT_ADDRESS,
4660
- token: tokenAddress,
4661
- amount: fulfillmentAmount,
4662
- spender: sourceDefaults.escrowContract,
4663
- nonce: generatePermitNonce(),
4664
- deadline: resolvePermitDeadline(deadlineSeconds),
4665
- reserver: sourceDefaults.quoteSelector,
4666
- releaser: sourceDefaults.fulfillmentVerifierAccount
4667
- };
4668
- const messagePrehash = (0, import_evm_escrow_encoding.createPermitWitnessTransferFromPrehash)(permitParams);
4669
- const messageHash = (0, import_evm_escrow_encoding.hashPermitWitnessTransferFrom)(messagePrehash);
4670
- return {
4671
- messageScheme: "EVM_PERMIT2",
4672
- messageHash,
4673
- messagePrehash: JSON.stringify(messagePrehash)
4674
- };
4675
- },
4676
5412
  formatPrivateKey(key) {
4677
5413
  return key.startsWith("0x") ? key : "0x" + key;
4678
5414
  },
@@ -4683,78 +5419,22 @@ var evmAdapter = {
4683
5419
  throw new Error("Invalid private key");
4684
5420
  }
4685
5421
  },
4686
- /**
4687
- * Sign the Permit2 PermitWitnessTransferFrom typed data via standard
4688
- * EIP-712 signing. The prehash is already shaped for direct consumption
4689
- * by ethers' signTypedData (Permit2 domain has no version/salt; types
4690
- * omits EIP712Domain since ethers generates that from the domain object).
4691
- */
4692
- async sign(signedMessage, privateKey) {
4693
- if (!signedMessage.message_prehash) {
4694
- throw new Error("EVM adapter sign(): signed_messages[i].message_prehash is required");
4695
- }
4696
- const prehash = JSON.parse(signedMessage.message_prehash);
4697
- const wallet = new import_ethers2.ethers.Wallet(privateKey);
4698
- return wallet.signTypedData(prehash.domain, prehash.types, prehash.message);
4699
- },
4700
5422
  // Called after validatePrivateKey, so ethers.Wallet won't echo a malformed key.
4701
5423
  verifyAddressMatchesKey(privateKey, address) {
4702
- const derived = new import_ethers2.ethers.Wallet(privateKey).address;
5424
+ const derived = new import_ethers.ethers.Wallet(privateKey).address;
4703
5425
  assertKeyMatchesSender(derived.toLowerCase() === address.toLowerCase(), address, derived);
4704
5426
  }
4705
5427
  };
4706
5428
 
4707
5429
  // src/chain-adapters/tron.ts
4708
- var import_ethers3 = require("ethers");
5430
+ var import_ethers2 = require("ethers");
4709
5431
 
4710
5432
  // src/sender_auth_schemes/tron.ts
4711
- var import_tvm_escrow_encoding = __toESM(require_dist2());
5433
+ var import_tvm_escrow_encoding = __toESM(require_dist());
4712
5434
 
4713
5435
  // src/chain-adapters/tron.ts
4714
- var CHAIN_ID_MAP = {
4715
- "shasta": 2494104990,
4716
- "mainnet": 728126428
4717
- };
4718
- var PERMIT2_FALLBACKS = {
4719
- "tron:shasta": "TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp",
4720
- "tron:mainnet": "TJhMXTHQHeQyMD7TcKQFqAePNgG4b31H9m"
4721
- };
4722
5436
  var tronAdapter = {
4723
5437
  turnkeyAddressFormat: "ADDRESS_FORMAT_TRON",
4724
- async buildAuthMessage({ sourceAsset, fulfillmentAmount, sourceDefaults, deadlineSeconds }) {
4725
- const sourceChainId = sourceAsset.split("/")[0];
4726
- const chainName = sourceChainId.split(":")[1];
4727
- const chainIdNum = CHAIN_ID_MAP[chainName];
4728
- if (!chainIdNum) {
4729
- throw new Error(`Unsupported Tron chain: ${chainName}`);
4730
- }
4731
- const tokenAddress = sourceAsset.split("/")[1].split(":")[1];
4732
- let permit2Address = sourceDefaults.permit2Contract;
4733
- if (permit2Address === void 0) {
4734
- permit2Address = PERMIT2_FALLBACKS[sourceChainId];
4735
- if (!permit2Address) {
4736
- throw new Error(`don't know Permit2 address for chain ${sourceChainId}`);
4737
- }
4738
- }
4739
- const tvmParams = {
4740
- chainId: chainIdNum,
4741
- permit2Address,
4742
- tokenAddress,
4743
- amount: fulfillmentAmount,
4744
- spenderAddress: sourceDefaults.escrowContract,
4745
- nonce: generatePermitNonce(),
4746
- deadline: resolvePermitDeadline(deadlineSeconds),
4747
- reserverAddress: sourceDefaults.quoteSelector,
4748
- releaserAddress: sourceDefaults.fulfillmentVerifierAccount
4749
- };
4750
- const messagePrehash = (0, import_tvm_escrow_encoding.createTvmPermitWitnessTransferFromPrehash)(tvmParams);
4751
- const messageHash = (0, import_tvm_escrow_encoding.hashTvmPermitWitnessTransferFrom)(messagePrehash);
4752
- return {
4753
- messageScheme: "EVM_PERMIT2",
4754
- messageHash,
4755
- messagePrehash: JSON.stringify(messagePrehash)
4756
- };
4757
- },
4758
5438
  resolveContractOverrides(sourceDefaults) {
4759
5439
  return {
4760
5440
  quote_selector: (0, import_tvm_escrow_encoding.normalizeAddress)(sourceDefaults.quoteSelector),
@@ -4774,89 +5454,62 @@ var tronAdapter = {
4774
5454
  throw new Error("Invalid private key");
4775
5455
  }
4776
5456
  },
4777
- /**
4778
- * Tron uses TIP-712 typed-data — same wire format as EIP-712. The prehash
4779
- * built by createTvmPermitWitnessTransferFromPrehash is now directly
4780
- * consumable by `wallet.signTypedData(prehash.domain, prehash.types,
4781
- * prehash.message)`, but this adapter (an internal SDK helper) stays on the
4782
- * raw-hash sign for parity with the EVM adapter — e2e tests use ethers
4783
- * directly when they need the typed-data path.
4784
- */
4785
- async sign(signedMessage, privateKey) {
4786
- const wallet = new import_ethers3.ethers.Wallet(privateKey.startsWith("0x") ? privateKey : "0x" + privateKey);
4787
- return wallet.signingKey.sign(signedMessage.message).serialized;
4788
- },
4789
5457
  // Tron addresses are the same secp256k1-derived 20 bytes as EVM. Compare the
4790
5458
  // derived hex directly against the canonical sender; do NOT run normalizeAddress
4791
5459
  // on the derived side — it strips a leading 41, which would corrupt an address
4792
5460
  // whose first byte is 0x41.
4793
5461
  verifyAddressMatchesKey(privateKey, address) {
4794
5462
  const key = privateKey.startsWith("0x") ? privateKey : "0x" + privateKey;
4795
- const derived = new import_ethers3.ethers.Wallet(key).address;
5463
+ const derived = new import_ethers2.ethers.Wallet(key).address;
4796
5464
  assertKeyMatchesSender(derived.toLowerCase() === (0, import_tvm_escrow_encoding.normalizeAddress)(address), address, derived);
4797
5465
  }
4798
5466
  };
4799
5467
 
4800
5468
  // src/chain-adapters/solana.ts
4801
5469
  var import_tweetnacl = __toESM(require("tweetnacl"));
4802
- var import_bs582 = __toESM(require("bs58"));
4803
- var import_solana_escrow_encoding2 = __toESM(require_dist3());
4804
-
4805
- // src/sender_auth_schemes/solana.ts
4806
- var import_ethers4 = require("ethers");
4807
5470
  var import_bs58 = __toESM(require("bs58"));
4808
- var import_solana_escrow_encoding = __toESM(require_dist3());
4809
- var REPLAY_HORIZON_SECS = 128;
4810
- function bytesToHex(bytes) {
4811
- return (0, import_ethers4.hexlify)(bytes);
4812
- }
4813
- function hexToBytes(hex) {
4814
- return (0, import_ethers4.getBytes)(hex.startsWith("0x") ? hex : "0x" + hex);
4815
- }
4816
- function createSolanaDepositPrehash(paymentId, params) {
4817
- return {
4818
- payment_id: paymentId,
4819
- depositor: params.depositor,
4820
- mint: params.mint,
4821
- amount: params.amount.toString(),
4822
- reserver: params.reserver,
4823
- releaser: params.releaser,
4824
- nonce: params.nonce.toString(),
4825
- issued_at: params.issuedAt.toString(),
4826
- deadline: params.deadline.toString()
4827
- };
4828
- }
4829
- function generateSolanaNonce() {
4830
- return (0, import_solana_escrow_encoding.generateNonce)();
4831
- }
4832
- function clusterIdFromName(name) {
4833
- const encoded = new TextEncoder().encode(name);
4834
- if (encoded.length > 32) {
4835
- throw new Error(`cluster name too long for cluster_id: ${name} (${encoded.length} > 32 bytes)`);
4836
- }
4837
- const out = new Uint8Array(32);
4838
- out.set(encoded);
4839
- return out;
5471
+ var solanaAdapter = {
5472
+ turnkeyAddressFormat: "ADDRESS_FORMAT_SOLANA",
5473
+ formatPrivateKey(key) {
5474
+ return key.startsWith("0x") ? key.slice(2) : key;
5475
+ },
5476
+ verifyAddressMatchesKey(privateKey, address) {
5477
+ const derived = deriveSolanaAddress(privateKey);
5478
+ assertKeyMatchesSender(derived === address, address, derived);
5479
+ }
5480
+ };
5481
+ function deriveSolanaAddress(privateKey) {
5482
+ return import_bs58.default.encode(import_tweetnacl.default.sign.keyPair.fromSecretKey(secretKeyFromPrivate(privateKey)).publicKey);
4840
5483
  }
4841
- function generateSolanaPaymentIdV3(requestId) {
4842
- return (0, import_ethers4.keccak256)((0, import_ethers4.toUtf8Bytes)(requestId));
5484
+ function secretKeyFromPrivate(privateKey) {
5485
+ if (/^[0-9a-fA-F]{64}$/.test(privateKey)) {
5486
+ const seed = new Uint8Array(32);
5487
+ for (let i = 0; i < 32; i++) {
5488
+ seed[i] = parseInt(privateKey.substring(i * 2, i * 2 + 2), 16);
5489
+ }
5490
+ return import_tweetnacl.default.sign.keyPair.fromSeed(seed).secretKey;
5491
+ }
5492
+ const decoded = import_bs58.default.decode(privateKey);
5493
+ if (decoded.length === 64) {
5494
+ return decoded;
5495
+ }
5496
+ if (decoded.length === 32) {
5497
+ return import_tweetnacl.default.sign.keyPair.fromSeed(decoded).secretKey;
5498
+ }
5499
+ throw new Error(`Invalid Solana private key length: expected 32 or 64 bytes, got ${decoded.length}`);
4843
5500
  }
4844
- function hashSolanaDepositV3(prehash, domain) {
4845
- const hash = (0, import_solana_escrow_encoding.computeDepositHash)(
4846
- {
4847
- paymentId: hexToBytes(prehash.payment_id),
4848
- depositor: import_solana_escrow_encoding.Pubkey.fromBase58(prehash.depositor),
4849
- mint: import_solana_escrow_encoding.Pubkey.fromBase58(prehash.mint),
4850
- amount: BigInt(prehash.amount),
4851
- reserver: import_solana_escrow_encoding.Pubkey.fromBase58(prehash.reserver),
4852
- releaser: import_solana_escrow_encoding.Pubkey.fromBase58(prehash.releaser),
4853
- nonce: BigInt(prehash.nonce),
4854
- issuedAt: BigInt(prehash.issued_at),
4855
- deadline: BigInt(prehash.deadline)
4856
- },
4857
- domain
4858
- );
4859
- return bytesToHex(hash);
5501
+
5502
+ // src/chain-adapters/index.ts
5503
+ var adapters = {
5504
+ "eip155": evmAdapter,
5505
+ "tron": tronAdapter,
5506
+ "solana": solanaAdapter
5507
+ };
5508
+ function getChainAdapter(sourceChainId) {
5509
+ const prefix = sourceChainId.split(":")[0];
5510
+ const adapter = adapters[prefix];
5511
+ if (!adapter) throw new Error(`Unsupported source chain: ${sourceChainId}`);
5512
+ return adapter;
4860
5513
  }
4861
5514
 
4862
5515
  // src/chain-adapters/solana-clock.ts
@@ -4926,126 +5579,28 @@ async function resolveSolanaIssuedAt(opts) {
4926
5579
  return BigInt(Math.floor(Date.now() / 1e3)) - SOLANA_ISSUED_AT_FALLBACK_SKEW_SECS;
4927
5580
  }
4928
5581
 
4929
- // src/chain-adapters/solana.ts
4930
- var solanaAdapter = {
4931
- turnkeyAddressFormat: "ADDRESS_FORMAT_SOLANA",
4932
- async buildAuthMessage({ sourceAsset, depositor, fulfillmentAmount, requestId, sourceDefaults, solanaRpcUrl, solanaClockReader, solanaLogger }) {
4933
- const sourceChainId = sourceAsset.split("/")[0];
4934
- const tokenMint = sourceAsset.split("/")[1].split(":")[1];
4935
- const nonce = generateSolanaNonce();
4936
- const issuedAt = await resolveSolanaIssuedAt({
4937
- sourceChainId,
4938
- rpcUrlOverride: solanaRpcUrl,
4939
- reader: solanaClockReader,
4940
- logger: solanaLogger
4941
- });
4942
- const deadline = issuedAt + BigInt(REPLAY_HORIZON_SECS - 8);
4943
- const solanaParams = {
4944
- depositor,
4945
- mint: tokenMint,
4946
- amount: BigInt(fulfillmentAmount),
4947
- reserver: sourceDefaults.quoteSelector,
4948
- releaser: sourceDefaults.fulfillmentVerifierAccount,
4949
- nonce,
4950
- issuedAt,
4951
- deadline,
4952
- requestId
4953
- };
4954
- const paymentId = generateSolanaPaymentIdV3(requestId);
4955
- const prehash = createSolanaDepositPrehash(paymentId, solanaParams);
4956
- if (!sourceDefaults.svmSignatureClusterId || sourceDefaults.svmSignatureDomainVersion == null) {
4957
- throw new Error(
4958
- "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?"
4959
- );
4960
- }
4961
- const domain = {
4962
- clusterId: clusterIdFromName(sourceDefaults.svmSignatureClusterId),
4963
- signatureDomainVersion: sourceDefaults.svmSignatureDomainVersion,
4964
- programId: import_solana_escrow_encoding2.Pubkey.fromBase58(sourceDefaults.escrowContract)
4965
- };
4966
- const depositHash = hashSolanaDepositV3(prehash, domain);
4967
- return {
4968
- messageScheme: "SOLANA",
4969
- messageHash: depositHash,
4970
- messagePrehash: JSON.stringify(prehash)
4971
- };
4972
- },
4973
- formatPrivateKey(key) {
4974
- return key.startsWith("0x") ? key.slice(2) : key;
4975
- },
4976
- /**
4977
- * Solana has no EIP-712-style typed-data standard. The prehash structure
4978
- * still describes what was hashed (for debugging / wallet UX), but the
4979
- * canonical signing input is the chain-specific digest already in
4980
- * signedMessage.message. We sign that with ed25519.
4981
- */
4982
- async sign(signedMessage, privateKey) {
4983
- const messageBytes = new Uint8Array(Buffer.from(signedMessage.message.replace("0x", ""), "hex"));
4984
- const secretKey = secretKeyFromPrivate(privateKey);
4985
- const sig = import_tweetnacl.default.sign.detached(messageBytes, secretKey);
4986
- return "0x" + Buffer.from(sig).toString("hex");
4987
- },
4988
- /**
4989
- * Solana Ed25519 signatures are not public-key-recoverable (unlike EVM
4990
- * secp256k1, where ecrecover derives the signer from the signature). The
4991
- * on-chain Ed25519 verify instruction must therefore be given the signer's
4992
- * public key explicitly, so we ship it as signed_messages[0].payload.delegate_signer.
4993
- * In the self-custody CLI flow the signer is the depositor itself, so this
4994
- * equals source.account.
4995
- */
4996
- deriveDelegateSigner(privateKey) {
4997
- return deriveSolanaAddress(privateKey);
4998
- },
4999
- verifyAddressMatchesKey(privateKey, address) {
5000
- const derived = deriveSolanaAddress(privateKey);
5001
- assertKeyMatchesSender(derived === address, address, derived);
5002
- }
5003
- };
5004
- function deriveSolanaAddress(privateKey) {
5005
- return import_bs582.default.encode(import_tweetnacl.default.sign.keyPair.fromSecretKey(secretKeyFromPrivate(privateKey)).publicKey);
5006
- }
5007
- function secretKeyFromPrivate(privateKey) {
5008
- if (/^[0-9a-fA-F]{64}$/.test(privateKey)) {
5009
- const seed = new Uint8Array(32);
5010
- for (let i = 0; i < 32; i++) {
5011
- seed[i] = parseInt(privateKey.substring(i * 2, i * 2 + 2), 16);
5012
- }
5013
- return import_tweetnacl.default.sign.keyPair.fromSeed(seed).secretKey;
5014
- }
5015
- const decoded = import_bs582.default.decode(privateKey);
5016
- if (decoded.length === 64) {
5017
- return decoded;
5018
- }
5019
- if (decoded.length === 32) {
5020
- return import_tweetnacl.default.sign.keyPair.fromSeed(decoded).secretKey;
5021
- }
5022
- throw new Error(`Invalid Solana private key length: expected 32 or 64 bytes, got ${decoded.length}`);
5023
- }
5582
+ // src/index.ts
5583
+ var import_payment_request_sender_auth2 = __toESM(require_dist4());
5024
5584
 
5025
- // src/chain-adapters/index.ts
5026
- var adapters = {
5027
- "eip155": evmAdapter,
5028
- "tron": tronAdapter,
5029
- "solana": solanaAdapter
5030
- };
5031
- function getChainAdapter(sourceChainId) {
5032
- const prefix = sourceChainId.split(":")[0];
5033
- const adapter = adapters[prefix];
5034
- if (!adapter) throw new Error(`Unsupported source chain: ${sourceChainId}`);
5035
- return adapter;
5036
- }
5585
+ // src/sender_auth_schemes/evm_permit2.ts
5586
+ var import_ethers3 = require("ethers");
5587
+ var import_evm_escrow_encoding = __toESM(require_dist2());
5588
+
5589
+ // src/sender_auth_schemes/solana.ts
5590
+ var import_ethers4 = require("ethers");
5591
+ var import_bs582 = __toESM(require("bs58"));
5592
+ var import_solana_escrow_encoding = __toESM(require_dist3());
5037
5593
 
5038
5594
  // src/signers/raw.ts
5595
+ var import_payment_request_sender_auth = __toESM(require_dist4());
5039
5596
  var RawSenderSigner = class {
5040
- constructor(adapter, privateKey) {
5041
- this.adapter = adapter;
5042
- this.privateKey = privateKey;
5597
+ constructor(network, privateKey) {
5598
+ const adapter = getChainAdapter(network);
5043
5599
  adapter.validatePrivateKey?.(privateKey);
5600
+ this.inner = (0, import_payment_request_sender_auth.localKeySigner)(network, adapter.formatPrivateKey(privateKey));
5044
5601
  }
5045
- async sign(signedMessage) {
5046
- const signature = await this.adapter.sign(signedMessage, this.privateKey);
5047
- const delegateSigner = this.adapter.deriveDelegateSigner?.(this.privateKey);
5048
- return { signature, ...delegateSigner ? { delegateSigner } : {} };
5602
+ sign(signedMessage) {
5603
+ return this.inner.sign(signedMessage);
5049
5604
  }
5050
5605
  };
5051
5606
 
@@ -5086,19 +5641,20 @@ function createSenderSigner(sourceChainId, opts) {
5086
5641
  }
5087
5642
  const adapter = getChainAdapter(sourceChainId);
5088
5643
  const privateKey = adapter.formatPrivateKey(opts.privateKey);
5089
- const signer = new RawSenderSigner(adapter, privateKey);
5644
+ adapter.validatePrivateKey?.(opts.privateKey);
5090
5645
  if (opts.pinnedAddress) {
5091
5646
  if (!adapter.verifyAddressMatchesKey) {
5092
5647
  throw new Error(`pinnedAddress was provided but the ${sourceChainId} adapter cannot verify the key derives it`);
5093
5648
  }
5094
5649
  adapter.verifyAddressMatchesKey(privateKey, opts.pinnedAddress);
5095
5650
  }
5096
- return signer;
5651
+ return new RawSenderSigner(sourceChainId, opts.privateKey);
5097
5652
  }
5098
5653
 
5099
5654
  // src/index.ts
5100
5655
  var PAYMENT_REQUEST_VERSION = "1.0";
5101
- var defaultGateway = "https://payment-gateway-testnet.atumlabs.xyz";
5656
+ var defaultGateway = "https://payment-gw.production-testnet.atum.xyz";
5657
+ var OpenAPI2 = { ...OpenAPI, BASE: defaultGateway };
5102
5658
  var DEFAULT_QUOTE_DEADLINE_SECONDS = 5;
5103
5659
  var DEFAULT_FULFILLMENT_DEADLINE_SECONDS = 3600;
5104
5660
  var DEFAULT_PAYMENT_QUOTE_DEADLINE_SECONDS = 10;
@@ -5123,16 +5679,74 @@ function resolveDeadlines(params, defaultQuoteSeconds) {
5123
5679
  `quoteDeadlineSeconds (${quoteDeadlineSeconds}) must be strictly less than fulfillmentDeadlineSeconds (${fulfillmentDeadlineSeconds}). The gateway rejects a quote_deadline that is not before fulfillment_deadline.`
5124
5680
  );
5125
5681
  }
5126
- const now = Date.now();
5682
+ const now = (params.now ?? Date.now)();
5127
5683
  return {
5128
5684
  quote_deadline: new Date(now + quoteDeadlineSeconds * 1e3).toISOString(),
5129
5685
  fulfillment_deadline: new Date(now + fulfillmentDeadlineSeconds * 1e3).toISOString()
5130
5686
  };
5131
5687
  }
5688
+ async function assemblePaymentRequest(params) {
5689
+ const sourceChainId = params.sourceAsset.split("/")[0];
5690
+ const namespace = sourceChainId.split(":")[0];
5691
+ const adapter = getChainAdapter(sourceChainId);
5692
+ 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 }));
5693
+ const auth = await (0, import_payment_request_sender_auth2.getChainAdapter)(sourceChainId).buildAuthMessage({
5694
+ sourceAsset: params.sourceAsset,
5695
+ depositor: params.depositor,
5696
+ // The gateway pins the signed deposit amount to max_source_amount (the cap).
5697
+ maxSourceAmount: params.maxSourceAmount,
5698
+ requestId: params.requestId,
5699
+ sourceDefaults: params.sourceDefaults,
5700
+ deadline: params.deadline,
5701
+ nonce,
5702
+ ...namespace === "solana" ? {
5703
+ solanaClockReader: (chainId) => resolveSolanaIssuedAt({
5704
+ sourceChainId: chainId,
5705
+ rpcUrlOverride: params.solanaRpcUrl,
5706
+ reader: params.solanaClockReader
5707
+ })
5708
+ } : {}
5709
+ });
5710
+ const contractOverrides = adapter.resolveContractOverrides?.(params.sourceDefaults);
5711
+ return {
5712
+ version: params.version ?? PAYMENT_REQUEST_VERSION,
5713
+ request_id: params.requestId,
5714
+ source: {
5715
+ asset_identifier: params.sourceAsset,
5716
+ account: params.depositor
5717
+ },
5718
+ destination: [{
5719
+ asset_identifier: params.destinationAsset,
5720
+ account: params.destinationAccount
5721
+ }],
5722
+ fulfillment_amount: params.fulfillmentAmount,
5723
+ max_source_amount: params.maxSourceAmount,
5724
+ quote_deadline: params.quoteDeadline,
5725
+ fulfillment_deadline: params.fulfillmentDeadline,
5726
+ escrow_contract_address: params.sourceDefaults.escrowContract,
5727
+ quote_selector: contractOverrides?.quote_selector ?? params.sourceDefaults.quoteSelector,
5728
+ fulfillment_verifier: contractOverrides?.fulfillment_verifier ?? {
5729
+ account: params.sourceDefaults.fulfillmentVerifierAccount,
5730
+ endpoint: params.sourceDefaults.fulfillmentVerifierEndpoint
5731
+ },
5732
+ fulfillment_proxy: params.fulfillmentProxy,
5733
+ ...params.settlerRequirements ? { settler_requirements: params.settlerRequirements } : {},
5734
+ sender_auth: {
5735
+ message_scheme: auth.messageScheme,
5736
+ signed_messages: [{
5737
+ message: auth.messageHash,
5738
+ message_prehash: auth.messagePrehash,
5739
+ signature: ""
5740
+ }]
5741
+ }
5742
+ };
5743
+ }
5132
5744
  var PaymentGatewayClient2 = class extends PaymentGatewayClient {
5133
- constructor(config, HttpRequest = AxiosHttpRequest) {
5134
- super(config, HttpRequest);
5135
- this.baseUrl = config?.BASE ?? defaultGateway;
5745
+ constructor(config2, HttpRequest = AxiosHttpRequest) {
5746
+ const envBase = (typeof process !== "undefined" ? process.env.GATEWAY_URL : void 0)?.trim();
5747
+ const base = config2?.BASE ?? (envBase || defaultGateway);
5748
+ super({ ...config2, BASE: base }, HttpRequest);
5749
+ this.baseUrl = base;
5136
5750
  }
5137
5751
  /**
5138
5752
  * Fetches chain defaults from the payment gateway.
@@ -5189,64 +5803,84 @@ var PaymentGatewayClient2 = class extends PaymentGatewayClient {
5189
5803
  }
5190
5804
  /**
5191
5805
  * Prepares a payment request with defaults, ready for signing.
5192
- *
5806
+ *
5807
+ * By default this resolves the corridor addresses from the gateway `/defaults`
5808
+ * endpoint. It reaches the gateway only for what the caller has NOT already
5809
+ * supplied via `resolvedDefaults`: supply `resolvedDefaults.source` to skip the
5810
+ * source-chain fetch and `resolvedDefaults.destination` to skip the destination
5811
+ * fetch. Supplying both builds the request **entirely offline** (no network) —
5812
+ * how a caller that already holds the corridor addresses (e.g. from a signed
5813
+ * challenge) constructs and signs a request without gateway access. Such a
5814
+ * caller typically also injects `now` so the deadlines are deterministic.
5815
+ *
5816
+ * @example Minimal — fetch corridor addresses from the gateway, then sign
5817
+ * ```ts
5818
+ * const client = new PaymentGatewayClient({ BASE: "https://gateway.example.com" });
5819
+ *
5820
+ * const request = await client.preparePaymentRequest({
5821
+ * depositor: "0xPayerAddress",
5822
+ * sourceAsset: "eip155:8453/erc20:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", // USDC on Base
5823
+ * destinationAccount: "0xMerchantAddress",
5824
+ * destinationAsset: "eip155:42161/erc20:0xaf88d065e77c8cC2239327C5EDb3A432268e5831", // USDC on Arbitrum
5825
+ * fulfillmentAmount: "10000000", // 10 USDC (6 decimals)
5826
+ * });
5827
+ * // max_source_amount, deadlines, request id, and nonce are all defaulted.
5828
+ *
5829
+ * const signer = createSenderSigner("eip155:8453", { provider: "raw", privateKey });
5830
+ * await signPaymentRequest(request, signer); // fills sender_auth, ready to submit
5831
+ * ```
5832
+ *
5193
5833
  * @param params Payment parameters
5194
5834
  * @returns A complete PaymentRequest object without the signature
5195
5835
  */
5196
5836
  async preparePaymentRequest(params) {
5197
- const { quote_deadline, fulfillment_deadline } = resolveDeadlines(params, DEFAULT_PAYMENT_QUOTE_DEADLINE_SECONDS);
5837
+ const now = (params.now ?? Date.now)();
5838
+ const { quote_deadline, fulfillment_deadline } = resolveDeadlines({ ...params, now: () => now }, DEFAULT_PAYMENT_QUOTE_DEADLINE_SECONDS);
5198
5839
  const sourceChainId = params.sourceAsset.split("/")[0];
5199
5840
  const destChainId = params.destinationAsset.split("/")[0];
5200
- const [sourceDefaults, destDefaults] = await Promise.all([
5201
- this.fetchChainDefaults(sourceChainId),
5202
- this.fetchChainDefaults(destChainId)
5841
+ const [sourceDefaults, fulfillmentProxy] = await Promise.all([
5842
+ params.resolvedDefaults?.source ?? this.fetchChainDefaults(sourceChainId),
5843
+ params.resolvedDefaults?.destination?.fulfillmentProxy ?? this.fetchChainDefaults(destChainId).then((d) => d.fulfillmentProxy)
5203
5844
  ]);
5204
- const requestId = params.requestId || `${params.requestIdPrefix || "pmt-gw-sdk"}-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
5205
- const adapter = getChainAdapter(sourceChainId);
5206
- const auth = await adapter.buildAuthMessage({
5207
- sourceAsset: params.sourceAsset,
5845
+ if (!params.requestId) {
5846
+ throw new Error(
5847
+ "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"
5848
+ );
5849
+ }
5850
+ const requestId = params.requestId;
5851
+ const sourceNamespace = sourceChainId.split(":")[0];
5852
+ let permitDeadline;
5853
+ if (sourceNamespace !== "solana") {
5854
+ const fulfillmentMs = Date.parse(fulfillment_deadline);
5855
+ if (params.deadlineSeconds !== void 0) {
5856
+ permitDeadline = Math.ceil(now / 1e3) + Math.ceil(params.deadlineSeconds);
5857
+ if (permitDeadline * 1e3 < fulfillmentMs) {
5858
+ throw new Error(
5859
+ `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.`
5860
+ );
5861
+ }
5862
+ } else {
5863
+ permitDeadline = Math.floor(fulfillmentMs / 1e3) + 1;
5864
+ }
5865
+ }
5866
+ return assemblePaymentRequest({
5208
5867
  depositor: params.depositor,
5209
5868
  fulfillmentAmount: params.fulfillmentAmount,
5869
+ sourceAsset: params.sourceAsset,
5870
+ destinationAccount: params.destinationAccount,
5871
+ destinationAsset: params.destinationAsset,
5872
+ maxSourceAmount: params.maxSourceAmount ?? defaultMaxSourceAmount(params.fulfillmentAmount),
5210
5873
  requestId,
5874
+ quoteDeadline: quote_deadline,
5875
+ fulfillmentDeadline: fulfillment_deadline,
5211
5876
  sourceDefaults,
5212
- deadlineSeconds: params.deadlineSeconds,
5213
- solanaRpcUrl: params.solanaRpcUrl
5877
+ fulfillmentProxy,
5878
+ nonce: params.nonce,
5879
+ deadline: permitDeadline,
5880
+ solanaRpcUrl: params.solanaRpcUrl,
5881
+ solanaClockReader: params.solanaClockReader,
5882
+ settlerRequirements: params.settlerRequirements
5214
5883
  });
5215
- const contractOverrides = adapter.resolveContractOverrides?.(sourceDefaults);
5216
- return {
5217
- version: PAYMENT_REQUEST_VERSION,
5218
- request_id: requestId,
5219
- source: {
5220
- asset_identifier: params.sourceAsset,
5221
- account: params.depositor
5222
- },
5223
- destination: [{
5224
- asset_identifier: params.destinationAsset,
5225
- account: params.destinationAccount
5226
- }],
5227
- fulfillment_amount: params.fulfillmentAmount,
5228
- max_source_amount: params.maxSourceAmount ?? defaultMaxSourceAmount(params.fulfillmentAmount),
5229
- // REQUIRED (the gateway injects no defaults). Callers can widen the window via
5230
- // quoteDeadlineSeconds / fulfillmentDeadlineSeconds, e.g. for slow Turnkey signing.
5231
- quote_deadline,
5232
- fulfillment_deadline,
5233
- escrow_contract_address: sourceDefaults.escrowContract,
5234
- quote_selector: contractOverrides?.quote_selector ?? sourceDefaults.quoteSelector,
5235
- fulfillment_verifier: contractOverrides?.fulfillment_verifier ?? {
5236
- account: sourceDefaults.fulfillmentVerifierAccount,
5237
- endpoint: sourceDefaults.fulfillmentVerifierEndpoint
5238
- },
5239
- fulfillment_proxy: destDefaults.fulfillmentProxy,
5240
- ...params.settlerRequirements ? { settler_requirements: params.settlerRequirements } : {},
5241
- sender_auth: {
5242
- message_scheme: auth.messageScheme,
5243
- signed_messages: [{
5244
- message: auth.messageHash,
5245
- message_prehash: auth.messagePrehash,
5246
- signature: ""
5247
- }]
5248
- }
5249
- };
5250
5884
  }
5251
5885
  /**
5252
5886
  * Prepares a quote-request body (`CreateQuoteRequest`), ready to POST to
@@ -5337,8 +5971,20 @@ function parseSeconds(optionName) {
5337
5971
  };
5338
5972
  }
5339
5973
 
5974
+ // src/version.ts
5975
+ var PACKAGE_VERSION = true ? "2.1.0" : "0.0.0-dev";
5976
+
5340
5977
  // src/cli/send-payment.ts
5341
5978
  var readline = __toESM(require("readline"));
5979
+
5980
+ // src/cli/load-env.ts
5981
+ var import_dotenv = require("dotenv");
5982
+ function loadCliEnv() {
5983
+ (0, import_dotenv.config)({ override: false, quiet: true });
5984
+ }
5985
+
5986
+ // src/cli/send-payment.ts
5987
+ loadCliEnv();
5342
5988
  function collect(value, previous) {
5343
5989
  return previous.concat([value]);
5344
5990
  }
@@ -5358,7 +6004,7 @@ function loadTurnkeyConfigFromEnv() {
5358
6004
  };
5359
6005
  }
5360
6006
  var program = new import_commander.Command();
5361
- program.name("send-payment").description("Send a cross-chain payment through Atum Payment Gateway").version("1.0.0").argument("<sender>", "Depositor address (e.g., 0xF0D0...)").argument("<amount>", "Amount to send (in 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", defaultGateway).option("--request-id <id>", "Custom request ID (overrides prefix)").option("--request-id-prefix <prefix>", "Custom request ID prefix (default: pmt-gw-cli)").option("--quote-deadline-seconds <n>", `Quote collection window in seconds (default: ${DEFAULT_PAYMENT_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 (can be specified multiple times)", collect, []).option("--provider <raw|turnkey>", "Sender signing provider", "raw").option("--solana-rpc-url <url>", "Solana RPC used to read the cluster clock for issued_at (falls back to the SOLANA_RPC_URL env var, then the public endpoint for the cluster)").addHelpText("after", `
6007
+ program.name("send-payment").description("Send a cross-chain payment through Atum Payment Gateway").version(PACKAGE_VERSION).argument("<sender>", "Depositor address (e.g., 0xF0D0...)").argument("<amount>", "Amount to send (in 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>", "Idempotency key; seeds the on-chain deposit nonce. Reuse the same id to retry a payment safely. Omit to auto-generate a one-shot id.").option("--request-id-prefix <prefix>", "Custom request ID prefix (default: pmt-gw-cli)").option("--quote-deadline-seconds <n>", `Quote collection window in seconds (default: ${DEFAULT_PAYMENT_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 (can be specified multiple times)", collect, []).option("--provider <raw|turnkey>", "Sender signing provider", "raw").option("--solana-rpc-url <url>", "Solana RPC used to read the cluster clock for issued_at (falls back to the SOLANA_RPC_URL env var, then the public endpoint for the cluster)").addHelpText("after", `
5362
6008
  CAIP-19 Examples:
5363
6009
  EVM ERC20: eip155:42161/erc20:0xaf88d065e77c8cC2239327C5EDb3A432268e5831
5364
6010
  Tron TRC20: tron:shasta/trc20:TG3XXyExBkPp9nzdajDZsozEu4BkaSJozs
@@ -5381,6 +6027,7 @@ token for the Permit2 contract (0x000000000022D473030F116dDEE9F6B43aC78BA3 on
5381
6027
  virtually all EVM chains). (And the same applies for Tron/TRC-20, with a
5382
6028
  Permit2 address of TJhMXTHQHeQyMD7TcKQFqAePNgG4b31H9m on mainnet or
5383
6029
  TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp on Shasta)`).action(async (sender, amount, sourceAsset, receiver, destinationAsset, options) => {
6030
+ let requestId;
5384
6031
  try {
5385
6032
  const sourceChainId = sourceAsset.split("/")[0];
5386
6033
  let privateKey = "";
@@ -5397,6 +6044,8 @@ TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp on Shasta)`).action(async (sender, amount, so
5397
6044
  } else {
5398
6045
  throw new Error(`Unknown --provider '${options.provider}' (expected 'raw' or 'turnkey')`);
5399
6046
  }
6047
+ const resolvedRequestId = options.requestId ?? `${options.requestIdPrefix || "pmt-gw-cli"}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
6048
+ requestId = resolvedRequestId;
5400
6049
  const client = new PaymentGatewayClient2({ BASE: options.gateway });
5401
6050
  const paymentRequest = await client.preparePaymentRequest({
5402
6051
  depositor: sender,
@@ -5404,8 +6053,7 @@ TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp on Shasta)`).action(async (sender, amount, so
5404
6053
  sourceAsset,
5405
6054
  destinationAccount: receiver,
5406
6055
  destinationAsset,
5407
- requestId: options.requestId,
5408
- requestIdPrefix: options.requestIdPrefix || "pmt-gw-cli",
6056
+ requestId: resolvedRequestId,
5409
6057
  quoteDeadlineSeconds: options.quoteDeadlineSeconds,
5410
6058
  fulfillmentDeadlineSeconds: options.fulfillmentDeadlineSeconds,
5411
6059
  solanaRpcUrl: options.solanaRpcUrl || process.env.SOLANA_RPC_URL,
@@ -5421,6 +6069,7 @@ TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp on Shasta)`).action(async (sender, amount, so
5421
6069
  };
5422
6070
  }
5423
6071
  console.error(JSON.stringify(paymentRequest, null, 2));
6072
+ console.error(`request_id: ${requestId} (re-run with --request-id ${requestId} to retry this same payment)`);
5424
6073
  const response = await client.payments.submitPayment({
5425
6074
  requestBody: paymentRequest
5426
6075
  });
@@ -5436,6 +6085,9 @@ TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp on Shasta)`).action(async (sender, amount, so
5436
6085
  console.error(JSON.stringify(error.availableDefaults, null, 2));
5437
6086
  }
5438
6087
  }
6088
+ if (requestId) {
6089
+ console.error(`request_id: ${requestId} (re-run with --request-id ${requestId} to retry this same payment)`);
6090
+ }
5439
6091
  process.exit(1);
5440
6092
  }
5441
6093
  });