@tokenops/sdk 2.0.0-alpha.2 → 2.0.0-alpha.4

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 (160) hide show
  1. package/CHANGELOG.md +92 -3
  2. package/README.md +76 -34
  3. package/SUPPORT.md +1 -1
  4. package/dist/{chunk-PYYSB5ZN.js → chunk-2ND7US2I.js} +1 -1
  5. package/dist/{chunk-EYDA6Q6C.js → chunk-3ZSPRHR3.js} +63 -12
  6. package/dist/{chunk-X7WBPCEU.js → chunk-67Q6KSVV.js} +4578 -3383
  7. package/dist/{chunk-UHHMVBLU.cjs → chunk-6AYJRUGP.cjs} +7 -50
  8. package/dist/{chunk-FEDX7B6T.cjs → chunk-6FUHF73F.cjs} +5 -5
  9. package/dist/{chunk-NWFMBLSQ.js → chunk-7KY4K4PH.js} +1 -1
  10. package/dist/{chunk-FHWSBGWE.cjs → chunk-ARZ5C3FS.cjs} +7 -7
  11. package/dist/{chunk-SPLNGUFF.js → chunk-AX6MQAWU.js} +2 -2
  12. package/dist/{chunk-IGO5XSPS.js → chunk-BSXEX2SH.js} +3 -3
  13. package/dist/{chunk-44YJPMQC.js → chunk-CHGY6B7L.js} +34 -81
  14. package/dist/{chunk-IUKKNJ2R.cjs → chunk-DFK5GCJP.cjs} +55 -72
  15. package/dist/{chunk-PZZK3O3S.cjs → chunk-E4IV4M4E.cjs} +4598 -3403
  16. package/dist/{chunk-A4DCEE33.js → chunk-GHGF65LN.js} +16 -12
  17. package/dist/{chunk-TWT3STIX.js → chunk-K3R27WX4.js} +8 -46
  18. package/dist/{chunk-GADGBQJO.js → chunk-KJUNBOJQ.js} +52 -71
  19. package/dist/{chunk-MM5BV5CS.cjs → chunk-PO3A2AQX.cjs} +4 -4
  20. package/dist/{chunk-EBLBPUPI.cjs → chunk-QHDMPT7I.cjs} +72 -19
  21. package/dist/{chunk-3YHBO2DL.cjs → chunk-S47IBDTA.cjs} +36 -83
  22. package/dist/{chunk-UG5RKLU2.cjs → chunk-SUYBAF27.cjs} +1 -1
  23. package/dist/{chunk-WJMEBBU7.js → chunk-TWU7L5H7.js} +5 -48
  24. package/dist/{chunk-WJLECC22.cjs → chunk-UUSSWOPR.cjs} +9 -47
  25. package/dist/{chunk-AREQJHKA.cjs → chunk-VHKMWWBA.cjs} +428 -22
  26. package/dist/{chunk-FT5H2Q7Y.cjs → chunk-YAL6JSAZ.cjs} +16 -12
  27. package/dist/{chunk-VW356KR3.js → chunk-YMWMIWBP.js} +421 -25
  28. package/dist/core/addresses.d.ts +4 -4
  29. package/dist/core/errors.d.ts +1 -1
  30. package/dist/core/index.d.ts +1 -0
  31. package/dist/core/pending.d.ts +57 -0
  32. package/dist/core/version.d.ts +1 -1
  33. package/dist/fhe/operators.d.ts +6 -5
  34. package/dist/fhe/types.d.ts +1 -1
  35. package/dist/fhe-airdrop/abis/airdrop-base.d.ts +97 -1
  36. package/dist/fhe-airdrop/abis/ecdsa.d.ts +117 -1
  37. package/dist/fhe-airdrop/abis/factory.d.ts +332 -1
  38. package/dist/fhe-airdrop/abis/merkle.d.ts +116 -1
  39. package/dist/fhe-airdrop/advanced/index.cjs +8 -4
  40. package/dist/fhe-airdrop/advanced/index.d.cts +1 -0
  41. package/dist/fhe-airdrop/advanced/index.d.ts +1 -0
  42. package/dist/fhe-airdrop/advanced/index.js +1 -1
  43. package/dist/fhe-airdrop/advanced/react/index.cjs +145 -137
  44. package/dist/fhe-airdrop/advanced/react/index.d.cts +1 -0
  45. package/dist/fhe-airdrop/advanced/react/index.d.ts +1 -0
  46. package/dist/fhe-airdrop/advanced/react/index.js +85 -78
  47. package/dist/fhe-airdrop/advanced/react/useClearCompliancePolicy.d.ts +3 -1
  48. package/dist/fhe-airdrop/advanced/react/useDisableCustomFee.d.ts +4 -1
  49. package/dist/fhe-airdrop/advanced/react/useFactoryComplianceDelegate.d.ts +2 -4
  50. package/dist/fhe-airdrop/advanced/react/useFactoryRenounceRole.d.ts +4 -3
  51. package/dist/fhe-airdrop/advanced/react/useFactoryRevokeRole.d.ts +9 -7
  52. package/dist/fhe-airdrop/advanced/react/useFactoryRoleMembers.d.ts +6 -5
  53. package/dist/fhe-airdrop/advanced/react/useSetComplianceDelegate.d.ts +7 -7
  54. package/dist/fhe-airdrop/advanced/react/useSetComplianceManagerImpl.d.ts +3 -1
  55. package/dist/fhe-airdrop/advanced/react/useSetCompliancePolicy.d.ts +2 -1
  56. package/dist/fhe-airdrop/advanced/react/useSetCustomFee.d.ts +4 -1
  57. package/dist/fhe-airdrop/advanced/react/useSetDefaultDelegateToCompliance.d.ts +5 -4
  58. package/dist/fhe-airdrop/advanced/react/useSetDefaultGasFee.d.ts +7 -3
  59. package/dist/fhe-airdrop/advanced/react/useSetMaxGasFee.d.ts +37 -0
  60. package/dist/fhe-airdrop/airdrop-base.d.ts +142 -18
  61. package/dist/fhe-airdrop/campaign.d.ts +37 -73
  62. package/dist/fhe-airdrop/compliance-clone.d.ts +21 -0
  63. package/dist/fhe-airdrop/constants.d.ts +11 -1
  64. package/dist/fhe-airdrop/ecdsa.d.ts +79 -26
  65. package/dist/fhe-airdrop/encryption.d.ts +19 -6
  66. package/dist/fhe-airdrop/errors.d.ts +136 -2
  67. package/dist/fhe-airdrop/factory-params.d.ts +2361 -0
  68. package/dist/fhe-airdrop/factory.d.ts +189 -75
  69. package/dist/fhe-airdrop/guards.d.ts +183 -19
  70. package/dist/fhe-airdrop/index.cjs +88 -56
  71. package/dist/fhe-airdrop/index.d.cts +12 -10
  72. package/dist/fhe-airdrop/index.d.ts +12 -10
  73. package/dist/fhe-airdrop/index.js +5 -5
  74. package/dist/fhe-airdrop/merkle-tree.d.ts +9 -9
  75. package/dist/fhe-airdrop/merkle.d.ts +32 -11
  76. package/dist/fhe-airdrop/react/_shared.d.ts +12 -6
  77. package/dist/fhe-airdrop/react/index.cjs +336 -240
  78. package/dist/fhe-airdrop/react/index.d.cts +19 -9
  79. package/dist/fhe-airdrop/react/index.d.ts +19 -9
  80. package/dist/fhe-airdrop/react/index.js +158 -97
  81. package/dist/fhe-airdrop/react/keys.d.ts +54 -7
  82. package/dist/fhe-airdrop/react/useAccessEcdsaClaimAmount.d.ts +6 -3
  83. package/dist/fhe-airdrop/react/useAccessMerkleClaimAmount.d.ts +2 -2
  84. package/dist/fhe-airdrop/react/useAirdropConfig.d.ts +8 -3
  85. package/dist/fhe-airdrop/react/useAirdropPause.d.ts +5 -0
  86. package/dist/fhe-airdrop/react/useBuildMerkleCampaign.d.ts +4 -6
  87. package/dist/fhe-airdrop/react/useComplianceManager.d.ts +2 -2
  88. package/dist/fhe-airdrop/react/useComplianceManagerOf.d.ts +1 -2
  89. package/dist/fhe-airdrop/react/useCreateAndFundEcdsaAirdrop.d.ts +16 -11
  90. package/dist/fhe-airdrop/react/useCreateAndFundMerkleAirdrop.d.ts +23 -7
  91. package/dist/fhe-airdrop/react/useCreateEcdsaAirdrop.d.ts +13 -8
  92. package/dist/fhe-airdrop/react/useCreateMerkleAirdrop.d.ts +27 -7
  93. package/dist/fhe-airdrop/react/useDedupMode.d.ts +16 -0
  94. package/dist/fhe-airdrop/react/useDiscloseHandleToParty.d.ts +4 -3
  95. package/dist/fhe-airdrop/react/useEcdsaClaim.d.ts +6 -4
  96. package/dist/fhe-airdrop/react/useEcdsaClaimAndUnwrap.d.ts +15 -8
  97. package/dist/fhe-airdrop/react/useEcdsaDomain.d.ts +1 -1
  98. package/dist/fhe-airdrop/react/useEncryptCampaignAmounts.d.ts +5 -7
  99. package/dist/fhe-airdrop/react/useExtendClaimWindow.d.ts +4 -1
  100. package/dist/fhe-airdrop/react/useFactoryFees.d.ts +11 -4
  101. package/dist/fhe-airdrop/react/useFundAirdrop.d.ts +3 -4
  102. package/dist/fhe-airdrop/react/useGrantInstanceRoles.d.ts +2 -1
  103. package/dist/fhe-airdrop/react/useIsAirdrop.d.ts +44 -0
  104. package/dist/fhe-airdrop/react/useIsSignatureValid.d.ts +5 -4
  105. package/dist/fhe-airdrop/react/useMerkleClaim.d.ts +4 -1
  106. package/dist/fhe-airdrop/react/useMerkleClaimAndUnwrap.d.ts +14 -3
  107. package/dist/fhe-airdrop/react/usePlanMerkleCampaign.d.ts +18 -3
  108. package/dist/fhe-airdrop/react/usePreflightClaim.d.ts +1 -1
  109. package/dist/fhe-airdrop/react/usePreflightCreateAirdrop.d.ts +34 -13
  110. package/dist/fhe-airdrop/react/useRefreshComplianceBalance.d.ts +36 -0
  111. package/dist/fhe-airdrop/react/useRescueERC20.d.ts +3 -3
  112. package/dist/fhe-airdrop/react/useRescueNativeToken.d.ts +23 -0
  113. package/dist/fhe-airdrop/react/useResolveGasFee.d.ts +30 -0
  114. package/dist/fhe-airdrop/react/useRotateMerkleRoot.d.ts +5 -2
  115. package/dist/fhe-airdrop/react/useSignClaimAuthorization.d.ts +4 -0
  116. package/dist/fhe-airdrop/react/useTokenOf.d.ts +29 -0
  117. package/dist/fhe-airdrop/react/useUnwrapRequest.d.ts +25 -0
  118. package/dist/fhe-airdrop/react/useWithdrawConfidential.d.ts +4 -0
  119. package/dist/fhe-airdrop/roles.d.ts +82 -7
  120. package/dist/fhe-airdrop/types.d.ts +122 -14
  121. package/dist/fhe-disperse/errors.d.ts +3 -3
  122. package/dist/fhe-disperse/index.cjs +22 -22
  123. package/dist/fhe-disperse/index.d.cts +2 -1
  124. package/dist/fhe-disperse/index.d.ts +2 -1
  125. package/dist/fhe-disperse/index.js +3 -3
  126. package/dist/fhe-disperse/react/index.cjs +27 -25
  127. package/dist/fhe-disperse/react/index.d.cts +2 -1
  128. package/dist/fhe-disperse/react/index.d.ts +2 -1
  129. package/dist/fhe-disperse/react/index.js +8 -6
  130. package/dist/fhe-disperse/react/useDisperse.d.ts +6 -2
  131. package/dist/fhe-disperse/react/useRegister.d.ts +9 -3
  132. package/dist/fhe-disperse/react/useSingletonWithdrawTokenFee.d.ts +7 -2
  133. package/dist/fhe-disperse/react/useWithdrawTokenFee.d.ts +7 -2
  134. package/dist/fhe-disperse/singleton.d.ts +33 -19
  135. package/dist/fhe-disperse/types.d.ts +48 -8
  136. package/dist/fhe-vesting/advanced/index.cjs +6 -6
  137. package/dist/fhe-vesting/advanced/index.js +4 -4
  138. package/dist/fhe-vesting/advanced/react/index.cjs +9 -9
  139. package/dist/fhe-vesting/advanced/react/index.js +6 -6
  140. package/dist/fhe-vesting/factory.d.ts +31 -8
  141. package/dist/fhe-vesting/index.cjs +23 -23
  142. package/dist/fhe-vesting/index.d.cts +3 -2
  143. package/dist/fhe-vesting/index.d.ts +3 -2
  144. package/dist/fhe-vesting/index.js +4 -4
  145. package/dist/fhe-vesting/manager.d.ts +27 -2
  146. package/dist/fhe-vesting/react/index.cjs +126 -126
  147. package/dist/fhe-vesting/react/index.d.cts +3 -2
  148. package/dist/fhe-vesting/react/index.d.ts +3 -2
  149. package/dist/fhe-vesting/react/index.js +5 -5
  150. package/dist/fhe-vesting/react/useCreateManager.d.ts +16 -9
  151. package/dist/fhe-vesting/react/useCreateManagerAndGetAddress.d.ts +9 -5
  152. package/dist/fhe-vesting/react/useSplitVesting.d.ts +9 -3
  153. package/dist/index.cjs +18 -18
  154. package/dist/index.js +1 -1
  155. package/dist/testnet-faucet/faucet.d.ts +3 -0
  156. package/dist/testnet-faucet/index.cjs +15 -15
  157. package/dist/testnet-faucet/index.js +3 -3
  158. package/dist/testnet-faucet/react/index.cjs +9 -9
  159. package/dist/testnet-faucet/react/index.js +4 -4
  160. package/package.json +1 -1
