From b96fdf7bd557fcd328a83ca86ca8e7369b222b1a Mon Sep 17 00:00:00 2001 From: Eugene M Date: Mon, 13 Nov 2023 16:21:24 +0300 Subject: [PATCH 01/18] fix: change not found handling allow Diffyscan to proceed further use red highlight for the table --- main.py | 15 +++++++++++---- utils/common.py | 1 - utils/github.py | 11 ++++++----- utils/logger.py | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/main.py b/main.py index 392ddf6..57ae578 100644 --- a/main.py +++ b/main.py @@ -20,7 +20,9 @@ def run_diff(config, name, address, explorer_api_token, github_api_token): logger.divider() - logger.info(f"Fetching source code from blockchain explorer {config['explorer_hostname']} ...") + logger.info( + f"Fetching source code from blockchain explorer {config['explorer_hostname']} ..." + ) contract_name, source_files = get_contract_from_explorer( token=explorer_api_token, explorer_hostname=config["explorer_hostname"], @@ -66,7 +68,14 @@ def run_diff(config, name, address, explorer_api_token, github_api_token): logger.error("File not found", path_to_file) sys.exit() - github_file = get_file_from_github(github_api_token, repo, path_to_file, dep_name) + file_found = bool(repo) + + github_file = get_file_from_github( + github_api_token, repo, path_to_file, dep_name + ) + if not github_file: + github_file = "" + file_found = False github_lines = github_file.splitlines() explorer_lines = source_code["content"].splitlines() @@ -81,8 +90,6 @@ def run_diff(config, name, address, explorer_api_token, github_api_token): diffs = difflib.unified_diff(github_lines, explorer_lines) diffs_count = len(list(diffs)) - file_found = bool(repo) - report_data = [ file_number, filename, diff --git a/utils/common.py b/utils/common.py index 925d1b4..08a8ef2 100644 --- a/utils/common.py +++ b/utils/common.py @@ -46,7 +46,6 @@ def fetch(url, headers={}): logger.error("Request failed", url) logger.error("Status", response.status_code) logger.error("Response", response.text) - sys.exit() return response.json() diff --git a/utils/github.py b/utils/github.py index 5a32010..bf21877 100644 --- a/utils/github.py +++ b/utils/github.py @@ -2,16 +2,15 @@ from utils.common import fetch, parse_repo_link from utils.logger import logger + def get_file_from_github(github_api_token, dependency_repo, path_to_file, dep_name): path_to_file = path_to_file_without_dependency(path_to_file, dep_name) - user_slash_repo = parse_repo_link(dependency_repo['url']) + user_slash_repo = parse_repo_link(dependency_repo["url"]) - github_api_url = ( - f"https://api.github.com/repos/{user_slash_repo}/contents/{dependency_repo['relative_root']}/{path_to_file}" - ) + github_api_url = f"https://api.github.com/repos/{user_slash_repo}/contents/{dependency_repo['relative_root']}/{path_to_file}" - github_api_url += "?ref=" + dependency_repo['commit'] + github_api_url += "?ref=" + dependency_repo["commit"] github_data = fetch( github_api_url, headers={"Authorization": f"token {github_api_token}"} @@ -21,9 +20,11 @@ def get_file_from_github(github_api_token, dependency_repo, path_to_file, dep_na if not file_content: logger.error("No file content") + return None return base64.b64decode(file_content).decode() + def path_to_file_without_dependency(path_to_file, dep_name): # exclude dependency prefix from path to file # "@aragon/something/lib/my.sol" => "lib/my.sol" diff --git a/utils/logger.py b/utils/logger.py index 3ad069d..7895207 100644 --- a/utils/logger.py +++ b/utils/logger.py @@ -110,7 +110,7 @@ def color_row(self, row): diffs_found = row[3] != None and row[3] > 0 if not file_found: - hlcolor = YELLOW + hlcolor = RED elif diffs_found: hlcolor = RED From a50e72cc9b24f5c944420fbad65cb6237ae6cb36 Mon Sep 17 00:00:00 2001 From: Eugene M Date: Mon, 13 Nov 2023 16:53:04 +0300 Subject: [PATCH 02/18] feat: add Linea etherscan support Lineascan APIs return non-escaped json version --- utils/explorer.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/utils/explorer.py b/utils/explorer.py index 2323d44..decad4e 100644 --- a/utils/explorer.py +++ b/utils/explorer.py @@ -10,7 +10,9 @@ def _errorNoSourceCodeAndExit(address): sys.exit(1) -def _get_contract_from_etherscan(token, etherscan_hostname, contract): +def _get_contract_from_etherscan( + token, etherscan_hostname, contract, json_escaped=True +): etherscan_link = f"https://{etherscan_hostname}/api?module=contract&action=getsourcecode&address={contract}&apikey={token}" response = fetch(etherscan_link) @@ -26,7 +28,11 @@ def _get_contract_from_etherscan(token, etherscan_hostname, contract): _errorNoSourceCodeAndExit(contract) contract_name = data["ContractName"] - source_files = json.loads(data["SourceCode"][1:-1])["sources"].items() + source_files = ( + json.loads(data["SourceCode"][1:-1])["sources"].items() + if json_escaped + else json.loads(data["SourceCode"]).items() + ) return (contract_name, source_files) @@ -74,4 +80,8 @@ def get_contract_from_explorer(token, explorer_hostname, contract): return _get_contract_from_zksync(token, explorer_hostname, contract) if explorer_hostname.endswith("mantle.xyz"): return _get_contract_from_mantle(token, explorer_hostname, contract) + if explorer_hostname.endswith("lineascan.build"): + return _get_contract_from_etherscan( + token, explorer_hostname, contract, json_escaped=False + ) return _get_contract_from_etherscan(token, explorer_hostname, contract) From 1ed33efb88017abafffab9f4b39ebc79db89df81 Mon Sep 17 00:00:00 2001 From: Eugene M Date: Tue, 14 Nov 2023 15:42:57 +0300 Subject: [PATCH 03/18] config: add L1 addresses for Linea testnet --- .../linea_testnet_config_L1_proxy.json | 19 ++++++++++++++ .../linea_testnet_config_L1_proxyadmin.json | 19 ++++++++++++++ .../linea_testnet_config_L1_tokenbridge.json | 25 +++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 config_samples/linea_testnet_config_L1_proxy.json create mode 100644 config_samples/linea_testnet_config_L1_proxyadmin.json create mode 100644 config_samples/linea_testnet_config_L1_tokenbridge.json diff --git a/config_samples/linea_testnet_config_L1_proxy.json b/config_samples/linea_testnet_config_L1_proxy.json new file mode 100644 index 0000000..796f1be --- /dev/null +++ b/config_samples/linea_testnet_config_L1_proxy.json @@ -0,0 +1,19 @@ +{ + "contracts": { + "0x5506A3805fB8A58Fa58248CC52d2b06D92cA94e6": "TransparentUpgradeableProxy" + }, + "explorer_hostname": "api-goerli.etherscan.io", + "github_repo": { + "url": "https://github.com/Consensys/linea-contracts", + "commit": "3cf85529fd4539eb06ba998030c37e47f98c528a", + "relative_root": "" + }, + "dependencies": { + "@openzeppelin/contracts": { + "url": "https://github.com/OpenZeppelin/openzeppelin-contracts", + "commit": "0a25c1940ca220686588c4af3ec526f725fe2582", + "relative_root": "contracts", + "//": "oz version 4.8.3" + } + } +} diff --git a/config_samples/linea_testnet_config_L1_proxyadmin.json b/config_samples/linea_testnet_config_L1_proxyadmin.json new file mode 100644 index 0000000..32f9165 --- /dev/null +++ b/config_samples/linea_testnet_config_L1_proxyadmin.json @@ -0,0 +1,19 @@ +{ + "contracts": { + "0xE80528ac405ffd62cE439593cE74C20726048F62": "ProxyAdmin" + }, + "explorer_hostname": "api-goerli.etherscan.io", + "github_repo": { + "url": "https://github.com/Consensys/linea-contracts", + "commit": "3cf85529fd4539eb06ba998030c37e47f98c528a", + "relative_root": "" + }, + "dependencies": { + "@openzeppelin/contracts": { + "url": "https://github.com/OpenZeppelin/openzeppelin-contracts", + "commit": "23869e5b2a7c6b9c3e27dee4289615b8cf50e36b", + "relative_root": "contracts", + "//": "oz version 4.1.0" + } + } +} diff --git a/config_samples/linea_testnet_config_L1_tokenbridge.json b/config_samples/linea_testnet_config_L1_tokenbridge.json new file mode 100644 index 0000000..6d49935 --- /dev/null +++ b/config_samples/linea_testnet_config_L1_tokenbridge.json @@ -0,0 +1,25 @@ +{ + "contracts": { + "0x292A9478A52F0B8b12429c58F79367448aBe0214": "TokenBridge" + }, + "explorer_hostname": "api-goerli.etherscan.io", + "github_repo": { + "url": "https://github.com/Consensys/linea-contracts", + "commit": "f08c1906855198e2dc0413a47dcb38291b7087e5", + "relative_root": "" + }, + "dependencies": { + "@openzeppelin/contracts": { + "url": "https://github.com/OpenZeppelin/openzeppelin-contracts", + "commit": "e50c24f5839db17f46991478384bfda14acfb830", + "relative_root": "contracts", + "//": "oz version 4.9.2" + }, + "@openzeppelin/contracts-upgradeable": { + "url": "https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable", + "commit": "bc95521e34dcd49792065e264a7ad2b5a86f0091", + "relative_root": "contracts", + "//": "oz version 4.9.2" + } + } +} From ec748305834799d6e0b43fae76590b8b47bc0ed1 Mon Sep 17 00:00:00 2001 From: Eugene M Date: Tue, 14 Nov 2023 15:52:03 +0300 Subject: [PATCH 04/18] config: add L2 gov module --- config_samples/linea_testnet_config_L2_gov.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 config_samples/linea_testnet_config_L2_gov.json diff --git a/config_samples/linea_testnet_config_L2_gov.json b/config_samples/linea_testnet_config_L2_gov.json new file mode 100644 index 0000000..ba9decc --- /dev/null +++ b/config_samples/linea_testnet_config_L2_gov.json @@ -0,0 +1,12 @@ +{ + "contracts": { + "0x4b38D24E70079f2dd1D79B86E2B52f4b13872a3B": "LineaBridgeExecutor" + }, + "explorer_hostname": "api-testnet.lineascan.build", + "github_repo": { + "url": "https://github.com/Consensys/governance-crosschain-bridges", + "commit": "7d4fd35e92688d7aa56ae2f94872f851bacae50c", + "relative_root": "contracts/bridges" + }, + "dependencies": {} +} From 4009fe596f792a112fb1f3ccaa7f603d3a6084f7 Mon Sep 17 00:00:00 2001 From: Eugene M Date: Tue, 14 Nov 2023 16:20:57 +0300 Subject: [PATCH 05/18] fix: more intelligent etherscan json escape detect --- utils/explorer.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/utils/explorer.py b/utils/explorer.py index decad4e..3308582 100644 --- a/utils/explorer.py +++ b/utils/explorer.py @@ -10,9 +10,7 @@ def _errorNoSourceCodeAndExit(address): sys.exit(1) -def _get_contract_from_etherscan( - token, etherscan_hostname, contract, json_escaped=True -): +def _get_contract_from_etherscan(token, etherscan_hostname, contract): etherscan_link = f"https://{etherscan_hostname}/api?module=contract&action=getsourcecode&address={contract}&apikey={token}" response = fetch(etherscan_link) @@ -28,6 +26,8 @@ def _get_contract_from_etherscan( _errorNoSourceCodeAndExit(contract) contract_name = data["ContractName"] + + json_escaped = data["SourceCode"].startswith("{{") source_files = ( json.loads(data["SourceCode"][1:-1])["sources"].items() if json_escaped @@ -80,8 +80,4 @@ def get_contract_from_explorer(token, explorer_hostname, contract): return _get_contract_from_zksync(token, explorer_hostname, contract) if explorer_hostname.endswith("mantle.xyz"): return _get_contract_from_mantle(token, explorer_hostname, contract) - if explorer_hostname.endswith("lineascan.build"): - return _get_contract_from_etherscan( - token, explorer_hostname, contract, json_escaped=False - ) return _get_contract_from_etherscan(token, explorer_hostname, contract) From e2205adeb02997bc74509bbfbba89e797258ee2b Mon Sep 17 00:00:00 2001 From: Eugene M Date: Tue, 14 Nov 2023 16:21:38 +0300 Subject: [PATCH 06/18] chore: update commit id for L1 tokenbridge --- config_samples/linea_testnet_config_L1_tokenbridge.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_samples/linea_testnet_config_L1_tokenbridge.json b/config_samples/linea_testnet_config_L1_tokenbridge.json index 6d49935..1bb9504 100644 --- a/config_samples/linea_testnet_config_L1_tokenbridge.json +++ b/config_samples/linea_testnet_config_L1_tokenbridge.json @@ -5,7 +5,7 @@ "explorer_hostname": "api-goerli.etherscan.io", "github_repo": { "url": "https://github.com/Consensys/linea-contracts", - "commit": "f08c1906855198e2dc0413a47dcb38291b7087e5", + "commit": "3cf85529fd4539eb06ba998030c37e47f98c528a", "relative_root": "" }, "dependencies": { From 7dd41977d7be287b58850364917b4681b863ca6f Mon Sep 17 00:00:00 2001 From: Eugene M Date: Tue, 14 Nov 2023 16:22:03 +0300 Subject: [PATCH 07/18] config: add Linea L2 testnet addrs --- config_samples/linea_testnet_config_L2.json | 25 +++++++++++++++++++ .../linea_testnet_config_L2_proxy.json | 20 +++++++++++++++ .../linea_testnet_config_L2_proxyadmin.json | 19 ++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 config_samples/linea_testnet_config_L2.json create mode 100644 config_samples/linea_testnet_config_L2_proxy.json create mode 100644 config_samples/linea_testnet_config_L2_proxyadmin.json diff --git a/config_samples/linea_testnet_config_L2.json b/config_samples/linea_testnet_config_L2.json new file mode 100644 index 0000000..9947726 --- /dev/null +++ b/config_samples/linea_testnet_config_L2.json @@ -0,0 +1,25 @@ +{ + "contracts": { + "0x2bb4036e0cdd52c2134a95b6249eb89e5f6bc7f1": "CustomBridgedToken" + }, + "explorer_hostname": "api-testnet.lineascan.build", + "github_repo": { + "url": "https://github.com/Consensys/linea-contracts", + "commit": "3cf85529fd4539eb06ba998030c37e47f98c528a", + "relative_root": "" + }, + "dependencies": { + "@openzeppelin/contracts": { + "url": "https://github.com/OpenZeppelin/openzeppelin-contracts", + "commit": "e50c24f5839db17f46991478384bfda14acfb830", + "relative_root": "contracts", + "//": "oz version 4.9.2" + }, + "@openzeppelin/contracts-upgradeable": { + "url": "https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable", + "commit": "bc95521e34dcd49792065e264a7ad2b5a86f0091", + "relative_root": "contracts", + "//": "oz version 4.9.2" + } + } +} diff --git a/config_samples/linea_testnet_config_L2_proxy.json b/config_samples/linea_testnet_config_L2_proxy.json new file mode 100644 index 0000000..90839e6 --- /dev/null +++ b/config_samples/linea_testnet_config_L2_proxy.json @@ -0,0 +1,20 @@ +{ + "contracts": { + "0x9ceed01e39279a529f44deB9d35E09a04B1E67c8": "TransparentUpgradeableProxy", + "0x71062fBC3da2d792285C3d5dabba12A42339e85c": "ProxyAdmin" + }, + "explorer_hostname": "api-testnet.lineascan.build", + "github_repo": { + "url": "https://github.com/Consensys/linea-contracts", + "commit": "3cf85529fd4539eb06ba998030c37e47f98c528a", + "relative_root": "" + }, + "dependencies": { + "@openzeppelin/contracts": { + "url": "https://github.com/OpenZeppelin/openzeppelin-contracts", + "commit": "0a25c1940ca220686588c4af3ec526f725fe2582", + "relative_root": "contracts", + "//": "oz version 4.8.3" + } + } +} diff --git a/config_samples/linea_testnet_config_L2_proxyadmin.json b/config_samples/linea_testnet_config_L2_proxyadmin.json new file mode 100644 index 0000000..6902895 --- /dev/null +++ b/config_samples/linea_testnet_config_L2_proxyadmin.json @@ -0,0 +1,19 @@ +{ + "contracts": { + "0x1637A76e2981bf3fea05B756d79a8f3F874822af": "ProxyAdmin" + }, + "explorer_hostname": "api-testnet.lineascan.build", + "github_repo": { + "url": "https://github.com/Consensys/linea-contracts", + "commit": "3cf85529fd4539eb06ba998030c37e47f98c528a", + "relative_root": "" + }, + "dependencies": { + "@openzeppelin/contracts": { + "url": "https://github.com/OpenZeppelin/openzeppelin-contracts", + "commit": "23869e5b2a7c6b9c3e27dee4289615b8cf50e36b", + "relative_root": "contracts", + "//": "oz version 4.1.0" + } + } +} From 067c9183f1d295384b853f80f50b1efbb148d81b Mon Sep 17 00:00:00 2001 From: Eugene M Date: Tue, 14 Nov 2023 16:53:20 +0300 Subject: [PATCH 08/18] config: add Linea L1 mainnet addrs --- config_samples/linea_mainnet_config_L1.json | 26 +++++++++++++++++++ .../linea_mainnet_config_L1_tokenbridge.json | 25 ++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 config_samples/linea_mainnet_config_L1.json create mode 100644 config_samples/linea_mainnet_config_L1_tokenbridge.json diff --git a/config_samples/linea_mainnet_config_L1.json b/config_samples/linea_mainnet_config_L1.json new file mode 100644 index 0000000..f0b5af2 --- /dev/null +++ b/config_samples/linea_mainnet_config_L1.json @@ -0,0 +1,26 @@ +{ + "contracts": { + "0x051F1D88f0aF5763fB888eC4378b4D8B29ea3319": "TransparentUpgradeableProxy", + "0x5b0bb17755fba06028530682e2fd5bc373931768": "ProxyAdmin" + }, + "explorer_hostname": "api.etherscan.io", + "github_repo": { + "url": "https://github.com/Consensys/linea-contracts", + "commit": "3cf85529fd4539eb06ba998030c37e47f98c528a", + "relative_root": "" + }, + "dependencies": { + "@openzeppelin/contracts": { + "url": "https://github.com/OpenZeppelin/openzeppelin-contracts", + "commit": "0a25c1940ca220686588c4af3ec526f725fe2582", + "relative_root": "contracts", + "//": "oz version 4.8.3" + }, + "@openzeppelin/contracts-upgradeable": { + "url": "https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable", + "commit": "58fa0f81c4036f1a3b616fdffad2fd27e5d5ce21", + "relative_root": "contracts", + "//": "oz version 4.8.3" + } + } +} diff --git a/config_samples/linea_mainnet_config_L1_tokenbridge.json b/config_samples/linea_mainnet_config_L1_tokenbridge.json new file mode 100644 index 0000000..28423ba --- /dev/null +++ b/config_samples/linea_mainnet_config_L1_tokenbridge.json @@ -0,0 +1,25 @@ +{ + "contracts": { + "0x6ccfd65b0b14f67259c77ca6267104e058ddb292": "TokenBridge" + }, + "explorer_hostname": "api.etherscan.io", + "github_repo": { + "url": "https://github.com/Consensys/linea-contracts", + "commit": "3cf85529fd4539eb06ba998030c37e47f98c528a", + "relative_root": "" + }, + "dependencies": { + "@openzeppelin/contracts": { + "url": "https://github.com/OpenZeppelin/openzeppelin-contracts", + "commit": "e50c24f5839db17f46991478384bfda14acfb830", + "relative_root": "contracts", + "//": "oz version 4.9.2" + }, + "@openzeppelin/contracts-upgradeable": { + "url": "https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable", + "commit": "bc95521e34dcd49792065e264a7ad2b5a86f0091", + "relative_root": "contracts", + "//": "oz version 4.9.2" + } + } +} From 62f9fbf41ee8c66bd0fec1613b666cdb3a584712 Mon Sep 17 00:00:00 2001 From: Eugene M Date: Tue, 14 Nov 2023 16:53:58 +0300 Subject: [PATCH 09/18] mv: linea configs to a separate dir --- config_samples/{ => linea}/linea_mainnet_config_L1.json | 0 .../{ => linea}/linea_mainnet_config_L1_tokenbridge.json | 0 config_samples/{ => linea}/linea_testnet_config_L1_proxy.json | 0 .../{ => linea}/linea_testnet_config_L1_proxyadmin.json | 0 .../{ => linea}/linea_testnet_config_L1_tokenbridge.json | 0 config_samples/{ => linea}/linea_testnet_config_L2.json | 0 config_samples/{ => linea}/linea_testnet_config_L2_gov.json | 0 config_samples/{ => linea}/linea_testnet_config_L2_proxy.json | 0 .../{ => linea}/linea_testnet_config_L2_proxyadmin.json | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename config_samples/{ => linea}/linea_mainnet_config_L1.json (100%) rename config_samples/{ => linea}/linea_mainnet_config_L1_tokenbridge.json (100%) rename config_samples/{ => linea}/linea_testnet_config_L1_proxy.json (100%) rename config_samples/{ => linea}/linea_testnet_config_L1_proxyadmin.json (100%) rename config_samples/{ => linea}/linea_testnet_config_L1_tokenbridge.json (100%) rename config_samples/{ => linea}/linea_testnet_config_L2.json (100%) rename config_samples/{ => linea}/linea_testnet_config_L2_gov.json (100%) rename config_samples/{ => linea}/linea_testnet_config_L2_proxy.json (100%) rename config_samples/{ => linea}/linea_testnet_config_L2_proxyadmin.json (100%) diff --git a/config_samples/linea_mainnet_config_L1.json b/config_samples/linea/linea_mainnet_config_L1.json similarity index 100% rename from config_samples/linea_mainnet_config_L1.json rename to config_samples/linea/linea_mainnet_config_L1.json diff --git a/config_samples/linea_mainnet_config_L1_tokenbridge.json b/config_samples/linea/linea_mainnet_config_L1_tokenbridge.json similarity index 100% rename from config_samples/linea_mainnet_config_L1_tokenbridge.json rename to config_samples/linea/linea_mainnet_config_L1_tokenbridge.json diff --git a/config_samples/linea_testnet_config_L1_proxy.json b/config_samples/linea/linea_testnet_config_L1_proxy.json similarity index 100% rename from config_samples/linea_testnet_config_L1_proxy.json rename to config_samples/linea/linea_testnet_config_L1_proxy.json diff --git a/config_samples/linea_testnet_config_L1_proxyadmin.json b/config_samples/linea/linea_testnet_config_L1_proxyadmin.json similarity index 100% rename from config_samples/linea_testnet_config_L1_proxyadmin.json rename to config_samples/linea/linea_testnet_config_L1_proxyadmin.json diff --git a/config_samples/linea_testnet_config_L1_tokenbridge.json b/config_samples/linea/linea_testnet_config_L1_tokenbridge.json similarity index 100% rename from config_samples/linea_testnet_config_L1_tokenbridge.json rename to config_samples/linea/linea_testnet_config_L1_tokenbridge.json diff --git a/config_samples/linea_testnet_config_L2.json b/config_samples/linea/linea_testnet_config_L2.json similarity index 100% rename from config_samples/linea_testnet_config_L2.json rename to config_samples/linea/linea_testnet_config_L2.json diff --git a/config_samples/linea_testnet_config_L2_gov.json b/config_samples/linea/linea_testnet_config_L2_gov.json similarity index 100% rename from config_samples/linea_testnet_config_L2_gov.json rename to config_samples/linea/linea_testnet_config_L2_gov.json diff --git a/config_samples/linea_testnet_config_L2_proxy.json b/config_samples/linea/linea_testnet_config_L2_proxy.json similarity index 100% rename from config_samples/linea_testnet_config_L2_proxy.json rename to config_samples/linea/linea_testnet_config_L2_proxy.json diff --git a/config_samples/linea_testnet_config_L2_proxyadmin.json b/config_samples/linea/linea_testnet_config_L2_proxyadmin.json similarity index 100% rename from config_samples/linea_testnet_config_L2_proxyadmin.json rename to config_samples/linea/linea_testnet_config_L2_proxyadmin.json From 546ae8cc14683c1644082f4f092e20d55fee93aa Mon Sep 17 00:00:00 2001 From: Eugene M Date: Tue, 14 Nov 2023 16:55:26 +0300 Subject: [PATCH 10/18] mv: move configs to subdirs --- config_samples/{ => base}/base_mainnet_config_L1.json | 0 config_samples/{ => base}/base_mainnet_config_L2.json | 0 config_samples/{ => mantle}/mantle_testnet_config_L1.json | 0 config_samples/{ => mantle}/mantle_testnet_config_L2.json | 0 config_samples/{ => optimism}/optimism_mainnet_config_L1.json | 0 config_samples/{ => optimism}/optimism_mainnet_config_L2.json | 0 config_samples/{ => zksync}/zksync_mainnet_config_L1.json | 0 config_samples/{ => zksync}/zksync_mainnet_config_L2.json | 0 config_samples/{ => zksync}/zksync_testnet_config_L1.json | 0 config_samples/{ => zksync}/zksync_testnet_config_L2.json | 0 10 files changed, 0 insertions(+), 0 deletions(-) rename config_samples/{ => base}/base_mainnet_config_L1.json (100%) rename config_samples/{ => base}/base_mainnet_config_L2.json (100%) rename config_samples/{ => mantle}/mantle_testnet_config_L1.json (100%) rename config_samples/{ => mantle}/mantle_testnet_config_L2.json (100%) rename config_samples/{ => optimism}/optimism_mainnet_config_L1.json (100%) rename config_samples/{ => optimism}/optimism_mainnet_config_L2.json (100%) rename config_samples/{ => zksync}/zksync_mainnet_config_L1.json (100%) rename config_samples/{ => zksync}/zksync_mainnet_config_L2.json (100%) rename config_samples/{ => zksync}/zksync_testnet_config_L1.json (100%) rename config_samples/{ => zksync}/zksync_testnet_config_L2.json (100%) diff --git a/config_samples/base_mainnet_config_L1.json b/config_samples/base/base_mainnet_config_L1.json similarity index 100% rename from config_samples/base_mainnet_config_L1.json rename to config_samples/base/base_mainnet_config_L1.json diff --git a/config_samples/base_mainnet_config_L2.json b/config_samples/base/base_mainnet_config_L2.json similarity index 100% rename from config_samples/base_mainnet_config_L2.json rename to config_samples/base/base_mainnet_config_L2.json diff --git a/config_samples/mantle_testnet_config_L1.json b/config_samples/mantle/mantle_testnet_config_L1.json similarity index 100% rename from config_samples/mantle_testnet_config_L1.json rename to config_samples/mantle/mantle_testnet_config_L1.json diff --git a/config_samples/mantle_testnet_config_L2.json b/config_samples/mantle/mantle_testnet_config_L2.json similarity index 100% rename from config_samples/mantle_testnet_config_L2.json rename to config_samples/mantle/mantle_testnet_config_L2.json diff --git a/config_samples/optimism_mainnet_config_L1.json b/config_samples/optimism/optimism_mainnet_config_L1.json similarity index 100% rename from config_samples/optimism_mainnet_config_L1.json rename to config_samples/optimism/optimism_mainnet_config_L1.json diff --git a/config_samples/optimism_mainnet_config_L2.json b/config_samples/optimism/optimism_mainnet_config_L2.json similarity index 100% rename from config_samples/optimism_mainnet_config_L2.json rename to config_samples/optimism/optimism_mainnet_config_L2.json diff --git a/config_samples/zksync_mainnet_config_L1.json b/config_samples/zksync/zksync_mainnet_config_L1.json similarity index 100% rename from config_samples/zksync_mainnet_config_L1.json rename to config_samples/zksync/zksync_mainnet_config_L1.json diff --git a/config_samples/zksync_mainnet_config_L2.json b/config_samples/zksync/zksync_mainnet_config_L2.json similarity index 100% rename from config_samples/zksync_mainnet_config_L2.json rename to config_samples/zksync/zksync_mainnet_config_L2.json diff --git a/config_samples/zksync_testnet_config_L1.json b/config_samples/zksync/zksync_testnet_config_L1.json similarity index 100% rename from config_samples/zksync_testnet_config_L1.json rename to config_samples/zksync/zksync_testnet_config_L1.json diff --git a/config_samples/zksync_testnet_config_L2.json b/config_samples/zksync/zksync_testnet_config_L2.json similarity index 100% rename from config_samples/zksync_testnet_config_L2.json rename to config_samples/zksync/zksync_testnet_config_L2.json From 867d37fdd16585b32ab31039d2817938b32a2a8e Mon Sep 17 00:00:00 2001 From: Eugene M Date: Tue, 14 Nov 2023 17:41:53 +0300 Subject: [PATCH 11/18] config: add Linea L2 mainnet --- .../linea/linea_mainnet_config_L2.json | 27 +++++++++++++++++++ .../linea/linea_mainnet_config_L2_proxy.json | 19 +++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 config_samples/linea/linea_mainnet_config_L2.json create mode 100644 config_samples/linea/linea_mainnet_config_L2_proxy.json diff --git a/config_samples/linea/linea_mainnet_config_L2.json b/config_samples/linea/linea_mainnet_config_L2.json new file mode 100644 index 0000000..7d201a3 --- /dev/null +++ b/config_samples/linea/linea_mainnet_config_L2.json @@ -0,0 +1,27 @@ +{ + "contracts": { + "0xa11ba93afbd6d18e26fefdb2c6311da6c9b370d6": "ProxyAdmin", + "0x2bfdf4a0d54c93a4baf74f8dcea8a275d8ee97a9": "TokenBridge", + "0xc0583e2F5930EDE5Fab9D57bAC4169878730B010": "CustomBridgedToken" + }, + "explorer_hostname": "api.lineascan.build", + "github_repo": { + "url": "https://github.com/Consensys/linea-contracts", + "commit": "3cf85529fd4539eb06ba998030c37e47f98c528a", + "relative_root": "" + }, + "dependencies": { + "@openzeppelin/contracts": { + "url": "https://github.com/OpenZeppelin/openzeppelin-contracts", + "commit": "e50c24f5839db17f46991478384bfda14acfb830", + "relative_root": "contracts", + "//": "oz version 4.9.2" + }, + "@openzeppelin/contracts-upgradeable": { + "url": "https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable", + "commit": "bc95521e34dcd49792065e264a7ad2b5a86f0091", + "relative_root": "contracts", + "//": "oz version 4.9.2" + } + } +} diff --git a/config_samples/linea/linea_mainnet_config_L2_proxy.json b/config_samples/linea/linea_mainnet_config_L2_proxy.json new file mode 100644 index 0000000..54f80a0 --- /dev/null +++ b/config_samples/linea/linea_mainnet_config_L2_proxy.json @@ -0,0 +1,19 @@ +{ + "contracts": { + "0x353012dc4a9A6cF55c941bADC267f82004A8ceB9": "TransparentUpgradeableProxy" + }, + "explorer_hostname": "api.lineascan.build", + "github_repo": { + "url": "https://github.com/Consensys/linea-contracts", + "commit": "3cf85529fd4539eb06ba998030c37e47f98c528a", + "relative_root": "" + }, + "dependencies": { + "@openzeppelin/contracts": { + "url": "https://github.com/OpenZeppelin/openzeppelin-contracts", + "commit": "0a25c1940ca220686588c4af3ec526f725fe2582", + "relative_root": "contracts", + "//": "oz version 4.8.3" + } + } +} From f3c1ce1ad23cd8a4b948f50bc208889d803cc9f7 Mon Sep 17 00:00:00 2001 From: Eugene M Date: Mon, 4 Dec 2023 11:51:27 +0300 Subject: [PATCH 12/18] config: add Linea mainnet all contracts --- config_samples/linea/linea_mainnet_config_L1.json | 4 ++-- .../linea/linea_mainnet_config_L1_tokenbridge.json | 4 ++-- config_samples/linea/linea_mainnet_config_L2.json | 7 ++++--- .../linea/linea_mainnet_config_L2_gov.json | 12 ++++++++++++ .../linea/linea_mainnet_config_L2_proxy.json | 4 ++-- 5 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 config_samples/linea/linea_mainnet_config_L2_gov.json diff --git a/config_samples/linea/linea_mainnet_config_L1.json b/config_samples/linea/linea_mainnet_config_L1.json index f0b5af2..ab891f4 100644 --- a/config_samples/linea/linea_mainnet_config_L1.json +++ b/config_samples/linea/linea_mainnet_config_L1.json @@ -5,8 +5,8 @@ }, "explorer_hostname": "api.etherscan.io", "github_repo": { - "url": "https://github.com/Consensys/linea-contracts", - "commit": "3cf85529fd4539eb06ba998030c37e47f98c528a", + "url": "https://github.com/Consensys/linea-contracts-fix", + "commit": "0949c4096664e613f73ed3ce51c32f97fc56cdef", "relative_root": "" }, "dependencies": { diff --git a/config_samples/linea/linea_mainnet_config_L1_tokenbridge.json b/config_samples/linea/linea_mainnet_config_L1_tokenbridge.json index 28423ba..5a73d55 100644 --- a/config_samples/linea/linea_mainnet_config_L1_tokenbridge.json +++ b/config_samples/linea/linea_mainnet_config_L1_tokenbridge.json @@ -4,8 +4,8 @@ }, "explorer_hostname": "api.etherscan.io", "github_repo": { - "url": "https://github.com/Consensys/linea-contracts", - "commit": "3cf85529fd4539eb06ba998030c37e47f98c528a", + "url": "https://github.com/Consensys/linea-contracts-fix", + "commit": "0949c4096664e613f73ed3ce51c32f97fc56cdef", "relative_root": "" }, "dependencies": { diff --git a/config_samples/linea/linea_mainnet_config_L2.json b/config_samples/linea/linea_mainnet_config_L2.json index 7d201a3..6eb5959 100644 --- a/config_samples/linea/linea_mainnet_config_L2.json +++ b/config_samples/linea/linea_mainnet_config_L2.json @@ -2,12 +2,13 @@ "contracts": { "0xa11ba93afbd6d18e26fefdb2c6311da6c9b370d6": "ProxyAdmin", "0x2bfdf4a0d54c93a4baf74f8dcea8a275d8ee97a9": "TokenBridge", - "0xc0583e2F5930EDE5Fab9D57bAC4169878730B010": "CustomBridgedToken" + "0xc0583e2F5930EDE5Fab9D57bAC4169878730B010": "CustomBridgedToken", + "0xF951d7592e03eDB0Bab3D533935e678Ce64Eb927": "ProxyAdmin" }, "explorer_hostname": "api.lineascan.build", "github_repo": { - "url": "https://github.com/Consensys/linea-contracts", - "commit": "3cf85529fd4539eb06ba998030c37e47f98c528a", + "url": "https://github.com/Consensys/linea-contracts-fix", + "commit": "0949c4096664e613f73ed3ce51c32f97fc56cdef", "relative_root": "" }, "dependencies": { diff --git a/config_samples/linea/linea_mainnet_config_L2_gov.json b/config_samples/linea/linea_mainnet_config_L2_gov.json new file mode 100644 index 0000000..9b7bc4a --- /dev/null +++ b/config_samples/linea/linea_mainnet_config_L2_gov.json @@ -0,0 +1,12 @@ +{ + "contracts": { + "0x74Be82F00CC867614803ffd7f36A2a4aF0405670": "LineaBridgeExecutor" + }, + "explorer_hostname": "api.lineascan.build", + "github_repo": { + "url": "https://github.com/Consensys/governance-crosschain-bridges", + "commit": "315308a2640c696937185732159b130417f29997", + "relative_root": "" + }, + "dependencies": {} +} diff --git a/config_samples/linea/linea_mainnet_config_L2_proxy.json b/config_samples/linea/linea_mainnet_config_L2_proxy.json index 54f80a0..d313084 100644 --- a/config_samples/linea/linea_mainnet_config_L2_proxy.json +++ b/config_samples/linea/linea_mainnet_config_L2_proxy.json @@ -4,8 +4,8 @@ }, "explorer_hostname": "api.lineascan.build", "github_repo": { - "url": "https://github.com/Consensys/linea-contracts", - "commit": "3cf85529fd4539eb06ba998030c37e47f98c528a", + "url": "https://github.com/Consensys/linea-contracts-fix", + "commit": "0949c4096664e613f73ed3ce51c32f97fc56cdef", "relative_root": "" }, "dependencies": { From 26798ed810705806e297b890f79ad2cafc44840d Mon Sep 17 00:00:00 2001 From: Eugene M Date: Tue, 5 Dec 2023 12:23:29 +0300 Subject: [PATCH 13/18] fix: add missing wstETH proxy on Linea --- config_samples/linea/linea_mainnet_config_L2_proxy.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config_samples/linea/linea_mainnet_config_L2_proxy.json b/config_samples/linea/linea_mainnet_config_L2_proxy.json index d313084..f9e46da 100644 --- a/config_samples/linea/linea_mainnet_config_L2_proxy.json +++ b/config_samples/linea/linea_mainnet_config_L2_proxy.json @@ -1,6 +1,7 @@ { "contracts": { - "0x353012dc4a9A6cF55c941bADC267f82004A8ceB9": "TransparentUpgradeableProxy" + "0x353012dc4a9A6cF55c941bADC267f82004A8ceB9": "TransparentUpgradeableProxy", + "0xB5beDd42000b71FddE22D3eE8a79Bd49A568fC8F": "TransparentUpgradeableProxy" }, "explorer_hostname": "api.lineascan.build", "github_repo": { From f4b670338467e8e969351dc11f70cb2416525166 Mon Sep 17 00:00:00 2001 From: Artyom Veremeenko Date: Tue, 5 Dec 2023 12:27:22 +0300 Subject: [PATCH 14/18] feat: + cmd args: path to config(-s) and -y to skip user confirmation --- main.py | 82 +++++++++++++++++++++++++++++++--------------- utils/common.py | 11 ++----- utils/constants.py | 2 +- 3 files changed, 58 insertions(+), 37 deletions(-) diff --git a/main.py b/main.py index 57ae578..e6ea877 100644 --- a/main.py +++ b/main.py @@ -1,15 +1,26 @@ import difflib import sys import time +import argparse +import os from utils.common import load_config, load_env -from utils.constants import DIFFS_DIR, START_TIME +from utils.constants import DIFFS_DIR, START_TIME, DEFAULT_CONFIG_PATH from utils.explorer import get_contract_from_explorer from utils.github import get_file_from_github, resolve_dep from utils.helpers import create_dirs from utils.logger import logger +EXPLORER_API_TOKEN = load_env("ETHERSCAN_TOKEN", masked=True) +GITHUB_API_TOKEN = load_env("GITHUB_API_TOKEN", masked=True) + +CONTRACT_ADDRESS = load_env("CONTRACT_ADDRESS", required=False) +CONTRACT_NAME = load_env("CONTRACT_NAME", required=False) + +g_skip_user_input: bool = False + + def run_diff(config, name, address, explorer_api_token, github_api_token): logger.divider() logger.okay("Contract", address) @@ -40,8 +51,10 @@ def run_diff(config, name, address, explorer_api_token, github_api_token): logger.okay("Contract", contract_name) logger.okay("Files", files_count) - input("Press Enter to proceed...") - logger.divider() + if not g_skip_user_input: + input("Press Enter to proceed...") + logger.divider() + logger.info("Diffing...") report = [] @@ -112,45 +125,60 @@ def run_diff(config, name, address, explorer_api_token, github_api_token): logger.report_table(report) -def main(): - logger.info("Welcome to Diffyscan!") - logger.divider() - - logger.info("Loading API tokens...") - explorer_api_token = load_env("ETHERSCAN_TOKEN", masked=True) - github_api_token = load_env("GITHUB_API_TOKEN", masked=True) - - contract_address = load_env("CONTRACT_ADDRESS", required=False) - contract_name = load_env("CONTRACT_NAME", required=False) - - logger.divider() - - logger.info("Loading config...") - config = load_config() +def process_config(path: str): + logger.info(f"Loading config {path}...") + config = load_config(path) - if contract_address is not None: - if contract_name is None: + if CONTRACT_ADDRESS is not None: + if CONTRACT_NAME is None: logger.error( "Please set the 'CONTRACT_NAME' env var for address", - f"{contract_address}", + f"{CONTRACT_ADDRESS}", ) sys.exit(1) logger.info( - f"Running diff for a single contract {contract_name} deployed at {contract_address}..." + f"Running diff for a single contract {CONTRACT_NAME} deployed at {CONTRACT_ADDRESS}..." ) run_diff( config, - contract_name, - contract_address, - explorer_api_token, - github_api_token, + CONTRACT_NAME, + CONTRACT_ADDRESS, + EXPLORER_API_TOKEN, + GITHUB_API_TOKEN, ) else: contracts = config["contracts"] logger.info(f"Running diff for contracts from config {contracts}...") for address, name in config["contracts"].items(): - run_diff(config, name, address, explorer_api_token, github_api_token) + run_diff(config, name, address, EXPLORER_API_TOKEN, GITHUB_API_TOKEN) + + +def parse_arguments(): + parser = argparse.ArgumentParser() + parser.add_argument("path", nargs="?", default=None, help="Path to config or directory with configs") + parser.add_argument("--yes", "-y", help="If set don't ask for input before validating each contract", action="store_true") + return parser.parse_args() + + +def main(): + global g_skip_user_input + + args = parse_arguments() + g_skip_user_input = args.yes + + logger.info("Welcome to Diffyscan!") + logger.divider() + + if args.path is None: + process_config(DEFAULT_CONFIG_PATH) + elif os.path.isfile(args.path): + process_config(args.path) + elif os.path.isdir(args.path): + for filename in os.listdir(args.path): + config_path = os.path.join(args.path, filename) + if os.path.isfile(config_path): + process_config(config_path) execution_time = time.time() - START_TIME diff --git a/utils/common.py b/utils/common.py index 08a8ef2..149dff8 100644 --- a/utils/common.py +++ b/utils/common.py @@ -5,7 +5,6 @@ import requests -from utils.constants import CONFIG_PATH from utils.logger import logger from utils.types import Config @@ -27,17 +26,11 @@ def load_env(variable_name, required=True, masked=False): return value -def load_config() -> Config: - config_path = get_config_path() - - with open(config_path, mode="r") as config_file: +def load_config(path: str) -> Config: + with open(path, mode="r") as config_file: return json.load(config_file) -def get_config_path() -> str: - return CONFIG_PATH - - def fetch(url, headers={}): logger.log(f"fetch: {url}") response = requests.get(url, headers=headers) diff --git a/utils/constants.py b/utils/constants.py index d31b85e..757e5a2 100644 --- a/utils/constants.py +++ b/utils/constants.py @@ -5,4 +5,4 @@ START_TIME_INT = int(START_TIME) DIFFS_DIR = f"{DIGEST_DIR}/{START_TIME_INT}/diffs" LOGS_PATH = f"{DIGEST_DIR}/{START_TIME_INT}/logs.txt" -CONFIG_PATH = "config.json" +DEFAULT_CONFIG_PATH = "config.json" From 48a185020b8c9218a438d0135f5627f7269eda22 Mon Sep 17 00:00:00 2001 From: Artyom Veremeenko Date: Tue, 5 Dec 2023 12:43:18 +0300 Subject: [PATCH 15/18] fix: querying lineascan if ETHERSCAN_TOKEN is set --- utils/explorer.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/utils/explorer.py b/utils/explorer.py index 3308582..8f2c453 100644 --- a/utils/explorer.py +++ b/utils/explorer.py @@ -11,7 +11,9 @@ def _errorNoSourceCodeAndExit(address): def _get_contract_from_etherscan(token, etherscan_hostname, contract): - etherscan_link = f"https://{etherscan_hostname}/api?module=contract&action=getsourcecode&address={contract}&apikey={token}" + etherscan_link = f"https://{etherscan_hostname}/api?module=contract&action=getsourcecode&address={contract}" + if token is not None: + etherscan_link = f"{etherscan_link}?apikey={token}" response = fetch(etherscan_link) @@ -37,7 +39,7 @@ def _get_contract_from_etherscan(token, etherscan_hostname, contract): return (contract_name, source_files) -def _get_contract_from_zksync(token, zksync_explorer_hostname, contract): +def _get_contract_from_zksync(zksync_explorer_hostname, contract): zksync_explorer_link = ( f"https://{zksync_explorer_hostname}/contract_verification/info/{contract}" ) @@ -59,7 +61,7 @@ def _get_contract_from_zksync(token, zksync_explorer_hostname, contract): return (contract_name, source_files) -def _get_contract_from_mantle(token, mantle_explorer_hostname, contract): +def _get_contract_from_mantle(mantle_explorer_hostname, contract): etherscan_link = f"https://{mantle_explorer_hostname}/api?module=contract&action=getsourcecode&address={contract}" response = fetch(etherscan_link) @@ -77,7 +79,9 @@ def _get_contract_from_mantle(token, mantle_explorer_hostname, contract): def get_contract_from_explorer(token, explorer_hostname, contract): if explorer_hostname.startswith("zksync"): - return _get_contract_from_zksync(token, explorer_hostname, contract) + return _get_contract_from_zksync(explorer_hostname, contract) if explorer_hostname.endswith("mantle.xyz"): - return _get_contract_from_mantle(token, explorer_hostname, contract) + return _get_contract_from_mantle(explorer_hostname, contract) + if explorer_hostname.endswith("lineascan.build"): + return _get_contract_from_etherscan(None, explorer_hostname, contract) return _get_contract_from_etherscan(token, explorer_hostname, contract) From c025a71cd5cd7f85f40730705ef9ce80c1315394 Mon Sep 17 00:00:00 2001 From: Artyom Veremeenko Date: Tue, 5 Dec 2023 13:07:58 +0300 Subject: [PATCH 16/18] fix: typo causing etherscan request error --- utils/explorer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/explorer.py b/utils/explorer.py index 8f2c453..8a942c6 100644 --- a/utils/explorer.py +++ b/utils/explorer.py @@ -13,7 +13,7 @@ def _errorNoSourceCodeAndExit(address): def _get_contract_from_etherscan(token, etherscan_hostname, contract): etherscan_link = f"https://{etherscan_hostname}/api?module=contract&action=getsourcecode&address={contract}" if token is not None: - etherscan_link = f"{etherscan_link}?apikey={token}" + etherscan_link = f"{etherscan_link}&apikey={token}" response = fetch(etherscan_link) From 813c610bbaa2882d41a015ab1f0c40dcc447e6ff Mon Sep 17 00:00:00 2001 From: Artyom Veremeenko Date: Tue, 5 Dec 2023 13:09:16 +0300 Subject: [PATCH 17/18] refactor: move configs to mainnet/testnet subdirs --- config_samples/linea/{ => mainnet}/linea_mainnet_config_L1.json | 0 .../linea/{ => mainnet}/linea_mainnet_config_L1_tokenbridge.json | 0 config_samples/linea/{ => mainnet}/linea_mainnet_config_L2.json | 0 .../linea/{ => mainnet}/linea_mainnet_config_L2_gov.json | 0 .../linea/{ => mainnet}/linea_mainnet_config_L2_proxy.json | 0 .../linea/{ => testnet}/linea_testnet_config_L1_proxy.json | 0 .../linea/{ => testnet}/linea_testnet_config_L1_proxyadmin.json | 0 .../linea/{ => testnet}/linea_testnet_config_L1_tokenbridge.json | 0 config_samples/linea/{ => testnet}/linea_testnet_config_L2.json | 0 .../linea/{ => testnet}/linea_testnet_config_L2_gov.json | 0 .../linea/{ => testnet}/linea_testnet_config_L2_proxy.json | 0 .../linea/{ => testnet}/linea_testnet_config_L2_proxyadmin.json | 0 config_samples/mantle/{ => mainnet}/mantle_mainnet_config_L1.json | 0 config_samples/mantle/{ => mainnet}/mantle_mainnet_config_L2.json | 0 .../mantle/{ => mainnet}/mantle_mainnet_config_L2_gov.json | 0 config_samples/mantle/{ => testnet}/mantle_testnet_config_L1.json | 0 config_samples/mantle/{ => testnet}/mantle_testnet_config_L2.json | 0 config_samples/zksync/{ => mainnet}/zksync_mainnet_config_L1.json | 0 config_samples/zksync/{ => mainnet}/zksync_mainnet_config_L2.json | 0 config_samples/zksync/{ => testnet}/zksync_testnet_config_L1.json | 0 config_samples/zksync/{ => testnet}/zksync_testnet_config_L2.json | 0 21 files changed, 0 insertions(+), 0 deletions(-) rename config_samples/linea/{ => mainnet}/linea_mainnet_config_L1.json (100%) rename config_samples/linea/{ => mainnet}/linea_mainnet_config_L1_tokenbridge.json (100%) rename config_samples/linea/{ => mainnet}/linea_mainnet_config_L2.json (100%) rename config_samples/linea/{ => mainnet}/linea_mainnet_config_L2_gov.json (100%) rename config_samples/linea/{ => mainnet}/linea_mainnet_config_L2_proxy.json (100%) rename config_samples/linea/{ => testnet}/linea_testnet_config_L1_proxy.json (100%) rename config_samples/linea/{ => testnet}/linea_testnet_config_L1_proxyadmin.json (100%) rename config_samples/linea/{ => testnet}/linea_testnet_config_L1_tokenbridge.json (100%) rename config_samples/linea/{ => testnet}/linea_testnet_config_L2.json (100%) rename config_samples/linea/{ => testnet}/linea_testnet_config_L2_gov.json (100%) rename config_samples/linea/{ => testnet}/linea_testnet_config_L2_proxy.json (100%) rename config_samples/linea/{ => testnet}/linea_testnet_config_L2_proxyadmin.json (100%) rename config_samples/mantle/{ => mainnet}/mantle_mainnet_config_L1.json (100%) rename config_samples/mantle/{ => mainnet}/mantle_mainnet_config_L2.json (100%) rename config_samples/mantle/{ => mainnet}/mantle_mainnet_config_L2_gov.json (100%) rename config_samples/mantle/{ => testnet}/mantle_testnet_config_L1.json (100%) rename config_samples/mantle/{ => testnet}/mantle_testnet_config_L2.json (100%) rename config_samples/zksync/{ => mainnet}/zksync_mainnet_config_L1.json (100%) rename config_samples/zksync/{ => mainnet}/zksync_mainnet_config_L2.json (100%) rename config_samples/zksync/{ => testnet}/zksync_testnet_config_L1.json (100%) rename config_samples/zksync/{ => testnet}/zksync_testnet_config_L2.json (100%) diff --git a/config_samples/linea/linea_mainnet_config_L1.json b/config_samples/linea/mainnet/linea_mainnet_config_L1.json similarity index 100% rename from config_samples/linea/linea_mainnet_config_L1.json rename to config_samples/linea/mainnet/linea_mainnet_config_L1.json diff --git a/config_samples/linea/linea_mainnet_config_L1_tokenbridge.json b/config_samples/linea/mainnet/linea_mainnet_config_L1_tokenbridge.json similarity index 100% rename from config_samples/linea/linea_mainnet_config_L1_tokenbridge.json rename to config_samples/linea/mainnet/linea_mainnet_config_L1_tokenbridge.json diff --git a/config_samples/linea/linea_mainnet_config_L2.json b/config_samples/linea/mainnet/linea_mainnet_config_L2.json similarity index 100% rename from config_samples/linea/linea_mainnet_config_L2.json rename to config_samples/linea/mainnet/linea_mainnet_config_L2.json diff --git a/config_samples/linea/linea_mainnet_config_L2_gov.json b/config_samples/linea/mainnet/linea_mainnet_config_L2_gov.json similarity index 100% rename from config_samples/linea/linea_mainnet_config_L2_gov.json rename to config_samples/linea/mainnet/linea_mainnet_config_L2_gov.json diff --git a/config_samples/linea/linea_mainnet_config_L2_proxy.json b/config_samples/linea/mainnet/linea_mainnet_config_L2_proxy.json similarity index 100% rename from config_samples/linea/linea_mainnet_config_L2_proxy.json rename to config_samples/linea/mainnet/linea_mainnet_config_L2_proxy.json diff --git a/config_samples/linea/linea_testnet_config_L1_proxy.json b/config_samples/linea/testnet/linea_testnet_config_L1_proxy.json similarity index 100% rename from config_samples/linea/linea_testnet_config_L1_proxy.json rename to config_samples/linea/testnet/linea_testnet_config_L1_proxy.json diff --git a/config_samples/linea/linea_testnet_config_L1_proxyadmin.json b/config_samples/linea/testnet/linea_testnet_config_L1_proxyadmin.json similarity index 100% rename from config_samples/linea/linea_testnet_config_L1_proxyadmin.json rename to config_samples/linea/testnet/linea_testnet_config_L1_proxyadmin.json diff --git a/config_samples/linea/linea_testnet_config_L1_tokenbridge.json b/config_samples/linea/testnet/linea_testnet_config_L1_tokenbridge.json similarity index 100% rename from config_samples/linea/linea_testnet_config_L1_tokenbridge.json rename to config_samples/linea/testnet/linea_testnet_config_L1_tokenbridge.json diff --git a/config_samples/linea/linea_testnet_config_L2.json b/config_samples/linea/testnet/linea_testnet_config_L2.json similarity index 100% rename from config_samples/linea/linea_testnet_config_L2.json rename to config_samples/linea/testnet/linea_testnet_config_L2.json diff --git a/config_samples/linea/linea_testnet_config_L2_gov.json b/config_samples/linea/testnet/linea_testnet_config_L2_gov.json similarity index 100% rename from config_samples/linea/linea_testnet_config_L2_gov.json rename to config_samples/linea/testnet/linea_testnet_config_L2_gov.json diff --git a/config_samples/linea/linea_testnet_config_L2_proxy.json b/config_samples/linea/testnet/linea_testnet_config_L2_proxy.json similarity index 100% rename from config_samples/linea/linea_testnet_config_L2_proxy.json rename to config_samples/linea/testnet/linea_testnet_config_L2_proxy.json diff --git a/config_samples/linea/linea_testnet_config_L2_proxyadmin.json b/config_samples/linea/testnet/linea_testnet_config_L2_proxyadmin.json similarity index 100% rename from config_samples/linea/linea_testnet_config_L2_proxyadmin.json rename to config_samples/linea/testnet/linea_testnet_config_L2_proxyadmin.json diff --git a/config_samples/mantle/mantle_mainnet_config_L1.json b/config_samples/mantle/mainnet/mantle_mainnet_config_L1.json similarity index 100% rename from config_samples/mantle/mantle_mainnet_config_L1.json rename to config_samples/mantle/mainnet/mantle_mainnet_config_L1.json diff --git a/config_samples/mantle/mantle_mainnet_config_L2.json b/config_samples/mantle/mainnet/mantle_mainnet_config_L2.json similarity index 100% rename from config_samples/mantle/mantle_mainnet_config_L2.json rename to config_samples/mantle/mainnet/mantle_mainnet_config_L2.json diff --git a/config_samples/mantle/mantle_mainnet_config_L2_gov.json b/config_samples/mantle/mainnet/mantle_mainnet_config_L2_gov.json similarity index 100% rename from config_samples/mantle/mantle_mainnet_config_L2_gov.json rename to config_samples/mantle/mainnet/mantle_mainnet_config_L2_gov.json diff --git a/config_samples/mantle/mantle_testnet_config_L1.json b/config_samples/mantle/testnet/mantle_testnet_config_L1.json similarity index 100% rename from config_samples/mantle/mantle_testnet_config_L1.json rename to config_samples/mantle/testnet/mantle_testnet_config_L1.json diff --git a/config_samples/mantle/mantle_testnet_config_L2.json b/config_samples/mantle/testnet/mantle_testnet_config_L2.json similarity index 100% rename from config_samples/mantle/mantle_testnet_config_L2.json rename to config_samples/mantle/testnet/mantle_testnet_config_L2.json diff --git a/config_samples/zksync/zksync_mainnet_config_L1.json b/config_samples/zksync/mainnet/zksync_mainnet_config_L1.json similarity index 100% rename from config_samples/zksync/zksync_mainnet_config_L1.json rename to config_samples/zksync/mainnet/zksync_mainnet_config_L1.json diff --git a/config_samples/zksync/zksync_mainnet_config_L2.json b/config_samples/zksync/mainnet/zksync_mainnet_config_L2.json similarity index 100% rename from config_samples/zksync/zksync_mainnet_config_L2.json rename to config_samples/zksync/mainnet/zksync_mainnet_config_L2.json diff --git a/config_samples/zksync/zksync_testnet_config_L1.json b/config_samples/zksync/testnet/zksync_testnet_config_L1.json similarity index 100% rename from config_samples/zksync/zksync_testnet_config_L1.json rename to config_samples/zksync/testnet/zksync_testnet_config_L1.json diff --git a/config_samples/zksync/zksync_testnet_config_L2.json b/config_samples/zksync/testnet/zksync_testnet_config_L2.json similarity index 100% rename from config_samples/zksync/zksync_testnet_config_L2.json rename to config_samples/zksync/testnet/zksync_testnet_config_L2.json From 93757d9ad522ebdf9b8e50e0d176ff4e06a46982 Mon Sep 17 00:00:00 2001 From: Artyom Veremeenko Date: Wed, 6 Dec 2023 12:14:51 +0300 Subject: [PATCH 18/18] feat: setup explorer api token via env var specified in config - also remove kind of obsolete processing of CONTRACT_ADDRESS and CONTRACT_NAME env variables --- .../mainnet/linea_mainnet_config_L1.json | 1 + .../linea_mainnet_config_L1_tokenbridge.json | 1 + .../mainnet/linea_mainnet_config_L2.json | 1 + .../mainnet/linea_mainnet_config_L2_gov.json | 1 + .../linea_mainnet_config_L2_proxy.json | 1 + main.py | 36 +++++-------------- utils/common.py | 4 +-- 7 files changed, 15 insertions(+), 30 deletions(-) diff --git a/config_samples/linea/mainnet/linea_mainnet_config_L1.json b/config_samples/linea/mainnet/linea_mainnet_config_L1.json index ab891f4..96ff81d 100644 --- a/config_samples/linea/mainnet/linea_mainnet_config_L1.json +++ b/config_samples/linea/mainnet/linea_mainnet_config_L1.json @@ -4,6 +4,7 @@ "0x5b0bb17755fba06028530682e2fd5bc373931768": "ProxyAdmin" }, "explorer_hostname": "api.etherscan.io", + "explorer_token_env_var": "ETHERSCAN_EXPLORER_TOKEN", "github_repo": { "url": "https://github.com/Consensys/linea-contracts-fix", "commit": "0949c4096664e613f73ed3ce51c32f97fc56cdef", diff --git a/config_samples/linea/mainnet/linea_mainnet_config_L1_tokenbridge.json b/config_samples/linea/mainnet/linea_mainnet_config_L1_tokenbridge.json index 5a73d55..0235fca 100644 --- a/config_samples/linea/mainnet/linea_mainnet_config_L1_tokenbridge.json +++ b/config_samples/linea/mainnet/linea_mainnet_config_L1_tokenbridge.json @@ -3,6 +3,7 @@ "0x6ccfd65b0b14f67259c77ca6267104e058ddb292": "TokenBridge" }, "explorer_hostname": "api.etherscan.io", + "explorer_token_env_var": "ETHERSCAN_EXPLORER_TOKEN", "github_repo": { "url": "https://github.com/Consensys/linea-contracts-fix", "commit": "0949c4096664e613f73ed3ce51c32f97fc56cdef", diff --git a/config_samples/linea/mainnet/linea_mainnet_config_L2.json b/config_samples/linea/mainnet/linea_mainnet_config_L2.json index 6eb5959..b2eeda8 100644 --- a/config_samples/linea/mainnet/linea_mainnet_config_L2.json +++ b/config_samples/linea/mainnet/linea_mainnet_config_L2.json @@ -6,6 +6,7 @@ "0xF951d7592e03eDB0Bab3D533935e678Ce64Eb927": "ProxyAdmin" }, "explorer_hostname": "api.lineascan.build", + "explorer_token_env_var": "LINEA_EXPLORER_TOKEN", "github_repo": { "url": "https://github.com/Consensys/linea-contracts-fix", "commit": "0949c4096664e613f73ed3ce51c32f97fc56cdef", diff --git a/config_samples/linea/mainnet/linea_mainnet_config_L2_gov.json b/config_samples/linea/mainnet/linea_mainnet_config_L2_gov.json index 9b7bc4a..08045c1 100644 --- a/config_samples/linea/mainnet/linea_mainnet_config_L2_gov.json +++ b/config_samples/linea/mainnet/linea_mainnet_config_L2_gov.json @@ -3,6 +3,7 @@ "0x74Be82F00CC867614803ffd7f36A2a4aF0405670": "LineaBridgeExecutor" }, "explorer_hostname": "api.lineascan.build", + "explorer_token_env_var": "LINEA_EXPLORER_TOKEN", "github_repo": { "url": "https://github.com/Consensys/governance-crosschain-bridges", "commit": "315308a2640c696937185732159b130417f29997", diff --git a/config_samples/linea/mainnet/linea_mainnet_config_L2_proxy.json b/config_samples/linea/mainnet/linea_mainnet_config_L2_proxy.json index f9e46da..bbe6b19 100644 --- a/config_samples/linea/mainnet/linea_mainnet_config_L2_proxy.json +++ b/config_samples/linea/mainnet/linea_mainnet_config_L2_proxy.json @@ -4,6 +4,7 @@ "0xB5beDd42000b71FddE22D3eE8a79Bd49A568fC8F": "TransparentUpgradeableProxy" }, "explorer_hostname": "api.lineascan.build", + "explorer_token_env_var": "LINEA_EXPLORER_TOKEN", "github_repo": { "url": "https://github.com/Consensys/linea-contracts-fix", "commit": "0949c4096664e613f73ed3ce51c32f97fc56cdef", diff --git a/main.py b/main.py index e6ea877..95debc1 100644 --- a/main.py +++ b/main.py @@ -12,12 +12,8 @@ from utils.logger import logger -EXPLORER_API_TOKEN = load_env("ETHERSCAN_TOKEN", masked=True) GITHUB_API_TOKEN = load_env("GITHUB_API_TOKEN", masked=True) -CONTRACT_ADDRESS = load_env("CONTRACT_ADDRESS", required=False) -CONTRACT_NAME = load_env("CONTRACT_NAME", required=False) - g_skip_user_input: bool = False @@ -128,30 +124,14 @@ def run_diff(config, name, address, explorer_api_token, github_api_token): def process_config(path: str): logger.info(f"Loading config {path}...") config = load_config(path) - - if CONTRACT_ADDRESS is not None: - if CONTRACT_NAME is None: - logger.error( - "Please set the 'CONTRACT_NAME' env var for address", - f"{CONTRACT_ADDRESS}", - ) - sys.exit(1) - - logger.info( - f"Running diff for a single contract {CONTRACT_NAME} deployed at {CONTRACT_ADDRESS}..." - ) - run_diff( - config, - CONTRACT_NAME, - CONTRACT_ADDRESS, - EXPLORER_API_TOKEN, - GITHUB_API_TOKEN, - ) - else: - contracts = config["contracts"] - logger.info(f"Running diff for contracts from config {contracts}...") - for address, name in config["contracts"].items(): - run_diff(config, name, address, EXPLORER_API_TOKEN, GITHUB_API_TOKEN) + explorer_token = None + if "explorer_token_env_var" in config: + explorer_token = load_env(config["explorer_token_env_var"], masked=True, required=False) + + contracts = config["contracts"] + logger.info(f"Running diff for contracts from config {contracts}...") + for address, name in config["contracts"].items(): + run_diff(config, name, address, explorer_token, GITHUB_API_TOKEN) def parse_arguments(): diff --git a/utils/common.py b/utils/common.py index 149dff8..5da67e1 100644 --- a/utils/common.py +++ b/utils/common.py @@ -10,13 +10,13 @@ def load_env(variable_name, required=True, masked=False): - value = os.getenv(variable_name) + value = os.getenv(variable_name, default=None) if required and not value: logger.error("Env not found", variable_name) sys.exit(1) - printable_value = mask_text(value) if masked else value + printable_value = mask_text(value) if masked and value is not None else str(value) if printable_value: logger.okay(f"{variable_name}", printable_value)