uvd-x402-sdk 2.71.0 → 2.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -3422,6 +3422,88 @@ function buildSignatureParams(params) {
3422
3422
  parts.push(`alg="${ALG}"`);
3423
3423
  return parts.join(";");
3424
3424
  }
3425
+
3426
+ // src/erc7702.ts
3427
+ var DELEGATE_PREFIX = "ef0100";
3428
+ var SMA_WRAP_TARGETS = [
3429
+ "0x69007702764179f14f51cdce752f4f775d74e139"
3430
+ // Alchemy SemiModularAccount7702
3431
+ ];
3432
+ function needsAccountWrap(target) {
3433
+ return !!target && SMA_WRAP_TARGETS.includes(target.toLowerCase());
3434
+ }
3435
+ var WRAP_PREFIX = "0000000000ff00";
3436
+ function delegateTarget(code) {
3437
+ if (!code) return null;
3438
+ const h = (code.startsWith("0x") ? code.slice(2) : code).toLowerCase();
3439
+ if (!h.startsWith(DELEGATE_PREFIX) || h.length < 46) return null;
3440
+ return `0x${h.slice(6, 46)}`;
3441
+ }
3442
+ function wrapSignature(innerSignature) {
3443
+ const s = innerSignature.startsWith("0x") ? innerSignature.slice(2) : innerSignature;
3444
+ return `0x${WRAP_PREFIX}${s}`;
3445
+ }
3446
+ function replaySafeTypedData(innerDigest, chainId, account) {
3447
+ return {
3448
+ domain: { chainId, verifyingContract: account },
3449
+ types: { ReplaySafeHash: [{ name: "hash", type: "bytes32" }] },
3450
+ message: { hash: innerDigest }
3451
+ };
3452
+ }
3453
+ function rpcDelegationResolver(urls, timeoutMs = 6e3) {
3454
+ const endpoints = typeof urls === "string" ? [urls] : [...urls];
3455
+ return async (address) => {
3456
+ const addr = (address || "").trim();
3457
+ if (!addr || endpoints.length === 0) return null;
3458
+ for (const url of endpoints) {
3459
+ const controller = new AbortController();
3460
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
3461
+ try {
3462
+ const res = await fetch(url, {
3463
+ method: "POST",
3464
+ headers: { "Content-Type": "application/json" },
3465
+ body: JSON.stringify({
3466
+ jsonrpc: "2.0",
3467
+ id: 1,
3468
+ method: "eth_getCode",
3469
+ params: [addr.toLowerCase(), "latest"]
3470
+ }),
3471
+ signal: controller.signal
3472
+ });
3473
+ clearTimeout(timer);
3474
+ if (!res.ok) continue;
3475
+ const code = (await res.json())?.result;
3476
+ if (typeof code === "string" && code.startsWith("0x")) {
3477
+ return delegateTarget(code) ?? false;
3478
+ }
3479
+ } catch {
3480
+ clearTimeout(timer);
3481
+ }
3482
+ }
3483
+ return null;
3484
+ };
3485
+ }
3486
+ async function resolveDelegation(address, network, resolver) {
3487
+ if (!resolver) return { delegated: null, target: null };
3488
+ let v;
3489
+ try {
3490
+ v = await resolver(address, network);
3491
+ } catch {
3492
+ return { delegated: null, target: null };
3493
+ }
3494
+ if (typeof v === "string") {
3495
+ const t = v.trim();
3496
+ if (/^0x[0-9a-fA-F]{40}$/.test(t)) return { delegated: true, target: t };
3497
+ return { delegated: null, target: null };
3498
+ }
3499
+ if (typeof v === "boolean") return { delegated: v, target: null };
3500
+ return { delegated: null, target: null };
3501
+ }
3502
+ async function isDelegated(address, network, resolver) {
3503
+ return (await resolveDelegation(address, network, resolver)).delegated;
3504
+ }
3505
+
3506
+ // src/escrow-preauth.ts
3425
3507
  var ZERO_ADDRESS2 = "0x0000000000000000000000000000000000000000";
3426
3508
  var USDC_DECIMALS = 6;
3427
3509
  var ESCROW_DEPOSIT_LIMIT_USD = 100;
@@ -3567,26 +3649,56 @@ async function buildEscrowPreAuth(wallet, params) {
3567
3649
  );
3568
3650
  const payer = ethers.getAddress(params.payerWallet);
3569
3651
  const tokenCollector = ethers.getAddress(cfg.token_collector);
