@tokenops/sdk 2.0.0-alpha.1 → 2.0.0-alpha.3
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 +67 -2
- package/README.md +14 -8
- package/dist/{chunk-PUX5VXDB.cjs → chunk-4AWQJQXY.cjs} +1415 -69
- package/dist/{chunk-74QFZ5MK.js → chunk-4IB4IY5Y.js} +1 -1
- package/dist/{chunk-DZHYSUGY.js → chunk-6HCT4QIX.js} +12 -5
- package/dist/{chunk-FGEB7RMY.cjs → chunk-6XOAYDC6.cjs} +4 -4
- package/dist/{chunk-XAYGD4E4.cjs → chunk-AHU2HMNE.cjs} +3 -3
- package/dist/{chunk-6NAVMWZQ.js → chunk-BPIVVCSQ.js} +2 -2
- package/dist/{chunk-GKKDAW44.js → chunk-BXX5TETM.js} +1401 -59
- package/dist/{chunk-456VDDA3.js → chunk-GCJFAY4X.js} +78 -25
- package/dist/{chunk-CTED3MTR.cjs → chunk-GKYZQJGP.cjs} +82 -29
- package/dist/{chunk-JZLGCTGK.cjs → chunk-IEKTGJ4J.cjs} +2 -2
- package/dist/{chunk-6PXXGACR.cjs → chunk-JVNJSDQ4.cjs} +2 -2
- package/dist/{chunk-O5676ZWY.js → chunk-LEYYG4RF.js} +232 -6
- package/dist/{chunk-335Z2W67.js → chunk-NGU4JYIR.js} +1 -1
- package/dist/{chunk-5576FRT3.cjs → chunk-PG3WXT3K.cjs} +12 -5
- package/dist/{chunk-H5POPGOZ.js → chunk-PK6Q6J5F.js} +1 -1
- package/dist/chunk-TND5NDV7.cjs +263 -0
- package/dist/chunk-U3TBQRT7.js +253 -0
- package/dist/{chunk-EAJ7SYHE.js → chunk-WRWRA4TN.js} +1 -1
- package/dist/{chunk-JQYC66TO.cjs → chunk-YABHXJNH.cjs} +5 -5
- package/dist/{chunk-M4IT6DNJ.cjs → chunk-YTIYTV4K.cjs} +236 -4
- package/dist/core/addresses.d.ts +4 -4
- package/dist/core/errors.d.ts +1 -1
- package/dist/fhe/types.d.ts +2 -2
- package/dist/fhe-airdrop/abis/airdrop-base.d.ts +19 -0
- package/dist/fhe-airdrop/abis/ecdsa.d.ts +19 -0
- package/dist/fhe-airdrop/abis/factory.d.ts +113 -0
- package/dist/fhe-airdrop/abis/merkle.d.ts +43 -12
- package/dist/fhe-airdrop/advanced/index.cjs +4 -4
- package/dist/fhe-airdrop/advanced/index.js +1 -1
- package/dist/fhe-airdrop/advanced/react/index.cjs +620 -9
- package/dist/fhe-airdrop/advanced/react/index.d.cts +35 -0
- package/dist/fhe-airdrop/advanced/react/index.d.ts +35 -0
- package/dist/fhe-airdrop/advanced/react/index.js +590 -7
- package/dist/fhe-airdrop/advanced/react/useClearCompliancePolicy.d.ts +28 -0
- package/dist/fhe-airdrop/advanced/react/useClearUpgradeabilityPolicy.d.ts +26 -0
- package/dist/fhe-airdrop/advanced/react/useDisableCustomFee.d.ts +26 -0
- package/dist/fhe-airdrop/advanced/react/useEcdsaInitCodeHash.d.ts +30 -0
- package/dist/fhe-airdrop/advanced/react/useFactoryComplianceDelegate.d.ts +25 -0
- package/dist/fhe-airdrop/advanced/react/useFactoryCompliancePolicy.d.ts +38 -0
- package/dist/fhe-airdrop/advanced/react/useFactoryCustomFee.d.ts +24 -0
- package/dist/fhe-airdrop/advanced/react/useFactoryGrantRole.d.ts +32 -0
- package/dist/fhe-airdrop/advanced/react/useFactoryHasRole.d.ts +27 -0
- package/dist/fhe-airdrop/advanced/react/useFactoryImplementations.d.ts +33 -0
- package/dist/fhe-airdrop/advanced/react/useFactoryRenounceRole.d.ts +37 -0
- package/dist/fhe-airdrop/advanced/react/useFactoryRevokeRole.d.ts +37 -0
- package/dist/fhe-airdrop/advanced/react/useFactoryRoleConstants.d.ts +46 -0
- package/dist/fhe-airdrop/advanced/react/useFactoryRoleMembers.d.ts +48 -0
- package/dist/fhe-airdrop/advanced/react/useFactoryUpgradeabilityPolicy.d.ts +39 -0
- package/dist/fhe-airdrop/advanced/react/useMerkleInitCodeHash.d.ts +24 -0
- package/dist/fhe-airdrop/advanced/react/useSetComplianceDelegate.d.ts +33 -0
- package/dist/fhe-airdrop/advanced/react/useSetComplianceManagerImpl.d.ts +27 -0
- package/dist/fhe-airdrop/advanced/react/useSetCompliancePolicy.d.ts +28 -0
- package/dist/fhe-airdrop/advanced/react/useSetCustomFee.d.ts +29 -0
- package/dist/fhe-airdrop/advanced/react/useSetDefaultDelegateToCompliance.d.ts +31 -0
- package/dist/fhe-airdrop/advanced/react/useSetDefaultGasFee.d.ts +30 -0
- package/dist/fhe-airdrop/advanced/react/useSetDefaultUpgradeable.d.ts +27 -0
- package/dist/fhe-airdrop/advanced/react/useSetEcdsaImplementation.d.ts +34 -0
- package/dist/fhe-airdrop/advanced/react/useSetFeeCollector.d.ts +27 -0
- package/dist/fhe-airdrop/advanced/react/useSetMaxGasFee.d.ts +33 -0
- package/dist/fhe-airdrop/advanced/react/useSetMerkleImplementation.d.ts +30 -0
- package/dist/fhe-airdrop/advanced/react/useSetUpgradeabilityPolicy.d.ts +31 -0
- package/dist/fhe-airdrop/airdrop-base.d.ts +55 -8
- package/dist/fhe-airdrop/campaign.d.ts +61 -20
- package/dist/fhe-airdrop/constants.d.ts +9 -1
- package/dist/fhe-airdrop/ecdsa.d.ts +13 -0
- package/dist/fhe-airdrop/errors.d.ts +87 -0
- package/dist/fhe-airdrop/factory.d.ts +62 -22
- package/dist/fhe-airdrop/guards.d.ts +133 -4
- package/dist/fhe-airdrop/index.cjs +86 -971
- package/dist/fhe-airdrop/index.d.cts +4 -4
- package/dist/fhe-airdrop/index.d.ts +4 -4
- package/dist/fhe-airdrop/index.js +8 -927
- package/dist/fhe-airdrop/merkle-tree.d.ts +32 -38
- package/dist/fhe-airdrop/merkle.d.ts +52 -31
- package/dist/fhe-airdrop/react/_shared.d.ts +13 -0
- package/dist/fhe-airdrop/react/index.cjs +997 -87
- package/dist/fhe-airdrop/react/index.d.cts +53 -4
- package/dist/fhe-airdrop/react/index.d.ts +53 -4
- package/dist/fhe-airdrop/react/index.js +887 -27
- package/dist/fhe-airdrop/react/keys.d.ts +98 -0
- package/dist/fhe-airdrop/react/useAccessEcdsaClaimAmount.d.ts +26 -0
- package/dist/fhe-airdrop/react/useAccessMerkleClaimAmount.d.ts +27 -0
- package/dist/fhe-airdrop/react/useAddComplianceDelegate.d.ts +37 -0
- package/dist/fhe-airdrop/react/useAdminBatchDiscloseBalanceToParties.d.ts +36 -0
- package/dist/fhe-airdrop/react/useAdminDiscloseBalanceToParty.d.ts +31 -0
- package/dist/fhe-airdrop/react/useAdminGetCurrentBalance.d.ts +27 -0
- package/dist/fhe-airdrop/react/useAirdropConfig.d.ts +49 -0
- package/dist/fhe-airdrop/react/useAirdropDeploymentMode.d.ts +28 -0
- package/dist/fhe-airdrop/react/useAirdropGrantRole.d.ts +35 -0
- package/dist/fhe-airdrop/react/useAirdropRenounceRole.d.ts +36 -0
- package/dist/fhe-airdrop/react/useAirdropRevokeRole.d.ts +33 -0
- package/dist/fhe-airdrop/react/useAirdropRoleAdmin.d.ts +28 -0
- package/dist/fhe-airdrop/react/useAirdropRoleConstants.d.ts +67 -0
- package/dist/fhe-airdrop/react/useAirdropRoleMembers.d.ts +49 -0
- package/dist/fhe-airdrop/react/useAirdropUpgradeToAndCall.d.ts +45 -0
- package/dist/fhe-airdrop/react/useBatchDiscloseHandlesToParty.d.ts +32 -0
- package/dist/fhe-airdrop/react/useBuildMerkleCampaign.d.ts +68 -0
- package/dist/fhe-airdrop/react/useComplianceGrantRole.d.ts +32 -0
- package/dist/fhe-airdrop/react/useComplianceHasRole.d.ts +37 -0
- package/dist/fhe-airdrop/react/useComplianceInfo.d.ts +50 -0
- package/dist/fhe-airdrop/react/useComplianceManagerOf.d.ts +32 -0
- package/dist/fhe-airdrop/react/useComplianceRenounceRole.d.ts +38 -0
- package/dist/fhe-airdrop/react/useComplianceRevokeRole.d.ts +36 -0
- package/dist/fhe-airdrop/react/useComplianceRoleConstants.d.ts +41 -0
- package/dist/fhe-airdrop/react/useComplianceRoleMembers.d.ts +45 -0
- package/dist/fhe-airdrop/react/useCreateAndFundEcdsaAirdrop.d.ts +55 -0
- package/dist/fhe-airdrop/react/useCreateAndFundMerkleAirdrop.d.ts +52 -0
- package/dist/fhe-airdrop/react/useDiscloseHandleToParty.d.ts +35 -0
- package/dist/fhe-airdrop/react/useEcdsaClaim.d.ts +4 -3
- package/dist/fhe-airdrop/react/useEcdsaClaimAndUnwrap.d.ts +27 -0
- package/dist/fhe-airdrop/react/useEcdsaDomain.d.ts +41 -0
- package/dist/fhe-airdrop/react/useEffectiveDelegateToCompliance.d.ts +26 -0
- package/dist/fhe-airdrop/react/useEncryptCampaignAmounts.d.ts +59 -0
- package/dist/fhe-airdrop/react/useFactoryFees.d.ts +11 -4
- package/dist/fhe-airdrop/react/useIsActiveDelegate.d.ts +29 -0
- package/dist/fhe-airdrop/react/useIsAirdrop.d.ts +44 -0
- package/dist/fhe-airdrop/react/useIsMerkleRootMutable.d.ts +21 -0
- package/dist/fhe-airdrop/react/useIsSignatureValid.d.ts +46 -0
- package/dist/fhe-airdrop/react/useMerkleClaim.d.ts +7 -19
- package/dist/fhe-airdrop/react/useMerkleClaimAndUnwrap.d.ts +29 -0
- package/dist/fhe-airdrop/react/usePlanMerkleCampaign.d.ts +53 -0
- package/dist/fhe-airdrop/react/usePreflightClaim.d.ts +46 -0
- package/dist/fhe-airdrop/react/usePreflightCreateAirdrop.d.ts +67 -0
- package/dist/fhe-airdrop/react/useRefreshComplianceBalance.d.ts +36 -0
- package/dist/fhe-airdrop/react/useRescueERC20.d.ts +30 -0
- package/dist/fhe-airdrop/react/useRescueOtherConfidentialToken.d.ts +34 -0
- package/dist/fhe-airdrop/react/useResolveGasFee.d.ts +30 -0
- package/dist/fhe-airdrop/react/useRevokeComplianceDelegate.d.ts +37 -0
- package/dist/fhe-airdrop/react/useRotateMerkleRoot.d.ts +52 -0
- package/dist/fhe-airdrop/react/useSignClaimAuthorization.d.ts +42 -0
- package/dist/fhe-airdrop/react/useWithdrawGasFee.d.ts +37 -0
- package/dist/fhe-airdrop/types.d.ts +27 -1
- package/dist/fhe-disperse/index.cjs +21 -21
- package/dist/fhe-disperse/index.js +2 -2
- package/dist/fhe-disperse/react/index.cjs +22 -22
- package/dist/fhe-disperse/react/index.js +3 -3
- package/dist/fhe-vesting/advanced/index.cjs +5 -5
- package/dist/fhe-vesting/advanced/index.js +3 -3
- package/dist/fhe-vesting/advanced/react/index.cjs +7 -7
- package/dist/fhe-vesting/advanced/react/index.js +4 -4
- package/dist/fhe-vesting/index.cjs +8 -8
- package/dist/fhe-vesting/index.js +2 -2
- package/dist/fhe-vesting/react/index.cjs +114 -114
- package/dist/fhe-vesting/react/index.js +3 -3
- package/dist/index.cjs +18 -18
- package/dist/index.js +1 -1
- package/dist/testnet-faucet/index.cjs +14 -14
- package/dist/testnet-faucet/index.js +2 -2
- package/dist/testnet-faucet/react/index.cjs +8 -8
- package/dist/testnet-faucet/react/index.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-NCVX3K2N.cjs +0 -161
- package/dist/chunk-VP2B4WM2.js +0 -154
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { createConfidentialAirdropFactoryClient, resolveEncryptor, createAirdropBaseClient, createMerkleAirdropClient, createComplianceManagerClient, createEcdsaAirdropClient } from './chunk-BXX5TETM.js';
|
|
2
|
+
import { getFheAirdropFactoryAddress } from './chunk-6HCT4QIX.js';
|
|
3
|
+
import { DeploymentAddressUnavailableError } from './chunk-QBJ7O2B4.js';
|
|
4
|
+
import { useRef, useMemo } from 'react';
|
|
5
|
+
import { usePublicClient, useWalletClient } from 'wagmi';
|
|
6
|
+
|
|
7
|
+
var FHE_AIRDROP_KEY = "tokenops-sdk";
|
|
8
|
+
var FHE_AIRDROP_NAMESPACE = "fhe-airdrop";
|
|
9
|
+
function airdropQueryKey(params) {
|
|
10
|
+
return [
|
|
11
|
+
FHE_AIRDROP_KEY,
|
|
12
|
+
FHE_AIRDROP_NAMESPACE,
|
|
13
|
+
params.chainId ?? null,
|
|
14
|
+
params.address ? normalizeKeyArg(params.address) : null,
|
|
15
|
+
params.fn,
|
|
16
|
+
params.args.map(normalizeKeyArg)
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
function airdropQueryKeyPrefix(params) {
|
|
20
|
+
const prefix = [
|
|
21
|
+
FHE_AIRDROP_KEY,
|
|
22
|
+
FHE_AIRDROP_NAMESPACE,
|
|
23
|
+
params.chainId ?? null,
|
|
24
|
+
params.address ? normalizeKeyArg(params.address) : null
|
|
25
|
+
];
|
|
26
|
+
if (params.fn !== void 0) prefix.push(params.fn);
|
|
27
|
+
return prefix;
|
|
28
|
+
}
|
|
29
|
+
function normalizeKeyArg(value) {
|
|
30
|
+
if (typeof value === "bigint") return value.toString();
|
|
31
|
+
if (Array.isArray(value)) return value.map(normalizeKeyArg);
|
|
32
|
+
if (value && typeof value === "object") {
|
|
33
|
+
return Object.fromEntries(
|
|
34
|
+
Object.entries(value).map(([k, v]) => [k, normalizeKeyArg(v)])
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
if (typeof value === "string" && value.startsWith("0x")) return value.toLowerCase();
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
function tryResolveAirdropFactoryAddress(override, chainId) {
|
|
41
|
+
if (override) return override;
|
|
42
|
+
if (chainId === void 0) return void 0;
|
|
43
|
+
return getFheAirdropFactoryAddress(chainId);
|
|
44
|
+
}
|
|
45
|
+
function computeAirdropFactoryResolutionError(override, chainId) {
|
|
46
|
+
if (override) return void 0;
|
|
47
|
+
if (chainId === void 0) {
|
|
48
|
+
return new DeploymentAddressUnavailableError({
|
|
49
|
+
reason: "chain-id-missing",
|
|
50
|
+
product: "fheAirdrop",
|
|
51
|
+
contract: "airdropFactory",
|
|
52
|
+
clientLabel: "ConfidentialAirdropFactoryClient"
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const resolved = getFheAirdropFactoryAddress(chainId);
|
|
56
|
+
if (!resolved) {
|
|
57
|
+
return new DeploymentAddressUnavailableError({
|
|
58
|
+
reason: "registry-not-deployed",
|
|
59
|
+
product: "fheAirdrop",
|
|
60
|
+
contract: "airdropFactory",
|
|
61
|
+
chainId,
|
|
62
|
+
clientLabel: "ConfidentialAirdropFactoryClient"
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return void 0;
|
|
66
|
+
}
|
|
67
|
+
function useMemoAirdropFactoryClient(opts = {}) {
|
|
68
|
+
const publicClient = usePublicClient({ chainId: opts.chainId });
|
|
69
|
+
const { data: walletClient } = useWalletClient({ chainId: opts.chainId });
|
|
70
|
+
const chainId = opts.chainId ?? publicClient?.chain?.id;
|
|
71
|
+
const resolvedAddress = tryResolveAirdropFactoryAddress(opts.address, chainId);
|
|
72
|
+
const resolutionError = computeAirdropFactoryResolutionError(opts.address, chainId);
|
|
73
|
+
const encryptorSourceRef = useRef(opts.encryptor);
|
|
74
|
+
encryptorSourceRef.current = opts.encryptor;
|
|
75
|
+
const telemetry = opts.telemetry;
|
|
76
|
+
const client = useMemo(() => {
|
|
77
|
+
if (!publicClient) return void 0;
|
|
78
|
+
if (!resolvedAddress) return void 0;
|
|
79
|
+
return createConfidentialAirdropFactoryClient({
|
|
80
|
+
publicClient,
|
|
81
|
+
...walletClient ? { walletClient } : {},
|
|
82
|
+
address: resolvedAddress,
|
|
83
|
+
...chainId !== void 0 ? { chainId } : {},
|
|
84
|
+
// Lazy — invoked per-encryption inside the headless client.
|
|
85
|
+
encryptor: () => resolveEncryptor(encryptorSourceRef.current),
|
|
86
|
+
...telemetry ? { telemetry } : {}
|
|
87
|
+
});
|
|
88
|
+
}, [publicClient, walletClient, resolvedAddress, chainId, telemetry]);
|
|
89
|
+
return {
|
|
90
|
+
client,
|
|
91
|
+
resolutionError,
|
|
92
|
+
publicClient,
|
|
93
|
+
walletClient: walletClient ?? void 0,
|
|
94
|
+
chainId,
|
|
95
|
+
resolvedAddress
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function useMemoAirdropBaseClient(opts) {
|
|
99
|
+
const publicClient = usePublicClient({ chainId: opts.chainId });
|
|
100
|
+
const { data: walletClient } = useWalletClient({ chainId: opts.chainId });
|
|
101
|
+
const chainId = opts.chainId ?? publicClient?.chain?.id;
|
|
102
|
+
const telemetry = opts.telemetry;
|
|
103
|
+
const client = useMemo(() => {
|
|
104
|
+
if (!publicClient) return void 0;
|
|
105
|
+
if (!opts.address) return void 0;
|
|
106
|
+
return createAirdropBaseClient({
|
|
107
|
+
publicClient,
|
|
108
|
+
...walletClient ? { walletClient } : {},
|
|
109
|
+
address: opts.address,
|
|
110
|
+
...chainId !== void 0 ? { chainId } : {},
|
|
111
|
+
...telemetry ? { telemetry } : {}
|
|
112
|
+
});
|
|
113
|
+
}, [publicClient, walletClient, opts.address, chainId, telemetry]);
|
|
114
|
+
return { client, publicClient, walletClient: walletClient ?? void 0, chainId };
|
|
115
|
+
}
|
|
116
|
+
function useMemoMerkleAirdropClient(opts) {
|
|
117
|
+
const publicClient = usePublicClient({ chainId: opts.chainId });
|
|
118
|
+
const { data: walletClient } = useWalletClient({ chainId: opts.chainId });
|
|
119
|
+
const chainId = opts.chainId ?? publicClient?.chain?.id;
|
|
120
|
+
const telemetry = opts.telemetry;
|
|
121
|
+
const client = useMemo(() => {
|
|
122
|
+
if (!publicClient) return void 0;
|
|
123
|
+
if (!opts.address) return void 0;
|
|
124
|
+
return createMerkleAirdropClient({
|
|
125
|
+
publicClient,
|
|
126
|
+
...walletClient ? { walletClient } : {},
|
|
127
|
+
address: opts.address,
|
|
128
|
+
...chainId !== void 0 ? { chainId } : {},
|
|
129
|
+
...telemetry ? { telemetry } : {}
|
|
130
|
+
});
|
|
131
|
+
}, [publicClient, walletClient, opts.address, chainId, telemetry]);
|
|
132
|
+
return { client, publicClient, walletClient: walletClient ?? void 0, chainId };
|
|
133
|
+
}
|
|
134
|
+
function useMemoComplianceManagerClient(opts) {
|
|
135
|
+
const publicClient = usePublicClient({ chainId: opts.chainId });
|
|
136
|
+
const { data: walletClient } = useWalletClient({ chainId: opts.chainId });
|
|
137
|
+
const chainId = opts.chainId ?? publicClient?.chain?.id;
|
|
138
|
+
const telemetry = opts.telemetry;
|
|
139
|
+
const client = useMemo(() => {
|
|
140
|
+
if (!publicClient) return void 0;
|
|
141
|
+
if (!opts.address) return void 0;
|
|
142
|
+
return createComplianceManagerClient({
|
|
143
|
+
publicClient,
|
|
144
|
+
...walletClient ? { walletClient } : {},
|
|
145
|
+
address: opts.address,
|
|
146
|
+
...chainId !== void 0 ? { chainId } : {},
|
|
147
|
+
...telemetry ? { telemetry } : {}
|
|
148
|
+
});
|
|
149
|
+
}, [publicClient, walletClient, opts.address, chainId, telemetry]);
|
|
150
|
+
return { client, publicClient, walletClient: walletClient ?? void 0, chainId };
|
|
151
|
+
}
|
|
152
|
+
function useMemoEcdsaAirdropClient(opts) {
|
|
153
|
+
const publicClient = usePublicClient({ chainId: opts.chainId });
|
|
154
|
+
const { data: walletClient } = useWalletClient({ chainId: opts.chainId });
|
|
155
|
+
const chainId = opts.chainId ?? publicClient?.chain?.id;
|
|
156
|
+
const telemetry = opts.telemetry;
|
|
157
|
+
const client = useMemo(() => {
|
|
158
|
+
if (!publicClient) return void 0;
|
|
159
|
+
if (!opts.address) return void 0;
|
|
160
|
+
return createEcdsaAirdropClient({
|
|
161
|
+
publicClient,
|
|
162
|
+
...walletClient ? { walletClient } : {},
|
|
163
|
+
address: opts.address,
|
|
164
|
+
dedupMode: opts.dedupMode,
|
|
165
|
+
...chainId !== void 0 ? { chainId } : {},
|
|
166
|
+
...telemetry ? { telemetry } : {}
|
|
167
|
+
});
|
|
168
|
+
}, [publicClient, walletClient, opts.address, opts.dedupMode, chainId, telemetry]);
|
|
169
|
+
return { client, publicClient, walletClient: walletClient ?? void 0, chainId };
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// src/fhe-airdrop/react/keys.ts
|
|
173
|
+
var AIRDROP_FN = {
|
|
174
|
+
// instance reads
|
|
175
|
+
claimedAmount: "getClaimedAmount",
|
|
176
|
+
paused: "paused",
|
|
177
|
+
window: "window",
|
|
178
|
+
config: "config",
|
|
179
|
+
merkleRoot: "merkleRoot",
|
|
180
|
+
merkleRootMutable: "isMerkleRootMutable",
|
|
181
|
+
hasRole: "hasRole",
|
|
182
|
+
roleMembers: "roleMembers",
|
|
183
|
+
gasFee: "gasFee",
|
|
184
|
+
preflightCreate: "preflightCreate",
|
|
185
|
+
isSignatureValid: "isSignatureValid",
|
|
186
|
+
// factory reads
|
|
187
|
+
fees: "fees",
|
|
188
|
+
registry: "registry",
|
|
189
|
+
isAirdrop: "isAirdrop",
|
|
190
|
+
resolvedGasFee: "resolvedGasFee",
|
|
191
|
+
customFee: "customFee",
|
|
192
|
+
implementations: "implementations",
|
|
193
|
+
compliancePolicy: "compliancePolicy",
|
|
194
|
+
upgradeabilityPolicy: "upgradeabilityPolicy",
|
|
195
|
+
factoryHasRole: "factoryHasRole",
|
|
196
|
+
factoryRoleMembers: "factoryRoleMembers",
|
|
197
|
+
// compliance-manager reads
|
|
198
|
+
complianceInfo: "complianceInfo",
|
|
199
|
+
activeDelegate: "isActiveDelegate",
|
|
200
|
+
clientDelegates: "clientDelegates",
|
|
201
|
+
complianceHasRole: "complianceHasRole",
|
|
202
|
+
complianceRoleMembers: "complianceRoleMembers"
|
|
203
|
+
};
|
|
204
|
+
var airdropKeys = {
|
|
205
|
+
/** One account's cumulative delivered total. Keyed on the CLAIM IDENTITY, never the sender. */
|
|
206
|
+
claimedAmount: (s, account) => airdropQueryKey({ ...s, fn: AIRDROP_FN.claimedAmount, args: [account] }),
|
|
207
|
+
paused: (s) => airdropQueryKey({ ...s, fn: AIRDROP_FN.paused, args: [] }),
|
|
208
|
+
window: (s) => airdropQueryKey({ ...s, fn: AIRDROP_FN.window, args: [] }),
|
|
209
|
+
config: (s) => airdropQueryKey({ ...s, fn: AIRDROP_FN.config, args: [] }),
|
|
210
|
+
gasFee: (s) => airdropQueryKey({ ...s, fn: AIRDROP_FN.gasFee, args: [] }),
|
|
211
|
+
merkleRoot: (s) => airdropQueryKey({ ...s, fn: AIRDROP_FN.merkleRoot, args: [] }),
|
|
212
|
+
merkleRootMutable: (s) => airdropQueryKey({ ...s, fn: AIRDROP_FN.merkleRootMutable, args: [] }),
|
|
213
|
+
hasRole: (s, role, holder) => airdropQueryKey({ ...s, fn: AIRDROP_FN.hasRole, args: [role, holder] }),
|
|
214
|
+
/** Every cached `hasRole` for this instance, whatever role/holder pair was queried. */
|
|
215
|
+
hasRoleAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.hasRole }),
|
|
216
|
+
roleMembers: (s, role) => airdropQueryKey({ ...s, fn: AIRDROP_FN.roleMembers, args: [role] }),
|
|
217
|
+
roleMembersAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.roleMembers }),
|
|
218
|
+
/** Every cached create-preflight, whatever params/mode/salt combination was queried. */
|
|
219
|
+
preflightCreateAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.preflightCreate }),
|
|
220
|
+
/** Every cached signature check on this instance; a claim consumes a digest and flips it. */
|
|
221
|
+
isSignatureValidAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.isSignatureValid }),
|
|
222
|
+
fees: (s) => airdropQueryKey({ ...s, fn: AIRDROP_FN.fees, args: [] }),
|
|
223
|
+
customFee: (s, creator) => airdropQueryKey({ ...s, fn: AIRDROP_FN.customFee, args: [creator] }),
|
|
224
|
+
customFeeAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.customFee }),
|
|
225
|
+
resolvedGasFee: (s, creator) => airdropQueryKey({ ...s, fn: AIRDROP_FN.resolvedGasFee, args: [creator] }),
|
|
226
|
+
/** Every creator's resolved fee; the default and any override both move it. */
|
|
227
|
+
resolvedGasFeeAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.resolvedGasFee }),
|
|
228
|
+
/** Every registry page, whatever offset/limit was queried. */
|
|
229
|
+
registryAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.registry }),
|
|
230
|
+
isAirdrop: (s, candidate) => airdropQueryKey({ ...s, fn: AIRDROP_FN.isAirdrop, args: [candidate] }),
|
|
231
|
+
/** Every genuineness answer from this factory; a create adds one address. */
|
|
232
|
+
isAirdropAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.isAirdrop }),
|
|
233
|
+
implementations: (s) => airdropQueryKey({ ...s, fn: AIRDROP_FN.implementations, args: [] }),
|
|
234
|
+
compliancePolicy: (s, creator) => airdropQueryKey({ ...s, fn: AIRDROP_FN.compliancePolicy, args: [creator] }),
|
|
235
|
+
compliancePolicyAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.compliancePolicy }),
|
|
236
|
+
upgradeabilityPolicy: (s, creator) => airdropQueryKey({ ...s, fn: AIRDROP_FN.upgradeabilityPolicy, args: [creator] }),
|
|
237
|
+
upgradeabilityPolicyAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.upgradeabilityPolicy }),
|
|
238
|
+
factoryHasRole: (s, role, holder) => airdropQueryKey({ ...s, fn: AIRDROP_FN.factoryHasRole, args: [role, holder] }),
|
|
239
|
+
factoryHasRoleAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.factoryHasRole }),
|
|
240
|
+
factoryRoleMembers: (s, role) => airdropQueryKey({ ...s, fn: AIRDROP_FN.factoryRoleMembers, args: [role] }),
|
|
241
|
+
factoryRoleMembersAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.factoryRoleMembers }),
|
|
242
|
+
complianceInfo: (s) => airdropQueryKey({ ...s, fn: AIRDROP_FN.complianceInfo, args: [] }),
|
|
243
|
+
activeDelegate: (s, delegate) => airdropQueryKey({ ...s, fn: AIRDROP_FN.activeDelegate, args: [delegate] }),
|
|
244
|
+
activeDelegateAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.activeDelegate }),
|
|
245
|
+
clientDelegates: (s, index) => airdropQueryKey({ ...s, fn: AIRDROP_FN.clientDelegates, args: [index] }),
|
|
246
|
+
clientDelegatesAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.clientDelegates }),
|
|
247
|
+
complianceHasRole: (s, role, holder) => airdropQueryKey({ ...s, fn: AIRDROP_FN.complianceHasRole, args: [role, holder] }),
|
|
248
|
+
complianceHasRoleAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.complianceHasRole }),
|
|
249
|
+
complianceRoleMembers: (s, role) => airdropQueryKey({ ...s, fn: AIRDROP_FN.complianceRoleMembers, args: [role] }),
|
|
250
|
+
complianceRoleMembersAll: (s) => airdropQueryKeyPrefix({ ...s, fn: AIRDROP_FN.complianceRoleMembers })
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
export { AIRDROP_FN, airdropKeys, airdropQueryKey, airdropQueryKeyPrefix, useMemoAirdropBaseClient, useMemoAirdropFactoryClient, useMemoComplianceManagerClient, useMemoEcdsaAirdropClient, useMemoMerkleAirdropClient };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SDK_VERSION } from './chunk-NWFMBLSQ.js';
|
|
2
2
|
import { mapContractRevert, isContractRevert } from './chunk-4RAAATVY.js';
|
|
3
|
-
import { getFheVestingFactoryAddress } from './chunk-
|
|
3
|
+
import { getFheVestingFactoryAddress } from './chunk-6HCT4QIX.js';
|
|
4
4
|
import { normaliseAddress } from './chunk-ZA673I3O.js';
|
|
5
5
|
import { asTxHash } from './chunk-KWFFIJYX.js';
|
|
6
6
|
import { DeploymentAddressUnavailableError, TokenOpsSdkError, MissingWalletClientError, MissingAccountError } from './chunk-QBJ7O2B4.js';
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
var chunkWJLECC22_cjs = require('./chunk-WJLECC22.cjs');
|
|
4
4
|
var chunk3QHNYEQD_cjs = require('./chunk-3QHNYEQD.cjs');
|
|
5
|
-
var
|
|
6
|
-
var
|
|
5
|
+
var chunkJVNJSDQ4_cjs = require('./chunk-JVNJSDQ4.cjs');
|
|
6
|
+
var chunkPG3WXT3K_cjs = require('./chunk-PG3WXT3K.cjs');
|
|
7
7
|
var chunk67OV5CX2_cjs = require('./chunk-67OV5CX2.cjs');
|
|
8
8
|
var react = require('react');
|
|
9
9
|
var wagmi = require('wagmi');
|
|
@@ -26,7 +26,7 @@ function useHookFiredEvent(hookName, telemetry, hasWallet, chainId) {
|
|
|
26
26
|
function tryResolveFactoryAddress(override, chainId) {
|
|
27
27
|
if (override) return override;
|
|
28
28
|
if (chainId === void 0) return void 0;
|
|
29
|
-
return
|
|
29
|
+
return chunkPG3WXT3K_cjs.getFheVestingFactoryAddress(chainId);
|
|
30
30
|
}
|
|
31
31
|
function useMemoFactoryClient(opts = {}) {
|
|
32
32
|
const publicClient = wagmi.usePublicClient({ chainId: opts.chainId });
|
|
@@ -39,7 +39,7 @@ function useMemoFactoryClient(opts = {}) {
|
|
|
39
39
|
const client = react.useMemo(() => {
|
|
40
40
|
if (!publicClient) return void 0;
|
|
41
41
|
if (!resolvedAddress) return void 0;
|
|
42
|
-
return
|
|
42
|
+
return chunkJVNJSDQ4_cjs.createConfidentialVestingFactoryClient({
|
|
43
43
|
publicClient,
|
|
44
44
|
...walletClient ? { walletClient } : {},
|
|
45
45
|
address: resolvedAddress,
|
|
@@ -66,7 +66,7 @@ function computeFactoryResolutionError(override, chainId) {
|
|
|
66
66
|
clientLabel: "ConfidentialVestingFactoryClient"
|
|
67
67
|
});
|
|
68
68
|
}
|
|
69
|
-
const resolved =
|
|
69
|
+
const resolved = chunkPG3WXT3K_cjs.getFheVestingFactoryAddress(chainId);
|
|
70
70
|
if (!resolved) {
|
|
71
71
|
return new chunk67OV5CX2_cjs.DeploymentAddressUnavailableError({
|
|
72
72
|
reason: "registry-not-deployed",
|
|
@@ -5,9 +5,10 @@ var chunk67OV5CX2_cjs = require('./chunk-67OV5CX2.cjs');
|
|
|
5
5
|
var viem = require('viem');
|
|
6
6
|
|
|
7
7
|
// src/fhe-airdrop/constants.ts
|
|
8
|
-
var AIRDROP_CONTRACTS_COMMIT = "
|
|
8
|
+
var AIRDROP_CONTRACTS_COMMIT = "c5c12c2087f61bcd5bd1daa802563ed3cd68f002";
|
|
9
9
|
var DEPLOYMENT_MODE = { clone: 0, uups: 1 };
|
|
10
10
|
var DEDUP_MODE = { perAddress: 0, perDedupId: 1, both: 2, none: 3 };
|
|
11
|
+
var UINT96_MAX = (1n << 96n) - 1n;
|
|
11
12
|
|
|
12
13
|
// src/fhe-airdrop/errors.ts
|
|
13
14
|
var MerkleUupsUnsupportedError = class extends chunk67OV5CX2_cjs.TokenOpsSdkError {
|
|
@@ -37,6 +38,25 @@ var NonStockWrapperError = class extends chunk67OV5CX2_cjs.TokenOpsSdkError {
|
|
|
37
38
|
);
|
|
38
39
|
}
|
|
39
40
|
};
|
|
41
|
+
var UnauthorizedRedirectError = class extends chunk67OV5CX2_cjs.TokenOpsSdkError {
|
|
42
|
+
name = "UnauthorizedRedirectError";
|
|
43
|
+
constructor(args) {
|
|
44
|
+
const who = args?.submitter ? ` (submitter: ${args.submitter})` : "";
|
|
45
|
+
super(
|
|
46
|
+
`Only the claim identity may redirect its own payout${who}: \`to\` (${args?.to ?? "unknown"}) differs from \`account\` (${args?.account ?? "unknown"}) and the submitter is not that account. Leave \`to\` unset (or equal to \`account\`) when submitting on someone else's behalf.`,
|
|
47
|
+
{
|
|
48
|
+
code: "TOKENOPS_UNAUTHORIZED_REDIRECT",
|
|
49
|
+
cause: args?.cause,
|
|
50
|
+
context: {
|
|
51
|
+
constraint: "merkle-third-party-redirect",
|
|
52
|
+
account: args?.account,
|
|
53
|
+
to: args?.to,
|
|
54
|
+
submitter: args?.submitter
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
40
60
|
var SaltCollisionError = class extends chunk67OV5CX2_cjs.TokenOpsSdkError {
|
|
41
61
|
name = "SaltCollisionError";
|
|
42
62
|
constructor(args) {
|
|
@@ -186,6 +206,42 @@ var ClaimWindowClosedError = class extends chunk67OV5CX2_cjs.TokenOpsSdkError {
|
|
|
186
206
|
});
|
|
187
207
|
}
|
|
188
208
|
};
|
|
209
|
+
var GasFeeNotAcceptedError = class extends chunk67OV5CX2_cjs.TokenOpsSdkError {
|
|
210
|
+
name = "GasFeeNotAcceptedError";
|
|
211
|
+
constructor(args) {
|
|
212
|
+
const detail = args.resolvedFee !== void 0 && args.maxAcceptedGasFee !== void 0 ? ` The factory resolved ${args.resolvedFee} wei; \`maxAcceptedGasFee\` is ${args.maxAcceptedGasFee} wei.` : "";
|
|
213
|
+
super(
|
|
214
|
+
`${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.`,
|
|
215
|
+
{
|
|
216
|
+
code: "TOKENOPS_GAS_FEE_NOT_ACCEPTED",
|
|
217
|
+
cause: args.cause,
|
|
218
|
+
context: {
|
|
219
|
+
method: args.method,
|
|
220
|
+
contractAddress: args.contractAddress,
|
|
221
|
+
resolvedFee: args.resolvedFee,
|
|
222
|
+
maxAcceptedGasFee: args.maxAcceptedGasFee
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
var UnrecognisedAirdropError = class extends chunk67OV5CX2_cjs.TokenOpsSdkError {
|
|
229
|
+
name = "UnrecognisedAirdropError";
|
|
230
|
+
constructor(args) {
|
|
231
|
+
super(
|
|
232
|
+
`${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.`,
|
|
233
|
+
{
|
|
234
|
+
code: "TOKENOPS_UNRECOGNISED_AIRDROP",
|
|
235
|
+
cause: args.cause,
|
|
236
|
+
context: {
|
|
237
|
+
method: args.method,
|
|
238
|
+
contractAddress: args.contractAddress,
|
|
239
|
+
factory: args.factory
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
};
|
|
189
245
|
var airdropProductMapper = (name, errArgs, ctx) => {
|
|
190
246
|
switch (name) {
|
|
191
247
|
// ---- guarded conditions, caught on-chain instead of pre-flight -------
|
|
@@ -241,6 +297,22 @@ var airdropProductMapper = (name, errArgs, ctx) => {
|
|
|
241
297
|
});
|
|
242
298
|
case "RootImmutable":
|
|
243
299
|
return new chunk67OV5CX2_cjs.FeatureDisabledError({ ...ctx, feature: "merkleRootRotation" });
|
|
300
|
+
case "ZeroAccount":
|
|
301
|
+
return invalidArg(
|
|
302
|
+
ctx,
|
|
303
|
+
"account",
|
|
304
|
+
name,
|
|
305
|
+
"the claim identity is mandatory and is never defaulted from the caller"
|
|
306
|
+
);
|
|
307
|
+
case "UnauthorizedRedirect": {
|
|
308
|
+
const account = errArgs?.[0];
|
|
309
|
+
const to = errArgs?.[1];
|
|
310
|
+
return new UnauthorizedRedirectError({
|
|
311
|
+
account,
|
|
312
|
+
to,
|
|
313
|
+
submitter: ctx.productContext?.["creator"]
|
|
314
|
+
});
|
|
315
|
+
}
|
|
244
316
|
// ---- FHEVM chain config ---------------------------------------------
|
|
245
317
|
case "ZamaProtocolUnsupported": {
|
|
246
318
|
const chainId = ctx.productContext?.["chainId"] ?? 0;
|
|
@@ -254,6 +326,28 @@ var airdropProductMapper = (name, errArgs, ctx) => {
|
|
|
254
326
|
}
|
|
255
327
|
// ---- argument-validation bucket: reverts not already covered by the
|
|
256
328
|
// cross-product default mapper's `Zero*`/`Invalid*` list ---------------
|
|
329
|
+
case "GasFeeNotAccepted": {
|
|
330
|
+
const resolvedFee = errArgs?.[0];
|
|
331
|
+
const maxAcceptedGasFee = errArgs?.[1];
|
|
332
|
+
return new GasFeeNotAcceptedError({ ...ctx, resolvedFee, maxAcceptedGasFee });
|
|
333
|
+
}
|
|
334
|
+
case "GasFeeExceedsMaximum": {
|
|
335
|
+
const gasFee = errArgs?.[0];
|
|
336
|
+
const maxGasFee = errArgs?.[1];
|
|
337
|
+
return new chunk67OV5CX2_cjs.InvalidArgumentError({
|
|
338
|
+
method: ctx.method,
|
|
339
|
+
argument: "gasFee",
|
|
340
|
+
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`,
|
|
341
|
+
value: gasFee
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
case "ZeroUnwrapRequestId":
|
|
345
|
+
return invalidArg(
|
|
346
|
+
ctx,
|
|
347
|
+
"token",
|
|
348
|
+
name,
|
|
349
|
+
"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"
|
|
350
|
+
);
|
|
257
351
|
case "ZeroToken":
|
|
258
352
|
return invalidArg(ctx, "token", name);
|
|
259
353
|
case "ZeroFeeCollector":
|
|
@@ -286,7 +380,7 @@ var airdropProductMapper = (name, errArgs, ctx) => {
|
|
|
286
380
|
ctx,
|
|
287
381
|
"admin",
|
|
288
382
|
name,
|
|
289
|
-
"revoking or renouncing the sole DEFAULT_ADMIN_ROLE member would leave the
|
|
383
|
+
"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"
|
|
290
384
|
);
|
|
291
385
|
case "LastFeeCollector":
|
|
292
386
|
return invalidArg(
|
|
@@ -445,6 +539,27 @@ async function assertSaltAvailable(args) {
|
|
|
445
539
|
predictedAddress: args.predictedAddress
|
|
446
540
|
});
|
|
447
541
|
}
|
|
542
|
+
function assertMaxAcceptedGasFeeRange(value, method) {
|
|
543
|
+
if (value < 0n || value > UINT96_MAX) {
|
|
544
|
+
throw new chunk67OV5CX2_cjs.InvalidArgumentError({
|
|
545
|
+
method,
|
|
546
|
+
argument: "common.maxAcceptedGasFee",
|
|
547
|
+
reason: `is outside uint96 (0 to ${UINT96_MAX}); the params tuple cannot be ABI-encoded at all`,
|
|
548
|
+
value
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
async function assertGasFeeAccepted(args) {
|
|
553
|
+
assertMaxAcceptedGasFeeRange(args.maxAcceptedGasFee, args.method);
|
|
554
|
+
const resolvedFee = await args.factory.resolveGasFee(args.creator);
|
|
555
|
+
if (resolvedFee <= args.maxAcceptedGasFee) return;
|
|
556
|
+
throw new GasFeeNotAcceptedError({
|
|
557
|
+
method: args.method,
|
|
558
|
+
contractAddress: args.factory.address,
|
|
559
|
+
resolvedFee,
|
|
560
|
+
maxAcceptedGasFee: args.maxAcceptedGasFee
|
|
561
|
+
});
|
|
562
|
+
}
|
|
448
563
|
function assertPredictionFresh(args) {
|
|
449
564
|
if (args.initCodeHashBefore.toLowerCase() === args.initCodeHashAfter.toLowerCase()) return;
|
|
450
565
|
throw new PredictionDriftError({
|
|
@@ -462,6 +577,20 @@ async function preflightCreate(args) {
|
|
|
462
577
|
if (args.variant === "merkle") {
|
|
463
578
|
collect(blockers, () => assertMerkleModeSupported(args.mode));
|
|
464
579
|
}
|
|
580
|
+
const encodable = collect(
|
|
581
|
+
blockers,
|
|
582
|
+
() => assertMaxAcceptedGasFeeRange(args.params.common.maxAcceptedGasFee, method)
|
|
583
|
+
);
|
|
584
|
+
if (!encodable) return { ready: false, blockers };
|
|
585
|
+
await collectAsync(
|
|
586
|
+
blockers,
|
|
587
|
+
() => assertGasFeeAccepted({
|
|
588
|
+
factory: args.factory,
|
|
589
|
+
creator: args.creator,
|
|
590
|
+
maxAcceptedGasFee: args.params.common.maxAcceptedGasFee,
|
|
591
|
+
method
|
|
592
|
+
})
|
|
593
|
+
);
|
|
465
594
|
const predictArgs = {
|
|
466
595
|
mode: args.mode,
|
|
467
596
|
deployer: args.creator,
|
|
@@ -515,18 +644,113 @@ async function preflightCreate(args) {
|
|
|
515
644
|
}
|
|
516
645
|
return { ready: blockers.length === 0, blockers };
|
|
517
646
|
}
|
|
647
|
+
async function assertKnownAirdrop(args) {
|
|
648
|
+
if (args.factory.chainId !== args.chainId) {
|
|
649
|
+
throw new chunk67OV5CX2_cjs.InvalidArgumentError({
|
|
650
|
+
method: args.method,
|
|
651
|
+
argument: "factory",
|
|
652
|
+
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`,
|
|
653
|
+
value: args.factory.address
|
|
654
|
+
});
|
|
655
|
+
}
|
|
656
|
+
if (await args.factory.isAirdrop(args.airdrop)) return;
|
|
657
|
+
throw new UnrecognisedAirdropError({
|
|
658
|
+
method: args.method,
|
|
659
|
+
contractAddress: args.airdrop,
|
|
660
|
+
factory: args.factory.address
|
|
661
|
+
});
|
|
662
|
+
}
|
|
663
|
+
function assertMerkleClaimIdentity(args) {
|
|
664
|
+
const { method, account, submitter, boundTo, to, entrypoint = "claim" } = args;
|
|
665
|
+
for (const [argument, value] of [
|
|
666
|
+
["account", account],
|
|
667
|
+
["entry.boundTo", boundTo],
|
|
668
|
+
["to", to],
|
|
669
|
+
["submitter", submitter]
|
|
670
|
+
]) {
|
|
671
|
+
if (value !== void 0 && !viem.isAddress(value, { strict: false })) {
|
|
672
|
+
throw new chunk67OV5CX2_cjs.InvalidArgumentError({
|
|
673
|
+
method,
|
|
674
|
+
argument,
|
|
675
|
+
reason: "is not a 20-byte hex address",
|
|
676
|
+
value
|
|
677
|
+
});
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
if (viem.isAddressEqual(account, viem.zeroAddress)) {
|
|
681
|
+
throw new chunk67OV5CX2_cjs.InvalidArgumentError({
|
|
682
|
+
method,
|
|
683
|
+
argument: "account",
|
|
684
|
+
reason: "is the zero address; the claim identity is mandatory and is never defaulted from the caller"
|
|
685
|
+
});
|
|
686
|
+
}
|
|
687
|
+
if (boundTo !== void 0 && !viem.isAddressEqual(boundTo, submitter)) {
|
|
688
|
+
throw new chunk67OV5CX2_cjs.InvalidArgumentError({
|
|
689
|
+
method,
|
|
690
|
+
argument: "entry.boundTo",
|
|
691
|
+
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`
|
|
692
|
+
});
|
|
693
|
+
}
|
|
694
|
+
if (entrypoint === "claimAndUnwrap") {
|
|
695
|
+
if (!viem.isAddressEqual(account, submitter)) {
|
|
696
|
+
throw new chunk67OV5CX2_cjs.InvalidArgumentError({
|
|
697
|
+
method,
|
|
698
|
+
argument: "entry.account",
|
|
699
|
+
reason: `is ${account}, but \`claimAndUnwrap\` is always submitted for the caller (${submitter}); use \`claim\` to settle on someone else's behalf`
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
return;
|
|
703
|
+
}
|
|
704
|
+
const beneficiary = to === void 0 || viem.isAddressEqual(to, viem.zeroAddress) ? account : to;
|
|
705
|
+
if (!viem.isAddressEqual(beneficiary, account) && !viem.isAddressEqual(submitter, account)) {
|
|
706
|
+
throw new UnauthorizedRedirectError({ account, to: beneficiary, submitter });
|
|
707
|
+
}
|
|
708
|
+
}
|
|
518
709
|
async function preflightClaim(args) {
|
|
519
710
|
const { airdrop, claimant } = args;
|
|
520
711
|
const method = "preflightClaim";
|
|
521
712
|
const blockers = [];
|
|
522
713
|
collect(blockers, () => assertSupportedChain(airdrop.chainId));
|
|
523
|
-
|
|
714
|
+
if (args.factory) {
|
|
715
|
+
await collectAsync(
|
|
716
|
+
blockers,
|
|
717
|
+
() => assertKnownAirdrop({
|
|
718
|
+
factory: args.factory,
|
|
719
|
+
airdrop: airdrop.address,
|
|
720
|
+
chainId: airdrop.chainId,
|
|
721
|
+
method
|
|
722
|
+
})
|
|
723
|
+
);
|
|
724
|
+
}
|
|
725
|
+
if (args.account !== void 0 || args.entrypoint !== void 0) {
|
|
726
|
+
collect(
|
|
727
|
+
blockers,
|
|
728
|
+
() => assertMerkleClaimIdentity({
|
|
729
|
+
method,
|
|
730
|
+
account: args.account ?? claimant,
|
|
731
|
+
submitter: claimant,
|
|
732
|
+
to: args.to,
|
|
733
|
+
entrypoint: args.entrypoint
|
|
734
|
+
})
|
|
735
|
+
);
|
|
736
|
+
}
|
|
737
|
+
const [started, ended, paused, fee, balance, unwrappable] = await Promise.all([
|
|
524
738
|
airdrop.hasClaimStarted(),
|
|
525
739
|
airdrop.hasClaimEnded(),
|
|
526
740
|
airdrop.paused(),
|
|
527
741
|
airdrop.gasFee(),
|
|
528
|
-
airdrop.publicClient.getBalance({ address: claimant })
|
|
742
|
+
airdrop.publicClient.getBalance({ address: claimant }),
|
|
743
|
+
args.entrypoint === "claimAndUnwrap" && airdrop.unwrappable ? airdrop.unwrappable() : Promise.resolve(true)
|
|
529
744
|
]);
|
|
745
|
+
if (!unwrappable) {
|
|
746
|
+
blockers.push(
|
|
747
|
+
new chunk67OV5CX2_cjs.FeatureDisabledError({
|
|
748
|
+
method,
|
|
749
|
+
contractAddress: airdrop.address,
|
|
750
|
+
feature: "claimAndUnwrap"
|
|
751
|
+
})
|
|
752
|
+
);
|
|
753
|
+
}
|
|
530
754
|
if (paused) {
|
|
531
755
|
blockers.push(new chunk67OV5CX2_cjs.PausedError({ method, contractAddress: airdrop.address }));
|
|
532
756
|
}
|
|
@@ -570,9 +794,11 @@ async function preflightClaim(args) {
|
|
|
570
794
|
function collect(blockers, run) {
|
|
571
795
|
try {
|
|
572
796
|
run();
|
|
797
|
+
return true;
|
|
573
798
|
} catch (err) {
|
|
574
799
|
if (!chunk67OV5CX2_cjs.isTokenOpsSdkError(err)) throw err;
|
|
575
800
|
blockers.push(err);
|
|
801
|
+
return false;
|
|
576
802
|
}
|
|
577
803
|
}
|
|
578
804
|
async function collectAsync(blockers, run) {
|
|
@@ -592,13 +818,19 @@ exports.DEDUP_MODE = DEDUP_MODE;
|
|
|
592
818
|
exports.DEPLOYMENT_MODE = DEPLOYMENT_MODE;
|
|
593
819
|
exports.DedupIdConsumedError = DedupIdConsumedError;
|
|
594
820
|
exports.FeeCollectorSelfAdministeredError = FeeCollectorSelfAdministeredError;
|
|
821
|
+
exports.GasFeeNotAcceptedError = GasFeeNotAcceptedError;
|
|
595
822
|
exports.MerkleUupsUnsupportedError = MerkleUupsUnsupportedError;
|
|
596
823
|
exports.NonStockWrapperError = NonStockWrapperError;
|
|
597
824
|
exports.PredictionDriftError = PredictionDriftError;
|
|
598
825
|
exports.SaltCollisionError = SaltCollisionError;
|
|
599
826
|
exports.SignatureExpiredError = SignatureExpiredError;
|
|
827
|
+
exports.UINT96_MAX = UINT96_MAX;
|
|
828
|
+
exports.UnauthorizedRedirectError = UnauthorizedRedirectError;
|
|
829
|
+
exports.UnrecognisedAirdropError = UnrecognisedAirdropError;
|
|
600
830
|
exports.UpgradeabilityNotAllowedError = UpgradeabilityNotAllowedError;
|
|
601
831
|
exports.airdropProductMapper = airdropProductMapper;
|
|
832
|
+
exports.assertGasFeeAccepted = assertGasFeeAccepted;
|
|
833
|
+
exports.assertMerkleClaimIdentity = assertMerkleClaimIdentity;
|
|
602
834
|
exports.assertMerkleModeSupported = assertMerkleModeSupported;
|
|
603
835
|
exports.assertPredictionFresh = assertPredictionFresh;
|
|
604
836
|
exports.assertSaltAvailable = assertSaltAvailable;
|
package/dist/core/addresses.d.ts
CHANGED
|
@@ -15,16 +15,16 @@ export declare const DEPLOYED_ADDRESSES: {
|
|
|
15
15
|
};
|
|
16
16
|
readonly fheAirdrop: {
|
|
17
17
|
readonly airdropFactory: {
|
|
18
|
-
readonly 11155111: "
|
|
18
|
+
readonly 11155111: "0xA10ff713cfeE5348313Cda0B2CA1b190A1194cab";
|
|
19
19
|
};
|
|
20
20
|
readonly ecdsaImplementation: {
|
|
21
|
-
readonly 11155111: "
|
|
21
|
+
readonly 11155111: "0x8d4E8F379f73D5488a76B6C3CC8a2fD489936BDe";
|
|
22
22
|
};
|
|
23
23
|
readonly merkleImplementation: {
|
|
24
|
-
readonly 11155111: "
|
|
24
|
+
readonly 11155111: "0x4B4F43Ed9aB3F9D10468b59C03d14f55A9d4E82F";
|
|
25
25
|
};
|
|
26
26
|
readonly complianceManagerImplementation: {
|
|
27
|
-
readonly 11155111: "
|
|
27
|
+
readonly 11155111: "0x14bdE71e6b32b50dF1a5Dca1bccD150a319168e2";
|
|
28
28
|
};
|
|
29
29
|
};
|
|
30
30
|
readonly fheDisperse: {
|
package/dist/core/errors.d.ts
CHANGED
|
@@ -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";
|
|
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" | "TOKENOPS_GAS_FEE_NOT_ACCEPTED" | "TOKENOPS_UNRECOGNISED_AIRDROP";
|
|
17
17
|
/** @public */
|
|
18
18
|
export interface TokenOpsSdkErrorInit {
|
|
19
19
|
code: TokenOpsSdkErrorCode;
|