UNPKG

nimbus-bridge

Version:
175 lines 8.86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Bridge = void 0; const jsx_runtime_1 = require("react/jsx-runtime"); const react_1 = require("react"); const relay_kit_ui_1 = require("@reservoir0x/relay-kit-ui"); const sdk_react_core_1 = require("@dynamic-labs/sdk-react-core"); const ethereum_1 = require("@dynamic-labs/ethereum"); const solana_1 = require("@dynamic-labs/solana"); const bitcoin_1 = require("@dynamic-labs/bitcoin"); const eclipse_1 = require("@dynamic-labs/eclipse"); const sui_1 = require("@dynamic-labs/sui"); const relay_sdk_1 = require("@reservoir0x/relay-sdk"); const relay_bitcoin_wallet_adapter_1 = require("@reservoir0x/relay-bitcoin-wallet-adapter"); const relay_svm_wallet_adapter_1 = require("@reservoir0x/relay-svm-wallet-adapter"); const relay_sui_wallet_adapter_1 = require("@reservoir0x/relay-sui-wallet-adapter"); const walletFilter_1 = require("./context/walletFilter"); const dynamic_1 = require("./utils/dynamic"); const Bridge = ({ config }) => { (0, sdk_react_core_1.useDynamicEvents)("walletAdded", (newWallet) => { if (linkWalletPromise) { linkWalletPromise?.resolve((0, dynamic_1.convertToLinkedWallet)(newWallet)); setLinkWalletPromise(undefined); } }); const { setWalletFilter } = (0, walletFilter_1.useWalletFilter)(); const { setShowAuthFlow, primaryWallet } = (0, sdk_react_core_1.useDynamicContext)(); const _switchWallet = (0, sdk_react_core_1.useSwitchWallet)(); const { setShowLinkNewWalletModal } = (0, sdk_react_core_1.useDynamicModals)(); const userWallets = (0, sdk_react_core_1.useUserWallets)(); const wallets = (0, react_1.useRef)(); const switchWallet = (0, react_1.useRef)(); const [wallet, setWallet] = (0, react_1.useState)(); const [linkWalletPromise, setLinkWalletPromise] = (0, react_1.useState)(); const linkedWallets = (0, react_1.useMemo)(() => { const _wallets = userWallets.reduce((linkedWallets, wallet) => { linkedWallets.push((0, dynamic_1.convertToLinkedWallet)(wallet)); return linkedWallets; }, []); wallets.current = userWallets; return _wallets; }, [userWallets]); (0, react_1.useEffect)(() => { switchWallet.current = _switchWallet; }, [_switchWallet]); (0, react_1.useEffect)(() => { const adaptWallet = async () => { try { if (primaryWallet !== null) { let adaptedWallet; if ((0, ethereum_1.isEthereumWallet)(primaryWallet)) { const walletClient = await primaryWallet.getWalletClient(); adaptedWallet = (0, relay_sdk_1.adaptViemWallet)(walletClient); } else if ((0, bitcoin_1.isBitcoinWallet)(primaryWallet)) { const wallet = (0, dynamic_1.convertToLinkedWallet)(primaryWallet); adaptedWallet = (0, relay_bitcoin_wallet_adapter_1.adaptBitcoinWallet)(wallet.address, async (_address, _psbt, dynamicParams) => { try { // Request the wallet to sign the PSBT const response = await primaryWallet.signPsbt(dynamicParams); if (!response) { throw "Missing psbt response"; } return response.signedPsbt; } catch (e) { throw e; } }); } else if ((0, solana_1.isSolanaWallet)(primaryWallet) || (0, eclipse_1.isEclipseWallet)(primaryWallet)) { const connection = await primaryWallet.getConnection(); const signer = await primaryWallet.getSigner(); const _chainId = (0, eclipse_1.isEclipseWallet)(primaryWallet) ? 9286185 : 792703809; adaptedWallet = (0, relay_svm_wallet_adapter_1.adaptSolanaWallet)(primaryWallet.address, _chainId, connection, signer.signAndSendTransaction); } else if ((0, sui_1.isSuiWallet)(primaryWallet)) { const suiWallet = primaryWallet; const walletClient = await suiWallet.getWalletClient(); if (!walletClient) { throw "Unable to setup Sui wallet"; } adaptedWallet = (0, relay_sui_wallet_adapter_1.adaptSuiWallet)(suiWallet.address, 103665049, // @TODO: handle sui testnet walletClient, async (tx) => { const signedTransaction = await suiWallet.signTransaction(tx); const executionResult = await walletClient.executeTransactionBlock({ options: {}, signature: signedTransaction.signature, transactionBlock: signedTransaction.bytes, }); return executionResult; }); } setWallet(adaptedWallet); } else { setWallet(undefined); } } catch (e) { setWallet(undefined); } }; adaptWallet(); }, [primaryWallet, primaryWallet?.address]); return ((0, jsx_runtime_1.jsx)(relay_kit_ui_1.SwapWidget, { lockChainId: config.lockChainId, singleChainMode: false, supportedWalletVMs: config.supportedWalletVMs, wallet: wallet, multiWalletSupportEnabled: true, linkedWallets: linkedWallets, toToken: config.defaultToToken, fromToken: config.defaultFromToken, defaultAmount: config.defaultAmount, onAnalyticEvent: config.onAnalyticEvent, onLinkNewWallet: ({ chain, direction }) => { if (linkWalletPromise) { linkWalletPromise.reject(); setLinkWalletPromise(undefined); } if (chain?.vmType === "evm") { setWalletFilter("EVM"); } else if (chain?.id === 792703809) { setWalletFilter("SOL"); } else if (chain?.id === 8253038) { setWalletFilter("BTC"); } else if (chain?.id === 9286185) { setWalletFilter("ECLIPSE"); } else if (chain?.vmType === "suivm") { setWalletFilter("SUI"); } else { setWalletFilter(undefined); } const promise = new Promise((resolve, reject) => { setLinkWalletPromise({ resolve, reject, params: { chain, direction, }, }); }); setShowLinkNewWalletModal(true); return promise; }, onSetPrimaryWallet: async (address) => { //In some cases there's a race condition between connecting the wallet and having it available to switch to so we need to poll for it const maxAttempts = 20; let attemptCount = 0; const timer = setInterval(async () => { attemptCount++; const newPrimaryWallet = wallets.current?.find((wallet) => wallet.address === address || wallet.additionalAddresses.find((_address) => _address.address === address)); if (attemptCount >= maxAttempts) { clearInterval(timer); return; } if (!newPrimaryWallet || !switchWallet.current) { return; } try { await switchWallet.current(newPrimaryWallet?.id); clearInterval(timer); } catch (e) { } }, 200); }, onConnectWallet: () => { setShowAuthFlow(true); }, onFromTokenChange: (token) => console.log("From token changed to: ", token), onToTokenChange: (token) => console.log("To token changed to: ", token), onSwapError: (e, data) => { console.log("onSwapError Triggered", e, data); }, onSwapSuccess: (data) => { console.log("onSwapSuccess Triggered", data); } }, "swap-widget-multi-chain")); }; exports.Bridge = Bridge; exports.default = exports.Bridge; //# sourceMappingURL=Bridge.js.map