@sodax/wallet-sdk-react 1.1.0-beta-rc3 → 1.2.0-beta
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/README.md +1 -1
- package/dist/index.cjs +64 -29
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.mjs +67 -32
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/SodaxWalletProvider.tsx +17 -12
- package/src/hooks/useXAccount.ts +2 -2
- package/src/xchains/evm/EvmXService.ts +72 -28
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ A comprehensive React Wallet SDK tailored for the Sodax ecosystem that provides
|
|
|
12
12
|
- ICON Wallets: ✅ (Hana Wallet and other ICON-compatible extensions)
|
|
13
13
|
|
|
14
14
|
- Address and connection state management
|
|
15
|
-
- EVM (Arbitrum, Avalanche, Base, BSC, Optimism, Polygon, Sonic, HyperEVM, LightLink, Kaia) ✅
|
|
15
|
+
- EVM (Arbitrum, Avalanche, Base, BSC, Optimism, Polygon, Sonic, HyperEVM, LightLink, Ethereum, Redbelly, Kaia) ✅
|
|
16
16
|
- Sui ✅
|
|
17
17
|
- Solana ✅
|
|
18
18
|
- Stellar ✅
|
package/dist/index.cjs
CHANGED
|
@@ -197,7 +197,20 @@ var hyper = /* @__PURE__ */ viem.defineChain({
|
|
|
197
197
|
});
|
|
198
198
|
var createWagmiConfig = (config) => {
|
|
199
199
|
return wagmi.createConfig({
|
|
200
|
-
chains: [
|
|
200
|
+
chains: [
|
|
201
|
+
chains.mainnet,
|
|
202
|
+
chains.avalanche,
|
|
203
|
+
chains.arbitrum,
|
|
204
|
+
chains.base,
|
|
205
|
+
chains.bsc,
|
|
206
|
+
chains.sonic,
|
|
207
|
+
chains.optimism,
|
|
208
|
+
chains.polygon,
|
|
209
|
+
hyper,
|
|
210
|
+
chains.lightlinkPhoenix,
|
|
211
|
+
chains.kaia,
|
|
212
|
+
chains.redbellyMainnet
|
|
213
|
+
],
|
|
201
214
|
ssr: true,
|
|
202
215
|
transports: {
|
|
203
216
|
[chains.mainnet.id]: wagmi.http(config[types.ETHEREUM_MAINNET_CHAIN_ID]),
|
|
@@ -210,6 +223,7 @@ var createWagmiConfig = (config) => {
|
|
|
210
223
|
[chains.polygon.id]: wagmi.http(config[types.POLYGON_MAINNET_CHAIN_ID]),
|
|
211
224
|
[hyper.id]: wagmi.http(config[types.HYPEREVM_MAINNET_CHAIN_ID]),
|
|
212
225
|
[chains.lightlinkPhoenix.id]: wagmi.http(config[types.LIGHTLINK_MAINNET_CHAIN_ID]),
|
|
226
|
+
[chains.redbellyMainnet.id]: wagmi.http(config[types.REDBELLY_MAINNET_CHAIN_ID]),
|
|
213
227
|
[chains.kaia.id]: wagmi.http(config[types.KAIA_MAINNET_CHAIN_ID])
|
|
214
228
|
}
|
|
215
229
|
});
|
|
@@ -227,49 +241,71 @@ var EvmXService = class _EvmXService extends XService {
|
|
|
227
241
|
}
|
|
228
242
|
return _EvmXService.instance;
|
|
229
243
|
}
|
|
244
|
+
// get erc20 token balance in a chain (evm chain only)
|
|
245
|
+
async _getTokenBalance(address, chainId, tokenAddress) {
|
|
246
|
+
const publicClient = actions.getPublicClient(this.wagmiConfig, { chainId });
|
|
247
|
+
if (!publicClient) throw new Error("Public client not found");
|
|
248
|
+
const balance = await publicClient.readContract({
|
|
249
|
+
abi: viem.erc20Abi,
|
|
250
|
+
address: tokenAddress,
|
|
251
|
+
functionName: "balanceOf",
|
|
252
|
+
args: [address]
|
|
253
|
+
});
|
|
254
|
+
return balance || 0n;
|
|
255
|
+
}
|
|
256
|
+
//get native balance of the chain (evm chain only)
|
|
257
|
+
async _getChainBalance(address, chainId) {
|
|
258
|
+
const balance = await actions.getPublicClient(this.wagmiConfig, { chainId })?.getBalance({
|
|
259
|
+
address
|
|
260
|
+
});
|
|
261
|
+
return balance || 0n;
|
|
262
|
+
}
|
|
230
263
|
async getBalance(address, xToken) {
|
|
231
264
|
if (!address) return 0n;
|
|
232
265
|
if (!this.wagmiConfig) return 0n;
|
|
233
266
|
const chainId = getWagmiChainId(xToken.xChainId);
|
|
234
267
|
if (isNativeToken(xToken)) {
|
|
235
|
-
|
|
236
|
-
address
|
|
237
|
-
});
|
|
238
|
-
console.log("balance", balance);
|
|
239
|
-
return balance || 0n;
|
|
268
|
+
return this._getChainBalance(address, chainId);
|
|
240
269
|
}
|
|
241
270
|
throw new Error(`Unsupported token: ${xToken.symbol}`);
|
|
242
271
|
}
|
|
243
272
|
async getBalances(address, xTokens) {
|
|
244
273
|
if (!address) return {};
|
|
245
274
|
if (!this.wagmiConfig) return {};
|
|
246
|
-
const
|
|
275
|
+
const nativeTokenBalancePromises = xTokens.filter((xToken) => isNativeToken(xToken)).map(async (xToken) => {
|
|
247
276
|
const balance = await this.getBalance(address, xToken);
|
|
248
277
|
return { symbol: xToken.symbol, address: xToken.address, balance };
|
|
249
278
|
});
|
|
250
|
-
const
|
|
251
|
-
const tokenMap =
|
|
279
|
+
const nativeTokenBalances = await Promise.all(nativeTokenBalancePromises);
|
|
280
|
+
const tokenMap = nativeTokenBalances.reduce((map, { address: address2, balance }) => {
|
|
252
281
|
if (balance) map[address2] = balance;
|
|
253
282
|
return map;
|
|
254
283
|
}, {});
|
|
255
284
|
const nonNativeXTokens = xTokens.filter((xToken) => !isNativeToken(xToken));
|
|
256
285
|
const xChainId = xTokens[0].xChainId;
|
|
257
|
-
const
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
286
|
+
const viemChain = this.wagmiConfig.chains.find((chain) => chain.id === getWagmiChainId(xChainId));
|
|
287
|
+
const chainId = getWagmiChainId(xChainId);
|
|
288
|
+
const publicClient = actions.getPublicClient(this.wagmiConfig, { chainId });
|
|
289
|
+
if (!publicClient) throw new Error("Public client not found");
|
|
290
|
+
if (viemChain?.contracts?.multicall3) {
|
|
291
|
+
const result = await publicClient.multicall({
|
|
292
|
+
contracts: nonNativeXTokens.map((token) => ({
|
|
293
|
+
abi: viem.erc20Abi,
|
|
294
|
+
address: token.address,
|
|
295
|
+
functionName: "balanceOf",
|
|
296
|
+
args: [address]
|
|
297
|
+
}))
|
|
298
|
+
});
|
|
299
|
+
return nonNativeXTokens.reduce((acc, token, index) => {
|
|
300
|
+
acc[token.address] = result?.[index]?.result?.toString() || "0";
|
|
301
|
+
return acc;
|
|
302
|
+
}, tokenMap);
|
|
303
|
+
}
|
|
304
|
+
const nonNativeTokenBalances = await Promise.all(
|
|
305
|
+
nonNativeXTokens.map((token) => this._getTokenBalance(address, chainId, token.address))
|
|
306
|
+
);
|
|
307
|
+
return nonNativeXTokens.reduce((acc, token, idx) => {
|
|
308
|
+
acc[token.address] = nonNativeTokenBalances[idx] || "0";
|
|
273
309
|
return acc;
|
|
274
310
|
}, tokenMap);
|
|
275
311
|
}
|
|
@@ -907,7 +943,7 @@ function useXConnection(xChainType) {
|
|
|
907
943
|
|
|
908
944
|
// src/hooks/useXAccount.ts
|
|
909
945
|
function isChainType(chainIdentifier) {
|
|
910
|
-
return
|
|
946
|
+
return types.ChainTypeArr.includes(chainIdentifier);
|
|
911
947
|
}
|
|
912
948
|
function useXAccount(chainIdentifier) {
|
|
913
949
|
const resolvedChainType = chainIdentifier ? isChainType(chainIdentifier) ? chainIdentifier : getXChainType(chainIdentifier) : void 0;
|
|
@@ -1409,14 +1445,13 @@ var reconnectStellar = async () => {
|
|
|
1409
1445
|
}
|
|
1410
1446
|
});
|
|
1411
1447
|
};
|
|
1412
|
-
|
|
1413
|
-
// src/SodaxWalletProvider.tsx
|
|
1448
|
+
var queryClient = new reactQuery.QueryClient();
|
|
1414
1449
|
var SodaxWalletProvider = ({ children, rpcConfig }) => {
|
|
1415
1450
|
const wagmiConfig = React2.useMemo(() => {
|
|
1416
1451
|
return createWagmiConfig(rpcConfig);
|
|
1417
1452
|
}, [rpcConfig]);
|
|
1418
1453
|
const wallets = React2.useMemo(() => [new walletAdapterWallets.UnsafeBurnerWalletAdapter()], []);
|
|
1419
|
-
return /* @__PURE__ */ React2__default.default.createElement(wagmi.WagmiProvider, { config: wagmiConfig }, /* @__PURE__ */ React2__default.default.createElement(dappKit.SuiClientProvider, { networks: { mainnet: { url: client.getFullnodeUrl("mainnet") } }, defaultNetwork: "mainnet" }, /* @__PURE__ */ React2__default.default.createElement(dappKit.WalletProvider, { autoConnect: true }, /* @__PURE__ */ React2__default.default.createElement(walletAdapterReact.ConnectionProvider, { endpoint: rpcConfig["solana"] ?? "" }, /* @__PURE__ */ React2__default.default.createElement(walletAdapterReact.WalletProvider, { wallets, autoConnect: true }, /* @__PURE__ */ React2__default.default.createElement(Hydrate, null), children)))));
|
|
1454
|
+
return /* @__PURE__ */ React2__default.default.createElement(reactQuery.QueryClientProvider, { client: queryClient }, /* @__PURE__ */ React2__default.default.createElement(wagmi.WagmiProvider, { config: wagmiConfig }, /* @__PURE__ */ React2__default.default.createElement(dappKit.SuiClientProvider, { networks: { mainnet: { url: client.getFullnodeUrl("mainnet") } }, defaultNetwork: "mainnet" }, /* @__PURE__ */ React2__default.default.createElement(dappKit.WalletProvider, { autoConnect: true }, /* @__PURE__ */ React2__default.default.createElement(walletAdapterReact.ConnectionProvider, { endpoint: rpcConfig["solana"] ?? "" }, /* @__PURE__ */ React2__default.default.createElement(walletAdapterReact.WalletProvider, { wallets, autoConnect: true }, /* @__PURE__ */ React2__default.default.createElement(Hydrate, null), children))))));
|
|
1420
1455
|
};
|
|
1421
1456
|
reconnectIcon();
|
|
1422
1457
|
reconnectStellar();
|