Search
Search

Transaction: 7MRPswq...PRy8

Signed by
Receiver
Status
Succeeded
Transaction Fee
0.00202 
Deposit Value
0.00035 
Gas Used
20 Tgas
Attached Gas
300 Tgas
Created
April 19, 2024 at 3:57:01am
Hash
7MRPswqPzwFtVmmigd57aYF64BRx6Y9Zh9t4sZYQPRy8

Actions

Called method: 'set' in contract: social.near
Arguments:
{ "data": { "bluebiu.near": { "widget": { "Lending.Pac": { "": "const Wrap = styled.div`\n padding: 24px 15px;\n /* background: #0e0e26; */\n min-height: 100vh;\n color: white;\n font-family: Gantari;\n`;\n\nconst FlexContainer = styled.div``;\n\nconst ChainsWrap = styled.div`\n display: flex;\n justify-content: flex-end;\n`;\nconst Yours = styled.div`\n display: flex;\n gap: 20px;\n margin-top: 16px;\n`;\nconst YoursTableWrapper = styled.div`\n background-color: rgba(53, 55, 73, 0.2);\n border-radius: 6px;\n width: 50%;\n`;\nconst Title = styled.div`\n padding: 10px 20px 0;\n /* border-bottom: 1px solid #292c42; */\n`;\nconst SubTitle = styled.div`\n display: flex;\n align-items: center;\n`;\nconst Label = styled.div`\n color: #979abe;\n font-size: 16px;\n font-weight: 400;\n margin-right: 5px;\n`;\nconst Value = styled.div`\n color: #fff;\n font-size: 16px;\n font-weight: 500;\n margin-right: 15px;\n`;\n\nconst ROUND_DOWN = 0;\nconst NATIVE_SYMBOL_ADDRESS_MAP_KEY = \"0x0\";\nconst ACTUAL_BORROW_AMOUNT_RATE = 0.99;\n\nconst account = Ethers.send(\"eth_requestAccounts\", [])[0];\nconst {\n CHAIN_LIST,\n curChain,\n onSwitchChain,\n GAS_LIMIT_RECOMMENDATIONS,\n chainId,\n prices,\n multicallAddress,\n multicall,\n isChainSupported,\n switchingChain,\n dexConfig,\n theme,\n toast,\n addAction,\n} = props;\nconst { CONTRACT_ABI } = dexConfig;\nconsole.log(\"PROPS: \", props);\n\nfunction isValid(a) {\n if (!a) return false;\n if (isNaN(Number(a))) return false;\n if (a === \"\") return false;\n return true;\n}\n\nfunction getGasPrice() {\n return Ethers.provider().getGasPrice();\n}\n\nfunction gasEstimation(action) {\n const assetsToSupply = state.assetsToSupply;\n if (!assetsToSupply) {\n return \"-\";\n }\n const baseAsset = assetsToSupply.find(\n (asset) => asset.symbol === config.nativeCurrency.symbol\n );\n if (!baseAsset) {\n return \"-\";\n }\n\n const { tokenPrice, decimals } = baseAsset;\n return getGasPrice()\n .then((gasPrice) => {\n const gasLimit = GAS_LIMIT_RECOMMENDATIONS[action].limit;\n // console.log(\"gasPrice--\", gasPrice);\n return Big(gasPrice.toString())\n .mul(gasLimit)\n .div(Big(10).pow(decimals))\n .mul(tokenPrice)\n .toFixed(2);\n })\n .catch((err) => {\n console.log(\"gasEstimation error\");\n });\n}\n\nfunction depositETHGas() {\n return gasEstimation(\"deposit\");\n}\n\nfunction depositERC20Gas() {\n return gasEstimation(\"supplyWithPermit\");\n}\n\nfunction withdrawETHGas() {\n return gasEstimation(\"withdrawETH\");\n}\n\nfunction withdrawERC20Gas() {\n return gasEstimation(\"withdraw\");\n}\n\nfunction borrowETHGas() {\n return gasEstimation(\"borrowETH\");\n}\n\nfunction borrowERC20Gas() {\n return gasEstimation(\"borrow\");\n}\n\nfunction repayETHGas() {\n return gasEstimation(\"repay\");\n}\n\nfunction repayERC20Gas() {\n return gasEstimation(\"repayWithPermit\");\n}\nfunction formatNumber(value, digits) {\n if (Big(value).eq(0)) return `$ 0`;\n return Big(value || 0).lt(0.01)\n ? \"< $0.01\"\n : `$ ${Number(value).toFixed(digits || 2)}`;\n}\n\n// App config\nfunction getConfig() {\n const abis = {\n wrappedTokenGatewayV3ABI: fetch(CONTRACT_ABI.wrappedTokenGatewayV3ABI),\n erc20Abi: fetch(CONTRACT_ABI.erc20Abi),\n aavePoolV3ABI: fetch(CONTRACT_ABI.aavePoolV3ABI),\n variableDebtTokenABI: fetch(CONTRACT_ABI.variableDebtTokenABI),\n walletBalanceProviderABI: fetch(CONTRACT_ABI.walletBalanceProviderABI),\n };\n\n const constants = {\n FIXED_LIQUIDATION_VALUE: \"1.0\",\n MAX_UINT_256:\n \"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\",\n AAVE_API_BASE_URL: \"https://aave-data-service-7a85eea3aebe.herokuapp.com\",\n };\n\n return {\n ...dexConfig.config,\n ...abis,\n ...constants,\n };\n}\n\nconst config = getConfig();\n// console.log(\"CONFIG: \", config);\n\nconst markets = dexConfig?.rawMarkets?.map((item) => ({\n ...item,\n tokenPrice: prices[item.symbol],\n}));\n\nconst underlyingTokens = dexConfig?.rawMarkets?.map(\n (market) => market.underlyingAsset\n);\n\n// App states\nState.init({\n imports: {},\n\n showWithdrawModal: false,\n showSupplyModal: false,\n showRepayModal: false,\n showBorrowModal: false,\n\n threshold: 1,\n assetsToSupply: markets,\n yourSupplies: undefined,\n yourBorrows: undefined,\n netWorthUSD: \"\",\n netAPY: \"\",\n healthFactor: \"\",\n availableBorrowsUSD: \"\",\n\n selectTab: \"MARKET\", // MARKET | YOURS\n fresh: 0, // fresh rewards\n yourSupplyApy: 0,\n yourBorrowApy: 0,\n yourTotalCollateral: 0,\n\n BlastPoints: 0,\n BlastGold: 0,\n\n emissionPerSeconds: [],\n aTokenTotal: [],\n debtTotal: [],\n\n updater: 0,\n});\n\nuseEffect(() => {\n State.update({\n assetsToSupply: markets,\n });\n}, [markets]);\n\nfunction calcAvailableBorrows(availableBorrowsUSD, tokenPrice) {\n let r =\n isValid(availableBorrowsUSD) && isValid(tokenPrice)\n ? Big(availableBorrowsUSD || 0)\n .div(tokenPrice)\n .toFixed()\n : Number(0).toFixed();\n\n return r;\n}\n\nfunction bigMin(_a, _b) {\n const a = Big(_a || 0);\n const b = Big(_b || 0);\n return a.gt(b) ? b : a;\n}\n\nfunction formatHealthFactor(hf) {\n try {\n if (hf === \"∞\") return hf;\n\n if (!hf || !isValid(hf)) return \"-\";\n\n if (Big(hf).gt(10000)) return \"∞\";\n if (Number(hf) === -1) return \"∞\";\n return Big(hf).toFixed(2, ROUND_DOWN);\n } catch (error) {\n console.log(\"CATCH_formatHealthFactor:\", error);\n }\n}\n\nfunction calcHealthFactor(type, symbol, amount) {\n // console.log(\n // \"calcHealthFactor\",\n // type,\n // symbol,\n // amount,\n // isValid(state.yourTotalCollateral),\n // isValid(state.yourTotalBorrow),\n // isValid(amount)\n // );\n if (\n // !isValid(state.yourTotalCollateral) ||\n // !isValid(state.yourTotalBorrow) ||\n isNaN(Number(state.yourTotalCollateral)) ||\n isNaN(Number(state.yourTotalBorrow)) ||\n !isValid(amount)\n )\n return \"-\";\n let newHealthFactor;\n let totalCollateral = Big(state.yourTotalCollateral);\n let totalBorrows = Big(state.yourTotalBorrow);\n\n const assetsUSD = Big(prices[symbol]).times(Big(amount));\n if (type === \"SUPPLY\") {\n totalCollateral = Big(state.yourTotalCollateral).plus(assetsUSD);\n }\n if (type === \"INC_COLLATERAL\") {\n totalCollateral = Big(state.yourTotalCollateral).plus(assetsUSD);\n }\n if (type === \"WITHDRAW\") {\n totalCollateral = Big(state.yourTotalCollateral).minus(assetsUSD);\n }\n if (type === \"DEC_COLLATERAL\") {\n totalCollateral = Big(state.yourTotalCollateral).minus(assetsUSD);\n }\n if (type === \"BORROW\") {\n totalBorrows = Big(state.yourTotalBorrow).plus(assetsUSD);\n }\n if (type === \"REPAY\") {\n totalBorrows = Big(state.yourTotalBorrow).minus(assetsUSD);\n }\n if (totalBorrows.eq(0)) return \"∞\";\n newHealthFactor = totalCollateral\n .times(Big(state.threshold))\n .div(totalBorrows);\n\n console.log(\"calcHealthFactor--\", newHealthFactor);\n return newHealthFactor.toFixed(2);\n}\n\nfunction batchBalanceOf(chainId, userAddress, tokenAddresses, abi) {\n const balanceProvider = new ethers.Contract(\n config.balanceProviderAddress,\n abi.body,\n Ethers.provider().getSigner()\n );\n\n return balanceProvider.batchBalanceOf([userAddress], tokenAddresses);\n}\n\nfunction getLiquidity() {\n const aTokenAddresss = markets?.map((item) => item.aTokenAddress);\n const variableDebtTokenAddresss = markets?.map(\n (item) => item.variableDebtTokenAddress\n );\n\n const calls = aTokenAddresss\n .map((addr) => ({\n address: addr,\n name: \"totalSupply\",\n }))\n .concat(\n variableDebtTokenAddresss?.map((addr) => ({\n address: addr,\n name: \"totalSupply\",\n }))\n );\n\n multicall({\n abi: [\n {\n inputs: [],\n name: \"totalSupply\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n try {\n console.log(\"getLiquidity_res\", res);\n const l = res.length;\n const aTokenTotal = res.slice(0, l / 2);\n const debtTotal = res.slice(l / 2);\n\n const _assetsToSupply = [...state.assetsToSupply];\n for (let i = 0; i < _assetsToSupply.length; i++) {\n const liquidityAmount = Big(aTokenTotal[i] || 0)\n .minus(Big(debtTotal[i] || 0))\n .toFixed();\n console.log(\n liquidityAmount,\n prices[_assetsToSupply[i].symbol],\n _assetsToSupply[i]\n );\n _assetsToSupply[i].availableLiquidity = liquidityAmount;\n const _availableLiquidityUSD = Big(\n ethers.utils.formatUnits(\n liquidityAmount,\n _assetsToSupply[i].decimals\n )\n )\n .mul(Big(prices[_assetsToSupply[i].symbol] || 0))\n .toFixed();\n console.log(_availableLiquidityUSD);\n _assetsToSupply[i].availableLiquidityUSD = _availableLiquidityUSD;\n\n const _availableBorrowsUSD = bigMin(\n state.availableBorrowsUSD,\n ethers.utils.formatUnits(\n liquidityAmount,\n _assetsToSupply[i].decimals\n )\n )\n .times(ACTUAL_BORROW_AMOUNT_RATE)\n .toFixed();\n console.log(_availableBorrowsUSD);\n const availableBorrows = calcAvailableBorrows(\n _availableBorrowsUSD,\n _assetsToSupply[i].tokenPrice\n );\n console.log(availableBorrows);\n _assetsToSupply[i].availableBorrowsUSD = _availableBorrowsUSD;\n _assetsToSupply[i].availableBorrows = availableBorrows;\n }\n State.update({\n assetsToSupply: _assetsToSupply,\n aTokenTotal,\n debtTotal,\n });\n } catch (error) {\n console.log(\"catch getLiquidity\", error);\n }\n })\n .catch((err) => {\n console.log(\"getLiquidity_err\", err);\n });\n}\n\nfunction getUserPoints() {\n const params = JSON.stringify({ address: account });\n asyncFetch(`/pac?path=blastpoint&params=${params}`)\n .then((res) => {\n if (res.status === 200) {\n const { blastGold, blastPoint, details } = res.body.data;\n\n const _assetsToSupply = [...state.assetsToSupply];\n for (let i = 0; i < details.length; i++) {\n let asset = _assetsToSupply.find(\n (item) =>\n item.symbol.toLowerCase() === details[i].token.toLowerCase()\n );\n\n asset.blastPoint = details[i].points;\n asset.blastGold = details[i].gold;\n }\n\n State.update({\n assetsToSupply: _assetsToSupply,\n BlastPoints: blastPoint,\n BlastGold: blastGold,\n });\n }\n })\n .catch((error) => {\n console.log(\"getUserPoints_error:\", error);\n });\n}\n\n// update data in async manner\nfunction getUserBalance() {\n // check abi loaded\n if (\n Object.keys(CONTRACT_ABI)\n ?.map((key) => config[key])\n .filter((ele) => !!ele).length !== Object.keys(CONTRACT_ABI).length\n ) {\n return;\n }\n const provider = Ethers.provider();\n provider\n .getSigner()\n ?.getBalance()\n .then((balance) => {\n return balance;\n })\n .then((baseAssetBalance) => {\n // get user balances\n batchBalanceOf(\n chainId,\n account,\n markets?.map((market) => market.underlyingAsset),\n config.walletBalanceProviderABI\n )\n .then((balances) => {\n return balances?.map((balance) => balance.toString());\n })\n .then((userBalances) => {\n console.log(\"getUserBalance--\", userBalances);\n const _assetsToSupply = [...state.assetsToSupply];\n for (let index = 0; index < _assetsToSupply.length; index++) {\n const item = _assetsToSupply[index];\n const _bal =\n item.symbol === config.nativeCurrency.symbol\n ? baseAssetBalance\n : userBalances[index];\n const balanceRaw = Big(_bal || 0).div(Big(10).pow(item.decimals));\n const _balance = balanceRaw.toFixed(item.decimals, ROUND_DOWN);\n\n const _balanceInUSD = balanceRaw\n .times(Big(item.tokenPrice || 0))\n .toFixed();\n\n item.balance = _balance;\n item.balanceInUSD = _balanceInUSD;\n }\n\n State.update({\n assetsToSupply: _assetsToSupply,\n });\n })\n\n .catch((err) => {\n console.log(\"batchBalanceOfERROR:\", err);\n });\n });\n}\n\nfunction onActionSuccess({ msg, callback }) {\n console.log(\"onActionSuccess--\");\n // update data if action finishes\n getUserBalance();\n\n State.update({\n updater: state.updater + 1,\n });\n // update UI after data has almost loaded\n setTimeout(() => {\n if (callback) {\n callback();\n }\n if (msg) {\n State.update({ alertModalText: msg });\n }\n }, 5000);\n}\n\nfunction getPoolDataProvider() {\n const underlyingTokens = dexConfig?.rawMarkets?.map(\n (market) => market.underlyingAsset\n );\n // console.log(\"getPoolDataProvider--\", underlyingTokens);\n const calls = underlyingTokens?.map((addr) => ({\n address: config.PoolDataProvider,\n name: \"getReserveData\",\n params: [addr],\n }));\n\n multicall({\n abi: [\n {\n inputs: [{ internalType: \"address\", name: \"asset\", type: \"address\" }],\n name: \"getReserveData\",\n outputs: [\n { internalType: \"uint256\", name: \"unbacked\", type: \"uint256\" },\n {\n internalType: \"uint256\",\n name: \"accruedToTreasuryScaled\",\n type: \"uint256\",\n },\n { internalType: \"uint256\", name: \"totalAToken\", type: \"uint256\" },\n {\n internalType: \"uint256\",\n name: \"totalStableDebt\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"totalVariableDebt\",\n type: \"uint256\",\n },\n { internalType: \"uint256\", name: \"liquidityRate\", type: \"uint256\" },\n {\n internalType: \"uint256\",\n name: \"variableBorrowRate\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"stableBorrowRate\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"averageStableBorrowRate\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"liquidityIndex\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"variableBorrowIndex\",\n type: \"uint256\",\n },\n {\n internalType: \"uint40\",\n name: \"lastUpdateTimestamp\",\n type: \"uint40\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n console.log(\"getPoolDataProvider_res\", res);\n return res;\n })\n .then((poolData) => {\n console.log(\"CALC APY\");\n if (!Array.isArray(poolData) || !poolData.length) return;\n\n const _assetsToSupply = [...state.assetsToSupply];\n\n for (let i = 0; i < poolData.length; i++) {\n if (poolData[i]) {\n const [\n unbacked,\n accruedToTreasuryScaled,\n totalAToken,\n totalStableDebt,\n totalVariableDebt,\n liquidityRate,\n variableBorrowRate,\n stableBorrowRate,\n averageStableBorrowRate,\n liquidityIndex,\n variableBorrowIndex,\n lastUpdateTimestamp,\n ] = poolData[i];\n const RAY = Big(10).pow(27);\n const SECONDS_PER_YEAR = 31_536_000;\n const depositAPR = Big(liquidityRate).div(RAY || 1);\n const depositAPY0 = Big(1)\n .plus(depositAPR.div(Big(SECONDS_PER_YEAR)))\n .toNumber();\n\n const _supplyAPY = Big(\n Math.pow(depositAPY0, SECONDS_PER_YEAR) - 1\n ).toFixed();\n\n if (!_assetsToSupply[i]) return;\n const variableBorrowAPR = Big(variableBorrowRate).div(RAY || 1);\n\n const variableBorrowAPY0 = Big(1)\n .plus(Big(variableBorrowAPR).div(Big(SECONDS_PER_YEAR)))\n .toNumber();\n\n const _borrowAPY = Big(\n Math.pow(variableBorrowAPY0, SECONDS_PER_YEAR) - 1\n ).toFixed();\n console.log(\"APY--\", _supplyAPY, _borrowAPY);\n\n let _utilized = Big(totalVariableDebt || 0)\n .div(Big(totalAToken || 1))\n .toFixed();\n\n _assetsToSupply[i].supplyAPY = _supplyAPY;\n _assetsToSupply[i].borrowAPY = _borrowAPY;\n _assetsToSupply[i].utilized = _utilized;\n }\n }\n State.update({\n assetsToSupply: _assetsToSupply,\n });\n })\n .catch((err) => {\n console.log(\"getPoolDataProvider_err\", err);\n });\n}\n\n// Pool Liquidity\nfunction getPoolDataProviderTotalSupply() {\n const prevAssetsToSupply = [...state.assetsToSupply];\n\n const underlyingTokens = dexConfig?.rawMarkets?.map(\n (market) => market.underlyingAsset\n );\n\n const calls = underlyingTokens?.map((addr) => ({\n address: config.PoolDataProvider,\n name: \"getATokenTotalSupply\",\n params: [addr],\n }));\n\n multicall({\n abi: [\n {\n inputs: [{ internalType: \"address\", name: \"asset\", type: \"address\" }],\n name: \"getATokenTotalSupply\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n console.log(\"getPoolDataProviderTotal_res\", res);\n\n for (let i = 0; i < res.length; i++) {\n const _totalSupply = ethers.utils.formatUnits(\n res[i][0],\n prevAssetsToSupply[i].decimals\n );\n prevAssetsToSupply[i].totalSupply = _totalSupply;\n // console.log(\n // \"_totalSupply--\",\n // _totalSupply,\n // prevAssetsToSupply[i].symbol,\n // prices[prevAssetsToSupply[i].symbol]\n // );\n // prevAssetsToSupply[i].totalSupplyUSD = Big(_totalSupply || 0)\n // .times(prices[prevAssetsToSupply[i].symbol])\n // .toFixed();\n }\n State.update({\n assetsToSupply: prevAssetsToSupply,\n });\n })\n .catch((err) => {\n console.log(\"getPoolDataProviderTotal_err\", err);\n });\n}\n// seamless use\nfunction getPoolDataProviderTotalDebt() {\n const prevAssetsToSupply = [...state.assetsToSupply];\n\n const underlyingTokens = dexConfig?.rawMarkets?.map(\n (market) => market.underlyingAsset\n );\n // console.log(\"getPoolDataProviderTotalDebt--\", underlyingTokens);\n const calls = underlyingTokens?.map((addr) => ({\n address: config.PoolDataProvider,\n name: \"getTotalDebt\",\n params: [addr],\n }));\n\n multicall({\n abi: [\n {\n inputs: [{ internalType: \"address\", name: \"asset\", type: \"address\" }],\n name: \"getTotalDebt\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n console.log(\"getPoolDataProviderTotal_res\", res);\n\n for (let i = 0; i < res.length; i++) {\n const _totalDebts = ethers.utils.formatUnits(\n res[i][0],\n prevAssetsToSupply[i].decimals\n );\n prevAssetsToSupply[i].totalDebts = _totalDebts;\n prevAssetsToSupply[i].totalDebtsUSD = Big(_totalDebts)\n .times(prices[prevAssetsToSupply[i].symbol])\n .toFixed();\n }\n State.update({\n assetsToSupply: prevAssetsToSupply,\n });\n })\n .catch((err) => {\n console.log(\"getPoolDataProviderTotal_err\", err);\n });\n}\nfunction getPoolDataProviderCaps() {\n const prevAssetsToSupply = [...state.assetsToSupply];\n\n const underlyingTokens = dexConfig?.rawMarkets?.map(\n (market) => market.underlyingAsset\n );\n // console.log(\"getPoolDataProviderCaps--\", underlyingTokens);\n const calls = underlyingTokens?.map((addr) => ({\n address: config.PoolDataProvider,\n name: \"getReserveCaps\",\n params: [addr],\n }));\n\n multicall({\n abi: [\n {\n inputs: [{ internalType: \"address\", name: \"asset\", type: \"address\" }],\n name: \"getReserveCaps\",\n outputs: [\n { internalType: \"uint256\", name: \"borrowCap\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"supplyCap\", type: \"uint256\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n console.log(\"getPoolDataProviderCaps_res\", res);\n\n for (let i = 0; i < res.length; i++) {\n const [borrowCap, supplyCap] = res[i];\n\n prevAssetsToSupply[i].borrowCap = borrowCap ? borrowCap.toNumber() : 0;\n prevAssetsToSupply[i].borrowCapUSD = Big(borrowCap)\n .times(prices[prevAssetsToSupply[i].symbol])\n .toFixed();\n prevAssetsToSupply[i].supplyCap = supplyCap ? supplyCap.toNumber() : 0;\n prevAssetsToSupply[i].supplyCapUSD = Big(supplyCap)\n .times(prices[prevAssetsToSupply[i].symbol])\n .toFixed();\n }\n State.update({\n assetsToSupply: prevAssetsToSupply,\n });\n })\n .catch((err) => {\n console.log(\"getPoolDataProviderCaps_err\", err);\n });\n}\n\nfunction getUserAccountData() {\n const contract = new ethers.Contract(\n config.aavePoolV3Address,\n config.aavePoolV3ABI.body,\n Ethers.provider()\n );\n contract\n .getUserAccountData(account)\n .then((res) => {\n console.log(\"getUserAccountData_res:\", res);\n const [\n totalCollateralBase,\n totalDebtBase,\n availableBorrowsBase,\n currentLiquidationThreshold,\n ltv,\n healthFactor,\n ] = res;\n\n const totalDebtBaseUSD = ethers.utils.formatUnits(\n totalDebtBase.toString(),\n 8\n );\n\n const totalCollateralBaseUSD = ethers.utils.formatUnits(\n totalCollateralBase.toString(),\n 8\n );\n const threshold = ethers.utils.formatUnits(\n currentLiquidationThreshold.toString(),\n 4\n );\n\n const _totalCollateralBaseUSD = Big(totalCollateralBaseUSD).times(\n Big(threshold)\n );\n const BorrowPowerUsed = Big(totalDebtBaseUSD || 0)\n .div(_totalCollateralBaseUSD.eq(0) ? 1 : _totalCollateralBaseUSD)\n .times(100)\n .toFixed();\n // console.log(\n // \"HF--\",\n // ethers.utils.formatUnits(healthFactor),\n // formatHealthFactor(ethers.utils.formatUnits(healthFactor))\n // );\n State.update({\n threshold,\n currentLiquidationThreshold,\n BorrowPowerUsed,\n healthFactor: !totalDebtBase.toNumber()\n ? formatHealthFactor(\"∞\")\n : formatHealthFactor(ethers.utils.formatUnits(healthFactor)),\n\n availableBorrowsUSD: ethers.utils.formatUnits(availableBorrowsBase, 8),\n });\n })\n .then(() => {\n getLiquidity();\n })\n .catch((err) => {\n console.log(\"getUserAccountData_error\", err);\n });\n}\nfunction valueToBigNumber(amount) {\n if (amount instanceof BigNumber) {\n return amount;\n }\n\n return new BigNumber(amount);\n}\nconst LTV_PRECISION = 4;\n// return HealthFactorFromBalanceRequest): BigNumber\nfunction calculateHealthFactorFromBalances({\n borrowBalanceMarketReferenceCurrency,\n collateralBalanceMarketReferenceCurrency,\n currentLiquidationThreshold,\n}) {\n if (valueToBigNumber(borrowBalanceMarketReferenceCurrency).eq(0)) {\n return valueToBigNumber(\"-1\"); // Invalid number\n }\n\n return valueToBigNumber(collateralBalanceMarketReferenceCurrency)\n .multipliedBy(currentLiquidationThreshold)\n .shiftedBy(LTV_PRECISION * -1)\n .div(borrowBalanceMarketReferenceCurrency || 1);\n}\n\nfunction getYourSupplies() {\n const aTokenAddresss = markets?.map((item) => item.aTokenAddress);\n\n const calls = aTokenAddresss?.map((addr) => ({\n address: addr,\n name: \"balanceOf\",\n params: [account],\n }));\n multicall({\n abi: [\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n ],\n name: \"balanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n console.log(\"getUsetDeposits_res\", res);\n let userDeposits = [];\n for (let index = 0; index < res.length; index++) {\n if (res[index]) {\n // let underlyingBalance=\n let market = state.assetsToSupply.find(\n (item) => item.aTokenAddress === aTokenAddresss[index]\n );\n if (market) {\n let _bal = res[index]\n ? ethers.utils.formatUnits(res[index][0], market.decimals)\n : 0;\n\n market.underlyingBalance = _bal;\n const _balUSD = Big(_bal)\n .mul(prices[market.symbol] || 0)\n .toFixed();\n market.underlyingBalanceUSD = _balUSD;\n\n userDeposits.push(market);\n }\n }\n }\n const mm = state.assetsToSupply.reduce((prev, cur) => {\n prev[cur.underlyingAsset] = cur;\n return prev;\n }, {});\n const _yourSupplies = userDeposits?.map((userDeposit) => {\n const market = mm[userDeposit.underlyingAsset];\n\n return {\n ...market,\n ...userDeposit,\n ...(market.symbol === config.nativeCurrency.symbol\n ? {\n ...config.nativeCurrency,\n supportPermit: true,\n }\n : {}),\n };\n });\n let obj = {};\n const yourSupplies = _yourSupplies.reduce((prev, cur) => {\n obj[cur.aTokenAddress]\n ? \"\"\n : (obj[cur.aTokenAddress] = true && prev.push(cur));\n return prev;\n }, []);\n console.log(\"yourSupplies:\", yourSupplies);\n // State.update({\n // yourSupplies,\n // });\n return yourSupplies;\n })\n .then((_yourSupplies) => {\n if (!_yourSupplies || !_yourSupplies.length) return;\n const calls = [\n {\n address: config.aavePoolV3Address,\n name: \"getUserConfiguration\",\n params: [account],\n },\n {\n address: config.aavePoolV3Address,\n name: \"getReservesList\",\n },\n ];\n\n multicall({\n abi: config.aavePoolV3ABI.body,\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n console.log(\"getCollateralStatus-res:\", res);\n const [[rawStatus], [addrs]] = res;\n if (rawStatus) {\n const _status = parseInt(rawStatus.toString())\n .toString(2)\n .split(\"\");\n // console.log(\"_status--\", _status);\n const _statusArray = chunk(_status, 2);\n // console.log(\"_status--\", _statusArray, addrs, _yourSupplies);\n\n for (let i = 0; i < _yourSupplies.length; i++) {\n const item = _yourSupplies[i];\n\n const index = addrs.findIndex(\n (addr) =>\n addr.toLowerCase() === item.underlyingAsset.toLowerCase()\n );\n\n _yourSupplies[i].isCollateraled = Number(_statusArray[index][0]);\n }\n\n let yourTotalCollateral = _yourSupplies\n .filter((item) => item.isCollateraled === 1)\n .reduce(\n (prev, curr) =>\n Big(prev)\n .plus(Big(curr.underlyingBalanceUSD || 0))\n .toFixed(),\n 0\n );\n\n State.update((prev) => ({\n ...prev,\n yourSupplies: _yourSupplies,\n yourTotalCollateral,\n }));\n } else {\n State.update((prev) => ({\n ...prev,\n yourSupplies: _yourSupplies,\n }));\n }\n })\n .catch((err) => {\n console.log(\"getCollateralStatus-error:\", err);\n });\n })\n .catch((err) => {\n console.log(\"getUsetDeposits_err\", err);\n });\n}\n\nfunction getUserDebts() {\n const variableDebtTokenAddresss = markets?.map(\n (item) => item.variableDebtTokenAddress\n );\n\n const calls = variableDebtTokenAddresss?.map((addr) => ({\n address: addr,\n name: \"balanceOf\",\n params: [account],\n }));\n\n multicall({\n abi: [\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n ],\n name: \"balanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n console.log(\"getUserDebts_res\", res);\n let userDebs = [];\n const _assetsToSupply = [...state.assetsToSupply];\n for (let index = 0; index < res.length; index++) {\n if (res[index]) {\n let market = _assetsToSupply.find(\n (item) =>\n item.variableDebtTokenAddress === variableDebtTokenAddresss[index]\n );\n if (market) {\n let _debt = ethers.utils.formatUnits(\n res[index][0],\n market.decimals\n );\n\n market.debt = _debt;\n market.debtInUSD = Big(_debt || 0)\n .mul(prices[market.symbol] || 1)\n .toFixed();\n userDebs.push(market);\n }\n }\n }\n let hash = {};\n let _yourBorrows = userDebs.reduce((accum, item) => {\n hash[item[\"aTokenAddress\"]]\n ? \"\"\n : (hash[item[\"aTokenAddress\"]] = true && accum.push(item));\n return accum;\n }, []);\n\n console.log(\"yourBorrows--\", _yourBorrows);\n State.update({\n yourBorrows: _yourBorrows,\n });\n })\n .catch((err) => {\n console.log(\"getUserDebts_err\", err);\n });\n}\n\nfunction chunk(arr, size) {\n let result = [];\n\n let temp = [];\n for (let i = arr.length - 1; i > -1; i--) {\n temp.unshift(arr[i]);\n if (temp.length === size) {\n result.push(temp);\n\n temp = [];\n }\n }\n if (temp.length !== 0) result.push(temp);\n return result;\n}\n\nuseEffect(() => {\n if (!account || !isChainSupported) return;\n getUserPoints();\n getUserBalance();\n getUserAccountData();\n getPoolDataProvider();\n\n getPoolDataProviderTotalSupply();\n // if (dexConfig.name === \"Seamless Protocol\") {\n // getPoolDataProviderTotalDebt();\n // getPoolDataProviderCaps();\n // }\n\n getYourSupplies();\n getUserDebts();\n}, [account, isChainSupported, updater]);\n\nuseEffect(() => {\n if (!account || !isChainSupported) return;\n if (dexConfig.name !== \"Seamless Protocol\") return;\n if (!Array.isArray(state.assetsToSupply)) return;\n console.log(\"calc totalMarketSize\");\n const totalMarketSize = state.assetsToSupply.reduce((prev, curr) => {\n return Big(prev).plus(Big(curr.totalSupplyUSD)).toFixed();\n }, 0);\n const totalBorrows = state.assetsToSupply.reduce((prev, curr) => {\n return Big(prev).plus(Big(curr.totalDebtsUSD)).toFixed();\n }, 0);\n const totalAvailable = Big(totalMarketSize)\n .minus(Big(totalBorrows))\n .toFixed();\n State.update({\n totalMarketSize,\n totalAvailable,\n totalBorrows,\n });\n}, [account, isChainSupported, state.assetsToSupply]);\n\nuseEffect(() => {\n if (!account || !isChainSupported) return;\n\n if (!state.yourSupplies || !state.yourBorrows) return;\n console.log(\"calc net apy\", state.yourSupplies, state.yourBorrows);\n //calc net worth\n const supplyBal = state.yourSupplies.reduce(\n (total, cur) =>\n Big(total || 0)\n .plus(cur.underlyingBalanceUSD)\n .toFixed(),\n 0\n );\n console.log(\"supplyBal--\", supplyBal);\n const debtsBal = state.yourBorrows.reduce(\n (total, cur) =>\n Big(total || 0)\n .plus(cur.debtInUSD)\n .toFixed(),\n 0\n );\n console.log(\"debtsBal--\", debtsBal, supplyBal);\n const netWorth = Big(supplyBal || 0)\n .minus(debtsBal)\n .toFixed(2, ROUND_DOWN);\n console.log(\"netWorth--\", netWorth, state.yourSupplies);\n if (!Number(netWorth)) return;\n\n //calc net apy\n\n const weightedAverageSupplyAPY = state.yourSupplies.reduce(\n (total, cur) =>\n Big(total || 0)\n .plus(\n Big(cur.underlyingBalanceUSD || 0)\n .times(Big(cur.supplyAPY || 0))\n .div(Number(supplyBal) || 1)\n )\n .toFixed(),\n 0\n );\n const yourSupplyRewardAPY = state.yourSupplies.reduce((total, cur) => {\n return Big(total || 0)\n .plus(Big(cur.supplyRewardApy || 0))\n .toFixed();\n }, 0);\n\n console.log(\"weightedAverageSupplyAPY--\", weightedAverageSupplyAPY);\n const weightedAverageBorrowsAPY = state.yourBorrows.reduce((total, cur) => {\n return Big(total || 0)\n .plus(\n Big(cur.debtInUSD)\n .times(Big(cur.borrowAPY || 1))\n .div(debtsBal || 1)\n )\n .toFixed();\n }, 0);\n console.log(\"weightedAverageBorrowsAPY--\", weightedAverageBorrowsAPY);\n\n const a = Big(weightedAverageSupplyAPY || 0)\n .times(supplyBal)\n .div(netWorth || 1)\n .toFixed();\n console.log(\"a--\", a);\n const b = Big(weightedAverageBorrowsAPY || 0)\n .times(debtsBal)\n .div(netWorth || 1)\n .toFixed();\n console.log(\"b--\", b);\n const netAPY = Big(a).minus(Big(b)).toFixed();\n console.log(\"netAPY--\", netAPY);\n const yourTotalSupply = state.yourSupplies.reduce(\n (prev, curr) =>\n Big(prev)\n .plus(Big(curr.underlyingBalanceUSD || 0))\n .toFixed(),\n 0\n );\n console.log(\"yourTotalSupply--\", yourTotalSupply);\n\n const yourTotalBorrow = state.yourBorrows.reduce(\n (prev, curr) =>\n Big(prev)\n .plus(Big(curr.debtInUSD || 0))\n .toFixed(),\n 0\n );\n console.log(\"yourTotalBorrow--\", yourTotalBorrow);\n\n State.update((prev) => ({\n ...prev,\n netAPY,\n netWorthUSD: netWorth,\n yourTotalSupply,\n yourTotalBorrow,\n yourSupplyApy: Big(weightedAverageSupplyAPY)\n .plus(yourSupplyRewardAPY)\n .toFixed(),\n yourBorrowApy: weightedAverageBorrowsAPY,\n }));\n}, [state.yourSupplies, state.yourBorrows]);\n\nfunction onSuccess() {\n State.update({\n ...state,\n fresh: state.fresh + 1,\n });\n}\n\nconsole.log(\"STATE: \", state);\n\nconst body = isChainSupported ? (\n <Wrap>\n <FlexContainer>\n <ChainsWrap>\n <Widget\n src=\"bluebiu.near/widget/Lending.Chains\"\n props={{\n chains: CHAIN_LIST,\n curChain,\n onSwitchChain,\n // onChange: (tab) => {\n // State.update({\n // tab: tab.key,\n // });\n // },\n }}\n />\n </ChainsWrap>\n <Widget\n src={`${config.ownerId}/widget/AAVE.HeroData`}\n props={{\n config,\n netWorth: `$ ${\n state.netWorthUSD ? Big(state.netWorthUSD || 0).toFixed(2) : \"-\"\n }`,\n netAPY: `${\n state.netAPY\n ? Number(\n Big(state.netAPY || 0)\n .times(100)\n .toFixed(2)\n )\n : \"-\"\n }%`,\n healthFactor: formatHealthFactor(state.healthFactor),\n totalMarketSize: state.totalMarketSize,\n totalAvailable: state.totalAvailable,\n totalBorrows: state.totalBorrows,\n theme: dexConfig?.theme,\n yourBorrows: state.yourBorrows,\n BlastPoints: state.BlastPoints,\n BlastGold: state.BlastGold,\n }}\n />\n </FlexContainer>\n <Widget\n src={`${config.ownerId}/widget/AAVE.TabSwitcher`}\n props={{\n config,\n theme: dexConfig?.theme,\n select: state.selectTab,\n setSelect: (tabName) => State.update({ selectTab: tabName }),\n }}\n />\n {state.selectTab === \"MARKET\" && (\n <>\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.Markets`}\n props={{\n formatUSD,\n config,\n dexConfig,\n chainId: chainId,\n assetsToSupply: state.assetsToSupply,\n showSupplyModal: state.showSupplyModal,\n setShowSupplyModal: (isShow) =>\n State.update({ showSupplyModal: isShow }),\n onActionSuccess,\n healthFactor: formatHealthFactor(state.healthFactor),\n formatHealthFactor,\n calcHealthFactor,\n depositETHGas,\n depositERC20Gas,\n borrowETHGas,\n borrowERC20Gas,\n yourSupplies: state.yourSupplies,\n yourTotalSupply: state.yourTotalSupply,\n theme: dexConfig?.theme,\n addAction,\n dexConfig,\n }}\n />\n </>\n )}\n {state.selectTab === \"YOURS\" && (\n <>\n <Yours>\n <YoursTableWrapper>\n <Title>\n You Supplies\n {state.yourSupplies && state.yourSupplies.length ? (\n <SubTitle>\n <Label>Balance:</Label>\n <Value>$ {Number(state.yourTotalSupply).toFixed(2)}</Value>\n\n <Label>APY:</Label>\n <Value>\n {Big(state.yourSupplyApy).times(100).toFixed(2)} %\n </Value>\n\n <Label>Collateral:</Label>\n <Value>\n $ {Number(state.yourTotalCollateral).toFixed(2)}\n </Value>\n </SubTitle>\n ) : null}\n </Title>\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.YourSupplies`}\n props={{\n formatNumber,\n config,\n chainId: chainId,\n yourSupplies: state.yourSupplies,\n showWithdrawModal: state.showWithdrawModal,\n setShowWithdrawModal: (isShow) =>\n State.update({ showWithdrawModal: isShow }),\n onActionSuccess,\n healthFactor: formatHealthFactor(state.healthFactor),\n formatHealthFactor,\n calcHealthFactor,\n withdrawETHGas,\n withdrawERC20Gas,\n account,\n prices,\n threshold: state.threshold,\n addAction,\n dexConfig,\n yourTotalCollateral: state.yourTotalCollateral,\n yourTotalBorrow: state.yourTotalBorrow,\n theme: dexConfig?.theme,\n }}\n />\n </YoursTableWrapper>\n <YoursTableWrapper>\n <Title>\n You Borrows\n {state.yourBorrows && state.yourBorrows.length ? (\n <SubTitle>\n <Label>Balance:</Label>\n <Value>$ {Number(state.yourTotalBorrow).toFixed(2)}</Value>\n\n <Label>APY:</Label>\n <Value>\n {Big(state.yourBorrowApy).times(100).toFixed(2)} %\n </Value>\n\n <Label>Borrow power used:</Label>\n <Value>{Number(state.BorrowPowerUsed).toFixed(2)}%</Value>\n </SubTitle>\n ) : null}\n </Title>\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.YourBorrows`}\n props={{\n config,\n chainId: chainId,\n assetsToSupply: state.assetsToSupply,\n yourBorrows: state.yourBorrows,\n showRepayModal: state.showRepayModal,\n setShowRepayModal: (isShow) =>\n State.update({ showRepayModal: isShow }),\n showBorrowModal: state.showBorrowModal,\n setShowBorrowModal: (isShow) =>\n State.update({ showBorrowModal: isShow }),\n formatHealthFactor,\n calcHealthFactor,\n onActionSuccess,\n repayETHGas,\n repayERC20Gas,\n borrowETHGas,\n borrowERC20Gas,\n addAction,\n dexConfig,\n healthFactor: formatHealthFactor(state.healthFactor),\n theme: dexConfig?.theme,\n }}\n />\n </YoursTableWrapper>\n </Yours>\n\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.PointsTable`}\n props={{\n account,\n config,\n data: state.assetsToSupply,\n dapps: dexConfig,\n onSuccess,\n markets,\n prices,\n toast,\n theme: dexConfig?.theme,\n }}\n />\n </>\n )}\n {state.alertModalText && (\n <Widget\n src={`${config.ownerId}/widget/AAVE.Modal.AlertModal`}\n props={{\n config,\n theme: dexConfig?.theme,\n title: \"All done!\",\n description: state.alertModalText,\n onRequestClose: () => State.update({ alertModalText: false }),\n }}\n />\n )}\n </Wrap>\n) : (\n <>\n <Widget\n src=\"bluebiu.near/widget/Swap.ChainWarnigBox\"\n props={{\n chain: curChain,\n onSwitchChain: onSwitchChain,\n switchingChain: switchingChain,\n theme: dexConfig.theme,\n }}\n />\n </>\n);\n// );\n\nreturn (\n <div>\n {/* Component Head */}\n {/* <Widget\n src={`${config.ownerId}/widget/Utils.Import`}\n props={{ modules, onLoad: importFunctions }}\n /> */}\n\n {body}\n </div>\n);\n" }, "ZKEVM-all-in-one": { "": "const Layout = styled.div``;\n\nconst Container = styled.div`\n width: 100%;\n min-height: 100vh;\n display: flex;\n justify-content: center;\n\n .flex-grow {\n flex-grow: 1;\n }\n .contentOut {\n /* padding-top: 25px;\n margin-left: 35px; */\n }\n .contentOut p {\n font-size: 20px;\n font-weight: 700;\n margin-bottom: 20px;\n color: #ffffff;\n }\n @media (max-width: 900px) {\n display: grid;\n .contentOut {\n padding: 0;\n margin: 0 0 36px 0;\n }\n .contentOut p {\n display: none;\n }\n }\n`;\n\nconst MenuContainer = styled.div`\n margin-right: 35px;\n .item {\n display: flex;\n align-items: center;\n padding-left: 40px;\n width: 180px;\n height: 64px;\n font-weight: 500;\n font-size: 16px;\n color: #7e8a93;\n cursor: pointer;\n margin-bottom: 2px;\n border-right: \"none\";\n transition: 0.5s;\n border-radius: 16px;\n :hover {\n background: linear-gradient(270deg, #373a53 0%, rgba(55, 58, 83, 0) 100%);\n color: #ffffff;\n }\n }\n .item.active {\n color: #ffffff;\n background: linear-gradient(270deg, #373a53 0%, rgba(55, 58, 83, 0) 100%);\n }\n .item.disable {\n cursor: not-allowed;\n }\n .icon {\n width: 26px;\n }\n @media (max-width: 900px) {\n margin: 0;\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n grid-gap: 16px;\n background: #222436;\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 1;\n padding: 0 16px;\n .item {\n width: auto;\n padding: 0;\n height: 76px;\n display: grid;\n text-align: center;\n align-items: center;\n span {\n margin-left: 26px;\n margin-bottom: -28px;\n }\n }\n .item.active {\n background-image: none;\n color: #e9f456;\n border-color: transparent;\n }\n }\n`;\n\nconst activeMenu =\n Storage.privateGet(\"zkevmCachedActiveMenu\") || props.defaultTab || \"Bridge\";\n\nfunction changeTab(menu) {\n Storage.privateSet(\"zkevmCachedActiveMenu\", menu);\n}\n\n// svg icon start\nconst headIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"16\"\n viewBox=\"0 0 18 16\"\n fill=\"none\"\n >\n <path\n d=\"M17 9C17.5523 9 18 8.55228 18 8C18 7.44772 17.5523 7 17 7V9ZM0.292892 7.29289C-0.0976315 7.68342 -0.0976315 8.31658 0.292892 8.70711L6.65685 15.0711C7.04738 15.4616 7.68054 15.4616 8.07107 15.0711C8.46159 14.6805 8.46159 14.0474 8.07107 13.6569L2.41421 8L8.07107 2.34315C8.46159 1.95262 8.46159 1.31946 8.07107 0.928932C7.68054 0.538408 7.04738 0.538408 6.65685 0.928932L0.292892 7.29289ZM17 7L1 7V9L17 9V7Z\"\n fill=\"#979ABE\"\n />\n </svg>\n);\n\nconst bridgeIcon = (\n <svg\n width=\"19\"\n height=\"18\"\n viewBox=\"0 0 19 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <mask\n id=\"mask0_1328_7364\"\n maskUnits=\"userSpaceOnUse\"\n x=\"0\"\n y=\"0\"\n width=\"18\"\n height=\"18\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M17.7684 3.3323C16.5569 2.49226 15.0859 2 13.5 2C9.35786 2 6 5.35786 6 9.5C6 13.6421 9.35786 17 13.5 17C13.9539 17 14.3984 16.9597 14.8302 16.8824C13.3983 17.5946 11.7518 18 10 18C4.47715 18 0 13.9706 0 9C0 4.02944 4.47715 0 10 0C13.1361 0 15.935 1.29925 17.7684 3.3323Z\"\n fill=\"currentColor\"\n />\n </mask>\n <g mask=\"url(#mask0_1328_7364)\">\n <rect width=\"19\" height=\"11\" fill=\"currentColor\" />\n </g>\n <mask\n id=\"mask1_1328_7364\"\n maskUnits=\"userSpaceOnUse\"\n x=\"8\"\n y=\"4\"\n width=\"11\"\n height=\"13\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M8.99975 5.42751C9.28439 5.37792 9.5772 5.35206 9.87604 5.35206C12.6763 5.35206 14.9463 7.62209 14.9463 10.4223C14.9463 13.1425 12.8042 15.3623 10.1149 15.487C10.9532 15.9225 11.9057 16.1686 12.9157 16.1686C16.276 16.1686 19 13.4446 19 10.0843C19 6.72403 16.276 4 12.9157 4C11.4242 4 10.058 4.5367 8.99975 5.42751Z\"\n fill=\"currentColor\"\n />\n </mask>\n <g mask=\"url(#mask1_1328_7364)\">\n <rect\n width=\"9.99974\"\n height=\"6.66649\"\n transform=\"matrix(-1 0 0 1 19 4)\"\n fill=\"currentColor\"\n />\n </g>\n </svg>\n);\n\nconst swapIcon = (\n <svg\n width=\"16\"\n height=\"14\"\n viewBox=\"0 0 16 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M11.2571 7.76056C11.1005 7.61142 10.8919 7.52941 10.6756 7.53205C10.4594 7.53468 10.2527 7.62176 10.0998 7.77467C9.94692 7.92758 9.85984 8.13422 9.85721 8.35045C9.85457 8.56669 9.93658 8.77539 10.0857 8.93199L10.7343 9.58056H4.41429C3.68252 9.5798 2.98095 9.28877 2.46351 8.77134C1.94607 8.2539 1.65505 7.55232 1.65429 6.82056C1.65416 6.18756 1.83563 5.56781 2.17715 5.03484C2.29574 4.85033 2.33617 4.62626 2.28955 4.41193C2.24294 4.19761 2.11309 4.01058 1.92858 3.89199C1.74406 3.7734 1.51999 3.73296 1.30567 3.77958C1.09134 3.82619 0.904308 3.95604 0.785718 4.14056C0.271637 4.93979 -0.00115865 5.87027 3.69903e-06 6.82056C0.00151569 7.99083 0.467076 9.11275 1.29459 9.94026C2.1221 10.7678 3.24401 11.2333 4.41429 11.2348H10.6486L10.0771 11.8063C9.93601 11.9643 9.86075 12.1703 9.86684 12.3821C9.87293 12.5939 9.95991 12.7953 10.1099 12.9449C10.2599 13.0945 10.4615 13.181 10.6733 13.1866C10.8851 13.1921 11.0909 13.1164 11.2486 12.9748L13.2657 10.9577C13.3425 10.881 13.4034 10.7899 13.445 10.6897C13.4866 10.5894 13.508 10.4819 13.508 10.3734C13.508 10.2649 13.4866 10.1574 13.445 10.0572C13.4034 9.9569 13.3425 9.86582 13.2657 9.78913L11.2571 7.76056Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M11.5857 2.132H4.80001L5.55144 1.38057C5.69258 1.22258 5.76784 1.01652 5.76175 0.804751C5.75566 0.592982 5.66868 0.39159 5.51869 0.241968C5.3687 0.0923464 5.1671 0.00586073 4.95532 0.000287087C4.74354 -0.00528655 4.53766 0.0704751 4.38001 0.212001L2.36287 2.22914C2.28607 2.30583 2.22514 2.39691 2.18357 2.49717C2.142 2.59743 2.12061 2.7049 2.12061 2.81343C2.12061 2.92196 2.142 3.02943 2.18357 3.12969C2.22514 3.22995 2.28607 3.32102 2.36287 3.39771L4.38001 5.41486C4.53766 5.55638 4.74354 5.63214 4.95532 5.62657C5.1671 5.621 5.3687 5.53451 5.51869 5.38489C5.66868 5.23527 5.75566 5.03388 5.76175 4.82211C5.76784 4.61034 5.69258 4.40428 5.55144 4.24629L5.09144 3.78629H11.5857C12.3175 3.78704 13.0191 4.07807 13.5365 4.59551C14.0539 5.11294 14.345 5.81452 14.3457 6.54629C14.3463 7.19597 14.1544 7.83126 13.7943 8.372C13.6748 8.5549 13.6323 8.77761 13.6762 8.99165C13.7201 9.20569 13.8467 9.39374 14.0286 9.51486C14.1644 9.60396 14.3233 9.65161 14.4857 9.652C14.6223 9.6521 14.7568 9.6182 14.877 9.55336C14.9972 9.48851 15.0994 9.39477 15.1743 9.28057C15.7132 8.47055 16.0005 7.51921 16 6.54629C15.9985 5.37601 15.5329 4.2541 14.7054 3.42658C13.8779 2.59907 12.756 2.13351 11.5857 2.132Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nconst liquidityIcon = (\n <svg\n width=\"20\"\n height=\"18\"\n viewBox=\"0 0 20 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.67689 9.5C3.42392 8.81656 3.28571 8.07718 3.28571 7.30542C3.28571 3.82303 6.09992 1 9.57142 1C13.0429 1 15.8571 3.82303 15.8571 7.30542C15.8571 8.93781 15.2388 10.4253 14.2242 11.5451\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n <path\n d=\"M1 10.5189C8.5 6.99986 11 14 18.1429 10.5189M1 15.5C8.5 11.9809 11 18.9811 18.1429 15.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n);\nconst lendingIcon = (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.30875 5.99853C4.30742 5.41955 4.42014 4.84597 4.64048 4.31055C4.86082 3.77513 5.18445 3.28836 5.59292 2.87801C6.00138 2.46767 6.48666 2.1418 7.02107 1.91901C7.55547 1.69621 8.12852 1.58086 8.7075 1.57953C11.1375 1.57953 13.1062 3.5584 13.1062 5.99853C13.1071 6.78301 12.8991 7.55358 12.5037 8.23111C12.1083 8.90865 11.5397 9.46875 10.8562 9.8539C10.6313 10.5014 10.2105 11.0629 9.65211 11.4604C9.09372 11.8579 8.42545 12.0718 7.74 12.0724H5.5665V10.5267H7.74225C8.71425 10.5267 9.50175 9.73578 9.50175 8.75928V8.64903H3.22763L3.20288 14.7668H12.9893C13.9601 14.7668 14.7488 13.9748 14.7488 12.9994L14.7724 10.8574H12.3165V9.31165H16.3125L16.2878 12.9994C16.2892 13.876 15.9427 14.7174 15.3242 15.3386C14.7057 15.9599 13.8659 16.3101 12.9893 16.3125H1.66275L1.6875 7.10215H4.44713C4.35496 6.74153 4.30847 6.37075 4.30875 5.99853ZM6.06713 7.10215H11.0396V7.65903C11.3715 7.1899 11.5673 6.61728 11.5673 5.99853C11.5681 5.62215 11.4949 5.24928 11.3516 4.90122C11.2084 4.55317 10.9979 4.23674 10.7324 3.97003C10.4668 3.70331 10.1513 3.49153 9.80386 3.34678C9.45643 3.20202 9.08388 3.12714 8.7075 3.1264C8.33112 3.12714 7.95857 3.20202 7.61114 3.34678C7.2637 3.49153 6.94819 3.70331 6.68262 3.97003C6.41705 4.23674 6.20664 4.55317 6.06339 4.90122C5.92014 5.24928 5.84686 5.62215 5.84775 5.99853C5.84775 6.3889 5.9265 6.76353 6.06713 7.10215Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nconst { swapConfig, ...restProps } = props;\n\nreturn (\n <Layout>\n <Container>\n <MenuContainer>\n <div\n onClick={() => {\n changeTab(\"Bridge\");\n }}\n className={`item ${activeMenu == \"Bridge\" ? \"active\" : \"\"}`}\n >\n <span className=\"icon\">{bridgeIcon}</span>\n Bridge\n </div>\n <div\n onClick={() => {\n changeTab(\"swap\");\n }}\n className={`item ${activeMenu == \"swap\" ? \"active\" : \"\"}`}\n >\n <span className=\"icon\">{swapIcon}</span>\n Swap\n </div>\n\n <div\n className={`item ${activeMenu == \"Liquidity\" ? \"active\" : \"\"}`}\n onClick={() => {\n changeTab(\"Liquidity\");\n }}\n >\n <span className=\"icon\">{liquidityIcon}</span>\n Liquidity\n </div>\n </MenuContainer>\n <div className=\"flex-grow contentOut\">\n {activeMenu == \"Bridge\" ? (\n <>\n <Widget\n src=\"guessme.near/widget/ZKEVMSwap.zkevm-bridge\"\n props={{\n layout: \"center\",\n ...restProps,\n }}\n />\n </>\n ) : null}\n {activeMenu == \"swap\" ? (\n <>\n <Widget\n src=\"bluebiu.near/widget/PolygonZkevm.Swap.Dex\"\n props={{\n layout: \"center\",\n ...swapConfig,\n ...restProps,\n }}\n />\n </>\n ) : null}\n {activeMenu == \"Liquidity\" ? (\n <>\n <Widget\n src=\"bluebiu.near/widget/ZKEVM.GAMMA\"\n props={{ ...restProps }}\n />\n </>\n ) : null}\n </div>\n </Container>\n </Layout>\n);\n", "metadata": { "image": { "ipfs_cid": "bafkreiaednvljfk5splm5p3eisbkr3v5laiazldxqirtxs5koimckebsyu" }, "name": "Polygon zkEVM All-in-one", "tags": { "dexes": "" } } }, "AAVE.Card.Markets": { "": "const {\n config,\n addAction,\n dexConfig,\n assetsToSupply,\n showSupplyModal,\n setShowSupplyModal,\n onActionSuccess,\n chainId,\n healthFactor,\n formatHealthFactor,\n calcHealthFactor,\n depositETHGas,\n depositERC20Gas,\n theme,\n yourTotalSupply,\n yourSupplies,\n borrowETHGas,\n borrowERC20Gas,\n} = props;\n\nconst CenterRow = styled.div`\n /* text-align: center; */\n`;\n\nconst CenterItem = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nconst ItemPrimary = styled.div`\n font-size: 16px;\n\n &.apy {\n color: rgb(34, 160, 107);\n }\n`;\nconst ItemSub = styled.div`\n font-size: 14px;\n font-weight: 400;\n color: rgb(162, 166, 149);\n &.radio {\n display: flex;\n gap: 3px;\n align-items: center;\n color: rgb(178, 232, 16);\n }\n`;\n\nconst IconMouth = styled.img`\n width: 14px;\n height: 14px;\n`;\n\nState.init({\n data: undefined,\n showBorrowModal: false,\n showLoopModal: false,\n});\n\nconst SupplyButton = ({ data, ...rest }) => {\n let disabled;\n\n if (dexConfig.name === \"Seamless Protocol\") {\n const { totalSupplyUSD, supplyCapUSD } = data;\n const isFull = Big(totalSupplyUSD || 0).gte(Big(supplyCapUSD || 0));\n\n disabled = Number(data.balanceInUSD) === 0 || isFull;\n } else {\n disabled = Number(data.balanceInUSD) === 0;\n }\n return (\n <Widget\n src={`${config.ownerId}/widget/AAVE.PrimaryButton`}\n props={{\n config,\n // width: 148,\n theme,\n children: \"Supply\",\n disabled,\n onClick: () => {\n State.update({ data });\n setShowSupplyModal(true);\n },\n }}\n />\n );\n};\n\nconst BorrowButton = ({ data }) => {\n let disabled;\n if (dexConfig.name === \"Seamless Protocol\") {\n const { totalDebtsUSD, borrowCapUSD } = data;\n const isFull = Big(totalDebtsUSD || 0).gte(Big(borrowCapUSD || 0));\n\n disabled =\n isNaN(Number(yourTotalSupply)) || !Number(yourTotalSupply) || isFull;\n } else {\n disabled = isNaN(Number(yourTotalSupply)) || !Number(yourTotalSupply);\n }\n if (!data.supportBorrow) {\n disabled = true;\n }\n return (\n <Widget\n src={`${config.ownerId}/widget/AAVE.PrimaryButton`}\n props={{\n config,\n disabled,\n children: \"Borrow\",\n theme,\n onClick: () => {\n State.update({ data, showBorrowModal: true });\n // setShowBorrowModal(true);\n },\n }}\n />\n );\n};\n\nconst LoopButton = ({ data }) => {\n let disabled;\n // if (dexConfig.name === \"Seamless Protocol\") {\n // const { totalSupplyUSD, supplyCapUSD } = data;\n // const isFull = Big(totalSupplyUSD || 0).gte(Big(supplyCapUSD || 0));\n\n // disabled = Number(data.balanceInUSD) === 0 || isFull;\n // } else {\n // disabled = Number(data.balanceInUSD) === 0;\n // }\n if (!data.supportLoop) {\n disabled = true;\n }\n return (\n <Widget\n src={`${config.ownerId}/widget/AAVE.PrimaryButton`}\n props={{\n config,\n disabled,\n children: \"Loop\",\n theme,\n onClick: () => {\n State.update({ data, showLoopModal: true });\n },\n }}\n />\n );\n};\n\nfunction formatRate(_value) {\n if (isNaN(Number(_value))) return \"\";\n let value = (Number(_value) * 100).toFixed();\n return Big(value || 0).lt(0.01) ? \"<0.01%\" : `${Number(value).toFixed(2)}%`;\n}\n\nfunction formatNumber(value, digits) {\n if (isNaN(Number(value))) return \"\";\n if (Big(value || 0).eq(0)) return `$ 0`;\n return Big(value || 0).lt(0.01)\n ? \"< $0.01\"\n : `$ ${Number(value).toFixed(digits || 2)}`;\n}\nfunction formatValue(value, digits) {\n if (isNaN(Number(value))) return \"\";\n if (Number(value) === 0) return \"0\";\n return Big(value || 0).lt(0.0000001)\n ? \"< 0.0000001\"\n : `${Number(value).toFixed(digits || 2)}`;\n}\nlet headers;\nlet tableData;\n\nif ([\"ZeroLend\", \"AAVE V3\", \"Seamless Protocol\"].includes(dexConfig.name)) {\n headers = [\n \"Asset\",\n \"Wallet Balance\",\n \"Supply APY\",\n \"Available to borrow\",\n \"Borrow APY\",\n \"Can be Collateral\",\n \"\",\n ];\n tableData = assetsToSupply.map((row) => [\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.TokenWrapper`}\n props={{\n children: [\n <img width={64} height={64} src={row.icon} />,\n <CenterItem>\n <div className=\"token-title\">{row.symbol}</div>\n {/* <div className=\"token-chain\">{row.name}</div> */}\n </CenterItem>,\n ],\n }}\n />,\n <div>\n <div>{formatValue(row.balance, 7)}</div>\n <div>{formatNumber(row.balanceInUSD)}</div>\n </div>,\n <div>\n <div>\n {row.supplyAPY ? `${(Number(row.supplyAPY) * 100).toFixed(2)} %` : \"\"}\n </div>\n\n <div>\n {dexConfig.rewardToken && row.supplyRewardApy\n ? `${(Number(row.supplyRewardApy) * 100).toFixed(2)} %`\n : \"\"}\n </div>\n </div>,\n <div>\n <CenterRow>{formatValue(row.availableBorrows, 7)}</CenterRow>\n <CenterRow>{formatNumber(row.availableBorrowsUSD)}</CenterRow>\n {/* <CenterRow>\n {row.availableBorrows ? Number(row.availableBorrows).toFixed(7) : \"\"}\n </CenterRow>\n\n <CenterRow>\n {row.availableBorrowsUSD\n ? `$${Number(row.availableBorrowsUSD).toFixed(2)}`\n : \"\"}\n </CenterRow> */}\n </div>,\n\n <div>\n <div>\n {row.borrowAPY ? `${(Number(row.borrowAPY) * 100).toFixed(2)} %` : \"\"}\n </div>\n <div>\n {dexConfig.rewardToken && row.borrowRewardApy\n ? `${(Number(row.borrowRewardApy) * 100).toFixed(2)} %`\n : \"\"}\n </div>\n </div>,\n <div style={{ paddingLeft: \"50px\" }}>\n {(row.isIsolated || (!row.isIsolated && !row.usageAsCollateralEnabled)) &&\n \"—\"}\n {!row.isIsolated && row.usageAsCollateralEnabled && (\n <img\n src={`${config.ipfsPrefix}/bafkreibsy5fzn67veowyalveo6t34rnqvktmok2zutdsp4f5slem3grc3i`}\n width={16}\n height={16}\n />\n )}\n </div>,\n <div style={{ display: \"flex\", gap: 10 }}>\n {row.balance ? <SupplyButton data={row} /> : null}\n\n <BorrowButton\n data={{\n ...row,\n }}\n />\n </div>,\n ]);\n}\nif ([\"Pac Finance\"].includes(dexConfig.name)) {\n headers = [\n \"Assets\",\n \"Your Balance\",\n // \"Estimated Blast Points\",\n \"Supply APY\",\n \"Borrow APY\",\n \"Pool Liquidity\",\n // \"Can be Collateral\",\n \"\",\n ];\n tableData = assetsToSupply.map((row) => [\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.TokenWrapper`}\n props={{\n children: [\n <img width={64} height={64} src={row.icon} />,\n <CenterItem>\n <ItemPrimary style={{ fontWeight: 700 }}>{row.symbol}</ItemPrimary>\n <ItemSub>LTV: {Big(row.LTV).times(100).toFixed()}%</ItemSub>\n </CenterItem>,\n ],\n }}\n />,\n <CenterItem>\n <ItemPrimary>{formatValue(row.balance, 7)}</ItemPrimary>\n <ItemSub>{formatNumber(row.balanceInUSD)}</ItemSub>\n </CenterItem>,\n // <CenterItem>\n // <ItemPrimary>{}</ItemPrimary>\n // <ItemSub>{`Pts/day/${row.symbol}`}</ItemSub>\n // </CenterItem>,\n <CenterItem>\n <ItemPrimary className=\"apy\">{`${(\n (Number(row.supplyAPY) + Number(row.NATIVE_YIELD || 0)) *\n 100\n ).toFixed(2)} %`}</ItemPrimary>\n <ItemSub className=\"radio\">\n <IconMouth src=\"https://ipfs.near.social/ipfs/bafkreiffqyfmusnew73zt6slkeoryvevuw7ojcgvfdirgf3oqdsll5yyga\" />\n {Number(row.EXTRA_RADIO) * 100}%\n </ItemSub>\n </CenterItem>,\n <CenterItem>\n <ItemPrimary className=\"apy\">{`${(Number(row.borrowAPY) * 100).toFixed(\n 2\n )} %`}</ItemPrimary>\n </CenterItem>,\n <CenterItem>\n <ItemPrimary>\n <Widget\n src={`${config.ownerId}/widget/Utils.FormatNumber`}\n props={{ number: row.totalSupply }}\n />\n </ItemPrimary>\n <ItemSub>{formatRate(row.utilized)} utilized</ItemSub>\n </CenterItem>,\n // <CenterItem style={{ paddingLeft: \"50px\" }}>\n // {(row.isIsolated || (!row.isIsolated && !row.usageAsCollateralEnabled)) &&\n // \"—\"}\n // {!row.isIsolated && row.usageAsCollateralEnabled && (\n // <img\n // src={`${config.ipfsPrefix}/bafkreibsy5fzn67veowyalveo6t34rnqvktmok2zutdsp4f5slem3grc3i`}\n // width={16}\n // height={16}\n // />\n // )}\n // </CenterItem>,\n <div style={{ display: \"flex\", gap: 10 }}>\n {row.balance ? <SupplyButton data={row} /> : null}\n <BorrowButton\n data={{\n ...row,\n }}\n />\n {row.balance ? <LoopButton data={row} /> : null}\n </div>,\n ]);\n}\nreturn (\n <>\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.CardsView`}\n props={{\n config,\n style: {\n marginTop: \"16px\",\n },\n title: \"Market\",\n body:\n !assetsToSupply || assetsToSupply.length === 0 ? (\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.CardEmpty`}\n props={{\n config,\n children: \"Nothing supplied yet\",\n }}\n />\n ) : (\n <>\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.CardsTable`}\n props={{\n config,\n headers,\n data: tableData,\n }}\n />\n </>\n ),\n }}\n />\n {showSupplyModal && (\n <Widget\n src={`${config.ownerId}/widget/AAVE.Modal.SupplyModal`}\n props={{\n config,\n theme,\n onRequestClose: () => setShowSupplyModal(false),\n data: {\n ...state.data,\n healthFactor,\n },\n onActionSuccess,\n chainId,\n depositETHGas,\n depositERC20Gas,\n formatHealthFactor,\n calcHealthFactor,\n addAction,\n dexConfig,\n }}\n />\n )}\n {state.showBorrowModal && (\n <Widget\n src={`${config.ownerId}/widget/AAVE.Modal.BorrowModal`}\n props={{\n config,\n theme,\n onRequestClose: () => {\n State.update({\n showBorrowModal: false,\n });\n // setShowBorrowModal(false)\n },\n data: {\n ...state.data,\n healthFactor,\n },\n onActionSuccess,\n chainId,\n borrowETHGas,\n borrowERC20Gas,\n formatHealthFactor,\n calcHealthFactor,\n addAction,\n dexConfig,\n }}\n />\n )}\n {state.showLoopModal && (\n <Widget\n src={`${config.ownerId}/widget/AAVE.Modal.LoopModal`}\n props={{\n config,\n theme,\n // onRequestClose: () => setShowSupplyModal(false),\n onRequestClose: () => {\n State.update({\n showLoopModal: false,\n });\n },\n data: {\n ...state.data,\n healthFactor,\n },\n onActionSuccess,\n chainId,\n depositETHGas,\n depositERC20Gas,\n formatHealthFactor,\n calcHealthFactor,\n addAction,\n dexConfig,\n }}\n />\n )}\n </>\n);\n" } } } } }