@@ -1,11 +1,15 @@
1
1
  import { isContractRevert } from './chunk-4RAAATVY.js';
2
- import { TokenOpsSdkError, InvalidArgumentError, FeatureDisabledError, UnsupportedChainError, FheHandleNotAllowedError, TransferFailedError, InsufficientBalanceError, InsufficientFeeError, PausedError, InvalidSignatureError, isTokenOpsSdkError } from './chunk-QBJ7O2B4.js';
3
- import { isAddressEqual, zeroAddress, isAddress, BaseError, ContractFunctionZeroDataError } from 'viem';
2
+ import { TokenOpsSdkError, InvalidArgumentError, FeatureDisabledError, UnsupportedChainError, FheHandleNotAllowedError, TransferFailedError, InsufficientBalanceError, InsufficientFeeError, isTokenOpsSdkError, PausedError, InvalidSignatureError } from './chunk-QBJ7O2B4.js';
3
+ import { isAddressEqual, zeroAddress, isAddress, keccak256, encodeAbiParameters, getAddress, getCreate2Address, BaseError, ContractFunctionZeroDataError } from 'viem';
4
4
 
5
5
  // src/fhe-airdrop/constants.ts
6
- var AIRDROP_CONTRACTS_COMMIT = "7175ac82f467f0f88c05aba1a4536892999b4251";
6
+ var AIRDROP_CONTRACTS_COMMIT = "005980df194e0dc66053bd517e9759bd4d580047";
7
7
  var DEPLOYMENT_MODE = { clone: 0, uups: 1 };
