Skip to content

Commit a6a6e35

Browse files
committed
feat: add ABI generation & deployment thing
1 parent ed48bf4 commit a6a6e35

File tree

10 files changed

+189
-9
lines changed

10 files changed

+189
-9
lines changed

.gitignore

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ pnpm-lock.yaml
1515
yarn.lock
1616

1717
# broadcasts
18-
!broadcast
19-
broadcast/*
18+
broadcast/**/*
2019
broadcast/*/31337/
20+
21+
!broadcast/Deploy.s.sol/
22+
!broadcast/Deploy.s.sol/*/
23+
!broadcast/Deploy.s.sol/*/run-latest.json
24+
25+
broadcast/*/31337/run-latest.json

broadcast/Deploy.s.sol/8453/run-latest.json

Lines changed: 90 additions & 0 deletions
Large diffs are not rendered by default.

bun.lock

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
"name": "@prb/foundry-template",
66
"dependencies": {
77
"solady": "^0.1.17",
8+
"zod": "^3.24.4",
89
},
910
"devDependencies": {
11+
"@types/bun": "^1.2.12",
12+
"@types/node": "^22.15.17",
1013
"forge-std": "github:foundry-rs/forge-std#v1.8.1",
1114
"prettier": "^3.0.0",
1215
"solhint": "^3.6.2",
@@ -22,6 +25,10 @@
2225

2326
"@solidity-parser/parser": ["@solidity-parser/parser@0.16.2", "", { "dependencies": { "antlr4ts": "^0.5.0-alpha.4" } }, "sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg=="],
2427

28+
"@types/bun": ["@types/bun@1.2.12", "", { "dependencies": { "bun-types": "1.2.12" } }, "sha512-lY/GQTXDGsolT/TiH72p1tuyUORuRrdV7VwOTOjDOt8uTBJQOJc5zz3ufwwDl0VBaoxotSk4LdP0hhjLJ6ypIQ=="],
29+
30+
"@types/node": ["@types/node@22.15.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw=="],
31+
2532
"ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
2633

2734
"ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
@@ -42,6 +49,8 @@
4249

4350
"brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
4451

52+
"bun-types": ["bun-types@1.2.12", "", { "dependencies": { "@types/node": "*" } }, "sha512-tvWMx5vPqbRXgE8WUZI94iS1xAYs8bkqESR9cxBB1Wi+urvfTrF1uzuDgBHFAdO0+d2lmsbG3HmeKMvUyj6pWA=="],
53+
4554
"callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
4655

4756
"chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
@@ -140,12 +149,16 @@
140149

141150
"text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="],
142151

152+
"undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
153+
143154
"uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
144155

145156
"wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
146157

147158
"yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
148159

160+
"zod": ["zod@3.24.4", "", {}, "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg=="],
161+
149162
"@babel/code-frame/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="],
150163

151164
"@babel/highlight/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="],

export.config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// Contracts to export
2+
export const contracts: string[] = ["CommitBox"];
3+
export const networks: number[] = [8453];

foundry.toml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
# Full reference https://github.com/foundry-rs/foundry/tree/master/crates/config
22

33
[profile.default]
4+
bytecode_hash = "none"
5+
cbor_metadata = false
46
auto_detect_solc = false
57
block_timestamp = 1_738_368_000 # Feb 1, 2025 at 00:00 GMT
6-
bytecode_hash = "none"
7-
evm_version = "shanghai"
8+
evm_version = "cancun"
89
fuzz = { runs = 1_000 }
910
gas_reports = ["*"]
1011
optimizer = true
@@ -36,7 +37,7 @@ wrap_comments = true
3637
[rpc_endpoints]
3738
arbitrum = "https://arbitrum-one-rpc.publicnode.com"
3839
avalanche = "https://avalanche-c-chain-rpc.publicnode.com"
39-
base = "https://base-mainnet.public.blastapi.io"
40+
base = "https://base.meowrpc.com"
4041
bnb_smart_chain = "https://bsc-dataseed.binance.org"
4142
gnosis_chain = "https://rpc.gnosischain.com"
4243
localhost = "http://localhost:8545"

