@sign-global/tokentable-wallets 1.2.6 → 1.4.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.
@@ -0,0 +1,138 @@
1
+ import { ReactNode, useEffect } from 'react';
2
+ import { ChainProvider, useChain } from '@cosmos-kit/react';
3
+ import { chains, assets } from 'chain-registry';
4
+ import { wallets } from '@cosmos-kit/keplr';
5
+ import { wallets as okxWallets } from '@cosmos-kit/okxwallet-extension';
6
+ import { wallets as compassWallets } from '@cosmos-kit/compass-extension';
7
+ import '@interchain-ui/react/styles';
8
+ import EventEmitter from 'events';
9
+ import { WalletBase } from '../../WalletBase';
10
+ import { ISignResult } from '../../types';
11
+ import { get4361Message, prepareSignMessage } from '../../utils';
12
+
13
+ interface CosmosStoreType {
14
+ chainContext: ReturnType<typeof useChain> | null;
15
+ counter: number;
16
+ }
17
+
18
+ const cosmosStore: CosmosStoreType = {
19
+ chainContext: null,
20
+ counter: 0
21
+ };
22
+
23
+ export const eventBus = new EventEmitter();
24
+
25
+ const COSMOS_EVENT_KEY = 'cosmos_signin';
26
+
27
+ export const getEventKey = () => {
28
+ return `${COSMOS_EVENT_KEY}_${cosmosStore.counter}`;
29
+ };
30
+
31
+ export class CosmosWallet extends WalletBase<CosmosStoreType> {
32
+ getStore(): CosmosStoreType {
33
+ return cosmosStore;
34
+ }
35
+ get isConnected() {
36
+ return !!cosmosStore.chainContext?.isWalletConnected;
37
+ }
38
+ connect(): void {
39
+ cosmosStore.chainContext?.connect();
40
+ }
41
+
42
+ disconnect() {
43
+ cosmosStore.chainContext?.disconnect();
44
+ }
45
+
46
+ async sign(message: string): Promise<ISignResult> {
47
+ try {
48
+ const provider = cosmosStore.chainContext!;
49
+ if (!provider.address) {
50
+ throw new Error('Cosmos wallet not connected');
51
+ }
52
+ const result = await provider.signArbitrary?.(provider.address, message);
53
+
54
+ this.publicKey = result?.pub_key?.value;
55
+
56
+ return {
57
+ message,
58
+ signature: result?.signature
59
+ };
60
+ } catch (error) {
61
+ console.error(error);
62
+ throw error;
63
+ }
64
+ }
65
+
66
+ signin(statement: string, prepare = true): Promise<ISignResult> {
67
+ return new Promise((resolve, reject) => {
68
+ try {
69
+ const signCallback = async (data: ReturnType<typeof useChain>) => {
70
+ try {
71
+ this.address = data.address;
72
+ this.chainId = 1;
73
+ let fullMessage = statement;
74
+ if (prepare) {
75
+ const msg = prepareSignMessage({ statement, chainId: data.chain.chain_id, address: this.address! });
76
+ fullMessage = get4361Message(msg);
77
+ }
78
+
79
+ const res = await this.sign(fullMessage);
80
+
81
+ resolve(res);
82
+ } catch (error) {
83
+ console.error('Error in signCallback:', error);
84
+ reject(error);
85
+ }
86
+ };
87
+
88
+ if (this.isConnected) {
89
+ signCallback(cosmosStore.chainContext!);
90
+ return;
91
+ }
92
+ cosmosStore.counter++;
93
+ this.connect();
94
+ const eventKey = getEventKey();
95
+ eventBus.once(eventKey, (data) => {
96
+ console.log('listen event key success, event key = %s, data = %j', eventKey, data);
97
+ signCallback(data);
98
+ });
99
+ } catch (error) {
100
+ console.error('Error in signin:', error);
101
+ reject(error);
102
+ }
103
+ });
104
+ }
105
+ }
106
+
107
+ export const CosmosConnector = ({ chainName = 'cosmoshub' }: { chainName?: string }) => {
108
+ const chainContext = useChain(chainName);
109
+
110
+ useEffect(() => {
111
+ if (chainContext.address) {
112
+ if (chainContext.isWalletConnected) {
113
+ const eventKey = getEventKey();
114
+ eventBus.emit(eventKey, chainContext);
115
+ }
116
+ }
117
+ }, [chainContext]);
118
+
119
+ cosmosStore.chainContext = chainContext;
120
+ return null;
121
+ };
122
+
123
+ export const CosmosProvider = ({ children, chainName = 'cosmoshub' }: { children: ReactNode; chainName?: string }) => {
124
+ const assetList = assets.find(({ chain_name }) => chain_name === chainName);
125
+ return (
126
+ <ChainProvider
127
+ chains={chains} // supported chains
128
+ assetLists={assetList ? [assetList] : undefined} // supported asset lists
129
+ wallets={[...wallets, ...compassWallets, ...okxWallets]}
130
+ signerOptions={{}}
131
+ endpointOptions={{ endpoints: {} }}
132
+ throwErrors={true}
133
+ >
134
+ <CosmosConnector chainName={chainName} />
135
+ {children}
136
+ </ChainProvider>
137
+ );
138
+ };
@@ -2,3 +2,4 @@ export { EvmWallet, EvmProvider } from './evm';
2
2
  export { SolWallet, SolanaProvider } from './solana';
3
3
  // export { StarknetWallet } from './starknet';
4
4
  export { TonWallet, TonProvider } from './ton';
5
+ export { CosmosWallet, CosmosProvider } from './cosmos';
package/src/types.ts CHANGED
@@ -1,31 +1,3 @@
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
- Sui = 'sui'
21
- }
22
- export enum ExtendedWalletType {
23
- UNISAT = 'unisat',
24
- OKXBTC = 'okx_btc'
25
- }
26
-
27
- export type ProviderType = WalletType | ExtendedWalletType;
28
-
29
1
  export type ISignResult =
30
2
  | {
31
3
  message: string;