UNPKG

@enclavemoney/enclave-wallet-sdk

Version:

A simple enclave wallet SDK for React applications

749 lines (748 loc) 43.1 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.WalletProvider = exports.useWallet = void 0; var react_1 = __importStar(require("react")); var ui_1 = require("./ui"); var index_1 = __importDefault(require("../index")); var services_1 = require("../services/services"); var utils_1 = require("./utils"); // Add Bitcoin mainnet chain ID constant var BITCOIN_MAINNET_CHAIN_ID = 8253038; var WalletContext = (0, react_1.createContext)(null); var useWallet = function () { var context = (0, react_1.useContext)(WalletContext); if (!context) { throw new Error("useWallet must be used within a WalletProvider"); } return context; }; exports.useWallet = useWallet; var WalletProvider = function (_a) { var children = _a.children, sdkKey = _a.sdkKey; var _b = (0, react_1.useState)(null), walletSDK = _b[0], setWalletSDK = _b[1]; var _c = (0, react_1.useState)(false), isLoggedIn = _c[0], setIsLoggedIn = _c[1]; var _d = (0, react_1.useState)(null), username = _d[0], setUsername = _d[1]; var _e = (0, react_1.useState)(null), walletAddress = _e[0], setWalletAddress = _e[1]; var _f = (0, react_1.useState)(null), solanaAddress = _f[0], setSolanaAddress = _f[1]; var _g = (0, react_1.useState)(null), bitcoinWalletAddress = _g[0], setBitcoinWalletAddress = _g[1]; var _h = (0, react_1.useState)(null), balance = _h[0], setBalance = _h[1]; var _j = (0, react_1.useState)(false), showSwapModal = _j[0], setShowSwapModal = _j[1]; var _k = (0, react_1.useState)(null), swapParams = _k[0], setSwapParams = _k[1]; var _l = (0, react_1.useState)([]), tokenOptions = _l[0], setTokenOptions = _l[1]; var _m = (0, react_1.useState)(false), tokensLoading = _m[0], setTokensLoading = _m[1]; // Add new states for crypto balance functionality var _o = (0, react_1.useState)(null), cryptoBalance = _o[0], setCryptoBalance = _o[1]; var _p = (0, react_1.useState)(false), loading = _p[0], setLoading = _p[1]; var _q = (0, react_1.useState)(false), showActivity = _q[0], setShowActivity = _q[1]; var _r = (0, react_1.useState)(null), activity = _r[0], setActivity = _r[1]; var _s = (0, react_1.useState)(true), showMessagePopup = _s[0], setShowMessagePopup = _s[1]; var _t = (0, react_1.useState)("success"), messageType = _t[0], setMessageType = _t[1]; var _u = (0, react_1.useState)(null), transactionId = _u[0], setTransactionId = _u[1]; var refreshTokenOptions = function () { return __awaiter(void 0, void 0, void 0, function () { var response, error_1; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, 3, 4]); setTokensLoading(true); return [4 /*yield*/, (0, services_1.getAllTokens)(sdkKey)]; case 1: response = _a.sent(); if (response === null || response === void 0 ? void 0 : response.success) { setTokenOptions(response.tokens); } return [3 /*break*/, 4]; case 2: error_1 = _a.sent(); console.error("Error fetching token options:", error_1); return [3 /*break*/, 4]; case 3: setTokensLoading(false); return [7 /*endfinally*/]; case 4: return [2 /*return*/]; } }); }); }; var refreshBalance = function (showLoading) { if (showLoading === void 0) { showLoading = false; } return __awaiter(void 0, void 0, void 0, function () { var sdkInstance, balance_1, error_2; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 3, 4, 5]); if (showLoading) { setLoading(true); } sdkInstance = window.__walletSDKInstance; if (!sdkInstance) return [3 /*break*/, 2]; return [4 /*yield*/, sdkInstance.getUserCryptoBalance()]; case 1: balance_1 = _a.sent(); setCryptoBalance(balance_1); // Store balance in localStorage for persistence if (typeof window !== "undefined") { localStorage.setItem("enclave_crypto_balance", JSON.stringify(balance_1)); } _a.label = 2; case 2: return [3 /*break*/, 5]; case 3: error_2 = _a.sent(); console.error("Error fetching balance:", error_2); return [3 /*break*/, 5]; case 4: setLoading(false); return [7 /*endfinally*/]; case 5: return [2 /*return*/]; } }); }); }; // Initialize crypto balance from localStorage on mount (0, react_1.useEffect)(function () { if (typeof window !== "undefined") { var savedBalance = localStorage.getItem("enclave_crypto_balance"); if (savedBalance) { try { setCryptoBalance(JSON.parse(savedBalance)); } catch (error) { console.error("Error parsing saved balance:", error); } } } }, []); // Listen for storage changes to trigger balance refresh (0, react_1.useEffect)(function () { var handleStorageChange = function (e) { if (e.key === "enclave_wallet_login") { if (e.newValue) { refreshBalance(true); } else { setCryptoBalance(null); // Clear balance from localStorage when user logs out if (typeof window !== "undefined") { localStorage.removeItem("enclave_crypto_balance"); } } } }; if (typeof window !== "undefined") { window.addEventListener("storage", handleStorageChange); return function () { return window.removeEventListener("storage", handleStorageChange); }; } }, []); // Initial balance load (0, react_1.useEffect)(function () { if (typeof window !== "undefined") { var userSession = localStorage.getItem("enclave_wallet_login"); if (userSession) { refreshBalance(true); // Show loading on initial load } } }, [sdkKey]); // Balance polling effect (0, react_1.useEffect)(function () { if (typeof window !== "undefined") { var userSession = localStorage.getItem("enclave_wallet_login"); if (!userSession) return; var pollInterval_1 = setInterval(function () { refreshBalance(false); // Don't show loading during polling }, 10000); return function () { return clearInterval(pollInterval_1); }; } }, [sdkKey]); (0, react_1.useEffect)(function () { var _a, _b, _c, _d, _e, _f, _g, _h, _j; var sdk = new index_1.default(sdkKey); setWalletSDK(sdk); // Check initial state if (typeof window !== "undefined") { var saved = localStorage.getItem("enclave_wallet_login"); if (saved) { var parsed = JSON.parse(saved); setIsLoggedIn(true); setUsername(((_a = parsed.result) === null || _a === void 0 ? void 0 : _a.displayName) || ((_b = parsed.result) === null || _b === void 0 ? void 0 : _b.username) || null); setWalletAddress(((_d = (_c = parsed.result) === null || _c === void 0 ? void 0 : _c.wallet) === null || _d === void 0 ? void 0 : _d.scw_address) || null); setSolanaAddress(((_f = (_e = parsed.result) === null || _e === void 0 ? void 0 : _e.wallet) === null || _f === void 0 ? void 0 : _f.solana_program_wallet) || null); setBitcoinWalletAddress(((_j = (_h = (_g = parsed.result) === null || _g === void 0 ? void 0 : _g.wallet) === null || _h === void 0 ? void 0 : _h.bitcoin_wallet) === null || _j === void 0 ? void 0 : _j.native_segwit_address) || null); // Fetch initial balance } } }, [sdkKey]); var connect = function () { if (walletSDK) { walletSDK.openWalletModal(); } }; var disconnect = function () { if (walletSDK) { walletSDK.logout(); setIsLoggedIn(false); setUsername(null); setWalletAddress(null); setBalance(null); setCryptoBalance(null); // Clear balance from localStorage when user disconnects if (typeof window !== "undefined") { localStorage.removeItem("enclave_crypto_balance"); } } }; // Listen for session changes and update balance (0, react_1.useEffect)(function () { if (!walletSDK) return; var checkSession = function () { return __awaiter(void 0, void 0, void 0, function () { var saved, parsed; var _a, _b, _c, _d, _e, _f, _g, _h, _j; return __generator(this, function (_k) { if (typeof window !== "undefined") { saved = localStorage.getItem("enclave_wallet_login"); if (saved) { parsed = JSON.parse(saved); setIsLoggedIn(true); setUsername(((_a = parsed.result) === null || _a === void 0 ? void 0 : _a.displayName) || ((_b = parsed.result) === null || _b === void 0 ? void 0 : _b.username) || null); setWalletAddress(((_d = (_c = parsed.result) === null || _c === void 0 ? void 0 : _c.wallet) === null || _d === void 0 ? void 0 : _d.scw_address) || null); setSolanaAddress(((_f = (_e = parsed.result) === null || _e === void 0 ? void 0 : _e.wallet) === null || _f === void 0 ? void 0 : _f.solana_program_wallet) || null); setBitcoinWalletAddress(((_j = (_h = (_g = parsed.result) === null || _g === void 0 ? void 0 : _g.wallet) === null || _h === void 0 ? void 0 : _h.bitcoin_wallet) === null || _j === void 0 ? void 0 : _j.native_segwit_address) || null); // Fetch updated balance } else { setIsLoggedIn(false); setUsername(null); setWalletAddress(null); setBalance(null); setCryptoBalance(null); // Clear balance from localStorage when session is not found localStorage.removeItem("enclave_crypto_balance"); } } return [2 /*return*/]; }); }); }; // Check session every 1 seconds var interval = setInterval(checkSession, 1000); return function () { return clearInterval(interval); }; }, [walletSDK]); var swap = function (params) { if (!isLoggedIn) { connect(); return; } setSwapParams(params); setShowSwapModal(true); walletSDK === null || walletSDK === void 0 ? void 0 : walletSDK.openWalletModal(params); }; // Add initial token fetch (0, react_1.useEffect)(function () { refreshTokenOptions(); }, [sdkKey]); // Add token refresh on login/logout (0, react_1.useEffect)(function () { if (isLoggedIn) { refreshBalance(true); } else { setTokenOptions([]); } }, [isLoggedIn]); // Add quote calculation function var calculateQuote = function (params) { return __awaiter(void 0, void 0, void 0, function () { var sdkInstance, userName, userBalance, defaultBalance, userBalance, defaultBalance, metadata, error_3; var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; return __generator(this, function (_l) { switch (_l.label) { case 0: sdkInstance = window.__walletSDKInstance; if (!sdkInstance) { throw new Error("SDK instance not found"); } userName = sdkInstance.getUsername(); if (!userName) { throw new Error("User not logged in"); } console.log("params >>>>>>>>", params); _l.label = 1; case 1: _l.trys.push([1, 8, , 9]); if (!(params.fromToken.chainId === BITCOIN_MAINNET_CHAIN_ID)) return [3 /*break*/, 3]; return [4 /*yield*/, (0, services_1.getMultiFromBTCRelaySwapQuote)({ username: userName, amount: params.fromToken.amount, outputToken: params.toToken.tokenAddress, outputChainId: params.toToken.chainId, }, sdkKey)]; case 2: return [2 /*return*/, _l.sent()]; case 3: if (!(params.toToken.chainId === BITCOIN_MAINNET_CHAIN_ID)) return [3 /*break*/, 5]; userBalance = (_a = cryptoBalance === null || cryptoBalance === void 0 ? void 0 : cryptoBalance.data) === null || _a === void 0 ? void 0 : _a.find(function (token) { var _a; return (_a = token.chainIds) === null || _a === void 0 ? void 0 : _a.some(function (chain) { return chain.address.toLowerCase() === params.fromToken.tokenAddress.toLowerCase() && chain.chainId === params.fromToken.chainId; }); }); defaultBalance = [ { chainId: params.fromToken.chainId, address: params.fromToken.tokenAddress, balance: "0", }, ]; return [4 /*yield*/, (0, services_1.getMultiToBTCRelaySwapQuote)({ username: userName, userBalance: (userBalance === null || userBalance === void 0 ? void 0 : userBalance.chainIds) || defaultBalance, inputAmount: params.fromToken.amount, proMode: false, }, sdkKey)]; case 4: return [2 /*return*/, _l.sent()]; case 5: userBalance = (_b = cryptoBalance === null || cryptoBalance === void 0 ? void 0 : cryptoBalance.data) === null || _b === void 0 ? void 0 : _b.find(function (token) { var _a; return (_a = token.chainIds) === null || _a === void 0 ? void 0 : _a.some(function (chain) { return chain.address.toLowerCase() === params.fromToken.tokenAddress.toLowerCase() && chain.chainId === params.fromToken.chainId; }); }); defaultBalance = [ { chainId: params.fromToken.chainId, address: params.fromToken.tokenAddress, balance: "0", }, ]; metadata = { inputToken: { tokenName: ((_c = params.fromToken.metadata) === null || _c === void 0 ? void 0 : _c.tokenName) || "", tokenSymbol: ((_d = params.fromToken.metadata) === null || _d === void 0 ? void 0 : _d.tokenSymbol) || "", tokenAddress: params.fromToken.tokenAddress, decimals: ((_e = params.fromToken.metadata) === null || _e === void 0 ? void 0 : _e.decimals) || 0, logoURI: ((_f = params.fromToken.metadata) === null || _f === void 0 ? void 0 : _f.logoURI) || "", }, outputToken: { tokenName: ((_g = params.toToken.metadata) === null || _g === void 0 ? void 0 : _g.tokenName) || "", tokenSymbol: ((_h = params.toToken.metadata) === null || _h === void 0 ? void 0 : _h.tokenSymbol) || "", tokenAddress: params.toToken.tokenAddress, decimals: ((_j = params.toToken.metadata) === null || _j === void 0 ? void 0 : _j.decimals) || 0, logoURI: ((_k = params.toToken.metadata) === null || _k === void 0 ? void 0 : _k.logoURI) || "", }, }; return [4 /*yield*/, (0, services_1.getMultiRelaySwapQuote)({ username: userName, userBalance: (userBalance === null || userBalance === void 0 ? void 0 : userBalance.chainIds) || defaultBalance, outputToken: params.toToken.tokenAddress, outputChainId: params.toToken.chainId, inputAmount: params.fromToken.amount, proMode: false, metadata: metadata, }, sdkKey)]; case 6: return [2 /*return*/, _l.sent()]; case 7: return [3 /*break*/, 9]; case 8: error_3 = _l.sent(); console.error("Error calculating quote:", error_3); return [2 /*return*/, "Error calculating quote"]; case 9: return [2 /*return*/]; } }); }); }; // Add execute swap function var executeSwap = function (params) { return __awaiter(void 0, void 0, void 0, function () { var sdkInstance, userName, loadingToast, fromTokenDetails_1, toTokenDetails, fromTokenSearch, toTokenSearch, metadata, userBalance, defaultBalance, data, swapParams_1, swapInitiatedToast_1, multiTransactionId_1, pollTransactionStatus, error_4; var _a, _b, _c; return __generator(this, function (_d) { switch (_d.label) { case 0: sdkInstance = window.__walletSDKInstance; if (!sdkInstance) { throw new Error("SDK instance not found"); } userName = sdkInstance.getUsername(); if (!userName) { throw new Error("User not logged in"); } loadingToast = ui_1.toast.loading("Processing transaction..."); _d.label = 1; case 1: _d.trys.push([1, 18, , 19]); fromTokenDetails_1 = tokenOptions.find(function (token) { var _a; return (_a = token.chainIds) === null || _a === void 0 ? void 0 : _a.some(function (chain) { return chain.address.toLowerCase() === params.fromToken.tokenAddress.toLowerCase() && chain.chainId === params.fromToken.chainId; }); }); toTokenDetails = tokenOptions.find(function (token) { var _a; return (_a = token.chainIds) === null || _a === void 0 ? void 0 : _a.some(function (chain) { return chain.address.toLowerCase() === params.toToken.tokenAddress.toLowerCase() && chain.chainId === params.toToken.chainId; }); }); if (!!fromTokenDetails_1) return [3 /*break*/, 4]; if (!params.fromToken.metadata) return [3 /*break*/, 2]; fromTokenDetails_1 = { name: params.fromToken.metadata.tokenName, symbol: params.fromToken.metadata.tokenSymbol, decimals: params.fromToken.metadata.decimals, logoURI: params.fromToken.metadata.logoURI, chainIds: params.fromToken.metadata.chainIds.map(function (chain) { return ({ chainId: chain.chainId, address: chain.address, }); }), }; return [3 /*break*/, 4]; case 2: return [4 /*yield*/, (0, services_1.searchToken)(params.fromToken.tokenAddress, params.fromToken.chainId, sdkKey)]; case 3: fromTokenSearch = _d.sent(); if (fromTokenSearch === null || fromTokenSearch === void 0 ? void 0 : fromTokenSearch.success) { fromTokenDetails_1 = { name: fromTokenSearch.data.name, symbol: fromTokenSearch.data.symbol, decimals: fromTokenSearch.data.decimals, logoURI: fromTokenSearch.data.logoURI, chainIds: fromTokenSearch.data.chainIds.map(function (chain) { return ({ chainId: parseInt(chain.chainId), address: chain.address, }); }), }; } _d.label = 4; case 4: if (!!toTokenDetails) return [3 /*break*/, 7]; if (!params.toToken.metadata) return [3 /*break*/, 5]; toTokenDetails = { name: params.toToken.metadata.tokenName, symbol: params.toToken.metadata.tokenSymbol, decimals: params.toToken.metadata.decimals, logoURI: params.toToken.metadata.logoURI, chainIds: params.toToken.metadata.chainIds.map(function (chain) { return ({ chainId: chain.chainId, address: chain.address, }); }), }; return [3 /*break*/, 7]; case 5: return [4 /*yield*/, (0, services_1.searchToken)(params.toToken.tokenAddress, params.toToken.chainId, sdkKey)]; case 6: toTokenSearch = _d.sent(); if (toTokenSearch === null || toTokenSearch === void 0 ? void 0 : toTokenSearch.success) { toTokenDetails = { name: toTokenSearch.data.name, symbol: toTokenSearch.data.symbol, decimals: toTokenSearch.data.decimals, logoURI: toTokenSearch.data.logoURI, chainIds: toTokenSearch.data.chainIds.map(function (chain) { return ({ chainId: parseInt(chain.chainId), address: chain.address, }); }), }; } _d.label = 7; case 7: if (!fromTokenDetails_1 || !toTokenDetails) { throw new Error("Token details not found for " + params.fromToken.tokenAddress + " or " + params.toToken.tokenAddress); } metadata = { inputToken: { tokenName: fromTokenDetails_1.name, tokenSymbol: fromTokenDetails_1.symbol, tokenAddress: params.fromToken.tokenAddress, decimals: fromTokenDetails_1.decimals, logoURI: fromTokenDetails_1.logoURI || fromTokenDetails_1.icon || "", }, outputToken: { tokenName: toTokenDetails.name, tokenSymbol: toTokenDetails.symbol, tokenAddress: params.toToken.tokenAddress, decimals: toTokenDetails.decimals, logoURI: toTokenDetails.logoURI || toTokenDetails.icon || "", }, }; userBalance = (_a = cryptoBalance === null || cryptoBalance === void 0 ? void 0 : cryptoBalance.data) === null || _a === void 0 ? void 0 : _a.find(function (token) { var _a; return (_a = token.chainIds) === null || _a === void 0 ? void 0 : _a.some(function (chain) { var _a; return (_a = fromTokenDetails_1 === null || fromTokenDetails_1 === void 0 ? void 0 : fromTokenDetails_1.chainIds) === null || _a === void 0 ? void 0 : _a.some(function (tokenChain) { return tokenChain.address.toLowerCase() === chain.address.toLowerCase() && tokenChain.chainId === chain.chainId; }); }); }); defaultBalance = [ { chainId: params.fromToken.chainId, address: params.fromToken.tokenAddress, balance: "0", }, ]; data = void 0; if (!(params.fromToken.chainId === BITCOIN_MAINNET_CHAIN_ID)) return [3 /*break*/, 9]; return [4 /*yield*/, (0, services_1.executeFromBTCSwapFlow)({ username: userName, amount: params.fromToken.amount, outputToken: params.toToken.tokenAddress, outputChainId: params.toToken.chainId, metadata: metadata, }, sdkKey)]; case 8: data = _d.sent(); return [3 /*break*/, 17]; case 9: if (!(params.toToken.chainId === BITCOIN_MAINNET_CHAIN_ID)) return [3 /*break*/, 11]; return [4 /*yield*/, (0, services_1.executeToBTCSwapFlow)({ username: userName, userBalance: (userBalance === null || userBalance === void 0 ? void 0 : userBalance.chainIds) || defaultBalance, inputAmount: params.fromToken.amount, proMode: false, metadata: metadata, }, sdkKey)]; case 10: data = _d.sent(); return [3 /*break*/, 17]; case 11: swapParams_1 = { username: userName, userBalance: (userBalance === null || userBalance === void 0 ? void 0 : userBalance.chainIds) || defaultBalance, outputToken: params.toToken.tokenAddress, outputChainId: params.toToken.chainId, inputAmount: params.fromToken.amount, metadata: metadata, proMode: false, }; if (!(params.provider === utils_1.ProtocolProvider.BUNGEE)) return [3 /*break*/, 13]; return [4 /*yield*/, (0, services_1.executeBungeeSwapFlow)(swapParams_1, sdkKey)]; case 12: data = _d.sent(); return [3 /*break*/, 17]; case 13: if (!(params.provider === utils_1.ProtocolProvider.LIFI)) return [3 /*break*/, 15]; return [4 /*yield*/, (0, services_1.executeLiFiSwapFlow)(swapParams_1, sdkKey)]; case 14: data = _d.sent(); return [3 /*break*/, 17]; case 15: return [4 /*yield*/, (0, services_1.executeSwapFlow)(swapParams_1, sdkKey)]; case 16: data = _d.sent(); _d.label = 17; case 17: // Dismiss loading toast ui_1.toast.dismiss(loadingToast); if (((_b = data === null || data === void 0 ? void 0 : data.transactionDetails) === null || _b === void 0 ? void 0 : _b.overallStatus) === "PENDING" || ((_c = data === null || data === void 0 ? void 0 : data.transactionDetails) === null || _c === void 0 ? void 0 : _c.overallStatus) === "COMPLETED") { console.log("Transaction initiated:", data); swapInitiatedToast_1 = ui_1.toast.loading("Swap initiated..."); setActivity(data); multiTransactionId_1 = data.transactionDetails.multiTransactionId; pollTransactionStatus = function () { return __awaiter(void 0, void 0, void 0, function () { var isCompleted, attempts, maxAttempts, _loop_1; return __generator(this, function (_a) { switch (_a.label) { case 0: isCompleted = false; attempts = 0; maxAttempts = 60; _loop_1 = function () { var transactionInfo, status_1, successToastId_1, error_5; return __generator(this, function (_b) { switch (_b.label) { case 0: _b.trys.push([0, 3, , 4]); return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 5000); })]; case 1: _b.sent(); // Wait 5 seconds return [4 /*yield*/, (0, services_1.getTransactionInfo)(multiTransactionId_1, sdkKey)]; case 2: transactionInfo = _b.sent(); if (transactionInfo) { status_1 = transactionInfo.overallStatus; if (status_1 === "COMPLETED") { ui_1.toast.dismiss(swapInitiatedToast_1); successToastId_1 = ui_1.toast.success(react_1.default.createElement("div", { style: { display: "flex", alignItems: "center", gap: "12px", } }, react_1.default.createElement("span", null, "Transaction completed"), react_1.default.createElement("button", { onClick: function () { if (walletSDK) { // Store the transaction data in localStorage if (typeof window !== "undefined") { localStorage.setItem("enclave_transaction_data", JSON.stringify({ transactionId: multiTransactionId_1, })); } walletSDK.openWalletModal(); } ui_1.toast.dismiss(successToastId_1); }, style: { color: "white", borderRadius: "20px", padding: "4px 8px", fontSize: "13px", fontWeight: "500", cursor: "pointer", background: "black", border: "1px solid rgba(255, 255, 255, 0.33)", } }, "View")), { duration: 6000 }); isCompleted = true; // Refresh balance after successful completion refreshBalance(false); } else if (status_1 === "FAILED") { ui_1.toast.dismiss(swapInitiatedToast_1); ui_1.toast.error("Transaction failed"); isCompleted = true; } // If status is still PENDING, continue polling } attempts++; return [3 /*break*/, 4]; case 3: error_5 = _b.sent(); console.error("Error polling transaction status:", error_5); attempts++; return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }; _a.label = 1; case 1: if (!(!isCompleted && attempts < maxAttempts)) return [3 /*break*/, 3]; return [5 /*yield**/, _loop_1()]; case 2: _a.sent(); return [3 /*break*/, 1]; case 3: // If polling times out if (!isCompleted) { ui_1.toast.dismiss(swapInitiatedToast_1); ui_1.toast.error("Transaction status check timed out"); } return [2 /*return*/]; } }); }); }; // Start polling in background pollTransactionStatus(); } else { console.error("Transaction failed:", data); // Show error toast ui_1.toast.error("Transaction failed"); } return [2 /*return*/, data]; case 18: error_4 = _d.sent(); console.error("Error executing swap:", error_4); // Dismiss loading toast and show error toast ui_1.toast.dismiss(loadingToast); ui_1.toast.error("Transaction failed"); throw error_4; case 19: return [2 /*return*/]; } }); }); }; var value = { walletSDK: walletSDK, isLoggedIn: isLoggedIn, username: username, walletAddress: walletAddress, solanaAddress: solanaAddress, bitcoinWalletAddress: bitcoinWalletAddress, balance: balance, connect: connect, disconnect: disconnect, swap: swap, tokenOptions: tokenOptions, tokensLoading: tokensLoading, refreshTokenOptions: refreshTokenOptions, cryptoBalance: cryptoBalance, loading: loading, setLoading: setLoading, refreshBalance: refreshBalance, showActivity: showActivity, setShowActivity: setShowActivity, activity: activity, setActivity: setActivity, calculateQuote: calculateQuote, executeSwap: executeSwap, }; return (react_1.default.createElement(ui_1.ToastProvider, null, react_1.default.createElement(WalletContext.Provider, { value: value }, react_1.default.createElement("div", { style: { fontFamily: "Inter, sans-serif" } }, children)))); }; exports.WalletProvider = WalletProvider;