8
8
  var DEDUP_MODE = { perAddress: 0, perDedupId: 1, both: 2, none: 3 };
9
+ var DEDUP_MODE_BY_ORDINAL = new Map(
10
+ Object.keys(DEDUP_MODE).map((mode) => [DEDUP_MODE[mode], mode])
11
+ );
12
+ var UINT96_MAX = (1n << 96n) - 1n;
9
13
 
10
14
  // src/fhe-airdrop/errors.ts
11
15
  var MerkleUupsUnsupportedError = class extends TokenOpsSdkError {
@@ -94,6 +98,43 @@ var PredictionDriftError = class extends TokenOpsSdkError {
94
98
  );
95
99
  }
96
100
  };
101
+ var CreateCommitmentMismatchError = class extends TokenOpsSdkError {
102
+ name = "CreateCommitmentMismatchError";
103
+ constructor(args) {
104
+ const rebuild = args.field === "airdrop" ? " Anything bound to the old prediction (Merkle leaves, vouchers, encrypted inputs) must be rebuilt." : "";
105
+ const { cause, ...context } = args;
106
+ super(
107
+ `${args.method}: the factory would deploy with ${args.field} = ${args.actual ?? "?"}, but the create committed to ${args.expected ?? "?"}. Nothing was deployed and the salt is unused; re-quote and retry.${rebuild}`,
108
+ { code: "TOKENOPS_CREATE_COMMITMENT_MISMATCH", cause, context }
109
+ );
110
+ }
111
+ };
112
+ var ClawbackRequiresPauseError = class extends TokenOpsSdkError {
113
+ name = "ClawbackRequiresPauseError";
114
+ constructor(args) {
115
+ super(
116
+ `${args.method}: withdrawConfidential is refused while the campaign is unpaused inside its claim window. Pause first (PAUSER_ROLE), or run it outside the window (before startTime or after endTime).`,
117
+ {
118
+ code: "TOKENOPS_CLAWBACK_REQUIRES_PAUSE",
119
+ cause: args.cause,
120
+ context: { method: args.method, contractAddress: args.contractAddress }
121
+ }
122
+ );
123
+ }
124
+ };
125
+ var NativeRescueRequiresZeroFeeError = class extends TokenOpsSdkError {
126
+ name = "NativeRescueRequiresZeroFeeError";
127
+ constructor(args) {
128
+ super(
129
+ `${args.method}: rescueNativeToken is only available on a zero-fee campaign; this instance charges a gas fee, so its ETH is fee revenue - use withdrawGasFee.`,
130
+ {
131
+ code: "TOKENOPS_NATIVE_RESCUE_REQUIRES_ZERO_FEE",
132
+ cause: args.cause,
133
+ context: { method: args.method, contractAddress: args.contractAddress }
134
+ }
135
+ );
136
+ }
137
+ };
97
138
  var UpgradeabilityNotAllowedError = class extends TokenOpsSdkError {
98
139
  name = "UpgradeabilityNotAllowedError";
99
140
  constructor(args) {
@@ -203,6 +244,42 @@ var ClaimWindowClosedError = class extends TokenOpsSdkError {
203
244
  });
204
245
  }
205
246
  };
