@sign-global/tokentable 0.3.0 → 0.4.0-beta.2

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 (148) hide show
  1. package/.github/workflows/beta.yml +28 -0
  2. package/dist/cjs/airdrop/AirdropClient.d.ts +46 -0
  3. package/dist/cjs/airdrop/AirdropClient.js +251 -0
  4. package/dist/cjs/airdrop/AirdropClient.js.map +1 -0
  5. package/dist/cjs/airdrop/SignatureAirdropClient.d.ts +24 -0
  6. package/dist/cjs/airdrop/SignatureAirdropClient.js +109 -0
  7. package/dist/cjs/airdrop/SignatureAirdropClient.js.map +1 -0
  8. package/dist/cjs/airdrop/common/index.d.ts +1 -1
  9. package/dist/cjs/airdrop/constants/index.d.ts +4 -0
  10. package/dist/cjs/airdrop/constants/index.js +5 -1
  11. package/dist/cjs/airdrop/constants/index.js.map +1 -1
  12. package/dist/cjs/airdrop/core/evm/contracts/AirdropSignatureClient.d.ts +15 -0
  13. package/dist/cjs/airdrop/core/evm/contracts/AirdropSignatureClient.js +51 -0
  14. package/dist/cjs/airdrop/core/evm/contracts/AirdropSignatureClient.js.map +1 -0
  15. package/dist/cjs/airdrop/core/evm/contracts/abis/FungibleTokenECDSADistributor.json +564 -0
  16. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/WalletBase.d.ts +32 -0
  17. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/WalletBase.js +71 -0
  18. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/WalletBase.js.map +1 -0
  19. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/WalletFactory.d.ts +8 -0
  20. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/WalletFactory.js +38 -0
  21. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/WalletFactory.js.map +1 -0
  22. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/index.d.ts +2 -0
  23. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/index.js +21 -0
  24. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/index.js.map +1 -0
  25. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/evm/EvmWallet.d.ts +26 -0
  26. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/evm/EvmWallet.js +70 -0
  27. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/evm/EvmWallet.js.map +1 -0
  28. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/evm/index.d.ts +9 -0
  29. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/evm/index.js +35 -0
  30. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/evm/index.js.map +1 -0
  31. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/index.d.ts +3 -0
  32. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/index.js +14 -0
  33. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/index.js.map +1 -0
  34. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/solana/index.d.ts +27 -0
  35. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/solana/index.js +119 -0
  36. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/solana/index.js.map +1 -0
  37. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/ton/TonWallet.d.ts +23 -0
  38. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/ton/TonWallet.js +117 -0
  39. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/ton/TonWallet.js.map +1 -0
  40. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/ton/index.d.ts +9 -0
  41. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/ton/index.js +29 -0
  42. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/providers/ton/index.js.map +1 -0
  43. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/types.d.ts +38 -0
  44. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/types.js +30 -0
  45. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/types.js.map +1 -0
  46. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/utils/index.d.ts +8 -0
  47. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/utils/index.js +41 -0
  48. package/dist/cjs/airdrop/core/useWeb3ConnectWallet/utils/index.js.map +1 -0
  49. package/dist/cjs/airdrop/index.d.ts +4 -46
  50. package/dist/cjs/airdrop/index.js +22 -241
  51. package/dist/cjs/airdrop/index.js.map +1 -1
  52. package/dist/cjs/airdrop/services/index.d.ts +15 -0
  53. package/dist/cjs/airdrop/services/index.js +16 -1
  54. package/dist/cjs/airdrop/services/index.js.map +1 -1
  55. package/dist/cjs/airdrop/types/index.d.ts +19 -4
  56. package/dist/cjs/airdrop/types/index.js +7 -1
  57. package/dist/cjs/airdrop/types/index.js.map +1 -1
  58. package/dist/cjs/index.d.ts +1 -1
  59. package/dist/cjs/index.js +7 -1
  60. package/dist/cjs/index.js.map +1 -1
  61. package/dist/cjs/utils/utils.d.ts +1 -0
  62. package/dist/cjs/utils/utils.js +2 -1
  63. package/dist/cjs/utils/utils.js.map +1 -1
  64. package/dist/esm/airdrop/AirdropClient.d.ts +46 -0
  65. package/dist/esm/airdrop/AirdropClient.js +247 -0
  66. package/dist/esm/airdrop/AirdropClient.js.map +1 -0
  67. package/dist/esm/airdrop/SignatureAirdropClient.d.ts +24 -0
  68. package/dist/esm/airdrop/SignatureAirdropClient.js +105 -0
  69. package/dist/esm/airdrop/SignatureAirdropClient.js.map +1 -0
  70. package/dist/esm/airdrop/common/index.d.ts +1 -1
  71. package/dist/esm/airdrop/constants/index.d.ts +4 -0
  72. package/dist/esm/airdrop/constants/index.js +4 -0
  73. package/dist/esm/airdrop/constants/index.js.map +1 -1
  74. package/dist/esm/airdrop/core/evm/contracts/AirdropSignatureClient.d.ts +15 -0
  75. package/dist/esm/airdrop/core/evm/contracts/AirdropSignatureClient.js +44 -0
  76. package/dist/esm/airdrop/core/evm/contracts/AirdropSignatureClient.js.map +1 -0
  77. package/dist/esm/airdrop/core/evm/contracts/abis/FungibleTokenECDSADistributor.json +564 -0
  78. package/dist/esm/airdrop/core/useWeb3ConnectWallet/WalletBase.d.ts +32 -0
  79. package/dist/esm/airdrop/core/useWeb3ConnectWallet/WalletBase.js +67 -0
  80. package/dist/esm/airdrop/core/useWeb3ConnectWallet/WalletBase.js.map +1 -0
  81. package/dist/esm/airdrop/core/useWeb3ConnectWallet/WalletFactory.d.ts +8 -0
  82. package/dist/esm/airdrop/core/useWeb3ConnectWallet/WalletFactory.js +34 -0
  83. package/dist/esm/airdrop/core/useWeb3ConnectWallet/WalletFactory.js.map +1 -0
  84. package/dist/esm/airdrop/core/useWeb3ConnectWallet/index.d.ts +2 -0
  85. package/dist/esm/airdrop/core/useWeb3ConnectWallet/index.js +3 -0
  86. package/dist/esm/airdrop/core/useWeb3ConnectWallet/index.js.map +1 -0
  87. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/evm/EvmWallet.d.ts +26 -0
  88. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/evm/EvmWallet.js +65 -0
  89. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/evm/EvmWallet.js.map +1 -0
  90. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/evm/index.d.ts +9 -0
  91. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/evm/index.js +29 -0
  92. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/evm/index.js.map +1 -0
  93. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/index.d.ts +3 -0
  94. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/index.js +5 -0
  95. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/index.js.map +1 -0
  96. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/solana/index.d.ts +27 -0
  97. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/solana/index.js +109 -0
  98. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/solana/index.js.map +1 -0
  99. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/ton/TonWallet.d.ts +23 -0
  100. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/ton/TonWallet.js +112 -0
  101. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/ton/TonWallet.js.map +1 -0
  102. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/ton/index.d.ts +9 -0
  103. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/ton/index.js +24 -0
  104. package/dist/esm/airdrop/core/useWeb3ConnectWallet/providers/ton/index.js.map +1 -0
  105. package/dist/esm/airdrop/core/useWeb3ConnectWallet/types.d.ts +38 -0
  106. package/dist/esm/airdrop/core/useWeb3ConnectWallet/types.js +27 -0
  107. package/dist/esm/airdrop/core/useWeb3ConnectWallet/types.js.map +1 -0
  108. package/dist/esm/airdrop/core/useWeb3ConnectWallet/utils/index.d.ts +8 -0
  109. package/dist/esm/airdrop/core/useWeb3ConnectWallet/utils/index.js +35 -0
  110. package/dist/esm/airdrop/core/useWeb3ConnectWallet/utils/index.js.map +1 -0
  111. package/dist/esm/airdrop/index.d.ts +4 -46
  112. package/dist/esm/airdrop/index.js +4 -239
  113. package/dist/esm/airdrop/index.js.map +1 -1
  114. package/dist/esm/airdrop/services/index.d.ts +15 -0
  115. package/dist/esm/airdrop/services/index.js +12 -0
  116. package/dist/esm/airdrop/services/index.js.map +1 -1
  117. package/dist/esm/airdrop/types/index.d.ts +19 -4
  118. package/dist/esm/airdrop/types/index.js +6 -0
  119. package/dist/esm/airdrop/types/index.js.map +1 -1
  120. package/dist/esm/index.d.ts +1 -1
  121. package/dist/esm/index.js +1 -1
  122. package/dist/esm/index.js.map +1 -1
  123. package/dist/esm/utils/utils.d.ts +1 -0
  124. package/dist/esm/utils/utils.js +1 -0
  125. package/dist/esm/utils/utils.js.map +1 -1
  126. package/package.json +15 -3
  127. package/src/airdrop/AirdropClient.ts +307 -0
  128. package/src/airdrop/SignatureAirdropClient.ts +120 -0
  129. package/src/airdrop/constants/index.ts +5 -0
  130. package/src/airdrop/core/evm/contracts/AirdropSignatureClient.ts +59 -0
  131. package/src/airdrop/core/evm/contracts/abis/FungibleTokenECDSADistributor.json +564 -0
  132. package/src/airdrop/core/useWeb3ConnectWallet/WalletBase.ts +92 -0
  133. package/src/airdrop/core/useWeb3ConnectWallet/WalletFactory.tsx +35 -0
  134. package/src/airdrop/core/useWeb3ConnectWallet/index.ts +3 -0
  135. package/src/airdrop/core/useWeb3ConnectWallet/providers/evm/EvmWallet.ts +90 -0
  136. package/src/airdrop/core/useWeb3ConnectWallet/providers/evm/index.tsx +43 -0
  137. package/src/airdrop/core/useWeb3ConnectWallet/providers/index.ts +4 -0
  138. package/src/airdrop/core/useWeb3ConnectWallet/providers/solana/index.tsx +141 -0
  139. package/src/airdrop/core/useWeb3ConnectWallet/providers/ton/TonWallet.ts +149 -0
  140. package/src/airdrop/core/useWeb3ConnectWallet/providers/ton/index.tsx +41 -0
  141. package/src/airdrop/core/useWeb3ConnectWallet/types.ts +45 -0
  142. package/src/airdrop/core/useWeb3ConnectWallet/utils/index.ts +61 -0
  143. package/src/airdrop/index.ts +4 -304
  144. package/src/airdrop/services/index.ts +29 -1
  145. package/src/airdrop/types/index.ts +23 -5
  146. package/src/index.ts +9 -1
  147. package/src/utils/utils.ts +2 -0
  148. package/tsconfig.json +2 -2
