@sign-global/tokentable 1.7.7 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
- package/src/SignatureAirdropClient.ts +2 -1
- package/src/strategies/AptosAirdropStrategy.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @sign-global/tokentable
|
|
2
2
|
|
|
3
|
+
## 1.8.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies
|
|
8
|
+
- @sign-global/tokentable-core@1.14.0
|
|
9
|
+
- @sign-global/tokentable-wallets@1.6.1
|
|
10
|
+
|
|
11
|
+
## 1.8.0
|
|
12
|
+
|
|
13
|
+
### Minor Changes
|
|
14
|
+
|
|
15
|
+
- chore: update dependencies and improve type safety
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- Updated dependencies
|
|
20
|
+
- @sign-global/tokentable-wallets@1.6.0
|
|
21
|
+
- @sign-global/tokentable-core@1.13.0
|
|
22
|
+
|
|
3
23
|
## 1.7.7
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -600,8 +600,9 @@ var SignatureAirdropClient = class {
|
|
|
600
600
|
this.projectId = params.projectId;
|
|
601
601
|
this.endpoint = params.endpoint;
|
|
602
602
|
this.chainRpc = params.chainRpc;
|
|
603
|
-
if (
|
|
603
|
+
if (params.project) {
|
|
604
604
|
this.project = params.project;
|
|
605
|
+
this.projectId = params.project.id;
|
|
605
606
|
} else {
|
|
606
607
|
this.projectPromise = this.initializeProjects();
|
|
607
608
|
}
|
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/AptosAirdropStrategy.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 if (project.chainType === ChainType.Aptos) {\n const fees = claimData.fees;\n return fees ? BigInt(fees) : 0n;\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';\nimport { AptosAirdropStrategy } from './AptosAirdropStrategy';\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 [ChainType.Aptos]: AptosAirdropStrategy,\n [ChainType.Sui]: null\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 { ChainId, IWalletClient, AptosAirdropService, AptosWalletClient } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class AptosAirdropStrategy implements IAirdropStrategy {\n private service: AptosAirdropService | undefined;\n private readonly chainId: ChainId;\n private readonly chainRpc: string;\n private walletClient?: AptosWalletClient;\n private cachedVersion: string | null = null;\n private readonly contractAddress: string;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n chainRpc: string;\n }) {\n this.chainId = params.chainId as ChainId;\n this.chainRpc = params.chainRpc;\n this.contractAddress = params.contractAddress;\n if (params.walletClient) {\n this.walletClient = params.walletClient as AptosWalletClient;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as AptosWalletClient;\n }\n this.service = new AptosAirdropService({\n chainId: this.chainId as string,\n account: this.walletClient as any,\n chainRpc: this.chainRpc,\n address: this.contractAddress\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 { 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 connectDiscordApi\n} from '@sign-global/tokentable-core';\n\ntype SupportedChainType = ChainType.Evm | ChainType.Solana | ChainType.Ton | ChainType.Cosmos | ChainType.Sui;\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 claimStrategy?: string;\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.checkAndHandleOAuthCode();\n }\n }\n\n private readonly LOCAL_STORAGE_SID_PREFIX = 'sid_';\n\n private async checkAndHandleOAuthCode() {\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 } else if (type === 'discord') {\n res = await connectDiscordApi({ 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, CONST.DISCORD_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 } else if (name === CONST.DISCORD_AUTH_SUCCESS) {\n res = await connectDiscordApi({ 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 connectDiscord({ onSuccess, onError }: { onSuccess: () => void; onError: (error: Error) => void }) {\n await this.connectOAuth({\n onSuccess,\n onError,\n type: AirdropSigIdentityTypeEnum.Discord\n });\n }\n\n async connectWallet({\n chainType,\n onSuccess,\n onError\n }: {\n chainType: SupportedChainType;\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\n // 支持的链类型映射\n const recipientTypeMap: Record<SupportedChainType, string> = {\n [ChainType.Evm]: AirdropSigIdentityTypeEnum.EVMWallet,\n [ChainType.Solana]: AirdropSigIdentityTypeEnum.SolanaWallet,\n [ChainType.Ton]: AirdropSigIdentityTypeEnum.TONWallet,\n [ChainType.Cosmos]: AirdropSigIdentityTypeEnum.CosmosWallet,\n [ChainType.Sui]: AirdropSigIdentityTypeEnum.SuiWallet\n };\n\n const recipientType = recipientTypeMap[chainType];\n const msg = [project.id, recipientType, 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: recipientType,\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 setClaimStrategy(strategy: string) {\n this.claimStrategy = strategy;\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 strategy: this.claimStrategy\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","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/AptosAirdropStrategy.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 if (project.chainType === ChainType.Aptos) {\n const fees = claimData.fees;\n return fees ? BigInt(fees) : 0n;\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';\nimport { AptosAirdropStrategy } from './AptosAirdropStrategy';\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 [ChainType.Aptos]: AptosAirdropStrategy,\n [ChainType.Sui]: null\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 { ChainId, IWalletClient, AptosAirdropService, AptosWalletClient } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class AptosAirdropStrategy implements IAirdropStrategy {\n private service: AptosAirdropService | undefined;\n private readonly chainId: ChainId;\n private readonly chainRpc: string;\n private walletClient?: AptosWalletClient;\n private cachedVersion: string | null = null;\n private readonly contractAddress: string;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n chainRpc: string;\n }) {\n this.chainId = params.chainId as ChainId;\n this.chainRpc = params.chainRpc;\n this.contractAddress = params.contractAddress;\n if (params.walletClient) {\n this.walletClient = params.walletClient as AptosWalletClient;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as AptosWalletClient;\n }\n this.service = new AptosAirdropService({\n chainId: this.chainId as string,\n account: this.walletClient as any,\n chainRpc: this.chainRpc,\n address: this.contractAddress\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 as string;\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 { 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 connectDiscordApi\n} from '@sign-global/tokentable-core';\n\ntype SupportedChainType = ChainType.Evm | ChainType.Solana | ChainType.Ton | ChainType.Cosmos | ChainType.Sui;\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 claimStrategy?: string;\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 (params.project) {\n this.project = params.project;\n this.projectId = params.project.id;\n } else {\n this.projectPromise = this.initializeProjects();\n }\n if (isMobile()) {\n this.authPromise = this.checkAndHandleOAuthCode();\n }\n }\n\n private readonly LOCAL_STORAGE_SID_PREFIX = 'sid_';\n\n private async checkAndHandleOAuthCode() {\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 } else if (type === 'discord') {\n res = await connectDiscordApi({ 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, CONST.DISCORD_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 } else if (name === CONST.DISCORD_AUTH_SUCCESS) {\n res = await connectDiscordApi({ 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 connectDiscord({ onSuccess, onError }: { onSuccess: () => void; onError: (error: Error) => void }) {\n await this.connectOAuth({\n onSuccess,\n onError,\n type: AirdropSigIdentityTypeEnum.Discord\n });\n }\n\n async connectWallet({\n chainType,\n onSuccess,\n onError\n }: {\n chainType: SupportedChainType;\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\n // 支持的链类型映射\n const recipientTypeMap: Record<SupportedChainType, string> = {\n [ChainType.Evm]: AirdropSigIdentityTypeEnum.EVMWallet,\n [ChainType.Solana]: AirdropSigIdentityTypeEnum.SolanaWallet,\n [ChainType.Ton]: AirdropSigIdentityTypeEnum.TONWallet,\n [ChainType.Cosmos]: AirdropSigIdentityTypeEnum.CosmosWallet,\n [ChainType.Sui]: AirdropSigIdentityTypeEnum.SuiWallet\n };\n\n const recipientType = recipientTypeMap[chainType];\n const msg = [project.id, recipientType, 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: recipientType,\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 setClaimStrategy(strategy: string) {\n this.claimStrategy = strategy;\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 strategy: this.claimStrategy\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","import_tokentable_core"]}
|
package/dist/index.mjs
CHANGED
|
@@ -601,8 +601,9 @@ var SignatureAirdropClient = class {
|
|
|
601
601
|
this.projectId = params.projectId;
|
|
602
602
|
this.endpoint = params.endpoint;
|
|
603
603
|
this.chainRpc = params.chainRpc;
|
|
604
|
-
if (
|
|
604
|
+
if (params.project) {
|
|
605
605
|
this.project = params.project;
|
|
606
|
+
this.projectId = params.project.id;
|
|
606
607
|
} else {
|
|
607
608
|
this.projectPromise = this.initializeProjects();
|
|
608
609
|
}
|
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/AptosAirdropStrategy.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 if (project.chainType === ChainType.Aptos) {\n const fees = claimData.fees;\n return fees ? BigInt(fees) : 0n;\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';\nimport { AptosAirdropStrategy } from './AptosAirdropStrategy';\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 [ChainType.Aptos]: AptosAirdropStrategy,\n [ChainType.Sui]: null\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 { ChainId, IWalletClient, AptosAirdropService, AptosWalletClient } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class AptosAirdropStrategy implements IAirdropStrategy {\n private service: AptosAirdropService | undefined;\n private readonly chainId: ChainId;\n private readonly chainRpc: string;\n private walletClient?: AptosWalletClient;\n private cachedVersion: string | null = null;\n private readonly contractAddress: string;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n chainRpc: string;\n }) {\n this.chainId = params.chainId as ChainId;\n this.chainRpc = params.chainRpc;\n this.contractAddress = params.contractAddress;\n if (params.walletClient) {\n this.walletClient = params.walletClient as AptosWalletClient;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as AptosWalletClient;\n }\n this.service = new AptosAirdropService({\n chainId: this.chainId as string,\n account: this.walletClient as any,\n chainRpc: this.chainRpc,\n address: this.contractAddress\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 { 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 connectDiscordApi\n} from '@sign-global/tokentable-core';\n\ntype SupportedChainType = ChainType.Evm | ChainType.Solana | ChainType.Ton | ChainType.Cosmos | ChainType.Sui;\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 claimStrategy?: string;\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.checkAndHandleOAuthCode();\n }\n }\n\n private readonly LOCAL_STORAGE_SID_PREFIX = 'sid_';\n\n private async checkAndHandleOAuthCode() {\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 } else if (type === 'discord') {\n res = await connectDiscordApi({ 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, CONST.DISCORD_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 } else if (name === CONST.DISCORD_AUTH_SUCCESS) {\n res = await connectDiscordApi({ 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 connectDiscord({ onSuccess, onError }: { onSuccess: () => void; onError: (error: Error) => void }) {\n await this.connectOAuth({\n onSuccess,\n onError,\n type: AirdropSigIdentityTypeEnum.Discord\n });\n }\n\n async connectWallet({\n chainType,\n onSuccess,\n onError\n }: {\n chainType: SupportedChainType;\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\n // 支持的链类型映射\n const recipientTypeMap: Record<SupportedChainType, string> = {\n [ChainType.Evm]: AirdropSigIdentityTypeEnum.EVMWallet,\n [ChainType.Solana]: AirdropSigIdentityTypeEnum.SolanaWallet,\n [ChainType.Ton]: AirdropSigIdentityTypeEnum.TONWallet,\n [ChainType.Cosmos]: AirdropSigIdentityTypeEnum.CosmosWallet,\n [ChainType.Sui]: AirdropSigIdentityTypeEnum.SuiWallet\n };\n\n const recipientType = recipientTypeMap[chainType];\n const msg = [project.id, recipientType, 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: recipientType,\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 setClaimStrategy(strategy: string) {\n this.claimStrategy = strategy;\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 strategy: this.claimStrategy\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/AptosAirdropStrategy.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 if (project.chainType === ChainType.Aptos) {\n const fees = claimData.fees;\n return fees ? BigInt(fees) : 0n;\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';\nimport { AptosAirdropStrategy } from './AptosAirdropStrategy';\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 [ChainType.Aptos]: AptosAirdropStrategy,\n [ChainType.Sui]: null\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 { ChainId, IWalletClient, AptosAirdropService, AptosWalletClient } from '@sign-global/tokentable-core';\nimport { IAirdropStrategy } from './IAirdropStrategy';\n\nexport class AptosAirdropStrategy implements IAirdropStrategy {\n private service: AptosAirdropService | undefined;\n private readonly chainId: ChainId;\n private readonly chainRpc: string;\n private walletClient?: AptosWalletClient;\n private cachedVersion: string | null = null;\n private readonly contractAddress: string;\n\n constructor(params: {\n contractAddress: string;\n chainId: string | number;\n walletClient?: IWalletClient;\n chainRpc: string;\n }) {\n this.chainId = params.chainId as ChainId;\n this.chainRpc = params.chainRpc;\n this.contractAddress = params.contractAddress;\n if (params.walletClient) {\n this.walletClient = params.walletClient as AptosWalletClient;\n }\n }\n\n async initialize(walletClient?: IWalletClient): Promise<void> {\n if (walletClient) {\n this.walletClient = walletClient as AptosWalletClient;\n }\n this.service = new AptosAirdropService({\n chainId: this.chainId as string,\n account: this.walletClient as any,\n chainRpc: this.chainRpc,\n address: this.contractAddress\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 as string;\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 { 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 connectDiscordApi\n} from '@sign-global/tokentable-core';\n\ntype SupportedChainType = ChainType.Evm | ChainType.Solana | ChainType.Ton | ChainType.Cosmos | ChainType.Sui;\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 claimStrategy?: string;\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 (params.project) {\n this.project = params.project;\n this.projectId = params.project.id;\n } else {\n this.projectPromise = this.initializeProjects();\n }\n if (isMobile()) {\n this.authPromise = this.checkAndHandleOAuthCode();\n }\n }\n\n private readonly LOCAL_STORAGE_SID_PREFIX = 'sid_';\n\n private async checkAndHandleOAuthCode() {\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 } else if (type === 'discord') {\n res = await connectDiscordApi({ 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, CONST.DISCORD_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 } else if (name === CONST.DISCORD_AUTH_SUCCESS) {\n res = await connectDiscordApi({ 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 connectDiscord({ onSuccess, onError }: { onSuccess: () => void; onError: (error: Error) => void }) {\n await this.connectOAuth({\n onSuccess,\n onError,\n type: AirdropSigIdentityTypeEnum.Discord\n });\n }\n\n async connectWallet({\n chainType,\n onSuccess,\n onError\n }: {\n chainType: SupportedChainType;\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\n // 支持的链类型映射\n const recipientTypeMap: Record<SupportedChainType, string> = {\n [ChainType.Evm]: AirdropSigIdentityTypeEnum.EVMWallet,\n [ChainType.Solana]: AirdropSigIdentityTypeEnum.SolanaWallet,\n [ChainType.Ton]: AirdropSigIdentityTypeEnum.TONWallet,\n [ChainType.Cosmos]: AirdropSigIdentityTypeEnum.CosmosWallet,\n [ChainType.Sui]: AirdropSigIdentityTypeEnum.SuiWallet\n };\n\n const recipientType = recipientTypeMap[chainType];\n const msg = [project.id, recipientType, 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: recipientType,\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 setClaimStrategy(strategy: string) {\n this.claimStrategy = strategy;\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 strategy: this.claimStrategy\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.
|
|
3
|
+
"version": "1.8.1",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"module": "dist/index.mjs",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
"tonapi-sdk-js": "^2.0.3",
|
|
29
29
|
"@tonconnect/sdk": "^3.0.6",
|
|
30
30
|
"tonweb": "^0.0.66",
|
|
31
|
-
"viem": "^2.
|
|
32
|
-
"@sign-global/tokentable-core": "1.
|
|
33
|
-
"@sign-global/tokentable-wallets": "1.
|
|
31
|
+
"viem": "^2.39.3",
|
|
32
|
+
"@sign-global/tokentable-core": "1.14.0",
|
|
33
|
+
"@sign-global/tokentable-wallets": "1.6.1"
|
|
34
34
|
},
|
|
35
35
|
"publishConfig": {
|
|
36
36
|
"access": "public"
|
|
@@ -50,8 +50,9 @@ export class SignatureAirdropClient {
|
|
|
50
50
|
this.projectId = params.projectId;
|
|
51
51
|
this.endpoint = params.endpoint;
|
|
52
52
|
this.chainRpc = params.chainRpc;
|
|
53
|
-
if (
|
|
53
|
+
if (params.project) {
|
|
54
54
|
this.project = params.project;
|
|
55
|
+
this.projectId = params.project.id;
|
|
55
56
|
} else {
|
|
56
57
|
this.projectPromise = this.initializeProjects();
|
|
57
58
|
}
|
|
@@ -45,7 +45,7 @@ export class AptosAirdropStrategy implements IAirdropStrategy {
|
|
|
45
45
|
}
|
|
46
46
|
if (!this.service) throw new Error('Strategy not initialized');
|
|
47
47
|
this.cachedVersion = await this.service.getVersion();
|
|
48
|
-
return this.cachedVersion;
|
|
48
|
+
return this.cachedVersion as string;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
async claim(claimData: any): Promise<any> {
|