@piprail/sdk 2.13.1 → 2.14.1

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.
Files changed (30) hide show
  1. package/CHANGELOG.md +109 -0
  2. package/dist/{algorand-AQK5EAUF.cjs → algorand-ICJNXO5V.cjs} +43 -42
  3. package/dist/{algorand-TQCYK2XT.js → algorand-RM7MP4PK.js} +12 -11
  4. package/dist/{aptos-RYQOSFBQ.js → aptos-2FIRTMQX.js} +11 -10
  5. package/dist/{aptos-65UX7GKA.cjs → aptos-MVEG5ZPS.cjs} +41 -40
  6. package/dist/{chunk-DCOUJZPL.cjs → chunk-57V5DNJT.cjs} +45 -19
  7. package/dist/{chunk-O32N6MFN.js → chunk-NUPCFNC5.js} +27 -1
  8. package/dist/index.cjs +503 -239
  9. package/dist/index.d.cts +279 -7
  10. package/dist/index.d.ts +279 -7
  11. package/dist/index.js +299 -35
  12. package/dist/{ledger-mF_SoiDB.d.ts → ledger-uFtXlIHY.d.cts} +31 -1
  13. package/dist/{ledger-mF_SoiDB.d.cts → ledger-uFtXlIHY.d.ts} +31 -1
  14. package/dist/{near-UDPFA6SV.cjs → near-C2IS4RCH.cjs} +39 -30
  15. package/dist/{near-VDATC5AV.js → near-L2OWD7M6.js} +14 -5
  16. package/dist/node.d.cts +2 -2
  17. package/dist/node.d.ts +2 -2
  18. package/dist/{solana-RQNXFCZO.cjs → solana-B424IQ5I.cjs} +54 -39
  19. package/dist/{solana-VYLWFNAH.js → solana-V2TGLHJ4.js} +22 -7
  20. package/dist/{stellar-OK2HW5PZ.cjs → stellar-4YR4UZQX.cjs} +23 -23
  21. package/dist/{stellar-KBR4V77T.js → stellar-J7VE7QP7.js} +4 -4
  22. package/dist/{sui-SVFBJFW5.cjs → sui-F7UW6JXJ.cjs} +35 -27
  23. package/dist/{sui-BXHB6D3W.js → sui-GMRQAAJH.js} +20 -12
  24. package/dist/{ton-D7YN6BGR.cjs → ton-3SHFVDLP.cjs} +33 -22
  25. package/dist/{ton-NNKQFQ6U.js → ton-PEBYBNWJ.js} +18 -7
  26. package/dist/{tron-WZFU57NX.cjs → tron-BS5EID2U.cjs} +39 -39
  27. package/dist/{tron-W2D5PQXV.js → tron-ZYJHHROT.js} +10 -10
  28. package/dist/{xrpl-37E23W53.js → xrpl-P2D6TS6I.js} +13 -13
  29. package/dist/{xrpl-5NHY3NEL.cjs → xrpl-SUEFOOKW.cjs} +31 -31
  30. package/package.json +3 -2
@@ -9,7 +9,7 @@
9
9
 
10
10
 
11
11
 
12
- var _chunkDCOUJZPLcjs = require('./chunk-DCOUJZPL.cjs');
12
+ var _chunk57V5DNJTcjs = require('./chunk-57V5DNJT.cjs');
13
13
 
14
14
  // src/drivers/aptos/index.ts
15
15
  var _tssdk = require('@aptos-labs/ts-sdk');
@@ -58,14 +58,14 @@ async function payAptos(params) {
58
58
  const res = await client.signSubmit({ signer, transaction });
59
59
  return res.hash;
60
60
  } catch (err) {
61
- if (err instanceof _chunkDCOUJZPLcjs.InsufficientFundsError) throw err;
61
+ if (err instanceof _chunk57V5DNJTcjs.InsufficientFundsError) throw err;
62
62
  if (isAptosAffordability(err)) {
63
- throw new (0, _chunkDCOUJZPLcjs.InsufficientFundsError)(
63
+ throw new (0, _chunk57V5DNJTcjs.InsufficientFundsError)(
64
64
  err instanceof Error ? err.message : "Insufficient APT/token balance for the payment.",
65
65
  { cause: err }
66
66
  );
67
67
  }
68
- throw _nullishCoalesce(_chunkDCOUJZPLcjs.toInsufficientFundsError.call(void 0, err), () => ( err));
68
+ throw _nullishCoalesce(_chunk57V5DNJTcjs.toInsufficientFundsError.call(void 0, err), () => ( err));
69
69
  }
70
70
  }
