nimbus-bridge
Version:
175 lines • 8.86 kB
JavaScript
;
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