@sign-global/tokentable 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +12 -34
  2. package/dist/cjs/airdrop/common/index.d.ts +1 -1
  3. package/dist/cjs/airdrop/common/index.js +4 -0
  4. package/dist/cjs/airdrop/common/index.js.map +1 -1
  5. package/dist/cjs/airdrop/core/evm/AirdropService.js +0 -1
  6. package/dist/cjs/airdrop/core/evm/AirdropService.js.map +1 -1
  7. package/dist/cjs/airdrop/index.d.ts +9 -6
  8. package/dist/cjs/airdrop/index.js +85 -37
  9. package/dist/cjs/airdrop/index.js.map +1 -1
  10. package/dist/cjs/airdrop/types/index.d.ts +31 -1
  11. package/dist/cjs/airdrop/types/index.js +7 -1
  12. package/dist/cjs/airdrop/types/index.js.map +1 -1
  13. package/dist/cjs/index.d.ts +1 -0
  14. package/dist/cjs/index.js +15 -0
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/esm/airdrop/common/index.d.ts +1 -1
  17. package/dist/esm/airdrop/common/index.js +4 -0
  18. package/dist/esm/airdrop/common/index.js.map +1 -1
  19. package/dist/esm/airdrop/core/evm/AirdropService.js +0 -1
  20. package/dist/esm/airdrop/core/evm/AirdropService.js.map +1 -1
  21. package/dist/esm/airdrop/index.d.ts +9 -6
  22. package/dist/esm/airdrop/index.js +86 -38
  23. package/dist/esm/airdrop/index.js.map +1 -1
  24. package/dist/esm/airdrop/types/index.d.ts +31 -1
  25. package/dist/esm/airdrop/types/index.js +6 -0
  26. package/dist/esm/airdrop/types/index.js.map +1 -1
  27. package/dist/esm/index.d.ts +1 -0
  28. package/dist/esm/index.js +1 -0
  29. package/dist/esm/index.js.map +1 -1
  30. package/jest.config.cjs +5 -0
  31. package/package.json +6 -2
  32. package/src/airdrop/common/index.ts +6 -1
  33. package/src/airdrop/core/evm/AirdropService.ts +0 -1
  34. package/src/airdrop/index.ts +111 -43
  35. package/src/airdrop/tests/index.test.ts +95 -0
  36. package/src/airdrop/types/index.ts +33 -1
  37. package/src/index.ts +1 -0
@@ -1,7 +1,7 @@
1
1
  import { AirdropService as TonAirdropService } from './core/ton/AirdropService';
2
2
  import { AirdropService as EvmAirdropService } from './core/evm/AirdropService';
3
3
  import { getAirdropPro, getAirdropProject, getAirdropQuery } from './services';
4
- import { ChainType } from './types';
4
+ import { ChainType, ETokenType, EvmAirdropVersionEnum } from './types';
5
5
  import { getTonProjectIdByAddress } from './common';