247
+ var GasFeeNotAcceptedError = class extends TokenOpsSdkError {
248
+ name = "GasFeeNotAcceptedError";
249
+ constructor(args) {
250
+ const detail = args.resolvedFee !== void 0 && args.maxAcceptedGasFee !== void 0 ? ` The factory resolved ${args.resolvedFee} wei; \`maxAcceptedGasFee\` is ${args.maxAcceptedGasFee} wei.` : "";
251
+ super(
252
+ `${args.method}: the resolved per-claim gas fee exceeds \`common.maxAcceptedGasFee\`.${detail} The fee is frozen into the instance at create and cannot be changed after. Every claimant pays it on every claim, so raise the bound only if that is a fee you accept charging them.`,
253
+ {
254
+ code: "TOKENOPS_GAS_FEE_NOT_ACCEPTED",
255
+ cause: args.cause,
256
+ context: {
257
+ method: args.method,
258
+ contractAddress: args.contractAddress,
259
+ resolvedFee: args.resolvedFee,
260
+ maxAcceptedGasFee: args.maxAcceptedGasFee
261
+ }
262
+ }
263
+ );
264
+ }
265
+ };
266
+ var UnrecognisedAirdropError = class extends TokenOpsSdkError {
267
+ name = "UnrecognisedAirdropError";
268
+ constructor(args) {
269
+ super(
270
+ `${args.method}: ${args.contractAddress} was not created by the factory at ${args.factory}, so it is not a TokenOps airdrop. Treat its ABI, its events and its pool as unverified.`,
271
+ {
272
+ code: "TOKENOPS_UNRECOGNISED_AIRDROP",
273
+ cause: args.cause,
274
+ context: {
275
+ method: args.method,
276
+ contractAddress: args.contractAddress,
277
+ factory: args.factory
278
+ }
279
+ }
280
+ );
281
+ }
282
+ };
206
283
  var airdropProductMapper = (name, errArgs, ctx) => {
207
284
  switch (name) {
208
285
  // ---- guarded conditions, caught on-chain instead of pre-flight -------
@@ -250,12 +327,16 @@ var airdropProductMapper = (name, errArgs, ctx) => {
250
327
  return new FheHandleNotAllowedError({ ...ctx, handle });
251
328
  }
252
329
  // ---- Merkle-specific ----------------------------------------------
253
- case "InvalidMerkleProof":
330
+ case "InvalidMerkleProof": {
331
+ const leaf = errArgs?.[0];
332
+ const merkleRoot = errArgs?.[1];
254
333
  return new InvalidArgumentError({
255
334
  method: ctx.method,
256
335
  argument: "merkleProof",
257
- reason: "the contract reverted with `InvalidMerkleProof` \u2014 the proof does not verify against the current on-chain root. If the root was recently rotated, rebuild the proof against the new root."
336
+ reason: "the contract reverted with `InvalidMerkleProof` \u2014 the proof does not verify against the current on-chain root. If the root was recently rotated, rebuild the proof against the new root.",
337
+ ...leaf !== void 0 || merkleRoot !== void 0 ? { value: { leaf, merkleRoot } } : {}
258
338
  });
339
+ }
259
340
  case "RootImmutable":
260
341
  return new FeatureDisabledError({ ...ctx, feature: "merkleRootRotation" });
261
342
  case "ZeroAccount":
@@ -287,6 +368,25 @@ var airdropProductMapper = (name, errArgs, ctx) => {
287
368
  }
288
369
  // ---- argument-validation bucket: reverts not already covered by the
289
370
  // cross-product default mapper's `Zero*`/`Invalid*` list ---------------
371
+ case "GasFeeNotAccepted": {
372
+ const resolvedFee = errArgs?.[0];
373
+ const maxAcceptedGasFee = errArgs?.[1];
374
+ return new GasFeeNotAcceptedError({ ...ctx, resolvedFee, maxAcceptedGasFee });
375
+ }
376
+ case "GasFeeExceedsMaximum": {
377
+ return gasFeeExceedsMaximumError({
378
+ method: ctx.method,
379
+ gasFee: errArgs?.[0],
380
+ maxGasFee: errArgs?.[1]
381
+ });
382
+ }
383
+ case "ZeroUnwrapRequestId":
384
+ return invalidArg(
385
+ ctx,
386
+ "token",
387
+ name,
388
+ "the wrapper returned the zero request id, which names no handle to read the delivered amount from; the campaign token is not a conforming ERC7984ERC20Wrapper"
389
+ );
290
390
  case "ZeroToken":
291
391
  return invalidArg(ctx, "token", name);
292
392
  case "ZeroFeeCollector":
@@ -319,7 +419,7 @@ var airdropProductMapper = (name, errArgs, ctx) => {
319
419
  ctx,
320
420
  "admin",
321
421
  name,
322
- "revoking or renouncing the sole DEFAULT_ADMIN_ROLE member would leave the instance permanently ungovernable"
422
+ "revoking or renouncing the sole DEFAULT_ADMIN_ROLE member would leave the contract permanently ungovernable. Declared once and enforced by BOTH the instances and the factory, each on its own admin set (audit-14) - grant a second admin first, then renounce"
323
423
  );
324
424
  case "LastFeeCollector":
325
425
  return invalidArg(
@@ -343,7 +443,7 @@ var airdropProductMapper = (name, errArgs, ctx) => {
343
443
  ctx,
344
444
  "complianceDelegate",
345
445
  name,
346
- "required while the default compliance-delegate policy is on"
446
+ "the factory requires a non-zero delegate (constructor, setter and create)"
347
447
  );
348
448
  case "IndexOutOfBounds": {
349
449
  const index = errArgs?.[0];
@@ -366,6 +466,48 @@ var airdropProductMapper = (name, errArgs, ctx) => {
366
466
  value: existingAirdrop
367
467
  });
368
468
  }
469
+ case "PredictionMismatch":
470
+ case "ManagerImplementationMismatch":
471
+ case "ComplianceDelegateMismatch": {
472
+ const field = name === "PredictionMismatch" ? "airdrop" : name === "ManagerImplementationMismatch" ? "complianceManagerImpl" : "complianceDelegate";
473
+ return new CreateCommitmentMismatchError({
474
+ method: ctx.method,
475
+ contractAddress: ctx.contractAddress,
476
+ field,
477
+ expected: errArgs?.[0],
478
+ actual: errArgs?.[1]
479
+ });
480
+ }
481
+ case "InvalidImplementation":
482
+ return invalidArg(ctx, "implementation", name, void 0, errArgs?.[0]);
483
+ case "EndTimeInPast": {
484
+ const endTime = numberArg(errArgs?.[0]);
485
+ const currentTime = numberArg(errArgs?.[1]);
486
+ return invalidArg(
487
+ ctx,
488
+ "endTime",
489
+ name,
490
+ endTime !== void 0 && currentTime !== void 0 ? `endTime ${endTime} is not after the chain time ${currentTime}` : void 0,
491
+ endTime !== void 0 || currentTime !== void 0 ? { endTime, currentTime } : void 0
492
+ );
493
+ }
494
+ case "InvalidDuration": {
495
+ const fromTime = numberArg(errArgs?.[0]);
496
+ const toTime = numberArg(errArgs?.[1]);
497
+ return invalidArg(
498
+ ctx,
499
+ "duration",
500
+ name,
501
+ fromTime !== void 0 && toTime !== void 0 ? `${toTime} does not come after ${fromTime}` : void 0,
502
+ fromTime !== void 0 || toTime !== void 0 ? { fromTime, toTime } : void 0
503
+ );
504
+ }
505
+ case "UninitializedHandle":
506
+ return invalidArg(ctx, "handle", name);
507
+ case "ClawbackRequiresPause":
508
+ return new ClawbackRequiresPauseError(ctx);
509
+ case "NativeRescueRequiresZeroFee":
510
+ return new NativeRescueRequiresZeroFeeError(ctx);
369
511
  case "ZeroSigner":
370
512
  return invalidArg(ctx, "signer", name);
371
513
  case "ZeroMerkleRoot":
@@ -373,7 +515,7 @@ var airdropProductMapper = (name, errArgs, ctx) => {
373
515
  ctx,
374
516
  "merkleRoot",
375
517
  name,
376
- "a zero root is only permitted when `isMerkleRootMutable` is true"
518
+ "a zero root is permitted only at create on a mutable-root campaign, and never as a rotation target"
377
519
  );
378
520
  // ---- compliance manager clone (`ComplianceRoleManager`) --------------
379
521
  case "ZeroAirdrop":
@@ -413,15 +555,26 @@ var airdropProductMapper = (name, errArgs, ctx) => {
413
555
  return void 0;
414
556
  }
415
557
  };
416
- function invalidArg(ctx, argument, revertName, detail) {
558
+ function gasFeeExceedsMaximumError(args) {
559
+ const { gasFee, maxGasFee } = args;
560
+ return new InvalidArgumentError({
561
+ method: args.method,
562
+ argument: "gasFee",
563
+ reason: `exceeds the factory's own maximum${gasFee !== void 0 && maxGasFee !== void 0 ? ` (${gasFee} wei > ${maxGasFee} wei)` : ""}; \`setMaxGasFee\` is DEFAULT_ADMIN_ROLE-gated and bounds what FEE_MANAGER_ROLE may configure`,
564
+ value: gasFee
565
+ });
566
+ }
567
+ function invalidArg(ctx, argument, revertName, detail, value) {
417
568
  const suffix = detail ? ` ${detail}.` : "";
418
569
  return new InvalidArgumentError({
419
570
  method: ctx.method,
420
571
  argument,
421
- reason: `the contract reverted with \`${revertName}\`.${suffix}`
572
+ reason: `the contract reverted with \`${revertName}\`.${suffix}`,
573
+ ...value !== void 0 ? { value } : {}
422
574
  });
423
575
  }
424
576
  function numberArg(value) {
577
+ if (typeof value === "number") return value;
425
578
  return typeof value === "bigint" ? Number(value) : void 0;
426
579
  }
427
580
  var SUPPORTED_CHAIN_IDS = [1, 11155111, 31337];
@@ -478,6 +631,39 @@ async function assertSaltAvailable(args) {
478
631
  predictedAddress: args.predictedAddress
479
632
  });
480
633
  }
