diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 715a479db..0c1898086 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -6,6 +6,7 @@ import '@nomiclabs/hardhat-ethers' import 'hardhat-deploy'; import '@nomiclabs/hardhat-etherscan'; import '@nomicfoundation/hardhat-chai-matchers' +import './tasks'; import { HardhatUserConfig } from "hardhat/config"; diff --git a/contracts/package.json b/contracts/package.json index 1f0c5b31e..619fa4219 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -19,6 +19,7 @@ "etherscan:goerli": "yarn hardhat --network goerli etherscan-verify", "etherscan:base": "yarn hardhat --network base etherscan-verify", "etherscan:base_staging": "yarn hardhat --network base_staging etherscan-verify", + "genKeyUpdateCalldata": "npx hardhat genKeyUpdateCalldata", "importVerifier": "rm -rf ./contracts/verifiers/ && cp -r ../circuits-circom/contracts ./contracts/verifiers", "test": "npx hardhat test test/libs/*.ts test/processors/*.ts test/ramps/**/*.ts", "test:clean": "yarn build && yarn test", diff --git a/contracts/tasks/genKeyUpdateCalldata.ts b/contracts/tasks/genKeyUpdateCalldata.ts new file mode 100644 index 000000000..3e4575adc --- /dev/null +++ b/contracts/tasks/genKeyUpdateCalldata.ts @@ -0,0 +1,67 @@ +import { task } from "hardhat/config"; +import { HardhatRuntimeEnvironment as HRE } from "hardhat/types"; +import * as readline from 'readline'; + +import { + ManagedKeyHashAdapter__factory, + ManagedKeyHashAdapterV2__factory +} from "../typechain/factories/contracts/processors/keyHashAdapters/index"; +import { PaymentProviders } from "../utils/types" + +task("genKeyUpdateCalldata", "Add a manufacturer to the ManufacturerRegistry") + .addParam("hash", "Hash of the modulus of the new domain key") + .setAction(async (taskArgs, hre: HRE) => { + // Generate the calldata for adding a new domain key to the ManagedKeyHashAdapter + const hash = taskArgs.hash; + const [ defaultAccount ] = await hre.getUnnamedAccounts(); + + // Allow script caller to select the payment provider they want to use + const paymentNetwork = await getPaymentNetwork(); + + let calldata; + if (paymentNetwork === "Venmo") { + calldata = ManagedKeyHashAdapter__factory.connect( + defaultAccount, + hre.ethers.provider + ).interface.encodeFunctionData("setMailserverKeyHash", [hash]); + } else { + calldata = ManagedKeyHashAdapterV2__factory.connect( + defaultAccount, + hre.ethers.provider + ).interface.encodeFunctionData("addMailServerKeyHash", [hash]); + } + + console.log(calldata); + }); + +// A utility function to prompt the user for input +async function getPaymentNetwork(): Promise { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }); + + const paymentProviderList = Object.keys(PaymentProviders); + + const baseQuestion = `Type the name of the payment provider you want to use: \n`; + const question = paymentProviderList.reduce((acc, curr) => { + return `${acc} - ${curr}\n`; + }, baseQuestion); + const paymentNetwork = await queryUser(rl, question); + + if (!paymentProviderList.includes(paymentNetwork)) { + console.log("Invalid payment provider. Please try again."); + return await getPaymentNetwork(); + } + + return paymentNetwork; +}; + +// A utility function to prompt the user for input +function queryUser(rl: readline.ReadLine, question: string): Promise { + return new Promise(resolve => { + rl.question(question, (answer) => { + resolve(answer); + }); + }); +}; diff --git a/contracts/tasks/index.ts b/contracts/tasks/index.ts new file mode 100644 index 000000000..774fa25da --- /dev/null +++ b/contracts/tasks/index.ts @@ -0,0 +1 @@ +export * from './genKeyUpdateCalldata';