@sign-global/tokentable 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/SignatureAirdropClient.ts +12 -7
package/CHANGELOG.md
CHANGED
package/dist/index.d.mts
CHANGED
|
@@ -70,6 +70,7 @@ declare class AirdropClient {
|
|
|
70
70
|
getKycThreshold(): Promise<bigint>;
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
type SupportedChainType = ChainType.Evm | ChainType.Solana | ChainType.Ton | ChainType.Cosmos | ChainType.Sui;
|
|
73
74
|
declare class SignatureAirdropClient {
|
|
74
75
|
private projectId?;
|
|
75
76
|
private endpoint?;
|
|
@@ -106,7 +107,7 @@ declare class SignatureAirdropClient {
|
|
|
106
107
|
onError: (error: Error) => void;
|
|
107
108
|
}): Promise<void>;
|
|
108
109
|
connectWallet({ chainType, onSuccess, onError }: {
|
|
109
|
-
chainType:
|
|
110
|
+
chainType: SupportedChainType;
|
|
110
111
|
onSuccess?: (address: string) => void;
|
|
111
112
|
onError?: (error: any) => void;
|
|
112
113
|
}): Promise<void>;
|
package/dist/index.d.ts
CHANGED
|
@@ -70,6 +70,7 @@ declare class AirdropClient {
|
|
|
70
70
|
getKycThreshold(): Promise<bigint>;
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
type SupportedChainType = ChainType.Evm | ChainType.Solana | ChainType.Ton | ChainType.Cosmos | ChainType.Sui;
|
|
73
74
|
declare class SignatureAirdropClient {
|
|
74
75
|
private projectId?;
|
|
75
76
|
private endpoint?;
|
|
@@ -106,7 +107,7 @@ declare class SignatureAirdropClient {
|
|
|
106
107
|
onError: (error: Error) => void;
|
|
107
108
|
}): Promise<void>;
|
|
108
109
|
connectWallet({ chainType, onSuccess, onError }: {
|
|
109
|
-
chainType:
|
|
110
|
+
chainType: SupportedChainType;
|
|
110
111
|
onSuccess?: (address: string) => void;
|
|
111
112
|
onError?: (error: any) => void;
|
|
112
113
|
}): Promise<void>;
|
package/dist/index.js
CHANGED
|
@@ -742,11 +742,11 @@ var SignatureAirdropClient = class {
|
|
|
742
742
|
[import_tokentable_core7.ChainType.Evm]: import_tokentable_core7.AirdropSigIdentityTypeEnum.EVMWallet,
|
|
743
743
|
[import_tokentable_core7.ChainType.Solana]: import_tokentable_core7.AirdropSigIdentityTypeEnum.SolanaWallet,
|
|
744
744
|
[import_tokentable_core7.ChainType.Ton]: import_tokentable_core7.AirdropSigIdentityTypeEnum.TONWallet,
|
|
745
|
-
[import_tokentable_core7.ChainType.
|
|
746
|
-
[import_tokentable_core7.ChainType.
|
|
747
|
-
[import_tokentable_core7.ChainType.Cosmos]: import_tokentable_core7.AirdropSigIdentityTypeEnum.CosmosWallet
|
|
745
|
+
[import_tokentable_core7.ChainType.Cosmos]: import_tokentable_core7.AirdropSigIdentityTypeEnum.CosmosWallet,
|
|
746
|
+
[import_tokentable_core7.ChainType.Sui]: import_tokentable_core7.AirdropSigIdentityTypeEnum.SuiWallet
|
|
748
747
|
};
|
|
749
|
-
const
|
|
748
|
+
const recipientType = recipientTypeMap[chainType];
|
|
749
|
+
const msg = [project.id, recipientType, timestamp].join(",");
|
|
750
750
|
const signResult = await wallet.signin(msg, false);
|
|
751
751
|
await wallet.disconnect();
|
|
752
752
|
const { message, signature, signedMessage } = signResult || {};
|
|
@@ -761,7 +761,7 @@ var SignatureAirdropClient = class {
|
|
|
761
761
|
address: wallet.address,
|
|
762
762
|
projectId: project.id,
|
|
763
763
|
timestamp,
|
|
764
|
-
recipientType
|
|
764
|
+
recipientType,
|
|
765
765
|
encodedMessage: signedMessage
|
|
766
766
|
};
|
|
767
767
|
const res = await (0, import_tokentable_core7.bindWallet)(payload, this.endpoint);
|
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\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: ChainType;\n onSuccess?: (address: string) => void;\n onError?: (error: any) => void;\n }) {\n try {\n const project = await this.getProjectInfo();\n const wallet = WalletFactory.getWallet(chainType);\n const timestamp = Date.now();\n const recipientTypeMap = {\n [ChainType.Evm]: AirdropSigIdentityTypeEnum.EVMWallet,\n [ChainType.Solana]: AirdropSigIdentityTypeEnum.SolanaWallet,\n [ChainType.Ton]: AirdropSigIdentityTypeEnum.TONWallet,\n [ChainType.Sui]: '',\n [ChainType.Aptos]: '',\n [ChainType.Cosmos]: AirdropSigIdentityTypeEnum.CosmosWallet\n };\n const msg = [project.id, recipientTypeMap[chainType], timestamp].join(',');\n const signResult = await wallet.signin(msg, false);\n await wallet.disconnect();\n const { message, signature, signedMessage } = signResult || {};\n\n if (this.identities?.find((it) => it.value?.toLowerCase() === wallet.address?.toLowerCase())) {\n onError?.(ErrorCode.WALLET_ALREADY_CONNECTED);\n return;\n }\n\n const payload = {\n signature: signature as string,\n message: message as string,\n key: wallet.publicKey || wallet.address!,\n address: wallet.address!,\n projectId: project.id,\n timestamp: timestamp,\n recipientType: recipientTypeMap[chainType],\n encodedMessage: signedMessage\n };\n\n const res = await bindWallet(payload, this.endpoint);\n if (res?.sid) {\n this.setSid(project.id, res?.sid);\n }\n onSuccess?.(wallet.address!);\n } catch (error) {\n onError?.(error);\n }\n }\n\n async getClaims() {\n const project = await this.getProjectInfo();\n if (this.authPromise) {\n await this.authPromise;\n }\n const res = await checkEligibility(\n {\n projectId: project.id\n },\n this.endpoint\n );\n this.claims = res.claims;\n this.identities = res.identities;\n return res;\n }\n\n public async disconnectIdentity({\n recipientType,\n recipient\n }: {\n recipientType: AirdropSigIdentityTypeEnum;\n recipient?: string;\n }) {\n const project = await this.getProjectInfo();\n return await disconnectRecipient(\n {\n projectId: project.id,\n recipientType,\n recipient\n },\n this.endpoint\n );\n }\n\n public async 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;\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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -743,11 +743,11 @@ var SignatureAirdropClient = class {
|
|
|
743
743
|
[ChainType3.Evm]: AirdropSigIdentityTypeEnum.EVMWallet,
|
|
744
744
|
[ChainType3.Solana]: AirdropSigIdentityTypeEnum.SolanaWallet,
|
|
745
745
|
[ChainType3.Ton]: AirdropSigIdentityTypeEnum.TONWallet,
|
|
746
|
-
[ChainType3.
|
|
747
|
-
[ChainType3.
|
|
748
|
-
[ChainType3.Cosmos]: AirdropSigIdentityTypeEnum.CosmosWallet
|
|
746
|
+
[ChainType3.Cosmos]: AirdropSigIdentityTypeEnum.CosmosWallet,
|
|
747
|
+
[ChainType3.Sui]: AirdropSigIdentityTypeEnum.SuiWallet
|
|
749
748
|
};
|
|
750
|
-
const
|
|
749
|
+
const recipientType = recipientTypeMap[chainType];
|
|
750
|
+
const msg = [project.id, recipientType, timestamp].join(",");
|
|
751
751
|
const signResult = await wallet.signin(msg, false);
|
|
752
752
|
await wallet.disconnect();
|
|
753
753
|
const { message, signature, signedMessage } = signResult || {};
|
|
@@ -762,7 +762,7 @@ var SignatureAirdropClient = class {
|
|
|
762
762
|
address: wallet.address,
|
|
763
763
|
projectId: project.id,
|
|
764
764
|
timestamp,
|
|
765
|
-
recipientType
|
|
765
|
+
recipientType,
|
|
766
766
|
encodedMessage: signedMessage
|
|
767
767
|
};
|
|
768
768
|
const res = await bindWallet(payload, this.endpoint);
|
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\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: ChainType;\n onSuccess?: (address: string) => void;\n onError?: (error: any) => void;\n }) {\n try {\n const project = await this.getProjectInfo();\n const wallet = WalletFactory.getWallet(chainType);\n const timestamp = Date.now();\n const recipientTypeMap = {\n [ChainType.Evm]: AirdropSigIdentityTypeEnum.EVMWallet,\n [ChainType.Solana]: AirdropSigIdentityTypeEnum.SolanaWallet,\n [ChainType.Ton]: AirdropSigIdentityTypeEnum.TONWallet,\n [ChainType.Sui]: '',\n [ChainType.Aptos]: '',\n [ChainType.Cosmos]: AirdropSigIdentityTypeEnum.CosmosWallet\n };\n const msg = [project.id, recipientTypeMap[chainType], timestamp].join(',');\n const signResult = await wallet.signin(msg, false);\n await wallet.disconnect();\n const { message, signature, signedMessage } = signResult || {};\n\n if (this.identities?.find((it) => it.value?.toLowerCase() === wallet.address?.toLowerCase())) {\n onError?.(ErrorCode.WALLET_ALREADY_CONNECTED);\n return;\n }\n\n const payload = {\n signature: signature as string,\n message: message as string,\n key: wallet.publicKey || wallet.address!,\n address: wallet.address!,\n projectId: project.id,\n timestamp: timestamp,\n recipientType: recipientTypeMap[chainType],\n encodedMessage: signedMessage\n };\n\n const res = await bindWallet(payload, this.endpoint);\n if (res?.sid) {\n this.setSid(project.id, res?.sid);\n }\n onSuccess?.(wallet.address!);\n } catch (error) {\n onError?.(error);\n }\n }\n\n async getClaims() {\n const project = await this.getProjectInfo();\n if (this.authPromise) {\n await this.authPromise;\n }\n const res = await checkEligibility(\n {\n projectId: project.id\n },\n this.endpoint\n );\n this.claims = res.claims;\n this.identities = res.identities;\n return res;\n }\n\n public async disconnectIdentity({\n recipientType,\n recipient\n }: {\n recipientType: AirdropSigIdentityTypeEnum;\n recipient?: string;\n }) {\n const project = await this.getProjectInfo();\n return await disconnectRecipient(\n {\n projectId: project.id,\n recipientType,\n recipient\n },\n this.endpoint\n );\n }\n\n public async 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;\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sign-global/tokentable",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"module": "dist/index.mjs",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"tonweb": "^0.0.66",
|
|
31
31
|
"viem": "^2.0.0",
|
|
32
32
|
"@sign-global/tokentable-core": "1.6.0",
|
|
33
|
-
"@sign-global/tokentable-wallets": "1.
|
|
33
|
+
"@sign-global/tokentable-wallets": "1.5.0"
|
|
34
34
|
},
|
|
35
35
|
"publishConfig": {
|
|
36
36
|
"access": "public"
|
|
@@ -30,6 +30,8 @@ import {
|
|
|
30
30
|
connectDiscordApi
|
|
31
31
|
} from '@sign-global/tokentable-core';
|
|
32
32
|
|
|
33
|
+
type SupportedChainType = ChainType.Evm | ChainType.Solana | ChainType.Ton | ChainType.Cosmos | ChainType.Sui;
|
|
34
|
+
|
|
33
35
|
export class SignatureAirdropClient {
|
|
34
36
|
private projectId?: string;
|
|
35
37
|
private endpoint?: string;
|
|
@@ -199,7 +201,7 @@ export class SignatureAirdropClient {
|
|
|
199
201
|
onSuccess,
|
|
200
202
|
onError
|
|
201
203
|
}: {
|
|
202
|
-
chainType:
|
|
204
|
+
chainType: SupportedChainType;
|
|
203
205
|
onSuccess?: (address: string) => void;
|
|
204
206
|
onError?: (error: any) => void;
|
|
205
207
|
}) {
|
|
@@ -207,15 +209,18 @@ export class SignatureAirdropClient {
|
|
|
207
209
|
const project = await this.getProjectInfo();
|
|
208
210
|
const wallet = WalletFactory.getWallet(chainType);
|
|
209
211
|
const timestamp = Date.now();
|
|
210
|
-
|
|
212
|
+
|
|
213
|
+
// 支持的链类型映射
|
|
214
|
+
const recipientTypeMap: Record<SupportedChainType, string> = {
|
|
211
215
|
[ChainType.Evm]: AirdropSigIdentityTypeEnum.EVMWallet,
|
|
212
216
|
[ChainType.Solana]: AirdropSigIdentityTypeEnum.SolanaWallet,
|
|
213
217
|
[ChainType.Ton]: AirdropSigIdentityTypeEnum.TONWallet,
|
|
214
|
-
[ChainType.
|
|
215
|
-
[ChainType.
|
|
216
|
-
[ChainType.Cosmos]: AirdropSigIdentityTypeEnum.CosmosWallet
|
|
218
|
+
[ChainType.Cosmos]: AirdropSigIdentityTypeEnum.CosmosWallet,
|
|
219
|
+
[ChainType.Sui]: AirdropSigIdentityTypeEnum.SuiWallet
|
|
217
220
|
};
|
|
218
|
-
|
|
221
|
+
|
|
222
|
+
const recipientType = recipientTypeMap[chainType];
|
|
223
|
+
const msg = [project.id, recipientType, timestamp].join(',');
|
|
219
224
|
const signResult = await wallet.signin(msg, false);
|
|
220
225
|
await wallet.disconnect();
|
|
221
226
|
const { message, signature, signedMessage } = signResult || {};
|
|
@@ -232,7 +237,7 @@ export class SignatureAirdropClient {
|
|
|
232
237
|
address: wallet.address!,
|
|
233
238
|
projectId: project.id,
|
|
234
239
|
timestamp: timestamp,
|
|
235
|
-
recipientType:
|
|
240
|
+
recipientType: recipientType,
|
|
236
241
|
encodedMessage: signedMessage
|
|
237
242
|
};
|
|
238
243
|
|