@swapkit/wallets 3.0.0-beta.0 → 3.0.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.
- package/dist/chunk-czhtd6cy.js +4 -0
- package/dist/chunk-czhtd6cy.js.map +10 -0
- package/dist/{chunk-5m175wfy.js → chunk-p1kdg37m.js} +2 -2
- package/dist/{chunk-5m175wfy.js.map → chunk-p1kdg37m.js.map} +1 -1
- package/dist/{chunk-f76hj57k.js → chunk-q81hzyra.js} +2 -2
- package/dist/{chunk-f76hj57k.js.map → chunk-q81hzyra.js.map} +1 -1
- package/dist/chunk-qadd75nn.js +3 -0
- package/dist/chunk-qadd75nn.js.map +10 -0
- package/dist/src/bitget/index.cjs +2 -2
- package/dist/src/bitget/index.cjs.map +5 -5
- package/dist/src/bitget/index.js +2 -2
- package/dist/src/bitget/index.js.map +5 -5
- package/dist/src/coinbase/index.cjs +2 -2
- package/dist/src/coinbase/index.cjs.map +4 -4
- package/dist/src/coinbase/index.js +2 -3
- package/dist/src/coinbase/index.js.map +4 -4
- package/dist/src/ctrl/index.cjs +2 -2
- package/dist/src/ctrl/index.cjs.map +5 -5
- package/dist/src/ctrl/index.js +2 -2
- package/dist/src/ctrl/index.js.map +5 -5
- package/dist/src/evm-extensions/index.cjs +2 -2
- package/dist/src/evm-extensions/index.cjs.map +3 -3
- package/dist/src/evm-extensions/index.js +2 -3
- package/dist/src/evm-extensions/index.js.map +3 -3
- package/dist/src/exodus/index.cjs +2 -2
- package/dist/src/exodus/index.cjs.map +3 -3
- package/dist/src/exodus/index.js +2 -3
- package/dist/src/exodus/index.js.map +3 -3
- package/dist/src/index.cjs +2 -2
- package/dist/src/index.cjs.map +3 -4
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +3 -4
- package/dist/src/keepkey/index.cjs +2 -2
- package/dist/src/keepkey/index.cjs.map +7 -7
- package/dist/src/keepkey/index.js +2 -3
- package/dist/src/keepkey/index.js.map +7 -7
- package/dist/src/keepkey-bex/index.cjs +2 -2
- package/dist/src/keepkey-bex/index.cjs.map +4 -4
- package/dist/src/keepkey-bex/index.js +2 -3
- package/dist/src/keepkey-bex/index.js.map +4 -4
- package/dist/src/keplr/index.cjs +2 -2
- package/dist/src/keplr/index.cjs.map +3 -3
- package/dist/src/keplr/index.js +2 -3
- package/dist/src/keplr/index.js.map +3 -3
- package/dist/src/keystore/index.cjs +2 -2
- package/dist/src/keystore/index.cjs.map +4 -4
- package/dist/src/keystore/index.js +2 -3
- package/dist/src/keystore/index.js.map +4 -4
- package/dist/src/ledger/index.cjs +3 -3
- package/dist/src/ledger/index.cjs.map +8 -8
- package/dist/src/ledger/index.js +3 -4
- package/dist/src/ledger/index.js.map +8 -8
- package/dist/src/okx/index.cjs +2 -2
- package/dist/src/okx/index.cjs.map +4 -4
- package/dist/src/okx/index.js +2 -3
- package/dist/src/okx/index.js.map +4 -4
- package/dist/src/onekey/index.cjs +3 -0
- package/dist/src/onekey/index.cjs.map +10 -0
- package/dist/src/onekey/index.js +3 -0
- package/dist/src/onekey/index.js.map +10 -0
- package/dist/src/phantom/index.cjs +2 -2
- package/dist/src/phantom/index.cjs.map +3 -3
- package/dist/src/phantom/index.js +2 -3
- package/dist/src/phantom/index.js.map +3 -3
- package/dist/src/polkadotjs/index.cjs +2 -2
- package/dist/src/polkadotjs/index.cjs.map +3 -3
- package/dist/src/polkadotjs/index.js +2 -3
- package/dist/src/polkadotjs/index.js.map +3 -3
- package/dist/src/radix/index.cjs +2 -2
- package/dist/src/radix/index.cjs.map +3 -3
- package/dist/src/radix/index.js +2 -3
- package/dist/src/radix/index.js.map +3 -3
- package/dist/src/talisman/index.cjs +2 -2
- package/dist/src/talisman/index.cjs.map +3 -3
- package/dist/src/talisman/index.js +2 -3
- package/dist/src/talisman/index.js.map +3 -3
- package/dist/src/trezor/index.cjs +2 -2
- package/dist/src/trezor/index.cjs.map +3 -3
- package/dist/src/trezor/index.js +2 -3
- package/dist/src/trezor/index.js.map +3 -3
- package/dist/src/walletconnect/index.cjs +2 -2
- package/dist/src/walletconnect/index.cjs.map +5 -5
- package/dist/src/walletconnect/index.js +2 -3
- package/dist/src/walletconnect/index.js.map +5 -5
- package/package.json +31 -26
- package/src/bitget/helpers.ts +33 -93
- package/src/bitget/index.ts +32 -54
- package/src/coinbase/index.ts +2 -2
- package/src/coinbase/signer.ts +46 -42
- package/src/ctrl/index.ts +157 -22
- package/src/ctrl/walletHelpers.ts +45 -94
- package/src/evm-extensions/index.ts +21 -40
- package/src/exodus/index.ts +18 -28
- package/src/index.ts +2 -37
- package/src/keepkey/chains/cosmos.ts +10 -7
- package/src/keepkey/chains/mayachain.ts +24 -24
- package/src/keepkey/chains/thorchain.ts +19 -13
- package/src/keepkey/chains/utxo.ts +36 -48
- package/src/keepkey/index.ts +9 -23
- package/src/keepkey-bex/index.ts +25 -23
- package/src/keepkey-bex/walletHelpers.ts +8 -36
- package/src/keplr/index.ts +6 -53
- package/src/keystore/helpers.ts +34 -55
- package/src/keystore/index.ts +15 -183
- package/src/ledger/clients/evm.ts +3 -7
- package/src/ledger/clients/thorchain/lib.ts +0 -19
- package/src/ledger/clients/utxo.ts +3 -2
- package/src/ledger/helpers/getLedgerClient.ts +2 -2
- package/src/ledger/index.ts +20 -21
- package/src/ledger/types.ts +1 -1
- package/src/okx/helpers.ts +23 -33
- package/src/okx/index.ts +4 -47
- package/src/onekey/evmSigner.ts +133 -0
- package/src/onekey/index.ts +213 -0
- package/src/phantom/index.ts +18 -42
- package/src/polkadotjs/index.ts +5 -7
- package/src/radix/index.ts +31 -47
- package/src/talisman/index.ts +15 -32
- package/src/trezor/index.ts +46 -45
- package/src/types.ts +199 -0
- package/src/utils.ts +54 -0
- package/src/walletconnect/constants.ts +1 -1
- package/src/walletconnect/helpers.ts +2 -2
- package/src/walletconnect/index.ts +36 -37
- package/dist/chunk-ha78se5g.js +0 -4
- package/dist/chunk-ha78se5g.js.map +0 -10
- package/dist/chunk-yvbvzc0q.js +0 -3
- package/dist/chunk-yvbvzc0q.js.map +0 -10
- package/src/bitget/bitgetWallet.ts +0 -32
- package/src/ctrl/ctrlWallet.ts +0 -175
- package/src/helpers.ts +0 -8
- package/src/ledger/ledgerLive.ts +0 -429
package/src/coinbase/signer.ts
CHANGED
|
@@ -1,48 +1,55 @@
|
|
|
1
1
|
import type { CoinbaseWalletProvider } from "@coinbase/wallet-sdk";
|
|
2
|
+
import type { createCoinbaseWalletSDK } from "@coinbase/wallet-sdk/dist/createCoinbaseWalletSDK.js";
|
|
2
3
|
import { Chain } from "@swapkit/helpers";
|
|
3
|
-
import type {
|
|
4
|
-
import { AbstractSigner, type Provider } from "ethers";
|
|
4
|
+
import type { Provider } from "ethers";
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
async function getCoinbaseMobileSigner(
|
|
7
|
+
walletProvider: CoinbaseWalletProvider,
|
|
8
|
+
provider?: Provider,
|
|
9
|
+
) {
|
|
10
|
+
const { AbstractSigner } = await import("ethers");
|
|
7
11
|
|
|
8
|
-
class CoinbaseMobileSigner extends AbstractSigner {
|
|
9
|
-
|
|
12
|
+
class CoinbaseMobileSigner extends AbstractSigner {
|
|
13
|
+
#coinbaseProvider: CoinbaseWalletProvider;
|
|
10
14
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
constructor(coinbaseProvider: CoinbaseWalletProvider, provider?: Provider) {
|
|
16
|
+
super(provider);
|
|
17
|
+
this.#coinbaseProvider = coinbaseProvider;
|
|
18
|
+
}
|
|
15
19
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
async getAddress() {
|
|
21
|
+
const accounts = await this.#coinbaseProvider.request<string[]>({
|
|
22
|
+
method: "eth_requestAccounts",
|
|
23
|
+
});
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
if (!accounts[0]) throw new Error("No Account found");
|
|
22
26
|
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
return accounts[0];
|
|
28
|
+
}
|
|
25
29
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
async signTransaction() {
|
|
31
|
+
return await this.#coinbaseProvider.request<string>({
|
|
32
|
+
method: "eth_signTransaction",
|
|
33
|
+
});
|
|
34
|
+
}
|
|
31
35
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
async signMessage(message: string | Uint8Array) {
|
|
37
|
+
return await this.#coinbaseProvider.request<string>({
|
|
38
|
+
method: "personal_sign",
|
|
39
|
+
params: [message, await this.getAddress()],
|
|
40
|
+
});
|
|
41
|
+
}
|
|
38
42
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
43
|
+
signTypedData = () => {
|
|
44
|
+
throw new Error("this method is not implemented");
|
|
45
|
+
};
|
|
42
46
|
|
|
43
|
-
|
|
44
|
-
|
|
47
|
+
connect(provider: Provider) {
|
|
48
|
+
return new CoinbaseMobileSigner(this.#coinbaseProvider, provider);
|
|
49
|
+
}
|
|
45
50
|
}
|
|
51
|
+
|
|
52
|
+
return new CoinbaseMobileSigner(walletProvider, provider);
|
|
46
53
|
}
|
|
47
54
|
|
|
48
55
|
export const getWalletMethods = async ({
|
|
@@ -51,7 +58,7 @@ export const getWalletMethods = async ({
|
|
|
51
58
|
}: {
|
|
52
59
|
chain: Chain;
|
|
53
60
|
coinbaseSdk: ReturnType<typeof createCoinbaseWalletSDK>;
|
|
54
|
-
})
|
|
61
|
+
}) => {
|
|
55
62
|
switch (chain) {
|
|
56
63
|
case Chain.Ethereum:
|
|
57
64
|
case Chain.Avalanche:
|
|
@@ -60,17 +67,14 @@ export const getWalletMethods = async ({
|
|
|
60
67
|
case Chain.Polygon:
|
|
61
68
|
case Chain.BinanceSmartChain: {
|
|
62
69
|
const walletProvider = coinbaseSdk.getProvider() as CoinbaseWalletProvider;
|
|
70
|
+
const { getEvmToolbox, getProvider } = await import("@swapkit/toolboxes/evm");
|
|
63
71
|
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
const
|
|
67
|
-
const
|
|
68
|
-
const toolbox = getToolboxByChain(chain)({ provider, signer });
|
|
72
|
+
const provider = await getProvider(chain);
|
|
73
|
+
const signer = await getCoinbaseMobileSigner(walletProvider, provider);
|
|
74
|
+
const toolbox = await getEvmToolbox(chain, { provider, signer });
|
|
75
|
+
const address = await signer.getAddress();
|
|
69
76
|
|
|
70
|
-
return {
|
|
71
|
-
address: await signer.getAddress(),
|
|
72
|
-
...toolbox,
|
|
73
|
-
};
|
|
77
|
+
return { ...toolbox, address };
|
|
74
78
|
}
|
|
75
79
|
|
|
76
80
|
default:
|
package/src/ctrl/index.ts
CHANGED
|
@@ -1,24 +1,159 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
1
|
+
import {
|
|
2
|
+
Chain,
|
|
3
|
+
ChainToChainId,
|
|
4
|
+
type GenericTransferParams,
|
|
5
|
+
SwapKitError,
|
|
6
|
+
WalletOption,
|
|
7
|
+
createWallet,
|
|
8
|
+
filterSupportedChains,
|
|
9
|
+
} from "@swapkit/helpers";
|
|
10
|
+
|
|
11
|
+
import { getWalletSupportedChains } from "../utils";
|
|
12
|
+
import { getCtrlAddress, getCtrlMethods, getCtrlProvider, walletTransfer } from "./walletHelpers";
|
|
13
|
+
|
|
14
|
+
export const ctrlWallet = createWallet({
|
|
15
|
+
name: "connectCtrl",
|
|
16
|
+
walletType: WalletOption.CTRL,
|
|
17
|
+
supportedChains: [
|
|
18
|
+
Chain.Arbitrum,
|
|
19
|
+
Chain.Avalanche,
|
|
20
|
+
Chain.Base,
|
|
21
|
+
Chain.BinanceSmartChain,
|
|
22
|
+
Chain.Bitcoin,
|
|
23
|
+
Chain.BitcoinCash,
|
|
24
|
+
Chain.Cosmos,
|
|
25
|
+
Chain.Dogecoin,
|
|
26
|
+
Chain.Ethereum,
|
|
27
|
+
Chain.Kujira,
|
|
28
|
+
Chain.Litecoin,
|
|
29
|
+
Chain.Maya,
|
|
30
|
+
Chain.Optimism,
|
|
31
|
+
Chain.Polygon,
|
|
32
|
+
Chain.Solana,
|
|
33
|
+
Chain.THORChain,
|
|
34
|
+
],
|
|
35
|
+
connect: ({ addChain, walletType, supportedChains }) =>
|
|
36
|
+
async function connectCtrl(chains: Chain[]) {
|
|
37
|
+
const filteredChains = filterSupportedChains({ chains, supportedChains, walletType });
|
|
38
|
+
|
|
39
|
+
const promises = filteredChains.map(async (chain) => {
|
|
40
|
+
const address = await getCtrlAddress(chain);
|
|
41
|
+
const walletMethods = await getWalletMethods(chain);
|
|
42
|
+
|
|
43
|
+
addChain({ ...walletMethods, address, chain, walletType });
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
await Promise.all(promises);
|
|
47
|
+
|
|
48
|
+
return true;
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
export const CTRL_SUPPORTED_CHAINS = getWalletSupportedChains(ctrlWallet);
|
|
53
|
+
|
|
54
|
+
async function getWalletMethods(chain: (typeof CTRL_SUPPORTED_CHAINS)[number]) {
|
|
55
|
+
switch (chain) {
|
|
56
|
+
case Chain.Solana: {
|
|
57
|
+
const { getSolanaToolbox } = await import("@swapkit/toolboxes/solana");
|
|
58
|
+
|
|
59
|
+
const solanaProvider = window.xfi?.solana;
|
|
60
|
+
|
|
61
|
+
if (!solanaProvider) {
|
|
62
|
+
throw new SwapKitError("wallet_ctrl_not_found");
|
|
63
|
+
}
|
|
64
|
+
const toolbox = getSolanaToolbox({ signer: solanaProvider });
|
|
65
|
+
|
|
66
|
+
return { ...toolbox };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
case Chain.Maya:
|
|
70
|
+
case Chain.THORChain: {
|
|
71
|
+
const { getCosmosToolbox, THORCHAIN_GAS_VALUE, MAYA_GAS_VALUE } = await import(
|
|
72
|
+
"@swapkit/toolboxes/cosmos"
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
const gasLimit = chain === Chain.Maya ? MAYA_GAS_VALUE : THORCHAIN_GAS_VALUE;
|
|
76
|
+
const toolbox = await getCosmosToolbox(chain);
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
...toolbox,
|
|
80
|
+
deposit: (tx: GenericTransferParams) => walletTransfer({ ...tx, recipient: "" }, "deposit"),
|
|
81
|
+
transfer: (tx: GenericTransferParams) => walletTransfer({ ...tx, gasLimit }, "transfer"),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
case Chain.Cosmos:
|
|
86
|
+
case Chain.Kujira: {
|
|
87
|
+
const { getCosmosToolbox } = await import("@swapkit/toolboxes/cosmos");
|
|
88
|
+
const chainId = ChainToChainId[chain];
|
|
89
|
+
const provider = await getCtrlProvider(chain);
|
|
90
|
+
|
|
91
|
+
await provider?.enable(chainId);
|
|
92
|
+
const signer = provider?.getOfflineSignerOnlyAmino(chainId);
|
|
93
|
+
|
|
94
|
+
if (!signer) {
|
|
95
|
+
throw new SwapKitError("wallet_ctrl_not_found");
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const toolbox = getCosmosToolbox(chain, { signer });
|
|
99
|
+
|
|
100
|
+
return toolbox;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
case Chain.Bitcoin:
|
|
104
|
+
case Chain.BitcoinCash:
|
|
105
|
+
case Chain.Dogecoin:
|
|
106
|
+
case Chain.Litecoin: {
|
|
107
|
+
const { getUtxoToolbox } = await import("@swapkit/toolboxes/utxo");
|
|
108
|
+
const toolbox = await getUtxoToolbox(chain);
|
|
109
|
+
|
|
110
|
+
return { ...toolbox, transfer: walletTransfer };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
case Chain.Arbitrum:
|
|
114
|
+
case Chain.Avalanche:
|
|
115
|
+
case Chain.Base:
|
|
116
|
+
case Chain.BinanceSmartChain:
|
|
117
|
+
case Chain.Ethereum:
|
|
118
|
+
case Chain.Optimism:
|
|
119
|
+
case Chain.Polygon: {
|
|
120
|
+
const { prepareNetworkSwitch, switchEVMWalletNetwork } = await import("@swapkit/helpers");
|
|
121
|
+
const { getEvmToolbox } = await import("@swapkit/toolboxes/evm");
|
|
122
|
+
const { BrowserProvider } = await import("ethers");
|
|
123
|
+
const ethereumWindowProvider = await getCtrlProvider(chain);
|
|
124
|
+
|
|
125
|
+
if (!ethereumWindowProvider) {
|
|
126
|
+
throw new SwapKitError("wallet_ctrl_not_found");
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const provider = new BrowserProvider(ethereumWindowProvider, "any");
|
|
130
|
+
const signer = await provider.getSigner();
|
|
131
|
+
const toolbox = await getEvmToolbox(chain, { provider, signer });
|
|
132
|
+
const ctrlMethods = getCtrlMethods(provider, chain);
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
if (chain !== Chain.Ethereum) {
|
|
136
|
+
const networkParams = toolbox.getNetworkParams();
|
|
137
|
+
await switchEVMWalletNetwork(provider, chain, networkParams);
|
|
138
|
+
}
|
|
139
|
+
} catch (_error) {
|
|
140
|
+
throw new SwapKitError({
|
|
141
|
+
errorKey: "wallet_failed_to_add_or_switch_network",
|
|
142
|
+
info: { wallet: WalletOption.CTRL, chain },
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return prepareNetworkSwitch({
|
|
147
|
+
provider: window.xfi?.ethereum,
|
|
148
|
+
chain,
|
|
149
|
+
toolbox: {
|
|
150
|
+
...toolbox,
|
|
151
|
+
...ctrlMethods,
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
default:
|
|
157
|
+
return null;
|
|
23
158
|
}
|
|
24
159
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { Keplr } from "@keplr-wallet/types";
|
|
2
|
-
import type { PublicKey } from "@solana/web3.js";
|
|
3
2
|
import {
|
|
4
3
|
type AssetValue,
|
|
5
4
|
Chain,
|
|
@@ -11,9 +10,8 @@ import {
|
|
|
11
10
|
WalletOption,
|
|
12
11
|
} from "@swapkit/helpers";
|
|
13
12
|
import { erc20ABI } from "@swapkit/helpers/contracts";
|
|
14
|
-
import type { TransferParams } from "@swapkit/toolboxes/cosmos";
|
|
15
13
|
import type { ApproveParams, CallParams, EVMTxParams } from "@swapkit/toolboxes/evm";
|
|
16
|
-
import type {
|
|
14
|
+
import type { SolanaProvider } from "@swapkit/toolboxes/solana";
|
|
17
15
|
import type { BrowserProvider, Eip1193Provider } from "ethers";
|
|
18
16
|
|
|
19
17
|
type TransactionMethod = "transfer" | "deposit";
|
|
@@ -35,59 +33,39 @@ export type WalletTxParams = {
|
|
|
35
33
|
gasLimit?: string | bigint;
|
|
36
34
|
};
|
|
37
35
|
|
|
38
|
-
export function getCtrlProvider<T extends Chain>(
|
|
36
|
+
export async function getCtrlProvider<T extends Chain>(
|
|
39
37
|
chain: T,
|
|
40
|
-
):
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
38
|
+
): Promise<
|
|
39
|
+
T extends Chain.Solana
|
|
40
|
+
? SolanaProvider
|
|
41
|
+
: T extends Chain.Cosmos | Chain.Kujira
|
|
42
|
+
? Keplr
|
|
43
|
+
: T extends EVMChain
|
|
44
|
+
? Eip1193Provider
|
|
45
|
+
: undefined
|
|
46
|
+
> {
|
|
47
47
|
if (!window.xfi) throw new SwapKitError("wallet_ctrl_not_found");
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
// @ts-expect-error
|
|
70
|
-
return window.xfi.bitcoincash;
|
|
71
|
-
case Chain.Dogecoin:
|
|
72
|
-
// @ts-expect-error
|
|
73
|
-
return window.xfi.dogecoin;
|
|
74
|
-
case Chain.Litecoin:
|
|
75
|
-
// @ts-expect-error
|
|
76
|
-
return window.xfi.litecoin;
|
|
77
|
-
case Chain.THORChain:
|
|
78
|
-
// @ts-expect-error
|
|
79
|
-
return window.xfi.thorchain;
|
|
80
|
-
case Chain.Maya:
|
|
81
|
-
// @ts-expect-error
|
|
82
|
-
return window.xfi.mayachain;
|
|
83
|
-
case Chain.Solana:
|
|
84
|
-
// @ts-expect-error
|
|
85
|
-
return window.xfi.solana;
|
|
86
|
-
|
|
87
|
-
default:
|
|
88
|
-
// @ts-expect-error
|
|
89
|
-
return undefined;
|
|
90
|
-
}
|
|
48
|
+
const { match } = await import("ts-pattern");
|
|
49
|
+
|
|
50
|
+
// @ts-expect-error
|
|
51
|
+
return match(chain as Chain)
|
|
52
|
+
.with(
|
|
53
|
+
Chain.Arbitrum,
|
|
54
|
+
Chain.Avalanche,
|
|
55
|
+
Chain.Base,
|
|
56
|
+
Chain.BinanceSmartChain,
|
|
57
|
+
Chain.Ethereum,
|
|
58
|
+
Chain.Optimism,
|
|
59
|
+
Chain.Polygon,
|
|
60
|
+
() => window.xfi?.ethereum,
|
|
61
|
+
)
|
|
62
|
+
.with(Chain.Cosmos, Chain.Kujira, Chain.Maya, Chain.THORChain, () => window.xfi?.keplr)
|
|
63
|
+
.with(Chain.Bitcoin, () => window.xfi?.bitcoin)
|
|
64
|
+
.with(Chain.BitcoinCash, () => window.xfi?.bitcoincash)
|
|
65
|
+
.with(Chain.Dogecoin, () => window.xfi?.dogecoin)
|
|
66
|
+
.with(Chain.Litecoin, () => window.xfi?.litecoin)
|
|
67
|
+
.with(Chain.Solana, () => window.xfi?.solana)
|
|
68
|
+
.otherwise(() => undefined);
|
|
91
69
|
}
|
|
92
70
|
|
|
93
71
|
async function transaction({
|
|
@@ -99,7 +77,7 @@ async function transaction({
|
|
|
99
77
|
params: TransactionParams[];
|
|
100
78
|
chain: Chain;
|
|
101
79
|
}): Promise<string> {
|
|
102
|
-
const client = getCtrlProvider(chain);
|
|
80
|
+
const client = await getCtrlProvider(chain);
|
|
103
81
|
|
|
104
82
|
return new Promise<string>((resolve, reject) => {
|
|
105
83
|
if (client && "request" in client) {
|
|
@@ -112,7 +90,7 @@ async function transaction({
|
|
|
112
90
|
}
|
|
113
91
|
|
|
114
92
|
export async function getCtrlAddress(chain: Chain) {
|
|
115
|
-
const eipProvider = getCtrlProvider(chain) as Eip1193Provider;
|
|
93
|
+
const eipProvider = (await getCtrlProvider(chain)) as Eip1193Provider;
|
|
116
94
|
if (!eipProvider) {
|
|
117
95
|
throw new SwapKitError({
|
|
118
96
|
errorKey: "wallet_provider_not_found",
|
|
@@ -121,7 +99,7 @@ export async function getCtrlAddress(chain: Chain) {
|
|
|
121
99
|
}
|
|
122
100
|
|
|
123
101
|
if ([Chain.Cosmos, Chain.Kujira].includes(chain)) {
|
|
124
|
-
const provider = getCtrlProvider(Chain.Cosmos);
|
|
102
|
+
const provider = await getCtrlProvider(Chain.Cosmos);
|
|
125
103
|
if (!provider || "request" in provider) {
|
|
126
104
|
throw new SwapKitError({
|
|
127
105
|
errorKey: "wallet_provider_not_found",
|
|
@@ -148,7 +126,7 @@ export async function getCtrlAddress(chain: Chain) {
|
|
|
148
126
|
}
|
|
149
127
|
|
|
150
128
|
if (chain === Chain.Solana) {
|
|
151
|
-
const provider = getCtrlProvider(Chain.Solana);
|
|
129
|
+
const provider = await getCtrlProvider(Chain.Solana);
|
|
152
130
|
|
|
153
131
|
const accounts = await provider.connect();
|
|
154
132
|
return accounts.publicKey.toString();
|
|
@@ -198,35 +176,7 @@ export async function walletTransfer(
|
|
|
198
176
|
return transaction({ method, params, chain: assetValue.chain });
|
|
199
177
|
}
|
|
200
178
|
|
|
201
|
-
export function
|
|
202
|
-
solToolbox: ReturnType<typeof SOLToolbox>,
|
|
203
|
-
walletPublicKey: PublicKey,
|
|
204
|
-
) {
|
|
205
|
-
return async ({
|
|
206
|
-
recipient,
|
|
207
|
-
assetValue,
|
|
208
|
-
memo,
|
|
209
|
-
isProgramDerivedAddress,
|
|
210
|
-
}: TransferParams & { isProgramDerivedAddress?: boolean }) => {
|
|
211
|
-
const transaction = await solToolbox.createSolanaTransaction({
|
|
212
|
-
recipient,
|
|
213
|
-
assetValue,
|
|
214
|
-
memo,
|
|
215
|
-
fromPublicKey: walletPublicKey,
|
|
216
|
-
isProgramDerivedAddress,
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
const signedTransaction = await window.xfi?.solana.signTransaction(transaction);
|
|
220
|
-
|
|
221
|
-
if (!signedTransaction) {
|
|
222
|
-
throw new SwapKitError("core_transaction_failed");
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
return solToolbox.broadcastTransaction(signedTransaction);
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
export function getCtrlMethods(provider: BrowserProvider) {
|
|
179
|
+
export function getCtrlMethods(provider: BrowserProvider, chain: EVMChain) {
|
|
230
180
|
return {
|
|
231
181
|
call: async <T>({
|
|
232
182
|
contractAddress,
|
|
@@ -235,17 +185,17 @@ export function getCtrlMethods(provider: BrowserProvider) {
|
|
|
235
185
|
funcParams = [],
|
|
236
186
|
txOverrides,
|
|
237
187
|
}: CallParams): Promise<T> => {
|
|
238
|
-
const contractProvider = provider;
|
|
239
188
|
if (!contractAddress) {
|
|
240
189
|
throw new SwapKitError("wallet_ctrl_contract_address_not_provided");
|
|
241
190
|
}
|
|
242
|
-
const { createContract,
|
|
191
|
+
const { createContract, getCreateContractTxObject, isStateChangingCall, toHexString } =
|
|
243
192
|
await import("@swapkit/toolboxes/evm");
|
|
244
193
|
|
|
245
|
-
const isStateChanging = isStateChangingCall(abi, funcName);
|
|
194
|
+
const isStateChanging = isStateChangingCall({ abi, funcName });
|
|
246
195
|
|
|
247
196
|
if (isStateChanging) {
|
|
248
|
-
const
|
|
197
|
+
const createTx = getCreateContractTxObject({ provider, chain });
|
|
198
|
+
const { value, from, to, data } = await createTx({
|
|
249
199
|
contractAddress,
|
|
250
200
|
abi,
|
|
251
201
|
funcName,
|
|
@@ -262,14 +212,14 @@ export function getCtrlMethods(provider: BrowserProvider) {
|
|
|
262
212
|
} as any,
|
|
263
213
|
]);
|
|
264
214
|
}
|
|
265
|
-
const contract = createContract(contractAddress, abi,
|
|
215
|
+
const contract = createContract(contractAddress, abi, provider);
|
|
266
216
|
|
|
267
217
|
const result = await contract[funcName]?.(...funcParams);
|
|
268
218
|
|
|
269
219
|
return typeof result?.hash === "string" ? result?.hash : result;
|
|
270
220
|
},
|
|
271
221
|
approve: async ({ assetAddress, spenderAddress, amount, from }: ApproveParams) => {
|
|
272
|
-
const { MAX_APPROVAL,
|
|
222
|
+
const { MAX_APPROVAL, getCreateContractTxObject, toHexString } = await import(
|
|
273
223
|
"@swapkit/toolboxes/evm"
|
|
274
224
|
);
|
|
275
225
|
const funcParams = [spenderAddress, BigInt(amount || MAX_APPROVAL)];
|
|
@@ -283,7 +233,8 @@ export function getCtrlMethods(provider: BrowserProvider) {
|
|
|
283
233
|
txOverrides,
|
|
284
234
|
};
|
|
285
235
|
|
|
286
|
-
const
|
|
236
|
+
const createTx = getCreateContractTxObject({ provider, chain });
|
|
237
|
+
const { value, to, data } = await createTx(functionCallParams);
|
|
287
238
|
|
|
288
239
|
return provider.send("eth_sendTransaction", [
|
|
289
240
|
{
|
|
@@ -3,23 +3,14 @@ import {
|
|
|
3
3
|
ChainToHexChainId,
|
|
4
4
|
type EVMChain,
|
|
5
5
|
EVMChains,
|
|
6
|
-
type EthereumWindowProvider,
|
|
7
6
|
WalletOption,
|
|
8
7
|
createWallet,
|
|
9
8
|
filterSupportedChains,
|
|
10
9
|
prepareNetworkSwitch,
|
|
11
10
|
switchEVMWalletNetwork,
|
|
12
11
|
} from "@swapkit/helpers";
|
|
13
|
-
import type { NonETHToolbox } from "@swapkit/toolboxes/evm";
|
|
14
12
|
import type { BrowserProvider, Eip1193Provider } from "ethers";
|
|
15
|
-
import { getWalletSupportedChains } from "../
|
|
16
|
-
|
|
17
|
-
declare const window: {
|
|
18
|
-
ethereum: EthereumWindowProvider;
|
|
19
|
-
trustwallet: EthereumWindowProvider;
|
|
20
|
-
coinbaseWalletExtension: EthereumWindowProvider;
|
|
21
|
-
braveSolana: any;
|
|
22
|
-
} & Window;
|
|
13
|
+
import { getWalletSupportedChains } from "../utils";
|
|
23
14
|
|
|
24
15
|
export type EVMWalletOptions =
|
|
25
16
|
| WalletOption.BRAVE
|
|
@@ -48,22 +39,27 @@ const getWalletForType = (
|
|
|
48
39
|
};
|
|
49
40
|
|
|
50
41
|
export const getWeb3WalletMethods = async ({
|
|
42
|
+
address,
|
|
51
43
|
walletProvider,
|
|
52
44
|
chain,
|
|
53
45
|
provider,
|
|
54
|
-
}: {
|
|
46
|
+
}: {
|
|
47
|
+
address: string;
|
|
48
|
+
walletProvider?: Eip1193Provider;
|
|
49
|
+
chain: EVMChain;
|
|
50
|
+
provider: BrowserProvider;
|
|
51
|
+
}) => {
|
|
55
52
|
if (!walletProvider) throw new Error("Requested web3 wallet is not installed");
|
|
56
|
-
const {
|
|
53
|
+
const { getEvmToolbox } = await import("@swapkit/toolboxes/evm");
|
|
57
54
|
|
|
58
55
|
const signer = await provider.getSigner();
|
|
59
|
-
|
|
60
|
-
const toolbox = getToolboxByChain(chain)({ provider, signer });
|
|
56
|
+
const toolbox = await getEvmToolbox(chain, { provider, signer });
|
|
61
57
|
|
|
62
58
|
if (chain !== Chain.Ethereum) {
|
|
63
59
|
const currentNetwork = await provider.getNetwork();
|
|
64
60
|
if (currentNetwork.chainId.toString() !== ChainToHexChainId[chain]) {
|
|
65
61
|
try {
|
|
66
|
-
const networkParams =
|
|
62
|
+
const networkParams = toolbox.getNetworkParams();
|
|
67
63
|
await switchEVMWalletNetwork(provider, chain, networkParams);
|
|
68
64
|
} catch (_error) {
|
|
69
65
|
throw new Error(`Failed to add/switch ${chain} network: ${chain}`);
|
|
@@ -71,7 +67,11 @@ export const getWeb3WalletMethods = async ({
|
|
|
71
67
|
}
|
|
72
68
|
}
|
|
73
69
|
|
|
74
|
-
return prepareNetworkSwitch
|
|
70
|
+
return prepareNetworkSwitch({
|
|
71
|
+
toolbox: { ...toolbox, getBalance: () => toolbox.getBalance(address) },
|
|
72
|
+
chain,
|
|
73
|
+
provider,
|
|
74
|
+
});
|
|
75
75
|
};
|
|
76
76
|
|
|
77
77
|
export const evmWallet = createWallet({
|
|
@@ -84,35 +84,26 @@ export const evmWallet = createWallet({
|
|
|
84
84
|
eip1193Provider?: Eip1193Provider,
|
|
85
85
|
) {
|
|
86
86
|
const filteredChains = filterSupportedChains({ chains, supportedChains, walletType });
|
|
87
|
-
const { getProvider } = await import("@swapkit/toolboxes/evm");
|
|
88
87
|
const { BrowserProvider } = await import("ethers");
|
|
89
88
|
|
|
90
89
|
await Promise.all(
|
|
91
90
|
filteredChains.map(async (chain) => {
|
|
92
91
|
if (walletType === WalletOption.EIP6963) {
|
|
93
92
|
if (!eip1193Provider) throw new Error("Missing provider");
|
|
93
|
+
|
|
94
94
|
const provider = new BrowserProvider(eip1193Provider, "any");
|
|
95
95
|
await provider.send("eth_requestAccounts", []);
|
|
96
96
|
const signer = await provider.getSigner();
|
|
97
97
|
const address = await signer.getAddress();
|
|
98
98
|
|
|
99
99
|
const walletMethods = await getWeb3WalletMethods({
|
|
100
|
+
address,
|
|
100
101
|
chain,
|
|
101
102
|
provider,
|
|
102
103
|
walletProvider: eip1193Provider,
|
|
103
104
|
});
|
|
104
105
|
|
|
105
|
-
|
|
106
|
-
walletMethods.getBalance(address, potentialScamFilter, getProvider(chain));
|
|
107
|
-
|
|
108
|
-
addChain({
|
|
109
|
-
...walletMethods,
|
|
110
|
-
address,
|
|
111
|
-
balance: [],
|
|
112
|
-
chain,
|
|
113
|
-
getBalance,
|
|
114
|
-
walletType,
|
|
115
|
-
});
|
|
106
|
+
addChain({ ...walletMethods, address, chain, walletType });
|
|
116
107
|
return;
|
|
117
108
|
}
|
|
118
109
|
|
|
@@ -122,26 +113,16 @@ export const evmWallet = createWallet({
|
|
|
122
113
|
const address = await signer.getAddress();
|
|
123
114
|
|
|
124
115
|
const walletMethods = await getWeb3WalletMethods({
|
|
116
|
+
address,
|
|
125
117
|
chain,
|
|
126
118
|
walletProvider: getWalletForType(walletType),
|
|
127
119
|
provider: web3provider,
|
|
128
120
|
});
|
|
129
121
|
|
|
130
|
-
const getBalance = (potentialScamFilter = true) =>
|
|
131
|
-
walletMethods.getBalance(address, potentialScamFilter, getProvider(chain));
|
|
132
|
-
|
|
133
122
|
const disconnect = () =>
|
|
134
123
|
web3provider.send("wallet_revokePermissions", [{ eth_accounts: {} }]);
|
|
135
124
|
|
|
136
|
-
addChain({
|
|
137
|
-
...walletMethods,
|
|
138
|
-
address,
|
|
139
|
-
balance: [],
|
|
140
|
-
chain,
|
|
141
|
-
disconnect,
|
|
142
|
-
getBalance,
|
|
143
|
-
walletType,
|
|
144
|
-
});
|
|
125
|
+
addChain({ ...walletMethods, address, chain, disconnect, walletType });
|
|
145
126
|
}),
|
|
146
127
|
);
|
|
147
128
|
|