From e409f1776ce6f82db39e46ed6941f7af3add07ba Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Tue, 5 Nov 2024 15:00:25 -0500 Subject: [PATCH] chore: remove foundry install --- .github/workflows/ci.yaml | 18 +++ .gitignore | 2 + Cargo.lock | 2 - Cargo.toml | 4 - build.rs | 104 ------------------ bytecode/Erc1271Mock.sol/Erc1271Mock.bytecode | Bin 0 -> 1202 bytes .../Erc6492.sol/ValidateSigOffchain.bytecode | Bin 0 -> 3483 bytes devloop.sh | 8 ++ src/lib.rs | 12 +- src/test_helpers.rs | 18 +-- 10 files changed, 34 insertions(+), 134 deletions(-) delete mode 100644 build.rs create mode 100644 bytecode/Erc1271Mock.sol/Erc1271Mock.bytecode create mode 100644 bytecode/Erc6492.sol/ValidateSigOffchain.bytecode diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5fbe6ea..43710a1 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -19,6 +19,8 @@ jobs: - nightly steps: - uses: actions/checkout@v4 + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - run: cargo test --workspace --all-features --all-targets - run: cargo test --workspace --all-features --doc @@ -36,3 +38,19 @@ jobs: steps: - uses: actions/checkout@v4 - run: cargo fmt --all -- --check + + # `git diff bytecode` shows changes but I'm not sure why. Disabling for now + # verify-bytecode: + # name: Verify Bytecode + # runs-on: ubuntu-latest + # steps: + # - uses: actions/checkout@v4 + # - name: Install Foundry + # uses: foundry-rs/foundry-toolchain@v1 + # - run: forge build --contracts=contracts + # - run: mkdir -p bytecode/Erc6492.sol + # - run: jq -r .bytecode.object out/Erc6492.sol/ValidateSigOffchain.json | xxd -r -p > bytecode/Erc6492.sol/ValidateSigOffchain.bytecode + # - run: mkdir -p bytecode/Erc1271Mock.sol + # - run: jq -r .bytecode.object out/Erc1271Mock.sol/Erc1271Mock.json | xxd -r -p > bytecode/Erc1271Mock.sol/Erc1271Mock.bytecode + # - run: git diff bytecode + # - run: if [ -n "$(git diff bytecode)" ]; then exit 1; fi diff --git a/.gitignore b/.gitignore index ea8c4bf..1e949f5 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /target +/out +/cache diff --git a/Cargo.lock b/Cargo.lock index 1eec1dd..b1c5608 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1138,9 +1138,7 @@ version = "0.1.0" dependencies = [ "alloy", "alloy-node-bindings", - "alloy-primitives 0.8.0", "regex", - "serde_json", "tokio", ] diff --git a/Cargo.toml b/Cargo.toml index ade7b5f..052f969 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,3 @@ alloy = { version = "0.3", features = ["signer-local"] } alloy-node-bindings = { git = "https://github.com/alloy-rs/alloy.git", rev = "d68a6b7" } regex = "1" tokio = { version = "1", features = ["full"] } - -[build-dependencies] -alloy-primitives = { version = "0.8.0" } -serde_json = "1" diff --git a/build.rs b/build.rs deleted file mode 100644 index 1232c5c..0000000 --- a/build.rs +++ /dev/null @@ -1,104 +0,0 @@ -use { - serde_json::Value, - std::process::{Command, Stdio}, -}; - -fn main() { - build_contracts(); -} - -fn build_contracts() { - println!("cargo::rerun-if-changed=contracts"); - install_foundry(); - compile_contracts(); - extract_bytecodes(); -} - -fn format_foundry_dir(path: &str) -> String { - format!( - "{}/../../../../.foundry/{}", - std::env::var("OUT_DIR").unwrap(), - path - ) -} - -fn install_foundry() { - let bin_finished_flag = format_foundry_dir("bin/.finished"); - if std::fs::metadata(&bin_finished_flag).is_ok() { - return; - } - - let bin_folder = format_foundry_dir("bin"); - std::fs::remove_dir_all(&bin_folder).ok(); - std::fs::create_dir_all(&bin_folder).unwrap(); - let output = Command::new("bash") - .args(["-c", &format!("curl https://raw.githubusercontent.com/foundry-rs/foundry/e0ea59cae26d945445d9cf21fdf22f4a18ac5bb2/foundryup/foundryup | FOUNDRY_DIR={} bash", format_foundry_dir(""))]) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .spawn() - .unwrap() - .wait_with_output() - .unwrap(); - println!("foundryup status: {:?}", output.status); - let stdout = String::from_utf8(output.stdout).unwrap(); - println!("foundryup stdout: {stdout:?}"); - let stderr = String::from_utf8(output.stderr).unwrap(); - println!("foundryup stderr: {stderr:?}"); - assert!(output.status.success()); - - std::fs::write(bin_finished_flag, "").unwrap(); -} - -fn compile_contracts() { - let output = Command::new(format_foundry_dir("bin/forge")) - .args([ - "build", - "--contracts=contracts", - "--cache-path", - &format_foundry_dir("forge/cache"), - "--out", - &format_foundry_dir("forge/out"), - ]) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .spawn() - .unwrap() - .wait_with_output() - .unwrap(); - println!("forge status: {:?}", output.status); - let stdout = String::from_utf8(output.stdout).unwrap(); - println!("forge stdout: {stdout:?}"); - let stderr = String::from_utf8(output.stderr).unwrap(); - println!("forge stderr: {stderr:?}"); - assert!(output.status.success()); -} - -const ERC6492_FILE: &str = "forge/out/Erc6492.sol/ValidateSigOffchain.json"; -const ERC6492_BYTECODE_FILE: &str = "forge/out/Erc6492.sol/ValidateSigOffchain.bytecode"; -const ERC1271_MOCK_FILE: &str = "forge/out/Erc1271Mock.sol/Erc1271Mock.json"; -const ERC1271_MOCK_BYTECODE_FILE: &str = "forge/out/Erc1271Mock.sol/Erc1271Mock.bytecode"; -fn extract_bytecodes() { - extract_bytecode( - &format_foundry_dir(ERC6492_FILE), - &format_foundry_dir(ERC6492_BYTECODE_FILE), - ); - extract_bytecode( - &format_foundry_dir(ERC1271_MOCK_FILE), - &format_foundry_dir(ERC1271_MOCK_BYTECODE_FILE), - ); -} - -fn extract_bytecode(input_file: &str, output_file: &str) { - let contents = serde_json::from_slice::(&std::fs::read(input_file).unwrap()).unwrap(); - let bytecode = contents - .get("bytecode") - .unwrap() - .get("object") - .unwrap() - .as_str() - .unwrap() - .strip_prefix("0x") - .unwrap(); - let bytecode = alloy_primitives::hex::decode(bytecode).unwrap(); - std::fs::write(output_file, bytecode).unwrap(); -} diff --git a/bytecode/Erc1271Mock.sol/Erc1271Mock.bytecode b/bytecode/Erc1271Mock.sol/Erc1271Mock.bytecode new file mode 100644 index 0000000000000000000000000000000000000000..fccd1d0b478b0fa8d5f85f2fcc7b6a0c94720eb3 GIT binary patch literal 1202 zcmb_bK}-`t6rFLKXyU;N?HVkE4WNWz0zpB*fJKxT4`z4OuCXEhu~cY6T5SOjCUmD= zz>CT5qP-ajR*{Pu4<>r@V&XxKH*bmuV?1*)M!-Ma_JDzdi96ZZnZJMLzxV%tU_w|w zVg_N40mNL3su0$g?|HXm;+*f{6vEur;gADrB#IvAf#O&QNi}k1<=U?7*v>xt0!#}Z zP;!=36$Iwp$hC?imw5ngc-DDWRq;mVJ76+$8%Ph3)paO?VZ>iS(u%uISgAE* z^1)Zr0Y=&lfn_bq$RH#AUEpKVF}#cb#t(b(RuH1?$Xo{nIcTOM*{dFbu&IFp^|O@Q zKE5MIIkjEgLdP;QL5GoN&YWY<;o!DK^EoqT9R=c2B&w^7eD>g1j>r-t?+i7zyL$LI zd<`-3DT0|4_X!x$GFc#)i-7>6XADGiWhnF>zJ&xp@a3ouz0f2+M8IRxM@+uv=x`Ek z*(ReQB>=`{Ae2*3n>eHZ;;X7Tf*-9H`vXYW(BEC z#u0c0HlqWPXbv`H2nB*>knIQ=2u5)``CkH0Z4($oLl991PR+c23)_8TMs|3q z)&QL5(PDC%!wG^-hGpQPO<6+~xsFg0#zyIdtyz>FlT=SX`A$~_#iE^~ zmGX*0N=fgpMWLS4*=iYPCoW5^94{)3G}Y&&X;r?JA3-(b!>JZ zI&^?fhbBzJ`ngK8MnvzjiB!5V9gn4^;%V_Go?aYDT)UdN*ifYePh^Wr;lk4oFACqE iwDej<-~Ce!#fQCbUN?5{ytmpil1Yun2Fb4d7^`sr literal 0 HcmV?d00001 diff --git a/bytecode/Erc6492.sol/ValidateSigOffchain.bytecode b/bytecode/Erc6492.sol/ValidateSigOffchain.bytecode new file mode 100644 index 0000000000000000000000000000000000000000..069298630d36b65c905d73ce577fade7f82440c8 GIT binary patch literal 3483 zcmai1U2I!t89twnC@fuI9ri1tHpvb#CdVG_F7us;c$at9&4*6YqzUb(KN` zNm`JmvGZp;{UIDXN!Mv=Rk)ZY4R%2U7yE&U3qTr0Z~=mgNd>e@>;jn9i)va{p7;A~ zHy$lJC-(98o%efxpZ6!^QK|BvmzBn_Lx#8N+Egmb_0N6L^za?-^#zsuxFU`FT2gGQ zx@7QsV>Fh=n^={~UdxQh_>Y%m9$#}t!DJu4z$muK@JZmloHui|AEcuD8;u5zM75i^ za&$HCS12i@v9Q=~#WEql&|;RM>66hMe@F5B$y%Pa&H9Z}VG9)kkqZQ?Z~Fr3{E=B4 zth%x7kx_xv!n>|q_Zd$n=EA)quDZ2HzVhU^A(Y?lr(}h;v6^JKp+B6JBJcRVD2IWl zkR_xrt1e_2Em2{k!ICIyn43VjS34>!cWv`?{)iN|-X^Oq%2aBIa%;(M+lr=?H~oz` zIjcz`=;n*YW+@`Q;b~S~vWt!s7p3vG@-N#7b7Mb8VRN{vblsyMp5dcD|&*y;zwK?CM!gWk5~ zy0j;a0vUVBc(?a@4J4Dhho!L})J3|w)vKNQ#i6%Hq;bIU6sqv^oA`O*-}n3lKRt)z zwdw+m(m1l4l5%i;6{|(%&KL@DfIG+qM40SJMFwZcfjvx%t%X}#KUcPOfZWVIOcXpl z(foMunp8YC4M4?S7Hx+$HwSyTroO^i5;H7fBkYa6k)iN88B z@%yuUkx-yhHraAu2l9>$nf~1Jv$t^|TXi*WZt-(nQ%Ah4FU`$}a@K_qv%o^?$|Ylt zGiB7 z#ZI;;$u;01+J?u|j~+jELe8C>nXJmG;}ddjdgfCzleOtnlQaBga)!RlR1aClPn==` zYqm>oO--ISHur>~E}CGL5o*W^+-FGhIskv>oK6dKRi_1a4Vm0PC9=+bU%yIz{MM^8 zXV8!QVVS(o!AA}qsJdK+igaTuz)g7{UW;Y&u!Amu7PEDPO;7&xw#MzalX3lqDC4G- z`PL~52A-Ux3;BLy7+VIr%@73~M4^MA-3s5#rH-??Nsn5z}QP2po@t zX6!{~Tpxdr!#6P8-}Mxc+3PsDk@Gs>wtK!4dUzDzdid+xPwFf&;`?J&C}TPBL_FWQ zA@a0Nl%qJnlKYzNK(k-$oto{yi^%(-pK-Hwd*%O*;;;3@&&U29q<0cE^~u{OYU&=H zs1V7CntDbjYU=PuBx>pi4yY=|J=Tv+nObx(T=->RC^hTgqcB8POQ3CYY;GV4bLu(L zMwYw;SRr$RRoIFZ%g2pEtGa$_g^MrB9`?Bi7b3AqrhePm^oz%M(&3Byf9k5<=U&{h zLx8_71n=L_`)J28%ThhF%NcAtf0vu5xw#H**VK)o9Q=YWQxXUxPn)HTZionAaLCUs!s^R=`Dn^G%<Bry;Wb21!vNiVVp)7p`)-Rx~* z+~sQBKt;aH^Dh3$QDr);)9WfI^m;uMx`MZ}ST{Zm< z{idrJbWz##!H*`6f9vttuim@KD$d;X+|FmOedo~QuN?lv(Vd&0n%wos&DTEryYb!E We!T5hhtE&UPEXaoWTZb~?D{XMfU$-E literal 0 HcmV?d00001 diff --git a/devloop.sh b/devloop.sh index dc96892..7b4989b 100755 --- a/devloop.sh +++ b/devloop.sh @@ -1,6 +1,14 @@ #!/bin/bash set -e +forge build --contracts=contracts + +mkdir -p bytecode/Erc6492.sol +jq -r .bytecode.object out/Erc6492.sol/ValidateSigOffchain.json | xxd -r -p > bytecode/Erc6492.sol/ValidateSigOffchain.bytecode + +mkdir -p bytecode/Erc1271Mock.sol +jq -r .bytecode.object out/Erc1271Mock.sol/Erc1271Mock.json | xxd -r -p > bytecode/Erc1271Mock.sol/Erc1271Mock.bytecode + cargo fmt --all cargo clippy --workspace --all-features --all-targets -- -D warnings cargo test --workspace --all-features --all-targets diff --git a/src/lib.rs b/src/lib.rs index 4e02107..7f968a5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,10 +13,8 @@ sol! { constructor (address _signer, bytes32 _hash, bytes memory _signature); } } -const VALIDATE_SIG_OFFCHAIN_BYTECODE: &[u8] = include_bytes!(concat!( - env!("OUT_DIR"), - "/../../../../.foundry/forge/out/Erc6492.sol/ValidateSigOffchain.bytecode" -)); +const VALIDATE_SIG_OFFCHAIN_BYTECODE: &[u8] = + include_bytes!("../bytecode/Erc6492.sol/ValidateSigOffchain.bytecode"); #[must_use] #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -374,10 +372,8 @@ mod test { ); } - const ERC1271_MOCK_BYTECODE: &[u8] = include_bytes!(concat!( - env!("OUT_DIR"), - "/../../../../.foundry/forge/out/Erc1271Mock.sol/Erc1271Mock.bytecode" - )); + const ERC1271_MOCK_BYTECODE: &[u8] = + include_bytes!("../bytecode/Erc1271Mock.sol/Erc1271Mock.bytecode"); const ERC6492_MAGIC_BYTES: [u16; 16] = [ 0x6492, 0x6492, 0x6492, 0x6492, 0x6492, 0x6492, 0x6492, 0x6492, 0x6492, 0x6492, 0x6492, 0x6492, 0x6492, 0x6492, 0x6492, 0x6492, diff --git a/src/test_helpers.rs b/src/test_helpers.rs index 26e0b4c..6280431 100644 --- a/src/test_helpers.rs +++ b/src/test_helpers.rs @@ -12,21 +12,13 @@ use { tokio::process::Command, }; -fn format_foundry_dir(path: &str) -> String { - format!( - "{}/../../../../.foundry/{}", - std::env::var("OUT_DIR").unwrap(), - path - ) -} - pub fn spawn_anvil() -> ( AnvilInstance, String, ReqwestProvider, LocalSigner, ) { - let anvil = Anvil::at(format_foundry_dir("bin/anvil")).spawn(); + let anvil = Anvil::new().spawn(); let rpc_url = anvil.endpoint(); let provider = ReqwestProvider::::new_http(anvil.endpoint_url()); let private_key = anvil.keys().first().unwrap().clone(); @@ -48,8 +40,6 @@ pub async fn deploy_contract( constructor_arg: Option<&str>, ) -> Address { let key_encoded = hex::encode(signer.to_bytes()); - let cache_folder = format_foundry_dir("forge/cache"); - let out_folder = format_foundry_dir("forge/out"); let mut args = vec![ "create", "--contracts=contracts", @@ -58,16 +48,12 @@ pub async fn deploy_contract( rpc_url, "--private-key", &key_encoded, - "--cache-path", - &cache_folder, - "--out", - &out_folder, ]; if let Some(arg) = constructor_arg { args.push("--constructor-args"); args.push(arg); } - let output = Command::new(format_foundry_dir("bin/forge")) + let output = Command::new("forge") .args(args) .stdout(Stdio::piped()) .stderr(Stdio::piped())