Skip to content

Commit 9a2afaf

Browse files
committed
feat: add scripts and diff for mantle
1 parent 464a0ea commit 9a2afaf

File tree

1,159 files changed

+380179
-3
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,159 files changed

+380179
-3
lines changed

.gitignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ out/
99

1010
# artifacts
1111
reports/
12-
diffs/
13-
downloads/
1412

1513
# editors
1614
.idea

diff.ts

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
#!/usr/bin/env node
2+
3+
import {ethers} from 'ethers';
4+
import {CONTRACTS, PROXIES, CHAIN_ID, Networks} from './diff_config';
5+
import child_process from 'child_process';
6+
import dotenv from 'dotenv';
7+
import fs from 'fs';
8+
dotenv.config();
9+
10+
function runCmd(cmd: string) {
11+
var resp = child_process.execSync(cmd);
12+
var result = resp.toString();
13+
return result;
14+
}
15+
16+
const API_KEYS = {
17+
[Networks.MANTLE]: process.env.ETHERSCAN_API_KEY_MANTLE,
18+
[Networks.LINEA]: process.env.ETHERSCAN_API_KEY_LINEA,
19+
[Networks.FACTORY_LOCAL]: undefined,
20+
};
21+
22+
const RPC_URLS = {
23+
[Networks.MANTLE]: process.env.RPC_MANTLE,
24+
[Networks.LINEA]: process.env.RPC_LINEA,
25+
[Networks.FACTORY_LOCAL]: undefined,
26+
};
27+
28+
function download(network: Networks, contractName: string, address: string) {
29+
if (!fs.existsSync(`downloads/${network}/${contractName}`)) {
30+
console.log('downloading', contractName);
31+
let extraFlags;
32+
if (network == Networks.MANTLE) extraFlags = ('--explorer-api-url https://api.mantlescan.xyz/api');
33+
runCmd(
34+
`cast source --chain-id ${CHAIN_ID[network]} -d downloads/${network}/${contractName} ${address} --etherscan-api-key ${API_KEYS[network]} ${extraFlags}`
35+
);
36+
}
37+
}
38+
39+
function getImpl(network: Networks, address: string) {
40+
const x = runCmd(
41+
`cast storage --rpc-url ${RPC_URLS[network]} ${address} 24440054405305269366569402256811496959409073762505157381672968839269610695612 --etherscan-api-key ${API_KEYS[network]}`
42+
).replace('\n', '');
43+
return ethers.getAddress(x.slice(-40));
44+
}
45+
46+
function diffContracts(commonContracts: string[], network1: string, network2: string) {
47+
try {
48+
commonContracts.map((contractName) => {
49+
PROXIES.includes(contractName) && (contractName = contractName + '_IMPL');
50+
const sourcePathNetwork1 =
51+
network1 != 'FACTORY_LOCAL'
52+
? `./downloads/${network1}/${contractName}.sol`
53+
: `./downloads/FACTORY_LOCAL/${contractName}.sol`;
54+
const sourcePathNetwork2 =
55+
network2 != 'FACTORY_LOCAL'
56+
? `./downloads/${network2}/${contractName}.sol`
57+
: `./downloads/FACTORY_LOCAL/${contractName}.sol`;
58+
const outPath = `${network1}_${network2}/${contractName}_DIFF`;
59+
runCmd(
60+
`make git-diff before=${sourcePathNetwork1} after=${sourcePathNetwork2} out=${outPath}`
61+
);
62+
});
63+
} catch (e) {
64+
console.log(e);
65+
throw new Error('oops... failed to diff contracts');
66+
}
67+
}
68+
69+
function flatten(network: string, name: string, path: string) {
70+
console.log('flattening contract', name);
71+
const sourcePath =
72+
network != 'FACTORY_LOCAL' ? `./downloads/${network}/${name}/${path}` : `./${path}`;
73+
const outPath =
74+
network != 'FACTORY_LOCAL'
75+
? `./downloads/${network}/${name}.sol`
76+
: `./downloads/FACTORY_LOCAL/${name}.sol`;
77+
runCmd(`forge flatten ${sourcePath} --output ${outPath}`);
78+
}
79+
80+
function downloadContracts(commonContracts: string[], network: Networks) {
81+
commonContracts.map((key) => {
82+
const isProxy = PROXIES.includes(key);
83+
const contractName = isProxy ? `${key}_IMPL` : key;
84+
const address = isProxy
85+
? getImpl(network, CONTRACTS[network][key].address as string)
86+
: CONTRACTS[network][key].address;
87+
download(network, contractName, address as string);
88+
});
89+
}
90+
91+
function flattenContracts(commonContracts: string[], network: Networks) {
92+
commonContracts.map((key) => {
93+
const isProxy = PROXIES.includes(key);
94+
const contractName = isProxy ? `${key}_IMPL` : key;
95+
flatten(network, contractName, CONTRACTS[network as keyof typeof CONTRACTS][key].path);
96+
});
97+
}
98+
99+
async function main() {
100+
// get networks to diff against from the command line input
101+
const network1 = process.argv[2] as Networks;
102+
const network2 = process.argv[3] as Networks;
103+
104+
console.log(`comparing diffs between ${network1}, ${network2}`);
105+
106+
// find all the common contracts to compare between both the networks.
107+
const commonContracts = Object.keys(CONTRACTS[network1 as keyof typeof CONTRACTS]).filter((key) =>
108+
CONTRACTS[network2 as keyof typeof CONTRACTS].hasOwnProperty(key)
109+
);
110+
111+
if (network1 != 'FACTORY_LOCAL') {
112+
downloadContracts(commonContracts, network1);
113+
}
114+
if (network2 != 'FACTORY_LOCAL') {
115+
downloadContracts(commonContracts, network2);
116+
}
117+
118+
flattenContracts(commonContracts, network1);
119+
flattenContracts(commonContracts, network2);
120+
121+
diffContracts(commonContracts, network1, network2);
122+
}
123+
124+
main();

0 commit comments

Comments
 (0)