import{ethers,formatUnits,parseUnits}from'ethers';importerc20from'../../abis/erc20.json';importaavePoolABIfrom'../../abis/aave_pool.json';importaaveDataProviderABIfrom'../../abis/aave_data_provider.json';exportconstaavePoolContractAddress='0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2';exportconstaaveDataProviderContractAddress='0x7B4EB56E7CD4b454BA8ff71E4518426369a138a3';constaaveFetchData=async ({evmProvider,contractAddress,walletAddress,tokenDecimals,poolContractAddress,poolABI,dataProviderContractAddress,dataProviderABI,})=>{constpool=newethers.Contract(poolContractAddress,poolABI,evmProvider);constreserveData=awaitpool.getReserveData(contractAddress);constliquidityRate=reserveData[2];constapy=(parseFloat(formatUnits(liquidityRate,27))*100).toFixed(2);letstakedAmount=null;letstakedAmountRaw=null;if (walletAddress&&dataProviderContractAddress&&dataProviderABI){constdataProvider=newethers.Contract(dataProviderContractAddress,dataProviderABI,evmProvider,);const[aTokenAddress]=awaitdataProvider.getReserveTokensAddresses(contractAddress,);constaToken=newethers.Contract(aTokenAddress,erc20,evmProvider);constbalance=awaitaToken.balanceOf(walletAddress);stakedAmount=formatUnits(balance,tokenDecimals);stakedAmountRaw=balance.toString();}return{apy,stakedAmount,stakedAmountRaw};};exportconstaaveProvider={icon:'https://cdn-icons-png.flaticon.com/512/17978/17978942.png',name:'Aave',apy:'0% APY',stakedAmount:'0',stakedAmountRaw:null,poolContractAddress:aavePoolContractAddress,poolABI:aavePoolABI,dataProviderContractAddress:aaveDataProviderContractAddress,dataProviderABI:aaveDataProviderABI,createStaking:async ({from,amount,privateKey,contractAddress,decimals,evmProvider},provider,)=>{constwallet=newethers.Wallet(privateKey);constwalletSigner=wallet.connect(evmProvider);consttokenContract=newethers.Contract(contractAddress,erc20,walletSigner,);constamountInWei=parseUnits(amount.toString(),decimals);constbalance=awaittokenContract.balanceOf(from);if (balance<amountInWei){thrownewError('Insufficient balance');}constallowance=awaittokenContract.allowance(from,aavePoolContractAddress,);if (allowance<amountInWei){constapproveTx=awaittokenContract.approve(aavePoolContractAddress,amountInWei,);awaitapproveTx.wait();}constpool=newethers.Contract(aavePoolContractAddress,aavePoolABI,walletSigner,);constgasLimit=awaitpool.supply.estimateGas(contractAddress,amountInWei,from,0,);awaitpool.supply.staticCall(contractAddress,amountInWei,from,0,{gasLimit,});consttx=awaitpool.supply(contractAddress,amountInWei,from,0,{gasLimit,});awaittx.wait();returntx.hash;},getEstimateFeeForStaking:async ({from,amount,privateKey,contractAddress,decimals,evmProvider},provider,)=>{constwallet=newethers.Wallet(privateKey);constwalletSigner=wallet.connect(evmProvider);consttokenContract=newethers.Contract(contractAddress,erc20,walletSigner,);constamountInWei=parseUnits(amount.toString(),decimals);constpool=newethers.Contract(aavePoolContractAddress,aavePoolABI,walletSigner,);letestimateGas;try{// Works when allowance is already setestimateGas=awaitpool.supply.estimateGas(contractAddress,amountInWei,from,0,);}catch{// Allowance not yet set — estimate approve gas + known Aave v3 supply costconstapproveGas=awaittokenContract.approve.estimateGas(aavePoolContractAddress,amountInWei,);// Aave v3 supply consistently costs 220k-280k gas for USDT/USDCestimateGas=approveGas+300000n;}return{estimateGas};},unStaking:async ({from,amount,privateKey,contractAddress,evmProvider},provider,)=>{try{constwallet=newethers.Wallet(privateKey);constwalletSigner=wallet.connect(evmProvider);constpool=newethers.Contract(aavePoolContractAddress,aavePoolABI,walletSigner,);constgasLimit=awaitpool.withdraw.estimateGas(contractAddress,ethers.MaxUint256,from,);awaitpool.withdraw.staticCall(contractAddress,ethers.MaxUint256,from);consttx=awaitpool.withdraw(contractAddress,ethers.MaxUint256,from,{gasLimit,});awaittx.wait();returntx.hash;}catch (error){console.log(error);throwerror;}},getStakingBalance:async ({evmProvider,address,contractAddress},provider,)=>{try{constdataProvider=newethers.Contract(provider.dataProviderContractAddress,provider.dataProviderABI,evmProvider,);const[aTokenAddress]=awaitdataProvider.getReserveTokensAddresses(contractAddress,);constaToken=newethers.Contract(aTokenAddress,erc20,evmProvider);constbalance=awaitaToken.balanceOf(address);return{stakingBalance:balance.toString()||'0',energyBalance:'0',bandwidthBalance:'0',};}catch (error){console.error('[aaveProvider getStakingBalance] error:',error?.message);throwerror;}},getEstimateFeeForDeactivateStaking:async ({from,privateKey,contractAddress,evmProvider,})=>{try{constwallet=newethers.Wallet(privateKey);constwalletSigner=wallet.connect(evmProvider);constpool=newethers.Contract(aavePoolContractAddress,aavePoolABI,walletSigner,);constestimateGas=awaitpool.withdraw.estimateGas(contractAddress,ethers.MaxUint256,from,);return{estimateGas};}catch (e){console.error('Error in EVMChain getEstimateFeeForDeactivateStaking',e);throwe;}},fetchData:async ({evmProvider,contractAddress,walletAddress,tokenDecimals},provider,)=>aaveFetchData({evmProvider,contractAddress,walletAddress,tokenDecimals,poolContractAddress:provider.poolContractAddress,poolABI:provider.poolABI,dataProviderContractAddress:provider.dataProviderContractAddress,dataProviderABI:provider.dataProviderABI,}),};
Top comments (0)
Subscribe
We're a place where coders share, stay up-to-date and grow their careers.
Top comments (0)