@sign-global/tokentable 1.0.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +45 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +46 -16
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
- package/src/SignatureAirdropClient.ts +54 -28
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# @sign-global/tokentable
|
|
2
2
|
|
|
3
|
+
## 1.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- feat: add Sui blockchain support
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies
|
|
12
|
+
- @sign-global/tokentable-core@1.2.0
|
|
13
|
+
- @sign-global/tokentable-wallets@1.2.1
|
|
14
|
+
|
|
15
|
+
## 1.1.0
|
|
16
|
+
|
|
17
|
+
### Minor Changes
|
|
18
|
+
|
|
19
|
+
- feat: add Ledger wallet support and enhance signing functionality
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- Updated dependencies
|
|
24
|
+
- @sign-global/tokentable-wallets@1.1.0
|
|
25
|
+
|
|
3
26
|
## 1.0.1
|
|
4
27
|
|
|
5
28
|
### Patch Changes
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TonClient } from '@ton/ton';
|
|
2
2
|
import * as _sign_global_tokentable_core from '@sign-global/tokentable-core';
|
|
3
|
-
import { IWalletClient, IAirdropClaim, IAirdropOptions, IProject, IAirdropSignatureClaim, IAirdropSignatureIdentity, AirdropSigIdentityTypeEnum, ChainType, EvmSignatureAirdropService, SolanaSignatureAirdropService } from '@sign-global/tokentable-core';
|
|
3
|
+
import { IWalletClient, IAirdropClaim, IAirdropOptions, IProject, IAirdropSignatureClaim, IAirdropSignatureIdentity, AirdropSigIdentityTypeEnum, ChainType, EvmSignatureAirdropService, SolanaSignatureAirdropService, SuiSignatureAirdropService } from '@sign-global/tokentable-core';
|
|
4
4
|
export * from '@sign-global/tokentable-core';
|
|
5
5
|
export * from '@sign-global/tokentable-wallets';
|
|
6
6
|
|
|
@@ -110,7 +110,7 @@ declare class SignatureAirdropClient {
|
|
|
110
110
|
recipientType: AirdropSigIdentityTypeEnum;
|
|
111
111
|
recipient?: string;
|
|
112
112
|
}): Promise<void>;
|
|
113
|
-
getStrategy(walletClient?: IWalletClient): Promise<EvmSignatureAirdropService | SolanaSignatureAirdropService>;
|
|
113
|
+
getStrategy(walletClient?: IWalletClient): Promise<EvmSignatureAirdropService | SolanaSignatureAirdropService | SuiSignatureAirdropService>;
|
|
114
114
|
getVersion(): Promise<string>;
|
|
115
115
|
getClaimFee(amount?: bigint, walletClient?: IWalletClient): Promise<undefined | bigint>;
|
|
116
116
|
claimAirdrop({ claimIds, walletClient, recipient }: {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TonClient } from '@ton/ton';
|
|
2
2
|
import * as _sign_global_tokentable_core from '@sign-global/tokentable-core';
|
|
3
|
-
import { IWalletClient, IAirdropClaim, IAirdropOptions, IProject, IAirdropSignatureClaim, IAirdropSignatureIdentity, AirdropSigIdentityTypeEnum, ChainType, EvmSignatureAirdropService, SolanaSignatureAirdropService } from '@sign-global/tokentable-core';
|
|
3
|
+
import { IWalletClient, IAirdropClaim, IAirdropOptions, IProject, IAirdropSignatureClaim, IAirdropSignatureIdentity, AirdropSigIdentityTypeEnum, ChainType, EvmSignatureAirdropService, SolanaSignatureAirdropService, SuiSignatureAirdropService } from '@sign-global/tokentable-core';
|
|
4
4
|
export * from '@sign-global/tokentable-core';
|
|
5
5
|
export * from '@sign-global/tokentable-wallets';
|
|
6
6
|
|
|
@@ -110,7 +110,7 @@ declare class SignatureAirdropClient {
|
|
|
110
110
|
recipientType: AirdropSigIdentityTypeEnum;
|
|
111
111
|
recipient?: string;
|
|
112
112
|
}): Promise<void>;
|
|
113
|
-
getStrategy(walletClient?: IWalletClient): Promise<EvmSignatureAirdropService | SolanaSignatureAirdropService>;
|
|
113
|
+
getStrategy(walletClient?: IWalletClient): Promise<EvmSignatureAirdropService | SolanaSignatureAirdropService | SuiSignatureAirdropService>;
|
|
114
114
|
getVersion(): Promise<string>;
|
|
115
115
|
getClaimFee(amount?: bigint, walletClient?: IWalletClient): Promise<undefined | bigint>;
|
|
116
116
|
claimAirdrop({ claimIds, walletClient, recipient }: {
|
package/dist/index.js
CHANGED
|
@@ -662,12 +662,13 @@ var SignatureAirdropClient = class {
|
|
|
662
662
|
const recipientTypeMap = {
|
|
663
663
|
[import_tokentable_core6.ChainType.Evm]: import_tokentable_core6.AirdropSigIdentityTypeEnum.EVMWallet,
|
|
664
664
|
[import_tokentable_core6.ChainType.Solana]: import_tokentable_core6.AirdropSigIdentityTypeEnum.SolanaWallet,
|
|
665
|
-
[import_tokentable_core6.ChainType.Ton]: import_tokentable_core6.AirdropSigIdentityTypeEnum.TONWallet
|
|
665
|
+
[import_tokentable_core6.ChainType.Ton]: import_tokentable_core6.AirdropSigIdentityTypeEnum.TONWallet,
|
|
666
|
+
[import_tokentable_core6.ChainType.Sui]: ""
|
|
666
667
|
};
|
|
667
668
|
const msg = [project.id, recipientTypeMap[chainType], timestamp].join(",");
|
|
668
669
|
const signResult = await wallet.signin(msg, false);
|
|
669
670
|
await wallet.disconnect();
|
|
670
|
-
const { message, signature } = signResult || {};
|
|
671
|
+
const { message, signature, signedMessage } = signResult || {};
|
|
671
672
|
if (this.identities?.find((it) => it.value?.toLowerCase() === wallet.address?.toLowerCase())) {
|
|
672
673
|
onError?.(import_tokentable_core6.ErrorCode.WALLET_ALREADY_CONNECTED);
|
|
673
674
|
return;
|
|
@@ -679,7 +680,8 @@ var SignatureAirdropClient = class {
|
|
|
679
680
|
address: wallet.address,
|
|
680
681
|
projectId: project.id,
|
|
681
682
|
timestamp,
|
|
682
|
-
recipientType: recipientTypeMap[chainType]
|
|
683
|
+
recipientType: recipientTypeMap[chainType],
|
|
684
|
+
encodedMessage: signedMessage
|
|
683
685
|
};
|
|
684
686
|
const res = await (0, import_tokentable_core6.bindWallet)(payload, this.endpoint);
|
|
685
687
|
if (res?.sid) {
|
|
@@ -721,22 +723,49 @@ var SignatureAirdropClient = class {
|
|
|
721
723
|
}
|
|
722
724
|
async getStrategy(walletClient) {
|
|
723
725
|
const project = await this.getProjectInfo();
|
|
724
|
-
|
|
726
|
+
let cacheKey = "default";
|
|
727
|
+
if (walletClient) {
|
|
728
|
+
if (project.chainType === import_tokentable_core6.ChainType.Evm) {
|
|
729
|
+
cacheKey = walletClient.account?.address;
|
|
730
|
+
} else if (project.chainType === import_tokentable_core6.ChainType.Solana) {
|
|
731
|
+
cacheKey = walletClient.publicKey.toString();
|
|
732
|
+
} else if (project.chainType === import_tokentable_core6.ChainType.Sui) {
|
|
733
|
+
cacheKey = walletClient.accounts[0].address;
|
|
734
|
+
}
|
|
735
|
+
} else {
|
|
736
|
+
cacheKey = "walletClient";
|
|
737
|
+
}
|
|
725
738
|
if (this.strategyCache.has(cacheKey)) {
|
|
726
739
|
return this.strategyCache.get(cacheKey);
|
|
727
740
|
}
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
741
|
+
let strategy = null;
|
|
742
|
+
if (project.chainType === import_tokentable_core6.ChainType.Solana) {
|
|
743
|
+
strategy = new import_tokentable_core6.SolanaSignatureAirdropService({
|
|
744
|
+
chainId: project.chainId,
|
|
745
|
+
projectId: project.id,
|
|
746
|
+
token: project.tokenAddress,
|
|
747
|
+
walletClient,
|
|
748
|
+
chainRpc: this.chainRpc
|
|
749
|
+
});
|
|
750
|
+
} else if (project.chainType === import_tokentable_core6.ChainType.Sui) {
|
|
751
|
+
strategy = new import_tokentable_core6.SuiSignatureAirdropService({
|
|
752
|
+
chainId: project.chainId,
|
|
753
|
+
coinType: project.tokenAddress,
|
|
754
|
+
walletClient,
|
|
755
|
+
chainRpc: this.chainRpc,
|
|
756
|
+
distributorId: project.contractAddress
|
|
757
|
+
});
|
|
758
|
+
} else if (project.chainType === import_tokentable_core6.ChainType.Evm) {
|
|
759
|
+
strategy = new import_tokentable_core6.EvmSignatureAirdropService({
|
|
760
|
+
chainId: Number(project.chainId),
|
|
761
|
+
contractAddress: project.contractAddress,
|
|
762
|
+
walletClient,
|
|
763
|
+
chainRpc: this.chainRpc
|
|
764
|
+
});
|
|
765
|
+
}
|
|
766
|
+
if (!strategy) {
|
|
767
|
+
throw new Error("No strategy found");
|
|
768
|
+
}
|
|
740
769
|
this.strategyCache.set(cacheKey, strategy);
|
|
741
770
|
return strategy;
|
|
742
771
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/AirdropClient.ts","../src/strategies/AirdropStrategyFactory.ts","../src/strategies/EvmAirdropStrategy.ts","../src/strategies/SolanaAirdropStrategy.ts","../src/strategies/TonAirdropStrategy.ts","../src/strategies/StrategyCache.ts","../src/SignatureAirdropClient.ts"],"sourcesContent":["export { AirdropClient } from './AirdropClient';\nexport { SignatureAirdropClient } from './SignatureAirdropClient';\nexport * from '@sign-global/tokentable-core';\nexport * from '@sign-global/tokentable-wallets';\n","import { TonClient } from '@ton/ton';\nimport {\n getAirdropPro,\n getAirdropProject,\n getAirdropQuery,\n getAirdropContractConfig,\n getChainRpc,\n getTonProjectIdByAddress,\n ChainId,\n ChainType,\n ETokenType,\n EvmAirdropVersionEnum,\n IAirdropClaim,\n IAirdropOptions,\n IContractConfig,\n IProject,\n IWalletClient\n} from '@sign-global/tokentable-core';\nimport { AirdropStrategyFactory } from './strategies/AirdropStrategyFactory';\nimport { IAirdropStrategy } from './strategies/IAirdropStrategy';\nimport { strategyCache } from './strategies/StrategyCache';\n\nexport class AirdropClient {\n private tonClient?: TonClient;\n private slug?: string;\n private projectId?: string;\n private endpoint?: string;\n private project: IProject | undefined;\n protected chainRpc?: string;\n protected claims?: IAirdropClaim[];\n private projectPromise: Promise<void> | undefined;\n private claimHook: ((claimData: IAirdropClaim) => { isLegacy: boolean; attestationId: bigint }) | undefined;\n private contractConfig: IContractConfig | null = null;\n\n constructor(params: IAirdropOptions) {\n if ('slug' in params) {\n this.slug = params.slug;\n }\n this.projectId = params.projectId;\n this.endpoint = params.endpoint;\n this.chainRpc = params.chainRpc;\n if (this.project) {\n this.project = params.project;\n } else {\n this.projectPromise = this.initializeProjects();\n }\n }\n\n setTonClient(tonClient: TonClient) {\n this.tonClient = tonClient;\n }\n\n private getTonClient(): TonClient | undefined {\n if (!this.tonClient) {\n return undefined;\n }\n return this.tonClient;\n }\n\n private async fetchProjectFromSlug(address?: string): Promise<string | undefined> {\n if (!this.slug) return undefined;\n\n const res = await getAirdropPro(this.slug, this.endpoint);\n const projectMap = res?.childProjectMapping || {};\n\n return getTonProjectIdByAddress({\n address,\n slug: this.slug,\n data: projectMap\n });\n }\n\n private async fetchProjectDetails(projectId: string): Promise<void> {\n const project = await getAirdropProject(projectId, this.endpoint);\n this.project = project;\n if (this.chainRpc) return;\n const chainId = project.chainType === ChainType.Evm ? Number(project.chainId) : project.chainId;\n this.chainRpc = getChainRpc(chainId as ChainId);\n }\n\n protected async initializeProjects(address?: string) {\n try {\n let projectId = this.projectId;\n\n // If slug is provided, try to fetch project ID from slug\n if (!projectId) {\n projectId = await this.fetchProjectFromSlug(address);\n }\n\n if (!projectId) {\n return;\n }\n\n // Fetch project details\n await this.fetchProjectDetails(projectId);\n } catch (error: any) {\n throw new Error(`Failed to initialize project: ${error.message}`);\n }\n }\n\n async getProjectInfo() {\n if (this.projectPromise) {\n await this.projectPromise;\n }\n if (!this.project) throw new Error('Project not found');\n return this.project;\n }\n\n async getAirdropClaims(data: { address: string }) {\n if (this.slug) {\n await this.initializeProjects(data.address); // Fetch project details by address & slug\n }\n const project = await this.getProjectInfo();\n\n const res = await getAirdropQuery(\n {\n recipient: data.address,\n projectId: project!.id,\n recipientType: project!.recipientType\n },\n this.endpoint\n );\n const claimsRes = res.claims?.map((it) => ({\n ...it,\n project: project!,\n claimId: project!.chainType === ChainType.Evm ? `${project!.id}:${it.leaf}` : `${project!.id}:${it.index}`\n }));\n this.claims = claimsRes;\n return this.claims;\n }\n\n public async getStrategy(walletClient?: IWalletClient): Promise<IAirdropStrategy> {\n const project = await this.getProjectInfo();\n const version = this.contractConfig?.version || undefined;\n\n const hasWallet = !!walletClient;\n\n // Try to get cached strategy\n let strategy = strategyCache.getStrategy(project.contractAddress, project.chainId, project.chainType, hasWallet);\n\n if (!strategy) {\n // Create new strategy if not cached\n strategy = AirdropStrategyFactory.createStrategy({\n chainType: project.chainType,\n contractAddress: project.contractAddress,\n chainId: project.chainId,\n projectId: project.id,\n walletClient,\n tonClient: this.getTonClient(),\n version,\n chainRpc: this.chainRpc!\n });\n\n // Initialize the strategy\n await strategy.initialize(walletClient);\n\n // Cache the initialized strategy\n strategyCache.setStrategy(project.contractAddress, project.chainId, project.chainType, strategy, hasWallet);\n } else if (hasWallet) {\n // If we have a wallet and the strategy exists, just initialize with the new wallet\n await strategy.initialize(walletClient);\n }\n\n return strategy;\n }\n\n private getClaimDataById(claimId: string) {\n const claimData = this.claims?.find((it) => it.claimId === claimId);\n if (!claimData) throw new Error('Claim data not found');\n return claimData;\n }\n\n setClaimHook(fn: (claimData: IAirdropClaim) => { isLegacy: boolean; attestationId: bigint }) {\n this.claimHook = fn;\n }\n\n private getDefaultExtraData() {\n return {\n isLegacy: true,\n attestationId: BigInt(1)\n };\n }\n\n private async calculateClaimFee(project: IProject, claimData: IAirdropClaim): Promise<string | bigint | undefined> {\n const claimAmount = claimData.amount;\n if (project.chainType === ChainType.Evm) {\n const version = await this.getVersion();\n const isNativeFreeVersion =\n project.tokenType === ETokenType.Native &&\n [EvmAirdropVersionEnum.V3, EvmAirdropVersionEnum.V4].includes(version as EvmAirdropVersionEnum);\n if (isNativeFreeVersion) {\n return undefined;\n }\n if (version.includes('TokenTableMerkleDistributorWithFees')) {\n const fees = claimData.fees;\n return fees ? BigInt(fees) : '0';\n }\n return await this.getClaimFee(BigInt(claimAmount));\n }\n\n if (project.chainType === ChainType.Ton) {\n return await this.getClaimFee(BigInt(claimAmount));\n }\n\n return undefined;\n }\n\n async claimAirdrop(\n { claimId, walletClient }: { claimId: string; walletClient: IWalletClient },\n options?: { onLoading?: () => void }\n ) {\n // Get claim data and initialize strategy\n const claimData = this.getClaimDataById(claimId);\n const strategy = await this.getStrategy(walletClient);\n const project = await this.getProjectInfo();\n\n // Process extra data\n const extraData =\n project.chainType === ChainType.Ton\n ? undefined\n : this.claimHook\n ? this.claimHook(claimData)\n : this.getDefaultExtraData();\n\n // Calculate claim value based on project type\n const value = await this.calculateClaimFee(project, claimData);\n\n // Execute claim with processed data\n return strategy.claim(\n {\n ...claimData,\n extraData,\n value\n },\n options\n );\n }\n\n async checkClaimed(claimId: string): Promise<boolean> {\n const claimData = this.getClaimDataById(claimId);\n const strategy = await this.getStrategy();\n return strategy.checkClaimed(claimData);\n }\n\n private async getContractConfig(): Promise<IContractConfig | null> {\n try {\n const project = await this.getProjectInfo();\n\n if (!this.contractConfig && [ChainType.Evm, ChainType.Ton].includes(project.chainType)) {\n this.contractConfig = await getAirdropContractConfig(\n {\n chainId: project.chainId,\n chainType: project.chainType,\n contractAddress: project.contractAddress\n },\n this.endpoint\n );\n }\n return this.contractConfig;\n } catch (error) {\n console.error('Error fetching contract config:', error);\n return null;\n }\n }\n\n async getVersion(): Promise<string> {\n const config = await this.getContractConfig();\n if (config?.version) {\n return config.version;\n }\n\n const strategy = await this.getStrategy();\n return strategy.getVersion();\n }\n\n async getPaused(): Promise<boolean> {\n const config = await this.getContractConfig();\n if (config && config?.paused !== null) {\n return config.paused;\n }\n\n const strategy = await this.getStrategy();\n if (!strategy.getPaused) {\n throw new Error('getPaused is not supported for this chain');\n }\n return strategy.getPaused();\n }\n\n async getClaimFee(amount?: bigint, walletClient?: IWalletClient): Promise<string | bigint> {\n const config = await this.getContractConfig();\n if (config?.claimFee) {\n return config.claimFee;\n }\n\n const strategy = await this.getStrategy(walletClient);\n if (!strategy.getClaimFee) {\n throw new Error('getClaimFee is not supported for this chain');\n }\n return strategy.getClaimFee(this.project?.contractAddress || '', amount || BigInt(0));\n }\n\n // params claimId[]\n async batchCheckClaimed(): Promise<{ result: boolean; status: string }[]> {\n const strategy = await this.getStrategy();\n if (!strategy.batchCheckClaimed) {\n throw new Error('batchCheckClaimed is not supported for this chain');\n }\n const leafs = this.claims?.map((it) => it.leaf);\n if (!leafs) return [];\n return strategy.batchCheckClaimed(leafs);\n }\n\n async getNFT(): Promise<string> {\n const strategy = await this.getStrategy();\n if (!strategy.getNFT) {\n throw new Error('getNFT is not supported for this chain');\n }\n return strategy.getNFT();\n }\n\n async getKycThreshold(): Promise<bigint> {\n const strategy = await this.getStrategy();\n if (!strategy.getKycThreshold) {\n throw new Error('getKycThreshold is not supported for this chain');\n }\n return strategy.getKycThreshold();\n }\n}\n","import { ChainType, IWalletClient } from '@sign-global/tokentable-core';\nimport { EvmAirdropStrategy } from './EvmAirdropStrategy';\nimport { IAirdropStrategy, IAirdropStrategyConstructor } from './IAirdropStrategy';\nimport { SolanaAirdropStrategy } from './SolanaAirdropStrategy';\nimport { TonAirdropStrategy } from './TonAirdropStrategy';\nimport { TonClient } from '@ton/ton';\n\nexport class AirdropStrategyFactory {\n private static strategyMap: Record<ChainType, IAirdropStrategyConstructor | null> = {\n [ChainType.Evm]: EvmAirdropStrategy,\n [ChainType.Ton]: TonAirdropStrategy,\n [ChainType.Solana]: SolanaAirdropStrategy\n };\n\n static createStrategy(params: {\n chainType: ChainType;\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n tonClient?: TonClient;\n version?: string;\n projectId: string;\n chainRpc: string;\n }): IAirdropStrategy {\n const { chainType, ...strategyParams } = params;\n const StrategyClass = this.strategyMap[chainType];\n\n if (!StrategyClass) {\n throw new Error(`Unsupported chain type: ${chainType}`);\n }\n\n return new StrategyClass(strategyParams);\n }\n}\n","import { EvmAirdropService, ChainId, IWalletClient } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\nimport { WalletClient as ViemWalletClient } from 'viem';\n\nexport class EvmAirdropStrategy implements IAirdropStrategy {\n private service: EvmAirdropService | undefined;\n private readonly contractAddress: string;\n private readonly chainId: ChainId;\n private readonly chainRpc: string;\n private walletClient?: ViemWalletClient;\n private cachedVersion: string | null = null;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n chainRpc: string;\n }) {\n this.contractAddress = params.contractAddress;\n this.chainId = Number(params.chainId) as ChainId;\n this.chainRpc = params.chainRpc;\n if (params.walletClient) {\n this.walletClient = params.walletClient as ViemWalletClient;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as ViemWalletClient;\n }\n this.service = new EvmAirdropService({\n contractAddress: this.contractAddress,\n chainId: this.chainId,\n walletClient: this.walletClient,\n chainRpc: this.chainRpc\n });\n }\n\n isInitialized(): boolean {\n return !!this.service;\n }\n\n async getVersion(): Promise<string> {\n if (this.cachedVersion) {\n return this.cachedVersion;\n }\n if (!this.service) throw new Error('Strategy not initialized');\n this.cachedVersion = await this.service.getVersion();\n return this.cachedVersion;\n }\n\n async claim(claimData: any): Promise<any> {\n if (!this.service) throw new Error('Strategy not initialized');\n const { proof, group, data, value, extraData } = claimData;\n return this.service.claim({\n proof,\n group,\n data,\n value,\n extraData\n });\n }\n\n async checkClaimed(claimData: any): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.isLeafUsed(claimData.leaf);\n }\n\n async batchCheckClaimed(leafs: string[]): Promise<{ result: boolean; status: string }[]> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.batchFetchClaimed(leafs);\n }\n\n async getNFT(): Promise<string> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getNFT() as unknown as string;\n }\n\n async getKycThreshold(): Promise<bigint> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getKycThreshold();\n }\n\n async getClaimFee(contractAddress: string, amount: bigint): Promise<bigint> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getClaimFee(contractAddress, amount) as unknown as bigint;\n }\n}\n","import { SolanaAirdropService, ChainId, IWalletClient, SolanaWalletState } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class SolanaAirdropStrategy implements IAirdropStrategy {\n private service: SolanaAirdropService | undefined;\n private readonly chainId: ChainId;\n private readonly chainRpc: string;\n private walletClient?: SolanaWalletState;\n private cachedVersion: string | null = null;\n private projectId: string;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n projectId: string;\n chainRpc: string;\n }) {\n this.chainId = params.chainId as ChainId;\n this.projectId = params.projectId;\n this.chainRpc = params.chainRpc;\n if (params.walletClient) {\n this.walletClient = params.walletClient as SolanaWalletState;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as SolanaWalletState;\n }\n this.service = new SolanaAirdropService({\n projectId: this.projectId,\n chainId: this.chainId as string,\n walletClient: this.walletClient as any,\n chainRpc: this.chainRpc\n });\n }\n\n isInitialized(): boolean {\n return !!this.service;\n }\n\n async getVersion(): Promise<string> {\n if (this.cachedVersion) {\n return this.cachedVersion;\n }\n if (!this.service) throw new Error('Strategy not initialized');\n this.cachedVersion = await this.service.getVersion();\n return this.cachedVersion;\n }\n\n async claim(claimData: any): Promise<any> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.claim(claimData);\n }\n\n async checkClaimed(claimData: any): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.isLeafUsed(claimData.leaf);\n }\n\n async batchCheckClaimed(leafs: string[]): Promise<{ result: boolean; status: string }[]> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.batchFetchClaimed(leafs);\n }\n\n async getClaimFee(contractAddress: string, amount: bigint): Promise<bigint> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getClaimFee(contractAddress, amount) as unknown as bigint;\n }\n\n async getPaused(): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getPaused();\n }\n}\n","import { TonClient } from '@ton/ton';\nimport { TonConnectUI } from '@tonconnect/ui-react';\nimport { TonAirdropService, IWalletClient } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class TonAirdropStrategy implements IAirdropStrategy {\n private service: TonAirdropService | undefined;\n private readonly contractAddress: string;\n private readonly chainId: string;\n private readonly tonClient?: TonClient;\n private walletClient?: TonConnectUI;\n private cachedVersion: string | null = null;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n tonClient?: TonClient;\n version?: string;\n }) {\n this.contractAddress = params.contractAddress;\n this.chainId = params.chainId.toString();\n this.tonClient = params.tonClient;\n if (params.walletClient) {\n this.walletClient = params.walletClient as TonConnectUI;\n }\n if (params.version) {\n this.cachedVersion = params.version;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as TonConnectUI;\n }\n this.service = new TonAirdropService({\n address: this.contractAddress,\n chainId: this.chainId,\n walletClient: this.walletClient,\n tonClient: this.tonClient,\n version: this.cachedVersion || undefined\n });\n }\n\n isInitialized(): boolean {\n return !!this.service;\n }\n\n async getVersion(): Promise<string> {\n if (!this.service) throw new Error('Strategy not initialized');\n if (!this.cachedVersion) {\n this.cachedVersion = await this.service.getVersion();\n }\n return this.cachedVersion;\n }\n\n async claim(claimData: any, options?: { onLoading?: () => void }): Promise<any> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.claim(claimData, options);\n }\n\n async checkClaimed(claimData: any): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.checkClaimed(claimData);\n }\n\n async getPaused(): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getPaused();\n }\n\n async getClaimFee(contractAddress: string, amount: bigint): Promise<string> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getClaimFee(contractAddress, amount);\n }\n}\n","import { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class StrategyCache {\n private readOnlyStrategies: Map<string, IAirdropStrategy> = new Map();\n private walletStrategies: Map<string, IAirdropStrategy> = new Map();\n\n private getCacheKey(contractAddress: string, chainId: string | number, chainType: string): string {\n return `${chainType}:${contractAddress}:${chainId}`;\n }\n\n getStrategy(contractAddress: string, chainId: string | number, chainType: string, hasWallet: boolean = false): IAirdropStrategy | undefined {\n const cache = hasWallet ? this.walletStrategies : this.readOnlyStrategies;\n const cacheKey = this.getCacheKey(contractAddress, chainId, chainType);\n return cache.get(cacheKey);\n }\n\n setStrategy(contractAddress: string, chainId: string | number, chainType: string, strategy: IAirdropStrategy, hasWallet: boolean = false): void {\n const cache = hasWallet ? this.walletStrategies : this.readOnlyStrategies;\n const cacheKey = this.getCacheKey(contractAddress, chainId, chainType);\n cache.set(cacheKey, strategy);\n }\n\n clearStrategy(contractAddress: string, chainId: string | number, chainType: string, hasWallet?: boolean): void {\n const cacheKey = this.getCacheKey(contractAddress, chainId, chainType);\n if (hasWallet === undefined || hasWallet) {\n this.walletStrategies.delete(cacheKey);\n }\n if (hasWallet === undefined || !hasWallet) {\n this.readOnlyStrategies.delete(cacheKey);\n }\n }\n}\n\nexport const strategyCache = new StrategyCache();\n","import { WalletFactory } from '@sign-global/tokentable-wallets';\nimport {\n bindWallet,\n checkEligibility,\n checkGetSignatures,\n connectGoogleApi,\n connectTwitter,\n disconnectRecipient,\n getAirdropProject,\n cleanUrlParams,\n isMobile,\n getChainRpc,\n CONST,\n EvmSignatureAirdropService,\n SolanaSignatureAirdropService,\n AirdropSigIdentityTypeEnum,\n ChainId,\n ErrorCode,\n IAirdropOptions,\n IAirdropSignatureClaim,\n IAirdropSignatureIdentity,\n IClaimSignature,\n IProject,\n IWalletClient,\n SolanaWalletState,\n ViemWalletClient,\n ChainType\n} from '@sign-global/tokentable-core';\n\nexport class SignatureAirdropClient {\n private projectId?: string;\n private endpoint?: string;\n private project: IProject | undefined;\n private chainRpc?: string;\n protected claims?: IAirdropSignatureClaim[];\n protected identities?: IAirdropSignatureIdentity[];\n private projectPromise: Promise<void> | undefined;\n private authPromise: Promise<void> | undefined;\n private strategyCache: Map<string, EvmSignatureAirdropService | SolanaSignatureAirdropService> = new Map();\n constructor(params: IAirdropOptions) {\n this.projectId = params.projectId;\n this.endpoint = params.endpoint;\n this.chainRpc = params.chainRpc;\n if (this.project) {\n this.project = params.project;\n } else {\n this.projectPromise = this.initializeProjects();\n }\n if (isMobile()) {\n this.authPromise = this.checkAndHandleTwitterCode();\n }\n }\n\n private readonly LOCAL_STORAGE_SID_PREFIX = 'sid_';\n\n private async checkAndHandleTwitterCode() {\n try {\n const urlParams = new URLSearchParams(window.location.search);\n const code = urlParams.get('code');\n const type = urlParams.get('type');\n\n if (code && this.projectId) {\n let res;\n if (type === 'twitter') {\n res = await connectTwitter({ code, projectId: this.projectId }, this.endpoint);\n } else if (type === 'google') {\n res = await connectGoogleApi({ code, projectId: this.projectId }, this.endpoint);\n }\n if (res?.sid) {\n this.setSid(this.projectId!, res.sid);\n } else {\n throw new Error('Failed to connect');\n }\n cleanUrlParams(['code', 'type']);\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n private setSid(projectId: string, sid: string): void {\n window.localStorage.setItem(`${this.LOCAL_STORAGE_SID_PREFIX}${projectId}`, sid);\n }\n\n private async fetchProjectDetails(projectId: string): Promise<void> {\n const project = await getAirdropProject(projectId, this.endpoint);\n this.project = project;\n if (this.chainRpc) return;\n const chainId = project.chainType === ChainType.Evm ? Number(project.chainId) : project.chainId;\n this.chainRpc = getChainRpc(chainId as ChainId);\n }\n\n protected async initializeProjects() {\n try {\n let projectId = this.projectId;\n if (!projectId) {\n return;\n }\n await this.fetchProjectDetails(projectId);\n } catch (error: any) {\n throw new Error(`Failed to initialize project: ${error.message}`);\n }\n }\n\n async getProjectInfo() {\n if (this.projectPromise) {\n await this.projectPromise;\n }\n if (!this.project) throw new Error('Project not found');\n return this.project;\n }\n\n async connectOAuth({\n onSuccess,\n onError,\n type\n }: {\n onSuccess: () => void;\n onError: (error: Error) => void;\n type: AirdropSigIdentityTypeEnum;\n }) {\n const project = await this.getProjectInfo();\n const authorizeUrl = project.identities.find((item: any) => item.identityType === type)?.authorizeUrl;\n if (!authorizeUrl) {\n onError(new Error('Authorize URL not found'));\n return;\n }\n if (isMobile()) {\n const state = encodeURIComponent(window.location.href);\n window.location.href = `${authorizeUrl}&state=${state}`;\n return;\n }\n const onWindowMessage = async (message: any) => {\n const name = message.data?.name;\n if (name && [CONST.TWITTER_AUTH_SUCCESS, CONST.GOOGLE_AUTH_SUCCESS].includes(name)) {\n const { code } = message.data.data || {};\n try {\n let res;\n if (name === CONST.GOOGLE_AUTH_SUCCESS) {\n res = await connectGoogleApi({ code, projectId: project.id }, this.endpoint);\n } else if (name === CONST.TWITTER_AUTH_SUCCESS) {\n res = await connectTwitter({ code, projectId: project.id }, this.endpoint);\n }\n if (res?.sid) {\n this.setSid(project.id, res?.sid);\n onSuccess();\n } else {\n onError(new Error('Failed to connect'));\n }\n } catch (error) {\n onError(error as Error);\n } finally {\n window.removeEventListener('message', onWindowMessage);\n }\n }\n };\n\n window.addEventListener('message', onWindowMessage);\n window.open(`${authorizeUrl}&state=state`, `twitter_auth_${project.id}`, 'width=600,height=800');\n }\n\n async connectX({ onSuccess, onError }: { onSuccess: () => void; onError: (error: Error) => void }) {\n await this.connectOAuth({\n onSuccess,\n onError,\n type: AirdropSigIdentityTypeEnum.Twitter\n });\n }\n\n async connectGoogle({ onSuccess, onError }: { onSuccess: () => void; onError: (error: Error) => void }) {\n await this.connectOAuth({\n onSuccess,\n onError,\n type: AirdropSigIdentityTypeEnum.Google\n });\n }\n\n async connectWallet({\n chainType,\n onSuccess,\n onError\n }: {\n chainType: ChainType;\n onSuccess?: (address: string) => void;\n onError?: (error: any) => void;\n }) {\n try {\n const project = await this.getProjectInfo();\n const wallet = WalletFactory.getWallet(chainType);\n const timestamp = Date.now();\n const recipientTypeMap = {\n [ChainType.Evm]: AirdropSigIdentityTypeEnum.EVMWallet,\n [ChainType.Solana]: AirdropSigIdentityTypeEnum.SolanaWallet,\n [ChainType.Ton]: AirdropSigIdentityTypeEnum.TONWallet\n };\n const msg = [project.id, recipientTypeMap[chainType], timestamp].join(',');\n const signResult = await wallet.signin(msg, false);\n await wallet.disconnect();\n const { message, signature } = signResult || {};\n\n if (this.identities?.find((it) => it.value?.toLowerCase() === wallet.address?.toLowerCase())) {\n onError?.(ErrorCode.WALLET_ALREADY_CONNECTED);\n return;\n }\n\n const payload = {\n signature: signature as string,\n message: message as string,\n key: wallet.publicKey || wallet.address!,\n address: wallet.address!,\n projectId: project.id,\n timestamp: timestamp,\n recipientType: recipientTypeMap[chainType]\n };\n\n const res = await bindWallet(payload, this.endpoint);\n if (res?.sid) {\n this.setSid(project.id, res?.sid);\n }\n onSuccess?.(wallet.address!);\n } catch (error) {\n onError?.(error);\n }\n }\n\n async getClaims() {\n const project = await this.getProjectInfo();\n if (this.authPromise) {\n await this.authPromise;\n }\n const res = await checkEligibility(\n {\n projectId: project.id\n },\n this.endpoint\n );\n this.claims = res.claims;\n this.identities = res.identities;\n return res;\n }\n\n public async disconnectIdentity({\n recipientType,\n recipient\n }: {\n recipientType: AirdropSigIdentityTypeEnum;\n recipient?: string;\n }) {\n const project = await this.getProjectInfo();\n return await disconnectRecipient(\n {\n projectId: project.id,\n recipientType,\n recipient\n },\n this.endpoint\n );\n }\n\n public async getStrategy(\n walletClient?: IWalletClient\n ): Promise<EvmSignatureAirdropService | SolanaSignatureAirdropService> {\n const project = await this.getProjectInfo();\n\n const cacheKey = walletClient\n ? project.chainType === ChainType.Evm\n ? (walletClient as ViemWalletClient).account?.address!\n : project.chainType === ChainType.Solana\n ? (walletClient as SolanaWalletState).publicKey!.toString()\n : 'walletClient'\n : 'default';\n if (this.strategyCache.has(cacheKey)) {\n return this.strategyCache.get(cacheKey)!;\n }\n\n const strategy =\n project.chainType === ChainType.Solana\n ? new SolanaSignatureAirdropService({\n chainId: project.chainId,\n projectId: project.id,\n token: project.tokenAddress,\n walletClient: walletClient as any,\n chainRpc: this.chainRpc!\n })\n : new EvmSignatureAirdropService({\n chainId: Number(project.chainId) as ChainId,\n contractAddress: project.contractAddress,\n walletClient: walletClient as any,\n chainRpc: this.chainRpc!\n });\n this.strategyCache.set(cacheKey, strategy);\n return strategy;\n }\n\n async getVersion(): Promise<string> {\n const strategy = await this.getStrategy();\n return strategy.getVersion();\n }\n\n // solana prams need to wallet\n async getClaimFee(amount?: bigint, walletClient?: IWalletClient): Promise<undefined | bigint> {\n const strategy = await this.getStrategy(walletClient);\n if (!strategy.getClaimFee) {\n throw new Error('getClaimFee is not supported for this chain');\n }\n return await strategy.getClaimFee(this.project?.contractAddress || '', amount || BigInt(1));\n }\n\n async claimAirdrop({\n claimIds,\n walletClient,\n recipient\n }: {\n claimIds: string[];\n walletClient: IWalletClient;\n recipient: string;\n }) {\n if (!claimIds.length) {\n throw new Error('Claim IDs cannot be empty');\n }\n if (!walletClient) {\n throw new Error('Wallet client is required');\n }\n if (!this.claims?.length) {\n throw new Error('No claims available');\n }\n const service = await this.getStrategy(walletClient);\n const project = await this.getProjectInfo();\n const res = await checkGetSignatures(\n {\n claimIds,\n projectId: this.projectId!,\n recipient\n },\n this.endpoint\n );\n if (!res?.signatures?.length) {\n throw new Error('Failed to get signatures');\n }\n const signatureMap = res?.signatures?.reduce(\n (map, item) => {\n map[item.claimId] = item;\n return map;\n },\n {} as Record<string, IClaimSignature>\n );\n const filteredClaims = this.claims.filter((it) => claimIds.includes(it.claimId));\n if (!filteredClaims.length) {\n throw new Error('No matching claims found');\n }\n\n // only evm use\n const defaultRecipient =\n project.chainType === ChainType.Evm ? (walletClient as ViemWalletClient).account?.address! : '';\n\n const claimData = filteredClaims.map((it) => {\n const signature = signatureMap[it.claimId];\n if (!signature) {\n throw new Error(`Signature not found for claim ID: ${it.claimId}`);\n }\n\n return {\n ...it,\n recipient: recipient ? recipient : defaultRecipient,\n ...signature\n };\n });\n\n const hash = (await service!.claim(claimData, recipient)) as `0x${string}`;\n return hash;\n }\n\n async batchCheckClaimed(): Promise<boolean[]> {\n if (!this.claims?.length) return [];\n const strategy = await this.getStrategy();\n if (!strategy.batchFetchClaimed) {\n throw new Error('batchCheckClaimed is not supported for this chain');\n }\n const claimIds = this.claims?.map((it) => it.claimId);\n return strategy.batchFetchClaimed(claimIds);\n }\n\n async getPaused(): Promise<boolean> {\n const strategy = await this.getStrategy();\n if (!strategy.getPaused) {\n throw new Error('getPaused is not supported for this chain');\n }\n return strategy.getPaused();\n }\n}\n"],"mappings":"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","names":["import_tokentable_core","import_tokentable_core","import_tokentable_core","import_tokentable_core","import_tokentable_core"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/AirdropClient.ts","../src/strategies/AirdropStrategyFactory.ts","../src/strategies/EvmAirdropStrategy.ts","../src/strategies/SolanaAirdropStrategy.ts","../src/strategies/TonAirdropStrategy.ts","../src/strategies/StrategyCache.ts","../src/SignatureAirdropClient.ts"],"sourcesContent":["export { AirdropClient } from './AirdropClient';\nexport { SignatureAirdropClient } from './SignatureAirdropClient';\nexport * from '@sign-global/tokentable-core';\nexport * from '@sign-global/tokentable-wallets';\n","import { TonClient } from '@ton/ton';\nimport {\n getAirdropPro,\n getAirdropProject,\n getAirdropQuery,\n getAirdropContractConfig,\n getChainRpc,\n getTonProjectIdByAddress,\n ChainId,\n ChainType,\n ETokenType,\n EvmAirdropVersionEnum,\n IAirdropClaim,\n IAirdropOptions,\n IContractConfig,\n IProject,\n IWalletClient\n} from '@sign-global/tokentable-core';\nimport { AirdropStrategyFactory } from './strategies/AirdropStrategyFactory';\nimport { IAirdropStrategy } from './strategies/IAirdropStrategy';\nimport { strategyCache } from './strategies/StrategyCache';\n\nexport class AirdropClient {\n private tonClient?: TonClient;\n private slug?: string;\n private projectId?: string;\n private endpoint?: string;\n private project: IProject | undefined;\n protected chainRpc?: string;\n protected claims?: IAirdropClaim[];\n private projectPromise: Promise<void> | undefined;\n private claimHook: ((claimData: IAirdropClaim) => { isLegacy: boolean; attestationId: bigint }) | undefined;\n private contractConfig: IContractConfig | null = null;\n\n constructor(params: IAirdropOptions) {\n if ('slug' in params) {\n this.slug = params.slug;\n }\n this.projectId = params.projectId;\n this.endpoint = params.endpoint;\n this.chainRpc = params.chainRpc;\n if (this.project) {\n this.project = params.project;\n } else {\n this.projectPromise = this.initializeProjects();\n }\n }\n\n setTonClient(tonClient: TonClient) {\n this.tonClient = tonClient;\n }\n\n private getTonClient(): TonClient | undefined {\n if (!this.tonClient) {\n return undefined;\n }\n return this.tonClient;\n }\n\n private async fetchProjectFromSlug(address?: string): Promise<string | undefined> {\n if (!this.slug) return undefined;\n\n const res = await getAirdropPro(this.slug, this.endpoint);\n const projectMap = res?.childProjectMapping || {};\n\n return getTonProjectIdByAddress({\n address,\n slug: this.slug,\n data: projectMap\n });\n }\n\n private async fetchProjectDetails(projectId: string): Promise<void> {\n const project = await getAirdropProject(projectId, this.endpoint);\n this.project = project;\n if (this.chainRpc) return;\n const chainId = project.chainType === ChainType.Evm ? Number(project.chainId) : project.chainId;\n this.chainRpc = getChainRpc(chainId as ChainId);\n }\n\n protected async initializeProjects(address?: string) {\n try {\n let projectId = this.projectId;\n\n // If slug is provided, try to fetch project ID from slug\n if (!projectId) {\n projectId = await this.fetchProjectFromSlug(address);\n }\n\n if (!projectId) {\n return;\n }\n\n // Fetch project details\n await this.fetchProjectDetails(projectId);\n } catch (error: any) {\n throw new Error(`Failed to initialize project: ${error.message}`);\n }\n }\n\n async getProjectInfo() {\n if (this.projectPromise) {\n await this.projectPromise;\n }\n if (!this.project) throw new Error('Project not found');\n return this.project;\n }\n\n async getAirdropClaims(data: { address: string }) {\n if (this.slug) {\n await this.initializeProjects(data.address); // Fetch project details by address & slug\n }\n const project = await this.getProjectInfo();\n\n const res = await getAirdropQuery(\n {\n recipient: data.address,\n projectId: project!.id,\n recipientType: project!.recipientType\n },\n this.endpoint\n );\n const claimsRes = res.claims?.map((it) => ({\n ...it,\n project: project!,\n claimId: project!.chainType === ChainType.Evm ? `${project!.id}:${it.leaf}` : `${project!.id}:${it.index}`\n }));\n this.claims = claimsRes;\n return this.claims;\n }\n\n public async getStrategy(walletClient?: IWalletClient): Promise<IAirdropStrategy> {\n const project = await this.getProjectInfo();\n const version = this.contractConfig?.version || undefined;\n\n const hasWallet = !!walletClient;\n\n // Try to get cached strategy\n let strategy = strategyCache.getStrategy(project.contractAddress, project.chainId, project.chainType, hasWallet);\n\n if (!strategy) {\n // Create new strategy if not cached\n strategy = AirdropStrategyFactory.createStrategy({\n chainType: project.chainType,\n contractAddress: project.contractAddress,\n chainId: project.chainId,\n projectId: project.id,\n walletClient,\n tonClient: this.getTonClient(),\n version,\n chainRpc: this.chainRpc!\n });\n\n // Initialize the strategy\n await strategy.initialize(walletClient);\n\n // Cache the initialized strategy\n strategyCache.setStrategy(project.contractAddress, project.chainId, project.chainType, strategy, hasWallet);\n } else if (hasWallet) {\n // If we have a wallet and the strategy exists, just initialize with the new wallet\n await strategy.initialize(walletClient);\n }\n\n return strategy;\n }\n\n private getClaimDataById(claimId: string) {\n const claimData = this.claims?.find((it) => it.claimId === claimId);\n if (!claimData) throw new Error('Claim data not found');\n return claimData;\n }\n\n setClaimHook(fn: (claimData: IAirdropClaim) => { isLegacy: boolean; attestationId: bigint }) {\n this.claimHook = fn;\n }\n\n private getDefaultExtraData() {\n return {\n isLegacy: true,\n attestationId: BigInt(1)\n };\n }\n\n private async calculateClaimFee(project: IProject, claimData: IAirdropClaim): Promise<string | bigint | undefined> {\n const claimAmount = claimData.amount;\n if (project.chainType === ChainType.Evm) {\n const version = await this.getVersion();\n const isNativeFreeVersion =\n project.tokenType === ETokenType.Native &&\n [EvmAirdropVersionEnum.V3, EvmAirdropVersionEnum.V4].includes(version as EvmAirdropVersionEnum);\n if (isNativeFreeVersion) {\n return undefined;\n }\n if (version.includes('TokenTableMerkleDistributorWithFees')) {\n const fees = claimData.fees;\n return fees ? BigInt(fees) : '0';\n }\n return await this.getClaimFee(BigInt(claimAmount));\n }\n\n if (project.chainType === ChainType.Ton) {\n return await this.getClaimFee(BigInt(claimAmount));\n }\n\n return undefined;\n }\n\n async claimAirdrop(\n { claimId, walletClient }: { claimId: string; walletClient: IWalletClient },\n options?: { onLoading?: () => void }\n ) {\n // Get claim data and initialize strategy\n const claimData = this.getClaimDataById(claimId);\n const strategy = await this.getStrategy(walletClient);\n const project = await this.getProjectInfo();\n\n // Process extra data\n const extraData =\n project.chainType === ChainType.Ton\n ? undefined\n : this.claimHook\n ? this.claimHook(claimData)\n : this.getDefaultExtraData();\n\n // Calculate claim value based on project type\n const value = await this.calculateClaimFee(project, claimData);\n\n // Execute claim with processed data\n return strategy.claim(\n {\n ...claimData,\n extraData,\n value\n },\n options\n );\n }\n\n async checkClaimed(claimId: string): Promise<boolean> {\n const claimData = this.getClaimDataById(claimId);\n const strategy = await this.getStrategy();\n return strategy.checkClaimed(claimData);\n }\n\n private async getContractConfig(): Promise<IContractConfig | null> {\n try {\n const project = await this.getProjectInfo();\n\n if (!this.contractConfig && [ChainType.Evm, ChainType.Ton].includes(project.chainType)) {\n this.contractConfig = await getAirdropContractConfig(\n {\n chainId: project.chainId,\n chainType: project.chainType,\n contractAddress: project.contractAddress\n },\n this.endpoint\n );\n }\n return this.contractConfig;\n } catch (error) {\n console.error('Error fetching contract config:', error);\n return null;\n }\n }\n\n async getVersion(): Promise<string> {\n const config = await this.getContractConfig();\n if (config?.version) {\n return config.version;\n }\n\n const strategy = await this.getStrategy();\n return strategy.getVersion();\n }\n\n async getPaused(): Promise<boolean> {\n const config = await this.getContractConfig();\n if (config && config?.paused !== null) {\n return config.paused;\n }\n\n const strategy = await this.getStrategy();\n if (!strategy.getPaused) {\n throw new Error('getPaused is not supported for this chain');\n }\n return strategy.getPaused();\n }\n\n async getClaimFee(amount?: bigint, walletClient?: IWalletClient): Promise<string | bigint> {\n const config = await this.getContractConfig();\n if (config?.claimFee) {\n return config.claimFee;\n }\n\n const strategy = await this.getStrategy(walletClient);\n if (!strategy.getClaimFee) {\n throw new Error('getClaimFee is not supported for this chain');\n }\n return strategy.getClaimFee(this.project?.contractAddress || '', amount || BigInt(0));\n }\n\n // params claimId[]\n async batchCheckClaimed(): Promise<{ result: boolean; status: string }[]> {\n const strategy = await this.getStrategy();\n if (!strategy.batchCheckClaimed) {\n throw new Error('batchCheckClaimed is not supported for this chain');\n }\n const leafs = this.claims?.map((it) => it.leaf);\n if (!leafs) return [];\n return strategy.batchCheckClaimed(leafs);\n }\n\n async getNFT(): Promise<string> {\n const strategy = await this.getStrategy();\n if (!strategy.getNFT) {\n throw new Error('getNFT is not supported for this chain');\n }\n return strategy.getNFT();\n }\n\n async getKycThreshold(): Promise<bigint> {\n const strategy = await this.getStrategy();\n if (!strategy.getKycThreshold) {\n throw new Error('getKycThreshold is not supported for this chain');\n }\n return strategy.getKycThreshold();\n }\n}\n","import { ChainType, IWalletClient } from '@sign-global/tokentable-core';\nimport { EvmAirdropStrategy } from './EvmAirdropStrategy';\nimport { IAirdropStrategy, IAirdropStrategyConstructor } from './IAirdropStrategy';\nimport { SolanaAirdropStrategy } from './SolanaAirdropStrategy';\nimport { TonAirdropStrategy } from './TonAirdropStrategy';\nimport { TonClient } from '@ton/ton';\n\nexport class AirdropStrategyFactory {\n private static strategyMap: Record<ChainType, IAirdropStrategyConstructor | null> = {\n [ChainType.Evm]: EvmAirdropStrategy,\n [ChainType.Ton]: TonAirdropStrategy,\n [ChainType.Solana]: SolanaAirdropStrategy\n };\n\n static createStrategy(params: {\n chainType: ChainType;\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n tonClient?: TonClient;\n version?: string;\n projectId: string;\n chainRpc: string;\n }): IAirdropStrategy {\n const { chainType, ...strategyParams } = params;\n const StrategyClass = this.strategyMap[chainType];\n\n if (!StrategyClass) {\n throw new Error(`Unsupported chain type: ${chainType}`);\n }\n\n return new StrategyClass(strategyParams);\n }\n}\n","import { EvmAirdropService, ChainId, IWalletClient } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\nimport { WalletClient as ViemWalletClient } from 'viem';\n\nexport class EvmAirdropStrategy implements IAirdropStrategy {\n private service: EvmAirdropService | undefined;\n private readonly contractAddress: string;\n private readonly chainId: ChainId;\n private readonly chainRpc: string;\n private walletClient?: ViemWalletClient;\n private cachedVersion: string | null = null;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n chainRpc: string;\n }) {\n this.contractAddress = params.contractAddress;\n this.chainId = Number(params.chainId) as ChainId;\n this.chainRpc = params.chainRpc;\n if (params.walletClient) {\n this.walletClient = params.walletClient as ViemWalletClient;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as ViemWalletClient;\n }\n this.service = new EvmAirdropService({\n contractAddress: this.contractAddress,\n chainId: this.chainId,\n walletClient: this.walletClient,\n chainRpc: this.chainRpc\n });\n }\n\n isInitialized(): boolean {\n return !!this.service;\n }\n\n async getVersion(): Promise<string> {\n if (this.cachedVersion) {\n return this.cachedVersion;\n }\n if (!this.service) throw new Error('Strategy not initialized');\n this.cachedVersion = await this.service.getVersion();\n return this.cachedVersion;\n }\n\n async claim(claimData: any): Promise<any> {\n if (!this.service) throw new Error('Strategy not initialized');\n const { proof, group, data, value, extraData } = claimData;\n return this.service.claim({\n proof,\n group,\n data,\n value,\n extraData\n });\n }\n\n async checkClaimed(claimData: any): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.isLeafUsed(claimData.leaf);\n }\n\n async batchCheckClaimed(leafs: string[]): Promise<{ result: boolean; status: string }[]> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.batchFetchClaimed(leafs);\n }\n\n async getNFT(): Promise<string> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getNFT() as unknown as string;\n }\n\n async getKycThreshold(): Promise<bigint> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getKycThreshold();\n }\n\n async getClaimFee(contractAddress: string, amount: bigint): Promise<bigint> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getClaimFee(contractAddress, amount) as unknown as bigint;\n }\n}\n","import { SolanaAirdropService, ChainId, IWalletClient, SolanaWalletState } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class SolanaAirdropStrategy implements IAirdropStrategy {\n private service: SolanaAirdropService | undefined;\n private readonly chainId: ChainId;\n private readonly chainRpc: string;\n private walletClient?: SolanaWalletState;\n private cachedVersion: string | null = null;\n private projectId: string;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n projectId: string;\n chainRpc: string;\n }) {\n this.chainId = params.chainId as ChainId;\n this.projectId = params.projectId;\n this.chainRpc = params.chainRpc;\n if (params.walletClient) {\n this.walletClient = params.walletClient as SolanaWalletState;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as SolanaWalletState;\n }\n this.service = new SolanaAirdropService({\n projectId: this.projectId,\n chainId: this.chainId as string,\n walletClient: this.walletClient as any,\n chainRpc: this.chainRpc\n });\n }\n\n isInitialized(): boolean {\n return !!this.service;\n }\n\n async getVersion(): Promise<string> {\n if (this.cachedVersion) {\n return this.cachedVersion;\n }\n if (!this.service) throw new Error('Strategy not initialized');\n this.cachedVersion = await this.service.getVersion();\n return this.cachedVersion;\n }\n\n async claim(claimData: any): Promise<any> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.claim(claimData);\n }\n\n async checkClaimed(claimData: any): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.isLeafUsed(claimData.leaf);\n }\n\n async batchCheckClaimed(leafs: string[]): Promise<{ result: boolean; status: string }[]> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.batchFetchClaimed(leafs);\n }\n\n async getClaimFee(contractAddress: string, amount: bigint): Promise<bigint> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getClaimFee(contractAddress, amount) as unknown as bigint;\n }\n\n async getPaused(): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getPaused();\n }\n}\n","import { TonClient } from '@ton/ton';\nimport { TonConnectUI } from '@tonconnect/ui-react';\nimport { TonAirdropService, IWalletClient } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class TonAirdropStrategy implements IAirdropStrategy {\n private service: TonAirdropService | undefined;\n private readonly contractAddress: string;\n private readonly chainId: string;\n private readonly tonClient?: TonClient;\n private walletClient?: TonConnectUI;\n private cachedVersion: string | null = null;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n tonClient?: TonClient;\n version?: string;\n }) {\n this.contractAddress = params.contractAddress;\n this.chainId = params.chainId.toString();\n this.tonClient = params.tonClient;\n if (params.walletClient) {\n this.walletClient = params.walletClient as TonConnectUI;\n }\n if (params.version) {\n this.cachedVersion = params.version;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as TonConnectUI;\n }\n this.service = new TonAirdropService({\n address: this.contractAddress,\n chainId: this.chainId,\n walletClient: this.walletClient,\n tonClient: this.tonClient,\n version: this.cachedVersion || undefined\n });\n }\n\n isInitialized(): boolean {\n return !!this.service;\n }\n\n async getVersion(): Promise<string> {\n if (!this.service) throw new Error('Strategy not initialized');\n if (!this.cachedVersion) {\n this.cachedVersion = await this.service.getVersion();\n }\n return this.cachedVersion;\n }\n\n async claim(claimData: any, options?: { onLoading?: () => void }): Promise<any> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.claim(claimData, options);\n }\n\n async checkClaimed(claimData: any): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.checkClaimed(claimData);\n }\n\n async getPaused(): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getPaused();\n }\n\n async getClaimFee(contractAddress: string, amount: bigint): Promise<string> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getClaimFee(contractAddress, amount);\n }\n}\n","import { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class StrategyCache {\n private readOnlyStrategies: Map<string, IAirdropStrategy> = new Map();\n private walletStrategies: Map<string, IAirdropStrategy> = new Map();\n\n private getCacheKey(contractAddress: string, chainId: string | number, chainType: string): string {\n return `${chainType}:${contractAddress}:${chainId}`;\n }\n\n getStrategy(contractAddress: string, chainId: string | number, chainType: string, hasWallet: boolean = false): IAirdropStrategy | undefined {\n const cache = hasWallet ? this.walletStrategies : this.readOnlyStrategies;\n const cacheKey = this.getCacheKey(contractAddress, chainId, chainType);\n return cache.get(cacheKey);\n }\n\n setStrategy(contractAddress: string, chainId: string | number, chainType: string, strategy: IAirdropStrategy, hasWallet: boolean = false): void {\n const cache = hasWallet ? this.walletStrategies : this.readOnlyStrategies;\n const cacheKey = this.getCacheKey(contractAddress, chainId, chainType);\n cache.set(cacheKey, strategy);\n }\n\n clearStrategy(contractAddress: string, chainId: string | number, chainType: string, hasWallet?: boolean): void {\n const cacheKey = this.getCacheKey(contractAddress, chainId, chainType);\n if (hasWallet === undefined || hasWallet) {\n this.walletStrategies.delete(cacheKey);\n }\n if (hasWallet === undefined || !hasWallet) {\n this.readOnlyStrategies.delete(cacheKey);\n }\n }\n}\n\nexport const strategyCache = new StrategyCache();\n","import { WalletFactory } from '@sign-global/tokentable-wallets';\nimport {\n bindWallet,\n checkEligibility,\n checkGetSignatures,\n connectGoogleApi,\n connectTwitter,\n disconnectRecipient,\n getAirdropProject,\n cleanUrlParams,\n isMobile,\n getChainRpc,\n CONST,\n EvmSignatureAirdropService,\n SolanaSignatureAirdropService,\n SuiSignatureAirdropService,\n AirdropSigIdentityTypeEnum,\n ChainId,\n ErrorCode,\n IAirdropOptions,\n IAirdropSignatureClaim,\n IAirdropSignatureIdentity,\n IClaimSignature,\n IProject,\n IWalletClient,\n SolanaWalletState,\n ViemWalletClient,\n ChainType,\n SuiWalletClient\n} from '@sign-global/tokentable-core';\n\nexport class SignatureAirdropClient {\n private projectId?: string;\n private endpoint?: string;\n private project: IProject | undefined;\n private chainRpc?: string;\n protected claims?: IAirdropSignatureClaim[];\n protected identities?: IAirdropSignatureIdentity[];\n private projectPromise: Promise<void> | undefined;\n private authPromise: Promise<void> | undefined;\n private strategyCache: Map<\n string,\n EvmSignatureAirdropService | SolanaSignatureAirdropService | SuiSignatureAirdropService\n > = new Map();\n constructor(params: IAirdropOptions) {\n this.projectId = params.projectId;\n this.endpoint = params.endpoint;\n this.chainRpc = params.chainRpc;\n if (this.project) {\n this.project = params.project;\n } else {\n this.projectPromise = this.initializeProjects();\n }\n if (isMobile()) {\n this.authPromise = this.checkAndHandleTwitterCode();\n }\n }\n\n private readonly LOCAL_STORAGE_SID_PREFIX = 'sid_';\n\n private async checkAndHandleTwitterCode() {\n try {\n const urlParams = new URLSearchParams(window.location.search);\n const code = urlParams.get('code');\n const type = urlParams.get('type');\n\n if (code && this.projectId) {\n let res;\n if (type === 'twitter') {\n res = await connectTwitter({ code, projectId: this.projectId }, this.endpoint);\n } else if (type === 'google') {\n res = await connectGoogleApi({ code, projectId: this.projectId }, this.endpoint);\n }\n if (res?.sid) {\n this.setSid(this.projectId!, res.sid);\n } else {\n throw new Error('Failed to connect');\n }\n cleanUrlParams(['code', 'type']);\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n private setSid(projectId: string, sid: string): void {\n window.localStorage.setItem(`${this.LOCAL_STORAGE_SID_PREFIX}${projectId}`, sid);\n }\n\n private async fetchProjectDetails(projectId: string): Promise<void> {\n const project = await getAirdropProject(projectId, this.endpoint);\n this.project = project;\n if (this.chainRpc) return;\n const chainId = project.chainType === ChainType.Evm ? Number(project.chainId) : project.chainId;\n this.chainRpc = getChainRpc(chainId as ChainId);\n }\n\n protected async initializeProjects() {\n try {\n let projectId = this.projectId;\n if (!projectId) {\n return;\n }\n await this.fetchProjectDetails(projectId);\n } catch (error: any) {\n throw new Error(`Failed to initialize project: ${error.message}`);\n }\n }\n\n async getProjectInfo() {\n if (this.projectPromise) {\n await this.projectPromise;\n }\n if (!this.project) throw new Error('Project not found');\n return this.project;\n }\n\n async connectOAuth({\n onSuccess,\n onError,\n type\n }: {\n onSuccess: () => void;\n onError: (error: Error) => void;\n type: AirdropSigIdentityTypeEnum;\n }) {\n const project = await this.getProjectInfo();\n const authorizeUrl = project.identities.find((item: any) => item.identityType === type)?.authorizeUrl;\n if (!authorizeUrl) {\n onError(new Error('Authorize URL not found'));\n return;\n }\n if (isMobile()) {\n const state = encodeURIComponent(window.location.href);\n window.location.href = `${authorizeUrl}&state=${state}`;\n return;\n }\n const onWindowMessage = async (message: any) => {\n const name = message.data?.name;\n if (name && [CONST.TWITTER_AUTH_SUCCESS, CONST.GOOGLE_AUTH_SUCCESS].includes(name)) {\n const { code } = message.data.data || {};\n try {\n let res;\n if (name === CONST.GOOGLE_AUTH_SUCCESS) {\n res = await connectGoogleApi({ code, projectId: project.id }, this.endpoint);\n } else if (name === CONST.TWITTER_AUTH_SUCCESS) {\n res = await connectTwitter({ code, projectId: project.id }, this.endpoint);\n }\n if (res?.sid) {\n this.setSid(project.id, res?.sid);\n onSuccess();\n } else {\n onError(new Error('Failed to connect'));\n }\n } catch (error) {\n onError(error as Error);\n } finally {\n window.removeEventListener('message', onWindowMessage);\n }\n }\n };\n\n window.addEventListener('message', onWindowMessage);\n window.open(`${authorizeUrl}&state=state`, `twitter_auth_${project.id}`, 'width=600,height=800');\n }\n\n async connectX({ onSuccess, onError }: { onSuccess: () => void; onError: (error: Error) => void }) {\n await this.connectOAuth({\n onSuccess,\n onError,\n type: AirdropSigIdentityTypeEnum.Twitter\n });\n }\n\n async connectGoogle({ onSuccess, onError }: { onSuccess: () => void; onError: (error: Error) => void }) {\n await this.connectOAuth({\n onSuccess,\n onError,\n type: AirdropSigIdentityTypeEnum.Google\n });\n }\n\n async connectWallet({\n chainType,\n onSuccess,\n onError\n }: {\n chainType: ChainType;\n onSuccess?: (address: string) => void;\n onError?: (error: any) => void;\n }) {\n try {\n const project = await this.getProjectInfo();\n const wallet = WalletFactory.getWallet(chainType);\n const timestamp = Date.now();\n const recipientTypeMap = {\n [ChainType.Evm]: AirdropSigIdentityTypeEnum.EVMWallet,\n [ChainType.Solana]: AirdropSigIdentityTypeEnum.SolanaWallet,\n [ChainType.Ton]: AirdropSigIdentityTypeEnum.TONWallet,\n [ChainType.Sui]: ''\n };\n const msg = [project.id, recipientTypeMap[chainType], timestamp].join(',');\n const signResult = await wallet.signin(msg, false);\n await wallet.disconnect();\n const { message, signature, signedMessage } = signResult || {};\n\n if (this.identities?.find((it) => it.value?.toLowerCase() === wallet.address?.toLowerCase())) {\n onError?.(ErrorCode.WALLET_ALREADY_CONNECTED);\n return;\n }\n\n const payload = {\n signature: signature as string,\n message: message as string,\n key: wallet.publicKey || wallet.address!,\n address: wallet.address!,\n projectId: project.id,\n timestamp: timestamp,\n recipientType: recipientTypeMap[chainType],\n encodedMessage: signedMessage\n };\n\n const res = await bindWallet(payload, this.endpoint);\n if (res?.sid) {\n this.setSid(project.id, res?.sid);\n }\n onSuccess?.(wallet.address!);\n } catch (error) {\n onError?.(error);\n }\n }\n\n async getClaims() {\n const project = await this.getProjectInfo();\n if (this.authPromise) {\n await this.authPromise;\n }\n const res = await checkEligibility(\n {\n projectId: project.id\n },\n this.endpoint\n );\n this.claims = res.claims;\n this.identities = res.identities;\n return res;\n }\n\n public async disconnectIdentity({\n recipientType,\n recipient\n }: {\n recipientType: AirdropSigIdentityTypeEnum;\n recipient?: string;\n }) {\n const project = await this.getProjectInfo();\n return await disconnectRecipient(\n {\n projectId: project.id,\n recipientType,\n recipient\n },\n this.endpoint\n );\n }\n\n public async getStrategy(\n walletClient?: IWalletClient\n ): Promise<EvmSignatureAirdropService | SolanaSignatureAirdropService | SuiSignatureAirdropService> {\n const project = await this.getProjectInfo();\n\n let cacheKey = 'default';\n if (walletClient) {\n if (project.chainType === ChainType.Evm) {\n cacheKey = (walletClient as ViemWalletClient).account?.address!;\n } else if (project.chainType === ChainType.Solana) {\n cacheKey = (walletClient as SolanaWalletState).publicKey!.toString();\n } else if (project.chainType === ChainType.Sui) {\n cacheKey = (walletClient as SuiWalletClient).accounts[0].address;\n }\n } else {\n cacheKey = 'walletClient';\n }\n\n if (this.strategyCache.has(cacheKey)) {\n return this.strategyCache.get(cacheKey)!;\n }\n\n let strategy = null;\n if (project.chainType === ChainType.Solana) {\n strategy = new SolanaSignatureAirdropService({\n chainId: project.chainId,\n projectId: project.id,\n token: project.tokenAddress,\n walletClient: walletClient as any,\n chainRpc: this.chainRpc!\n });\n } else if (project.chainType === ChainType.Sui) {\n strategy = new SuiSignatureAirdropService({\n chainId: project.chainId as any,\n coinType: project.tokenAddress,\n walletClient: walletClient as any,\n chainRpc: this.chainRpc!,\n distributorId: project.contractAddress\n });\n } else if (project.chainType === ChainType.Evm) {\n strategy = new EvmSignatureAirdropService({\n chainId: Number(project.chainId) as ChainId,\n contractAddress: project.contractAddress,\n walletClient: walletClient as any,\n chainRpc: this.chainRpc!\n });\n }\n if (!strategy) {\n throw new Error('No strategy found');\n }\n this.strategyCache.set(cacheKey, strategy);\n return strategy;\n }\n\n async getVersion(): Promise<string> {\n const strategy = await this.getStrategy();\n return strategy.getVersion();\n }\n\n // solana prams need to wallet\n async getClaimFee(amount?: bigint, walletClient?: IWalletClient): Promise<undefined | bigint> {\n const strategy = await this.getStrategy(walletClient);\n if (!strategy.getClaimFee) {\n throw new Error('getClaimFee is not supported for this chain');\n }\n return await strategy.getClaimFee(this.project?.contractAddress || '', amount || BigInt(1));\n }\n\n async claimAirdrop({\n claimIds,\n walletClient,\n recipient\n }: {\n claimIds: string[];\n walletClient: IWalletClient;\n recipient: string;\n }) {\n if (!claimIds.length) {\n throw new Error('Claim IDs cannot be empty');\n }\n if (!walletClient) {\n throw new Error('Wallet client is required');\n }\n if (!this.claims?.length) {\n throw new Error('No claims available');\n }\n const service = await this.getStrategy(walletClient);\n const project = await this.getProjectInfo();\n const res = await checkGetSignatures(\n {\n claimIds,\n projectId: this.projectId!,\n recipient\n },\n this.endpoint\n );\n if (!res?.signatures?.length) {\n throw new Error('Failed to get signatures');\n }\n const signatureMap = res?.signatures?.reduce(\n (map, item) => {\n map[item.claimId] = item;\n return map;\n },\n {} as Record<string, IClaimSignature>\n );\n const filteredClaims = this.claims.filter((it) => claimIds.includes(it.claimId));\n if (!filteredClaims.length) {\n throw new Error('No matching claims found');\n }\n\n // only evm use\n const defaultRecipient =\n project.chainType === ChainType.Evm ? (walletClient as ViemWalletClient).account?.address! : '';\n\n const claimData = filteredClaims.map((it) => {\n const signature = signatureMap[it.claimId];\n if (!signature) {\n throw new Error(`Signature not found for claim ID: ${it.claimId}`);\n }\n\n return {\n ...it,\n recipient: recipient ? recipient : defaultRecipient,\n ...signature\n };\n });\n\n const hash = (await service!.claim(claimData, recipient)) as `0x${string}`;\n return hash;\n }\n\n async batchCheckClaimed(): Promise<boolean[]> {\n if (!this.claims?.length) return [];\n const strategy = await this.getStrategy();\n if (!strategy.batchFetchClaimed) {\n throw new Error('batchCheckClaimed is not supported for this chain');\n }\n const claimIds = this.claims?.map((it) => it.claimId);\n return strategy.batchFetchClaimed(claimIds);\n }\n\n async getPaused(): Promise<boolean> {\n const strategy = await this.getStrategy();\n if (!strategy.getPaused) {\n throw new Error('getPaused is not supported for this chain');\n }\n return strategy.getPaused();\n }\n}\n"],"mappings":"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","names":["import_tokentable_core","import_tokentable_core","import_tokentable_core","import_tokentable_core","import_tokentable_core"]}
|
package/dist/index.mjs
CHANGED
|
@@ -513,6 +513,7 @@ import {
|
|
|
513
513
|
CONST,
|
|
514
514
|
EvmSignatureAirdropService,
|
|
515
515
|
SolanaSignatureAirdropService,
|
|
516
|
+
SuiSignatureAirdropService,
|
|
516
517
|
AirdropSigIdentityTypeEnum,
|
|
517
518
|
ErrorCode,
|
|
518
519
|
ChainType as ChainType3
|
|
@@ -661,12 +662,13 @@ var SignatureAirdropClient = class {
|
|
|
661
662
|
const recipientTypeMap = {
|
|
662
663
|
[ChainType3.Evm]: AirdropSigIdentityTypeEnum.EVMWallet,
|
|
663
664
|
[ChainType3.Solana]: AirdropSigIdentityTypeEnum.SolanaWallet,
|
|
664
|
-
[ChainType3.Ton]: AirdropSigIdentityTypeEnum.TONWallet
|
|
665
|
+
[ChainType3.Ton]: AirdropSigIdentityTypeEnum.TONWallet,
|
|
666
|
+
[ChainType3.Sui]: ""
|
|
665
667
|
};
|
|
666
668
|
const msg = [project.id, recipientTypeMap[chainType], timestamp].join(",");
|
|
667
669
|
const signResult = await wallet.signin(msg, false);
|
|
668
670
|
await wallet.disconnect();
|
|
669
|
-
const { message, signature } = signResult || {};
|
|
671
|
+
const { message, signature, signedMessage } = signResult || {};
|
|
670
672
|
if (this.identities?.find((it) => it.value?.toLowerCase() === wallet.address?.toLowerCase())) {
|
|
671
673
|
onError?.(ErrorCode.WALLET_ALREADY_CONNECTED);
|
|
672
674
|
return;
|
|
@@ -678,7 +680,8 @@ var SignatureAirdropClient = class {
|
|
|
678
680
|
address: wallet.address,
|
|
679
681
|
projectId: project.id,
|
|
680
682
|
timestamp,
|
|
681
|
-
recipientType: recipientTypeMap[chainType]
|
|
683
|
+
recipientType: recipientTypeMap[chainType],
|
|
684
|
+
encodedMessage: signedMessage
|
|
682
685
|
};
|
|
683
686
|
const res = await bindWallet(payload, this.endpoint);
|
|
684
687
|
if (res?.sid) {
|
|
@@ -720,22 +723,49 @@ var SignatureAirdropClient = class {
|
|
|
720
723
|
}
|
|
721
724
|
async getStrategy(walletClient) {
|
|
722
725
|
const project = await this.getProjectInfo();
|
|
723
|
-
|
|
726
|
+
let cacheKey = "default";
|
|
727
|
+
if (walletClient) {
|
|
728
|
+
if (project.chainType === ChainType3.Evm) {
|
|
729
|
+
cacheKey = walletClient.account?.address;
|
|
730
|
+
} else if (project.chainType === ChainType3.Solana) {
|
|
731
|
+
cacheKey = walletClient.publicKey.toString();
|
|
732
|
+
} else if (project.chainType === ChainType3.Sui) {
|
|
733
|
+
cacheKey = walletClient.accounts[0].address;
|
|
734
|
+
}
|
|
735
|
+
} else {
|
|
736
|
+
cacheKey = "walletClient";
|
|
737
|
+
}
|
|
724
738
|
if (this.strategyCache.has(cacheKey)) {
|
|
725
739
|
return this.strategyCache.get(cacheKey);
|
|
726
740
|
}
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
741
|
+
let strategy = null;
|
|
742
|
+
if (project.chainType === ChainType3.Solana) {
|
|
743
|
+
strategy = new SolanaSignatureAirdropService({
|
|
744
|
+
chainId: project.chainId,
|
|
745
|
+
projectId: project.id,
|
|
746
|
+
token: project.tokenAddress,
|
|
747
|
+
walletClient,
|
|
748
|
+
chainRpc: this.chainRpc
|
|
749
|
+
});
|
|
750
|
+
} else if (project.chainType === ChainType3.Sui) {
|
|
751
|
+
strategy = new SuiSignatureAirdropService({
|
|
752
|
+
chainId: project.chainId,
|
|
753
|
+
coinType: project.tokenAddress,
|
|
754
|
+
walletClient,
|
|
755
|
+
chainRpc: this.chainRpc,
|
|
756
|
+
distributorId: project.contractAddress
|
|
757
|
+
});
|
|
758
|
+
} else if (project.chainType === ChainType3.Evm) {
|
|
759
|
+
strategy = new EvmSignatureAirdropService({
|
|
760
|
+
chainId: Number(project.chainId),
|
|
761
|
+
contractAddress: project.contractAddress,
|
|
762
|
+
walletClient,
|
|
763
|
+
chainRpc: this.chainRpc
|
|
764
|
+
});
|
|
765
|
+
}
|
|
766
|
+
if (!strategy) {
|
|
767
|
+
throw new Error("No strategy found");
|
|
768
|
+
}
|
|
739
769
|
this.strategyCache.set(cacheKey, strategy);
|
|
740
770
|
return strategy;
|
|
741
771
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AirdropClient.ts","../src/strategies/AirdropStrategyFactory.ts","../src/strategies/EvmAirdropStrategy.ts","../src/strategies/SolanaAirdropStrategy.ts","../src/strategies/TonAirdropStrategy.ts","../src/strategies/StrategyCache.ts","../src/SignatureAirdropClient.ts","../src/index.ts"],"sourcesContent":["import { TonClient } from '@ton/ton';\nimport {\n getAirdropPro,\n getAirdropProject,\n getAirdropQuery,\n getAirdropContractConfig,\n getChainRpc,\n getTonProjectIdByAddress,\n ChainId,\n ChainType,\n ETokenType,\n EvmAirdropVersionEnum,\n IAirdropClaim,\n IAirdropOptions,\n IContractConfig,\n IProject,\n IWalletClient\n} from '@sign-global/tokentable-core';\nimport { AirdropStrategyFactory } from './strategies/AirdropStrategyFactory';\nimport { IAirdropStrategy } from './strategies/IAirdropStrategy';\nimport { strategyCache } from './strategies/StrategyCache';\n\nexport class AirdropClient {\n private tonClient?: TonClient;\n private slug?: string;\n private projectId?: string;\n private endpoint?: string;\n private project: IProject | undefined;\n protected chainRpc?: string;\n protected claims?: IAirdropClaim[];\n private projectPromise: Promise<void> | undefined;\n private claimHook: ((claimData: IAirdropClaim) => { isLegacy: boolean; attestationId: bigint }) | undefined;\n private contractConfig: IContractConfig | null = null;\n\n constructor(params: IAirdropOptions) {\n if ('slug' in params) {\n this.slug = params.slug;\n }\n this.projectId = params.projectId;\n this.endpoint = params.endpoint;\n this.chainRpc = params.chainRpc;\n if (this.project) {\n this.project = params.project;\n } else {\n this.projectPromise = this.initializeProjects();\n }\n }\n\n setTonClient(tonClient: TonClient) {\n this.tonClient = tonClient;\n }\n\n private getTonClient(): TonClient | undefined {\n if (!this.tonClient) {\n return undefined;\n }\n return this.tonClient;\n }\n\n private async fetchProjectFromSlug(address?: string): Promise<string | undefined> {\n if (!this.slug) return undefined;\n\n const res = await getAirdropPro(this.slug, this.endpoint);\n const projectMap = res?.childProjectMapping || {};\n\n return getTonProjectIdByAddress({\n address,\n slug: this.slug,\n data: projectMap\n });\n }\n\n private async fetchProjectDetails(projectId: string): Promise<void> {\n const project = await getAirdropProject(projectId, this.endpoint);\n this.project = project;\n if (this.chainRpc) return;\n const chainId = project.chainType === ChainType.Evm ? Number(project.chainId) : project.chainId;\n this.chainRpc = getChainRpc(chainId as ChainId);\n }\n\n protected async initializeProjects(address?: string) {\n try {\n let projectId = this.projectId;\n\n // If slug is provided, try to fetch project ID from slug\n if (!projectId) {\n projectId = await this.fetchProjectFromSlug(address);\n }\n\n if (!projectId) {\n return;\n }\n\n // Fetch project details\n await this.fetchProjectDetails(projectId);\n } catch (error: any) {\n throw new Error(`Failed to initialize project: ${error.message}`);\n }\n }\n\n async getProjectInfo() {\n if (this.projectPromise) {\n await this.projectPromise;\n }\n if (!this.project) throw new Error('Project not found');\n return this.project;\n }\n\n async getAirdropClaims(data: { address: string }) {\n if (this.slug) {\n await this.initializeProjects(data.address); // Fetch project details by address & slug\n }\n const project = await this.getProjectInfo();\n\n const res = await getAirdropQuery(\n {\n recipient: data.address,\n projectId: project!.id,\n recipientType: project!.recipientType\n },\n this.endpoint\n );\n const claimsRes = res.claims?.map((it) => ({\n ...it,\n project: project!,\n claimId: project!.chainType === ChainType.Evm ? `${project!.id}:${it.leaf}` : `${project!.id}:${it.index}`\n }));\n this.claims = claimsRes;\n return this.claims;\n }\n\n public async getStrategy(walletClient?: IWalletClient): Promise<IAirdropStrategy> {\n const project = await this.getProjectInfo();\n const version = this.contractConfig?.version || undefined;\n\n const hasWallet = !!walletClient;\n\n // Try to get cached strategy\n let strategy = strategyCache.getStrategy(project.contractAddress, project.chainId, project.chainType, hasWallet);\n\n if (!strategy) {\n // Create new strategy if not cached\n strategy = AirdropStrategyFactory.createStrategy({\n chainType: project.chainType,\n contractAddress: project.contractAddress,\n chainId: project.chainId,\n projectId: project.id,\n walletClient,\n tonClient: this.getTonClient(),\n version,\n chainRpc: this.chainRpc!\n });\n\n // Initialize the strategy\n await strategy.initialize(walletClient);\n\n // Cache the initialized strategy\n strategyCache.setStrategy(project.contractAddress, project.chainId, project.chainType, strategy, hasWallet);\n } else if (hasWallet) {\n // If we have a wallet and the strategy exists, just initialize with the new wallet\n await strategy.initialize(walletClient);\n }\n\n return strategy;\n }\n\n private getClaimDataById(claimId: string) {\n const claimData = this.claims?.find((it) => it.claimId === claimId);\n if (!claimData) throw new Error('Claim data not found');\n return claimData;\n }\n\n setClaimHook(fn: (claimData: IAirdropClaim) => { isLegacy: boolean; attestationId: bigint }) {\n this.claimHook = fn;\n }\n\n private getDefaultExtraData() {\n return {\n isLegacy: true,\n attestationId: BigInt(1)\n };\n }\n\n private async calculateClaimFee(project: IProject, claimData: IAirdropClaim): Promise<string | bigint | undefined> {\n const claimAmount = claimData.amount;\n if (project.chainType === ChainType.Evm) {\n const version = await this.getVersion();\n const isNativeFreeVersion =\n project.tokenType === ETokenType.Native &&\n [EvmAirdropVersionEnum.V3, EvmAirdropVersionEnum.V4].includes(version as EvmAirdropVersionEnum);\n if (isNativeFreeVersion) {\n return undefined;\n }\n if (version.includes('TokenTableMerkleDistributorWithFees')) {\n const fees = claimData.fees;\n return fees ? BigInt(fees) : '0';\n }\n return await this.getClaimFee(BigInt(claimAmount));\n }\n\n if (project.chainType === ChainType.Ton) {\n return await this.getClaimFee(BigInt(claimAmount));\n }\n\n return undefined;\n }\n\n async claimAirdrop(\n { claimId, walletClient }: { claimId: string; walletClient: IWalletClient },\n options?: { onLoading?: () => void }\n ) {\n // Get claim data and initialize strategy\n const claimData = this.getClaimDataById(claimId);\n const strategy = await this.getStrategy(walletClient);\n const project = await this.getProjectInfo();\n\n // Process extra data\n const extraData =\n project.chainType === ChainType.Ton\n ? undefined\n : this.claimHook\n ? this.claimHook(claimData)\n : this.getDefaultExtraData();\n\n // Calculate claim value based on project type\n const value = await this.calculateClaimFee(project, claimData);\n\n // Execute claim with processed data\n return strategy.claim(\n {\n ...claimData,\n extraData,\n value\n },\n options\n );\n }\n\n async checkClaimed(claimId: string): Promise<boolean> {\n const claimData = this.getClaimDataById(claimId);\n const strategy = await this.getStrategy();\n return strategy.checkClaimed(claimData);\n }\n\n private async getContractConfig(): Promise<IContractConfig | null> {\n try {\n const project = await this.getProjectInfo();\n\n if (!this.contractConfig && [ChainType.Evm, ChainType.Ton].includes(project.chainType)) {\n this.contractConfig = await getAirdropContractConfig(\n {\n chainId: project.chainId,\n chainType: project.chainType,\n contractAddress: project.contractAddress\n },\n this.endpoint\n );\n }\n return this.contractConfig;\n } catch (error) {\n console.error('Error fetching contract config:', error);\n return null;\n }\n }\n\n async getVersion(): Promise<string> {\n const config = await this.getContractConfig();\n if (config?.version) {\n return config.version;\n }\n\n const strategy = await this.getStrategy();\n return strategy.getVersion();\n }\n\n async getPaused(): Promise<boolean> {\n const config = await this.getContractConfig();\n if (config && config?.paused !== null) {\n return config.paused;\n }\n\n const strategy = await this.getStrategy();\n if (!strategy.getPaused) {\n throw new Error('getPaused is not supported for this chain');\n }\n return strategy.getPaused();\n }\n\n async getClaimFee(amount?: bigint, walletClient?: IWalletClient): Promise<string | bigint> {\n const config = await this.getContractConfig();\n if (config?.claimFee) {\n return config.claimFee;\n }\n\n const strategy = await this.getStrategy(walletClient);\n if (!strategy.getClaimFee) {\n throw new Error('getClaimFee is not supported for this chain');\n }\n return strategy.getClaimFee(this.project?.contractAddress || '', amount || BigInt(0));\n }\n\n // params claimId[]\n async batchCheckClaimed(): Promise<{ result: boolean; status: string }[]> {\n const strategy = await this.getStrategy();\n if (!strategy.batchCheckClaimed) {\n throw new Error('batchCheckClaimed is not supported for this chain');\n }\n const leafs = this.claims?.map((it) => it.leaf);\n if (!leafs) return [];\n return strategy.batchCheckClaimed(leafs);\n }\n\n async getNFT(): Promise<string> {\n const strategy = await this.getStrategy();\n if (!strategy.getNFT) {\n throw new Error('getNFT is not supported for this chain');\n }\n return strategy.getNFT();\n }\n\n async getKycThreshold(): Promise<bigint> {\n const strategy = await this.getStrategy();\n if (!strategy.getKycThreshold) {\n throw new Error('getKycThreshold is not supported for this chain');\n }\n return strategy.getKycThreshold();\n }\n}\n","import { ChainType, IWalletClient } from '@sign-global/tokentable-core';\nimport { EvmAirdropStrategy } from './EvmAirdropStrategy';\nimport { IAirdropStrategy, IAirdropStrategyConstructor } from './IAirdropStrategy';\nimport { SolanaAirdropStrategy } from './SolanaAirdropStrategy';\nimport { TonAirdropStrategy } from './TonAirdropStrategy';\nimport { TonClient } from '@ton/ton';\n\nexport class AirdropStrategyFactory {\n private static strategyMap: Record<ChainType, IAirdropStrategyConstructor | null> = {\n [ChainType.Evm]: EvmAirdropStrategy,\n [ChainType.Ton]: TonAirdropStrategy,\n [ChainType.Solana]: SolanaAirdropStrategy\n };\n\n static createStrategy(params: {\n chainType: ChainType;\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n tonClient?: TonClient;\n version?: string;\n projectId: string;\n chainRpc: string;\n }): IAirdropStrategy {\n const { chainType, ...strategyParams } = params;\n const StrategyClass = this.strategyMap[chainType];\n\n if (!StrategyClass) {\n throw new Error(`Unsupported chain type: ${chainType}`);\n }\n\n return new StrategyClass(strategyParams);\n }\n}\n","import { EvmAirdropService, ChainId, IWalletClient } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\nimport { WalletClient as ViemWalletClient } from 'viem';\n\nexport class EvmAirdropStrategy implements IAirdropStrategy {\n private service: EvmAirdropService | undefined;\n private readonly contractAddress: string;\n private readonly chainId: ChainId;\n private readonly chainRpc: string;\n private walletClient?: ViemWalletClient;\n private cachedVersion: string | null = null;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n chainRpc: string;\n }) {\n this.contractAddress = params.contractAddress;\n this.chainId = Number(params.chainId) as ChainId;\n this.chainRpc = params.chainRpc;\n if (params.walletClient) {\n this.walletClient = params.walletClient as ViemWalletClient;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as ViemWalletClient;\n }\n this.service = new EvmAirdropService({\n contractAddress: this.contractAddress,\n chainId: this.chainId,\n walletClient: this.walletClient,\n chainRpc: this.chainRpc\n });\n }\n\n isInitialized(): boolean {\n return !!this.service;\n }\n\n async getVersion(): Promise<string> {\n if (this.cachedVersion) {\n return this.cachedVersion;\n }\n if (!this.service) throw new Error('Strategy not initialized');\n this.cachedVersion = await this.service.getVersion();\n return this.cachedVersion;\n }\n\n async claim(claimData: any): Promise<any> {\n if (!this.service) throw new Error('Strategy not initialized');\n const { proof, group, data, value, extraData } = claimData;\n return this.service.claim({\n proof,\n group,\n data,\n value,\n extraData\n });\n }\n\n async checkClaimed(claimData: any): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.isLeafUsed(claimData.leaf);\n }\n\n async batchCheckClaimed(leafs: string[]): Promise<{ result: boolean; status: string }[]> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.batchFetchClaimed(leafs);\n }\n\n async getNFT(): Promise<string> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getNFT() as unknown as string;\n }\n\n async getKycThreshold(): Promise<bigint> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getKycThreshold();\n }\n\n async getClaimFee(contractAddress: string, amount: bigint): Promise<bigint> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getClaimFee(contractAddress, amount) as unknown as bigint;\n }\n}\n","import { SolanaAirdropService, ChainId, IWalletClient, SolanaWalletState } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class SolanaAirdropStrategy implements IAirdropStrategy {\n private service: SolanaAirdropService | undefined;\n private readonly chainId: ChainId;\n private readonly chainRpc: string;\n private walletClient?: SolanaWalletState;\n private cachedVersion: string | null = null;\n private projectId: string;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n projectId: string;\n chainRpc: string;\n }) {\n this.chainId = params.chainId as ChainId;\n this.projectId = params.projectId;\n this.chainRpc = params.chainRpc;\n if (params.walletClient) {\n this.walletClient = params.walletClient as SolanaWalletState;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as SolanaWalletState;\n }\n this.service = new SolanaAirdropService({\n projectId: this.projectId,\n chainId: this.chainId as string,\n walletClient: this.walletClient as any,\n chainRpc: this.chainRpc\n });\n }\n\n isInitialized(): boolean {\n return !!this.service;\n }\n\n async getVersion(): Promise<string> {\n if (this.cachedVersion) {\n return this.cachedVersion;\n }\n if (!this.service) throw new Error('Strategy not initialized');\n this.cachedVersion = await this.service.getVersion();\n return this.cachedVersion;\n }\n\n async claim(claimData: any): Promise<any> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.claim(claimData);\n }\n\n async checkClaimed(claimData: any): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.isLeafUsed(claimData.leaf);\n }\n\n async batchCheckClaimed(leafs: string[]): Promise<{ result: boolean; status: string }[]> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.batchFetchClaimed(leafs);\n }\n\n async getClaimFee(contractAddress: string, amount: bigint): Promise<bigint> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getClaimFee(contractAddress, amount) as unknown as bigint;\n }\n\n async getPaused(): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getPaused();\n }\n}\n","import { TonClient } from '@ton/ton';\nimport { TonConnectUI } from '@tonconnect/ui-react';\nimport { TonAirdropService, IWalletClient } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class TonAirdropStrategy implements IAirdropStrategy {\n private service: TonAirdropService | undefined;\n private readonly contractAddress: string;\n private readonly chainId: string;\n private readonly tonClient?: TonClient;\n private walletClient?: TonConnectUI;\n private cachedVersion: string | null = null;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n tonClient?: TonClient;\n version?: string;\n }) {\n this.contractAddress = params.contractAddress;\n this.chainId = params.chainId.toString();\n this.tonClient = params.tonClient;\n if (params.walletClient) {\n this.walletClient = params.walletClient as TonConnectUI;\n }\n if (params.version) {\n this.cachedVersion = params.version;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as TonConnectUI;\n }\n this.service = new TonAirdropService({\n address: this.contractAddress,\n chainId: this.chainId,\n walletClient: this.walletClient,\n tonClient: this.tonClient,\n version: this.cachedVersion || undefined\n });\n }\n\n isInitialized(): boolean {\n return !!this.service;\n }\n\n async getVersion(): Promise<string> {\n if (!this.service) throw new Error('Strategy not initialized');\n if (!this.cachedVersion) {\n this.cachedVersion = await this.service.getVersion();\n }\n return this.cachedVersion;\n }\n\n async claim(claimData: any, options?: { onLoading?: () => void }): Promise<any> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.claim(claimData, options);\n }\n\n async checkClaimed(claimData: any): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.checkClaimed(claimData);\n }\n\n async getPaused(): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getPaused();\n }\n\n async getClaimFee(contractAddress: string, amount: bigint): Promise<string> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getClaimFee(contractAddress, amount);\n }\n}\n","import { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class StrategyCache {\n private readOnlyStrategies: Map<string, IAirdropStrategy> = new Map();\n private walletStrategies: Map<string, IAirdropStrategy> = new Map();\n\n private getCacheKey(contractAddress: string, chainId: string | number, chainType: string): string {\n return `${chainType}:${contractAddress}:${chainId}`;\n }\n\n getStrategy(contractAddress: string, chainId: string | number, chainType: string, hasWallet: boolean = false): IAirdropStrategy | undefined {\n const cache = hasWallet ? this.walletStrategies : this.readOnlyStrategies;\n const cacheKey = this.getCacheKey(contractAddress, chainId, chainType);\n return cache.get(cacheKey);\n }\n\n setStrategy(contractAddress: string, chainId: string | number, chainType: string, strategy: IAirdropStrategy, hasWallet: boolean = false): void {\n const cache = hasWallet ? this.walletStrategies : this.readOnlyStrategies;\n const cacheKey = this.getCacheKey(contractAddress, chainId, chainType);\n cache.set(cacheKey, strategy);\n }\n\n clearStrategy(contractAddress: string, chainId: string | number, chainType: string, hasWallet?: boolean): void {\n const cacheKey = this.getCacheKey(contractAddress, chainId, chainType);\n if (hasWallet === undefined || hasWallet) {\n this.walletStrategies.delete(cacheKey);\n }\n if (hasWallet === undefined || !hasWallet) {\n this.readOnlyStrategies.delete(cacheKey);\n }\n }\n}\n\nexport const strategyCache = new StrategyCache();\n","import { WalletFactory } from '@sign-global/tokentable-wallets';\nimport {\n bindWallet,\n checkEligibility,\n checkGetSignatures,\n connectGoogleApi,\n connectTwitter,\n disconnectRecipient,\n getAirdropProject,\n cleanUrlParams,\n isMobile,\n getChainRpc,\n CONST,\n EvmSignatureAirdropService,\n SolanaSignatureAirdropService,\n AirdropSigIdentityTypeEnum,\n ChainId,\n ErrorCode,\n IAirdropOptions,\n IAirdropSignatureClaim,\n IAirdropSignatureIdentity,\n IClaimSignature,\n IProject,\n IWalletClient,\n SolanaWalletState,\n ViemWalletClient,\n ChainType\n} from '@sign-global/tokentable-core';\n\nexport class SignatureAirdropClient {\n private projectId?: string;\n private endpoint?: string;\n private project: IProject | undefined;\n private chainRpc?: string;\n protected claims?: IAirdropSignatureClaim[];\n protected identities?: IAirdropSignatureIdentity[];\n private projectPromise: Promise<void> | undefined;\n private authPromise: Promise<void> | undefined;\n private strategyCache: Map<string, EvmSignatureAirdropService | SolanaSignatureAirdropService> = new Map();\n constructor(params: IAirdropOptions) {\n this.projectId = params.projectId;\n this.endpoint = params.endpoint;\n this.chainRpc = params.chainRpc;\n if (this.project) {\n this.project = params.project;\n } else {\n this.projectPromise = this.initializeProjects();\n }\n if (isMobile()) {\n this.authPromise = this.checkAndHandleTwitterCode();\n }\n }\n\n private readonly LOCAL_STORAGE_SID_PREFIX = 'sid_';\n\n private async checkAndHandleTwitterCode() {\n try {\n const urlParams = new URLSearchParams(window.location.search);\n const code = urlParams.get('code');\n const type = urlParams.get('type');\n\n if (code && this.projectId) {\n let res;\n if (type === 'twitter') {\n res = await connectTwitter({ code, projectId: this.projectId }, this.endpoint);\n } else if (type === 'google') {\n res = await connectGoogleApi({ code, projectId: this.projectId }, this.endpoint);\n }\n if (res?.sid) {\n this.setSid(this.projectId!, res.sid);\n } else {\n throw new Error('Failed to connect');\n }\n cleanUrlParams(['code', 'type']);\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n private setSid(projectId: string, sid: string): void {\n window.localStorage.setItem(`${this.LOCAL_STORAGE_SID_PREFIX}${projectId}`, sid);\n }\n\n private async fetchProjectDetails(projectId: string): Promise<void> {\n const project = await getAirdropProject(projectId, this.endpoint);\n this.project = project;\n if (this.chainRpc) return;\n const chainId = project.chainType === ChainType.Evm ? Number(project.chainId) : project.chainId;\n this.chainRpc = getChainRpc(chainId as ChainId);\n }\n\n protected async initializeProjects() {\n try {\n let projectId = this.projectId;\n if (!projectId) {\n return;\n }\n await this.fetchProjectDetails(projectId);\n } catch (error: any) {\n throw new Error(`Failed to initialize project: ${error.message}`);\n }\n }\n\n async getProjectInfo() {\n if (this.projectPromise) {\n await this.projectPromise;\n }\n if (!this.project) throw new Error('Project not found');\n return this.project;\n }\n\n async connectOAuth({\n onSuccess,\n onError,\n type\n }: {\n onSuccess: () => void;\n onError: (error: Error) => void;\n type: AirdropSigIdentityTypeEnum;\n }) {\n const project = await this.getProjectInfo();\n const authorizeUrl = project.identities.find((item: any) => item.identityType === type)?.authorizeUrl;\n if (!authorizeUrl) {\n onError(new Error('Authorize URL not found'));\n return;\n }\n if (isMobile()) {\n const state = encodeURIComponent(window.location.href);\n window.location.href = `${authorizeUrl}&state=${state}`;\n return;\n }\n const onWindowMessage = async (message: any) => {\n const name = message.data?.name;\n if (name && [CONST.TWITTER_AUTH_SUCCESS, CONST.GOOGLE_AUTH_SUCCESS].includes(name)) {\n const { code } = message.data.data || {};\n try {\n let res;\n if (name === CONST.GOOGLE_AUTH_SUCCESS) {\n res = await connectGoogleApi({ code, projectId: project.id }, this.endpoint);\n } else if (name === CONST.TWITTER_AUTH_SUCCESS) {\n res = await connectTwitter({ code, projectId: project.id }, this.endpoint);\n }\n if (res?.sid) {\n this.setSid(project.id, res?.sid);\n onSuccess();\n } else {\n onError(new Error('Failed to connect'));\n }\n } catch (error) {\n onError(error as Error);\n } finally {\n window.removeEventListener('message', onWindowMessage);\n }\n }\n };\n\n window.addEventListener('message', onWindowMessage);\n window.open(`${authorizeUrl}&state=state`, `twitter_auth_${project.id}`, 'width=600,height=800');\n }\n\n async connectX({ onSuccess, onError }: { onSuccess: () => void; onError: (error: Error) => void }) {\n await this.connectOAuth({\n onSuccess,\n onError,\n type: AirdropSigIdentityTypeEnum.Twitter\n });\n }\n\n async connectGoogle({ onSuccess, onError }: { onSuccess: () => void; onError: (error: Error) => void }) {\n await this.connectOAuth({\n onSuccess,\n onError,\n type: AirdropSigIdentityTypeEnum.Google\n });\n }\n\n async connectWallet({\n chainType,\n onSuccess,\n onError\n }: {\n chainType: ChainType;\n onSuccess?: (address: string) => void;\n onError?: (error: any) => void;\n }) {\n try {\n const project = await this.getProjectInfo();\n const wallet = WalletFactory.getWallet(chainType);\n const timestamp = Date.now();\n const recipientTypeMap = {\n [ChainType.Evm]: AirdropSigIdentityTypeEnum.EVMWallet,\n [ChainType.Solana]: AirdropSigIdentityTypeEnum.SolanaWallet,\n [ChainType.Ton]: AirdropSigIdentityTypeEnum.TONWallet\n };\n const msg = [project.id, recipientTypeMap[chainType], timestamp].join(',');\n const signResult = await wallet.signin(msg, false);\n await wallet.disconnect();\n const { message, signature } = signResult || {};\n\n if (this.identities?.find((it) => it.value?.toLowerCase() === wallet.address?.toLowerCase())) {\n onError?.(ErrorCode.WALLET_ALREADY_CONNECTED);\n return;\n }\n\n const payload = {\n signature: signature as string,\n message: message as string,\n key: wallet.publicKey || wallet.address!,\n address: wallet.address!,\n projectId: project.id,\n timestamp: timestamp,\n recipientType: recipientTypeMap[chainType]\n };\n\n const res = await bindWallet(payload, this.endpoint);\n if (res?.sid) {\n this.setSid(project.id, res?.sid);\n }\n onSuccess?.(wallet.address!);\n } catch (error) {\n onError?.(error);\n }\n }\n\n async getClaims() {\n const project = await this.getProjectInfo();\n if (this.authPromise) {\n await this.authPromise;\n }\n const res = await checkEligibility(\n {\n projectId: project.id\n },\n this.endpoint\n );\n this.claims = res.claims;\n this.identities = res.identities;\n return res;\n }\n\n public async disconnectIdentity({\n recipientType,\n recipient\n }: {\n recipientType: AirdropSigIdentityTypeEnum;\n recipient?: string;\n }) {\n const project = await this.getProjectInfo();\n return await disconnectRecipient(\n {\n projectId: project.id,\n recipientType,\n recipient\n },\n this.endpoint\n );\n }\n\n public async getStrategy(\n walletClient?: IWalletClient\n ): Promise<EvmSignatureAirdropService | SolanaSignatureAirdropService> {\n const project = await this.getProjectInfo();\n\n const cacheKey = walletClient\n ? project.chainType === ChainType.Evm\n ? (walletClient as ViemWalletClient).account?.address!\n : project.chainType === ChainType.Solana\n ? (walletClient as SolanaWalletState).publicKey!.toString()\n : 'walletClient'\n : 'default';\n if (this.strategyCache.has(cacheKey)) {\n return this.strategyCache.get(cacheKey)!;\n }\n\n const strategy =\n project.chainType === ChainType.Solana\n ? new SolanaSignatureAirdropService({\n chainId: project.chainId,\n projectId: project.id,\n token: project.tokenAddress,\n walletClient: walletClient as any,\n chainRpc: this.chainRpc!\n })\n : new EvmSignatureAirdropService({\n chainId: Number(project.chainId) as ChainId,\n contractAddress: project.contractAddress,\n walletClient: walletClient as any,\n chainRpc: this.chainRpc!\n });\n this.strategyCache.set(cacheKey, strategy);\n return strategy;\n }\n\n async getVersion(): Promise<string> {\n const strategy = await this.getStrategy();\n return strategy.getVersion();\n }\n\n // solana prams need to wallet\n async getClaimFee(amount?: bigint, walletClient?: IWalletClient): Promise<undefined | bigint> {\n const strategy = await this.getStrategy(walletClient);\n if (!strategy.getClaimFee) {\n throw new Error('getClaimFee is not supported for this chain');\n }\n return await strategy.getClaimFee(this.project?.contractAddress || '', amount || BigInt(1));\n }\n\n async claimAirdrop({\n claimIds,\n walletClient,\n recipient\n }: {\n claimIds: string[];\n walletClient: IWalletClient;\n recipient: string;\n }) {\n if (!claimIds.length) {\n throw new Error('Claim IDs cannot be empty');\n }\n if (!walletClient) {\n throw new Error('Wallet client is required');\n }\n if (!this.claims?.length) {\n throw new Error('No claims available');\n }\n const service = await this.getStrategy(walletClient);\n const project = await this.getProjectInfo();\n const res = await checkGetSignatures(\n {\n claimIds,\n projectId: this.projectId!,\n recipient\n },\n this.endpoint\n );\n if (!res?.signatures?.length) {\n throw new Error('Failed to get signatures');\n }\n const signatureMap = res?.signatures?.reduce(\n (map, item) => {\n map[item.claimId] = item;\n return map;\n },\n {} as Record<string, IClaimSignature>\n );\n const filteredClaims = this.claims.filter((it) => claimIds.includes(it.claimId));\n if (!filteredClaims.length) {\n throw new Error('No matching claims found');\n }\n\n // only evm use\n const defaultRecipient =\n project.chainType === ChainType.Evm ? (walletClient as ViemWalletClient).account?.address! : '';\n\n const claimData = filteredClaims.map((it) => {\n const signature = signatureMap[it.claimId];\n if (!signature) {\n throw new Error(`Signature not found for claim ID: ${it.claimId}`);\n }\n\n return {\n ...it,\n recipient: recipient ? recipient : defaultRecipient,\n ...signature\n };\n });\n\n const hash = (await service!.claim(claimData, recipient)) as `0x${string}`;\n return hash;\n }\n\n async batchCheckClaimed(): Promise<boolean[]> {\n if (!this.claims?.length) return [];\n const strategy = await this.getStrategy();\n if (!strategy.batchFetchClaimed) {\n throw new Error('batchCheckClaimed is not supported for this chain');\n }\n const claimIds = this.claims?.map((it) => it.claimId);\n return strategy.batchFetchClaimed(claimIds);\n }\n\n async getPaused(): Promise<boolean> {\n const strategy = await this.getStrategy();\n if (!strategy.getPaused) {\n throw new Error('getPaused is not supported for this chain');\n }\n return strategy.getPaused();\n }\n}\n","export { AirdropClient } from './AirdropClient';\nexport { SignatureAirdropClient } from './SignatureAirdropClient';\nexport * from '@sign-global/tokentable-core';\nexport * from '@sign-global/tokentable-wallets';\n"],"mappings":"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","names":["ChainType","ChainType","getAirdropProject","getChainRpc","ChainType"]}
|
|
1
|
+
{"version":3,"sources":["../src/AirdropClient.ts","../src/strategies/AirdropStrategyFactory.ts","../src/strategies/EvmAirdropStrategy.ts","../src/strategies/SolanaAirdropStrategy.ts","../src/strategies/TonAirdropStrategy.ts","../src/strategies/StrategyCache.ts","../src/SignatureAirdropClient.ts","../src/index.ts"],"sourcesContent":["import { TonClient } from '@ton/ton';\nimport {\n getAirdropPro,\n getAirdropProject,\n getAirdropQuery,\n getAirdropContractConfig,\n getChainRpc,\n getTonProjectIdByAddress,\n ChainId,\n ChainType,\n ETokenType,\n EvmAirdropVersionEnum,\n IAirdropClaim,\n IAirdropOptions,\n IContractConfig,\n IProject,\n IWalletClient\n} from '@sign-global/tokentable-core';\nimport { AirdropStrategyFactory } from './strategies/AirdropStrategyFactory';\nimport { IAirdropStrategy } from './strategies/IAirdropStrategy';\nimport { strategyCache } from './strategies/StrategyCache';\n\nexport class AirdropClient {\n private tonClient?: TonClient;\n private slug?: string;\n private projectId?: string;\n private endpoint?: string;\n private project: IProject | undefined;\n protected chainRpc?: string;\n protected claims?: IAirdropClaim[];\n private projectPromise: Promise<void> | undefined;\n private claimHook: ((claimData: IAirdropClaim) => { isLegacy: boolean; attestationId: bigint }) | undefined;\n private contractConfig: IContractConfig | null = null;\n\n constructor(params: IAirdropOptions) {\n if ('slug' in params) {\n this.slug = params.slug;\n }\n this.projectId = params.projectId;\n this.endpoint = params.endpoint;\n this.chainRpc = params.chainRpc;\n if (this.project) {\n this.project = params.project;\n } else {\n this.projectPromise = this.initializeProjects();\n }\n }\n\n setTonClient(tonClient: TonClient) {\n this.tonClient = tonClient;\n }\n\n private getTonClient(): TonClient | undefined {\n if (!this.tonClient) {\n return undefined;\n }\n return this.tonClient;\n }\n\n private async fetchProjectFromSlug(address?: string): Promise<string | undefined> {\n if (!this.slug) return undefined;\n\n const res = await getAirdropPro(this.slug, this.endpoint);\n const projectMap = res?.childProjectMapping || {};\n\n return getTonProjectIdByAddress({\n address,\n slug: this.slug,\n data: projectMap\n });\n }\n\n private async fetchProjectDetails(projectId: string): Promise<void> {\n const project = await getAirdropProject(projectId, this.endpoint);\n this.project = project;\n if (this.chainRpc) return;\n const chainId = project.chainType === ChainType.Evm ? Number(project.chainId) : project.chainId;\n this.chainRpc = getChainRpc(chainId as ChainId);\n }\n\n protected async initializeProjects(address?: string) {\n try {\n let projectId = this.projectId;\n\n // If slug is provided, try to fetch project ID from slug\n if (!projectId) {\n projectId = await this.fetchProjectFromSlug(address);\n }\n\n if (!projectId) {\n return;\n }\n\n // Fetch project details\n await this.fetchProjectDetails(projectId);\n } catch (error: any) {\n throw new Error(`Failed to initialize project: ${error.message}`);\n }\n }\n\n async getProjectInfo() {\n if (this.projectPromise) {\n await this.projectPromise;\n }\n if (!this.project) throw new Error('Project not found');\n return this.project;\n }\n\n async getAirdropClaims(data: { address: string }) {\n if (this.slug) {\n await this.initializeProjects(data.address); // Fetch project details by address & slug\n }\n const project = await this.getProjectInfo();\n\n const res = await getAirdropQuery(\n {\n recipient: data.address,\n projectId: project!.id,\n recipientType: project!.recipientType\n },\n this.endpoint\n );\n const claimsRes = res.claims?.map((it) => ({\n ...it,\n project: project!,\n claimId: project!.chainType === ChainType.Evm ? `${project!.id}:${it.leaf}` : `${project!.id}:${it.index}`\n }));\n this.claims = claimsRes;\n return this.claims;\n }\n\n public async getStrategy(walletClient?: IWalletClient): Promise<IAirdropStrategy> {\n const project = await this.getProjectInfo();\n const version = this.contractConfig?.version || undefined;\n\n const hasWallet = !!walletClient;\n\n // Try to get cached strategy\n let strategy = strategyCache.getStrategy(project.contractAddress, project.chainId, project.chainType, hasWallet);\n\n if (!strategy) {\n // Create new strategy if not cached\n strategy = AirdropStrategyFactory.createStrategy({\n chainType: project.chainType,\n contractAddress: project.contractAddress,\n chainId: project.chainId,\n projectId: project.id,\n walletClient,\n tonClient: this.getTonClient(),\n version,\n chainRpc: this.chainRpc!\n });\n\n // Initialize the strategy\n await strategy.initialize(walletClient);\n\n // Cache the initialized strategy\n strategyCache.setStrategy(project.contractAddress, project.chainId, project.chainType, strategy, hasWallet);\n } else if (hasWallet) {\n // If we have a wallet and the strategy exists, just initialize with the new wallet\n await strategy.initialize(walletClient);\n }\n\n return strategy;\n }\n\n private getClaimDataById(claimId: string) {\n const claimData = this.claims?.find((it) => it.claimId === claimId);\n if (!claimData) throw new Error('Claim data not found');\n return claimData;\n }\n\n setClaimHook(fn: (claimData: IAirdropClaim) => { isLegacy: boolean; attestationId: bigint }) {\n this.claimHook = fn;\n }\n\n private getDefaultExtraData() {\n return {\n isLegacy: true,\n attestationId: BigInt(1)\n };\n }\n\n private async calculateClaimFee(project: IProject, claimData: IAirdropClaim): Promise<string | bigint | undefined> {\n const claimAmount = claimData.amount;\n if (project.chainType === ChainType.Evm) {\n const version = await this.getVersion();\n const isNativeFreeVersion =\n project.tokenType === ETokenType.Native &&\n [EvmAirdropVersionEnum.V3, EvmAirdropVersionEnum.V4].includes(version as EvmAirdropVersionEnum);\n if (isNativeFreeVersion) {\n return undefined;\n }\n if (version.includes('TokenTableMerkleDistributorWithFees')) {\n const fees = claimData.fees;\n return fees ? BigInt(fees) : '0';\n }\n return await this.getClaimFee(BigInt(claimAmount));\n }\n\n if (project.chainType === ChainType.Ton) {\n return await this.getClaimFee(BigInt(claimAmount));\n }\n\n return undefined;\n }\n\n async claimAirdrop(\n { claimId, walletClient }: { claimId: string; walletClient: IWalletClient },\n options?: { onLoading?: () => void }\n ) {\n // Get claim data and initialize strategy\n const claimData = this.getClaimDataById(claimId);\n const strategy = await this.getStrategy(walletClient);\n const project = await this.getProjectInfo();\n\n // Process extra data\n const extraData =\n project.chainType === ChainType.Ton\n ? undefined\n : this.claimHook\n ? this.claimHook(claimData)\n : this.getDefaultExtraData();\n\n // Calculate claim value based on project type\n const value = await this.calculateClaimFee(project, claimData);\n\n // Execute claim with processed data\n return strategy.claim(\n {\n ...claimData,\n extraData,\n value\n },\n options\n );\n }\n\n async checkClaimed(claimId: string): Promise<boolean> {\n const claimData = this.getClaimDataById(claimId);\n const strategy = await this.getStrategy();\n return strategy.checkClaimed(claimData);\n }\n\n private async getContractConfig(): Promise<IContractConfig | null> {\n try {\n const project = await this.getProjectInfo();\n\n if (!this.contractConfig && [ChainType.Evm, ChainType.Ton].includes(project.chainType)) {\n this.contractConfig = await getAirdropContractConfig(\n {\n chainId: project.chainId,\n chainType: project.chainType,\n contractAddress: project.contractAddress\n },\n this.endpoint\n );\n }\n return this.contractConfig;\n } catch (error) {\n console.error('Error fetching contract config:', error);\n return null;\n }\n }\n\n async getVersion(): Promise<string> {\n const config = await this.getContractConfig();\n if (config?.version) {\n return config.version;\n }\n\n const strategy = await this.getStrategy();\n return strategy.getVersion();\n }\n\n async getPaused(): Promise<boolean> {\n const config = await this.getContractConfig();\n if (config && config?.paused !== null) {\n return config.paused;\n }\n\n const strategy = await this.getStrategy();\n if (!strategy.getPaused) {\n throw new Error('getPaused is not supported for this chain');\n }\n return strategy.getPaused();\n }\n\n async getClaimFee(amount?: bigint, walletClient?: IWalletClient): Promise<string | bigint> {\n const config = await this.getContractConfig();\n if (config?.claimFee) {\n return config.claimFee;\n }\n\n const strategy = await this.getStrategy(walletClient);\n if (!strategy.getClaimFee) {\n throw new Error('getClaimFee is not supported for this chain');\n }\n return strategy.getClaimFee(this.project?.contractAddress || '', amount || BigInt(0));\n }\n\n // params claimId[]\n async batchCheckClaimed(): Promise<{ result: boolean; status: string }[]> {\n const strategy = await this.getStrategy();\n if (!strategy.batchCheckClaimed) {\n throw new Error('batchCheckClaimed is not supported for this chain');\n }\n const leafs = this.claims?.map((it) => it.leaf);\n if (!leafs) return [];\n return strategy.batchCheckClaimed(leafs);\n }\n\n async getNFT(): Promise<string> {\n const strategy = await this.getStrategy();\n if (!strategy.getNFT) {\n throw new Error('getNFT is not supported for this chain');\n }\n return strategy.getNFT();\n }\n\n async getKycThreshold(): Promise<bigint> {\n const strategy = await this.getStrategy();\n if (!strategy.getKycThreshold) {\n throw new Error('getKycThreshold is not supported for this chain');\n }\n return strategy.getKycThreshold();\n }\n}\n","import { ChainType, IWalletClient } from '@sign-global/tokentable-core';\nimport { EvmAirdropStrategy } from './EvmAirdropStrategy';\nimport { IAirdropStrategy, IAirdropStrategyConstructor } from './IAirdropStrategy';\nimport { SolanaAirdropStrategy } from './SolanaAirdropStrategy';\nimport { TonAirdropStrategy } from './TonAirdropStrategy';\nimport { TonClient } from '@ton/ton';\n\nexport class AirdropStrategyFactory {\n private static strategyMap: Record<ChainType, IAirdropStrategyConstructor | null> = {\n [ChainType.Evm]: EvmAirdropStrategy,\n [ChainType.Ton]: TonAirdropStrategy,\n [ChainType.Solana]: SolanaAirdropStrategy\n };\n\n static createStrategy(params: {\n chainType: ChainType;\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n tonClient?: TonClient;\n version?: string;\n projectId: string;\n chainRpc: string;\n }): IAirdropStrategy {\n const { chainType, ...strategyParams } = params;\n const StrategyClass = this.strategyMap[chainType];\n\n if (!StrategyClass) {\n throw new Error(`Unsupported chain type: ${chainType}`);\n }\n\n return new StrategyClass(strategyParams);\n }\n}\n","import { EvmAirdropService, ChainId, IWalletClient } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\nimport { WalletClient as ViemWalletClient } from 'viem';\n\nexport class EvmAirdropStrategy implements IAirdropStrategy {\n private service: EvmAirdropService | undefined;\n private readonly contractAddress: string;\n private readonly chainId: ChainId;\n private readonly chainRpc: string;\n private walletClient?: ViemWalletClient;\n private cachedVersion: string | null = null;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n chainRpc: string;\n }) {\n this.contractAddress = params.contractAddress;\n this.chainId = Number(params.chainId) as ChainId;\n this.chainRpc = params.chainRpc;\n if (params.walletClient) {\n this.walletClient = params.walletClient as ViemWalletClient;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as ViemWalletClient;\n }\n this.service = new EvmAirdropService({\n contractAddress: this.contractAddress,\n chainId: this.chainId,\n walletClient: this.walletClient,\n chainRpc: this.chainRpc\n });\n }\n\n isInitialized(): boolean {\n return !!this.service;\n }\n\n async getVersion(): Promise<string> {\n if (this.cachedVersion) {\n return this.cachedVersion;\n }\n if (!this.service) throw new Error('Strategy not initialized');\n this.cachedVersion = await this.service.getVersion();\n return this.cachedVersion;\n }\n\n async claim(claimData: any): Promise<any> {\n if (!this.service) throw new Error('Strategy not initialized');\n const { proof, group, data, value, extraData } = claimData;\n return this.service.claim({\n proof,\n group,\n data,\n value,\n extraData\n });\n }\n\n async checkClaimed(claimData: any): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.isLeafUsed(claimData.leaf);\n }\n\n async batchCheckClaimed(leafs: string[]): Promise<{ result: boolean; status: string }[]> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.batchFetchClaimed(leafs);\n }\n\n async getNFT(): Promise<string> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getNFT() as unknown as string;\n }\n\n async getKycThreshold(): Promise<bigint> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getKycThreshold();\n }\n\n async getClaimFee(contractAddress: string, amount: bigint): Promise<bigint> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getClaimFee(contractAddress, amount) as unknown as bigint;\n }\n}\n","import { SolanaAirdropService, ChainId, IWalletClient, SolanaWalletState } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class SolanaAirdropStrategy implements IAirdropStrategy {\n private service: SolanaAirdropService | undefined;\n private readonly chainId: ChainId;\n private readonly chainRpc: string;\n private walletClient?: SolanaWalletState;\n private cachedVersion: string | null = null;\n private projectId: string;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n projectId: string;\n chainRpc: string;\n }) {\n this.chainId = params.chainId as ChainId;\n this.projectId = params.projectId;\n this.chainRpc = params.chainRpc;\n if (params.walletClient) {\n this.walletClient = params.walletClient as SolanaWalletState;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as SolanaWalletState;\n }\n this.service = new SolanaAirdropService({\n projectId: this.projectId,\n chainId: this.chainId as string,\n walletClient: this.walletClient as any,\n chainRpc: this.chainRpc\n });\n }\n\n isInitialized(): boolean {\n return !!this.service;\n }\n\n async getVersion(): Promise<string> {\n if (this.cachedVersion) {\n return this.cachedVersion;\n }\n if (!this.service) throw new Error('Strategy not initialized');\n this.cachedVersion = await this.service.getVersion();\n return this.cachedVersion;\n }\n\n async claim(claimData: any): Promise<any> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.claim(claimData);\n }\n\n async checkClaimed(claimData: any): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.isLeafUsed(claimData.leaf);\n }\n\n async batchCheckClaimed(leafs: string[]): Promise<{ result: boolean; status: string }[]> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.batchFetchClaimed(leafs);\n }\n\n async getClaimFee(contractAddress: string, amount: bigint): Promise<bigint> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getClaimFee(contractAddress, amount) as unknown as bigint;\n }\n\n async getPaused(): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getPaused();\n }\n}\n","import { TonClient } from '@ton/ton';\nimport { TonConnectUI } from '@tonconnect/ui-react';\nimport { TonAirdropService, IWalletClient } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class TonAirdropStrategy implements IAirdropStrategy {\n private service: TonAirdropService | undefined;\n private readonly contractAddress: string;\n private readonly chainId: string;\n private readonly tonClient?: TonClient;\n private walletClient?: TonConnectUI;\n private cachedVersion: string | null = null;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n tonClient?: TonClient;\n version?: string;\n }) {\n this.contractAddress = params.contractAddress;\n this.chainId = params.chainId.toString();\n this.tonClient = params.tonClient;\n if (params.walletClient) {\n this.walletClient = params.walletClient as TonConnectUI;\n }\n if (params.version) {\n this.cachedVersion = params.version;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as TonConnectUI;\n }\n this.service = new TonAirdropService({\n address: this.contractAddress,\n chainId: this.chainId,\n walletClient: this.walletClient,\n tonClient: this.tonClient,\n version: this.cachedVersion || undefined\n });\n }\n\n isInitialized(): boolean {\n return !!this.service;\n }\n\n async getVersion(): Promise<string> {\n if (!this.service) throw new Error('Strategy not initialized');\n if (!this.cachedVersion) {\n this.cachedVersion = await this.service.getVersion();\n }\n return this.cachedVersion;\n }\n\n async claim(claimData: any, options?: { onLoading?: () => void }): Promise<any> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.claim(claimData, options);\n }\n\n async checkClaimed(claimData: any): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.checkClaimed(claimData);\n }\n\n async getPaused(): Promise<boolean> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getPaused();\n }\n\n async getClaimFee(contractAddress: string, amount: bigint): Promise<string> {\n if (!this.service) throw new Error('Strategy not initialized');\n return this.service.getClaimFee(contractAddress, amount);\n }\n}\n","import { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class StrategyCache {\n private readOnlyStrategies: Map<string, IAirdropStrategy> = new Map();\n private walletStrategies: Map<string, IAirdropStrategy> = new Map();\n\n private getCacheKey(contractAddress: string, chainId: string | number, chainType: string): string {\n return `${chainType}:${contractAddress}:${chainId}`;\n }\n\n getStrategy(contractAddress: string, chainId: string | number, chainType: string, hasWallet: boolean = false): IAirdropStrategy | undefined {\n const cache = hasWallet ? this.walletStrategies : this.readOnlyStrategies;\n const cacheKey = this.getCacheKey(contractAddress, chainId, chainType);\n return cache.get(cacheKey);\n }\n\n setStrategy(contractAddress: string, chainId: string | number, chainType: string, strategy: IAirdropStrategy, hasWallet: boolean = false): void {\n const cache = hasWallet ? this.walletStrategies : this.readOnlyStrategies;\n const cacheKey = this.getCacheKey(contractAddress, chainId, chainType);\n cache.set(cacheKey, strategy);\n }\n\n clearStrategy(contractAddress: string, chainId: string | number, chainType: string, hasWallet?: boolean): void {\n const cacheKey = this.getCacheKey(contractAddress, chainId, chainType);\n if (hasWallet === undefined || hasWallet) {\n this.walletStrategies.delete(cacheKey);\n }\n if (hasWallet === undefined || !hasWallet) {\n this.readOnlyStrategies.delete(cacheKey);\n }\n }\n}\n\nexport const strategyCache = new StrategyCache();\n","import { WalletFactory } from '@sign-global/tokentable-wallets';\nimport {\n bindWallet,\n checkEligibility,\n checkGetSignatures,\n connectGoogleApi,\n connectTwitter,\n disconnectRecipient,\n getAirdropProject,\n cleanUrlParams,\n isMobile,\n getChainRpc,\n CONST,\n EvmSignatureAirdropService,\n SolanaSignatureAirdropService,\n SuiSignatureAirdropService,\n AirdropSigIdentityTypeEnum,\n ChainId,\n ErrorCode,\n IAirdropOptions,\n IAirdropSignatureClaim,\n IAirdropSignatureIdentity,\n IClaimSignature,\n IProject,\n IWalletClient,\n SolanaWalletState,\n ViemWalletClient,\n ChainType,\n SuiWalletClient\n} from '@sign-global/tokentable-core';\n\nexport class SignatureAirdropClient {\n private projectId?: string;\n private endpoint?: string;\n private project: IProject | undefined;\n private chainRpc?: string;\n protected claims?: IAirdropSignatureClaim[];\n protected identities?: IAirdropSignatureIdentity[];\n private projectPromise: Promise<void> | undefined;\n private authPromise: Promise<void> | undefined;\n private strategyCache: Map<\n string,\n EvmSignatureAirdropService | SolanaSignatureAirdropService | SuiSignatureAirdropService\n > = new Map();\n constructor(params: IAirdropOptions) {\n this.projectId = params.projectId;\n this.endpoint = params.endpoint;\n this.chainRpc = params.chainRpc;\n if (this.project) {\n this.project = params.project;\n } else {\n this.projectPromise = this.initializeProjects();\n }\n if (isMobile()) {\n this.authPromise = this.checkAndHandleTwitterCode();\n }\n }\n\n private readonly LOCAL_STORAGE_SID_PREFIX = 'sid_';\n\n private async checkAndHandleTwitterCode() {\n try {\n const urlParams = new URLSearchParams(window.location.search);\n const code = urlParams.get('code');\n const type = urlParams.get('type');\n\n if (code && this.projectId) {\n let res;\n if (type === 'twitter') {\n res = await connectTwitter({ code, projectId: this.projectId }, this.endpoint);\n } else if (type === 'google') {\n res = await connectGoogleApi({ code, projectId: this.projectId }, this.endpoint);\n }\n if (res?.sid) {\n this.setSid(this.projectId!, res.sid);\n } else {\n throw new Error('Failed to connect');\n }\n cleanUrlParams(['code', 'type']);\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n private setSid(projectId: string, sid: string): void {\n window.localStorage.setItem(`${this.LOCAL_STORAGE_SID_PREFIX}${projectId}`, sid);\n }\n\n private async fetchProjectDetails(projectId: string): Promise<void> {\n const project = await getAirdropProject(projectId, this.endpoint);\n this.project = project;\n if (this.chainRpc) return;\n const chainId = project.chainType === ChainType.Evm ? Number(project.chainId) : project.chainId;\n this.chainRpc = getChainRpc(chainId as ChainId);\n }\n\n protected async initializeProjects() {\n try {\n let projectId = this.projectId;\n if (!projectId) {\n return;\n }\n await this.fetchProjectDetails(projectId);\n } catch (error: any) {\n throw new Error(`Failed to initialize project: ${error.message}`);\n }\n }\n\n async getProjectInfo() {\n if (this.projectPromise) {\n await this.projectPromise;\n }\n if (!this.project) throw new Error('Project not found');\n return this.project;\n }\n\n async connectOAuth({\n onSuccess,\n onError,\n type\n }: {\n onSuccess: () => void;\n onError: (error: Error) => void;\n type: AirdropSigIdentityTypeEnum;\n }) {\n const project = await this.getProjectInfo();\n const authorizeUrl = project.identities.find((item: any) => item.identityType === type)?.authorizeUrl;\n if (!authorizeUrl) {\n onError(new Error('Authorize URL not found'));\n return;\n }\n if (isMobile()) {\n const state = encodeURIComponent(window.location.href);\n window.location.href = `${authorizeUrl}&state=${state}`;\n return;\n }\n const onWindowMessage = async (message: any) => {\n const name = message.data?.name;\n if (name && [CONST.TWITTER_AUTH_SUCCESS, CONST.GOOGLE_AUTH_SUCCESS].includes(name)) {\n const { code } = message.data.data || {};\n try {\n let res;\n if (name === CONST.GOOGLE_AUTH_SUCCESS) {\n res = await connectGoogleApi({ code, projectId: project.id }, this.endpoint);\n } else if (name === CONST.TWITTER_AUTH_SUCCESS) {\n res = await connectTwitter({ code, projectId: project.id }, this.endpoint);\n }\n if (res?.sid) {\n this.setSid(project.id, res?.sid);\n onSuccess();\n } else {\n onError(new Error('Failed to connect'));\n }\n } catch (error) {\n onError(error as Error);\n } finally {\n window.removeEventListener('message', onWindowMessage);\n }\n }\n };\n\n window.addEventListener('message', onWindowMessage);\n window.open(`${authorizeUrl}&state=state`, `twitter_auth_${project.id}`, 'width=600,height=800');\n }\n\n async connectX({ onSuccess, onError }: { onSuccess: () => void; onError: (error: Error) => void }) {\n await this.connectOAuth({\n onSuccess,\n onError,\n type: AirdropSigIdentityTypeEnum.Twitter\n });\n }\n\n async connectGoogle({ onSuccess, onError }: { onSuccess: () => void; onError: (error: Error) => void }) {\n await this.connectOAuth({\n onSuccess,\n onError,\n type: AirdropSigIdentityTypeEnum.Google\n });\n }\n\n async connectWallet({\n chainType,\n onSuccess,\n onError\n }: {\n chainType: ChainType;\n onSuccess?: (address: string) => void;\n onError?: (error: any) => void;\n }) {\n try {\n const project = await this.getProjectInfo();\n const wallet = WalletFactory.getWallet(chainType);\n const timestamp = Date.now();\n const recipientTypeMap = {\n [ChainType.Evm]: AirdropSigIdentityTypeEnum.EVMWallet,\n [ChainType.Solana]: AirdropSigIdentityTypeEnum.SolanaWallet,\n [ChainType.Ton]: AirdropSigIdentityTypeEnum.TONWallet,\n [ChainType.Sui]: ''\n };\n const msg = [project.id, recipientTypeMap[chainType], timestamp].join(',');\n const signResult = await wallet.signin(msg, false);\n await wallet.disconnect();\n const { message, signature, signedMessage } = signResult || {};\n\n if (this.identities?.find((it) => it.value?.toLowerCase() === wallet.address?.toLowerCase())) {\n onError?.(ErrorCode.WALLET_ALREADY_CONNECTED);\n return;\n }\n\n const payload = {\n signature: signature as string,\n message: message as string,\n key: wallet.publicKey || wallet.address!,\n address: wallet.address!,\n projectId: project.id,\n timestamp: timestamp,\n recipientType: recipientTypeMap[chainType],\n encodedMessage: signedMessage\n };\n\n const res = await bindWallet(payload, this.endpoint);\n if (res?.sid) {\n this.setSid(project.id, res?.sid);\n }\n onSuccess?.(wallet.address!);\n } catch (error) {\n onError?.(error);\n }\n }\n\n async getClaims() {\n const project = await this.getProjectInfo();\n if (this.authPromise) {\n await this.authPromise;\n }\n const res = await checkEligibility(\n {\n projectId: project.id\n },\n this.endpoint\n );\n this.claims = res.claims;\n this.identities = res.identities;\n return res;\n }\n\n public async disconnectIdentity({\n recipientType,\n recipient\n }: {\n recipientType: AirdropSigIdentityTypeEnum;\n recipient?: string;\n }) {\n const project = await this.getProjectInfo();\n return await disconnectRecipient(\n {\n projectId: project.id,\n recipientType,\n recipient\n },\n this.endpoint\n );\n }\n\n public async getStrategy(\n walletClient?: IWalletClient\n ): Promise<EvmSignatureAirdropService | SolanaSignatureAirdropService | SuiSignatureAirdropService> {\n const project = await this.getProjectInfo();\n\n let cacheKey = 'default';\n if (walletClient) {\n if (project.chainType === ChainType.Evm) {\n cacheKey = (walletClient as ViemWalletClient).account?.address!;\n } else if (project.chainType === ChainType.Solana) {\n cacheKey = (walletClient as SolanaWalletState).publicKey!.toString();\n } else if (project.chainType === ChainType.Sui) {\n cacheKey = (walletClient as SuiWalletClient).accounts[0].address;\n }\n } else {\n cacheKey = 'walletClient';\n }\n\n if (this.strategyCache.has(cacheKey)) {\n return this.strategyCache.get(cacheKey)!;\n }\n\n let strategy = null;\n if (project.chainType === ChainType.Solana) {\n strategy = new SolanaSignatureAirdropService({\n chainId: project.chainId,\n projectId: project.id,\n token: project.tokenAddress,\n walletClient: walletClient as any,\n chainRpc: this.chainRpc!\n });\n } else if (project.chainType === ChainType.Sui) {\n strategy = new SuiSignatureAirdropService({\n chainId: project.chainId as any,\n coinType: project.tokenAddress,\n walletClient: walletClient as any,\n chainRpc: this.chainRpc!,\n distributorId: project.contractAddress\n });\n } else if (project.chainType === ChainType.Evm) {\n strategy = new EvmSignatureAirdropService({\n chainId: Number(project.chainId) as ChainId,\n contractAddress: project.contractAddress,\n walletClient: walletClient as any,\n chainRpc: this.chainRpc!\n });\n }\n if (!strategy) {\n throw new Error('No strategy found');\n }\n this.strategyCache.set(cacheKey, strategy);\n return strategy;\n }\n\n async getVersion(): Promise<string> {\n const strategy = await this.getStrategy();\n return strategy.getVersion();\n }\n\n // solana prams need to wallet\n async getClaimFee(amount?: bigint, walletClient?: IWalletClient): Promise<undefined | bigint> {\n const strategy = await this.getStrategy(walletClient);\n if (!strategy.getClaimFee) {\n throw new Error('getClaimFee is not supported for this chain');\n }\n return await strategy.getClaimFee(this.project?.contractAddress || '', amount || BigInt(1));\n }\n\n async claimAirdrop({\n claimIds,\n walletClient,\n recipient\n }: {\n claimIds: string[];\n walletClient: IWalletClient;\n recipient: string;\n }) {\n if (!claimIds.length) {\n throw new Error('Claim IDs cannot be empty');\n }\n if (!walletClient) {\n throw new Error('Wallet client is required');\n }\n if (!this.claims?.length) {\n throw new Error('No claims available');\n }\n const service = await this.getStrategy(walletClient);\n const project = await this.getProjectInfo();\n const res = await checkGetSignatures(\n {\n claimIds,\n projectId: this.projectId!,\n recipient\n },\n this.endpoint\n );\n if (!res?.signatures?.length) {\n throw new Error('Failed to get signatures');\n }\n const signatureMap = res?.signatures?.reduce(\n (map, item) => {\n map[item.claimId] = item;\n return map;\n },\n {} as Record<string, IClaimSignature>\n );\n const filteredClaims = this.claims.filter((it) => claimIds.includes(it.claimId));\n if (!filteredClaims.length) {\n throw new Error('No matching claims found');\n }\n\n // only evm use\n const defaultRecipient =\n project.chainType === ChainType.Evm ? (walletClient as ViemWalletClient).account?.address! : '';\n\n const claimData = filteredClaims.map((it) => {\n const signature = signatureMap[it.claimId];\n if (!signature) {\n throw new Error(`Signature not found for claim ID: ${it.claimId}`);\n }\n\n return {\n ...it,\n recipient: recipient ? recipient : defaultRecipient,\n ...signature\n };\n });\n\n const hash = (await service!.claim(claimData, recipient)) as `0x${string}`;\n return hash;\n }\n\n async batchCheckClaimed(): Promise<boolean[]> {\n if (!this.claims?.length) return [];\n const strategy = await this.getStrategy();\n if (!strategy.batchFetchClaimed) {\n throw new Error('batchCheckClaimed is not supported for this chain');\n }\n const claimIds = this.claims?.map((it) => it.claimId);\n return strategy.batchFetchClaimed(claimIds);\n }\n\n async getPaused(): Promise<boolean> {\n const strategy = await this.getStrategy();\n if (!strategy.getPaused) {\n throw new Error('getPaused is not supported for this chain');\n }\n return strategy.getPaused();\n }\n}\n","export { AirdropClient } from './AirdropClient';\nexport { SignatureAirdropClient } from './SignatureAirdropClient';\nexport * from '@sign-global/tokentable-core';\nexport * from '@sign-global/tokentable-wallets';\n"],"mappings":"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","names":["ChainType","ChainType","getAirdropProject","getChainRpc","ChainType"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sign-global/tokentable",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"module": "dist/index.mjs",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
"@orbs-network/ton-access": "^2.3.3",
|
|
18
18
|
"@solana/spl-token": "^0.4.12",
|
|
19
19
|
"@solana/wallet-adapter-base": "^0.9.26",
|
|
20
|
-
"@solana/wallet-adapter-wallets": "^0.19.
|
|
21
|
-
"@solana/web3.js": "^1.98.
|
|
20
|
+
"@solana/wallet-adapter-wallets": "^0.19.37",
|
|
21
|
+
"@solana/web3.js": "^1.98.2",
|
|
22
22
|
"@ton/core": "^0.59.0",
|
|
23
23
|
"@ton/ton": "^15.1.0",
|
|
24
24
|
"@tonconnect/ui": "^2.0.11",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
"@tonconnect/sdk": "^3.0.6",
|
|
30
30
|
"tonweb": "^0.0.66",
|
|
31
31
|
"viem": "^2.0.0",
|
|
32
|
-
"@sign-global/tokentable-core": "1.
|
|
33
|
-
"@sign-global/tokentable-wallets": "1.
|
|
32
|
+
"@sign-global/tokentable-core": "1.2.0",
|
|
33
|
+
"@sign-global/tokentable-wallets": "1.2.1"
|
|
34
34
|
},
|
|
35
35
|
"publishConfig": {
|
|
36
36
|
"access": "public"
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
CONST,
|
|
14
14
|
EvmSignatureAirdropService,
|
|
15
15
|
SolanaSignatureAirdropService,
|
|
16
|
+
SuiSignatureAirdropService,
|
|
16
17
|
AirdropSigIdentityTypeEnum,
|
|
17
18
|
ChainId,
|
|
18
19
|
ErrorCode,
|
|
@@ -24,7 +25,8 @@ import {
|
|
|
24
25
|
IWalletClient,
|
|
25
26
|
SolanaWalletState,
|
|
26
27
|
ViemWalletClient,
|
|
27
|
-
ChainType
|
|
28
|
+
ChainType,
|
|
29
|
+
SuiWalletClient
|
|
28
30
|
} from '@sign-global/tokentable-core';
|
|
29
31
|
|
|
30
32
|
export class SignatureAirdropClient {
|
|
@@ -36,7 +38,10 @@ export class SignatureAirdropClient {
|
|
|
36
38
|
protected identities?: IAirdropSignatureIdentity[];
|
|
37
39
|
private projectPromise: Promise<void> | undefined;
|
|
38
40
|
private authPromise: Promise<void> | undefined;
|
|
39
|
-
private strategyCache: Map<
|
|
41
|
+
private strategyCache: Map<
|
|
42
|
+
string,
|
|
43
|
+
EvmSignatureAirdropService | SolanaSignatureAirdropService | SuiSignatureAirdropService
|
|
44
|
+
> = new Map();
|
|
40
45
|
constructor(params: IAirdropOptions) {
|
|
41
46
|
this.projectId = params.projectId;
|
|
42
47
|
this.endpoint = params.endpoint;
|
|
@@ -191,12 +196,13 @@ export class SignatureAirdropClient {
|
|
|
191
196
|
const recipientTypeMap = {
|
|
192
197
|
[ChainType.Evm]: AirdropSigIdentityTypeEnum.EVMWallet,
|
|
193
198
|
[ChainType.Solana]: AirdropSigIdentityTypeEnum.SolanaWallet,
|
|
194
|
-
[ChainType.Ton]: AirdropSigIdentityTypeEnum.TONWallet
|
|
199
|
+
[ChainType.Ton]: AirdropSigIdentityTypeEnum.TONWallet,
|
|
200
|
+
[ChainType.Sui]: ''
|
|
195
201
|
};
|
|
196
202
|
const msg = [project.id, recipientTypeMap[chainType], timestamp].join(',');
|
|
197
203
|
const signResult = await wallet.signin(msg, false);
|
|
198
204
|
await wallet.disconnect();
|
|
199
|
-
const { message, signature } = signResult || {};
|
|
205
|
+
const { message, signature, signedMessage } = signResult || {};
|
|
200
206
|
|
|
201
207
|
if (this.identities?.find((it) => it.value?.toLowerCase() === wallet.address?.toLowerCase())) {
|
|
202
208
|
onError?.(ErrorCode.WALLET_ALREADY_CONNECTED);
|
|
@@ -210,7 +216,8 @@ export class SignatureAirdropClient {
|
|
|
210
216
|
address: wallet.address!,
|
|
211
217
|
projectId: project.id,
|
|
212
218
|
timestamp: timestamp,
|
|
213
|
-
recipientType: recipientTypeMap[chainType]
|
|
219
|
+
recipientType: recipientTypeMap[chainType],
|
|
220
|
+
encodedMessage: signedMessage
|
|
214
221
|
};
|
|
215
222
|
|
|
216
223
|
const res = await bindWallet(payload, this.endpoint);
|
|
@@ -259,35 +266,54 @@ export class SignatureAirdropClient {
|
|
|
259
266
|
|
|
260
267
|
public async getStrategy(
|
|
261
268
|
walletClient?: IWalletClient
|
|
262
|
-
): Promise<EvmSignatureAirdropService | SolanaSignatureAirdropService> {
|
|
269
|
+
): Promise<EvmSignatureAirdropService | SolanaSignatureAirdropService | SuiSignatureAirdropService> {
|
|
263
270
|
const project = await this.getProjectInfo();
|
|
264
271
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
+
let cacheKey = 'default';
|
|
273
|
+
if (walletClient) {
|
|
274
|
+
if (project.chainType === ChainType.Evm) {
|
|
275
|
+
cacheKey = (walletClient as ViemWalletClient).account?.address!;
|
|
276
|
+
} else if (project.chainType === ChainType.Solana) {
|
|
277
|
+
cacheKey = (walletClient as SolanaWalletState).publicKey!.toString();
|
|
278
|
+
} else if (project.chainType === ChainType.Sui) {
|
|
279
|
+
cacheKey = (walletClient as SuiWalletClient).accounts[0].address;
|
|
280
|
+
}
|
|
281
|
+
} else {
|
|
282
|
+
cacheKey = 'walletClient';
|
|
283
|
+
}
|
|
284
|
+
|
|
272
285
|
if (this.strategyCache.has(cacheKey)) {
|
|
273
286
|
return this.strategyCache.get(cacheKey)!;
|
|
274
287
|
}
|
|
275
288
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
289
|
+
let strategy = null;
|
|
290
|
+
if (project.chainType === ChainType.Solana) {
|
|
291
|
+
strategy = new SolanaSignatureAirdropService({
|
|
292
|
+
chainId: project.chainId,
|
|
293
|
+
projectId: project.id,
|
|
294
|
+
token: project.tokenAddress,
|
|
295
|
+
walletClient: walletClient as any,
|
|
296
|
+
chainRpc: this.chainRpc!
|
|
297
|
+
});
|
|
298
|
+
} else if (project.chainType === ChainType.Sui) {
|
|
299
|
+
strategy = new SuiSignatureAirdropService({
|
|
300
|
+
chainId: project.chainId as any,
|
|
301
|
+
coinType: project.tokenAddress,
|
|
302
|
+
walletClient: walletClient as any,
|
|
303
|
+
chainRpc: this.chainRpc!,
|
|
304
|
+
distributorId: project.contractAddress
|
|
305
|
+
});
|
|
306
|
+
} else if (project.chainType === ChainType.Evm) {
|
|
307
|
+
strategy = new EvmSignatureAirdropService({
|
|
308
|
+
chainId: Number(project.chainId) as ChainId,
|
|
309
|
+
contractAddress: project.contractAddress,
|
|
310
|
+
walletClient: walletClient as any,
|
|
311
|
+
chainRpc: this.chainRpc!
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
if (!strategy) {
|
|
315
|
+
throw new Error('No strategy found');
|
|
316
|
+
}
|
|
291
317
|
this.strategyCache.set(cacheKey, strategy);
|
|
292
318
|
return strategy;
|
|
293
319
|
}
|