generated/abi.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const abis = {"CommitBox":[{"type":"constructor","inputs":[{"name":"_owner","type":"address","internalType":"address"},{"name":"_receiver","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"cancelOwnershipHandover","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"claim","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"commit","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint96","internalType":"uint96"},{"name":"deadline","type":"uint40","internalType":"uint40"},{"name":"claimTime","type":"uint40","internalType":"uint40"},{"name":"text","type":"string","internalType":"string"},{"name":"resolvers","type":"address[]","internalType":"address[]"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"commitments","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint96","internalType":"uint96"},{"name":"user","type":"address","internalType":"address"},{"name":"deadline","type":"uint40","internalType":"uint40"},{"name":"claimTime","type":"uint40","internalType":"uint40"},{"name":"bitmap","type":"uint8","internalType":"uint8"},{"name":"text","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"completeOwnershipHandover","inputs":[{"name":"pendingOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"isResolver","inputs":[{"name":"id","type":"uint256","internalType":"uint256"},{"name":"resolver","type":"address","internalType":"address"}],"outputs":[{"name":"yes","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"listUserCommitments","inputs":[{"name":"user","type":"address","internalType":"address"},{"name":"start","type":"uint256","internalType":"uint256"},{"name":"end","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"subset","type":"tuple[]","internalType":"struct CommitBox.Commitment[]","components":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint96","internalType":"uint96"},{"name":"user","type":"address","internalType":"address"},{"name":"deadline","type":"uint40","internalType":"uint40"},{"name":"claimTime","type":"uint40","internalType":"uint40"},{"name":"bitmap","type":"uint8","internalType":"uint8"},{"name":"text","type":"string","internalType":"string"}]}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"result","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"ownershipHandoverExpiresAt","inputs":[{"name":"pendingOwner","type":"address","internalType":"address"}],"outputs":[{"name":"result","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"receiver","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"requestOwnershipHandover","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"resolve","inputs":[{"name":"id","type":"uint256","internalType":"uint256"},{"name":"happened","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setReceiver","inputs":[{"name":"next","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"userCommitments","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"ids","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"NewCommitment","inputs":[{"name":"id","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"token","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint96","indexed":false,"internalType":"uint96"},{"name":"deadline","type":"uint48","indexed":false,"internalType":"uint48"},{"name":"claimTime","type":"uint48","indexed":false,"internalType":"uint48"},{"name":"text","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"OwnershipHandoverCanceled","inputs":[{"name":"pendingOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipHandoverRequested","inputs":[{"name":"pendingOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"oldOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ReceiverChange","inputs":[{"name":"prev","type":"address","indexed":false,"internalType":"address"},{"name":"next","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Resolved","inputs":[{"name":"id","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"resolver","type":"address","indexed":false,"internalType":"address"},{"name":"happened","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"error","name":"AlreadyInitialized","inputs":[]},{"type":"error","name":"AlreadyResolved","inputs":[]},{"type":"error","name":"BadConfig","inputs":[]},{"type":"error","name":"Early","inputs":[]},{"type":"error","name":"NewOwnerIsZeroAddress","inputs":[]},{"type":"error","name":"NoHandoverRequest","inputs":[]},{"type":"error","name":"Unauthorized","inputs":[]}]}

generated/index.ts

Whitespace-only changes.

generated/networks.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const deployments = {"8453":{"CommitBox":["0xe7cb9454c0eda6b11dafde3dcb93532f72db4774"]}}

package.json

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@
66
"name": "ArvensisSystems",
77
"url": "https://github.com/ArvensisSystems"
88
},
9+
"main": "exported-js/index.ts",
910
"dependencies": {
10-
"solady": "^0.1.17"
11+
"solady": "^0.1.17",
12+
"zod": "^3.24.4"
1113
},
1214
"devDependencies": {
15+
"@types/bun": "^1.2.12",
16+
"@types/node": "^22.15.17",
1317
"forge-std": "github:foundry-rs/forge-std#v1.8.1",
1418
"prettier": "^3.0.0",
1519
"solhint": "^3.6.2"
@@ -20,8 +24,7 @@
2024
"forge",
2125
"foundry",
2226
"smart-contracts",
23-
"solidity",
24-
"template"
27+
"solidity"
2528
],
2629
"private": true,
2730
"scripts": {
@@ -33,6 +36,8 @@
3336
"prettier:write": "prettier --write \"**/*.{json,md,yml}\"",
3437
"test": "forge test",
3538
"test:coverage": "forge coverage",
36-
"test:coverage:report": "forge coverage --report lcov && genhtml lcov.info --branch-coverage --output-dir coverage"
39+
"test:coverage:report": "forge coverage --report lcov && genhtml lcov.info --branch-coverage --output-dir coverage",
40+
"deploy:sol": "forge script script/Deploy.s.sol --rpc-url ${NETWORK:localhost} --broadcast --interactives 1 && bun script/generate.ts",
41+
"generate:abi": "bun script/generate.ts"
3742
}
3843
}

script/generate.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { contracts, networks } from "../export.config";
2+
import fs from "node:fs/promises";
3+
import path from "node:path";
4+
5+
(async function () {
6+
let abis = {};
7+
let deployments = {};
8+
9+
for (let i = 0; i < contracts.length; i++) {
10+
try {
11+
const f = await fs.readFile(path.join("out", `${contracts[i]}.sol`, `${contracts[i]}.json`), {
12+
encoding: "utf8",
13+
});
14+
const parsed = JSON.parse(f);
15+
abis[contracts[i]] = parsed.abi;
16+
} catch (e) {
17+
console.error(`An issue occurred trying to process the contract ABI ${contracts[i]}:`);
18+
console.error(e);
19+
process.exit(1);
20+
}
21+
}
22+
try {
23+
await fs.writeFile("generated/abi.ts", `export const abis = ${JSON.stringify(abis)}`);
24+
} catch (e) {
25+
console.error(`An issue occurred trying to save ABIs:`);
26+
console.error(e);
27+
process.exit(1);
28+
}
29+
30+
for (let i = 0; i < networks.length; i++) {
31+
try {
32+
const f = await fs.readFile(path.join("broadcast", "Deploy.s.sol", networks[i].toString(), "run-latest.json"), {
33+
encoding: "utf8",
34+
});
35+
const parsed = JSON.parse(f);
36+
37+
parsed.transactions.forEach((tx: any) => {
38+
if (tx.transactionType.includes("CREATE")) {
39+
if (!deployments[networks[i]]) deployments[networks[i]] = {};
40+
41+
if (deployments[networks[i]][tx.contractName]) {
42+
deployments[networks[i]][tx.contractName].push(tx.contractAddress);
43+
} else {
44+
deployments[networks[i]][tx.contractName] = [tx.contractAddress];
45+
}
46+
}
47+
});
48+
} catch (e) {
49+
console.error(`An issue occurred trying to process the deployments on network ${networks[i]}:`);
50+
console.error(e);
51+
process.exit(1);
52+
}
53+
}
54+
try {
55+
await fs.writeFile("generated/networks.ts", `export const deployments = ${JSON.stringify(deployments)}`);
56+
} catch (e) {
57+
console.error(`An issue occurred trying to save deployments:`);
58+
console.error(e);
59+
process.exit(1);
60+
}
61+
})();

0 commit comments

Comments
 (0)