@atumlabs/payment-gateway-client 1.0.1 → 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.
package/dist/index.js CHANGED
@@ -33,8 +33,378 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
33
33
  ));
34
34
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
35
35
 
36
- // ../contracts/evm/escrow-encoding/typescript/dist/payment-id.js
36
+ // ../contracts/tvm/escrow-encoding/typescript/dist/chain-id.js
37
+ var require_chain_id = __commonJS({
38
+ "../contracts/tvm/escrow-encoding/typescript/dist/chain-id.js"(exports2) {
39
+ "use strict";
40
+ Object.defineProperty(exports2, "__esModule", { value: true });
41
+ exports2.maskChainId = maskChainId2;
42
+ function maskChainId2(chainId) {
43
+ return (chainId & 4294967295) >>> 0;
44
+ }
45
+ }
46
+ });
47
+
48
+ // ../contracts/tvm/escrow-encoding/typescript/dist/tron-address.js
49
+ var require_tron_address = __commonJS({
50
+ "../contracts/tvm/escrow-encoding/typescript/dist/tron-address.js"(exports2) {
51
+ "use strict";
52
+ var __importDefault = exports2 && exports2.__importDefault || function(mod) {
53
+ return mod && mod.__esModule ? mod : { "default": mod };
54
+ };
55
+ Object.defineProperty(exports2, "__esModule", { value: true });
56
+ exports2.base58ToHex = base58ToHex2;
57
+ exports2.normalizeAddress = normalizeAddress2;
58
+ var ethers_1 = require("ethers");
59
+ var bs58_1 = __importDefault(require("bs58"));
60
+ var TVM_MAINNET_PREFIX = "41";
61
+ function base58ToHex2(base58Address) {
62
+ if (!base58Address || !base58Address.startsWith("T")) {
63
+ throw new Error(`Invalid Tron base58 address: ${base58Address}`);
64
+ }
65
+ const decoded = bs58_1.default.decode(base58Address);
66
+ if (decoded.length !== 25) {
67
+ throw new Error(`Invalid Tron base58 length (expected 25 bytes): ${base58Address}`);
68
+ }
69
+ const payload = decoded.slice(0, 21);
70
+ const checksum = (0, ethers_1.hexlify)(decoded.slice(21)).slice(2);
71
+ const computed = (0, ethers_1.sha256)((0, ethers_1.sha256)(payload)).slice(2, 10);
72
+ if (checksum !== computed) {
73
+ throw new Error(`Invalid Tron base58 checksum: ${base58Address}`);
74
+ }
75
+ return (0, ethers_1.hexlify)(payload).slice(2);
76
+ }
77
+ function normalizeAddress2(address) {
78
+ if (!address) {
79
+ throw new Error("Empty address");
80
+ }
81
+ let hexAddress = address;
82
+ if (address.startsWith("T")) {
83
+ hexAddress = base58ToHex2(address);
84
+ }
85
+ hexAddress = hexAddress.replace(/^0x/, "");
86
+ if (hexAddress.startsWith(TVM_MAINNET_PREFIX)) {
87
+ hexAddress = hexAddress.substring(2);
88
+ }
89
+ if (hexAddress.length !== 40) {
90
+ throw new Error(`Invalid address length: expected 40 chars, got ${hexAddress.length}`);
91
+ }
92
+ if (!/^[0-9a-fA-F]{40}$/.test(hexAddress)) {
93
+ throw new Error("Invalid hex address format");
94
+ }
95
+ return "0x" + hexAddress.toLowerCase();
96
+ }
97
+ }
98
+ });
99
+
100
+ // ../contracts/tvm/escrow-encoding/typescript/dist/reserve-encoder.js
101
+ var require_reserve_encoder = __commonJS({
102
+ "../contracts/tvm/escrow-encoding/typescript/dist/reserve-encoder.js"(exports2) {
103
+ "use strict";
104
+ Object.defineProperty(exports2, "__esModule", { value: true });
105
+ exports2.computeReserveDigest = computeReserveDigest;
106
+ var ethers_1 = require("ethers");
107
+ var chain_id_1 = require_chain_id();
108
+ var RESERVE_WITNESS_TYPES = {
109
+ ReserveWitness: [
110
+ { name: "paymentId", type: "bytes32" },
111
+ { name: "settler", type: "address" }
112
+ ]
113
+ };
114
+ function computeReserveDigest(input) {
115
+ const domain = {
116
+ name: "Escrow",
117
+ version: "3",
118
+ chainId: (0, chain_id_1.maskChainId)(input.chainId),
119
+ verifyingContract: input.escrowContract
120
+ };
121
+ return ethers_1.TypedDataEncoder.hash(domain, RESERVE_WITNESS_TYPES, {
122
+ paymentId: input.paymentId,
123
+ settler: input.settler
124
+ });
125
+ }
126
+ }
127
+ });
128
+
129
+ // ../contracts/tvm/escrow-encoding/typescript/dist/payment-id.js
37
130
  var require_payment_id = __commonJS({
131
+ "../contracts/tvm/escrow-encoding/typescript/dist/payment-id.js"(exports2) {
132
+ "use strict";
133
+ Object.defineProperty(exports2, "__esModule", { value: true });
134
+ exports2.computePaymentId = computePaymentId;
135
+ var ethers_1 = require("ethers");
136
+ var tron_address_1 = require_tron_address();
137
+ function computePaymentId(depositor, signature, nonce) {
138
+ if (!/^[0-9]+$/.test(nonce)) {
139
+ throw new Error(`invalid nonce (expected base-10 decimal): ${nonce}`);
140
+ }
141
+ const encoded = ethers_1.AbiCoder.defaultAbiCoder().encode(["address", "bytes", "uint256"], [(0, tron_address_1.normalizeAddress)(depositor), signature, nonce]);
142
+ return (0, ethers_1.keccak256)(encoded);
143
+ }
144
+ }
145
+ });
146
+
147
+ // ../contracts/tvm/escrow-encoding/typescript/dist/deposit-encoder.js
148
+ var require_deposit_encoder = __commonJS({
149
+ "../contracts/tvm/escrow-encoding/typescript/dist/deposit-encoder.js"(exports2) {
150
+ "use strict";
151
+ Object.defineProperty(exports2, "__esModule", { value: true });
152
+ exports2.createTvmPermitWitnessTransferFromPrehash = createTvmPermitWitnessTransferFromPrehash2;
153
+ exports2.hashTvmPermitWitnessTransferFrom = hashTvmPermitWitnessTransferFrom2;
154
+ var ethers_1 = require("ethers");
155
+ var chain_id_1 = require_chain_id();
156
+ var tron_address_1 = require_tron_address();
157
+ var PERMIT_WITNESS_TYPES_V2 = {
158
+ PermitWitnessTransferFrom: [
159
+ { name: "permitted", type: "TokenPermissions" },
160
+ { name: "spender", type: "address" },
161
+ { name: "nonce", type: "uint256" },
162
+ { name: "deadline", type: "uint256" },
163
+ { name: "witness", type: "DepositWitness" }
164
+ ],
165
+ TokenPermissions: [
166
+ { name: "token", type: "address" },
167
+ { name: "amount", type: "uint256" }
168
+ ],
169
+ DepositWitness: [
170
+ { name: "reserver", type: "address" },
171
+ { name: "releaser", type: "address" }
172
+ ]
173
+ };
174
+ function createTvmPermitWitnessTransferFromPrehash2(params) {
175
+ const maskedChainId = (0, chain_id_1.maskChainId)(params.chainId);
176
+ return {
177
+ types: PERMIT_WITNESS_TYPES_V2,
178
+ primaryType: "PermitWitnessTransferFrom",
179
+ domain: {
180
+ name: "Permit2",
181
+ chainId: `0x${maskedChainId.toString(16)}`,
182
+ verifyingContract: (0, tron_address_1.normalizeAddress)(params.permit2Address)
183
+ },
184
+ message: {
185
+ permitted: {
186
+ token: (0, tron_address_1.normalizeAddress)(params.tokenAddress),
187
+ amount: params.amount
188
+ },
189
+ spender: (0, tron_address_1.normalizeAddress)(params.spenderAddress),
190
+ nonce: params.nonce.toString(),
191
+ deadline: params.deadline.toString(),
192
+ witness: {
193
+ reserver: (0, tron_address_1.normalizeAddress)(params.reserverAddress),
194
+ releaser: (0, tron_address_1.normalizeAddress)(params.releaserAddress)
195
+ }
196
+ }
197
+ };
198
+ }
199
+ function hashTvmPermitWitnessTransferFrom2(prehash) {
200
+ return ethers_1.TypedDataEncoder.hash(prehash.domain, prehash.types, prehash.message);
201
+ }
202
+ }
203
+ });
204
+
205
+ // ../contracts/tvm/escrow-encoding/typescript/dist/index.js
206
+ var require_dist = __commonJS({
207
+ "../contracts/tvm/escrow-encoding/typescript/dist/index.js"(exports2) {
208
+ "use strict";
209
+ Object.defineProperty(exports2, "__esModule", { value: true });
210
+ exports2.hashTvmPermitWitnessTransferFrom = exports2.createTvmPermitWitnessTransferFromPrehash = exports2.computePaymentId = exports2.computeReserveDigest = exports2.normalizeAddress = exports2.base58ToHex = exports2.maskChainId = void 0;
211
+ var chain_id_1 = require_chain_id();
212
+ Object.defineProperty(exports2, "maskChainId", { enumerable: true, get: function() {
213
+ return chain_id_1.maskChainId;
214
+ } });
215
+ var tron_address_1 = require_tron_address();
216
+ Object.defineProperty(exports2, "base58ToHex", { enumerable: true, get: function() {
217
+ return tron_address_1.base58ToHex;
218
+ } });
219
+ Object.defineProperty(exports2, "normalizeAddress", { enumerable: true, get: function() {
220
+ return tron_address_1.normalizeAddress;
221
+ } });
222
+ var reserve_encoder_1 = require_reserve_encoder();
223
+ Object.defineProperty(exports2, "computeReserveDigest", { enumerable: true, get: function() {
224
+ return reserve_encoder_1.computeReserveDigest;
225
+ } });
226
+ var payment_id_1 = require_payment_id();
227
+ Object.defineProperty(exports2, "computePaymentId", { enumerable: true, get: function() {
228
+ return payment_id_1.computePaymentId;
229
+ } });
230
+ var deposit_encoder_1 = require_deposit_encoder();
231
+ Object.defineProperty(exports2, "createTvmPermitWitnessTransferFromPrehash", { enumerable: true, get: function() {
232
+ return deposit_encoder_1.createTvmPermitWitnessTransferFromPrehash;
233
+ } });
234
+ Object.defineProperty(exports2, "hashTvmPermitWitnessTransferFrom", { enumerable: true, get: function() {
235
+ return deposit_encoder_1.hashTvmPermitWitnessTransferFrom;
236
+ } });
237
+ }
238
+ });
239
+
240
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/types.js
241
+ var require_types = __commonJS({
242
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/types.js"(exports2) {
243
+ "use strict";
244
+ Object.defineProperty(exports2, "__esModule", { value: true });
245
+ }
246
+ });
247
+
248
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/utils.js
249
+ var require_utils = __commonJS({
250
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/utils.js"(exports2) {
251
+ "use strict";
252
+ Object.defineProperty(exports2, "__esModule", { value: true });
253
+ exports2.SOLANA_REPLAY_SLOTS = exports2.PERMIT_NONCE_DOMAIN = exports2.REPLAY_HORIZON_SECS = void 0;
254
+ exports2.resolvePermitDeadline = resolvePermitDeadline;
255
+ exports2.generatePermitNonce = generatePermitNonce;
256
+ exports2.resolvePermitNonce = resolvePermitNonce;
257
+ exports2.deterministicPermitNonce = deterministicPermitNonce2;
258
+ exports2.deterministicSolanaNonce = deterministicSolanaNonce2;
259
+ exports2.sameAddress = sameAddress;
260
+ exports2.assertKeyMatchesSender = assertKeyMatchesSender2;
261
+ exports2.assertToken = assertToken;
262
+ exports2.assertAmountMatches = assertAmountMatches;
263
+ exports2.assertFresh = assertFresh;
264
+ exports2.assertSpender = assertSpender;
265
+ exports2.assertWitnessRoles = assertWitnessRoles;
266
+ exports2.assertRolePairComplete = assertRolePairComplete;
267
+ exports2.nowSec = nowSec;
268
+ var ethers_1 = require("ethers");
269
+ exports2.REPLAY_HORIZON_SECS = 128;
270
+ function resolvePermitDeadline(deadline) {
271
+ return BigInt(deadline);
272
+ }
273
+ function generatePermitNonce() {
274
+ const rand = new Uint32Array(1);
275
+ globalThis.crypto.getRandomValues(rand);
276
+ return (BigInt(Date.now()) << 32n) + BigInt(rand[0]);
277
+ }
278
+ function resolvePermitNonce(nonce) {
279
+ return BigInt(nonce);
280
+ }
281
+ exports2.PERMIT_NONCE_DOMAIN = "atum-permit:v1:";
282
+ exports2.SOLANA_REPLAY_SLOTS = 235n;
283
+ var SOLANA_BUCKET_BITS = 17n;
284
+ function canonicalDepositor(depositor) {
285
+ const lower = depositor.toLowerCase();
286
+ return lower.startsWith("0x") ? lower : depositor;
287
+ }
288
+ function permitNonceSeed(requestId, depositor) {
289
+ if (!requestId) {
290
+ throw new Error("sender_auth: request_id is required to derive a deterministic permit nonce");
291
+ }
292
+ return BigInt((0, ethers_1.keccak256)((0, ethers_1.toUtf8Bytes)(`${exports2.PERMIT_NONCE_DOMAIN}${requestId}:${canonicalDepositor(depositor)}`)));
293
+ }
294
+ function deterministicPermitNonce2(params) {
295
+ return permitNonceSeed(params.requestId, params.depositor);
296
+ }
297
+ function deterministicSolanaNonce2(params) {
298
+ const seed = permitNonceSeed(params.requestId, params.depositor);
299
+ const slot = seed % exports2.SOLANA_REPLAY_SLOTS;
300
+ const bucket = (seed >> 8n) % (1n << SOLANA_BUCKET_BITS);
301
+ return bucket << 32n | slot;
302
+ }
303
+ function sameAddress(a, b) {
304
+ if (a.startsWith("0x") && b.startsWith("0x")) {
305
+ return a.toLowerCase() === b.toLowerCase();
306
+ }
307
+ return a === b;
308
+ }
309
+ function assertKeyMatchesSender2(matches, sender, derived) {
310
+ if (!matches) {
311
+ throw new Error(`sender_auth: private key derives ${derived}, not the expected sender ${sender}`);
312
+ }
313
+ }
314
+ function assertToken(token, sourceAsset, normalize) {
315
+ if (!sameAddress(token, normalize(sourceAsset))) {
316
+ throw new Error("sender_auth: permit token does not match the source asset");
317
+ }
318
+ }
319
+ function assertAmountMatches(amount, maxSourceAmount) {
320
+ if (BigInt(amount) !== BigInt(maxSourceAmount)) {
321
+ throw new Error("sender_auth: permit amount does not match max_source_amount");
322
+ }
323
+ }
324
+ function assertFresh(deadlineSec, nowSec2) {
325
+ if (deadlineSec <= nowSec2) {
326
+ throw new Error("sender_auth: permit deadline is not in the future");
327
+ }
328
+ }
329
+ function assertSpender(spender, escrow, normalize) {
330
+ if (!sameAddress(spender, normalize(escrow))) {
331
+ throw new Error("sender_auth: permit spender is not the source escrow");
332
+ }
333
+ }
334
+ function assertWitnessRoles(reserver, releaser, expectedReserver, expectedReleaser, normalize) {
335
+ if (!sameAddress(reserver, normalize(expectedReserver)) || !sameAddress(releaser, normalize(expectedReleaser))) {
336
+ throw new Error("sender_auth: deposit witness roles do not match the challenge");
337
+ }
338
+ }
339
+ function assertRolePairComplete(reserver, releaser) {
340
+ if (reserver === void 0 !== (releaser === void 0)) {
341
+ throw new Error("sender_auth: reserver and releaser must be supplied together");
342
+ }
343
+ }
344
+ function nowSec() {
345
+ return Math.floor(Date.now() / 1e3);
346
+ }
347
+ }
348
+ });
349
+
350
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/chain-id.js
351
+ var require_chain_id2 = __commonJS({
352
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/chain-id.js"(exports2) {
353
+ "use strict";
354
+ Object.defineProperty(exports2, "__esModule", { value: true });
355
+ exports2.TRON_PERMIT2_FALLBACKS = exports2.TRON_CHAIN_IDS = void 0;
356
+ exports2.namespaceOf = namespaceOf;
357
+ exports2.evmChainId = evmChainId;
358
+ exports2.tronNumericChainId = tronNumericChainId;
359
+ exports2.resolveTronPermit2 = resolveTronPermit2;
360
+ exports2.clusterIdFromName = clusterIdFromName;
361
+ function namespaceOf(network) {
362
+ return network.split(":")[0];
363
+ }
364
+ function evmChainId(network) {
365
+ const match = /^eip155:([0-9]+)$/.exec(network);
366
+ if (!match) {
367
+ throw new Error(`sender_auth: expected an eip155 network, got ${network}`);
368
+ }
369
+ return Number(match[1]);
370
+ }
371
+ exports2.TRON_CHAIN_IDS = {
372
+ mainnet: 728126428,
373
+ shasta: 2494104990
374
+ };
375
+ function tronNumericChainId(network) {
376
+ const cluster = network.split(":")[1];
377
+ const id = exports2.TRON_CHAIN_IDS[cluster ?? ""];
378
+ if (id === void 0) {
379
+ throw new Error(`sender_auth: unsupported Tron network '${network}'`);
380
+ }
381
+ return id;
382
+ }
383
+ exports2.TRON_PERMIT2_FALLBACKS = {
384
+ "tron:mainnet": "TJhMXTHQHeQyMD7TcKQFqAePNgG4b31H9m",
385
+ "tron:shasta": "TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp"
386
+ };
387
+ function resolveTronPermit2(network) {
388
+ const resolved = exports2.TRON_PERMIT2_FALLBACKS[network];
389
+ if (!resolved) {
390
+ throw new Error(`sender_auth: no Permit2 address known for Tron network '${network}'`);
391
+ }
392
+ return resolved;
393
+ }
394
+ function clusterIdFromName(name) {
395
+ const encoded = new TextEncoder().encode(name);
396
+ if (encoded.length > 32) {
397
+ throw new Error(`sender_auth: Solana cluster name too long (${encoded.length} > 32 bytes): ${name}`);
398
+ }
399
+ const out = new Uint8Array(32);
400
+ out.set(encoded);
401
+ return out;
402
+ }
403
+ }
404
+ });
405
+
406
+ // ../contracts/evm/escrow-encoding/typescript/dist/payment-id.js
407
+ var require_payment_id2 = __commonJS({
38
408
  "../contracts/evm/escrow-encoding/typescript/dist/payment-id.js"(exports2) {
39
409
  "use strict";
40
410
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -350,7 +720,7 @@ var require_escrow_abi = __commonJS({
350
720
  });
351
721
 
352
722
  // ../contracts/evm/escrow-encoding/typescript/dist/reserve-encoder.js
353
- var require_reserve_encoder = __commonJS({
723
+ var require_reserve_encoder2 = __commonJS({
354
724
  "../contracts/evm/escrow-encoding/typescript/dist/reserve-encoder.js"(exports2) {
355
725
  "use strict";
356
726
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -368,7 +738,7 @@ var require_reserve_encoder = __commonJS({
368
738
  });
369
739
 
370
740
  // ../contracts/evm/escrow-encoding/typescript/dist/deposit-encoder.js
371
- var require_deposit_encoder = __commonJS({
741
+ var require_deposit_encoder2 = __commonJS({
372
742
  "../contracts/evm/escrow-encoding/typescript/dist/deposit-encoder.js"(exports2) {
373
743
  "use strict";
374
744
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -409,12 +779,12 @@ var require_deposit_encoder = __commonJS({
409
779
  });
410
780
 
411
781
  // ../contracts/evm/escrow-encoding/typescript/dist/index.js
412
- var require_dist = __commonJS({
782
+ var require_dist2 = __commonJS({
413
783
  "../contracts/evm/escrow-encoding/typescript/dist/index.js"(exports2) {
414
784
  "use strict";
415
785
  Object.defineProperty(exports2, "__esModule", { value: true });
416
786
  exports2.PERMIT2_CONTRACT_ADDRESS = exports2.hashPermitWitnessTransferFrom = exports2.createPermitWitnessTransferFromPrehash = exports2.computeReserveDigest = exports2.ESCROW_V3_ABI_JSON = exports2.ESCROW_V2_ABI_JSON = exports2.ESCROW_ABI_JSON = exports2.ESCROW_ABI = exports2.REFUND_WITNESS_TYPES = exports2.RELEASE_WITNESS_TYPES = exports2.RESERVE_WITNESS_TYPES = exports2.createEscrowDomain = exports2.createPermit2Domain = exports2.PERMIT_WITNESS_TYPES_V2 = exports2.PERMIT_WITNESS_TYPES = exports2.generateNonce = exports2.computePaymentIdV2 = exports2.computePaymentId = void 0;
417
- var payment_id_1 = require_payment_id();
787
+ var payment_id_1 = require_payment_id2();
418
788
  Object.defineProperty(exports2, "computePaymentId", { enumerable: true, get: function() {
419
789
  return payment_id_1.computePaymentId;
420
790
  } });
@@ -460,11 +830,11 @@ var require_dist = __commonJS({
460
830
  Object.defineProperty(exports2, "ESCROW_V3_ABI_JSON", { enumerable: true, get: function() {
461
831
  return escrow_abi_1.ESCROW_V3_ABI_JSON;
462
832
  } });
463
- var reserve_encoder_1 = require_reserve_encoder();
833
+ var reserve_encoder_1 = require_reserve_encoder2();
464
834
  Object.defineProperty(exports2, "computeReserveDigest", { enumerable: true, get: function() {
465
835
  return reserve_encoder_1.computeReserveDigest;
466
836
  } });
467
- var deposit_encoder_1 = require_deposit_encoder();
837
+ var deposit_encoder_1 = require_deposit_encoder2();
468
838
  Object.defineProperty(exports2, "createPermitWitnessTransferFromPrehash", { enumerable: true, get: function() {
469
839
  return deposit_encoder_1.createPermitWitnessTransferFromPrehash;
470
840
  } });
@@ -477,212 +847,263 @@ var require_dist = __commonJS({
477
847
  }
478
848
  });
479
849
 
480
- // ../contracts/tvm/escrow-encoding/typescript/dist/chain-id.js
481
- var require_chain_id = __commonJS({
482
- "../contracts/tvm/escrow-encoding/typescript/dist/chain-id.js"(exports2) {
483
- "use strict";
484
- Object.defineProperty(exports2, "__esModule", { value: true });
485
- exports2.maskChainId = maskChainId2;
486
- function maskChainId2(chainId) {
487
- return (chainId & 4294967295) >>> 0;
488
- }
489
- }
490
- });
491
-
492
- // ../contracts/tvm/escrow-encoding/typescript/dist/tron-address.js
493
- var require_tron_address = __commonJS({
494
- "../contracts/tvm/escrow-encoding/typescript/dist/tron-address.js"(exports2) {
850
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/errors.js
851
+ var require_errors = __commonJS({
852
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/errors.js"(exports2) {
495
853
  "use strict";
496
- var __importDefault = exports2 && exports2.__importDefault || function(mod) {
497
- return mod && mod.__esModule ? mod : { "default": mod };
498
- };
499
854
  Object.defineProperty(exports2, "__esModule", { value: true });
500
- exports2.base58ToHex = base58ToHex2;
501
- exports2.normalizeAddress = normalizeAddress2;
502
- var ethers_1 = require("ethers");
503
- var bs58_1 = __importDefault(require("bs58"));
504
- var TVM_MAINNET_PREFIX = "41";
505
- function base58ToHex2(base58Address) {
506
- if (!base58Address || !base58Address.startsWith("T")) {
507
- throw new Error(`Invalid Tron base58 address: ${base58Address}`);
508
- }
509
- const decoded = bs58_1.default.decode(base58Address);
510
- if (decoded.length !== 25) {
511
- throw new Error(`Invalid Tron base58 length (expected 25 bytes): ${base58Address}`);
512
- }
513
- const payload = decoded.slice(0, 21);
514
- const checksum = (0, ethers_1.hexlify)(decoded.slice(21)).slice(2);
515
- const computed = (0, ethers_1.sha256)((0, ethers_1.sha256)(payload)).slice(2, 10);
516
- if (checksum !== computed) {
517
- throw new Error(`Invalid Tron base58 checksum: ${base58Address}`);
518
- }
519
- return (0, ethers_1.hexlify)(payload).slice(2);
520
- }
521
- function normalizeAddress2(address) {
522
- if (!address) {
523
- throw new Error("Empty address");
524
- }
525
- let hexAddress = address;
526
- if (address.startsWith("T")) {
527
- hexAddress = base58ToHex2(address);
528
- }
529
- hexAddress = hexAddress.replace(/^0x/, "");
530
- if (hexAddress.startsWith(TVM_MAINNET_PREFIX)) {
531
- hexAddress = hexAddress.substring(2);
855
+ exports2.SignerMismatchError = exports2.RecoveryFailedError = exports2.MalformedPrehashError = void 0;
856
+ var MalformedPrehashError = class extends Error {
857
+ constructor(message = "sender_auth: malformed message_prehash") {
858
+ super(message);
859
+ this.name = "MalformedPrehashError";
532
860
  }
533
- if (hexAddress.length !== 40) {
534
- throw new Error(`Invalid address length: expected 40 chars, got ${hexAddress.length}`);
861
+ };
862
+ exports2.MalformedPrehashError = MalformedPrehashError;
863
+ var RecoveryFailedError = class extends Error {
864
+ constructor(message = "sender_auth: could not recover a signer from the signed message") {
865
+ super(message);
866
+ this.name = "RecoveryFailedError";
535
867
  }
536
- if (!/^[0-9a-fA-F]{40}$/.test(hexAddress)) {
537
- throw new Error("Invalid hex address format");
868
+ };
869
+ exports2.RecoveryFailedError = RecoveryFailedError;
870
+ var SignerMismatchError = class extends Error {
871
+ constructor(message = "sender_auth: recovered signer does not match source.account") {
872
+ super(message);
873
+ this.name = "SignerMismatchError";
538
874
  }
539
- return "0x" + hexAddress.toLowerCase();
540
- }
541
- }
542
- });
543
-
544
- // ../contracts/tvm/escrow-encoding/typescript/dist/reserve-encoder.js
545
- var require_reserve_encoder2 = __commonJS({
546
- "../contracts/tvm/escrow-encoding/typescript/dist/reserve-encoder.js"(exports2) {
547
- "use strict";
548
- Object.defineProperty(exports2, "__esModule", { value: true });
549
- exports2.computeReserveDigest = computeReserveDigest;
550
- var ethers_1 = require("ethers");
551
- var chain_id_1 = require_chain_id();
552
- var RESERVE_WITNESS_TYPES = {
553
- ReserveWitness: [
554
- { name: "paymentId", type: "bytes32" },
555
- { name: "settler", type: "address" }
556
- ]
557
875
  };
558
- function computeReserveDigest(input) {
559
- const domain = {
560
- name: "Escrow",
561
- version: "3",
562
- chainId: (0, chain_id_1.maskChainId)(input.chainId),
563
- verifyingContract: input.escrowContract
564
- };
565
- return ethers_1.TypedDataEncoder.hash(domain, RESERVE_WITNESS_TYPES, {
566
- paymentId: input.paymentId,
567
- settler: input.settler
568
- });
569
- }
876
+ exports2.SignerMismatchError = SignerMismatchError;
570
877
  }
571
878
  });
572
879
 
573
- // ../contracts/tvm/escrow-encoding/typescript/dist/payment-id.js
574
- var require_payment_id2 = __commonJS({
575
- "../contracts/tvm/escrow-encoding/typescript/dist/payment-id.js"(exports2) {
880
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/evm.js
881
+ var require_evm = __commonJS({
882
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/evm.js"(exports2) {
576
883
  "use strict";
577
884
  Object.defineProperty(exports2, "__esModule", { value: true });
578
- exports2.computePaymentId = computePaymentId;
885
+ exports2.evmAdapter = void 0;
579
886
  var ethers_1 = require("ethers");
580
- var tron_address_1 = require_tron_address();
581
- function computePaymentId(depositor, signature, nonce) {
582
- if (!/^[0-9]+$/.test(nonce)) {
583
- throw new Error(`invalid nonce (expected base-10 decimal): ${nonce}`);
887
+ var evm_escrow_encoding_1 = require_dist2();
888
+ var utils_js_1 = require_utils();
889
+ var errors_js_1 = require_errors();
890
+ var chain_id_js_1 = require_chain_id2();
891
+ exports2.evmAdapter = {
892
+ async buildAuthMessage({ sourceAsset, maxSourceAmount, sourceDefaults, deadline, nonce }) {
893
+ if (nonce === void 0) {
894
+ 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");
895
+ }
896
+ if (deadline === void 0) {
897
+ 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)");
898
+ }
899
+ const sourceChainId = sourceAsset.split("/")[0];
900
+ const chainIdNum = parseInt(sourceChainId.split(":")[1]);
901
+ const tokenAddress = sourceAsset.split("/")[1].split(":")[1];
902
+ const permitParams = {
903
+ chainId: chainIdNum,
904
+ verifyingContract: evm_escrow_encoding_1.PERMIT2_CONTRACT_ADDRESS,
905
+ token: tokenAddress,
906
+ amount: maxSourceAmount,
907
+ spender: sourceDefaults.escrowContract,
908
+ nonce: (0, utils_js_1.resolvePermitNonce)(nonce),
909
+ deadline: (0, utils_js_1.resolvePermitDeadline)(deadline),
910
+ reserver: sourceDefaults.quoteSelector,
911
+ releaser: sourceDefaults.fulfillmentVerifierAccount
912
+ };
913
+ const messagePrehash = (0, evm_escrow_encoding_1.createPermitWitnessTransferFromPrehash)(permitParams);
914
+ const messageHash = (0, evm_escrow_encoding_1.hashPermitWitnessTransferFrom)(messagePrehash);
915
+ return { messageScheme: "EVM_PERMIT2", messageHash, messagePrehash: JSON.stringify(messagePrehash) };
916
+ },
917
+ async sign(signedMessage, privateKey) {
918
+ if (!signedMessage.message_prehash) {
919
+ throw new Error("EVM adapter sign(): signed_messages[i].message_prehash is required");
920
+ }
921
+ const prehash = JSON.parse(signedMessage.message_prehash);
922
+ const wallet = new ethers_1.Wallet(privateKey);
923
+ return wallet.signTypedData(prehash.domain, prehash.types, prehash.message);
924
+ },
925
+ recoverSigner(signed, source) {
926
+ let recovered;
927
+ try {
928
+ recovered = (0, ethers_1.recoverAddress)(signed.message, signed.signature);
929
+ } catch (e) {
930
+ throw new errors_js_1.RecoveryFailedError(`sender_auth: could not recover a signer: ${e.message}`);
931
+ }
932
+ if (!(0, utils_js_1.sameAddress)(recovered, source.account)) {
933
+ throw new errors_js_1.SignerMismatchError(`sender_auth: recovered ${recovered}, not source.account`);
934
+ }
935
+ return source.account;
936
+ },
937
+ recoverAndVerify(signed, source, expected) {
938
+ let canonical;
939
+ let msg;
940
+ try {
941
+ msg = JSON.parse(signed.message_prehash).message;
942
+ canonical = (0, evm_escrow_encoding_1.createPermitWitnessTransferFromPrehash)({
943
+ chainId: (0, chain_id_js_1.evmChainId)(source.network),
944
+ verifyingContract: evm_escrow_encoding_1.PERMIT2_CONTRACT_ADDRESS,
945
+ token: msg.permitted.token,
946
+ amount: msg.permitted.amount,
947
+ spender: msg.spender,
948
+ nonce: BigInt(msg.nonce),
949
+ deadline: BigInt(msg.deadline),
950
+ reserver: msg.witness.reserver,
951
+ releaser: msg.witness.releaser
952
+ });
953
+ } catch {
954
+ throw new errors_js_1.MalformedPrehashError();
955
+ }
956
+ let recovered;
957
+ try {
958
+ recovered = (0, ethers_1.verifyTypedData)(canonical.domain, canonical.types, canonical.message, signed.signature);
959
+ } catch {
960
+ throw new Error("sender_auth: deposit signature does not recover to source.account");
961
+ }
962
+ if (!(0, utils_js_1.sameAddress)(recovered, source.account)) {
963
+ throw new Error("sender_auth: deposit signature does not recover to source.account");
964
+ }
965
+ const deadlineSec = Number(msg.deadline);
966
+ (0, utils_js_1.assertToken)(msg.permitted.token, source.asset, (a) => a);
967
+ (0, utils_js_1.assertAmountMatches)(msg.permitted.amount, expected.maxSourceAmount);
968
+ (0, utils_js_1.assertFresh)(deadlineSec, expected.nowSec ?? (0, utils_js_1.nowSec)());
969
+ if (expected.escrowContract !== void 0) {
970
+ (0, utils_js_1.assertSpender)(msg.spender, expected.escrowContract, (a) => a);
971
+ }
972
+ (0, utils_js_1.assertRolePairComplete)(expected.reserver, expected.releaser);
973
+ if (expected.reserver !== void 0 && expected.releaser !== void 0) {
974
+ (0, utils_js_1.assertWitnessRoles)(msg.witness.reserver, msg.witness.releaser, expected.reserver, expected.releaser, (a) => a);
975
+ }
976
+ return {
977
+ amount: msg.permitted.amount,
978
+ deadlineSec,
979
+ permit: {
980
+ scheme: "EVM_PERMIT2",
981
+ token: msg.permitted.token,
982
+ amount: msg.permitted.amount,
983
+ deadlineSec,
984
+ reserver: msg.witness.reserver,
985
+ releaser: msg.witness.releaser,
986
+ spender: msg.spender
987
+ }
988
+ };
584
989
  }
585
- const encoded = ethers_1.AbiCoder.defaultAbiCoder().encode(["address", "bytes", "uint256"], [(0, tron_address_1.normalizeAddress)(depositor), signature, nonce]);
586
- return (0, ethers_1.keccak256)(encoded);
587
- }
588
- }
589
- });
590
-
591
- // ../contracts/tvm/escrow-encoding/typescript/dist/deposit-encoder.js
592
- var require_deposit_encoder2 = __commonJS({
593
- "../contracts/tvm/escrow-encoding/typescript/dist/deposit-encoder.js"(exports2) {
594
- "use strict";
595
- Object.defineProperty(exports2, "__esModule", { value: true });
596
- exports2.createTvmPermitWitnessTransferFromPrehash = createTvmPermitWitnessTransferFromPrehash2;
597
- exports2.hashTvmPermitWitnessTransferFrom = hashTvmPermitWitnessTransferFrom2;
598
- var ethers_1 = require("ethers");
599
- var chain_id_1 = require_chain_id();
600
- var tron_address_1 = require_tron_address();
601
- var PERMIT_WITNESS_TYPES_V2 = {
602
- PermitWitnessTransferFrom: [
603
- { name: "permitted", type: "TokenPermissions" },
604
- { name: "spender", type: "address" },
605
- { name: "nonce", type: "uint256" },
606
- { name: "deadline", type: "uint256" },
607
- { name: "witness", type: "DepositWitness" }
608
- ],
609
- TokenPermissions: [
610
- { name: "token", type: "address" },
611
- { name: "amount", type: "uint256" }
612
- ],
613
- DepositWitness: [
614
- { name: "reserver", type: "address" },
615
- { name: "releaser", type: "address" }
616
- ]
617
990
  };
618
- function createTvmPermitWitnessTransferFromPrehash2(params) {
619
- const maskedChainId = (0, chain_id_1.maskChainId)(params.chainId);
620
- return {
621
- types: PERMIT_WITNESS_TYPES_V2,
622
- primaryType: "PermitWitnessTransferFrom",
623
- domain: {
624
- name: "Permit2",
625
- chainId: `0x${maskedChainId.toString(16)}`,
626
- verifyingContract: (0, tron_address_1.normalizeAddress)(params.permit2Address)
627
- },
628
- message: {
629
- permitted: {
630
- token: (0, tron_address_1.normalizeAddress)(params.tokenAddress),
631
- amount: params.amount
632
- },
633
- spender: (0, tron_address_1.normalizeAddress)(params.spenderAddress),
634
- nonce: params.nonce.toString(),
635
- deadline: params.deadline.toString(),
636
- witness: {
637
- reserver: (0, tron_address_1.normalizeAddress)(params.reserverAddress),
638
- releaser: (0, tron_address_1.normalizeAddress)(params.releaserAddress)
639
- }
640
- }
641
- };
642
- }
643
- function hashTvmPermitWitnessTransferFrom2(prehash) {
644
- return ethers_1.TypedDataEncoder.hash(prehash.domain, prehash.types, prehash.message);
645
- }
646
991
  }
647
- });
648
-
649
- // ../contracts/tvm/escrow-encoding/typescript/dist/index.js
650
- var require_dist2 = __commonJS({
651
- "../contracts/tvm/escrow-encoding/typescript/dist/index.js"(exports2) {
652
- "use strict";
653
- Object.defineProperty(exports2, "__esModule", { value: true });
654
- exports2.hashTvmPermitWitnessTransferFrom = exports2.createTvmPermitWitnessTransferFromPrehash = exports2.computePaymentId = exports2.computeReserveDigest = exports2.normalizeAddress = exports2.base58ToHex = exports2.maskChainId = void 0;
655
- var chain_id_1 = require_chain_id();
656
- Object.defineProperty(exports2, "maskChainId", { enumerable: true, get: function() {
657
- return chain_id_1.maskChainId;
658
- } });
659
- var tron_address_1 = require_tron_address();
660
- Object.defineProperty(exports2, "base58ToHex", { enumerable: true, get: function() {
661
- return tron_address_1.base58ToHex;
662
- } });
663
- Object.defineProperty(exports2, "normalizeAddress", { enumerable: true, get: function() {
664
- return tron_address_1.normalizeAddress;
665
- } });
666
- var reserve_encoder_1 = require_reserve_encoder2();
667
- Object.defineProperty(exports2, "computeReserveDigest", { enumerable: true, get: function() {
668
- return reserve_encoder_1.computeReserveDigest;
669
- } });
670
- var payment_id_1 = require_payment_id2();
671
- Object.defineProperty(exports2, "computePaymentId", { enumerable: true, get: function() {
672
- return payment_id_1.computePaymentId;
673
- } });
674
- var deposit_encoder_1 = require_deposit_encoder2();
675
- Object.defineProperty(exports2, "createTvmPermitWitnessTransferFromPrehash", { enumerable: true, get: function() {
676
- return deposit_encoder_1.createTvmPermitWitnessTransferFromPrehash;
677
- } });
678
- Object.defineProperty(exports2, "hashTvmPermitWitnessTransferFrom", { enumerable: true, get: function() {
679
- return deposit_encoder_1.hashTvmPermitWitnessTransferFrom;
680
- } });
992
+ });
993
+
994
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/tron.js
995
+ var require_tron = __commonJS({
996
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/tron.js"(exports2) {
997
+ "use strict";
998
+ Object.defineProperty(exports2, "__esModule", { value: true });
999
+ exports2.tronAdapter = void 0;
1000
+ var ethers_1 = require("ethers");
1001
+ var tvm_escrow_encoding_1 = require_dist();
1002
+ var utils_js_1 = require_utils();
1003
+ var errors_js_1 = require_errors();
1004
+ var chain_id_js_1 = require_chain_id2();
1005
+ exports2.tronAdapter = {
1006
+ async buildAuthMessage({ sourceAsset, maxSourceAmount, sourceDefaults, deadline, nonce }) {
1007
+ if (nonce === void 0) {
1008
+ 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");
1009
+ }
1010
+ if (deadline === void 0) {
1011
+ 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)");
1012
+ }
1013
+ const sourceChainId = sourceAsset.split("/")[0];
1014
+ const tokenAddress = sourceAsset.split("/")[1].split(":")[1];
1015
+ const permit2Address = sourceDefaults.permit2Contract ?? (0, chain_id_js_1.resolveTronPermit2)(sourceChainId);
1016
+ const tvmParams = {
1017
+ chainId: (0, chain_id_js_1.tronNumericChainId)(sourceChainId),
1018
+ permit2Address,
1019
+ tokenAddress,
1020
+ amount: maxSourceAmount,
1021
+ spenderAddress: sourceDefaults.escrowContract,
1022
+ nonce: (0, utils_js_1.resolvePermitNonce)(nonce),
1023
+ deadline: (0, utils_js_1.resolvePermitDeadline)(deadline),
1024
+ reserverAddress: sourceDefaults.quoteSelector,
1025
+ releaserAddress: sourceDefaults.fulfillmentVerifierAccount
1026
+ };
1027
+ const messagePrehash = (0, tvm_escrow_encoding_1.createTvmPermitWitnessTransferFromPrehash)(tvmParams);
1028
+ const messageHash = (0, tvm_escrow_encoding_1.hashTvmPermitWitnessTransferFrom)(messagePrehash);
1029
+ return { messageScheme: "EVM_PERMIT2", messageHash, messagePrehash: JSON.stringify(messagePrehash) };
1030
+ },
1031
+ async sign(signedMessage, privateKey) {
1032
+ const wallet = new ethers_1.Wallet(privateKey.startsWith("0x") ? privateKey : "0x" + privateKey);
1033
+ return wallet.signingKey.sign(signedMessage.message).serialized;
1034
+ },
1035
+ recoverSigner(signed, source) {
1036
+ let recovered;
1037
+ try {
1038
+ recovered = (0, ethers_1.recoverAddress)(signed.message, signed.signature);
1039
+ } catch (e) {
1040
+ throw new errors_js_1.RecoveryFailedError(`sender_auth: could not recover a signer: ${e.message}`);
1041
+ }
1042
+ if (!(0, utils_js_1.sameAddress)(recovered, (0, tvm_escrow_encoding_1.normalizeAddress)(source.account))) {
1043
+ throw new errors_js_1.SignerMismatchError(`sender_auth: recovered ${recovered}, not source.account`);
1044
+ }
1045
+ return source.account;
1046
+ },
1047
+ recoverAndVerify(signed, source, expected) {
1048
+ let msg;
1049
+ let digest;
1050
+ try {
1051
+ msg = JSON.parse(signed.message_prehash).message;
1052
+ const canonical = (0, tvm_escrow_encoding_1.createTvmPermitWitnessTransferFromPrehash)({
1053
+ chainId: (0, chain_id_js_1.tronNumericChainId)(source.network),
1054
+ permit2Address: (0, chain_id_js_1.resolveTronPermit2)(source.network),
1055
+ tokenAddress: msg.permitted.token,
1056
+ amount: msg.permitted.amount,
1057
+ spenderAddress: msg.spender,
1058
+ nonce: BigInt(msg.nonce),
1059
+ deadline: BigInt(msg.deadline),
1060
+ reserverAddress: msg.witness.reserver,
1061
+ releaserAddress: msg.witness.releaser
1062
+ });
1063
+ digest = (0, tvm_escrow_encoding_1.hashTvmPermitWitnessTransferFrom)(canonical);
1064
+ } catch {
1065
+ throw new errors_js_1.MalformedPrehashError();
1066
+ }
1067
+ let recovered;
1068
+ try {
1069
+ recovered = (0, ethers_1.recoverAddress)(digest, signed.signature);
1070
+ } catch {
1071
+ throw new Error("sender_auth: deposit signature does not recover to source.account");
1072
+ }
1073
+ if (!(0, utils_js_1.sameAddress)(recovered, (0, tvm_escrow_encoding_1.normalizeAddress)(source.account))) {
1074
+ throw new Error("sender_auth: deposit signature does not recover to source.account");
1075
+ }
1076
+ const deadlineSec = Number(msg.deadline);
1077
+ (0, utils_js_1.assertToken)(msg.permitted.token, source.asset, tvm_escrow_encoding_1.normalizeAddress);
1078
+ (0, utils_js_1.assertAmountMatches)(msg.permitted.amount, expected.maxSourceAmount);
1079
+ (0, utils_js_1.assertFresh)(deadlineSec, expected.nowSec ?? (0, utils_js_1.nowSec)());
1080
+ if (expected.escrowContract !== void 0) {
1081
+ (0, utils_js_1.assertSpender)(msg.spender, expected.escrowContract, tvm_escrow_encoding_1.normalizeAddress);
1082
+ }
1083
+ (0, utils_js_1.assertRolePairComplete)(expected.reserver, expected.releaser);
1084
+ if (expected.reserver !== void 0 && expected.releaser !== void 0) {
1085
+ (0, utils_js_1.assertWitnessRoles)(msg.witness.reserver, msg.witness.releaser, expected.reserver, expected.releaser, tvm_escrow_encoding_1.normalizeAddress);
1086
+ }
1087
+ return {
1088
+ amount: msg.permitted.amount,
1089
+ deadlineSec,
1090
+ permit: {
1091
+ scheme: "EVM_PERMIT2",
1092
+ token: msg.permitted.token,
1093
+ amount: msg.permitted.amount,
1094
+ deadlineSec,
1095
+ reserver: msg.witness.reserver,
1096
+ releaser: msg.witness.releaser,
1097
+ spender: msg.spender
1098
+ }
1099
+ };
1100
+ }
1101
+ };
681
1102
  }
682
1103
  });
683
1104
 
684
1105
  // ../contracts/svm/escrow-encoding/typescript/dist/errors.js
685
- var require_errors = __commonJS({
1106
+ var require_errors2 = __commonJS({
686
1107
  "../contracts/svm/escrow-encoding/typescript/dist/errors.js"(exports2) {
687
1108
  "use strict";
688
1109
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -784,8 +1205,8 @@ var require_pubkey = __commonJS({
784
1205
  Object.defineProperty(exports2, "__esModule", { value: true });
785
1206
  exports2.Pubkey = void 0;
786
1207
  var bs58_1 = __importDefault(require("bs58"));
787
- var errors_1 = require_errors();
788
- var Pubkey3 = class _Pubkey {
1208
+ var errors_1 = require_errors2();
1209
+ var Pubkey2 = class _Pubkey {
789
1210
  constructor(data) {
790
1211
  if (data.length !== 32) {
791
1212
  throw new errors_1.InvalidPubkeyLengthError();
@@ -878,7 +1299,7 @@ var require_pubkey = __commonJS({
878
1299
  return this.data.every((b, i) => b === other.data[i]);
879
1300
  }
880
1301
  };
881
- exports2.Pubkey = Pubkey3;
1302
+ exports2.Pubkey = Pubkey2;
882
1303
  }
883
1304
  });
884
1305
 
@@ -990,7 +1411,7 @@ var require_cryptoNode = __commonJS({
990
1411
  });
991
1412
 
992
1413
  // ../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/utils.js
993
- var require_utils = __commonJS({
1414
+ var require_utils2 = __commonJS({
994
1415
  "../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/utils.js"(exports2) {
995
1416
  "use strict";
996
1417
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -1239,7 +1660,7 @@ var require_sha3 = __commonJS({
1239
1660
  exports2.shake256 = exports2.shake128 = exports2.keccak_512 = exports2.keccak_384 = exports2.keccak_256 = exports2.keccak_224 = exports2.sha3_512 = exports2.sha3_384 = exports2.sha3_256 = exports2.sha3_224 = exports2.Keccak = void 0;
1240
1661
  exports2.keccakP = keccakP;
1241
1662
  var _u64_ts_1 = require_u64();
1242
- var utils_ts_1 = require_utils();
1663
+ var utils_ts_1 = require_utils2();
1243
1664
  var _0n = BigInt(0);
1244
1665
  var _1n = BigInt(1);
1245
1666
  var _2n = BigInt(2);
@@ -1504,7 +1925,7 @@ var require_deposit_encoder3 = __commonJS({
1504
1925
  exports2.computeDepositHash = computeDepositHash2;
1505
1926
  var encoding_utils_1 = require_encoding_utils();
1506
1927
  var escrow_domain_1 = require_escrow_domain();
1507
- var errors_1 = require_errors();
1928
+ var errors_1 = require_errors2();
1508
1929
  function computeDepositHash2(params, domain) {
1509
1930
  if (params.paymentId.length !== 32 || (0, encoding_utils_1.isZeroBytes32)(params.paymentId)) {
1510
1931
  throw new errors_1.ZeroPaymentIdError();
@@ -1532,7 +1953,7 @@ var require_reserve_encoder3 = __commonJS({
1532
1953
  exports2.computeReserveHash = computeReserveHash;
1533
1954
  var encoding_utils_1 = require_encoding_utils();
1534
1955
  var escrow_domain_1 = require_escrow_domain();
1535
- var errors_1 = require_errors();
1956
+ var errors_1 = require_errors2();
1536
1957
  function computeReserveHash(params, domain) {
1537
1958
  if (params.depositHash.length !== 32 || (0, encoding_utils_1.isZeroBytes32)(params.depositHash)) {
1538
1959
  throw new errors_1.ZeroDepositHashError();
@@ -1552,7 +1973,7 @@ var require_release_encoder = __commonJS({
1552
1973
  exports2.computeReleaseHash = computeReleaseHash;
1553
1974
  var encoding_utils_1 = require_encoding_utils();
1554
1975
  var escrow_domain_1 = require_escrow_domain();
1555
- var errors_1 = require_errors();
1976
+ var errors_1 = require_errors2();
1556
1977
  function computeReleaseHash(params, domain) {
1557
1978
  if (params.depositHash.length !== 32 || (0, encoding_utils_1.isZeroBytes32)(params.depositHash)) {
1558
1979
  throw new errors_1.ZeroDepositHashError();
@@ -1570,7 +1991,7 @@ var require_refund_encoder = __commonJS({
1570
1991
  exports2.computeRefundHash = computeRefundHash;
1571
1992
  var encoding_utils_1 = require_encoding_utils();
1572
1993
  var escrow_domain_1 = require_escrow_domain();
1573
- var errors_1 = require_errors();
1994
+ var errors_1 = require_errors2();
1574
1995
  function computeRefundHash(params, domain) {
1575
1996
  if (params.depositHash.length !== 32 || (0, encoding_utils_1.isZeroBytes32)(params.depositHash)) {
1576
1997
  throw new errors_1.ZeroDepositHashError();
@@ -1631,7 +2052,7 @@ var require_dist3 = __commonJS({
1631
2052
  Object.defineProperty(exports2, "escrowDomainPrefixBytes", { enumerable: true, get: function() {
1632
2053
  return escrow_domain_1.escrowDomainPrefixBytes;
1633
2054
  } });
1634
- var errors_1 = require_errors();
2055
+ var errors_1 = require_errors2();
1635
2056
  Object.defineProperty(exports2, "EncodingError", { enumerable: true, get: function() {
1636
2057
  return errors_1.EncodingError;
1637
2058
  } });
@@ -1697,8 +2118,323 @@ var require_dist3 = __commonJS({
1697
2118
  }
1698
2119
  });
1699
2120
 
2121
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/solana.js
2122
+ var require_solana = __commonJS({
2123
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/solana.js"(exports2) {
2124
+ "use strict";
2125
+ var __importDefault = exports2 && exports2.__importDefault || function(mod) {
2126
+ return mod && mod.__esModule ? mod : { "default": mod };
2127
+ };
2128
+ Object.defineProperty(exports2, "__esModule", { value: true });
2129
+ exports2.solanaAdapter = void 0;
2130
+ var ethers_1 = require("ethers");
2131
+ var tweetnacl_1 = __importDefault(require("tweetnacl"));
2132
+ var bs58_1 = __importDefault(require("bs58"));
2133
+ var solana_escrow_encoding_1 = require_dist3();
2134
+ var utils_js_1 = require_utils();
2135
+ var errors_js_1 = require_errors();
2136
+ var chain_id_js_1 = require_chain_id2();
2137
+ var idAddr = (a) => a;
2138
+ function generateSolanaPaymentIdV3(requestId) {
2139
+ return (0, ethers_1.keccak256)((0, ethers_1.toUtf8Bytes)(requestId));
2140
+ }
2141
+ function hashDeposit(prehash, domain) {
2142
+ return (0, ethers_1.hexlify)((0, solana_escrow_encoding_1.computeDepositHash)({
2143
+ paymentId: (0, ethers_1.getBytes)(prehash.payment_id),
2144
+ depositor: solana_escrow_encoding_1.Pubkey.fromBase58(prehash.depositor),
2145
+ mint: solana_escrow_encoding_1.Pubkey.fromBase58(prehash.mint),
2146
+ amount: BigInt(prehash.amount),
2147
+ reserver: solana_escrow_encoding_1.Pubkey.fromBase58(prehash.reserver),
2148
+ releaser: solana_escrow_encoding_1.Pubkey.fromBase58(prehash.releaser),
2149
+ nonce: BigInt(prehash.nonce),
2150
+ issuedAt: BigInt(prehash.issued_at),
2151
+ deadline: BigInt(prehash.deadline)
2152
+ }, domain));
2153
+ }
2154
+ function domainFrom(defaults) {
2155
+ if (!defaults.escrowContract) {
2156
+ throw new Error("sender_auth: Solana source requires escrowContract (escrow program id) for the deposit-hash domain");
2157
+ }
2158
+ if (!defaults.svmSignatureClusterId || defaults.svmSignatureDomainVersion == null) {
2159
+ throw new Error("sender_auth: Solana source requires svmSignatureClusterId and svmSignatureDomainVersion (V3 escrow domain separation)");
2160
+ }
2161
+ return {
2162
+ clusterId: (0, chain_id_js_1.clusterIdFromName)(defaults.svmSignatureClusterId),
2163
+ signatureDomainVersion: defaults.svmSignatureDomainVersion,
2164
+ programId: solana_escrow_encoding_1.Pubkey.fromBase58(defaults.escrowContract)
2165
+ };
2166
+ }
2167
+ exports2.solanaAdapter = {
2168
+ async buildAuthMessage({ sourceAsset, depositor, maxSourceAmount, requestId, sourceDefaults, nonce, solanaClockReader }) {
2169
+ if (!requestId) {
2170
+ throw new Error("sender_auth: request_id is required");
2171
+ }
2172
+ const sourceChainId = sourceAsset.split("/")[0];
2173
+ const tokenMint = sourceAsset.split("/")[1].split(":")[1];
2174
+ const depositNonce = nonce !== void 0 ? BigInt(nonce) : (0, solana_escrow_encoding_1.generateNonce)();
2175
+ if (nonce !== void 0) {
2176
+ if (depositNonce < 0n || depositNonce >= 1n << 64n) {
2177
+ throw new Error("sender_auth: Solana nonce must fit an unsigned 64-bit integer (0 <= nonce < 2^64)");
2178
+ }
2179
+ if ((depositNonce & 0xffn) >= utils_js_1.SOLANA_REPLAY_SLOTS) {
2180
+ 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`);
2181
+ }
2182
+ }
2183
+ const issuedAt = solanaClockReader ? await solanaClockReader(sourceChainId) : BigInt(Math.floor(Date.now() / 1e3));
2184
+ const deadline = issuedAt + BigInt(utils_js_1.REPLAY_HORIZON_SECS - 8);
2185
+ const paymentId = generateSolanaPaymentIdV3(requestId);
2186
+ const prehash = {
2187
+ payment_id: paymentId,
2188
+ depositor,
2189
+ mint: tokenMint,
2190
+ amount: BigInt(maxSourceAmount).toString(),
2191
+ reserver: sourceDefaults.quoteSelector,
2192
+ releaser: sourceDefaults.fulfillmentVerifierAccount,
2193
+ nonce: depositNonce.toString(),
2194
+ issued_at: issuedAt.toString(),
2195
+ deadline: deadline.toString()
2196
+ };
2197
+ const depositHash = hashDeposit(prehash, domainFrom(sourceDefaults));
2198
+ return { messageScheme: "SOLANA", messageHash: depositHash, messagePrehash: JSON.stringify(prehash) };
2199
+ },
2200
+ async sign(signedMessage, privateKey) {
2201
+ const messageBytes = (0, ethers_1.getBytes)(signedMessage.message);
2202
+ const secretKey = secretKeyFromPrivate2(privateKey);
2203
+ const sig = tweetnacl_1.default.sign.detached(messageBytes, secretKey);
2204
+ return "0x" + Buffer.from(sig).toString("hex");
2205
+ },
2206
+ deriveDelegateSigner(privateKey) {
2207
+ return bs58_1.default.encode(tweetnacl_1.default.sign.keyPair.fromSecretKey(secretKeyFromPrivate2(privateKey)).publicKey);
2208
+ },
2209
+ recoverSigner(signed, source) {
2210
+ const provided = signed.payload?.delegate_signer;
2211
+ if (provided !== void 0 && provided !== source.account) {
2212
+ throw new errors_js_1.SignerMismatchError(`sender_auth: delegate_signer ${provided} != source.account`);
2213
+ }
2214
+ const signer = provided ?? source.account;
2215
+ let pub;
2216
+ let msg;
2217
+ let sig;
2218
+ try {
2219
+ pub = bs58_1.default.decode(signer);
2220
+ msg = (0, ethers_1.getBytes)(signed.message);
2221
+ sig = (0, ethers_1.getBytes)(signed.signature);
2222
+ } catch {
2223
+ throw new errors_js_1.RecoveryFailedError("sender_auth: malformed Solana pubkey/message/signature encoding");
2224
+ }
2225
+ if (pub.length !== 32 || msg.length !== 32 || sig.length !== 64) {
2226
+ throw new errors_js_1.RecoveryFailedError("sender_auth: Solana pubkey must be 32 bytes, message 32, signature 64");
2227
+ }
2228
+ let ok = false;
2229
+ try {
2230
+ ok = tweetnacl_1.default.sign.detached.verify(msg, sig, pub);
2231
+ } catch {
2232
+ ok = false;
2233
+ }
2234
+ if (!ok) {
2235
+ throw new errors_js_1.SignerMismatchError("sender_auth: ed25519 verification failed");
2236
+ }
2237
+ return source.account;
2238
+ },
2239
+ recoverAndVerify(signed, source, expected) {
2240
+ let prehash;
2241
+ let canonicalHash;
2242
+ try {
2243
+ prehash = JSON.parse(signed.message_prehash);
2244
+ canonicalHash = hashDeposit(prehash, domainFrom(expected));
2245
+ } catch {
2246
+ throw new errors_js_1.MalformedPrehashError();
2247
+ }
2248
+ if (canonicalHash.toLowerCase() !== signed.message.toLowerCase()) {
2249
+ throw new Error("sender_auth: deposit hash does not match the signed message");
2250
+ }
2251
+ const delegateSigner = signed.payload?.delegate_signer;
2252
+ if (!delegateSigner) {
2253
+ throw new Error("sender_auth: Solana credential is missing delegate_signer");
2254
+ }
2255
+ let verified = false;
2256
+ try {
2257
+ verified = tweetnacl_1.default.sign.detached.verify((0, ethers_1.getBytes)(signed.message), (0, ethers_1.getBytes)(signed.signature), bs58_1.default.decode(delegateSigner));
2258
+ } catch {
2259
+ verified = false;
2260
+ }
2261
+ if (!verified || delegateSigner !== source.account || prehash.depositor !== source.account) {
2262
+ throw new Error("sender_auth: deposit signature does not recover to source.account");
2263
+ }
2264
+ const deadlineSec = Number(prehash.deadline);
2265
+ (0, utils_js_1.assertToken)(prehash.mint, source.asset, idAddr);
2266
+ (0, utils_js_1.assertAmountMatches)(prehash.amount, expected.maxSourceAmount);
2267
+ (0, utils_js_1.assertRolePairComplete)(expected.reserver, expected.releaser);
2268
+ if (expected.reserver !== void 0 && expected.releaser !== void 0) {
2269
+ (0, utils_js_1.assertWitnessRoles)(prehash.reserver, prehash.releaser, expected.reserver, expected.releaser, idAddr);
2270
+ }
2271
+ return {
2272
+ amount: prehash.amount,
2273
+ deadlineSec,
2274
+ permit: {
2275
+ scheme: "SOLANA",
2276
+ token: prehash.mint,
2277
+ amount: prehash.amount,
2278
+ deadlineSec,
2279
+ reserver: prehash.reserver,
2280
+ releaser: prehash.releaser,
2281
+ depositor: prehash.depositor
2282
+ }
2283
+ };
2284
+ }
2285
+ };
2286
+ function secretKeyFromPrivate2(privateKey) {
2287
+ if (/^[0-9a-fA-F]{64}$/.test(privateKey)) {
2288
+ const seed = new Uint8Array(32);
2289
+ for (let i = 0; i < 32; i++) {
2290
+ seed[i] = parseInt(privateKey.substring(i * 2, i * 2 + 2), 16);
2291
+ }
2292
+ return tweetnacl_1.default.sign.keyPair.fromSeed(seed).secretKey;
2293
+ }
2294
+ const decoded = bs58_1.default.decode(privateKey);
2295
+ if (decoded.length === 64)
2296
+ return decoded;
2297
+ if (decoded.length === 32)
2298
+ return tweetnacl_1.default.sign.keyPair.fromSeed(decoded).secretKey;
2299
+ throw new Error(`Invalid Solana private key length: expected 32 or 64 bytes, got ${decoded.length}`);
2300
+ }
2301
+ }
2302
+ });
2303
+
2304
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/index.js
2305
+ var require_adapters = __commonJS({
2306
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/adapters/index.js"(exports2) {
2307
+ "use strict";
2308
+ Object.defineProperty(exports2, "__esModule", { value: true });
2309
+ exports2.getChainAdapter = getChainAdapter2;
2310
+ var chain_id_js_1 = require_chain_id2();
2311
+ var evm_js_1 = require_evm();
2312
+ var tron_js_1 = require_tron();
2313
+ var solana_js_1 = require_solana();
2314
+ var adapters2 = {
2315
+ eip155: evm_js_1.evmAdapter,
2316
+ tron: tron_js_1.tronAdapter,
2317
+ solana: solana_js_1.solanaAdapter
2318
+ };
2319
+ function getChainAdapter2(caip2) {
2320
+ const adapter = adapters2[(0, chain_id_js_1.namespaceOf)(caip2)];
2321
+ if (!adapter) {
2322
+ throw new Error(`sender_auth: unsupported source chain '${caip2}'`);
2323
+ }
2324
+ return adapter;
2325
+ }
2326
+ }
2327
+ });
2328
+
2329
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/verify.js
2330
+ var require_verify = __commonJS({
2331
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/verify.js"(exports2) {
2332
+ "use strict";
2333
+ Object.defineProperty(exports2, "__esModule", { value: true });
2334
+ exports2.verifyPaymentRequest = verifyPaymentRequest;
2335
+ var index_js_1 = require_adapters();
2336
+ function parseSourceAsset(assetIdentifier) {
2337
+ const parts = assetIdentifier.split("/");
2338
+ const nsParts = parts[1]?.split(":");
2339
+ if (parts.length < 2 || !nsParts || nsParts.length < 2 || !nsParts[1]) {
2340
+ throw new Error(`sender_auth: invalid source asset "${assetIdentifier}"`);
2341
+ }
2342
+ return { network: parts[0], asset: nsParts[1] };
2343
+ }
2344
+ function verifyPaymentRequest(request2, expected = {}) {
2345
+ const senderAuth = request2.sender_auth;
2346
+ if (!senderAuth?.signed_messages?.length) {
2347
+ throw new Error("sender_auth: request has no signed_messages to verify");
2348
+ }
2349
+ if (!request2.source) {
2350
+ throw new Error("sender_auth: request has no source");
2351
+ }
2352
+ const requestSource = parseSourceAsset(request2.source.asset_identifier);
2353
+ const { sourceAsset, network: networkOverride, maxSourceAmount: amountOverride, ...scheme } = expected;
2354
+ const network = networkOverride ?? requestSource.network;
2355
+ const asset = sourceAsset ?? requestSource.asset;
2356
+ const maxSourceAmount = amountOverride ?? request2.max_source_amount ?? "0";
2357
+ const source = { network, asset, account: request2.source.account };
2358
+ const perMessage = { ...scheme, maxSourceAmount };
2359
+ const adapter = (0, index_js_1.getChainAdapter)(network);
2360
+ const results = senderAuth.signed_messages.map((m) => adapter.recoverAndVerify(m, source, perMessage));
2361
+ return { results, recoveredAccount: source.account };
2362
+ }
2363
+ }
2364
+ });
2365
+
2366
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/signer.js
2367
+ var require_signer = __commonJS({
2368
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/signer.js"(exports2) {
2369
+ "use strict";
2370
+ Object.defineProperty(exports2, "__esModule", { value: true });
2371
+ exports2.localKeySigner = localKeySigner2;
2372
+ var index_js_1 = require_adapters();
2373
+ function localKeySigner2(network, privateKey) {
2374
+ const adapter = (0, index_js_1.getChainAdapter)(network);
2375
+ return {
2376
+ async sign(signedMessage) {
2377
+ const signature = await adapter.sign(signedMessage, privateKey);
2378
+ const delegateSigner = adapter.deriveDelegateSigner?.(privateKey);
2379
+ return delegateSigner !== void 0 ? { signature, delegateSigner } : { signature };
2380
+ }
2381
+ };
2382
+ }
2383
+ }
2384
+ });
2385
+
2386
+ // ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/index.js
2387
+ var require_dist4 = __commonJS({
2388
+ "../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/index.js"(exports2) {
2389
+ "use strict";
2390
+ var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
2391
+ if (k2 === void 0) k2 = k;
2392
+ var desc = Object.getOwnPropertyDescriptor(m, k);
2393
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
2394
+ desc = { enumerable: true, get: function() {
2395
+ return m[k];
2396
+ } };
2397
+ }
2398
+ Object.defineProperty(o, k2, desc);
2399
+ }) : (function(o, m, k, k2) {
2400
+ if (k2 === void 0) k2 = k;
2401
+ o[k2] = m[k];
2402
+ }));
2403
+ var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) {
2404
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);
2405
+ };
2406
+ Object.defineProperty(exports2, "__esModule", { value: true });
2407
+ exports2.localKeySigner = exports2.SignerMismatchError = exports2.RecoveryFailedError = exports2.MalformedPrehashError = exports2.verifyPaymentRequest = exports2.getChainAdapter = void 0;
2408
+ __exportStar(require_types(), exports2);
2409
+ __exportStar(require_utils(), exports2);
2410
+ __exportStar(require_chain_id2(), exports2);
2411
+ var index_js_1 = require_adapters();
2412
+ Object.defineProperty(exports2, "getChainAdapter", { enumerable: true, get: function() {
2413
+ return index_js_1.getChainAdapter;
2414
+ } });
2415
+ var verify_js_1 = require_verify();
2416
+ Object.defineProperty(exports2, "verifyPaymentRequest", { enumerable: true, get: function() {
2417
+ return verify_js_1.verifyPaymentRequest;
2418
+ } });
2419
+ var errors_js_1 = require_errors();
2420
+ Object.defineProperty(exports2, "MalformedPrehashError", { enumerable: true, get: function() {
2421
+ return errors_js_1.MalformedPrehashError;
2422
+ } });
2423
+ Object.defineProperty(exports2, "RecoveryFailedError", { enumerable: true, get: function() {
2424
+ return errors_js_1.RecoveryFailedError;
2425
+ } });
2426
+ Object.defineProperty(exports2, "SignerMismatchError", { enumerable: true, get: function() {
2427
+ return errors_js_1.SignerMismatchError;
2428
+ } });
2429
+ var signer_js_1 = require_signer();
2430
+ Object.defineProperty(exports2, "localKeySigner", { enumerable: true, get: function() {
2431
+ return signer_js_1.localKeySigner;
2432
+ } });
2433
+ }
2434
+ });
2435
+
1700
2436
  // ../key-management/common/typescript/dist/errors.js
1701
- var require_errors2 = __commonJS({
2437
+ var require_errors3 = __commonJS({
1702
2438
  "../key-management/common/typescript/dist/errors.js"(exports2) {
1703
2439
  "use strict";
1704
2440
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -1762,7 +2498,7 @@ var require_errors2 = __commonJS({
1762
2498
  });
1763
2499
 
1764
2500
  // ../key-management/common/typescript/dist/types.js
1765
- var require_types = __commonJS({
2501
+ var require_types2 = __commonJS({
1766
2502
  "../key-management/common/typescript/dist/types.js"(exports2) {
1767
2503
  "use strict";
1768
2504
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -1794,7 +2530,7 @@ var require_policy = __commonJS({
1794
2530
  });
1795
2531
 
1796
2532
  // ../key-management/common/typescript/dist/index.js
1797
- var require_dist4 = __commonJS({
2533
+ var require_dist5 = __commonJS({
1798
2534
  "../key-management/common/typescript/dist/index.js"(exports2) {
1799
2535
  "use strict";
1800
2536
  var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
@@ -1814,8 +2550,8 @@ var require_dist4 = __commonJS({
1814
2550
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);
1815
2551
  };
1816
2552
  Object.defineProperty(exports2, "__esModule", { value: true });
1817
- __exportStar(require_errors2(), exports2);
1818
- __exportStar(require_types(), exports2);
2553
+ __exportStar(require_errors3(), exports2);
2554
+ __exportStar(require_types2(), exports2);
1819
2555
  __exportStar(require_policy(), exports2);
1820
2556
  }
1821
2557
  });
@@ -1936,7 +2672,7 @@ var require_client = __commonJS({
1936
2672
  Object.defineProperty(exports2, "__esModule", { value: true });
1937
2673
  exports2.TurnkeyClient = void 0;
1938
2674
  var promises_1 = require("timers/promises");
1939
- var km_core_1 = require_dist4();
2675
+ var km_core_1 = require_dist5();
1940
2676
  var constants_1 = require_constants();
1941
2677
  var logger_1 = require_logger();
1942
2678
  var meter_1 = require_meter();
@@ -2297,7 +3033,7 @@ var require_signer_base = __commonJS({
2297
3033
  Object.defineProperty(exports2, "__esModule", { value: true });
2298
3034
  exports2.resolveTurnkeyAccountAddress = resolveTurnkeyAccountAddress;
2299
3035
  var promises_1 = require("timers/promises");
2300
- var km_core_1 = require_dist4();
3036
+ var km_core_1 = require_dist5();
2301
3037
  var constants_1 = require_constants();
2302
3038
  var DISCOVERY_BACKOFF_MS = constants_1.TURNKEY_RETRY_BACKOFF_MS;
2303
3039
  async function resolveTurnkeyAccountAddress(deps, addressFormat) {
@@ -2355,7 +3091,7 @@ var require_secp256k1_helpers = __commonJS({
2355
3091
  exports2.signSecp256k1PreimageAndVerify = signSecp256k1PreimageAndVerify;
2356
3092
  exports2.bytesFromHexOrBytes = bytesFromHexOrBytes;
2357
3093
  var ethers_1 = require("ethers");
2358
- var km_core_1 = require_dist4();
3094
+ var km_core_1 = require_dist5();
2359
3095
  async function signSecp256k1PreimageAndVerify(client, signWith, preimage, expectedEvmAddrLower) {
2360
3096
  const preimageHex = (0, ethers_1.hexlify)(preimage).slice(2);
2361
3097
  const { r, s, v } = await client.signRawPayload({
@@ -2388,13 +3124,13 @@ var require_secp256k1_helpers = __commonJS({
2388
3124
  });
2389
3125
 
2390
3126
  // ../key-management/providers/turnkey/typescript/dist/chains/evm.js
2391
- var require_evm = __commonJS({
3127
+ var require_evm2 = __commonJS({
2392
3128
  "../key-management/providers/turnkey/typescript/dist/chains/evm.js"(exports2) {
2393
3129
  "use strict";
2394
3130
  Object.defineProperty(exports2, "__esModule", { value: true });
2395
3131
  exports2.TurnkeyEvmSigner = void 0;
2396
3132
  var ethers_1 = require("ethers");
2397
- var km_core_1 = require_dist4();
3133
+ var km_core_1 = require_dist5();
2398
3134
  var signer_base_1 = require_signer_base();
2399
3135
  var secp256k1_helpers_1 = require_secp256k1_helpers();
2400
3136
  var ADDRESS_FORMAT = "ADDRESS_FORMAT_ETHEREUM";
@@ -2511,7 +3247,7 @@ ${msgBytes.length}`);
2511
3247
  });
2512
3248
 
2513
3249
  // ../key-management/providers/turnkey/typescript/dist/chains/solana.js
2514
- var require_solana = __commonJS({
3250
+ var require_solana2 = __commonJS({
2515
3251
  "../key-management/providers/turnkey/typescript/dist/chains/solana.js"(exports2) {
2516
3252
  "use strict";
2517
3253
  var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
@@ -2558,7 +3294,7 @@ var require_solana = __commonJS({
2558
3294
  exports2.TurnkeySolanaSigner = void 0;
2559
3295
  var web3_js_1 = require("@solana/web3.js");
2560
3296
  var bs58_1 = __importDefault(require("bs58"));
2561
- var km_core_1 = require_dist4();
3297
+ var km_core_1 = require_dist5();
2562
3298
  var signer_base_1 = require_signer_base();
2563
3299
  var ADDRESS_FORMAT = "ADDRESS_FORMAT_SOLANA";
2564
3300
  var TurnkeySolanaSigner2 = class {
@@ -2643,7 +3379,7 @@ var require_solana = __commonJS({
2643
3379
  });
2644
3380
 
2645
3381
  // ../key-management/providers/turnkey/typescript/dist/chains/tron.js
2646
- var require_tron = __commonJS({
3382
+ var require_tron2 = __commonJS({
2647
3383
  "../key-management/providers/turnkey/typescript/dist/chains/tron.js"(exports2) {
2648
3384
  "use strict";
2649
3385
  var __importDefault = exports2 && exports2.__importDefault || function(mod) {
@@ -2655,7 +3391,7 @@ var require_tron = __commonJS({
2655
3391
  var bs58_1 = __importDefault(require("bs58"));
2656
3392
  var ethers_1 = require("ethers");
2657
3393
  var node_crypto_1 = require("crypto");
2658
- var km_core_1 = require_dist4();
3394
+ var km_core_1 = require_dist5();
2659
3395
  var signer_base_1 = require_signer_base();
2660
3396
  var secp256k1_helpers_1 = require_secp256k1_helpers();
2661
3397
  var ADDRESS_FORMAT = "ADDRESS_FORMAT_TRON";
@@ -2795,9 +3531,20 @@ var require_sub_organizations = __commonJS({
2795
3531
  exports2.listSubOrganizations = listSubOrganizations;
2796
3532
  exports2.deleteSubOrganization = deleteSubOrganization;
2797
3533
  async function createSubOrganization(client, input) {
3534
+ const rootUsers = input.rootUsers.map((u) => ({
3535
+ userName: u.userName,
3536
+ ...u.userEmail ? { userEmail: u.userEmail } : {},
3537
+ apiKeys: (u.apiKeys ?? []).map((k) => ({
3538
+ apiKeyName: k.apiKeyName,
3539
+ publicKey: k.publicKey,
3540
+ curveType: k.curveType ?? "API_KEY_CURVE_P256"
3541
+ })),
3542
+ authenticators: u.authenticators ?? [],
3543
+ oauthProviders: []
3544
+ }));
2798
3545
  const params = {
2799
3546
  subOrganizationName: input.subOrganizationName,
2800
- rootUsers: input.rootUsers,
3547
+ rootUsers,
2801
3548
  rootQuorumThreshold: input.rootQuorumThreshold,
2802
3549
  wallet: input.wallet ? {
2803
3550
  walletName: input.wallet.walletName,
@@ -2818,8 +3565,8 @@ var require_sub_organizations = __commonJS({
2818
3565
  const out = await client.query("/public/v1/query/list_suborgs");
2819
3566
  return (out.organizationIds ?? []).map((id) => ({ subOrganizationId: id }));
2820
3567
  }
2821
- async function deleteSubOrganization(client, subOrganizationId) {
2822
- await client.executeActivity("ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION", "delete_sub_organization", { subOrganizationId, deleteWithoutExport: true });
3568
+ async function deleteSubOrganization(client, opts = {}) {
3569
+ await client.executeActivity("ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION", "delete_sub_organization", { deleteWithoutExport: opts.deleteWithoutExport ?? false });
2823
3570
  }
2824
3571
  }
2825
3572
  });
@@ -3299,6 +4046,19 @@ var require_sender_policies = __commonJS({
3299
4046
  condition: `activity.type == 'ACTIVITY_TYPE_SIGN_TRANSACTION_V2' && solana.tx.instructions.all(i, i.program_key in [${list}])`,
3300
4047
  notes: "Sender Solana deposit txs invoke ComputeBudget + Ed25519Program + Atum escrow only."
3301
4048
  });
4049
+ const solCap = extras.solanaMaxNativeValue ?? "10000000";
4050
+ policies.push({
4051
+ policyName: `maxNativeValue (${chain.chainId})`,
4052
+ effect: "EFFECT_DENY",
4053
+ condition: `activity.type == 'ACTIVITY_TYPE_SIGN_TRANSACTION_V2' && solana.tx.transfers.any(t, t.amount > ${solCap})`,
4054
+ notes: "Caps native SOL (lamports); default 10,000,000 (0.01 SOL) ATA-rent headroom."
4055
+ });
4056
+ policies.push({
4057
+ policyName: `denySplTransfers (${chain.chainId})`,
4058
+ effect: "EFFECT_DENY",
4059
+ condition: `activity.type == 'ACTIVITY_TYPE_SIGN_TRANSACTION_V2' && solana.tx.spl_transfers.any(t, !(t.to in []))`,
4060
+ notes: "Denies all top-level SPL transfers; the sender moves tokens only via escrow CPI."
4061
+ });
3302
4062
  }
3303
4063
  }
3304
4064
  policies.push({
@@ -3419,7 +4179,7 @@ var require_extras_policies = __commonJS({
3419
4179
  validateAddressMap(obj.allowedTrc20Recipients, "allowedTrc20Recipients", TRON_ADDRESS, source);
3420
4180
  }
3421
4181
  if (obj.allowedSplRecipients != null) {
3422
- validateAddressMap(obj.allowedSplRecipients, "allowedSplRecipients", /^[1-9A-HJ-NP-Za-km-z]{32,44}$/, source);
4182
+ validateAddressMap(obj.allowedSplRecipients, "allowedSplRecipients", /^[1-9A-HJ-NP-Za-km-z]{32,44}$/, source, true);
3423
4183
  }
3424
4184
  if (obj.evmCaps != null) {
3425
4185
  validateCapMap(obj.evmCaps, "evmCaps", ["maxGasLimit", "maxFeePerGasWei"], source);
@@ -3450,12 +4210,12 @@ var require_extras_policies = __commonJS({
3450
4210
  }
3451
4211
  }
3452
4212
  }
3453
- function validateAddressMap(map, field, pattern, source) {
4213
+ function validateAddressMap(map, field, pattern, source, allowEmpty = false) {
3454
4214
  if (typeof map !== "object" || map == null || Array.isArray(map)) {
3455
4215
  throw new Error(`${source}: ${field} must be a map keyed by chain name.`);
3456
4216
  }
3457
4217
  for (const [chainKey, list] of Object.entries(map)) {
3458
- if (!Array.isArray(list) || list.length === 0) {
4218
+ if (!Array.isArray(list) || !allowEmpty && list.length === 0) {
3459
4219
  throw new Error(`${source}: ${field}.${chainKey} must be a non-empty list of addresses.`);
3460
4220
  }
3461
4221
  for (const addr of list) {
@@ -3530,6 +4290,10 @@ var require_extras_policies = __commonJS({
3530
4290
  const jobs = [];
3531
4291
  for (const [chainKey, recipients] of Object.entries(extras.allowedSplRecipients)) {
3532
4292
  const chainId = resolveChainId("allowedSplRecipients", chainKey, "solana:");
4293
+ if (recipients.length === 0) {
4294
+ out.push(buildSplRecipientPolicy(chainId, []));
4295
+ continue;
4296
+ }
3533
4297
  const mints = ctx.solanaMintsByChainKey[chainKey] ?? [];
3534
4298
  if (mints.length === 0) {
3535
4299
  throw new Error(`allowedSplRecipients.${chainKey} requires the Solana chain "${chainKey}" to expose at least one asset mint; got 0.`);
@@ -3597,7 +4361,7 @@ var require_extras_policies = __commonJS({
3597
4361
  policyName: `allowedSplRecipients (${chainId})`,
3598
4362
  effect: "EFFECT_DENY",
3599
4363
  condition: `activity.type == 'ACTIVITY_TYPE_SIGN_TRANSACTION_V2' && solana.tx.spl_transfers.any(t, !(t.to in [${list}]))`,
3600
- notes: "Denies any top-level SPL transfer to a destination ATA outside the allowlist."
4364
+ notes: allowedAtas.length === 0 ? "Denies ALL top-level SPL transfers (empty allowlist \u2014 no destination is permitted)." : "Denies any top-level SPL transfer to a destination ATA outside the allowlist."
3601
4365
  };
3602
4366
  }
3603
4367
  }
@@ -3675,7 +4439,7 @@ var require_admin = __commonJS({
3675
4439
  });
3676
4440
 
3677
4441
  // ../key-management/providers/turnkey/typescript/dist/index.js
3678
- var require_dist5 = __commonJS({
4442
+ var require_dist6 = __commonJS({
3679
4443
  "../key-management/providers/turnkey/typescript/dist/index.js"(exports2) {
3680
4444
  "use strict";
3681
4445
  var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
@@ -3730,15 +4494,15 @@ var require_dist5 = __commonJS({
3730
4494
  Object.defineProperty(exports2, "noopMeter", { enumerable: true, get: function() {
3731
4495
  return meter_1.noopMeter;
3732
4496
  } });
3733
- var evm_1 = require_evm();
4497
+ var evm_1 = require_evm2();
3734
4498
  Object.defineProperty(exports2, "TurnkeyEvmSigner", { enumerable: true, get: function() {
3735
4499
  return evm_1.TurnkeyEvmSigner;
3736
4500
  } });
3737
- var solana_1 = require_solana();
4501
+ var solana_1 = require_solana2();
3738
4502
  Object.defineProperty(exports2, "TurnkeySolanaSigner", { enumerable: true, get: function() {
3739
4503
  return solana_1.TurnkeySolanaSigner;
3740
4504
  } });
3741
- var tron_1 = require_tron();
4505
+ var tron_1 = require_tron2();
3742
4506
  Object.defineProperty(exports2, "TurnkeyTronSigner", { enumerable: true, get: function() {
3743
4507
  return tron_1.TurnkeyTronSigner;
3744
4508
  } });
@@ -3853,7 +4617,7 @@ var import_turnkey_signer, TURNKEY_API_URL, DEFAULTS;
3853
4617
  var init_turnkey_impl = __esm({
3854
4618
  "src/signers/turnkey-impl.ts"() {
3855
4619
  "use strict";
3856
- import_turnkey_signer = __toESM(require_dist5());
4620
+ import_turnkey_signer = __toESM(require_dist6());
3857
4621
  TURNKEY_API_URL = "https://api.turnkey.com";
3858
4622
  DEFAULTS = {
3859
4623
  concurrencyLimit: 10,
@@ -3917,7 +4681,6 @@ __export(index_exports, {
3917
4681
  PaymentsService: () => PaymentsService,
3918
4682
  QuoteRequestsService: () => QuoteRequestsService,
3919
4683
  REPLAY_HORIZON_SECS: () => REPLAY_HORIZON_SECS,
3920
- RawSenderSigner: () => RawSenderSigner,
3921
4684
  TOTAL_BUCKETS: () => TOTAL_BUCKETS,
3922
4685
  TurnkeySenderSigner: () => TurnkeySenderSigner,
3923
4686
  base58ToBytes: () => base58ToBytes,
@@ -4391,7 +5154,11 @@ var PaymentsService = class {
4391
5154
  mediaType: "application/json",
4392
5155
  errors: {
4393
5156
  400: "Invalid request",
4394
- 500: "Internal server error"
5157
+ 401: "Signature or sender authorization could not be verified",
5158
+ 403: "Payment declined during counterparty authorization",
5159
+ 413: "Payment request too large to process",
5160
+ 500: "Internal server error",
5161
+ 503: "A dependency is temporarily unavailable"
4395
5162
  }
4396
5163
  });
4397
5164
  }
@@ -4524,6 +5291,7 @@ var AuthorizationsService = class {
4524
5291
  errors: {
4525
5292
  400: "Invalid payment request",
4526
5293
  404: "Counterparty not found (no registration for the resolved DID)",
5294
+ 500: "Internal server error",
4527
5295
  502: "Counterparty webhook error (HTTP error or connection failure)",
4528
5296
  504: "Authorization timed out (counterparty did not respond)"
4529
5297
  }
@@ -4699,60 +5467,18 @@ var PaymentGatewayClient = class {
4699
5467
  };
4700
5468
 
4701
5469
  // src/chain-adapters/evm.ts
4702
- var import_ethers2 = require("ethers");
5470
+ var import_ethers = require("ethers");
4703
5471
 
4704
5472
  // src/chain-adapters/types.ts
4705
- var PERMIT_DEADLINE = BigInt(1924991999);
4706
- function resolvePermitDeadline(deadlineSeconds) {
4707
- if (deadlineSeconds !== void 0) {
4708
- return BigInt(Math.floor(Date.now() / 1e3) + deadlineSeconds);
4709
- }
4710
- return PERMIT_DEADLINE;
4711
- }
4712
- function generatePermitNonce() {
4713
- const rand = new Uint32Array(1);
4714
- globalThis.crypto.getRandomValues(rand);
4715
- return (BigInt(Date.now()) << 32n) + BigInt(rand[0]);
4716
- }
4717
5473
  function assertKeyMatchesSender(matches, sender, derived) {
4718
5474
  if (!matches) {
4719
5475
  throw new Error(`The private key derives ${derived}, which does not match the sender address ${sender}`);
4720
5476
  }
4721
5477
  }
4722
5478
 
4723
- // src/sender_auth_schemes/evm_permit2.ts
4724
- var import_ethers = require("ethers");
4725
- var import_evm_escrow_encoding = __toESM(require_dist());
4726
- function hashRequestId(requestId) {
4727
- return (0, import_ethers.keccak256)((0, import_ethers.toUtf8Bytes)(requestId));
4728
- }
4729
-
4730
5479
  // src/chain-adapters/evm.ts
4731
5480
  var evmAdapter = {
4732
5481
  turnkeyAddressFormat: "ADDRESS_FORMAT_ETHEREUM",
4733
- async buildAuthMessage({ sourceAsset, fulfillmentAmount, sourceDefaults, deadlineSeconds }) {
4734
- const sourceChainId = sourceAsset.split("/")[0];
4735
- const chainIdNum = parseInt(sourceChainId.split(":")[1]);
4736
- const tokenAddress = sourceAsset.split("/")[1].split(":")[1];
4737
- const permitParams = {
4738
- chainId: chainIdNum,
4739
- verifyingContract: import_evm_escrow_encoding.PERMIT2_CONTRACT_ADDRESS,
4740
- token: tokenAddress,
4741
- amount: fulfillmentAmount,
4742
- spender: sourceDefaults.escrowContract,
4743
- nonce: generatePermitNonce(),
4744
- deadline: resolvePermitDeadline(deadlineSeconds),
4745
- reserver: sourceDefaults.quoteSelector,
4746
- releaser: sourceDefaults.fulfillmentVerifierAccount
4747
- };
4748
- const messagePrehash = (0, import_evm_escrow_encoding.createPermitWitnessTransferFromPrehash)(permitParams);
4749
- const messageHash = (0, import_evm_escrow_encoding.hashPermitWitnessTransferFrom)(messagePrehash);
4750
- return {
4751
- messageScheme: "EVM_PERMIT2",
4752
- messageHash,
4753
- messagePrehash: JSON.stringify(messagePrehash)
4754
- };
4755
- },
4756
5482
  formatPrivateKey(key) {
4757
5483
  return key.startsWith("0x") ? key : "0x" + key;
4758
5484
  },
@@ -4763,78 +5489,22 @@ var evmAdapter = {
4763
5489
  throw new Error("Invalid private key");
4764
5490
  }
4765
5491
  },
4766
- /**
4767
- * Sign the Permit2 PermitWitnessTransferFrom typed data via standard
4768
- * EIP-712 signing. The prehash is already shaped for direct consumption
4769
- * by ethers' signTypedData (Permit2 domain has no version/salt; types
4770
- * omits EIP712Domain since ethers generates that from the domain object).
4771
- */
4772
- async sign(signedMessage, privateKey) {
4773
- if (!signedMessage.message_prehash) {
4774
- throw new Error("EVM adapter sign(): signed_messages[i].message_prehash is required");
4775
- }
4776
- const prehash = JSON.parse(signedMessage.message_prehash);
4777
- const wallet = new import_ethers2.ethers.Wallet(privateKey);
4778
- return wallet.signTypedData(prehash.domain, prehash.types, prehash.message);
4779
- },
4780
5492
  // Called after validatePrivateKey, so ethers.Wallet won't echo a malformed key.
4781
5493
  verifyAddressMatchesKey(privateKey, address) {
4782
- const derived = new import_ethers2.ethers.Wallet(privateKey).address;
5494
+ const derived = new import_ethers.ethers.Wallet(privateKey).address;
4783
5495
  assertKeyMatchesSender(derived.toLowerCase() === address.toLowerCase(), address, derived);
4784
5496
  }
4785
5497
  };
4786
5498
 
4787
5499
  // src/chain-adapters/tron.ts
4788
- var import_ethers3 = require("ethers");
5500
+ var import_ethers2 = require("ethers");
4789
5501
 
4790
5502
  // src/sender_auth_schemes/tron.ts
4791
- var import_tvm_escrow_encoding = __toESM(require_dist2());
5503
+ var import_tvm_escrow_encoding = __toESM(require_dist());
4792
5504
 
4793
5505
  // src/chain-adapters/tron.ts
4794
- var CHAIN_ID_MAP = {
4795
- "shasta": 2494104990,
4796
- "mainnet": 728126428
4797
- };
4798
- var PERMIT2_FALLBACKS = {
4799
- "tron:shasta": "TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp",
4800
- "tron:mainnet": "TJhMXTHQHeQyMD7TcKQFqAePNgG4b31H9m"
4801
- };
4802
5506
  var tronAdapter = {
4803
5507
  turnkeyAddressFormat: "ADDRESS_FORMAT_TRON",
4804
- async buildAuthMessage({ sourceAsset, fulfillmentAmount, sourceDefaults, deadlineSeconds }) {
4805
- const sourceChainId = sourceAsset.split("/")[0];
4806
- const chainName = sourceChainId.split(":")[1];
4807
- const chainIdNum = CHAIN_ID_MAP[chainName];
4808
- if (!chainIdNum) {
4809
- throw new Error(`Unsupported Tron chain: ${chainName}`);
4810
- }
4811
- const tokenAddress = sourceAsset.split("/")[1].split(":")[1];
4812
- let permit2Address = sourceDefaults.permit2Contract;
4813
- if (permit2Address === void 0) {
4814
- permit2Address = PERMIT2_FALLBACKS[sourceChainId];
4815
- if (!permit2Address) {
4816
- throw new Error(`don't know Permit2 address for chain ${sourceChainId}`);
4817
- }
4818
- }
4819
- const tvmParams = {
4820
- chainId: chainIdNum,
4821
- permit2Address,
4822
- tokenAddress,
4823
- amount: fulfillmentAmount,
4824
- spenderAddress: sourceDefaults.escrowContract,
4825
- nonce: generatePermitNonce(),
4826
- deadline: resolvePermitDeadline(deadlineSeconds),
4827
- reserverAddress: sourceDefaults.quoteSelector,
4828
- releaserAddress: sourceDefaults.fulfillmentVerifierAccount
4829
- };
4830
- const messagePrehash = (0, import_tvm_escrow_encoding.createTvmPermitWitnessTransferFromPrehash)(tvmParams);
4831
- const messageHash = (0, import_tvm_escrow_encoding.hashTvmPermitWitnessTransferFrom)(messagePrehash);
4832
- return {
4833
- messageScheme: "EVM_PERMIT2",
4834
- messageHash,
4835
- messagePrehash: JSON.stringify(messagePrehash)
4836
- };
4837
- },
4838
5508
  resolveContractOverrides(sourceDefaults) {
4839
5509
  return {
4840
5510
  quote_selector: (0, import_tvm_escrow_encoding.normalizeAddress)(sourceDefaults.quoteSelector),
@@ -4854,133 +5524,68 @@ var tronAdapter = {
4854
5524
  throw new Error("Invalid private key");
4855
5525
  }
4856
5526
  },
4857
- /**
4858
- * Tron uses TIP-712 typed-data — same wire format as EIP-712. The prehash
4859
- * built by createTvmPermitWitnessTransferFromPrehash is now directly
4860
- * consumable by `wallet.signTypedData(prehash.domain, prehash.types,
4861
- * prehash.message)`, but this adapter (an internal SDK helper) stays on the
4862
- * raw-hash sign for parity with the EVM adapter — e2e tests use ethers
4863
- * directly when they need the typed-data path.
4864
- */
4865
- async sign(signedMessage, privateKey) {
4866
- const wallet = new import_ethers3.ethers.Wallet(privateKey.startsWith("0x") ? privateKey : "0x" + privateKey);
4867
- return wallet.signingKey.sign(signedMessage.message).serialized;
4868
- },
4869
5527
  // Tron addresses are the same secp256k1-derived 20 bytes as EVM. Compare the
4870
5528
  // derived hex directly against the canonical sender; do NOT run normalizeAddress
4871
5529
  // on the derived side — it strips a leading 41, which would corrupt an address
4872
5530
  // whose first byte is 0x41.
4873
5531
  verifyAddressMatchesKey(privateKey, address) {
4874
5532
  const key = privateKey.startsWith("0x") ? privateKey : "0x" + privateKey;
4875
- const derived = new import_ethers3.ethers.Wallet(key).address;
5533
+ const derived = new import_ethers2.ethers.Wallet(key).address;
4876
5534
  assertKeyMatchesSender(derived.toLowerCase() === (0, import_tvm_escrow_encoding.normalizeAddress)(address), address, derived);
4877
5535
  }
4878
5536
  };
4879
5537
 
4880
- // src/chain-adapters/solana.ts
4881
- var import_tweetnacl = __toESM(require("tweetnacl"));
4882
- var import_bs582 = __toESM(require("bs58"));
4883
- var import_solana_escrow_encoding2 = __toESM(require_dist3());
4884
-
4885
- // src/sender_auth_schemes/solana.ts
4886
- var import_ethers4 = require("ethers");
4887
- var import_bs58 = __toESM(require("bs58"));
4888
- var import_solana_escrow_encoding = __toESM(require_dist3());
4889
- var REPLAY_HORIZON_SECS = 128;
4890
- var TOTAL_BUCKETS = 131072;
4891
- var DEPOSIT_MESSAGE_SIZE = 199;
4892
- function base58ToBytes(address) {
4893
- const bytes = import_bs58.default.decode(address);
4894
- if (bytes.length !== 32) {
4895
- throw new Error(`Invalid Solana public key length: expected 32 bytes, got ${bytes.length}`);
4896
- }
4897
- return bytes;
4898
- }
4899
- function bytesToHex(bytes) {
4900
- return (0, import_ethers4.hexlify)(bytes);
4901
- }
4902
- function hexToBytes(hex) {
4903
- return (0, import_ethers4.getBytes)(hex.startsWith("0x") ? hex : "0x" + hex);
4904
- }
4905
- function generateSolanaPaymentId(requestId, params) {
4906
- const depositorBytes = base58ToBytes(params.depositor);
4907
- const reserverBytes = base58ToBytes(params.reserver);
4908
- const releaserBytes = base58ToBytes(params.releaser);
4909
- return (0, import_ethers4.keccak256)((0, import_ethers4.concat)([
4910
- (0, import_ethers4.toUtf8Bytes)(requestId),
4911
- (0, import_ethers4.toUtf8Bytes)("deposit"),
4912
- depositorBytes,
4913
- (0, import_solana_escrow_encoding.encodeU64LE)(params.amount),
4914
- reserverBytes,
4915
- releaserBytes,
4916
- (0, import_solana_escrow_encoding.encodeU64LE)(params.nonce),
4917
- (0, import_solana_escrow_encoding.encodeU64LE)(params.issuedAt),
4918
- (0, import_solana_escrow_encoding.encodeU64LE)(params.deadline)
4919
- ]));
4920
- }
4921
- function createSolanaDepositPrehash(paymentId, params) {
4922
- return {
4923
- payment_id: paymentId,
4924
- depositor: params.depositor,
4925
- mint: params.mint,
4926
- amount: params.amount.toString(),
4927
- reserver: params.reserver,
4928
- releaser: params.releaser,
4929
- nonce: params.nonce.toString(),
4930
- issued_at: params.issuedAt.toString(),
4931
- deadline: params.deadline.toString()
4932
- };
4933
- }
4934
- function hashSolanaDeposit(prehash) {
4935
- const paymentIdBytes = hexToBytes(prehash.payment_id);
4936
- const depositorBytes = base58ToBytes(prehash.depositor);
4937
- const mintBytes = base58ToBytes(prehash.mint);
4938
- const reserverBytes = base58ToBytes(prehash.reserver);
4939
- const releaserBytes = base58ToBytes(prehash.releaser);
4940
- return (0, import_ethers4.keccak256)((0, import_ethers4.concat)([
4941
- (0, import_ethers4.toUtf8Bytes)("deposit"),
4942
- paymentIdBytes,
4943
- depositorBytes,
4944
- mintBytes,
4945
- (0, import_solana_escrow_encoding.encodeU64LE)(BigInt(prehash.amount)),
4946
- reserverBytes,
4947
- releaserBytes,
4948
- (0, import_solana_escrow_encoding.encodeU64LE)(BigInt(prehash.nonce)),
4949
- (0, import_solana_escrow_encoding.encodeU64LE)(BigInt(prehash.issued_at)),
4950
- (0, import_solana_escrow_encoding.encodeU64LE)(BigInt(prehash.deadline))
4951
- ]));
4952
- }
4953
- function generateSolanaNonce() {
4954
- return (0, import_solana_escrow_encoding.generateNonce)();
5538
+ // src/chain-adapters/solana.ts
5539
+ var import_tweetnacl = __toESM(require("tweetnacl"));
5540
+ var import_bs58 = __toESM(require("bs58"));
5541
+ var solanaAdapter = {
5542
+ turnkeyAddressFormat: "ADDRESS_FORMAT_SOLANA",
5543
+ formatPrivateKey(key) {
5544
+ return key.startsWith("0x") ? key.slice(2) : key;
5545
+ },
5546
+ verifyAddressMatchesKey(privateKey, address) {
5547
+ const derived = deriveSolanaAddress(privateKey);
5548
+ assertKeyMatchesSender(derived === address, address, derived);
5549
+ }
5550
+ };
5551
+ function deriveSolanaAddress(privateKey) {
5552
+ return import_bs58.default.encode(import_tweetnacl.default.sign.keyPair.fromSecretKey(secretKeyFromPrivate(privateKey)).publicKey);
4955
5553
  }
4956
- function clusterIdFromName(name) {
4957
- const encoded = new TextEncoder().encode(name);
4958
- if (encoded.length > 32) {
4959
- throw new Error(`cluster name too long for cluster_id: ${name} (${encoded.length} > 32 bytes)`);
4960
- }
4961
- const out = new Uint8Array(32);
4962
- out.set(encoded);
4963
- return out;
5554
+ function secretKeyFromPrivate(privateKey) {
5555
+ if (/^[0-9a-fA-F]{64}$/.test(privateKey)) {
5556
+ const seed = new Uint8Array(32);
5557
+ for (let i = 0; i < 32; i++) {
5558
+ seed[i] = parseInt(privateKey.substring(i * 2, i * 2 + 2), 16);
5559
+ }
5560
+ return import_tweetnacl.default.sign.keyPair.fromSeed(seed).secretKey;
5561
+ }
5562
+ const decoded = import_bs58.default.decode(privateKey);
5563
+ if (decoded.length === 64) {
5564
+ return decoded;
5565
+ }
5566
+ if (decoded.length === 32) {
5567
+ return import_tweetnacl.default.sign.keyPair.fromSeed(decoded).secretKey;
5568
+ }
5569
+ throw new Error(`Invalid Solana private key length: expected 32 or 64 bytes, got ${decoded.length}`);
4964
5570
  }
4965
- function generateSolanaPaymentIdV3(requestId) {
4966
- return (0, import_ethers4.keccak256)((0, import_ethers4.toUtf8Bytes)(requestId));
5571
+
5572
+ // src/chain-adapters/index.ts
5573
+ var adapters = {
5574
+ "eip155": evmAdapter,
5575
+ "tron": tronAdapter,
5576
+ "solana": solanaAdapter
5577
+ };
5578
+ function getChainAdapter(sourceChainId) {
5579
+ const prefix = sourceChainId.split(":")[0];
5580
+ const adapter = adapters[prefix];
5581
+ if (!adapter) throw new Error(`Unsupported source chain: ${sourceChainId}`);
5582
+ return adapter;
4967
5583
  }
4968
- function hashSolanaDepositV3(prehash, domain) {
4969
- const hash = (0, import_solana_escrow_encoding.computeDepositHash)(
4970
- {
4971
- paymentId: hexToBytes(prehash.payment_id),
4972
- depositor: import_solana_escrow_encoding.Pubkey.fromBase58(prehash.depositor),
4973
- mint: import_solana_escrow_encoding.Pubkey.fromBase58(prehash.mint),
4974
- amount: BigInt(prehash.amount),
4975
- reserver: import_solana_escrow_encoding.Pubkey.fromBase58(prehash.reserver),
4976
- releaser: import_solana_escrow_encoding.Pubkey.fromBase58(prehash.releaser),
4977
- nonce: BigInt(prehash.nonce),
4978
- issuedAt: BigInt(prehash.issued_at),
4979
- deadline: BigInt(prehash.deadline)
4980
- },
4981
- domain
4982
- );
4983
- return bytesToHex(hash);
5584
+ function namespaceForTurnkeyAddressFormat(addressFormat) {
5585
+ for (const [namespace, adapter] of Object.entries(adapters)) {
5586
+ if (adapter.turnkeyAddressFormat === addressFormat) return namespace;
5587
+ }
5588
+ return void 0;
4984
5589
  }
4985
5590
 
4986
5591
  // src/chain-adapters/solana-clock.ts
@@ -5050,120 +5655,8 @@ async function resolveSolanaIssuedAt(opts) {
5050
5655
  return BigInt(Math.floor(Date.now() / 1e3)) - SOLANA_ISSUED_AT_FALLBACK_SKEW_SECS;
5051
5656
  }
5052
5657
 
5053
- // src/chain-adapters/solana.ts
5054
- var solanaAdapter = {
5055
- turnkeyAddressFormat: "ADDRESS_FORMAT_SOLANA",
5056
- async buildAuthMessage({ sourceAsset, depositor, fulfillmentAmount, requestId, sourceDefaults, solanaRpcUrl, solanaClockReader, solanaLogger }) {
5057
- const sourceChainId = sourceAsset.split("/")[0];
5058
- const tokenMint = sourceAsset.split("/")[1].split(":")[1];
5059
- const nonce = generateSolanaNonce();
5060
- const issuedAt = await resolveSolanaIssuedAt({
5061
- sourceChainId,
5062
- rpcUrlOverride: solanaRpcUrl,
5063
- reader: solanaClockReader,
5064
- logger: solanaLogger
5065
- });
5066
- const deadline = issuedAt + BigInt(REPLAY_HORIZON_SECS - 8);
5067
- const solanaParams = {
5068
- depositor,
5069
- mint: tokenMint,
5070
- amount: BigInt(fulfillmentAmount),
5071
- reserver: sourceDefaults.quoteSelector,
5072
- releaser: sourceDefaults.fulfillmentVerifierAccount,
5073
- nonce,
5074
- issuedAt,
5075
- deadline,
5076
- requestId
5077
- };
5078
- const paymentId = generateSolanaPaymentIdV3(requestId);
5079
- const prehash = createSolanaDepositPrehash(paymentId, solanaParams);
5080
- if (!sourceDefaults.svmSignatureClusterId || sourceDefaults.svmSignatureDomainVersion == null) {
5081
- throw new Error(
5082
- "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?"
5083
- );
5084
- }
5085
- const domain = {
5086
- clusterId: clusterIdFromName(sourceDefaults.svmSignatureClusterId),
5087
- signatureDomainVersion: sourceDefaults.svmSignatureDomainVersion,
5088
- programId: import_solana_escrow_encoding2.Pubkey.fromBase58(sourceDefaults.escrowContract)
5089
- };
5090
- const depositHash = hashSolanaDepositV3(prehash, domain);
5091
- return {
5092
- messageScheme: "SOLANA",
5093
- messageHash: depositHash,
5094
- messagePrehash: JSON.stringify(prehash)
5095
- };
5096
- },
5097
- formatPrivateKey(key) {
5098
- return key.startsWith("0x") ? key.slice(2) : key;
5099
- },
5100
- /**
5101
- * Solana has no EIP-712-style typed-data standard. The prehash structure
5102
- * still describes what was hashed (for debugging / wallet UX), but the
5103
- * canonical signing input is the chain-specific digest already in
5104
- * signedMessage.message. We sign that with ed25519.
5105
- */
5106
- async sign(signedMessage, privateKey) {
5107
- const messageBytes = new Uint8Array(Buffer.from(signedMessage.message.replace("0x", ""), "hex"));
5108
- const secretKey = secretKeyFromPrivate(privateKey);
5109
- const sig = import_tweetnacl.default.sign.detached(messageBytes, secretKey);
5110
- return "0x" + Buffer.from(sig).toString("hex");
5111
- },
5112
- /**
5113
- * Solana Ed25519 signatures are not public-key-recoverable (unlike EVM
5114
- * secp256k1, where ecrecover derives the signer from the signature). The
5115
- * on-chain Ed25519 verify instruction must therefore be given the signer's
5116
- * public key explicitly, so we ship it as signed_messages[0].payload.delegate_signer.
5117
- * In the self-custody CLI flow the signer is the depositor itself, so this
5118
- * equals source.account.
5119
- */
5120
- deriveDelegateSigner(privateKey) {
5121
- return deriveSolanaAddress(privateKey);
5122
- },
5123
- verifyAddressMatchesKey(privateKey, address) {
5124
- const derived = deriveSolanaAddress(privateKey);
5125
- assertKeyMatchesSender(derived === address, address, derived);
5126
- }
5127
- };
5128
- function deriveSolanaAddress(privateKey) {
5129
- return import_bs582.default.encode(import_tweetnacl.default.sign.keyPair.fromSecretKey(secretKeyFromPrivate(privateKey)).publicKey);
5130
- }
5131
- function secretKeyFromPrivate(privateKey) {
5132
- if (/^[0-9a-fA-F]{64}$/.test(privateKey)) {
5133
- const seed = new Uint8Array(32);
5134
- for (let i = 0; i < 32; i++) {
5135
- seed[i] = parseInt(privateKey.substring(i * 2, i * 2 + 2), 16);
5136
- }
5137
- return import_tweetnacl.default.sign.keyPair.fromSeed(seed).secretKey;
5138
- }
5139
- const decoded = import_bs582.default.decode(privateKey);
5140
- if (decoded.length === 64) {
5141
- return decoded;
5142
- }
5143
- if (decoded.length === 32) {
5144
- return import_tweetnacl.default.sign.keyPair.fromSeed(decoded).secretKey;
5145
- }
5146
- throw new Error(`Invalid Solana private key length: expected 32 or 64 bytes, got ${decoded.length}`);
5147
- }
5148
-
5149
- // src/chain-adapters/index.ts
5150
- var adapters = {
5151
- "eip155": evmAdapter,
5152
- "tron": tronAdapter,
5153
- "solana": solanaAdapter
5154
- };
5155
- function getChainAdapter(sourceChainId) {
5156
- const prefix = sourceChainId.split(":")[0];
5157
- const adapter = adapters[prefix];
5158
- if (!adapter) throw new Error(`Unsupported source chain: ${sourceChainId}`);
5159
- return adapter;
5160
- }
5161
- function namespaceForTurnkeyAddressFormat(addressFormat) {
5162
- for (const [namespace, adapter] of Object.entries(adapters)) {
5163
- if (adapter.turnkeyAddressFormat === addressFormat) return namespace;
5164
- }
5165
- return void 0;
5166
- }
5658
+ // src/index.ts
5659
+ var import_payment_request_sender_auth2 = __toESM(require_dist4());
5167
5660
 
5168
5661
  // src/generated/schemas.gen.ts
5169
5662
  var $AuthorizationResult = {
@@ -5200,15 +5693,33 @@ an error indicating why authorization could not be completed.
5200
5693
  error_code: {
5201
5694
  type: "string",
5202
5695
  description: `Machine-readable error code (present when status is error or timeout).
5203
- The counterparty and webhook codes (COUNTERPARTY_NOT_FOUND, COUNTERPARTY_TIMEOUT,
5204
- WEBHOOK_ERROR, WEBHOOK_CONNECTION_ERROR, INTERNAL_ERROR) mirror the AuthorizationErrorCode
5205
- protobuf enum. GATEWAY_TIMEOUT, PROOF_INVALID, and PROOF_STALE are produced by payment-gw
5206
- itself and have no protobuf equivalent.
5696
+ Counterparty-sourced codes are derived from the error code the
5697
+ Counterparty Gateway publishes. GATEWAY_TIMEOUT, PROOF_INVALID, and
5698
+ PROOF_STALE are payment-gw-specific (no counterparty envelope corresponds).
5207
5699
  `,
5208
5700
  enum: ["COUNTERPARTY_NOT_FOUND", "COUNTERPARTY_TIMEOUT", "WEBHOOK_ERROR", "WEBHOOK_CONNECTION_ERROR", "INTERNAL_ERROR", "GATEWAY_TIMEOUT", "PROOF_INVALID", "PROOF_STALE"],
5209
- "x-enum-description": `The counterparty and webhook codes mirror the AuthorizationErrorCode protobuf enum
5210
- (without the AUTHORIZATION_ERROR_CODE_ prefix for readability in HTTP responses).
5211
- GATEWAY_TIMEOUT, PROOF_INVALID, and PROOF_STALE are payment-gw-local codes with no protobuf equivalent.
5701
+ "x-enum-description": `COUNTERPARTY_NOT_FOUND, COUNTERPARTY_TIMEOUT, WEBHOOK_ERROR,
5702
+ WEBHOOK_CONNECTION_ERROR, and INTERNAL_ERROR are derived from the
5703
+ error code the Counterparty Gateway publishes.
5704
+ GATEWAY_TIMEOUT is emitted by payment-gw when no authorization
5705
+ response is received within the system-wide timeout \u2014 source unknown
5706
+ (counterparty delay, transport failure, or gateway unavailability).
5707
+ Originator should retry; counterparty-side idempotency prevents PSP re-charge
5708
+ if the original was already processed.
5709
+
5710
+ PROOF_INVALID is emitted when the W3C Data Integrity proof on the
5711
+ beneficiary PSP's AuthorizationResponse fails verification: signature
5712
+ recovery failed, recovered DID does not match the destination DID,
5713
+ response shape is malformed (missing @context / payment_id /
5714
+ counterparty_did / proof), or the suite type is unsupported. The
5715
+ underlying reason cardinality is collapsed so originators see one
5716
+ actionable category.
5717
+
5718
+ PROOF_STALE is emitted when proof.created falls outside the
5719
+ configured freshness window. Originators should retry with a fresh
5720
+ request \u2014 the freshness window closes a replay attack vector where a
5721
+ captured-but-cryptographically-valid proof could otherwise be replayed
5722
+ indefinitely.
5212
5723
  `
5213
5724
  },
5214
5725
  error_message: {
@@ -5695,14 +6206,13 @@ code for programmatic handling and a human-readable message for debugging.
5695
6206
  properties: {
5696
6207
  code: {
5697
6208
  type: "string",
5698
- description: `Machine-readable error code in SCREAMING_SNAKE_CASE.
6209
+ description: `Public error category in SCREAMING_SNAKE_CASE.
5699
6210
  Common codes:
5700
- - \`QUOTE_DEADLINE_EXPIRED\`: No settlement quotes received in time
5701
- - \`QUOTE_SELECTION_FAILED\`: Quotes received but none met requirements
5702
- - \`INSUFFICIENT_FUNDS\`: Sender wallet has insufficient balance
5703
- - \`FULFILLMENT_TIMEOUT\`: Settlement agent didn't complete in time
6211
+ - \`SETTLEMENT_FAILED\`: The settlement could not be completed
6212
+ - \`NO_ROUTE_AVAILABLE\`: No settlement route was available
6213
+ - \`INTERNAL_ERROR\`: An unexpected error occurred
5704
6214
  `,
5705
- example: "QUOTE_DEADLINE_EXPIRED"
6215
+ example: "SETTLEMENT_FAILED"
5706
6216
  },
5707
6217
  message: {
5708
6218
  type: "string",
@@ -6014,7 +6524,7 @@ var $TimelineStep = {
6014
6524
  properties: {
6015
6525
  name: {
6016
6526
  type: "string",
6017
- description: "Name of the step",
6527
+ description: "Internal name of the step (matches settlement event type)",
6018
6528
  example: "BID_AWARDED"
6019
6529
  },
6020
6530
  label: {
@@ -6061,11 +6571,35 @@ var $TimelineStep = {
6061
6571
  };
6062
6572
  var $ErrorResponse = {
6063
6573
  type: "object",
6574
+ description: "Safe, outward-facing error. Derived from an internal error through the shared error catalog. The public code identifies the category and the message is a curated, safe description.",
6575
+ required: ["code", "message"],
6064
6576
  properties: {
6065
- error: {
6577
+ code: {
6578
+ type: "string",
6579
+ description: "Public, machine-readable error category in SCREAMING_SNAKE_CASE.",
6580
+ pattern: "^[A-Z][A-Z0-9_]*$",
6581
+ example: "INVALID_SOURCE_ASSET"
6582
+ },
6583
+ message: {
6584
+ type: "string",
6585
+ description: "Curated, safe, human-readable message.",
6586
+ maxLength: 500,
6587
+ example: "The source asset identifier is not a valid CAIP-19 asset."
6588
+ },
6589
+ request_id: {
6590
+ type: "string",
6591
+ description: "Correlation id to quote to support to locate the internal error record.",
6592
+ example: "req_123456789"
6593
+ },
6594
+ docs_url: {
6066
6595
  type: "string",
6067
- description: "Error message",
6068
- example: "Invalid request: missing required field"
6596
+ format: "uri",
6597
+ description: "Link to the documentation page for this public code."
6598
+ },
6599
+ domain: {
6600
+ type: "string",
6601
+ description: "Originating service domain.",
6602
+ example: "PAYMENT_GATEWAY"
6069
6603
  }
6070
6604
  }
6071
6605
  };
@@ -6472,7 +7006,9 @@ the quote-request batch lifecycle and is disjoint from the payment-status enum.
6472
7006
  enum: ["collecting", "ready", "awarded", "expired"],
6473
7007
  description: `Derived batch lifecycle, computed at read time (not a stored state machine). Disjoint
6474
7008
  from the payment-status enum returned by the award and payment-status endpoints.
6475
- - \`collecting\` \u2014 collection window in progress; \`quotes\` absent.
7009
+ - \`collecting\` \u2014 collection window still open; \`quotes\` lists those collected so far
7010
+ (a quote is awardable from arrival, by its own \`award_deadline\`; more may arrive until
7011
+ \`collection_close\`).
6476
7012
  - \`ready\` \u2014 collection complete; none awarded yet; either at least one quote is still
6477
7013
  within its \`award_deadline\`, or no settler bid (empty \`quotes\` array \u2014 the successful
6478
7014
  "no quotes available" result).
@@ -6485,7 +7021,7 @@ from the payment-status enum returned by the award and payment-status endpoints.
6485
7021
  },
6486
7022
  quotes: {
6487
7023
  type: "array",
6488
- description: "Collected quotes with award linkage. Absent while status is `collecting`.",
7024
+ description: "Collected quotes with award linkage \u2014 those collected so far while `collecting`, the full set once the window closes.",
6489
7025
  items: {
6490
7026
  "$ref": "#/components/schemas/AwardedQuote"
6491
7027
  }
@@ -6624,17 +7160,95 @@ var $AwardAccepted = {
6624
7160
  }
6625
7161
  };
6626
7162
 
7163
+ // src/sender_auth_schemes/evm_permit2.ts
7164
+ var import_ethers3 = require("ethers");
7165
+ var import_evm_escrow_encoding = __toESM(require_dist2());
7166
+ function hashRequestId(requestId) {
7167
+ return (0, import_ethers3.keccak256)((0, import_ethers3.toUtf8Bytes)(requestId));
7168
+ }
7169
+
7170
+ // src/sender_auth_schemes/solana.ts
7171
+ var import_ethers4 = require("ethers");
7172
+ var import_bs582 = __toESM(require("bs58"));
7173
+ var import_solana_escrow_encoding = __toESM(require_dist3());
7174
+ var REPLAY_HORIZON_SECS = 128;
7175
+ var TOTAL_BUCKETS = 131072;
7176
+ var DEPOSIT_MESSAGE_SIZE = 199;
7177
+ function base58ToBytes(address) {
7178
+ const bytes = import_bs582.default.decode(address);
7179
+ if (bytes.length !== 32) {
7180
+ throw new Error(`Invalid Solana public key length: expected 32 bytes, got ${bytes.length}`);
7181
+ }
7182
+ return bytes;
7183
+ }
7184
+ function bytesToHex(bytes) {
7185
+ return (0, import_ethers4.hexlify)(bytes);
7186
+ }
7187
+ function hexToBytes(hex) {
7188
+ return (0, import_ethers4.getBytes)(hex.startsWith("0x") ? hex : "0x" + hex);
7189
+ }
7190
+ function generateSolanaPaymentId(requestId, params) {
7191
+ const depositorBytes = base58ToBytes(params.depositor);
7192
+ const reserverBytes = base58ToBytes(params.reserver);
7193
+ const releaserBytes = base58ToBytes(params.releaser);
7194
+ return (0, import_ethers4.keccak256)((0, import_ethers4.concat)([
7195
+ (0, import_ethers4.toUtf8Bytes)(requestId),
7196
+ (0, import_ethers4.toUtf8Bytes)("deposit"),
7197
+ depositorBytes,
7198
+ (0, import_solana_escrow_encoding.encodeU64LE)(params.amount),
7199
+ reserverBytes,
7200
+ releaserBytes,
7201
+ (0, import_solana_escrow_encoding.encodeU64LE)(params.nonce),
7202
+ (0, import_solana_escrow_encoding.encodeU64LE)(params.issuedAt),
7203
+ (0, import_solana_escrow_encoding.encodeU64LE)(params.deadline)
7204
+ ]));
7205
+ }
7206
+ function createSolanaDepositPrehash(paymentId, params) {
7207
+ return {
7208
+ payment_id: paymentId,
7209
+ depositor: params.depositor,
7210
+ mint: params.mint,
7211
+ amount: params.amount.toString(),
7212
+ reserver: params.reserver,
7213
+ releaser: params.releaser,
7214
+ nonce: params.nonce.toString(),
7215
+ issued_at: params.issuedAt.toString(),
7216
+ deadline: params.deadline.toString()
7217
+ };
7218
+ }
7219
+ function hashSolanaDeposit(prehash) {
7220
+ const paymentIdBytes = hexToBytes(prehash.payment_id);
7221
+ const depositorBytes = base58ToBytes(prehash.depositor);
7222
+ const mintBytes = base58ToBytes(prehash.mint);
7223
+ const reserverBytes = base58ToBytes(prehash.reserver);
7224
+ const releaserBytes = base58ToBytes(prehash.releaser);
7225
+ return (0, import_ethers4.keccak256)((0, import_ethers4.concat)([
7226
+ (0, import_ethers4.toUtf8Bytes)("deposit"),
7227
+ paymentIdBytes,
7228
+ depositorBytes,
7229
+ mintBytes,
7230
+ (0, import_solana_escrow_encoding.encodeU64LE)(BigInt(prehash.amount)),
7231
+ reserverBytes,
7232
+ releaserBytes,
7233
+ (0, import_solana_escrow_encoding.encodeU64LE)(BigInt(prehash.nonce)),
7234
+ (0, import_solana_escrow_encoding.encodeU64LE)(BigInt(prehash.issued_at)),
7235
+ (0, import_solana_escrow_encoding.encodeU64LE)(BigInt(prehash.deadline))
7236
+ ]));
7237
+ }
7238
+ function generateSolanaNonce() {
7239
+ return (0, import_solana_escrow_encoding.generateNonce)();
7240
+ }
7241
+
6627
7242
  // src/signers/raw.ts
7243
+ var import_payment_request_sender_auth = __toESM(require_dist4());
6628
7244
  var RawSenderSigner = class {
6629
- constructor(adapter, privateKey) {
6630
- this.adapter = adapter;
6631
- this.privateKey = privateKey;
7245
+ constructor(network, privateKey) {
7246
+ const adapter = getChainAdapter(network);
6632
7247
  adapter.validatePrivateKey?.(privateKey);
7248
+ this.inner = (0, import_payment_request_sender_auth.localKeySigner)(network, adapter.formatPrivateKey(privateKey));
6633
7249
  }
6634
- async sign(signedMessage) {
6635
- const signature = await this.adapter.sign(signedMessage, this.privateKey);
6636
- const delegateSigner = this.adapter.deriveDelegateSigner?.(this.privateKey);
6637
- return { signature, ...delegateSigner ? { delegateSigner } : {} };
7250
+ sign(signedMessage) {
7251
+ return this.inner.sign(signedMessage);
6638
7252
  }
6639
7253
  };
6640
7254
 
@@ -6675,14 +7289,14 @@ function createSenderSigner(sourceChainId, opts) {
6675
7289
  }
6676
7290
  const adapter = getChainAdapter(sourceChainId);
6677
7291
  const privateKey = adapter.formatPrivateKey(opts.privateKey);
6678
- const signer = new RawSenderSigner(adapter, privateKey);
7292
+ adapter.validatePrivateKey?.(opts.privateKey);
6679
7293
  if (opts.pinnedAddress) {
6680
7294
  if (!adapter.verifyAddressMatchesKey) {
6681
7295
  throw new Error(`pinnedAddress was provided but the ${sourceChainId} adapter cannot verify the key derives it`);
6682
7296
  }
6683
7297
  adapter.verifyAddressMatchesKey(privateKey, opts.pinnedAddress);
6684
7298
  }
6685
- return signer;
7299
+ return new RawSenderSigner(sourceChainId, opts.privateKey);
6686
7300
  }
6687
7301
  async function resolveTurnkeyAddresses(cfg) {
6688
7302
  const impl = await Promise.resolve().then(() => (init_turnkey_impl(), turnkey_impl_exports));
@@ -6744,12 +7358,68 @@ function resolveDeadlines(params, defaultQuoteSeconds) {
6744
7358
  `quoteDeadlineSeconds (${quoteDeadlineSeconds}) must be strictly less than fulfillmentDeadlineSeconds (${fulfillmentDeadlineSeconds}). The gateway rejects a quote_deadline that is not before fulfillment_deadline.`
6745
7359
  );
6746
7360
  }
6747
- const now = Date.now();
7361
+ const now = (params.now ?? Date.now)();
6748
7362
  return {
6749
7363
  quote_deadline: new Date(now + quoteDeadlineSeconds * 1e3).toISOString(),
6750
7364
  fulfillment_deadline: new Date(now + fulfillmentDeadlineSeconds * 1e3).toISOString()
6751
7365
  };
6752
7366
  }
7367
+ async function assemblePaymentRequest(params) {
7368
+ const sourceChainId = params.sourceAsset.split("/")[0];
7369
+ const namespace = sourceChainId.split(":")[0];
7370
+ const adapter = getChainAdapter(sourceChainId);
7371
+ 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 }));
7372
+ const auth = await (0, import_payment_request_sender_auth2.getChainAdapter)(sourceChainId).buildAuthMessage({
7373
+ sourceAsset: params.sourceAsset,
7374
+ depositor: params.depositor,
7375
+ // The gateway pins the signed deposit amount to max_source_amount (the cap).
7376
+ maxSourceAmount: params.maxSourceAmount,
7377
+ requestId: params.requestId,
7378
+ sourceDefaults: params.sourceDefaults,
7379
+ deadline: params.deadline,
7380
+ nonce,
7381
+ ...namespace === "solana" ? {
7382
+ solanaClockReader: (chainId) => resolveSolanaIssuedAt({
7383
+ sourceChainId: chainId,
7384
+ rpcUrlOverride: params.solanaRpcUrl,
7385
+ reader: params.solanaClockReader
7386
+ })
7387
+ } : {}
7388
+ });
7389
+ const contractOverrides = adapter.resolveContractOverrides?.(params.sourceDefaults);
7390
+ return {
7391
+ version: params.version ?? PAYMENT_REQUEST_VERSION,
7392
+ request_id: params.requestId,
7393
+ source: {
7394
+ asset_identifier: params.sourceAsset,
7395
+ account: params.depositor
7396
+ },
7397
+ destination: [{
7398
+ asset_identifier: params.destinationAsset,
7399
+ account: params.destinationAccount
7400
+ }],
7401
+ fulfillment_amount: params.fulfillmentAmount,
7402
+ max_source_amount: params.maxSourceAmount,
7403
+ quote_deadline: params.quoteDeadline,
7404
+ fulfillment_deadline: params.fulfillmentDeadline,
7405
+ escrow_contract_address: params.sourceDefaults.escrowContract,
7406
+ quote_selector: contractOverrides?.quote_selector ?? params.sourceDefaults.quoteSelector,
7407
+ fulfillment_verifier: contractOverrides?.fulfillment_verifier ?? {
7408
+ account: params.sourceDefaults.fulfillmentVerifierAccount,
7409
+ endpoint: params.sourceDefaults.fulfillmentVerifierEndpoint
7410
+ },
7411
+ fulfillment_proxy: params.fulfillmentProxy,
7412
+ ...params.settlerRequirements ? { settler_requirements: params.settlerRequirements } : {},
7413
+ sender_auth: {
7414
+ message_scheme: auth.messageScheme,
7415
+ signed_messages: [{
7416
+ message: auth.messageHash,
7417
+ message_prehash: auth.messagePrehash,
7418
+ signature: ""
7419
+ }]
7420
+ }
7421
+ };
7422
+ }
6753
7423
  var PaymentGatewayClient2 = class extends PaymentGatewayClient {
6754
7424
  constructor(config, HttpRequest = AxiosHttpRequest) {
6755
7425
  super(config, HttpRequest);
@@ -6810,64 +7480,84 @@ var PaymentGatewayClient2 = class extends PaymentGatewayClient {
6810
7480
  }
6811
7481
  /**
6812
7482
  * Prepares a payment request with defaults, ready for signing.
6813
- *
7483
+ *
7484
+ * By default this resolves the corridor addresses from the gateway `/defaults`
7485
+ * endpoint. It reaches the gateway only for what the caller has NOT already
7486
+ * supplied via `resolvedDefaults`: supply `resolvedDefaults.source` to skip the
7487
+ * source-chain fetch and `resolvedDefaults.destination` to skip the destination
7488
+ * fetch. Supplying both builds the request **entirely offline** (no network) —
7489
+ * how a caller that already holds the corridor addresses (e.g. from a signed
7490
+ * challenge) constructs and signs a request without gateway access. Such a
7491
+ * caller typically also injects `now` so the deadlines are deterministic.
7492
+ *
7493
+ * @example Minimal — fetch corridor addresses from the gateway, then sign
7494
+ * ```ts
7495
+ * const client = new PaymentGatewayClient({ BASE: "https://gateway.example.com" });
7496
+ *
7497
+ * const request = await client.preparePaymentRequest({
7498
+ * depositor: "0xPayerAddress",
7499
+ * sourceAsset: "eip155:8453/erc20:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", // USDC on Base
7500
+ * destinationAccount: "0xMerchantAddress",
7501
+ * destinationAsset: "eip155:42161/erc20:0xaf88d065e77c8cC2239327C5EDb3A432268e5831", // USDC on Arbitrum
7502
+ * fulfillmentAmount: "10000000", // 10 USDC (6 decimals)
7503
+ * });
7504
+ * // max_source_amount, deadlines, request id, and nonce are all defaulted.
7505
+ *
7506
+ * const signer = createSenderSigner("eip155:8453", { provider: "raw", privateKey });
7507
+ * await signPaymentRequest(request, signer); // fills sender_auth, ready to submit
7508
+ * ```
7509
+ *
6814
7510
  * @param params Payment parameters
6815
7511
  * @returns A complete PaymentRequest object without the signature
6816
7512
  */
6817
7513
  async preparePaymentRequest(params) {
6818
- const { quote_deadline, fulfillment_deadline } = resolveDeadlines(params, DEFAULT_PAYMENT_QUOTE_DEADLINE_SECONDS);
7514
+ const now = (params.now ?? Date.now)();
7515
+ const { quote_deadline, fulfillment_deadline } = resolveDeadlines({ ...params, now: () => now }, DEFAULT_PAYMENT_QUOTE_DEADLINE_SECONDS);
6819
7516
  const sourceChainId = params.sourceAsset.split("/")[0];
6820
7517
  const destChainId = params.destinationAsset.split("/")[0];
6821
- const [sourceDefaults, destDefaults] = await Promise.all([
6822
- this.fetchChainDefaults(sourceChainId),
6823
- this.fetchChainDefaults(destChainId)
7518
+ const [sourceDefaults, fulfillmentProxy] = await Promise.all([
7519
+ params.resolvedDefaults?.source ?? this.fetchChainDefaults(sourceChainId),
7520
+ params.resolvedDefaults?.destination?.fulfillmentProxy ?? this.fetchChainDefaults(destChainId).then((d) => d.fulfillmentProxy)
6824
7521
  ]);
6825
- const requestId = params.requestId || `${params.requestIdPrefix || "pmt-gw-sdk"}-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
6826
- const adapter = getChainAdapter(sourceChainId);
6827
- const auth = await adapter.buildAuthMessage({
6828
- sourceAsset: params.sourceAsset,
7522
+ if (!params.requestId) {
7523
+ throw new Error(
7524
+ "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"
7525
+ );
7526
+ }
7527
+ const requestId = params.requestId;
7528
+ const sourceNamespace = sourceChainId.split(":")[0];
7529
+ let permitDeadline;
7530
+ if (sourceNamespace !== "solana") {
7531
+ const fulfillmentMs = Date.parse(fulfillment_deadline);
7532
+ if (params.deadlineSeconds !== void 0) {
7533
+ permitDeadline = Math.ceil(now / 1e3) + Math.ceil(params.deadlineSeconds);
7534
+ if (permitDeadline * 1e3 < fulfillmentMs) {
7535
+ throw new Error(
7536
+ `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.`
7537
+ );
7538
+ }
7539
+ } else {
7540
+ permitDeadline = Math.floor(fulfillmentMs / 1e3) + 1;
7541
+ }
7542
+ }
7543
+ return assemblePaymentRequest({
6829
7544
  depositor: params.depositor,
6830
7545
  fulfillmentAmount: params.fulfillmentAmount,
7546
+ sourceAsset: params.sourceAsset,
7547
+ destinationAccount: params.destinationAccount,
7548
+ destinationAsset: params.destinationAsset,
7549
+ maxSourceAmount: params.maxSourceAmount ?? defaultMaxSourceAmount(params.fulfillmentAmount),
6831
7550
  requestId,
7551
+ quoteDeadline: quote_deadline,
7552
+ fulfillmentDeadline: fulfillment_deadline,
6832
7553
  sourceDefaults,
6833
- deadlineSeconds: params.deadlineSeconds,
6834
- solanaRpcUrl: params.solanaRpcUrl
7554
+ fulfillmentProxy,
7555
+ nonce: params.nonce,
7556
+ deadline: permitDeadline,
7557
+ solanaRpcUrl: params.solanaRpcUrl,
7558
+ solanaClockReader: params.solanaClockReader,
7559
+ settlerRequirements: params.settlerRequirements
6835
7560
  });
6836
- const contractOverrides = adapter.resolveContractOverrides?.(sourceDefaults);
6837
- return {
6838
- version: PAYMENT_REQUEST_VERSION,
6839
- request_id: requestId,
6840
- source: {
6841
- asset_identifier: params.sourceAsset,
6842
- account: params.depositor
6843
- },
6844
- destination: [{
6845
- asset_identifier: params.destinationAsset,
6846
- account: params.destinationAccount
6847
- }],
6848
- fulfillment_amount: params.fulfillmentAmount,
6849
- max_source_amount: params.maxSourceAmount ?? defaultMaxSourceAmount(params.fulfillmentAmount),
6850
- // REQUIRED (the gateway injects no defaults). Callers can widen the window via
6851
- // quoteDeadlineSeconds / fulfillmentDeadlineSeconds, e.g. for slow Turnkey signing.
6852
- quote_deadline,
6853
- fulfillment_deadline,
6854
- escrow_contract_address: sourceDefaults.escrowContract,
6855
- quote_selector: contractOverrides?.quote_selector ?? sourceDefaults.quoteSelector,
6856
- fulfillment_verifier: contractOverrides?.fulfillment_verifier ?? {
6857
- account: sourceDefaults.fulfillmentVerifierAccount,
6858
- endpoint: sourceDefaults.fulfillmentVerifierEndpoint
6859
- },
6860
- fulfillment_proxy: destDefaults.fulfillmentProxy,
6861
- ...params.settlerRequirements ? { settler_requirements: params.settlerRequirements } : {},
6862
- sender_auth: {
6863
- message_scheme: auth.messageScheme,
6864
- signed_messages: [{
6865
- message: auth.messageHash,
6866
- message_prehash: auth.messagePrehash,
6867
- signature: ""
6868
- }]
6869
- }
6870
- };
6871
7561
  }
6872
7562
  /**
6873
7563
  * Prepares a quote-request body (`CreateQuoteRequest`), ready to POST to
@@ -7000,7 +7690,6 @@ var PaymentGatewayClient2 = class extends PaymentGatewayClient {
7000
7690
  PaymentsService,
7001
7691
  QuoteRequestsService,
7002
7692
  REPLAY_HORIZON_SECS,
7003
- RawSenderSigner,
7004
7693
  TOTAL_BUCKETS,
7005
7694
  TurnkeySenderSigner,
7006
7695
  base58ToBytes,