@tokenops/sdk 1.6.0 → 2.0.0-alpha.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.
- package/CHANGELOG.md +48 -8
- package/CONTRIBUTING.md +4 -2
- package/README.md +146 -90
- package/SUPPORT.md +47 -0
- package/dist/{chunk-HETNKZEE.js → chunk-335Z2W67.js} +1 -1
- package/dist/{chunk-BD4LZBVF.cjs → chunk-3QHNYEQD.cjs} +18 -17
- package/dist/chunk-456VDDA3.js +370 -0
- package/dist/{chunk-6WSNS3UV.js → chunk-4RAAATVY.js} +2 -4
- package/dist/{chunk-4KJ66YRH.js → chunk-4TSDNZQ3.js} +2 -2
- package/dist/{chunk-WUXUWTFW.cjs → chunk-5576FRT3.cjs} +31 -7
- package/dist/chunk-66IHPTOK.cjs +20 -0
- package/dist/{chunk-2RNW4MIJ.cjs → chunk-67OV5CX2.cjs} +0 -18
- package/dist/{chunk-PD7ME2BT.js → chunk-6GNR22OV.js} +2 -1
- package/dist/{chunk-VHSNYUYV.js → chunk-6NAVMWZQ.js} +5 -5
- package/dist/{chunk-EUKPOXWR.cjs → chunk-6PXXGACR.cjs} +17 -15
- package/dist/{chunk-WTK6JDSI.js → chunk-74QFZ5MK.js} +6 -4
- package/dist/{chunk-WOEETTH7.cjs → chunk-7AFPOE7N.cjs} +6 -6
- package/dist/{chunk-U57COLUE.js → chunk-AXIPOR3C.js} +2 -2
- package/dist/chunk-CTED3MTR.cjs +380 -0
- package/dist/{chunk-QKKBBH7I.js → chunk-DZHYSUGY.js} +28 -7
- package/dist/{chunk-V5D7BHW3.js → chunk-EAJ7SYHE.js} +6 -4
- package/dist/{chunk-SYHNZSZZ.cjs → chunk-FAXIIH5R.cjs} +3 -3
- package/dist/{chunk-7G7UOQV4.cjs → chunk-FGEB7RMY.cjs} +4 -4
- package/dist/chunk-GKKDAW44.js +8823 -0
- package/dist/{chunk-QET3Q4JP.js → chunk-H5POPGOZ.js} +8 -6
- package/dist/{chunk-VR3FREBX.cjs → chunk-JK4XMMKM.cjs} +3 -3
- package/dist/{chunk-CBRL2PJA.cjs → chunk-JQYC66TO.cjs} +12 -12
- package/dist/{chunk-YFIWCYHC.cjs → chunk-JZLGCTGK.cjs} +56 -54
- package/dist/{chunk-4ZCXK4VI.cjs → chunk-KFRDLKMA.cjs} +14 -14
- package/dist/chunk-KWFFIJYX.js +11 -0
- package/dist/chunk-M4IT6DNJ.cjs +608 -0
- package/dist/{chunk-43RFBQ73.cjs → chunk-MVDQMV25.cjs} +29 -32
- package/dist/chunk-NCVX3K2N.cjs +161 -0
- package/dist/chunk-NWFMBLSQ.js +4 -0
- package/dist/chunk-O5676ZWY.js +585 -0
- package/dist/chunk-PUX5VXDB.cjs +8845 -0
- package/dist/{chunk-DRSPMIZ7.js → chunk-QBJ7O2B4.js} +1 -11
- package/dist/{chunk-UJS4N2XM.cjs → chunk-TEBM66WA.cjs} +12 -12
- package/dist/{chunk-TN65XNTI.js → chunk-TWT3STIX.js} +8 -6
- package/dist/chunk-UG5RKLU2.cjs +6 -0
- package/dist/chunk-VP2B4WM2.js +154 -0
- package/dist/{chunk-BK7YIVLK.cjs → chunk-WJLECC22.cjs} +75 -73
- package/dist/{chunk-NFW7AUEX.js → chunk-WMACINXO.js} +1 -1
- package/dist/{chunk-AYGRYDBX.cjs → chunk-XAYGD4E4.cjs} +37 -35
- package/dist/{chunk-46T67CE2.js → chunk-ZA673I3O.js} +1 -1
- package/dist/{chunk-YPYCWLYP.js → chunk-ZWXJTBZO.js} +1 -1
- package/dist/core/addresses.d.ts +14 -2
- package/dist/core/brands.d.ts +8 -2
- package/dist/core/errors.d.ts +71 -10
- package/dist/core/preflight.d.ts +1 -0
- package/dist/fhe/erc7984-abi.d.ts +1 -0
- package/dist/fhe/index.cjs +64 -63
- package/dist/fhe/index.js +7 -6
- package/dist/fhe/operators.d.ts +22 -5
- package/dist/fhe/react/index.cjs +13 -12
- package/dist/fhe/react/index.js +6 -5
- package/dist/fhe/types.d.ts +6 -0
- package/dist/fhe-airdrop/abis/{cloneable.d.ts → airdrop-base.d.ts} +254 -396
- package/dist/fhe-airdrop/abis/compliance.d.ts +422 -0
- package/dist/fhe-airdrop/abis/ecdsa.d.ts +1316 -0
- package/dist/fhe-airdrop/abis/factory.d.ts +1319 -190
- package/dist/fhe-airdrop/abis/index.d.ts +5 -2
- package/dist/fhe-airdrop/abis/merkle.d.ts +1238 -0
- package/dist/fhe-airdrop/advanced/index.cjs +11 -12
- package/dist/fhe-airdrop/advanced/index.d.cts +34 -11
- package/dist/fhe-airdrop/advanced/index.d.ts +34 -11
- package/dist/fhe-airdrop/advanced/index.js +3 -8
- package/dist/fhe-airdrop/advanced/react/index.cjs +37 -50
- package/dist/fhe-airdrop/advanced/react/index.d.cts +9 -3
- package/dist/fhe-airdrop/advanced/react/index.d.ts +9 -3
- package/dist/fhe-airdrop/advanced/react/index.js +36 -50
- package/dist/fhe-airdrop/advanced/react/usePredictEcdsaAirdropAddress.d.ts +33 -0
- package/dist/fhe-airdrop/advanced/react/usePredictMerkleAirdropAddress.d.ts +27 -0
- package/dist/fhe-airdrop/airdrop-base.d.ts +600 -0
- package/dist/fhe-airdrop/campaign.d.ts +297 -0
- package/dist/fhe-airdrop/compliance.d.ts +302 -0
- package/dist/fhe-airdrop/constants.d.ts +33 -0
- package/dist/fhe-airdrop/ecdsa.d.ts +263 -0
- package/dist/fhe-airdrop/encryption.d.ts +92 -14
- package/dist/fhe-airdrop/errors.d.ts +245 -15
- package/dist/fhe-airdrop/factory.d.ts +533 -274
- package/dist/fhe-airdrop/guards.d.ts +273 -0
- package/dist/fhe-airdrop/index.cjs +1131 -74
- package/dist/fhe-airdrop/index.d.cts +46 -8
- package/dist/fhe-airdrop/index.d.ts +46 -8
- package/dist/fhe-airdrop/index.js +931 -8
- package/dist/fhe-airdrop/merkle-tree.d.ts +103 -0
- package/dist/fhe-airdrop/merkle.d.ts +180 -0
- package/dist/fhe-airdrop/react/_shared.d.ts +144 -71
- package/dist/fhe-airdrop/react/index.cjs +399 -459
- package/dist/fhe-airdrop/react/index.d.cts +53 -74
- package/dist/fhe-airdrop/react/index.d.ts +53 -74
- package/dist/fhe-airdrop/react/index.js +261 -374
- package/dist/fhe-airdrop/react/useAirdropGasFee.d.ts +10 -5
- package/dist/fhe-airdrop/react/useAirdropHasRole.d.ts +15 -6
- package/dist/fhe-airdrop/react/useAirdropPause.d.ts +30 -0
- package/dist/fhe-airdrop/react/useAirdropPaused.d.ts +17 -0
- package/dist/fhe-airdrop/react/useAirdropToken.d.ts +11 -4
- package/dist/fhe-airdrop/react/useAirdropWindow.d.ts +37 -0
- package/dist/fhe-airdrop/react/useClaimedAmount.d.ts +29 -0
- package/dist/fhe-airdrop/react/useComplianceManager.d.ts +16 -0
- package/dist/fhe-airdrop/react/useCreateEcdsaAirdrop.d.ts +28 -0
- package/dist/fhe-airdrop/react/useCreateMerkleAirdrop.d.ts +25 -0
- package/dist/fhe-airdrop/react/useEcdsaClaim.d.ts +23 -0
- package/dist/fhe-airdrop/react/useEffectiveUpgradeable.d.ts +20 -0
- package/dist/fhe-airdrop/react/useExtendClaimWindow.d.ts +17 -12
- package/dist/fhe-airdrop/react/useFactoryFees.d.ts +28 -0
- package/dist/fhe-airdrop/react/useFactoryRegistry.d.ts +35 -0
- package/dist/fhe-airdrop/react/useFundAirdrop.d.ts +35 -0
- package/dist/fhe-airdrop/react/useGrantInstanceRoles.d.ts +35 -0
- package/dist/fhe-airdrop/react/useMerkleClaim.d.ts +34 -0
- package/dist/fhe-airdrop/react/useMerkleRoot.d.ts +15 -0
- package/dist/fhe-airdrop/react/useSetMerkleRoot.d.ts +22 -0
- package/dist/fhe-airdrop/react/useWithdrawConfidential.d.ts +23 -0
- package/dist/fhe-airdrop/roles.d.ts +147 -0
- package/dist/fhe-airdrop/types.d.ts +67 -65
- package/dist/fhe-disperse/index.cjs +70 -68
- package/dist/fhe-disperse/index.js +10 -8
- package/dist/fhe-disperse/react/index.cjs +94 -92
- package/dist/fhe-disperse/react/index.js +13 -11
- package/dist/fhe-vesting/advanced/index.cjs +10 -8
- package/dist/fhe-vesting/advanced/index.js +8 -6
- package/dist/fhe-vesting/advanced/react/index.cjs +16 -14
- package/dist/fhe-vesting/advanced/react/index.js +13 -11
- package/dist/fhe-vesting/index.cjs +74 -72
- package/dist/fhe-vesting/index.js +11 -9
- package/dist/fhe-vesting/react/index.cjs +228 -226
- package/dist/fhe-vesting/react/index.js +15 -13
- package/dist/index.cjs +100 -87
- package/dist/index.js +3 -2
- package/dist/testnet-faucet/index.cjs +57 -55
- package/dist/testnet-faucet/index.js +7 -5
- package/dist/testnet-faucet/react/index.cjs +55 -53
- package/dist/testnet-faucet/react/index.js +9 -7
- package/package.json +6 -2
- package/dist/chunk-CNP4L3GF.js +0 -105
- package/dist/chunk-KSDSXJ34.js +0 -41
- package/dist/chunk-LBWRFZR3.cjs +0 -1681
- package/dist/chunk-OL6SHN3D.cjs +0 -44
- package/dist/chunk-S2XD75JM.js +0 -1637
- package/dist/chunk-SPGSO5SO.cjs +0 -1644
- package/dist/chunk-UE5XK2SY.js +0 -1673
- package/dist/chunk-WO72UBQD.cjs +0 -109
- package/dist/fhe-airdrop/advanced/factory-advanced.d.ts +0 -53
- package/dist/fhe-airdrop/advanced/react/usePredictAirdropAddress.d.ts +0 -49
- package/dist/fhe-airdrop/airdrop.d.ts +0 -317
- package/dist/fhe-airdrop/react/useAccessClaimAmount.d.ts +0 -37
- package/dist/fhe-airdrop/react/useAirdropCanExtendClaimWindow.d.ts +0 -7
- package/dist/fhe-airdrop/react/useAirdropClaimTypehash.d.ts +0 -10
- package/dist/fhe-airdrop/react/useAirdropClaimedSignatures.d.ts +0 -16
- package/dist/fhe-airdrop/react/useAirdropDeploymentBlockNumber.d.ts +0 -6
- package/dist/fhe-airdrop/react/useAirdropDomainSeparator.d.ts +0 -8
- package/dist/fhe-airdrop/react/useAirdropEndTime.d.ts +0 -10
- package/dist/fhe-airdrop/react/useAirdropFactoryCustomFee.d.ts +0 -17
- package/dist/fhe-airdrop/react/useAirdropFactoryDefaultGasFee.d.ts +0 -10
- package/dist/fhe-airdrop/react/useAirdropFactoryDisableCustomFee.d.ts +0 -15
- package/dist/fhe-airdrop/react/useAirdropFactoryFeeCollector.d.ts +0 -11
- package/dist/fhe-airdrop/react/useAirdropFactoryInitCodeHash.d.ts +0 -17
- package/dist/fhe-airdrop/react/useAirdropFactorySetCustomFee.d.ts +0 -17
- package/dist/fhe-airdrop/react/useAirdropFactorySetDefaultGasFee.d.ts +0 -16
- package/dist/fhe-airdrop/react/useAirdropFactorySetFeeCollector.d.ts +0 -15
- package/dist/fhe-airdrop/react/useAirdropGrantRole.d.ts +0 -16
- package/dist/fhe-airdrop/react/useAirdropHasClaimEnded.d.ts +0 -7
- package/dist/fhe-airdrop/react/useAirdropHasClaimStarted.d.ts +0 -7
- package/dist/fhe-airdrop/react/useAirdropIsClaimWindowActive.d.ts +0 -9
- package/dist/fhe-airdrop/react/useAirdropIsPaused.d.ts +0 -8
- package/dist/fhe-airdrop/react/useAirdropIsSignatureClaimed.d.ts +0 -22
- package/dist/fhe-airdrop/react/useAirdropIsSignatureValid.d.ts +0 -51
- package/dist/fhe-airdrop/react/useAirdropRevokeRole.d.ts +0 -15
- package/dist/fhe-airdrop/react/useAirdropStartTime.d.ts +0 -10
- package/dist/fhe-airdrop/react/useAirdropWithdrawGasFee.d.ts +0 -15
- package/dist/fhe-airdrop/react/useAirdropWithdrawOtherConfidentialToken.d.ts +0 -14
- package/dist/fhe-airdrop/react/useAirdropWithdrawOtherToken.d.ts +0 -14
- package/dist/fhe-airdrop/react/useClaim.d.ts +0 -39
- package/dist/fhe-airdrop/react/useConfidentialAirdropFactoryImplementation.d.ts +0 -11
- package/dist/fhe-airdrop/react/useCreateAndFundConfidentialAirdrop.d.ts +0 -41
- package/dist/fhe-airdrop/react/useCreateAndFundConfidentialAirdropAndGetAddress.d.ts +0 -48
- package/dist/fhe-airdrop/react/useCreateConfidentialAirdrop.d.ts +0 -29
- package/dist/fhe-airdrop/react/useCreateConfidentialAirdropAndGetAddress.d.ts +0 -31
- package/dist/fhe-airdrop/react/useDisableCustomFee.d.ts +0 -14
- package/dist/fhe-airdrop/react/useFactoryCustomFee.d.ts +0 -17
- package/dist/fhe-airdrop/react/useFactoryDefaultGasFee.d.ts +0 -10
- package/dist/fhe-airdrop/react/useFactoryFeeCollector.d.ts +0 -11
- package/dist/fhe-airdrop/react/useFactoryInitCodeHash.d.ts +0 -17
- package/dist/fhe-airdrop/react/useFundConfidentialAirdrop.d.ts +0 -33
- package/dist/fhe-airdrop/react/usePreflightCreateAirdrop.d.ts +0 -51
- package/dist/fhe-airdrop/react/useSetCustomFee.d.ts +0 -16
- package/dist/fhe-airdrop/react/useSetDefaultGasFee.d.ts +0 -15
- package/dist/fhe-airdrop/react/useSetFeeCollector.d.ts +0 -14
- package/dist/fhe-airdrop/react/useSetPaused.d.ts +0 -14
- package/dist/fhe-airdrop/react/useSignClaimAuthorization.d.ts +0 -31
- package/dist/fhe-airdrop/react/useWithdraw.d.ts +0 -12
- package/dist/fhe-airdrop/react/useWithdrawOtherConfidentialToken.d.ts +0 -13
- package/dist/fhe-airdrop/react/useWithdrawOtherToken.d.ts +0 -13
|
@@ -0,0 +1,585 @@
|
|
|
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, BaseError, ContractFunctionZeroDataError } from 'viem';
|
|
4
|
+
|
|
5
|
+
// src/fhe-airdrop/constants.ts
|
|
6
|
+
var AIRDROP_CONTRACTS_COMMIT = "8e5b144bdbcdf35b9f36b62f5257d795bf954e8e";
|
|
7
|
+
var DEPLOYMENT_MODE = { clone: 0, uups: 1 };
|
|
8
|
+
var DEDUP_MODE = { perAddress: 0, perDedupId: 1, both: 2, none: 3 };
|
|
9
|
+
|
|
10
|
+
// src/fhe-airdrop/errors.ts
|
|
11
|
+
var MerkleUupsUnsupportedError = class extends TokenOpsSdkError {
|
|
12
|
+
name = "MerkleUupsUnsupportedError";
|
|
13
|
+
constructor(options) {
|
|
14
|
+
super(
|
|
15
|
+
'Merkle campaigns cannot use `mode: "uups"`: the per-account `claimedAmount` mapping occupies an ERC-7201 namespaced slot that an earlier revision typed differently, so an in-place upgrade across that change reinterprets existing storage and can re-open claims that were already settled. Use `mode: "clone"`.',
|
|
16
|
+
{
|
|
17
|
+
code: "TOKENOPS_MERKLE_UUPS_UNSUPPORTED",
|
|
18
|
+
cause: options?.cause,
|
|
19
|
+
context: { constraint: "merkle-uups-storage-retype" }
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
var NonStockWrapperError = class extends TokenOpsSdkError {
|
|
25
|
+
name = "NonStockWrapperError";
|
|
26
|
+
constructor(args) {
|
|
27
|
+
const detail = args?.token ? ` (token: ${args.token})` : "";
|
|
28
|
+
super(
|
|
29
|
+
`\`claimAndUnwrap\` is only exact for a stock ERC7984ERC20Wrapper${detail}: it burns from the airdrop instance's pooled wrapper balance, not from a per-claimant sub-balance, so the delivered amount is bounded by the pool's balance rather than by the claimant's own outstanding amount. A hooked or fee-taking wrapper can throw that accounting off, so a claimant can be credited against tokens that are not theirs.`,
|
|
30
|
+
{
|
|
31
|
+
code: "TOKENOPS_NON_STOCK_WRAPPER",
|
|
32
|
+
cause: args?.cause,
|
|
33
|
+
context: { constraint: "wrapper-unwrap-pool-bound", token: args?.token }
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var SaltCollisionError = class extends TokenOpsSdkError {
|
|
39
|
+
name = "SaltCollisionError";
|
|
40
|
+
constructor(args) {
|
|
41
|
+
super(
|
|
42
|
+
`${args.method}: the predicted address ${args.predictedAddress} already holds code. A ${args.variant} instance address commits only to (implementation, mode, deployer, userSalt) - the params struct is ignored - so this (mode, deployer, userSalt) tuple has already been deployed. Pick a fresh \`userSalt\` for each campaign.`,
|
|
43
|
+
{
|
|
44
|
+
code: "TOKENOPS_SALT_COLLISION",
|
|
45
|
+
cause: args.cause,
|
|
46
|
+
context: {
|
|
47
|
+
method: args.method,
|
|
48
|
+
variant: args.variant,
|
|
49
|
+
mode: args.mode,
|
|
50
|
+
deployer: args.deployer,
|
|
51
|
+
userSalt: args.userSalt,
|
|
52
|
+
predictedAddress: args.predictedAddress
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
var PredictionDriftError = class extends TokenOpsSdkError {
|
|
59
|
+
name = "PredictionDriftError";
|
|
60
|
+
constructor(args) {
|
|
61
|
+
const where = args.predictedAddress ? ` ${args.predictedAddress}` : "";
|
|
62
|
+
super(
|
|
63
|
+
`${args.method}: the factory's ${args.variant} init-code hash changed from ${args.initCodeHashBefore} to ${args.initCodeHashAfter} mid-flight. An implementation rotation landed while the prediction was in use, so the predicted address${where} is stale and anything bound to it (a Merkle campaign's ciphertexts above all) will not match the instance the create produces. Re-predict and rebuild.`,
|
|
64
|
+
{
|
|
65
|
+
code: "TOKENOPS_PREDICTION_DRIFT",
|
|
66
|
+
cause: args.cause,
|
|
67
|
+
context: {
|
|
68
|
+
method: args.method,
|
|
69
|
+
variant: args.variant,
|
|
70
|
+
initCodeHashBefore: args.initCodeHashBefore,
|
|
71
|
+
initCodeHashAfter: args.initCodeHashAfter,
|
|
72
|
+
predictedAddress: args.predictedAddress
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
var UpgradeabilityNotAllowedError = class extends TokenOpsSdkError {
|
|
79
|
+
name = "UpgradeabilityNotAllowedError";
|
|
80
|
+
constructor(args) {
|
|
81
|
+
const label = args.method ? `${args.method}: ` : "";
|
|
82
|
+
const who = args.creator ? ` for creator ${args.creator}` : "";
|
|
83
|
+
super(
|
|
84
|
+
`${label}\`mode: "uups"\` is not permitted${who} \u2014 call \`setDefaultUpgradeable(true)\` or \`setUpgradeabilityPolicy(creator, true)\` (UPGRADE_MANAGER_ROLE), or use \`mode: "clone"\`.`,
|
|
85
|
+
{
|
|
86
|
+
code: "TOKENOPS_UPGRADEABILITY_NOT_ALLOWED",
|
|
87
|
+
cause: args.cause,
|
|
88
|
+
context: {
|
|
89
|
+
method: args.method,
|
|
90
|
+
contractAddress: args.contractAddress,
|
|
91
|
+
creator: args.creator
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
var FeeCollectorSelfAdministeredError = class extends TokenOpsSdkError {
|
|
98
|
+
name = "FeeCollectorSelfAdministeredError";
|
|
99
|
+
constructor(args) {
|
|
100
|
+
super(
|
|
101
|
+
"FEE_COLLECTOR_ROLE is self-administered (its own role admin, not DEFAULT_ADMIN_ROLE) \u2014 grantInstanceRoles cannot grant it from the caller's admin role. Have an existing FEE_COLLECTOR_ROLE holder call `grantRole` directly.",
|
|
102
|
+
{
|
|
103
|
+
code: "TOKENOPS_FEE_COLLECTOR_SELF_ADMINISTERED",
|
|
104
|
+
cause: args?.cause,
|
|
105
|
+
context: { requestedGrantee: args?.requestedGrantee }
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
var DedupIdConsumedError = class extends TokenOpsSdkError {
|
|
111
|
+
name = "DedupIdConsumedError";
|
|
112
|
+
constructor(args) {
|
|
113
|
+
const which = args.dedupId ? ` ${args.dedupId}` : "";
|
|
114
|
+
super(`${args.method}: dedupId${which} has already been claimed.`, {
|
|
115
|
+
code: "TOKENOPS_DEDUP_ID_CONSUMED",
|
|
116
|
+
cause: args.cause,
|
|
117
|
+
context: {
|
|
118
|
+
method: args.method,
|
|
119
|
+
contractAddress: args.contractAddress,
|
|
120
|
+
dedupId: args.dedupId
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
var AlreadyClaimedError = class extends TokenOpsSdkError {
|
|
126
|
+
name = "AlreadyClaimedError";
|
|
127
|
+
constructor(args) {
|
|
128
|
+
super(`${args.method}: already claimed (${args.replayGuard} replay guard).`, {
|
|
129
|
+
code: "TOKENOPS_ALREADY_CLAIMED",
|
|
130
|
+
cause: args.cause,
|
|
131
|
+
context: {
|
|
132
|
+
method: args.method,
|
|
133
|
+
contractAddress: args.contractAddress,
|
|
134
|
+
replayGuard: args.replayGuard
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
var ClaimNotStartedError = class extends TokenOpsSdkError {
|
|
140
|
+
name = "ClaimNotStartedError";
|
|
141
|
+
constructor(args) {
|
|
142
|
+
const detail = args.startTime !== void 0 ? ` Opens at unix timestamp ${args.startTime}.` : "";
|
|
143
|
+
super(`${args.method}: the claim window has not opened yet.${detail}`, {
|
|
144
|
+
code: "TOKENOPS_CLAIM_NOT_STARTED",
|
|
145
|
+
cause: args.cause,
|
|
146
|
+
context: {
|
|
147
|
+
method: args.method,
|
|
148
|
+
contractAddress: args.contractAddress,
|
|
149
|
+
startTime: args.startTime,
|
|
150
|
+
currentTime: args.currentTime
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
var SignatureExpiredError = class extends TokenOpsSdkError {
|
|
156
|
+
name = "SignatureExpiredError";
|
|
157
|
+
constructor(args) {
|
|
158
|
+
const detail = args.deadline !== void 0 && args.currentTime !== void 0 ? ` The signature's deadline (unix timestamp ${args.deadline}) has passed; current time is ${args.currentTime}.` : "";
|
|
159
|
+
super(`${args.method}: signature has expired.${detail} Re-sign with a later deadline.`, {
|
|
160
|
+
code: "TOKENOPS_SIGNATURE_EXPIRED",
|
|
161
|
+
cause: args.cause,
|
|
162
|
+
context: {
|
|
163
|
+
method: args.method,
|
|
164
|
+
contractAddress: args.contractAddress,
|
|
165
|
+
deadline: args.deadline,
|
|
166
|
+
currentTime: args.currentTime
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
var ClaimWindowClosedError = class extends TokenOpsSdkError {
|
|
172
|
+
name = "ClaimWindowClosedError";
|
|
173
|
+
constructor(args) {
|
|
174
|
+
const detail = args.endTime !== void 0 ? ` Closed at unix timestamp ${args.endTime}.` : "";
|
|
175
|
+
super(`${args.method}: the claim window has closed.${detail}`, {
|
|
176
|
+
code: "TOKENOPS_CLAIM_WINDOW_CLOSED",
|
|
177
|
+
cause: args.cause,
|
|
178
|
+
context: {
|
|
179
|
+
method: args.method,
|
|
180
|
+
contractAddress: args.contractAddress,
|
|
181
|
+
endTime: args.endTime,
|
|
182
|
+
currentTime: args.currentTime
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
var airdropProductMapper = (name, errArgs, ctx) => {
|
|
188
|
+
switch (name) {
|
|
189
|
+
// ---- guarded conditions, caught on-chain instead of pre-flight -------
|
|
190
|
+
case "TokenNotAWrapper": {
|
|
191
|
+
const token = ctx.productContext?.["token"];
|
|
192
|
+
return new NonStockWrapperError({ token });
|
|
193
|
+
}
|
|
194
|
+
case "UpgradeabilityNotAllowed": {
|
|
195
|
+
const creator = ctx.productContext?.["creator"];
|
|
196
|
+
return new UpgradeabilityNotAllowedError({ ...ctx, creator });
|
|
197
|
+
}
|
|
198
|
+
// ---- claim lifecycle --------------------------------------------------
|
|
199
|
+
case "ClaimNotStarted": {
|
|
200
|
+
const startTime = numberArg(errArgs?.[0]);
|
|
201
|
+
const currentTime = numberArg(errArgs?.[1]);
|
|
202
|
+
return new ClaimNotStartedError({ ...ctx, startTime, currentTime });
|
|
203
|
+
}
|
|
204
|
+
case "ClaimWindowFinished": {
|
|
205
|
+
const endTime = numberArg(errArgs?.[0]);
|
|
206
|
+
const currentTime = numberArg(errArgs?.[1]);
|
|
207
|
+
return new ClaimWindowClosedError({ ...ctx, endTime, currentTime });
|
|
208
|
+
}
|
|
209
|
+
case "AddressAlreadyClaimed":
|
|
210
|
+
return new AlreadyClaimedError({ ...ctx, replayGuard: "address" });
|
|
211
|
+
case "SignatureAlreadyUsed":
|
|
212
|
+
return new AlreadyClaimedError({ ...ctx, replayGuard: "signature" });
|
|
213
|
+
case "DedupIdAlreadyClaimed": {
|
|
214
|
+
const dedupId = ctx.productContext?.["dedupId"];
|
|
215
|
+
return new DedupIdConsumedError({ ...ctx, dedupId });
|
|
216
|
+
}
|
|
217
|
+
case "InsufficientFee": {
|
|
218
|
+
const provided = errArgs?.[0];
|
|
219
|
+
const required = errArgs?.[1];
|
|
220
|
+
return new InsufficientFeeError({ ...ctx, feeKind: "gas", provided, required });
|
|
221
|
+
}
|
|
222
|
+
case "InsufficientFeeBalance": {
|
|
223
|
+
const requested = errArgs?.[0];
|
|
224
|
+
const available = errArgs?.[1];
|
|
225
|
+
return new InsufficientBalanceError({ ...ctx, balanceKind: "eth", requested, available });
|
|
226
|
+
}
|
|
227
|
+
case "EthTransferFailed":
|
|
228
|
+
return new TransferFailedError({ ...ctx, asset: "eth" });
|
|
229
|
+
case "HandleNotAllowed": {
|
|
230
|
+
const handle = errArgs?.[0];
|
|
231
|
+
return new FheHandleNotAllowedError({ ...ctx, handle });
|
|
232
|
+
}
|
|
233
|
+
// ---- Merkle-specific ----------------------------------------------
|
|
234
|
+
case "InvalidMerkleProof":
|
|
235
|
+
return new InvalidArgumentError({
|
|
236
|
+
method: ctx.method,
|
|
237
|
+
argument: "merkleProof",
|
|
238
|
+
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."
|
|
239
|
+
});
|
|
240
|
+
case "RootImmutable":
|
|
241
|
+
return new FeatureDisabledError({ ...ctx, feature: "merkleRootRotation" });
|
|
242
|
+
// ---- FHEVM chain config ---------------------------------------------
|
|
243
|
+
case "ZamaProtocolUnsupported": {
|
|
244
|
+
const chainId = ctx.productContext?.["chainId"] ?? 0;
|
|
245
|
+
return new UnsupportedChainError(chainId);
|
|
246
|
+
}
|
|
247
|
+
// ---- ECDSA-specific signature reverts --------------------------------
|
|
248
|
+
case "SignatureExpired": {
|
|
249
|
+
const deadline = errArgs?.[0];
|
|
250
|
+
const currentTime = errArgs?.[1];
|
|
251
|
+
return new SignatureExpiredError({ ...ctx, deadline, currentTime });
|
|
252
|
+
}
|
|
253
|
+
// ---- argument-validation bucket: reverts not already covered by the
|
|
254
|
+
// cross-product default mapper's `Zero*`/`Invalid*` list ---------------
|
|
255
|
+
case "ZeroToken":
|
|
256
|
+
return invalidArg(ctx, "token", name);
|
|
257
|
+
case "ZeroFeeCollector":
|
|
258
|
+
return invalidArg(
|
|
259
|
+
ctx,
|
|
260
|
+
"feeCollector",
|
|
261
|
+
name,
|
|
262
|
+
"validates the factory-injected fee-collector init parameter"
|
|
263
|
+
);
|
|
264
|
+
case "ZeroComplianceManager":
|
|
265
|
+
return invalidArg(ctx, "complianceManager", name);
|
|
266
|
+
case "ZeroRecipient":
|
|
267
|
+
return invalidArg(ctx, "recipient", name);
|
|
268
|
+
case "ZeroAdminGrant":
|
|
269
|
+
return invalidArg(
|
|
270
|
+
ctx,
|
|
271
|
+
"admin",
|
|
272
|
+
name,
|
|
273
|
+
"granting DEFAULT_ADMIN_ROLE to the zero address is never valid"
|
|
274
|
+
);
|
|
275
|
+
case "ZeroFeeCollectorGrant":
|
|
276
|
+
return invalidArg(
|
|
277
|
+
ctx,
|
|
278
|
+
"feeCollector",
|
|
279
|
+
name,
|
|
280
|
+
"granting FEE_COLLECTOR_ROLE to the zero address is never valid on a fee-charging campaign"
|
|
281
|
+
);
|
|
282
|
+
case "LastAdmin":
|
|
283
|
+
return invalidArg(
|
|
284
|
+
ctx,
|
|
285
|
+
"admin",
|
|
286
|
+
name,
|
|
287
|
+
"revoking or renouncing the sole DEFAULT_ADMIN_ROLE member would leave the instance permanently ungovernable"
|
|
288
|
+
);
|
|
289
|
+
case "LastFeeCollector":
|
|
290
|
+
return invalidArg(
|
|
291
|
+
ctx,
|
|
292
|
+
"feeCollector",
|
|
293
|
+
name,
|
|
294
|
+
"revoking the sole FEE_COLLECTOR_ROLE member would strand accrued claim-fee ETH on a fee-charging campaign"
|
|
295
|
+
);
|
|
296
|
+
case "CannotRescueAirdropToken":
|
|
297
|
+
return invalidArg(ctx, "token", name, "the rescue target cannot be the airdrop's own token");
|
|
298
|
+
case "TokenNotUnwrappable":
|
|
299
|
+
return new FeatureDisabledError({ ...ctx, feature: "claimAndUnwrap" });
|
|
300
|
+
case "ZeroAdmin":
|
|
301
|
+
return invalidArg(ctx, "admin", name);
|
|
302
|
+
case "ZeroImplementation":
|
|
303
|
+
return invalidArg(ctx, "implementation", name);
|
|
304
|
+
case "ZeroComplianceManagerImpl":
|
|
305
|
+
return invalidArg(ctx, "complianceManagerImpl", name);
|
|
306
|
+
case "ZeroComplianceDelegate":
|
|
307
|
+
return invalidArg(
|
|
308
|
+
ctx,
|
|
309
|
+
"complianceDelegate",
|
|
310
|
+
name,
|
|
311
|
+
"required while the default compliance-delegate policy is on"
|
|
312
|
+
);
|
|
313
|
+
case "IndexOutOfBounds": {
|
|
314
|
+
const index = errArgs?.[0];
|
|
315
|
+
const count = errArgs?.[1];
|
|
316
|
+
return invalidArg(
|
|
317
|
+
ctx,
|
|
318
|
+
"index",
|
|
319
|
+
name,
|
|
320
|
+
`requested index ${index?.toString() ?? "?"}, but only ${count?.toString() ?? "?"} airdrops exist`
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
case "UnknownAirdrop":
|
|
324
|
+
return invalidArg(ctx, "airdrop", name, "was not created by this factory");
|
|
325
|
+
case "SaltAlreadyUsed": {
|
|
326
|
+
const existingAirdrop = errArgs?.[0];
|
|
327
|
+
return new InvalidArgumentError({
|
|
328
|
+
method: ctx.method,
|
|
329
|
+
argument: "userSalt",
|
|
330
|
+
reason: `this (creator, mode, userSalt) tuple already predicts an existing instance${existingAirdrop ? ` at ${existingAirdrop}` : ""}.`,
|
|
331
|
+
value: existingAirdrop
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
case "ZeroSigner":
|
|
335
|
+
return invalidArg(ctx, "signer", name);
|
|
336
|
+
case "ZeroMerkleRoot":
|
|
337
|
+
return invalidArg(
|
|
338
|
+
ctx,
|
|
339
|
+
"merkleRoot",
|
|
340
|
+
name,
|
|
341
|
+
"a zero root is only permitted when `isMerkleRootMutable` is true"
|
|
342
|
+
);
|
|
343
|
+
// ---- compliance manager clone (`ComplianceRoleManager`) --------------
|
|
344
|
+
case "ZeroAirdrop":
|
|
345
|
+
return invalidArg(ctx, "airdrop", name);
|
|
346
|
+
case "ZeroClientAdmin":
|
|
347
|
+
return invalidArg(ctx, "clientAdmin", name);
|
|
348
|
+
case "ZeroDelegate":
|
|
349
|
+
return invalidArg(ctx, "delegate", name);
|
|
350
|
+
case "AirdropAndManagerAreSameAddress":
|
|
351
|
+
return invalidArg(
|
|
352
|
+
ctx,
|
|
353
|
+
"airdrop",
|
|
354
|
+
name,
|
|
355
|
+
"cannot equal this compliance manager clone's own address"
|
|
356
|
+
);
|
|
357
|
+
case "DelegateAndManagerAreSameAddress":
|
|
358
|
+
return invalidArg(
|
|
359
|
+
ctx,
|
|
360
|
+
"delegate",
|
|
361
|
+
name,
|
|
362
|
+
"cannot equal this compliance manager clone's own address"
|
|
363
|
+
);
|
|
364
|
+
case "DelegateAndAirdropAreSameAddress":
|
|
365
|
+
return invalidArg(ctx, "delegate", name, "cannot equal the airdrop instance's address");
|
|
366
|
+
case "DelegateAlreadyAdded":
|
|
367
|
+
return invalidArg(ctx, "delegate", name, "already an active client delegate");
|
|
368
|
+
case "DelegateNotFound":
|
|
369
|
+
return invalidArg(ctx, "delegate", name, "not an active client delegate");
|
|
370
|
+
case "CannotManageComplianceDelegate":
|
|
371
|
+
return invalidArg(
|
|
372
|
+
ctx,
|
|
373
|
+
"delegate",
|
|
374
|
+
name,
|
|
375
|
+
"targets the factory-designated platform compliance delegate, which cannot be managed this way"
|
|
376
|
+
);
|
|
377
|
+
default:
|
|
378
|
+
return void 0;
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
function invalidArg(ctx, argument, revertName, detail) {
|
|
382
|
+
const suffix = detail ? ` ${detail}.` : "";
|
|
383
|
+
return new InvalidArgumentError({
|
|
384
|
+
method: ctx.method,
|
|
385
|
+
argument,
|
|
386
|
+
reason: `the contract reverted with \`${revertName}\`.${suffix}`
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
function numberArg(value) {
|
|
390
|
+
return typeof value === "bigint" ? Number(value) : void 0;
|
|
391
|
+
}
|
|
392
|
+
var SUPPORTED_CHAIN_IDS = [1, 11155111, 31337];
|
|
393
|
+
function assertSupportedChain(chainId) {
|
|
394
|
+
if (!SUPPORTED_CHAIN_IDS.includes(chainId)) {
|
|
395
|
+
throw new UnsupportedChainError(chainId);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
function assertMerkleModeSupported(mode) {
|
|
399
|
+
if (mode === "uups") {
|
|
400
|
+
throw new MerkleUupsUnsupportedError();
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
var WRAPPER_PROBE_ABI = [
|
|
404
|
+
{
|
|
405
|
+
inputs: [],
|
|
406
|
+
name: "underlying",
|
|
407
|
+
outputs: [{ internalType: "address", name: "", type: "address" }],
|
|
408
|
+
stateMutability: "view",
|
|
409
|
+
type: "function"
|
|
410
|
+
}
|
|
411
|
+
];
|
|
412
|
+
function isProbeAnswer(error) {
|
|
413
|
+
if (isContractRevert(error)) return true;
|
|
414
|
+
if (!(error instanceof BaseError)) return false;
|
|
415
|
+
return error.walk((e) => e instanceof ContractFunctionZeroDataError) !== null;
|
|
416
|
+
}
|
|
417
|
+
async function assertStockWrapper(args) {
|
|
418
|
+
if (!args.unwrappable) return;
|
|
419
|
+
let underlying;
|
|
420
|
+
try {
|
|
421
|
+
underlying = await args.publicClient.readContract({
|
|
422
|
+
address: args.token,
|
|
423
|
+
abi: WRAPPER_PROBE_ABI,
|
|
424
|
+
functionName: "underlying"
|
|
425
|
+
});
|
|
426
|
+
} catch (cause) {
|
|
427
|
+
if (!isProbeAnswer(cause)) throw cause;
|
|
428
|
+
throw new NonStockWrapperError({ token: args.token, cause });
|
|
429
|
+
}
|
|
430
|
+
if (isAddressEqual(underlying, zeroAddress)) {
|
|
431
|
+
throw new NonStockWrapperError({ token: args.token });
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
async function assertSaltAvailable(args) {
|
|
435
|
+
const code = await args.publicClient.getCode({ address: args.predictedAddress });
|
|
436
|
+
if (code === void 0 || code === "0x") return;
|
|
437
|
+
throw new SaltCollisionError({
|
|
438
|
+
method: args.method,
|
|
439
|
+
variant: args.variant,
|
|
440
|
+
mode: args.mode,
|
|
441
|
+
deployer: args.deployer,
|
|
442
|
+
userSalt: args.userSalt,
|
|
443
|
+
predictedAddress: args.predictedAddress
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
function assertPredictionFresh(args) {
|
|
447
|
+
if (args.initCodeHashBefore.toLowerCase() === args.initCodeHashAfter.toLowerCase()) return;
|
|
448
|
+
throw new PredictionDriftError({
|
|
449
|
+
method: args.method,
|
|
450
|
+
variant: args.variant,
|
|
451
|
+
initCodeHashBefore: args.initCodeHashBefore,
|
|
452
|
+
initCodeHashAfter: args.initCodeHashAfter,
|
|
453
|
+
predictedAddress: args.predictedAddress
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
async function preflightCreate(args) {
|
|
457
|
+
const method = args.variant === "merkle" ? "createMerkleAirdrop" : "createEcdsaAirdrop";
|
|
458
|
+
const blockers = [];
|
|
459
|
+
collect(blockers, () => assertSupportedChain(args.factory.chainId));
|
|
460
|
+
if (args.variant === "merkle") {
|
|
461
|
+
collect(blockers, () => assertMerkleModeSupported(args.mode));
|
|
462
|
+
}
|
|
463
|
+
const predictArgs = {
|
|
464
|
+
mode: args.mode,
|
|
465
|
+
deployer: args.creator,
|
|
466
|
+
userSalt: args.userSalt
|
|
467
|
+
};
|
|
468
|
+
const predictedAddress = args.variant === "merkle" ? await args.factory.predictMerkleAirdropAddress({ params: args.params, ...predictArgs }) : await args.factory.predictEcdsaAirdropAddress({ params: args.params, ...predictArgs });
|
|
469
|
+
const liveInitCodeHash = args.variant === "merkle" ? await args.factory.getMerkleInitCodeHash({ params: args.params, mode: args.mode }) : await args.factory.getEcdsaInitCodeHash({ params: args.params, mode: args.mode });
|
|
470
|
+
if (args.mode === "uups") {
|
|
471
|
+
const allowed = await args.factory.effectiveUpgradeable(args.creator);
|
|
472
|
+
if (!allowed) {
|
|
473
|
+
blockers.push(
|
|
474
|
+
new UpgradeabilityNotAllowedError({
|
|
475
|
+
method,
|
|
476
|
+
contractAddress: args.factory.address,
|
|
477
|
+
creator: args.creator
|
|
478
|
+
})
|
|
479
|
+
);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
await collectAsync(
|
|
483
|
+
blockers,
|
|
484
|
+
() => assertStockWrapper({
|
|
485
|
+
publicClient: args.factory.publicClient,
|
|
486
|
+
token: args.params.common.token,
|
|
487
|
+
unwrappable: args.params.common.unwrappable
|
|
488
|
+
})
|
|
489
|
+
);
|
|
490
|
+
await collectAsync(
|
|
491
|
+
blockers,
|
|
492
|
+
() => assertSaltAvailable({
|
|
493
|
+
publicClient: args.factory.publicClient,
|
|
494
|
+
predictedAddress,
|
|
495
|
+
variant: args.variant,
|
|
496
|
+
mode: args.mode,
|
|
497
|
+
deployer: args.creator,
|
|
498
|
+
userSalt: args.userSalt,
|
|
499
|
+
method
|
|
500
|
+
})
|
|
501
|
+
);
|
|
502
|
+
if (args.expectedInitCodeHash !== void 0) {
|
|
503
|
+
collect(
|
|
504
|
+
blockers,
|
|
505
|
+
() => assertPredictionFresh({
|
|
506
|
+
variant: args.variant,
|
|
507
|
+
initCodeHashBefore: args.expectedInitCodeHash,
|
|
508
|
+
initCodeHashAfter: liveInitCodeHash,
|
|
509
|
+
predictedAddress,
|
|
510
|
+
method
|
|
511
|
+
})
|
|
512
|
+
);
|
|
513
|
+
}
|
|
514
|
+
return { ready: blockers.length === 0, blockers };
|
|
515
|
+
}
|
|
516
|
+
async function preflightClaim(args) {
|
|
517
|
+
const { airdrop, claimant } = args;
|
|
518
|
+
const method = "preflightClaim";
|
|
519
|
+
const blockers = [];
|
|
520
|
+
collect(blockers, () => assertSupportedChain(airdrop.chainId));
|
|
521
|
+
const [started, ended, paused, fee, balance] = await Promise.all([
|
|
522
|
+
airdrop.hasClaimStarted(),
|
|
523
|
+
airdrop.hasClaimEnded(),
|
|
524
|
+
airdrop.paused(),
|
|
525
|
+
airdrop.gasFee(),
|
|
526
|
+
airdrop.publicClient.getBalance({ address: claimant })
|
|
527
|
+
]);
|
|
528
|
+
if (paused) {
|
|
529
|
+
blockers.push(new PausedError({ method, contractAddress: airdrop.address }));
|
|
530
|
+
}
|
|
531
|
+
if (!started) {
|
|
532
|
+
blockers.push(
|
|
533
|
+
new ClaimNotStartedError({
|
|
534
|
+
method,
|
|
535
|
+
contractAddress: airdrop.address,
|
|
536
|
+
startTime: await airdrop.startTime()
|
|
537
|
+
})
|
|
538
|
+
);
|
|
539
|
+
}
|
|
540
|
+
if (ended) {
|
|
541
|
+
blockers.push(
|
|
542
|
+
new ClaimWindowClosedError({
|
|
543
|
+
method,
|
|
544
|
+
contractAddress: airdrop.address,
|
|
545
|
+
endTime: await airdrop.endTime()
|
|
546
|
+
})
|
|
547
|
+
);
|
|
548
|
+
}
|
|
549
|
+
if (balance < fee) {
|
|
550
|
+
blockers.push(
|
|
551
|
+
new InsufficientFeeError({
|
|
552
|
+
method,
|
|
553
|
+
contractAddress: airdrop.address,
|
|
554
|
+
feeKind: "gas",
|
|
555
|
+
provided: balance,
|
|
556
|
+
required: fee
|
|
557
|
+
})
|
|
558
|
+
);
|
|
559
|
+
}
|
|
560
|
+
if (args.signature && airdrop.isSignatureValid) {
|
|
561
|
+
const valid = await airdrop.isSignatureValid({ recipient: claimant, ...args.signature });
|
|
562
|
+
if (!valid) {
|
|
563
|
+
blockers.push(new InvalidSignatureError({ method, contractAddress: airdrop.address }));
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
return { ready: blockers.length === 0, blockers };
|
|
567
|
+
}
|
|
568
|
+
function collect(blockers, run) {
|
|
569
|
+
try {
|
|
570
|
+
run();
|
|
571
|
+
} catch (err) {
|
|
572
|
+
if (!isTokenOpsSdkError(err)) throw err;
|
|
573
|
+
blockers.push(err);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
async function collectAsync(blockers, run) {
|
|
577
|
+
try {
|
|
578
|
+
await run();
|
|
579
|
+
} catch (err) {
|
|
580
|
+
if (!isTokenOpsSdkError(err)) throw err;
|
|
581
|
+
blockers.push(err);
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
export { AIRDROP_CONTRACTS_COMMIT, AlreadyClaimedError, ClaimNotStartedError, ClaimWindowClosedError, DEDUP_MODE, DEPLOYMENT_MODE, DedupIdConsumedError, FeeCollectorSelfAdministeredError, MerkleUupsUnsupportedError, NonStockWrapperError, PredictionDriftError, SaltCollisionError, SignatureExpiredError, UpgradeabilityNotAllowedError, airdropProductMapper, assertMerkleModeSupported, assertPredictionFresh, assertSaltAvailable, assertStockWrapper, assertSupportedChain, preflightClaim, preflightCreate };
|