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