diff --git a/Cargo.lock b/Cargo.lock index 82ab8111fb42d..e03cd75caa93a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -70,9 +70,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d213580c17d239ae83c0d897ac3315db7cda83d2d4936a9823cc3517552f2e24" +checksum = "b190875b4e4d8838a49e9c1489a27c07583232a269a1a625a8260049134bd6be" dependencies = [ "alloy-eips", "alloy-primitives", @@ -95,9 +95,9 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81443e3b8dccfeac7cd511aced15928c97ff253f4177acbb97de97178e543f6c" +checksum = "545370c7dc047fa2c632a965b76bb429cc24674d2fcddacdcb0d998b09731b9e" dependencies = [ "alloy-consensus", "alloy-eips", @@ -109,9 +109,9 @@ dependencies = [ [[package]] name = "alloy-contract" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de217ab604f1bcfa2e3b0aff86d50812d5931d47522f9f0a949cc263ec2d108e" +checksum = "467fa23a566ec1e3b0474b5c1e2ab9970ed4764c067d5435c86b4e0310179192" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -175,9 +175,9 @@ dependencies = [ [[package]] name = "alloy-eip5792" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0baba5cccea245cdf17fdb0aa4dabeb5aadb2f4239829c041900aa2f07c386a2" +checksum = "1fc18ce191e53e477ac0c2c6c4f4d71af574d0b09c961297a01e176402050d5f" dependencies = [ "alloy-primitives", "alloy-serde", @@ -200,9 +200,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a15b4b0f6bab47aae017d52bb5a739bda381553c09fb9918b7172721ef5f5de" +checksum = "2a33d1723ecf64166c2a0371e25d1bce293b873527a7617688c9375384098ea1" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -222,9 +222,9 @@ dependencies = [ [[package]] name = "alloy-ens" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "becb0c6c71cd2bda64a92d63dde68e650fc3c3515f0de6473cf3b88b10ed7417" +checksum = "753cf4290b3b9913180abbd60285bdf22f71ad0d86bf92671ecf998ebf773f14" dependencies = [ "alloy-contract", "alloy-primitives", @@ -256,9 +256,9 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ba1cbc25a07e0142e8875fcbe80e1fdb02be8160ae186b90f4b9a69a72ed2b" +checksum = "3865dd77a0fcbe61a35f08171af54d54617372df0544d7626f9ee5a42103c825" dependencies = [ "alloy-eips", "alloy-primitives", @@ -269,9 +269,9 @@ dependencies = [ [[package]] name = "alloy-hardforks" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cf0e627944d913ad4347915afe1c1fb275d4d71e269a77ef31f4ce2016a695" +checksum = "8d66cfdf265bf52c0c4a952960c854c3683c71ff2fc02c9b8c317c691fd3bc28" dependencies = [ "alloy-chains", "alloy-eip2124", @@ -294,9 +294,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8882ec8e4542cfd02aadc6dccbe90caa73038f60016d936734eb6ced53d2167" +checksum = "d24aba9adc7e22cec5ae396980cac73792f5cb5407dc1efc07292e7f96fb65d5" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -309,9 +309,9 @@ dependencies = [ [[package]] name = "alloy-network" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d6d87d588bda509881a7a66ae77c86514bd1193ac30fbff0e0f24db95eb5a5" +checksum = "c3e52ba8f09d0c31765582cd7f39ede2dfba5afa159f1376afc29c9157564246" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -335,9 +335,9 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b14fa9ba5774e0b30ae6a04176d998211d516c8af69c9c530af7c6c42a8c508" +checksum = "f37bf78f46f2717973639c4f11e6330691fea62c4d116d720e0dcfd49080c126" dependencies = [ "alloy-consensus", "alloy-eips", @@ -365,9 +365,9 @@ dependencies = [ [[package]] name = "alloy-op-hardforks" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0113a49d2cb6549aa491884f61a31555b73ba6045a06c8a08b0049b33c6e765f" +checksum = "a8a2823360cd87c008df4b8b78794924948c3508e745dfed7d2b685774cb473e" dependencies = [ "alloy-chains", "alloy-hardforks", @@ -389,7 +389,7 @@ dependencies = [ "foldhash", "getrandom 0.3.3", "hashbrown 0.15.5", - "indexmap 2.11.1", + "indexmap 2.11.4", "itoa", "k256", "keccak-asm", @@ -406,9 +406,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "475a5141313c3665b75d818be97d5fa3eb5e0abb7e832e9767edd94746db28e3" +checksum = "74580f7459337cd281a6bfa2c8f08a07051cb3900e0edaa27ccb21fb046041ed" dependencies = [ "alloy-chains", "alloy-consensus", @@ -451,9 +451,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f97c18795ce1ce8151c5539ce1e4200940389674173f677c7455f79bfb00e5df" +checksum = "69a1849b705f8659614e2f2c3aea4a71514a33b085ce66078cd0ceb30db4c7f3" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -495,9 +495,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25289674cd8c58fcca2568b5350423cb0dd7bca8c596c5e2869bfe4c5c57ed14" +checksum = "bca26070f1fc94d69e8d41fcde991b0556dbf8fac737dc09102d461d957a1bb9" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -521,9 +521,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39676beaa50db545cf15447fc94ec5513b64e85a48357a0625b9a04aef08a910" +checksum = "c079797bbda28d6a5a2e89bcbf788bf85b4ae2a4f0e57eed9e2d66637fe78c58" dependencies = [ "alloy-primitives", "alloy-rpc-types-anvil", @@ -537,9 +537,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c8cad42fa936000be72ab80fcd97386a6a226c35c2989212756da9e76c1521" +checksum = "254361c29ceea0c673be16838066465ffad41bdebf62acae97a2acb6ec085556" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -549,9 +549,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01bac57c987c93773787619e20f89167db74d460a2d1d40f591d94fb7c22c379" +checksum = "c14ba5de4025eb7ce19a5c19706b3c2fd86a0b4f9ad8c9ef0dce0d5e66be7157" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -560,9 +560,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-debug" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2fe118e6c152d54cb4549b9835fb87d38b12754bb121375183ee3ec84bd0849" +checksum = "01289dae0aa187f76bb964f3fa2dcd86e70de033f3f048caddf677066e8f47e7" dependencies = [ "alloy-primitives", "derive_more", @@ -572,9 +572,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a41624eb84bc743e414198bf10eb48b611a5554d6a9fd6205f7384d57dfd7f" +checksum = "997de3fb8ad67674af70c123d2c6344e8fb0cbbd7fb96fde106ee9e45a2912d2" dependencies = [ "alloy-consensus", "alloy-eips", @@ -590,9 +590,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd1e1b4dcdf13eaa96343e5c0dafc2d2e8ce5d20b90347169d46a1df0dec210" +checksum = "7357279a96304232d37adbe2064a9392dddd9b0e8beca2a12a8fc0872c8a81dd" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -611,9 +611,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc33d9d0e0b3cfe9c2e82a1a427c9ed516fcfebe764f0adf7ceb8107f702dd1" +checksum = "3741bce3ede19ed040d8f357a88a4aae8f714e4d07da7f2a11b77a698386d7e1" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -625,9 +625,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-txpool" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fa9e9b3e613425d2a2ee1a322bdad5f1cedf835406fd4b59538822500b44bc" +checksum = "e5d36139df081dd51d204aa7e96ecd84ec2c4446501bca0ee75f7abdc5b0e8fc" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -637,9 +637,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b3b1078b8775077525bc9fe9f6577e815ceaecd6c412a4f3b4d8aa2836e8f6" +checksum = "5f0ee5af728e144e0e5bde52114c7052249a9833d9fba79aeacfbdee1aad69e8" dependencies = [ "alloy-primitives", "serde", @@ -648,9 +648,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10ab1b8d4649bf7d0db8ab04e31658a6cc20364d920795484d886c35bed3bab4" +checksum = "0efbce76baf1b012e379a5e486822c71b0de0a957ddedd5410427789516a47b9" dependencies = [ "alloy-dyn-abi", "alloy-primitives", @@ -665,9 +665,9 @@ dependencies = [ [[package]] name = "alloy-signer-aws" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a46118173eb381b2911202a83dc4f39267027b0fe7d3533449f5e4ebc0eadcab" +checksum = "458e09277fb148e16c85077df1c1df6b4271ad3414aa17e4deb45502fec7eb36" dependencies = [ "alloy-consensus", "alloy-network", @@ -684,9 +684,9 @@ dependencies = [ [[package]] name = "alloy-signer-gcp" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a6aae8a120c191cc5b333bafa9877b3d5ccb2174ea25b6c2c08df28ca9d64b" +checksum = "fb0e13232c7010e54de8b5e923b87795710d84fd35009c13c989a639af742f8c" dependencies = [ "alloy-consensus", "alloy-network", @@ -702,9 +702,9 @@ dependencies = [ [[package]] name = "alloy-signer-ledger" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feb0444055415b5d97c84b0f5d7a611849e68b63caa574aa1737035310dc1dba" +checksum = "e20d6b410d1db2f470da70743f845f51192bbbc32737cbd5498e4cdf8031f132" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -715,16 +715,16 @@ dependencies = [ "async-trait", "coins-ledger", "futures-util", - "semver 1.0.26", + "semver 1.0.27", "thiserror 2.0.16", "tracing", ] [[package]] name = "alloy-signer-local" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bdeec36c8d9823102b571b3eab8b323e053dc19c12da14a9687bd474129bf2a" +checksum = "f52345adc3b784889659ff2930c02047974916b6aacbf0ae013ee6578d2df266" dependencies = [ "alloy-consensus", "alloy-network", @@ -742,16 +742,16 @@ dependencies = [ [[package]] name = "alloy-signer-trezor" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0be2329afbeb7318ed33b8f69b94c30a4ef71c81557bfb3d579acacb4a4fe670" +checksum = "a2d55d030c9396e95082c638578d4dc15be983e8e3d3a1f0f1300a2cd0de959a" dependencies = [ "alloy-consensus", "alloy-network", "alloy-primitives", "alloy-signer", "async-trait", - "semver 1.0.26", + "semver 1.0.27", "thiserror 2.0.16", "tracing", "trezor-client", @@ -781,7 +781,7 @@ dependencies = [ "alloy-sol-macro-input", "const-hex", "heck", - "indexmap 2.11.1", + "indexmap 2.11.4", "proc-macro-error2", "proc-macro2", "quote", @@ -832,9 +832,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce5129146a76ca6139a19832c75ad408857a56bcd18cd2c684183b8eacd78d8" +checksum = "7200a72ccda236bc841df56964b1f816f451e317b172538ba3977357e789b8bd" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -856,9 +856,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2379d998f46d422ec8ef2b61603bc28cda931e5e267aea1ebe71f62da61d101" +checksum = "70e4b8f9a796065824ef6cee4eef88a0887b03e963d6ad526f1c8de369a44472" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -871,9 +871,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "041aa5db2e907692a9a93a0a908057665c03e59364e1fbbeed613511a0159289" +checksum = "dba7bd49c83873ea3e9447531fd26a205638b0c6d46c244c9cbfeb839855a420" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -891,9 +891,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6d44395e6793566e9c89bd82297cc4b0566655c1e78a1d69362640814784cc6" +checksum = "2a252f2451d53d6e0d85dfa96f193e698a777d1def51e8611805c0fd7e40d8e2" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -925,9 +925,9 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b5becb9c269a7d05a2f28d549f86df5a5dbc923e2667eff84fdecac8cda534c" +checksum = "fb91a93165a8646618ae6366f301ec1edd52f452665c371e12201516593925a0" dependencies = [ "alloy-primitives", "darling 0.21.3", @@ -1029,9 +1029,9 @@ dependencies = [ [[package]] name = "anstyle-svg" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc03a770ef506fe1396c0e476120ac0e6523cf14b74218dd5f18cd6833326fa9" +checksum = "26b9ec8c976eada1b0f9747a3d7cc4eae3bef10613e443746e7487f26c872fde" dependencies = [ "anstyle", "anstyle-lossy", @@ -2238,7 +2238,7 @@ dependencies = [ "boa_interner", "boa_macros", "boa_string", - "indexmap 2.11.1", + "indexmap 2.11.4", "num-bigint", "rustc-hash", ] @@ -2264,7 +2264,7 @@ dependencies = [ "fast-float2", "hashbrown 0.15.5", "icu_normalizer", - "indexmap 2.11.1", + "indexmap 2.11.4", "intrusive-collections", "itertools 0.13.0", "num-bigint", @@ -2310,7 +2310,7 @@ dependencies = [ "boa_gc", "boa_macros", "hashbrown 0.15.5", - "indexmap 2.11.1", + "indexmap 2.11.4", "once_cell", "phf", "rustc-hash", @@ -2493,11 +2493,11 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.12" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0b03af37dad7a14518b7691d81acb0f8222604ad3d1b02f6b4bed5188c0cd5" +checksum = "e1de8bc0aa9e9385ceb3bf0c152e3a9b9544f6c4a912c8ae504e80c1f0368603" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -2517,7 +2517,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "thiserror 1.0.69", @@ -2580,7 +2580,7 @@ dependencies = [ "regex", "revm", "rpassword", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "tempfile", @@ -2600,9 +2600,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.37" +version = "1.2.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" +checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" dependencies = [ "find-msvc-tools", "jobserver", @@ -2654,7 +2654,7 @@ dependencies = [ "revm", "rexpect", "rustyline", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "solar-compiler", @@ -2765,9 +2765,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.57" +version = "4.5.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d9501bd3f5f09f7bbee01da9a511073ed30a80cd7a509f1214bb74eadea71ad" +checksum = "75bf0b32ad2e152de789bb635ea4d3078f6b838ad7974143e99b99f45a04af4a" dependencies = [ "clap", ] @@ -3067,15 +3067,14 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dccd746bf9b1038c0507b7cec21eb2b11222db96a2902c96e8c185d6d20fb9c4" +checksum = "b6407bff74dea37e0fa3dc1c1c974e5d46405f0c987bf9997a0762adce71eda6" dependencies = [ "cfg-if", "cpufeatures", - "hex", "proptest", - "serde", + "serde_core", ] [[package]] @@ -3813,11 +3812,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +checksum = "259d404d09818dec19332e31d94558aeb442fea04c817006456c24b5460bbd4b" dependencies = [ "serde", + "serde_core", "typeid", ] @@ -3888,7 +3888,7 @@ checksum = "c29ecc930ee2ed03083436c2ddd7e5292c3c3bcda65f6a37369502d578a853f1" dependencies = [ "alloy-dyn-abi", "alloy-primitives", - "indexmap 2.11.1", + "indexmap 2.11.4", ] [[package]] @@ -3984,9 +3984,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" [[package]] name = "fixed-hash" @@ -4091,7 +4091,7 @@ dependencies = [ "regex", "reqwest", "revm", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "similar", @@ -4103,7 +4103,7 @@ dependencies = [ "tempfile", "thiserror 2.0.16", "tokio", - "toml_edit 0.23.4", + "toml_edit 0.23.6", "tower-http", "tracing", "watchexec", @@ -4131,7 +4131,7 @@ dependencies = [ "serde", "serde_json", "thiserror 2.0.16", - "toml 0.9.5", + "toml 0.9.7", "tracing", ] @@ -4146,7 +4146,7 @@ dependencies = [ "itertools 0.14.0", "similar-asserts", "thiserror 2.0.16", - "toml 0.9.5", + "toml 0.9.7", "tracing", "tracing-subscriber 0.3.20", ] @@ -4200,7 +4200,7 @@ dependencies = [ "itertools 0.14.0", "parking_lot", "revm-inspectors", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "tempfile", @@ -4265,7 +4265,7 @@ dependencies = [ "regex", "reqwest", "revm", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "tempfile", @@ -4314,7 +4314,7 @@ dependencies = [ "alloy-primitives", "foundry-compilers", "reqwest", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "thiserror 2.0.16", @@ -4363,11 +4363,11 @@ dependencies = [ "rand 0.9.2", "revm", "revm-inspectors", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "thiserror 2.0.16", - "toml 0.9.5", + "toml 0.9.7", "tracing", "walkdir", ] @@ -4474,7 +4474,7 @@ dependencies = [ "regex", "reqwest", "revm", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "solar-compiler", @@ -4511,9 +4511,9 @@ dependencies = [ [[package]] name = "foundry-compilers" -version = "0.19.2" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9680c6130ad623bf66b5b60a6fa0c9c0d435bca734e81b556d708fd619360fe" +checksum = "5fdd6b9a368a06cecafec694c9ff0cd1f960bc896d9575d9b8397ec46d6c6235" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -4528,7 +4528,7 @@ dependencies = [ "path-slash", "rand 0.9.2", "rayon", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "sha2 0.10.9", @@ -4545,9 +4545,9 @@ dependencies = [ [[package]] name = "foundry-compilers-artifacts" -version = "0.19.2" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1830843294da279e18c91f1f4b5b0c4d98dd10139f5aa7fd567669a0c686b484" +checksum = "9260e059261a97b19d1fa14eb56ae97d99733a58b4453263dab383ecd680fa86" dependencies = [ "foundry-compilers-artifacts-solc", "foundry-compilers-artifacts-vyper", @@ -4555,18 +4555,19 @@ dependencies = [ [[package]] name = "foundry-compilers-artifacts-solc" -version = "0.19.2" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f5d561430b369c3e5a5fc8f2b10267d65c079a3bbf8573f5f75c0589c3f9f" +checksum = "92405587ef0dfebcf4f672c04756e28dafa44691b68eddfd828577d7fff04314" dependencies = [ "alloy-json-abi", "alloy-primitives", "foundry-compilers-core", "futures-util", + "memchr", "path-slash", "rayon", "regex", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "thiserror 2.0.16", @@ -4577,24 +4578,24 @@ dependencies = [ [[package]] name = "foundry-compilers-artifacts-vyper" -version = "0.19.2" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49832706ce39801486109ad8a4d09505e1fbc5c2c3979b19efa5ea4883b6a2d4" +checksum = "3258aaf0cdfab7a2736652c9ffcbbcd06ec97433c51b1baf5160fde2e5dd4d9d" dependencies = [ "alloy-json-abi", "alloy-primitives", "foundry-compilers-artifacts-solc", "foundry-compilers-core", "path-slash", - "semver 1.0.26", + "semver 1.0.27", "serde", ] [[package]] name = "foundry-compilers-core" -version = "0.19.2" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "170cbf86018f3c57b8d4f8f1d389abbbbcdf9c3ca5459c3107addbc300c857c8" +checksum = "8bfc4e31d14c92aee7661ef25418941ce80fab13b97e0e2bc09ddfaa8027b601" dependencies = [ "alloy-primitives", "cfg-if", @@ -4602,7 +4603,7 @@ dependencies = [ "fs_extra", "path-slash", "regex", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "svm-rs", @@ -4637,7 +4638,7 @@ dependencies = [ "regex", "reqwest", "revm", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "similar-asserts", @@ -4645,8 +4646,8 @@ dependencies = [ "soldeer-core", "tempfile", "thiserror 2.0.16", - "toml 0.9.5", - "toml_edit 0.23.4", + "toml 0.9.7", + "toml_edit 0.23.6", "tracing", "walkdir", "yansi", @@ -4765,7 +4766,7 @@ dependencies = [ "foundry-evm-core", "rayon", "revm", - "semver 1.0.26", + "semver 1.0.27", "solar-compiler", "tracing", ] @@ -4865,7 +4866,7 @@ dependencies = [ "alloy-primitives", "foundry-compilers", "rayon", - "semver 1.0.26", + "semver 1.0.27", "thiserror 2.0.16", ] @@ -5155,7 +5156,7 @@ dependencies = [ "js-sys", "libc", "r-efi", - "wasi 0.14.5+wasi-0.2.4", + "wasi 0.14.7+wasi-0.2.4", "wasm-bindgen", ] @@ -5217,7 +5218,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.11.1", + "indexmap 2.11.4", "slab", "tokio", "tokio-util", @@ -5297,9 +5298,6 @@ name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] [[package]] name = "hex-conservative" @@ -5490,9 +5488,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ "base64 0.22.1", "bytes", @@ -5754,14 +5752,15 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.1" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "arbitrary", "equivalent", - "hashbrown 0.15.5", + "hashbrown 0.16.0", "serde", + "serde_core", ] [[package]] @@ -6027,9 +6026,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.78" +version = "0.3.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" +checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" dependencies = [ "once_cell", "wasm-bindgen", @@ -6192,9 +6191,9 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ "bitflags 2.9.4", "libc", @@ -6851,9 +6850,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "nybbles" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0418987d1aaed324d95b4beffc93635e19be965ed5d63ec07a35980fe3b71a4" +checksum = "bfa11e84403164a9f12982ab728f3c67c6fd4ab5b5f0254ffc217bdbd3b28ab0" dependencies = [ "alloy-rlp", "cfg-if", @@ -7205,7 +7204,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" dependencies = [ "fixedbitset", - "indexmap 2.11.1", + "indexmap 2.11.4", ] [[package]] @@ -7449,11 +7448,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.22.27", + "toml_edit 0.23.6", ] [[package]] @@ -7507,7 +7506,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3ef4f2f0422f23a82ec9f628ea2acd12871c81a9362b02c43c1aa86acfc3ba1" dependencies = [ "futures", - "indexmap 2.11.1", + "indexmap 2.11.4", "nix 0.30.1", "tokio", "tracing", @@ -7660,7 +7659,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed1a693391a16317257103ad06a88c6529ac640846021da7c435a06fffdacd7" dependencies = [ "chrono", - "indexmap 2.11.1", + "indexmap 2.11.4", "newtype-uuid", "quick-xml 0.37.5", "strip-ansi-escapes", @@ -8410,7 +8409,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.26", + "semver 1.0.27", ] [[package]] @@ -8453,9 +8452,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.31" +version = "0.23.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" dependencies = [ "aws-lc-rs", "log", @@ -8491,9 +8490,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.5" +version = "0.103.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a37813727b78798e53c2bec3f5e8fe12a6d6f8389bf9ca7802add4c9905ad8" +checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" dependencies = [ "aws-lc-rs", "ring", @@ -8753,11 +8752,12 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -8777,9 +8777,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.221" +version = "1.0.225" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "341877e04a22458705eb4e131a1508483c877dca2792b3781d4e5d8a6019ec43" +checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d" dependencies = [ "serde_core", "serde_derive", @@ -8787,18 +8787,18 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.221" +version = "1.0.225" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c459bc0a14c840cb403fc14b148620de1e0778c96ecd6e0c8c3cacb6d8d00fe" +checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.221" +version = "1.0.225" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6185cf75117e20e62b1ff867b9518577271e58abe0037c40bb4794969355ab0" +checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516" dependencies = [ "proc-macro2", "quote", @@ -8827,25 +8827,27 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.144" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56177480b00303e689183f110b4e727bb4211d692c62d4fcd16d02be93077d40" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "indexmap 2.11.1", + "indexmap 2.11.4", "itoa", "memchr", "ryu", + "serde", "serde_core", ] [[package]] name = "serde_path_to_error" -version = "0.1.17" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", ] [[package]] @@ -8859,11 +8861,11 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +checksum = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -8888,7 +8890,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.1", + "indexmap 2.11.4", "schemars 0.9.0", "schemars 1.0.4", "serde", @@ -9157,7 +9159,7 @@ dependencies = [ "bumpalo", "either", "num-rational", - "semver 1.0.26", + "semver 1.0.27", "solar-data-structures", "solar-interface", "solar-macros", @@ -9198,7 +9200,7 @@ checksum = "e246a9af3cc34b40e7612b600a5495f70768bdd365f9fa338d64afb33a59a96b" dependencies = [ "bumpalo", "index_vec", - "indexmap 2.11.1", + "indexmap 2.11.4", "parking_lot", "rayon", "rustc-hash", @@ -9217,7 +9219,7 @@ dependencies = [ "derive_more", "dunce", "inturn", - "itertools 0.14.0", + "itertools 0.10.5", "itoa", "normalize-path", "once_map", @@ -9253,7 +9255,7 @@ dependencies = [ "alloy-primitives", "bitflags 2.9.4", "bumpalo", - "itertools 0.14.0", + "itertools 0.10.5", "memchr", "num-bigint", "num-rational", @@ -9331,13 +9333,13 @@ dependencies = [ "regex", "reqwest", "sanitize-filename", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "sha2 0.10.9", "thiserror 2.0.16", "tokio", - "toml_edit 0.23.4", + "toml_edit 0.23.6", "uuid 1.18.1", "zip", "zip-extract", @@ -9564,12 +9566,12 @@ dependencies = [ "const-hex", "dirs", "reqwest", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", "sha2 0.10.9", "tempfile", - "thiserror 1.0.69", + "thiserror 2.0.16", "url", "zip", ] @@ -9581,7 +9583,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31affc47068aeef445accc5c3d5f7fd24f9072cae0a651cef564239003c94ff8" dependencies = [ "const-hex", - "semver 1.0.26", + "semver 1.0.27", "serde_json", "svm-rs", ] @@ -9825,11 +9827,12 @@ dependencies = [ [[package]] name = "time" -version = "0.3.43" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", + "itoa", "js-sys", "libc", "num-conv", @@ -9923,9 +9926,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "05f63835928ca123f1bef57abbcd23bb2ba0ac9ae1235f1e65bda0d06e7786bd" dependencies = [ "rustls", "tokio", @@ -9995,14 +9998,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.5" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8" +checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" dependencies = [ - "indexmap 2.11.1", - "serde", - "serde_spanned 1.0.0", - "toml_datetime 0.7.0", + "indexmap 2.11.4", + "serde_core", + "serde_spanned 1.0.2", + "toml_datetime 0.7.2", "toml_parser", "toml_writer", "winnow", @@ -10019,11 +10022,11 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -10032,7 +10035,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.11.1", + "indexmap 2.11.4", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", @@ -10042,14 +10045,14 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.23.4" +version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7211ff1b8f0d3adae1663b7da9ffe396eabe1ca25f0b0bee42b0da29a9ddce93" +checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" dependencies = [ - "indexmap 2.11.1", - "serde", - "serde_spanned 1.0.0", - "toml_datetime 0.7.0", + "indexmap 2.11.4", + "serde_core", + "serde_spanned 1.0.2", + "toml_datetime 0.7.2", "toml_parser", "toml_writer", "winnow", @@ -10057,9 +10060,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10" +checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" dependencies = [ "winnow", ] @@ -10072,9 +10075,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "toml_writer" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" +checksum = "d163a63c116ce562a22cda521fcc4d79152e7aba014456fb5eb442f6d6a10109" [[package]] name = "tonic" @@ -10121,7 +10124,7 @@ checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", - "indexmap 2.11.1", + "indexmap 2.11.4", "pin-project-lite", "slab", "sync_wrapper", @@ -10681,27 +10684,27 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.5+wasi-0.2.4" +version = "0.14.7+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4494f6290a82f5fe584817a676a34b9d6763e8d9d18204009fb31dceca98fd4" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" dependencies = [ "wasip2", ] [[package]] name = "wasip2" -version = "1.0.0+wasi-0.2.4" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fa2761397e5bd52002cd7e73110c71af2109aca4e521a9f40473fe685b0a24" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.101" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" +checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" dependencies = [ "cfg-if", "once_cell", @@ -10712,9 +10715,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.101" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" +checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" dependencies = [ "bumpalo", "log", @@ -10726,9 +10729,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.51" +version = "0.4.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe" +checksum = "a0b221ff421256839509adbb55998214a70d829d3a28c69b4a6672e9d2a42f67" dependencies = [ "cfg-if", "js-sys", @@ -10739,9 +10742,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.101" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" +checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -10749,9 +10752,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.101" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" +checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" dependencies = [ "proc-macro2", "quote", @@ -10762,9 +10765,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.101" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" +checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" dependencies = [ "unicode-ident", ] @@ -10853,9 +10856,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.78" +version = "0.3.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12" +checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc" dependencies = [ "js-sys", "wasm-bindgen", @@ -11290,9 +11293,9 @@ checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" [[package]] name = "wit-bindgen" -version = "0.45.1" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "write16" @@ -11471,7 +11474,7 @@ dependencies = [ "arbitrary", "crc32fast", "flate2", - "indexmap 2.11.1", + "indexmap 2.11.4", "memchr", "zopfli", ] diff --git a/Cargo.toml b/Cargo.toml index 0dd44a57c9b6f..93849ab8fb35d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -418,5 +418,8 @@ rexpect = { git = "https://github.com/rust-cli/rexpect", rev = "2ed0b1898d7edaf6 # foundry-compilers = { git = "https://github.com/foundry-rs/compilers.git", branch = "dani/bump-solar" } # foundry-fork-db = { git = "https://github.com/foundry-rs/foundry-fork-db", rev = "eee6563" } -## solar +# solar # solar = { package = "solar-compiler", git = "https://github.com/paradigmxyz/solar.git", branch = "main" } +# solar-interface = { package = "solar-interface", git = "https://github.com/paradigmxyz/solar.git", branch = "main" } +# solar-ast = { package = "solar-ast", git = "https://github.com/paradigmxyz/solar.git", branch = "main" } +# solar-sema = { package = "solar-sema", git = "https://github.com/paradigmxyz/solar.git", branch = "main" } diff --git a/crates/cli/src/opts/build/core.rs b/crates/cli/src/opts/build/core.rs index 50ae69c8a0c6d..eb5f8756ee7e2 100644 --- a/crates/cli/src/opts/build/core.rs +++ b/crates/cli/src/opts/build/core.rs @@ -9,9 +9,9 @@ use foundry_compilers::{ utils::canonicalized, }; use foundry_config::{ - Config, Remappings, figment, + Config, DenyLevel, Remappings, figment::{ - Figment, Metadata, Profile, Provider, + self, Figment, Metadata, Profile, Provider, error::Kind::InvalidType, value::{Dict, Map, Value}, }, @@ -48,9 +48,26 @@ pub struct BuildOpts { #[serde(skip_serializing_if = "Vec::is_empty")] pub ignored_error_codes: Vec, - /// Warnings will trigger a compiler error - #[arg(long, help_heading = "Compiler options")] + /// A compiler error will be triggered at the specified diagnostic level. + /// + /// Replaces the deprecated `--deny-warnings` flag. + /// + /// Possible values: + /// - `never`: Do not treat any diagnostics as errors. + /// - `warnings`: Treat warnings as errors. + /// - `notes`: Treat both, warnings and notes, as errors. + #[arg( + long, + short = 'D', + help_heading = "Compiler options", + value_name = "LEVEL", + conflicts_with = "deny_warnings" + )] #[serde(skip)] + pub deny: Option, + + /// Deprecated: use `--deny=warnings` instead. + #[arg(long = "deny-warnings", hide = true)] pub deny_warnings: bool, /// Do not auto-detect the `solc` version. @@ -220,7 +237,10 @@ impl Provider for BuildOpts { } if self.deny_warnings { - dict.insert("deny_warnings".to_string(), true.into()); + dict.insert("deny".to_string(), figment::value::Value::serialize(DenyLevel::Warnings)?); + _ = sh_warn!("`--deny-warnings` is being deprecated in favor of `--deny warnings`."); + } else if let Some(deny) = self.deny { + dict.insert("deny".to_string(), figment::value::Value::serialize(deny)?); } if self.via_ir { diff --git a/crates/config/README.md b/crates/config/README.md index bd2b683f1bae4..ad016d7003893 100644 --- a/crates/config/README.md +++ b/crates/config/README.md @@ -107,7 +107,11 @@ etherscan_api_key = "YOURETHERSCANAPIKEY" # additional warnings can be added using their numeric error code: ["license", 1337] ignored_error_codes = ["license", "code-size"] ignored_warnings_from = ["path_to_ignore"] -deny_warnings = false +# Deny compiler warnings and/or notes with: +# - "never": default behavior, no denial +# - "warnings": warnings treated as errors +# - "notes": notes and warnings treated as notes +deny = "never" match_test = "Foo" no_match_test = "Bar" match_contract = "Foo" diff --git a/crates/config/src/inline/natspec.rs b/crates/config/src/inline/natspec.rs index 12f16d861d5e4..26166094462eb 100644 --- a/crates/config/src/inline/natspec.rs +++ b/crates/config/src/inline/natspec.rs @@ -494,8 +494,8 @@ contract FuzzInlineConf is DSTest { fn natspec() -> NatSpec { let conf = r" - forge-config: default.fuzz.runs = 600 - forge-config: ci.fuzz.runs = 500 + forge-config: default.fuzz.runs = 600 + forge-config: ci.fuzz.runs = 500 ========= SOME NOISY TEXT ============= 䩹𧀫Jx닧Ʀ̳盅K擷􅟽Ɂw첊}ꏻk86ᖪk-檻ܴ렝[Dz𐤬oᘓƤ ꣖ۻ%Ƅ㪕ς:(饁΍av/烲ڻ̛߉橞㗡𥺃̹M봓䀖ؿ̄󵼁)𯖛d􂽰񮍃 diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs index 9e1f6625b231d..4fdc642170b22 100644 --- a/crates/config/src/lib.rs +++ b/crates/config/src/lib.rs @@ -42,7 +42,7 @@ use foundry_compilers::{ use regex::Regex; use revm::primitives::hardfork::SpecId; use semver::Version; -use serde::{Deserialize, Serialize, Serializer}; +use serde::{Deserialize, Deserializer, Serialize, Serializer, de}; use std::{ borrow::Cow, collections::BTreeMap, @@ -306,7 +306,10 @@ pub struct Config { /// list of file paths to ignore #[serde(rename = "ignored_warnings_from")] pub ignored_file_paths: Vec, - /// When true, compiler warnings are treated as errors + /// Diagnostic level (minimum) at which the process should finish with a non-zero exit. + pub deny: DenyLevel, + /// DEPRECATED: use `deny` instead. + #[serde(default, skip_serializing)] pub deny_warnings: bool, /// Only run test functions matching the specified regex pattern. #[serde(rename = "match_test")] @@ -562,13 +565,109 @@ pub struct Config { pub _non_exhaustive: (), } +/// Diagnostic level (minimum) at which the process should finish with a non-zero exit. +#[derive(Debug, Clone, Copy, PartialEq, Eq, clap::ValueEnum, Default, Serialize)] +#[serde(rename_all = "lowercase")] +pub enum DenyLevel { + /// Always exit with zero code. + #[default] + Never, + /// Exit with a non-zero code if any warnings are found. + Warnings, + /// Exit with a non-zero code if any notes or warnings are found. + Notes, +} + +// Custom deserialization to make `DenyLevel` parsing case-insensitive and backwards compatible with +// booleans. +impl<'de> Deserialize<'de> for DenyLevel { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct DenyLevelVisitor; + + impl<'de> de::Visitor<'de> for DenyLevelVisitor { + type Value = DenyLevel; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("one of the following strings: `never`, `warnings`, `notes`") + } + + fn visit_bool(self, value: bool) -> Result + where + E: de::Error, + { + Ok(DenyLevel::from(value)) + } + + fn visit_str(self, value: &str) -> Result + where + E: de::Error, + { + DenyLevel::from_str(value).map_err(de::Error::custom) + } + } + + deserializer.deserialize_any(DenyLevelVisitor) + } +} + +impl FromStr for DenyLevel { + type Err = String; + + fn from_str(s: &str) -> Result { + match s.to_lowercase().as_str() { + "warnings" | "warning" | "w" => Ok(Self::Warnings), + "notes" | "note" | "n" => Ok(Self::Notes), + "never" | "false" | "f" => Ok(Self::Never), + _ => Err(format!( + "unknown variant: found `{s}`, expected one of `never`, `warnings`, `notes`" + )), + } + } +} + +impl From for DenyLevel { + fn from(deny: bool) -> Self { + if deny { Self::Warnings } else { Self::Never } + } +} + +impl DenyLevel { + /// Returns `true` if the deny level includes warnings. + pub fn warnings(&self) -> bool { + match self { + Self::Never => false, + Self::Warnings | Self::Notes => true, + } + } + + /// Returns `true` if the deny level includes notes. + pub fn notes(&self) -> bool { + match self { + Self::Never | Self::Warnings => false, + Self::Notes => true, + } + } + + /// Returns `true` if the deny level is set to never (only errors). + pub fn never(&self) -> bool { + match self { + Self::Never => true, + Self::Warnings | Self::Notes => false, + } + } +} + /// Mapping of fallback standalone sections. See [`FallbackProfileProvider`]. pub const STANDALONE_FALLBACK_SECTIONS: &[(&str, &str)] = &[("invariant", "fuzz")]; /// Deprecated keys and their replacements. /// /// See [Warning::DeprecatedKey] -pub const DEPRECATIONS: &[(&str, &str)] = &[("cancun", "evm_version = Cancun")]; +pub const DEPRECATIONS: &[(&str, &str)] = + &[("cancun", "evm_version = Cancun"), ("deny_warnings", "deny = warnings")]; impl Config { /// The default profile: "default" @@ -1051,7 +1150,7 @@ impl Config { .paths(paths) .ignore_error_codes(self.ignored_error_codes.iter().copied().map(Into::into)) .ignore_paths(self.ignored_file_paths.clone()) - .set_compiler_severity_filter(if self.deny_warnings { + .set_compiler_severity_filter(if self.deny.warnings() { Severity::Warning } else { Severity::Error @@ -2160,6 +2259,13 @@ impl Config { figment = figment.merge(("evm_version", version)); } + // Normalize `deny` based on the provided `deny_warnings` version. + if self.deny_warnings + && let Ok(DenyLevel::Never) = figment.extract_inner("deny") + { + figment = figment.merge(("deny", DenyLevel::Warnings)); + } + figment } } @@ -2432,6 +2538,7 @@ impl Default for Config { SolidityErrorCode::TransientStorageUsed, ], ignored_file_paths: vec![], + deny: DenyLevel::Never, deny_warnings: false, via_ir: false, ast: false, @@ -3780,7 +3887,7 @@ mod tests { gas_reports = ['*'] ignored_error_codes = [1878] ignored_warnings_from = ["something"] - deny_warnings = false + deny = "never" initial_balance = '0xffffffffffffffffffffffff' libraries = [] libs = ['lib'] @@ -6221,6 +6328,24 @@ mod tests { }); } + #[test] + fn test_deprecated_deny_warnings_is_handled() { + figment::Jail::expect_with(|jail| { + jail.create_file( + "foundry.toml", + r#" + [profile.default] + deny_warnings = true + "#, + )?; + let config = Config::load().unwrap(); + + // Assert that the deprecated flag is correctly interpreted + assert_eq!(config.deny, DenyLevel::Warnings); + Ok(()) + }); + } + #[test] fn test_evm_version_solc_compatibility_warning() { figment::Jail::expect_with(|jail| { diff --git a/crates/config/src/lint.rs b/crates/config/src/lint.rs index 2527b60d451ff..6752372767a2b 100644 --- a/crates/config/src/lint.rs +++ b/crates/config/src/lint.rs @@ -7,7 +7,7 @@ use solar::interface::diagnostics::Level; use std::str::FromStr; use yansi::Paint; -/// Contains the config and rule set +/// Contains the config and rule set. #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct LinterConfig { /// Specifies which lints to run based on severity. @@ -18,7 +18,7 @@ pub struct LinterConfig { /// Deny specific lints based on their ID (e.g. "mixed-case-function"). pub exclude_lints: Vec, - /// Globs to ignore + /// Globs to ignore. pub ignore: Vec, /// Whether to run linting during `forge build`. @@ -45,7 +45,7 @@ impl Default for LinterConfig { } } -/// Severity of a lint +/// Severity of a lint. #[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum, Serialize)] pub enum Severity { High, diff --git a/crates/config/src/providers/ext.rs b/crates/config/src/providers/ext.rs index d3ddedaea237b..e5d2d6e3ade81 100644 --- a/crates/config/src/providers/ext.rs +++ b/crates/config/src/providers/ext.rs @@ -302,6 +302,12 @@ impl Provider for BackwardsCompatTomlProvider

{ dict.insert("solc".to_string(), v); } } + if let Some(v) = dict.remove("deny_warnings") + && !dict.contains_key("deny") + { + dict.insert("deny".to_string(), v); + } + map.insert(profile, dict); } Ok(map) diff --git a/crates/forge/src/cmd/bind_json.rs b/crates/forge/src/cmd/bind_json.rs index ec355de0a3ae5..364f622d6aae7 100644 --- a/crates/forge/src/cmd/bind_json.rs +++ b/crates/forge/src/cmd/bind_json.rs @@ -177,7 +177,7 @@ impl BindJsonArgs { .source_map() .new_source_file(path.clone(), source.content.as_str()) { - target_files.insert(src_file.clone()); + target_files.insert(Arc::clone(&src_file)); pcx.add_file(src_file); } } diff --git a/crates/forge/src/cmd/build.rs b/crates/forge/src/cmd/build.rs index 9c24b65831425..ed87fa68228fe 100644 --- a/crates/forge/src/cmd/build.rs +++ b/crates/forge/src/cmd/build.rs @@ -175,7 +175,7 @@ impl BuildArgs { if !input_files.is_empty() { let compiler = output.parser_mut().solc_mut().compiler_mut(); - linter.lint(&input_files, compiler)?; + linter.lint(&input_files, config.deny, compiler)?; } } diff --git a/crates/forge/src/cmd/geiger.rs b/crates/forge/src/cmd/geiger.rs index d9390b28d6800..f8bbfebd6979d 100644 --- a/crates/forge/src/cmd/geiger.rs +++ b/crates/forge/src/cmd/geiger.rs @@ -1,7 +1,7 @@ use clap::{Parser, ValueHint}; use eyre::Result; use foundry_cli::opts::BuildOpts; -use foundry_config::impl_figment_convert; +use foundry_config::{DenyLevel, impl_figment_convert}; use std::path::PathBuf; /// CLI arguments for `forge geiger`. @@ -45,13 +45,14 @@ impl GeigerArgs { )?; // Convert geiger command to lint command with specific lint filter - let lint_args = crate::cmd::lint::LintArgs { + let mut lint_args = crate::cmd::lint::LintArgs { paths: self.paths, severity: None, lint: Some(vec!["unsafe-cheatcode".to_string()]), json: false, build: self.build, }; + lint_args.build.deny = Some(DenyLevel::Notes); // Run the lint command with the geiger-specific configuration lint_args.run() diff --git a/crates/forge/src/cmd/lint.rs b/crates/forge/src/cmd/lint.rs index 622083b84c2b7..1a5d4860dd689 100644 --- a/crates/forge/src/cmd/lint.rs +++ b/crates/forge/src/cmd/lint.rs @@ -45,7 +45,6 @@ impl LintArgs { pub fn run(self) -> Result<()> { let config = self.load_config()?; let project = config.solar_project()?; - let path_config = config.project_paths(); // Expand ignore globs and canonicalize from the get go @@ -97,10 +96,7 @@ impl LintArgs { }; // Override default severity config with user-defined severity - let severity = match self.severity { - Some(target) => target, - None => config.lint.severity.clone(), - }; + let severity = self.severity.unwrap_or(config.lint.severity.clone()); if project.compiler.solc.is_none() { return Err(eyre!("Linting not supported for this language")); @@ -116,7 +112,7 @@ impl LintArgs { let mut output = ProjectCompiler::new().files(input.iter().cloned()).compile(&project)?; let compiler = output.parser_mut().solc_mut().compiler_mut(); - linter.lint(&input, compiler)?; + linter.lint(&input, config.deny, compiler)?; Ok(()) } diff --git a/crates/forge/tests/cli/cmd.rs b/crates/forge/tests/cli/cmd.rs index 95eedf1898757..07ffdca532cfd 100644 --- a/crates/forge/tests/cli/cmd.rs +++ b/crates/forge/tests/cli/cmd.rs @@ -3,7 +3,8 @@ use crate::constants::*; use foundry_compilers::artifacts::{ConfigurableContractArtifact, Metadata, remappings::Remapping}; use foundry_config::{ - BasicConfig, Chain, Config, FuzzConfig, InvariantConfig, SolidityErrorCode, parse_with_profile, + BasicConfig, Chain, Config, DenyLevel, FuzzConfig, InvariantConfig, SolidityErrorCode, + parse_with_profile, }; use foundry_test_utils::{ foundry_compilers::PathStyle, @@ -1250,7 +1251,7 @@ Warning: SPDX license identifier not provided in source file. Before publishing, forgetest!(can_fail_compile_with_warnings, |prj, cmd| { prj.update_config(|config| { config.ignored_error_codes = vec![]; - config.deny_warnings = false; + config.deny = DenyLevel::Never; }); prj.add_raw_source( "A", @@ -1277,7 +1278,7 @@ Warning: SPDX license identifier not provided in source file. Before publishing, // warning fails to compile prj.update_config(|config| { config.ignored_error_codes = vec![]; - config.deny_warnings = true; + config.deny = DenyLevel::Warnings; }); cmd.forge_fuse().args(["build", "--force"]).assert_failure().stderr_eq(str![[r#" @@ -1291,7 +1292,7 @@ Warning: SPDX license identifier not provided in source file. Before publishing, // ignores error code and compiles prj.update_config(|config| { config.ignored_error_codes = vec![SolidityErrorCode::SpdxLicenseNotProvided]; - config.deny_warnings = true; + config.deny = DenyLevel::Warnings; }); cmd.forge_fuse().args(["build", "--force"]).assert_success().stdout_eq(str![[r#" @@ -3620,7 +3621,7 @@ forgetest!(inspect_multiple_contracts_with_different_paths, |prj, cmd| { r#" contract Source { function foo() public {} - } + } "#, ); diff --git a/crates/forge/tests/cli/config.rs b/crates/forge/tests/cli/config.rs index 5eead6fbbaa35..469dde37242ce 100644 --- a/crates/forge/tests/cli/config.rs +++ b/crates/forge/tests/cli/config.rs @@ -29,6 +29,179 @@ use std::{ thread, }; +const DEFAULT_CONFIG: &str = r#"[profile.default] +src = "src" +test = "test" +script = "script" +out = "out" +libs = ["lib"] +remappings = ["forge-std/=lib/forge-std/src/"] +auto_detect_remappings = true +libraries = [] +cache = true +dynamic_test_linking = false +cache_path = "cache" +snapshots = "snapshots" +gas_snapshot_check = false +gas_snapshot_emit = true +broadcast = "broadcast" +allow_paths = [] +include_paths = [] +skip = [] +force = false +evm_version = "prague" +gas_reports = ["*"] +gas_reports_ignore = [] +gas_reports_include_tests = false +auto_detect_solc = true +offline = false +optimizer = false +optimizer_runs = 200 +verbosity = 0 +eth_rpc_accept_invalid_certs = false +ignored_error_codes = [ + "license", + "code-size", + "init-code-size", + "transient-storage", +] +ignored_warnings_from = [] +deny = "never" +test_failures_file = "cache/test-failures" +show_progress = false +ffi = false +allow_internal_expect_revert = false +always_use_create_2_factory = false +prompt_timeout = 120 +sender = "0x1804c8ab1f12e6bbf3894d4083f33e07309d1f38" +tx_origin = "0x1804c8ab1f12e6bbf3894d4083f33e07309d1f38" +initial_balance = "0xffffffffffffffffffffffff" +block_number = 1 +gas_limit = 1073741824 +block_base_fee_per_gas = 0 +block_coinbase = "0x0000000000000000000000000000000000000000" +block_timestamp = 1 +block_difficulty = 0 +block_prevrandao = "0x0000000000000000000000000000000000000000000000000000000000000000" +memory_limit = 134217728 +extra_output = [] +extra_output_files = [] +names = false +sizes = false +via_ir = false +ast = false +no_storage_caching = false +no_rpc_rate_limit = false +use_literal_content = false +bytecode_hash = "ipfs" +cbor_metadata = true +sparse_mode = false +build_info = false +isolate = false +disable_block_gas_limit = false +enable_tx_gas_limit = false +unchecked_cheatcode_artifacts = false +create2_library_salt = "0x0000000000000000000000000000000000000000000000000000000000000000" +create2_deployer = "0x4e59b44847b379578588920ca78fbf26c0b4956c" +assertions_revert = true +legacy_assertions = false +celo = false +transaction_timeout = 120 +additional_compiler_profiles = [] +compilation_restrictions = [] +script_execution_protection = true + +[profile.default.rpc_storage_caching] +chains = "all" +endpoints = "all" + +[[profile.default.fs_permissions]] +access = "read" +path = "out" + +[fmt] +line_length = 120 +tab_width = 4 +style = "space" +bracket_spacing = false +int_types = "long" +multiline_func_header = "attributes_first" +quote_style = "double" +number_underscore = "preserve" +hex_underscore = "remove" +single_line_statement_blocks = "preserve" +override_spacing = false +wrap_comments = false +ignore = [] +contract_new_lines = false +sort_imports = false + +[lint] +severity = [] +exclude_lints = [] +ignore = [] +lint_on_build = true +mixed_case_exceptions = [ + "ERC", + "URI", +] + +[doc] +out = "docs" +title = "" +book = "book.toml" +homepage = "README.md" +ignore = [] + +[fuzz] +runs = 256 +fail_on_revert = true +max_test_rejects = 65536 +dictionary_weight = 40 +include_storage = true +include_push_bytes = true +max_fuzz_dictionary_addresses = 15728640 +max_fuzz_dictionary_values = 6553600 +gas_report_samples = 256 +corpus_gzip = true +corpus_min_mutations = 5 +corpus_min_size = 0 +show_edge_coverage = false +failure_persist_dir = "cache/fuzz" +show_logs = false + +[invariant] +runs = 256 +depth = 500 +fail_on_revert = false +call_override = false +dictionary_weight = 80 +include_storage = true +include_push_bytes = true +max_fuzz_dictionary_addresses = 15728640 +max_fuzz_dictionary_values = 6553600 +shrink_run_limit = 5000 +max_assume_rejects = 65536 +gas_report_samples = 256 +corpus_gzip = true +corpus_min_mutations = 5 +corpus_min_size = 0 +show_edge_coverage = false +failure_persist_dir = "cache/invariant" +show_metrics = true +show_solidity = false + +[labels] + +[vyper] + +[bind_json] +out = "utils/JsonBindings.sol" +include = [] +exclude = [] + +"#; + // tests all config values that are in use forgetest!(can_extract_config_values, |prj, cmd| { // explicitly set all values @@ -134,6 +307,7 @@ forgetest!(can_extract_config_values, |prj, cmd| { ], ignored_error_codes: vec![], ignored_file_paths: vec![], + deny: foundry_config::DenyLevel::Never, deny_warnings: false, via_ir: true, ast: false, @@ -970,180 +1144,7 @@ contract CounterTest { #[cfg(not(feature = "isolate-by-default"))] forgetest_init!(test_default_config, |prj, cmd| { prj.write_config(Config::default()); - cmd.forge_fuse().args(["config"]).assert_success().stdout_eq(str![[r#" -[profile.default] -src = "src" -test = "test" -script = "script" -out = "out" -libs = ["lib"] -remappings = ["forge-std/=lib/forge-std/src/"] -auto_detect_remappings = true -libraries = [] -cache = true -dynamic_test_linking = false -cache_path = "cache" -snapshots = "snapshots" -gas_snapshot_check = false -gas_snapshot_emit = true -broadcast = "broadcast" -allow_paths = [] -include_paths = [] -skip = [] -force = false -evm_version = "prague" -gas_reports = ["*"] -gas_reports_ignore = [] -gas_reports_include_tests = false -auto_detect_solc = true -offline = false -optimizer = false -optimizer_runs = 200 -verbosity = 0 -eth_rpc_accept_invalid_certs = false -ignored_error_codes = [ - "license", - "code-size", - "init-code-size", - "transient-storage", -] -ignored_warnings_from = [] -deny_warnings = false -test_failures_file = "cache/test-failures" -show_progress = false -ffi = false -allow_internal_expect_revert = false -always_use_create_2_factory = false -prompt_timeout = 120 -sender = "0x1804c8ab1f12e6bbf3894d4083f33e07309d1f38" -tx_origin = "0x1804c8ab1f12e6bbf3894d4083f33e07309d1f38" -initial_balance = "0xffffffffffffffffffffffff" -block_number = 1 -gas_limit = 1073741824 -block_base_fee_per_gas = 0 -block_coinbase = "0x0000000000000000000000000000000000000000" -block_timestamp = 1 -block_difficulty = 0 -block_prevrandao = "0x0000000000000000000000000000000000000000000000000000000000000000" -memory_limit = 134217728 -extra_output = [] -extra_output_files = [] -names = false -sizes = false -via_ir = false -ast = false -no_storage_caching = false -no_rpc_rate_limit = false -use_literal_content = false -bytecode_hash = "ipfs" -cbor_metadata = true -sparse_mode = false -build_info = false -isolate = false -disable_block_gas_limit = false -enable_tx_gas_limit = false -unchecked_cheatcode_artifacts = false -create2_library_salt = "0x0000000000000000000000000000000000000000000000000000000000000000" -create2_deployer = "0x4e59b44847b379578588920ca78fbf26c0b4956c" -assertions_revert = true -legacy_assertions = false -celo = false -transaction_timeout = 120 -additional_compiler_profiles = [] -compilation_restrictions = [] -script_execution_protection = true - -[profile.default.rpc_storage_caching] -chains = "all" -endpoints = "all" - -[[profile.default.fs_permissions]] -access = "read" -path = "out" - -[fmt] -line_length = 120 -tab_width = 4 -style = "space" -bracket_spacing = false -int_types = "long" -multiline_func_header = "attributes_first" -quote_style = "double" -number_underscore = "preserve" -hex_underscore = "remove" -single_line_statement_blocks = "preserve" -override_spacing = false -wrap_comments = false -ignore = [] -contract_new_lines = false -sort_imports = false - -[lint] -severity = [] -exclude_lints = [] -ignore = [] -lint_on_build = true -mixed_case_exceptions = [ - "ERC", - "URI", -] - -[doc] -out = "docs" -title = "" -book = "book.toml" -homepage = "README.md" -ignore = [] - -[fuzz] -runs = 256 -fail_on_revert = true -max_test_rejects = 65536 -dictionary_weight = 40 -include_storage = true -include_push_bytes = true -max_fuzz_dictionary_addresses = 15728640 -max_fuzz_dictionary_values = 6553600 -gas_report_samples = 256 -corpus_gzip = true -corpus_min_mutations = 5 -corpus_min_size = 0 -show_edge_coverage = false -failure_persist_dir = "cache/fuzz" -show_logs = false - -[invariant] -runs = 256 -depth = 500 -fail_on_revert = false -call_override = false -dictionary_weight = 80 -include_storage = true -include_push_bytes = true -max_fuzz_dictionary_addresses = 15728640 -max_fuzz_dictionary_values = 6553600 -shrink_run_limit = 5000 -max_assume_rejects = 65536 -gas_report_samples = 256 -corpus_gzip = true -corpus_min_mutations = 5 -corpus_min_size = 0 -show_edge_coverage = false -failure_persist_dir = "cache/invariant" -show_metrics = true -show_solidity = false - -[labels] - -[vyper] - -[bind_json] -out = "utils/JsonBindings.sol" -include = [] -exclude = [] - - -"#]]); + cmd.forge_fuse().args(["config"]).assert_success().stdout_eq(DEFAULT_CONFIG); cmd.forge_fuse().args(["config", "--json"]).assert_success().stdout_eq(str![[r#" { @@ -1197,7 +1198,7 @@ exclude = [] "transient-storage" ], "ignored_warnings_from": [], - "deny_warnings": false, + "deny": "never", "match_test": null, "no_match_test": null, "match_contract": null, @@ -1908,6 +1909,18 @@ contract AnotherCounterTest is Test { cmd.args(["test", "--fail-fast"]).assert_failure(); }); +forgetest!(config_deny_warnings_is_deprecated, |prj, cmd| { + cmd.git_init(); + + let faulty_toml = DEFAULT_CONFIG.replace(r#"deny = "never""#, "deny_warnings = true"); + + fs::write(prj.root().join("foundry.toml"), faulty_toml).unwrap(); + cmd.forge_fuse().args(["config"]).assert_success().stderr_eq(str![[r#" +Warning: Key `deny_warnings` is being deprecated in favor of `deny = warnings`. It will be removed in future versions. + +"#]]); +}); + // Test that EVM version configuration works and the incompatibility check is available forgetest_init!(evm_version_incompatibility_check, |prj, cmd| { // Clear default contracts diff --git a/crates/forge/tests/cli/lint.rs b/crates/forge/tests/cli/lint.rs index 35dce1712a7f4..e4ef0ab6c7ce1 100644 --- a/crates/forge/tests/cli/lint.rs +++ b/crates/forge/tests/cli/lint.rs @@ -1,5 +1,5 @@ use forge_lint::{linter::Lint, sol::med::REGISTERED_LINTS}; -use foundry_config::{LintSeverity, LinterConfig}; +use foundry_config::{DenyLevel, LintSeverity, LinterConfig}; mod geiger; @@ -608,6 +608,78 @@ forgetest!(lint_json_output_no_ansi_escape_codes, |prj, cmd| { ); }); +forgetest!(can_fail_on_lints, |prj, cmd| { + prj.wipe_contracts(); + prj.add_source("ContractWithLints", CONTRACT); + + // -- LINT ALL SEVERITIES [OUTPUT: WARN + NOTE] ---------------------------- + + cmd.forge_fuse().arg("lint").assert_success(); // DenyLevel::Never (default) + + prj.update_config(|config| { + config.deny = DenyLevel::Warnings; + }); + cmd.forge_fuse().arg("lint").assert_failure(); + + prj.update_config(|config| { + config.deny = DenyLevel::Notes; + }); + cmd.forge_fuse().arg("lint").assert_failure(); + + // cmd flags can override config + prj.update_config(|config| { + config.deny = DenyLevel::Never; + }); + cmd.forge_fuse().args(["lint", "--deny warnings"]).assert_failure(); + cmd.forge_fuse().args(["lint", "--deny notes"]).assert_failure(); + + // usage of `--deny-warnings` flag works, but emits a warning + cmd.forge_fuse().args(["lint", "--deny-warnings"]).assert_failure().stderr_eq(str![[r#" +Warning: `--deny-warnings` is being deprecated in favor of `--deny warnings`. +... + +"#]]); + + // usage of `deny_warnings` config works, but emits a warning + prj.create_file( + "foundry.toml", + r#" +[profile.default] +deny_warnings = true +"#, + ); + cmd.forge_fuse().arg("lint").assert_failure().stderr_eq(str![[r#" +Warning: Key `deny_warnings` is being deprecated in favor of `deny = warnings`. It will be removed in future versions. +... + +"#]]); + + // -- ONLY LINT LOW SEVERITIES [OUTPUT: NOTE] ------------------------------ + + prj.update_config(|config| { + config.deny_warnings = false; + config.deny = DenyLevel::Never; + config.lint.severity = vec![LintSeverity::Info, LintSeverity::Gas, LintSeverity::CodeSize]; + }); + cmd.forge_fuse().arg("lint").assert_success(); + + prj.update_config(|config| { + config.deny = DenyLevel::Warnings; + }); + cmd.forge_fuse().arg("lint").assert_success(); + + prj.update_config(|config| { + config.deny = DenyLevel::Notes; + }); + cmd.forge_fuse().arg("lint").assert_failure(); + + // cmd flags can override config + prj.update_config(|config| { + config.deny = DenyLevel::Never; + }); + cmd.forge_fuse().args(["lint", "--deny notes"]).assert_failure(); +}); + // ------------------------------------------------------------------------------------------------ #[tokio::test] diff --git a/crates/forge/tests/cli/lint/geiger.rs b/crates/forge/tests/cli/lint/geiger.rs index 074ccd1bd6bbb..9b768f21ec239 100644 --- a/crates/forge/tests/cli/lint/geiger.rs +++ b/crates/forge/tests/cli/lint/geiger.rs @@ -13,7 +13,7 @@ forgetest_init!(call, |prj, cmd| { "#, ); - cmd.arg("geiger").assert_success().stderr_eq(str![[r#" + cmd.arg("geiger").assert_failure().stderr_eq(str![[r#" ... note[unsafe-cheatcode]: usage of unsafe cheatcodes that can perform dangerous operations [FILE]:9:20 @@ -22,6 +22,8 @@ note[unsafe-cheatcode]: usage of unsafe cheatcodes that can perform dangerous op | ^^^ | = help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-cheatcode + +Error: aborting due to 1 linter note(s) ... "#]]); }); @@ -33,15 +35,16 @@ forgetest_init!(assignment, |prj, cmd| { import {Test} from "forge-std/Test.sol"; contract A is Test { - function do_ffi() public { + function do_ffi() public returns (bytes memory) { string[] memory inputs = new string[](1); bytes memory stuff = vm.ffi(inputs); + return stuff; } } "#, ); - cmd.arg("geiger").assert_success().stderr_eq(str![[r#" + cmd.arg("geiger").assert_failure().stderr_eq(str![[r#" ... note[unsafe-cheatcode]: usage of unsafe cheatcodes that can perform dangerous operations [FILE]:9:41 @@ -50,6 +53,8 @@ note[unsafe-cheatcode]: usage of unsafe cheatcodes that can perform dangerous op | ^^^ | = help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-cheatcode + +Error: aborting due to 1 linter note(s) ... "#]]); }); @@ -71,7 +76,7 @@ forgetest_init!(exit_code, |prj, cmd| { "#, ); - cmd.arg("geiger").assert_success().stderr_eq(str![[r#" + cmd.arg("geiger").assert_failure().stderr_eq(str![[r#" ... note[unsafe-cheatcode]: usage of unsafe cheatcodes that can perform dangerous operations [FILE]:9:20 @@ -96,6 +101,8 @@ note[unsafe-cheatcode]: usage of unsafe cheatcodes that can perform dangerous op | ^^^ | = help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-cheatcode + +Error: aborting due to 3 linter note(s) ... "#]]); }); diff --git a/crates/lint/src/linter/mod.rs b/crates/lint/src/linter/mod.rs index 9261554a43bcd..8111a49d0e619 100644 --- a/crates/lint/src/linter/mod.rs +++ b/crates/lint/src/linter/mod.rs @@ -6,7 +6,7 @@ pub use late::{LateLintPass, LateLintVisitor}; use foundry_common::comments::inline_config::InlineConfig; use foundry_compilers::Language; -use foundry_config::lint::Severity; +use foundry_config::{DenyLevel, lint::Severity}; use solar::{ interface::{ Session, Span, @@ -30,7 +30,10 @@ pub trait Linter: Send + Sync { /// /// The `compiler` should have already been configured with all the sources necessary, /// as well as having performed parsing and lowering. - fn lint(&self, input: &[PathBuf], compiler: &mut Compiler) -> eyre::Result<()>; + /// + /// Should return an error based on the configured [`DenyLevel`] and the emitted diagnostics. + fn lint(&self, input: &[PathBuf], deny: DenyLevel, compiler: &mut Compiler) + -> eyre::Result<()>; } pub trait Lint { diff --git a/crates/lint/src/sol/mod.rs b/crates/lint/src/sol/mod.rs index 1db8d38bc5072..974fb6f4715ab 100644 --- a/crates/lint/src/sol/mod.rs +++ b/crates/lint/src/sol/mod.rs @@ -10,7 +10,7 @@ use foundry_common::{ errors::convert_solar_errors, }; use foundry_compilers::{ProjectPathsConfig, solc::SolcLanguage}; -use foundry_config::lint::Severity; +use foundry_config::{DenyLevel, lint::Severity}; use rayon::prelude::*; use solar::{ ast::{self as ast, visit::Visit as _}, @@ -58,6 +58,7 @@ pub struct SolidityLinter<'a> { lints_excluded: Option>, with_description: bool, with_json_emitter: bool, + // lint-specific configuration mixed_case_exceptions: &'a [String], } @@ -222,7 +223,12 @@ impl<'a> Linter for SolidityLinter<'a> { type Language = SolcLanguage; type Lint = SolLint; - fn lint(&self, input: &[PathBuf], compiler: &mut Compiler) -> eyre::Result<()> { + fn lint( + &self, + input: &[PathBuf], + deny: DenyLevel, + compiler: &mut Compiler, + ) -> eyre::Result<()> { convert_solar_errors(compiler.dcx())?; let ui_testing = std::env::var_os("FOUNDRY_LINT_UI_TESTING").is_some(); @@ -283,7 +289,31 @@ impl<'a> Linter for SolidityLinter<'a> { sess.reconfigure(); } - Ok(()) + // Handle diagnostics and fail if necessary. + const MSG: &str = "aborting due to "; + match (deny, compiler.dcx().warn_count(), compiler.dcx().note_count()) { + // Deny warnings. + (DenyLevel::Warnings, w, n) if w > 0 => { + if n > 0 { + Err(eyre::eyre!("{MSG}{w} linter warning(s); {n} note(s) were also emitted\n")) + } else { + Err(eyre::eyre!("{MSG}{w} linter warning(s)\n")) + } + } + + // Deny any diagnostic. + (DenyLevel::Notes, w, n) if w > 0 || n > 0 => match (w, n) { + (w, n) if w > 0 && n > 0 => { + Err(eyre::eyre!("{MSG}{w} linter warning(s) and {n} note(s)\n")) + } + (w, 0) => Err(eyre::eyre!("{MSG}{w} linter warning(s)\n")), + (0, n) => Err(eyre::eyre!("{MSG}{n} linter note(s)\n")), + _ => unreachable!(), + }, + + // Otherwise, succeed. + _ => Ok(()), + } } } diff --git a/testdata/foundry.toml b/testdata/foundry.toml index e9189bb008a32..f319b5bca94df 100644 --- a/testdata/foundry.toml +++ b/testdata/foundry.toml @@ -21,7 +21,7 @@ gas_limit = 9223372036854775807 gas_price = 0 gas_reports = ["*"] ignored_error_codes = [1878] -deny_warnings = false +deny = false initial_balance = "0xffffffffffffffffffffffff" libraries = [] libs = ["lib"]