634
+ function assertMaxAcceptedGasFeeRange(value, method) {
635
+ if (value < 0n || value > UINT96_MAX) {
636
+ throw new InvalidArgumentError({
637
+ method,
638
+ argument: "common.maxAcceptedGasFee",
639
+ reason: `is outside uint96 (0 to ${UINT96_MAX}); the params tuple cannot be ABI-encoded at all`,
640
+ value
641
+ });
642
+ }
643
+ }
644
+ function assertWithinCeiling(method, resolvedFee, maxGasFee) {
645
+ if (resolvedFee > maxGasFee) {
646
+ throw gasFeeExceedsMaximumError({ method, gasFee: resolvedFee, maxGasFee });
647
+ }
648
+ }
649
+ function assertResolvedFeeAccepted(args, resolvedFee) {
650
+ if (resolvedFee <= args.maxAcceptedGasFee) return;
651
+ throw new GasFeeNotAcceptedError({
652
+ method: args.method,
653
+ contractAddress: args.factory.address,
654
+ resolvedFee,
655
+ maxAcceptedGasFee: args.maxAcceptedGasFee
656
+ });
657
+ }
658
+ async function assertCreateGasFee(args) {
659
+ assertMaxAcceptedGasFeeRange(args.maxAcceptedGasFee, args.method);
660
+ const [resolvedFee, maxGasFee] = await Promise.all([
661
+ args.factory.resolveGasFee(args.creator),
662
+ args.factory.maxGasFee()
663
+ ]);
664
+ assertWithinCeiling(args.method, resolvedFee, maxGasFee);
665
+ assertResolvedFeeAccepted(args, resolvedFee);
666
+ }
481
667
  function assertPredictionFresh(args) {
482
668
  if (args.initCodeHashBefore.toLowerCase() === args.initCodeHashAfter.toLowerCase()) return;
483
669
  throw new PredictionDriftError({
@@ -488,6 +674,112 @@ function assertPredictionFresh(args) {
488
674
  predictedAddress: args.predictedAddress
489
675
  });
490
676
  }
677
+ var END_TIME_MARGIN_SECONDS = 60;
678
+ function invalidCreateParam(method, argument, revertName, reason, value) {
679
+ return new InvalidArgumentError({
680
+ method,
681
+ argument,
682
+ reason: `${reason}; the instance initializer reverts \`${revertName}\``,
683
+ value
684
+ });
685
+ }
686
+ function assertCreateParamsWellFormed(args, method) {
687
+ const { common } = args.params;
688
+ if (isAddressEqual(common.token, zeroAddress)) {
689
+ throw invalidCreateParam(
690
+ method,
691
+ "common.token",
692
+ "ZeroToken",
693
+ "is the zero address",
694
+ common.token
695
+ );
696
+ }
697
+ const now = Math.floor(Date.now() / 1e3);
698
+ if (common.endTime <= now + END_TIME_MARGIN_SECONDS) {
699
+ throw invalidCreateParam(
700
+ method,
701
+ "common.endTime",
702
+ "EndTimeInPast",
703
+ `is not at least ${END_TIME_MARGIN_SECONDS}s in the future`,
704
+ common.endTime
705
+ );
706
+ }
707
+ if (common.startTime > common.endTime) {
708
+ throw invalidCreateParam(
709
+ method,
710
+ "common.startTime",
711
+ "InvalidStartTime",
712
+ "is after `endTime`",
713
+ common.startTime
714
+ );
715
+ }
716
+ if (common.startTime === common.endTime) {
717
+ throw invalidCreateParam(
718
+ method,
719
+ "common.startTime",
720
+ "InvalidDuration",
721
+ "equals `endTime`, leaving a zero-length claim window",
722
+ common.startTime
723
+ );
724
+ }
725
+ if (args.variant === "merkle") {
726
+ const { merkleRoot, isMerkleRootMutable } = args.params;
727
+ if (!isMerkleRootMutable && BigInt(merkleRoot) === 0n) {
728
+ throw invalidCreateParam(
729
+ method,
730
+ "merkleRoot",
731
+ "ZeroMerkleRoot",
732
+ "is zero on an immutable-root campaign, so no claim could ever verify",
733
+ merkleRoot
734
+ );
735
+ }
736
+ } else if (isAddressEqual(args.params.signer, zeroAddress)) {
737
+ throw invalidCreateParam(
738
+ method,
739
+ "signer",
740
+ "ZeroSigner",
741
+ "is the zero address",
742
+ args.params.signer
743
+ );
744
+ }
745
+ }
746
+ function resolvePlannedCreate(args) {
747
+ const { method, params, expected, expectedInitCodeHash, plan } = args;
748
+ if (!plan) return { expected, expectedInitCodeHash };
749
+ if (params.merkleRoot.toLowerCase() !== plan.root.toLowerCase()) {
750
+ throw new InvalidArgumentError({
751
+ method,
752
+ argument: "params.merkleRoot",
753
+ reason: "differs from plan.root; the plan's entries verify only against the root they were built into",
754
+ value: params.merkleRoot
755
+ });
756
+ }
757
+ if (expected?.airdrop !== void 0 && !isAddressEqual(expected.airdrop, plan.predictedAddress)) {
758
+ throw new InvalidArgumentError({
759
+ method,
760
+ argument: "expected.airdrop",
761
+ reason: "differs from plan.predictedAddress; a plan's leaves are bound to its predicted address, so the two cannot name different instances",
762
+ value: expected.airdrop
763
+ });
764
+ }
765
+ if (expectedInitCodeHash !== void 0 && expectedInitCodeHash.toLowerCase() !== plan.initCodeHashAfter.toLowerCase()) {
766
+ throw new InvalidArgumentError({
767
+ method,
768
+ argument: "expectedInitCodeHash",
769
+ reason: "differs from plan.initCodeHashAfter; pass one or the other",
770
+ value: expectedInitCodeHash
771
+ });
772
+ }
773
+ return {
774
+ expected: { ...definedFields(expected), airdrop: plan.predictedAddress },
775
+ expectedInitCodeHash: plan.initCodeHashAfter
776
+ };
777
+ }
778
+ var COMMITMENT_FIELDS = ["airdrop", "complianceManagerImpl", "complianceDelegate"];
779
+ function definedFields(pinned) {
780
+ if (!pinned) return {};
781
+ return Object.fromEntries(Object.entries(pinned).filter(([, value]) => value !== void 0));
782
+ }
491
783
  async function preflightCreate(args) {
492
784
  const method = args.variant === "merkle" ? "createMerkleAirdrop" : "createEcdsaAirdrop";
493
785
  const blockers = [];
@@ -495,6 +787,39 @@ async function preflightCreate(args) {
495
787
  if (args.variant === "merkle") {
496
788
  collect(blockers, () => assertMerkleModeSupported(args.mode));
497
789
  }
790
+ const encodable = collect(
791
+ blockers,
792
+ () => assertMaxAcceptedGasFeeRange(args.params.common.maxAcceptedGasFee, method)
793
+ );
794
+ if (!encodable) return { ready: false, blockers };
795
+ collect(blockers, () => assertCreateParamsWellFormed(args, method));
796
+ let pins = { expected: args.expected, expectedInitCodeHash: args.expectedInitCodeHash };
797
+ if (args.variant === "merkle") {
798
+ const { params, plan } = args;
799
+ collect(blockers, () => {
800
+ pins = resolvePlannedCreate({ method, params, ...pins, plan });
801
+ });
802
+ }
803
+ const { expected, expectedInitCodeHash } = pins;
804
+ await collectAsync(blockers, async () => {
805
+ const [resolvedFee, maxGasFee] = await Promise.all([
806
+ args.factory.resolveGasFee(args.creator),
807
+ args.factory.maxGasFee()
808
+ ]);
809
+ collect(blockers, () => assertWithinCeiling(method, resolvedFee, maxGasFee));
810
+ collect(
811
+ blockers,
812
+ () => assertResolvedFeeAccepted(
813
+ {
814
+ factory: args.factory,
815
+ creator: args.creator,
816
+ maxAcceptedGasFee: args.params.common.maxAcceptedGasFee,
817
+ method
818
+ },
819
+ resolvedFee
820
+ )
821
+ );
822
+ });
498
823
  const predictArgs = {
499
824
  mode: args.mode,
500
825
  deployer: args.creator,
@@ -526,7 +851,7 @@ async function preflightCreate(args) {
526
851
  blockers,
527
852
  () => assertSaltAvailable({
528
853
  publicClient: args.factory.publicClient,
529
- predictedAddress,
854
+ predictedAddress: expected?.airdrop ?? predictedAddress,
530
855
  variant: args.variant,
531
856
  mode: args.mode,
532
857
  deployer: args.creator,
@@ -534,25 +859,74 @@ async function preflightCreate(args) {
534
859
  method
535
860
  })
536
861
  );
537
- if (args.expectedInitCodeHash !== void 0) {
862
+ if (expectedInitCodeHash !== void 0) {
863
+ const initCodeHashBefore = expectedInitCodeHash;
538
864
  collect(
539
865
  blockers,
540
866
  () => assertPredictionFresh({
541
867
  variant: args.variant,
542
- initCodeHashBefore: args.expectedInitCodeHash,
868
+ initCodeHashBefore,
543
869
  initCodeHashAfter: liveInitCodeHash,
544
- predictedAddress,
870
+ predictedAddress: expected?.airdrop ?? predictedAddress,
545
871
  method
546
872
  })
547
873
  );
548
874
  }
549
- return { ready: blockers.length === 0, blockers };
875
+ const pinned = Object.keys(definedFields(expected)).length > 0;
876
+ let fresh;
877
+ try {
878
+ fresh = await args.factory.quoteCreateCommitments({
879
+ ...args.variant === "merkle" ? { variant: "merkle", params: args.params } : { variant: "ecdsa", params: args.params },
880
+ mode: args.mode,
881
+ deployer: args.creator,
882
+ userSalt: args.userSalt,
883
+ expected: { airdrop: predictedAddress }
884
+ });
885
+ } catch (err) {
886
+ if (pinned) {
887
+ if (!isTokenOpsSdkError(err)) throw err;
888
+ blockers.push(err);
889
+ }
890
+ }
891
+ let commitments;
892
+ if (fresh) {
893
+ commitments = { ...fresh, ...definedFields(expected) };
894
+ for (const field of COMMITMENT_FIELDS) {
895
+ const pinned2 = expected?.[field];
896
+ if (pinned2 === void 0 || isAddressEqual(pinned2, fresh[field])) continue;
897
+ blockers.push(
898
+ new CreateCommitmentMismatchError({
899
+ method,
900
+ contractAddress: args.factory.address,
901
+ field,
902
+ expected: pinned2,
903
+ actual: fresh[field]
904
+ })
905
+ );
906
+ }
907
+ }
908
+ return { ready: blockers.length === 0, blockers, ...commitments ? { commitments } : {} };
909
+ }
910
+ async function assertKnownAirdrop(args) {
911
+ if (args.factory.chainId !== args.chainId) {
912
+ throw new InvalidArgumentError({
913
+ method: args.method,
914
+ argument: "factory",
915
+ reason: `is bound to chain ${args.factory.chainId} but the airdrop is on chain ${args.chainId}; a registry answer from another chain proves nothing about this instance`,
916
+ value: args.factory.address
917
+ });
918
+ }
919
+ if (await args.factory.isAirdrop(args.airdrop)) return;
920
+ throw new UnrecognisedAirdropError({
921
+ method: args.method,
922
+ contractAddress: args.airdrop,
923
+ factory: args.factory.address
924
+ });
550
925
  }
551
926
  function assertMerkleClaimIdentity(args) {
552
- const { method, account, submitter, boundTo, to, entrypoint = "claim" } = args;
927
+ const { method, account, submitter, to, entrypoint = "claim" } = args;
553
928
  for (const [argument, value] of [
554
929
  ["account", account],
555
- ["entry.boundTo", boundTo],
556
930
  ["to", to],
557
931
  ["submitter", submitter]
558
932
  ]) {
@@ -572,13 +946,6 @@ function assertMerkleClaimIdentity(args) {
572
946
  reason: "is the zero address; the claim identity is mandatory and is never defaulted from the caller"
573
947
  });
574
948
  }
575
- if (boundTo !== void 0 && !isAddressEqual(boundTo, submitter)) {
576
- throw new InvalidArgumentError({
577
- method,
578
- argument: "entry.boundTo",
579
- reason: `is ${boundTo}, but this transaction is sent from ${submitter}; the FHE input proof is bound to the sender, so only ${boundTo} can submit this entry`
580
- });
581
- }
582
949
  if (entrypoint === "claimAndUnwrap") {
583
950
  if (!isAddressEqual(account, submitter)) {
584
951
  throw new InvalidArgumentError({
@@ -599,6 +966,17 @@ async function preflightClaim(args) {
599
966
  const method = "preflightClaim";
600
967
  const blockers = [];
601
968
  collect(blockers, () => assertSupportedChain(airdrop.chainId));
969
+ if (args.factory) {
970
+ await collectAsync(
971
+ blockers,
972
+ () => assertKnownAirdrop({
973
+ factory: args.factory,
974
+ airdrop: airdrop.address,
975
+ chainId: airdrop.chainId,
976
+ method
977
+ })
978
+ );
979
+ }
602
980
  if (args.account !== void 0 || args.entrypoint !== void 0) {
603
981
  collect(
604
982
  blockers,
@@ -671,9 +1049,11 @@ async function preflightClaim(args) {
671
1049
  function collect(blockers, run) {
672
1050
  try {
673
1051
  run();
1052
+ return true;
674
1053
  } catch (err) {
675
1054
  if (!isTokenOpsSdkError(err)) throw err;
676
1055
  blockers.push(err);
1056
+ return false;
677
1057
  }
678
1058
  }
679
1059
  async function collectAsync(blockers, run) {
@@ -684,5 +1064,21 @@ async function collectAsync(blockers, run) {
684
1064
  blockers.push(err);
685
1065
  }
686
1066
  }
1067
+ var CLONE_INIT_CODE_PREFIX = "0x3d602d80600a3d3981f3363d3d373d3d3d363d73";
1068
+ var CLONE_INIT_CODE_SUFFIX = "5af43d82803e903d91602b57fd5bf3";
1069
+ function predictComplianceManagerClone(args) {
1070
+ const salt = keccak256(
1071
+ encodeAbiParameters(
1072
+ [{ type: "address" }, { type: "string" }],
1073
+ [getAddress(args.airdrop), "compliance"]
1074
+ )
1075
+ );
1076
+ const initCode = `${CLONE_INIT_CODE_PREFIX}${getAddress(args.managerImplementation).slice(2).toLowerCase()}${CLONE_INIT_CODE_SUFFIX}`;
1077
+ return getCreate2Address({
1078
+ from: getAddress(args.factory),
1079
+ salt,
1080
+ bytecodeHash: keccak256(initCode)
1081
+ });
1082
+ }
687
1083
 
688
- export { AIRDROP_CONTRACTS_COMMIT, AlreadyClaimedError, ClaimNotStartedError, ClaimWindowClosedError, DEDUP_MODE, DEPLOYMENT_MODE, DedupIdConsumedError, FeeCollectorSelfAdministeredError, MerkleUupsUnsupportedError, NonStockWrapperError, PredictionDriftError, SaltCollisionError, SignatureExpiredError, UnauthorizedRedirectError, UpgradeabilityNotAllowedError, airdropProductMapper, assertMerkleClaimIdentity, assertMerkleModeSupported, assertPredictionFresh, assertSaltAvailable, assertStockWrapper, assertSupportedChain, preflightClaim, preflightCreate };
1084
+ export { AIRDROP_CONTRACTS_COMMIT, AlreadyClaimedError, ClaimNotStartedError, ClaimWindowClosedError, ClawbackRequiresPauseError, CreateCommitmentMismatchError, DEDUP_MODE, DEDUP_MODE_BY_ORDINAL, DEPLOYMENT_MODE, DedupIdConsumedError, FeeCollectorSelfAdministeredError, GasFeeNotAcceptedError, MerkleUupsUnsupportedError, NativeRescueRequiresZeroFeeError, NonStockWrapperError, PredictionDriftError, SaltCollisionError, SignatureExpiredError, UINT96_MAX, UnauthorizedRedirectError, UnrecognisedAirdropError, UpgradeabilityNotAllowedError, airdropProductMapper, assertCreateGasFee, assertMerkleClaimIdentity, assertMerkleModeSupported, assertPredictionFresh, assertSaltAvailable, assertStockWrapper, assertSupportedChain, predictComplianceManagerClone, preflightClaim, preflightCreate, resolvePlannedCreate };
@@ -15,16 +15,16 @@ export declare const DEPLOYED_ADDRESSES: {
15
15
  };
16
16
  readonly fheAirdrop: {
17
17
  readonly airdropFactory: {
18
- readonly 11155111: "0x174A7CB40F64aBC4C95CecB4172A066Cf531e4E9";
18
+ readonly 11155111: "0xD5906f366Ff50909F403c8EDfDe680015563046a";
19
19
  };
20
20
  readonly ecdsaImplementation: {
21
- readonly 11155111: "0xDeD7AB391f87B8F891F89AaEC64C7c9C800C6645";
21
+ readonly 11155111: "0xE27A2aF9dCBda2B06535d5502e6dbB90364b43bA";
22
22
  };
23
23
  readonly merkleImplementation: {
24
- readonly 11155111: "0x815E65Cdd707F07F09332537b47C530d0E87aAf5";
24
+ readonly 11155111: "0xccea0A916dBe5aB939915a402942EE6AFDcD505E";
25
25
  };
26
26
  readonly complianceManagerImplementation: {
27
- readonly 11155111: "0x885474FA494748C85410482244a406C6Ad570CCe";
27
+ readonly 11155111: "0x076719596c21F0Eb358AC45649C3db387D98FADf";
28
28
  };
29
29
  };
30
30
  readonly fheDisperse: {
@@ -13,7 +13,7 @@ declare const TOKENOPS_SDK_ERROR_BRAND: unique symbol;
13
13
  * human-readable and may evolve between versions.
14
14
  * @public
15
15
  */
16
- export type TokenOpsSdkErrorCode = "TOKENOPS_UNSUPPORTED_CHAIN" | "TOKENOPS_DEPLOYMENT_ADDRESS_UNAVAILABLE" | "TOKENOPS_MISSING_PUBLIC_CLIENT" | "TOKENOPS_MISSING_WALLET_CLIENT" | "TOKENOPS_MISSING_ACCOUNT" | "TOKENOPS_MISSING_ENCRYPTOR" | "TOKENOPS_MISSING_CLIENT" | "TOKENOPS_INVALID_ARGUMENT" | "TOKENOPS_RECEIPT_EVENT_NOT_FOUND" | "TOKENOPS_RECEIPT_EVENT_AMBIGUOUS" | "TOKENOPS_CONTRACT_REVERT" | "TOKENOPS_PAUSED" | "TOKENOPS_ACCESS_DENIED" | "TOKENOPS_OPERATOR_NOT_APPROVED" | "TOKENOPS_INSUFFICIENT_FEE" | "TOKENOPS_INSUFFICIENT_BALANCE" | "TOKENOPS_BATCH_TOO_LARGE" | "TOKENOPS_FEATURE_DISABLED" | "TOKENOPS_TRANSFER_FAILED" | "TOKENOPS_FHE_HANDLE_NOT_ALLOWED" | "TOKENOPS_ALREADY_INITIALIZED" | "TOKENOPS_REENTRANCY" | "TOKENOPS_INVALID_SIGNATURE" | "TOKENOPS_WALLET_REJECTED" | "TOKENOPS_WALLET_CHAIN_MISMATCH" | "TOKENOPS_NETWORK_ERROR" | "TOKENOPS_INSUFFICIENT_GAS_FUNDS" | "TOKENOPS_UNKNOWN_WRITE_FAILURE" | "TOKENOPS_USER_REJECTED" | "TOKENOPS_SIGNING_FAILED" | "TOKENOPS_RELAYER_UNREACHABLE" | "TOKENOPS_ENCRYPTION_FAILED" | "TOKENOPS_DECRYPTION_FAILED" | "TOKENOPS_USER_DECRYPT_NOT_ALLOWED" | "TOKENOPS_VESTING_NOT_FOUND" | "TOKENOPS_NOT_RECIPIENT" | "TOKENOPS_CLAIM_LOCKED" | "TOKENOPS_VESTING_REVOKED" | "TOKENOPS_NOT_REVOCABLE" | "TOKENOPS_VESTING_EXPIRED" | "TOKENOPS_TRANSFER_ALREADY_PENDING" | "TOKENOPS_NO_PENDING_TRANSFER" | "TOKENOPS_NOT_PENDING_RECIPIENT" | "TOKENOPS_TRANSFER_EXPIRED" | "TOKENOPS_ALREADY_CLAIMED" | "TOKENOPS_CLAIM_NOT_STARTED" | "TOKENOPS_CLAIM_WINDOW_CLOSED" | "TOKENOPS_NOT_REGISTERED" | "TOKENOPS_ALREADY_REGISTERED" | "TOKENOPS_SUBWALLETS_NOT_APPROVED" | "TOKENOPS_SINGLETON_NOT_APPROVED" | "TOKENOPS_FAUCET_SUPPLY_EXHAUSTED" | "TOKENOPS_MERKLE_UUPS_UNSUPPORTED" | "TOKENOPS_NON_STOCK_WRAPPER" | "TOKENOPS_UPGRADEABILITY_NOT_ALLOWED" | "TOKENOPS_FEE_COLLECTOR_SELF_ADMINISTERED" | "TOKENOPS_DEDUP_ID_CONSUMED" | "TOKENOPS_SIGNATURE_EXPIRED" | "TOKENOPS_SALT_COLLISION" | "TOKENOPS_PREDICTION_DRIFT" | "TOKENOPS_UNAUTHORIZED_REDIRECT";
16
+ export type TokenOpsSdkErrorCode = "TOKENOPS_UNSUPPORTED_CHAIN" | "TOKENOPS_DEPLOYMENT_ADDRESS_UNAVAILABLE" | "TOKENOPS_MISSING_PUBLIC_CLIENT" | "TOKENOPS_MISSING_WALLET_CLIENT" | "TOKENOPS_MISSING_ACCOUNT" | "TOKENOPS_MISSING_ENCRYPTOR" | "TOKENOPS_MISSING_CLIENT" | "TOKENOPS_INVALID_ARGUMENT" | "TOKENOPS_RECEIPT_EVENT_NOT_FOUND" | "TOKENOPS_RECEIPT_EVENT_AMBIGUOUS" | "TOKENOPS_CONTRACT_REVERT" | "TOKENOPS_PAUSED" | "TOKENOPS_ACCESS_DENIED" | "TOKENOPS_OPERATOR_NOT_APPROVED" | "TOKENOPS_INSUFFICIENT_FEE" | "TOKENOPS_INSUFFICIENT_BALANCE" | "TOKENOPS_BATCH_TOO_LARGE" | "TOKENOPS_FEATURE_DISABLED" | "TOKENOPS_TRANSFER_FAILED" | "TOKENOPS_FHE_HANDLE_NOT_ALLOWED" | "TOKENOPS_ALREADY_INITIALIZED" | "TOKENOPS_REENTRANCY" | "TOKENOPS_INVALID_SIGNATURE" | "TOKENOPS_WALLET_REJECTED" | "TOKENOPS_WALLET_CHAIN_MISMATCH" | "TOKENOPS_NETWORK_ERROR" | "TOKENOPS_INSUFFICIENT_GAS_FUNDS" | "TOKENOPS_UNKNOWN_WRITE_FAILURE" | "TOKENOPS_UNEXPECTED_CONTRACT_RESPONSE" | "TOKENOPS_USER_REJECTED" | "TOKENOPS_SIGNING_FAILED" | "TOKENOPS_RELAYER_UNREACHABLE" | "TOKENOPS_ENCRYPTION_FAILED" | "TOKENOPS_DECRYPTION_FAILED" | "TOKENOPS_USER_DECRYPT_NOT_ALLOWED" | "TOKENOPS_VESTING_NOT_FOUND" | "TOKENOPS_NOT_RECIPIENT" | "TOKENOPS_CLAIM_LOCKED" | "TOKENOPS_VESTING_REVOKED" | "TOKENOPS_NOT_REVOCABLE" | "TOKENOPS_VESTING_EXPIRED" | "TOKENOPS_TRANSFER_ALREADY_PENDING" | "TOKENOPS_NO_PENDING_TRANSFER" | "TOKENOPS_NOT_PENDING_RECIPIENT" | "TOKENOPS_TRANSFER_EXPIRED" | "TOKENOPS_ALREADY_CLAIMED" | "TOKENOPS_CLAIM_NOT_STARTED" | "TOKENOPS_CLAIM_WINDOW_CLOSED" | "TOKENOPS_NOT_REGISTERED" | "TOKENOPS_ALREADY_REGISTERED" | "TOKENOPS_SUBWALLETS_NOT_APPROVED" | "TOKENOPS_SINGLETON_NOT_APPROVED" | "TOKENOPS_FAUCET_SUPPLY_EXHAUSTED" | "TOKENOPS_MERKLE_UUPS_UNSUPPORTED" | "TOKENOPS_NON_STOCK_WRAPPER" | "TOKENOPS_UPGRADEABILITY_NOT_ALLOWED" | "TOKENOPS_FEE_COLLECTOR_SELF_ADMINISTERED" | "TOKENOPS_DEDUP_ID_CONSUMED" | "TOKENOPS_SIGNATURE_EXPIRED" | "TOKENOPS_SALT_COLLISION" | "TOKENOPS_CREATE_COMMITMENT_MISMATCH" | "TOKENOPS_CLAWBACK_REQUIRES_PAUSE" | "TOKENOPS_NATIVE_RESCUE_REQUIRES_ZERO_FEE" | "TOKENOPS_PREDICTION_DRIFT" | "TOKENOPS_UNAUTHORIZED_REDIRECT" | "TOKENOPS_GAS_FEE_NOT_ACCEPTED" | "TOKENOPS_UNRECOGNISED_AIRDROP";
17
17
  /** @public */
18
18
  export interface TokenOpsSdkErrorInit {
19
19
  code: TokenOpsSdkErrorCode;
@@ -2,6 +2,7 @@ export * from "./addresses.js";
2
2
  export * from "./brands.js";
3
3
  export * from "./chains.js";
4
4
  export * from "./errors.js";
5
+ export * from "./pending.js";
5
6
  export * from "./preflight.js";
6
7
  export * from "./types.js";
7
8
  export { type SdkTelemetry, type SdkTelemetryTags } from "./telemetry.js";