@tcswap/wallets 4.3.16

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 (210) hide show
  1. package/dist/chunk-6dcwbjsg.js +5 -0
  2. package/dist/chunk-6dcwbjsg.js.map +10 -0
  3. package/dist/chunk-78m70510.js +5 -0
  4. package/dist/chunk-78m70510.js.map +9 -0
  5. package/dist/chunk-vb4wtm2w.js +4 -0
  6. package/dist/chunk-vb4wtm2w.js.map +9 -0
  7. package/dist/chunk-y6rjn578.js +4 -0
  8. package/dist/chunk-y6rjn578.js.map +10 -0
  9. package/dist/src/bitget.cjs +4 -0
  10. package/dist/src/bitget.cjs.map +10 -0
  11. package/dist/src/bitget.js +4 -0
  12. package/dist/src/bitget.js.map +10 -0
  13. package/dist/src/coinbase/index.cjs +4 -0
  14. package/dist/src/coinbase/index.cjs.map +11 -0
  15. package/dist/src/coinbase/index.js +4 -0
  16. package/dist/src/coinbase/index.js.map +11 -0
  17. package/dist/src/cosmostation.cjs +4 -0
  18. package/dist/src/cosmostation.cjs.map +10 -0
  19. package/dist/src/cosmostation.js +4 -0
  20. package/dist/src/cosmostation.js.map +10 -0
  21. package/dist/src/ctrl.cjs +4 -0
  22. package/dist/src/ctrl.cjs.map +10 -0
  23. package/dist/src/ctrl.js +4 -0
  24. package/dist/src/ctrl.js.map +10 -0
  25. package/dist/src/evm-extensions.cjs +4 -0
  26. package/dist/src/evm-extensions.cjs.map +10 -0
  27. package/dist/src/evm-extensions.js +4 -0
  28. package/dist/src/evm-extensions.js.map +10 -0
  29. package/dist/src/index.cjs +4 -0
  30. package/dist/src/index.cjs.map +11 -0
  31. package/dist/src/index.js +4 -0
  32. package/dist/src/index.js.map +11 -0
  33. package/dist/src/keepkey-bex.cjs +4 -0
  34. package/dist/src/keepkey-bex.cjs.map +10 -0
  35. package/dist/src/keepkey-bex.js +4 -0
  36. package/dist/src/keepkey-bex.js.map +10 -0
  37. package/dist/src/keepkey.cjs +4 -0
  38. package/dist/src/keepkey.cjs.map +10 -0
  39. package/dist/src/keepkey.js +4 -0
  40. package/dist/src/keepkey.js.map +10 -0
  41. package/dist/src/keplr.cjs +4 -0
  42. package/dist/src/keplr.cjs.map +10 -0
  43. package/dist/src/keplr.js +4 -0
  44. package/dist/src/keplr.js.map +10 -0
  45. package/dist/src/keystore.cjs +4 -0
  46. package/dist/src/keystore.cjs.map +10 -0
  47. package/dist/src/keystore.js +4 -0
  48. package/dist/src/keystore.js.map +10 -0
  49. package/dist/src/ledger.cjs +4 -0
  50. package/dist/src/ledger.cjs.map +10 -0
  51. package/dist/src/ledger.js +4 -0
  52. package/dist/src/ledger.js.map +10 -0
  53. package/dist/src/near-wallet-selector/index.cjs +4 -0
  54. package/dist/src/near-wallet-selector/index.cjs.map +10 -0
  55. package/dist/src/near-wallet-selector/index.js +4 -0
  56. package/dist/src/near-wallet-selector/index.js.map +10 -0
  57. package/dist/src/okx.cjs +4 -0
  58. package/dist/src/okx.cjs.map +10 -0
  59. package/dist/src/okx.js +4 -0
  60. package/dist/src/okx.js.map +10 -0
  61. package/dist/src/onekey.cjs +4 -0
  62. package/dist/src/onekey.cjs.map +10 -0
  63. package/dist/src/onekey.js +4 -0
  64. package/dist/src/onekey.js.map +10 -0
  65. package/dist/src/passkeys/index.cjs +4 -0
  66. package/dist/src/passkeys/index.cjs.map +10 -0
  67. package/dist/src/passkeys/index.js +4 -0
  68. package/dist/src/passkeys/index.js.map +10 -0
  69. package/dist/src/phantom.cjs +4 -0
  70. package/dist/src/phantom.cjs.map +10 -0
  71. package/dist/src/phantom.js +4 -0
  72. package/dist/src/phantom.js.map +10 -0
  73. package/dist/src/polkadotjs.cjs +4 -0
  74. package/dist/src/polkadotjs.cjs.map +10 -0
  75. package/dist/src/polkadotjs.js +4 -0
  76. package/dist/src/polkadotjs.js.map +10 -0
  77. package/dist/src/radix/index.cjs +4 -0
  78. package/dist/src/radix/index.cjs.map +10 -0
  79. package/dist/src/radix/index.js +4 -0
  80. package/dist/src/radix/index.js.map +10 -0
  81. package/dist/src/talisman.cjs +4 -0
  82. package/dist/src/talisman.cjs.map +10 -0
  83. package/dist/src/talisman.js +4 -0
  84. package/dist/src/talisman.js.map +10 -0
  85. package/dist/src/trezor.cjs +4 -0
  86. package/dist/src/trezor.cjs.map +10 -0
  87. package/dist/src/trezor.js +4 -0
  88. package/dist/src/trezor.js.map +10 -0
  89. package/dist/src/tronlink.cjs +4 -0
  90. package/dist/src/tronlink.cjs.map +10 -0
  91. package/dist/src/tronlink.js +4 -0
  92. package/dist/src/tronlink.js.map +10 -0
  93. package/dist/src/vultisig.cjs +4 -0
  94. package/dist/src/vultisig.cjs.map +10 -0
  95. package/dist/src/vultisig.js +4 -0
  96. package/dist/src/vultisig.js.map +10 -0
  97. package/dist/src/walletconnect/index.cjs +4 -0
  98. package/dist/src/walletconnect/index.cjs.map +13 -0
  99. package/dist/src/walletconnect/index.js +4 -0
  100. package/dist/src/walletconnect/index.js.map +13 -0
  101. package/dist/src/xaman/index.cjs +4 -0
  102. package/dist/src/xaman/index.cjs.map +12 -0
  103. package/dist/src/xaman/index.js +4 -0
  104. package/dist/src/xaman/index.js.map +12 -0
  105. package/dist/types/bitget.d.ts +2 -0
  106. package/dist/types/bitget.d.ts.map +1 -0
  107. package/dist/types/coinbase/index.d.ts +14 -0
  108. package/dist/types/coinbase/index.d.ts.map +1 -0
  109. package/dist/types/coinbase/signer.d.ts +313 -0
  110. package/dist/types/coinbase/signer.d.ts.map +1 -0
  111. package/dist/types/cosmostation.d.ts +2 -0
  112. package/dist/types/cosmostation.d.ts.map +1 -0
  113. package/dist/types/ctrl.d.ts +2 -0
  114. package/dist/types/ctrl.d.ts.map +1 -0
  115. package/dist/types/evm-extensions.d.ts +2 -0
  116. package/dist/types/evm-extensions.d.ts.map +1 -0
  117. package/dist/types/index.d.ts +4 -0
  118. package/dist/types/index.d.ts.map +1 -0
  119. package/dist/types/keepkey-bex.d.ts +2 -0
  120. package/dist/types/keepkey-bex.d.ts.map +1 -0
  121. package/dist/types/keepkey.d.ts +2 -0
  122. package/dist/types/keepkey.d.ts.map +1 -0
  123. package/dist/types/keplr.d.ts +2 -0
  124. package/dist/types/keplr.d.ts.map +1 -0
  125. package/dist/types/keystore.d.ts +2 -0
  126. package/dist/types/keystore.d.ts.map +1 -0
  127. package/dist/types/ledger.d.ts +2 -0
  128. package/dist/types/ledger.d.ts.map +1 -0
  129. package/dist/types/near-wallet-selector/index.d.ts +16 -0
  130. package/dist/types/near-wallet-selector/index.d.ts.map +1 -0
  131. package/dist/types/okx.d.ts +2 -0
  132. package/dist/types/okx.d.ts.map +1 -0
  133. package/dist/types/onekey.d.ts +2 -0
  134. package/dist/types/onekey.d.ts.map +1 -0
  135. package/dist/types/passkeys/index.d.ts +17 -0
  136. package/dist/types/passkeys/index.d.ts.map +1 -0
  137. package/dist/types/phantom.d.ts +2 -0
  138. package/dist/types/phantom.d.ts.map +1 -0
  139. package/dist/types/polkadotjs.d.ts +2 -0
  140. package/dist/types/polkadotjs.d.ts.map +1 -0
  141. package/dist/types/radix/index.d.ts +14 -0
  142. package/dist/types/radix/index.d.ts.map +1 -0
  143. package/dist/types/talisman.d.ts +2 -0
  144. package/dist/types/talisman.d.ts.map +1 -0
  145. package/dist/types/trezor.d.ts +2 -0
  146. package/dist/types/trezor.d.ts.map +1 -0
  147. package/dist/types/tronlink.d.ts +2 -0
  148. package/dist/types/tronlink.d.ts.map +1 -0
  149. package/dist/types/types.d.ts +92 -0
  150. package/dist/types/types.d.ts.map +1 -0
  151. package/dist/types/utils.d.ts +4 -0
  152. package/dist/types/utils.d.ts.map +1 -0
  153. package/dist/types/vultisig.d.ts +2 -0
  154. package/dist/types/vultisig.d.ts.map +1 -0
  155. package/dist/types/walletconnect/constants.d.ts +89 -0
  156. package/dist/types/walletconnect/constants.d.ts.map +1 -0
  157. package/dist/types/walletconnect/evmSigner.d.ts +28 -0
  158. package/dist/types/walletconnect/evmSigner.d.ts.map +1 -0
  159. package/dist/types/walletconnect/helpers.d.ts +7 -0
  160. package/dist/types/walletconnect/helpers.d.ts.map +1 -0
  161. package/dist/types/walletconnect/index.d.ts +25 -0
  162. package/dist/types/walletconnect/index.d.ts.map +1 -0
  163. package/dist/types/walletconnect/namespaces.d.ts +10 -0
  164. package/dist/types/walletconnect/namespaces.d.ts.map +1 -0
  165. package/dist/types/walletconnect/types.d.ts +7 -0
  166. package/dist/types/walletconnect/types.d.ts.map +1 -0
  167. package/dist/types/xaman/helpers.d.ts +59 -0
  168. package/dist/types/xaman/helpers.d.ts.map +1 -0
  169. package/dist/types/xaman/index.d.ts +17 -0
  170. package/dist/types/xaman/index.d.ts.map +1 -0
  171. package/dist/types/xaman/types.d.ts +24 -0
  172. package/dist/types/xaman/types.d.ts.map +1 -0
  173. package/dist/types/xaman/walletMethods.d.ts +19 -0
  174. package/dist/types/xaman/walletMethods.d.ts.map +1 -0
  175. package/package.json +220 -0
  176. package/src/bitget.ts +1 -0
  177. package/src/coinbase/index.ts +48 -0
  178. package/src/coinbase/signer.ts +81 -0
  179. package/src/cosmostation.ts +1 -0
  180. package/src/ctrl.ts +1 -0
  181. package/src/evm-extensions.ts +1 -0
  182. package/src/index.ts +3 -0
  183. package/src/keepkey-bex.ts +1 -0
  184. package/src/keepkey.ts +1 -0
  185. package/src/keplr.ts +1 -0
  186. package/src/keystore.ts +1 -0
  187. package/src/ledger.ts +1 -0
  188. package/src/near-wallet-selector/index.ts +116 -0
  189. package/src/okx.ts +1 -0
  190. package/src/onekey.ts +1 -0
  191. package/src/passkeys/index.ts +187 -0
  192. package/src/phantom.ts +1 -0
  193. package/src/polkadotjs.ts +1 -0
  194. package/src/radix/index.ts +198 -0
  195. package/src/talisman.ts +1 -0
  196. package/src/trezor.ts +1 -0
  197. package/src/tronlink.ts +1 -0
  198. package/src/types.ts +94 -0
  199. package/src/utils.ts +59 -0
  200. package/src/vultisig.ts +1 -0
  201. package/src/walletconnect/constants.ts +109 -0
  202. package/src/walletconnect/evmSigner.ts +129 -0
  203. package/src/walletconnect/helpers.ts +77 -0
  204. package/src/walletconnect/index.ts +396 -0
  205. package/src/walletconnect/namespaces.ts +84 -0
  206. package/src/walletconnect/types.ts +6 -0
  207. package/src/xaman/helpers.ts +58 -0
  208. package/src/xaman/index.ts +66 -0
  209. package/src/xaman/types.ts +26 -0
  210. package/src/xaman/walletMethods.ts +114 -0
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Modifications © 2025 Horizontal Systems.
3
+ */
4
+
5
+ import { type EVMChain, USwapError, WalletOption } from "@tcswap/helpers";
6
+ import type { JsonRpcProvider, Provider, TransactionRequest, TransactionResponse } from "ethers";
7
+ import { AbstractSigner } from "ethers";
8
+
9
+ import { DEFAULT_EIP155_METHODS } from "./constants";
10
+ import { chainToChainId, getAddressByChain } from "./helpers";
11
+ import type { Walletconnect } from "./index";
12
+
13
+ interface WalletconnectEVMSignerParams {
14
+ chain: EVMChain;
15
+ walletconnect: Walletconnect;
16
+ provider: Provider | JsonRpcProvider;
17
+ }
18
+
19
+ class WalletconnectSigner extends AbstractSigner {
20
+ address: string;
21
+
22
+ private chain: EVMChain;
23
+ private walletconnect: Walletconnect;
24
+ readonly provider: Provider | JsonRpcProvider;
25
+
26
+ constructor({ chain, provider, walletconnect }: WalletconnectEVMSignerParams) {
27
+ super(provider);
28
+ this.chain = chain;
29
+ this.walletconnect = walletconnect;
30
+ this.provider = provider;
31
+ this.address = "";
32
+ }
33
+
34
+ // biome-ignore lint/suspicious/useAwait: fulfil implementation type
35
+ getAddress = async () => {
36
+ if (!this.walletconnect) {
37
+ throw new USwapError("wallet_walletconnect_connection_not_established");
38
+ }
39
+ if (!this.address) {
40
+ this.address = getAddressByChain(this.chain, this.walletconnect.accounts || []);
41
+ }
42
+
43
+ return this.address;
44
+ };
45
+
46
+ signMessage = async (message: string) => {
47
+ // this is probably broken
48
+ const txHash = (await this.walletconnect?.client.request({
49
+ chainId: chainToChainId(this.chain),
50
+ request: { method: DEFAULT_EIP155_METHODS.ETH_SIGN, params: [message] },
51
+ topic: this.walletconnect.session.topic || "",
52
+ })) as string;
53
+
54
+ return txHash.startsWith("0x") ? txHash : `0x${txHash}`;
55
+ };
56
+
57
+ signTransaction = () => {
58
+ throw new USwapError("wallet_walletconnect_method_not_supported", { method: "signTransaction" });
59
+
60
+ // const baseTx = {
61
+ // from,
62
+ // to,
63
+ // value: BigNumber.from(value || 0).toHexString(),
64
+ // data,
65
+ // };
66
+
67
+ // const txHash = (await this.walletconnect?.client.request({
68
+ // chainId: chainToChainId(this.chain),
69
+ // topic: this.walletconnect.session.topic,
70
+ // request: {
71
+ // method: DEFAULT_EIP155_METHODS.ETH_SIGN_TRANSACTION,
72
+ // params: [baseTx],
73
+ // },
74
+ // })) as string;
75
+
76
+ // return txHash.startsWith('0x') ? txHash : `0x${txHash}`;
77
+ };
78
+
79
+ // ANCHOR (@Towan) - Implement in future
80
+ signTypedData = () => {
81
+ throw new USwapError("wallet_walletconnect_method_not_supported", { method: "signTypedData" });
82
+
83
+ // const { toHexString } = await import('@tcswap/toolboxes/evm');
84
+
85
+ // const baseTx = {
86
+ // from,
87
+ // to,
88
+ // value: toHexString(value || 0n),
89
+ // data,
90
+ // };
91
+
92
+ // const txHash = (await this.walletconnect?.client.request({
93
+ // chainId: chainToChainId(this.chain),
94
+ // topic: this.walletconnect.session.topic,
95
+ // request: {
96
+ // method: DEFAULT_EIP155_METHODS.ETH_SIGN_TYPED_DATA,
97
+ // params: [baseTx],
98
+ // },
99
+ // })) as string;
100
+
101
+ // return txHash.startsWith('0x') ? txHash : `0x${txHash}`;
102
+ };
103
+
104
+ sendTransaction = async ({ from, to, value, data }: TransactionRequest) => {
105
+ const { toHexString } = await import("@tcswap/toolboxes/evm");
106
+
107
+ const baseTx = { data, from, to, value: toHexString(BigInt(value || 0)) };
108
+ const response = await this.walletconnect?.client.request({
109
+ chainId: chainToChainId(this.chain),
110
+ request: { method: DEFAULT_EIP155_METHODS.ETH_SEND_TRANSACTION, params: [baseTx] },
111
+ topic: this.walletconnect.session.topic,
112
+ });
113
+
114
+ return response as TransactionResponse;
115
+ };
116
+
117
+ connect = (provider: Provider | null) => {
118
+ if (!provider) {
119
+ throw new USwapError({
120
+ errorKey: "wallet_provider_not_found",
121
+ info: { chain: this.chain, wallet: WalletOption.WALLETCONNECT },
122
+ });
123
+ }
124
+
125
+ return new WalletconnectSigner({ chain: this.chain, provider, walletconnect: this.walletconnect });
126
+ };
127
+ }
128
+ export const getEVMSigner = async ({ chain, walletconnect, provider }: WalletconnectEVMSignerParams) =>
129
+ new WalletconnectSigner({ chain, provider, walletconnect });
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Modifications © 2025 Horizontal Systems.
3
+ */
4
+
5
+ import { Chain, type CosmosChain, type EVMChain, USwapConfig } from "@tcswap/helpers";
6
+
7
+ import {
8
+ ARBITRUM_ONE_MAINNET_ID,
9
+ AURORA_MAINNET_ID,
10
+ AVALANCHE_MAINNET_ID,
11
+ BASE_MAINNET_ID,
12
+ BERACHAIN_MAINNET_ID,
13
+ BSC_MAINNET_ID,
14
+ COSMOS_HUB_MAINNET_ID,
15
+ ETHEREUM_MAINNET_ID,
16
+ KUJIRA_MAINNET_ID,
17
+ MAYACHAIN_MAINNET_ID,
18
+ MONAD_MAINNET_ID,
19
+ NEAR_MAINNET_ID,
20
+ NEAR_TESTNET_ID,
21
+ OPTIMISM_MAINNET_ID,
22
+ POLYGON_MAINNET_ID,
23
+ THORCHAIN_MAINNET_ID,
24
+ TRON_MAINNET_ID,
25
+ } from "./constants";
26
+
27
+ export const getAddressByChain = (
28
+ chain: EVMChain | Exclude<CosmosChain, typeof Chain.Noble> | typeof Chain.Near | typeof Chain.Tron,
29
+ accounts: string[],
30
+ ) => {
31
+ const account = accounts.find((account) => account.startsWith(chainToChainId(chain))) || "";
32
+ const address = account?.split(":")?.[2];
33
+
34
+ return address || "";
35
+ };
36
+
37
+ export const chainToChainId = (chain: Chain) => {
38
+ switch (chain) {
39
+ case Chain.Avalanche:
40
+ return AVALANCHE_MAINNET_ID;
41
+ case Chain.Aurora:
42
+ return AURORA_MAINNET_ID;
43
+ case Chain.Base:
44
+ return BASE_MAINNET_ID;
45
+ case Chain.BinanceSmartChain:
46
+ return BSC_MAINNET_ID;
47
+ case Chain.Berachain:
48
+ return BERACHAIN_MAINNET_ID;
49
+ case Chain.Monad:
50
+ return MONAD_MAINNET_ID;
51
+ case Chain.Ethereum:
52
+ return ETHEREUM_MAINNET_ID;
53
+ case Chain.THORChain:
54
+ return THORCHAIN_MAINNET_ID;
55
+ case Chain.Arbitrum:
56
+ return ARBITRUM_ONE_MAINNET_ID;
57
+ case Chain.Optimism:
58
+ return OPTIMISM_MAINNET_ID;
59
+ case Chain.Polygon:
60
+ return POLYGON_MAINNET_ID;
61
+ case Chain.Maya:
62
+ return MAYACHAIN_MAINNET_ID;
63
+ case Chain.Cosmos:
64
+ return COSMOS_HUB_MAINNET_ID;
65
+ case Chain.Kujira:
66
+ return KUJIRA_MAINNET_ID;
67
+ case Chain.Near: {
68
+ // Use testnet if stagenet is enabled
69
+ const { isStagenet } = USwapConfig.get("envs");
70
+ return isStagenet ? NEAR_TESTNET_ID : NEAR_MAINNET_ID;
71
+ }
72
+ case Chain.Tron:
73
+ return TRON_MAINNET_ID;
74
+ default:
75
+ return "";
76
+ }
77
+ };
@@ -0,0 +1,396 @@
1
+ /**
2
+ * Modifications © 2025 Horizontal Systems.
3
+ */
4
+
5
+ import type { StdSignDoc } from "@cosmjs/amino";
6
+ import type { Transaction } from "@near-js/transactions";
7
+ import {
8
+ Chain,
9
+ filterSupportedChains,
10
+ type GenericTransferParams,
11
+ getRPCUrl,
12
+ USwapConfig,
13
+ USwapError,
14
+ WalletOption,
15
+ } from "@tcswap/helpers";
16
+ import type { ThorchainDepositParams } from "@tcswap/toolboxes/cosmos";
17
+ import type { NearSigner } from "@tcswap/toolboxes/near";
18
+ import type { TronSignedTransaction, TronSigner, TronTransaction } from "@tcswap/toolboxes/tron";
19
+ import { createWallet, getWalletSupportedChains } from "@tcswap/wallet-core";
20
+ import type { WalletConnectModal } from "@walletconnect/modal";
21
+ import type { SignClient } from "@walletconnect/sign-client";
22
+ import type { SessionTypes, SignClientTypes } from "@walletconnect/types";
23
+ import {
24
+ DEFAULT_APP_METADATA,
25
+ DEFAULT_COSMOS_METHODS,
26
+ DEFAULT_LOGGER,
27
+ DEFAULT_RELAY_URL,
28
+ THORCHAIN_MAINNET_ID,
29
+ } from "./constants";
30
+ import { getEVMSigner } from "./evmSigner";
31
+ import { chainToChainId, getAddressByChain } from "./helpers";
32
+ import { getRequiredNamespaces } from "./namespaces";
33
+
34
+ export * from "./constants";
35
+ export * from "./types";
36
+
37
+ export const walletconnectWallet = createWallet({
38
+ connect: ({ addChain, supportedChains, walletType }) =>
39
+ async function connectWalletconnect(chains: Chain[], walletconnectOptions?: SignClientTypes.Options) {
40
+ const filteredChains = filterSupportedChains({ chains, supportedChains, walletType });
41
+ const { walletConnectProjectId } = USwapConfig.get("apiKeys");
42
+
43
+ if (!walletConnectProjectId) {
44
+ throw new USwapError("wallet_walletconnect_project_id_not_specified");
45
+ }
46
+
47
+ const walletconnect = await getWalletconnect(filteredChains, walletConnectProjectId, walletconnectOptions);
48
+
49
+ if (!walletconnect) {
50
+ throw new USwapError("wallet_walletconnect_connection_not_established");
51
+ }
52
+
53
+ const { accounts } = walletconnect;
54
+
55
+ await Promise.all(
56
+ filteredChains.map(async (chain) => {
57
+ const address = getAddressByChain(chain, accounts || []);
58
+ const toolbox = await getToolbox({ address, chain, walletconnect });
59
+
60
+ addChain({
61
+ ...toolbox,
62
+ address,
63
+ chain,
64
+ disconnect: walletconnect.disconnect,
65
+ walletType: WalletOption.WALLETCONNECT,
66
+ });
67
+ }),
68
+ );
69
+
70
+ return true;
71
+ },
72
+ name: "connectWalletconnect",
73
+ supportedChains: [
74
+ Chain.Arbitrum,
75
+ Chain.Aurora,
76
+ Chain.Avalanche,
77
+ Chain.Base,
78
+ Chain.Berachain,
79
+ Chain.BinanceSmartChain,
80
+ Chain.Cosmos,
81
+ Chain.Ethereum,
82
+ Chain.Kujira,
83
+ Chain.Maya,
84
+ Chain.Monad,
85
+ Chain.Near,
86
+ Chain.Optimism,
87
+ Chain.Polygon,
88
+ Chain.THORChain,
89
+ Chain.Tron,
90
+ Chain.XLayer,
91
+ ],
92
+ walletType: WalletOption.WALLETCONNECT,
93
+ });
94
+
95
+ export const WC_SUPPORTED_CHAINS = getWalletSupportedChains(walletconnectWallet);
96
+ export type Walletconnect = Awaited<ReturnType<typeof getWalletconnect>>;
97
+
98
+ async function getToolbox<T extends (typeof WC_SUPPORTED_CHAINS)[number]>({
99
+ chain,
100
+ walletconnect,
101
+ address,
102
+ }: {
103
+ walletconnect: Walletconnect;
104
+ chain: T;
105
+ address: string;
106
+ }) {
107
+ const session = walletconnect?.session;
108
+ if (!session) {
109
+ throw new USwapError("wallet_walletconnect_connection_not_established");
110
+ }
111
+
112
+ switch (chain) {
113
+ case Chain.Arbitrum:
114
+ case Chain.Avalanche:
115
+ case Chain.Base:
116
+ case Chain.BinanceSmartChain:
117
+ case Chain.Ethereum:
118
+ case Chain.Monad:
119
+ case Chain.Optimism:
120
+ case Chain.Polygon:
121
+ case Chain.XLayer: {
122
+ const { getProvider, getEvmToolbox } = await import("@tcswap/toolboxes/evm");
123
+
124
+ const provider = await getProvider(chain);
125
+ const signer = await getEVMSigner({ chain, provider, walletconnect });
126
+ const toolbox = await getEvmToolbox(chain, { provider, signer });
127
+
128
+ return toolbox;
129
+ }
130
+
131
+ case Chain.THORChain: {
132
+ const { SignMode } = await import("cosmjs-types/cosmos/tx/signing/v1beta1/signing.js");
133
+ const { TxRaw } = await import("cosmjs-types/cosmos/tx/v1beta1/tx.js");
134
+
135
+ const importedSigning = await import("@cosmjs/proto-signing");
136
+ const encodePubkey = importedSigning.encodePubkey ?? importedSigning.default?.encodePubkey;
137
+ const makeAuthInfoBytes = importedSigning.makeAuthInfoBytes ?? importedSigning.default?.makeAuthInfoBytes;
138
+ const importedAmino = await import("@cosmjs/amino");
139
+ const makeSignDoc = importedAmino.makeSignDoc ?? importedSigning.default?.makeSignDoc;
140
+
141
+ const {
142
+ getCosmosToolbox,
143
+ buildAminoMsg,
144
+ buildEncodedTxBody,
145
+ createStargateClient,
146
+ fromBase64,
147
+ getDefaultChainFee,
148
+ parseAminoMessageForDirectSigning,
149
+ } = await import("@tcswap/toolboxes/cosmos");
150
+ const toolbox = await getCosmosToolbox(chain);
151
+
152
+ const fee = getDefaultChainFee(chain);
153
+
154
+ const signRequest = (signDoc: StdSignDoc) =>
155
+ walletconnect?.client.request({
156
+ chainId: THORCHAIN_MAINNET_ID,
157
+ request: { method: DEFAULT_COSMOS_METHODS.COSMOS_SIGN_AMINO, params: { signDoc, signerAddress: address } },
158
+ topic: session.topic,
159
+ });
160
+
161
+ async function thorchainTransfer({ assetValue, memo, ...rest }: GenericTransferParams | ThorchainDepositParams) {
162
+ const account = await toolbox.getAccount(address);
163
+ if (!account) {
164
+ throw new USwapError({ errorKey: "wallet_missing_params", info: { account } });
165
+ }
166
+
167
+ if (!account.pubkey) {
168
+ throw new USwapError({ errorKey: "wallet_missing_params", info: { account, pubkey: account?.pubkey } });
169
+ }
170
+
171
+ const { accountNumber, sequence = 0 } = account;
172
+
173
+ const msgs = [buildAminoMsg({ ...rest, assetValue, memo, sender: address })];
174
+
175
+ const signDoc = makeSignDoc(
176
+ msgs,
177
+ fee,
178
+ assetValue.chainId,
179
+ memo,
180
+ accountNumber?.toString(),
181
+ sequence?.toString() || "0",
182
+ );
183
+
184
+ const signature: any = await signRequest(signDoc);
185
+
186
+ const bodyBytes = await buildEncodedTxBody({
187
+ chain: Chain.THORChain,
188
+ memo: memo || "",
189
+ msgs: msgs.map(parseAminoMessageForDirectSigning),
190
+ });
191
+ const pubkey = encodePubkey(account.pubkey);
192
+ const authInfoBytes = makeAuthInfoBytes(
193
+ [{ pubkey, sequence }],
194
+ fee.amount,
195
+ Number.parseInt(fee.gas, 10),
196
+ undefined,
197
+ undefined,
198
+ SignMode.SIGN_MODE_LEGACY_AMINO_JSON,
199
+ );
200
+
201
+ const txRaw = TxRaw.fromPartial({
202
+ authInfoBytes,
203
+ bodyBytes,
204
+ signatures: [
205
+ fromBase64(typeof signature.signature === "string" ? signature.signature : signature.signature.signature),
206
+ ],
207
+ });
208
+ const txBytes = TxRaw.encode(txRaw).finish();
209
+
210
+ const rpcUrl = await getRPCUrl(Chain.THORChain);
211
+ const broadcaster = await createStargateClient(rpcUrl);
212
+ const result = await broadcaster.broadcastTx(txBytes);
213
+ return result.transactionHash;
214
+ }
215
+
216
+ return {
217
+ ...toolbox,
218
+ deposit: (params: ThorchainDepositParams) => thorchainTransfer(params),
219
+ transfer: (params: GenericTransferParams) => thorchainTransfer(params),
220
+ };
221
+ }
222
+
223
+ case Chain.Near: {
224
+ const { getNearToolbox } = await import("@tcswap/toolboxes/near");
225
+ const { DEFAULT_NEAR_METHODS } = await import("./constants");
226
+
227
+ // Create a NEAR signer that uses WalletConnect
228
+ const signer = {
229
+ getAddress() {
230
+ return Promise.resolve(address);
231
+ },
232
+ getPublicKey() {
233
+ // WalletConnect NEAR doesn't expose public key directly
234
+ return Promise.reject(
235
+ new USwapError("wallet_walletconnect_method_not_supported", { method: "getPublicKey" }),
236
+ );
237
+ },
238
+
239
+ signDelegateAction(_delegateAction: any) {
240
+ return Promise.reject(
241
+ new USwapError("wallet_walletconnect_method_not_supported", { method: "signDelegateAction" }),
242
+ );
243
+ },
244
+
245
+ signNep413Message(
246
+ _message: string,
247
+ _accountId: string,
248
+ _recipient: string,
249
+ _nonce: Uint8Array,
250
+ _callbackUrl?: string,
251
+ ) {
252
+ // WalletConnect NEAR spec doesn't include NEP-413 message signing
253
+ return Promise.reject(
254
+ new USwapError("wallet_walletconnect_method_not_supported", { method: "signNep413Message" }),
255
+ );
256
+ },
257
+
258
+ async signTransaction(transaction: Transaction) {
259
+ if (!walletconnect) {
260
+ throw new USwapError("wallet_walletconnect_connection_not_established");
261
+ }
262
+ // WalletConnect signs and sends in one operation
263
+ const result = await walletconnect.client.request({
264
+ chainId: chainToChainId(Chain.Near),
265
+ request: { method: DEFAULT_NEAR_METHODS.NEAR_SIGN_AND_SEND_TRANSACTION, params: { transaction } },
266
+ topic: session.topic,
267
+ });
268
+ // Return dummy hash and result
269
+ return [new Uint8Array(32), result];
270
+ },
271
+ } as NearSigner;
272
+
273
+ const toolbox = await getNearToolbox({ signer });
274
+ return toolbox;
275
+ }
276
+
277
+ case Chain.Tron: {
278
+ const { createTronToolbox } = await import("@tcswap/toolboxes/tron");
279
+ const { DEFAULT_TRON_METHODS } = await import("./constants");
280
+
281
+ // Create a Tron signer that uses WalletConnect
282
+ const signer: TronSigner = {
283
+ getAddress() {
284
+ return Promise.resolve(address);
285
+ },
286
+
287
+ async signTransaction(transaction: TronTransaction) {
288
+ if (!walletconnect) {
289
+ throw new USwapError("wallet_walletconnect_connection_not_established");
290
+ }
291
+
292
+ const signedTx = await walletconnect.client.request({
293
+ chainId: chainToChainId(Chain.Tron),
294
+ request: { method: DEFAULT_TRON_METHODS.TRON_SIGN_TRANSACTION, params: { transaction } },
295
+ topic: session.topic,
296
+ });
297
+
298
+ return signedTx as TronSignedTransaction;
299
+ },
300
+ };
301
+
302
+ const toolbox = await createTronToolbox({ signer });
303
+ return toolbox;
304
+ }
305
+
306
+ default:
307
+ throw new USwapError({
308
+ errorKey: "wallet_chain_not_supported",
309
+ info: { chain, wallet: WalletOption.WALLETCONNECT },
310
+ });
311
+ }
312
+ }
313
+
314
+ async function getWalletconnect(
315
+ chains: Chain[],
316
+ walletConnectProjectId: string,
317
+ walletconnectOptions?: SignClientTypes.Options,
318
+ ) {
319
+ let modal: WalletConnectModal | undefined;
320
+ let signer: typeof SignClient | undefined;
321
+ let session: SessionTypes.Struct | undefined;
322
+ let accounts: string[] | undefined;
323
+ try {
324
+ const requiredNamespaces = getRequiredNamespaces(chains.map(chainToChainId));
325
+
326
+ const { SignClient } = await import("@walletconnect/sign-client");
327
+ const { WalletConnectModal } = await import("@walletconnect/modal");
328
+
329
+ const client = await SignClient.init({
330
+ logger: DEFAULT_LOGGER,
331
+ metadata: walletconnectOptions?.metadata || DEFAULT_APP_METADATA,
332
+ projectId: walletConnectProjectId,
333
+ relayUrl: DEFAULT_RELAY_URL,
334
+ ...walletconnectOptions?.core,
335
+ });
336
+
337
+ const modal = new WalletConnectModal({
338
+ logger: DEFAULT_LOGGER,
339
+ projectId: walletConnectProjectId,
340
+ relayUrl: DEFAULT_RELAY_URL,
341
+ ...walletconnectOptions?.core,
342
+ });
343
+
344
+ const oldSession = (await client.session.getAll())[0];
345
+
346
+ // disconnect old Session cause we can't handle using it with current ui
347
+ if (oldSession) {
348
+ await client.disconnect({ reason: { code: 0, message: "Resetting session" }, topic: oldSession.topic });
349
+ }
350
+
351
+ const { uri, approval } = await client.connect({
352
+ // Optionally: pass a known prior pairing (e.g. from `client.core.pairing.getPairings()`) to skip the `uri` step.
353
+ // pairingTopic: pairing?.topic,
354
+ // Provide the namespaces and chains (e.g. `eip155` for EVM-based chains) we want to use in this session.
355
+ requiredNamespaces,
356
+ });
357
+
358
+ if (uri) {
359
+ modal.openModal({ uri });
360
+ // Await session approval from the wallet.
361
+ session = await approval();
362
+ // Handle the returned session (e.g. update UI to "connected" state).
363
+ // Close the QRCode modal in case it was open.
364
+ modal.closeModal();
365
+
366
+ function extractAccountsFromSession(session: SessionTypes.Struct) {
367
+ const accounts: string[] = [];
368
+
369
+ for (const [_namespace, data] of Object.entries(session.namespaces)) {
370
+ accounts.push(...data.accounts);
371
+ }
372
+
373
+ return accounts;
374
+ }
375
+
376
+ accounts = extractAccountsFromSession(session);
377
+ }
378
+
379
+ const disconnect = async () => {
380
+ session && (await client.disconnect({ reason: { code: 0, message: "User disconnected" }, topic: session.topic }));
381
+ };
382
+
383
+ if (!session) {
384
+ throw new USwapError("wallet_walletconnect_connection_not_established");
385
+ }
386
+
387
+ return { accounts, client, disconnect, session, signer };
388
+ } catch {
389
+ // Errors are handled by returning undefined
390
+ } finally {
391
+ if (modal) {
392
+ modal.closeModal();
393
+ }
394
+ }
395
+ return undefined;
396
+ }
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Modifications © 2025 Horizontal Systems.
3
+ */
4
+
5
+ import { USwapError } from "@tcswap/helpers";
6
+ import type { ProposalTypes } from "@walletconnect/types";
7
+ import {
8
+ DEFAULT_COSMOS_METHODS,
9
+ DEFAULT_EIP_155_EVENTS,
10
+ DEFAULT_EIP155_METHODS,
11
+ DEFAULT_NEAR_EVENTS,
12
+ DEFAULT_NEAR_METHODS,
13
+ DEFAULT_POLKADOT_EVENTS,
14
+ DEFAULT_POLKADOT_METHODS,
15
+ DEFAULT_SOLANA_EVENTS,
16
+ DEFAULT_SOLANA_METHODS,
17
+ DEFAULT_TRON_EVENTS,
18
+ DEFAULT_TRON_METHODS,
19
+ } from "./constants";
20
+
21
+ export const getNamespacesFromChains = (chains: string[]) => {
22
+ const supportedNamespaces: string[] = [];
23
+ for (const chainId of chains) {
24
+ const [namespace] = chainId.split(":");
25
+ if (namespace && !supportedNamespaces.includes(namespace)) {
26
+ supportedNamespaces.push(namespace);
27
+ }
28
+ }
29
+
30
+ return supportedNamespaces;
31
+ };
32
+
33
+ export const getSupportedMethodsByNamespace = (namespace: string) => {
34
+ switch (namespace) {
35
+ case "eip155":
36
+ return Object.values(DEFAULT_EIP155_METHODS);
37
+ case "cosmos":
38
+ return Object.values(DEFAULT_COSMOS_METHODS);
39
+ case "solana":
40
+ return Object.values(DEFAULT_SOLANA_METHODS);
41
+ case "polkadot":
42
+ return Object.values(DEFAULT_POLKADOT_METHODS);
43
+ case "near":
44
+ return Object.values(DEFAULT_NEAR_METHODS);
45
+ case "tron":
46
+ return Object.values(DEFAULT_TRON_METHODS);
47
+ default:
48
+ throw new USwapError({ errorKey: "wallet_walletconnect_namespace_not_supported", info: { namespace } });
49
+ }
50
+ };
51
+
52
+ export const getSupportedEventsByNamespace = (namespace: string) => {
53
+ switch (namespace) {
54
+ case "eip155":
55
+ return Object.values(DEFAULT_EIP_155_EVENTS);
56
+ case "cosmos":
57
+ return [];
58
+ case "solana":
59
+ return Object.values(DEFAULT_SOLANA_EVENTS);
60
+ case "polkadot":
61
+ return Object.values(DEFAULT_POLKADOT_EVENTS);
62
+ case "near":
63
+ return Object.values(DEFAULT_NEAR_EVENTS);
64
+ case "tron":
65
+ return Object.values(DEFAULT_TRON_EVENTS);
66
+ default:
67
+ throw new USwapError({ errorKey: "wallet_walletconnect_namespace_not_supported", info: { namespace } });
68
+ }
69
+ };
70
+
71
+ export const getRequiredNamespaces = (chains: string[]): ProposalTypes.RequiredNamespaces => {
72
+ const selectedNamespaces = getNamespacesFromChains(chains);
73
+
74
+ return Object.fromEntries(
75
+ selectedNamespaces.map((namespace) => [
76
+ namespace,
77
+ {
78
+ chains: chains.filter((chain) => chain.startsWith(namespace)),
79
+ events: getSupportedEventsByNamespace(namespace) as any[],
80
+ methods: getSupportedMethodsByNamespace(namespace),
81
+ },
82
+ ]),
83
+ );
84
+ };
@@ -0,0 +1,6 @@
1
+ export interface ClientMetadata {
2
+ name: string;
3
+ description: string;
4
+ url: string;
5
+ icons: string[];
6
+ }