Transaction Execution Plan

Convert Transaction To Receipt
Gas Burned:
458 Ggas
Tokens Burned:
0.00005 
Receipt:
Predecessor ID:
Receiver ID:
Gas Burned:
19 Tgas
Tokens Burned:
0.00197 
Called method: 'set' in contract: social.near
Arguments:
{ "data": { "bluebiu.near": { "widget": { "Lending.Pac": { "": "const Wrap = styled.div`\n padding: 24px 15px;\n /* background: #0e0e26; */\n min-height: 100vh;\n color: white;\n font-family: Gantari;\n`;\n\nconst FlexContainer = styled.div``;\n\nconst ChainsWrap = styled.div`\n display: flex;\n justify-content: flex-end;\n`;\nconst Yours = styled.div`\n display: flex;\n gap: 20px;\n margin-top: 16px;\n`;\nconst YoursTableWrapper = styled.div`\n background-color: rgba(53, 55, 73, 0.2);\n border-radius: 6px;\n width: 50%;\n`;\nconst Title = styled.div`\n padding: 10px 20px 0;\n /* border-bottom: 1px solid #292c42; */\n`;\nconst SubTitle = styled.div`\n display: flex;\n align-items: center;\n`;\nconst Label = styled.div`\n color: #979abe;\n font-size: 16px;\n font-weight: 400;\n margin-right: 5px;\n`;\nconst Value = styled.div`\n color: #fff;\n font-size: 16px;\n font-weight: 500;\n margin-right: 15px;\n`;\n\nconst ROUND_DOWN = 0;\nconst NATIVE_SYMBOL_ADDRESS_MAP_KEY = \"0x0\";\nconst ACTUAL_BORROW_AMOUNT_RATE = 0.99;\n\nconst account = Ethers.send(\"eth_requestAccounts\", [])[0];\nconst {\n CHAIN_LIST,\n curChain,\n onSwitchChain,\n GAS_LIMIT_RECOMMENDATIONS,\n chainId,\n prices,\n multicallAddress,\n multicall,\n isChainSupported,\n switchingChain,\n dexConfig,\n theme,\n toast,\n addAction,\n} = props;\nconst { CONTRACT_ABI } = dexConfig;\nconsole.log(\"PROPS: \", props);\n\nfunction isValid(a) {\n if (!a) return false;\n if (isNaN(Number(a))) return false;\n if (a === \"\") return false;\n return true;\n}\n\nfunction getGasPrice() {\n return Ethers.provider().getGasPrice();\n}\n\nfunction gasEstimation(action) {\n const assetsToSupply = state.assetsToSupply;\n if (!assetsToSupply) {\n return \"-\";\n }\n const baseAsset = assetsToSupply.find(\n (asset) => asset.symbol === config.nativeCurrency.symbol\n );\n if (!baseAsset) {\n return \"-\";\n }\n\n const { tokenPrice, decimals } = baseAsset;\n return getGasPrice()\n .then((gasPrice) => {\n const gasLimit = GAS_LIMIT_RECOMMENDATIONS[action].limit;\n // console.log(\"gasPrice--\", gasPrice);\n return Big(gasPrice.toString())\n .mul(gasLimit)\n .div(Big(10).pow(decimals))\n .mul(tokenPrice)\n .toFixed(2);\n })\n .catch((err) => {\n console.log(\"gasEstimation error\");\n });\n}\n\nfunction depositETHGas() {\n return gasEstimation(\"deposit\");\n}\n\nfunction depositERC20Gas() {\n return gasEstimation(\"supplyWithPermit\");\n}\n\nfunction withdrawETHGas() {\n return gasEstimation(\"withdrawETH\");\n}\n\nfunction withdrawERC20Gas() {\n return gasEstimation(\"withdraw\");\n}\n\nfunction borrowETHGas() {\n return gasEstimation(\"borrowETH\");\n}\n\nfunction borrowERC20Gas() {\n return gasEstimation(\"borrow\");\n}\n\nfunction repayETHGas() {\n return gasEstimation(\"repay\");\n}\n\nfunction repayERC20Gas() {\n return gasEstimation(\"repayWithPermit\");\n}\nfunction formatNumber(value, digits) {\n if (Big(value).eq(0)) return `$ 0`;\n return Big(value || 0).lt(0.01)\n ? \"< $0.01\"\n : `$ ${Number(value).toFixed(digits || 2)}`;\n}\n\n// App config\nfunction getConfig() {\n const abis = {\n wrappedTokenGatewayV3ABI: fetch(CONTRACT_ABI.wrappedTokenGatewayV3ABI),\n erc20Abi: fetch(CONTRACT_ABI.erc20Abi),\n aavePoolV3ABI: fetch(CONTRACT_ABI.aavePoolV3ABI),\n variableDebtTokenABI: fetch(CONTRACT_ABI.variableDebtTokenABI),\n walletBalanceProviderABI: fetch(CONTRACT_ABI.walletBalanceProviderABI),\n };\n\n const constants = {\n FIXED_LIQUIDATION_VALUE: \"1.0\",\n MAX_UINT_256:\n \"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\",\n AAVE_API_BASE_URL: \"https://aave-data-service-7a85eea3aebe.herokuapp.com\",\n };\n\n return {\n ...dexConfig.config,\n ...abis,\n ...constants,\n };\n}\n\nconst config = getConfig();\n// console.log(\"CONFIG: \", config);\n\nconst markets = dexConfig?.rawMarkets?.map((item) => ({\n ...item,\n tokenPrice: prices[item.symbol],\n}));\n\nconst underlyingTokens = dexConfig?.rawMarkets?.map(\n (market) => market.underlyingAsset\n);\n\n// App states\nState.init({\n imports: {},\n\n showWithdrawModal: false,\n showSupplyModal: false,\n showRepayModal: false,\n showBorrowModal: false,\n\n threshold: 1,\n assetsToSupply: markets,\n yourSupplies: undefined,\n yourBorrows: undefined,\n netWorthUSD: \"\",\n netAPY: \"\",\n healthFactor: \"\",\n availableBorrowsUSD: \"\",\n\n selectTab: \"MARKET\", // MARKET | YOURS\n fresh: 0, // fresh rewards\n yourSupplyApy: 0,\n yourBorrowApy: 0,\n yourTotalCollateral: 0,\n\n BlastPoints: 0,\n BlastGold: 0,\n\n emissionPerSeconds: [],\n aTokenTotal: [],\n debtTotal: [],\n\n updater: 0,\n});\n\nuseEffect(() => {\n State.update({\n assetsToSupply: markets,\n });\n}, [markets]);\n\nfunction calcAvailableBorrows(availableBorrowsUSD, tokenPrice) {\n let r =\n isValid(availableBorrowsUSD) && isValid(tokenPrice)\n ? Big(availableBorrowsUSD || 0)\n .div(tokenPrice)\n .toFixed()\n : Number(0).toFixed();\n\n return r;\n}\n\nfunction bigMin(_a, _b) {\n const a = Big(_a || 0);\n const b = Big(_b || 0);\n return a.gt(b) ? b : a;\n}\n\nfunction formatHealthFactor(hf) {\n try {\n if (hf === \"∞\") return hf;\n\n if (!hf || !isValid(hf)) return \"-\";\n\n if (Big(hf).gt(10000)) return \"∞\";\n if (Number(hf) === -1) return \"∞\";\n return Big(hf).toFixed(2, ROUND_DOWN);\n } catch (error) {\n console.log(\"CATCH_formatHealthFactor:\", error);\n }\n}\n\nfunction calcHealthFactor(type, symbol, amount) {\n // console.log(\n // \"calcHealthFactor\",\n // type,\n // symbol,\n // amount,\n // isValid(state.yourTotalCollateral),\n // isValid(state.yourTotalBorrow),\n // isValid(amount)\n // );\n if (\n // !isValid(state.yourTotalCollateral) ||\n // !isValid(state.yourTotalBorrow) ||\n isNaN(Number(state.yourTotalCollateral)) ||\n isNaN(Number(state.yourTotalBorrow)) ||\n !isValid(amount)\n )\n return \"-\";\n let newHealthFactor;\n let totalCollateral = Big(state.yourTotalCollateral);\n let totalBorrows = Big(state.yourTotalBorrow);\n\n const assetsUSD = Big(prices[symbol]).times(Big(amount));\n if (type === \"SUPPLY\") {\n totalCollateral = Big(state.yourTotalCollateral).plus(assetsUSD);\n }\n if (type === \"INC_COLLATERAL\") {\n totalCollateral = Big(state.yourTotalCollateral).plus(assetsUSD);\n }\n if (type === \"WITHDRAW\") {\n totalCollateral = Big(state.yourTotalCollateral).minus(assetsUSD);\n }\n if (type === \"DEC_COLLATERAL\") {\n totalCollateral = Big(state.yourTotalCollateral).minus(assetsUSD);\n }\n if (type === \"BORROW\") {\n totalBorrows = Big(state.yourTotalBorrow).plus(assetsUSD);\n }\n if (type === \"REPAY\") {\n totalBorrows = Big(state.yourTotalBorrow).minus(assetsUSD);\n }\n if (totalBorrows.eq(0)) return \"∞\";\n newHealthFactor = totalCollateral\n .times(Big(state.threshold))\n .div(totalBorrows);\n\n console.log(\"calcHealthFactor--\", newHealthFactor);\n return newHealthFactor.toFixed(2);\n}\n\nfunction batchBalanceOf(chainId, userAddress, tokenAddresses, abi) {\n const balanceProvider = new ethers.Contract(\n config.balanceProviderAddress,\n abi.body,\n Ethers.provider().getSigner()\n );\n\n return balanceProvider.batchBalanceOf([userAddress], tokenAddresses);\n}\n\nfunction getLiquidity() {\n const aTokenAddresss = markets?.map((item) => item.aTokenAddress);\n const variableDebtTokenAddresss = markets?.map(\n (item) => item.variableDebtTokenAddress\n );\n\n const calls = aTokenAddresss\n .map((addr) => ({\n address: addr,\n name: \"totalSupply\",\n }))\n .concat(\n variableDebtTokenAddresss?.map((addr) => ({\n address: addr,\n name: \"totalSupply\",\n }))\n );\n\n multicall({\n abi: [\n {\n inputs: [],\n name: \"totalSupply\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n try {\n console.log(\"getLiquidity_res\", res);\n const l = res.length;\n const aTokenTotal = res.slice(0, l / 2);\n const debtTotal = res.slice(l / 2);\n\n const _assetsToSupply = [...state.assetsToSupply];\n for (let i = 0; i < _assetsToSupply.length; i++) {\n const liquidityAmount = Big(aTokenTotal[i] || 0)\n .minus(Big(debtTotal[i] || 0))\n .toFixed();\n console.log(\n liquidityAmount,\n prices[_assetsToSupply[i].symbol],\n _assetsToSupply[i]\n );\n _assetsToSupply[i].availableLiquidity = liquidityAmount;\n const _availableLiquidityUSD = Big(\n ethers.utils.formatUnits(\n liquidityAmount,\n _assetsToSupply[i].decimals\n )\n )\n .mul(Big(prices[_assetsToSupply[i].symbol] || 0))\n .toFixed();\n console.log(_availableLiquidityUSD);\n _assetsToSupply[i].availableLiquidityUSD = _availableLiquidityUSD;\n\n const _availableBorrowsUSD = bigMin(\n state.availableBorrowsUSD,\n ethers.utils.formatUnits(\n liquidityAmount,\n _assetsToSupply[i].decimals\n )\n )\n .times(ACTUAL_BORROW_AMOUNT_RATE)\n .toFixed();\n console.log(_availableBorrowsUSD);\n const availableBorrows = calcAvailableBorrows(\n _availableBorrowsUSD,\n _assetsToSupply[i].tokenPrice\n );\n console.log(availableBorrows);\n _assetsToSupply[i].availableBorrowsUSD = _availableBorrowsUSD;\n _assetsToSupply[i].availableBorrows = availableBorrows;\n }\n State.update({\n assetsToSupply: _assetsToSupply,\n aTokenTotal,\n debtTotal,\n });\n } catch (error) {\n console.log(\"catch getLiquidity\", error);\n }\n })\n .catch((err) => {\n console.log(\"getLiquidity_err\", err);\n });\n}\n\nfunction getUserPoints() {\n const params = JSON.stringify({ address: account });\n asyncFetch(`/pac?path=blastpoint&params=${params}`)\n .then((res) => {\n if (res.status === 200) {\n const { blastGold, blastPoint, details } = res.body.data;\n\n const _assetsToSupply = [...state.assetsToSupply];\n for (let i = 0; i < details.length; i++) {\n let asset = _assetsToSupply.find(\n (item) =>\n item.symbol.toLowerCase() === details[i].token.toLowerCase()\n );\n\n asset.blastPoint = details[i].points;\n asset.blastGold = details[i].gold;\n }\n\n State.update({\n assetsToSupply: _assetsToSupply,\n BlastPoints: blastPoint,\n BlastGold: blastGold,\n });\n }\n })\n .catch((error) => {\n console.log(\"getUserPoints_error:\", error);\n });\n}\n\n// update data in async manner\nfunction getUserBalance() {\n // check abi loaded\n if (\n Object.keys(CONTRACT_ABI)\n ?.map((key) => config[key])\n .filter((ele) => !!ele).length !== Object.keys(CONTRACT_ABI).length\n ) {\n return;\n }\n const provider = Ethers.provider();\n provider\n .getSigner()\n ?.getBalance()\n .then((balance) => {\n return balance;\n })\n .then((baseAssetBalance) => {\n // get user balances\n batchBalanceOf(\n chainId,\n account,\n markets?.map((market) => market.underlyingAsset),\n config.walletBalanceProviderABI\n )\n .then((balances) => {\n return balances?.map((balance) => balance.toString());\n })\n .then((userBalances) => {\n console.log(\"getUserBalance--\", userBalances);\n const _assetsToSupply = [...state.assetsToSupply];\n for (let index = 0; index < _assetsToSupply.length; index++) {\n const item = _assetsToSupply[index];\n const _bal =\n item.symbol === config.nativeCurrency.symbol\n ? baseAssetBalance\n : userBalances[index];\n const balanceRaw = Big(_bal || 0).div(Big(10).pow(item.decimals));\n const _balance = balanceRaw.toFixed(item.decimals, ROUND_DOWN);\n\n const _balanceInUSD = balanceRaw\n .times(Big(item.tokenPrice || 0))\n .toFixed();\n\n item.balance = _balance;\n item.balanceInUSD = _balanceInUSD;\n }\n\n State.update({\n assetsToSupply: _assetsToSupply,\n });\n })\n\n .catch((err) => {\n console.log(\"batchBalanceOfERROR:\", err);\n });\n });\n}\n\nfunction onActionSuccess({ msg, callback }) {\n console.log(\"onActionSuccess--\");\n // update data if action finishes\n getUserBalance();\n\n State.update({\n updater: state.updater + 1,\n });\n // update UI after data has almost loaded\n setTimeout(() => {\n if (callback) {\n callback();\n }\n if (msg) {\n State.update({ alertModalText: msg });\n }\n }, 5000);\n}\n\nfunction getPoolDataProvider() {\n const underlyingTokens = dexConfig?.rawMarkets?.map(\n (market) => market.underlyingAsset\n );\n // console.log(\"getPoolDataProvider--\", underlyingTokens);\n const calls = underlyingTokens?.map((addr) => ({\n address: config.PoolDataProvider,\n name: \"getReserveData\",\n params: [addr],\n }));\n\n multicall({\n abi: [\n {\n inputs: [{ internalType: \"address\", name: \"asset\", type: \"address\" }],\n name: \"getReserveData\",\n outputs: [\n { internalType: \"uint256\", name: \"unbacked\", type: \"uint256\" },\n {\n internalType: \"uint256\",\n name: \"accruedToTreasuryScaled\",\n type: \"uint256\",\n },\n { internalType: \"uint256\", name: \"totalAToken\", type: \"uint256\" },\n {\n internalType: \"uint256\",\n name: \"totalStableDebt\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"totalVariableDebt\",\n type: \"uint256\",\n },\n { internalType: \"uint256\", name: \"liquidityRate\", type: \"uint256\" },\n {\n internalType: \"uint256\",\n name: \"variableBorrowRate\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"stableBorrowRate\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"averageStableBorrowRate\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"liquidityIndex\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"variableBorrowIndex\",\n type: \"uint256\",\n },\n {\n internalType: \"uint40\",\n name: \"lastUpdateTimestamp\",\n type: \"uint40\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n console.log(\"getPoolDataProvider_res\", res);\n return res;\n })\n .then((poolData) => {\n console.log(\"CALC APY\");\n if (!Array.isArray(poolData) || !poolData.length) return;\n\n const _assetsToSupply = [...state.assetsToSupply];\n\n for (let i = 0; i < poolData.length; i++) {\n if (poolData[i]) {\n const [\n unbacked,\n accruedToTreasuryScaled,\n totalAToken,\n totalStableDebt,\n totalVariableDebt,\n liquidityRate,\n variableBorrowRate,\n stableBorrowRate,\n averageStableBorrowRate,\n liquidityIndex,\n variableBorrowIndex,\n lastUpdateTimestamp,\n ] = poolData[i];\n const RAY = Big(10).pow(27);\n const SECONDS_PER_YEAR = 31_536_000;\n const depositAPR = Big(liquidityRate).div(RAY || 1);\n const depositAPY0 = Big(1)\n .plus(depositAPR.div(Big(SECONDS_PER_YEAR)))\n .toNumber();\n\n const _supplyAPY = Big(\n Math.pow(depositAPY0, SECONDS_PER_YEAR) - 1\n ).toFixed();\n\n if (!_assetsToSupply[i]) return;\n const variableBorrowAPR = Big(variableBorrowRate).div(RAY || 1);\n\n const variableBorrowAPY0 = Big(1)\n .plus(Big(variableBorrowAPR).div(Big(SECONDS_PER_YEAR)))\n .toNumber();\n\n const _borrowAPY = Big(\n Math.pow(variableBorrowAPY0, SECONDS_PER_YEAR) - 1\n ).toFixed();\n console.log(\"APY--\", _supplyAPY, _borrowAPY);\n\n let _utilized = Big(totalVariableDebt || 0)\n .div(Big(totalAToken || 1))\n .toFixed();\n\n _assetsToSupply[i].supplyAPY = _supplyAPY;\n _assetsToSupply[i].borrowAPY = _borrowAPY;\n _assetsToSupply[i].utilized = _utilized;\n }\n }\n State.update({\n assetsToSupply: _assetsToSupply,\n });\n })\n .catch((err) => {\n console.log(\"getPoolDataProvider_err\", err);\n });\n}\n\n// Pool Liquidity\nfunction getPoolDataProviderTotalSupply() {\n const prevAssetsToSupply = [...state.assetsToSupply];\n\n const underlyingTokens = dexConfig?.rawMarkets?.map(\n (market) => market.underlyingAsset\n );\n\n const calls = underlyingTokens?.map((addr) => ({\n address: config.PoolDataProvider,\n name: \"getATokenTotalSupply\",\n params: [addr],\n }));\n\n multicall({\n abi: [\n {\n inputs: [{ internalType: \"address\", name: \"asset\", type: \"address\" }],\n name: \"getATokenTotalSupply\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n console.log(\"getPoolDataProviderTotal_res\", res);\n\n for (let i = 0; i < res.length; i++) {\n const _totalSupply = ethers.utils.formatUnits(\n res[i][0],\n prevAssetsToSupply[i].decimals\n );\n prevAssetsToSupply[i].totalSupply = _totalSupply;\n // console.log(\n // \"_totalSupply--\",\n // _totalSupply,\n // prevAssetsToSupply[i].symbol,\n // prices[prevAssetsToSupply[i].symbol]\n // );\n // prevAssetsToSupply[i].totalSupplyUSD = Big(_totalSupply || 0)\n // .times(prices[prevAssetsToSupply[i].symbol])\n // .toFixed();\n }\n State.update({\n assetsToSupply: prevAssetsToSupply,\n });\n })\n .catch((err) => {\n console.log(\"getPoolDataProviderTotal_err\", err);\n });\n}\n// seamless use\nfunction getPoolDataProviderTotalDebt() {\n const prevAssetsToSupply = [...state.assetsToSupply];\n\n const underlyingTokens = dexConfig?.rawMarkets?.map(\n (market) => market.underlyingAsset\n );\n // console.log(\"getPoolDataProviderTotalDebt--\", underlyingTokens);\n const calls = underlyingTokens?.map((addr) => ({\n address: config.PoolDataProvider,\n name: \"getTotalDebt\",\n params: [addr],\n }));\n\n multicall({\n abi: [\n {\n inputs: [{ internalType: \"address\", name: \"asset\", type: \"address\" }],\n name: \"getTotalDebt\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n console.log(\"getPoolDataProviderTotal_res\", res);\n\n for (let i = 0; i < res.length; i++) {\n const _totalDebts = ethers.utils.formatUnits(\n res[i][0],\n prevAssetsToSupply[i].decimals\n );\n prevAssetsToSupply[i].totalDebts = _totalDebts;\n prevAssetsToSupply[i].totalDebtsUSD = Big(_totalDebts)\n .times(prices[prevAssetsToSupply[i].symbol])\n .toFixed();\n }\n State.update({\n assetsToSupply: prevAssetsToSupply,\n });\n })\n .catch((err) => {\n console.log(\"getPoolDataProviderTotal_err\", err);\n });\n}\nfunction getPoolDataProviderCaps() {\n const prevAssetsToSupply = [...state.assetsToSupply];\n\n const underlyingTokens = dexConfig?.rawMarkets?.map(\n (market) => market.underlyingAsset\n );\n // console.log(\"getPoolDataProviderCaps--\", underlyingTokens);\n const calls = underlyingTokens?.map((addr) => ({\n address: config.PoolDataProvider,\n name: \"getReserveCaps\",\n params: [addr],\n }));\n\n multicall({\n abi: [\n {\n inputs: [{ internalType: \"address\", name: \"asset\", type: \"address\" }],\n name: \"getReserveCaps\",\n outputs: [\n { internalType: \"uint256\", name: \"borrowCap\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"supplyCap\", type: \"uint256\" },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n console.log(\"getPoolDataProviderCaps_res\", res);\n\n for (let i = 0; i < res.length; i++) {\n const [borrowCap, supplyCap] = res[i];\n\n prevAssetsToSupply[i].borrowCap = borrowCap ? borrowCap.toNumber() : 0;\n prevAssetsToSupply[i].borrowCapUSD = Big(borrowCap)\n .times(prices[prevAssetsToSupply[i].symbol])\n .toFixed();\n prevAssetsToSupply[i].supplyCap = supplyCap ? supplyCap.toNumber() : 0;\n prevAssetsToSupply[i].supplyCapUSD = Big(supplyCap)\n .times(prices[prevAssetsToSupply[i].symbol])\n .toFixed();\n }\n State.update({\n assetsToSupply: prevAssetsToSupply,\n });\n })\n .catch((err) => {\n console.log(\"getPoolDataProviderCaps_err\", err);\n });\n}\n\nfunction getUserAccountData() {\n const contract = new ethers.Contract(\n config.aavePoolV3Address,\n config.aavePoolV3ABI.body,\n Ethers.provider()\n );\n contract\n .getUserAccountData(account)\n .then((res) => {\n console.log(\"getUserAccountData_res:\", res);\n const [\n totalCollateralBase,\n totalDebtBase,\n availableBorrowsBase,\n currentLiquidationThreshold,\n ltv,\n healthFactor,\n ] = res;\n\n const totalDebtBaseUSD = ethers.utils.formatUnits(\n totalDebtBase.toString(),\n 8\n );\n\n const totalCollateralBaseUSD = ethers.utils.formatUnits(\n totalCollateralBase.toString(),\n 8\n );\n const threshold = ethers.utils.formatUnits(\n currentLiquidationThreshold.toString(),\n 4\n );\n\n const _totalCollateralBaseUSD = Big(totalCollateralBaseUSD).times(\n Big(threshold)\n );\n const BorrowPowerUsed = Big(totalDebtBaseUSD || 0)\n .div(_totalCollateralBaseUSD.eq(0) ? 1 : _totalCollateralBaseUSD)\n .times(100)\n .toFixed();\n // console.log(\n // \"HF--\",\n // ethers.utils.formatUnits(healthFactor),\n // formatHealthFactor(ethers.utils.formatUnits(healthFactor))\n // );\n State.update({\n threshold,\n currentLiquidationThreshold,\n BorrowPowerUsed,\n healthFactor: !totalDebtBase.toNumber()\n ? formatHealthFactor(\"∞\")\n : formatHealthFactor(ethers.utils.formatUnits(healthFactor)),\n\n availableBorrowsUSD: ethers.utils.formatUnits(availableBorrowsBase, 8),\n });\n })\n .then(() => {\n getLiquidity();\n })\n .catch((err) => {\n console.log(\"getUserAccountData_error\", err);\n });\n}\nfunction valueToBigNumber(amount) {\n if (amount instanceof BigNumber) {\n return amount;\n }\n\n return new BigNumber(amount);\n}\nconst LTV_PRECISION = 4;\n// return HealthFactorFromBalanceRequest): BigNumber\nfunction calculateHealthFactorFromBalances({\n borrowBalanceMarketReferenceCurrency,\n collateralBalanceMarketReferenceCurrency,\n currentLiquidationThreshold,\n}) {\n if (valueToBigNumber(borrowBalanceMarketReferenceCurrency).eq(0)) {\n return valueToBigNumber(\"-1\"); // Invalid number\n }\n\n return valueToBigNumber(collateralBalanceMarketReferenceCurrency)\n .multipliedBy(currentLiquidationThreshold)\n .shiftedBy(LTV_PRECISION * -1)\n .div(borrowBalanceMarketReferenceCurrency || 1);\n}\n\nfunction getYourSupplies() {\n const aTokenAddresss = markets?.map((item) => item.aTokenAddress);\n\n const calls = aTokenAddresss?.map((addr) => ({\n address: addr,\n name: \"balanceOf\",\n params: [account],\n }));\n multicall({\n abi: [\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n ],\n name: \"balanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n console.log(\"getUsetDeposits_res\", res);\n let userDeposits = [];\n for (let index = 0; index < res.length; index++) {\n if (res[index]) {\n // let underlyingBalance=\n let market = state.assetsToSupply.find(\n (item) => item.aTokenAddress === aTokenAddresss[index]\n );\n if (market) {\n let _bal = res[index]\n ? ethers.utils.formatUnits(res[index][0], market.decimals)\n : 0;\n\n market.underlyingBalance = _bal;\n const _balUSD = Big(_bal)\n .mul(prices[market.symbol] || 0)\n .toFixed();\n market.underlyingBalanceUSD = _balUSD;\n\n userDeposits.push(market);\n }\n }\n }\n const mm = state.assetsToSupply.reduce((prev, cur) => {\n prev[cur.underlyingAsset] = cur;\n return prev;\n }, {});\n const _yourSupplies = userDeposits?.map((userDeposit) => {\n const market = mm[userDeposit.underlyingAsset];\n\n return {\n ...market,\n ...userDeposit,\n ...(market.symbol === config.nativeCurrency.symbol\n ? {\n ...config.nativeCurrency,\n supportPermit: true,\n }\n : {}),\n };\n });\n let obj = {};\n const yourSupplies = _yourSupplies.reduce((prev, cur) => {\n obj[cur.aTokenAddress]\n ? \"\"\n : (obj[cur.aTokenAddress] = true && prev.push(cur));\n return prev;\n }, []);\n console.log(\"yourSupplies:\", yourSupplies);\n // State.update({\n // yourSupplies,\n // });\n return yourSupplies;\n })\n .then((_yourSupplies) => {\n if (!_yourSupplies || !_yourSupplies.length) return;\n const calls = [\n {\n address: config.aavePoolV3Address,\n name: \"getUserConfiguration\",\n params: [account],\n },\n {\n address: config.aavePoolV3Address,\n name: \"getReservesList\",\n },\n ];\n\n multicall({\n abi: config.aavePoolV3ABI.body,\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n console.log(\"getCollateralStatus-res:\", res);\n const [[rawStatus], [addrs]] = res;\n if (rawStatus) {\n const _status = parseInt(rawStatus.toString())\n .toString(2)\n .split(\"\");\n // console.log(\"_status--\", _status);\n const _statusArray = chunk(_status, 2);\n // console.log(\"_status--\", _statusArray, addrs, _yourSupplies);\n\n for (let i = 0; i < _yourSupplies.length; i++) {\n const item = _yourSupplies[i];\n\n const index = addrs.findIndex(\n (addr) =>\n addr.toLowerCase() === item.underlyingAsset.toLowerCase()\n );\n\n _yourSupplies[i].isCollateraled = Number(_statusArray[index][0]);\n }\n\n let yourTotalCollateral = _yourSupplies\n .filter((item) => item.isCollateraled === 1)\n .reduce(\n (prev, curr) =>\n Big(prev)\n .plus(Big(curr.underlyingBalanceUSD || 0))\n .toFixed(),\n 0\n );\n\n State.update((prev) => ({\n ...prev,\n yourSupplies: _yourSupplies,\n yourTotalCollateral,\n }));\n } else {\n State.update((prev) => ({\n ...prev,\n yourSupplies: _yourSupplies,\n }));\n }\n })\n .catch((err) => {\n console.log(\"getCollateralStatus-error:\", err);\n });\n })\n .catch((err) => {\n console.log(\"getUsetDeposits_err\", err);\n });\n}\n\nfunction getUserDebts() {\n const variableDebtTokenAddresss = markets?.map(\n (item) => item.variableDebtTokenAddress\n );\n\n const calls = variableDebtTokenAddresss?.map((addr) => ({\n address: addr,\n name: \"balanceOf\",\n params: [account],\n }));\n\n multicall({\n abi: [\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n ],\n name: \"balanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n ],\n calls,\n options: {},\n multicallAddress,\n provider: Ethers.provider(),\n })\n .then((res) => {\n console.log(\"getUserDebts_res\", res);\n let userDebs = [];\n const _assetsToSupply = [...state.assetsToSupply];\n for (let index = 0; index < res.length; index++) {\n if (res[index]) {\n let market = _assetsToSupply.find(\n (item) =>\n item.variableDebtTokenAddress === variableDebtTokenAddresss[index]\n );\n if (market) {\n let _debt = ethers.utils.formatUnits(\n res[index][0],\n market.decimals\n );\n\n market.debt = _debt;\n market.debtInUSD = Big(_debt || 0)\n .mul(prices[market.symbol] || 1)\n .toFixed();\n userDebs.push(market);\n }\n }\n }\n let hash = {};\n let _yourBorrows = userDebs.reduce((accum, item) => {\n hash[item[\"aTokenAddress\"]]\n ? \"\"\n : (hash[item[\"aTokenAddress\"]] = true && accum.push(item));\n return accum;\n }, []);\n\n console.log(\"yourBorrows--\", _yourBorrows);\n State.update({\n yourBorrows: _yourBorrows,\n });\n })\n .catch((err) => {\n console.log(\"getUserDebts_err\", err);\n });\n}\n\nfunction chunk(arr, size) {\n let result = [];\n\n let temp = [];\n for (let i = arr.length - 1; i > -1; i--) {\n temp.unshift(arr[i]);\n if (temp.length === size) {\n result.push(temp);\n\n temp = [];\n }\n }\n if (temp.length !== 0) result.push(temp);\n return result;\n}\n\nuseEffect(() => {\n if (!account || !isChainSupported) return;\n getUserPoints();\n getUserBalance();\n getUserAccountData();\n getPoolDataProvider();\n\n getPoolDataProviderTotalSupply();\n // if (dexConfig.name === \"Seamless Protocol\") {\n // getPoolDataProviderTotalDebt();\n // getPoolDataProviderCaps();\n // }\n\n getYourSupplies();\n getUserDebts();\n}, [account, isChainSupported, updater]);\n\nuseEffect(() => {\n if (!account || !isChainSupported) return;\n if (dexConfig.name !== \"Seamless Protocol\") return;\n if (!Array.isArray(state.assetsToSupply)) return;\n console.log(\"calc totalMarketSize\");\n const totalMarketSize = state.assetsToSupply.reduce((prev, curr) => {\n return Big(prev).plus(Big(curr.totalSupplyUSD)).toFixed();\n }, 0);\n const totalBorrows = state.assetsToSupply.reduce((prev, curr) => {\n return Big(prev).plus(Big(curr.totalDebtsUSD)).toFixed();\n }, 0);\n const totalAvailable = Big(totalMarketSize)\n .minus(Big(totalBorrows))\n .toFixed();\n State.update({\n totalMarketSize,\n totalAvailable,\n totalBorrows,\n });\n}, [account, isChainSupported, state.assetsToSupply]);\n\nuseEffect(() => {\n if (!account || !isChainSupported) return;\n\n if (!state.yourSupplies || !state.yourBorrows) return;\n console.log(\"calc net apy\", state.yourSupplies, state.yourBorrows);\n //calc net worth\n const supplyBal = state.yourSupplies.reduce(\n (total, cur) =>\n Big(total || 0)\n .plus(cur.underlyingBalanceUSD)\n .toFixed(),\n 0\n );\n console.log(\"supplyBal--\", supplyBal);\n const debtsBal = state.yourBorrows.reduce(\n (total, cur) =>\n Big(total || 0)\n .plus(cur.debtInUSD)\n .toFixed(),\n 0\n );\n console.log(\"debtsBal--\", debtsBal, supplyBal);\n const netWorth = Big(supplyBal || 0)\n .minus(debtsBal)\n .toFixed(2, ROUND_DOWN);\n console.log(\"netWorth--\", netWorth, state.yourSupplies);\n if (!Number(netWorth)) return;\n\n //calc net apy\n\n const weightedAverageSupplyAPY = state.yourSupplies.reduce(\n (total, cur) =>\n Big(total || 0)\n .plus(\n Big(cur.underlyingBalanceUSD || 0)\n .times(Big(cur.supplyAPY || 0))\n .div(Number(supplyBal) || 1)\n )\n .toFixed(),\n 0\n );\n const yourSupplyRewardAPY = state.yourSupplies.reduce((total, cur) => {\n return Big(total || 0)\n .plus(Big(cur.supplyRewardApy || 0))\n .toFixed();\n }, 0);\n\n console.log(\"weightedAverageSupplyAPY--\", weightedAverageSupplyAPY);\n const weightedAverageBorrowsAPY = state.yourBorrows.reduce((total, cur) => {\n return Big(total || 0)\n .plus(\n Big(cur.debtInUSD)\n .times(Big(cur.borrowAPY || 1))\n .div(debtsBal || 1)\n )\n .toFixed();\n }, 0);\n console.log(\"weightedAverageBorrowsAPY--\", weightedAverageBorrowsAPY);\n\n const a = Big(weightedAverageSupplyAPY || 0)\n .times(supplyBal)\n .div(netWorth || 1)\n .toFixed();\n console.log(\"a--\", a);\n const b = Big(weightedAverageBorrowsAPY || 0)\n .times(debtsBal)\n .div(netWorth || 1)\n .toFixed();\n console.log(\"b--\", b);\n const netAPY = Big(a).minus(Big(b)).toFixed();\n console.log(\"netAPY--\", netAPY);\n const yourTotalSupply = state.yourSupplies.reduce(\n (prev, curr) =>\n Big(prev)\n .plus(Big(curr.underlyingBalanceUSD || 0))\n .toFixed(),\n 0\n );\n console.log(\"yourTotalSupply--\", yourTotalSupply);\n\n const yourTotalBorrow = state.yourBorrows.reduce(\n (prev, curr) =>\n Big(prev)\n .plus(Big(curr.debtInUSD || 0))\n .toFixed(),\n 0\n );\n console.log(\"yourTotalBorrow--\", yourTotalBorrow);\n\n State.update((prev) => ({\n ...prev,\n netAPY,\n netWorthUSD: netWorth,\n yourTotalSupply,\n yourTotalBorrow,\n yourSupplyApy: Big(weightedAverageSupplyAPY)\n .plus(yourSupplyRewardAPY)\n .toFixed(),\n yourBorrowApy: weightedAverageBorrowsAPY,\n }));\n}, [state.yourSupplies, state.yourBorrows]);\n\nfunction onSuccess() {\n State.update({\n ...state,\n fresh: state.fresh + 1,\n });\n}\n\nconsole.log(\"STATE: \", state);\n\nconst body = isChainSupported ? (\n <Wrap>\n <FlexContainer>\n <ChainsWrap>\n <Widget\n src=\"bluebiu.near/widget/Lending.Chains\"\n props={{\n chains: CHAIN_LIST,\n curChain,\n onSwitchChain,\n // onChange: (tab) => {\n // State.update({\n // tab: tab.key,\n // });\n // },\n }}\n />\n </ChainsWrap>\n <Widget\n src={`${config.ownerId}/widget/AAVE.HeroData`}\n props={{\n config,\n netWorth: `$ ${\n state.netWorthUSD ? Big(state.netWorthUSD || 0).toFixed(2) : \"-\"\n }`,\n netAPY: `${\n state.netAPY\n ? Number(\n Big(state.netAPY || 0)\n .times(100)\n .toFixed(2)\n )\n : \"-\"\n }%`,\n healthFactor: formatHealthFactor(state.healthFactor),\n totalMarketSize: state.totalMarketSize,\n totalAvailable: state.totalAvailable,\n totalBorrows: state.totalBorrows,\n theme: dexConfig?.theme,\n yourBorrows: state.yourBorrows,\n BlastPoints: state.BlastPoints,\n BlastGold: state.BlastGold,\n }}\n />\n </FlexContainer>\n <Widget\n src={`${config.ownerId}/widget/AAVE.TabSwitcher`}\n props={{\n config,\n theme: dexConfig?.theme,\n select: state.selectTab,\n setSelect: (tabName) => State.update({ selectTab: tabName }),\n }}\n />\n {state.selectTab === \"MARKET\" && (\n <>\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.Markets`}\n props={{\n formatUSD,\n config,\n dexConfig,\n chainId: chainId,\n assetsToSupply: state.assetsToSupply,\n showSupplyModal: state.showSupplyModal,\n setShowSupplyModal: (isShow) =>\n State.update({ showSupplyModal: isShow }),\n onActionSuccess,\n healthFactor: formatHealthFactor(state.healthFactor),\n formatHealthFactor,\n calcHealthFactor,\n depositETHGas,\n depositERC20Gas,\n borrowETHGas,\n borrowERC20Gas,\n yourSupplies: state.yourSupplies,\n yourTotalSupply: state.yourTotalSupply,\n theme: dexConfig?.theme,\n addAction,\n dexConfig,\n }}\n />\n </>\n )}\n {state.selectTab === \"YOURS\" && (\n <>\n <Yours>\n <YoursTableWrapper>\n <Title>\n You Supplies\n {state.yourSupplies && state.yourSupplies.length ? (\n <SubTitle>\n <Label>Balance:</Label>\n <Value>$ {Number(state.yourTotalSupply).toFixed(2)}</Value>\n\n <Label>APY:</Label>\n <Value>\n {Big(state.yourSupplyApy).times(100).toFixed(2)} %\n </Value>\n\n <Label>Collateral:</Label>\n <Value>\n $ {Number(state.yourTotalCollateral).toFixed(2)}\n </Value>\n </SubTitle>\n ) : null}\n </Title>\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.YourSupplies`}\n props={{\n formatNumber,\n config,\n chainId: chainId,\n yourSupplies: state.yourSupplies,\n showWithdrawModal: state.showWithdrawModal,\n setShowWithdrawModal: (isShow) =>\n State.update({ showWithdrawModal: isShow }),\n onActionSuccess,\n healthFactor: formatHealthFactor(state.healthFactor),\n formatHealthFactor,\n calcHealthFactor,\n withdrawETHGas,\n withdrawERC20Gas,\n account,\n prices,\n threshold: state.threshold,\n addAction,\n dexConfig,\n yourTotalCollateral: state.yourTotalCollateral,\n yourTotalBorrow: state.yourTotalBorrow,\n theme: dexConfig?.theme,\n }}\n />\n </YoursTableWrapper>\n <YoursTableWrapper>\n <Title>\n You Borrows\n {state.yourBorrows && state.yourBorrows.length ? (\n <SubTitle>\n <Label>Balance:</Label>\n <Value>$ {Number(state.yourTotalBorrow).toFixed(2)}</Value>\n\n <Label>APY:</Label>\n <Value>\n {Big(state.yourBorrowApy).times(100).toFixed(2)} %\n </Value>\n\n <Label>Borrow power used:</Label>\n <Value>{Number(state.BorrowPowerUsed).toFixed(2)}%</Value>\n </SubTitle>\n ) : null}\n </Title>\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.YourBorrows`}\n props={{\n config,\n chainId: chainId,\n assetsToSupply: state.assetsToSupply,\n yourBorrows: state.yourBorrows,\n showRepayModal: state.showRepayModal,\n setShowRepayModal: (isShow) =>\n State.update({ showRepayModal: isShow }),\n showBorrowModal: state.showBorrowModal,\n setShowBorrowModal: (isShow) =>\n State.update({ showBorrowModal: isShow }),\n formatHealthFactor,\n calcHealthFactor,\n onActionSuccess,\n repayETHGas,\n repayERC20Gas,\n borrowETHGas,\n borrowERC20Gas,\n addAction,\n dexConfig,\n healthFactor: formatHealthFactor(state.healthFactor),\n theme: dexConfig?.theme,\n }}\n />\n </YoursTableWrapper>\n </Yours>\n\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.PointsTable`}\n props={{\n account,\n config,\n data: state.assetsToSupply,\n dapps: dexConfig,\n onSuccess,\n markets,\n prices,\n toast,\n theme: dexConfig?.theme,\n }}\n />\n </>\n )}\n {state.alertModalText && (\n <Widget\n src={`${config.ownerId}/widget/AAVE.Modal.AlertModal`}\n props={{\n config,\n theme: dexConfig?.theme,\n title: \"All done!\",\n description: state.alertModalText,\n onRequestClose: () => State.update({ alertModalText: false }),\n }}\n />\n )}\n </Wrap>\n) : (\n <>\n <Widget\n src=\"bluebiu.near/widget/Swap.ChainWarnigBox\"\n props={{\n chain: curChain,\n onSwitchChain: onSwitchChain,\n switchingChain: switchingChain,\n theme: dexConfig.theme,\n }}\n />\n </>\n);\n// );\n\nreturn (\n <div>\n {/* Component Head */}\n {/* <Widget\n src={`${config.ownerId}/widget/Utils.Import`}\n props={{ modules, onLoad: importFunctions }}\n /> */}\n\n {body}\n </div>\n);\n" }, "ZKEVM-all-in-one": { "": "const Layout = styled.div``;\n\nconst Container = styled.div`\n width: 100%;\n min-height: 100vh;\n display: flex;\n justify-content: center;\n\n .flex-grow {\n flex-grow: 1;\n }\n .contentOut {\n /* padding-top: 25px;\n margin-left: 35px; */\n }\n .contentOut p {\n font-size: 20px;\n font-weight: 700;\n margin-bottom: 20px;\n color: #ffffff;\n }\n @media (max-width: 900px) {\n display: grid;\n .contentOut {\n padding: 0;\n margin: 0 0 36px 0;\n }\n .contentOut p {\n display: none;\n }\n }\n`;\n\nconst MenuContainer = styled.div`\n margin-right: 35px;\n .item {\n display: flex;\n align-items: center;\n padding-left: 40px;\n width: 180px;\n height: 64px;\n font-weight: 500;\n font-size: 16px;\n color: #7e8a93;\n cursor: pointer;\n margin-bottom: 2px;\n border-right: \"none\";\n transition: 0.5s;\n border-radius: 16px;\n :hover {\n background: linear-gradient(270deg, #373a53 0%, rgba(55, 58, 83, 0) 100%);\n color: #ffffff;\n }\n }\n .item.active {\n color: #ffffff;\n background: linear-gradient(270deg, #373a53 0%, rgba(55, 58, 83, 0) 100%);\n }\n .item.disable {\n cursor: not-allowed;\n }\n .icon {\n width: 26px;\n }\n @media (max-width: 900px) {\n margin: 0;\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n grid-gap: 16px;\n background: #222436;\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 1;\n padding: 0 16px;\n .item {\n width: auto;\n padding: 0;\n height: 76px;\n display: grid;\n text-align: center;\n align-items: center;\n span {\n margin-left: 26px;\n margin-bottom: -28px;\n }\n }\n .item.active {\n background-image: none;\n color: #e9f456;\n border-color: transparent;\n }\n }\n`;\n\nconst activeMenu =\n Storage.privateGet(\"zkevmCachedActiveMenu\") || props.defaultTab || \"Bridge\";\n\nfunction changeTab(menu) {\n Storage.privateSet(\"zkevmCachedActiveMenu\", menu);\n}\n\n// svg icon start\nconst headIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"16\"\n viewBox=\"0 0 18 16\"\n fill=\"none\"\n >\n <path\n d=\"M17 9C17.5523 9 18 8.55228 18 8C18 7.44772 17.5523 7 17 7V9ZM0.292892 7.29289C-0.0976315 7.68342 -0.0976315 8.31658 0.292892 8.70711L6.65685 15.0711C7.04738 15.4616 7.68054 15.4616 8.07107 15.0711C8.46159 14.6805 8.46159 14.0474 8.07107 13.6569L2.41421 8L8.07107 2.34315C8.46159 1.95262 8.46159 1.31946 8.07107 0.928932C7.68054 0.538408 7.04738 0.538408 6.65685 0.928932L0.292892 7.29289ZM17 7L1 7V9L17 9V7Z\"\n fill=\"#979ABE\"\n />\n </svg>\n);\n\nconst bridgeIcon = (\n <svg\n width=\"19\"\n height=\"18\"\n viewBox=\"0 0 19 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <mask\n id=\"mask0_1328_7364\"\n maskUnits=\"userSpaceOnUse\"\n x=\"0\"\n y=\"0\"\n width=\"18\"\n height=\"18\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M17.7684 3.3323C16.5569 2.49226 15.0859 2 13.5 2C9.35786 2 6 5.35786 6 9.5C6 13.6421 9.35786 17 13.5 17C13.9539 17 14.3984 16.9597 14.8302 16.8824C13.3983 17.5946 11.7518 18 10 18C4.47715 18 0 13.9706 0 9C0 4.02944 4.47715 0 10 0C13.1361 0 15.935 1.29925 17.7684 3.3323Z\"\n fill=\"currentColor\"\n />\n </mask>\n <g mask=\"url(#mask0_1328_7364)\">\n <rect width=\"19\" height=\"11\" fill=\"currentColor\" />\n </g>\n <mask\n id=\"mask1_1328_7364\"\n maskUnits=\"userSpaceOnUse\"\n x=\"8\"\n y=\"4\"\n width=\"11\"\n height=\"13\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M8.99975 5.42751C9.28439 5.37792 9.5772 5.35206 9.87604 5.35206C12.6763 5.35206 14.9463 7.62209 14.9463 10.4223C14.9463 13.1425 12.8042 15.3623 10.1149 15.487C10.9532 15.9225 11.9057 16.1686 12.9157 16.1686C16.276 16.1686 19 13.4446 19 10.0843C19 6.72403 16.276 4 12.9157 4C11.4242 4 10.058 4.5367 8.99975 5.42751Z\"\n fill=\"currentColor\"\n />\n </mask>\n <g mask=\"url(#mask1_1328_7364)\">\n <rect\n width=\"9.99974\"\n height=\"6.66649\"\n transform=\"matrix(-1 0 0 1 19 4)\"\n fill=\"currentColor\"\n />\n </g>\n </svg>\n);\n\nconst swapIcon = (\n <svg\n width=\"16\"\n height=\"14\"\n viewBox=\"0 0 16 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M11.2571 7.76056C11.1005 7.61142 10.8919 7.52941 10.6756 7.53205C10.4594 7.53468 10.2527 7.62176 10.0998 7.77467C9.94692 7.92758 9.85984 8.13422 9.85721 8.35045C9.85457 8.56669 9.93658 8.77539 10.0857 8.93199L10.7343 9.58056H4.41429C3.68252 9.5798 2.98095 9.28877 2.46351 8.77134C1.94607 8.2539 1.65505 7.55232 1.65429 6.82056C1.65416 6.18756 1.83563 5.56781 2.17715 5.03484C2.29574 4.85033 2.33617 4.62626 2.28955 4.41193C2.24294 4.19761 2.11309 4.01058 1.92858 3.89199C1.74406 3.7734 1.51999 3.73296 1.30567 3.77958C1.09134 3.82619 0.904308 3.95604 0.785718 4.14056C0.271637 4.93979 -0.00115865 5.87027 3.69903e-06 6.82056C0.00151569 7.99083 0.467076 9.11275 1.29459 9.94026C2.1221 10.7678 3.24401 11.2333 4.41429 11.2348H10.6486L10.0771 11.8063C9.93601 11.9643 9.86075 12.1703 9.86684 12.3821C9.87293 12.5939 9.95991 12.7953 10.1099 12.9449C10.2599 13.0945 10.4615 13.181 10.6733 13.1866C10.8851 13.1921 11.0909 13.1164 11.2486 12.9748L13.2657 10.9577C13.3425 10.881 13.4034 10.7899 13.445 10.6897C13.4866 10.5894 13.508 10.4819 13.508 10.3734C13.508 10.2649 13.4866 10.1574 13.445 10.0572C13.4034 9.9569 13.3425 9.86582 13.2657 9.78913L11.2571 7.76056Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M11.5857 2.132H4.80001L5.55144 1.38057C5.69258 1.22258 5.76784 1.01652 5.76175 0.804751C5.75566 0.592982 5.66868 0.39159 5.51869 0.241968C5.3687 0.0923464 5.1671 0.00586073 4.95532 0.000287087C4.74354 -0.00528655 4.53766 0.0704751 4.38001 0.212001L2.36287 2.22914C2.28607 2.30583 2.22514 2.39691 2.18357 2.49717C2.142 2.59743 2.12061 2.7049 2.12061 2.81343C2.12061 2.92196 2.142 3.02943 2.18357 3.12969C2.22514 3.22995 2.28607 3.32102 2.36287 3.39771L4.38001 5.41486C4.53766 5.55638 4.74354 5.63214 4.95532 5.62657C5.1671 5.621 5.3687 5.53451 5.51869 5.38489C5.66868 5.23527 5.75566 5.03388 5.76175 4.82211C5.76784 4.61034 5.69258 4.40428 5.55144 4.24629L5.09144 3.78629H11.5857C12.3175 3.78704 13.0191 4.07807 13.5365 4.59551C14.0539 5.11294 14.345 5.81452 14.3457 6.54629C14.3463 7.19597 14.1544 7.83126 13.7943 8.372C13.6748 8.5549 13.6323 8.77761 13.6762 8.99165C13.7201 9.20569 13.8467 9.39374 14.0286 9.51486C14.1644 9.60396 14.3233 9.65161 14.4857 9.652C14.6223 9.6521 14.7568 9.6182 14.877 9.55336C14.9972 9.48851 15.0994 9.39477 15.1743 9.28057C15.7132 8.47055 16.0005 7.51921 16 6.54629C15.9985 5.37601 15.5329 4.2541 14.7054 3.42658C13.8779 2.59907 12.756 2.13351 11.5857 2.132Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nconst liquidityIcon = (\n <svg\n width=\"20\"\n height=\"18\"\n viewBox=\"0 0 20 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.67689 9.5C3.42392 8.81656 3.28571 8.07718 3.28571 7.30542C3.28571 3.82303 6.09992 1 9.57142 1C13.0429 1 15.8571 3.82303 15.8571 7.30542C15.8571 8.93781 15.2388 10.4253 14.2242 11.5451\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n <path\n d=\"M1 10.5189C8.5 6.99986 11 14 18.1429 10.5189M1 15.5C8.5 11.9809 11 18.9811 18.1429 15.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n);\nconst lendingIcon = (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.30875 5.99853C4.30742 5.41955 4.42014 4.84597 4.64048 4.31055C4.86082 3.77513 5.18445 3.28836 5.59292 2.87801C6.00138 2.46767 6.48666 2.1418 7.02107 1.91901C7.55547 1.69621 8.12852 1.58086 8.7075 1.57953C11.1375 1.57953 13.1062 3.5584 13.1062 5.99853C13.1071 6.78301 12.8991 7.55358 12.5037 8.23111C12.1083 8.90865 11.5397 9.46875 10.8562 9.8539C10.6313 10.5014 10.2105 11.0629 9.65211 11.4604C9.09372 11.8579 8.42545 12.0718 7.74 12.0724H5.5665V10.5267H7.74225C8.71425 10.5267 9.50175 9.73578 9.50175 8.75928V8.64903H3.22763L3.20288 14.7668H12.9893C13.9601 14.7668 14.7488 13.9748 14.7488 12.9994L14.7724 10.8574H12.3165V9.31165H16.3125L16.2878 12.9994C16.2892 13.876 15.9427 14.7174 15.3242 15.3386C14.7057 15.9599 13.8659 16.3101 12.9893 16.3125H1.66275L1.6875 7.10215H4.44713C4.35496 6.74153 4.30847 6.37075 4.30875 5.99853ZM6.06713 7.10215H11.0396V7.65903C11.3715 7.1899 11.5673 6.61728 11.5673 5.99853C11.5681 5.62215 11.4949 5.24928 11.3516 4.90122C11.2084 4.55317 10.9979 4.23674 10.7324 3.97003C10.4668 3.70331 10.1513 3.49153 9.80386 3.34678C9.45643 3.20202 9.08388 3.12714 8.7075 3.1264C8.33112 3.12714 7.95857 3.20202 7.61114 3.34678C7.2637 3.49153 6.94819 3.70331 6.68262 3.97003C6.41705 4.23674 6.20664 4.55317 6.06339 4.90122C5.92014 5.24928 5.84686 5.62215 5.84775 5.99853C5.84775 6.3889 5.9265 6.76353 6.06713 7.10215Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nconst { swapConfig, ...restProps } = props;\n\nreturn (\n <Layout>\n <Container>\n <MenuContainer>\n <div\n onClick={() => {\n changeTab(\"Bridge\");\n }}\n className={`item ${activeMenu == \"Bridge\" ? \"active\" : \"\"}`}\n >\n <span className=\"icon\">{bridgeIcon}</span>\n Bridge\n </div>\n <div\n onClick={() => {\n changeTab(\"swap\");\n }}\n className={`item ${activeMenu == \"swap\" ? \"active\" : \"\"}`}\n >\n <span className=\"icon\">{swapIcon}</span>\n Swap\n </div>\n\n <div\n className={`item ${activeMenu == \"Liquidity\" ? \"active\" : \"\"}`}\n onClick={() => {\n changeTab(\"Liquidity\");\n }}\n >\n <span className=\"icon\">{liquidityIcon}</span>\n Liquidity\n </div>\n </MenuContainer>\n <div className=\"flex-grow contentOut\">\n {activeMenu == \"Bridge\" ? (\n <>\n <Widget\n src=\"guessme.near/widget/ZKEVMSwap.zkevm-bridge\"\n props={{\n layout: \"center\",\n ...restProps,\n }}\n />\n </>\n ) : null}\n {activeMenu == \"swap\" ? (\n <>\n <Widget\n src=\"bluebiu.near/widget/PolygonZkevm.Swap.Dex\"\n props={{\n layout: \"center\",\n ...swapConfig,\n ...restProps,\n }}\n />\n </>\n ) : null}\n {activeMenu == \"Liquidity\" ? (\n <>\n <Widget\n src=\"bluebiu.near/widget/ZKEVM.GAMMA\"\n props={{ ...restProps }}\n />\n </>\n ) : null}\n </div>\n </Container>\n </Layout>\n);\n", "metadata": { "image": { "ipfs_cid": "bafkreiaednvljfk5splm5p3eisbkr3v5laiazldxqirtxs5koimckebsyu" }, "name": "Polygon zkEVM All-in-one", "tags": { "dexes": "" } } }, "AAVE.Card.Markets": { "": "const {\n config,\n addAction,\n dexConfig,\n assetsToSupply,\n showSupplyModal,\n setShowSupplyModal,\n onActionSuccess,\n chainId,\n healthFactor,\n formatHealthFactor,\n calcHealthFactor,\n depositETHGas,\n depositERC20Gas,\n theme,\n yourTotalSupply,\n yourSupplies,\n borrowETHGas,\n borrowERC20Gas,\n} = props;\n\nconst CenterRow = styled.div`\n /* text-align: center; */\n`;\n\nconst CenterItem = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nconst ItemPrimary = styled.div`\n font-size: 16px;\n\n &.apy {\n color: rgb(34, 160, 107);\n }\n`;\nconst ItemSub = styled.div`\n font-size: 14px;\n font-weight: 400;\n color: rgb(162, 166, 149);\n &.radio {\n display: flex;\n gap: 3px;\n align-items: center;\n color: rgb(178, 232, 16);\n }\n`;\n\nconst IconMouth = styled.img`\n width: 14px;\n height: 14px;\n`;\n\nState.init({\n data: undefined,\n showBorrowModal: false,\n showLoopModal: false,\n});\n\nconst SupplyButton = ({ data, ...rest }) => {\n let disabled;\n\n if (dexConfig.name === \"Seamless Protocol\") {\n const { totalSupplyUSD, supplyCapUSD } = data;\n const isFull = Big(totalSupplyUSD || 0).gte(Big(supplyCapUSD || 0));\n\n disabled = Number(data.balanceInUSD) === 0 || isFull;\n } else {\n disabled = Number(data.balanceInUSD) === 0;\n }\n return (\n <Widget\n src={`${config.ownerId}/widget/AAVE.PrimaryButton`}\n props={{\n config,\n // width: 148,\n theme,\n children: \"Supply\",\n disabled,\n onClick: () => {\n State.update({ data });\n setShowSupplyModal(true);\n },\n }}\n />\n );\n};\n\nconst BorrowButton = ({ data }) => {\n let disabled;\n if (dexConfig.name === \"Seamless Protocol\") {\n const { totalDebtsUSD, borrowCapUSD } = data;\n const isFull = Big(totalDebtsUSD || 0).gte(Big(borrowCapUSD || 0));\n\n disabled =\n isNaN(Number(yourTotalSupply)) || !Number(yourTotalSupply) || isFull;\n } else {\n disabled = isNaN(Number(yourTotalSupply)) || !Number(yourTotalSupply);\n }\n if (!data.supportBorrow) {\n disabled = true;\n }\n return (\n <Widget\n src={`${config.ownerId}/widget/AAVE.PrimaryButton`}\n props={{\n config,\n disabled,\n children: \"Borrow\",\n theme,\n onClick: () => {\n State.update({ data, showBorrowModal: true });\n // setShowBorrowModal(true);\n },\n }}\n />\n );\n};\n\nconst LoopButton = ({ data }) => {\n let disabled;\n // if (dexConfig.name === \"Seamless Protocol\") {\n // const { totalSupplyUSD, supplyCapUSD } = data;\n // const isFull = Big(totalSupplyUSD || 0).gte(Big(supplyCapUSD || 0));\n\n // disabled = Number(data.balanceInUSD) === 0 || isFull;\n // } else {\n // disabled = Number(data.balanceInUSD) === 0;\n // }\n if (!data.supportLoop) {\n disabled = true;\n }\n return (\n <Widget\n src={`${config.ownerId}/widget/AAVE.PrimaryButton`}\n props={{\n config,\n disabled,\n children: \"Loop\",\n theme,\n onClick: () => {\n State.update({ data, showLoopModal: true });\n },\n }}\n />\n );\n};\n\nfunction formatRate(_value) {\n if (isNaN(Number(_value))) return \"\";\n let value = (Number(_value) * 100).toFixed();\n return Big(value || 0).lt(0.01) ? \"<0.01%\" : `${Number(value).toFixed(2)}%`;\n}\n\nfunction formatNumber(value, digits) {\n if (isNaN(Number(value))) return \"\";\n if (Big(value || 0).eq(0)) return `$ 0`;\n return Big(value || 0).lt(0.01)\n ? \"< $0.01\"\n : `$ ${Number(value).toFixed(digits || 2)}`;\n}\nfunction formatValue(value, digits) {\n if (isNaN(Number(value))) return \"\";\n if (Number(value) === 0) return \"0\";\n return Big(value || 0).lt(0.0000001)\n ? \"< 0.0000001\"\n : `${Number(value).toFixed(digits || 2)}`;\n}\nlet headers;\nlet tableData;\n\nif ([\"ZeroLend\", \"AAVE V3\", \"Seamless Protocol\"].includes(dexConfig.name)) {\n headers = [\n \"Asset\",\n \"Wallet Balance\",\n \"Supply APY\",\n \"Available to borrow\",\n \"Borrow APY\",\n \"Can be Collateral\",\n \"\",\n ];\n tableData = assetsToSupply.map((row) => [\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.TokenWrapper`}\n props={{\n children: [\n <img width={64} height={64} src={row.icon} />,\n <CenterItem>\n <div className=\"token-title\">{row.symbol}</div>\n {/* <div className=\"token-chain\">{row.name}</div> */}\n </CenterItem>,\n ],\n }}\n />,\n <div>\n <div>{formatValue(row.balance, 7)}</div>\n <div>{formatNumber(row.balanceInUSD)}</div>\n </div>,\n <div>\n <div>\n {row.supplyAPY ? `${(Number(row.supplyAPY) * 100).toFixed(2)} %` : \"\"}\n </div>\n\n <div>\n {dexConfig.rewardToken && row.supplyRewardApy\n ? `${(Number(row.supplyRewardApy) * 100).toFixed(2)} %`\n : \"\"}\n </div>\n </div>,\n <div>\n <CenterRow>{formatValue(row.availableBorrows, 7)}</CenterRow>\n <CenterRow>{formatNumber(row.availableBorrowsUSD)}</CenterRow>\n {/* <CenterRow>\n {row.availableBorrows ? Number(row.availableBorrows).toFixed(7) : \"\"}\n </CenterRow>\n\n <CenterRow>\n {row.availableBorrowsUSD\n ? `$${Number(row.availableBorrowsUSD).toFixed(2)}`\n : \"\"}\n </CenterRow> */}\n </div>,\n\n <div>\n <div>\n {row.borrowAPY ? `${(Number(row.borrowAPY) * 100).toFixed(2)} %` : \"\"}\n </div>\n <div>\n {dexConfig.rewardToken && row.borrowRewardApy\n ? `${(Number(row.borrowRewardApy) * 100).toFixed(2)} %`\n : \"\"}\n </div>\n </div>,\n <div style={{ paddingLeft: \"50px\" }}>\n {(row.isIsolated || (!row.isIsolated && !row.usageAsCollateralEnabled)) &&\n \"—\"}\n {!row.isIsolated && row.usageAsCollateralEnabled && (\n <img\n src={`${config.ipfsPrefix}/bafkreibsy5fzn67veowyalveo6t34rnqvktmok2zutdsp4f5slem3grc3i`}\n width={16}\n height={16}\n />\n )}\n </div>,\n <div style={{ display: \"flex\", gap: 10 }}>\n {row.balance ? <SupplyButton data={row} /> : null}\n\n <BorrowButton\n data={{\n ...row,\n }}\n />\n </div>,\n ]);\n}\nif ([\"Pac Finance\"].includes(dexConfig.name)) {\n headers = [\n \"Assets\",\n \"Your Balance\",\n // \"Estimated Blast Points\",\n \"Supply APY\",\n \"Borrow APY\",\n \"Pool Liquidity\",\n // \"Can be Collateral\",\n \"\",\n ];\n tableData = assetsToSupply.map((row) => [\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.TokenWrapper`}\n props={{\n children: [\n <img width={64} height={64} src={row.icon} />,\n <CenterItem>\n <ItemPrimary style={{ fontWeight: 700 }}>{row.symbol}</ItemPrimary>\n <ItemSub>LTV: {Big(row.LTV).times(100).toFixed()}%</ItemSub>\n </CenterItem>,\n ],\n }}\n />,\n <CenterItem>\n <ItemPrimary>{formatValue(row.balance, 7)}</ItemPrimary>\n <ItemSub>{formatNumber(row.balanceInUSD)}</ItemSub>\n </CenterItem>,\n // <CenterItem>\n // <ItemPrimary>{}</ItemPrimary>\n // <ItemSub>{`Pts/day/${row.symbol}`}</ItemSub>\n // </CenterItem>,\n <CenterItem>\n <ItemPrimary className=\"apy\">{`${(\n (Number(row.supplyAPY) + Number(row.NATIVE_YIELD || 0)) *\n 100\n ).toFixed(2)} %`}</ItemPrimary>\n <ItemSub className=\"radio\">\n <IconMouth src=\"https://ipfs.near.social/ipfs/bafkreiffqyfmusnew73zt6slkeoryvevuw7ojcgvfdirgf3oqdsll5yyga\" />\n {Number(row.EXTRA_RADIO) * 100}%\n </ItemSub>\n </CenterItem>,\n <CenterItem>\n <ItemPrimary className=\"apy\">{`${(Number(row.borrowAPY) * 100).toFixed(\n 2\n )} %`}</ItemPrimary>\n </CenterItem>,\n <CenterItem>\n <ItemPrimary>\n <Widget\n src={`${config.ownerId}/widget/Utils.FormatNumber`}\n props={{ number: row.totalSupply }}\n />\n </ItemPrimary>\n <ItemSub>{formatRate(row.utilized)} utilized</ItemSub>\n </CenterItem>,\n // <CenterItem style={{ paddingLeft: \"50px\" }}>\n // {(row.isIsolated || (!row.isIsolated && !row.usageAsCollateralEnabled)) &&\n // \"—\"}\n // {!row.isIsolated && row.usageAsCollateralEnabled && (\n // <img\n // src={`${config.ipfsPrefix}/bafkreibsy5fzn67veowyalveo6t34rnqvktmok2zutdsp4f5slem3grc3i`}\n // width={16}\n // height={16}\n // />\n // )}\n // </CenterItem>,\n <div style={{ display: \"flex\", gap: 10 }}>\n {row.balance ? <SupplyButton data={row} /> : null}\n <BorrowButton\n data={{\n ...row,\n }}\n />\n {row.balance ? <LoopButton data={row} /> : null}\n </div>,\n ]);\n}\nreturn (\n <>\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.CardsView`}\n props={{\n config,\n style: {\n marginTop: \"16px\",\n },\n title: \"Market\",\n body:\n !assetsToSupply || assetsToSupply.length === 0 ? (\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.CardEmpty`}\n props={{\n config,\n children: \"Nothing supplied yet\",\n }}\n />\n ) : (\n <>\n <Widget\n src={`${config.ownerId}/widget/AAVE.Card.CardsTable`}\n props={{\n config,\n headers,\n data: tableData,\n }}\n />\n </>\n ),\n }}\n />\n {showSupplyModal && (\n <Widget\n src={`${config.ownerId}/widget/AAVE.Modal.SupplyModal`}\n props={{\n config,\n theme,\n onRequestClose: () => setShowSupplyModal(false),\n data: {\n ...state.data,\n healthFactor,\n },\n onActionSuccess,\n chainId,\n depositETHGas,\n depositERC20Gas,\n formatHealthFactor,\n calcHealthFactor,\n addAction,\n dexConfig,\n }}\n />\n )}\n {state.showBorrowModal && (\n <Widget\n src={`${config.ownerId}/widget/AAVE.Modal.BorrowModal`}\n props={{\n config,\n theme,\n onRequestClose: () => {\n State.update({\n showBorrowModal: false,\n });\n // setShowBorrowModal(false)\n },\n data: {\n ...state.data,\n healthFactor,\n },\n onActionSuccess,\n chainId,\n borrowETHGas,\n borrowERC20Gas,\n formatHealthFactor,\n calcHealthFactor,\n addAction,\n dexConfig,\n }}\n />\n )}\n {state.showLoopModal && (\n <Widget\n src={`${config.ownerId}/widget/AAVE.Modal.LoopModal`}\n props={{\n config,\n theme,\n // onRequestClose: () => setShowSupplyModal(false),\n onRequestClose: () => {\n State.update({\n showLoopModal: false,\n });\n },\n data: {\n ...state.data,\n healthFactor,\n },\n onActionSuccess,\n chainId,\n depositETHGas,\n depositERC20Gas,\n formatHealthFactor,\n calcHealthFactor,\n addAction,\n dexConfig,\n }}\n />\n )}\n </>\n);\n" } } } } }
Result:
{ "block_height": "117147655" }
No logs
Receipt:
Predecessor ID:
Receiver ID:
Gas Burned:
223 Ggas
Tokens Burned:
0 
Transferred 0.18619  to bluebiu.near
Empty result
No logs