diff --git a/scripts/1-deploy-token-paymaster.ts b/scripts/1-deploy-token-paymaster.ts index 77db8bf..9e87583 100644 --- a/scripts/1-deploy-token-paymaster.ts +++ b/scripts/1-deploy-token-paymaster.ts @@ -4,6 +4,7 @@ import { DEPLOYMENT_SALTS, encodeParam, isContract, + delay, } from "./utils"; import { Deployer, Deployer__factory } from "../typechain-types"; @@ -15,21 +16,13 @@ const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_PROD || ""; const DEPLOYER_CONTRACT_ADDRESS = process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - async function deployTokenPaymasterContract( deployerInstance: Deployer, earlyOwnerAddress: string ): Promise { try { const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) + ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER_V2) ); const BiconomyTokenPaymaster = await ethers.getContractFactory( @@ -107,6 +100,9 @@ async function getPredeployedDeployerContractInstance(): Promise { async function main() { const accounts = await ethers.getSigners(); const earlyOwner = await accounts[0].getAddress(); + if (earlyOwner === undefined) { + throw new Error("earlyOwner is undefined"); + } const deployerInstance = await getPredeployedDeployerContractInstance(); console.log("========================================="); diff --git a/scripts/2-deploy-oracle-aggregator.ts b/scripts/2-deploy-oracle-aggregator.ts deleted file mode 100644 index 1f0a83e..0000000 --- a/scripts/2-deploy-oracle-aggregator.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { ethers, run } from "hardhat"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - isContract, -} from "./utils"; -import { Deployer, Deployer__factory } from "../typechain-types"; - -const provider = ethers.provider; -const DEPLOYER_CONTRACT_ADDRESS = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - try { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - - if (!isOracleAggregatorDeployed) { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(10000); - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; - } catch (err) { - console.log(err); - } -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstance(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS, signer); - } -} - -async function main() { - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - const deployerInstance = await getPredeployedDeployerContractInstance(); - console.log("========================================="); - - // Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstance, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/3-deploy-derived-price-feeds.ts b/scripts/3-deploy-derived-price-feeds.ts deleted file mode 100644 index 5af3485..0000000 --- a/scripts/3-deploy-derived-price-feeds.ts +++ /dev/null @@ -1,7 +0,0 @@ -// Should be able to specify array of symbols for which you need to run this script - -// Deploy price feeds using appropritae salts from config. Could be a way to fetch salt using the symbol. - -// If price feed is supposed to be derived then go ahead and deploy the derived feed - -// TODO: passing the array of symbols and chainId - based on chainId config file is fetched, only run on required symbols diff --git a/scripts/4-set-token-oracles.ts b/scripts/4-set-token-oracles.ts deleted file mode 100644 index 789e366..0000000 --- a/scripts/4-set-token-oracles.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Connect and return instance with given EOA signer and provided address - -// Should be able to specify array of symbols for which you need to run this script - -// Fetch price feed addresses and priceFeedFunction - -// Set token oracles using the current owner - -// Transfer ownership back to intended owner if ownership was transferred back to run the script - -// TODO: passing the array of symbols and chainId - based on chainId config file is fetched, only run on required symbols diff --git a/scripts/8-deploy-verifying-paymaster.ts b/scripts/8-deploy-sponsorship-paymaster.ts similarity index 96% rename from scripts/8-deploy-verifying-paymaster.ts rename to scripts/8-deploy-sponsorship-paymaster.ts index 177ebf2..0dbc13f 100644 --- a/scripts/8-deploy-verifying-paymaster.ts +++ b/scripts/8-deploy-sponsorship-paymaster.ts @@ -4,6 +4,7 @@ import { DEPLOYMENT_SALTS, encodeParam, isContract, + delay, } from "./utils"; import { Deployer, Deployer__factory } from "../typechain-types"; @@ -16,14 +17,6 @@ const feeCollector = process.env.SPONSORSHIP_FEE_COLLECTOR_ADDRESS_PROD || ""; const DEPLOYER_CONTRACT_ADDRESS = process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - async function deploySponsorshipPaymasterContract( deployerInstance: Deployer, earlyOwnerAddress: string @@ -124,6 +117,9 @@ async function getPredeployedDeployerContractInstance(): Promise { async function main() { const accounts = await ethers.getSigners(); const earlyOwner = await accounts[0].getAddress(); + if (earlyOwner === undefined) { + throw new Error("earlyOwner is undefined"); + } const deployerInstance = await getPredeployedDeployerContractInstance(); console.log("========================================="); diff --git a/scripts/configs/dev/token-config-arbitrum-goerli.json b/scripts/configs/dev/token-config-arbitrum-goerli.json index 6bd43d2..f306d29 100644 --- a/scripts/configs/dev/token-config-arbitrum-goerli.json +++ b/scripts/configs/dev/token-config-arbitrum-goerli.json @@ -5,10 +5,6 @@ "address": "0x9Ff2A6b0cdc4aB06BBE231327edfE493f130A994", "nativeOracleAddress": "0x62CAe0FA2da220f43a51F86Db2EDb36DcA9A5A08", "tokenOracleAddress": "0x1692Bdd32F31b831caAc1b0c9fAF68613682813b", - "description": "USDC / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005ABaE3DEAdbe1FBD12105F950efbA9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,21 +12,13 @@ "address": "0x466cd6F70015e11dc53e5757B4bcFeCcD7C31139", "nativeOracleAddress": "0x62CAe0FA2da220f43a51F86Db2EDb36DcA9A5A08", "tokenOracleAddress": "0x0a023a3423D9b27A0BE48c768CCF2dD7877fEf5E", - "description": "USDT / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000001E2C2B39542c30A3fE57c4487030bC03adF", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", "derivedFeed": true }, { "symbol": "LINK", "address": "0x6bDB7FE59ec323b6A9bC96a988a971EEDA3958d9", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "LINK / ETH", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x1AdDb2368414B3b4cF1BCe7A887d2De7Bfb6886f", - "feedSalt": "DEVX_PRICE_FEED_LINK_V0_27062023_JHIxs6o", + "nativeOracleAddress": "0x62CAe0FA2da220f43a51F86Db2EDb36DcA9A5A08", + "tokenOracleAddress": "0x1AdDb2368414B3b4cF1BCe7A887d2De7Bfb6886f", "derivedFeed": false } ] diff --git a/scripts/configs/dev/token-config-bnb-mainnet.json b/scripts/configs/dev/token-config-bnb-mainnet.json index 8b46861..41d14bb 100644 --- a/scripts/configs/dev/token-config-bnb-mainnet.json +++ b/scripts/configs/dev/token-config-bnb-mainnet.json @@ -3,67 +3,43 @@ { "symbol": "USDC", "address": "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "USDC / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x45f86CA2A8BC9EBD757225B19a1A0D7051bE46Db", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0x45f86CA2A8BC9EBD757225B19a1A0D7051bE46Db", "derivedFeed": false }, { "symbol": "USDT", "address": "0x55d398326f99059fF775485246999027B3197955", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "USDT / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0xD5c40f5144848Bd4EF08a9605d860e727b991513", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0xD5c40f5144848Bd4EF08a9605d860e727b991513", "derivedFeed": false }, { "symbol": "DAI", "address": "0x1AF3F329e8BE154074D8769D1FFa4eE058B1DBc3", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "DAI / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x8EC213E7191488C7873cEC6daC8e97cdbAdb7B35", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0x8EC213E7191488C7873cEC6daC8e97cdbAdb7B35", "derivedFeed": false }, { "symbol": "TWT", "address": "0x4b0f1812e5df2a09796481ff14017e6005508003", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "TWT / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x7E728dFA6bCa9023d9aBeE759fDF56BEAb8aC7aD", - "feedSalt": "DEVX_PRICE_FEED_TWT_V0_27062023_92Xklvq", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0x7E728dFA6bCa9023d9aBeE759fDF56BEAb8aC7aDx", "derivedFeed": false }, { "symbol": "CAKE", "address": "0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "CAKE / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0xcB23da9EA243f53194CBc2380A6d4d9bC046161f", - "feedSalt": "DEVX_PRICE_FEED_CAKE_V0_27062023_1BKpzde", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0xcB23da9EA243f53194CBc2380A6d4d9bC046161f", "derivedFeed": false }, { "symbol": "LINK", "address": "0xF8A0BF9cF54Bb92F17374d9e9A321E6a111a51bD", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "LINK / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0xB38722F6A608646a538E882Ee9972D15c86Fc597", - "feedSalt": "DEVX_PRICE_FEED_LINK_V0_27062023_JHIxs6o", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0xB38722F6A608646a538E882Ee9972D15c86Fc597", "derivedFeed": false }, { @@ -71,10 +47,6 @@ "address": "0x111111111117dC0aa78b770fA6A738034120C302", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x1B329402Cb1825C6F30A0d92aB9E2862BE47333f", - "description": "1INCH / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00000C451fA0b0a79a36c82820F061683E26714c", - "feedSalt": "DEVX_PRICE_FEED_1INCH_V0_27062023_XhXA3sd", "derivedFeed": true }, { @@ -82,10 +54,6 @@ "address": "0xfb6115445Bff7b52FeB98650C87f44907E58f802", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xA8357BF572460fC40f4B0aCacbB2a6A61c89f475", - "description": "AAVE / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000AF22A276F86B405835c18863e1C2A679D9e3", - "feedSalt": "DEVX_PRICE_FEED_AAVE_V0_28062023_HsugnpY", "derivedFeed": true } ] diff --git a/scripts/configs/dev/token-config-bnb-testnet.json b/scripts/configs/dev/token-config-bnb-testnet.json index f841b8e..4fb655b 100644 --- a/scripts/configs/dev/token-config-bnb-testnet.json +++ b/scripts/configs/dev/token-config-bnb-testnet.json @@ -5,10 +5,6 @@ "address": "0x1ffa9c87ead57adc9e4f9a7d26ec3a52150db3b0", "nativeOracleAddress": "0x2514895c72f50D8bd4B4F9b1110F0D6bD2c97526", "tokenOracleAddress": "0x90c069C4538adAc136E051052E14c1cD799C41B7", - "description": "USDC / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005abae3deadbe1fbd12105f950efba9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,10 +12,6 @@ "address": "0x03bbb5660b8687c2aa453a0e42dcb6e0732b1266", "nativeOracleAddress": "0x2514895c72f50D8bd4B4F9b1110F0D6bD2c97526", "tokenOracleAddress": "0xEca2605f0BCF2BA5966372C99837b1F182d3D620", - "description": "USDT / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000001e2c2b39542c30a3fe57c4487030bc03adf", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", "derivedFeed": true }, { @@ -27,10 +19,6 @@ "address": "0x355c8c8395fadf2eaa6bb27f86e53e432e3de4e6", "nativeOracleAddress": "0x2514895c72f50D8bd4B4F9b1110F0D6bD2c97526", "tokenOracleAddress": "0xE4eE17114774713d2De0eC0f035d4F7665fc025D", - "description": "DAI / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000d2da196474046c7a4d94ab0e566b26d054", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", "derivedFeed": true }, { @@ -38,10 +26,6 @@ "address": "0xc1537ab4f2e0b1c578baea06b5baae8f87ce971c", "nativeOracleAddress": "0x2514895c72f50D8bd4B4F9b1110F0D6bD2c97526", "tokenOracleAddress": "0x298619601ebCd58d0b526963Deb2365B485Edc74", - "description": "AAVE / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000AF22A276F86B405835c18863e1C2A679D9e3", - "feedSalt": "DEVX_PRICE_FEED_AAVE_V0_28062023_HsugnpY", "derivedFeed": true }, { @@ -49,10 +33,6 @@ "address": "0x81f9e7a56f6869a9a8c385d1e0701b312439501f", "nativeOracleAddress": "0x2514895c72f50D8bd4B4F9b1110F0D6bD2c97526", "tokenOracleAddress": "0x81faeDDfeBc2F8Ac524327d70Cf913001732224C", - "description": "CAKE / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000007198738f877c01d9b7e4a4e1bd17e46e4a8", - "feedSalt": "DEVX_PRICE_FEED_CAKE_V0_27062023_1BKpzde", "derivedFeed": true }, { @@ -60,10 +40,6 @@ "address": "0xdeb12ea437c116ed823ab49244cafec4e41704cb", "nativeOracleAddress": "0x2514895c72f50D8bd4B4F9b1110F0D6bD2c97526", "tokenOracleAddress": "0x1B329402Cb1825C6F30A0d92aB9E2862BE47333f", - "description": "LINK / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00000da809fe7be1297ee731f998141ba352778d", - "feedSalt": "DEVX_PRICE_FEED_LINK_V0_27062023_JHIxs6o", "derivedFeed": true } ] diff --git a/scripts/configs/dev/token-config-goerli.json b/scripts/configs/dev/token-config-goerli.json index 9cd4674..0a6dfb7 100644 --- a/scripts/configs/dev/token-config-goerli.json +++ b/scripts/configs/dev/token-config-goerli.json @@ -5,10 +5,6 @@ "address": "0xb5B640E6414b6DeF4FC9B3C1EeF373925effeCcF", "nativeOracleAddress": "0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e", "tokenOracleAddress": "0xAb5c49580294Aff77670F839ea425f5b78ab3Ae7", - "description": "USDC / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005ABaE3DEAdbe1FBD12105F950efbA9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true } ] diff --git a/scripts/configs/dev/token-config-mumbai.json b/scripts/configs/dev/token-config-mumbai.json index d83dd9f..14e1859 100644 --- a/scripts/configs/dev/token-config-mumbai.json +++ b/scripts/configs/dev/token-config-mumbai.json @@ -5,10 +5,6 @@ "address": "0xdA5289fCAAF71d52a80A254da614a192b693e977", "nativeOracleAddress": "0xd0D5e3DB44DE05E9F294BB0a3bEEaF030DE24Ada", "tokenOracleAddress": "0x572dDec9087154dC5dfBB1546Bb62713147e0Ab0", - "description": "USDC / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005abae3deadbe1fbd12105f950efba9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,10 +12,6 @@ "address": "0xeaBc4b91d9375796AA4F69cC764A4aB509080A58", "nativeOracleAddress": "0xd0D5e3DB44DE05E9F294BB0a3bEEaF030DE24Ada", "tokenOracleAddress": "0x92C09849638959196E976289418e5973CC96d645", - "description": "USDT / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000001e2c2b39542c30a3fe57c4487030bc03adf", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", "derivedFeed": true }, { @@ -27,10 +19,6 @@ "address": "0x27a44456bEDb94DbD59D0f0A14fE977c777fC5C3", "nativeOracleAddress": "0xd0D5e3DB44DE05E9F294BB0a3bEEaF030DE24Ada", "tokenOracleAddress": "0x0FCAa9c899EC5A91eBc3D5Dd869De833b06fB046", - "description": "DAI / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000d2da196474046c7a4d94ab0e566b26d054", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", "derivedFeed": true }, { @@ -38,10 +26,6 @@ "address": "0xE03489D4E90b22c59c5e23d45DFd59Fc0dB8a025", "nativeOracleAddress": "0xd0D5e3DB44DE05E9F294BB0a3bEEaF030DE24Ada", "tokenOracleAddress": "0x9dd18534b8f456557d11B9DDB14dA89b2e52e308", - "description": "SAND / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00000980455efb131c1908efa908c1eaf19db352", - "feedSalt": "DEVX_PRICE_FEED_SAND_V0_27062023_eHPqgeR", "derivedFeed": true } ] diff --git a/scripts/configs/dev/token-config-optimism-goerli.json b/scripts/configs/dev/token-config-optimism-goerli.json index 88e324f..8eb68f3 100644 --- a/scripts/configs/dev/token-config-optimism-goerli.json +++ b/scripts/configs/dev/token-config-optimism-goerli.json @@ -5,10 +5,6 @@ "address": "0xe01435b1767aED7c25C943faCbdB582b6278650f", "nativeOracleAddress": "0x57241A37733983F97C4Ab06448F244A1E0Ca0ba8", "tokenOracleAddress": "0x2636B223652d388721A0ED2861792DA9062D8C73", - "description": "USDC / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005ABaE3DEAdbe1FBD12105F950efbA9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,10 +12,6 @@ "address": "0x7c81B296d84802ec2d5e63846912011f2Cd3C31C", "nativeOracleAddress": "0x57241A37733983F97C4Ab06448F244A1E0Ca0ba8", "tokenOracleAddress": "0x31856c9a2A73aAee6100Aed852650f75c5F539D0", - "description": "DAI / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000d2Da196474046c7a4D94Ab0E566B26d054", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", "derivedFeed": true }, { @@ -27,21 +19,13 @@ "address": "0xD6a8c1eee4D4e4EF998b911B03d52bc301d9b332", "nativeOracleAddress": "0x57241A37733983F97C4Ab06448F244A1E0Ca0ba8", "tokenOracleAddress": "0x0A024aa48E09e151090637d2b68162b1Caf7BdbA", - "description": "UNI / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000095CcE092E83E5826cFeb0f03cFa74915b41", - "feedSalt": "DEVX_PRICE_FEED_UNI_V0_27062023_PBQ6vdq", "derivedFeed": true }, { "symbol": "LINK", "address": "0x6EB5be4c0D6da4ca582e9912F212c0DB1d96fC3d", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "LINK / ETH", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x37410D317b96E1fED1814473E1CcD323D0eB4Eb1", - "feedSalt": "DEVX_PRICE_FEED_LINK_V0_27062023_JHIxs6o", + "nativeOracleAddress": "0x57241A37733983F97C4Ab06448F244A1E0Ca0ba8", + "tokenOracleAddress": "0x37410D317b96E1fED1814473E1CcD323D0eB4Eb1", "derivedFeed": false } ] diff --git a/scripts/configs/dev/token-config-polygon-mainnet.json b/scripts/configs/dev/token-config-polygon-mainnet.json index 4ba328a..8e481fc 100644 --- a/scripts/configs/dev/token-config-polygon-mainnet.json +++ b/scripts/configs/dev/token-config-polygon-mainnet.json @@ -5,10 +5,6 @@ "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xfE4A8cc5b5B2366C1B58Bea3858e81843581b2F7", - "description": "USDC / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005ABaE3DEAdbe1FBD12105F950efbA9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,10 +12,6 @@ "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x0A6513e40db6EB1b165753AD52E80663aeA50545", - "description": "USDT / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000001E2C2B39542c30A3fE57c4487030bC03adF", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", "derivedFeed": true }, { @@ -27,10 +19,6 @@ "address": "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x4746DeC9e833A82EC7C2C1356372CcF2cfcD2F3D", - "description": "DAI / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000d2Da196474046c7a4D94Ab0E566B26d054", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", "derivedFeed": true }, { @@ -38,10 +26,6 @@ "address": "0xBbba073C31bF03b8ACf7c28EF0738DeCF3695683", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x3D49406EDd4D52Fb7FFd25485f32E073b529C924", - "description": "SAND / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00000980455EFB131c1908eFa908c1eaF19db352", - "feedSalt": "DEVX_PRICE_FEED_SAND_V0_27062023_eHPqgeR", "derivedFeed": true } ] diff --git a/scripts/configs/dev/token-config-sepolia.json b/scripts/configs/dev/token-config-sepolia.json index f998f15..5069e60 100644 --- a/scripts/configs/dev/token-config-sepolia.json +++ b/scripts/configs/dev/token-config-sepolia.json @@ -5,10 +5,6 @@ "address": "0x9C73373C70F23920EA54F7883dCB1F85b162Df40", "nativeOracleAddress": "0x694AA1769357215DE4FAC081bf1f309aDC325306", "tokenOracleAddress": "0xA2F78ab2355fe2f984D808B5CeE7FD0A93D5270E", - "description": "USDC / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005ABaE3DEAdbe1FBD12105F950efbA9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,10 +12,6 @@ "address": "0x5Bc7c8cFC6d54c055547Fcd8f6Ee4f2eDcda613e", "nativeOracleAddress": "0x694AA1769357215DE4FAC081bf1f309aDC325306", "tokenOracleAddress": "0x14866185B1962B63C3Ea9E03Bc1da838bab34C19", - "description": "DAI / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000d2da196474046c7a4d94ab0e566b26d054", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", "derivedFeed": true } ] diff --git a/scripts/configs/prod/token-config-arbitrum-goerli.json b/scripts/configs/prod/token-config-arbitrum-goerli.json index 6bd43d2..f306d29 100644 --- a/scripts/configs/prod/token-config-arbitrum-goerli.json +++ b/scripts/configs/prod/token-config-arbitrum-goerli.json @@ -5,10 +5,6 @@ "address": "0x9Ff2A6b0cdc4aB06BBE231327edfE493f130A994", "nativeOracleAddress": "0x62CAe0FA2da220f43a51F86Db2EDb36DcA9A5A08", "tokenOracleAddress": "0x1692Bdd32F31b831caAc1b0c9fAF68613682813b", - "description": "USDC / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005ABaE3DEAdbe1FBD12105F950efbA9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,21 +12,13 @@ "address": "0x466cd6F70015e11dc53e5757B4bcFeCcD7C31139", "nativeOracleAddress": "0x62CAe0FA2da220f43a51F86Db2EDb36DcA9A5A08", "tokenOracleAddress": "0x0a023a3423D9b27A0BE48c768CCF2dD7877fEf5E", - "description": "USDT / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000001E2C2B39542c30A3fE57c4487030bC03adF", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", "derivedFeed": true }, { "symbol": "LINK", "address": "0x6bDB7FE59ec323b6A9bC96a988a971EEDA3958d9", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "LINK / ETH", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x1AdDb2368414B3b4cF1BCe7A887d2De7Bfb6886f", - "feedSalt": "DEVX_PRICE_FEED_LINK_V0_27062023_JHIxs6o", + "nativeOracleAddress": "0x62CAe0FA2da220f43a51F86Db2EDb36DcA9A5A08", + "tokenOracleAddress": "0x1AdDb2368414B3b4cF1BCe7A887d2De7Bfb6886f", "derivedFeed": false } ] diff --git a/scripts/configs/prod/token-config-arbitrum-one.json b/scripts/configs/prod/token-config-arbitrum-one.json index 4d2891d..562ed4b 100644 --- a/scripts/configs/prod/token-config-arbitrum-one.json +++ b/scripts/configs/prod/token-config-arbitrum-one.json @@ -5,10 +5,6 @@ "address": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0x3f3f5dF88dC9F13eac63DF89EC16ef6e7E25DdE7", - "description": "USDT / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000001E2C2B39542c30A3fE57c4487030bC03adF", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", "derivedFeed": true }, { @@ -16,10 +12,6 @@ "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", - "description": "WBTC / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00002D444779516f9D60368f3fa1E2b036BCCc7D", - "feedSalt": "DEVX_PRICE_FEED_WBTC_V0_27062023_z41FLvK", "derivedFeed": true }, { @@ -27,21 +19,13 @@ "address": "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0xc5C8E77B397E531B8EC06BFb0048328B30E9eCfB", - "description": "DAI / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000d2Da196474046c7a4D94Ab0E566B26d054", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", "derivedFeed": true }, { "symbol": "wstETH", "address": "0x5979D7b546E38E414F7E9822514be443A4800529", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "wstETH / ETH", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0xb523AE262D20A936BC152e6023996e46FDC2A95D", - "feedSalt": "DEVX_PRICE_FEED_WSTETH_V0_27062023_mg8XpNM", + "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "tokenOracleAddress": "0xb523AE262D20A936BC152e6023996e46FDC2A95D", "derivedFeed": false }, { @@ -49,10 +33,6 @@ "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", - "description": "ARB / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00003eCC9947e6E5128427290DEBBCAaE8199B3F", - "feedSalt": "DEVX_PRICE_FEED_ARB_V0_27062023_3wuHuct", "derivedFeed": true }, { @@ -60,10 +40,6 @@ "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", - "description": "USDC / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005ABaE3DEAdbe1FBD12105F950efbA9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -71,10 +47,6 @@ "address": "0xfc5A1A6EB076a2C7aD06eD22C90d7E710E35ad0a", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0xDB98056FecFff59D032aB628337A4887110df3dB", - "description": "GMX / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00001BC10BaB33fb8c0f93330e16153894F02a61", - "feedSalt": "DEVX_PRICE_FEED_GMX_V0_27062023_qKe9UwO", "derivedFeed": true }, { @@ -82,10 +54,6 @@ "address": "0xFa7F8980b0f1E64A2062791cc3b0871572f1F7f0", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0x9C917083fDb403ab5ADbEC26Ee294f6EcAda2720", - "description": "UNI / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000095CcE092E83E5826cFeb0f03cFa74915b41", - "feedSalt": "DEVX_PRICE_FEED_UNI_V0_27062023_PBQ6vdq", "derivedFeed": true }, { @@ -93,10 +61,6 @@ "address": "0x6C2C06790b3E3E3c38e12Ee22F8183b37a13EE55", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0xc373B9DB0707fD451Bc56bA5E9b029ba26629DF0", - "description": "DPX / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00003e7f4BB63a6B24f2b45AFc698A20D7eFED65", - "feedSalt": "DEVX_PRICE_FEED_DPX_V0_27062023_5Y1OOrG", "derivedFeed": true }, { @@ -104,10 +68,6 @@ "address": "0x371c7ec6D8039ff7933a2AA28EB827Ffe1F52f07", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0x04180965a782E487d0632013ABa488A472243542", - "description": "JOE / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000074df2B9Ad8a7Be4d07a85F278ca0017513d3", - "feedSalt": "DEVX_PRICE_FEED_JOE_V0_27062023_XxQWl65", "derivedFeed": true }, { @@ -115,10 +75,6 @@ "address": "0x040d1EdC9569d4Bab2D15287Dc5A4F10F56a56B8", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0xBE5eA816870D11239c543F84b71439511D70B94f", - "description": "BAL / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "", - "feedSalt": "DEVX_PRICE_FEED_BAL_V0_27062023_IzEMruz", "derivedFeed": true }, { @@ -126,10 +82,6 @@ "address": "0x354A6dA3fcde098F8389cad84b0182725c6C91dE", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0xe7C53FFd03Eb6ceF7d208bC4C13446c76d1E5884", - "description": "COMP / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "", - "feedSalt": "DEVX_PRICE_FEED_COMP_V0_27062023_54gIpet", "derivedFeed": true }, { @@ -137,21 +89,13 @@ "address": "0x11cDb42B0EB46D95f990BeDD4695A6e3fA034978", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0xaebDA2c976cfd1eE1977Eac079B4382acb849325", - "description": "CRV / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "", - "feedSalt": "DEVX_PRICE_FEED_CRV_V0_27062023_GrIWEtf", "derivedFeed": true }, { "symbol": "LINK", "address": "0xf97f4df75117a78c1A5a0DBb814Af92458539FB4", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", - "tokenOracleAddress": "0x86E53CF1B870786351Da77A57575e79CB55812CB", - "description": "LINK / ETH", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0xb7c8Fb1dB45007F98A68Da0588e1AA524C317f27", - "feedSalt": "DEVX_PRICE_FEED_LINK_V0_27062023_JHIxs6o", + "tokenOracleAddress": "0xb7c8Fb1dB45007F98A68Da0588e1AA524C317f27", "derivedFeed": false }, { @@ -159,10 +103,6 @@ "address": "0x2e9a6Df78E42a30712c10a9Dc4b1C8656f8F2879", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0xdE9f0894670c4EFcacF370426F10C3AD2Cdf147e", - "description": "MKR / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "", - "feedSalt": "DEVX_PRICE_FEED_MKR_V0_24072023_2Chh0Sh", "derivedFeed": true }, { @@ -170,10 +110,6 @@ "address": "0xd4d42F0b6DEF4CE0383636770eF773390d85c61A", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0xb2A8BA74cbca38508BA1632761b56C897060147C", - "description": "SUSHI / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "", - "feedSalt": "DEVX_PRICE_FEED_SUSHI_V0_27062023_dyZta4I", "derivedFeed": true }, { @@ -181,10 +117,6 @@ "address": "0x3E6648C5a70A150A88bCE65F4aD4d506Fe15d2AF", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0x383b3624478124697BEF675F07cA37570b73992f", - "description": "SPELL / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "", - "feedSalt": "DEVX_PRICE_FEED_SPELL_V0_24072023_v0CCYNa", "derivedFeed": true }, { @@ -192,10 +124,6 @@ "address": "0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0x0809E3d38d1B4214958faf06D8b1B1a2b73f2ab8", - "description": "FRAX / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "", - "feedSalt": "DEVX_PRICE_FEED_FRAX_V0_27062023_MmgkOOQ", "derivedFeed": true }, { @@ -203,10 +131,6 @@ "address": "0x3082CC23568eA640225c2467653dB90e9250AaA0", "nativeOracleAddress": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", "tokenOracleAddress": "0x20d0Fcab0ECFD078B036b6CAf1FaC69A6453b352", - "description": "RDNT / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "", - "feedSalt": "DEVX_PRICE_FEED_RDNT_V0_27062023_CE7LvWZ", "derivedFeed": true } ] diff --git a/scripts/configs/prod/token-config-avalanche-mainnet.json b/scripts/configs/prod/token-config-avalanche-mainnet.json index 0c224ad..d1556df 100644 --- a/scripts/configs/prod/token-config-avalanche-mainnet.json +++ b/scripts/configs/prod/token-config-avalanche-mainnet.json @@ -5,10 +5,6 @@ "address": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0xF096872672F44d6EBA71458D74fe67F9a77a23B9", - "description": "USDC / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005ABaE3DEAdbe1FBD12105F950efbA9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,10 +12,6 @@ "address": "0xc7198437980c041c805A1EDcbA50c1Ce5db95118", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0xEBE676ee90Fe1112671f19b6B7459bC678B67e8a", - "description": "USDT / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000001E2C2B39542c30A3fE57c4487030bC03adF", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", "derivedFeed": true }, { @@ -27,10 +19,6 @@ "address": "0xd586E7F844cEa2F87f50152665BCbc2C279D8d70", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0x51D7180edA2260cc4F6e4EebB82FEF5c3c2B8300", - "description": "DAI / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000d2Da196474046c7a4D94Ab0E566B26d054", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", "derivedFeed": true }, { @@ -38,10 +26,6 @@ "address": "0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0x976B3D034E162d8bD72D6b9C989d545b839003b0", - "description": "WETH / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00008cC9D5BF9F97AE2879163011707812561b42", - "feedSalt": "DEVX_PRICE_FEED_ETH_V0_27062023_jZ9Dvxh", "derivedFeed": true }, { @@ -49,10 +33,6 @@ "address": "0x50b7545627a5162F82A992c33b87aDc75187B218", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0x86442E3a98558357d46E6182F4b262f76c4fa26F", - "description": "WBTC / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00002D444779516f9D60368f3fa1E2b036BCCc7D", - "feedSalt": "DEVX_PRICE_FEED_WBTC_V0_27062023_z41FLvK", "derivedFeed": true }, { @@ -60,10 +40,6 @@ "address": "0x19860CCB0A68fd4213aB9D8266F7bBf05A8dDe98", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0x827f8a0dC5c943F7524Dda178E2e7F275AAd743f", - "description": "BUSD / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000020c39775542112E3DB0DbAD0d47A44bEB49A", - "feedSalt": "DEVX_PRICE_FEED_BUSD_V0_27062023_J8nJR8O", "derivedFeed": true }, { @@ -71,10 +47,6 @@ "address": "0x1C20E891Bab6b1727d14Da358FAe2984Ed9B59EB", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0x9Cf3Ef104A973b351B2c032AA6793c3A6F76b448", - "description": "TUSD / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000064b138eDB97Ac8a3F4564E14d9a331288a6B", - "feedSalt": "DEVX_PRICE_FEED_TUSD_V0_27062023_QHVx0oQ", "derivedFeed": true }, { @@ -82,10 +54,6 @@ "address": "0x63a72806098Bd3D9520cC43356dD78afe5D386D9", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0x3CA13391E9fb38a75330fb28f8cc2eB3D9ceceED", - "description": "AAVE / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000AF22A276F86B405835c18863e1C2A679D9e3", - "feedSalt": "DEVX_PRICE_FEED_AAVE_V0_28062023_HsugnpY", "derivedFeed": true }, { @@ -93,10 +61,6 @@ "address": "0xd1c3f94DE7e5B45fa4eDBBA472491a9f4B166FC4", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0x4Cf57DC9028187b9DAaF773c8ecA941036989238", - "description": "XAVA / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000CcE0a6DD4eec1137D9395D676272D5D1135e", - "feedSalt": "DEVX_PRICE_FEED_XAVA_V0_24072023_cGSh9uO", "derivedFeed": true }, { @@ -104,10 +68,6 @@ "address": "0x8729438EB15e2C8B576fCc6AeCdA6A148776C0F5", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0x36E039e6391A5E7A7267650979fdf613f659be5D", - "description": "QI / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00006c81322356756CEE17B157a743a794b33426", - "feedSalt": "DEVX_PRICE_FEED_QI_V0_24072023_GQDedut", "derivedFeed": true }, { @@ -115,10 +75,6 @@ "address": "0x6e84a6216eA6dACC71eE8E6b0a5B7322EEbC0fDd", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0x02D35d3a8aC3e1626d3eE09A78Dd87286F5E8e3a", - "description": "JOE / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000074df2B9Ad8a7Be4d07a85F278ca0017513d3", - "feedSalt": "DEVX_PRICE_FEED_JOE_V0_27062023_XxQWl65", "derivedFeed": true }, { @@ -126,10 +82,6 @@ "address": "0xCE1bFFBD5374Dac86a2893119683F4911a2F7814", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0x4F3ddF9378a4865cf4f28BE51E10AECb83B7daeE", - "description": "SPELL / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000015e3b3B1023570DAE19c620073EB2acd1513", - "feedSalt": "DEVX_PRICE_FEED_SPELL_V0_24072023_v0CCYNa", "derivedFeed": true }, { @@ -137,10 +89,6 @@ "address": "0x214DB107654fF987AD859F34125307783fC8e387", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0x12Af94c3716bbf339Aa26BfD927DDdE63B27D50C", - "description": "FXS / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00002f9671412725CEB1A283f72CBb44ba3D1893", - "feedSalt": "DEVX_PRICE_FEED_FXS_V0_24072023_WCKMhk1", "derivedFeed": true }, { @@ -148,21 +96,13 @@ "address": "0x2147EFFF675e4A4eE1C2f918d181cDBd7a8E208f", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0x7B0ca9A6D03FE0467A31Ca850f5bcA51e027B3aF", - "description": "ALPHA / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000343Be957FC284F4df64d38cBaa7e065DD984", - "feedSalt": "DEVX_PRICE_FEED_ALPHA_V0_27062023_MtEbJge", "derivedFeed": true }, { "symbol": "LINK", "address": "0x5947BB275c521040051D82396192181b413227A3", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", - "tokenOracleAddress": "0x49ccd9ca821EfEab2b98c60dC60F518E765EDe9a", - "description": "LINK / AVAX", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x1b8a25F73c9420dD507406C3A3816A276b62f56a", - "feedSalt": "DEVX_PRICE_FEED_LINK_V0_27062023_JHIxs6o", + "tokenOracleAddress": "0x1b8a25F73c9420dD507406C3A3816A276b62f56a", "derivedFeed": false }, { @@ -170,10 +110,6 @@ "address": "0x37B608519F91f70F2EeB0e5Ed9AF4061722e4F76", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0x449A373A090d8A1e5F74c63Ef831Ceff39E94563", - "description": "SUSHI / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000552E10e879F403dD5F041742E6356d031825", - "feedSalt": "DEVX_PRICE_FEED_SUSHI_V0_27062023_dyZta4I", "derivedFeed": true }, { @@ -181,10 +117,6 @@ "address": "0x130966628846BFd36ff31a822705796e8cb8C18D", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0x54EdAB30a7134A16a54218AE64C73e1DAf48a8Fb", - "description": "MIM / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000020a943CeCe5043E1309663bc5Bfa822DE646", - "feedSalt": "DEVX_PRICE_FEED_MIM_V0_27062023_faxTfxe", "derivedFeed": true }, { @@ -192,10 +124,6 @@ "address": "0xD24C2Ad096400B6FBcd2ad8B24E7acBc21A1da64", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0xbBa56eF1565354217a3353a466edB82E8F25b08e", - "description": "FRAX / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00005f9f7f943e3db079D3B9A7A86aa80b70898C", - "feedSalt": "DEVX_PRICE_FEED_FRAX_V0_27062023_MmgkOOQ", "derivedFeed": true }, { @@ -203,10 +131,6 @@ "address": "0x62edc0692BD897D2295872a9FFCac5425011c661", "nativeOracleAddress": "0x0A77230d17318075983913bC2145DB16C7366156", "tokenOracleAddress": "0x3F968A21647d7ca81Fb8A5b69c0A452701d5DCe8", - "description": "GMX / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00001BC10BaB33fb8c0f93330e16153894F02a61", - "feedSalt": "DEVX_PRICE_FEED_GMX_V0_27062023_qKe9UwO", "derivedFeed": true } ] diff --git a/scripts/configs/prod/token-config-avalanche-testnet.json b/scripts/configs/prod/token-config-avalanche-testnet.json index 243ff84..9a647dc 100644 --- a/scripts/configs/prod/token-config-avalanche-testnet.json +++ b/scripts/configs/prod/token-config-avalanche-testnet.json @@ -5,10 +5,6 @@ "address": "0xA7b3002ec739077057689A389460a0E7c0367369", "nativeOracleAddress": "0x5498BB86BC934c8D34FDA08E81D444153d0D06aD", "tokenOracleAddress": "0x7898AcCC83587C3C55116c5230C17a6Cd9C71bad", - "description": "USDT / AVAX", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000001E2C2B39542c30A3fE57c4487030bC03adF", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", "derivedFeed": true } ] diff --git a/scripts/configs/prod/token-config-base-goerli.json b/scripts/configs/prod/token-config-base-goerli.json index 2d12a99..13e03b8 100644 --- a/scripts/configs/prod/token-config-base-goerli.json +++ b/scripts/configs/prod/token-config-base-goerli.json @@ -5,10 +5,6 @@ "address": "0xD6a8c1eee4D4e4EF998b911B03d52bc301d9b332", "nativeOracleAddress": "0xcD2A119bD1F7DF95d706DE6F2057fDD45A0503E2", "tokenOracleAddress": "0xb85765935B4d9Ab6f841c9a00690Da5F34368bc0", - "description": "USDC / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005ABaE3DEAdbe1FBD12105F950efbA9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,10 +12,6 @@ "address": "0xe01435b1767aED7c25C943faCbdB582b6278650f", "nativeOracleAddress": "0xcD2A119bD1F7DF95d706DE6F2057fDD45A0503E2", "tokenOracleAddress": "0xd5973EB46D6fE54E82C5337dD9536B35D080912C", - "description": "USDT / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000001E2C2B39542c30A3fE57c4487030bC03adF", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", "derivedFeed": true }, { @@ -27,10 +19,6 @@ "address": "0x7c81B296d84802ec2d5e63846912011f2Cd3C31C", "nativeOracleAddress": "0xcD2A119bD1F7DF95d706DE6F2057fDD45A0503E2", "tokenOracleAddress": "0x440bD1535a02243d72E0fEED45B137efcC98bF7e", - "description": "DAI / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000d2Da196474046c7a4D94Ab0E566B26d054", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", "derivedFeed": true } ] diff --git a/scripts/configs/prod/token-config-bnb-mainnet.json b/scripts/configs/prod/token-config-bnb-mainnet.json index f223e63..90c2939 100644 --- a/scripts/configs/prod/token-config-bnb-mainnet.json +++ b/scripts/configs/prod/token-config-bnb-mainnet.json @@ -3,67 +3,43 @@ { "symbol": "USDC", "address": "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "USDC / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x45f86CA2A8BC9EBD757225B19a1A0D7051bE46Db", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0x45f86CA2A8BC9EBD757225B19a1A0D7051bE46Db", "derivedFeed": false }, { "symbol": "USDT", "address": "0x55d398326f99059fF775485246999027B3197955", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "USDT / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0xD5c40f5144848Bd4EF08a9605d860e727b991513", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0xD5c40f5144848Bd4EF08a9605d860e727b991513", "derivedFeed": false }, { "symbol": "DAI", "address": "0x1AF3F329e8BE154074D8769D1FFa4eE058B1DBc3", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "DAI / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x8EC213E7191488C7873cEC6daC8e97cdbAdb7B35", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0x8EC213E7191488C7873cEC6daC8e97cdbAdb7B35", "derivedFeed": false }, { "symbol": "TWT", "address": "0x4b0f1812e5df2a09796481ff14017e6005508003", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "TWT / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x7E728dFA6bCa9023d9aBeE759fDF56BEAb8aC7aD", - "feedSalt": "DEVX_PRICE_FEED_TWT_V0_27062023_92Xklvq", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0x7E728dFA6bCa9023d9aBeE759fDF56BEAb8aC7aD", "derivedFeed": false }, { "symbol": "CAKE", "address": "0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "CAKE / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0xcB23da9EA243f53194CBc2380A6d4d9bC046161f", - "feedSalt": "DEVX_PRICE_FEED_CAKE_V0_27062023_1BKpzde", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0xcB23da9EA243f53194CBc2380A6d4d9bC046161f", "derivedFeed": false }, { "symbol": "LINK", "address": "0xF8A0BF9cF54Bb92F17374d9e9A321E6a111a51bD", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "LINK / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0xB38722F6A608646a538E882Ee9972D15c86Fc597", - "feedSalt": "DEVX_PRICE_FEED_LINK_V0_27062023_JHIxs6o", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0xB38722F6A608646a538E882Ee9972D15c86Fc597", "derivedFeed": false }, { @@ -71,10 +47,6 @@ "address": "0x111111111117dC0aa78b770fA6A738034120C302", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x1B329402Cb1825C6F30A0d92aB9E2862BE47333f", - "description": "1INCH / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00000C451fA0b0a79a36c82820F061683E26714c", - "feedSalt": "DEVX_PRICE_FEED_1INCH_V0_27062023_XhXA3sd", "derivedFeed": true }, { @@ -82,43 +54,27 @@ "address": "0xfb6115445Bff7b52FeB98650C87f44907E58f802", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xA8357BF572460fC40f4B0aCacbB2a6A61c89f475", - "description": "AAVE / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000AF22A276F86B405835c18863e1C2A679D9e3", - "feedSalt": "DEVX_PRICE_FEED_AAVE_V0_28062023_HsugnpY", "derivedFeed": true }, { "symbol": "BUSD", "address": "0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "BUSD / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x87Ea38c9F24264Ec1Fff41B04ec94a97Caf99941", - "feedSalt": "DEVX_PRICE_FEED_BUSD_V0_27062023_J8nJR8O", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0x87Ea38c9F24264Ec1Fff41B04ec94a97Caf99941", "derivedFeed": false }, { "symbol": "ETH", "address": "0x2170Ed0880ac9A755fd29B2688956BD959F933F8", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "ETH / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x63D407F32Aa72E63C7209ce1c2F5dA40b3AaE726", - "feedSalt": "DEVX_PRICE_FEED_ETH_V0_27062023_jZ9Dvxh", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0x63D407F32Aa72E63C7209ce1c2F5dA40b3AaE726", "derivedFeed": false }, { "symbol": "XRP", "address": "0x1D2F0da169ceB9fC7B3144628dB156f3F6c60dBE", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "XRP / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x798A65D349B2B5E6645695912880b54dfFd79074", - "feedSalt": "DEVX_PRICE_FEED_XRP_V0_27062023_tjCRahl", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0x798A65D349B2B5E6645695912880b54dfFd79074", "derivedFeed": false }, { @@ -126,21 +82,13 @@ "address": "0x14016E85a25aeb13065688cAFB43044C2ef86784", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xa3334A9762090E827413A7495AfeCE76F41dFc06", - "description": "TUSD / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000064b138eDB97Ac8a3F4564E14d9a331288a6B", - "feedSalt": "DEVX_PRICE_FEED_TUSD_V0_27062023_QHVx0oQ", "derivedFeed": true }, { "symbol": "UNI", "address": "0xBf5140A22578168FD562DCcF235E5D43A02ce9B1", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "UNI / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x25298F020c3CA1392da76Eb7Ac844813b218ccf7", - "feedSalt": "DEVX_PRICE_FEED_UNI_V0_27062023_PBQ6vdq", + "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "tokenOracleAddress": "0x25298F020c3CA1392da76Eb7Ac844813b218ccf7", "derivedFeed": false }, { @@ -148,10 +96,6 @@ "address": "0xCC42724C6683B7E57334c4E856f4c9965ED682bD", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x7CA57b0cA6367191c94C8914d7Df09A57655905f", - "description": "MATIC / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000131e033973d4042167F814974D398C954AE4", - "feedSalt": "DEVX_PRICE_FEED_MATIC_V0_27062023_dUA11H1", "derivedFeed": true }, { @@ -159,10 +103,6 @@ "address": "0xf7DE7E8A6bd59ED41a4b5fe50278b3B7f31384dF", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x20123C6ebd45c6496102BeEA86e1a6616Ca547c6", - "description": "RDNT / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000008fA6c7A8dFDD2eee14360704552e7FF1106", - "feedSalt": "DEVX_PRICE_FEED_RDNT_V0_27062023_CE7LvWZ", "derivedFeed": true }, { @@ -171,10 +111,6 @@ "address": "0x7Ddc52c4De30e94Be3A6A0A2b259b2850f421989", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x8b0D36ae4CF8e277773A7ba5F35c09Edb144241b", - "description": "GMT / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000EB1BD01130B0429299C59Bcc51280EcFa3", - "feedSalt": "DEVX_PRICE_FEED_GMT(GOMINING)_V0_27062023_9BlrrVe", "derivedFeed": true }, { @@ -182,10 +118,6 @@ "address": "0x9C65AB58d8d978DB963e63f2bfB7121627e3a739", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x9165366bf450a6906D25549f0E0f8E6586Fc93E2", - "description": "MDX / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000055CeB7e51700701D185A2fC5C85CD0A0B4c0", - "feedSalt": "DEVX_PRICE_FEED_MDX_V0_27062023_4cZxM3m", "derivedFeed": true }, { @@ -193,10 +125,6 @@ "address": "0xAD29AbB318791D579433D831ed122aFeAf29dcfe", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xe2A47e87C0f4134c8D06A41975F6860468b2F925", - "description": "FTM / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000014e7939aD646144Ea6b96267bb1BD7cd7067", - "feedSalt": "DEVX_PRICE_FEED_FTM_V0_27062023_e8NvX2b", "derivedFeed": true }, { @@ -204,10 +132,6 @@ "address": "0xaEC945e04baF28b135Fa7c640f624f8D90F1C3a6", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x889158E39628C0397DC54B84F6b1cbe0AaEb7FFc", - "description": "C98 / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000ECddfaFFfcc20a2eF11694513A2C63564c45", - "feedSalt": "DEVX_PRICE_FEED_C98_V0_27062023_5SwtjcK", "derivedFeed": true }, { @@ -215,10 +139,6 @@ "address": "0x715D400F88C167884bbCc41C5FeA407ed4D2f8A0", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x7B49524ee5740c99435f52d731dFC94082fE61Ab", - "description": "AXS / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000129361C7DA0Ade90F2559d8dbFcE86f73Cf0", - "feedSalt": "DEVX_PRICE_FEED_AXS_V0_27062023_TcgSX8U", "derivedFeed": true }, { @@ -226,10 +146,6 @@ "address": "0xd17479997F34dd9156Deef8F95A52D81D265be9c", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x51c78c299C42b058Bf11d47FbB74aC437C6a0c8C", - "description": "USDD / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000062e3727903c86308E8c008f2C4147E1bF83b", - "feedSalt": "DEVX_PRICE_FEED_USDD_V0_27062023_PvMWVhA", "derivedFeed": true }, { @@ -238,10 +154,6 @@ "address": "0x3019BF2a2eF8040C242C9a4c5c4BD4C81678b2A1", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x8b0D36ae4CF8e277773A7ba5F35c09Edb144241b", - "description": "GMT / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000a179410B6AE396Fbf9328179cc51e8eb811E", - "feedSalt": "DEVX_PRICE_FEED_GMT(GREENMETA)_V0_27062023_OP631xI", "derivedFeed": true }, { @@ -249,10 +161,6 @@ "address": "0x90C97F71E18723b0Cf0dfa30ee176Ab653E89F40", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x13A9c98b07F098c5319f4FF786eB16E22DC738e1", - "description": "FRAX / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00005f9f7f943e3db079D3B9A7A86aa80b70898C", - "feedSalt": "DEVX_PRICE_FEED_FRAX_V0_27062023_MmgkOOQ", "derivedFeed": true }, { @@ -260,10 +168,6 @@ "address": "0x965F527D9159dCe6288a2219DB51fc6Eef120dD1", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x08E70777b982a58D23D05E3D7714f44837c06A21", - "description": "BSW / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000f453C85aB3c839c49Ef729f36081AC8D7ac2", - "feedSalt": "DEVX_PRICE_FEED_BSW_V0_27062023_Kv26Fjv", "derivedFeed": true }, { @@ -271,10 +175,6 @@ "address": "0xfe56d5892BDffC7BF58f2E84BE1b2C32D21C308b", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xF2f8273F6b9Fc22C90891DC802cAf60eeF805cDF", - "description": "KNC / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000DB3bfA1c8c27e4b99e5b023bFD30F210c185", - "feedSalt": "DEVX_PRICE_FEED_KNC_V0_27062023_G3ECzSl", "derivedFeed": true }, { @@ -282,10 +182,6 @@ "address": "0x4691937a7508860F876c9c0a2a617E7d9E945D4B", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x02Bfe714e78E2Ad1bb1C2beE93eC8dc5423B66d4", - "description": "WOO / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000DE1c603c7272383E8a7Ed24a5B9941da36DF", - "feedSalt": "DEVX_PRICE_FEED_WOO_V0_27062023_zjZa7el", "derivedFeed": true }, { @@ -293,10 +189,6 @@ "address": "0x16939ef78684453bfDFb47825F8a5F714f12623a", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x9A18137ADCF7b05f033ad26968Ed5a9cf0Bf8E6b", - "description": "XTZ / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00004443efb75BdEcDaaaD6293E10E3e9cDBD0A7", - "feedSalt": "DEVX_PRICE_FEED_XTZ_V0_27062023_EqsLbfu", "derivedFeed": true }, { @@ -304,10 +196,6 @@ "address": "0xb86AbCb37C3A4B64f74f59301AFF131a1BEcC787", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x3e3aA4FC329529C8Ab921c810850626021dbA7e6", - "description": "ZIL / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "", - "feedSalt": "DEVX_PRICE_FEED_ZIL_V0_27062023_zucJh8i", "derivedFeed": true }, { @@ -315,10 +203,6 @@ "address": "0x3203c9E46cA618C8C1cE5dC67e7e9D75f5da2377", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x1AAE42AA46483370Be23274Abb29Bcc40f808a4c", - "description": "MBOX / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000d4B5153b5cc737d5C8a53A29e70257E7De5E", - "feedSalt": "DEVX_PRICE_FEED_MBOX_V0_27062023_gtGW8Jd", "derivedFeed": true }, { @@ -326,10 +210,6 @@ "address": "0x8F0528cE5eF7B51152A59745bEfDD91D97091d2F", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xe0073b60833249ffd1bb2af809112c2fbf221DF6", - "description": "ALPACA / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000778014B53A0396A3CE80237Afcf89c4a603F", - "feedSalt": "DEVX_PRICE_FEED_ALPACA_V0_27062023_HmWTvr1", "derivedFeed": true }, { @@ -337,10 +217,6 @@ "address": "0xCa3F508B8e4Dd382eE878A314789373D80A5190A", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xaB827b69daCd586A37E80A7d552a4395d576e645", - "description": "BIFI / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000dd2600f5fC02fEF2Cd97717364144E6c0298", - "feedSalt": "DEVX_PRICE_FEED_BIFI_V0_27062023_j5hVBjs", "derivedFeed": true }, { @@ -348,10 +224,6 @@ "address": "0x762539b45A1dCcE3D36d080F74d1AED37844b878", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x38393201952f2764E04B290af9df427217D56B41", - "description": "LINA / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00009D8f80aC35d0242251b1475F8e6d056Ca56f", - "feedSalt": "DEVX_PRICE_FEED_LINA_V0_27062023_tsAKhlg", "derivedFeed": true }, { @@ -359,10 +231,6 @@ "address": "0x67ee3Cb086F8a16f34beE3ca72FAD36F7Db929e2", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x87701B15C08687341c2a847ca44eCfBc8d7873E1", - "description": "DODO / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00000dFD5Ba9C0Bd10d739Cc6c315Cbd0Bf22d03", - "feedSalt": "DEVX_PRICE_FEED_DODO_V0_27062023_ZYqxFW0", "derivedFeed": true }, { @@ -370,10 +238,6 @@ "address": "0xFd7B3A77848f1C2D67E05E54d78d174a0C850335", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x887f177CBED2cf555a64e7bF125E1825EB69dB82", - "description": "ONT / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000331F158B3691C9D7E5B623F8e59Ee6d4dFC4", - "feedSalt": "DEVX_PRICE_FEED_ONT_V0_27062023_cvuyqC7", "derivedFeed": true }, { @@ -381,10 +245,6 @@ "address": "0x1Fa4a73a3F0133f0025378af00236f3aBDEE5D63", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x0Fe4D87883005fCAFaF56B81d09473D9A29dCDC3", - "description": "NEAR / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000e8fbB89b5A593183D52FbE0cAcc4fdE43D06", - "feedSalt": "DEVX_PRICE_FEED_NEAR_V0_27062023_GfOHuQa", "derivedFeed": true }, { @@ -392,10 +252,6 @@ "address": "0x250632378E573c6Be1AC2f97Fcdf00515d0Aa91B", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x2A3796273d47c4eD363b361D3AEFb7F7E2A13782", - "description": "BETH / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00001844fe863119D4F5a36Fb9b13477Cc7fB482", - "feedSalt": "DEVX_PRICE_FEED_BETH_V0_27062023_HIdX0nG", "derivedFeed": true }, { @@ -403,10 +259,6 @@ "address": "0x0Eb3a705fc54725037CC9e008bDede697f62F335", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xb056B7C804297279A9a673289264c17E6Dc6055d", - "description": "ATOM / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000B3b5E8722d41F23b483747Ad69d553ad4e41", - "feedSalt": "DEVX_PRICE_FEED_ATOM_V0_27062023_uA0jFGU", "derivedFeed": true }, { @@ -414,10 +266,6 @@ "address": "0x0D8Ce2A99Bb6e3B7Db580eD848240e4a0F9aE153", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xE5dbFD9003bFf9dF5feB2f4F445Ca00fb121fb83", - "description": "FIL / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000d2911880FCa9C055c858c8EE36A4C00df11A", - "feedSalt": "DEVX_PRICE_FEED_FIL_V0_27062023_4v9KFOn", "derivedFeed": true }, { @@ -425,10 +273,6 @@ "address": "0x8fF795a6F4D97E7887C79beA79aba5cc76444aDf", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x43d80f616DAf0b0B42a928EeD32147dC59027D41", - "description": "BCH / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00000756352A0224A157c8867df7aF41592b66F0", - "feedSalt": "DEVX_PRICE_FEED_BCH_V0_27062023_kMHbG6e", "derivedFeed": true }, { @@ -436,10 +280,6 @@ "address": "0xb59490aB09A0f526Cc7305822aC65f2Ab12f9723", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x83766bA8d964fEAeD3819b145a69c947Df9Cb035", - "description": "LIT / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00004244169F87a2b6Fa95FB60481F7D02D9927e", - "feedSalt": "DEVX_PRICE_FEED_LIT_V0_27062023_QzFcBwH", "derivedFeed": true }, { @@ -447,10 +287,6 @@ "address": "0x4338665CBB7B2485A8855A139b75D5e34AB0DB94", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x74E72F37A8c415c8f1a98Ed42E78Ff997435791D", - "description": "LTC / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000d03686E0113616906f8018CeF0ebff588eDF", - "feedSalt": "DEVX_PRICE_FEED_LTC_V0_27062023_zxuYpzV", "derivedFeed": true }, { @@ -458,10 +294,6 @@ "address": "0x56b6fB708fC5732DEC1Afc8D8556423A2EDcCbD6", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xd5508c8Ffdb8F15cE336e629fD4ca9AdB48f50F0", - "description": "EOS / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000a730301a18C1F2A8FD7656f8f368135EFF17", - "feedSalt": "DEVX_PRICE_FEED_EOS_V0_27062023_ORB34FP", "derivedFeed": true }, { @@ -469,21 +301,13 @@ "address": "0xa2B726B1145A4773F68593CF171187d8EBe4d495", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x63A9133cd7c611d6049761038C16f238FddA71d7", - "description": "INJ / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00009d870cd3D340588CDc63414785d84680cd84", - "feedSalt": "DEVX_PRICE_FEED_INJ_V0_27062023_HCNhbey", "derivedFeed": true }, { "symbol": "ALPHA", "address": "0xa1faa113cbE53436Df28FF0aEe54275c13B40975", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", - "tokenOracleAddress": "", - "description": "ALPHA / BNB", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x7bC032A7C19B1BdCb981D892854d090cfB0f238E", - "feedSalt": "DEVX_PRICE_FEED_ALPHA_V0_27062023_MtEbJge", + "tokenOracleAddress": "0x7bC032A7C19B1BdCb981D892854d090cfB0f238E", "derivedFeed": false }, { @@ -491,10 +315,6 @@ "address": "0xF21768cCBC73Ea5B6fd3C687208a7c2def2d966e", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x46f13472A4d4FeC9E07E8A00eE52f4Fa77810736", - "description": "REEF / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000076aD9069129fEba496946bbf4B5e8AbA72b5", - "feedSalt": "DEVX_PRICE_FEED_REEF_V0_27062023_CMtabEv", "derivedFeed": true }, { @@ -502,10 +322,6 @@ "address": "0x52CE071Bd9b1C4B00A0b92D298c512478CaD67e8", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x0Db8945f9aEf5651fa5bd52314C5aAe78DfDe540", - "description": "COMP / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00003Fa408c59d15f1C43F07CBa2724d2D64Bc73", - "feedSalt": "DEVX_PRICE_FEED_COMP_V0_27062023_54gIpet", "derivedFeed": true }, { @@ -513,10 +329,6 @@ "address": "0x47BEAd2563dCBf3bF2c9407fEa4dC236fAbA485A", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xE188A9875af525d25334d75F3327863B2b8cd0F1", - "description": "SXP / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000D67b9BbFCcefc402bFa787829a8dC49205e6", - "feedSalt": "DEVX_PRICE_FEED_SXP_V0_27062023_NHosDhE", "derivedFeed": true }, { @@ -524,10 +336,6 @@ "address": "0x88f1A5ae2A3BF98AEAF342D26B30a79438c9142e", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xD7eAa5Bf3013A96e3d515c055Dbd98DbdC8c620D", - "description": "YFI / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00009c23613DF04f733A2B72f4e5CB585a47E5C9", - "feedSalt": "DEVX_PRICE_FEED_YFI_V0_27062023_6EmwyeO", "derivedFeed": true }, { @@ -535,10 +343,6 @@ "address": "0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xBF63F430A79D4036A5900C19818aFf1fa710f206", - "description": "XVS / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000003721b4D9C88c38aD56aA11E13de61486Ab5", - "feedSalt": "DEVX_PRICE_FEED_XVS_V0_27062023_wBKaSPp", "derivedFeed": true }, { @@ -546,10 +350,6 @@ "address": "0x3EE2200Efb3400fAbB9AacF31297cBdD1d435D47", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xa767f745331D267c7751297D982b050c93985627", - "description": "ADA / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000d32Bded21f301b68d7beA45276F3E6314fe2", - "feedSalt": "DEVX_PRICE_FEED_ADA_V0_27062023_qygbOee", "derivedFeed": true }, { @@ -557,10 +357,6 @@ "address": "0xAD6cAEb32CD2c308980a548bD0Bc5AA4306c6c18", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xC78b99Ae87fF43535b0C782128DB3cB49c74A4d3", - "description": "BAND / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00000c66455D60C1CD69AF839Fe95CEe02ed531f", - "feedSalt": "DEVX_PRICE_FEED_BAND_V0_27062023_wtCuh5w", "derivedFeed": true }, { @@ -568,10 +364,6 @@ "address": "0x4BD17003473389A42DAF6a0a729f6Fdb328BbBd7", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x058316f8Bb13aCD442ee7A216C7b60CFB4Ea1B53", - "description": "VAI / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00002F98e2473E715C4C799ed6283af82cae5436", - "feedSalt": "DEVX_PRICE_FEED_VAI_V0_27062023_5JAZXHq", "derivedFeed": true }, { @@ -579,10 +371,6 @@ "address": "0x7083609fCE4d1d8Dc0C979AAb8c869Ea2C873402", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xC333eb0086309a16aa7c8308DfD32c8BBA0a2592", - "description": "DOT / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000344411679C8d7E049349B02d082eF500661b", - "feedSalt": "DEVX_PRICE_FEED_DOT_V0_27062023_lIgEmg1", "derivedFeed": true }, { @@ -590,10 +378,6 @@ "address": "0xa184088a740c695E156F91f5cC086a06bb78b827", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x88E71E6520E5aC75f5338F5F0c9DeD9d4f692cDA", - "description": "AUTO / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000093807D7670407CCA1F1B4C2222AcC81F2dda", - "feedSalt": "DEVX_PRICE_FEED_AUTO_V0_27062023_nk64r20", "derivedFeed": true }, { @@ -601,10 +385,6 @@ "address": "0x570A5D26f7765Ecb712C0924E4De545B89fD43dF", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x0E8a53DD9c13589df6382F13dA6B3Ec8F919B323", - "description": "SOL / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000daa8f8e278521abE99805113c0Cc157Acb97", - "feedSalt": "DEVX_PRICE_FEED_SOL_V0_27062023_tnr0Rv6", "derivedFeed": true }, { @@ -612,10 +392,6 @@ "address": "0xfE19F0B51438fd612f6FD59C1dbB3eA319f433Ba", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0xc9D267542B23B41fB93397a93e5a1D7B80Ea5A01", - "description": "MIM / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000020a943CeCe5043E1309663bc5Bfa822DE646", - "feedSalt": "DEVX_PRICE_FEED_MIM_V0_27062023_faxTfxe", "derivedFeed": true }, { @@ -623,10 +399,6 @@ "address": "0xbA2aE424d960c26247Dd6c32edC70B295c744C43", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x3AB0A0d137D4F946fBB19eecc6e92E64660231C8", - "description": "DOGE / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000DDb960714B49A6470F66C032c7C6cc41acB2", - "feedSalt": "DEVX_PRICE_FEED_DOGE_V0_27062023_5YdLYJc", "derivedFeed": true }, { @@ -634,10 +406,6 @@ "address": "0x2eD9a5C8C13b93955103B9a7C167B67Ef4d568a3", "nativeOracleAddress": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", "tokenOracleAddress": "0x4978c0abE6899178c1A74838Ee0062280888E2Cf", - "description": "MASK / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000ca992a5420dE8725A494aE98638E2682B0f8", - "feedSalt": "DEVX_PRICE_FEED_MASK_V0_27062023_n5J3tCG", "derivedFeed": true } ] diff --git a/scripts/configs/prod/token-config-bnb-testnet.json b/scripts/configs/prod/token-config-bnb-testnet.json index f841b8e..4fb655b 100644 --- a/scripts/configs/prod/token-config-bnb-testnet.json +++ b/scripts/configs/prod/token-config-bnb-testnet.json @@ -5,10 +5,6 @@ "address": "0x1ffa9c87ead57adc9e4f9a7d26ec3a52150db3b0", "nativeOracleAddress": "0x2514895c72f50D8bd4B4F9b1110F0D6bD2c97526", "tokenOracleAddress": "0x90c069C4538adAc136E051052E14c1cD799C41B7", - "description": "USDC / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005abae3deadbe1fbd12105f950efba9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,10 +12,6 @@ "address": "0x03bbb5660b8687c2aa453a0e42dcb6e0732b1266", "nativeOracleAddress": "0x2514895c72f50D8bd4B4F9b1110F0D6bD2c97526", "tokenOracleAddress": "0xEca2605f0BCF2BA5966372C99837b1F182d3D620", - "description": "USDT / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000001e2c2b39542c30a3fe57c4487030bc03adf", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", "derivedFeed": true }, { @@ -27,10 +19,6 @@ "address": "0x355c8c8395fadf2eaa6bb27f86e53e432e3de4e6", "nativeOracleAddress": "0x2514895c72f50D8bd4B4F9b1110F0D6bD2c97526", "tokenOracleAddress": "0xE4eE17114774713d2De0eC0f035d4F7665fc025D", - "description": "DAI / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000d2da196474046c7a4d94ab0e566b26d054", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", "derivedFeed": true }, { @@ -38,10 +26,6 @@ "address": "0xc1537ab4f2e0b1c578baea06b5baae8f87ce971c", "nativeOracleAddress": "0x2514895c72f50D8bd4B4F9b1110F0D6bD2c97526", "tokenOracleAddress": "0x298619601ebCd58d0b526963Deb2365B485Edc74", - "description": "AAVE / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000AF22A276F86B405835c18863e1C2A679D9e3", - "feedSalt": "DEVX_PRICE_FEED_AAVE_V0_28062023_HsugnpY", "derivedFeed": true }, { @@ -49,10 +33,6 @@ "address": "0x81f9e7a56f6869a9a8c385d1e0701b312439501f", "nativeOracleAddress": "0x2514895c72f50D8bd4B4F9b1110F0D6bD2c97526", "tokenOracleAddress": "0x81faeDDfeBc2F8Ac524327d70Cf913001732224C", - "description": "CAKE / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000007198738f877c01d9b7e4a4e1bd17e46e4a8", - "feedSalt": "DEVX_PRICE_FEED_CAKE_V0_27062023_1BKpzde", "derivedFeed": true }, { @@ -60,10 +40,6 @@ "address": "0xdeb12ea437c116ed823ab49244cafec4e41704cb", "nativeOracleAddress": "0x2514895c72f50D8bd4B4F9b1110F0D6bD2c97526", "tokenOracleAddress": "0x1B329402Cb1825C6F30A0d92aB9E2862BE47333f", - "description": "LINK / BNB", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00000da809fe7be1297ee731f998141ba352778d", - "feedSalt": "DEVX_PRICE_FEED_LINK_V0_27062023_JHIxs6o", "derivedFeed": true } ] diff --git a/scripts/configs/prod/token-config-eth-mainnet.json b/scripts/configs/prod/token-config-eth-mainnet.json index cb3544b..11c5420 100644 --- a/scripts/configs/prod/token-config-eth-mainnet.json +++ b/scripts/configs/prod/token-config-eth-mainnet.json @@ -3,12 +3,8 @@ { "symbol": "USDC", "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "USDC / ETH", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x986b5E1e1755e3C2440e960477f25201B0a8bbD4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", + "nativeOracleAddress": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "tokenOracleAddress": "0x986b5E1e1755e3C2440e960477f25201B0a8bbD4", "derivedFeed": false } ] diff --git a/scripts/configs/prod/token-config-goerli.json b/scripts/configs/prod/token-config-goerli.json index 9cd4674..0a6dfb7 100644 --- a/scripts/configs/prod/token-config-goerli.json +++ b/scripts/configs/prod/token-config-goerli.json @@ -5,10 +5,6 @@ "address": "0xb5B640E6414b6DeF4FC9B3C1EeF373925effeCcF", "nativeOracleAddress": "0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e", "tokenOracleAddress": "0xAb5c49580294Aff77670F839ea425f5b78ab3Ae7", - "description": "USDC / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005ABaE3DEAdbe1FBD12105F950efbA9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true } ] diff --git a/scripts/configs/prod/token-config-moonbeam.json b/scripts/configs/prod/token-config-moonbeam.json index 11ea0cc..444a0d2 100644 --- a/scripts/configs/prod/token-config-moonbeam.json +++ b/scripts/configs/prod/token-config-moonbeam.json @@ -5,10 +5,6 @@ "address": "0x818ec0A7Fe18Ff94269904fCED6AE3DaE6d6dC0b", "nativeOracleAddress": "0x4497B606be93e773bbA5eaCFCb2ac5E2214220Eb", "tokenOracleAddress": "0xA122591F60115D63421f66F752EF9f6e0bc73abC", - "description": "USDC / GLMR", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005ABaE3DEAdbe1FBD12105F950efbA9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,10 +12,6 @@ "address": "0xeFAeeE334F0Fd1712f9a8cc375f427D9Cdd40d73", "nativeOracleAddress": "0x4497B606be93e773bbA5eaCFCb2ac5E2214220Eb", "tokenOracleAddress": "0xD925C5BF88Bd0ca09312625d429240F811b437c6", - "description": "USDT / GLMR", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000001E2C2B39542c30A3fE57c4487030bC03adF", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", "derivedFeed": true }, { @@ -27,10 +19,6 @@ "address": "0x765277EebeCA2e31912C9946eAe1021199B39C61", "nativeOracleAddress": "0x4497B606be93e773bbA5eaCFCb2ac5E2214220Eb", "tokenOracleAddress": "0x6063e1037B1afDA2bE5A3340757261E4d6a402ac", - "description": "DAI / GLMR", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000d2Da196474046c7a4D94Ab0E566B26d054", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", "derivedFeed": true }, { @@ -38,10 +26,6 @@ "address": "0xA649325Aa7C5093d12D6F98EB4378deAe68CE23F", "nativeOracleAddress": "0x4497B606be93e773bbA5eaCFCb2ac5E2214220Eb", "tokenOracleAddress": "0x2330fd83662bba3Fc62bc48cC935ca58847A8957", - "description": "BUSD / GLMR", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000020c39775542112E3DB0DbAD0d47A44bEB49A", - "feedSalt": "DEVX_PRICE_FEED_BUSD_V0_27062023_J8nJR8O", "derivedFeed": true } ] diff --git a/scripts/configs/prod/token-config-mumbai.json b/scripts/configs/prod/token-config-mumbai.json index d83dd9f..14e1859 100644 --- a/scripts/configs/prod/token-config-mumbai.json +++ b/scripts/configs/prod/token-config-mumbai.json @@ -5,10 +5,6 @@ "address": "0xdA5289fCAAF71d52a80A254da614a192b693e977", "nativeOracleAddress": "0xd0D5e3DB44DE05E9F294BB0a3bEEaF030DE24Ada", "tokenOracleAddress": "0x572dDec9087154dC5dfBB1546Bb62713147e0Ab0", - "description": "USDC / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005abae3deadbe1fbd12105f950efba9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,10 +12,6 @@ "address": "0xeaBc4b91d9375796AA4F69cC764A4aB509080A58", "nativeOracleAddress": "0xd0D5e3DB44DE05E9F294BB0a3bEEaF030DE24Ada", "tokenOracleAddress": "0x92C09849638959196E976289418e5973CC96d645", - "description": "USDT / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000001e2c2b39542c30a3fe57c4487030bc03adf", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", "derivedFeed": true }, { @@ -27,10 +19,6 @@ "address": "0x27a44456bEDb94DbD59D0f0A14fE977c777fC5C3", "nativeOracleAddress": "0xd0D5e3DB44DE05E9F294BB0a3bEEaF030DE24Ada", "tokenOracleAddress": "0x0FCAa9c899EC5A91eBc3D5Dd869De833b06fB046", - "description": "DAI / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000d2da196474046c7a4d94ab0e566b26d054", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", "derivedFeed": true }, { @@ -38,10 +26,6 @@ "address": "0xE03489D4E90b22c59c5e23d45DFd59Fc0dB8a025", "nativeOracleAddress": "0xd0D5e3DB44DE05E9F294BB0a3bEEaF030DE24Ada", "tokenOracleAddress": "0x9dd18534b8f456557d11B9DDB14dA89b2e52e308", - "description": "SAND / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00000980455efb131c1908efa908c1eaf19db352", - "feedSalt": "DEVX_PRICE_FEED_SAND_V0_27062023_eHPqgeR", "derivedFeed": true } ] diff --git a/scripts/configs/prod/token-config-optimism-goerli.json b/scripts/configs/prod/token-config-optimism-goerli.json index 88e324f..8eb68f3 100644 --- a/scripts/configs/prod/token-config-optimism-goerli.json +++ b/scripts/configs/prod/token-config-optimism-goerli.json @@ -5,10 +5,6 @@ "address": "0xe01435b1767aED7c25C943faCbdB582b6278650f", "nativeOracleAddress": "0x57241A37733983F97C4Ab06448F244A1E0Ca0ba8", "tokenOracleAddress": "0x2636B223652d388721A0ED2861792DA9062D8C73", - "description": "USDC / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005ABaE3DEAdbe1FBD12105F950efbA9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,10 +12,6 @@ "address": "0x7c81B296d84802ec2d5e63846912011f2Cd3C31C", "nativeOracleAddress": "0x57241A37733983F97C4Ab06448F244A1E0Ca0ba8", "tokenOracleAddress": "0x31856c9a2A73aAee6100Aed852650f75c5F539D0", - "description": "DAI / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000d2Da196474046c7a4D94Ab0E566B26d054", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", "derivedFeed": true }, { @@ -27,21 +19,13 @@ "address": "0xD6a8c1eee4D4e4EF998b911B03d52bc301d9b332", "nativeOracleAddress": "0x57241A37733983F97C4Ab06448F244A1E0Ca0ba8", "tokenOracleAddress": "0x0A024aa48E09e151090637d2b68162b1Caf7BdbA", - "description": "UNI / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000095CcE092E83E5826cFeb0f03cFa74915b41", - "feedSalt": "DEVX_PRICE_FEED_UNI_V0_27062023_PBQ6vdq", "derivedFeed": true }, { "symbol": "LINK", "address": "0x6EB5be4c0D6da4ca582e9912F212c0DB1d96fC3d", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "LINK / ETH", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x37410D317b96E1fED1814473E1CcD323D0eB4Eb1", - "feedSalt": "DEVX_PRICE_FEED_LINK_V0_27062023_JHIxs6o", + "nativeOracleAddress": "0x57241A37733983F97C4Ab06448F244A1E0Ca0ba8", + "tokenOracleAddress": "0x37410D317b96E1fED1814473E1CcD323D0eB4Eb1", "derivedFeed": false } ] diff --git a/scripts/configs/prod/token-config-optimism-mainnet.json b/scripts/configs/prod/token-config-optimism-mainnet.json index 4f2b7b9..57ffe87 100644 --- a/scripts/configs/prod/token-config-optimism-mainnet.json +++ b/scripts/configs/prod/token-config-optimism-mainnet.json @@ -5,10 +5,6 @@ "address": "0x7F5c764cBc14f9669B88837ca1490cCa17c31607", "nativeOracleAddress": "0x13e3Ee699D1909E989722E753853AE30b17e08c5", "tokenOracleAddress": "0x16a9FA2FDa030272Ce99B29CF780dFA30361E0f3", - "description": "USDC / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005ABaE3DEAdbe1FBD12105F950efbA9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,10 +12,6 @@ "address": "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58", "nativeOracleAddress": "0x13e3Ee699D1909E989722E753853AE30b17e08c5", "tokenOracleAddress": "0xECef79E109e997bCA29c1c0897ec9d7b03647F5E", - "description": "USDT / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000001E2C2B39542c30A3fE57c4487030bC03adF", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", "derivedFeed": true }, { @@ -27,10 +19,6 @@ "address": "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", "nativeOracleAddress": "0x13e3Ee699D1909E989722E753853AE30b17e08c5", "tokenOracleAddress": "0x8dBa75e83DA73cc766A7e5a0ee71F656BAb470d6", - "description": "DAI / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000d2Da196474046c7a4D94Ab0E566B26d054", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", "derivedFeed": true }, { @@ -38,10 +26,6 @@ "address": "0x68f180fcCe6836688e9084f035309E29Bf0A2095", "nativeOracleAddress": "0x13e3Ee699D1909E989722E753853AE30b17e08c5", "tokenOracleAddress": "0x718A5788b89454aAE3A028AE9c111A29Be6c2a6F", - "description": "WBTC / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00002D444779516f9D60368f3fa1E2b036BCCc7D", - "feedSalt": "DEVX_PRICE_FEED_WBTC_V0_27062023_z41FLvK", "derivedFeed": true }, { @@ -49,21 +33,13 @@ "address": "0x8700dAec35aF8Ff88c16BdF0418774CB3D7599B4", "nativeOracleAddress": "0x13e3Ee699D1909E989722E753853AE30b17e08c5", "tokenOracleAddress": "0x2FCF37343e916eAEd1f1DdaaF84458a359b53877", - "description": "SNX / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000f303a2ED1eDF64C3B41E937028b7140d94c8", - "feedSalt": "DEVX_PRICE_FEED_SNX_V0_27062023_4DrwwXZ", "derivedFeed": true }, { "symbol": "LINK", "address": "0x350a791Bfc2C21F9Ed5d10980Dad2e2638ffa7f6", "nativeOracleAddress": "0x13e3Ee699D1909E989722E753853AE30b17e08c5", - "tokenOracleAddress": "", - "description": "LINK / ETH", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x464A1515ADc20de946f8d0DEB99cead8CEAE310d", - "feedSalt": "", + "tokenOracleAddress": "0x464A1515ADc20de946f8d0DEB99cead8CEAE310d", "derivedFeed": false }, { @@ -71,10 +47,6 @@ "address": "0x8c6f28f2F1A3C87F0f938b96d27520d9751ec8d9", "nativeOracleAddress": "0x13e3Ee699D1909E989722E753853AE30b17e08c5", "tokenOracleAddress": "0x7f99817d87baD03ea21E05112Ca799d715730efe", - "description": "SUSD / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000037cD348e5B79AdEe29148E6D05520B2c45D2", - "feedSalt": "DEVX_PRICE_FEED_SUSD_V0_24072023_0Dv7g4m", "derivedFeed": true }, { @@ -82,10 +54,6 @@ "address": "0x9e1028F5F1D5eDE59748FFceE5532509976840E0", "nativeOracleAddress": "0x13e3Ee699D1909E989722E753853AE30b17e08c5", "tokenOracleAddress": "0xA12CDDd8e986AF9288ab31E58C60e65F2987fB13", - "description": "PERP / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000068aa7F8C85Bf8aDa5AA18099baFcd2e1dF5B", - "feedSalt": "DEVX_PRICE_FEED_PERP_V0_24072023_uh65wbb", "derivedFeed": true }, { @@ -93,10 +61,6 @@ "address": "0x4200000000000000000000000000000000000042", "nativeOracleAddress": "0x13e3Ee699D1909E989722E753853AE30b17e08c5", "tokenOracleAddress": "0x0D276FC14719f9292D5C1eA2198673d1f4269246", - "description": "OP / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000462be5bbdA0a7B5414044C32C7e37D0D35f3", - "feedSalt": "DEVX_PRICE_FEED_OP_V0_24072023_riqc17D", "derivedFeed": true } ] diff --git a/scripts/configs/prod/token-config-polygon-mainnet.json b/scripts/configs/prod/token-config-polygon-mainnet.json index 7f5ec61..55f9dd2 100644 --- a/scripts/configs/prod/token-config-polygon-mainnet.json +++ b/scripts/configs/prod/token-config-polygon-mainnet.json @@ -5,10 +5,6 @@ "address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xfE4A8cc5b5B2366C1B58Bea3858e81843581b2F7", - "description": "USDC / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005ABaE3DEAdbe1FBD12105F950efbA9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,10 +12,6 @@ "address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x0A6513e40db6EB1b165753AD52E80663aeA50545", - "description": "USDT / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000001E2C2B39542c30A3fE57c4487030bC03adF", - "feedSalt": "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", "derivedFeed": true }, { @@ -27,10 +19,6 @@ "address": "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x4746DeC9e833A82EC7C2C1356372CcF2cfcD2F3D", - "description": "DAI / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000d2Da196474046c7a4D94Ab0E566B26d054", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", "derivedFeed": true }, { @@ -38,10 +26,6 @@ "address": "0xBbba073C31bF03b8ACf7c28EF0738DeCF3695683", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x3D49406EDd4D52Fb7FFd25485f32E073b529C924", - "description": "SAND / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00000980455EFB131c1908eFa908c1eaF19db352", - "feedSalt": "DEVX_PRICE_FEED_SAND_V0_27062023_eHPqgeR", "derivedFeed": true }, { @@ -49,10 +33,6 @@ "address": "0x1B815d120B3eF02039Ee11dC2d33DE7aA4a8C603", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x6a99EC84819FB7007dd5D032068742604E755c56", - "description": "WOO / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000DE1c603c7272383E8a7Ed24a5B9941da36DF", - "feedSalt": "DEVX_PRICE_FEED_WOO_V0_27062023_zjZa7el", "derivedFeed": true }, { @@ -60,10 +40,6 @@ "address": "0xD6DF932A45C0f255f85145f286eA0b292B21C90B", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x72484B12719E23115761D5DA1646945632979bB6", - "description": "AAVE / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000AF22A276F86B405835c18863e1C2A679D9e3", - "feedSalt": "DEVX_PRICE_FEED_AAVE_V0_28062023_HsugnpY", "derivedFeed": true }, { @@ -71,10 +47,6 @@ "address": "0x9C9e5fD8bbc25984B178FdCE6117Defa39d2db39", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xE0dC07D5ED74741CeeDA61284eE56a2A0f7A4Cc9", - "description": "BUSD / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000020c39775542112E3DB0DbAD0d47A44bEB49A", - "feedSalt": "DEVX_PRICE_FEED_BUSD_V0_27062023_J8nJR8O", "derivedFeed": true }, { @@ -82,10 +54,6 @@ "address": "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xF9680D99D6C9589e2a93a78A04A279e509205945", - "description": "ETH / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00008cC9D5BF9F97AE2879163011707812561b42", - "feedSalt": "DEVX_PRICE_FEED_ETH_V0_27062023_jZ9Dvxh", "derivedFeed": true }, { @@ -93,10 +61,6 @@ "address": "0xA1c57f48F0Deb89f569dFbE6E2B7f46D33606fD4", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xA1CbF3Fe43BC3501e3Fc4b573e822c70e76A7512", - "description": "MANA / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000De2Ed5b4f74b6f03539529E8Cb67545d7834", - "feedSalt": "DEVX_PRICE_FEED_MANA_V0_28062023_E87OPLB", "derivedFeed": true }, { @@ -104,10 +68,6 @@ "address": "0xB5C064F955D8e7F38fE0460C556a72987494eE17", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xa058689f4bCa95208bba3F265674AE95dED75B6D", - "description": "QUICK / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000ABAe40C30ab8ac824ba01Eb1003A0d1a2754", - "feedSalt": "DEVX_PRICE_FEED_QUICK_V0_27062023_9UTXOsb", "derivedFeed": true }, { @@ -115,10 +75,6 @@ "address": "0x0b3F868E0BE5597D5DB7fEB59E1CADBb0fdDa50a", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x49B0c695039243BBfEb8EcD054EB70061fd54aa0", - "description": "SUSHI / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000552E10e879F403dD5F041742E6356d031825", - "feedSalt": "DEVX_PRICE_FEED_SUSHI_V0_27062023_dyZta4I", "derivedFeed": true }, { @@ -126,10 +82,6 @@ "address": "0x2e1AD108fF1D8C782fcBbB89AAd783aC49586756", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x7C5D415B64312D38c56B54358449d0a4058339d2", - "description": "TUSD / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000064b138eDB97Ac8a3F4564E14d9a331288a6B", - "feedSalt": "DEVX_PRICE_FEED_TUSD_V0_27062023_QHVx0oQ", "derivedFeed": true }, { @@ -137,10 +89,6 @@ "address": "0xb33EaAd8d922B1083446DC23f610c2567fB5180f", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xdf0Fb4e4F928d2dCB76f438575fDD8682386e13C", - "description": "UNI / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000095CcE092E83E5826cFeb0f03cFa74915b41", - "feedSalt": "DEVX_PRICE_FEED_UNI_V0_27062023_PBQ6vdq", "derivedFeed": true }, { @@ -148,21 +96,13 @@ "address": "0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xDE31F8bFBD8c84b5360CFACCa3539B938dd78ae6", - "description": "UNI / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00002D444779516f9D60368f3fa1E2b036BCCc7D", - "feedSalt": "DEVX_PRICE_FEED_WBTC_V0_27062023_z41FLvK", "derivedFeed": true }, { "symbol": "LINK", "address": "0x53E0bca35eC356BD5ddDFebbD1Fc0fD03FaBad39", - "nativeOracleAddress": "", - "tokenOracleAddress": "", - "description": "LINK / MATIC", - "priceFeedFunction": "latestAnswer()", - "priceFeedAddress": "0x5787BefDc0ECd210Dfa948264631CD53E68F7802", - "feedSalt": "DEVX_PRICE_FEED_LINK_V0_27062023_JHIxs6o", + "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", + "tokenOracleAddress": "0x5787BefDc0ECd210Dfa948264631CD53E68F7802", "derivedFeed": false }, { @@ -170,10 +110,6 @@ "address": "0xE0B52e49357Fd4DAf2c15e02058DCE6BC0057db4", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x9b88d07B2354eF5f4579690356818e07371c7BeD", - "description": "agEUR / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00000a13B868fEed2De6ADC47B982caA875F1879", - "feedSalt": "DEVX_PRICE_FEED_AGEUR_V0_27062023_npeAxaf", "derivedFeed": true }, { @@ -181,10 +117,6 @@ "address": "0x2C89bbc92BD86F8075d1DEcc58C7F4E0107f286b", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xe01eA2fbd8D76ee323FbEd03eB9a8625EC981A10", - "description": "AVAX / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000312944601e41a06Bc26C7B28912ff15248e1", - "feedSalt": "DEVX_PRICE_FEED_AVAX_V0_27062023_f9ygwpY", "derivedFeed": true }, { @@ -192,10 +124,6 @@ "address": "0x9a71012B13CA4d3D0Cdc72A177DF3ef03b0E76A3", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xD106B538F2A868c28Ca1Ec7E298C3325E0251d66", - "description": "BAL / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00002a35F6a70c64769D9FF26750f5b5cAE2bC88", - "feedSalt": "DEVX_PRICE_FEED_BAL_V0_27062023_IzEMruz", "derivedFeed": true }, { @@ -203,10 +131,6 @@ "address": "0xD85d1e945766Fea5Eda9103F918Bd915FbCa63E6", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xc9ECF45956f576681bDc01F79602A79bC2667B0c", - "description": "CEL / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000c8EFFbE9d075B6e56C1Ab2d1De9952141C8D", - "feedSalt": "DEVX_PRICE_FEED_CEL_V0_28062023_ZALYl4b", "derivedFeed": true }, { @@ -214,10 +138,6 @@ "address": "0x8505b9d2254A7Ae468c0E9dd10Ccea3A837aef5c", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x2A8758b7257102461BC958279054e372C2b1bDE6", - "description": "COMP / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00003Fa408c59d15f1C43F07CBa2724d2D64Bc73", - "feedSalt": "DEVX_PRICE_FEED_COMP_V0_27062023_54gIpet", "derivedFeed": true }, { @@ -225,10 +145,6 @@ "address": "0x172370d5Cd63279eFa6d502DAB29171933a610AF", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x336584C8E6Dc19637A5b36206B1c79923111b405", - "description": "CRV / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000ba91FB68ea2fF253328834CB9E1d0f427D83", - "feedSalt": "DEVX_PRICE_FEED_CRV_V0_27062023_GrIWEtf", "derivedFeed": true }, { @@ -236,10 +152,6 @@ "address": "0x45c32fA6DF82ead1e2EF74d17b76547EDdFaFF89", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x00DBeB1e45485d53DF7C2F0dF1Aa0b6Dc30311d3", - "description": "FRAX / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00005f9f7f943e3db079D3B9A7A86aa80b70898C", - "feedSalt": "DEVX_PRICE_FEED_FRAX_V0_27062023_MmgkOOQ", "derivedFeed": true }, { @@ -247,10 +159,6 @@ "address": "0x385Eeac5cB85A38A9a07A70c73e0a3271CfB54A7", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xDD229Ce42f11D8Ee7fFf29bDB71C7b81352e11be", - "description": "GHST / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000Af2E95EcABCC7b2c03BF2Dd8e840554A98c4", - "feedSalt": "DEVX_PRICE_FEED_GHST_V0_27062023_GgAZpkz", "derivedFeed": true }, { @@ -258,10 +166,6 @@ "address": "0x5fe2B58c013d7601147DcdD68C143A77499f5531", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x3FabBfb300B1e2D7c9B84512fe9D30aeDF24C410", - "description": "GRT / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005e5cC18cdb3cdB513caBAFb4d215Ae63235", - "feedSalt": "DEVX_PRICE_FEED_GRT_V0_27062023_uBLkfy1", "derivedFeed": true }, { @@ -269,10 +173,6 @@ "address": "0x1C954E8fe737F99f68Fa1CCda3e51ebDB291948C", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x10e5f3DFc81B3e5Ef4e648C4454D04e79E1E41E2", - "description": "KNC / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000DB3bfA1c8c27e4b99e5b023bFD30F210c185", - "feedSalt": "DEVX_PRICE_FEED_KNC_V0_27062023_G3ECzSl", "derivedFeed": true }, { @@ -280,10 +180,6 @@ "address": "0xa3Fa99A148fA48D14Ed51d610c367C61876997F1", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xd8d483d813547CfB624b8Dc33a00F2fcbCd2D428", - "description": "MIMATIC / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000A60ddc7E929Da83Af1821fb13B7BbC2Bf2C2", - "feedSalt": "DEVX_PRICE_FEED_MIMATIC_V0_27062023_IgmN8NM", "derivedFeed": true }, { @@ -291,10 +187,6 @@ "address": "0xC3Ec80343D2bae2F8E680FDADDe7C17E71E114ea", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xc86105DccF9BD629Cea7Fd41f94c6050bF96D57F", - "description": "OM / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00005AFae4A06322ce9B08bB930eC175BD35FA53", - "feedSalt": "DEVX_PRICE_FEED_OM_V0_27062023_moV4Zhy", "derivedFeed": true }, { @@ -302,10 +194,6 @@ "address": "0x8765f05ADce126d70bcdF1b0a48Db573316662eB", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x24C0e0FC8cCb21e2fb3e1A8A4eC4b29458664f79", - "description": "PLA / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x00007AdBC383D37A2F67D45544B677191D73d2Ba", - "feedSalt": "DEVX_PRICE_FEED_PLA_V0_27062023_BsEEM6r", "derivedFeed": true }, { @@ -313,10 +201,6 @@ "address": "0x00e5646f60AC6Fb446f621d146B6E1886f002905", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x7f45273fD7C644714825345670414Ea649b50b16", - "description": "RAI / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000A3D0BEDB1f6533DB80ff63d33A3ccba4dDDE", - "feedSalt": "DEVX_PRICE_FEED_RAI_V0_27062023_GfS8MIt", "derivedFeed": true }, { @@ -324,10 +208,6 @@ "address": "0x50B728D8D964fd00C2d0AAD81718b71311feF68a", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xbF90A5D9B6EE9019028dbFc2a9E50056d5252894", - "description": "SNX / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000f303a2ED1eDF64C3B41E937028b7140d94c8", - "feedSalt": "DEVX_PRICE_FEED_SNX_V0_27062023_4DrwwXZ", "derivedFeed": true }, { @@ -335,10 +215,6 @@ "address": "0xd93f7E271cB87c23AaA73edC008A79646d1F9912", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0x10C8264C0935b3B9870013e057f330Ff3e9C56dC", - "description": "SOL / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x0000daa8f8e278521abE99805113c0Cc157Acb97", - "feedSalt": "DEVX_PRICE_FEED_SOL_V0_27062023_tnr0Rv6", "derivedFeed": true }, { @@ -346,10 +222,6 @@ "address": "0xEFeE2de82343BE622Dcb4E545f75a3b9f50c272D", "nativeOracleAddress": "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", "tokenOracleAddress": "0xd78325DcA0F90F0FFe53cCeA1B02Bb12E1bf8FdB", - "description": "TRY / MATIC", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000017bbc04B0b1EFd0372E1f353BC5aaDD4c659", - "feedSalt": "DEVX_PRICE_FEED_TRY_V0_27062023_CDdLFlo", "derivedFeed": true } ] diff --git a/scripts/configs/prod/token-config-sepolia.json b/scripts/configs/prod/token-config-sepolia.json index f998f15..5069e60 100644 --- a/scripts/configs/prod/token-config-sepolia.json +++ b/scripts/configs/prod/token-config-sepolia.json @@ -5,10 +5,6 @@ "address": "0x9C73373C70F23920EA54F7883dCB1F85b162Df40", "nativeOracleAddress": "0x694AA1769357215DE4FAC081bf1f309aDC325306", "tokenOracleAddress": "0xA2F78ab2355fe2f984D808B5CeE7FD0A93D5270E", - "description": "USDC / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000005ABaE3DEAdbe1FBD12105F950efbA9eaec4", - "feedSalt": "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", "derivedFeed": true }, { @@ -16,10 +12,6 @@ "address": "0x5Bc7c8cFC6d54c055547Fcd8f6Ee4f2eDcda613e", "nativeOracleAddress": "0x694AA1769357215DE4FAC081bf1f309aDC325306", "tokenOracleAddress": "0x14866185B1962B63C3Ea9E03Bc1da838bab34C19", - "description": "DAI / ETH", - "priceFeedFunction": "getThePrice()", - "priceFeedAddress": "0x000000d2da196474046c7a4d94ab0e566b26d054", - "feedSalt": "DEVX_PRICE_FEED_DAI_V0_27062023_1m7JNWQ", "derivedFeed": true } ] diff --git a/scripts/deploy-arbitrum-goerli.ts b/scripts/deploy-arbitrum-goerli.ts deleted file mode 100644 index 922ecf3..0000000 --- a/scripts/deploy-arbitrum-goerli.ts +++ /dev/null @@ -1,474 +0,0 @@ -import { ethers, run } from "hardhat"; -import { arbGoerliConfigInfoProd } from "./configs"; -import { TokenConfig } from "./utils/Types"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - isContract, -} from "./utils"; -import { - BiconomyTokenPaymaster, - BiconomyTokenPaymaster__factory, - ChainlinkOracleAggregator, - ChainlinkOracleAggregator__factory, - Deployer, - Deployer__factory, -} from "../typechain-types"; - -const tokenConfig: TokenConfig = arbGoerliConfigInfoProd; - -const entryPointAddress = - process.env.ENTRY_POINT_ADDRESS || - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; -const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_DEV = - process.env.DEPLOYER_CONTRACT_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_PROD = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - if (!isOracleAggregatorDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(10000); - } catch (err) { - console.log("issue with the deployment"); - console.log(err); - return ethers.constants.AddressZero; - } - - try { - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } catch (err) { - console.log("issue with the verification ", oracleAggregatorComputedAddr); - return oracleAggregatorComputedAddr; - } - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; -} - -async function deployTokenPaymasterContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) - ); - - const BiconomyTokenPaymaster = await ethers.getContractFactory( - "BiconomyTokenPaymaster" - ); - const tokenPaymasterBytecode = `${ - BiconomyTokenPaymaster.bytecode - }${encodeParam("address", earlyOwnerAddress).slice(2)}${encodeParam( - "address", - entryPointAddress - ).slice(2)}${encodeParam("address", verifyingSigner).slice(2)}`; - - const tokenPaymasterComputedAddr = await deployerInstance.addressOf(salt); - console.log("Token paymaster Computed Address: ", tokenPaymasterComputedAddr); - const isContractDeployed = await isContract( - tokenPaymasterComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, - salt, - tokenPaymasterBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); - } catch (err) { - console.log("issue with the verification ", tokenPaymasterComputedAddr); - return tokenPaymasterComputedAddr; - } - } else { - console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr - ); - } - return tokenPaymasterComputedAddr; -} - -async function deployDerivedPriceFeed( - deployerInstance: Deployer, - nativeOracleAddress: string, - tokenOracleAddress: string, - description: string, - feedSalt: string -): Promise { - const salt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(feedSalt)); - - const DerivedPriceFeed = await ethers.getContractFactory("DerivedPriceFeed"); - - const derivedPriceFeedBytecode = `${ - DerivedPriceFeed.bytecode - }${ethers.utils.defaultAbiCoder - .encode( - ["address", "address", "string"], - [nativeOracleAddress, tokenOracleAddress, description] - ) - .slice(2)}`; - - const derivedPriceFeedBComputedAddr = await deployerInstance.addressOf(salt); - console.log( - "Derived Price Feed Computed Address: ", - derivedPriceFeedBComputedAddr - ); - const isContractDeployed = await isContract( - derivedPriceFeedBComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - feedSalt, - derivedPriceFeedBComputedAddr, - salt, - derivedPriceFeedBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: derivedPriceFeedBComputedAddr, - constructorArguments: [ - nativeOracleAddress, - tokenOracleAddress, - description, - ], - }); - } catch (err) { - console.log( - "issue with the verification ", - derivedPriceFeedBComputedAddr - ); - return derivedPriceFeedBComputedAddr; - } - } else { - console.log( - "Derived Price Feed is Already deployed with address ", - derivedPriceFeedBComputedAddr - ); - } - return derivedPriceFeedBComputedAddr; -} - -async function setTokenOracle( - oracleAggregatorInstance: ChainlinkOracleAggregator, - tokenAddress: string, - priceFeedAddress: string, - priceFeedDecimals: number, - priceFeedFunctionName: string -) { - const PriceFeedContract = await ethers.getContractAt( - "FeedInterface", - priceFeedAddress - ); - - // Find the function ABI based on the provided function name - const functionAbi = - PriceFeedContract.interface.functions[ - priceFeedFunctionName as keyof typeof PriceFeedContract.functions - ]; - - // Generate the function data based on the function ABI - const functionData = - PriceFeedContract.interface.encodeFunctionData(functionAbi); - - const tx = await oracleAggregatorInstance.setTokenOracle( - tokenAddress, - priceFeedAddress, - priceFeedDecimals, - functionData, - true - ); - const receipt = await tx.wait(); - console.log( - `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` - ); -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstanceDEV(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_DEV); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_DEV - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_DEV, signer); - } -} - -async function getPredeployedDeployerContractInstancePROD(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_PROD); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_PROD - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_PROD, signer); - } -} - -async function getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress: string -): Promise { - const code = await provider.getCode(oracleAggregatorAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `ChainlinkOracleAggregator not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("ChainlinkOracleAggregator not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - oracleAggregatorAddress - ); - return ChainlinkOracleAggregator__factory.connect( - oracleAggregatorAddress, - signer - ); - } -} - -async function getTokenPaymasterContractInstance( - tokenPaymasterAddress: string -): Promise { - const code = await provider.getCode(tokenPaymasterAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("Biconomy Token Paymaster not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - tokenPaymasterAddress - ); - return BiconomyTokenPaymaster__factory.connect( - tokenPaymasterAddress, - signer - ); - } -} - -async function main() { - let tx, receipt; - const provider = ethers.provider; - - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - const deployerInstanceDEV = await getPredeployedDeployerContractInstanceDEV(); - console.log("========================================="); - - const deployerInstancePROD = - await getPredeployedDeployerContractInstancePROD(); - console.log("========================================="); - - // 1. Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); - await delay(5000); - - // 2. Deploy Token paymaster - const tokenPaymasterAddress = await deployTokenPaymasterContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================tokenPaymasterAddress=======================", - tokenPaymasterAddress - ); - await delay(5000); - - let oracleAggregatorInstance; - if (oracleAggregatorAddress) { - oracleAggregatorInstance = - await getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress - ); - console.log( - "==================oracleAggregatorInstance=======================" - ); - } - - // 3a. Deploy the derived price feeds for all chainlink supported ERC20 tokens - for (const token of tokenConfig.tokens) { - const { - symbol, - address, - nativeOracleAddress, - tokenOracleAddress, - priceFeedAddress, - description, - priceFeedFunction, - feedSalt, - derivedFeed, - } = token; - let derivedPriceFeedAddress = priceFeedAddress; - - if (derivedPriceFeedAddress == "") { - derivedPriceFeedAddress = await deployDerivedPriceFeed( - deployerInstanceDEV, - nativeOracleAddress, - tokenOracleAddress, - description, - feedSalt - ); - console.log( - `==================${symbol} PriceFeedAddress=======================`, - derivedPriceFeedAddress - ); - await delay(5000); - } - - // Continue with other steps like setting token oracle, transferring ownership, etc. - // Use the derivedPriceFeedAddress and other token-specific information as needed - // ... - - // 4. Set token oracle on oracle aggregator - if (oracleAggregatorInstance) { - let feedAddress = derivedPriceFeedAddress; - if (priceFeedFunction == "latestAnswer()" || derivedFeed == false) { - feedAddress = priceFeedAddress; - } - // TODO - // This should not hardcode tokenOracleDeciamls to 18 - // It works in case of derived price feeds and chainlink feeds which are in the erc20 / native base and quote format. - await setTokenOracle( - oracleAggregatorInstance, - address, - feedAddress, - 18, - priceFeedFunction - ); - } - } - - if (tokenPaymasterAddress) { - // 5b. transfer ownership of token paymaster to the owner - const tokenPaymasterInstance = await getTokenPaymasterContractInstance( - tokenPaymasterAddress - ); - console.log( - "==================tokenPaymasterInstance=======================" - ); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deploy-arbitrum-one-mainnet.ts b/scripts/deploy-arbitrum-one-mainnet.ts deleted file mode 100644 index bb14b04..0000000 --- a/scripts/deploy-arbitrum-one-mainnet.ts +++ /dev/null @@ -1,484 +0,0 @@ -import { ethers, run, network } from "hardhat"; -import { arbitrumOneConfigInfoProd } from "./configs"; -import { Token, TokenConfig } from "./utils/Types"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - getDeployerInstance, - isContract, -} from "./utils"; -import { - BiconomyTokenPaymaster, - BiconomyTokenPaymaster__factory, - ChainlinkOracleAggregator, - ChainlinkOracleAggregator__factory, - Deployer, - Deployer__factory, -} from "../typechain-types"; - -const tokenConfig: TokenConfig = arbitrumOneConfigInfoProd; - -const provider = ethers.provider; -const entryPointAddress = - process.env.ENTRY_POINT_ADDRESS || - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; -const owner = process.env.PAYMASTER_OWNER_ADDRESS_DEV || ""; -const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_DEV = - process.env.DEPLOYER_CONTRACT_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_PROD = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - if (!isOracleAggregatorDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(10000); - } catch (err) { - console.log("issue with the deployment"); - console.log(err); - return ethers.constants.AddressZero; - } - - try { - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } catch (err) { - console.log("issue with the verification ", oracleAggregatorComputedAddr); - - return oracleAggregatorComputedAddr; - } - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; -} - -async function deployTokenPaymasterContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) - ); - - const BiconomyTokenPaymaster = await ethers.getContractFactory( - "BiconomyTokenPaymaster" - ); - const tokenPaymasterBytecode = `${ - BiconomyTokenPaymaster.bytecode - }${encodeParam("address", earlyOwnerAddress).slice(2)}${encodeParam( - "address", - entryPointAddress - ).slice(2)}${encodeParam("address", verifyingSigner).slice(2)}`; - - const tokenPaymasterComputedAddr = await deployerInstance.addressOf(salt); - console.log("Token paymaster Computed Address: ", tokenPaymasterComputedAddr); - const isContractDeployed = await isContract( - tokenPaymasterComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, - salt, - tokenPaymasterBytecode, - deployerInstance - ); - await delay(7000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); - } catch (err) { - console.log("issue with the verification ", tokenPaymasterComputedAddr); - - return tokenPaymasterComputedAddr; - } - } else { - console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr - ); - } - return tokenPaymasterComputedAddr; -} - -async function deployDerivedPriceFeed( - deployerInstance: Deployer, - nativeOracleAddress: string, - tokenOracleAddress: string, - description: string, - feedSalt: string -): Promise { - const salt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(feedSalt)); - - const DerivedPriceFeed = await ethers.getContractFactory("DerivedPriceFeed"); - - const derivedPriceFeedBytecode = `${ - DerivedPriceFeed.bytecode - }${ethers.utils.defaultAbiCoder - .encode( - ["address", "address", "string"], - [nativeOracleAddress, tokenOracleAddress, description] - ) - .slice(2)}`; - - const derivedPriceFeedBComputedAddr = await deployerInstance.addressOf(salt); - console.log( - "Derived Price Feed Computed Address: ", - derivedPriceFeedBComputedAddr - ); - const isContractDeployed = await isContract( - derivedPriceFeedBComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - feedSalt, - derivedPriceFeedBComputedAddr, - salt, - derivedPriceFeedBytecode, - deployerInstance - ); - await delay(7000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: derivedPriceFeedBComputedAddr, - constructorArguments: [ - nativeOracleAddress, - tokenOracleAddress, - description, - ], - }); - } catch (err) { - console.log( - "issue with the verification ", - derivedPriceFeedBComputedAddr - ); - - return derivedPriceFeedBComputedAddr; - } - } else { - console.log( - "Derived Price Feed is Already deployed with address ", - derivedPriceFeedBComputedAddr - ); - } - return derivedPriceFeedBComputedAddr; -} - -async function setTokenOracle( - oracleAggregatorInstance: ChainlinkOracleAggregator, - tokenAddress: string, - priceFeedAddress: string, - priceFeedDecimals: number, - priceFeedFunctionName: string -) { - const PriceFeedContract = await ethers.getContractAt( - "FeedInterface", - priceFeedAddress - ); - - // Find the function ABI based on the provided function name - // @ts-ignore - const functionAbi = - PriceFeedContract.interface.functions[ - priceFeedFunctionName as keyof typeof PriceFeedContract.functions - ]; - - // Generate the function data based on the function ABI - const functionData = - PriceFeedContract.interface.encodeFunctionData(functionAbi); - - const tx = await oracleAggregatorInstance.setTokenOracle( - tokenAddress, - priceFeedAddress, - priceFeedDecimals, - functionData, - true - ); - const receipt = await tx.wait(); - console.log( - `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` - ); -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstanceDEV(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_DEV); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_DEV - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_DEV, signer); - } -} - -async function getPredeployedDeployerContractInstancePROD(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_PROD); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_PROD - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_PROD, signer); - } -} - -async function getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress: string -): Promise { - const code = await provider.getCode(oracleAggregatorAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `ChainlinkOracleAggregator not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("ChainlinkOracleAggregator not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - oracleAggregatorAddress - ); - return ChainlinkOracleAggregator__factory.connect( - oracleAggregatorAddress, - signer - ); - } -} - -async function getTokenPaymasterContractInstance( - tokenPaymasterAddress: string -): Promise { - const code = await provider.getCode(tokenPaymasterAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("Biconomy Token Paymaster not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - tokenPaymasterAddress - ); - return BiconomyTokenPaymaster__factory.connect( - tokenPaymasterAddress, - signer - ); - } -} - -async function main() { - let tx, receipt; - const provider = ethers.provider; - - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - const deployerInstanceDEV = await getPredeployedDeployerContractInstanceDEV(); - console.log("========================================="); - - const deployerInstancePROD = - await getPredeployedDeployerContractInstancePROD(); - console.log("========================================="); - - // 1. Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); - await delay(7000); - - // 2. Deploy Token paymaster - const tokenPaymasterAddress = await deployTokenPaymasterContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================tokenPaymasterAddress=======================", - tokenPaymasterAddress - ); - await delay(7000); - - let oracleAggregatorInstance; - if (oracleAggregatorAddress) { - oracleAggregatorInstance = - await getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress - ); - console.log( - "==================oracleAggregatorInstance=======================" - ); - } - - // 3a. Deploy the derived price feeds for all chainlink supported ERC20 tokens - for (const token of tokenConfig.tokens) { - const { - symbol, - address, - nativeOracleAddress, - tokenOracleAddress, - priceFeedAddress, - description, - priceFeedFunction, - feedSalt, - derivedFeed, - } = token; - let derivedPriceFeedAddress = priceFeedAddress; - console.log( - `derived price feed address for token ${symbol} is ${derivedPriceFeedAddress}` - ); - - if (derivedPriceFeedAddress == "") { - derivedPriceFeedAddress = await deployDerivedPriceFeed( - deployerInstanceDEV, - nativeOracleAddress, - tokenOracleAddress, - description, - feedSalt - ); - console.log( - `==================${symbol} PriceFeedAddress=======================`, - derivedPriceFeedAddress - ); - await delay(7000); - } - - // Continue with other steps like setting token oracle, transferring ownership, etc. - // Use the derivedPriceFeedAddress and other token-specific information as needed - // ... - - // 4. Set token oracle on oracle aggregator - if (oracleAggregatorInstance) { - let feedAddress = derivedPriceFeedAddress; - if (priceFeedFunction == "latestAnswer()" || derivedFeed == false) { - feedAddress = priceFeedAddress; - } - // TODO - // This should not hardcode tokenOracleDeciamls to 18 - // It works in case of derived price feeds and chainlink feeds which are in the erc20 / native base and quote format. - await setTokenOracle( - oracleAggregatorInstance, - address, - feedAddress, - 18, - priceFeedFunction - ); - } - } - - if (tokenPaymasterAddress) { - // 5b. transfer ownership of token paymaster to the owner - const tokenPaymasterInstance = await getTokenPaymasterContractInstance( - tokenPaymasterAddress - ); - console.log( - "==================tokenPaymasterInstance=======================" - ); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deploy-avalanche-mainnet.ts b/scripts/deploy-avalanche-mainnet.ts deleted file mode 100644 index b3c5850..0000000 --- a/scripts/deploy-avalanche-mainnet.ts +++ /dev/null @@ -1,481 +0,0 @@ -import { ethers, run, network } from "hardhat"; -import { avalancheMainnetConfigInfoProd } from "./configs"; -import { Token, TokenConfig } from "./utils/Types"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - getDeployerInstance, - isContract, -} from "./utils"; -import { - BiconomyTokenPaymaster, - BiconomyTokenPaymaster__factory, - ChainlinkOracleAggregator, - ChainlinkOracleAggregator__factory, - Deployer, - Deployer__factory, -} from "../typechain-types"; - -const tokenConfig: TokenConfig = avalancheMainnetConfigInfoProd; - -const provider = ethers.provider; -const entryPointAddress = - process.env.ENTRY_POINT_ADDRESS || - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; -const owner = process.env.PAYMASTER_OWNER_ADDRESS_DEV || ""; -const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_DEV = - process.env.DEPLOYER_CONTRACT_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_PROD = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - if (!isOracleAggregatorDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(10000); - } catch (err) { - console.log("issue with the deployment"); - console.log(err); - return ethers.constants.AddressZero; - } - - try { - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } catch (err) { - console.log("issue with the verification ", oracleAggregatorComputedAddr); - - return oracleAggregatorComputedAddr; - } - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; -} - -async function deployTokenPaymasterContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) - ); - - const BiconomyTokenPaymaster = await ethers.getContractFactory( - "BiconomyTokenPaymaster" - ); - const tokenPaymasterBytecode = `${ - BiconomyTokenPaymaster.bytecode - }${encodeParam("address", earlyOwnerAddress).slice(2)}${encodeParam( - "address", - entryPointAddress - ).slice(2)}${encodeParam("address", verifyingSigner).slice(2)}`; - - const tokenPaymasterComputedAddr = await deployerInstance.addressOf(salt); - console.log("Token paymaster Computed Address: ", tokenPaymasterComputedAddr); - const isContractDeployed = await isContract( - tokenPaymasterComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, - salt, - tokenPaymasterBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); - } catch (err) { - console.log("issue with the verification ", tokenPaymasterComputedAddr); - - return tokenPaymasterComputedAddr; - } - } else { - console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr - ); - } - return tokenPaymasterComputedAddr; -} - -async function deployDerivedPriceFeed( - deployerInstance: Deployer, - nativeOracleAddress: string, - tokenOracleAddress: string, - description: string, - feedSalt: string -): Promise { - const salt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(feedSalt)); - - const DerivedPriceFeed = await ethers.getContractFactory("DerivedPriceFeed"); - - const derivedPriceFeedBytecode = `${ - DerivedPriceFeed.bytecode - }${ethers.utils.defaultAbiCoder - .encode( - ["address", "address", "string"], - [nativeOracleAddress, tokenOracleAddress, description] - ) - .slice(2)}`; - - const derivedPriceFeedBComputedAddr = await deployerInstance.addressOf(salt); - console.log( - "Derived Price Feed Computed Address: ", - derivedPriceFeedBComputedAddr - ); - const isContractDeployed = await isContract( - derivedPriceFeedBComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - feedSalt, - derivedPriceFeedBComputedAddr, - salt, - derivedPriceFeedBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: derivedPriceFeedBComputedAddr, - constructorArguments: [ - nativeOracleAddress, - tokenOracleAddress, - description, - ], - }); - } catch (err) { - console.log( - "issue with the verification ", - derivedPriceFeedBComputedAddr - ); - - return derivedPriceFeedBComputedAddr; - } - } else { - console.log( - "Derived Price Feed is Already deployed with address ", - derivedPriceFeedBComputedAddr - ); - } - return derivedPriceFeedBComputedAddr; -} - -async function setTokenOracle( - oracleAggregatorInstance: ChainlinkOracleAggregator, - tokenAddress: string, - priceFeedAddress: string, - priceFeedDecimals: number, - priceFeedFunctionName: string -) { - const PriceFeedContract = await ethers.getContractAt( - "FeedInterface", - priceFeedAddress - ); - - // Find the function ABI based on the provided function name - // @ts-ignore - const functionAbi = - PriceFeedContract.interface.functions[ - priceFeedFunctionName as keyof typeof PriceFeedContract.functions - ]; - - // Generate the function data based on the function ABI - const functionData = - PriceFeedContract.interface.encodeFunctionData(functionAbi); - - const tx = await oracleAggregatorInstance.setTokenOracle( - tokenAddress, - priceFeedAddress, - priceFeedDecimals, - functionData, - true - ); - const receipt = await tx.wait(); - console.log( - `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` - ); -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstanceDEV(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_DEV); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_DEV - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_DEV, signer); - } -} - -async function getPredeployedDeployerContractInstancePROD(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_PROD); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_PROD - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_PROD, signer); - } -} - -async function getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress: string -): Promise { - const code = await provider.getCode(oracleAggregatorAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `ChainlinkOracleAggregator not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("ChainlinkOracleAggregator not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - oracleAggregatorAddress - ); - return ChainlinkOracleAggregator__factory.connect( - oracleAggregatorAddress, - signer - ); - } -} - -async function getTokenPaymasterContractInstance( - tokenPaymasterAddress: string -): Promise { - const code = await provider.getCode(tokenPaymasterAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("Biconomy Token Paymaster not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - tokenPaymasterAddress - ); - return BiconomyTokenPaymaster__factory.connect( - tokenPaymasterAddress, - signer - ); - } -} - -async function main() { - let tx, receipt; - const provider = ethers.provider; - - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - const deployerInstanceDEV = await getPredeployedDeployerContractInstanceDEV(); - console.log("========================================="); - - const deployerInstancePROD = - await getPredeployedDeployerContractInstancePROD(); - console.log("========================================="); - - // 1. Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); - await delay(5000); - - // 2. Deploy Token paymaster - const tokenPaymasterAddress = await deployTokenPaymasterContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================tokenPaymasterAddress=======================", - tokenPaymasterAddress - ); - await delay(5000); - - let oracleAggregatorInstance; - if (oracleAggregatorAddress) { - oracleAggregatorInstance = - await getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress - ); - console.log( - "==================oracleAggregatorInstance=======================" - ); - } - - // 3a. Deploy the derived price feeds for all chainlink supported ERC20 tokens - for (const token of tokenConfig.tokens) { - const { - symbol, - address, - nativeOracleAddress, - tokenOracleAddress, - priceFeedAddress, - description, - priceFeedFunction, - feedSalt, - derivedFeed, - } = token; - let derivedPriceFeedAddress = priceFeedAddress; - - if (derivedPriceFeedAddress == "") { - derivedPriceFeedAddress = await deployDerivedPriceFeed( - deployerInstanceDEV, - nativeOracleAddress, - tokenOracleAddress, - description, - feedSalt - ); - console.log( - `==================${symbol} PriceFeedAddress=======================`, - derivedPriceFeedAddress - ); - await delay(5000); - } - - // Continue with other steps like setting token oracle, transferring ownership, etc. - // Use the derivedPriceFeedAddress and other token-specific information as needed - // ... - - // 4. Set token oracle on oracle aggregator - if (oracleAggregatorInstance) { - let feedAddress = derivedPriceFeedAddress; - if (priceFeedFunction == "latestAnswer()" || derivedFeed == false) { - feedAddress = priceFeedAddress; - } - // TODO - // This should not hardcode tokenOracleDeciamls to 18 - // It works in case of derived price feeds and chainlink feeds which are in the erc20 / native base and quote format. - await setTokenOracle( - oracleAggregatorInstance, - address, - feedAddress, - 18, - priceFeedFunction - ); - } - } - - if (tokenPaymasterAddress) { - // 5b. transfer ownership of token paymaster to the owner - const tokenPaymasterInstance = await getTokenPaymasterContractInstance( - tokenPaymasterAddress - ); - console.log( - "==================tokenPaymasterInstance=======================" - ); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deploy-avalanche-testnet.ts b/scripts/deploy-avalanche-testnet.ts deleted file mode 100644 index e75ae03..0000000 --- a/scripts/deploy-avalanche-testnet.ts +++ /dev/null @@ -1,481 +0,0 @@ -import { ethers, run, network } from "hardhat"; -import { avalancheFujiConfigInfoProd } from "./configs"; -import { Token, TokenConfig } from "./utils/Types"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - getDeployerInstance, - isContract, -} from "./utils"; -import { - BiconomyTokenPaymaster, - BiconomyTokenPaymaster__factory, - ChainlinkOracleAggregator, - ChainlinkOracleAggregator__factory, - Deployer, - Deployer__factory, -} from "../typechain-types"; - -const tokenConfig: TokenConfig = avalancheFujiConfigInfoProd; - -const provider = ethers.provider; -const entryPointAddress = - process.env.ENTRY_POINT_ADDRESS || - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; -const owner = process.env.PAYMASTER_OWNER_ADDRESS_DEV || ""; -const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_DEV = - process.env.DEPLOYER_CONTRACT_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_PROD = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - if (!isOracleAggregatorDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(10000); - } catch (err) { - console.log("issue with the deployment"); - console.log(err); - return ethers.constants.AddressZero; - } - - try { - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } catch (err) { - console.log("issue with the verification ", oracleAggregatorComputedAddr); - - return oracleAggregatorComputedAddr; - } - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; -} - -async function deployTokenPaymasterContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) - ); - - const BiconomyTokenPaymaster = await ethers.getContractFactory( - "BiconomyTokenPaymaster" - ); - const tokenPaymasterBytecode = `${ - BiconomyTokenPaymaster.bytecode - }${encodeParam("address", earlyOwnerAddress).slice(2)}${encodeParam( - "address", - entryPointAddress - ).slice(2)}${encodeParam("address", verifyingSigner).slice(2)}`; - - const tokenPaymasterComputedAddr = await deployerInstance.addressOf(salt); - console.log("Token paymaster Computed Address: ", tokenPaymasterComputedAddr); - const isContractDeployed = await isContract( - tokenPaymasterComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, - salt, - tokenPaymasterBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); - } catch (err) { - console.log("issue with the verification ", tokenPaymasterComputedAddr); - - return tokenPaymasterComputedAddr; - } - } else { - console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr - ); - } - return tokenPaymasterComputedAddr; -} - -async function deployDerivedPriceFeed( - deployerInstance: Deployer, - nativeOracleAddress: string, - tokenOracleAddress: string, - description: string, - feedSalt: string -): Promise { - const salt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(feedSalt)); - - const DerivedPriceFeed = await ethers.getContractFactory("DerivedPriceFeed"); - - const derivedPriceFeedBytecode = `${ - DerivedPriceFeed.bytecode - }${ethers.utils.defaultAbiCoder - .encode( - ["address", "address", "string"], - [nativeOracleAddress, tokenOracleAddress, description] - ) - .slice(2)}`; - - const derivedPriceFeedBComputedAddr = await deployerInstance.addressOf(salt); - console.log( - "Derived Price Feed Computed Address: ", - derivedPriceFeedBComputedAddr - ); - const isContractDeployed = await isContract( - derivedPriceFeedBComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - feedSalt, - derivedPriceFeedBComputedAddr, - salt, - derivedPriceFeedBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: derivedPriceFeedBComputedAddr, - constructorArguments: [ - nativeOracleAddress, - tokenOracleAddress, - description, - ], - }); - } catch (err) { - console.log( - "issue with the verification ", - derivedPriceFeedBComputedAddr - ); - - return derivedPriceFeedBComputedAddr; - } - } else { - console.log( - "Derived Price Feed is Already deployed with address ", - derivedPriceFeedBComputedAddr - ); - } - return derivedPriceFeedBComputedAddr; -} - -async function setTokenOracle( - oracleAggregatorInstance: ChainlinkOracleAggregator, - tokenAddress: string, - priceFeedAddress: string, - priceFeedDecimals: number, - priceFeedFunctionName: string -) { - const PriceFeedContract = await ethers.getContractAt( - "FeedInterface", - priceFeedAddress - ); - - // Find the function ABI based on the provided function name - // @ts-ignore - const functionAbi = - PriceFeedContract.interface.functions[ - priceFeedFunctionName as keyof typeof PriceFeedContract.functions - ]; - - // Generate the function data based on the function ABI - const functionData = - PriceFeedContract.interface.encodeFunctionData(functionAbi); - - const tx = await oracleAggregatorInstance.setTokenOracle( - tokenAddress, - priceFeedAddress, - priceFeedDecimals, - functionData, - true - ); - const receipt = await tx.wait(); - console.log( - `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` - ); -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstanceDEV(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_DEV); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_DEV - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_DEV, signer); - } -} - -async function getPredeployedDeployerContractInstancePROD(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_PROD); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_PROD - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_PROD, signer); - } -} - -async function getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress: string -): Promise { - const code = await provider.getCode(oracleAggregatorAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `ChainlinkOracleAggregator not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("ChainlinkOracleAggregator not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - oracleAggregatorAddress - ); - return ChainlinkOracleAggregator__factory.connect( - oracleAggregatorAddress, - signer - ); - } -} - -async function getTokenPaymasterContractInstance( - tokenPaymasterAddress: string -): Promise { - const code = await provider.getCode(tokenPaymasterAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("Biconomy Token Paymaster not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - tokenPaymasterAddress - ); - return BiconomyTokenPaymaster__factory.connect( - tokenPaymasterAddress, - signer - ); - } -} - -async function main() { - let tx, receipt; - const provider = ethers.provider; - - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - const deployerInstanceDEV = await getPredeployedDeployerContractInstanceDEV(); - console.log("========================================="); - - const deployerInstancePROD = - await getPredeployedDeployerContractInstancePROD(); - console.log("========================================="); - - // 1. Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); - await delay(5000); - - // 2. Deploy Token paymaster - const tokenPaymasterAddress = await deployTokenPaymasterContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================tokenPaymasterAddress=======================", - tokenPaymasterAddress - ); - await delay(5000); - - let oracleAggregatorInstance; - if (oracleAggregatorAddress) { - oracleAggregatorInstance = - await getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress - ); - console.log( - "==================oracleAggregatorInstance=======================" - ); - } - - // 3a. Deploy the derived price feeds for all chainlink supported ERC20 tokens - for (const token of tokenConfig.tokens) { - const { - symbol, - address, - nativeOracleAddress, - tokenOracleAddress, - priceFeedAddress, - description, - priceFeedFunction, - feedSalt, - derivedFeed, - } = token; - let derivedPriceFeedAddress = priceFeedAddress; - - if (derivedPriceFeedAddress == "") { - derivedPriceFeedAddress = await deployDerivedPriceFeed( - deployerInstanceDEV, - nativeOracleAddress, - tokenOracleAddress, - description, - feedSalt - ); - console.log( - `==================${symbol} PriceFeedAddress=======================`, - derivedPriceFeedAddress - ); - await delay(5000); - } - - // Continue with other steps like setting token oracle, transferring ownership, etc. - // Use the derivedPriceFeedAddress and other token-specific information as needed - // ... - - // 4. Set token oracle on oracle aggregator - if (oracleAggregatorInstance) { - let feedAddress = derivedPriceFeedAddress; - if (priceFeedFunction == "latestAnswer()" || derivedFeed == false) { - feedAddress = priceFeedAddress; - } - // TODO - // This should not hardcode tokenOracleDeciamls to 18 - // It works in case of derived price feeds and chainlink feeds which are in the erc20 / native base and quote format. - await setTokenOracle( - oracleAggregatorInstance, - address, - feedAddress, - 18, - priceFeedFunction - ); - } - } - - if (tokenPaymasterAddress) { - // 5b. transfer ownership of token paymaster to the owner - const tokenPaymasterInstance = await getTokenPaymasterContractInstance( - tokenPaymasterAddress - ); - console.log( - "==================tokenPaymasterInstance=======================" - ); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deploy-base-goerli.ts b/scripts/deploy-base-goerli.ts deleted file mode 100644 index b789057..0000000 --- a/scripts/deploy-base-goerli.ts +++ /dev/null @@ -1,481 +0,0 @@ -import { ethers, run, network } from "hardhat"; -import { baseGoerliConfigInfoProd } from "./configs"; -import { Token, TokenConfig } from "./utils/Types"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - getDeployerInstance, - isContract, -} from "./utils"; -import { - BiconomyTokenPaymaster, - BiconomyTokenPaymaster__factory, - ChainlinkOracleAggregator, - ChainlinkOracleAggregator__factory, - Deployer, - Deployer__factory, -} from "../typechain-types"; - -const tokenConfig: TokenConfig = baseGoerliConfigInfoProd; - -const provider = ethers.provider; -const entryPointAddress = - process.env.ENTRY_POINT_ADDRESS || - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; -const owner = process.env.PAYMASTER_OWNER_ADDRESS_DEV || ""; -const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_DEV = - process.env.DEPLOYER_CONTRACT_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_PROD = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - if (!isOracleAggregatorDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(10000); - } catch (err) { - console.log("issue with the deployment"); - console.log(err); - return ethers.constants.AddressZero; - } - - try { - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } catch (err) { - console.log("issue with the verification ", oracleAggregatorComputedAddr); - - return oracleAggregatorComputedAddr; - } - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; -} - -async function deployTokenPaymasterContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) - ); - - const BiconomyTokenPaymaster = await ethers.getContractFactory( - "BiconomyTokenPaymaster" - ); - const tokenPaymasterBytecode = `${ - BiconomyTokenPaymaster.bytecode - }${encodeParam("address", earlyOwnerAddress).slice(2)}${encodeParam( - "address", - entryPointAddress - ).slice(2)}${encodeParam("address", verifyingSigner).slice(2)}`; - - const tokenPaymasterComputedAddr = await deployerInstance.addressOf(salt); - console.log("Token paymaster Computed Address: ", tokenPaymasterComputedAddr); - const isContractDeployed = await isContract( - tokenPaymasterComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, - salt, - tokenPaymasterBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); - } catch (err) { - console.log("issue with the verification ", tokenPaymasterComputedAddr); - - return tokenPaymasterComputedAddr; - } - } else { - console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr - ); - } - return tokenPaymasterComputedAddr; -} - -async function deployDerivedPriceFeed( - deployerInstance: Deployer, - nativeOracleAddress: string, - tokenOracleAddress: string, - description: string, - feedSalt: string -): Promise { - const salt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(feedSalt)); - - const DerivedPriceFeed = await ethers.getContractFactory("DerivedPriceFeed"); - - const derivedPriceFeedBytecode = `${ - DerivedPriceFeed.bytecode - }${ethers.utils.defaultAbiCoder - .encode( - ["address", "address", "string"], - [nativeOracleAddress, tokenOracleAddress, description] - ) - .slice(2)}`; - - const derivedPriceFeedBComputedAddr = await deployerInstance.addressOf(salt); - console.log( - "Derived Price Feed Computed Address: ", - derivedPriceFeedBComputedAddr - ); - const isContractDeployed = await isContract( - derivedPriceFeedBComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - feedSalt, - derivedPriceFeedBComputedAddr, - salt, - derivedPriceFeedBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: derivedPriceFeedBComputedAddr, - constructorArguments: [ - nativeOracleAddress, - tokenOracleAddress, - description, - ], - }); - } catch (err) { - console.log( - "issue with the verification ", - derivedPriceFeedBComputedAddr - ); - - return derivedPriceFeedBComputedAddr; - } - } else { - console.log( - "Derived Price Feed is Already deployed with address ", - derivedPriceFeedBComputedAddr - ); - } - return derivedPriceFeedBComputedAddr; -} - -async function setTokenOracle( - oracleAggregatorInstance: ChainlinkOracleAggregator, - tokenAddress: string, - priceFeedAddress: string, - priceFeedDecimals: number, - priceFeedFunctionName: string -) { - const PriceFeedContract = await ethers.getContractAt( - "FeedInterface", - priceFeedAddress - ); - - // Find the function ABI based on the provided function name - // @ts-ignore - const functionAbi = - PriceFeedContract.interface.functions[ - priceFeedFunctionName as keyof typeof PriceFeedContract.functions - ]; - - // Generate the function data based on the function ABI - const functionData = - PriceFeedContract.interface.encodeFunctionData(functionAbi); - - const tx = await oracleAggregatorInstance.setTokenOracle( - tokenAddress, - priceFeedAddress, - priceFeedDecimals, - functionData, - true - ); - const receipt = await tx.wait(); - console.log( - `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` - ); -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstanceDEV(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_DEV); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_DEV - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_DEV, signer); - } -} - -async function getPredeployedDeployerContractInstancePROD(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_PROD); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_PROD - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_PROD, signer); - } -} - -async function getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress: string -): Promise { - const code = await provider.getCode(oracleAggregatorAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `ChainlinkOracleAggregator not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("ChainlinkOracleAggregator not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - oracleAggregatorAddress - ); - return ChainlinkOracleAggregator__factory.connect( - oracleAggregatorAddress, - signer - ); - } -} - -async function getTokenPaymasterContractInstance( - tokenPaymasterAddress: string -): Promise { - const code = await provider.getCode(tokenPaymasterAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("Biconomy Token Paymaster not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - tokenPaymasterAddress - ); - return BiconomyTokenPaymaster__factory.connect( - tokenPaymasterAddress, - signer - ); - } -} - -async function main() { - let tx, receipt; - const provider = ethers.provider; - - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - const deployerInstanceDEV = await getPredeployedDeployerContractInstanceDEV(); - console.log("========================================="); - - const deployerInstancePROD = - await getPredeployedDeployerContractInstancePROD(); - console.log("========================================="); - - // 1. Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); - await delay(5000); - - // 2. Deploy Token paymaster - const tokenPaymasterAddress = await deployTokenPaymasterContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================tokenPaymasterAddress=======================", - tokenPaymasterAddress - ); - await delay(5000); - - let oracleAggregatorInstance; - if (oracleAggregatorAddress) { - oracleAggregatorInstance = - await getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress - ); - console.log( - "==================oracleAggregatorInstance=======================" - ); - } - - // 3a. Deploy the derived price feeds for all chainlink supported ERC20 tokens - for (const token of tokenConfig.tokens) { - const { - symbol, - address, - nativeOracleAddress, - tokenOracleAddress, - priceFeedAddress, - description, - priceFeedFunction, - feedSalt, - derivedFeed, - } = token; - let derivedPriceFeedAddress = priceFeedAddress; - - if (derivedPriceFeedAddress == "") { - derivedPriceFeedAddress = await deployDerivedPriceFeed( - deployerInstanceDEV, - nativeOracleAddress, - tokenOracleAddress, - description, - feedSalt - ); - console.log( - `==================${symbol} PriceFeedAddress=======================`, - derivedPriceFeedAddress - ); - await delay(5000); - } - - // Continue with other steps like setting token oracle, transferring ownership, etc. - // Use the derivedPriceFeedAddress and other token-specific information as needed - // ... - - // 4. Set token oracle on oracle aggregator - if (oracleAggregatorInstance) { - let feedAddress = derivedPriceFeedAddress; - if (priceFeedFunction == "latestAnswer()" || derivedFeed == false) { - feedAddress = priceFeedAddress; - } - // TODO - // This should not hardcode tokenOracleDeciamls to 18 - // It works in case of derived price feeds and chainlink feeds which are in the erc20 / native base and quote format. - await setTokenOracle( - oracleAggregatorInstance, - address, - feedAddress, - 18, - priceFeedFunction - ); - } - } - - if (tokenPaymasterAddress) { - // 5b. transfer ownership of token paymaster to the owner - const tokenPaymasterInstance = await getTokenPaymasterContractInstance( - tokenPaymasterAddress - ); - console.log( - "==================tokenPaymasterInstance=======================" - ); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deploy-bnb-mainnet.ts b/scripts/deploy-bnb-mainnet.ts deleted file mode 100644 index 97b255c..0000000 --- a/scripts/deploy-bnb-mainnet.ts +++ /dev/null @@ -1,484 +0,0 @@ -import { ethers, run, network } from "hardhat"; -import { bnbMainnetConfigInfoProd } from "./configs"; -import { Token, TokenConfig } from "./utils/Types"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - getDeployerInstance, - isContract, -} from "./utils"; -import { - BiconomyTokenPaymaster, - BiconomyTokenPaymaster__factory, - ChainlinkOracleAggregator, - ChainlinkOracleAggregator__factory, - Deployer, - Deployer__factory, -} from "../typechain-types"; - -const tokenConfig: TokenConfig = bnbMainnetConfigInfoProd; - -const provider = ethers.provider; -const entryPointAddress = - process.env.ENTRY_POINT_ADDRESS || - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; -const owner = process.env.PAYMASTER_OWNER_ADDRESS_DEV || ""; -const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_DEV = - process.env.DEPLOYER_CONTRACT_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_PROD = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - if (!isOracleAggregatorDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log("issue with the deployment"); - console.log(err); - return ethers.constants.AddressZero; - } - - try { - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } catch (err) { - console.log("issue with the verification ", oracleAggregatorComputedAddr); - - return oracleAggregatorComputedAddr; - } - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; -} - -async function deployTokenPaymasterContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) - ); - - const BiconomyTokenPaymaster = await ethers.getContractFactory( - "BiconomyTokenPaymaster" - ); - const tokenPaymasterBytecode = `${ - BiconomyTokenPaymaster.bytecode - }${encodeParam("address", earlyOwnerAddress).slice(2)}${encodeParam( - "address", - entryPointAddress - ).slice(2)}${encodeParam("address", verifyingSigner).slice(2)}`; - - const tokenPaymasterComputedAddr = await deployerInstance.addressOf(salt); - console.log("Token paymaster Computed Address: ", tokenPaymasterComputedAddr); - const isContractDeployed = await isContract( - tokenPaymasterComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, - salt, - tokenPaymasterBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); - } catch (err) { - console.log("issue with the verification ", tokenPaymasterComputedAddr); - - return tokenPaymasterComputedAddr; - } - } else { - console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr - ); - } - return tokenPaymasterComputedAddr; -} - -async function deployDerivedPriceFeed( - deployerInstance: Deployer, - nativeOracleAddress: string, - tokenOracleAddress: string, - description: string, - feedSalt: string -): Promise { - const salt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(feedSalt)); - - const DerivedPriceFeed = await ethers.getContractFactory("DerivedPriceFeed"); - - const derivedPriceFeedBytecode = `${ - DerivedPriceFeed.bytecode - }${ethers.utils.defaultAbiCoder - .encode( - ["address", "address", "string"], - [nativeOracleAddress, tokenOracleAddress, description] - ) - .slice(2)}`; - - const derivedPriceFeedBComputedAddr = await deployerInstance.addressOf(salt); - console.log( - "Derived Price Feed Computed Address: ", - derivedPriceFeedBComputedAddr - ); - const isContractDeployed = await isContract( - derivedPriceFeedBComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - feedSalt, - derivedPriceFeedBComputedAddr, - salt, - derivedPriceFeedBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: derivedPriceFeedBComputedAddr, - constructorArguments: [ - nativeOracleAddress, - tokenOracleAddress, - description, - ], - }); - } catch (err) { - console.log( - "issue with the verification ", - derivedPriceFeedBComputedAddr - ); - - return derivedPriceFeedBComputedAddr; - } - } else { - console.log( - "Derived Price Feed is Already deployed with address ", - derivedPriceFeedBComputedAddr - ); - } - return derivedPriceFeedBComputedAddr; -} - -async function setTokenOracle( - oracleAggregatorInstance: ChainlinkOracleAggregator, - tokenAddress: string, - priceFeedAddress: string, - priceFeedDecimals: number, - priceFeedFunctionName: string -) { - const PriceFeedContract = await ethers.getContractAt( - "FeedInterface", - priceFeedAddress - ); - - // Find the function ABI based on the provided function name - // @ts-ignore - const functionAbi = - PriceFeedContract.interface.functions[ - priceFeedFunctionName as keyof typeof PriceFeedContract.functions - ]; - - // Generate the function data based on the function ABI - const functionData = - PriceFeedContract.interface.encodeFunctionData(functionAbi); - - const tx = await oracleAggregatorInstance.setTokenOracle( - tokenAddress, - priceFeedAddress, - priceFeedDecimals, - functionData, - true - ); - const receipt = await tx.wait(); - console.log( - `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` - ); -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstanceDEV(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_DEV); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_DEV - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_DEV, signer); - } -} - -async function getPredeployedDeployerContractInstancePROD(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_PROD); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_PROD - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_PROD, signer); - } -} - -async function getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress: string -): Promise { - const code = await provider.getCode(oracleAggregatorAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `ChainlinkOracleAggregator not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("ChainlinkOracleAggregator not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - oracleAggregatorAddress - ); - return ChainlinkOracleAggregator__factory.connect( - oracleAggregatorAddress, - signer - ); - } -} - -async function getTokenPaymasterContractInstance( - tokenPaymasterAddress: string -): Promise { - const code = await provider.getCode(tokenPaymasterAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("Biconomy Token Paymaster not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - tokenPaymasterAddress - ); - return BiconomyTokenPaymaster__factory.connect( - tokenPaymasterAddress, - signer - ); - } -} - -async function main() { - let tx, receipt; - const provider = ethers.provider; - - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - const deployerInstanceDEV = await getPredeployedDeployerContractInstanceDEV(); - console.log("========================================="); - - const deployerInstancePROD = - await getPredeployedDeployerContractInstancePROD(); - console.log("========================================="); - - // 1. Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); - await delay(5000); - - // 2. Deploy Token paymaster - const tokenPaymasterAddress = await deployTokenPaymasterContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================tokenPaymasterAddress=======================", - tokenPaymasterAddress - ); - await delay(5000); - - let oracleAggregatorInstance; - if (oracleAggregatorAddress) { - oracleAggregatorInstance = - await getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress - ); - console.log( - "==================oracleAggregatorInstance=======================" - ); - } - - // 3a. Deploy the derived price feeds for all chainlink supported ERC20 tokens - for (const token of tokenConfig.tokens) { - const { - symbol, - address, - nativeOracleAddress, - tokenOracleAddress, - priceFeedAddress, - description, - priceFeedFunction, - feedSalt, - derivedFeed, - } = token; - let derivedPriceFeedAddress = priceFeedAddress; - console.log( - `derived price feed address for token ${symbol} is ${derivedPriceFeedAddress}` - ); - - if (derivedPriceFeedAddress == "") { - derivedPriceFeedAddress = await deployDerivedPriceFeed( - deployerInstanceDEV, - nativeOracleAddress, - tokenOracleAddress, - description, - feedSalt - ); - console.log( - `==================${symbol} PriceFeedAddress=======================`, - derivedPriceFeedAddress - ); - await delay(5000); - } - - // Continue with other steps like setting token oracle, transferring ownership, etc. - // Use the derivedPriceFeedAddress and other token-specific information as needed - // ... - - // 4. Set token oracle on oracle aggregator - if (oracleAggregatorInstance) { - let feedAddress = derivedPriceFeedAddress; - if (priceFeedFunction == "latestAnswer()" || derivedFeed == false) { - feedAddress = priceFeedAddress; - } - // TODO - // This should not hardcode tokenOracleDeciamls to 18 - // It works in case of derived price feeds and chainlink feeds which are in the erc20 / native base and quote format. - await setTokenOracle( - oracleAggregatorInstance, - address, - feedAddress, - 18, - priceFeedFunction - ); - } - } - - if (tokenPaymasterAddress) { - // 5b. transfer ownership of token paymaster to the owner - const tokenPaymasterInstance = await getTokenPaymasterContractInstance( - tokenPaymasterAddress - ); - console.log( - "==================tokenPaymasterInstance=======================" - ); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deploy-bnb-testnet.ts b/scripts/deploy-bnb-testnet.ts deleted file mode 100644 index 86d1b8d..0000000 --- a/scripts/deploy-bnb-testnet.ts +++ /dev/null @@ -1,481 +0,0 @@ -import { ethers, run, network } from "hardhat"; -import { bnbTestnetConfigInfoProd } from "./configs"; -import { Token, TokenConfig } from "./utils/Types"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - getDeployerInstance, - isContract, -} from "./utils"; -import { - BiconomyTokenPaymaster, - BiconomyTokenPaymaster__factory, - ChainlinkOracleAggregator, - ChainlinkOracleAggregator__factory, - Deployer, - Deployer__factory, -} from "../typechain-types"; - -const tokenConfig: TokenConfig = bnbTestnetConfigInfoProd; - -const provider = ethers.provider; -const entryPointAddress = - process.env.ENTRY_POINT_ADDRESS || - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; -const owner = process.env.PAYMASTER_OWNER_ADDRESS_DEV || ""; -const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_DEV = - process.env.DEPLOYER_CONTRACT_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_PROD = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - if (!isOracleAggregatorDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(10000); - } catch (err) { - console.log("issue with the deployment"); - console.log(err); - return ethers.constants.AddressZero; - } - - try { - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } catch (err) { - console.log("issue with the verification ", oracleAggregatorComputedAddr); - - return oracleAggregatorComputedAddr; - } - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; -} - -async function deployTokenPaymasterContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) - ); - - const BiconomyTokenPaymaster = await ethers.getContractFactory( - "BiconomyTokenPaymaster" - ); - const tokenPaymasterBytecode = `${ - BiconomyTokenPaymaster.bytecode - }${encodeParam("address", earlyOwnerAddress).slice(2)}${encodeParam( - "address", - entryPointAddress - ).slice(2)}${encodeParam("address", verifyingSigner).slice(2)}`; - - const tokenPaymasterComputedAddr = await deployerInstance.addressOf(salt); - console.log("Token paymaster Computed Address: ", tokenPaymasterComputedAddr); - const isContractDeployed = await isContract( - tokenPaymasterComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, - salt, - tokenPaymasterBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); - } catch (err) { - console.log("issue with the verification ", tokenPaymasterComputedAddr); - - return tokenPaymasterComputedAddr; - } - } else { - console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr - ); - } - return tokenPaymasterComputedAddr; -} - -async function deployDerivedPriceFeed( - deployerInstance: Deployer, - nativeOracleAddress: string, - tokenOracleAddress: string, - description: string, - feedSalt: string -): Promise { - const salt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(feedSalt)); - - const DerivedPriceFeed = await ethers.getContractFactory("DerivedPriceFeed"); - - const derivedPriceFeedBytecode = `${ - DerivedPriceFeed.bytecode - }${ethers.utils.defaultAbiCoder - .encode( - ["address", "address", "string"], - [nativeOracleAddress, tokenOracleAddress, description] - ) - .slice(2)}`; - - const derivedPriceFeedBComputedAddr = await deployerInstance.addressOf(salt); - console.log( - "Derived Price Feed Computed Address: ", - derivedPriceFeedBComputedAddr - ); - const isContractDeployed = await isContract( - derivedPriceFeedBComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - feedSalt, - derivedPriceFeedBComputedAddr, - salt, - derivedPriceFeedBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: derivedPriceFeedBComputedAddr, - constructorArguments: [ - nativeOracleAddress, - tokenOracleAddress, - description, - ], - }); - } catch (err) { - console.log( - "issue with the verification ", - derivedPriceFeedBComputedAddr - ); - - return derivedPriceFeedBComputedAddr; - } - } else { - console.log( - "Derived Price Feed is Already deployed with address ", - derivedPriceFeedBComputedAddr - ); - } - return derivedPriceFeedBComputedAddr; -} - -async function setTokenOracle( - oracleAggregatorInstance: ChainlinkOracleAggregator, - tokenAddress: string, - priceFeedAddress: string, - priceFeedDecimals: number, - priceFeedFunctionName: string -) { - const PriceFeedContract = await ethers.getContractAt( - "FeedInterface", - priceFeedAddress - ); - - // Find the function ABI based on the provided function name - // @ts-ignore - const functionAbi = - PriceFeedContract.interface.functions[ - priceFeedFunctionName as keyof typeof PriceFeedContract.functions - ]; - - // Generate the function data based on the function ABI - const functionData = - PriceFeedContract.interface.encodeFunctionData(functionAbi); - - const tx = await oracleAggregatorInstance.setTokenOracle( - tokenAddress, - priceFeedAddress, - priceFeedDecimals, - functionData, - true - ); - const receipt = await tx.wait(); - console.log( - `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` - ); -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstanceDEV(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_DEV); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_DEV - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_DEV, signer); - } -} - -async function getPredeployedDeployerContractInstancePROD(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_PROD); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_PROD - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_PROD, signer); - } -} - -async function getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress: string -): Promise { - const code = await provider.getCode(oracleAggregatorAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `ChainlinkOracleAggregator not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("ChainlinkOracleAggregator not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - oracleAggregatorAddress - ); - return ChainlinkOracleAggregator__factory.connect( - oracleAggregatorAddress, - signer - ); - } -} - -async function getTokenPaymasterContractInstance( - tokenPaymasterAddress: string -): Promise { - const code = await provider.getCode(tokenPaymasterAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("Biconomy Token Paymaster not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - tokenPaymasterAddress - ); - return BiconomyTokenPaymaster__factory.connect( - tokenPaymasterAddress, - signer - ); - } -} - -async function main() { - let tx, receipt; - const provider = ethers.provider; - - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - const deployerInstanceDEV = await getPredeployedDeployerContractInstanceDEV(); - console.log("========================================="); - - const deployerInstancePROD = - await getPredeployedDeployerContractInstancePROD(); - console.log("========================================="); - - // 1. Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); - await delay(5000); - - // 2. Deploy Token paymaster - const tokenPaymasterAddress = await deployTokenPaymasterContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================tokenPaymasterAddress=======================", - tokenPaymasterAddress - ); - await delay(5000); - - let oracleAggregatorInstance; - if (oracleAggregatorAddress) { - oracleAggregatorInstance = - await getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress - ); - console.log( - "==================oracleAggregatorInstance=======================" - ); - } - - // 3a. Deploy the derived price feeds for all chainlink supported ERC20 tokens - for (const token of tokenConfig.tokens) { - const { - symbol, - address, - nativeOracleAddress, - tokenOracleAddress, - priceFeedAddress, - description, - priceFeedFunction, - feedSalt, - derivedFeed, - } = token; - let derivedPriceFeedAddress = priceFeedAddress; - - if (derivedPriceFeedAddress == "") { - derivedPriceFeedAddress = await deployDerivedPriceFeed( - deployerInstanceDEV, - nativeOracleAddress, - tokenOracleAddress, - description, - feedSalt - ); - console.log( - `==================${symbol} PriceFeedAddress=======================`, - derivedPriceFeedAddress - ); - await delay(5000); - } - - // Continue with other steps like setting token oracle, transferring ownership, etc. - // Use the derivedPriceFeedAddress and other token-specific information as needed - // ... - - // 4. Set token oracle on oracle aggregator - if (oracleAggregatorInstance) { - let feedAddress = derivedPriceFeedAddress; - if (priceFeedFunction == "latestAnswer()" || derivedFeed == false) { - feedAddress = priceFeedAddress; - } - // TODO - // This should not hardcode tokenOracleDeciamls to 18 - // It works in case of derived price feeds and chainlink feeds which are in the erc20 / native base and quote format. - await setTokenOracle( - oracleAggregatorInstance, - address, - feedAddress, - 18, - priceFeedFunction - ); - } - } - - if (tokenPaymasterAddress) { - // 5b. transfer ownership of token paymaster to the owner - const tokenPaymasterInstance = await getTokenPaymasterContractInstance( - tokenPaymasterAddress - ); - console.log( - "==================tokenPaymasterInstance=======================" - ); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deploy-eth-mainnet.ts b/scripts/deploy-eth-mainnet.ts deleted file mode 100644 index f88c948..0000000 --- a/scripts/deploy-eth-mainnet.ts +++ /dev/null @@ -1,478 +0,0 @@ -import { ethers, run, network } from "hardhat"; -import { ethMainnetConfigInfoProd } from "./configs"; -import { Token, TokenConfig } from "./utils/Types"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - getDeployerInstance, - isContract, -} from "./utils"; -import { - BiconomyTokenPaymaster, - BiconomyTokenPaymaster__factory, - ChainlinkOracleAggregator, - ChainlinkOracleAggregator__factory, - Deployer, - Deployer__factory, -} from "../typechain-types"; - -const tokenConfig: TokenConfig = ethMainnetConfigInfoProd; - -const provider = ethers.provider; -const entryPointAddress = - process.env.ENTRY_POINT_ADDRESS || - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; -const owner = process.env.PAYMASTER_OWNER_ADDRESS_DEV || ""; -const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_DEV = - process.env.DEPLOYER_CONTRACT_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_PROD = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - if (!isOracleAggregatorDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(10000); - } catch (err) { - console.log("issue with the deployment"); - console.log(err); - return ethers.constants.AddressZero; - } - - try { - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } catch (err) { - console.log("issue with the verification ", oracleAggregatorComputedAddr); - - return oracleAggregatorComputedAddr; - } - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; -} - -async function deployTokenPaymasterContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) - ); - - const BiconomyTokenPaymaster = await ethers.getContractFactory( - "BiconomyTokenPaymaster" - ); - const tokenPaymasterBytecode = `${ - BiconomyTokenPaymaster.bytecode - }${encodeParam("address", earlyOwnerAddress).slice(2)}${encodeParam( - "address", - entryPointAddress - ).slice(2)}${encodeParam("address", verifyingSigner).slice(2)}`; - - const tokenPaymasterComputedAddr = await deployerInstance.addressOf(salt); - console.log("Token paymaster Computed Address: ", tokenPaymasterComputedAddr); - const isContractDeployed = await isContract( - tokenPaymasterComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, - salt, - tokenPaymasterBytecode, - deployerInstance - ); - await delay(7000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); - } catch (err) { - console.log("issue with the verification ", tokenPaymasterComputedAddr); - - return tokenPaymasterComputedAddr; - } - } else { - console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr - ); - } - return tokenPaymasterComputedAddr; -} - -async function deployDerivedPriceFeed( - deployerInstance: Deployer, - nativeOracleAddress: string, - tokenOracleAddress: string, - description: string, - feedSalt: string -): Promise { - const salt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(feedSalt)); - - const DerivedPriceFeed = await ethers.getContractFactory("DerivedPriceFeed"); - - const derivedPriceFeedBytecode = `${ - DerivedPriceFeed.bytecode - }${ethers.utils.defaultAbiCoder - .encode( - ["address", "address", "string"], - [nativeOracleAddress, tokenOracleAddress, description] - ) - .slice(2)}`; - - const derivedPriceFeedBComputedAddr = await deployerInstance.addressOf(salt); - console.log( - "Derived Price Feed Computed Address: ", - derivedPriceFeedBComputedAddr - ); - const isContractDeployed = await isContract( - derivedPriceFeedBComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - feedSalt, - derivedPriceFeedBComputedAddr, - salt, - derivedPriceFeedBytecode, - deployerInstance - ); - await delay(7000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: derivedPriceFeedBComputedAddr, - constructorArguments: [ - nativeOracleAddress, - tokenOracleAddress, - description, - ], - }); - } catch (err) { - console.log( - "issue with the verification ", - derivedPriceFeedBComputedAddr - ); - - return derivedPriceFeedBComputedAddr; - } - } else { - console.log( - "Derived Price Feed is Already deployed with address ", - derivedPriceFeedBComputedAddr - ); - } - return derivedPriceFeedBComputedAddr; -} - -async function setTokenOracle( - oracleAggregatorInstance: ChainlinkOracleAggregator, - tokenAddress: string, - priceFeedAddress: string, - priceFeedDecimals: number, - priceFeedFunctionName: string -) { - const PriceFeedContract = await ethers.getContractAt( - "FeedInterface", - priceFeedAddress - ); - - // Find the function ABI based on the provided function name - // @ts-ignore - const functionAbi = - PriceFeedContract.interface.functions[ - priceFeedFunctionName as keyof typeof PriceFeedContract.functions - ]; - - // Generate the function data based on the function ABI - const functionData = - PriceFeedContract.interface.encodeFunctionData(functionAbi); - - const tx = await oracleAggregatorInstance.setTokenOracle( - tokenAddress, - priceFeedAddress, - priceFeedDecimals, - functionData, - true - ); - const receipt = await tx.wait(); - console.log( - `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` - ); -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstanceDEV(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_DEV); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_DEV - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_DEV, signer); - } -} - -async function getPredeployedDeployerContractInstancePROD(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_PROD); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_PROD - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_PROD, signer); - } -} - -async function getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress: string -): Promise { - const code = await provider.getCode(oracleAggregatorAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `ChainlinkOracleAggregator not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("ChainlinkOracleAggregator not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - oracleAggregatorAddress - ); - return ChainlinkOracleAggregator__factory.connect( - oracleAggregatorAddress, - signer - ); - } -} - -async function getTokenPaymasterContractInstance( - tokenPaymasterAddress: string -): Promise { - const code = await provider.getCode(tokenPaymasterAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("Biconomy Token Paymaster not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - tokenPaymasterAddress - ); - return BiconomyTokenPaymaster__factory.connect( - tokenPaymasterAddress, - signer - ); - } -} - -async function main() { - let tx, receipt; - const provider = ethers.provider; - - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - // const deployerInstanceDEV = await getPredeployedDeployerContractInstanceDEV(); - // console.log("========================================="); - - const deployerInstancePROD = - await getPredeployedDeployerContractInstancePROD(); - console.log("========================================="); - - // 1. Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); - await delay(7000); - - // 2. Deploy Token paymaster - const tokenPaymasterAddress = await deployTokenPaymasterContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================tokenPaymasterAddress=======================", - tokenPaymasterAddress - ); - await delay(7000); - - let oracleAggregatorInstance; - if (oracleAggregatorAddress) { - oracleAggregatorInstance = - await getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress - ); - console.log( - "==================oracleAggregatorInstance=======================" - ); - } - - // 3a. Deploy the derived price feeds for all chainlink supported ERC20 tokens - for (const token of tokenConfig.tokens) { - const { - symbol, - address, - nativeOracleAddress, - tokenOracleAddress, - priceFeedAddress, - description, - priceFeedFunction, - feedSalt, - derivedFeed, - } = token; - const derivedPriceFeedAddress = priceFeedAddress; - console.log( - `derived price feed address for token ${symbol} is ${derivedPriceFeedAddress}` - ); - - if (derivedPriceFeedAddress == "") { - // derivedPriceFeedAddress = await deployDerivedPriceFeed(deployerInstanceDEV, nativeOracleAddress, tokenOracleAddress, description, feedSalt); - console.log( - `==================${symbol} PriceFeedAddress=======================`, - derivedPriceFeedAddress - ); - // await delay(7000); - } - - // Continue with other steps like setting token oracle, transferring ownership, etc. - // Use the derivedPriceFeedAddress and other token-specific information as needed - // ... - - // 4. Set token oracle on oracle aggregator - if (oracleAggregatorInstance) { - let feedAddress = derivedPriceFeedAddress; - if (priceFeedFunction == "latestAnswer()" || derivedFeed == false) { - feedAddress = priceFeedAddress; - } - // TODO - // This should not hardcode tokenOracleDeciamls to 18 - // It works in case of derived price feeds and chainlink feeds which are in the erc20 / native base and quote format. - await setTokenOracle( - oracleAggregatorInstance, - address, - feedAddress, - 18, - priceFeedFunction - ); - } - } - - if (tokenPaymasterAddress) { - // 5b. transfer ownership of token paymaster to the owner - const tokenPaymasterInstance = await getTokenPaymasterContractInstance( - tokenPaymasterAddress - ); - console.log( - "==================tokenPaymasterInstance=======================" - ); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deploy-goerli.ts b/scripts/deploy-goerli.ts deleted file mode 100644 index 4663fb8..0000000 --- a/scripts/deploy-goerli.ts +++ /dev/null @@ -1,481 +0,0 @@ -import { ethers, run, network } from "hardhat"; -import { goerliConfigInfoProd } from "./configs"; -import { Token, TokenConfig } from "./utils/Types"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - getDeployerInstance, - isContract, -} from "./utils"; -import { - BiconomyTokenPaymaster, - BiconomyTokenPaymaster__factory, - ChainlinkOracleAggregator, - ChainlinkOracleAggregator__factory, - Deployer, - Deployer__factory, -} from "../typechain-types"; - -const tokenConfig: TokenConfig = goerliConfigInfoProd; - -const provider = ethers.provider; -const entryPointAddress = - process.env.ENTRY_POINT_ADDRESS || - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; -const owner = process.env.PAYMASTER_OWNER_ADDRESS_DEV || ""; -const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_DEV = - process.env.DEPLOYER_CONTRACT_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_PROD = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - if (!isOracleAggregatorDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(10000); - } catch (err) { - console.log("issue with the deployment"); - console.log(err); - return ethers.constants.AddressZero; - } - - try { - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } catch (err) { - console.log("issue with the verification ", oracleAggregatorComputedAddr); - - return oracleAggregatorComputedAddr; - } - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; -} - -async function deployTokenPaymasterContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) - ); - - const BiconomyTokenPaymaster = await ethers.getContractFactory( - "BiconomyTokenPaymaster" - ); - const tokenPaymasterBytecode = `${ - BiconomyTokenPaymaster.bytecode - }${encodeParam("address", earlyOwnerAddress).slice(2)}${encodeParam( - "address", - entryPointAddress - ).slice(2)}${encodeParam("address", verifyingSigner).slice(2)}`; - - const tokenPaymasterComputedAddr = await deployerInstance.addressOf(salt); - console.log("Token paymaster Computed Address: ", tokenPaymasterComputedAddr); - const isContractDeployed = await isContract( - tokenPaymasterComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, - salt, - tokenPaymasterBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); - } catch (err) { - console.log("issue with the verification ", tokenPaymasterComputedAddr); - - return tokenPaymasterComputedAddr; - } - } else { - console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr - ); - } - return tokenPaymasterComputedAddr; -} - -async function deployDerivedPriceFeed( - deployerInstance: Deployer, - nativeOracleAddress: string, - tokenOracleAddress: string, - description: string, - feedSalt: string -): Promise { - const salt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(feedSalt)); - - const DerivedPriceFeed = await ethers.getContractFactory("DerivedPriceFeed"); - - const derivedPriceFeedBytecode = `${ - DerivedPriceFeed.bytecode - }${ethers.utils.defaultAbiCoder - .encode( - ["address", "address", "string"], - [nativeOracleAddress, tokenOracleAddress, description] - ) - .slice(2)}`; - - const derivedPriceFeedBComputedAddr = await deployerInstance.addressOf(salt); - console.log( - "Derived Price Feed Computed Address: ", - derivedPriceFeedBComputedAddr - ); - const isContractDeployed = await isContract( - derivedPriceFeedBComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - feedSalt, - derivedPriceFeedBComputedAddr, - salt, - derivedPriceFeedBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: derivedPriceFeedBComputedAddr, - constructorArguments: [ - nativeOracleAddress, - tokenOracleAddress, - description, - ], - }); - } catch (err) { - console.log( - "issue with the verification ", - derivedPriceFeedBComputedAddr - ); - - return derivedPriceFeedBComputedAddr; - } - } else { - console.log( - "Derived Price Feed is Already deployed with address ", - derivedPriceFeedBComputedAddr - ); - } - return derivedPriceFeedBComputedAddr; -} - -async function setTokenOracle( - oracleAggregatorInstance: ChainlinkOracleAggregator, - tokenAddress: string, - priceFeedAddress: string, - priceFeedDecimals: number, - priceFeedFunctionName: string -) { - const PriceFeedContract = await ethers.getContractAt( - "FeedInterface", - priceFeedAddress - ); - - // Find the function ABI based on the provided function name - // @ts-ignore - const functionAbi = - PriceFeedContract.interface.functions[ - priceFeedFunctionName as keyof typeof PriceFeedContract.functions - ]; - - // Generate the function data based on the function ABI - const functionData = - PriceFeedContract.interface.encodeFunctionData(functionAbi); - - const tx = await oracleAggregatorInstance.setTokenOracle( - tokenAddress, - priceFeedAddress, - priceFeedDecimals, - functionData, - true - ); - const receipt = await tx.wait(); - console.log( - `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` - ); -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstanceDEV(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_DEV); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_DEV - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_DEV, signer); - } -} - -async function getPredeployedDeployerContractInstancePROD(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_PROD); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_PROD - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_PROD, signer); - } -} - -async function getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress: string -): Promise { - const code = await provider.getCode(oracleAggregatorAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `ChainlinkOracleAggregator not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("ChainlinkOracleAggregator not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - oracleAggregatorAddress - ); - return ChainlinkOracleAggregator__factory.connect( - oracleAggregatorAddress, - signer - ); - } -} - -async function getTokenPaymasterContractInstance( - tokenPaymasterAddress: string -): Promise { - const code = await provider.getCode(tokenPaymasterAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("Biconomy Token Paymaster not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - tokenPaymasterAddress - ); - return BiconomyTokenPaymaster__factory.connect( - tokenPaymasterAddress, - signer - ); - } -} - -async function main() { - let tx, receipt; - const provider = ethers.provider; - - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - const deployerInstanceDEV = await getPredeployedDeployerContractInstanceDEV(); - console.log("========================================="); - - const deployerInstancePROD = - await getPredeployedDeployerContractInstancePROD(); - console.log("========================================="); - - // 1. Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); - await delay(5000); - - // 2. Deploy Token paymaster - const tokenPaymasterAddress = await deployTokenPaymasterContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================tokenPaymasterAddress=======================", - tokenPaymasterAddress - ); - await delay(5000); - - let oracleAggregatorInstance; - if (oracleAggregatorAddress) { - oracleAggregatorInstance = - await getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress - ); - console.log( - "==================oracleAggregatorInstance=======================" - ); - } - - // 3a. Deploy the derived price feeds for all chainlink supported ERC20 tokens - for (const token of tokenConfig.tokens) { - const { - symbol, - address, - nativeOracleAddress, - tokenOracleAddress, - priceFeedAddress, - description, - priceFeedFunction, - feedSalt, - derivedFeed, - } = token; - let derivedPriceFeedAddress = priceFeedAddress; - - if (derivedPriceFeedAddress == "") { - derivedPriceFeedAddress = await deployDerivedPriceFeed( - deployerInstanceDEV, - nativeOracleAddress, - tokenOracleAddress, - description, - feedSalt - ); - console.log( - `==================${symbol} PriceFeedAddress=======================`, - derivedPriceFeedAddress - ); - await delay(5000); - } - - // Continue with other steps like setting token oracle, transferring ownership, etc. - // Use the derivedPriceFeedAddress and other token-specific information as needed - // ... - - // 4. Set token oracle on oracle aggregator - if (oracleAggregatorInstance) { - let feedAddress = derivedPriceFeedAddress; - if (priceFeedFunction == "latestAnswer()" || derivedFeed == false) { - feedAddress = priceFeedAddress; - } - // TODO - // This should not hardcode tokenOracleDeciamls to 18 - // It works in case of derived price feeds and chainlink feeds which are in the erc20 / native base and quote format. - await setTokenOracle( - oracleAggregatorInstance, - address, - feedAddress, - 18, - priceFeedFunction - ); - } - } - - if (tokenPaymasterAddress) { - // 5b. transfer ownership of token paymaster to the owner - const tokenPaymasterInstance = await getTokenPaymasterContractInstance( - tokenPaymasterAddress - ); - console.log( - "==================tokenPaymasterInstance=======================" - ); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deploy-moonbeam-mainnet.ts b/scripts/deploy-moonbeam-mainnet.ts deleted file mode 100644 index 7b2ec76..0000000 --- a/scripts/deploy-moonbeam-mainnet.ts +++ /dev/null @@ -1,481 +0,0 @@ -import { ethers, run, network } from "hardhat"; -import { moonbeamMainnetConfigInfoProd } from "./configs"; -import { Token, TokenConfig } from "./utils/Types"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - getDeployerInstance, - isContract, -} from "./utils"; -import { - BiconomyTokenPaymaster, - BiconomyTokenPaymaster__factory, - ChainlinkOracleAggregator, - ChainlinkOracleAggregator__factory, - Deployer, - Deployer__factory, -} from "../typechain-types"; - -const tokenConfig: TokenConfig = moonbeamMainnetConfigInfoProd; - -const provider = ethers.provider; -const entryPointAddress = - process.env.ENTRY_POINT_ADDRESS || - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; -const owner = process.env.PAYMASTER_OWNER_ADDRESS_DEV || ""; -const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_DEV = - process.env.DEPLOYER_CONTRACT_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_PROD = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - if (!isOracleAggregatorDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(10000); - } catch (err) { - console.log("issue with the deployment"); - console.log(err); - return ethers.constants.AddressZero; - } - - try { - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } catch (err) { - console.log("issue with the verification ", oracleAggregatorComputedAddr); - - return oracleAggregatorComputedAddr; - } - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; -} - -async function deployTokenPaymasterContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) - ); - - const BiconomyTokenPaymaster = await ethers.getContractFactory( - "BiconomyTokenPaymaster" - ); - const tokenPaymasterBytecode = `${ - BiconomyTokenPaymaster.bytecode - }${encodeParam("address", earlyOwnerAddress).slice(2)}${encodeParam( - "address", - entryPointAddress - ).slice(2)}${encodeParam("address", verifyingSigner).slice(2)}`; - - const tokenPaymasterComputedAddr = await deployerInstance.addressOf(salt); - console.log("Token paymaster Computed Address: ", tokenPaymasterComputedAddr); - const isContractDeployed = await isContract( - tokenPaymasterComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, - salt, - tokenPaymasterBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); - } catch (err) { - console.log("issue with the verification ", tokenPaymasterComputedAddr); - - return tokenPaymasterComputedAddr; - } - } else { - console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr - ); - } - return tokenPaymasterComputedAddr; -} - -async function deployDerivedPriceFeed( - deployerInstance: Deployer, - nativeOracleAddress: string, - tokenOracleAddress: string, - description: string, - feedSalt: string -): Promise { - const salt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(feedSalt)); - - const DerivedPriceFeed = await ethers.getContractFactory("DerivedPriceFeed"); - - const derivedPriceFeedBytecode = `${ - DerivedPriceFeed.bytecode - }${ethers.utils.defaultAbiCoder - .encode( - ["address", "address", "string"], - [nativeOracleAddress, tokenOracleAddress, description] - ) - .slice(2)}`; - - const derivedPriceFeedBComputedAddr = await deployerInstance.addressOf(salt); - console.log( - "Derived Price Feed Computed Address: ", - derivedPriceFeedBComputedAddr - ); - const isContractDeployed = await isContract( - derivedPriceFeedBComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - feedSalt, - derivedPriceFeedBComputedAddr, - salt, - derivedPriceFeedBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: derivedPriceFeedBComputedAddr, - constructorArguments: [ - nativeOracleAddress, - tokenOracleAddress, - description, - ], - }); - } catch (err) { - console.log( - "issue with the verification ", - derivedPriceFeedBComputedAddr - ); - - return derivedPriceFeedBComputedAddr; - } - } else { - console.log( - "Derived Price Feed is Already deployed with address ", - derivedPriceFeedBComputedAddr - ); - } - return derivedPriceFeedBComputedAddr; -} - -async function setTokenOracle( - oracleAggregatorInstance: ChainlinkOracleAggregator, - tokenAddress: string, - priceFeedAddress: string, - priceFeedDecimals: number, - priceFeedFunctionName: string -) { - const PriceFeedContract = await ethers.getContractAt( - "FeedInterface", - priceFeedAddress - ); - - // Find the function ABI based on the provided function name - // @ts-ignore - const functionAbi = - PriceFeedContract.interface.functions[ - priceFeedFunctionName as keyof typeof PriceFeedContract.functions - ]; - - // Generate the function data based on the function ABI - const functionData = - PriceFeedContract.interface.encodeFunctionData(functionAbi); - - const tx = await oracleAggregatorInstance.setTokenOracle( - tokenAddress, - priceFeedAddress, - priceFeedDecimals, - functionData, - true - ); - const receipt = await tx.wait(); - console.log( - `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` - ); -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstanceDEV(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_DEV); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_DEV - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_DEV, signer); - } -} - -async function getPredeployedDeployerContractInstancePROD(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_PROD); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_PROD - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_PROD, signer); - } -} - -async function getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress: string -): Promise { - const code = await provider.getCode(oracleAggregatorAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `ChainlinkOracleAggregator not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("ChainlinkOracleAggregator not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - oracleAggregatorAddress - ); - return ChainlinkOracleAggregator__factory.connect( - oracleAggregatorAddress, - signer - ); - } -} - -async function getTokenPaymasterContractInstance( - tokenPaymasterAddress: string -): Promise { - const code = await provider.getCode(tokenPaymasterAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("Biconomy Token Paymaster not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - tokenPaymasterAddress - ); - return BiconomyTokenPaymaster__factory.connect( - tokenPaymasterAddress, - signer - ); - } -} - -async function main() { - let tx, receipt; - const provider = ethers.provider; - - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - const deployerInstanceDEV = await getPredeployedDeployerContractInstanceDEV(); - console.log("========================================="); - - const deployerInstancePROD = - await getPredeployedDeployerContractInstancePROD(); - console.log("========================================="); - - // 1. Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); - await delay(5000); - - // 2. Deploy Token paymaster - const tokenPaymasterAddress = await deployTokenPaymasterContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================tokenPaymasterAddress=======================", - tokenPaymasterAddress - ); - await delay(5000); - - let oracleAggregatorInstance; - if (oracleAggregatorAddress) { - oracleAggregatorInstance = - await getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress - ); - console.log( - "==================oracleAggregatorInstance=======================" - ); - } - - // 3a. Deploy the derived price feeds for all chainlink supported ERC20 tokens - for (const token of tokenConfig.tokens) { - const { - symbol, - address, - nativeOracleAddress, - tokenOracleAddress, - priceFeedAddress, - description, - priceFeedFunction, - feedSalt, - derivedFeed, - } = token; - let derivedPriceFeedAddress = priceFeedAddress; - - if (derivedPriceFeedAddress == "") { - derivedPriceFeedAddress = await deployDerivedPriceFeed( - deployerInstanceDEV, - nativeOracleAddress, - tokenOracleAddress, - description, - feedSalt - ); - console.log( - `==================${symbol} PriceFeedAddress=======================`, - derivedPriceFeedAddress - ); - await delay(5000); - } - - // Continue with other steps like setting token oracle, transferring ownership, etc. - // Use the derivedPriceFeedAddress and other token-specific information as needed - // ... - - // 4. Set token oracle on oracle aggregator - if (oracleAggregatorInstance) { - let feedAddress = derivedPriceFeedAddress; - if (priceFeedFunction == "latestAnswer()" || derivedFeed == false) { - feedAddress = priceFeedAddress; - } - // TODO - // This should not hardcode tokenOracleDeciamls to 18 - // It works in case of derived price feeds and chainlink feeds which are in the erc20 / native base and quote format. - await setTokenOracle( - oracleAggregatorInstance, - address, - feedAddress, - 18, - priceFeedFunction - ); - } - } - - if (tokenPaymasterAddress) { - // 5b. transfer ownership of token paymaster to the owner - const tokenPaymasterInstance = await getTokenPaymasterContractInstance( - tokenPaymasterAddress - ); - console.log( - "==================tokenPaymasterInstance=======================" - ); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deploy-mumbai.ts b/scripts/deploy-mumbai.ts deleted file mode 100644 index 9a144eb..0000000 --- a/scripts/deploy-mumbai.ts +++ /dev/null @@ -1,481 +0,0 @@ -import { ethers, run, network } from "hardhat"; -import { mumbaiConfigInfoProd } from "./configs"; -import { Token, TokenConfig } from "./utils/Types"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - getDeployerInstance, - isContract, -} from "./utils"; -import { - BiconomyTokenPaymaster, - BiconomyTokenPaymaster__factory, - ChainlinkOracleAggregator, - ChainlinkOracleAggregator__factory, - Deployer, - Deployer__factory, -} from "../typechain-types"; - -const tokenConfig: TokenConfig = mumbaiConfigInfoProd; - -const provider = ethers.provider; -const entryPointAddress = - process.env.ENTRY_POINT_ADDRESS || - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; -const owner = process.env.PAYMASTER_OWNER_ADDRESS_PROD || ""; -const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_PROD || ""; -const DEPLOYER_CONTRACT_ADDRESS_DEV = - process.env.DEPLOYER_CONTRACT_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_PROD = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - if (!isOracleAggregatorDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(10000); - } catch (err) { - console.log("issue with the deployment"); - console.log(err); - return ethers.constants.AddressZero; - } - - try { - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } catch (err) { - console.log("issue with the verification ", oracleAggregatorComputedAddr); - - return oracleAggregatorComputedAddr; - } - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; -} - -async function deployTokenPaymasterContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) - ); - - const BiconomyTokenPaymaster = await ethers.getContractFactory( - "BiconomyTokenPaymaster" - ); - const tokenPaymasterBytecode = `${ - BiconomyTokenPaymaster.bytecode - }${encodeParam("address", earlyOwnerAddress).slice(2)}${encodeParam( - "address", - entryPointAddress - ).slice(2)}${encodeParam("address", verifyingSigner).slice(2)}`; - - const tokenPaymasterComputedAddr = await deployerInstance.addressOf(salt); - console.log("Token paymaster Computed Address: ", tokenPaymasterComputedAddr); - const isContractDeployed = await isContract( - tokenPaymasterComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, - salt, - tokenPaymasterBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); - } catch (err) { - console.log("issue with the verification ", tokenPaymasterComputedAddr); - - return tokenPaymasterComputedAddr; - } - } else { - console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr - ); - } - return tokenPaymasterComputedAddr; -} - -async function deployDerivedPriceFeed( - deployerInstance: Deployer, - nativeOracleAddress: string, - tokenOracleAddress: string, - description: string, - feedSalt: string -): Promise { - const salt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(feedSalt)); - - const DerivedPriceFeed = await ethers.getContractFactory("DerivedPriceFeed"); - - const derivedPriceFeedBytecode = `${ - DerivedPriceFeed.bytecode - }${ethers.utils.defaultAbiCoder - .encode( - ["address", "address", "string"], - [nativeOracleAddress, tokenOracleAddress, description] - ) - .slice(2)}`; - - const derivedPriceFeedBComputedAddr = await deployerInstance.addressOf(salt); - console.log( - "Derived Price Feed Computed Address: ", - derivedPriceFeedBComputedAddr - ); - const isContractDeployed = await isContract( - derivedPriceFeedBComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - feedSalt, - derivedPriceFeedBComputedAddr, - salt, - derivedPriceFeedBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: derivedPriceFeedBComputedAddr, - constructorArguments: [ - nativeOracleAddress, - tokenOracleAddress, - description, - ], - }); - } catch (err) { - console.log( - "issue with the verification ", - derivedPriceFeedBComputedAddr - ); - - return derivedPriceFeedBComputedAddr; - } - } else { - console.log( - "Derived Price Feed is Already deployed with address ", - derivedPriceFeedBComputedAddr - ); - } - return derivedPriceFeedBComputedAddr; -} - -async function setTokenOracle( - oracleAggregatorInstance: ChainlinkOracleAggregator, - tokenAddress: string, - priceFeedAddress: string, - priceFeedDecimals: number, - priceFeedFunctionName: string -) { - const PriceFeedContract = await ethers.getContractAt( - "FeedInterface", - priceFeedAddress - ); - - // Find the function ABI based on the provided function name - // @ts-ignore - const functionAbi = - PriceFeedContract.interface.functions[ - priceFeedFunctionName as keyof typeof PriceFeedContract.functions - ]; - - // Generate the function data based on the function ABI - const functionData = - PriceFeedContract.interface.encodeFunctionData(functionAbi); - - const tx = await oracleAggregatorInstance.setTokenOracle( - tokenAddress, - priceFeedAddress, - priceFeedDecimals, - functionData, - true - ); - const receipt = await tx.wait(); - console.log( - `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` - ); -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstanceDEV(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_DEV); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_DEV - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_DEV, signer); - } -} - -async function getPredeployedDeployerContractInstancePROD(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_PROD); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_PROD - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_PROD, signer); - } -} - -async function getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress: string -): Promise { - const code = await provider.getCode(oracleAggregatorAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `ChainlinkOracleAggregator not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("ChainlinkOracleAggregator not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - oracleAggregatorAddress - ); - return ChainlinkOracleAggregator__factory.connect( - oracleAggregatorAddress, - signer - ); - } -} - -async function getTokenPaymasterContractInstance( - tokenPaymasterAddress: string -): Promise { - const code = await provider.getCode(tokenPaymasterAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("Biconomy Token Paymaster not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - tokenPaymasterAddress - ); - return BiconomyTokenPaymaster__factory.connect( - tokenPaymasterAddress, - signer - ); - } -} - -async function main() { - let tx, receipt; - const provider = ethers.provider; - - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - const deployerInstanceDEV = await getPredeployedDeployerContractInstanceDEV(); - console.log("========================================="); - - const deployerInstancePROD = - await getPredeployedDeployerContractInstancePROD(); - console.log("========================================="); - - // 1. Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); - await delay(5000); - - // 2. Deploy Token paymaster - const tokenPaymasterAddress = await deployTokenPaymasterContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================tokenPaymasterAddress=======================", - tokenPaymasterAddress - ); - await delay(5000); - - let oracleAggregatorInstance; - if (oracleAggregatorAddress) { - oracleAggregatorInstance = - await getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress - ); - console.log( - "==================oracleAggregatorInstance=======================" - ); - } - - // 3a. Deploy the derived price feeds for all chainlink supported ERC20 tokens - for (const token of tokenConfig.tokens) { - const { - symbol, - address, - nativeOracleAddress, - tokenOracleAddress, - priceFeedAddress, - description, - priceFeedFunction, - feedSalt, - derivedFeed, - } = token; - let derivedPriceFeedAddress = priceFeedAddress; - - if (derivedPriceFeedAddress == "") { - derivedPriceFeedAddress = await deployDerivedPriceFeed( - deployerInstanceDEV, - nativeOracleAddress, - tokenOracleAddress, - description, - feedSalt - ); - console.log( - `==================${symbol} PriceFeedAddress=======================`, - derivedPriceFeedAddress - ); - await delay(5000); - } - - // Continue with other steps like setting token oracle, transferring ownership, etc. - // Use the derivedPriceFeedAddress and other token-specific information as needed - // ... - - // 4. Set token oracle on oracle aggregator - if (oracleAggregatorInstance) { - let feedAddress = derivedPriceFeedAddress; - if (priceFeedFunction == "latestAnswer()" || derivedFeed == false) { - feedAddress = priceFeedAddress; - } - // TODO - // This should not hardcode tokenOracleDeciamls to 18 - // It works in case of derived price feeds and chainlink feeds which are in the erc20 / native base and quote format. - await setTokenOracle( - oracleAggregatorInstance, - address, - feedAddress, - 18, - priceFeedFunction - ); - } - } - - if (tokenPaymasterAddress) { - // 5b. transfer ownership of token paymaster to the owner - const tokenPaymasterInstance = await getTokenPaymasterContractInstance( - tokenPaymasterAddress - ); - console.log( - "==================tokenPaymasterInstance=======================" - ); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deploy-optimism-goerli.ts b/scripts/deploy-optimism-goerli.ts deleted file mode 100644 index 36abd9a..0000000 --- a/scripts/deploy-optimism-goerli.ts +++ /dev/null @@ -1,481 +0,0 @@ -import { ethers, run, network } from "hardhat"; -import { optimismGoerliConfigInfoProd } from "./configs"; -import { Token, TokenConfig } from "./utils/Types"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - getDeployerInstance, - isContract, -} from "./utils"; -import { - BiconomyTokenPaymaster, - BiconomyTokenPaymaster__factory, - ChainlinkOracleAggregator, - ChainlinkOracleAggregator__factory, - Deployer, - Deployer__factory, -} from "../typechain-types"; - -const tokenConfig: TokenConfig = optimismGoerliConfigInfoProd; - -const provider = ethers.provider; -const entryPointAddress = - process.env.ENTRY_POINT_ADDRESS || - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; -const owner = process.env.PAYMASTER_OWNER_ADDRESS_DEV || ""; -const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_DEV = - process.env.DEPLOYER_CONTRACT_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_PROD = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - if (!isOracleAggregatorDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(10000); - } catch (err) { - console.log("issue with the deployment"); - console.log(err); - return ethers.constants.AddressZero; - } - - try { - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } catch (err) { - console.log("issue with the verification ", oracleAggregatorComputedAddr); - - return oracleAggregatorComputedAddr; - } - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; -} - -async function deployTokenPaymasterContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) - ); - - const BiconomyTokenPaymaster = await ethers.getContractFactory( - "BiconomyTokenPaymaster" - ); - const tokenPaymasterBytecode = `${ - BiconomyTokenPaymaster.bytecode - }${encodeParam("address", earlyOwnerAddress).slice(2)}${encodeParam( - "address", - entryPointAddress - ).slice(2)}${encodeParam("address", verifyingSigner).slice(2)}`; - - const tokenPaymasterComputedAddr = await deployerInstance.addressOf(salt); - console.log("Token paymaster Computed Address: ", tokenPaymasterComputedAddr); - const isContractDeployed = await isContract( - tokenPaymasterComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, - salt, - tokenPaymasterBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); - } catch (err) { - console.log("issue with the verification ", tokenPaymasterComputedAddr); - - return tokenPaymasterComputedAddr; - } - } else { - console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr - ); - } - return tokenPaymasterComputedAddr; -} - -async function deployDerivedPriceFeed( - deployerInstance: Deployer, - nativeOracleAddress: string, - tokenOracleAddress: string, - description: string, - feedSalt: string -): Promise { - const salt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(feedSalt)); - - const DerivedPriceFeed = await ethers.getContractFactory("DerivedPriceFeed"); - - const derivedPriceFeedBytecode = `${ - DerivedPriceFeed.bytecode - }${ethers.utils.defaultAbiCoder - .encode( - ["address", "address", "string"], - [nativeOracleAddress, tokenOracleAddress, description] - ) - .slice(2)}`; - - const derivedPriceFeedBComputedAddr = await deployerInstance.addressOf(salt); - console.log( - "Derived Price Feed Computed Address: ", - derivedPriceFeedBComputedAddr - ); - const isContractDeployed = await isContract( - derivedPriceFeedBComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - feedSalt, - derivedPriceFeedBComputedAddr, - salt, - derivedPriceFeedBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: derivedPriceFeedBComputedAddr, - constructorArguments: [ - nativeOracleAddress, - tokenOracleAddress, - description, - ], - }); - } catch (err) { - console.log( - "issue with the verification ", - derivedPriceFeedBComputedAddr - ); - - return derivedPriceFeedBComputedAddr; - } - } else { - console.log( - "Derived Price Feed is Already deployed with address ", - derivedPriceFeedBComputedAddr - ); - } - return derivedPriceFeedBComputedAddr; -} - -async function setTokenOracle( - oracleAggregatorInstance: ChainlinkOracleAggregator, - tokenAddress: string, - priceFeedAddress: string, - priceFeedDecimals: number, - priceFeedFunctionName: string -) { - const PriceFeedContract = await ethers.getContractAt( - "FeedInterface", - priceFeedAddress - ); - - // Find the function ABI based on the provided function name - // @ts-ignore - const functionAbi = - PriceFeedContract.interface.functions[ - priceFeedFunctionName as keyof typeof PriceFeedContract.functions - ]; - - // Generate the function data based on the function ABI - const functionData = - PriceFeedContract.interface.encodeFunctionData(functionAbi); - - const tx = await oracleAggregatorInstance.setTokenOracle( - tokenAddress, - priceFeedAddress, - priceFeedDecimals, - functionData, - true - ); - const receipt = await tx.wait(); - console.log( - `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` - ); -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstanceDEV(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_DEV); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_DEV - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_DEV, signer); - } -} - -async function getPredeployedDeployerContractInstancePROD(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_PROD); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_PROD - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_PROD, signer); - } -} - -async function getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress: string -): Promise { - const code = await provider.getCode(oracleAggregatorAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `ChainlinkOracleAggregator not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("ChainlinkOracleAggregator not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - oracleAggregatorAddress - ); - return ChainlinkOracleAggregator__factory.connect( - oracleAggregatorAddress, - signer - ); - } -} - -async function getTokenPaymasterContractInstance( - tokenPaymasterAddress: string -): Promise { - const code = await provider.getCode(tokenPaymasterAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("Biconomy Token Paymaster not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - tokenPaymasterAddress - ); - return BiconomyTokenPaymaster__factory.connect( - tokenPaymasterAddress, - signer - ); - } -} - -async function main() { - let tx, receipt; - const provider = ethers.provider; - - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - const deployerInstanceDEV = await getPredeployedDeployerContractInstanceDEV(); - console.log("========================================="); - - const deployerInstancePROD = - await getPredeployedDeployerContractInstancePROD(); - console.log("========================================="); - - // 1. Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); - await delay(5000); - - // 2. Deploy Token paymaster - const tokenPaymasterAddress = await deployTokenPaymasterContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================tokenPaymasterAddress=======================", - tokenPaymasterAddress - ); - await delay(5000); - - let oracleAggregatorInstance; - if (oracleAggregatorAddress) { - oracleAggregatorInstance = - await getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress - ); - console.log( - "==================oracleAggregatorInstance=======================" - ); - } - - // 3a. Deploy the derived price feeds for all chainlink supported ERC20 tokens - for (const token of tokenConfig.tokens) { - const { - symbol, - address, - nativeOracleAddress, - tokenOracleAddress, - priceFeedAddress, - description, - priceFeedFunction, - feedSalt, - derivedFeed, - } = token; - let derivedPriceFeedAddress = priceFeedAddress; - - if (derivedPriceFeedAddress == "") { - derivedPriceFeedAddress = await deployDerivedPriceFeed( - deployerInstanceDEV, - nativeOracleAddress, - tokenOracleAddress, - description, - feedSalt - ); - console.log( - `==================${symbol} PriceFeedAddress=======================`, - derivedPriceFeedAddress - ); - await delay(5000); - } - - // Continue with other steps like setting token oracle, transferring ownership, etc. - // Use the derivedPriceFeedAddress and other token-specific information as needed - // ... - - // 4. Set token oracle on oracle aggregator - if (oracleAggregatorInstance) { - let feedAddress = derivedPriceFeedAddress; - if (priceFeedFunction == "latestAnswer()" || derivedFeed == false) { - feedAddress = priceFeedAddress; - } - // TODO - // This should not hardcode tokenOracleDeciamls to 18 - // It works in case of derived price feeds and chainlink feeds which are in the erc20 / native base and quote format. - await setTokenOracle( - oracleAggregatorInstance, - address, - feedAddress, - 18, - priceFeedFunction - ); - } - } - - if (tokenPaymasterAddress) { - // 5b. transfer ownership of token paymaster to the owner - const tokenPaymasterInstance = await getTokenPaymasterContractInstance( - tokenPaymasterAddress - ); - console.log( - "==================tokenPaymasterInstance=======================" - ); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deploy-optimism-mainnet.ts b/scripts/deploy-optimism-mainnet.ts deleted file mode 100644 index 7672ad2..0000000 --- a/scripts/deploy-optimism-mainnet.ts +++ /dev/null @@ -1,481 +0,0 @@ -import { ethers, run, network } from "hardhat"; -import { optimismMainnetConfigInfoProd } from "./configs"; -import { Token, TokenConfig } from "./utils/Types"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - getDeployerInstance, - isContract, -} from "./utils"; -import { - BiconomyTokenPaymaster, - BiconomyTokenPaymaster__factory, - ChainlinkOracleAggregator, - ChainlinkOracleAggregator__factory, - Deployer, - Deployer__factory, -} from "../typechain-types"; - -const tokenConfig: TokenConfig = optimismMainnetConfigInfoProd; - -const provider = ethers.provider; -const entryPointAddress = - process.env.ENTRY_POINT_ADDRESS || - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; -const owner = process.env.PAYMASTER_OWNER_ADDRESS_DEV || ""; -const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_DEV = - process.env.DEPLOYER_CONTRACT_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_PROD = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - if (!isOracleAggregatorDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(10000); - } catch (err) { - console.log("issue with the deployment"); - console.log(err); - return ethers.constants.AddressZero; - } - - try { - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } catch (err) { - console.log("issue with the verification ", oracleAggregatorComputedAddr); - - return oracleAggregatorComputedAddr; - } - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; -} - -async function deployTokenPaymasterContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) - ); - - const BiconomyTokenPaymaster = await ethers.getContractFactory( - "BiconomyTokenPaymaster" - ); - const tokenPaymasterBytecode = `${ - BiconomyTokenPaymaster.bytecode - }${encodeParam("address", earlyOwnerAddress).slice(2)}${encodeParam( - "address", - entryPointAddress - ).slice(2)}${encodeParam("address", verifyingSigner).slice(2)}`; - - const tokenPaymasterComputedAddr = await deployerInstance.addressOf(salt); - console.log("Token paymaster Computed Address: ", tokenPaymasterComputedAddr); - const isContractDeployed = await isContract( - tokenPaymasterComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, - salt, - tokenPaymasterBytecode, - deployerInstance - ); - await delay(10000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); - } catch (err) { - console.log("issue with the verification ", tokenPaymasterComputedAddr); - - return tokenPaymasterComputedAddr; - } - } else { - console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr - ); - } - return tokenPaymasterComputedAddr; -} - -async function deployDerivedPriceFeed( - deployerInstance: Deployer, - nativeOracleAddress: string, - tokenOracleAddress: string, - description: string, - feedSalt: string -): Promise { - const salt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(feedSalt)); - - const DerivedPriceFeed = await ethers.getContractFactory("DerivedPriceFeed"); - - const derivedPriceFeedBytecode = `${ - DerivedPriceFeed.bytecode - }${ethers.utils.defaultAbiCoder - .encode( - ["address", "address", "string"], - [nativeOracleAddress, tokenOracleAddress, description] - ) - .slice(2)}`; - - const derivedPriceFeedBComputedAddr = await deployerInstance.addressOf(salt); - console.log( - "Derived Price Feed Computed Address: ", - derivedPriceFeedBComputedAddr - ); - const isContractDeployed = await isContract( - derivedPriceFeedBComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - feedSalt, - derivedPriceFeedBComputedAddr, - salt, - derivedPriceFeedBytecode, - deployerInstance - ); - await delay(10000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: derivedPriceFeedBComputedAddr, - constructorArguments: [ - nativeOracleAddress, - tokenOracleAddress, - description, - ], - }); - } catch (err) { - console.log( - "issue with the verification ", - derivedPriceFeedBComputedAddr - ); - - return derivedPriceFeedBComputedAddr; - } - } else { - console.log( - "Derived Price Feed is Already deployed with address ", - derivedPriceFeedBComputedAddr - ); - } - return derivedPriceFeedBComputedAddr; -} - -async function setTokenOracle( - oracleAggregatorInstance: ChainlinkOracleAggregator, - tokenAddress: string, - priceFeedAddress: string, - priceFeedDecimals: number, - priceFeedFunctionName: string -) { - const PriceFeedContract = await ethers.getContractAt( - "FeedInterface", - priceFeedAddress - ); - - // Find the function ABI based on the provided function name - // @ts-ignore - const functionAbi = - PriceFeedContract.interface.functions[ - priceFeedFunctionName as keyof typeof PriceFeedContract.functions - ]; - - // Generate the function data based on the function ABI - const functionData = - PriceFeedContract.interface.encodeFunctionData(functionAbi); - - const tx = await oracleAggregatorInstance.setTokenOracle( - tokenAddress, - priceFeedAddress, - priceFeedDecimals, - functionData, - true - ); - const receipt = await tx.wait(); - console.log( - `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` - ); -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstanceDEV(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_DEV); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_DEV - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_DEV, signer); - } -} - -async function getPredeployedDeployerContractInstancePROD(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_PROD); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_PROD - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_PROD, signer); - } -} - -async function getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress: string -): Promise { - const code = await provider.getCode(oracleAggregatorAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `ChainlinkOracleAggregator not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("ChainlinkOracleAggregator not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - oracleAggregatorAddress - ); - return ChainlinkOracleAggregator__factory.connect( - oracleAggregatorAddress, - signer - ); - } -} - -async function getTokenPaymasterContractInstance( - tokenPaymasterAddress: string -): Promise { - const code = await provider.getCode(tokenPaymasterAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("Biconomy Token Paymaster not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - tokenPaymasterAddress - ); - return BiconomyTokenPaymaster__factory.connect( - tokenPaymasterAddress, - signer - ); - } -} - -async function main() { - let tx, receipt; - const provider = ethers.provider; - - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - const deployerInstanceDEV = await getPredeployedDeployerContractInstanceDEV(); - console.log("========================================="); - - const deployerInstancePROD = - await getPredeployedDeployerContractInstancePROD(); - console.log("========================================="); - - // 1. Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); - await delay(10000); - - // 2. Deploy Token paymaster - const tokenPaymasterAddress = await deployTokenPaymasterContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================tokenPaymasterAddress=======================", - tokenPaymasterAddress - ); - await delay(10000); - - let oracleAggregatorInstance; - if (oracleAggregatorAddress) { - oracleAggregatorInstance = - await getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress - ); - console.log( - "==================oracleAggregatorInstance=======================" - ); - } - - // 3a. Deploy the derived price feeds for all chainlink supported ERC20 tokens - for (const token of tokenConfig.tokens) { - const { - symbol, - address, - nativeOracleAddress, - tokenOracleAddress, - priceFeedAddress, - description, - priceFeedFunction, - feedSalt, - derivedFeed, - } = token; - let derivedPriceFeedAddress = priceFeedAddress; - - if (derivedPriceFeedAddress == "") { - derivedPriceFeedAddress = await deployDerivedPriceFeed( - deployerInstanceDEV, - nativeOracleAddress, - tokenOracleAddress, - description, - feedSalt - ); - console.log( - `==================${symbol} PriceFeedAddress=======================`, - derivedPriceFeedAddress - ); - await delay(10000); - } - - // Continue with other steps like setting token oracle, transferring ownership, etc. - // Use the derivedPriceFeedAddress and other token-specific information as needed - // ... - - // 4. Set token oracle on oracle aggregator - if (oracleAggregatorInstance) { - let feedAddress = derivedPriceFeedAddress; - if (priceFeedFunction == "latestAnswer()" || derivedFeed == false) { - feedAddress = priceFeedAddress; - } - // TODO - // This should not hardcode tokenOracleDeciamls to 18 - // It works in case of derived price feeds and chainlink feeds which are in the erc20 / native base and quote format. - await setTokenOracle( - oracleAggregatorInstance, - address, - feedAddress, - 18, - priceFeedFunction - ); - } - } - - if (tokenPaymasterAddress) { - // 5b. transfer ownership of token paymaster to the owner - const tokenPaymasterInstance = await getTokenPaymasterContractInstance( - tokenPaymasterAddress - ); - console.log( - "==================tokenPaymasterInstance=======================" - ); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deploy-polygon-mainnet.ts b/scripts/deploy-polygon-mainnet.ts deleted file mode 100644 index 93b7d45..0000000 --- a/scripts/deploy-polygon-mainnet.ts +++ /dev/null @@ -1,484 +0,0 @@ -import { ethers, run, network } from "hardhat"; -import { polygonMainnetConfigInfoProd } from "./configs"; -import { Token, TokenConfig } from "./utils/Types"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - getDeployerInstance, - isContract, -} from "./utils"; -import { - BiconomyTokenPaymaster, - BiconomyTokenPaymaster__factory, - ChainlinkOracleAggregator, - ChainlinkOracleAggregator__factory, - Deployer, - Deployer__factory, -} from "../typechain-types"; - -const tokenConfig: TokenConfig = polygonMainnetConfigInfoProd; - -const provider = ethers.provider; -const entryPointAddress = - process.env.ENTRY_POINT_ADDRESS || - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; -const owner = process.env.PAYMASTER_OWNER_ADDRESS_DEV || ""; -const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_DEV = - process.env.DEPLOYER_CONTRACT_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_PROD = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - if (!isOracleAggregatorDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(4000); - } catch (err) { - console.log("issue with the deployment"); - console.log(err); - return ethers.constants.AddressZero; - } - - try { - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } catch (err) { - console.log("issue with the verification ", oracleAggregatorComputedAddr); - - return oracleAggregatorComputedAddr; - } - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; -} - -async function deployTokenPaymasterContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) - ); - - const BiconomyTokenPaymaster = await ethers.getContractFactory( - "BiconomyTokenPaymaster" - ); - const tokenPaymasterBytecode = `${ - BiconomyTokenPaymaster.bytecode - }${encodeParam("address", earlyOwnerAddress).slice(2)}${encodeParam( - "address", - entryPointAddress - ).slice(2)}${encodeParam("address", verifyingSigner).slice(2)}`; - - const tokenPaymasterComputedAddr = await deployerInstance.addressOf(salt); - console.log("Token paymaster Computed Address: ", tokenPaymasterComputedAddr); - const isContractDeployed = await isContract( - tokenPaymasterComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, - salt, - tokenPaymasterBytecode, - deployerInstance - ); - await delay(4000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); - } catch (err) { - console.log("issue with the verification ", tokenPaymasterComputedAddr); - - return tokenPaymasterComputedAddr; - } - } else { - console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr - ); - } - return tokenPaymasterComputedAddr; -} - -async function deployDerivedPriceFeed( - deployerInstance: Deployer, - nativeOracleAddress: string, - tokenOracleAddress: string, - description: string, - feedSalt: string -): Promise { - const salt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(feedSalt)); - - const DerivedPriceFeed = await ethers.getContractFactory("DerivedPriceFeed"); - - const derivedPriceFeedBytecode = `${ - DerivedPriceFeed.bytecode - }${ethers.utils.defaultAbiCoder - .encode( - ["address", "address", "string"], - [nativeOracleAddress, tokenOracleAddress, description] - ) - .slice(2)}`; - - const derivedPriceFeedBComputedAddr = await deployerInstance.addressOf(salt); - console.log( - "Derived Price Feed Computed Address: ", - derivedPriceFeedBComputedAddr - ); - const isContractDeployed = await isContract( - derivedPriceFeedBComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - feedSalt, - derivedPriceFeedBComputedAddr, - salt, - derivedPriceFeedBytecode, - deployerInstance - ); - await delay(4000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: derivedPriceFeedBComputedAddr, - constructorArguments: [ - nativeOracleAddress, - tokenOracleAddress, - description, - ], - }); - } catch (err) { - console.log( - "issue with the verification ", - derivedPriceFeedBComputedAddr - ); - - return derivedPriceFeedBComputedAddr; - } - } else { - console.log( - "Derived Price Feed is Already deployed with address ", - derivedPriceFeedBComputedAddr - ); - } - return derivedPriceFeedBComputedAddr; -} - -async function setTokenOracle( - oracleAggregatorInstance: ChainlinkOracleAggregator, - tokenAddress: string, - priceFeedAddress: string, - priceFeedDecimals: number, - priceFeedFunctionName: string -) { - const PriceFeedContract = await ethers.getContractAt( - "FeedInterface", - priceFeedAddress - ); - - // Find the function ABI based on the provided function name - // @ts-ignore - const functionAbi = - PriceFeedContract.interface.functions[ - priceFeedFunctionName as keyof typeof PriceFeedContract.functions - ]; - - // Generate the function data based on the function ABI - const functionData = - PriceFeedContract.interface.encodeFunctionData(functionAbi); - - const tx = await oracleAggregatorInstance.setTokenOracle( - tokenAddress, - priceFeedAddress, - priceFeedDecimals, - functionData, - true - ); - const receipt = await tx.wait(); - console.log( - `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` - ); -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstanceDEV(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_DEV); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_DEV - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_DEV, signer); - } -} - -async function getPredeployedDeployerContractInstancePROD(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_PROD); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_PROD - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_PROD, signer); - } -} - -async function getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress: string -): Promise { - const code = await provider.getCode(oracleAggregatorAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `ChainlinkOracleAggregator not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("ChainlinkOracleAggregator not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - oracleAggregatorAddress - ); - return ChainlinkOracleAggregator__factory.connect( - oracleAggregatorAddress, - signer - ); - } -} - -async function getTokenPaymasterContractInstance( - tokenPaymasterAddress: string -): Promise { - const code = await provider.getCode(tokenPaymasterAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("Biconomy Token Paymaster not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - tokenPaymasterAddress - ); - return BiconomyTokenPaymaster__factory.connect( - tokenPaymasterAddress, - signer - ); - } -} - -async function main() { - let tx, receipt; - const provider = ethers.provider; - - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - const deployerInstanceDEV = await getPredeployedDeployerContractInstanceDEV(); - console.log("========================================="); - - const deployerInstancePROD = - await getPredeployedDeployerContractInstancePROD(); - console.log("========================================="); - - // 1. Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); - await delay(4000); - - // 2. Deploy Token paymaster - const tokenPaymasterAddress = await deployTokenPaymasterContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================tokenPaymasterAddress=======================", - tokenPaymasterAddress - ); - await delay(4000); - - let oracleAggregatorInstance; - if (oracleAggregatorAddress) { - oracleAggregatorInstance = - await getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress - ); - console.log( - "==================oracleAggregatorInstance=======================" - ); - } - - // 3a. Deploy the derived price feeds for all chainlink supported ERC20 tokens - for (const token of tokenConfig.tokens) { - const { - symbol, - address, - nativeOracleAddress, - tokenOracleAddress, - priceFeedAddress, - description, - priceFeedFunction, - feedSalt, - derivedFeed, - } = token; - let derivedPriceFeedAddress = priceFeedAddress; - console.log( - `derived price feed address for token ${symbol} is ${derivedPriceFeedAddress}` - ); - - if (derivedPriceFeedAddress == "") { - derivedPriceFeedAddress = await deployDerivedPriceFeed( - deployerInstanceDEV, - nativeOracleAddress, - tokenOracleAddress, - description, - feedSalt - ); - console.log( - `==================${symbol} PriceFeedAddress=======================`, - derivedPriceFeedAddress - ); - await delay(4000); - } - - // Continue with other steps like setting token oracle, transferring ownership, etc. - // Use the derivedPriceFeedAddress and other token-specific information as needed - // ... - - // 4. Set token oracle on oracle aggregator - if (oracleAggregatorInstance) { - let feedAddress = derivedPriceFeedAddress; - if (priceFeedFunction == "latestAnswer()" || derivedFeed == false) { - feedAddress = priceFeedAddress; - } - // TODO - // This should not hardcode tokenOracleDeciamls to 18 - // It works in case of derived price feeds and chainlink feeds which are in the erc20 / native base and quote format. - await setTokenOracle( - oracleAggregatorInstance, - address, - feedAddress, - 18, - priceFeedFunction - ); - } - } - - if (tokenPaymasterAddress) { - // 5b. transfer ownership of token paymaster to the owner - const tokenPaymasterInstance = await getTokenPaymasterContractInstance( - tokenPaymasterAddress - ); - console.log( - "==================tokenPaymasterInstance=======================" - ); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deploy-sepolia.ts b/scripts/deploy-sepolia.ts deleted file mode 100644 index 6fb53c2..0000000 --- a/scripts/deploy-sepolia.ts +++ /dev/null @@ -1,481 +0,0 @@ -import { ethers, run, network } from "hardhat"; -import { sepoliaConfigInfoProd } from "./configs"; -import { Token, TokenConfig } from "./utils/Types"; -import { - deployContract, - DEPLOYMENT_SALTS, - encodeParam, - getDeployerInstance, - isContract, -} from "./utils"; -import { - BiconomyTokenPaymaster, - BiconomyTokenPaymaster__factory, - ChainlinkOracleAggregator, - ChainlinkOracleAggregator__factory, - Deployer, - Deployer__factory, -} from "../typechain-types"; - -const tokenConfig: TokenConfig = sepoliaConfigInfoProd; - -const provider = ethers.provider; -const entryPointAddress = - process.env.ENTRY_POINT_ADDRESS || - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; -const owner = process.env.PAYMASTER_OWNER_ADDRESS_DEV || ""; -const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_DEV = - process.env.DEPLOYER_CONTRACT_ADDRESS_DEV || ""; -const DEPLOYER_CONTRACT_ADDRESS_PROD = - process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; - -function delay(ms: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, ms); - }); -} - -async function deployChainlinkOracleAggregatorContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const ORACLE_AGGREGATOR_SALT = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.ORACLE_AGGREGATOR) - ); - - const OracleAggregator = await ethers.getContractFactory( - "ChainlinkOracleAggregator" - ); - const oracleAggregatorBytecode = `${OracleAggregator.bytecode}${encodeParam( - "address", - earlyOwnerAddress - ).slice(2)}`; - const oracleAggregatorComputedAddr = await deployerInstance.addressOf( - ORACLE_AGGREGATOR_SALT - ); - console.log( - "Chainlink Oracle Aggregator Computed Address: ", - oracleAggregatorComputedAddr - ); - - const isOracleAggregatorDeployed = await isContract( - oracleAggregatorComputedAddr, - provider - ); // true (deployed on-chain) - if (!isOracleAggregatorDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.ORACLE_AGGREGATOR, - oracleAggregatorComputedAddr, - ORACLE_AGGREGATOR_SALT, - oracleAggregatorBytecode, - deployerInstance - ); - await delay(10000); - } catch (err) { - console.log("issue with the deployment"); - console.log(err); - return ethers.constants.AddressZero; - } - - try { - await run(`verify:verify`, { - address: oracleAggregatorComputedAddr, - constructorArguments: [earlyOwnerAddress], - }); - } catch (err) { - console.log("issue with the verification ", oracleAggregatorComputedAddr); - - return oracleAggregatorComputedAddr; - } - } else { - console.log( - "Chainlink Oracle Aggregator is already deployed with address ", - oracleAggregatorComputedAddr - ); - } - return oracleAggregatorComputedAddr; -} - -async function deployTokenPaymasterContract( - deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER) - ); - - const BiconomyTokenPaymaster = await ethers.getContractFactory( - "BiconomyTokenPaymaster" - ); - const tokenPaymasterBytecode = `${ - BiconomyTokenPaymaster.bytecode - }${encodeParam("address", earlyOwnerAddress).slice(2)}${encodeParam( - "address", - entryPointAddress - ).slice(2)}${encodeParam("address", verifyingSigner).slice(2)}`; - - const tokenPaymasterComputedAddr = await deployerInstance.addressOf(salt); - console.log("Token paymaster Computed Address: ", tokenPaymasterComputedAddr); - const isContractDeployed = await isContract( - tokenPaymasterComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, - salt, - tokenPaymasterBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); - } catch (err) { - console.log("issue with the verification ", tokenPaymasterComputedAddr); - - return tokenPaymasterComputedAddr; - } - } else { - console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr - ); - } - return tokenPaymasterComputedAddr; -} - -async function deployDerivedPriceFeed( - deployerInstance: Deployer, - nativeOracleAddress: string, - tokenOracleAddress: string, - description: string, - feedSalt: string -): Promise { - const salt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(feedSalt)); - - const DerivedPriceFeed = await ethers.getContractFactory("DerivedPriceFeed"); - - const derivedPriceFeedBytecode = `${ - DerivedPriceFeed.bytecode - }${ethers.utils.defaultAbiCoder - .encode( - ["address", "address", "string"], - [nativeOracleAddress, tokenOracleAddress, description] - ) - .slice(2)}`; - - const derivedPriceFeedBComputedAddr = await deployerInstance.addressOf(salt); - console.log( - "Derived Price Feed Computed Address: ", - derivedPriceFeedBComputedAddr - ); - const isContractDeployed = await isContract( - derivedPriceFeedBComputedAddr, - provider - ); - if (!isContractDeployed) { - try { - await deployContract( - feedSalt, - derivedPriceFeedBComputedAddr, - salt, - derivedPriceFeedBytecode, - deployerInstance - ); - await delay(5000); - } catch (err) { - console.log(err); - console.log("issue with the deployment"); - return ethers.constants.AddressZero; - } - try { - await run(`verify:verify`, { - address: derivedPriceFeedBComputedAddr, - constructorArguments: [ - nativeOracleAddress, - tokenOracleAddress, - description, - ], - }); - } catch (err) { - console.log( - "issue with the verification ", - derivedPriceFeedBComputedAddr - ); - - return derivedPriceFeedBComputedAddr; - } - } else { - console.log( - "Derived Price Feed is Already deployed with address ", - derivedPriceFeedBComputedAddr - ); - } - return derivedPriceFeedBComputedAddr; -} - -async function setTokenOracle( - oracleAggregatorInstance: ChainlinkOracleAggregator, - tokenAddress: string, - priceFeedAddress: string, - priceFeedDecimals: number, - priceFeedFunctionName: string -) { - const PriceFeedContract = await ethers.getContractAt( - "FeedInterface", - priceFeedAddress - ); - - // Find the function ABI based on the provided function name - // @ts-ignore - const functionAbi = - PriceFeedContract.interface.functions[ - priceFeedFunctionName as keyof typeof PriceFeedContract.functions - ]; - - // Generate the function data based on the function ABI - const functionData = - PriceFeedContract.interface.encodeFunctionData(functionAbi); - - const tx = await oracleAggregatorInstance.setTokenOracle( - tokenAddress, - priceFeedAddress, - priceFeedDecimals, - functionData, - true - ); - const receipt = await tx.wait(); - console.log( - `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` - ); -} - -/* - * This function is added to support the flow with pre-deploying the deployer contract - * using the `deployer-contract.deploy.ts` script. - */ -async function getPredeployedDeployerContractInstanceDEV(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_DEV); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_DEV - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_DEV, signer); - } -} - -async function getPredeployedDeployerContractInstancePROD(): Promise { - const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS_PROD); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` - ); - throw new Error("Deployer not deployed"); - } else { - console.log( - "Deploying with EOA %s through Deployer Contract %s", - signer.address, - DEPLOYER_CONTRACT_ADDRESS_PROD - ); - return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS_PROD, signer); - } -} - -async function getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress: string -): Promise { - const code = await provider.getCode(oracleAggregatorAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `ChainlinkOracleAggregator not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("ChainlinkOracleAggregator not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - oracleAggregatorAddress - ); - return ChainlinkOracleAggregator__factory.connect( - oracleAggregatorAddress, - signer - ); - } -} - -async function getTokenPaymasterContractInstance( - tokenPaymasterAddress: string -): Promise { - const code = await provider.getCode(tokenPaymasterAddress); - const chainId = (await provider.getNetwork()).chainId; - const [signer] = await ethers.getSigners(); - - if (code === "0x") { - console.log( - `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` - ); - throw new Error("Biconomy Token Paymaster not deployed"); - } else { - console.log( - "Returning instance connected with EOA %s and address %s", - signer.address, - tokenPaymasterAddress - ); - return BiconomyTokenPaymaster__factory.connect( - tokenPaymasterAddress, - signer - ); - } -} - -async function main() { - let tx, receipt; - const provider = ethers.provider; - - const accounts = await ethers.getSigners(); - const earlyOwner = await accounts[0].getAddress(); - - const deployerInstanceDEV = await getPredeployedDeployerContractInstanceDEV(); - console.log("========================================="); - - const deployerInstancePROD = - await getPredeployedDeployerContractInstancePROD(); - console.log("========================================="); - - // 1. Deploy Chainlink Oracle Aggregator - // @note: owner is kept the deployer because we need to perform more actions on this contract using owner as part of other scripts - // @note: ownership should be transferred at the end - const oracleAggregatorAddress = await deployChainlinkOracleAggregatorContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================oracleAggregatorAddress=======================", - oracleAggregatorAddress - ); - await delay(5000); - - // 2. Deploy Token paymaster - const tokenPaymasterAddress = await deployTokenPaymasterContract( - deployerInstancePROD, - earlyOwner - ); - console.log( - "==================tokenPaymasterAddress=======================", - tokenPaymasterAddress - ); - await delay(5000); - - let oracleAggregatorInstance; - if (oracleAggregatorAddress) { - oracleAggregatorInstance = - await getChainlinkOracleAggregatorContractInstance( - oracleAggregatorAddress - ); - console.log( - "==================oracleAggregatorInstance=======================" - ); - } - - // 3a. Deploy the derived price feeds for all chainlink supported ERC20 tokens - for (const token of tokenConfig.tokens) { - const { - symbol, - address, - nativeOracleAddress, - tokenOracleAddress, - priceFeedAddress, - description, - priceFeedFunction, - feedSalt, - derivedFeed, - } = token; - let derivedPriceFeedAddress = priceFeedAddress; - - if (derivedPriceFeedAddress == "") { - derivedPriceFeedAddress = await deployDerivedPriceFeed( - deployerInstanceDEV, - nativeOracleAddress, - tokenOracleAddress, - description, - feedSalt - ); - console.log( - `==================${symbol} PriceFeedAddress=======================`, - derivedPriceFeedAddress - ); - await delay(5000); - } - - // Continue with other steps like setting token oracle, transferring ownership, etc. - // Use the derivedPriceFeedAddress and other token-specific information as needed - // ... - - // 4. Set token oracle on oracle aggregator - if (oracleAggregatorInstance) { - let feedAddress = derivedPriceFeedAddress; - if (priceFeedFunction == "latestAnswer()" || derivedFeed == false) { - feedAddress = priceFeedAddress; - } - // TODO - // This should not hardcode tokenOracleDeciamls to 18 - // It works in case of derived price feeds and chainlink feeds which are in the erc20 / native base and quote format. - await setTokenOracle( - oracleAggregatorInstance, - address, - feedAddress, - 18, - priceFeedFunction - ); - } - } - - if (tokenPaymasterAddress) { - // 5b. transfer ownership of token paymaster to the owner - const tokenPaymasterInstance = await getTokenPaymasterContractInstance( - tokenPaymasterAddress - ); - console.log( - "==================tokenPaymasterInstance=======================" - ); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/gas-calcs/deploy-sample-paymaster.ts b/scripts/gas-calcs/deploy-sample-paymaster.ts index 19c64fe..076188e 100644 --- a/scripts/gas-calcs/deploy-sample-paymaster.ts +++ b/scripts/gas-calcs/deploy-sample-paymaster.ts @@ -7,6 +7,9 @@ async function main() { const accounts = await ethers.getSigners(); const earlyOwner = await accounts[0].getAddress(); + if (earlyOwner === undefined) { + throw new Error("earlyOwner is undefined"); + } const verifyingSigner = "0x37ca4D86A0e33502F7CD93e0C88AFa2F172d39a1"; const entryPoint = process.env.ENTRY_POINT_ADDRESS || diff --git a/scripts/token-paymaster-v2/deploy-token-paymaster-mumbai.ts b/scripts/token-paymaster-v2/deploy-token-paymaster-mumbai.ts new file mode 100644 index 0000000..2ff6085 --- /dev/null +++ b/scripts/token-paymaster-v2/deploy-token-paymaster-mumbai.ts @@ -0,0 +1,243 @@ +import { ethers, run } from "hardhat"; +import { + deployContract, + DEPLOYMENT_SALTS, + encodeParam, + isContract, + delay, +} from "../utils"; +import { + BiconomyTokenPaymaster, + BiconomyTokenPaymaster__factory, + Deployer, + Deployer__factory, + ERC20__factory, +} from "../../typechain-types"; +import { mumbaiConfigInfoProd } from "../configs"; +import { TokenConfig } from "../utils/Types"; + +// TODO : add chainId key in config.json and make it unified +// filter based on chain and make single script based on chainId +const tokenConfig: TokenConfig = mumbaiConfigInfoProd; + +const provider = ethers.provider; +const contractsDeployed: Record = {}; +const entryPointAddress = + process.env.ENTRY_POINT_ADDRESS || + "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; +const verifyingSigner = process.env.PAYMASTER_SIGNER_ADDRESS_PROD || ""; +const DEPLOYER_CONTRACT_ADDRESS = + process.env.DEPLOYER_CONTRACT_ADDRESS_PROD || ""; + +export async function deployGeneric( + deployerInstance: Deployer, + salt: string, + bytecode: string, + contractName: string, + constructorArguments: any[] +): Promise { + try { + const derivedSalt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(salt)); + const computedAddress = await deployerInstance.addressOf(derivedSalt); + + console.log(`${contractName} Computed Address: ${computedAddress}`); + + const isDeployed = await isContract(computedAddress, provider); // true (deployed on-chain) + if (!isDeployed) { + await deployContract( + salt, + computedAddress, + derivedSalt, + bytecode, + deployerInstance + ); + } else { + console.log( + `${contractName} is Already deployed with address ${computedAddress}` + ); + } + + await delay(10000); + + try { + await run("verify:verify", { + address: computedAddress, + constructorArguments, + }); + } catch (err) { + console.log(err); + } + + contractsDeployed[contractName] = computedAddress; + + return computedAddress; + } catch (err) { + console.log(err); + return ""; + } +} + +async function deployTokenPaymasterContract( + deployerInstance: Deployer, + earlyOwnerAddress: string +): Promise { + try { + const tokenPaymasterAddress = await deployGeneric( + deployerInstance, + DEPLOYMENT_SALTS.TOKEN_PAYMASTER_V2, + `${BiconomyTokenPaymaster__factory.bytecode}${encodeParam( + "address", + earlyOwnerAddress + ).slice(2)}${encodeParam("address", entryPointAddress).slice( + 2 + )}${encodeParam("address", verifyingSigner).slice(2)}`, + "BiconomyTokenPaymasterV2", + [earlyOwnerAddress, entryPointAddress, verifyingSigner] + ); + return tokenPaymasterAddress; + } catch (err) { + console.log(err); + } +} + +/* + * This function is added to support the flow with pre-deploying the deployer contract + * using the `deployer-contract.deploy.ts` script. + */ +async function getPredeployedDeployerContractInstance(): Promise { + const code = await provider.getCode(DEPLOYER_CONTRACT_ADDRESS); + const chainId = (await provider.getNetwork()).chainId; + const [signer] = await ethers.getSigners(); + + if (code === "0x") { + console.log( + `Deployer not deployed on chain ${chainId}, deploy it with deployer-contract.deploy.ts script before using this script.` + ); + throw new Error("Deployer not deployed"); + } else { + console.log( + "Deploying with EOA %s through Deployer Contract %s", + signer.address, + DEPLOYER_CONTRACT_ADDRESS + ); + return Deployer__factory.connect(DEPLOYER_CONTRACT_ADDRESS, signer); + } +} + +async function setTokenOracle( + tokenPaymasterInstance: BiconomyTokenPaymaster, + tokenAddress: string, + tokenDecimals: number, + tokenOracle: string, + nativeOracle: string, + isDerivedFeed: boolean +) { + // Connect as the owner of the token paymaster + const tx = await tokenPaymasterInstance.setTokenOracle( + tokenAddress, + tokenDecimals, + tokenOracle, + nativeOracle, + isDerivedFeed + ); + const receipt = await tx.wait(); + console.log( + `Oracle set for ${tokenAddress} with tx hash ${receipt.transactionHash}` + ); +} + +async function getTokenPaymasterContractInstance( + tokenPaymasterAddress: string +): Promise { + const code = await provider.getCode(tokenPaymasterAddress); + const chainId = (await provider.getNetwork()).chainId; + const [signer] = await ethers.getSigners(); + + if (code === "0x") { + console.log( + `Biconomy Token Paymaster not deployed on chain ${chainId}, It should have been deployed as part of this script.` + ); + throw new Error("Biconomy Token Paymaster not deployed"); + } else { + console.log( + "Returning instance connected with EOA %s and address %s", + signer.address, + tokenPaymasterAddress + ); + return BiconomyTokenPaymaster__factory.connect( + tokenPaymasterAddress, + signer + ); + } +} + +async function getERC20TokenInstance(tokenAddress: string) { + const [signer] = await ethers.getSigners(); + return ERC20__factory.connect(tokenAddress, signer); +} + +async function main() { + const accounts = await ethers.getSigners(); + const earlyOwner = await accounts[0].getAddress(); + if (earlyOwner === undefined) { + throw new Error("earlyOwner is undefined"); + } + + const deployerInstance = await getPredeployedDeployerContractInstance(); + console.log("========================================="); + + // Deploy Token paymaster + const tokenPaymasterAddress = await deployTokenPaymasterContract( + deployerInstance, + earlyOwner + ); + console.log( + "==================tokenPaymasterAddress=======================", + tokenPaymasterAddress + ); + + let tokenPaymasterInstance; + if (tokenPaymasterAddress) { + tokenPaymasterInstance = await getTokenPaymasterContractInstance( + tokenPaymasterAddress + ); + console.log( + "==================tokenPaymasterInstance=======================" + ); + } + + for (const token of tokenConfig.tokens) { + // Note: In the config priceFeedAddress becomes the tokenOracleAddress + const { + // symbol, + address, + nativeOracleAddress, + tokenOracleAddress, + derivedFeed, + } = token; + + let tokenDecimals = 18; + + if (address) { + const tokenInstance = await getERC20TokenInstance(address); + tokenDecimals = await tokenInstance.decimals(); + } else { + throw new Error("token address can not be undefined"); + } + if (tokenPaymasterInstance) { + await setTokenOracle( + tokenPaymasterInstance, + address, + tokenDecimals, + nativeOracleAddress, + tokenOracleAddress, + derivedFeed + ); + } + } +} + +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/scripts/utils/Types.ts b/scripts/utils/Types.ts index 867f494..dd07982 100644 --- a/scripts/utils/Types.ts +++ b/scripts/utils/Types.ts @@ -1,16 +1,12 @@ -export interface TokenConfig { - tokens: Token[]; -} - export interface Token { address: string; - priceFeedAddress: string; - priceFeedFunction: string; - description: string; nativeOracleAddress: string; tokenOracleAddress: string; symbol: string; - feedSalt: string; derivedFeed: boolean; // Add any other required properties for each token } + +export interface TokenConfig { + tokens: Token[]; +} diff --git a/scripts/utils/index.ts b/scripts/utils/index.ts index 03b2ba3..64153cb 100644 --- a/scripts/utils/index.ts +++ b/scripts/utils/index.ts @@ -1,14 +1,6 @@ import { ethers as hardhatEthersInstance } from "hardhat"; +import { BigNumber, BigNumberish, Contract, ethers } from "ethers"; import { - BigNumber, - BigNumberish, - Contract, - ethers, - Signer, - ContractFactory, -} from "ethers"; -import { - getContractAddress, arrayify, hexConcat, hexlify, @@ -16,6 +8,7 @@ import { keccak256, Interface, } from "ethers/lib/utils"; +// eslint-disable-next-line node/no-extraneous-import import { TransactionReceipt, Provider } from "@ethersproject/providers"; import { Deployer, Deployer__factory } from "../../typechain-types"; @@ -38,13 +31,15 @@ export enum DEPLOYMENT_SALTS { // PROD ORACLE_AGGREGATOR = "PROD_CHAINLINK_ORACLE_AGGREGATOR_V0_27062023_UT8R11e", // 0x00000f7748595e46527413574a9327942e744e91 TOKEN_PAYMASTER = "PROD_TOKEN_PAYMASTER_V0_08072023_cONP4xM", // 0x00000f7365ca6c59a2c93719ad53d567ed49c14c + TOKEN_PAYMASTER_V2 = "PROD_TOKEN_PAYMASTER_V2_04022024_cONP4xM", // 0x00000f7365ca6c59a2c93719ad53d567ed49c14c + // when using deployer DEV // ORACLE_AGGREGATOR = "DEVX_CHAINLINK_ORACLE_AGGREGATOR_V0_27062023_bBee55b", // 0x0000065b8abb967271817555f23945eedf08015c // when using deployer DEV // TOKEN_PAYMASTER = "DEVX_TOKEN_PAYMASTER_V0_08072023_h5AFKLa", // 0x0000023d6c240ae3c9610d519510004d2616c9ec - SPONSORSHIP_PAYMASTER = "PROD_SPONSORSHIP_PAYMASTER_V2", + SPONSORSHIP_PAYMASTER = "PROD_SPONSORSHIP_PAYMASTER_040124_V2", PRICE_FEED_USDC = "DEVX_PRICE_FEED_USDC_V0_27062023_uiaqdyv", // 0x000005abae3deadbe1fbd12105f950efba9eaec4 PRICE_FEED_USDT = "DEVX_PRICE_FEED_USDT_V0_27062023_dIos1Nw", // 0x000001e2c2b39542c30a3fe57c4487030bc03adf @@ -287,6 +282,14 @@ export const deployContract = async ( return "0x"; }; +export const delay = (ms: number) => { + return new Promise((resolve) => { + setTimeout(() => { + resolve(); + }, ms); + }); +}; + /** * deploy a contract using our EIP-2470 deployer. * The delpoyer is deployed (unless it is already deployed) diff --git a/test/foundry/token-paymaster/TokenPaymaster.t.sol b/test/foundry/token-paymaster/TokenPaymaster.t.sol index 6ae82e1..cf7670b 100644 --- a/test/foundry/token-paymaster/TokenPaymaster.t.sol +++ b/test/foundry/token-paymaster/TokenPaymaster.t.sol @@ -166,7 +166,6 @@ contract TokenPaymasterTest is SATestBase { entryPoint.handleOps(arraifyOps(op), dan.addr); - // todo // review fails to validate updated balances console2.log("paymaster balance after ", usdc.balanceOf(address(_btpm))); assertNotEq(usdc.balanceOf(address(sa)), 100e6); } diff --git a/test/foundry/token-paymaster/TokenPaymasterMumbai.t.sol b/test/foundry/token-paymaster/TokenPaymasterMumbai.t.sol index e50a804..e3fb4d4 100644 --- a/test/foundry/token-paymaster/TokenPaymasterMumbai.t.sol +++ b/test/foundry/token-paymaster/TokenPaymasterMumbai.t.sol @@ -165,7 +165,6 @@ contract TokenPaymasterMumbaiTest is SATestBase { entryPoint.handleOps(arraifyOps(op), dan.addr); - // todo // review fails to validate updated balances console2.log("paymaster balance after ", usdc.balanceOf(address(_btpm))); assertNotEq(usdc.balanceOf(address(sa)), 100e6); }