@@ -0,0 +1,90 @@
1
+ import { useConnectModal } from '@rainbow-me/rainbowkit';
2
+ import { ResolvedRegister, useAccount, useWalletClient } from 'wagmi';
3
+ import { WalletBase } from '../../WalletBase';
4
+ import { disconnect, getAccount, signMessage } from 'wagmi/actions';
5
+ import { EventEmitter } from 'events';
6
+ import { ISignResult } from '../../types';
7
+ import { get4361Message, prepareSignMessage } from '../../utils';
8
+
9
+ export const eventBus = new EventEmitter();
10
+
11
+ const EVM_EVENT_KEY = 'evm_signin';
12
+
13
+ export interface EVMStoreType {
14
+ account: ReturnType<typeof useAccount> | null;
15
+ connectModal: ReturnType<typeof useConnectModal> | undefined;
16
+ walletClient: ReturnType<typeof useWalletClient> | undefined;
17
+ config: ResolvedRegister['config'] | undefined;
18
+ counter: number;
19
+ }
20
+
21
+ export const evmStore: EVMStoreType = {
22
+ account: null,
23
+ connectModal: undefined,
24
+ walletClient: undefined,
25
+ config: undefined,
26
+ counter: 0
27
+ };
28
+
29
+ export const getEventKey = () => {
30
+ return `${EVM_EVENT_KEY}_${evmStore.counter}`;
31
+ };
32
+
33
+ export class EvmWallet extends WalletBase<EVMStoreType> {
34
+ get isConnected() {
35
+ return !!(evmStore.account?.address && evmStore.account?.isConnected);
36
+ }
37
+
38
+ connect() {
39
+ evmStore?.connectModal?.openConnectModal?.();
40
+ }
41
+
42
+ async disconnect() {
43
+ await disconnect(evmStore.config!);
44
+ }
45
+
46
+ async sign(_message: string) {
47
+ const sign = await signMessage(evmStore.config!, {
48
+ message: _message
49
+ });
50
+ return {
51
+ message: _message,
52
+ signature: sign
53
+ };
54
+ }
55
+
56
+ override async signin(statement?: string): Promise<ISignResult> {
57
+ return new Promise((resolve) => {
58
+ const signCallback = (data: ReturnType<typeof useAccount>) => {
59
+ this.address = data.address;
60
+ this.chainId = data.chainId;
61
+ const msg = prepareSignMessage({ statement, chainId: data.chainId!, address: data.address! });
62
+ const fullMessage = get4361Message(msg);
63
+
64
+ const res = this.sign(fullMessage);
65
+
66
+ resolve(res);
67
+ };
68
+
69
+ const account = getAccount(evmStore.config!);
70
+ this.provider = evmStore.walletClient;
71
+
72
+ if (this.isConnected) {
73
+ signCallback(account);
74
+ return;
75
+ }
76
+
77
+ evmStore.counter++;
78
+ this.connect();
79
+ const eventKey = getEventKey();
80
+ eventBus.once(eventKey, (data) => {
81
+ console.log('listen event key success, event key = %s, data = %j', eventKey, data);
82
+ signCallback(data);
83
+ });
84
+ });
85
+ }
86
+
87
+ getStore(): EVMStoreType {
88
+ return evmStore;
89
+ }
90
+ }
@@ -0,0 +1,43 @@
1
+ import '@rainbow-me/rainbowkit/styles.css';
2
+ import { RainbowKitProvider, lightTheme, useConnectModal } from '@rainbow-me/rainbowkit';
3
+ import { ResolvedRegister, WagmiProvider, useAccount, useWalletClient } from 'wagmi';
4
+ import { ReactNode, useEffect } from 'react';
5
+
6
+ import { evmStore, getEventKey, eventBus } from './EvmWallet';
7
+
8
+ export { EvmWallet } from './EvmWallet';
9
+
10
+ export const EVMConnector = () => {
11
+ const connectModal = useConnectModal();
12
+ const walletClient = useWalletClient();
13
+ const account = useAccount();
14
+
15
+ evmStore.connectModal = connectModal;
16
+ evmStore.walletClient = walletClient;
17
+ evmStore.account = account;
18
+
19
+ useEffect(() => {
20
+ if (account.isConnected) {
21
+ const eventKey = getEventKey();
22
+ eventBus.emit(eventKey, account);
23
+ }
24
+ }, [account]);
25
+
26
+ return null;
27
+ };
28
+
29
+ export const EvmProvider = ({ children, config }: { children: ReactNode; config: ResolvedRegister['config'] }) => {
30
+ evmStore.config = config;
31
+ return (
32
+ <WagmiProvider config={config}>
33
+ <RainbowKitProvider
34
+ theme={lightTheme({
35
+ accentColor: '#DD8D58'
36
+ })}
37
+ >
38
+ {children}
39
+ <EVMConnector />
40
+ </RainbowKitProvider>
41
+ </WagmiProvider>
42
+ );
43
+ };
@@ -0,0 +1,4 @@
1
+ export { EvmWallet, EvmProvider } from './evm';
2
+ export { SolWallet, SolanaProvider } from './solana';
3
+ // export { StarknetWallet } from './starknet';
4
+ export { TonWallet, TonProvider } from './ton';
@@ -0,0 +1,141 @@
1
+ import { ReactNode, useCallback, useEffect, useMemo } from 'react';
2
+ import { WalletBase } from '../../WalletBase';
3
+ import { useWalletModal, WalletModalProvider } from '@solana/wallet-adapter-react-ui';
4
+ import '@solana/wallet-adapter-react-ui/styles.css';
5
+ import { ISignResult } from '../../types';
6
+ import { ConnectionProvider, useWallet, WalletProvider } from '@solana/wallet-adapter-react';
7
+ import { PhantomWalletAdapter } from '@solana/wallet-adapter-wallets';
8
+ import { clusterApiUrl } from '@solana/web3.js';
9
+ import bs58 from 'bs58';
10
+ import { get4361Message, prepareSignMessage } from '../../utils';
11
+ import EventEmitter from 'events';
12
+
13
+ interface SolStoreType {
14
+ connectModal: ReturnType<typeof useWalletModal> | null;
15
+ account: ReturnType<typeof useWallet> | null;
16
+ counter: number;
17
+ }
18
+
19
+ const solStore: SolStoreType = {
20
+ connectModal: null,
21
+ account: null,
22
+ counter: 0
23
+ };
24
+
25
+ export const eventBus = new EventEmitter();
26
+
27
+ const SOL_EVENT_KEY = 'sol_signin';
28
+
29
+ export const getEventKey = () => {
30
+ return `${SOL_EVENT_KEY}_${solStore.counter}`;
31
+ };
32
+
33
+ export class SolWallet extends WalletBase<SolStoreType> {
34
+ getStore(): SolStoreType {
35
+ return solStore;
36
+ }
37
+ get isConnected() {
38
+ return !!solStore.account?.connected;
39
+ }
40
+ connect(): void {
41
+ solStore.connectModal?.setVisible(true);
42
+ }
43
+
44
+ disconnect() {
45
+ solStore.account?.disconnect();
46
+ }
47
+
48
+ async sign(message: string): Promise<ISignResult> {
49
+ try {
50
+ const provider = solStore.account!;
51
+ const encodedMessage = new TextEncoder().encode(message);
52
+ const signedMessage = await provider.signMessage?.(encodedMessage);
53
+
54
+ console.log(signedMessage, 'signedMessage');
55
+
56
+ return {
57
+ message,
58
+ signature: bs58.encode(signedMessage!)
59
+ };
60
+ } catch (error) {
61
+ console.error(error);
62
+ throw error;
63
+ }
64
+ }
65
+
66
+ signin(statement?: string): Promise<ISignResult> {
67
+ return new Promise((resolve) => {
68
+ const signCallback = (data: ReturnType<typeof useWallet>) => {
69
+ this.publicKey = data.publicKey?.toString();
70
+ this.address = this.publicKey;
71
+ this.chainId = 1;
72
+ const msg = prepareSignMessage({ statement, chainId: '1', address: this.address! });
73
+ const fullMessage = get4361Message(msg);
74
+
75
+ const res = this.sign(fullMessage);
76
+
77
+ resolve(res);
78
+ };
79
+
80
+ // const account = getAccount(evmStore.config!);
81
+ // this.provider = evmStore.walletClient;
82
+
83
+ if (this.isConnected) {
84
+ console.log(solStore);
85
+ signCallback(solStore.account!);
86
+ return;
87
+ }
88
+ solStore.counter++;
89
+ this.connect();
90
+ const eventKey = getEventKey();
91
+ console.log(eventKey);
92
+ eventBus.once(eventKey, (data) => {
93
+ console.log('listen event key success, event key = %s, data = %j', eventKey, data);
94
+ signCallback(data);
95
+ });
96
+ });
97
+ }
98
+ }
99
+
100
+ export const SolConnector = () => {
101
+ const walletModal = useWalletModal();
102
+ const wallet = useWallet();
103
+
104
+ useEffect(() => {
105
+ console.log(wallet, 'wallet');
106
+ if (wallet.wallet) {
107
+ if (wallet.connected) {
108
+ const eventKey = getEventKey();
109
+ eventBus.emit(eventKey, wallet);
110
+ } else {
111
+ wallet.connect().catch((error) => {
112
+ console.error(error);
113
+ });
114
+ }
115
+ }
116
+ }, [wallet]);
117
+
118
+ solStore.connectModal = walletModal;
119
+ solStore.account = wallet;
120
+ return null;
121
+ };
122
+
123
+ export const SolanaProvider = ({ children }: { children: ReactNode }) => {
124
+ const endpoint = clusterApiUrl('mainnet-beta');
125
+
126
+ const wallets = useMemo(() => [new PhantomWalletAdapter()], []);
127
+
128
+ const onError = useCallback((error: any) => {
129
+ console.error(error);
130
+ }, []);
131
+ return (
132
+ <ConnectionProvider endpoint={endpoint}>
133
+ <WalletProvider wallets={wallets} onError={onError}>
134
+ <WalletModalProvider>
135
+ <SolConnector />
136
+ {children}
137
+ </WalletModalProvider>
138
+ </WalletProvider>
139
+ </ConnectionProvider>
140
+ );
141
+ };
@@ -0,0 +1,149 @@
1
+ import {
2
+ useTonConnectUI,
3
+ useTonWallet,
4
+ useTonConnectModal,
5
+ WalletInfoRemote,
6
+ TonConnectUIProviderProps
7
+ } from '@tonconnect/ui-react';
8
+ import { WalletBase } from '../../WalletBase';
9
+ import { ISignResult } from '../../types';
10
+ import { getCustomNaNoId } from '../../utils';
11
+ import { hashSha256 } from '@ethsign/utils-web';
12
+ import { CHAIN, TonConnectUI, TonProofItemReplySuccess, toUserFriendlyAddress, Wallet } from '@tonconnect/ui';
13
+ import { EventEmitter } from 'events';
14
+ import { Cell } from 'ton-core';
15
+
16
+ export interface TonStoreType {
17
+ account: ReturnType<typeof useTonWallet> | null;
18
+ connectModal: ReturnType<typeof useTonConnectModal> | undefined;
19
+ walletClient: ReturnType<typeof useTonConnectUI>[0] | undefined;
20
+ config: TonConnectUIProviderProps | undefined;
21
+ counter: number;
22
+ }
23
+
24
+ export const tonStore: TonStoreType = {
25
+ account: null,
26
+ connectModal: undefined,
27
+ walletClient: undefined,
28
+ config: undefined,
29
+ counter: 0
30
+ };
31
+
32
+ export const eventBus = new EventEmitter();
33
+
34
+ export const getEventKey = () => {
35
+ return `ton_sign_${tonStore.counter}`;
36
+ };
37
+
38
+ export class TonWallet extends WalletBase<TonStoreType> {
39
+ get isConnected() {
40
+ return !!tonStore.account?.account;
41
+ }
42
+
43
+ connect() {
44
+ tonStore?.connectModal?.open?.();
45
+ }
46
+
47
+ async disconnect() {
48
+ await tonStore.walletClient?.disconnect();
49
+ }
50
+
51
+ private getPublicKey(stateInit: string): string {
52
+ const state_init = Cell.fromBase64(stateInit);
53
+ const bits = state_init.refs[1].bits;
54
+ const pubKey = bits.toString().substring(16, 80).toLowerCase();
55
+ return pubKey;
56
+ }
57
+
58
+ async sign(originMsg: string): Promise<ISignResult> {
59
+ const message = await hashSha256(originMsg);
60
+ const tonConnectUI = tonStore.walletClient as TonConnectUI;
61
+ // const walletInfo = tonConnectUI?.wallet;
62
+ const authType = '';
63
+ // if (walletInfo?.jsBridgeKey && walletInfo?.openMethod !== 'qrcode') {
64
+ // authType = walletInfo.jsBridgeKey;
65
+ // }
66
+
67
+ console.log(this.isConnected, tonConnectUI, 'connected');
68
+ if (this.isConnected) {
69
+ await tonConnectUI.disconnect();
70
+ }
71
+ tonStore.counter++;
72
+ if (authType) {
73
+ const wallets = await tonConnectUI.getWallets();
74
+
75
+ const currentWallet = wallets.find((wallet) =>
76
+ [wallet.name, wallet.appName].includes(authType)
77
+ ) as WalletInfoRemote;
78
+
79
+ console.log(wallets, currentWallet, 'ww');
80
+
81
+ const link = tonConnectUI.connector.connect(
82
+ {
83
+ bridgeUrl: currentWallet.bridgeUrl,
84
+ universalLink: currentWallet.universalLink
85
+ },
86
+ {
87
+ tonProof: message
88
+ }
89
+ );
90
+
91
+ // tonspace在tg内部打开
92
+ window.open(link);
93
+ } else {
94
+ console.log('first time, call setConnectRequestParameters');
95
+ tonConnectUI.setConnectRequestParameters({
96
+ state: 'ready',
97
+ value: {
98
+ tonProof: message // 不能有空格,特殊字符
99
+ }
100
+ });
101
+ this.connect();
102
+ }
103
+
104
+ const connectedWallet: Wallet = await new Promise((resolve) => {
105
+ const eventKey = getEventKey();
106
+ console.log('start listen event key, key = %s', eventKey);
107
+ eventBus.once(eventKey, (data) => {
108
+ console.log('listen event key success, event key = %s, data = %j', eventKey, data);
109
+ resolve(data);
110
+ });
111
+ });
112
+
113
+ this.provider = tonStore.walletClient;
114
+ const proof = (connectedWallet.connectItems?.tonProof as TonProofItemReplySuccess)?.proof;
115
+ this.publicKey = connectedWallet.account.publicKey || this.getPublicKey(connectedWallet.account.walletStateInit); //使用walletStateInit,publicKey由后端计算
116
+ this.address = toUserFriendlyAddress(connectedWallet.account.address);
117
+ this.chainId = connectedWallet.account.chain;
118
+ this.network = this.chainId === CHAIN.MAINNET ? 'TON_MAINNET' : 'TON_TESTNET';
119
+ const fullMessage = JSON.stringify({
120
+ timestamp: proof.timestamp,
121
+ payload: proof.payload,
122
+ domain: proof.domain
123
+ });
124
+ const signature = proof.signature;
125
+
126
+ return {
127
+ message: JSON.stringify({
128
+ fullMessage,
129
+ message: originMsg
130
+ }),
131
+ signature,
132
+ tonProof: message
133
+ };
134
+ }
135
+
136
+ override async signin(statement?: string): Promise<ISignResult> {
137
+ const fullMessage = {
138
+ statement: statement || 'Welcome to EthSign',
139
+ issuedAt: new Date().toISOString(),
140
+ nonce: getCustomNaNoId()
141
+ };
142
+ const signRes = await this.sign(JSON.stringify(fullMessage, null, ' '));
143
+ return signRes;
144
+ }
145
+
146
+ getStore(): TonStoreType {
147
+ return tonStore;
148
+ }
149
+ }
@@ -0,0 +1,41 @@
1
+ import { ReactNode, useEffect } from 'react';
2
+ import {
3
+ TonConnectUIProvider,
4
+ useTonConnectUI,
5
+ useTonWallet,
6
+ useTonConnectModal,
7
+ TonConnectUIProviderProps
8
+ } from '@tonconnect/ui-react';
9
+
10
+ import { tonStore, eventBus, getEventKey, TonWallet } from './TonWallet';
11
+
12
+ export { TonWallet };
13
+
14
+ export const TonConnector = () => {
15
+ const wallet = useTonWallet();
16
+ const [tonConnectUI] = useTonConnectUI();
17
+ const connectModal = useTonConnectModal();
18
+
19
+ tonStore.connectModal = connectModal;
20
+ tonStore.walletClient = tonConnectUI;
21
+ tonStore.account = wallet;
22
+
23
+ useEffect(() => {
24
+ if (wallet) {
25
+ eventBus.emit(getEventKey(), wallet);
26
+ }
27
+ }, [wallet]);
28
+
29
+ return null;
30
+ };
31
+
32
+ export const TonProvider = ({ children, config }: { children: ReactNode; config: TonConnectUIProviderProps }) => {
33
+ tonStore.config = config;
34
+
35
+ return (
36
+ <TonConnectUIProvider {...config}>
37
+ {children}
38
+ <TonConnector />
39
+ </TonConnectUIProvider>
40
+ );
41
+ };
@@ -0,0 +1,45 @@
1
+ export enum WalletType {
2
+ EVM = 'evm',
3
+ BITCOIN = 'bitcoin',
4
+ SOLANA = 'solana',
5
+ TON = 'ton',
6
+ APTOS = 'aptos',
7
+ PARTICLE = 'particle-evm',
8
+ OKX = 'okx',
9
+ Cyber = 'cyber',
10
+ StarkNet = 'starknet',
11
+ WALLETCONNECT = 'walletconnect',
12
+ Cardano = 'cardano'
13
+ }
14
+
15
+ export enum ChainType {
16
+ Evm = 'evm',
17
+ Ton = 'ton',
18
+ // Starknet = 'starknet',
19
+ Solana = 'solana'
20
+ }
21
+ export enum ExtendedWalletType {
22
+ UNISAT = 'unisat',
23
+ OKXBTC = 'okx_btc'
24
+ }
25
+
26
+ export type ProviderType = WalletType | ExtendedWalletType;
27
+
28
+ export type ISignResult =
29
+ | {
30
+ message: string;
31
+ signature: string;
32
+ [key: string]: any;
33
+ }
34
+ | undefined;
35
+
36
+ export interface ISignInMessage {
37
+ domain?: string;
38
+ version?: string;
39
+ nonce: string;
40
+ issuedAt: string;
41
+ statement: string;
42
+ chainId?: number | string;
43
+ uri?: string;
44
+ address?: string;
45
+ }
@@ -0,0 +1,61 @@
1
+ import { ISignInMessage } from '../types';
2
+ import { customAlphabet } from 'nanoid';
3
+
4
+ export const getCustomNaNoId = (): string => {
5
+ const nanoid = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyz', 10);
6
+ return nanoid();
7
+ };
8
+
9
+ export function prepareSignMessage({
10
+ chainId,
11
+ address,
12
+ statement
13
+ }: {
14
+ address: string;
15
+ chainId: number | string;
16
+ statement?: string;
17
+ }): ISignInMessage {
18
+ return {
19
+ statement: statement || 'Welcome to EthSign',
20
+ chainId: chainId,
21
+ address: address,
22
+ issuedAt: new Date().toISOString(),
23
+ domain: window.location.host,
24
+ uri: window.location.origin,
25
+ version: '1',
26
+ nonce: getCustomNaNoId()
27
+ };
28
+ }
29
+
30
+ export const get4361Message = ({
31
+ domain,
32
+ version,
33
+ nonce,
34
+ issuedAt,
35
+ statement,
36
+ chainId,
37
+ uri,
38
+ address
39
+ }: ISignInMessage): string => {
40
+ const header = `${domain} wants you to sign in with your Ethereum account:`;
41
+ const uriField = `URI: ${uri}`;
42
+ let prefix = [header, address].join('\n');
43
+ const versionField = `Version: ${version}`;
44
+
45
+ // const addressField = `Address: ` + address;
46
+
47
+ const chainField = `Chain ID: ` + chainId || '1';
48
+
49
+ const nonceField = `Nonce: ${nonce}`;
50
+
51
+ const suffixArray = [uriField, versionField, chainField, nonceField];
52
+
53
+ suffixArray.push(`Issued At: ${issuedAt}`);
54
+
55
+ const suffix = suffixArray.join('\n');
56
+ prefix = [prefix, statement].join('\n\n');
57
+ if (statement) {
58
+ prefix += '\n';
59
+ }
60
+ return [prefix, suffix].join('\n');
61
+ };