@atumlabs/mppx-atum-escrow 0.2.2 → 0.3.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 +18 -0
- package/README.md +211 -46
- package/dist/{chunk-NEM3HEZW.js → chunk-4YD6566T.js} +125 -7
- package/dist/{chunk-4P34CLTO.js → chunk-Z3AUNEU5.js} +63 -5
- package/dist/{chunk-IPZJXELQ.js → chunk-ZFA5SSUP.js} +254 -84
- package/dist/client.d.ts +14 -12
- package/dist/client.js +4 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +19 -3
- package/dist/{internal-DzEGXm14.d.ts → internal-9tB7y-A7.d.ts} +19 -1
- package/dist/server.d.ts +221 -12
- package/dist/server.js +18 -2
- package/package.json +1 -1
|
@@ -496,12 +496,14 @@ var require_utils = __commonJS({
|
|
|
496
496
|
"../schemas/declarations/PaymentRequest/v1/bindings/typescript/sender-auth/dist/utils.js"(exports) {
|
|
497
497
|
"use strict";
|
|
498
498
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
499
|
-
exports.SOLANA_REPLAY_SLOTS = exports.PERMIT_NONCE_DOMAIN = exports.REPLAY_HORIZON_SECS = void 0;
|
|
499
|
+
exports.REQUEST_ID_DOMAIN = exports.SOLANA_REPLAY_SLOTS = exports.PERMIT_NONCE_DOMAIN = exports.REPLAY_HORIZON_SECS = void 0;
|
|
500
500
|
exports.resolvePermitDeadline = resolvePermitDeadline;
|
|
501
501
|
exports.generatePermitNonce = generatePermitNonce;
|
|
502
502
|
exports.resolvePermitNonce = resolvePermitNonce;
|
|
503
|
+
exports.canonicalDepositor = canonicalDepositor;
|
|
503
504
|
exports.deterministicPermitNonce = deterministicPermitNonce;
|
|
504
505
|
exports.deterministicSolanaNonce = deterministicSolanaNonce;
|
|
506
|
+
exports.deterministicRequestId = deterministicRequestId2;
|
|
505
507
|
exports.sameAddress = sameAddress2;
|
|
506
508
|
exports.assertKeyMatchesSender = assertKeyMatchesSender;
|
|
507
509
|
exports.assertToken = assertToken;
|
|
@@ -546,6 +548,20 @@ var require_utils = __commonJS({
|
|
|
546
548
|
const bucket = (seed >> 8n) % (1n << SOLANA_BUCKET_BITS);
|
|
547
549
|
return bucket << 32n | slot;
|
|
548
550
|
}
|
|
551
|
+
exports.REQUEST_ID_DOMAIN = "atum-request:v1:";
|
|
552
|
+
function deterministicRequestId2(params) {
|
|
553
|
+
if (!params.anchor) {
|
|
554
|
+
throw new Error("sender_auth: a per-intent anchor is required to derive a deterministic request_id (a random one would silently break idempotency and let a retry double-charge)");
|
|
555
|
+
}
|
|
556
|
+
if (!params.account) {
|
|
557
|
+
throw new Error("sender_auth: account is required to derive a deterministic request_id");
|
|
558
|
+
}
|
|
559
|
+
if (!/^[A-Za-z0-9_-]*$/.test(params.prefix)) {
|
|
560
|
+
throw new Error(`sender_auth: request_id prefix must contain only letters, digits, '_' or '-' (got ${JSON.stringify(params.prefix)})`);
|
|
561
|
+
}
|
|
562
|
+
const digest = (0, ethers_1.keccak256)((0, ethers_1.toUtf8Bytes)(`${exports.REQUEST_ID_DOMAIN}${params.anchor}:${canonicalDepositor(params.account)}`));
|
|
563
|
+
return `${params.prefix}${digest.slice(2, 26)}`;
|
|
564
|
+
}
|
|
549
565
|
function sameAddress2(a, b) {
|
|
550
566
|
if (a.startsWith("0x") && b.startsWith("0x")) {
|
|
551
567
|
return a.toLowerCase() === b.toLowerCase();
|
|
@@ -693,7 +709,7 @@ var require_evm = __commonJS({
|
|
|
693
709
|
exports.evmAdapter = {
|
|
694
710
|
async buildAuthMessage({ sourceAsset, maxSourceAmount, sourceDefaults, deadline, nonce }) {
|
|
695
711
|
if (nonce === void 0) {
|
|
696
|
-
throw new Error("sender_auth: buildAuthMessage requires an explicit nonce \u2014 derive it deterministically from a stable request id (e.g.
|
|
712
|
+
throw new Error("sender_auth: buildAuthMessage requires an explicit nonce \u2014 derive it deterministically from a stable request id (e.g. an order id) so retries reproduce the same permit; pass generatePermitNonce() only for genuinely one-shot builds");
|
|
697
713
|
}
|
|
698
714
|
if (deadline === void 0) {
|
|
699
715
|
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)");
|
|
@@ -721,6 +737,10 @@ var require_evm = __commonJS({
|
|
|
721
737
|
throw new Error("EVM adapter sign(): signed_messages[i].message_prehash is required");
|
|
722
738
|
}
|
|
723
739
|
const prehash = JSON.parse(signedMessage.message_prehash);
|
|
740
|
+
const prehashDigest = (0, evm_escrow_encoding_1.hashPermitWitnessTransferFrom)(prehash);
|
|
741
|
+
if (prehashDigest.toLowerCase() !== signedMessage.message.toLowerCase()) {
|
|
742
|
+
throw new Error(`EVM adapter sign(): message_prehash implies digest ${prehashDigest} but message is ${signedMessage.message}`);
|
|
743
|
+
}
|
|
724
744
|
const wallet = new ethers_1.Wallet(privateKey);
|
|
725
745
|
return wallet.signTypedData(prehash.domain, prehash.types, prehash.message);
|
|
726
746
|
},
|
|
@@ -1011,7 +1031,7 @@ var require_tron = __commonJS({
|
|
|
1011
1031
|
exports.tronAdapter = {
|
|
1012
1032
|
async buildAuthMessage({ sourceAsset, maxSourceAmount, sourceDefaults, deadline, nonce }) {
|
|
1013
1033
|
if (nonce === void 0) {
|
|
1014
|
-
throw new Error("sender_auth: buildAuthMessage requires an explicit nonce \u2014 derive it deterministically from a stable request id (e.g.
|
|
1034
|
+
throw new Error("sender_auth: buildAuthMessage requires an explicit nonce \u2014 derive it deterministically from a stable request id (e.g. an order id) so retries reproduce the same permit; pass generatePermitNonce() only for genuinely one-shot builds");
|
|
1015
1035
|
}
|
|
1016
1036
|
if (deadline === void 0) {
|
|
1017
1037
|
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)");
|
|
@@ -1034,9 +1054,19 @@ var require_tron = __commonJS({
|
|
|
1034
1054
|
const messageHash = (0, tvm_escrow_encoding_1.hashTvmPermitWitnessTransferFrom)(messagePrehash);
|
|
1035
1055
|
return { messageScheme: "EVM_PERMIT2", messageHash, messagePrehash: JSON.stringify(messagePrehash) };
|
|
1036
1056
|
},
|
|
1057
|
+
// Signs the TIP-712 typed data, not the bare digest, so a signer can inspect the fields it is
|
|
1058
|
+
// authorizing (Turnkey policies read `eth.eip_712.message[...]`).
|
|
1037
1059
|
async sign(signedMessage, privateKey) {
|
|
1060
|
+
if (!signedMessage.message_prehash) {
|
|
1061
|
+
throw new Error("Tron adapter sign(): signed_messages[i].message_prehash is required");
|
|
1062
|
+
}
|
|
1063
|
+
const prehash = JSON.parse(signedMessage.message_prehash);
|
|
1064
|
+
const prehashDigest = (0, tvm_escrow_encoding_1.hashTvmPermitWitnessTransferFrom)(prehash);
|
|
1065
|
+
if (prehashDigest.toLowerCase() !== signedMessage.message.toLowerCase()) {
|
|
1066
|
+
throw new Error(`Tron adapter sign(): message_prehash implies digest ${prehashDigest} but message is ${signedMessage.message}`);
|
|
1067
|
+
}
|
|
1038
1068
|
const wallet = new ethers_1.Wallet(privateKey.startsWith("0x") ? privateKey : "0x" + privateKey);
|
|
1039
|
-
return wallet.
|
|
1069
|
+
return wallet.signTypedData(prehash.domain, prehash.types, prehash.message);
|
|
1040
1070
|
},
|
|
1041
1071
|
recoverSigner(signed, source) {
|
|
1042
1072
|
let recovered;
|
|
@@ -2443,9 +2473,34 @@ var require_dist4 = __commonJS({
|
|
|
2443
2473
|
var import_tvm_escrow_encoding = __toESM(require_dist2(), 1);
|
|
2444
2474
|
var import_payment_request_sender_auth = __toESM(require_dist4(), 1);
|
|
2445
2475
|
import * as z from "zod/mini";
|
|
2446
|
-
import { Method } from "mppx";
|
|
2476
|
+
import { Method, PaymentRequest as OpaqueCodec } from "mppx";
|
|
2447
2477
|
var METHOD_NAME = "atum-escrow";
|
|
2448
2478
|
var INTENT = "charge";
|
|
2479
|
+
var INTENT_ID_META_KEY = "atumIntentId";
|
|
2480
|
+
var REQUEST_ID_PREFIX = "req_mpp_";
|
|
2481
|
+
function chargeRequestId(intentId, account) {
|
|
2482
|
+
return (0, import_payment_request_sender_auth.deterministicRequestId)({ anchor: intentId, account, prefix: REQUEST_ID_PREFIX });
|
|
2483
|
+
}
|
|
2484
|
+
function intentIdOf(challenge) {
|
|
2485
|
+
const fromMeta = challenge.meta?.[INTENT_ID_META_KEY];
|
|
2486
|
+
if (typeof fromMeta === "string" && fromMeta !== "") {
|
|
2487
|
+
return fromMeta;
|
|
2488
|
+
}
|
|
2489
|
+
if (challenge.opaque === void 0) {
|
|
2490
|
+
return void 0;
|
|
2491
|
+
}
|
|
2492
|
+
let decoded;
|
|
2493
|
+
try {
|
|
2494
|
+
decoded = OpaqueCodec.deserialize(challenge.opaque);
|
|
2495
|
+
} catch {
|
|
2496
|
+
return void 0;
|
|
2497
|
+
}
|
|
2498
|
+
if (typeof decoded !== "object" || decoded === null) {
|
|
2499
|
+
return void 0;
|
|
2500
|
+
}
|
|
2501
|
+
const value = decoded[INTENT_ID_META_KEY];
|
|
2502
|
+
return typeof value === "string" && value !== "" ? value : void 0;
|
|
2503
|
+
}
|
|
2449
2504
|
var ChargeRequestSchema = z.object({
|
|
2450
2505
|
/** The source chain/token/cap the payer funds from (one option per challenge). */
|
|
2451
2506
|
source: z.object({
|
|
@@ -2571,6 +2626,9 @@ export {
|
|
|
2571
2626
|
import_payment_request_sender_auth,
|
|
2572
2627
|
METHOD_NAME,
|
|
2573
2628
|
INTENT,
|
|
2629
|
+
INTENT_ID_META_KEY,
|
|
2630
|
+
chargeRequestId,
|
|
2631
|
+
intentIdOf,
|
|
2574
2632
|
ChargeRequestSchema,
|
|
2575
2633
|
CredentialPayloadSchema,
|
|
2576
2634
|
atumEscrowChargeMethod,
|