6
6
  export class AirdropClient {
7
7
  tonClient;
@@ -10,8 +10,11 @@ export class AirdropClient {
10
10
  endpoint;
11
11
  project;
12
12
  claims;
13
- contractInstance;
13
+ contractInstanceWithWallet;
14
+ contractInstanceWithoutWallet;
14
15
  projectPromise;
16
+ claimHook;
17
+ cachedVersion = null;
15
18
  constructor(params) {
16
19
  if ('slug' in params) {
17
20
  this.slug = params.slug;
@@ -25,14 +28,9 @@ export class AirdropClient {
25
28
  let projectId = this.projectId;
26
29
  if (this.slug) {
27
30
  const res = await getAirdropPro(this.slug, this.endpoint);
28
- const projectMap = res?.childProjectMapping;
31
+ const projectMap = res?.childProjectMapping || {};
29
32
  let legacyProjectId;
30
- if (!address) {
31
- legacyProjectId = Object.values(projectMap)[0];
32
- }
33
- else {
34
- legacyProjectId = getTonProjectIdByAddress({ address, slug: this.slug, data: projectMap });
35
- }
33
+ legacyProjectId = getTonProjectIdByAddress({ address, slug: this.slug, data: projectMap });
36
34
  if (legacyProjectId) {
37
35
  projectId = legacyProjectId;
38
36
  }
@@ -42,7 +40,6 @@ export class AirdropClient {
42
40
  this.project = await getAirdropProject(projectId, this.endpoint);
43
41
  }
44
42
  async getProjectInfo() {
45
- console.log(this.projectPromise);
46
43
  await this.projectPromise;
47
44
  if (!this.project)
48
45
  throw new Error('Project not found');
@@ -64,23 +61,41 @@ export class AirdropClient {
64
61
  return this.claims;
65
62
  }
66
63
  async getAirdropContractWrapper(options) {
67
- if (!this.contractInstance) {
68
- const project = await this.getProjectInfo();
69
- const instance = project.chainType === ChainType.Evm
70
- ? new EvmAirdropService({
71
- contractAddress: project.contractAddress,
72
- chainId: Number(project.chainId),
73
- walletClient: options.walletClient
74
- })
75
- : new TonAirdropService({
76
- chainId: project.chainId.toString(),
77
- address: project.contractAddress,
78
- walletClient: options.walletClient,
79
- tonClient: this.tonClient
80
- });
81
- this.contractInstance = instance;
64
+ const project = await this.getProjectInfo();
65
+ if (options?.walletClient) {
66
+ if (!this.contractInstanceWithWallet) {
67
+ const instance = project.chainType === ChainType.Evm
68
+ ? new EvmAirdropService({
69
+ contractAddress: project.contractAddress,
70
+ chainId: Number(project.chainId),
71
+ walletClient: options.walletClient
72
+ })
73
+ : new TonAirdropService({
74
+ chainId: project.chainId.toString(),
75
+ address: project.contractAddress,
76
+ walletClient: options.walletClient,
77
+ tonClient: this.tonClient
78
+ });
79
+ this.contractInstanceWithWallet = instance;
80
+ }
81
+ return this.contractInstanceWithWallet;
82
+ }
83
+ else {
84
+ if (!this.contractInstanceWithoutWallet) {
85
+ const instance = project.chainType === ChainType.Evm
86
+ ? new EvmAirdropService({
87
+ contractAddress: project.contractAddress,
88
+ chainId: Number(project.chainId)
89
+ })
90
+ : new TonAirdropService({
91
+ chainId: project.chainId.toString(),
92
+ address: project.contractAddress,
93
+ tonClient: this.tonClient
94
+ });
95
+ this.contractInstanceWithoutWallet = instance;
96
+ }
97
+ return this.contractInstanceWithoutWallet;
82
98
  }
83
- return this.contractInstance;
84
99
  }
85
100
  getClaimDataById(claimId) {
86
101
  const claimData = this.claims?.find((it) => it.claimId === claimId);
@@ -88,19 +103,41 @@ export class AirdropClient {
88
103
  throw new Error('Claim data not found');
89
104
  return claimData;
90
105
  }
106
+ setClaimFeeHook(fn) {
107
+ this.claimHook = fn;
108
+ }
91
109
  async claimAirdrop({ claimId, walletClient }, options) {
92
110
  const claimData = this.getClaimDataById(claimId);
111
+ const project = await this.getProjectInfo();
93
112
  const contractWrapper = await this.getAirdropContractWrapper({
94
113
  walletClient
95
114
  });
115
+ if (project.chainType === ChainType.Evm) {
116
+ const version = await contractWrapper.getVersion();
117
+ const needsFeeData = !(project.tokenType === ETokenType.Native &&
118
+ [EvmAirdropVersionEnum.V3, EvmAirdropVersionEnum.V4].includes(version));
119
+ const value = needsFeeData ? await this.getClaimFee(BigInt(claimData.amount)) : undefined;
120
+ let extraData = {
121
+ isLegacy: true,
122
+ attestationId: BigInt(1)
123
+ };
124
+ if (this.claimHook) {
125
+ extraData = this.claimHook(claimData);
126
+ }
127
+ return contractWrapper.claim({
128
+ proof: claimData.proof,
129
+ group: claimData.group,
130
+ data: claimData.data,
131
+ value: value,
132
+ extraData: extraData
133
+ });
134
+ }
96
135
  return contractWrapper.claim(claimData, options);
97
136
  }
98
137
  async checkClaimed(claimId) {
99
138
  const claimData = this.getClaimDataById(claimId);
100
139
  const project = await this.getProjectInfo();
101
- const contractWrapper = await this.getAirdropContractWrapper({
102
- tonClient: this.tonClient
103
- });
140
+ const contractWrapper = await this.getAirdropContractWrapper();
104
141
  if (project.chainType === ChainType.Evm) {
105
142
  return contractWrapper.isLeafUsed(claimData.leaf);
106
143
  }
@@ -108,32 +145,43 @@ export class AirdropClient {
108
145
  }
109
146
  async getPaused() {
110
147
  const project = await this.getProjectInfo();
111
- const contractWrapper = await this.getAirdropContractWrapper({
112
- tonClient: this.tonClient
113
- });
148
+ const contractWrapper = await this.getAirdropContractWrapper();
114
149
  if (project.chainType === ChainType.Evm) {
115
150
  throw new Error('EVM chain is not supported');
116
151
  }
117
152
  return contractWrapper.getPaused();
118
153
  }
119
154
  async getVersion() {
120
- const contractWrapper = await this.getAirdropContractWrapper({
121
- tonClient: this.tonClient
122
- });
123
- return contractWrapper?.getVersion();
155
+ if (this.cachedVersion) {
156
+ return this.cachedVersion;
157
+ }
158
+ const contractWrapper = await this.getAirdropContractWrapper();
159
+ this.cachedVersion = await contractWrapper?.getVersion();
160
+ return this.cachedVersion;
124
161
  }
125
- async batchFetchClaimed(leafs) {
162
+ async batchCheckClaimed() {
126
163
  const project = await this.getProjectInfo();
127
164
  if (project.chainType === ChainType.Ton) {
128
165
  throw new Error('TON chain is not supported');
129
166
  }
130
167
  const contractWrapper = await this.getAirdropContractWrapper({});
168
+ const leafs = this.claims?.map((it) => it.leaf);
169
+ if (!leafs)
170
+ return [];
131
171
  return contractWrapper.batchFetchClaimed(leafs);
132
172
  }
173
+ async getNFT() {
174
+ const project = await this.getProjectInfo();
175
+ if (project.chainType === ChainType.Ton) {
176
+ throw new Error('TON chain is not supported');
177
+ }
178
+ const contractWrapper = await this.getAirdropContractWrapper({});
179
+ return contractWrapper.getNFT();
180
+ }
133
181
  async getClaimFee(amount) {
134
182
  const project = await this.getProjectInfo();
135
183
  const contractWrapper = await this.getAirdropContractWrapper({});
136
- return contractWrapper.getClaimFee(project.contractAddress, amount);
184
+ return contractWrapper.getClaimFee(project.contractAddress, amount || BigInt(1));
137
185
  }
138
186
  }
139
187
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/airdrop/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/airdrop/index.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,31 @@ export declare enum ChainType {
15
15
  Evm = "evm",
16
16
  Ton = "ton"
17
17
  }
18
+ export type ThemeConfig = {
19
+ logo: string;
20
+ title: string;
21
+ description: string;
22
+ coverImage: string;
23
+ subTitle: string;
24
+ primaryColor: string;
25
+ secondaryColor: string;
26
+ buttonPrimaryHover: string;
27
+ buttonSecondaryHover: string;
28
+ buttonPrimaryForeground: string;
29
+ buttonSecondaryForeground: string;
30
+ welcomeModalText: string;
31
+ welcomeModalTitle: string;
32
+ isShowWelcomeModal: boolean;
33
+ blockCountries: string;
34
+ termsOfUse: string;
35
+ successModalPrimaryBtnText: string;
36
+ successModalUrl: string;
37
+ successModalTitle: string;
38
+ successModalDesc: string;
39
+ successModalShareTexts: string;
40
+ isUnAvailable: boolean;
41
+ privacyPolicy: string;
42
+ };
18
43
  export interface IProject {
19
44
  id: string;
20
45
  name: string;
@@ -29,13 +54,18 @@ export interface IProject {
29
54
  merkleRoot: string;
30
55
  ownerAddress: string;
31
56
  blockCountries: Record<string, string>;
32
- themeConf: Record<string, any>;
57
+ themeConf: ThemeConfig | null;
33
58
  version: string;
34
59
  extra?: {
35
60
  kyc: boolean;
36
61
  tag: string;
37
62
  };
38
63
  }
64
+ export declare enum ETokenType {
65
+ Erc20 = "ERC20",
66
+ Native = "NATIVE_TOKEN",
67
+ NFT = "ERC721"
68
+ }
39
69
  export type IAirdropClaim = {
40
70
  index: number;
41
71
  recipient: string;
@@ -3,6 +3,12 @@ export var ChainType;
3
3
  ChainType["Evm"] = "evm";
4
4
  ChainType["Ton"] = "ton";
5
5
  })(ChainType || (ChainType = {}));
6
+ export var ETokenType;
7
+ (function (ETokenType) {
8
+ ETokenType["Erc20"] = "ERC20";
9
+ ETokenType["Native"] = "NATIVE_TOKEN";
10
+ ETokenType["NFT"] = "ERC721";
11
+ })(ETokenType || (ETokenType = {}));
6
12
  export var TonAirdropVersionEnum;
7
13
  (function (TonAirdropVersionEnum) {
8
14
  TonAirdropVersionEnum["V1"] = "1.0.0";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/airdrop/types/index.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAN,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,wBAAW,CAAA;IACX,wBAAW,CAAA;AACb,CAAC,EAHW,SAAS,KAAT,SAAS,QAGpB;AAmDD,MAAM,CAAN,IAAY,qBAIX;AAJD,WAAY,qBAAqB;IAC/B,qCAAY,CAAA;IACZ,qCAAY,CAAA;IACZ,0CAAiB,CAAA;AACnB,CAAC,EAJW,qBAAqB,KAArB,qBAAqB,QAIhC;AAED,MAAM,CAAN,IAAY,qBAIX;AAJD,WAAY,qBAAqB;IAC/B,qCAAY,CAAA;IACZ,qCAAY,CAAA;IACZ,qCAAY,CAAA,CAAC,yBAAyB;AACxC,CAAC,EAJW,qBAAqB,KAArB,qBAAqB,QAIhC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/airdrop/types/index.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAN,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,wBAAW,CAAA;IACX,wBAAW,CAAA;AACb,CAAC,EAHW,SAAS,KAAT,SAAS,QAGpB;AAkDD,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,6BAAe,CAAA;IACf,qCAAuB,CAAA;IACvB,4BAAc,CAAA;AAChB,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AA6BD,MAAM,CAAN,IAAY,qBAIX;AAJD,WAAY,qBAAqB;IAC/B,qCAAY,CAAA;IACZ,qCAAY,CAAA;IACZ,0CAAiB,CAAA;AACnB,CAAC,EAJW,qBAAqB,KAArB,qBAAqB,QAIhC;AAED,MAAM,CAAN,IAAY,qBAIX;AAJD,WAAY,qBAAqB;IAC/B,qCAAY,CAAA;IACZ,qCAAY,CAAA;IACZ,qCAAY,CAAA,CAAC,yBAAyB;AACxC,CAAC,EAJW,qBAAqB,KAArB,qBAAqB,QAIhC"}
@@ -1 +1,2 @@
1
1
  export { AirdropClient } from './airdrop';
2
+ export * from './airdrop/types';
package/dist/esm/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export { AirdropClient } from './airdrop';
2
+ export * from './airdrop/types';
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ preset: 'ts-jest',
3
+ testEnvironment: 'node',
4
+ testMatch: ['**/tests/**/*.test.ts'],
5
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sign-global/tokentable",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -11,7 +11,8 @@
11
11
  "scripts": {
12
12
  "build-cjs": "tsc -m commonjs --outDir dist/cjs",
13
13
  "build-esm": "tsc -m esnext --outDir dist/esm",
14
- "build": "pnpm run build-cjs && pnpm run build-esm"
14
+ "build": "pnpm run build-cjs && pnpm run build-esm",
15
+ "test": "jest"
15
16
  },
16
17
  "author": "Evan",
17
18
  "license": "ISC",
@@ -20,10 +21,13 @@
20
21
  "@ton/core": "^0.59.0",
21
22
  "@ton/ton": "^15.1.0",
22
23
  "@tonconnect/ui-react": "^2.0.9",
24
+ "@types/jest": "^29.5.14",
23
25
  "bignumber.js": "^9.1.2",
24
26
  "dayjs": "^1.11.13",
27
+ "jest": "^29.7.0",
25
28
  "tonapi-sdk-js": "^2.0.3",
26
29
  "tonweb": "^0.0.66",
30
+ "ts-jest": "^29.2.5",
27
31
  "viem": "^2.21.49",
28
32
  "wagmi": "^2.13.0"
29
33
  },
@@ -31,7 +31,7 @@ export const getTonProjectIdByAddress = ({
31
31
  slug,
32
32
  data
33
33
  }: {
34
- address: string;
34
+ address?: string;
35
35
  slug: string;
36
36
  data: Record<string, string>;
37
37
  }): string | undefined => {
@@ -39,6 +39,11 @@ export const getTonProjectIdByAddress = ({
39
39
  if (!project) {
40
40
  project = data;
41
41
  }
42
+
43
+ if (!address) {
44
+ const firstProject = Object.values(project)[0];
45
+ return firstProject;
46
+ }
42
47
  const lastText = address[address.length - 1];
43
48
 
44
49
  const group = Object.keys(project || {}).find((key) => key.includes(lastText));
@@ -94,7 +94,6 @@ export class AirdropService {
94
94
  }) {
95
95
  const version = await this.getVersion();
96
96
 
97
- console.log(version, 'version');
98
97
  if (version === AirdropVersionEnum.V4) {
99
98
  const encodeData = encodeAbiParameters(
100
99
  [
@@ -3,7 +3,16 @@ import { TonConnectUI } from '@tonconnect/ui-react';
3
3
  import { AirdropService as TonAirdropService } from './core/ton/AirdropService';
4
4
  import { AirdropService as EvmAirdropService } from './core/evm/AirdropService';
5
5
  import { getAirdropPro, getAirdropProject, getAirdropQuery } from './services';
6
- import { ChainId, ChainType, IAirdropClaim, IAirdropOptions, IProject, IWalletClient } from './types';
6
+ import {
7
+ ChainId,
8
+ ChainType,
9
+ ETokenType,
10
+ EvmAirdropVersionEnum,
11
+ IAirdropClaim,
12
+ IAirdropOptions,
13
+ IProject,
14
+ IWalletClient
15
+ } from './types';
7
16
  import { getTonProjectIdByAddress } from './common';
8
17
  import { WalletClient as ViemWalletClient } from 'viem';
9
18
 
@@ -14,8 +23,11 @@ export class AirdropClient {
14
23
  private endpoint?: string;
15
24
  private project: IProject | undefined;
16
25
  protected claims?: IAirdropClaim[];
17
- private contractInstance: TonAirdropService | EvmAirdropService | undefined;
26
+ private contractInstanceWithWallet: TonAirdropService | EvmAirdropService | undefined;
27
+ private contractInstanceWithoutWallet: TonAirdropService | EvmAirdropService | undefined;
18
28
  private projectPromise: Promise<void> | undefined;
29
+ private claimHook: ((v: any) => any) | undefined;
30
+ private cachedVersion: string | null = null;
19
31
 
20
32
  constructor(params: IAirdropOptions) {
21
33
  if ('slug' in params) {
@@ -31,14 +43,10 @@ export class AirdropClient {
31
43
  let projectId: string | undefined = this.projectId;
32
44
  if (this.slug) {
33
45
  const res = await getAirdropPro(this.slug, this.endpoint);
34
- const projectMap = res?.childProjectMapping;
46
+ const projectMap = res?.childProjectMapping || {};
35
47
 
36
48
  let legacyProjectId: string | undefined;
37
- if (!address) {
38
- legacyProjectId = Object.values(projectMap)[0];
39
- } else {
40
- legacyProjectId = getTonProjectIdByAddress({ address, slug: this.slug, data: projectMap });
41
- }
49
+ legacyProjectId = getTonProjectIdByAddress({ address, slug: this.slug, data: projectMap });
42
50
 
43
51
  if (legacyProjectId) {
44
52
  projectId = legacyProjectId;
@@ -49,7 +57,6 @@ export class AirdropClient {
49
57
  }
50
58
 
51
59
  async getProjectInfo() {
52
- console.log(this.projectPromise);
53
60
  await this.projectPromise;
54
61
  if (!this.project) throw new Error('Project not found');
55
62
  return this.project;
@@ -75,30 +82,46 @@ export class AirdropClient {
75
82
  return this.claims;
76
83
  }
77
84
 
78
- async getAirdropContractWrapper(options: {
85
+ async getAirdropContractWrapper(options?: {
79
86
  walletClient?: IWalletClient;
80
- tonClient?: TonClient;
81
87
  }): Promise<TonAirdropService | EvmAirdropService> {
82
- if (!this.contractInstance) {
83
- const project = await this.getProjectInfo();
84
-
85
- const instance =
86
- project.chainType === ChainType.Evm
87
- ? new EvmAirdropService({
88
- contractAddress: project.contractAddress,
89
- chainId: Number(project.chainId) as ChainId,
90
- walletClient: options.walletClient as ViemWalletClient
91
- })
92
- : new TonAirdropService({
93
- chainId: project.chainId.toString(),
94
- address: project.contractAddress,
95
- walletClient: options.walletClient as TonConnectUI,
96
- tonClient: this.tonClient
97
- });
98
- this.contractInstance = instance;
99
- }
88
+ const project = await this.getProjectInfo();
100
89
 
101
- return this.contractInstance!;
90
+ if (options?.walletClient) {
91
+ if (!this.contractInstanceWithWallet) {
92
+ const instance =
93
+ project.chainType === ChainType.Evm
94
+ ? new EvmAirdropService({
95
+ contractAddress: project.contractAddress,
96
+ chainId: Number(project.chainId) as ChainId,
97
+ walletClient: options.walletClient as ViemWalletClient
98
+ })
99
+ : new TonAirdropService({
100
+ chainId: project.chainId.toString(),
101
+ address: project.contractAddress,
102
+ walletClient: options.walletClient as TonConnectUI,
103
+ tonClient: this.tonClient
104
+ });
105
+ this.contractInstanceWithWallet = instance;
106
+ }
107
+ return this.contractInstanceWithWallet;
108
+ } else {
109
+ if (!this.contractInstanceWithoutWallet) {
110
+ const instance =
111
+ project.chainType === ChainType.Evm
112
+ ? new EvmAirdropService({
113
+ contractAddress: project.contractAddress,
114
+ chainId: Number(project.chainId) as ChainId
115
+ })
116
+ : new TonAirdropService({
117
+ chainId: project.chainId.toString(),
118
+ address: project.contractAddress,
119
+ tonClient: this.tonClient
120
+ });
121
+ this.contractInstanceWithoutWallet = instance;
122
+ }
123
+ return this.contractInstanceWithoutWallet;
124
+ }
102
125
  }
103
126
 
104
127
  private getClaimDataById(claimId: string) {
@@ -107,16 +130,47 @@ export class AirdropClient {
107
130
  return claimData;
108
131
  }
109
132
 
133
+ setClaimFeeHook(fn: (v: any) => any) {
134
+ this.claimHook = fn;
135
+ }
136
+
110
137
  async claimAirdrop(
111
138
  { claimId, walletClient }: { claimId: string; walletClient: IWalletClient },
112
139
  options: { onLoading?: () => void }
113
140
  ) {
114
141
  const claimData = this.getClaimDataById(claimId);
142
+ const project = await this.getProjectInfo();
115
143
 
116
144
  const contractWrapper = await this.getAirdropContractWrapper({
117
145
  walletClient
118
146
  });
119
147
 
148
+ if (project.chainType === ChainType.Evm) {
149
+ const version = await contractWrapper.getVersion();
150
+ const needsFeeData = !(
151
+ project.tokenType === ETokenType.Native &&
152
+ [EvmAirdropVersionEnum.V3, EvmAirdropVersionEnum.V4].includes(version as EvmAirdropVersionEnum)
153
+ );
154
+
155
+ const value = needsFeeData ? await this.getClaimFee(BigInt(claimData.amount)) : undefined;
156
+
157
+ let extraData = {
158
+ isLegacy: true,
159
+ attestationId: BigInt(1)
160
+ };
161
+ if (this.claimHook) {
162
+ extraData = this.claimHook(claimData);
163
+ }
164
+
165
+ return (contractWrapper as EvmAirdropService).claim({
166
+ proof: claimData.proof,
167
+ group: claimData.group,
168
+ data: claimData.data,
169
+ value: value as bigint | undefined,
170
+ extraData: extraData
171
+ });
172
+ }
173
+
120
174
  return contractWrapper.claim(claimData, options);
121
175
  }
122
176
 
@@ -124,9 +178,7 @@ export class AirdropClient {
124
178
  const claimData = this.getClaimDataById(claimId);
125
179
  const project = await this.getProjectInfo();
126
180
 
127
- const contractWrapper = await this.getAirdropContractWrapper({
128
- tonClient: this.tonClient
129
- });
181
+ const contractWrapper = await this.getAirdropContractWrapper();
130
182
 
131
183
  if (project.chainType === ChainType.Evm) {
132
184
  return (contractWrapper as EvmAirdropService).isLeafUsed(claimData.leaf);
@@ -137,9 +189,7 @@ export class AirdropClient {
137
189
 
138
190
  async getPaused() {
139
191
  const project = await this.getProjectInfo();
140
- const contractWrapper = await this.getAirdropContractWrapper({
141
- tonClient: this.tonClient
142
- });
192
+ const contractWrapper = await this.getAirdropContractWrapper();
143
193
  if (project.chainType === ChainType.Evm) {
144
194
  throw new Error('EVM chain is not supported');
145
195
  }
@@ -147,13 +197,16 @@ export class AirdropClient {
147
197
  }
148
198
 
149
199
  async getVersion() {
150
- const contractWrapper = await this.getAirdropContractWrapper({
151
- tonClient: this.tonClient
152
- });
153
- return contractWrapper?.getVersion();
200
+ if (this.cachedVersion) {
201
+ return this.cachedVersion;
202
+ }
203
+ const contractWrapper = await this.getAirdropContractWrapper();
204
+
205
+ this.cachedVersion = await contractWrapper?.getVersion();
206
+ return this.cachedVersion;
154
207
  }
155
208
 
156
- async batchFetchClaimed(leafs: string[]) {
209
+ async batchCheckClaimed() {
157
210
  const project = await this.getProjectInfo();
158
211
 
159
212
  if (project.chainType === ChainType.Ton) {
@@ -161,15 +214,30 @@ export class AirdropClient {
161
214
  }
162
215
 
163
216
  const contractWrapper = await this.getAirdropContractWrapper({});
217
+ const leafs = this.claims?.map((it) => it.leaf);
218
+
219
+ if (!leafs) return [];
164
220
 
165
221
  return (contractWrapper as EvmAirdropService).batchFetchClaimed(leafs);
166
222
  }
167
223
 
168
- async getClaimFee(amount: bigint) {
224
+ async getNFT() {
225
+ const project = await this.getProjectInfo();
226
+
227
+ if (project.chainType === ChainType.Ton) {
228
+ throw new Error('TON chain is not supported');
229
+ }
230
+
231
+ const contractWrapper = await this.getAirdropContractWrapper({});
232
+
233
+ return (contractWrapper as EvmAirdropService).getNFT();
234
+ }
235
+
236
+ async getClaimFee(amount?: bigint) {
169
237
  const project = await this.getProjectInfo();
170
238
 
171
239
  const contractWrapper = await this.getAirdropContractWrapper({});
172
240
 
173
- return contractWrapper.getClaimFee(project.contractAddress, amount);
241
+ return contractWrapper.getClaimFee(project.contractAddress, amount || BigInt(1));
174
242
  }
175
243
  }