From 6563217b1ae6575ddca41a3dfc0f63b245ce7733 Mon Sep 17 00:00:00 2001 From: Vignesh Date: Mon, 30 Sep 2024 20:07:58 +0530 Subject: [PATCH] bug fixes --- backend/src/paymaster/index.ts | 28 ++++++++++++++++++-------- backend/src/routes/paymaster-routes.ts | 4 ++-- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/backend/src/paymaster/index.ts b/backend/src/paymaster/index.ts index 49ce61d..732eaf4 100644 --- a/backend/src/paymaster/index.ts +++ b/backend/src/paymaster/index.ts @@ -13,6 +13,7 @@ import OrochiOracleAbi from '../abi/OrochiOracleAbi.js'; import ChainlinkOracleAbi from '../abi/ChainlinkOracleAbi.js'; import ERC20PaymasterV07Abi from '../abi/ERC20PaymasterV07Abi.js'; import ERC20Abi from '../abi/ERC20Abi.js'; +import EtherspotChainlinkOracleAbi from '../abi/EtherspotChainlinkOracleAbi.js'; export class Paymaster { feeMarkUp: BigNumber; @@ -235,11 +236,12 @@ export class Paymaster { result.gasEstimates.verificationGasLimit = response.verificationGasLimit; result.feeEstimates.maxFeePerGas = response.maxFeePerGas; result.feeEstimates.maxPriorityFeePerGas = response.maxPriorityFeePerGas; - - const paymasterAddress = multiTokenPaymasters[chainId][tokens_list[0]]; - result.paymasterAddress = paymasterAddress; - const paymasterContract = new ethers.Contract(paymasterAddress, MultiTokenPaymasterAbi, provider); - result.postOpGas = await paymasterContract.UNACCOUNTED_COST; + if (!multiTokenPaymasters[chainId]) { + const paymasterAddress = multiTokenPaymasters[chainId][tokens_list[0]]; + result.paymasterAddress = paymasterAddress; + const paymasterContract = new ethers.Contract(paymasterAddress, MultiTokenPaymasterAbi, provider); + result.postOpGas = await paymasterContract.UNACCOUNTED_COST; + } for (let i = 0; i < tokens_list.length; i++) { const gasToken = tokens_list[i]; @@ -253,11 +255,16 @@ export class Paymaster { const oracleContract = new ethers.Contract(oracleAddress, OrochiOracleAbi, provider); const result = await oracleContract.getLatestData(1, ethers.utils.hexlify(ethers.utils.toUtf8Bytes('ETH')).padEnd(42, '0')) ethPrice = Number(ethers.utils.formatEther(result)).toFixed(0); - } else { + } else if (oracleName === "chainlink") { const chainlinkContract = new ethers.Contract(oracleAddress, ChainlinkOracleAbi, provider); const decimals = await chainlinkContract.decimals(); const result = await chainlinkContract.latestAnswer(); ethPrice = Number(ethers.utils.formatUnits(result, decimals)).toFixed(0); + } else { + const ecContract = new ethers.Contract(oracleAddress, EtherspotChainlinkOracleAbi, provider); + const decimals = await ecContract.decimals(); + const result = await ecContract.cachedPrice(); + ethPrice = Number(ethers.utils.formatUnits(result, decimals)).toFixed(0); } result.etherUSDExchangeRate = BigNumber.from(ethPrice).toHexString(); const exchangeRate = 1000000; // This is for setting min tokens required for the txn that gets validated on estimate @@ -295,10 +302,15 @@ export class Paymaster { const oracleContract = new ethers.Contract(oracleAggregator, OrochiOracleAbi, provider); const result = await oracleContract.getLatestData(1, ethers.utils.hexlify(ethers.utils.toUtf8Bytes('ETH')).padEnd(42, '0')) ethPrice = Number(ethers.utils.formatEther(result)).toFixed(0); - } else { + } else if (oracleName === "chainlink") { const chainlinkContract = new ethers.Contract(oracleAggregator, ChainlinkOracleAbi, provider); const decimals = await chainlinkContract.decimals(); - const result = await chainlinkContract.latestAnswer(); + const result = await chainlinkContract.latestRoundData(); + ethPrice = Number(ethers.utils.formatUnits(result.answer, decimals)).toFixed(0); + } else { + const ecContract = new ethers.Contract(oracleAggregator, EtherspotChainlinkOracleAbi, provider); + const decimals = await ecContract.decimals(); + const result = await ecContract.cachedPrice(); ethPrice = Number(ethers.utils.formatUnits(result, decimals)).toFixed(0); } userOp.paymasterAndData = await this.getPaymasterAndDataForMultiTokenPaymaster(userOp, validUntil, validAfter, feeToken, ethPrice, paymasterContract, signer); diff --git a/backend/src/routes/paymaster-routes.ts b/backend/src/routes/paymaster-routes.ts index c06774b..a68c95e 100644 --- a/backend/src/routes/paymaster-routes.ts +++ b/backend/src/routes/paymaster-routes.ts @@ -213,7 +213,7 @@ const paymasterRoutes: FastifyPluginAsync = async (server) => { if (epVersion !== EPVersions.EPV_06) throw new Error('Currently only EPV06 entryPoint address is supported') if (!networkConfig.MultiTokenPaymasterOracleUsed || - !(networkConfig.MultiTokenPaymasterOracleUsed == "orochi" || networkConfig.MultiTokenPaymasterOracleUsed == "chainlink")) + !(networkConfig.MultiTokenPaymasterOracleUsed == "orochi" || networkConfig.MultiTokenPaymasterOracleUsed == "chainlink" || networkConfig.MultiTokenPaymasterOracleUsed == "etherspotChainlink")) throw new Error("Oracle is not Defined/Invalid"); result = await paymaster.getQuotesMultiToken(userOp, entryPoint, chainId, multiTokenPaymasters, tokens_list, multiTokenOracles, bundlerUrl, networkConfig.MultiTokenPaymasterOracleUsed, server.log); } @@ -331,7 +331,7 @@ const paymasterRoutes: FastifyPluginAsync = async (server) => { str += hex; str1 += hex1; if (!networkConfig.MultiTokenPaymasterOracleUsed || - !(networkConfig.MultiTokenPaymasterOracleUsed == "orochi" || networkConfig.MultiTokenPaymasterOracleUsed == "chainlink")) + !(networkConfig.MultiTokenPaymasterOracleUsed == "orochi" || networkConfig.MultiTokenPaymasterOracleUsed == "chainlink" || networkConfig.MultiTokenPaymasterOracleUsed == "etherspotChainlink")) throw new Error("Oracle is not Defined/Invalid"); result = await paymaster.signMultiTokenPaymaster(userOp, str, str1, entryPoint, multiTokenPaymasters[chainId][gasToken], gasToken, multiTokenOracles[chainId][gasToken], bundlerUrl, signer, networkConfig.MultiTokenPaymasterOracleUsed, server.log); break;