diff --git a/scripts/1-deploy-token-paymaster.ts b/scripts/1-deploy-token-paymaster.ts index f606894..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,14 +16,6 @@ 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 @@ -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/8-deploy-sponsorship-paymaster.ts b/scripts/8-deploy-sponsorship-paymaster.ts index 177ebf2..0dbc13f 100644 --- a/scripts/8-deploy-sponsorship-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/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 index d7b1724..2ff6085 100644 --- a/scripts/token-paymaster-v2/deploy-token-paymaster-mumbai.ts +++ b/scripts/token-paymaster-v2/deploy-token-paymaster-mumbai.ts @@ -4,6 +4,7 @@ import { DEPLOYMENT_SALTS, encodeParam, isContract, + delay, } from "../utils"; import { BiconomyTokenPaymaster, @@ -20,6 +21,7 @@ import { TokenConfig } from "../utils/Types"; const tokenConfig: TokenConfig = mumbaiConfigInfoProd; const provider = ethers.provider; +const contractsDeployed: Record = {}; const entryPointAddress = process.env.ENTRY_POINT_ADDRESS || "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; @@ -27,66 +29,72 @@ 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( +export async function deployGeneric( deployerInstance: Deployer, - earlyOwnerAddress: string -): Promise { + salt: string, + bytecode: string, + contractName: string, + constructorArguments: any[] +): Promise { try { - const salt = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(DEPLOYMENT_SALTS.TOKEN_PAYMASTER_V2) - ); + const derivedSalt = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(salt)); + const computedAddress = await deployerInstance.addressOf(derivedSalt); - 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) { + console.log(`${contractName} Computed Address: ${computedAddress}`); + + const isDeployed = await isContract(computedAddress, provider); // true (deployed on-chain) + if (!isDeployed) { await deployContract( - DEPLOYMENT_SALTS.TOKEN_PAYMASTER, - tokenPaymasterComputedAddr, salt, - tokenPaymasterBytecode, + computedAddress, + derivedSalt, + bytecode, deployerInstance ); - await delay(5000); - await run(`verify:verify`, { - address: tokenPaymasterComputedAddr, - constructorArguments: [ - earlyOwnerAddress, - entryPointAddress, - verifyingSigner, - ], - }); } else { console.log( - "Token Paymaster is Already deployed with address ", - tokenPaymasterComputedAddr + `${contractName} is Already deployed with address ${computedAddress}` ); } - return tokenPaymasterComputedAddr; + + 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); } @@ -171,6 +179,9 @@ async function getERC20TokenInstance(tokenAddress: string) { 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("========================================="); @@ -198,7 +209,7 @@ async function main() { for (const token of tokenConfig.tokens) { // Note: In the config priceFeedAddress becomes the tokenOracleAddress const { - symbol, + // symbol, address, nativeOracleAddress, tokenOracleAddress, 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 cb7febe..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,7 +31,7 @@ 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_02012024_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 @@ -289,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)