From 636f0c8c669109661fcb3db6f12d5f9a15039083 Mon Sep 17 00:00:00 2001 From: Daniel Simon Date: Fri, 17 Jan 2025 08:35:36 +0700 Subject: [PATCH 1/2] fix: default to SALT from env --- contracts/utils/deploy-cli.ts | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/contracts/utils/deploy-cli.ts b/contracts/utils/deploy-cli.ts index 344b3e5b1..0ade285c2 100644 --- a/contracts/utils/deploy-cli.ts +++ b/contracts/utils/deploy-cli.ts @@ -1,4 +1,4 @@ -import { $, echo, fs, minimist } from "zx"; +import { $, chalk, echo, fs, minimist } from "zx"; const HELP = ` deploy - deploy the Liquity contracts. @@ -29,13 +29,14 @@ Options: --gas-price Max fee per gas to use in transactions. --help, -h Show this help message. --mode Deploy in one of the following modes: - - complete (default) - - bold-only - - use-existing-bold - --salt SALT used for CREATE2 + - complete (default), + - bold-only, + - use-existing-bold. --open-demo-troves Open demo troves after deployment (local only). --rpc-url RPC URL to use. + --salt Use keccak256(bytes(SALT)) as CREATE2 + salt instead of block timestamp. --slow Only send a transaction after the previous one has been confirmed. --use-testnet-pricefeeds Use testnet PriceFeeds instead of real @@ -186,7 +187,7 @@ Deploying Liquity contracts with the following settings: CHAIN_ID: ${options.chainId} DEPLOYER: ${options.deployer} DEPLOYMENT_MODE: ${options.mode} - SALT: ${options.salt ? options.salt : "\u26A0 block.timestamp will be used !!"} + SALT: ${options.salt ? options.salt : chalk.yellow("block.timestamp will be used !!")} ETHERSCAN_API_KEY: ${options.etherscanApiKey && "(secret)"} LEDGER_PATH: ${options.ledgerPath} OPEN_DEMO_TROVES: ${options.openDemoTroves ? "yes" : "no"} @@ -199,10 +200,7 @@ Deploying Liquity contracts with the following settings: process.env.DEPLOYER = options.deployer; process.env.DEPLOYMENT_MODE = options.mode; - - if (options.salt) { - process.env.SALT = options.salt; - } + process.env.SALT = options.salt; if (options.openDemoTroves) { process.env.OPEN_DEMO_TROVES = "true"; @@ -344,6 +342,7 @@ async function parseArgs() { process.env.OPEN_DEMO_TROVES && process.env.OPEN_DEMO_TROVES !== "false", ); options.rpcUrl ??= process.env.RPC_URL; + options.salt ??= process.env.SALT; options.useTestnetPricefeeds ??= Boolean( process.env.USE_TESTNET_PRICEFEEDS && process.env.USE_TESTNET_PRICEFEEDS !== "false", ); From a9fedfb8b1d0d707a186b75e456cbc89098e0221 Mon Sep 17 00:00:00 2001 From: Daniel Simon Date: Fri, 17 Jan 2025 09:52:29 +0700 Subject: [PATCH 2/2] feat: ability to impersonate a deployer --- contracts/fork | 12 ++++++++++ contracts/utils/deploy-cli.ts | 43 +++++++++++++++++++++-------------- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/contracts/fork b/contracts/fork index f7ba47cdc..7d2ef4731 100755 --- a/contracts/fork +++ b/contracts/fork @@ -40,6 +40,10 @@ init_env() { [ -n "$FORK_BLOCK_NUMBER" ] || FORK_BLOCK_NUMBER=$(cast block-number --rpc-url "$FORK_URL") [ -n "$FORK_CHAIN_ID" ] || FORK_CHAIN_ID=$(cast chain-id --rpc-url "$FORK_URL") [ -n "$DEPLOYER" ] || DEPLOYER=$anvil_account_0 + + if [ ${#DEPLOYER} = 42 ]; then + impersonating=yes + fi } ensure_not_running() { @@ -59,6 +63,10 @@ start() { --chain-id "$FORK_CHAIN_ID" ) + if [ "$impersonating" = yes ]; then + anvil+=( --auto-impersonate ) + fi + nohup "${anvil[@]}" &> "$logfile" & echo $! > "$pidfile" } @@ -95,6 +103,10 @@ deploy() { # --verifier-url "http://localhost:$sourcify_port" ) + if [ "$impersonating" = yes ]; then + deploy+=( --unlocked ) + fi + # sourcify_start "${deploy[@]}" "$@" # sourcify_stop diff --git a/contracts/utils/deploy-cli.ts b/contracts/utils/deploy-cli.ts index 0ade285c2..ec273ff54 100644 --- a/contracts/utils/deploy-cli.ts +++ b/contracts/utils/deploy-cli.ts @@ -39,6 +39,9 @@ Options: salt instead of block timestamp. --slow Only send a transaction after the previous one has been confirmed. + --unlocked Used when the deployer account is unlocked + in the client (i.e. no private key or + Ledger device needed). --use-testnet-pricefeeds Use testnet PriceFeeds instead of real oracles when deploying to mainnet. --verify Verify contracts after deployment. @@ -64,6 +67,7 @@ const argv = minimist(process.argv.slice(2), { "verify", "dry-run", "slow", + "unlocked", "use-testnet-pricefeeds", ], string: [ @@ -172,12 +176,16 @@ export async function main() { } } - // Ledger signing if (options.deployer.startsWith("0x") && options.deployer.length === 42) { - forgeArgs.push("--ledger"); - if (options.ledgerPath) { - forgeArgs.push("--hd-paths"); - forgeArgs.push(options.ledgerPath); + if (options.unlocked) { + forgeArgs.push("--unlocked"); + } else { + // Ledger signing + forgeArgs.push("--ledger"); + if (options.ledgerPath) { + forgeArgs.push("--hd-paths"); + forgeArgs.push(options.ledgerPath); + } } } @@ -307,6 +315,13 @@ function safeParseInt(value: string) { return isNaN(parsed) ? undefined : parsed; } +function envBool(name: string): boolean { + return process.env[name] !== undefined + && process.env[name].length > 0 + && process.env[name] !== "false" + && process.env[name] !== "no"; +} + async function parseArgs() { const options = { chainId: safeParseInt(argv["chain-id"]), @@ -321,6 +336,7 @@ async function parseArgs() { rpcUrl: argv["rpc-url"], dryRun: argv["dry-run"], slow: argv["slow"], + unlocked: argv["unlocked"], verify: argv["verify"], verifier: argv["verifier"], verifierUrl: argv["verifier-url"], @@ -331,24 +347,17 @@ async function parseArgs() { const [networkPreset] = argv._; options.chainId ??= safeParseInt(process.env.CHAIN_ID ?? ""); - options.debug ??= Boolean( - process.env.DEBUG && process.env.DEBUG !== "false", - ); + options.debug ||= envBool("DEBUG"); options.deployer ??= process.env.DEPLOYER; options.etherscanApiKey ??= process.env.ETHERSCAN_API_KEY; options.ledgerPath ??= process.env.LEDGER_PATH; options.mode ??= process.env.DEPLOYMENT_MODE; - options.openDemoTroves ??= Boolean( - process.env.OPEN_DEMO_TROVES && process.env.OPEN_DEMO_TROVES !== "false", - ); + options.openDemoTroves ||= envBool("OPEN_DEMO_TROVES"); options.rpcUrl ??= process.env.RPC_URL; options.salt ??= process.env.SALT; - options.useTestnetPricefeeds ??= Boolean( - process.env.USE_TESTNET_PRICEFEEDS && process.env.USE_TESTNET_PRICEFEEDS !== "false", - ); - options.verify ??= Boolean( - process.env.VERIFY && process.env.VERIFY !== "false", - ); + options.unlocked ||= envBool("UNLOCKED"); + options.useTestnetPricefeeds ||= envBool("USE_TESTNET_PRICEFEEDS"); + options.verify ||= envBool("VERIFY"); options.verifier ??= process.env.VERIFIER; options.verifierUrl ??= process.env.VERIFIER_URL;