3570
- const { signature } = await wallet.signTypedData(
3571
- JSON.stringify({
3572
- domain: {
3573
- name: cfg.usdc_domain_name,
3574
- version: cfg.usdc_domain_version,
3575
- chainId: cfg.chain_id,
3576
- verifyingContract: ethers.getAddress(cfg.usdc)
3577
- },
3578
- types: RECEIVE_WITH_AUTHORIZATION_TYPES,
3579
- primaryType: "ReceiveWithAuthorization",
3580
- message: {
3581
- from: payer,
3582
- to: tokenCollector,
3583
- value: maxAmount.toString(),
3584
- validAfter: "0",
3585
- validBefore: String(paymentInfo.preApprovalExpiry),
3586
- nonce
3587
- }
3588
- })
3652
+ const typedData = {
3653
+ domain: {
3654
+ name: cfg.usdc_domain_name,
3655
+ version: cfg.usdc_domain_version,
3656
+ chainId: cfg.chain_id,
3657
+ verifyingContract: ethers.getAddress(cfg.usdc)
3658
+ },
3659
+ types: RECEIVE_WITH_AUTHORIZATION_TYPES,
3660
+ primaryType: "ReceiveWithAuthorization",
3661
+ message: {
3662
+ from: payer,
3663
+ to: tokenCollector,
3664
+ value: maxAmount.toString(),
3665
+ validAfter: "0",
3666
+ validBefore: String(paymentInfo.preApprovalExpiry),
3667
+ nonce
3668
+ }
3669
+ };
3670
+ const { delegated, target } = await resolveDelegation(
3671
+ payer,
3672
+ `eip155:${cfg.chain_id}`,
3673
+ params.delegationResolver
3589
3674
  );
3675
+ if (delegated === null && params.delegationResolver) {
3676
+ throw new X402Error(
3677
+ `Could not determine whether ${payer} is EIP-7702-delegated on chain ${cfg.chain_id} (the resolver gave no verdict) \u2014 refusing to sign an escrow authorization blindly: the wrong dialect is unsettleable on-chain and the failure only shows up at lock time. Retry when the chain is readable.`,
3678
+ "INVALID_CONFIG"
3679
+ );
3680
+ }
3681
+ let signature;
3682
+ if (delegated && (needsAccountWrap(target) || target === null)) {
3683
+ const innerDigest = ethers.TypedDataEncoder.hash(
3684
+ typedData.domain,
3685
+ typedData.types,
3686
+ typedData.message
3687
+ );
3688
+ const replaySafe = replaySafeTypedData(innerDigest, cfg.chain_id, payer);
3689
+ const wrapped = await wallet.signTypedData(
3690
+ JSON.stringify({ ...replaySafe, primaryType: "ReplaySafeHash" })
3691
+ );
3692
+ if (!wrapped?.signature) {
3693
+ throw new X402Error(
3694
+ "The wallet returned no signature for the replay-safe wrap \u2014 refusing to build an unsettleable authorization.",
3695
+ "INVALID_CONFIG"
3696
+ );
3697
+ }
3698
+ signature = wrapSignature(wrapped.signature);
3699
+ } else {
3700
+ signature = (await wallet.signTypedData(JSON.stringify(typedData))).signature;
3701
+ }
3590
3702
  return JSON.stringify({
3591
3703
  x402Version: 2,
3592
3704
  scheme: "escrow",
@@ -4394,6 +4506,6 @@ var ESCROW_TIMEOUT_MS = {
4394
4506
  // Monad: 90s
4395
4507
  };
4396
4508
 
4397
- export { ANCHOR_MAX_REQUEST_BYTES, CAIP2_IDENTIFIERS, CAIP2_TO_CHAIN, ContentHashMismatch, DEFAULT_CHAIN, DEFAULT_CONFIG, DEFAULT_FACILITATOR_URL, DEFAULT_PAYMENT_HEADER, DX402Error, ESCROW_DEPOSIT_LIMIT_USD, ESCROW_TIER_WINDOWS, EVENT_KINDS, EVIDENCE_HEADER, EnvKeyAdapter, EvidenceSkipped, FACILITATOR_ADDRESSES, FacilitatorClient, KEEPALIVE_INTERVAL_MS, OPERATOR_FEE_BPS, OWSWalletAdapter, PAYMENT_HEADER_NAMES, SSEParser, SUPPORTED_CHAINS, TrafficStreamError, X402Client, X402Error, X402_CORS_HEADERS, X402_HEADER_NAMES, ZERO_ADDRESS, anchorDigest, anchorEvidence, availableBackends, buildEscrowPreAuth, buildPaymentRequirements, buildSettleRequest, buildSettleRequestV2, buildSignatureBase, buildSignatureParams, buildTokenMetadata, buildVerifyRequest, buildVerifyRequestV2, caip2ToChain, chainToCAIP2, computeEscrowNonce, contentHash, convertX402Header, create402Response, createHonoMiddleware, createPaymentHeaders, createPaymentMiddleware, createSignedFetch, createX402Header, createX402V1Header, createX402V2Header, decodeBase64Utf8, decodeX402Header, dereferencePointer, detectX402Version, paymentId as dx402PaymentId, ed25519ToX25519, encodeBase64Json, encodeBase64Utf8, encodeX402Header, evidenceFromHeaders, evidenceHeader, extractPaymentFromHeaders, fetchNonce, generatePaymentOptions, getAlgorandChains, getChainById, getChainByName, getChainsByNetworkType, getChainsByToken, getCorsHeaders, getEVMChainIds, getEnabledChains, getExplorerAddressUrl, getExplorerTxUrl, getFacilitatorAddress, getNetworkType, getPaymentHeader, getSVMChains, getSuiChains, getSupportedTokens, getTokenByAddress, getTokenConfig, getXRPLChains, isAlgorandChain, isCAIP2Format, isChainSupported, isEndToEnd, isSVMChain, isSuiChain, isTokenSupported, isXRPLChain, matchesFilters, parseEvidenceHeader, parseNetworkIdentifier, parseSealed, parseTrafficEvent, payerKeyFromEvmSignature, payerKeyFromSolanaAddress, paymentChallengeFrom, recoverEvidence, sealEvidence, sealEvidenceTo, sealedRoles, sellerDigestFor, signAnchorEd25519, signAnchorEvm, signRequest, signRequestWithSigner, signRequestWithWallet, streamTrafficEvents, unseal, validateAmount, validateRecipient };
4509
+ export { ANCHOR_MAX_REQUEST_BYTES, CAIP2_IDENTIFIERS, CAIP2_TO_CHAIN, ContentHashMismatch, DEFAULT_CHAIN, DEFAULT_CONFIG, DEFAULT_FACILITATOR_URL, DEFAULT_PAYMENT_HEADER, DELEGATE_PREFIX, DX402Error, ESCROW_DEPOSIT_LIMIT_USD, ESCROW_TIER_WINDOWS, EVENT_KINDS, EVIDENCE_HEADER, EnvKeyAdapter, EvidenceSkipped, FACILITATOR_ADDRESSES, FacilitatorClient, KEEPALIVE_INTERVAL_MS, OPERATOR_FEE_BPS, OWSWalletAdapter, PAYMENT_HEADER_NAMES, SMA_WRAP_TARGETS, SSEParser, SUPPORTED_CHAINS, TrafficStreamError, X402Client, X402Error, X402_CORS_HEADERS, X402_HEADER_NAMES, ZERO_ADDRESS, anchorDigest, anchorEvidence, availableBackends, buildEscrowPreAuth, buildPaymentRequirements, buildSettleRequest, buildSettleRequestV2, buildSignatureBase, buildSignatureParams, buildTokenMetadata, buildVerifyRequest, buildVerifyRequestV2, caip2ToChain, chainToCAIP2, computeEscrowNonce, contentHash, convertX402Header, create402Response, createHonoMiddleware, createPaymentHeaders, createPaymentMiddleware, createSignedFetch, createX402Header, createX402V1Header, createX402V2Header, decodeBase64Utf8, decodeX402Header, delegateTarget, dereferencePointer, detectX402Version, paymentId as dx402PaymentId, ed25519ToX25519, encodeBase64Json, encodeBase64Utf8, encodeX402Header, evidenceFromHeaders, evidenceHeader, extractPaymentFromHeaders, fetchNonce, generatePaymentOptions, getAlgorandChains, getChainById, getChainByName, getChainsByNetworkType, getChainsByToken, getCorsHeaders, getEVMChainIds, getEnabledChains, getExplorerAddressUrl, getExplorerTxUrl, getFacilitatorAddress, getNetworkType, getPaymentHeader, getSVMChains, getSuiChains, getSupportedTokens, getTokenByAddress, getTokenConfig, getXRPLChains, isAlgorandChain, isCAIP2Format, isChainSupported, isDelegated, isEndToEnd, isSVMChain, isSuiChain, isTokenSupported, isXRPLChain, matchesFilters, needsAccountWrap, parseEvidenceHeader, parseNetworkIdentifier, parseSealed, parseTrafficEvent, payerKeyFromEvmSignature, payerKeyFromSolanaAddress, paymentChallengeFrom, recoverEvidence, replaySafeTypedData, resolveDelegation, rpcDelegationResolver, sealEvidence, sealEvidenceTo, sealedRoles, sellerDigestFor, signAnchorEd25519, signAnchorEvm, signRequest, signRequestWithSigner, signRequestWithWallet, streamTrafficEvents, unseal, validateAmount, validateRecipient, wrapSignature };
4398
4510
  //# sourceMappingURL=index.mjs.map
4399
4511
  //# sourceMappingURL=index.mjs.map