@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.
@@ -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. the challenge id) so retries reproduce the same permit; pass generatePermitNonce() only for genuinely one-shot builds");
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. the challenge id) so retries reproduce the same permit; pass generatePermitNonce() only for genuinely one-shot builds");
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.signingKey.sign(signedMessage.message).serialized;
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,