From cd6c686f4bc02ccd81ad4879e1276337941a1fd2 Mon Sep 17 00:00:00 2001 From: Antonio Date: Tue, 1 Aug 2023 15:44:48 +0100 Subject: [PATCH 01/10] docs: updated banner and info --- README.md | 50 ++++++++++++++++++++++++++---------------- zksync-cli-banner.png | Bin 0 -> 70821 bytes 2 files changed, 31 insertions(+), 19 deletions(-) create mode 100644 zksync-cli-banner.png diff --git a/README.md b/README.md index d0b913a2..4b811abd 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,33 @@ -# zkSync CLI tool +
-This CLI tool simplifies the process of developing applications and interacting with zkSync 2.0. +# ‣ zkSync Era CLI -## Requirements +![zksync cli](./zksync-cli-banner.png) -- Node/NPM +This CLI tool simplifies the process of developing applications and interacting with zkSync Era. + +[Report a bug](https://github.com/matter-labs/zksync-cli/issues/new) | [Request a feature](https://github.com/matter-labs/zksync-cli/issues/new) + +[pr-welcome]: https://img.shields.io/static/v1?color=indigo&label=PRs&style=flat&message=welcome + +
+ +## 🛠 Prerequisites + +- Node.js v18.x / NPM - Yarn -## Usage +## 📥 Installation -You can install this program globally with `npm i -g zksync-cli` or run the commands direcly with npx with `npx zksync-cli@latest {COMMAND}`. +You can install this program globally with `npm i -g zksync-cli` or run the commands direcly via NPX with `npx zksync-cli@latest {COMMAND}`. -### Commands +## 💻 Commands - `zksync-cli help`: Provides detailed information about each command. -- `zksync-cli create {PROJECT_NAME}`: creates a new Hardhat project in the given project name. If not provided, creates the project in the current folder, although this requires the folder to be empty. +- `zksync-cli create {PROJECT_NAME}`: creates a new project in the given project name. If not provided, creates the project in the current folder, although this requires the folder to be empty. -- `zksync-cli deposit`: deposits funds from L1 (Goerli testnet) to zkSync 2.0 testnet. It will ask to enter: network, recipient wallet, amount in ETH (eg 0.1) and the private key of the wallet you're sending the funds from. +- `zksync-cli deposit`: deposits funds from L1 to L2 (local, testnet or mainnet). It will ask to enter: network, recipient wallet, amount in ETH (eg 0.1) and the private key of the wallet you're sending the funds from. - `zksync-cli withdraw`: withdraws funds from zkSync 2.0 to L1 (Goerli testnet). It will ask to enter: network, recipient wallet, amount in ETH (eg 0.1) and the private key of the wallet you're sending the funds from. @@ -25,21 +35,21 @@ You can install this program globally with `npm i -g zksync-cli` or run the comm - `zksync-cli --help`: Provides detailed information about how to use a specific command. Replace with the name of the command you want help with (e.g., create, deposit, withdraw, confirm-withdraw). -> Both deposit and withdraw might take a couple of minutes to complete. +- `zksync-cli --version`: Returns the current version. -### Options (flags) +### ⚙️ Options (flags) - `--zeek`: zeek, the dev cat, will search for an inspirational quote and provide to you at the end of any command. -- `--l1-rpc-url`: override the default Goerli L1 rpc URL when `localnet` is selected as the network. -- `--l2-rpc-url`: override the default zkSync testnet rpc URL when `localnet` is selected as the network. +- `--l1-rpc-url`: override the default L1 rpc URL when `localnet` is selected as the network. +- `--l2-rpc-url`: override the default L2 rpc URL when `localnet` is selected as the network. -## Developing new features +## 👩‍💻 Developing new features ### Install and build -Install all dendencies with `npm i`. -This project was build with Typescript. Run `npm run build` to compile code in `/src` into `/bin`. +1. Install all dendencies with `npm i`. +2. This project was build with Typescript. Run `npm run build` to compile code in `/src` into `/bin`. To create a version run: @@ -50,14 +60,16 @@ git push --tags ### Testing +> ⚠️ This project does not have unit tests yet 🤕 + Proper tests will be included soon. For now, you can test new changes locally by installing this package globably with `npm i -g`. -### Tracking +### 📊 Tracking -zkSync-cli tracks its usage for the single purpose of providing data so it can be improved. Data is fully anonymized. If you want to disable the tracking, set the environment variable NO_TRACKING to true. +zkSync-cli tracks its usage for the single purpose of providing data so it can be improved. Data is fully anonymized. If you want to disable the tracking, set the environment variable NO_TRACKING to `true`. -## Official Links +## 🌍 Official Links - [Website](https://zksync.io/) - [GitHub](https://github.com/matter-labs) diff --git a/zksync-cli-banner.png b/zksync-cli-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa80b124f408998217c03088d91551489e9ab2f GIT binary patch literal 70821 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 literal 0 HcmV?d00001 From fff83372e31609f6df6c14a998837d7fe636777e Mon Sep 17 00:00:00 2001 From: Antonio Date: Tue, 1 Aug 2023 15:45:32 +0100 Subject: [PATCH 02/10] docs: removes hardhat for future templates --- src/create.ts | 4 ++-- src/help.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/create.ts b/src/create.ts index 138bf6a2..df2c288d 100644 --- a/src/create.ts +++ b/src/create.ts @@ -25,9 +25,9 @@ export const help = () => { console.log("zksync-cli create \n"); console.log(chalk.bold(`Description:`)); console.log( - `Creates a new Hardhat project in the provided folder. If no folder is specified, it will create the project in the current folder, provided it's empty.\n` + `Creates a new project in the provided folder. If no folder is specified, it will create the project in the current folder, provided it's empty.\n` ); -} +}; export default async function (projectName: string, zeek?: boolean) { const questions: QuestionCollection = [ diff --git a/src/help.ts b/src/help.ts index c4bd8a5f..57783180 100644 --- a/src/help.ts +++ b/src/help.ts @@ -11,7 +11,7 @@ export default async function () { console.log(chalk.bold(`Commands:\n`)); console.log(chalk.greenBright(`create `)); console.log( - `Creates a new Hardhat project in the provided folder. If no folder is specified, it will create the project in the current folder, provided it's empty.\n` + `Creates a new project in the provided folder. If no folder is specified, it will create the project in the current folder, provided it's empty.\n` ); console.log(chalk.greenBright(`deposit`)); console.log( From 591aab2d9e0509d2d6e9d219ced152126dab56da Mon Sep 17 00:00:00 2001 From: Antonio Date: Tue, 1 Aug 2023 15:51:58 +0100 Subject: [PATCH 03/10] fix: deposit and withdraw in localnet --- src/deposit.ts | 27 ++++++++++++++++----------- src/index.ts | 24 ++++++++++++++++++++---- src/withdraw.ts | 29 +++++++++++++++++------------ 3 files changed, 53 insertions(+), 27 deletions(-) diff --git a/src/deposit.ts b/src/deposit.ts index fe68e4fa..6b5318d2 100644 --- a/src/deposit.ts +++ b/src/deposit.ts @@ -13,15 +13,18 @@ export const help = () => { console.log( `Deposits funds from L1 to L2. The command will ask for the network, the recipient's address, the amount in ETH, and the sender's private key.\n` ); - console.log(chalk.bold(`Options:`)); + console.log(chalk.bold(`Options (ONLY for localnet):`)); console.log(chalk.greenBright(`--l1-rpc-url=`)); console.log(`The URL of the L1 RPC provider.\n`); console.log(chalk.greenBright(`--l2-rpc-url=`)); console.log(`The URL of the L2 RPC provider.\n`); -} - -export default async function (zeek?: boolean, l1RpcUrl?: string, l2RpcUrl?: string) { +}; +export default async function ( + zeek?: boolean, + l1RpcUrl?: string, + l2RpcUrl?: string +) { console.log(chalk.magentaBright("Deposit funds from L1 to zkSync")); const questions: QuestionCollection = [ @@ -79,9 +82,9 @@ export default async function (zeek?: boolean, l1RpcUrl?: string, l2RpcUrl?: str break; case "localnet": ethProviderUrl = - l1RpcUrl == undefined ? "http://localhost:8545" : l1RpcUrl; + l1RpcUrl == undefined ? l1RpcUrl : "http://localhost:8545"; zksyncProviderUrl = - l2RpcUrl == undefined ? "http://localhost:3050" : l2RpcUrl; + l2RpcUrl == undefined ? l2RpcUrl : "http://localhost:3050"; etherScanUrl = "L1 transaction: "; zkSyncExplorerUrl = "L2 address:"; break; @@ -115,11 +118,13 @@ export default async function (zeek?: boolean, l1RpcUrl?: string, l2RpcUrl?: str `Your funds will be available in zkSync in a couple of minutes.` ) ); - console.log( - chalk.magentaBright( - `To check the latest transactions of this wallet on zkSync, visit: ${zkSyncExplorerUrl}${results.to}` - ) - ); + if (results.network != "localnet") { + console.log( + chalk.magentaBright( + `To check the latest transactions of this wallet on zkSync, visit: ${zkSyncExplorerUrl}${results.to}` + ) + ); + } await track("deposit", { zeek, network: results.network }); } catch (error) { console.error(`Error depositing funds 🤕`); diff --git a/src/index.ts b/src/index.ts index 2e097b50..aa50d1c3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,12 +5,15 @@ import chalk from "chalk"; // @ts-ignore // const figlet = require('figlet'); import figlet from "figlet"; +import * as pkg from "../package.json"; // import method to create projects import create, { help as createHelp } from "./create"; import deposit, { help as depositHelp } from "./deposit"; import withdraw, { help as withdrawHelp } from "./withdraw"; -import confirmWithdraw, { help as confirmWithdrawalHelp } from "./confirm-withdraw"; +import confirmWithdraw, { + help as confirmWithdrawalHelp, +} from "./confirm-withdraw"; import zeek from "./zeek"; import help from "./help"; @@ -26,7 +29,20 @@ const availableOptions: string[] = [ const option: string = process.argv[2]; const main = async () => { - const helpFlag = Boolean(process.argv.filter((arg) => ["--help", "-h"].includes(arg))[0]); + const helpFlag = Boolean( + process.argv.filter((arg) => ["--help", "-h"].includes(arg))[0] + ); + const versionFlag = Boolean( + process.argv.filter((arg) => ["--version", "-v"].includes(arg))[0] + ); + console.log("helpFlag :>> ", helpFlag); + console.log("versionFlag :>> ", versionFlag); + + if (versionFlag) { + console.log(chalk.magentaBright(`zksync-cli version ${pkg.version}`)); + process.exit(0); + } + if (!availableOptions.includes(option)) { console.log( `Invalid operation. Available operations are: ${availableOptions}` @@ -45,12 +61,12 @@ const main = async () => { const zeekFlag = Boolean(process.argv.filter((arg) => arg === "--zeek")[0]); const l1RpcUrl = String( process.argv - .filter((arg) => arg.startsWith("l1-rpc-url")) + .filter((arg) => arg.startsWith("--l1-rpc-url")) .map((arg) => arg.split("=")[1])[0] ); const l2RpcUrl = String( process.argv - .filter((arg) => arg.startsWith("l2-rpc-url")) + .filter((arg) => arg.startsWith("--l2-rpc-url")) .map((arg) => arg.split("=")[1])[0] ); diff --git a/src/withdraw.ts b/src/withdraw.ts index f96307a0..5aa796c3 100644 --- a/src/withdraw.ts +++ b/src/withdraw.ts @@ -12,16 +12,19 @@ export const help = () => { console.log( `Withdraws funds from L2 to L1. The command will ask for the network, the recipient's address, the amount in ETH, and the sender's private key.\n` ); - console.log(chalk.bold(`Options:`)); + console.log(chalk.bold(`Options (ONLY for localnet):`)); console.log(chalk.greenBright(`--l1-rpc-url=`)); console.log(`The URL of the L1 RPC provider.\n`); console.log(chalk.greenBright(`--l2-rpc-url=`)); console.log(`The URL of the L2 RPC provider.\n`); -} - -export default async function (zeek?: boolean, l1RpcUrl?: string, l2RpcUrl?: string) { +}; - console.log(chalk.magentaBright('Withdraw funds from zkSync to Goerli')); +export default async function ( + zeek?: boolean, + l1RpcUrl?: string, + l2RpcUrl?: string +) { + console.log(chalk.magentaBright("Withdraw funds from zkSync to L1")); const questions: QuestionCollection = [ { @@ -73,9 +76,9 @@ export default async function (zeek?: boolean, l1RpcUrl?: string, l2RpcUrl?: str break; case "localnet": ethProviderUrl = - l1RpcUrl == undefined ? "http://localhost:8545" : l1RpcUrl; + l1RpcUrl == undefined ? l1RpcUrl : "http://localhost:8545"; zksyncProviderUrl = - l2RpcUrl == undefined ? "http://localhost:3050" : l2RpcUrl; + l2RpcUrl == undefined ? l2RpcUrl : "http://localhost:3050"; zkSyncExplorerUrl = "L2: "; break; default: @@ -110,11 +113,13 @@ export default async function (zeek?: boolean, l1RpcUrl?: string, l2RpcUrl?: str `Your funds will be available in L1 in a couple of minutes.` ) ); - console.log( - chalk.magentaBright( - `To check the latest transactions of this wallet on zkSync, visit: ${zkSyncExplorerUrl}address/${results.to}` - ) - ); + if (results.network != "localnet") { + console.log( + chalk.magentaBright( + `To check the latest transactions of this wallet on zkSync, visit: ${zkSyncExplorerUrl}address/${results.to}` + ) + ); + } await track("withdraw", { zeek, network: results.network }); } catch (error) { From 68eaec8914df81f70ae6ec3ce08ae67404bb8b2f Mon Sep 17 00:00:00 2001 From: Antonio Date: Tue, 1 Aug 2023 16:45:45 +0100 Subject: [PATCH 04/10] feat: adds balance check in deposit and withdraw --- src/deposit.ts | 4 ++++ src/utils.ts | 15 +++++++++++++++ src/withdraw.ts | 5 +++++ 3 files changed, 24 insertions(+) create mode 100644 src/utils.ts diff --git a/src/deposit.ts b/src/deposit.ts index 6b5318d2..c1b7afad 100644 --- a/src/deposit.ts +++ b/src/deposit.ts @@ -5,6 +5,8 @@ import chalk from "chalk"; import inquirer, { Answers, QuestionCollection } from "inquirer"; import { track } from "./analytics"; +import { checkBalance } from "./utils"; + // Used for `zksync-cli deposit --help` export const help = () => { console.log(chalk.bold("Usage:")); @@ -100,6 +102,8 @@ export default async function ( ? (L1Provider = new ethers.providers.JsonRpcProvider(ethProviderUrl)) : (L1Provider = ethers.getDefaultProvider(ethProviderUrl)); + await checkBalance(results.to, results.amount, L1Provider); + const zkSyncProvider = new Provider(zksyncProviderUrl); // Initialize the wallet. const wallet = new Wallet(results.key, zkSyncProvider, L1Provider); diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 00000000..43aff2e2 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,15 @@ +import { ethers, utils } from "ethers"; +import { track } from "./analytics"; + +export const checkBalance = async function ( + address: string, + amount: string, + provider: ethers.providers.BaseProvider +) { + const balance = await provider.getBalance(address); + if (utils.parseEther(amount).gte(balance)) { + console.error(`Error: Not enough balance 🤕`); + await track("error", { error: `Not enough balance` }); + process.exit(-1); + } +}; diff --git a/src/withdraw.ts b/src/withdraw.ts index 5aa796c3..ad61f86b 100644 --- a/src/withdraw.ts +++ b/src/withdraw.ts @@ -4,6 +4,8 @@ import chalk from "chalk"; import inquirer, { Answers, QuestionCollection } from "inquirer"; import { track } from "./analytics"; +import { checkBalance } from "./utils"; + // Used for `zksync-cli withdraw --help` export const help = () => { console.log(chalk.bold("Usage:")); @@ -94,6 +96,9 @@ export default async function ( : (L1Provider = ethers.getDefaultProvider(ethProviderUrl)); const zkSyncProvider = new Provider(zksyncProviderUrl); + + await checkBalance(results.to, results.amount, zkSyncProvider); + // Initialize the wallet. const wallet = new Wallet(results.key, zkSyncProvider, L1Provider); From b703ecc75cb1c3cc2ea08a0479c97a25a052033a Mon Sep 17 00:00:00 2001 From: Antonio Date: Tue, 1 Aug 2023 17:06:03 +0100 Subject: [PATCH 05/10] removes logs --- src/index.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index aa50d1c3..bca69be9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -35,8 +35,6 @@ const main = async () => { const versionFlag = Boolean( process.argv.filter((arg) => ["--version", "-v"].includes(arg))[0] ); - console.log("helpFlag :>> ", helpFlag); - console.log("versionFlag :>> ", versionFlag); if (versionFlag) { console.log(chalk.magentaBright(`zksync-cli version ${pkg.version}`)); From 7ec6b511d8a1dce43428552b1626a02c5ad44b5e Mon Sep 17 00:00:00 2001 From: Antonio Date: Tue, 1 Aug 2023 17:08:11 +0100 Subject: [PATCH 06/10] fix: discord url --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4b811abd..2d93fee1 100644 --- a/README.md +++ b/README.md @@ -74,4 +74,4 @@ zkSync-cli tracks its usage for the single purpose of providing data so it can b - [Website](https://zksync.io/) - [GitHub](https://github.com/matter-labs) - [Twitter](https://twitter.com/zksync) -- [Discord](https://discord.gg/nMaPGrDDwk) +- [Discord](https://join.zksync.dev/) From ccb8e7246a32b8dfae13fea591bec39d4a1d4eaf Mon Sep 17 00:00:00 2001 From: Antonio Date: Tue, 1 Aug 2023 17:23:32 +0100 Subject: [PATCH 07/10] fix: check balance of source account --- src/deposit.ts | 3 +-- src/utils.ts | 3 ++- src/withdraw.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/deposit.ts b/src/deposit.ts index c1b7afad..250eaeb8 100644 --- a/src/deposit.ts +++ b/src/deposit.ts @@ -102,11 +102,10 @@ export default async function ( ? (L1Provider = new ethers.providers.JsonRpcProvider(ethProviderUrl)) : (L1Provider = ethers.getDefaultProvider(ethProviderUrl)); - await checkBalance(results.to, results.amount, L1Provider); - const zkSyncProvider = new Provider(zksyncProviderUrl); // Initialize the wallet. const wallet = new Wallet(results.key, zkSyncProvider, L1Provider); + await checkBalance(wallet.address, results.amount, L1Provider); // Deposit funds to L2 const depositHandle: PriorityOpResponse = await wallet.deposit({ diff --git a/src/utils.ts b/src/utils.ts index 43aff2e2..1196f4f7 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,10 +1,11 @@ import { ethers, utils } from "ethers"; +import { Provider } from "zksync-web3"; import { track } from "./analytics"; export const checkBalance = async function ( address: string, amount: string, - provider: ethers.providers.BaseProvider + provider: Provider | ethers.providers.BaseProvider ) { const balance = await provider.getBalance(address); if (utils.parseEther(amount).gte(balance)) { diff --git a/src/withdraw.ts b/src/withdraw.ts index ad61f86b..3be3d732 100644 --- a/src/withdraw.ts +++ b/src/withdraw.ts @@ -97,11 +97,11 @@ export default async function ( const zkSyncProvider = new Provider(zksyncProviderUrl); - await checkBalance(results.to, results.amount, zkSyncProvider); - // Initialize the wallet. const wallet = new Wallet(results.key, zkSyncProvider, L1Provider); + await checkBalance(wallet.address, results.amount, zkSyncProvider); + // Withdraw funds to L1 const withdrawHandle = await wallet.withdraw({ to: results.to, From 77e588ffb6693376b5363a671009d3f1dead9430 Mon Sep 17 00:00:00 2001 From: Antonio Date: Wed, 2 Aug 2023 11:36:08 +0100 Subject: [PATCH 08/10] feat: bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a68f7282..df40f1a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "zksync-cli", - "version": "0.1.4", + "version": "0.2.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "zksync-cli", - "version": "0.1.4", + "version": "0.2.3", "license": "MIT", "dependencies": { "@rudderstack/rudder-sdk-node": "^2.0.2", diff --git a/package.json b/package.json index 7bd81109..fcb1353d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zksync-cli", - "version": "0.2.3", + "version": "0.2.4", "description": "CLI tool that simplifies the process of developing applications and interacting with the zkSync Era Network", "main": "bin/index.js", "bin": { From b43351128e97b5f9d850988aba87d0fd210c2cc1 Mon Sep 17 00:00:00 2001 From: Antonio Date: Wed, 2 Aug 2023 12:41:01 +0100 Subject: [PATCH 09/10] docs: flags documented --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2d93fee1..b70cbc51 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,8 @@ You can install this program globally with `npm i -g zksync-cli` or run the comm ### ⚙️ Options (flags) - `--zeek`: zeek, the dev cat, will search for an inspirational quote and provide to you at the end of any command. -- `--l1-rpc-url`: override the default L1 rpc URL when `localnet` is selected as the network. -- `--l2-rpc-url`: override the default L2 rpc URL when `localnet` is selected as the network. +- `--l1-rpc-url`: override the default L1 rpc URL when `localnet` is selected as the network. Usage `--l1-rpc-url=http://...`. +- `--l2-rpc-url`: override the default L2 rpc URL when `localnet` is selected as the network. Usage `--l1-rpc-url=http://...`. ## 👩‍💻 Developing new features From a8422d8c599314a5a18f637321289d43473cdba3 Mon Sep 17 00:00:00 2001 From: Antonio Date: Wed, 2 Aug 2023 14:46:32 +0100 Subject: [PATCH 10/10] fix: url flags check --- src/confirm-withdraw.ts | 16 ++++++++-------- src/deposit.ts | 10 ++++------ src/index.ts | 17 +++++++---------- src/withdraw.ts | 10 ++++------ 4 files changed, 23 insertions(+), 30 deletions(-) diff --git a/src/confirm-withdraw.ts b/src/confirm-withdraw.ts index 3b11b812..11306848 100644 --- a/src/confirm-withdraw.ts +++ b/src/confirm-withdraw.ts @@ -7,7 +7,9 @@ import { track } from "./analytics"; // Used for `zksync-cli confirm-withdraw --help` export const help = () => { console.log(chalk.bold("Usage:")); - console.log("zksync-cli confirm-withdraw --l1-rpc-url= --l2-rpc-url=\n"); + console.log( + "zksync-cli confirm-withdraw --l1-rpc-url= --l2-rpc-url=\n" + ); console.log(chalk.bold(`Description:`)); console.log( `Confirms the withdrawal of funds from zkSync to L1. The command will ask for the network, the zkSync transaction address, and the sender's private key.\n` @@ -17,12 +19,12 @@ export const help = () => { console.log(`The URL of the L1 RPC provider.\n`); console.log(chalk.greenBright(`--l2-rpc-url=`)); console.log(`The URL of the L2 RPC provider.\n`); -} +}; export default async function ( zeek?: boolean, - l1RpcUrl?: string, - l2RpcUrl?: string + l1RpcUrl?: string | undefined, + l2RpcUrl?: string | undefined ) { console.log( chalk.magentaBright("Confirm withdrawal funds from zkSync to Layer 1") @@ -69,10 +71,8 @@ export default async function ( zksyncProviderUrl = "https://testnet.era.zksync.dev"; break; case "localnet": - ethProviderUrl = - l1RpcUrl == undefined ? "http://localhost:8545" : l1RpcUrl; - zksyncProviderUrl = - l2RpcUrl == undefined ? "http://localhost:3050" : l2RpcUrl; + ethProviderUrl = !l1RpcUrl ? "http://localhost:8545" : l1RpcUrl; + zksyncProviderUrl = !l2RpcUrl ? "http://localhost:3050" : l2RpcUrl; break; default: throw `Unsupported network ${results.network}`; diff --git a/src/deposit.ts b/src/deposit.ts index 250eaeb8..4b0f8c57 100644 --- a/src/deposit.ts +++ b/src/deposit.ts @@ -24,8 +24,8 @@ export const help = () => { export default async function ( zeek?: boolean, - l1RpcUrl?: string, - l2RpcUrl?: string + l1RpcUrl?: string | undefined, + l2RpcUrl?: string | undefined ) { console.log(chalk.magentaBright("Deposit funds from L1 to zkSync")); @@ -83,10 +83,8 @@ export default async function ( zkSyncExplorerUrl = "https://goerli.explorer.zksync.io/address/"; break; case "localnet": - ethProviderUrl = - l1RpcUrl == undefined ? l1RpcUrl : "http://localhost:8545"; - zksyncProviderUrl = - l2RpcUrl == undefined ? l2RpcUrl : "http://localhost:3050"; + ethProviderUrl = !l1RpcUrl ? "http://localhost:8545" : l1RpcUrl; + zksyncProviderUrl = !l2RpcUrl ? "http://localhost:3050" : l2RpcUrl; etherScanUrl = "L1 transaction: "; zkSyncExplorerUrl = "L2 address:"; break; diff --git a/src/index.ts b/src/index.ts index bca69be9..c5ff8f68 100644 --- a/src/index.ts +++ b/src/index.ts @@ -57,16 +57,13 @@ const main = async () => { ); const zeekFlag = Boolean(process.argv.filter((arg) => arg === "--zeek")[0]); - const l1RpcUrl = String( - process.argv - .filter((arg) => arg.startsWith("--l1-rpc-url")) - .map((arg) => arg.split("=")[1])[0] - ); - const l2RpcUrl = String( - process.argv - .filter((arg) => arg.startsWith("--l2-rpc-url")) - .map((arg) => arg.split("=")[1])[0] - ); + const l1RpcUrl = process.argv + .filter((arg) => arg.startsWith("--l1-rpc-url")) + .map((arg) => arg.split("=")[1])[0]; + + const l2RpcUrl = process.argv + .filter((arg) => arg.startsWith("--l2-rpc-url")) + .map((arg) => arg.split("=")[1])[0]; if (helpFlag) { switch (option) { diff --git a/src/withdraw.ts b/src/withdraw.ts index 3be3d732..e6039fe0 100644 --- a/src/withdraw.ts +++ b/src/withdraw.ts @@ -23,8 +23,8 @@ export const help = () => { export default async function ( zeek?: boolean, - l1RpcUrl?: string, - l2RpcUrl?: string + l1RpcUrl?: string | undefined, + l2RpcUrl?: string | undefined ) { console.log(chalk.magentaBright("Withdraw funds from zkSync to L1")); @@ -77,10 +77,8 @@ export default async function ( zkSyncExplorerUrl = "https://goerli.explorer.zksync.io/"; break; case "localnet": - ethProviderUrl = - l1RpcUrl == undefined ? l1RpcUrl : "http://localhost:8545"; - zksyncProviderUrl = - l2RpcUrl == undefined ? l2RpcUrl : "http://localhost:3050"; + ethProviderUrl = !l1RpcUrl ? "http://localhost:8545" : l1RpcUrl; + zksyncProviderUrl = !l2RpcUrl ? "http://localhost:3050" : l2RpcUrl; zkSyncExplorerUrl = "L2: "; break; default: