uvd-x402-sdk 2.86.0 → 2.87.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.
@@ -1211,6 +1211,14 @@ function randomNonce() {
1211
1211
  }
1212
1212
  return ethers.hexlify(ethers.randomBytes(32));
1213
1213
  }
1214
+ function resolveOrderTiming(params) {
1215
+ const nowSec = params.now === void 0 ? Math.floor(Date.now() / 1e3) : Math.floor(params.now);
1216
+ return {
1217
+ nowSec,
1218
+ deadline: params.deadline === void 0 ? nowSec + LIFECYCLE_DEFAULT_DEADLINE_SECS : Math.floor(params.deadline),
1219
+ nonce: params.nonce === void 0 ? randomNonce() : params.nonce
1220
+ };
1221
+ }
1214
1222
  function toUintString(value, field) {
1215
1223
  let n;
1216
1224
  try {
@@ -1224,7 +1232,8 @@ function toUintString(value, field) {
1224
1232
  return n.toString();
1225
1233
  }
1226
1234
  function buildLifecycleTypedData(params) {
1227
- const { action, paymentInfo, payer, amount, chainId, deadline, nonce } = params;
1235
+ const { action, paymentInfo, payer, amount, chainId } = params;
1236
+ const { deadline, nonce } = resolveOrderTiming(params);
1228
1237
  if (!LIFECYCLE_ACTIONS.includes(action)) {
1229
1238
  throw new X402Error(
1230
1239
  `unknown lifecycle action ${String(action)}; the facilitator only signs ${LIFECYCLE_ACTIONS.join(", ")}`,
@@ -1283,10 +1292,8 @@ function buildLifecycleTypedData(params) {
1283
1292
  };
1284
1293
  }
1285
1294
  async function buildLifecycleAuth(params) {
1286
- const { wallet, deadline, nonce, now, ...rest } = params;
1287
- const nowSec = now === void 0 ? Math.floor(Date.now() / 1e3) : Math.floor(now);
1288
- const dl = deadline === void 0 ? nowSec + LIFECYCLE_DEFAULT_DEADLINE_SECS : Math.floor(deadline);
1289
- const nonceHex = nonce === void 0 ? randomNonce() : nonce;
1295
+ const { wallet, ...rest } = params;
1296
+ const { nowSec, deadline: dl, nonce: nonceHex } = resolveOrderTiming(params);
1290
1297
  if (dl < nowSec) {
1291
1298
  throw new X402Error(
1292
1299
  `deadline ${dl} is in the past (now ${nowSec}): the facilitator discards it as \`expired\``,
@@ -4257,6 +4264,25 @@ var TIER_TIMINGS = {
4257
4264
  premium: { pre: 14400, auth: 172800, refund: 1209600 },
4258
4265
  enterprise: { pre: 86400, auth: 604800, refund: 2592e3 }
4259
4266
  };
4267
+ async function resolveLifecycleAuth(action, options, order) {
4268
+ if (options?.lifecycleSigner && options?.lifecycleAuth) {
4269
+ throw new X402Error(
4270
+ "lifecycleSigner and lifecycleAuth are mutually exclusive: the first signs an order here, the second was already signed elsewhere. Passing both means two different orders exist and only one can travel.",
4271
+ "INVALID_CONFIG"
4272
+ );
4273
+ }
4274
+ if (options?.lifecycleAuth) return options.lifecycleAuth;
4275
+ if (!options?.lifecycleSigner) return void 0;
4276
+ return buildLifecycleAuth({
4277
+ action,
4278
+ paymentInfo: order.paymentInfo,
4279
+ payer: order.payer,
4280
+ amount: order.amount,
4281
+ chainId: order.chainId,
4282
+ wallet: options.lifecycleSigner,
4283
+ deadline: options.lifecycleDeadline
4284
+ });
4285
+ }
4260
4286
  var OPERATOR_ABI = [
4261
4287
  "function release(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint256 amount)",
4262
4288
  "function refundInEscrow(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint120 amount)",
@@ -4667,6 +4693,13 @@ var AdvancedEscrowClient = class {
4667
4693
  * lifecycleSigner: payerWallet, // EnvKeyAdapter, OWS, wagmiLifecycleSigner(...)
4668
4694
  * });
4669
4695
  * ```
4696
+ *
4697
+ * @example Transporting an order the publisher signed in their browser
4698
+ * ```typescript
4699
+ * // The browser sent back a signature over a document THIS backend built.
4700
+ * const lifecycleAuth = lifecycleAuthFromSignature(typedData, signature, payer);
4701
+ * await client.releaseViaFacilitator(pi, amount, { lifecycleAuth });
4702
+ * ```
4670
4703
  */
4671
4704
  async releaseViaFacilitator(paymentInfo, amount, options) {
4672
4705
  if (!this.payerAddress) await this.init();
@@ -4685,15 +4718,12 @@ var AdvancedEscrowClient = class {
4685
4718
  salt: paymentInfo.salt
4686
4719
  };
4687
4720
  const releaseAmount = amount || paymentInfo.maxAmount;
4688
- const lifecycleAuth = options?.lifecycleSigner ? await buildLifecycleAuth({
4689
- action: "release",
4721
+ const lifecycleAuth = await resolveLifecycleAuth("release", options, {
4690
4722
  paymentInfo: wirePaymentInfo,
4691
4723
  payer: this.payerAddress,
4692
4724
  amount: releaseAmount,
4693
- chainId: this.chainId,
4694
- wallet: options.lifecycleSigner,
4695
- deadline: options.lifecycleDeadline
4696
- }) : void 0;
4725
+ chainId: this.chainId
4726
+ });
4697
4727
  const payload = {
4698
4728
  x402Version: 2,
4699
4729
  scheme: "escrow",
@@ -4822,15 +4852,12 @@ var AdvancedEscrowClient = class {
4822
4852
  salt: paymentInfo.salt
4823
4853
  };
4824
4854
  const refundAmount = amount || paymentInfo.maxAmount;
4825
- const lifecycleAuth = options?.lifecycleSigner ? await buildLifecycleAuth({
4826
- action: "refundInEscrow",
4855
+ const lifecycleAuth = await resolveLifecycleAuth("refundInEscrow", options, {
4827
4856
  paymentInfo: wirePaymentInfo,
4828
4857
  payer: this.payerAddress,
4829
4858
  amount: refundAmount,
4830
- chainId: this.chainId,
4831
- wallet: options.lifecycleSigner,
4832
- deadline: options.lifecycleDeadline
4833
- }) : void 0;
4859
+ chainId: this.chainId
4860
+ });
4834
4861
  const payload = {
4835
4862
  x402Version: 2,
4836
4863
  scheme: "escrow",