@swapkit/helpers 4.4.5 → 4.5.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/api/index.cjs +2 -2
- package/dist/api/index.cjs.map +4 -4
- package/dist/api/index.js +2 -2
- package/dist/api/index.js.map +4 -4
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +10 -10
- package/dist/index.js +3 -3
- package/dist/index.js.map +10 -10
- package/dist/types/api/index.d.ts +247 -0
- package/dist/types/api/index.d.ts.map +1 -1
- package/dist/types/api/swapkitApi/endpoints.d.ts +247 -0
- package/dist/types/api/swapkitApi/endpoints.d.ts.map +1 -1
- package/dist/types/api/swapkitApi/types.d.ts +3 -1
- package/dist/types/api/swapkitApi/types.d.ts.map +1 -1
- package/dist/types/modules/assetValue.d.ts +6 -0
- package/dist/types/modules/assetValue.d.ts.map +1 -1
- package/dist/types/modules/bigIntArithmetics.d.ts.map +1 -1
- package/dist/types/modules/swapKitConfig.d.ts +63 -36
- package/dist/types/modules/swapKitConfig.d.ts.map +1 -1
- package/dist/types/modules/swapKitError.d.ts +20 -24
- package/dist/types/modules/swapKitError.d.ts.map +1 -1
- package/dist/types/types/wallet.d.ts +5 -1
- package/dist/types/types/wallet.d.ts.map +1 -1
- package/dist/types/utils/asset.d.ts +1 -1
- package/dist/types/utils/asset.d.ts.map +1 -1
- package/package.json +24 -12
- package/src/api/index.ts +9 -0
- package/src/api/midgard/endpoints.ts +348 -0
- package/src/api/midgard/types.ts +515 -0
- package/src/api/swapkitApi/endpoints.ts +242 -0
- package/src/api/swapkitApi/types.ts +624 -0
- package/src/api/thornode/endpoints.ts +105 -0
- package/src/api/thornode/types.ts +247 -0
- package/src/contracts.ts +1 -0
- package/src/index.ts +28 -0
- package/src/modules/__tests__/assetValue.test.ts +1637 -0
- package/src/modules/__tests__/bigIntArithmetics.test.ts +383 -0
- package/src/modules/__tests__/swapKitConfig.test.ts +425 -0
- package/src/modules/__tests__/swapKitNumber.test.ts +535 -0
- package/src/modules/assetValue.ts +532 -0
- package/src/modules/bigIntArithmetics.ts +363 -0
- package/src/modules/feeMultiplier.ts +80 -0
- package/src/modules/requestClient.ts +110 -0
- package/src/modules/swapKitConfig.ts +174 -0
- package/src/modules/swapKitError.ts +470 -0
- package/src/modules/swapKitNumber.ts +13 -0
- package/src/tokens.ts +1 -0
- package/src/types/commonTypes.ts +10 -0
- package/src/types/derivationPath.ts +11 -0
- package/src/types/errors/apiV1.ts +0 -0
- package/src/types/index.ts +5 -0
- package/src/types/quotes.ts +174 -0
- package/src/types/sdk.ts +38 -0
- package/src/types/wallet.ts +124 -0
- package/src/utils/__tests__/asset.test.ts +185 -0
- package/src/utils/__tests__/derivationPath.test.ts +16 -0
- package/src/utils/__tests__/explorerUrls.test.ts +59 -0
- package/src/utils/__tests__/memo.test.ts +99 -0
- package/src/utils/__tests__/others.test.ts +83 -0
- package/src/utils/__tests__/validators.test.ts +24 -0
- package/src/utils/asset.ts +395 -0
- package/src/utils/chains.ts +100 -0
- package/src/utils/derivationPath.ts +101 -0
- package/src/utils/explorerUrls.ts +32 -0
- package/src/utils/liquidity.ts +150 -0
- package/src/utils/memo.ts +102 -0
- package/src/utils/others.ts +62 -0
- package/src/utils/validators.ts +32 -0
- package/src/utils/wallets.ts +237 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { type Chain, getChainConfig } from "@swapkit/types";
|
|
2
|
+
import type { BrowserProvider, JsonRpcProvider } from "ethers";
|
|
3
|
+
import { SwapKitError } from "../modules/swapKitError";
|
|
4
|
+
import {
|
|
5
|
+
type EIP6963AnnounceProviderEvent,
|
|
6
|
+
type EIP6963Provider,
|
|
7
|
+
type EthereumWindowProvider,
|
|
8
|
+
type NetworkParams,
|
|
9
|
+
WalletOption,
|
|
10
|
+
} from "../types";
|
|
11
|
+
import { warnOnce } from "./others";
|
|
12
|
+
|
|
13
|
+
declare const window: {
|
|
14
|
+
ethereum: EthereumWindowProvider;
|
|
15
|
+
trustwallet: EthereumWindowProvider;
|
|
16
|
+
coinbaseWalletExtension: EthereumWindowProvider;
|
|
17
|
+
braveSolana: any;
|
|
18
|
+
bitkeep?: { ethereum: EthereumWindowProvider };
|
|
19
|
+
ctrl?: { ethereum: EthereumWindowProvider };
|
|
20
|
+
$onekey?: { ethereum: EthereumWindowProvider };
|
|
21
|
+
vultisig?: { ethereum: EthereumWindowProvider };
|
|
22
|
+
} & Window;
|
|
23
|
+
|
|
24
|
+
export function isWeb3Detected() {
|
|
25
|
+
return typeof window.ethereum !== "undefined";
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function isDetected(walletOption: WalletOption) {
|
|
29
|
+
return listWeb3EVMWallets().includes(walletOption);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function listWeb3EVMWallets() {
|
|
33
|
+
const metamaskEnabled = window?.ethereum && !window.ethereum?.isBraveWallet;
|
|
34
|
+
const ctrlEnabled = window?.ctrl || window?.ethereum?.__XDEFI;
|
|
35
|
+
const vultisigEnabled = window?.vultisig;
|
|
36
|
+
const braveEnabled = window?.ethereum?.isBraveWallet;
|
|
37
|
+
const trustEnabled = window?.ethereum?.isTrust || window?.trustwallet;
|
|
38
|
+
const coinbaseEnabled =
|
|
39
|
+
(window?.ethereum?.overrideIsMetaMask && window?.ethereum?.selectedProvider?.isCoinbaseWallet) ||
|
|
40
|
+
window?.coinbaseWalletExtension;
|
|
41
|
+
const bitgetEnabled = window?.bitkeep?.ethereum;
|
|
42
|
+
const onekeyEnabled = window?.$onekey?.ethereum;
|
|
43
|
+
|
|
44
|
+
const wallets = [];
|
|
45
|
+
if (metamaskEnabled) wallets.push(WalletOption.METAMASK);
|
|
46
|
+
if (ctrlEnabled) wallets.push(WalletOption.CTRL);
|
|
47
|
+
if (vultisigEnabled) wallets.push(WalletOption.VULTISIG);
|
|
48
|
+
if (braveEnabled) wallets.push(WalletOption.BRAVE);
|
|
49
|
+
if (trustEnabled) wallets.push(WalletOption.TRUSTWALLET_WEB);
|
|
50
|
+
if (coinbaseEnabled) wallets.push(WalletOption.COINBASE_WEB);
|
|
51
|
+
if (okxMobileEnabled()) wallets.push(WalletOption.OKX_MOBILE);
|
|
52
|
+
if (bitgetEnabled) wallets.push(WalletOption.BITGET);
|
|
53
|
+
if (onekeyEnabled) wallets.push(WalletOption.ONEKEY);
|
|
54
|
+
|
|
55
|
+
return wallets;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export async function switchEVMWalletNetwork(provider: BrowserProvider, chain: Chain, networkParams?: NetworkParams) {
|
|
59
|
+
const chainConfig = getChainConfig(chain);
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
await providerRequest({
|
|
63
|
+
method: "wallet_switchEthereumChain",
|
|
64
|
+
params: [{ chainId: chainConfig.chainIdHex }],
|
|
65
|
+
provider,
|
|
66
|
+
});
|
|
67
|
+
} catch (error) {
|
|
68
|
+
if (!networkParams) {
|
|
69
|
+
throw new SwapKitError("helpers_failed_to_switch_network", {
|
|
70
|
+
error: error,
|
|
71
|
+
reason: "networkParams not provided",
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
await addEVMWalletNetwork(provider, networkParams);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function filterSupportedChains<T extends string[]>({
|
|
79
|
+
chains,
|
|
80
|
+
supportedChains,
|
|
81
|
+
walletType,
|
|
82
|
+
}: {
|
|
83
|
+
chains: Chain[];
|
|
84
|
+
supportedChains: T;
|
|
85
|
+
walletType?: WalletOption;
|
|
86
|
+
}) {
|
|
87
|
+
const supported = chains.filter((chain) => !chain || supportedChains.includes(chain));
|
|
88
|
+
|
|
89
|
+
if (supported.length === 0) {
|
|
90
|
+
throw new SwapKitError("wallet_chain_not_supported", { chain: chains.join(", "), wallet: walletType });
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const unsupported = chains.filter((chain) => !supportedChains.includes(chain));
|
|
94
|
+
|
|
95
|
+
warnOnce({
|
|
96
|
+
condition: unsupported.length > 0,
|
|
97
|
+
id: `wallet_chain_not_supported_${walletType}`,
|
|
98
|
+
warning: `${walletType} wallet does not support the following chains: ${unsupported.join(
|
|
99
|
+
", ",
|
|
100
|
+
)}. These chains will be ignored.`,
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
return supported as T;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function wrapMethodWithNetworkSwitch<T extends (...args: any[]) => any>(
|
|
107
|
+
func: T,
|
|
108
|
+
provider: BrowserProvider,
|
|
109
|
+
chain: Chain,
|
|
110
|
+
) {
|
|
111
|
+
return (async (...args: any[]) => {
|
|
112
|
+
const { chainIdHex } = getChainConfig(chain);
|
|
113
|
+
if ((await provider.getNetwork()).chainId.toString() === chainIdHex) {
|
|
114
|
+
return func(...args);
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
await switchEVMWalletNetwork(provider, chain);
|
|
118
|
+
} catch (error) {
|
|
119
|
+
throw new SwapKitError({ errorKey: "helpers_failed_to_switch_network", info: { error } });
|
|
120
|
+
}
|
|
121
|
+
return func(...args);
|
|
122
|
+
}) as unknown as T;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function prepareNetworkSwitch<T extends Record<string, unknown>, M extends keyof T>({
|
|
126
|
+
toolbox,
|
|
127
|
+
chain,
|
|
128
|
+
provider = window.ethereum,
|
|
129
|
+
methodNames = [],
|
|
130
|
+
}: {
|
|
131
|
+
toolbox: T;
|
|
132
|
+
chain: Chain;
|
|
133
|
+
provider?: BrowserProvider | JsonRpcProvider;
|
|
134
|
+
methodNames?: M[];
|
|
135
|
+
}) {
|
|
136
|
+
const methodsToWrap = [
|
|
137
|
+
...methodNames,
|
|
138
|
+
"approve",
|
|
139
|
+
"approvedAmount",
|
|
140
|
+
"call",
|
|
141
|
+
"sendTransaction",
|
|
142
|
+
"transfer",
|
|
143
|
+
"isApproved",
|
|
144
|
+
"approvedAmount",
|
|
145
|
+
"EIP1193SendTransaction",
|
|
146
|
+
"getFeeData",
|
|
147
|
+
"broadcastTransaction",
|
|
148
|
+
"estimateCall",
|
|
149
|
+
"estimateGasLimit",
|
|
150
|
+
"estimateGasPrices",
|
|
151
|
+
"createContractTxObject",
|
|
152
|
+
] as M[];
|
|
153
|
+
const wrappedMethods = methodsToWrap.reduce((object, methodName) => {
|
|
154
|
+
if (!toolbox[methodName]) return object;
|
|
155
|
+
|
|
156
|
+
const method = toolbox[methodName];
|
|
157
|
+
|
|
158
|
+
if (typeof method !== "function") return object;
|
|
159
|
+
|
|
160
|
+
// @ts-expect-error
|
|
161
|
+
const wrappedMethod = wrapMethodWithNetworkSwitch(method, provider, chain);
|
|
162
|
+
|
|
163
|
+
// biome-ignore lint/performance/noAccumulatingSpread: valid use case
|
|
164
|
+
return { ...object, [methodName]: wrappedMethod };
|
|
165
|
+
}, {});
|
|
166
|
+
|
|
167
|
+
return { ...toolbox, ...wrappedMethods };
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function addEVMWalletNetwork(provider: BrowserProvider, networkParams: NetworkParams) {
|
|
171
|
+
return providerRequest({ method: "wallet_addEthereumChain", params: [networkParams], provider });
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export function addAccountsChangedCallback(callback: () => void) {
|
|
175
|
+
window.ethereum?.on("accountsChanged", () => callback());
|
|
176
|
+
window.ctrl?.ethereum.on("accountsChanged", () => callback());
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export function getETHDefaultWallet() {
|
|
180
|
+
const { isTrust, isBraveWallet, __XDEFI, overrideIsMetaMask, selectedProvider } = window?.ethereum || {};
|
|
181
|
+
if (isTrust) return WalletOption.TRUSTWALLET_WEB;
|
|
182
|
+
if (isBraveWallet) return WalletOption.BRAVE;
|
|
183
|
+
if (overrideIsMetaMask && selectedProvider?.isCoinbaseWallet) return WalletOption.COINBASE_WEB;
|
|
184
|
+
if (__XDEFI) WalletOption.CTRL;
|
|
185
|
+
if (window?.$onekey?.ethereum) return WalletOption.ONEKEY;
|
|
186
|
+
return WalletOption.METAMASK;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export function getEIP6963Wallets() {
|
|
190
|
+
const providers: EIP6963Provider[] = [];
|
|
191
|
+
|
|
192
|
+
function onAnnouncement(event: EIP6963AnnounceProviderEvent) {
|
|
193
|
+
if (providers.map((p) => p.info.uuid).includes(event.detail.info.uuid)) return;
|
|
194
|
+
providers.push(event.detail);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
window.addEventListener("eip6963:announceProvider", onAnnouncement);
|
|
198
|
+
window.dispatchEvent(new Event("eip6963:requestProvider"));
|
|
199
|
+
|
|
200
|
+
function removeEIP6963EventListener() {
|
|
201
|
+
window.removeEventListener("eip6963:announceProvider", onAnnouncement);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return { providers, removeEIP6963EventListener };
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export function okxMobileEnabled() {
|
|
208
|
+
const ua = navigator.userAgent;
|
|
209
|
+
const isIOS = /iphone|ipad|ipod|ios/i.test(ua);
|
|
210
|
+
const isAndroid = /android|XiaoMi|MiuiBrowser/i.test(ua);
|
|
211
|
+
const isMobile = isIOS || isAndroid;
|
|
212
|
+
const isOKApp = /OKApp/i.test(ua);
|
|
213
|
+
|
|
214
|
+
return isMobile && isOKApp;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export function providerRequest({
|
|
218
|
+
provider,
|
|
219
|
+
params,
|
|
220
|
+
method,
|
|
221
|
+
}: {
|
|
222
|
+
provider?: BrowserProvider;
|
|
223
|
+
params?: any;
|
|
224
|
+
method:
|
|
225
|
+
| "wallet_addEthereumChain"
|
|
226
|
+
| "wallet_switchEthereumChain"
|
|
227
|
+
| "eth_requestAccounts"
|
|
228
|
+
| "eth_sendTransaction"
|
|
229
|
+
| "eth_signTransaction";
|
|
230
|
+
}) {
|
|
231
|
+
if (!provider?.send) {
|
|
232
|
+
throw new SwapKitError("helpers_not_found_provider");
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const providerParams = params ? (Array.isArray(params) ? params : [params]) : [];
|
|
236
|
+
return provider.send(method, providerParams);
|
|
237
|
+
}
|