71
71
  function isAptosAffordability(err) {
@@ -103,24 +103,24 @@ function parseAddr(addr) {
103
103
  async function payExactAptos(input) {
104
104
  const { client, sender, accept } = input;
105
105
  if (accept.asset === "native") {
106
- throw new (0, _chunkDCOUJZPLcjs.UnsupportedSchemeError)(
106
+ throw new (0, _chunk57V5DNJTcjs.UnsupportedSchemeError)(
107
107
  "Aptos exact is Fungible-Asset only (a primary_fungible_store transfer); native APT is not exact-payable. Pay via onchain-proof."
108
108
  );
109
109
  }
110
110
  const feePayer = accept.extra.feePayer;
111
111
  if (!feePayer) {
112
- throw new (0, _chunkDCOUJZPLcjs.UnsupportedSchemeError)("Aptos exact rail must advertise extra.feePayer (the gas sponsor address).");
112
+ throw new (0, _chunk57V5DNJTcjs.UnsupportedSchemeError)("Aptos exact rail must advertise extra.feePayer (the gas sponsor address).");
113
113
  }
114
114
  const feePayerAddr = parseAddr(feePayer);
115
- if (!feePayerAddr) throw new (0, _chunkDCOUJZPLcjs.UnsupportedSchemeError)(`Aptos exact: extra.feePayer "${feePayer}" is not a valid Aptos address.`);
115
+ if (!feePayerAddr) throw new (0, _chunk57V5DNJTcjs.UnsupportedSchemeError)(`Aptos exact: extra.feePayer "${feePayer}" is not a valid Aptos address.`);
116
116
  const payToAddr = parseAddr(accept.payTo);
117
- if (!payToAddr) throw new (0, _chunkDCOUJZPLcjs.UnsupportedSchemeError)(`Aptos exact: payTo "${accept.payTo}" is not a valid Aptos address.`);
117
+ if (!payToAddr) throw new (0, _chunk57V5DNJTcjs.UnsupportedSchemeError)(`Aptos exact: payTo "${accept.payTo}" is not a valid Aptos address.`);
118
118
  const metadataAddr = parseAddr(accept.asset);
119
- if (!metadataAddr) throw new (0, _chunkDCOUJZPLcjs.UnsupportedSchemeError)(`Aptos exact: asset "${accept.asset}" is not a valid FA metadata address.`);
119
+ if (!metadataAddr) throw new (0, _chunk57V5DNJTcjs.UnsupportedSchemeError)(`Aptos exact: asset "${accept.asset}" is not a valid FA metadata address.`);
120
120
  const senderAddr = parseAddr(sender);
121
- if (!senderAddr) throw new (0, _chunkDCOUJZPLcjs.UnsupportedSchemeError)(`Aptos exact: payer "${sender}" is not a valid Aptos address.`);
121
+ if (!senderAddr) throw new (0, _chunk57V5DNJTcjs.UnsupportedSchemeError)(`Aptos exact: payer "${sender}" is not a valid Aptos address.`);
122
122
  if (feePayerAddr.equals(senderAddr)) {
123
- throw new (0, _chunkDCOUJZPLcjs.UnsupportedSchemeError)(
123
+ throw new (0, _chunk57V5DNJTcjs.UnsupportedSchemeError)(
124
124
  "Aptos exact: the fee payer must differ from the payer \u2014 the buyer must pay ZERO APT (the sponsor pays gas)."
125
125
  );
126
126
  }
@@ -158,16 +158,16 @@ function argBytes(arg) {
158
158
  async function verifyAndSettleExactAptos(input) {
159
159
  const { client, feePayerAddr, payload, accept } = input;
160
160
  const railFeePayer = accept.extra.feePayer;
161
- if (!railFeePayer) throw new (0, _chunkDCOUJZPLcjs.SettlementError)("Aptos exact: rail is missing extra.feePayer.");
161
+ if (!railFeePayer) throw new (0, _chunk57V5DNJTcjs.SettlementError)("Aptos exact: rail is missing extra.feePayer.");
162
162
  if (railFeePayer !== feePayerAddr) {
163
- throw new (0, _chunkDCOUJZPLcjs.SettlementError)("Aptos exact: the gate relayer address does not match the rail extra.feePayer \u2014 misconfigured rail.");
163
+ throw new (0, _chunk57V5DNJTcjs.SettlementError)("Aptos exact: the gate relayer address does not match the rail extra.feePayer \u2014 misconfigured rail.");
164
164
  }
165
- if (accept.asset === "native") throw new (0, _chunkDCOUJZPLcjs.SettlementError)("Aptos exact: native APT is not exact-payable (misconfigured rail).");
165
+ if (accept.asset === "native") throw new (0, _chunk57V5DNJTcjs.SettlementError)("Aptos exact: native APT is not exact-payable (misconfigured rail).");
166
166
  const railFeePayerAddr = parseAddr(railFeePayer);
167
167
  const railPayTo = parseAddr(accept.payTo);
168
168
  const railMetadata = parseAddr(accept.asset);
169
169
  if (!railFeePayerAddr || !railPayTo || !railMetadata) {
170
- throw new (0, _chunkDCOUJZPLcjs.SettlementError)("Aptos exact: rail feePayer/payTo/asset is not a valid Aptos address (misconfigured rail).");
170
+ throw new (0, _chunk57V5DNJTcjs.SettlementError)("Aptos exact: rail feePayer/payTo/asset is not a valid Aptos address (misconfigured rail).");
171
171
  }
172
172
  let tx;
173
173
  let senderAuth;
@@ -241,7 +241,7 @@ async function verifyAndSettleExactAptos(input) {
241
241
  try {
242
242
  feePayerAuth = client.signAsFeePayer({ transaction: tx });
243
243
  } catch (err) {
244
- throw new (0, _chunkDCOUJZPLcjs.SettlementError)(`Aptos exact settle: the gate could not sign as fee payer (${shorten(err instanceof Error ? err.message : String(err))}).`, { cause: err });
244
+ throw new (0, _chunk57V5DNJTcjs.SettlementError)(`Aptos exact settle: the gate could not sign as fee payer (${shorten(err instanceof Error ? err.message : String(err))}).`, { cause: err });
245
245
  }
246
246
  if (senderAuth instanceof _tssdk.AccountAuthenticatorEd25519) {
247
247
  try {
@@ -264,7 +264,7 @@ async function verifyAndSettleExactAptos(input) {
264
264
  if (/signature|invalid.*auth|INVALID_SIGNATURE/i.test(m)) return fail("signature_invalid", `Settle rejected \u2014 bad signature: ${shorten(m)}.`);
265
265
  if (/SEQUENCE_NUMBER_TOO_OLD|already.*(committed|ledger)|duplicate/i.test(m)) return fail("tx_already_used", `This payment was already settled: ${shorten(m)}.`);
266
266
  if (/EXPIRED|expired|TOO_NEW/i.test(m)) return fail("payment_expired", `Settle rejected \u2014 expired/stale: ${shorten(m)}.`);
267
- throw new (0, _chunkDCOUJZPLcjs.SettlementError)(
267
+ throw new (0, _chunk57V5DNJTcjs.SettlementError)(
268
268
  `Aptos exact settle: the transaction failed to submit (${shorten(m)}). The buyer's signed transaction is still valid \u2014 fund/fix the fee payer (${railFeePayer}) and the buyer can re-present it.`,
269
269
  { cause: err }
270
270
  );
@@ -273,10 +273,10 @@ async function verifyAndSettleExactAptos(input) {
273
273
  try {
274
274
  confirmed = await client.waitForConfirmation(hash);
275
275
  } catch (err) {
276
- throw new (0, _chunkDCOUJZPLcjs.SettlementError)(`Aptos exact settle: submitted ${hash} but confirmation read failed (${shorten(err instanceof Error ? err.message : String(err))}). It likely landed \u2014 re-verify before re-presenting; do NOT re-pay.`, { cause: err });
276
+ throw new (0, _chunk57V5DNJTcjs.SettlementError)(`Aptos exact settle: submitted ${hash} but confirmation read failed (${shorten(err instanceof Error ? err.message : String(err))}). It likely landed \u2014 re-verify before re-presenting; do NOT re-pay.`, { cause: err });
277
277
  }
278
278
  if (confirmed === null) {
279
- throw new (0, _chunkDCOUJZPLcjs.SettlementError)(`Aptos exact settle: submitted ${hash} but it did not confirm in time. It likely landed \u2014 re-verify before re-presenting; do NOT re-pay.`);
279
+ throw new (0, _chunk57V5DNJTcjs.SettlementError)(`Aptos exact settle: submitted ${hash} but it did not confirm in time. It likely landed \u2014 re-verify before re-presenting; do NOT re-pay.`);
280
280
  }
281
281
  if (!confirmed.success) {
282
282
  return fail("tx_reverted", `Settle tx ${hash} reverted on-chain (a post-simulate race).`);
@@ -312,15 +312,16 @@ async function verifyAptos(params) {
312
312
  if (!tx.success) {
313
313
  return { ok: false, error: "tx_reverted", detail: `Aptos tx ${hash} did not succeed.` };
314
314
  }
315
- if (typeof tx.timestampSeconds === "number") {
316
- const ageSeconds = Math.floor(Date.now() / 1e3) - tx.timestampSeconds;
317
- if (ageSeconds > accept.maxTimeoutSeconds) {
318
- return {
319
- ok: false,
320
- error: "payment_expired",
321
- detail: `Payment is ${ageSeconds}s old; max allowed is ${accept.maxTimeoutSeconds}s.`
322
- };
323
- }
315
+ if (!Number.isFinite(tx.timestampSeconds)) {
316
+ return { ok: false, error: "payment_expired", detail: `Cannot bound the age of Aptos tx ${hash} (no/invalid timestamp) \u2014 failing closed.` };
317
+ }
318
+ const ageSeconds = Math.floor(Date.now() / 1e3) - tx.timestampSeconds;
319
+ if (!Number.isFinite(ageSeconds) || ageSeconds > accept.maxTimeoutSeconds) {
320
+ return {
321
+ ok: false,
322
+ error: "payment_expired",
323
+ detail: `Payment is ${ageSeconds}s old; max allowed is ${accept.maxTimeoutSeconds}s.`
324
+ };
324
325
  }
325
326
  let wantStore;
326
327
  try {
@@ -371,13 +372,13 @@ function txNotFound(hash) {
371
372
 
372
373
  function assertAptosWallet(wallet, network) {
373
374
  if (typeof wallet !== "object" || wallet === null) {
374
- throw new (0, _chunkDCOUJZPLcjs.WrongFamilyError)(
375
+ throw new (0, _chunk57V5DNJTcjs.WrongFamilyError)(
375
376
  `chain ${network} is Aptos; wallet must be { key } (ed25519-priv-0x\u2026) or { account }.`
376
377
  );
377
378
  }
378
- _chunkDCOUJZPLcjs.assertNoLegacyWalletKey.call(void 0, wallet, "Aptos");
379
+ _chunk57V5DNJTcjs.assertNoLegacyWalletKey.call(void 0, wallet, "Aptos");
379
380
  if (!("key" in wallet) && !("account" in wallet)) {
380
- throw new (0, _chunkDCOUJZPLcjs.WrongFamilyError)(
381
+ throw new (0, _chunk57V5DNJTcjs.WrongFamilyError)(
381
382
  `chain ${network} is Aptos; wallet must be { key } (ed25519-priv-0x\u2026) or { account }.`
382
383
  );
383
384
  }
@@ -389,13 +390,13 @@ function resolveAptosAccount(config) {
389
390
  try {
390
391
  return _tssdk.Account.fromPrivateKey({ privateKey: new (0, _tssdk.Ed25519PrivateKey)(config.key) });
391
392
  } catch (cause) {
392
- throw new (0, _chunkDCOUJZPLcjs.WrongFamilyError)(
393
+ throw new (0, _chunk57V5DNJTcjs.WrongFamilyError)(
393
394
  "Aptos wallet { key } is not a valid ed25519 secret (ed25519-priv-0x\u2026 or 0x\u2026 hex).",
394
395
  { cause }
395
396
  );
396
397
  }
397
398
  }
398
- throw new (0, _chunkDCOUJZPLcjs.WrongFamilyError)("Aptos wallet needs { key } (ed25519-priv-0x\u2026) or { account }.");
399
+ throw new (0, _chunk57V5DNJTcjs.WrongFamilyError)("Aptos wallet needs { key } (ed25519-priv-0x\u2026) or { account }.");
399
400
  }
400
401
 
401
402
  // src/drivers/aptos/index.ts
@@ -467,16 +468,16 @@ function makeAptosNetwork(preset, rpcUrl) {
467
468
  const info = preset.tokens[token.toUpperCase()];
468
469
  if (!info) {
469
470
  const known = Object.keys(preset.tokens).join(", ") || "(none built in)";
470
- throw new (0, _chunkDCOUJZPLcjs.UnknownTokenError)(
471
+ throw new (0, _chunk57V5DNJTcjs.UnknownTokenError)(
471
472
  `token "${token}" isn't built in for Aptos (known: ${known}). Pass { metadata, decimals } for a custom Fungible Asset, or use 'native'.`
472
473
  );
473
474
  }
474
475
  return { asset: info.metadata, decimals: info.decimals, symbol: info.symbol };
475
476
  }
476
- _chunkDCOUJZPLcjs.rejectForeignToken.call(void 0, token, "aptos", network);
477
+ _chunk57V5DNJTcjs.rejectForeignToken.call(void 0, token, "aptos", network);
477
478
  const t = token;
478
479
  if (!t.metadata || typeof t.decimals !== "number") {
479
- throw new (0, _chunkDCOUJZPLcjs.WrongFamilyError)(
480
+ throw new (0, _chunk57V5DNJTcjs.WrongFamilyError)(
480
481
  `chain ${network} is Aptos; a custom token must be { metadata, decimals }.`
481
482
  );
482
483
  }
@@ -503,7 +504,7 @@ function makeAptosNetwork(preset, rpcUrl) {
503
504
  valid = false;
504
505
  }
505
506
  if (!valid || evmLike) {
506
- throw new (0, _chunkDCOUJZPLcjs.WrongFamilyError)(
507
+ throw new (0, _chunk57V5DNJTcjs.WrongFamilyError)(
507
508
  `chain ${network} is Aptos, but payTo "${payTo}" is not a valid Aptos address (0x + 32 bytes).`
508
509
  );
509
510
  }
@@ -525,12 +526,12 @@ function makeAptosNetwork(preset, rpcUrl) {
525
526
  const tx = await aptos.waitForTransaction({ transactionHash: ref });
526
527
  return { height: String(_nullishCoalesce(tx.version, () => ( "0"))) };
527
528
  } catch (err) {
528
- throw new (0, _chunkDCOUJZPLcjs.ConfirmationTimeoutError)(`Aptos tx ${ref} did not finalize in time.`, { cause: err });
529
+ throw new (0, _chunk57V5DNJTcjs.ConfirmationTimeoutError)(`Aptos tx ${ref} did not finalize in time.`, { cause: err });
529
530
  }
530
531
  },
531
532
  async estimateCost(accept) {
532
533
  if (accept.scheme === "exact") {
533
- return _chunkDCOUJZPLcjs.nativeCost.call(void 0, {
534
+ return _chunk57V5DNJTcjs.nativeCost.call(void 0, {
534
535
  symbol: APT_SYMBOL,
535
536
  decimals: APT_DECIMALS,
536
537
  fee: 0n,
@@ -538,7 +539,7 @@ function makeAptosNetwork(preset, rpcUrl) {
538
539
  detail: "gasless \u2014 the fee payer (facilitator/relayer) sponsors gas; the buyer pays 0 APT"
539
540
  });
540
541
  }
541
- return _chunkDCOUJZPLcjs.nativeCost.call(void 0, {
542
+ return _chunk57V5DNJTcjs.nativeCost.call(void 0, {
542
543
  symbol: APT_SYMBOL,
543
544
  decimals: APT_DECIMALS,
544
545
  fee: 100000n,
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3; var _class4; var _class5; var _class6; var _class7; var _class8; var _class9; var _class10; var _class11; var _class12; var _class13; var _class14; var _class15; var _class16; var _class17;// src/errors.ts
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3; var _class4; var _class5; var _class6; var _class7; var _class8; var _class9; var _class10; var _class11; var _class12; var _class13; var _class14; var _class15; var _class16; var _class17; var _class18;// src/errors.ts
2
2
  var PipRailError = class extends Error {
3
3
  constructor(message, options) {
4
4
  super(message, options);
@@ -71,30 +71,33 @@ var SettlementError = (_class8 = class extends PipRailError {constructor(...args
71
71
  var InvalidEnvelopeError = (_class9 = class extends PipRailError {constructor(...args6) { super(...args6); _class9.prototype.__init9.call(this); }
72
72
  __init9() {this.code = "INVALID_ENVELOPE"}
73
73
  }, _class9);
74
- var NoCompatibleAcceptError = (_class10 = class extends PipRailError {constructor(...args7) { super(...args7); _class10.prototype.__init10.call(this); }
75
- __init10() {this.code = "NO_COMPATIBLE_ACCEPT"}
74
+ var InvalidConfigError = (_class10 = class extends PipRailError {constructor(...args7) { super(...args7); _class10.prototype.__init10.call(this); }
75
+ __init10() {this.code = "INVALID_CONFIG"}
76
76
  }, _class10);
77
- var UnsupportedSchemeError = (_class11 = class extends PipRailError {constructor(...args8) { super(...args8); _class11.prototype.__init11.call(this); }
78
- __init11() {this.code = "UNSUPPORTED_SCHEME"}
77
+ var NoCompatibleAcceptError = (_class11 = class extends PipRailError {constructor(...args8) { super(...args8); _class11.prototype.__init11.call(this); }
78
+ __init11() {this.code = "NO_COMPATIBLE_ACCEPT"}
79
79
  }, _class11);
80
- var NonReplayableBodyError = (_class12 = class extends PipRailError {constructor(...args9) { super(...args9); _class12.prototype.__init12.call(this); }
81
- __init12() {this.code = "NON_REPLAYABLE_BODY"}
80
+ var UnsupportedSchemeError = (_class12 = class extends PipRailError {constructor(...args9) { super(...args9); _class12.prototype.__init12.call(this); }
81
+ __init12() {this.code = "UNSUPPORTED_SCHEME"}
82
82
  }, _class12);
83
- var WalletRequiredError = (_class13 = class extends PipRailError {constructor(...args10) { super(...args10); _class13.prototype.__init13.call(this); }
84
- __init13() {this.code = "WALLET_REQUIRED"}
83
+ var NonReplayableBodyError = (_class13 = class extends PipRailError {constructor(...args10) { super(...args10); _class13.prototype.__init13.call(this); }
84
+ __init13() {this.code = "NON_REPLAYABLE_BODY"}
85
85
  }, _class13);
86
- var WrongFamilyError = (_class14 = class extends PipRailError {constructor(...args11) { super(...args11); _class14.prototype.__init14.call(this); }
87
- __init14() {this.code = "WRONG_FAMILY"}
86
+ var WalletRequiredError = (_class14 = class extends PipRailError {constructor(...args11) { super(...args11); _class14.prototype.__init14.call(this); }
87
+ __init14() {this.code = "WALLET_REQUIRED"}
88
88
  }, _class14);
89
- var UnknownTokenError = (_class15 = class extends PipRailError {constructor(...args12) { super(...args12); _class15.prototype.__init15.call(this); }
90
- __init15() {this.code = "UNKNOWN_TOKEN"}
89
+ var WrongFamilyError = (_class15 = class extends PipRailError {constructor(...args12) { super(...args12); _class15.prototype.__init15.call(this); }
90
+ __init15() {this.code = "WRONG_FAMILY"}
91
91
  }, _class15);
92
- var MissingDriverError = (_class16 = class extends PipRailError {constructor(...args13) { super(...args13); _class16.prototype.__init16.call(this); }
93
- __init16() {this.code = "MISSING_DRIVER"}
92
+ var UnknownTokenError = (_class16 = class extends PipRailError {constructor(...args13) { super(...args13); _class16.prototype.__init16.call(this); }
93
+ __init16() {this.code = "UNKNOWN_TOKEN"}
94
94
  }, _class16);
95
- var UnsupportedNetworkError = (_class17 = class extends PipRailError {constructor(...args14) { super(...args14); _class17.prototype.__init17.call(this); }
96
- __init17() {this.code = "UNSUPPORTED_NETWORK"}
95
+ var MissingDriverError = (_class17 = class extends PipRailError {constructor(...args14) { super(...args14); _class17.prototype.__init17.call(this); }
96
+ __init17() {this.code = "MISSING_DRIVER"}
97
97
  }, _class17);
98
+ var UnsupportedNetworkError = (_class18 = class extends PipRailError {constructor(...args15) { super(...args15); _class18.prototype.__init18.call(this); }
99
+ __init18() {this.code = "UNSUPPORTED_NETWORK"}
100
+ }, _class18);
98
101
 
99
102
  // src/drivers/shared.ts
100
103
  var FAMILY_LABEL = {
@@ -143,10 +146,31 @@ function assertValidDecimals(decimals, fn) {
143
146
  );
144
147
  }
145
148
  }
149
+ function expandScientific(value) {
150
+ const m = /^(\d+)(?:\.(\d+))?[eE]([+-]?\d+)$/.exec(value);
151
+ if (!m) return value;
152
+ const [, whole = "", frac = "", expStr = "0"] = m;
153
+ const exp = Number(expStr);
154
+ if (!Number.isFinite(exp) || Math.abs(exp) > 1e3) {
155
+ throw new Error(`expandScientific: exponent out of range in "${value}".`);
156
+ }
157
+ const digits = whole + frac;
158
+ const pointPos = whole.length + exp;
159
+ if (pointPos <= 0) return `0.${"0".repeat(-pointPos)}${digits}`;
160
+ if (pointPos >= digits.length) return digits + "0".repeat(pointPos - digits.length);
161
+ return `${digits.slice(0, pointPos)}.${digits.slice(pointPos)}`;
162
+ }
146
163
  function parseUnits(value, decimals) {
147
164
  assertValidDecimals(decimals, "parseUnits");
165
+ if (typeof value !== "string") {
166
+ throw new InvalidConfigError(
167
+ `parseUnits: amount must be a decimal STRING, got ${typeof value}. Pass '0.05', not 0.05.`
168
+ );
169
+ }
148
170
  if (!/^\d+(\.\d+)?$/.test(value)) {
149
- throw new Error(`parseUnits: "${value}" is not a non-negative decimal amount.`);
171
+ throw new InvalidConfigError(
172
+ `parseUnits: "${value}" is not a plain non-negative decimal amount (scientific notation like '1e3' is rejected \u2014 write the number out, e.g. '1000').`
173
+ );
150
174
  }
151
175
  const [whole, frac = ""] = value.split(".");
152
176
  if (frac.length > decimals) {
@@ -159,6 +183,7 @@ function parseUnits(value, decimals) {
159
183
  }
160
184
  function floorUnits(value, decimals) {
161
185
  assertValidDecimals(decimals, "floorUnits");
186
+ value = expandScientific(value);
162
187
  if (!/^\d+(\.\d+)?$/.test(value)) {
163
188
  throw new Error(`floorUnits: "${value}" is not a non-negative decimal amount.`);
164
189
  }
@@ -226,4 +251,5 @@ function assertNoLegacyWalletKey(wallet, family) {
226
251
 
227
252
 
228
253
 
229
- exports.PipRailError = PipRailError; exports.InsufficientFundsError = InsufficientFundsError; exports.RecipientNotReadyError = RecipientNotReadyError; exports.toInsufficientFundsError = toInsufficientFundsError; exports.WrongChainError = WrongChainError; exports.PaymentTimeoutError = PaymentTimeoutError; exports.MaxRetriesExceededError = MaxRetriesExceededError; exports.PaymentDeclinedError = PaymentDeclinedError; exports.ConfirmationTimeoutError = ConfirmationTimeoutError; exports.SettlementError = SettlementError; exports.InvalidEnvelopeError = InvalidEnvelopeError; exports.NoCompatibleAcceptError = NoCompatibleAcceptError; exports.UnsupportedSchemeError = UnsupportedSchemeError; exports.NonReplayableBodyError = NonReplayableBodyError; exports.WalletRequiredError = WalletRequiredError; exports.WrongFamilyError = WrongFamilyError; exports.UnknownTokenError = UnknownTokenError; exports.MissingDriverError = MissingDriverError; exports.UnsupportedNetworkError = UnsupportedNetworkError; exports.assertNoLegacyWalletKey = assertNoLegacyWalletKey; exports.rejectForeignToken = rejectForeignToken; exports.MAX_DECIMALS = MAX_DECIMALS; exports.parseUnits = parseUnits; exports.floorUnits = floorUnits; exports.formatUnits = formatUnits; exports.nativeCost = nativeCost;
254
+
255
+ exports.PipRailError = PipRailError; exports.InsufficientFundsError = InsufficientFundsError; exports.RecipientNotReadyError = RecipientNotReadyError; exports.toInsufficientFundsError = toInsufficientFundsError; exports.WrongChainError = WrongChainError; exports.PaymentTimeoutError = PaymentTimeoutError; exports.MaxRetriesExceededError = MaxRetriesExceededError; exports.PaymentDeclinedError = PaymentDeclinedError; exports.ConfirmationTimeoutError = ConfirmationTimeoutError; exports.SettlementError = SettlementError; exports.InvalidEnvelopeError = InvalidEnvelopeError; exports.InvalidConfigError = InvalidConfigError; exports.NoCompatibleAcceptError = NoCompatibleAcceptError; exports.UnsupportedSchemeError = UnsupportedSchemeError; exports.NonReplayableBodyError = NonReplayableBodyError; exports.WalletRequiredError = WalletRequiredError; exports.WrongFamilyError = WrongFamilyError; exports.UnknownTokenError = UnknownTokenError; exports.MissingDriverError = MissingDriverError; exports.UnsupportedNetworkError = UnsupportedNetworkError; exports.assertNoLegacyWalletKey = assertNoLegacyWalletKey; exports.rejectForeignToken = rejectForeignToken; exports.MAX_DECIMALS = MAX_DECIMALS; exports.parseUnits = parseUnits; exports.floorUnits = floorUnits; exports.formatUnits = formatUnits; exports.nativeCost = nativeCost;
@@ -71,6 +71,9 @@ var SettlementError = class extends PipRailError {
71
71
  var InvalidEnvelopeError = class extends PipRailError {
72
72
  code = "INVALID_ENVELOPE";
73
73
  };
74
+ var InvalidConfigError = class extends PipRailError {
75
+ code = "INVALID_CONFIG";
76
+ };
74
77
  var NoCompatibleAcceptError = class extends PipRailError {
75
78
  code = "NO_COMPATIBLE_ACCEPT";
76
79
  };
@@ -143,10 +146,31 @@ function assertValidDecimals(decimals, fn) {
143
146
  );
144
147
  }
145
148
  }
149
+ function expandScientific(value) {
150
+ const m = /^(\d+)(?:\.(\d+))?[eE]([+-]?\d+)$/.exec(value);
151
+ if (!m) return value;
152
+ const [, whole = "", frac = "", expStr = "0"] = m;
153
+ const exp = Number(expStr);
154
+ if (!Number.isFinite(exp) || Math.abs(exp) > 1e3) {
155
+ throw new Error(`expandScientific: exponent out of range in "${value}".`);
156
+ }
157
+ const digits = whole + frac;
158
+ const pointPos = whole.length + exp;
159
+ if (pointPos <= 0) return `0.${"0".repeat(-pointPos)}${digits}`;
160
+ if (pointPos >= digits.length) return digits + "0".repeat(pointPos - digits.length);
161
+ return `${digits.slice(0, pointPos)}.${digits.slice(pointPos)}`;
162
+ }
146
163
  function parseUnits(value, decimals) {
147
164
  assertValidDecimals(decimals, "parseUnits");
165
+ if (typeof value !== "string") {
166
+ throw new InvalidConfigError(
167
+ `parseUnits: amount must be a decimal STRING, got ${typeof value}. Pass '0.05', not 0.05.`
168
+ );
169
+ }
148
170
  if (!/^\d+(\.\d+)?$/.test(value)) {
149
- throw new Error(`parseUnits: "${value}" is not a non-negative decimal amount.`);
171
+ throw new InvalidConfigError(
172
+ `parseUnits: "${value}" is not a plain non-negative decimal amount (scientific notation like '1e3' is rejected \u2014 write the number out, e.g. '1000').`
173
+ );
150
174
  }
151
175
  const [whole, frac = ""] = value.split(".");
152
176
  if (frac.length > decimals) {
@@ -159,6 +183,7 @@ function parseUnits(value, decimals) {
159
183
  }
160
184
  function floorUnits(value, decimals) {
161
185
  assertValidDecimals(decimals, "floorUnits");
186
+ value = expandScientific(value);
162
187
  if (!/^\d+(\.\d+)?$/.test(value)) {
163
188
  throw new Error(`floorUnits: "${value}" is not a non-negative decimal amount.`);
164
189
  }
@@ -211,6 +236,7 @@ export {
211
236
  ConfirmationTimeoutError,
212
237
  SettlementError,
213
238
  InvalidEnvelopeError,
239
+ InvalidConfigError,
214
240
  NoCompatibleAcceptError,
215
241
  UnsupportedSchemeError,
216
242
  NonReplayableBodyError,