From 2099bcb9e5c1e0ec430cdd57f24803cb8e5214ce Mon Sep 17 00:00:00 2001 From: Vignesh Date: Thu, 31 Jul 2025 04:28:10 +0530 Subject: [PATCH 1/3] added multiTokenPaymaster for Mainnet and cron job fixes --- .../migrations/2025073000001-seed-data.cjs | 18 ++ .../constants/MultiTokenPaymasterCronJob.ts | 251 ++++++++++++++++++ backend/src/constants/MultitokenPaymaster.ts | 3 + backend/src/server.ts | 219 ++++++++------- backend/src/utils/common.ts | 24 +- 5 files changed, 413 insertions(+), 102 deletions(-) create mode 100644 backend/migrations/2025073000001-seed-data.cjs create mode 100644 backend/src/constants/MultiTokenPaymasterCronJob.ts diff --git a/backend/migrations/2025073000001-seed-data.cjs b/backend/migrations/2025073000001-seed-data.cjs new file mode 100644 index 0000000..aadeb1e --- /dev/null +++ b/backend/migrations/2025073000001-seed-data.cjs @@ -0,0 +1,18 @@ +require('dotenv').config(); +const ethers = require('ethers'); + +async function up({ context: queryInterface }) { + await queryInterface.sequelize.query(`INSERT INTO "${process.env.DATABASE_SCHEMA_NAME}".multi_token_paymaster ("TOKEN_ADDRESS", "PAYMASTER_ADDRESS", "ORACLE_ADDRESS", "CHAIN_ID", "DECIMALS", "CREATED_AT", "UPDATED_AT", "EP_VERSION") VALUES ('${ethers.utils.getAddress('0xdAC17F958D2ee523a2206206994597C13D831ec7')}', '0x5E6ce32Bb6Fa47001cf87f2f9E07d5Fd3dE57990', '0x3E7d1eAB13ad0104d2750B8863b489D65364e32D', 1, 6, NOW(), NOW(), 'EPV_07')`); + await queryInterface.sequelize.query(`INSERT INTO "${process.env.DATABASE_SCHEMA_NAME}".multi_token_paymaster ("TOKEN_ADDRESS", "PAYMASTER_ADDRESS", "ORACLE_ADDRESS", "CHAIN_ID", "DECIMALS", "CREATED_AT", "UPDATED_AT", "EP_VERSION") VALUES ('${ethers.utils.getAddress('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48')}', '0x5E6ce32Bb6Fa47001cf87f2f9E07d5Fd3dE57990', '0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6', 1, 6, NOW(), NOW(), 'EPV_07')`); + await queryInterface.sequelize.query(`INSERT INTO "${process.env.DATABASE_SCHEMA_NAME}".multi_token_paymaster ("TOKEN_ADDRESS", "PAYMASTER_ADDRESS", "ORACLE_ADDRESS", "CHAIN_ID", "DECIMALS", "CREATED_AT", "UPDATED_AT", "EP_VERSION") VALUES ('${ethers.utils.getAddress('0x514910771AF9Ca656af840dff83E8264EcF986CA')}', '0x5E6ce32Bb6Fa47001cf87f2f9E07d5Fd3dE57990', '0x2c1d072e956AFFC0D435Cb7AC38EF18d24d9127c', 1, 18, NOW(), NOW(), 'EPV_07')`); + await queryInterface.sequelize.query(`INSERT INTO "${process.env.DATABASE_SCHEMA_NAME}".multi_token_paymaster ("TOKEN_ADDRESS", "PAYMASTER_ADDRESS", "ORACLE_ADDRESS", "CHAIN_ID", "DECIMALS", "CREATED_AT", "UPDATED_AT", "EP_VERSION") VALUES ('${ethers.utils.getAddress('0xB8c77482e45F1F44dE1745F52C74426C631bDD52')}', '0x5E6ce32Bb6Fa47001cf87f2f9E07d5Fd3dE57990', '0x14e613AC84a31f709eadbdF89C6CC390fDc9540A', 1, 18, NOW(), NOW(), 'EPV_07')`); + await queryInterface.sequelize.query(`INSERT INTO "${process.env.DATABASE_SCHEMA_NAME}".multi_token_paymaster ("TOKEN_ADDRESS", "PAYMASTER_ADDRESS", "ORACLE_ADDRESS", "CHAIN_ID", "DECIMALS", "CREATED_AT", "UPDATED_AT", "EP_VERSION") VALUES ('${ethers.utils.getAddress('0xB50721BCf8d664c30412Cfbc6cf7a15145234ad1')}', '0x5E6ce32Bb6Fa47001cf87f2f9E07d5Fd3dE57990', '0x31697852a68433DbCc2Ff612c516d69E3D9bd08F', 1, 18, NOW(), NOW(), 'EPV_07')`); + await queryInterface.sequelize.query(`INSERT INTO "${process.env.DATABASE_SCHEMA_NAME}".multi_token_paymaster ("TOKEN_ADDRESS", "PAYMASTER_ADDRESS", "ORACLE_ADDRESS", "CHAIN_ID", "DECIMALS", "CREATED_AT", "UPDATED_AT", "EP_VERSION") VALUES ('${ethers.utils.getAddress('0xF57e7e7C23978C3cAEC3C3548E3D615c346e79fF')}', '0x5E6ce32Bb6Fa47001cf87f2f9E07d5Fd3dE57990', '0xBAEbEFc1D023c0feCcc047Bff42E75F15Ff213E6', 1, 18, NOW(), NOW(), 'EPV_07')`); + await queryInterface.sequelize.query(`INSERT INTO "${process.env.DATABASE_SCHEMA_NAME}".multi_token_paymaster ("TOKEN_ADDRESS", "PAYMASTER_ADDRESS", "ORACLE_ADDRESS", "CHAIN_ID", "DECIMALS", "CREATED_AT", "UPDATED_AT", "EP_VERSION") VALUES ('${ethers.utils.getAddress('0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0')}', '0x5E6ce32Bb6Fa47001cf87f2f9E07d5Fd3dE57990', '0x7bAC85A8a13A4BcD8abb3eB7d6b4d632c5a57676', 1, 18, NOW(), NOW(), 'EPV_07')`); +} + +async function down({ context: queryInterface }) { + await queryInterface.sequelize.query(`DELETE IF EXISTS FROM "${process.env.DATABASE_SCHEMA_NAME}".multi_token_paymaster;`); +} + +module.exports = { up, down } diff --git a/backend/src/constants/MultiTokenPaymasterCronJob.ts b/backend/src/constants/MultiTokenPaymasterCronJob.ts new file mode 100644 index 0000000..16ddbd5 --- /dev/null +++ b/backend/src/constants/MultiTokenPaymasterCronJob.ts @@ -0,0 +1,251 @@ +/** + * This file contains the multi-token paymaster addresses and oracles for various tokens on popular networks. + * which would be used on cron jobs to fetch the latest token prices and update the cache token prices for each. + * */ +export const MULTI_TOKEN_PAYMASTERS: Record> = { + "137": { + "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xc2132D05D31c914a87C6611C10748AEb04B58e8F": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xD6DF932A45C0f255f85145f286eA0b292B21C90B": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x8f3cf7ad23cd3cadbd9735aff958023239c6a063": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xb5c064f955d8e7f38fe0460c556a72987494ee17": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xbbba073c31bf03b8acf7c28ef0738decf3695683": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x2e1ad108ff1d8c782fcbbb89aad783ac49586756": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xb33eaad8d922b1083446dc23f610c2567fb5180f": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x9a71012b13ca4d3d0cdc72a177df3ef03b0e76a3": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x172370d5cd63279efa6d502dab29171933a610af": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xfa68fb4628dff1028cfec22b4162fccd0d45efb6": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3" + }, + "8453": { + "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x9EaF8C1E34F05a589EDa6BAfdF391Cf6Ad3CB239": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3" + }, + "42161": { + "0xaf88d065e77c8cC2239327C5EDb3A432268e5831": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x912CE59144191C1204E64559FE8253a0e49E6548": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xfc5A1A6EB076a2C7aD06eD22C90d7E710E35ad0a": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xFa7F8980b0f1E64A2062791cc3b0871572f1F7f0": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x371c7ec6D8039ff7933a2AA28EB827Ffe1F52f07": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x040d1EdC9569d4Bab2D15287Dc5A4F10F56a56B8": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xf97f4df75117a78c1A5a0DBb814Af92458539FB4": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xd4d42F0b6DEF4CE0383636770eF773390d85c61A": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x3E6648C5a70A150A88bCE65F4aD4d506Fe15d2AF": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x6694340fc020c5E6B96567843da2df01b2CE1eb6": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x13Ad51ed4F1B7e9Dc168d8a00cB3f4dDD85EfA60": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xEC70Dcb4A1EFa46b8F2D97C310C9c4790ba5ffA8": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x3082CC23568eA640225c2467653dB90e9250AaA0": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3" + }, + "10": { + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x68f180fcCe6836688e9084f035309E29Bf0A2095": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x8700dAec35aF8Ff88c16BdF0418774CB3D7599B4": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x350a791Bfc2C21F9Ed5d10980Dad2e2638ffa7f6": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x9e1028F5F1D5eDE59748FFceE5532509976840E0": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x4200000000000000000000000000000000000042": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x3c8B650257cFb5f272f799F5e2b4e65093a11a05": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x9Bcef72be871e61ED4fBbc7630889beE758eb81D": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x7F5c764cBc14f9669B88837ca1490cCa17c31607": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3" + }, + "56": { + "0x55d398326f99059fF775485246999027B3197955": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x2170Ed0880ac9A755fd29B2688956BD959F933F8": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x1AF3F329e8BE154074D8769D1FFa4eE058B1DBc3": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x1D2F0da169ceB9fC7B3144628dB156f3F6c60dBE": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x14016E85a25aeb13065688cAFB43044C2ef86784": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xCC42724C6683B7E57334c4E856f4c9965ED682bD": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xBf5140A22578168FD562DCcF235E5D43A02ce9B1": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xF8A0BF9cF54Bb92F17374d9e9A321E6a111a51bD": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xf7DE7E8A6bd59ED41a4b5fe50278b3B7f31384dF": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x7Ddc52c4De30e94Be3A6A0A2b259b2850f421989": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xAD29AbB318791D579433D831ed122aFeAf29dcfe": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xaEC945e04baF28b135Fa7c640f624f8D90F1C3a6": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x715D400F88C167884bbCc41C5FeA407ed4D2f8A0": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x90C97F71E18723b0Cf0dfa30ee176Ab653E89F40": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x965F527D9159dCe6288a2219DB51fc6Eef120dD1": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xfe56d5892BDffC7BF58f2E84BE1b2C32D21C308b": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x4691937a7508860F876c9c0a2a617E7d9E945D4B": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x16939ef78684453bfDFb47825F8a5F714f12623a": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x8F0528cE5eF7B51152A59745bEfDD91D97091d2F": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x762539b45A1dCcE3D36d080F74d1AED37844b878": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x67ee3Cb086F8a16f34beE3ca72FAD36F7Db929e2": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xFd7B3A77848f1C2D67E05E54d78d174a0C850335": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x1Fa4a73a3F0133f0025378af00236f3aBDEE5D63": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x0Eb3a705fc54725037CC9e008bDede697f62F335": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x0D8Ce2A99Bb6e3B7Db580eD848240e4a0F9aE153": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x8fF795a6F4D97E7887C79beA79aba5cc76444aDf": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x4338665CBB7B2485A8855A139b75D5e34AB0DB94": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x56b6fB708fC5732DEC1Afc8D8556423A2EDcCbD6": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xa2B726B1145A4773F68593CF171187d8EBe4d495": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x52CE071Bd9b1C4B00A0b92D298c512478CaD67e8": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x47BEAd2563dCBf3bF2c9407fEa4dC236fAbA485A": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x88f1A5ae2A3BF98AEAF342D26B30a79438c9142e": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x3EE2200Efb3400fAbB9AacF31297cBdD1d435D47": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xAD6cAEb32CD2c308980a548bD0Bc5AA4306c6c18": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x7083609fCE4d1d8Dc0C979AAb8c869Ea2C873402": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x570A5D26f7765Ecb712C0924E4De545B89fD43dF": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0xbA2aE424d960c26247Dd6c32edC70B295c744C43": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x2eD9a5C8C13b93955103B9a7C167B67Ef4d568a3": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3", + "0x111111111117dC0aa78b770fA6A738034120C302": "0x386eD13Ba07E1C409693b299BbB9839d05aF20c3" + }, + "1": { + "0xdAC17F958D2ee523a2206206994597C13D831ec7": "0xb5739957aFD931FeDfb25Fb18e2eabe3C69801c5", + "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": "0xb5739957aFD931FeDfb25Fb18e2eabe3C69801c5", + "0x514910771AF9Ca656af840dff83E8264EcF986CA": "0xb5739957aFD931FeDfb25Fb18e2eabe3C69801c5", + "0xB8c77482e45F1F44dE1745F52C74426C631bDD52": "0xb5739957aFD931FeDfb25Fb18e2eabe3C69801c5", + "0xB50721BCf8d664c30412Cfbc6cf7a15145234ad1": "0xb5739957aFD931FeDfb25Fb18e2eabe3C69801c5", + "0xF57e7e7C23978C3cAEC3C3548E3D615c346e79fF": "0xb5739957aFD931FeDfb25Fb18e2eabe3C69801c5", + "0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0": "0xb5739957aFD931FeDfb25Fb18e2eabe3C69801c5" + }, + "204": { + "0x7c6b91D9Be155A6Db01f749217d76fF02A7227F2": "0xb5739957aFD931FeDfb25Fb18e2eabe3C69801c5", + "0xE7798f023fC62146e8Aa1b36Da45fb70855a77Ea": "0xb5739957aFD931FeDfb25Fb18e2eabe3C69801c5", + "0x9e5aac1ba1a2e6aed6b32689dfcf62a509ca96f3": "0xb5739957aFD931FeDfb25Fb18e2eabe3C69801c5", + "0x50c5725949a6f0c72e6c4a641f24049a917db0cb": "0xb5739957aFD931FeDfb25Fb18e2eabe3C69801c5" + }, + "888888888": { + "0x97423A68BAe94b5De52d767a17aBCc54c157c0E5": "0xa056CC60088CEfba94d9e16d5408459039FA8D64" + }, +} + +export const MULTI_TOKEN_ORACLES: Record> = { + "137": { + "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": "0xfE4A8cc5b5B2366C1B58Bea3858e81843581b2F7", + "0xc2132D05D31c914a87C6611C10748AEb04B58e8F": "0x0A6513e40db6EB1b165753AD52E80663aeA50545", + "0xD6DF932A45C0f255f85145f286eA0b292B21C90B": "0x72484B12719E23115761D5DA1646945632979bB6", + "0x8f3cf7ad23cd3cadbd9735aff958023239c6a063": "0x4746DeC9e833A82EC7C2C1356372CcF2cfcD2F3D", + "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619": "0xF9680D99D6C9589e2a93a78A04A279e509205945", + "0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39": "0xd9FFdb71EbE7496cC440152d43986Aae0AB76665", + "0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4": "0xA1CbF3Fe43BC3501e3Fc4b573e822c70e76A7512", + "0xb5c064f955d8e7f38fe0460c556a72987494ee17": "0x2251169D32E7538652a9a8c86bf0c43bFcd956f1", + "0xbbba073c31bf03b8acf7c28ef0738decf3695683": "0x3D49406EDd4D52Fb7FFd25485f32E073b529C924", + "0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a": "0x49B0c695039243BBfEb8EcD054EB70061fd54aa0", + "0x2e1ad108ff1d8c782fcbbb89aad783ac49586756": "0x7C5D415B64312D38c56B54358449d0a4058339d2", + "0xb33eaad8d922b1083446dc23f610c2567fb5180f": "0xdf0Fb4e4F928d2dCB76f438575fDD8682386e13C", + "0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6": "0xDE31F8bFBD8c84b5360CFACCa3539B938dd78ae6", + "0x9a71012b13ca4d3d0cdc72a177df3ef03b0e76a3": "0xD106B538F2A868c28Ca1Ec7E298C3325E0251d66", + "0x172370d5cd63279efa6d502dab29171933a610af": "0x336584C8E6Dc19637A5b36206B1c79923111b405", + "0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7": "0xDD229Ce42f11D8Ee7fFf29bDB71C7b81352e11be", + "0xfa68fb4628dff1028cfec22b4162fccd0d45efb6": "0x5d37E4b374E6907de8Fc7fb33EE3b0af403C7403" + }, + "8453": { + "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": "0x7e860098F58bBFC8648a4311b374B1D669a2bc6B", + "0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb": "0x591e79239a7d679378eC8c847e5038150364C78F", + "0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22": "0xd7818272B9e248357d13057AAb0B417aF31E817d", + "0x9EaF8C1E34F05a589EDa6BAfdF391Cf6Ad3CB239": "0xD40e758b5eC80820B68DFC302fc5Ce1239083548" + }, + "42161": { + "0xaf88d065e77c8cC2239327C5EDb3A432268e5831": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9": "0x3f3f5dF88dC9F13eac63DF89EC16ef6e7E25DdE7", + "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "0x912CE59144191C1204E64559FE8253a0e49E6548": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "0xfc5A1A6EB076a2C7aD06eD22C90d7E710E35ad0a": "0xDB98056FecFff59D032aB628337A4887110df3dB", + "0xFa7F8980b0f1E64A2062791cc3b0871572f1F7f0": "0x9C917083fDb403ab5ADbEC26Ee294f6EcAda2720", + "0x371c7ec6D8039ff7933a2AA28EB827Ffe1F52f07": "0x04180965a782E487d0632013ABa488A472243542", + "0x040d1EdC9569d4Bab2D15287Dc5A4F10F56a56B8": "0xBE5eA816870D11239c543F84b71439511D70B94f", + "0xf97f4df75117a78c1A5a0DBb814Af92458539FB4": "0x86E53CF1B870786351Da77A57575e79CB55812CB", + "0xd4d42F0b6DEF4CE0383636770eF773390d85c61A": "0xb2A8BA74cbca38508BA1632761b56C897060147C", + "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "0x3E6648C5a70A150A88bCE65F4aD4d506Fe15d2AF": "0x383b3624478124697BEF675F07cA37570b73992f", + "0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F": "0x0809E3d38d1B4214958faf06D8b1B1a2b73f2ab8", + "0x6694340fc020c5E6B96567843da2df01b2CE1eb6": "0xe74d69E233faB0d8F48921f2D93aDfDe44cEb3B7", + "0x13Ad51ed4F1B7e9Dc168d8a00cB3f4dDD85EfA60": "0xA43A34030088E6510FecCFb77E88ee5e7ed0fE64", + "0xEC70Dcb4A1EFa46b8F2D97C310C9c4790ba5ffA8": "0xD6aB2298946840262FcC278fF31516D39fF611eF", + "0x3082CC23568eA640225c2467653dB90e9250AaA0": "0x20d0Fcab0ECFD078B036b6CAf1FaC69A6453b352", + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1": "0xc5C8E77B397E531B8EC06BFb0048328B30E9eCfB" + }, + "10": { + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1": "0x8dBa75e83DA73cc766A7e5a0ee71F656BAb470d6", + "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58": "0xECef79E109e997bCA29c1c0897ec9d7b03647F5E", + "0x68f180fcCe6836688e9084f035309E29Bf0A2095": "0x718A5788b89454aAE3A028AE9c111A29Be6c2a6F", + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85": "0x16a9FA2FDa030272Ce99B29CF780dFA30361E0f3", + "0x8700dAec35aF8Ff88c16BdF0418774CB3D7599B4": "0x2FCF37343e916eAEd1f1DdaaF84458a359b53877", + "0x350a791Bfc2C21F9Ed5d10980Dad2e2638ffa7f6": "0xCc232dcFAAE6354cE191Bd574108c1aD03f86450", + "0x9e1028F5F1D5eDE59748FFceE5532509976840E0": "0xA12CDDd8e986AF9288ab31E58C60e65F2987fB13", + "0x4200000000000000000000000000000000000042": "0x0D276FC14719f9292D5C1eA2198673d1f4269246", + "0x3c8B650257cFb5f272f799F5e2b4e65093a11a05": "0x0f2Ed59657e391746C1a097BDa98F2aBb94b1120", + "0x9Bcef72be871e61ED4fBbc7630889beE758eb81D": "0xb429DE60943a8e6DeD356dca2F93Cd31201D9ed0", + "0x7F5c764cBc14f9669B88837ca1490cCa17c31607": "0x16a9FA2FDa030272Ce99B29CF780dFA30361E0f3" + }, + "56": { + "0x55d398326f99059fF775485246999027B3197955": "0xB97Ad0E74fa7d920791E90258A6E2085088b4320", + "0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82": "0xB6064eD41d4f67e353768aA239cA86f4F73665a1", + "0x2170Ed0880ac9A755fd29B2688956BD959F933F8": "0x9ef1B8c0E4F7dc8bF5719Ea496883DC6401d5b2e", + "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": "0x51597f405303C4377E36123cBc172b13269EA163", + "0x1AF3F329e8BE154074D8769D1FFa4eE058B1DBc3": "0x132d3C0B1D2cEa0BC552588063bdBb210FDeecfA", + "0x1D2F0da169ceB9fC7B3144628dB156f3F6c60dBE": "0x93A67D414896A280bF8FFB3b389fE3686E014fda", + "0x14016E85a25aeb13065688cAFB43044C2ef86784": "0xa3334A9762090E827413A7495AfeCE76F41dFc06", + "0xCC42724C6683B7E57334c4E856f4c9965ED682bD": "0x7CA57b0cA6367191c94C8914d7Df09A57655905f", + "0xBf5140A22578168FD562DCcF235E5D43A02ce9B1": "0xb57f259E7C24e56a1dA00F66b55A5640d9f9E7e4", + "0xF8A0BF9cF54Bb92F17374d9e9A321E6a111a51bD": "0xca236E327F629f9Fc2c30A4E95775EbF0B89fac8", + "0xf7DE7E8A6bd59ED41a4b5fe50278b3B7f31384dF": "0x20123C6ebd45c6496102BeEA86e1a6616Ca547c6", + "0x7Ddc52c4De30e94Be3A6A0A2b259b2850f421989": "0x8b0D36ae4CF8e277773A7ba5F35c09Edb144241b", + "0xAD29AbB318791D579433D831ed122aFeAf29dcfe": "0xe2A47e87C0f4134c8D06A41975F6860468b2F925", + "0xaEC945e04baF28b135Fa7c640f624f8D90F1C3a6": "0x889158E39628C0397DC54B84F6b1cbe0AaEb7FFc", + "0x715D400F88C167884bbCc41C5FeA407ed4D2f8A0": "0x7B49524ee5740c99435f52d731dFC94082fE61Ab", + "0x90C97F71E18723b0Cf0dfa30ee176Ab653E89F40": "0x13A9c98b07F098c5319f4FF786eB16E22DC738e1", + "0x965F527D9159dCe6288a2219DB51fc6Eef120dD1": "0x08E70777b982a58D23D05E3D7714f44837c06A21", + "0xfe56d5892BDffC7BF58f2E84BE1b2C32D21C308b": "0xF2f8273F6b9Fc22C90891DC802cAf60eeF805cDF", + "0x4691937a7508860F876c9c0a2a617E7d9E945D4B": "0x02Bfe714e78E2Ad1bb1C2beE93eC8dc5423B66d4", + "0x16939ef78684453bfDFb47825F8a5F714f12623a": "0x9A18137ADCF7b05f033ad26968Ed5a9cf0Bf8E6b", + "0x8F0528cE5eF7B51152A59745bEfDD91D97091d2F": "0xe0073b60833249ffd1bb2af809112c2fbf221DF6", + "0x762539b45A1dCcE3D36d080F74d1AED37844b878": "0x38393201952f2764E04B290af9df427217D56B41", + "0x67ee3Cb086F8a16f34beE3ca72FAD36F7Db929e2": "0x87701B15C08687341c2a847ca44eCfBc8d7873E1", + "0xFd7B3A77848f1C2D67E05E54d78d174a0C850335": "0x887f177CBED2cf555a64e7bF125E1825EB69dB82", + "0x1Fa4a73a3F0133f0025378af00236f3aBDEE5D63": "0x0Fe4D87883005fCAFaF56B81d09473D9A29dCDC3", + "0x0Eb3a705fc54725037CC9e008bDede697f62F335": "0xb056B7C804297279A9a673289264c17E6Dc6055d", + "0x0D8Ce2A99Bb6e3B7Db580eD848240e4a0F9aE153": "0xE5dbFD9003bFf9dF5feB2f4F445Ca00fb121fb83", + "0x8fF795a6F4D97E7887C79beA79aba5cc76444aDf": "0x43d80f616DAf0b0B42a928EeD32147dC59027D41", + "0x4338665CBB7B2485A8855A139b75D5e34AB0DB94": "0x74E72F37A8c415c8f1a98Ed42E78Ff997435791D", + "0x56b6fB708fC5732DEC1Afc8D8556423A2EDcCbD6": "0xd5508c8Ffdb8F15cE336e629fD4ca9AdB48f50F0", + "0xa2B726B1145A4773F68593CF171187d8EBe4d495": "0x63A9133cd7c611d6049761038C16f238FddA71d7", + "0x52CE071Bd9b1C4B00A0b92D298c512478CaD67e8": "0x0Db8945f9aEf5651fa5bd52314C5aAe78DfDe540", + "0x47BEAd2563dCBf3bF2c9407fEa4dC236fAbA485A": "0xE188A9875af525d25334d75F3327863B2b8cd0F1", + "0x88f1A5ae2A3BF98AEAF342D26B30a79438c9142e": "0xD7eAa5Bf3013A96e3d515c055Dbd98DbdC8c620D", + "0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63": "0xBF63F430A79D4036A5900C19818aFf1fa710f206", + "0x3EE2200Efb3400fAbB9AacF31297cBdD1d435D47": "0xa767f745331D267c7751297D982b050c93985627", + "0xAD6cAEb32CD2c308980a548bD0Bc5AA4306c6c18": "0xC78b99Ae87fF43535b0C782128DB3cB49c74A4d3", + "0x7083609fCE4d1d8Dc0C979AAb8c869Ea2C873402": "0xC333eb0086309a16aa7c8308DfD32c8BBA0a2592", + "0x570A5D26f7765Ecb712C0924E4De545B89fD43dF": "0x0E8a53DD9c13589df6382F13dA6B3Ec8F919B323", + "0xbA2aE424d960c26247Dd6c32edC70B295c744C43": "0x3AB0A0d137D4F946fBB19eecc6e92E64660231C8", + "0x2eD9a5C8C13b93955103B9a7C167B67Ef4d568a3": "0x4978c0abE6899178c1A74838Ee0062280888E2Cf", + "0x111111111117dC0aa78b770fA6A738034120C302": "0x9a177Bb9f5b6083E962f9e62bD21d4b5660Aeb03" + }, + "1": { + "0xdAC17F958D2ee523a2206206994597C13D831ec7": "0x3E7d1eAB13ad0104d2750B8863b489D65364e32D", + "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "0x514910771AF9Ca656af840dff83E8264EcF986CA": "0x2c1d072e956AFFC0D435Cb7AC38EF18d24d9127c", + "0xB8c77482e45F1F44dE1745F52C74426C631bDD52": "0x14e613AC84a31f709eadbdF89C6CC390fDc9540A", + "0xB50721BCf8d664c30412Cfbc6cf7a15145234ad1": "0x31697852a68433DbCc2Ff612c516d69E3D9bd08F", + "0xF57e7e7C23978C3cAEC3C3548E3D615c346e79fF": "0xBAEbEFc1D023c0feCcc047Bff42E75F15Ff213E6", + "0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0": "0x7bAC85A8a13A4BcD8abb3eB7d6b4d632c5a57676" + }, + "204": { + "0x7c6b91D9Be155A6Db01f749217d76fF02A7227F2": "0x4fe32b0Bd039f28C8A452117D8006249415268c3", + "0xE7798f023fC62146e8Aa1b36Da45fb70855a77Ea": "0x2cAE4a97fC8AB1BD2703b56231ED662Cc4E76133", + "0x9e5aac1ba1a2e6aed6b32689dfcf62a509ca96f3": "0xD2852dCbEc372aaeDb13E4fa4863fcB17fD89496", + "0x50c5725949a6f0c72e6c4a641f24049a917db0cb": "0xD2C1aa472260d176b811335f7362B86864a63136" + }, + "888888888": { + "0x97423A68BAe94b5De52d767a17aBCc54c157c0E5": "0x11Af4c61D8D51016b8800EA71e42Cf7c3682Ab84" + }, +} \ No newline at end of file diff --git a/backend/src/constants/MultitokenPaymaster.ts b/backend/src/constants/MultitokenPaymaster.ts index ba20ab6..cc9270a 100644 --- a/backend/src/constants/MultitokenPaymaster.ts +++ b/backend/src/constants/MultitokenPaymaster.ts @@ -200,6 +200,9 @@ export const TokenDecimalsAndSymbol: Record> = '0xC891EB4cbdEFf6e073e859e987815Ed1505c2ACD': { decimals: 6, symbol: 'EURC' }, '0xB3fe5374F67D7a22886A0eE082b2E2f9d2651651': { decimals: 18, symbol: 'LINK' }, '0x8eBAf22B6F053dFFeaf46f4Dd9eFA95D89ba8580': { decimals: 18, symbol: 'UNI.e' } + }, + 88888888: { + '0x97423A68BAe94b5De52d767a17aBCc54c157c0E5': { decimals: 6, symbol: 'USDC' } } } diff --git a/backend/src/server.ts b/backend/src/server.ts index 45ec37f..40ea2a5 100644 --- a/backend/src/server.ts +++ b/backend/src/server.ts @@ -28,6 +28,7 @@ import { CoingeckoTokensRepository } from './repository/coingecko-token-reposito import { Paymaster } from './paymaster/index.js'; import { NativeOracles } from './constants/ChainlinkOracles.js'; import { MultiTokenPaymaster } from './models/multiTokenPaymaster.js'; +import { MULTI_TOKEN_ORACLES, MULTI_TOKEN_PAYMASTERS } from 'constants/MultiTokenPaymasterCronJob.js'; let server: FastifyInstance; @@ -62,15 +63,15 @@ const initializeServer = async (): Promise => { // Register the sequelizePlugin await server.register(sequelizePlugin); const paymaster = new Paymaster({ - feeMarkUp: server.config.FEE_MARKUP, - multiTokenMarkUp: server.config.MULTI_TOKEN_MARKUP, - ep7TokenVGL: server.config.EP7_TOKEN_VGL, - ep7TokenPGL: server.config.EP7_TOKEN_PGL, - sequelize: server.sequelize, - mtpVglMarkup: server.config.MTP_VGL_MARKUP, - ep7Pvgl: server.config.EP7_PVGL, - mtpPvgl: server.config.MTP_PVGL, - mtpPpgl: server.config.MTP_PPGL, + feeMarkUp: server.config.FEE_MARKUP, + multiTokenMarkUp: server.config.MULTI_TOKEN_MARKUP, + ep7TokenVGL: server.config.EP7_TOKEN_VGL, + ep7TokenPGL: server.config.EP7_TOKEN_PGL, + sequelize: server.sequelize, + mtpVglMarkup: server.config.MTP_VGL_MARKUP, + ep7Pvgl: server.config.EP7_PVGL, + mtpPvgl: server.config.MTP_PVGL, + mtpPpgl: server.config.MTP_PPGL, ep8Pvgl: server.config.EP8_PVGL, skipType2Txns: server.config.ENFORCE_LEGACY_TRANSACTIONS_CHAINS }); @@ -108,11 +109,11 @@ const initializeServer = async (): Promise => { } paymaster.setPricesFromCoingecko(tokenPrices); } - + try { await getAndSetCoingeckoPrice(); } catch (err) { - server.log.error(err); + server.log.error('Error caught on getAndSetCoingeckoPrice: ', err); } await server.register(depositRoutes); @@ -271,7 +272,7 @@ const initializeServer = async (): Promise => { const buffer = Buffer.from(apiKey.supportedNetworks, 'base64'); const supportedNetworks = JSON.parse(buffer.toString()); for (const network of supportedNetworks) { - const networkConfig = getNetworkConfig(network.chainId, '', server.config.EPV_07); + const networkConfig = getNetworkConfig(network.chainId, ''); if ( network.contracts?.etherspotPaymasterAddress && networkConfig @@ -296,7 +297,7 @@ const initializeServer = async (): Promise => { customPaymasters = customPaymasters.length > 0 ? { ...customPaymasters, ...multiTokenPaymasters } : multiTokenPaymasters; } for (const chainId in customPaymasters) { - const networkConfig = getNetworkConfig(chainId, apiKey.supportedNetworks ?? '', server.config.EPV_06); + const networkConfig = getNetworkConfig(chainId, apiKey.supportedNetworks ?? ''); if (networkConfig) { const bundler = networkConfig.bundler; for (const symbol in customPaymasters[chainId]) { @@ -310,7 +311,7 @@ const initializeServer = async (): Promise => { customPaymastersV2 = JSON.parse(buffer.toString()); // checking deposit for epv7 ERC20_PAYMASTERS_V2. for (const chainId in customPaymastersV2) { - const networkConfig = getNetworkConfig(chainId, apiKey.supportedNetworks ?? '', server.config.EPV_06); + const networkConfig = getNetworkConfig(chainId, apiKey.supportedNetworks ?? ''); if (networkConfig) { const bundler = networkConfig.bundler; for (const symbol in customPaymastersV2[chainId]) { @@ -360,19 +361,27 @@ const initializeServer = async (): Promise => { }, { name: 'updateNativeTokenOracleData', - cronTime: process.env.NATIVE_ORACLE_UPDATE_CRON_EXP || "*/2 * * * *", // every 2 mins. + cronTime: process.env.NATIVE_ORACLE_UPDATE_CRON_EXP || "*/30 * * * *", // every 30 minutes. onTick: async () => { const chainIds = Object.keys(NativeOracles); for (const chainId of chainIds) { - const networkConfig = getNetworkConfig(chainId, '', server.config.EPV_06); - if (!networkConfig) { - continue; + try { + const networkConfig = getNetworkConfig(chainId, ''); + if (!networkConfig) { + server.log.error(`Network config not found for updateNativeTokenOracleData chain id: ${chainId} continuing to next chain id`); + continue; + } + const provider = new ethers.providers.JsonRpcProvider(networkConfig.bundler); + paymaster.getLatestAnswerAndDecimals(provider, NativeOracles[+chainId], +chainId, false) + .then((data) => { + server.log.info(`Latest answer and decimals for chain id: ${chainId} is ${data.latestAnswer} and ${data.decimals}`); + }) + .catch((error) => { + server.log.error(`Failed to update native oracle price for chain id: ${chainId} ${networkConfig.bundler}, ${error}`); + }); + } catch (error) { + server.log.error(`Error while running updateNativeTokenOracleData for chain id: ${chainId}, ${error}`); } - const provider = new ethers.providers.JsonRpcProvider(networkConfig.bundler); - paymaster.getLatestAnswerAndDecimals(provider, NativeOracles[+chainId], +chainId, false) - .catch((error) => { - server.log.error(`Failed to update native oracle price for chain id: ${chainId}, ${error}`); - }); } } }, @@ -380,86 +389,100 @@ const initializeServer = async (): Promise => { name: 'updateTokenOracleData', cronTime: process.env.TOKEN_ORACLE_UPDATE_CRON_EXP || '*/7 * * * *', // every 7 mins. onTick: async () => { - if (server.config.MULTI_TOKEN_PAYMASTERS && server.config.MULTI_TOKEN_ORACLES) { - let buffer = Buffer.from(server.config.MULTI_TOKEN_PAYMASTERS, 'base64'); - const multiTokenPaymasters = JSON.parse(buffer.toString()); - - buffer = Buffer.from(server.config.MULTI_TOKEN_ORACLES, 'base64'); - const multiTokenOracles = JSON.parse(buffer.toString()); - - const chainIds = Object.keys(multiTokenPaymasters); - - for (const chainId of chainIds) { - const networkConfig = getNetworkConfig(chainId, '', server.config.EPV_06); - if (!networkConfig) { - continue; - } - const provider = new ethers.providers.JsonRpcProvider(networkConfig.bundler); - - if (networkConfig.MultiTokenPaymasterOracleUsed === 'chainlink') { - paymaster.getLatestAnswerAndDecimals( - provider, - NativeOracles[+chainId], - +chainId - ).then((data) => { - const { latestAnswer, decimals } = data; - if (!latestAnswer || !decimals) { - return; - } - const tokens = Object.keys(multiTokenPaymasters[chainId]); - for (const token of tokens) { - paymaster.getPriceFromChainlink( - multiTokenOracles[chainId][token], + try { + server.log.info('Running updateTokenOracleData cron job'); + if (MULTI_TOKEN_ORACLES && MULTI_TOKEN_PAYMASTERS) { + const multiTokenPaymasters = MULTI_TOKEN_PAYMASTERS; + const multiTokenOracles = MULTI_TOKEN_ORACLES; + + const chainIds = Object.keys(multiTokenPaymasters); + + for (const chainId of chainIds) { + const networkConfig = getNetworkConfig(chainId, ''); + if (!networkConfig) { + server.log.error(`Network config not found for updateTokenOracleData chain id: ${chainId} continuing to next chain id`); + continue; + } + let provider; + try { + provider = new ethers.providers.JsonRpcProvider(networkConfig.bundler); + } catch (error) { + server.log.error(`Failed to create provider for chain id: ${chainId}, ${error}`); + continue; + } + if (provider !== null) { + if (networkConfig.MultiTokenPaymasterOracleUsed === 'chainlink') { + paymaster.getLatestAnswerAndDecimals( provider, - token, - latestAnswer, - decimals, - +chainId, - false - ).catch((error) => { - server.log.error( - `Failed to update oracle data for token: ${token}, chain id: ${chainId}, ${error}` - ); - }); + NativeOracles[+chainId], + +chainId + ).then((data) => { + const { latestAnswer, decimals } = data; + if (!latestAnswer || !decimals) { + return; + } + const tokens = Object.keys(multiTokenPaymasters[chainId]); + for (const token of tokens) { + paymaster.getPriceFromChainlink( + multiTokenOracles[chainId][token], + provider, + token, + latestAnswer, + decimals, + +chainId, + false + ).catch((error) => { + server.log.error( + `Failed to update oracle data for token: ${token}, chain id: ${chainId}, ${error}` + ); + }); + } + }) + .catch((error) => { + server.log.error( + `Failed to get native prices while updating oracle token data: chain id ${chainId}, ${error}` + ); + }); + } else if (networkConfig.MultiTokenPaymasterOracleUsed === 'orochi') { + const tokens = Object.keys(multiTokenPaymasters[chainId]); + for (const token of tokens) { + paymaster.getPriceFromOrochi( + multiTokenOracles[chainId][token], + provider, + token, + +chainId, + false + ).catch((error) => { + server.log.error( + `Failed to update oracle data for token: ${token}, chain id: ${chainId}, ${error}` + ); + }); + } + } else { + const tokens = Object.keys(multiTokenPaymasters[chainId]); + for (const token of tokens) { + paymaster.getPriceFromEtherspotChainlink( + multiTokenOracles[chainId][token], + provider, + token, + +chainId, + false + ).catch((error) => { + server.log.error( + `Failed to update oracle data for token: ${token}, chain id: ${chainId}, ${error}` + ); + }); + } } - }) - .catch((error) => { - server.log.error( - `Failed to get native prices while updating oracle token data: chain id ${chainId}, ${error}` - ); - }); - } else if (networkConfig.MultiTokenPaymasterOracleUsed === 'orochi') { - const tokens = Object.keys(multiTokenPaymasters[chainId]); - for (const token of tokens) { - paymaster.getPriceFromOrochi( - multiTokenOracles[chainId][token], - provider, - token, - +chainId, - false - ).catch((error) => { - server.log.error( - `Failed to update oracle data for token: ${token}, chain id: ${chainId}, ${error}` - ); - }); - } - } else { - const tokens = Object.keys(multiTokenPaymasters[chainId]); - for (const token of tokens) { - paymaster.getPriceFromEtherspotChainlink( - multiTokenOracles[chainId][token], - provider, - token, - +chainId, - false - ).catch((error) => { - server.log.error( - `Failed to update oracle data for token: ${token}, chain id: ${chainId}, ${error}` - ); - }); + } else { + server.log.error(`Provider is null for chain id: ${chainId}`); } } + } else { + server.log.error('MULTI_TOKEN_ORACLES or MULTI_TOKEN_PAYMASTERS is not defined in constants/MultiTokenPaymasterCronJob.ts'); } + } catch (error) { + server.log.error(`Error while running updateTokenOracleData cron job: ${error}`); } } } diff --git a/backend/src/utils/common.ts b/backend/src/utils/common.ts index 49de690..75b4166 100644 --- a/backend/src/utils/common.ts +++ b/backend/src/utils/common.ts @@ -9,17 +9,33 @@ export function printRequest(methodName: string, request: FastifyRequest, log: F log.info(request.body, "body passed: "); } -export function getNetworkConfig(key: any, supportedNetworks: any, entryPoint: string[]) { +export function getNetworkConfig(key: any, supportedNetworks: any, entryPoint?: string[]) { if (supportedNetworks !== '') { const buffer = Buffer.from(supportedNetworks, 'base64'); - const SUPPORTED_NETWORKS = JSON.parse(buffer.toString()) + const SUPPORTED_NETWORKS = JSON.parse(buffer.toString()); + if (entryPoint === undefined || entryPoint === null || entryPoint.length === 0) { + const result = SUPPORTED_NETWORKS.find((chain: any) => chain["chainId"] == key); + if (!result) { + return SupportedNetworks.find((chain) => chain.chainId == key); + } + return result; + } const result = SUPPORTED_NETWORKS.find((chain: any) => { return chain["chainId"] == key && entryPoint.includes(chain["entryPoint"]) }); if (!result) { return SupportedNetworks.find((chain) => chain.chainId == key && entryPoint.includes(chain.entryPoint)); } return result - } else - return SupportedNetworks.find((chain) => chain.chainId == key && entryPoint.includes(chain.entryPoint)); + } else { + if (entryPoint === undefined || entryPoint === null || entryPoint.length === 0) { + const result = SupportedNetworks.find((chain) => chain.chainId == key); + if (!result) { + return null; + } + return result; + } + const result = SupportedNetworks.find((chain) => { return chain.chainId == key && entryPoint.includes(chain.entryPoint) }); + return result ? result : null; + } } export function getChainIdsFromDefaultSupportedNetworks() { From 8c3fba278d9e617bb66eda6bd8806320e3d760a2 Mon Sep 17 00:00:00 2001 From: Vignesh Date: Tue, 5 Aug 2025 08:27:03 +0530 Subject: [PATCH 2/3] updated based on suggestions on code rabbit --- backend/src/server.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/server.ts b/backend/src/server.ts index 40ea2a5..f4267cb 100644 --- a/backend/src/server.ts +++ b/backend/src/server.ts @@ -28,7 +28,7 @@ import { CoingeckoTokensRepository } from './repository/coingecko-token-reposito import { Paymaster } from './paymaster/index.js'; import { NativeOracles } from './constants/ChainlinkOracles.js'; import { MultiTokenPaymaster } from './models/multiTokenPaymaster.js'; -import { MULTI_TOKEN_ORACLES, MULTI_TOKEN_PAYMASTERS } from 'constants/MultiTokenPaymasterCronJob.js'; +import { MULTI_TOKEN_ORACLES, MULTI_TOKEN_PAYMASTERS } from './constants/MultiTokenPaymasterCronJob.js'; let server: FastifyInstance; @@ -408,6 +408,7 @@ const initializeServer = async (): Promise => { provider = new ethers.providers.JsonRpcProvider(networkConfig.bundler); } catch (error) { server.log.error(`Failed to create provider for chain id: ${chainId}, ${error}`); + provider = null; continue; } if (provider !== null) { From 5f80f5be858681d41aaa363b02033494f778b3b5 Mon Sep 17 00:00:00 2001 From: Vignesh Date: Tue, 5 Aug 2025 13:24:12 +0530 Subject: [PATCH 3/3] updated as per feedback --- backend/src/server.ts | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/backend/src/server.ts b/backend/src/server.ts index f4267cb..cab74b3 100644 --- a/backend/src/server.ts +++ b/backend/src/server.ts @@ -398,20 +398,13 @@ const initializeServer = async (): Promise => { const chainIds = Object.keys(multiTokenPaymasters); for (const chainId of chainIds) { - const networkConfig = getNetworkConfig(chainId, ''); - if (!networkConfig) { - server.log.error(`Network config not found for updateTokenOracleData chain id: ${chainId} continuing to next chain id`); - continue; - } - let provider; try { - provider = new ethers.providers.JsonRpcProvider(networkConfig.bundler); - } catch (error) { - server.log.error(`Failed to create provider for chain id: ${chainId}, ${error}`); - provider = null; - continue; - } - if (provider !== null) { + const networkConfig = getNetworkConfig(chainId, ''); + if (!networkConfig) { + server.log.error(`Network config not found for updateTokenOracleData chain id: ${chainId} continuing to next chain id`); + continue; + } + const provider = new ethers.providers.JsonRpcProvider(networkConfig.bundler); if (networkConfig.MultiTokenPaymasterOracleUsed === 'chainlink') { paymaster.getLatestAnswerAndDecimals( provider, @@ -475,8 +468,8 @@ const initializeServer = async (): Promise => { }); } } - } else { - server.log.error(`Provider is null for chain id: ${chainId}`); + } catch (err) { + server.log.error(`Error while running for chainId: ${chainId}, ${err}`) } } } else {