@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/CHANGELOG.md +40 -0
- package/README.md +7 -39
- package/dist/cli/payment-status.js +1232 -631
- package/dist/cli/quote-status.js +1232 -631
- package/dist/cli/request-quote.js +1232 -631
- package/dist/cli/send-payment.js +1282 -651
- package/dist/index.d.ts +179 -163
- package/dist/index.js +1327 -638
- package/package.json +7 -5
package/dist/cli/send-payment.js
CHANGED
|
@@ -33,8 +33,378 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
33
33
|
mod
|
|
34
34
|
));
|
|
35
35
|
|
|
36
|
-
// ../contracts/
|
|
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
|
|
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
|
|
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 });
|
|
@@ -384,305 +754,356 @@ var require_deposit_encoder = __commonJS({
|
|
|
384
754
|
primaryType: "PermitWitnessTransferFrom",
|
|
385
755
|
domain: {
|
|
386
756
|
name: "Permit2",
|
|
387
|
-
chainId: `0x${params.chainId.toString(16)}`,
|
|
388
|
-
verifyingContract: params.verifyingContract
|
|
389
|
-
},
|
|
390
|
-
message: {
|
|
391
|
-
permitted: {
|
|
392
|
-
token: params.token,
|
|
393
|
-
amount: params.amount
|
|
394
|
-
},
|
|
395
|
-
spender: params.spender,
|
|
396
|
-
nonce: params.nonce.toString(),
|
|
397
|
-
deadline: params.deadline.toString(),
|
|
398
|
-
witness: {
|
|
399
|
-
reserver: params.reserver,
|
|
400
|
-
releaser: params.releaser
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
};
|
|
404
|
-
}
|
|
405
|
-
function hashPermitWitnessTransferFrom2(prehash) {
|
|
406
|
-
return ethers_1.TypedDataEncoder.hash(prehash.domain, prehash.types, prehash.message);
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
// ../contracts/evm/escrow-encoding/typescript/dist/index.js
|
|
412
|
-
var require_dist = __commonJS({
|
|
413
|
-
"../contracts/evm/escrow-encoding/typescript/dist/index.js"(exports2) {
|
|
414
|
-
"use strict";
|
|
415
|
-
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
416
|
-
exports2.PERMIT2_CONTRACT_ADDRESS = exports2.hashPermitWitnessTransferFrom = exports2.createPermitWitnessTransferFromPrehash = exports2.computeReserveDigest = exports2.ESCROW_V3_ABI_JSON = exports2.ESCROW_V2_ABI_JSON = exports2.ESCROW_ABI_JSON = exports2.ESCROW_ABI = exports2.REFUND_WITNESS_TYPES = exports2.RELEASE_WITNESS_TYPES = exports2.RESERVE_WITNESS_TYPES = exports2.createEscrowDomain = exports2.createPermit2Domain = exports2.PERMIT_WITNESS_TYPES_V2 = exports2.PERMIT_WITNESS_TYPES = exports2.generateNonce = exports2.computePaymentIdV2 = exports2.computePaymentId = void 0;
|
|
417
|
-
var payment_id_1 = require_payment_id();
|
|
418
|
-
Object.defineProperty(exports2, "computePaymentId", { enumerable: true, get: function() {
|
|
419
|
-
return payment_id_1.computePaymentId;
|
|
420
|
-
} });
|
|
421
|
-
Object.defineProperty(exports2, "computePaymentIdV2", { enumerable: true, get: function() {
|
|
422
|
-
return payment_id_1.computePaymentIdV2;
|
|
423
|
-
} });
|
|
424
|
-
var nonce_generator_1 = require_nonce_generator();
|
|
425
|
-
Object.defineProperty(exports2, "generateNonce", { enumerable: true, get: function() {
|
|
426
|
-
return nonce_generator_1.generateNonce;
|
|
427
|
-
} });
|
|
428
|
-
var permit_types_1 = require_permit_types();
|
|
429
|
-
Object.defineProperty(exports2, "PERMIT_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
430
|
-
return permit_types_1.PERMIT_WITNESS_TYPES;
|
|
431
|
-
} });
|
|
432
|
-
Object.defineProperty(exports2, "PERMIT_WITNESS_TYPES_V2", { enumerable: true, get: function() {
|
|
433
|
-
return permit_types_1.PERMIT_WITNESS_TYPES_V2;
|
|
434
|
-
} });
|
|
435
|
-
Object.defineProperty(exports2, "createPermit2Domain", { enumerable: true, get: function() {
|
|
436
|
-
return permit_types_1.createPermit2Domain;
|
|
437
|
-
} });
|
|
438
|
-
Object.defineProperty(exports2, "createEscrowDomain", { enumerable: true, get: function() {
|
|
439
|
-
return permit_types_1.createEscrowDomain;
|
|
440
|
-
} });
|
|
441
|
-
Object.defineProperty(exports2, "RESERVE_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
442
|
-
return permit_types_1.RESERVE_WITNESS_TYPES;
|
|
443
|
-
} });
|
|
444
|
-
Object.defineProperty(exports2, "RELEASE_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
445
|
-
return permit_types_1.RELEASE_WITNESS_TYPES;
|
|
446
|
-
} });
|
|
447
|
-
Object.defineProperty(exports2, "REFUND_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
448
|
-
return permit_types_1.REFUND_WITNESS_TYPES;
|
|
449
|
-
} });
|
|
450
|
-
var escrow_abi_1 = require_escrow_abi();
|
|
451
|
-
Object.defineProperty(exports2, "ESCROW_ABI", { enumerable: true, get: function() {
|
|
452
|
-
return escrow_abi_1.ESCROW_ABI;
|
|
453
|
-
} });
|
|
454
|
-
Object.defineProperty(exports2, "ESCROW_ABI_JSON", { enumerable: true, get: function() {
|
|
455
|
-
return escrow_abi_1.ESCROW_ABI_JSON;
|
|
456
|
-
} });
|
|
457
|
-
Object.defineProperty(exports2, "ESCROW_V2_ABI_JSON", { enumerable: true, get: function() {
|
|
458
|
-
return escrow_abi_1.ESCROW_V2_ABI_JSON;
|
|
459
|
-
} });
|
|
460
|
-
Object.defineProperty(exports2, "ESCROW_V3_ABI_JSON", { enumerable: true, get: function() {
|
|
461
|
-
return escrow_abi_1.ESCROW_V3_ABI_JSON;
|
|
462
|
-
} });
|
|
463
|
-
var reserve_encoder_1 = require_reserve_encoder();
|
|
464
|
-
Object.defineProperty(exports2, "computeReserveDigest", { enumerable: true, get: function() {
|
|
465
|
-
return reserve_encoder_1.computeReserveDigest;
|
|
466
|
-
} });
|
|
467
|
-
var deposit_encoder_1 = require_deposit_encoder();
|
|
468
|
-
Object.defineProperty(exports2, "createPermitWitnessTransferFromPrehash", { enumerable: true, get: function() {
|
|
469
|
-
return deposit_encoder_1.createPermitWitnessTransferFromPrehash;
|
|
470
|
-
} });
|
|
471
|
-
Object.defineProperty(exports2, "hashPermitWitnessTransferFrom", { enumerable: true, get: function() {
|
|
472
|
-
return deposit_encoder_1.hashPermitWitnessTransferFrom;
|
|
473
|
-
} });
|
|
474
|
-
Object.defineProperty(exports2, "PERMIT2_CONTRACT_ADDRESS", { enumerable: true, get: function() {
|
|
475
|
-
return deposit_encoder_1.PERMIT2_CONTRACT_ADDRESS;
|
|
476
|
-
} });
|
|
477
|
-
}
|
|
478
|
-
});
|
|
479
|
-
|
|
480
|
-
// ../contracts/tvm/escrow-encoding/typescript/dist/chain-id.js
|
|
481
|
-
var require_chain_id = __commonJS({
|
|
482
|
-
"../contracts/tvm/escrow-encoding/typescript/dist/chain-id.js"(exports2) {
|
|
483
|
-
"use strict";
|
|
484
|
-
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
485
|
-
exports2.maskChainId = maskChainId2;
|
|
486
|
-
function maskChainId2(chainId) {
|
|
487
|
-
return (chainId & 4294967295) >>> 0;
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
});
|
|
491
|
-
|
|
492
|
-
// ../contracts/tvm/escrow-encoding/typescript/dist/tron-address.js
|
|
493
|
-
var require_tron_address = __commonJS({
|
|
494
|
-
"../contracts/tvm/escrow-encoding/typescript/dist/tron-address.js"(exports2) {
|
|
495
|
-
"use strict";
|
|
496
|
-
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
497
|
-
return mod && mod.__esModule ? mod : { "default": mod };
|
|
498
|
-
};
|
|
499
|
-
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
500
|
-
exports2.base58ToHex = base58ToHex2;
|
|
501
|
-
exports2.normalizeAddress = normalizeAddress2;
|
|
502
|
-
var ethers_1 = require("ethers");
|
|
503
|
-
var bs58_1 = __importDefault(require("bs58"));
|
|
504
|
-
var TVM_MAINNET_PREFIX = "41";
|
|
505
|
-
function base58ToHex2(base58Address) {
|
|
506
|
-
if (!base58Address || !base58Address.startsWith("T")) {
|
|
507
|
-
throw new Error(`Invalid Tron base58 address: ${base58Address}`);
|
|
508
|
-
}
|
|
509
|
-
const decoded = bs58_1.default.decode(base58Address);
|
|
510
|
-
if (decoded.length !== 25) {
|
|
511
|
-
throw new Error(`Invalid Tron base58 length (expected 25 bytes): ${base58Address}`);
|
|
512
|
-
}
|
|
513
|
-
const payload = decoded.slice(0, 21);
|
|
514
|
-
const checksum = (0, ethers_1.hexlify)(decoded.slice(21)).slice(2);
|
|
515
|
-
const computed = (0, ethers_1.sha256)((0, ethers_1.sha256)(payload)).slice(2, 10);
|
|
516
|
-
if (checksum !== computed) {
|
|
517
|
-
throw new Error(`Invalid Tron base58 checksum: ${base58Address}`);
|
|
518
|
-
}
|
|
519
|
-
return (0, ethers_1.hexlify)(payload).slice(2);
|
|
520
|
-
}
|
|
521
|
-
function normalizeAddress2(address) {
|
|
522
|
-
if (!address) {
|
|
523
|
-
throw new Error("Empty address");
|
|
524
|
-
}
|
|
525
|
-
let hexAddress = address;
|
|
526
|
-
if (address.startsWith("T")) {
|
|
527
|
-
hexAddress = base58ToHex2(address);
|
|
528
|
-
}
|
|
529
|
-
hexAddress = hexAddress.replace(/^0x/, "");
|
|
530
|
-
if (hexAddress.startsWith(TVM_MAINNET_PREFIX)) {
|
|
531
|
-
hexAddress = hexAddress.substring(2);
|
|
532
|
-
}
|
|
533
|
-
if (hexAddress.length !== 40) {
|
|
534
|
-
throw new Error(`Invalid address length: expected 40 chars, got ${hexAddress.length}`);
|
|
535
|
-
}
|
|
536
|
-
if (!/^[0-9a-fA-F]{40}$/.test(hexAddress)) {
|
|
537
|
-
throw new Error("Invalid hex address format");
|
|
538
|
-
}
|
|
539
|
-
return "0x" + hexAddress.toLowerCase();
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
});
|
|
543
|
-
|
|
544
|
-
// ../contracts/tvm/escrow-encoding/typescript/dist/reserve-encoder.js
|
|
545
|
-
var require_reserve_encoder2 = __commonJS({
|
|
546
|
-
"../contracts/tvm/escrow-encoding/typescript/dist/reserve-encoder.js"(exports2) {
|
|
547
|
-
"use strict";
|
|
548
|
-
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
549
|
-
exports2.computeReserveDigest = computeReserveDigest;
|
|
550
|
-
var ethers_1 = require("ethers");
|
|
551
|
-
var chain_id_1 = require_chain_id();
|
|
552
|
-
var RESERVE_WITNESS_TYPES = {
|
|
553
|
-
ReserveWitness: [
|
|
554
|
-
{ name: "paymentId", type: "bytes32" },
|
|
555
|
-
{ name: "settler", type: "address" }
|
|
556
|
-
]
|
|
557
|
-
};
|
|
558
|
-
function computeReserveDigest(input) {
|
|
559
|
-
const domain = {
|
|
560
|
-
name: "Escrow",
|
|
561
|
-
version: "3",
|
|
562
|
-
chainId: (0, chain_id_1.maskChainId)(input.chainId),
|
|
563
|
-
verifyingContract: input.escrowContract
|
|
564
|
-
};
|
|
565
|
-
return ethers_1.TypedDataEncoder.hash(domain, RESERVE_WITNESS_TYPES, {
|
|
566
|
-
paymentId: input.paymentId,
|
|
567
|
-
settler: input.settler
|
|
568
|
-
});
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
});
|
|
572
|
-
|
|
573
|
-
// ../contracts/tvm/escrow-encoding/typescript/dist/payment-id.js
|
|
574
|
-
var require_payment_id2 = __commonJS({
|
|
575
|
-
"../contracts/tvm/escrow-encoding/typescript/dist/payment-id.js"(exports2) {
|
|
576
|
-
"use strict";
|
|
577
|
-
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
578
|
-
exports2.computePaymentId = computePaymentId;
|
|
579
|
-
var ethers_1 = require("ethers");
|
|
580
|
-
var tron_address_1 = require_tron_address();
|
|
581
|
-
function computePaymentId(depositor, signature, nonce) {
|
|
582
|
-
if (!/^[0-9]+$/.test(nonce)) {
|
|
583
|
-
throw new Error(`invalid nonce (expected base-10 decimal): ${nonce}`);
|
|
584
|
-
}
|
|
585
|
-
const encoded = ethers_1.AbiCoder.defaultAbiCoder().encode(["address", "bytes", "uint256"], [(0, tron_address_1.normalizeAddress)(depositor), signature, nonce]);
|
|
586
|
-
return (0, ethers_1.keccak256)(encoded);
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
});
|
|
590
|
-
|
|
591
|
-
// ../contracts/tvm/escrow-encoding/typescript/dist/deposit-encoder.js
|
|
592
|
-
var require_deposit_encoder2 = __commonJS({
|
|
593
|
-
"../contracts/tvm/escrow-encoding/typescript/dist/deposit-encoder.js"(exports2) {
|
|
594
|
-
"use strict";
|
|
595
|
-
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
596
|
-
exports2.createTvmPermitWitnessTransferFromPrehash = createTvmPermitWitnessTransferFromPrehash2;
|
|
597
|
-
exports2.hashTvmPermitWitnessTransferFrom = hashTvmPermitWitnessTransferFrom2;
|
|
598
|
-
var ethers_1 = require("ethers");
|
|
599
|
-
var chain_id_1 = require_chain_id();
|
|
600
|
-
var tron_address_1 = require_tron_address();
|
|
601
|
-
var PERMIT_WITNESS_TYPES_V2 = {
|
|
602
|
-
PermitWitnessTransferFrom: [
|
|
603
|
-
{ name: "permitted", type: "TokenPermissions" },
|
|
604
|
-
{ name: "spender", type: "address" },
|
|
605
|
-
{ name: "nonce", type: "uint256" },
|
|
606
|
-
{ name: "deadline", type: "uint256" },
|
|
607
|
-
{ name: "witness", type: "DepositWitness" }
|
|
608
|
-
],
|
|
609
|
-
TokenPermissions: [
|
|
610
|
-
{ name: "token", type: "address" },
|
|
611
|
-
{ name: "amount", type: "uint256" }
|
|
612
|
-
],
|
|
613
|
-
DepositWitness: [
|
|
614
|
-
{ name: "reserver", type: "address" },
|
|
615
|
-
{ name: "releaser", type: "address" }
|
|
616
|
-
]
|
|
617
|
-
};
|
|
618
|
-
function createTvmPermitWitnessTransferFromPrehash2(params) {
|
|
619
|
-
const maskedChainId = (0, chain_id_1.maskChainId)(params.chainId);
|
|
620
|
-
return {
|
|
621
|
-
types: PERMIT_WITNESS_TYPES_V2,
|
|
622
|
-
primaryType: "PermitWitnessTransferFrom",
|
|
623
|
-
domain: {
|
|
624
|
-
name: "Permit2",
|
|
625
|
-
chainId: `0x${maskedChainId.toString(16)}`,
|
|
626
|
-
verifyingContract: (0, tron_address_1.normalizeAddress)(params.permit2Address)
|
|
757
|
+
chainId: `0x${params.chainId.toString(16)}`,
|
|
758
|
+
verifyingContract: params.verifyingContract
|
|
627
759
|
},
|
|
628
760
|
message: {
|
|
629
761
|
permitted: {
|
|
630
|
-
token:
|
|
762
|
+
token: params.token,
|
|
631
763
|
amount: params.amount
|
|
632
764
|
},
|
|
633
|
-
spender:
|
|
765
|
+
spender: params.spender,
|
|
634
766
|
nonce: params.nonce.toString(),
|
|
635
767
|
deadline: params.deadline.toString(),
|
|
636
768
|
witness: {
|
|
637
|
-
reserver:
|
|
638
|
-
releaser:
|
|
769
|
+
reserver: params.reserver,
|
|
770
|
+
releaser: params.releaser
|
|
639
771
|
}
|
|
640
772
|
}
|
|
641
773
|
};
|
|
642
774
|
}
|
|
643
|
-
function
|
|
775
|
+
function hashPermitWitnessTransferFrom2(prehash) {
|
|
644
776
|
return ethers_1.TypedDataEncoder.hash(prehash.domain, prehash.types, prehash.message);
|
|
645
777
|
}
|
|
646
778
|
}
|
|
647
779
|
});
|
|
648
780
|
|
|
649
|
-
// ../contracts/
|
|
781
|
+
// ../contracts/evm/escrow-encoding/typescript/dist/index.js
|
|
650
782
|
var require_dist2 = __commonJS({
|
|
651
|
-
"../contracts/
|
|
783
|
+
"../contracts/evm/escrow-encoding/typescript/dist/index.js"(exports2) {
|
|
652
784
|
"use strict";
|
|
653
785
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
654
|
-
exports2.
|
|
655
|
-
var
|
|
656
|
-
Object.defineProperty(exports2, "
|
|
657
|
-
return
|
|
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;
|
|
787
|
+
var payment_id_1 = require_payment_id2();
|
|
788
|
+
Object.defineProperty(exports2, "computePaymentId", { enumerable: true, get: function() {
|
|
789
|
+
return payment_id_1.computePaymentId;
|
|
658
790
|
} });
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
return tron_address_1.base58ToHex;
|
|
791
|
+
Object.defineProperty(exports2, "computePaymentIdV2", { enumerable: true, get: function() {
|
|
792
|
+
return payment_id_1.computePaymentIdV2;
|
|
662
793
|
} });
|
|
663
|
-
|
|
664
|
-
|
|
794
|
+
var nonce_generator_1 = require_nonce_generator();
|
|
795
|
+
Object.defineProperty(exports2, "generateNonce", { enumerable: true, get: function() {
|
|
796
|
+
return nonce_generator_1.generateNonce;
|
|
797
|
+
} });
|
|
798
|
+
var permit_types_1 = require_permit_types();
|
|
799
|
+
Object.defineProperty(exports2, "PERMIT_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
800
|
+
return permit_types_1.PERMIT_WITNESS_TYPES;
|
|
801
|
+
} });
|
|
802
|
+
Object.defineProperty(exports2, "PERMIT_WITNESS_TYPES_V2", { enumerable: true, get: function() {
|
|
803
|
+
return permit_types_1.PERMIT_WITNESS_TYPES_V2;
|
|
804
|
+
} });
|
|
805
|
+
Object.defineProperty(exports2, "createPermit2Domain", { enumerable: true, get: function() {
|
|
806
|
+
return permit_types_1.createPermit2Domain;
|
|
807
|
+
} });
|
|
808
|
+
Object.defineProperty(exports2, "createEscrowDomain", { enumerable: true, get: function() {
|
|
809
|
+
return permit_types_1.createEscrowDomain;
|
|
810
|
+
} });
|
|
811
|
+
Object.defineProperty(exports2, "RESERVE_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
812
|
+
return permit_types_1.RESERVE_WITNESS_TYPES;
|
|
813
|
+
} });
|
|
814
|
+
Object.defineProperty(exports2, "RELEASE_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
815
|
+
return permit_types_1.RELEASE_WITNESS_TYPES;
|
|
816
|
+
} });
|
|
817
|
+
Object.defineProperty(exports2, "REFUND_WITNESS_TYPES", { enumerable: true, get: function() {
|
|
818
|
+
return permit_types_1.REFUND_WITNESS_TYPES;
|
|
819
|
+
} });
|
|
820
|
+
var escrow_abi_1 = require_escrow_abi();
|
|
821
|
+
Object.defineProperty(exports2, "ESCROW_ABI", { enumerable: true, get: function() {
|
|
822
|
+
return escrow_abi_1.ESCROW_ABI;
|
|
823
|
+
} });
|
|
824
|
+
Object.defineProperty(exports2, "ESCROW_ABI_JSON", { enumerable: true, get: function() {
|
|
825
|
+
return escrow_abi_1.ESCROW_ABI_JSON;
|
|
826
|
+
} });
|
|
827
|
+
Object.defineProperty(exports2, "ESCROW_V2_ABI_JSON", { enumerable: true, get: function() {
|
|
828
|
+
return escrow_abi_1.ESCROW_V2_ABI_JSON;
|
|
829
|
+
} });
|
|
830
|
+
Object.defineProperty(exports2, "ESCROW_V3_ABI_JSON", { enumerable: true, get: function() {
|
|
831
|
+
return escrow_abi_1.ESCROW_V3_ABI_JSON;
|
|
665
832
|
} });
|
|
666
833
|
var reserve_encoder_1 = require_reserve_encoder2();
|
|
667
834
|
Object.defineProperty(exports2, "computeReserveDigest", { enumerable: true, get: function() {
|
|
668
835
|
return reserve_encoder_1.computeReserveDigest;
|
|
669
836
|
} });
|
|
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
837
|
var deposit_encoder_1 = require_deposit_encoder2();
|
|
675
|
-
Object.defineProperty(exports2, "
|
|
676
|
-
return deposit_encoder_1.
|
|
838
|
+
Object.defineProperty(exports2, "createPermitWitnessTransferFromPrehash", { enumerable: true, get: function() {
|
|
839
|
+
return deposit_encoder_1.createPermitWitnessTransferFromPrehash;
|
|
677
840
|
} });
|
|
678
|
-
Object.defineProperty(exports2, "
|
|
679
|
-
return deposit_encoder_1.
|
|
841
|
+
Object.defineProperty(exports2, "hashPermitWitnessTransferFrom", { enumerable: true, get: function() {
|
|
842
|
+
return deposit_encoder_1.hashPermitWitnessTransferFrom;
|
|
843
|
+
} });
|
|
844
|
+
Object.defineProperty(exports2, "PERMIT2_CONTRACT_ADDRESS", { enumerable: true, get: function() {
|
|
845
|
+
return deposit_encoder_1.PERMIT2_CONTRACT_ADDRESS;
|
|
680
846
|
} });
|
|
681
847
|
}
|
|
682
848
|
});
|
|
683
849
|
|
|
684
|
-
// ../
|
|
850
|
+
// ../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/errors.js
|
|
685
851
|
var require_errors = __commonJS({
|
|
852
|
+
"../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/errors.js"(exports2) {
|
|
853
|
+
"use strict";
|
|
854
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
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";
|
|
860
|
+
}
|
|
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";
|
|
867
|
+
}
|
|
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";
|
|
874
|
+
}
|
|
875
|
+
};
|
|
876
|
+
exports2.SignerMismatchError = SignerMismatchError;
|
|
877
|
+
}
|
|
878
|
+
});
|
|
879
|
+
|
|
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) {
|
|
883
|
+
"use strict";
|
|
884
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
885
|
+
exports2.evmAdapter = void 0;
|
|
886
|
+
var ethers_1 = require("ethers");
|
|
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
|
+
};
|
|
989
|
+
}
|
|
990
|
+
};
|
|
991
|
+
}
|
|
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
|
+
};
|
|
1102
|
+
}
|
|
1103
|
+
});
|
|
1104
|
+
|
|
1105
|
+
// ../contracts/svm/escrow-encoding/typescript/dist/errors.js
|
|
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 =
|
|
788
|
-
var
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
2055
|
+
var errors_1 = require_errors2();
|
|
1635
2056
|
Object.defineProperty(exports2, "EncodingError", { enumerable: true, get: function() {
|
|
1636
2057
|
return errors_1.EncodingError;
|
|
1637
2058
|
} });
|
|
@@ -1676,29 +2097,344 @@ var require_dist3 = __commonJS({
|
|
|
1676
2097
|
Object.defineProperty(exports2, "computeReserveHash", { enumerable: true, get: function() {
|
|
1677
2098
|
return reserve_encoder_1.computeReserveHash;
|
|
1678
2099
|
} });
|
|
1679
|
-
var release_encoder_1 = require_release_encoder();
|
|
1680
|
-
Object.defineProperty(exports2, "computeReleaseHash", { enumerable: true, get: function() {
|
|
1681
|
-
return release_encoder_1.computeReleaseHash;
|
|
2100
|
+
var release_encoder_1 = require_release_encoder();
|
|
2101
|
+
Object.defineProperty(exports2, "computeReleaseHash", { enumerable: true, get: function() {
|
|
2102
|
+
return release_encoder_1.computeReleaseHash;
|
|
2103
|
+
} });
|
|
2104
|
+
var refund_encoder_1 = require_refund_encoder();
|
|
2105
|
+
Object.defineProperty(exports2, "computeRefundHash", { enumerable: true, get: function() {
|
|
2106
|
+
return refund_encoder_1.computeRefundHash;
|
|
2107
|
+
} });
|
|
2108
|
+
var nonce_generator_1 = require_nonce_generator2();
|
|
2109
|
+
Object.defineProperty(exports2, "generateNonce", { enumerable: true, get: function() {
|
|
2110
|
+
return nonce_generator_1.generateNonce;
|
|
2111
|
+
} });
|
|
2112
|
+
Object.defineProperty(exports2, "REPLAY_SLOTS", { enumerable: true, get: function() {
|
|
2113
|
+
return nonce_generator_1.REPLAY_SLOTS;
|
|
2114
|
+
} });
|
|
2115
|
+
Object.defineProperty(exports2, "MAX_VALID_SLOT", { enumerable: true, get: function() {
|
|
2116
|
+
return nonce_generator_1.MAX_VALID_SLOT;
|
|
2117
|
+
} });
|
|
2118
|
+
}
|
|
2119
|
+
});
|
|
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;
|
|
1682
2418
|
} });
|
|
1683
|
-
var
|
|
1684
|
-
Object.defineProperty(exports2, "
|
|
1685
|
-
return
|
|
2419
|
+
var errors_js_1 = require_errors();
|
|
2420
|
+
Object.defineProperty(exports2, "MalformedPrehashError", { enumerable: true, get: function() {
|
|
2421
|
+
return errors_js_1.MalformedPrehashError;
|
|
1686
2422
|
} });
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
return nonce_generator_1.generateNonce;
|
|
2423
|
+
Object.defineProperty(exports2, "RecoveryFailedError", { enumerable: true, get: function() {
|
|
2424
|
+
return errors_js_1.RecoveryFailedError;
|
|
1690
2425
|
} });
|
|
1691
|
-
Object.defineProperty(exports2, "
|
|
1692
|
-
return
|
|
2426
|
+
Object.defineProperty(exports2, "SignerMismatchError", { enumerable: true, get: function() {
|
|
2427
|
+
return errors_js_1.SignerMismatchError;
|
|
1693
2428
|
} });
|
|
1694
|
-
|
|
1695
|
-
|
|
2429
|
+
var signer_js_1 = require_signer();
|
|
2430
|
+
Object.defineProperty(exports2, "localKeySigner", { enumerable: true, get: function() {
|
|
2431
|
+
return signer_js_1.localKeySigner;
|
|
1696
2432
|
} });
|
|
1697
2433
|
}
|
|
1698
2434
|
});
|
|
1699
2435
|
|
|
1700
2436
|
// ../key-management/common/typescript/dist/errors.js
|
|
1701
|
-
var
|
|
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
|
|
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
|
|
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(
|
|
1818
|
-
__exportStar(
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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,
|
|
2822
|
-
await client.executeActivity("ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION", "delete_sub_organization", {
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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(
|
|
4620
|
+
import_turnkey_signer = __toESM(require_dist6());
|
|
3857
4621
|
TURNKEY_API_URL = "https://api.turnkey.com";
|
|
3858
4622
|
DEFAULTS = {
|
|
3859
4623
|
concurrencyLimit: 10,
|
|
@@ -4314,7 +5078,11 @@ var PaymentsService = class {
|
|
|
4314
5078
|
mediaType: "application/json",
|
|
4315
5079
|
errors: {
|
|
4316
5080
|
400: "Invalid request",
|
|
4317
|
-
|
|
5081
|
+
401: "Signature or sender authorization could not be verified",
|
|
5082
|
+
403: "Payment declined during counterparty authorization",
|
|
5083
|
+
413: "Payment request too large to process",
|
|
5084
|
+
500: "Internal server error",
|
|
5085
|
+
503: "A dependency is temporarily unavailable"
|
|
4318
5086
|
}
|
|
4319
5087
|
});
|
|
4320
5088
|
}
|
|
@@ -4447,6 +5215,7 @@ var AuthorizationsService = class {
|
|
|
4447
5215
|
errors: {
|
|
4448
5216
|
400: "Invalid payment request",
|
|
4449
5217
|
404: "Counterparty not found (no registration for the resolved DID)",
|
|
5218
|
+
500: "Internal server error",
|
|
4450
5219
|
502: "Counterparty webhook error (HTTP error or connection failure)",
|
|
4451
5220
|
504: "Authorization timed out (counterparty did not respond)"
|
|
4452
5221
|
}
|
|
@@ -4622,57 +5391,18 @@ var PaymentGatewayClient = class {
|
|
|
4622
5391
|
};
|
|
4623
5392
|
|
|
4624
5393
|
// src/chain-adapters/evm.ts
|
|
4625
|
-
var
|
|
5394
|
+
var import_ethers = require("ethers");
|
|
4626
5395
|
|
|
4627
5396
|
// src/chain-adapters/types.ts
|
|
4628
|
-
var PERMIT_DEADLINE = BigInt(1924991999);
|
|
4629
|
-
function resolvePermitDeadline(deadlineSeconds) {
|
|
4630
|
-
if (deadlineSeconds !== void 0) {
|
|
4631
|
-
return BigInt(Math.floor(Date.now() / 1e3) + deadlineSeconds);
|
|
4632
|
-
}
|
|
4633
|
-
return PERMIT_DEADLINE;
|
|
4634
|
-
}
|
|
4635
|
-
function generatePermitNonce() {
|
|
4636
|
-
const rand = new Uint32Array(1);
|
|
4637
|
-
globalThis.crypto.getRandomValues(rand);
|
|
4638
|
-
return (BigInt(Date.now()) << 32n) + BigInt(rand[0]);
|
|
4639
|
-
}
|
|
4640
5397
|
function assertKeyMatchesSender(matches, sender, derived) {
|
|
4641
5398
|
if (!matches) {
|
|
4642
5399
|
throw new Error(`The private key derives ${derived}, which does not match the sender address ${sender}`);
|
|
4643
5400
|
}
|
|
4644
5401
|
}
|
|
4645
5402
|
|
|
4646
|
-
// src/sender_auth_schemes/evm_permit2.ts
|
|
4647
|
-
var import_ethers = require("ethers");
|
|
4648
|
-
var import_evm_escrow_encoding = __toESM(require_dist());
|
|
4649
|
-
|
|
4650
5403
|
// src/chain-adapters/evm.ts
|
|
4651
5404
|
var evmAdapter = {
|
|
4652
5405
|
turnkeyAddressFormat: "ADDRESS_FORMAT_ETHEREUM",
|
|
4653
|
-
async buildAuthMessage({ sourceAsset, fulfillmentAmount, sourceDefaults, deadlineSeconds }) {
|
|
4654
|
-
const sourceChainId = sourceAsset.split("/")[0];
|
|
4655
|
-
const chainIdNum = parseInt(sourceChainId.split(":")[1]);
|
|
4656
|
-
const tokenAddress = sourceAsset.split("/")[1].split(":")[1];
|
|
4657
|
-
const permitParams = {
|
|
4658
|
-
chainId: chainIdNum,
|
|
4659
|
-
verifyingContract: import_evm_escrow_encoding.PERMIT2_CONTRACT_ADDRESS,
|
|
4660
|
-
token: tokenAddress,
|
|
4661
|
-
amount: fulfillmentAmount,
|
|
4662
|
-
spender: sourceDefaults.escrowContract,
|
|
4663
|
-
nonce: generatePermitNonce(),
|
|
4664
|
-
deadline: resolvePermitDeadline(deadlineSeconds),
|
|
4665
|
-
reserver: sourceDefaults.quoteSelector,
|
|
4666
|
-
releaser: sourceDefaults.fulfillmentVerifierAccount
|
|
4667
|
-
};
|
|
4668
|
-
const messagePrehash = (0, import_evm_escrow_encoding.createPermitWitnessTransferFromPrehash)(permitParams);
|
|
4669
|
-
const messageHash = (0, import_evm_escrow_encoding.hashPermitWitnessTransferFrom)(messagePrehash);
|
|
4670
|
-
return {
|
|
4671
|
-
messageScheme: "EVM_PERMIT2",
|
|
4672
|
-
messageHash,
|
|
4673
|
-
messagePrehash: JSON.stringify(messagePrehash)
|
|
4674
|
-
};
|
|
4675
|
-
},
|
|
4676
5406
|
formatPrivateKey(key) {
|
|
4677
5407
|
return key.startsWith("0x") ? key : "0x" + key;
|
|
4678
5408
|
},
|
|
@@ -4683,78 +5413,22 @@ var evmAdapter = {
|
|
|
4683
5413
|
throw new Error("Invalid private key");
|
|
4684
5414
|
}
|
|
4685
5415
|
},
|
|
4686
|
-
/**
|
|
4687
|
-
* Sign the Permit2 PermitWitnessTransferFrom typed data via standard
|
|
4688
|
-
* EIP-712 signing. The prehash is already shaped for direct consumption
|
|
4689
|
-
* by ethers' signTypedData (Permit2 domain has no version/salt; types
|
|
4690
|
-
* omits EIP712Domain since ethers generates that from the domain object).
|
|
4691
|
-
*/
|
|
4692
|
-
async sign(signedMessage, privateKey) {
|
|
4693
|
-
if (!signedMessage.message_prehash) {
|
|
4694
|
-
throw new Error("EVM adapter sign(): signed_messages[i].message_prehash is required");
|
|
4695
|
-
}
|
|
4696
|
-
const prehash = JSON.parse(signedMessage.message_prehash);
|
|
4697
|
-
const wallet = new import_ethers2.ethers.Wallet(privateKey);
|
|
4698
|
-
return wallet.signTypedData(prehash.domain, prehash.types, prehash.message);
|
|
4699
|
-
},
|
|
4700
5416
|
// Called after validatePrivateKey, so ethers.Wallet won't echo a malformed key.
|
|
4701
5417
|
verifyAddressMatchesKey(privateKey, address) {
|
|
4702
|
-
const derived = new
|
|
5418
|
+
const derived = new import_ethers.ethers.Wallet(privateKey).address;
|
|
4703
5419
|
assertKeyMatchesSender(derived.toLowerCase() === address.toLowerCase(), address, derived);
|
|
4704
5420
|
}
|
|
4705
5421
|
};
|
|
4706
5422
|
|
|
4707
5423
|
// src/chain-adapters/tron.ts
|
|
4708
|
-
var
|
|
5424
|
+
var import_ethers2 = require("ethers");
|
|
4709
5425
|
|
|
4710
5426
|
// src/sender_auth_schemes/tron.ts
|
|
4711
|
-
var import_tvm_escrow_encoding = __toESM(
|
|
5427
|
+
var import_tvm_escrow_encoding = __toESM(require_dist());
|
|
4712
5428
|
|
|
4713
5429
|
// src/chain-adapters/tron.ts
|
|
4714
|
-
var CHAIN_ID_MAP = {
|
|
4715
|
-
"shasta": 2494104990,
|
|
4716
|
-
"mainnet": 728126428
|
|
4717
|
-
};
|
|
4718
|
-
var PERMIT2_FALLBACKS = {
|
|
4719
|
-
"tron:shasta": "TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp",
|
|
4720
|
-
"tron:mainnet": "TJhMXTHQHeQyMD7TcKQFqAePNgG4b31H9m"
|
|
4721
|
-
};
|
|
4722
5430
|
var tronAdapter = {
|
|
4723
5431
|
turnkeyAddressFormat: "ADDRESS_FORMAT_TRON",
|
|
4724
|
-
async buildAuthMessage({ sourceAsset, fulfillmentAmount, sourceDefaults, deadlineSeconds }) {
|
|
4725
|
-
const sourceChainId = sourceAsset.split("/")[0];
|
|
4726
|
-
const chainName = sourceChainId.split(":")[1];
|
|
4727
|
-
const chainIdNum = CHAIN_ID_MAP[chainName];
|
|
4728
|
-
if (!chainIdNum) {
|
|
4729
|
-
throw new Error(`Unsupported Tron chain: ${chainName}`);
|
|
4730
|
-
}
|
|
4731
|
-
const tokenAddress = sourceAsset.split("/")[1].split(":")[1];
|
|
4732
|
-
let permit2Address = sourceDefaults.permit2Contract;
|
|
4733
|
-
if (permit2Address === void 0) {
|
|
4734
|
-
permit2Address = PERMIT2_FALLBACKS[sourceChainId];
|
|
4735
|
-
if (!permit2Address) {
|
|
4736
|
-
throw new Error(`don't know Permit2 address for chain ${sourceChainId}`);
|
|
4737
|
-
}
|
|
4738
|
-
}
|
|
4739
|
-
const tvmParams = {
|
|
4740
|
-
chainId: chainIdNum,
|
|
4741
|
-
permit2Address,
|
|
4742
|
-
tokenAddress,
|
|
4743
|
-
amount: fulfillmentAmount,
|
|
4744
|
-
spenderAddress: sourceDefaults.escrowContract,
|
|
4745
|
-
nonce: generatePermitNonce(),
|
|
4746
|
-
deadline: resolvePermitDeadline(deadlineSeconds),
|
|
4747
|
-
reserverAddress: sourceDefaults.quoteSelector,
|
|
4748
|
-
releaserAddress: sourceDefaults.fulfillmentVerifierAccount
|
|
4749
|
-
};
|
|
4750
|
-
const messagePrehash = (0, import_tvm_escrow_encoding.createTvmPermitWitnessTransferFromPrehash)(tvmParams);
|
|
4751
|
-
const messageHash = (0, import_tvm_escrow_encoding.hashTvmPermitWitnessTransferFrom)(messagePrehash);
|
|
4752
|
-
return {
|
|
4753
|
-
messageScheme: "EVM_PERMIT2",
|
|
4754
|
-
messageHash,
|
|
4755
|
-
messagePrehash: JSON.stringify(messagePrehash)
|
|
4756
|
-
};
|
|
4757
|
-
},
|
|
4758
5432
|
resolveContractOverrides(sourceDefaults) {
|
|
4759
5433
|
return {
|
|
4760
5434
|
quote_selector: (0, import_tvm_escrow_encoding.normalizeAddress)(sourceDefaults.quoteSelector),
|
|
@@ -4774,89 +5448,62 @@ var tronAdapter = {
|
|
|
4774
5448
|
throw new Error("Invalid private key");
|
|
4775
5449
|
}
|
|
4776
5450
|
},
|
|
4777
|
-
/**
|
|
4778
|
-
* Tron uses TIP-712 typed-data — same wire format as EIP-712. The prehash
|
|
4779
|
-
* built by createTvmPermitWitnessTransferFromPrehash is now directly
|
|
4780
|
-
* consumable by `wallet.signTypedData(prehash.domain, prehash.types,
|
|
4781
|
-
* prehash.message)`, but this adapter (an internal SDK helper) stays on the
|
|
4782
|
-
* raw-hash sign for parity with the EVM adapter — e2e tests use ethers
|
|
4783
|
-
* directly when they need the typed-data path.
|
|
4784
|
-
*/
|
|
4785
|
-
async sign(signedMessage, privateKey) {
|
|
4786
|
-
const wallet = new import_ethers3.ethers.Wallet(privateKey.startsWith("0x") ? privateKey : "0x" + privateKey);
|
|
4787
|
-
return wallet.signingKey.sign(signedMessage.message).serialized;
|
|
4788
|
-
},
|
|
4789
5451
|
// Tron addresses are the same secp256k1-derived 20 bytes as EVM. Compare the
|
|
4790
5452
|
// derived hex directly against the canonical sender; do NOT run normalizeAddress
|
|
4791
5453
|
// on the derived side — it strips a leading 41, which would corrupt an address
|
|
4792
5454
|
// whose first byte is 0x41.
|
|
4793
5455
|
verifyAddressMatchesKey(privateKey, address) {
|
|
4794
5456
|
const key = privateKey.startsWith("0x") ? privateKey : "0x" + privateKey;
|
|
4795
|
-
const derived = new
|
|
5457
|
+
const derived = new import_ethers2.ethers.Wallet(key).address;
|
|
4796
5458
|
assertKeyMatchesSender(derived.toLowerCase() === (0, import_tvm_escrow_encoding.normalizeAddress)(address), address, derived);
|
|
4797
5459
|
}
|
|
4798
5460
|
};
|
|
4799
5461
|
|
|
4800
5462
|
// src/chain-adapters/solana.ts
|
|
4801
5463
|
var import_tweetnacl = __toESM(require("tweetnacl"));
|
|
4802
|
-
var import_bs582 = __toESM(require("bs58"));
|
|
4803
|
-
var import_solana_escrow_encoding2 = __toESM(require_dist3());
|
|
4804
|
-
|
|
4805
|
-
// src/sender_auth_schemes/solana.ts
|
|
4806
|
-
var import_ethers4 = require("ethers");
|
|
4807
5464
|
var import_bs58 = __toESM(require("bs58"));
|
|
4808
|
-
var
|
|
4809
|
-
|
|
4810
|
-
|
|
4811
|
-
|
|
4812
|
-
}
|
|
4813
|
-
|
|
4814
|
-
|
|
4815
|
-
|
|
4816
|
-
|
|
4817
|
-
|
|
4818
|
-
|
|
4819
|
-
|
|
4820
|
-
mint: params.mint,
|
|
4821
|
-
amount: params.amount.toString(),
|
|
4822
|
-
reserver: params.reserver,
|
|
4823
|
-
releaser: params.releaser,
|
|
4824
|
-
nonce: params.nonce.toString(),
|
|
4825
|
-
issued_at: params.issuedAt.toString(),
|
|
4826
|
-
deadline: params.deadline.toString()
|
|
4827
|
-
};
|
|
4828
|
-
}
|
|
4829
|
-
function generateSolanaNonce() {
|
|
4830
|
-
return (0, import_solana_escrow_encoding.generateNonce)();
|
|
4831
|
-
}
|
|
4832
|
-
function clusterIdFromName(name) {
|
|
4833
|
-
const encoded = new TextEncoder().encode(name);
|
|
4834
|
-
if (encoded.length > 32) {
|
|
4835
|
-
throw new Error(`cluster name too long for cluster_id: ${name} (${encoded.length} > 32 bytes)`);
|
|
4836
|
-
}
|
|
4837
|
-
const out = new Uint8Array(32);
|
|
4838
|
-
out.set(encoded);
|
|
4839
|
-
return out;
|
|
5465
|
+
var solanaAdapter = {
|
|
5466
|
+
turnkeyAddressFormat: "ADDRESS_FORMAT_SOLANA",
|
|
5467
|
+
formatPrivateKey(key) {
|
|
5468
|
+
return key.startsWith("0x") ? key.slice(2) : key;
|
|
5469
|
+
},
|
|
5470
|
+
verifyAddressMatchesKey(privateKey, address) {
|
|
5471
|
+
const derived = deriveSolanaAddress(privateKey);
|
|
5472
|
+
assertKeyMatchesSender(derived === address, address, derived);
|
|
5473
|
+
}
|
|
5474
|
+
};
|
|
5475
|
+
function deriveSolanaAddress(privateKey) {
|
|
5476
|
+
return import_bs58.default.encode(import_tweetnacl.default.sign.keyPair.fromSecretKey(secretKeyFromPrivate(privateKey)).publicKey);
|
|
4840
5477
|
}
|
|
4841
|
-
function
|
|
4842
|
-
|
|
5478
|
+
function secretKeyFromPrivate(privateKey) {
|
|
5479
|
+
if (/^[0-9a-fA-F]{64}$/.test(privateKey)) {
|
|
5480
|
+
const seed = new Uint8Array(32);
|
|
5481
|
+
for (let i = 0; i < 32; i++) {
|
|
5482
|
+
seed[i] = parseInt(privateKey.substring(i * 2, i * 2 + 2), 16);
|
|
5483
|
+
}
|
|
5484
|
+
return import_tweetnacl.default.sign.keyPair.fromSeed(seed).secretKey;
|
|
5485
|
+
}
|
|
5486
|
+
const decoded = import_bs58.default.decode(privateKey);
|
|
5487
|
+
if (decoded.length === 64) {
|
|
5488
|
+
return decoded;
|
|
5489
|
+
}
|
|
5490
|
+
if (decoded.length === 32) {
|
|
5491
|
+
return import_tweetnacl.default.sign.keyPair.fromSeed(decoded).secretKey;
|
|
5492
|
+
}
|
|
5493
|
+
throw new Error(`Invalid Solana private key length: expected 32 or 64 bytes, got ${decoded.length}`);
|
|
4843
5494
|
}
|
|
4844
|
-
|
|
4845
|
-
|
|
4846
|
-
|
|
4847
|
-
|
|
4848
|
-
|
|
4849
|
-
|
|
4850
|
-
|
|
4851
|
-
|
|
4852
|
-
|
|
4853
|
-
|
|
4854
|
-
|
|
4855
|
-
|
|
4856
|
-
},
|
|
4857
|
-
domain
|
|
4858
|
-
);
|
|
4859
|
-
return bytesToHex(hash);
|
|
5495
|
+
|
|
5496
|
+
// src/chain-adapters/index.ts
|
|
5497
|
+
var adapters = {
|
|
5498
|
+
"eip155": evmAdapter,
|
|
5499
|
+
"tron": tronAdapter,
|
|
5500
|
+
"solana": solanaAdapter
|
|
5501
|
+
};
|
|
5502
|
+
function getChainAdapter(sourceChainId) {
|
|
5503
|
+
const prefix = sourceChainId.split(":")[0];
|
|
5504
|
+
const adapter = adapters[prefix];
|
|
5505
|
+
if (!adapter) throw new Error(`Unsupported source chain: ${sourceChainId}`);
|
|
5506
|
+
return adapter;
|
|
4860
5507
|
}
|
|
4861
5508
|
|
|
4862
5509
|
// src/chain-adapters/solana-clock.ts
|
|
@@ -4926,126 +5573,28 @@ async function resolveSolanaIssuedAt(opts) {
|
|
|
4926
5573
|
return BigInt(Math.floor(Date.now() / 1e3)) - SOLANA_ISSUED_AT_FALLBACK_SKEW_SECS;
|
|
4927
5574
|
}
|
|
4928
5575
|
|
|
4929
|
-
// src/
|
|
4930
|
-
var
|
|
4931
|
-
turnkeyAddressFormat: "ADDRESS_FORMAT_SOLANA",
|
|
4932
|
-
async buildAuthMessage({ sourceAsset, depositor, fulfillmentAmount, requestId, sourceDefaults, solanaRpcUrl, solanaClockReader, solanaLogger }) {
|
|
4933
|
-
const sourceChainId = sourceAsset.split("/")[0];
|
|
4934
|
-
const tokenMint = sourceAsset.split("/")[1].split(":")[1];
|
|
4935
|
-
const nonce = generateSolanaNonce();
|
|
4936
|
-
const issuedAt = await resolveSolanaIssuedAt({
|
|
4937
|
-
sourceChainId,
|
|
4938
|
-
rpcUrlOverride: solanaRpcUrl,
|
|
4939
|
-
reader: solanaClockReader,
|
|
4940
|
-
logger: solanaLogger
|
|
4941
|
-
});
|
|
4942
|
-
const deadline = issuedAt + BigInt(REPLAY_HORIZON_SECS - 8);
|
|
4943
|
-
const solanaParams = {
|
|
4944
|
-
depositor,
|
|
4945
|
-
mint: tokenMint,
|
|
4946
|
-
amount: BigInt(fulfillmentAmount),
|
|
4947
|
-
reserver: sourceDefaults.quoteSelector,
|
|
4948
|
-
releaser: sourceDefaults.fulfillmentVerifierAccount,
|
|
4949
|
-
nonce,
|
|
4950
|
-
issuedAt,
|
|
4951
|
-
deadline,
|
|
4952
|
-
requestId
|
|
4953
|
-
};
|
|
4954
|
-
const paymentId = generateSolanaPaymentIdV3(requestId);
|
|
4955
|
-
const prehash = createSolanaDepositPrehash(paymentId, solanaParams);
|
|
4956
|
-
if (!sourceDefaults.svmSignatureClusterId || sourceDefaults.svmSignatureDomainVersion == null) {
|
|
4957
|
-
throw new Error(
|
|
4958
|
-
"Solana source requires svm_signature_cluster_id and svm_signature_domain_version from payment-gw /defaults (V3 escrow domain separation). Is the gateway on V3?"
|
|
4959
|
-
);
|
|
4960
|
-
}
|
|
4961
|
-
const domain = {
|
|
4962
|
-
clusterId: clusterIdFromName(sourceDefaults.svmSignatureClusterId),
|
|
4963
|
-
signatureDomainVersion: sourceDefaults.svmSignatureDomainVersion,
|
|
4964
|
-
programId: import_solana_escrow_encoding2.Pubkey.fromBase58(sourceDefaults.escrowContract)
|
|
4965
|
-
};
|
|
4966
|
-
const depositHash = hashSolanaDepositV3(prehash, domain);
|
|
4967
|
-
return {
|
|
4968
|
-
messageScheme: "SOLANA",
|
|
4969
|
-
messageHash: depositHash,
|
|
4970
|
-
messagePrehash: JSON.stringify(prehash)
|
|
4971
|
-
};
|
|
4972
|
-
},
|
|
4973
|
-
formatPrivateKey(key) {
|
|
4974
|
-
return key.startsWith("0x") ? key.slice(2) : key;
|
|
4975
|
-
},
|
|
4976
|
-
/**
|
|
4977
|
-
* Solana has no EIP-712-style typed-data standard. The prehash structure
|
|
4978
|
-
* still describes what was hashed (for debugging / wallet UX), but the
|
|
4979
|
-
* canonical signing input is the chain-specific digest already in
|
|
4980
|
-
* signedMessage.message. We sign that with ed25519.
|
|
4981
|
-
*/
|
|
4982
|
-
async sign(signedMessage, privateKey) {
|
|
4983
|
-
const messageBytes = new Uint8Array(Buffer.from(signedMessage.message.replace("0x", ""), "hex"));
|
|
4984
|
-
const secretKey = secretKeyFromPrivate(privateKey);
|
|
4985
|
-
const sig = import_tweetnacl.default.sign.detached(messageBytes, secretKey);
|
|
4986
|
-
return "0x" + Buffer.from(sig).toString("hex");
|
|
4987
|
-
},
|
|
4988
|
-
/**
|
|
4989
|
-
* Solana Ed25519 signatures are not public-key-recoverable (unlike EVM
|
|
4990
|
-
* secp256k1, where ecrecover derives the signer from the signature). The
|
|
4991
|
-
* on-chain Ed25519 verify instruction must therefore be given the signer's
|
|
4992
|
-
* public key explicitly, so we ship it as signed_messages[0].payload.delegate_signer.
|
|
4993
|
-
* In the self-custody CLI flow the signer is the depositor itself, so this
|
|
4994
|
-
* equals source.account.
|
|
4995
|
-
*/
|
|
4996
|
-
deriveDelegateSigner(privateKey) {
|
|
4997
|
-
return deriveSolanaAddress(privateKey);
|
|
4998
|
-
},
|
|
4999
|
-
verifyAddressMatchesKey(privateKey, address) {
|
|
5000
|
-
const derived = deriveSolanaAddress(privateKey);
|
|
5001
|
-
assertKeyMatchesSender(derived === address, address, derived);
|
|
5002
|
-
}
|
|
5003
|
-
};
|
|
5004
|
-
function deriveSolanaAddress(privateKey) {
|
|
5005
|
-
return import_bs582.default.encode(import_tweetnacl.default.sign.keyPair.fromSecretKey(secretKeyFromPrivate(privateKey)).publicKey);
|
|
5006
|
-
}
|
|
5007
|
-
function secretKeyFromPrivate(privateKey) {
|
|
5008
|
-
if (/^[0-9a-fA-F]{64}$/.test(privateKey)) {
|
|
5009
|
-
const seed = new Uint8Array(32);
|
|
5010
|
-
for (let i = 0; i < 32; i++) {
|
|
5011
|
-
seed[i] = parseInt(privateKey.substring(i * 2, i * 2 + 2), 16);
|
|
5012
|
-
}
|
|
5013
|
-
return import_tweetnacl.default.sign.keyPair.fromSeed(seed).secretKey;
|
|
5014
|
-
}
|
|
5015
|
-
const decoded = import_bs582.default.decode(privateKey);
|
|
5016
|
-
if (decoded.length === 64) {
|
|
5017
|
-
return decoded;
|
|
5018
|
-
}
|
|
5019
|
-
if (decoded.length === 32) {
|
|
5020
|
-
return import_tweetnacl.default.sign.keyPair.fromSeed(decoded).secretKey;
|
|
5021
|
-
}
|
|
5022
|
-
throw new Error(`Invalid Solana private key length: expected 32 or 64 bytes, got ${decoded.length}`);
|
|
5023
|
-
}
|
|
5576
|
+
// src/index.ts
|
|
5577
|
+
var import_payment_request_sender_auth2 = __toESM(require_dist4());
|
|
5024
5578
|
|
|
5025
|
-
// src/
|
|
5026
|
-
var
|
|
5027
|
-
|
|
5028
|
-
|
|
5029
|
-
|
|
5030
|
-
|
|
5031
|
-
|
|
5032
|
-
|
|
5033
|
-
const adapter = adapters[prefix];
|
|
5034
|
-
if (!adapter) throw new Error(`Unsupported source chain: ${sourceChainId}`);
|
|
5035
|
-
return adapter;
|
|
5036
|
-
}
|
|
5579
|
+
// src/sender_auth_schemes/evm_permit2.ts
|
|
5580
|
+
var import_ethers3 = require("ethers");
|
|
5581
|
+
var import_evm_escrow_encoding = __toESM(require_dist2());
|
|
5582
|
+
|
|
5583
|
+
// src/sender_auth_schemes/solana.ts
|
|
5584
|
+
var import_ethers4 = require("ethers");
|
|
5585
|
+
var import_bs582 = __toESM(require("bs58"));
|
|
5586
|
+
var import_solana_escrow_encoding = __toESM(require_dist3());
|
|
5037
5587
|
|
|
5038
5588
|
// src/signers/raw.ts
|
|
5589
|
+
var import_payment_request_sender_auth = __toESM(require_dist4());
|
|
5039
5590
|
var RawSenderSigner = class {
|
|
5040
|
-
constructor(
|
|
5041
|
-
|
|
5042
|
-
this.privateKey = privateKey;
|
|
5591
|
+
constructor(network, privateKey) {
|
|
5592
|
+
const adapter = getChainAdapter(network);
|
|
5043
5593
|
adapter.validatePrivateKey?.(privateKey);
|
|
5594
|
+
this.inner = (0, import_payment_request_sender_auth.localKeySigner)(network, adapter.formatPrivateKey(privateKey));
|
|
5044
5595
|
}
|
|
5045
|
-
|
|
5046
|
-
|
|
5047
|
-
const delegateSigner = this.adapter.deriveDelegateSigner?.(this.privateKey);
|
|
5048
|
-
return { signature, ...delegateSigner ? { delegateSigner } : {} };
|
|
5596
|
+
sign(signedMessage) {
|
|
5597
|
+
return this.inner.sign(signedMessage);
|
|
5049
5598
|
}
|
|
5050
5599
|
};
|
|
5051
5600
|
|
|
@@ -5086,14 +5635,14 @@ function createSenderSigner(sourceChainId, opts) {
|
|
|
5086
5635
|
}
|
|
5087
5636
|
const adapter = getChainAdapter(sourceChainId);
|
|
5088
5637
|
const privateKey = adapter.formatPrivateKey(opts.privateKey);
|
|
5089
|
-
|
|
5638
|
+
adapter.validatePrivateKey?.(opts.privateKey);
|
|
5090
5639
|
if (opts.pinnedAddress) {
|
|
5091
5640
|
if (!adapter.verifyAddressMatchesKey) {
|
|
5092
5641
|
throw new Error(`pinnedAddress was provided but the ${sourceChainId} adapter cannot verify the key derives it`);
|
|
5093
5642
|
}
|
|
5094
5643
|
adapter.verifyAddressMatchesKey(privateKey, opts.pinnedAddress);
|
|
5095
5644
|
}
|
|
5096
|
-
return
|
|
5645
|
+
return new RawSenderSigner(sourceChainId, opts.privateKey);
|
|
5097
5646
|
}
|
|
5098
5647
|
|
|
5099
5648
|
// src/index.ts
|
|
@@ -5123,12 +5672,68 @@ function resolveDeadlines(params, defaultQuoteSeconds) {
|
|
|
5123
5672
|
`quoteDeadlineSeconds (${quoteDeadlineSeconds}) must be strictly less than fulfillmentDeadlineSeconds (${fulfillmentDeadlineSeconds}). The gateway rejects a quote_deadline that is not before fulfillment_deadline.`
|
|
5124
5673
|
);
|
|
5125
5674
|
}
|
|
5126
|
-
const now = Date.now();
|
|
5675
|
+
const now = (params.now ?? Date.now)();
|
|
5127
5676
|
return {
|
|
5128
5677
|
quote_deadline: new Date(now + quoteDeadlineSeconds * 1e3).toISOString(),
|
|
5129
5678
|
fulfillment_deadline: new Date(now + fulfillmentDeadlineSeconds * 1e3).toISOString()
|
|
5130
5679
|
};
|
|
5131
5680
|
}
|
|
5681
|
+
async function assemblePaymentRequest(params) {
|
|
5682
|
+
const sourceChainId = params.sourceAsset.split("/")[0];
|
|
5683
|
+
const namespace = sourceChainId.split(":")[0];
|
|
5684
|
+
const adapter = getChainAdapter(sourceChainId);
|
|
5685
|
+
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 }));
|
|
5686
|
+
const auth = await (0, import_payment_request_sender_auth2.getChainAdapter)(sourceChainId).buildAuthMessage({
|
|
5687
|
+
sourceAsset: params.sourceAsset,
|
|
5688
|
+
depositor: params.depositor,
|
|
5689
|
+
// The gateway pins the signed deposit amount to max_source_amount (the cap).
|
|
5690
|
+
maxSourceAmount: params.maxSourceAmount,
|
|
5691
|
+
requestId: params.requestId,
|
|
5692
|
+
sourceDefaults: params.sourceDefaults,
|
|
5693
|
+
deadline: params.deadline,
|
|
5694
|
+
nonce,
|
|
5695
|
+
...namespace === "solana" ? {
|
|
5696
|
+
solanaClockReader: (chainId) => resolveSolanaIssuedAt({
|
|
5697
|
+
sourceChainId: chainId,
|
|
5698
|
+
rpcUrlOverride: params.solanaRpcUrl,
|
|
5699
|
+
reader: params.solanaClockReader
|
|
5700
|
+
})
|
|
5701
|
+
} : {}
|
|
5702
|
+
});
|
|
5703
|
+
const contractOverrides = adapter.resolveContractOverrides?.(params.sourceDefaults);
|
|
5704
|
+
return {
|
|
5705
|
+
version: params.version ?? PAYMENT_REQUEST_VERSION,
|
|
5706
|
+
request_id: params.requestId,
|
|
5707
|
+
source: {
|
|
5708
|
+
asset_identifier: params.sourceAsset,
|
|
5709
|
+
account: params.depositor
|
|
5710
|
+
},
|
|
5711
|
+
destination: [{
|
|
5712
|
+
asset_identifier: params.destinationAsset,
|
|
5713
|
+
account: params.destinationAccount
|
|
5714
|
+
}],
|
|
5715
|
+
fulfillment_amount: params.fulfillmentAmount,
|
|
5716
|
+
max_source_amount: params.maxSourceAmount,
|
|
5717
|
+
quote_deadline: params.quoteDeadline,
|
|
5718
|
+
fulfillment_deadline: params.fulfillmentDeadline,
|
|
5719
|
+
escrow_contract_address: params.sourceDefaults.escrowContract,
|
|
5720
|
+
quote_selector: contractOverrides?.quote_selector ?? params.sourceDefaults.quoteSelector,
|
|
5721
|
+
fulfillment_verifier: contractOverrides?.fulfillment_verifier ?? {
|
|
5722
|
+
account: params.sourceDefaults.fulfillmentVerifierAccount,
|
|
5723
|
+
endpoint: params.sourceDefaults.fulfillmentVerifierEndpoint
|
|
5724
|
+
},
|
|
5725
|
+
fulfillment_proxy: params.fulfillmentProxy,
|
|
5726
|
+
...params.settlerRequirements ? { settler_requirements: params.settlerRequirements } : {},
|
|
5727
|
+
sender_auth: {
|
|
5728
|
+
message_scheme: auth.messageScheme,
|
|
5729
|
+
signed_messages: [{
|
|
5730
|
+
message: auth.messageHash,
|
|
5731
|
+
message_prehash: auth.messagePrehash,
|
|
5732
|
+
signature: ""
|
|
5733
|
+
}]
|
|
5734
|
+
}
|
|
5735
|
+
};
|
|
5736
|
+
}
|
|
5132
5737
|
var PaymentGatewayClient2 = class extends PaymentGatewayClient {
|
|
5133
5738
|
constructor(config, HttpRequest = AxiosHttpRequest) {
|
|
5134
5739
|
super(config, HttpRequest);
|
|
@@ -5189,64 +5794,84 @@ var PaymentGatewayClient2 = class extends PaymentGatewayClient {
|
|
|
5189
5794
|
}
|
|
5190
5795
|
/**
|
|
5191
5796
|
* Prepares a payment request with defaults, ready for signing.
|
|
5192
|
-
*
|
|
5797
|
+
*
|
|
5798
|
+
* By default this resolves the corridor addresses from the gateway `/defaults`
|
|
5799
|
+
* endpoint. It reaches the gateway only for what the caller has NOT already
|
|
5800
|
+
* supplied via `resolvedDefaults`: supply `resolvedDefaults.source` to skip the
|
|
5801
|
+
* source-chain fetch and `resolvedDefaults.destination` to skip the destination
|
|
5802
|
+
* fetch. Supplying both builds the request **entirely offline** (no network) —
|
|
5803
|
+
* how a caller that already holds the corridor addresses (e.g. from a signed
|
|
5804
|
+
* challenge) constructs and signs a request without gateway access. Such a
|
|
5805
|
+
* caller typically also injects `now` so the deadlines are deterministic.
|
|
5806
|
+
*
|
|
5807
|
+
* @example Minimal — fetch corridor addresses from the gateway, then sign
|
|
5808
|
+
* ```ts
|
|
5809
|
+
* const client = new PaymentGatewayClient({ BASE: "https://gateway.example.com" });
|
|
5810
|
+
*
|
|
5811
|
+
* const request = await client.preparePaymentRequest({
|
|
5812
|
+
* depositor: "0xPayerAddress",
|
|
5813
|
+
* sourceAsset: "eip155:8453/erc20:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", // USDC on Base
|
|
5814
|
+
* destinationAccount: "0xMerchantAddress",
|
|
5815
|
+
* destinationAsset: "eip155:42161/erc20:0xaf88d065e77c8cC2239327C5EDb3A432268e5831", // USDC on Arbitrum
|
|
5816
|
+
* fulfillmentAmount: "10000000", // 10 USDC (6 decimals)
|
|
5817
|
+
* });
|
|
5818
|
+
* // max_source_amount, deadlines, request id, and nonce are all defaulted.
|
|
5819
|
+
*
|
|
5820
|
+
* const signer = createSenderSigner("eip155:8453", { provider: "raw", privateKey });
|
|
5821
|
+
* await signPaymentRequest(request, signer); // fills sender_auth, ready to submit
|
|
5822
|
+
* ```
|
|
5823
|
+
*
|
|
5193
5824
|
* @param params Payment parameters
|
|
5194
5825
|
* @returns A complete PaymentRequest object without the signature
|
|
5195
5826
|
*/
|
|
5196
5827
|
async preparePaymentRequest(params) {
|
|
5197
|
-
const
|
|
5828
|
+
const now = (params.now ?? Date.now)();
|
|
5829
|
+
const { quote_deadline, fulfillment_deadline } = resolveDeadlines({ ...params, now: () => now }, DEFAULT_PAYMENT_QUOTE_DEADLINE_SECONDS);
|
|
5198
5830
|
const sourceChainId = params.sourceAsset.split("/")[0];
|
|
5199
5831
|
const destChainId = params.destinationAsset.split("/")[0];
|
|
5200
|
-
const [sourceDefaults,
|
|
5201
|
-
this.fetchChainDefaults(sourceChainId),
|
|
5202
|
-
this.fetchChainDefaults(destChainId)
|
|
5832
|
+
const [sourceDefaults, fulfillmentProxy] = await Promise.all([
|
|
5833
|
+
params.resolvedDefaults?.source ?? this.fetchChainDefaults(sourceChainId),
|
|
5834
|
+
params.resolvedDefaults?.destination?.fulfillmentProxy ?? this.fetchChainDefaults(destChainId).then((d) => d.fulfillmentProxy)
|
|
5203
5835
|
]);
|
|
5204
|
-
|
|
5205
|
-
|
|
5206
|
-
|
|
5207
|
-
|
|
5836
|
+
if (!params.requestId) {
|
|
5837
|
+
throw new Error(
|
|
5838
|
+
"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"
|
|
5839
|
+
);
|
|
5840
|
+
}
|
|
5841
|
+
const requestId = params.requestId;
|
|
5842
|
+
const sourceNamespace = sourceChainId.split(":")[0];
|
|
5843
|
+
let permitDeadline;
|
|
5844
|
+
if (sourceNamespace !== "solana") {
|
|
5845
|
+
const fulfillmentMs = Date.parse(fulfillment_deadline);
|
|
5846
|
+
if (params.deadlineSeconds !== void 0) {
|
|
5847
|
+
permitDeadline = Math.ceil(now / 1e3) + Math.ceil(params.deadlineSeconds);
|
|
5848
|
+
if (permitDeadline * 1e3 < fulfillmentMs) {
|
|
5849
|
+
throw new Error(
|
|
5850
|
+
`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.`
|
|
5851
|
+
);
|
|
5852
|
+
}
|
|
5853
|
+
} else {
|
|
5854
|
+
permitDeadline = Math.floor(fulfillmentMs / 1e3) + 1;
|
|
5855
|
+
}
|
|
5856
|
+
}
|
|
5857
|
+
return assemblePaymentRequest({
|
|
5208
5858
|
depositor: params.depositor,
|
|
5209
5859
|
fulfillmentAmount: params.fulfillmentAmount,
|
|
5860
|
+
sourceAsset: params.sourceAsset,
|
|
5861
|
+
destinationAccount: params.destinationAccount,
|
|
5862
|
+
destinationAsset: params.destinationAsset,
|
|
5863
|
+
maxSourceAmount: params.maxSourceAmount ?? defaultMaxSourceAmount(params.fulfillmentAmount),
|
|
5210
5864
|
requestId,
|
|
5865
|
+
quoteDeadline: quote_deadline,
|
|
5866
|
+
fulfillmentDeadline: fulfillment_deadline,
|
|
5211
5867
|
sourceDefaults,
|
|
5212
|
-
|
|
5213
|
-
|
|
5868
|
+
fulfillmentProxy,
|
|
5869
|
+
nonce: params.nonce,
|
|
5870
|
+
deadline: permitDeadline,
|
|
5871
|
+
solanaRpcUrl: params.solanaRpcUrl,
|
|
5872
|
+
solanaClockReader: params.solanaClockReader,
|
|
5873
|
+
settlerRequirements: params.settlerRequirements
|
|
5214
5874
|
});
|
|
5215
|
-
const contractOverrides = adapter.resolveContractOverrides?.(sourceDefaults);
|
|
5216
|
-
return {
|
|
5217
|
-
version: PAYMENT_REQUEST_VERSION,
|
|
5218
|
-
request_id: requestId,
|
|
5219
|
-
source: {
|
|
5220
|
-
asset_identifier: params.sourceAsset,
|
|
5221
|
-
account: params.depositor
|
|
5222
|
-
},
|
|
5223
|
-
destination: [{
|
|
5224
|
-
asset_identifier: params.destinationAsset,
|
|
5225
|
-
account: params.destinationAccount
|
|
5226
|
-
}],
|
|
5227
|
-
fulfillment_amount: params.fulfillmentAmount,
|
|
5228
|
-
max_source_amount: params.maxSourceAmount ?? defaultMaxSourceAmount(params.fulfillmentAmount),
|
|
5229
|
-
// REQUIRED (the gateway injects no defaults). Callers can widen the window via
|
|
5230
|
-
// quoteDeadlineSeconds / fulfillmentDeadlineSeconds, e.g. for slow Turnkey signing.
|
|
5231
|
-
quote_deadline,
|
|
5232
|
-
fulfillment_deadline,
|
|
5233
|
-
escrow_contract_address: sourceDefaults.escrowContract,
|
|
5234
|
-
quote_selector: contractOverrides?.quote_selector ?? sourceDefaults.quoteSelector,
|
|
5235
|
-
fulfillment_verifier: contractOverrides?.fulfillment_verifier ?? {
|
|
5236
|
-
account: sourceDefaults.fulfillmentVerifierAccount,
|
|
5237
|
-
endpoint: sourceDefaults.fulfillmentVerifierEndpoint
|
|
5238
|
-
},
|
|
5239
|
-
fulfillment_proxy: destDefaults.fulfillmentProxy,
|
|
5240
|
-
...params.settlerRequirements ? { settler_requirements: params.settlerRequirements } : {},
|
|
5241
|
-
sender_auth: {
|
|
5242
|
-
message_scheme: auth.messageScheme,
|
|
5243
|
-
signed_messages: [{
|
|
5244
|
-
message: auth.messageHash,
|
|
5245
|
-
message_prehash: auth.messagePrehash,
|
|
5246
|
-
signature: ""
|
|
5247
|
-
}]
|
|
5248
|
-
}
|
|
5249
|
-
};
|
|
5250
5875
|
}
|
|
5251
5876
|
/**
|
|
5252
5877
|
* Prepares a quote-request body (`CreateQuoteRequest`), ready to POST to
|
|
@@ -5358,7 +5983,7 @@ function loadTurnkeyConfigFromEnv() {
|
|
|
5358
5983
|
};
|
|
5359
5984
|
}
|
|
5360
5985
|
var program = new import_commander.Command();
|
|
5361
|
-
program.name("send-payment").description("Send a cross-chain payment through Atum Payment Gateway").version("1.0.0").argument("<sender>", "Depositor address (e.g., 0xF0D0...)").argument("<amount>", "Amount to send (in smallest units, e.g., 100000 for 0.10 USDC)").argument("<sourceAsset>", "Source asset in CAIP-19 format").argument("<receiver>", "Destination account address").argument("<destinationAsset>", "Destination asset in CAIP-19 format").option("--gateway <url>", "Payment gateway URL", defaultGateway).option("--request-id <id>", "
|
|
5986
|
+
program.name("send-payment").description("Send a cross-chain payment through Atum Payment Gateway").version("1.0.0").argument("<sender>", "Depositor address (e.g., 0xF0D0...)").argument("<amount>", "Amount to send (in smallest units, e.g., 100000 for 0.10 USDC)").argument("<sourceAsset>", "Source asset in CAIP-19 format").argument("<receiver>", "Destination account address").argument("<destinationAsset>", "Destination asset in CAIP-19 format").option("--gateway <url>", "Payment gateway URL", defaultGateway).option("--request-id <id>", "Idempotency key; seeds the on-chain deposit nonce. Reuse the same id to retry a payment safely. Omit to auto-generate a one-shot id.").option("--request-id-prefix <prefix>", "Custom request ID prefix (default: pmt-gw-cli)").option("--quote-deadline-seconds <n>", `Quote collection window in seconds (default: ${DEFAULT_PAYMENT_QUOTE_DEADLINE_SECONDS})`, parseSeconds("--quote-deadline-seconds")).option("--fulfillment-deadline-seconds <n>", `Settlement horizon in seconds (default: ${DEFAULT_FULFILLMENT_DEADLINE_SECONDS})`, parseSeconds("--fulfillment-deadline-seconds")).option("--whitelistSettler <did>", "Settler DID to whitelist (can be specified multiple times)", collect, []).option("--provider <raw|turnkey>", "Sender signing provider", "raw").option("--solana-rpc-url <url>", "Solana RPC used to read the cluster clock for issued_at (falls back to the SOLANA_RPC_URL env var, then the public endpoint for the cluster)").addHelpText("after", `
|
|
5362
5987
|
CAIP-19 Examples:
|
|
5363
5988
|
EVM ERC20: eip155:42161/erc20:0xaf88d065e77c8cC2239327C5EDb3A432268e5831
|
|
5364
5989
|
Tron TRC20: tron:shasta/trc20:TG3XXyExBkPp9nzdajDZsozEu4BkaSJozs
|
|
@@ -5381,6 +6006,7 @@ token for the Permit2 contract (0x000000000022D473030F116dDEE9F6B43aC78BA3 on
|
|
|
5381
6006
|
virtually all EVM chains). (And the same applies for Tron/TRC-20, with a
|
|
5382
6007
|
Permit2 address of TJhMXTHQHeQyMD7TcKQFqAePNgG4b31H9m on mainnet or
|
|
5383
6008
|
TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp on Shasta)`).action(async (sender, amount, sourceAsset, receiver, destinationAsset, options) => {
|
|
6009
|
+
let requestId;
|
|
5384
6010
|
try {
|
|
5385
6011
|
const sourceChainId = sourceAsset.split("/")[0];
|
|
5386
6012
|
let privateKey = "";
|
|
@@ -5397,6 +6023,8 @@ TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp on Shasta)`).action(async (sender, amount, so
|
|
|
5397
6023
|
} else {
|
|
5398
6024
|
throw new Error(`Unknown --provider '${options.provider}' (expected 'raw' or 'turnkey')`);
|
|
5399
6025
|
}
|
|
6026
|
+
const resolvedRequestId = options.requestId ?? `${options.requestIdPrefix || "pmt-gw-cli"}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
6027
|
+
requestId = resolvedRequestId;
|
|
5400
6028
|
const client = new PaymentGatewayClient2({ BASE: options.gateway });
|
|
5401
6029
|
const paymentRequest = await client.preparePaymentRequest({
|
|
5402
6030
|
depositor: sender,
|
|
@@ -5404,8 +6032,7 @@ TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp on Shasta)`).action(async (sender, amount, so
|
|
|
5404
6032
|
sourceAsset,
|
|
5405
6033
|
destinationAccount: receiver,
|
|
5406
6034
|
destinationAsset,
|
|
5407
|
-
requestId:
|
|
5408
|
-
requestIdPrefix: options.requestIdPrefix || "pmt-gw-cli",
|
|
6035
|
+
requestId: resolvedRequestId,
|
|
5409
6036
|
quoteDeadlineSeconds: options.quoteDeadlineSeconds,
|
|
5410
6037
|
fulfillmentDeadlineSeconds: options.fulfillmentDeadlineSeconds,
|
|
5411
6038
|
solanaRpcUrl: options.solanaRpcUrl || process.env.SOLANA_RPC_URL,
|
|
@@ -5421,6 +6048,7 @@ TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp on Shasta)`).action(async (sender, amount, so
|
|
|
5421
6048
|
};
|
|
5422
6049
|
}
|
|
5423
6050
|
console.error(JSON.stringify(paymentRequest, null, 2));
|
|
6051
|
+
console.error(`request_id: ${requestId} (re-run with --request-id ${requestId} to retry this same payment)`);
|
|
5424
6052
|
const response = await client.payments.submitPayment({
|
|
5425
6053
|
requestBody: paymentRequest
|
|
5426
6054
|
});
|
|
@@ -5436,6 +6064,9 @@ TPUqJPASUn1zLvbLBgRZ5pBYrx7WSe5ahp on Shasta)`).action(async (sender, amount, so
|
|
|
5436
6064
|
console.error(JSON.stringify(error.availableDefaults, null, 2));
|
|
5437
6065
|
}
|
|
5438
6066
|
}
|
|
6067
|
+
if (requestId) {
|
|
6068
|
+
console.error(`request_id: ${requestId} (re-run with --request-id ${requestId} to retry this same payment)`);
|
|
6069
|
+
}
|
|
5439
6070
|
process.exit(1);
|
|
5440
6071
|
}
|
|
5441
6072
|
});
|