From 6d402bbb905b1ccc63bf6904e23aaeb35ace5706 Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Wed, 17 Jul 2024 23:25:39 -0300 Subject: [PATCH 01/28] docs: validate public input first version --- docs/SUMMARY.md | 5 +- ...tegrating_aligned_into_your_application.md | 2 +- docs/guides/3_validating_public_input.md | 273 ++++++++++++++++++ ...ating_proofs.md => 4_generating_proofs.md} | 0 ...t_addresses.md => 5_contract_addresses.md} | 0 ...{3_setup_aligned.md => 6_setup_aligned.md} | 0 6 files changed, 277 insertions(+), 3 deletions(-) create mode 100644 docs/guides/3_validating_public_input.md rename docs/guides/{3_generating_proofs.md => 4_generating_proofs.md} (100%) rename docs/guides/{4_contract_addresses.md => 5_contract_addresses.md} (100%) rename docs/guides/{3_setup_aligned.md => 6_setup_aligned.md} (100%) diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index cc2fc84b2..2850b9b84 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -25,8 +25,9 @@ * [Submitting proofs](guides/0_submitting_proofs.md) * [SDK](guides/1_SDK.md) * [Integrating Aligned into your Application](guides/2_integrating_aligned_into_your_application.md) -* [Generating proofs for Aligned](guides/3_generating_proofs.md) -* [Contract Addresses](guides/4_contract_addresses.md) +* [Validating public input](guides/3_validating_public_input.md) +* [Generating proofs for Aligned](guides/4_generating_proofs.md) +* [Contract Addresses](guides/5_contract_addresses.md) * [Generating & submitting proofs of Rust code with ZKRust](guides/0_5_using_zkrust.md) diff --git a/docs/guides/2_integrating_aligned_into_your_application.md b/docs/guides/2_integrating_aligned_into_your_application.md index 3d42ccbfa..682203d87 100644 --- a/docs/guides/2_integrating_aligned_into_your_application.md +++ b/docs/guides/2_integrating_aligned_into_your_application.md @@ -10,7 +10,7 @@ This example shows a sample app that generates an SP1 proof that a user knows th To submit proofs to Aligned and get them verified, first you need to generate those proofs. Every proving system has its own way of generating proofs. -You can find examples on how to generate proofs in the [generating proofs guide](3_generating_proofs.md). +You can find examples on how to generate proofs in the [generating proofs guide](4_generating_proofs.md). Also, you can find an example of the ZKQuiz proof [program](../../examples/zkquiz/quiz/program/src/main.rs) as well as the [script](../../examples/zkquiz/quiz/script/src/main.rs) that generates it in the [ZKQuiz example directory](../../examples/zkquiz). diff --git a/docs/guides/3_validating_public_input.md b/docs/guides/3_validating_public_input.md new file mode 100644 index 000000000..d0323bd8f --- /dev/null +++ b/docs/guides/3_validating_public_input.md @@ -0,0 +1,273 @@ +# Validating public input + +You can validate that the public input of the proof sent to Aligned for verification is correct in a few simple steps. + +This guide demonstrates the submission of a Risc0 proof to Aligned using the Aligned SDK. The Risc0 program to be proven is a Fibonacci sequence calculator. Risc0 generates a public input corresponding to the last two Fibonacci numbers of the sequence taken modulo 7919, and we want to validate in a smart contract that the public input commitments correspond to those two numbers. + +## Generate your ZK Proof + +To submit proofs to Aligned and get them verified, first you need to generate those proofs. Every proving system has its own way of generating proofs. + +You can find examples on how to generate proofs in the [generating proofs guide](3_generating_proofs.md). + +Additionally, you can find an example of the Fibonacci program proof and the script that generates it in the Risc0 example directory. + +## Write your smart contract + +To check if a proof was verified in Aligned, you need to make a call to the `AlignedServiceManager` contract inside your smart contract. + +Also, you will need a way to check that the proven program is the correct one. + +The Aligned CLI provides a way for you to get the verification key commitment without actually generating and submitting a proof. + +You can do this by running the following command: + +```bash +aligned get-commitment --input +``` + +The following is an example of how to validate the public input of the Risc0 proof in your smart contract. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity 0.8.19; + +contract Fibonacci { + address public alignedServiceManager; + bytes32 public fibonacciImageId; + + bytes32 public fibonacciImageIdCommitment = + 0xbfa561e384be753bd6fd75b15db31eb511cd114ec76d619a87c2342af0ee1ed7; + + event FibonacciNumbersVerified(uint32 fibN, uint32 fibNPlusOne); + + constructor(address _alignedServiceManager) { + alignedServiceManager = _alignedServiceManager; + } + + function verifyBatchInclusion( + bytes32 proofCommitment, + bytes32 pubInputCommitment, + bytes32 provingSystemAuxDataCommitment, + bytes20 proofGeneratorAddr, + bytes32 batchMerkleRoot, + bytes memory merkleProof, + uint256 verificationDataBatchIndex, + uint32 fibN, + uint32 fibNPlusOne + ) public returns (bool) { + require( + fibonacciImageIdCommitment == provingSystemAuxDataCommitment, + "Image ID doesn't match" + ); + + bytes32 calculatedCommitment = calculateCommitment(fibN, fibNPlusOne); + + require( + pubInputCommitment == calculatedCommitment, + "Fibonacci numbers don't match with public input" + ); + + // Emit the event after the require statements + emit FibonacciNumbersVerified(fibN, fibNPlusOne); + + ( + bool callWasSuccessful, + bytes memory proofIsIncluded + ) = alignedServiceManager.staticcall( + abi.encodeWithSignature( + "verifyBatchInclusion(bytes32,bytes32,bytes32,bytes20,bytes32,bytes,uint256)", + proofCommitment, + pubInputCommitment, + provingSystemAuxDataCommitment, + proofGeneratorAddr, + batchMerkleRoot, + merkleProof, + verificationDataBatchIndex + ) + ); + + require(callWasSuccessful, "static_call failed"); + + return abi.decode(proofIsIncluded, (bool)); + } + + function calculateCommitment( + uint32 fibN, + uint32 fibNPlusOne + ) public pure returns (bytes32) { + bytes memory encoded = abi.encodePacked(fibN, fibNPlusOne); + return keccak256(encoded); + } +} +``` + +### Explanation + +1. **Verification Key Check:** The contract first checks if the verification key commitment matches the Fibonacci Image ID commitment. + +```solidity +require( + fibonacciImageIdCommitment == provingSystemAuxDataCommitment, + "Image ID doesn't match" + ); +``` + +1. **Commitment Calculation and Validation:** It calculates the commitment of the last two Fibonacci numbers modulo 7919, validates it against the submitted public input commitment, and emits an event. + +```solidity +bytes32 calculatedCommitment = calculateCommitment(fibN, fibNPlusOne); + +require( + pubInputCommitment == calculatedCommitment, + "Fibonacci numbers don't match with public input" +); +emit FibonacciNumbersVerified(fibN, fibNPlusOne); +``` + +```solidity +function calculateCommitment( + uint32 fibN, + uint32 fibNPlusOne + ) public pure returns (bytes32) { + bytes memory encoded = abi.encodePacked(fibN, fibNPlusOne); + return keccak256(encoded); + } +``` + +3. **Static Call to AlignedServiceManager**: The contract makes a static call to the `AlignedServiceManager` contract to check if the proof was verified in Aligned. + +```solidity +( + bool callWasSuccessful, + bytes memory proofIsIncluded +) = alignedServiceManager.staticcall( + abi.encodeWithSignature( + "verifyBatchInclusion(bytes32,bytes32,bytes32,bytes20,bytes32,bytes,uint256)", + proofCommitment, + pubInputCommitment, + provingSystemAuxDataCommitment, + proofGeneratorAddr, + batchMerkleRoot, + merkleProof, + verificationDataBatchIndex + ) +); + +require(callWasSuccessful, "static_call failed"); +``` + + +## Submit and verify the proof to Aligned + +The proof submission and verification can be done either with the SDK or by using the Aligned CLI. + +#### Using the SDK + +To submit and check if the proof was correctly verified in Aligned using the SDK, you can use the `submit_and_wait` function. + +The following code is an example of how to submit and wait for the verification of a proof using the SDK and then store the AlignedVerificationData in a `.json` file + +```rust +use std::fs::File; +use std::io::Write; +use std::path::PathBuf; +use std::str::FromStr; + +use aligned_sdk::core::errors::SubmitError; +use aligned_sdk::core::types::Chain::Holesky; +use aligned_sdk::core::types::{AlignedVerificationData, ProvingSystemId, VerificationData}; +use aligned_sdk::sdk::submit_and_wait; +use ethers::signers::LocalWallet; +use ethers::types::Address; +use ethers::utils::hex; + +#[tokio::main] +async fn main() -> Result<(), SubmitError> { + let proof = read_file(PathBuf::from( + "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof", + )) + .unwrap_or_default(); + let pub_input = read_file(PathBuf::from( + "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.pub", + )); + let image_id = read_file(PathBuf::from( + "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci_id.bin", + )); + + // Set to a dummy address + let proof_generator_addr = + Address::from_str("0x66f9664f97F2b50F62D13eA064982f936dE76657").unwrap(); + + let verification_data = VerificationData { + proving_system: ProvingSystemId::Risc0, + proof, + pub_input, + verification_key: None, + vm_program_code: image_id, + proof_generator_addr, + }; + + // Set to the 9th address of anvil that doesn't pay for the proof submission + let wallet = + LocalWallet::from_str("2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6") + .expect("Failed to create wallet"); + + let aligned_verification_data = submit_and_wait( + "wss://batcher.alignedlayer.com", + "https://ethereum-holesky-rpc.publicnode.com", + Holesky, + &verification_data, + wallet, + ) + .await?; + + // Directory were the AlignedVerificationData will be stored. + let batch_inclusion_data_directory_path = PathBuf::from("./batch_inclusion_data"); + + if let Some(aligned_verification_data) = aligned_verification_data { + save_response( + batch_inclusion_data_directory_path, + &aligned_verification_data, + )?; + } else { + return Err(SubmitError::EmptyVerificationDataList); + } + + Ok(()) +} + +fn read_file(file_name: PathBuf) -> Option> { + std::fs::read(file_name).ok() +} + +fn save_response( + batch_inclusion_data_directory_path: PathBuf, + aligned_verification_data: &AlignedVerificationData, +) -> Result<(), SubmitError> { + let batch_merkle_root = &hex::encode(aligned_verification_data.batch_merkle_root)[..8]; + let batch_inclusion_data_file_name = batch_merkle_root.to_owned() + + "_" + + &aligned_verification_data.index_in_batch.to_string() + + ".json"; + + let batch_inclusion_data_path = + batch_inclusion_data_directory_path.join(batch_inclusion_data_file_name); + + let data = serde_json::to_vec(&aligned_verification_data)?; + + let mut file = File::create(&batch_inclusion_data_path) + .map_err(|e| SubmitError::IoError(batch_inclusion_data_path.clone(), e))?; + + file.write_all(data.as_slice()) + .map_err(|e| SubmitError::IoError(batch_inclusion_data_path.clone(), e))?; + + Ok(()) +} +``` + +This example generates a proof, instantiates a wallet to submit the proof, and then submits the proof to Aligned for verification. It then waits for the proof to be verified in Aligned and stores the verification data. + +#### Using the CLI + +You can find examples of how to submit a proof using the CLI in the [submitting proofs guide](0_submitting_proofs.md). diff --git a/docs/guides/3_generating_proofs.md b/docs/guides/4_generating_proofs.md similarity index 100% rename from docs/guides/3_generating_proofs.md rename to docs/guides/4_generating_proofs.md diff --git a/docs/guides/4_contract_addresses.md b/docs/guides/5_contract_addresses.md similarity index 100% rename from docs/guides/4_contract_addresses.md rename to docs/guides/5_contract_addresses.md diff --git a/docs/guides/3_setup_aligned.md b/docs/guides/6_setup_aligned.md similarity index 100% rename from docs/guides/3_setup_aligned.md rename to docs/guides/6_setup_aligned.md From dc988cd5c8ae9b59985042dbf5e4ec716f257550 Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 18 Jul 2024 10:56:26 -0300 Subject: [PATCH 02/28] docs: update docs --- docs/guides/3_validating_public_input.md | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/docs/guides/3_validating_public_input.md b/docs/guides/3_validating_public_input.md index d0323bd8f..d5ba6e095 100644 --- a/docs/guides/3_validating_public_input.md +++ b/docs/guides/3_validating_public_input.md @@ -10,7 +10,9 @@ To submit proofs to Aligned and get them verified, first you need to generate th You can find examples on how to generate proofs in the [generating proofs guide](3_generating_proofs.md). -Additionally, you can find an example of the Fibonacci program proof and the script that generates it in the Risc0 example directory. +Additionally, you can find an example of the Fibonacci program proof and the script that generates it in the risc_zero directory. + +To generate the proof needed to try this example, run `make generate_risc_zero_fibonacci_proof`. ## Write your smart contract @@ -32,7 +34,7 @@ The following is an example of how to validate the public input of the Risc0 pro // SPDX-License-Identifier: MIT pragma solidity 0.8.19; -contract Fibonacci { +contract FibonacciValidator { address public alignedServiceManager; bytes32 public fibonacciImageId; @@ -157,6 +159,15 @@ function calculateCommitment( require(callWasSuccessful, "static_call failed"); ``` +To deploy the contract, first you will need to setup the `.env` file in the contracts folder with the following variables: + +``` +RPC_URL= #You can use publicnode RPC: https://ethereum-holesky-rpc.publicnode.com +PRIVATE_KEY= +ALIGNED_SERVICE_MANAGER_ADDRESS= #0x58F280BeBE9B34c9939C3C39e0890C81f163B623 for Holesky +``` + +Then, run `make deploy_fibonacci_validator`. ## Submit and verify the proof to Aligned @@ -195,7 +206,6 @@ async fn main() -> Result<(), SubmitError> { "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci_id.bin", )); - // Set to a dummy address let proof_generator_addr = Address::from_str("0x66f9664f97F2b50F62D13eA064982f936dE76657").unwrap(); @@ -222,7 +232,6 @@ async fn main() -> Result<(), SubmitError> { ) .await?; - // Directory were the AlignedVerificationData will be stored. let batch_inclusion_data_directory_path = PathBuf::from("./batch_inclusion_data"); if let Some(aligned_verification_data) = aligned_verification_data { @@ -245,6 +254,11 @@ fn save_response( batch_inclusion_data_directory_path: PathBuf, aligned_verification_data: &AlignedVerificationData, ) -> Result<(), SubmitError> { + + std::fs::create_dir_all(&batch_inclusion_data_directory_path).map_err(|e| { + SubmitError::IoError(batch_inclusion_data_directory_path.clone(), e) + })?; + let batch_merkle_root = &hex::encode(aligned_verification_data.batch_merkle_root)[..8]; let batch_inclusion_data_file_name = batch_merkle_root.to_owned() + "_" @@ -268,6 +282,8 @@ fn save_response( This example generates a proof, instantiates a wallet to submit the proof, and then submits the proof to Aligned for verification. It then waits for the proof to be verified in Aligned and stores the verification data. +To submit the proof using the code provided above, run `make submit_fibonacci_proof`. + #### Using the CLI You can find examples of how to submit a proof using the CLI in the [submitting proofs guide](0_submitting_proofs.md). From b3c7589b7dabf9e724038a2a39c2be8ced0ce74d Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 18 Jul 2024 10:56:39 -0300 Subject: [PATCH 03/28] feat: add validating-public-input example --- examples/validating-public-input/Makefile | 11 + .../aligned-integration/Cargo.lock | 3893 +++++ .../aligned-integration/Cargo.toml | 13 + .../batch_inclusion_data/f09c8d67_30.json | 1 + .../aligned-integration/src/main.rs | 104 + .../contracts/.env.example | 3 + .../contracts/deploy.sh | 31 + .../contracts/foundry.toml | 4 + .../contracts/lib/forge-std/.gitattributes | 1 + .../lib/forge-std/.github/workflows/ci.yml | 128 + .../lib/forge-std/.github/workflows/sync.yml | 31 + .../contracts/lib/forge-std/.gitignore | 4 + .../contracts/lib/forge-std/LICENSE-APACHE | 203 + .../contracts/lib/forge-std/LICENSE-MIT | 25 + .../contracts/lib/forge-std/README.md | 250 + .../contracts/lib/forge-std/foundry.toml | 21 + .../contracts/lib/forge-std/package.json | 16 + .../contracts/lib/forge-std/scripts/vm.py | 635 + .../contracts/lib/forge-std/src/Base.sol | 35 + .../contracts/lib/forge-std/src/Script.sol | 27 + .../lib/forge-std/src/StdAssertions.sol | 669 + .../contracts/lib/forge-std/src/StdChains.sol | 259 + .../contracts/lib/forge-std/src/StdCheats.sol | 817 + .../contracts/lib/forge-std/src/StdError.sol | 15 + .../lib/forge-std/src/StdInvariant.sol | 122 + .../contracts/lib/forge-std/src/StdJson.sol | 179 + .../contracts/lib/forge-std/src/StdMath.sol | 43 + .../lib/forge-std/src/StdStorage.sol | 473 + .../contracts/lib/forge-std/src/StdStyle.sol | 333 + .../contracts/lib/forge-std/src/StdToml.sol | 179 + .../contracts/lib/forge-std/src/StdUtils.sol | 226 + .../contracts/lib/forge-std/src/Test.sol | 33 + .../contracts/lib/forge-std/src/Vm.sol | 1763 ++ .../contracts/lib/forge-std/src/console.sol | 1552 ++ .../contracts/lib/forge-std/src/console2.sol | 4 + .../lib/forge-std/src/interfaces/IERC1155.sol | 105 + .../lib/forge-std/src/interfaces/IERC165.sol | 12 + .../lib/forge-std/src/interfaces/IERC20.sol | 43 + .../lib/forge-std/src/interfaces/IERC4626.sol | 190 + .../lib/forge-std/src/interfaces/IERC721.sol | 164 + .../forge-std/src/interfaces/IMulticall3.sol | 73 + .../lib/forge-std/src/mocks/MockERC20.sol | 234 + .../lib/forge-std/src/mocks/MockERC721.sol | 231 + .../lib/forge-std/src/safeconsole.sol | 13248 ++++++++++++++++ .../lib/forge-std/test/StdAssertions.t.sol | 145 + .../lib/forge-std/test/StdChains.t.sol | 226 + .../lib/forge-std/test/StdCheats.t.sol | 618 + .../lib/forge-std/test/StdError.t.sol | 120 + .../lib/forge-std/test/StdJson.t.sol | 49 + .../lib/forge-std/test/StdMath.t.sol | 212 + .../lib/forge-std/test/StdStorage.t.sol | 463 + .../lib/forge-std/test/StdStyle.t.sol | 110 + .../lib/forge-std/test/StdToml.t.sol | 49 + .../lib/forge-std/test/StdUtils.t.sol | 342 + .../contracts/lib/forge-std/test/Vm.t.sol | 15 + .../test/compilation/CompilationScript.sol | 10 + .../compilation/CompilationScriptBase.sol | 10 + .../test/compilation/CompilationTest.sol | 10 + .../test/compilation/CompilationTestBase.sol | 10 + .../test/fixtures/broadcast.log.json | 187 + .../lib/forge-std/test/fixtures/test.json | 8 + .../lib/forge-std/test/fixtures/test.toml | 6 + .../lib/forge-std/test/mocks/MockERC20.t.sol | 441 + .../lib/forge-std/test/mocks/MockERC721.t.sol | 721 + .../contracts/script/Deployer.s.sol | 21 + .../contracts/src/FibonacciValidator.sol | 71 + .../fibonacci_proof_generator/.gitignore | 8 + .../fibonacci_proof_generator/Cargo.lock | 3150 ++++ .../fibonacci_proof_generator/Cargo.toml | 11 + .../fibonacci_proof_generator/host/Cargo.toml | 11 + .../host/src/main.rs | 71 + .../methods/Cargo.toml | 10 + .../methods/build.rs | 3 + .../methods/guest/Cargo.lock | 774 + .../methods/guest/Cargo.toml | 10 + .../methods/guest/src/main.rs | 22 + .../methods/src/lib.rs | 1 + .../risc_zero_fibonacci.proof | Bin 0 -> 215590 bytes .../risc_zero_fibonacci.pub | Bin 0 -> 8 bytes .../risc_zero_fibonacci_id.bin | 1 + .../rust-toolchain.toml | 4 + 81 files changed, 34323 insertions(+) create mode 100644 examples/validating-public-input/Makefile create mode 100644 examples/validating-public-input/aligned-integration/Cargo.lock create mode 100644 examples/validating-public-input/aligned-integration/Cargo.toml create mode 100644 examples/validating-public-input/aligned-integration/batch_inclusion_data/f09c8d67_30.json create mode 100644 examples/validating-public-input/aligned-integration/src/main.rs create mode 100644 examples/validating-public-input/contracts/.env.example create mode 100755 examples/validating-public-input/contracts/deploy.sh create mode 100644 examples/validating-public-input/contracts/foundry.toml create mode 100644 examples/validating-public-input/contracts/lib/forge-std/.gitattributes create mode 100644 examples/validating-public-input/contracts/lib/forge-std/.github/workflows/ci.yml create mode 100644 examples/validating-public-input/contracts/lib/forge-std/.github/workflows/sync.yml create mode 100644 examples/validating-public-input/contracts/lib/forge-std/.gitignore create mode 100644 examples/validating-public-input/contracts/lib/forge-std/LICENSE-APACHE create mode 100644 examples/validating-public-input/contracts/lib/forge-std/LICENSE-MIT create mode 100644 examples/validating-public-input/contracts/lib/forge-std/README.md create mode 100644 examples/validating-public-input/contracts/lib/forge-std/foundry.toml create mode 100644 examples/validating-public-input/contracts/lib/forge-std/package.json create mode 100755 examples/validating-public-input/contracts/lib/forge-std/scripts/vm.py create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/Base.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/Script.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdAssertions.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdChains.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdCheats.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdError.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdInvariant.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdJson.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdMath.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdStorage.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdStyle.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdToml.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdUtils.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/Test.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/Vm.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/console.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/console2.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC1155.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC165.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC20.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC4626.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC721.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IMulticall3.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC20.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC721.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/safeconsole.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdAssertions.t.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdChains.t.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdCheats.t.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdError.t.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdJson.t.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdMath.t.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdStorage.t.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdStyle.t.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdToml.t.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdUtils.t.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/Vm.t.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScript.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTest.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTestBase.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/fixtures/broadcast.log.json create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.json create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.toml create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC20.t.sol create mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC721.t.sol create mode 100644 examples/validating-public-input/contracts/script/Deployer.s.sol create mode 100644 examples/validating-public-input/contracts/src/FibonacciValidator.sol create mode 100644 examples/validating-public-input/risc_zero/fibonacci_proof_generator/.gitignore create mode 100644 examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.lock create mode 100644 examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.toml create mode 100644 examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/Cargo.toml create mode 100644 examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/src/main.rs create mode 100644 examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/Cargo.toml create mode 100644 examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/build.rs create mode 100644 examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.lock create mode 100644 examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.toml create mode 100644 examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/src/main.rs create mode 100644 examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/src/lib.rs create mode 100644 examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof create mode 100644 examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.pub create mode 100644 examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci_id.bin create mode 100644 examples/validating-public-input/risc_zero/fibonacci_proof_generator/rust-toolchain.toml diff --git a/examples/validating-public-input/Makefile b/examples/validating-public-input/Makefile new file mode 100644 index 000000000..42246187d --- /dev/null +++ b/examples/validating-public-input/Makefile @@ -0,0 +1,11 @@ +generate_risc_zero_fibonacci_proof: + @cd risc_zero/fibonacci_proof_generator && \ + cargo run --release && \ + echo "Fibonacci proof, pub input and image ID generated in risc_zero folder" + +submit_fibonacci_proof: + @cd aligned-integration && \ + RUST_LOG=info cargo run --release + +deploy_fibonacci_validator: + @. ./contracts/.env && . ./contracts/deploy.sh diff --git a/examples/validating-public-input/aligned-integration/Cargo.lock b/examples/validating-public-input/aligned-integration/Cargo.lock new file mode 100644 index 000000000..84c322841 --- /dev/null +++ b/examples/validating-public-input/aligned-integration/Cargo.lock @@ -0,0 +1,3893 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "aligned-integration" +version = "0.1.0" +dependencies = [ + "aligned-sdk", + "env_logger", + "ethers", + "log", + "serde", + "serde_json", + "tokio", +] + +[[package]] +name = "aligned-sdk" +version = "0.1.0" +source = "git+https://github.com/yetanotherco/aligned_layer?tag=v0.3.0#a885386e83156c4bb5fe036a07a04fe0150768ac" +dependencies = [ + "ethers", + "futures-util", + "hex", + "lambdaworks-crypto", + "log", + "serde", + "serde_json", + "sha3", + "tokio", + "tokio-tungstenite 0.23.1", + "url", +] + +[[package]] +name = "anstream" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" + +[[package]] +name = "anstyle-parse" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[package]] +name = "async-trait" +version = "0.1.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version", +] + +[[package]] +name = "auto_impl" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2", + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" +dependencies = [ + "serde", +] + +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "camino" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cc" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "num-traits", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "coins-bip32" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" +dependencies = [ + "bs58", + "coins-core", + "digest", + "hmac", + "k256", + "serde", + "sha2", + "thiserror", +] + +[[package]] +name = "coins-bip39" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" +dependencies = [ + "bitvec", + "coins-bip32", + "hmac", + "once_cell", + "pbkdf2 0.12.2", + "rand", + "sha2", + "thiserror", +] + +[[package]] +name = "coins-core" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" +dependencies = [ + "base64 0.21.7", + "bech32", + "bs58", + "digest", + "generic-array", + "hex", + "ripemd", + "serde", + "serde_derive", + "sha2", + "sha3", + "thiserror", +] + +[[package]] +name = "colorchoice" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" + +[[package]] +name = "const-hex" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ena" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +dependencies = [ + "log", +] + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enr" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a3d8dc56e02f954cac8eb489772c552c473346fc34f67412bb6244fd647f7e4" +dependencies = [ + "base64 0.21.7", + "bytes", + "hex", + "k256", + "log", + "rand", + "rlp", + "serde", + "sha3", + "zeroize", +] + +[[package]] +name = "env_filter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "eth-keystore" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" +dependencies = [ + "aes", + "ctr", + "digest", + "hex", + "hmac", + "pbkdf2 0.11.0", + "rand", + "scrypt", + "serde", + "serde_json", + "sha2", + "sha3", + "thiserror", + "uuid", +] + +[[package]] +name = "ethabi" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" +dependencies = [ + "ethereum-types", + "hex", + "once_cell", + "regex", + "serde", + "serde_json", + "sha3", + "thiserror", + "uint", +] + +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "primitive-types", + "scale-info", + "uint", +] + +[[package]] +name = "ethers" +version = "2.0.14" +source = "git+https://github.com/yetanotherco/ethers-rs.git?tag=v2.0.15-fix-reconnections#69bba841ff352cf27b014d4fbb7985a180d88e25" +dependencies = [ + "ethers-addressbook", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-middleware", + "ethers-providers", + "ethers-signers", + "ethers-solc", +] + +[[package]] +name = "ethers-addressbook" +version = "2.0.14" +source = "git+https://github.com/yetanotherco/ethers-rs.git?tag=v2.0.15-fix-reconnections#69bba841ff352cf27b014d4fbb7985a180d88e25" +dependencies = [ + "ethers-core", + "once_cell", + "serde", + "serde_json", +] + +[[package]] +name = "ethers-contract" +version = "2.0.14" +source = "git+https://github.com/yetanotherco/ethers-rs.git?tag=v2.0.15-fix-reconnections#69bba841ff352cf27b014d4fbb7985a180d88e25" +dependencies = [ + "const-hex", + "ethers-contract-abigen", + "ethers-contract-derive", + "ethers-core", + "ethers-providers", + "futures-util", + "once_cell", + "pin-project", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "ethers-contract-abigen" +version = "2.0.14" +source = "git+https://github.com/yetanotherco/ethers-rs.git?tag=v2.0.15-fix-reconnections#69bba841ff352cf27b014d4fbb7985a180d88e25" +dependencies = [ + "Inflector", + "const-hex", + "dunce", + "ethers-core", + "ethers-etherscan", + "eyre", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "reqwest", + "serde", + "serde_json", + "syn 2.0.71", + "toml", + "walkdir", +] + +[[package]] +name = "ethers-contract-derive" +version = "2.0.14" +source = "git+https://github.com/yetanotherco/ethers-rs.git?tag=v2.0.15-fix-reconnections#69bba841ff352cf27b014d4fbb7985a180d88e25" +dependencies = [ + "Inflector", + "const-hex", + "ethers-contract-abigen", + "ethers-core", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.71", +] + +[[package]] +name = "ethers-core" +version = "2.0.14" +source = "git+https://github.com/yetanotherco/ethers-rs.git?tag=v2.0.15-fix-reconnections#69bba841ff352cf27b014d4fbb7985a180d88e25" +dependencies = [ + "arrayvec", + "bytes", + "cargo_metadata", + "chrono", + "const-hex", + "elliptic-curve", + "ethabi", + "generic-array", + "k256", + "num_enum", + "once_cell", + "open-fastrlp", + "rand", + "rlp", + "serde", + "serde_json", + "strum", + "syn 2.0.71", + "tempfile", + "thiserror", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "ethers-etherscan" +version = "2.0.14" +source = "git+https://github.com/yetanotherco/ethers-rs.git?tag=v2.0.15-fix-reconnections#69bba841ff352cf27b014d4fbb7985a180d88e25" +dependencies = [ + "chrono", + "ethers-core", + "reqwest", + "semver", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "ethers-middleware" +version = "2.0.14" +source = "git+https://github.com/yetanotherco/ethers-rs.git?tag=v2.0.15-fix-reconnections#69bba841ff352cf27b014d4fbb7985a180d88e25" +dependencies = [ + "async-trait", + "auto_impl", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-providers", + "ethers-signers", + "futures-channel", + "futures-locks", + "futures-util", + "instant", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "tracing-futures", + "url", +] + +[[package]] +name = "ethers-providers" +version = "2.0.14" +source = "git+https://github.com/yetanotherco/ethers-rs.git?tag=v2.0.15-fix-reconnections#69bba841ff352cf27b014d4fbb7985a180d88e25" +dependencies = [ + "async-trait", + "auto_impl", + "base64 0.22.1", + "bytes", + "const-hex", + "enr", + "ethers-core", + "futures-channel", + "futures-core", + "futures-timer", + "futures-util", + "hashers", + "http 0.2.12", + "instant", + "jsonwebtoken", + "once_cell", + "pin-project", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-tungstenite 0.20.1", + "tracing", + "tracing-futures", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "ws_stream_wasm", +] + +[[package]] +name = "ethers-signers" +version = "2.0.14" +source = "git+https://github.com/yetanotherco/ethers-rs.git?tag=v2.0.15-fix-reconnections#69bba841ff352cf27b014d4fbb7985a180d88e25" +dependencies = [ + "async-trait", + "coins-bip32", + "coins-bip39", + "const-hex", + "elliptic-curve", + "eth-keystore", + "ethers-core", + "rand", + "sha2", + "thiserror", + "tracing", +] + +[[package]] +name = "ethers-solc" +version = "2.0.14" +source = "git+https://github.com/yetanotherco/ethers-rs.git?tag=v2.0.15-fix-reconnections#69bba841ff352cf27b014d4fbb7985a180d88e25" +dependencies = [ + "cfg-if", + "const-hex", + "dirs", + "dunce", + "ethers-core", + "glob", + "home", + "md-5", + "num_cpus", + "once_cell", + "path-slash", + "rayon", + "regex", + "semver", + "serde", + "serde_json", + "solang-parser", + "svm-rs", + "thiserror", + "tiny-keccak", + "tokio", + "tracing", + "walkdir", + "yansi", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-locks" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" +dependencies = [ + "futures-channel", + "futures-task", +] + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +dependencies = [ + "gloo-timers", + "send_wrapper 0.4.0", +] + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashers" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" +dependencies = [ + "fxhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.7", + "pem", + "ring 0.16.20", + "serde", + "serde_json", + "simple_asn1", +] + +[[package]] +name = "k256" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lalrpop" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" +dependencies = [ + "ascii-canvas", + "bit-set", + "ena", + "itertools", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", + "walkdir", +] + +[[package]] +name = "lalrpop-util" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "lambdaworks-crypto" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb5d4f22241504f7c7b8d2c3a7d7835d7c07117f10bff2a7d96a9ef6ef217c3" +dependencies = [ + "lambdaworks-math", + "serde", + "sha2", + "sha3", +] + +[[package]] +name = "lambdaworks-math" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "358e172628e713b80a530a59654154bfc45783a6ed70ea284839800cebdf8f97" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "object" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "open-fastrlp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", + "ethereum-types", + "open-fastrlp-derive", +] + +[[package]] +name = "open-fastrlp-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" +dependencies = [ + "bytes", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "parity-scale-codec" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core", + "subtle", +] + +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest", + "hmac", + "password-hash", + "sha2", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +dependencies = [ + "proc-macro2", + "syn 2.0.71", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" +dependencies = [ + "bitflags 2.6.0", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax", + "unarray", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body", + "hyper", + "hyper-rustls", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "winreg", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rlp-derive", + "rustc-hex", +] + +[[package]] +name = "rlp-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.8", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scale-info" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" +dependencies = [ + "cfg-if", + "derive_more", + "parity-scale-codec", + "scale-info-derive", +] + +[[package]] +name = "scale-info-derive" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scrypt" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" +dependencies = [ + "hmac", + "pbkdf2 0.11.0", + "salsa20", + "sha2", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] + +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "serde_json" +version = "1.0.120" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror", + "time", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "solang-parser" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" +dependencies = [ + "itertools", + "lalrpop", + "lalrpop-util", + "phf", + "thiserror", + "unicode-xid", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", +] + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.71", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "svm-rs" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11297baafe5fa0c99d5722458eac6a5e25c01eb1b8e5cd137f54079093daa7a4" +dependencies = [ + "dirs", + "fs2", + "hex", + "once_cell", + "reqwest", + "semver", + "serde", + "serde_json", + "sha2", + "thiserror", + "url", + "zip", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "thiserror" +version = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tungstenite 0.20.1", + "webpki-roots", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" +dependencies = [ + "futures-util", + "log", + "native-tls", + "tokio", + "tokio-native-tls", + "tungstenite 0.23.0", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.15", +] + +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59a3a72298453f564e2b111fa896f8d07fabb36f51f06d7e875fc5e0b5a3ef1" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.13", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 0.2.12", + "httparse", + "log", + "rand", + "rustls", + "sha1", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "tungstenite" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 1.1.0", + "httparse", + "log", + "native-tls", + "rand", + "sha1", + "thiserror", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", + "serde", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.71", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version", + "send_wrapper 0.6.0", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2 0.11.0", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.12+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/examples/validating-public-input/aligned-integration/Cargo.toml b/examples/validating-public-input/aligned-integration/Cargo.toml new file mode 100644 index 000000000..06a010324 --- /dev/null +++ b/examples/validating-public-input/aligned-integration/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "aligned-integration" +version = "0.1.0" +edition = "2021" + +[dependencies] +aligned-sdk = { git = "https://github.com/yetanotherco/aligned_layer", tag="v0.3.0" } +tokio = { version = "1.37.0", features = ["io-std", "time", "macros", "rt", "rt-multi-thread", "sync"] } +ethers = { tag = "v2.0.15-fix-reconnections", features = ["ws", "rustls"], git = "https://github.com/yetanotherco/ethers-rs.git" } +serde = { version = "1.0.201", features = ["derive"] } +serde_json = "1.0.117" +log = "0.4.21" +env_logger = "0.11.3" diff --git a/examples/validating-public-input/aligned-integration/batch_inclusion_data/f09c8d67_30.json b/examples/validating-public-input/aligned-integration/batch_inclusion_data/f09c8d67_30.json new file mode 100644 index 000000000..d42484e05 --- /dev/null +++ b/examples/validating-public-input/aligned-integration/batch_inclusion_data/f09c8d67_30.json @@ -0,0 +1 @@ +{"verification_data_commitment":{"proof_commitment":[151,166,22,225,170,216,137,245,192,96,83,114,14,29,132,93,14,58,100,196,170,213,243,30,139,153,89,122,254,140,78,219],"pub_input_commitment":[215,12,219,66,161,99,16,27,152,188,231,11,35,219,222,94,8,151,45,43,150,205,27,44,44,139,239,70,207,60,161,176],"proving_system_aux_data_commitment":[191,165,97,227,132,190,117,59,214,253,117,177,93,179,30,181,17,205,17,78,199,109,97,154,135,194,52,42,240,238,30,215],"proof_generator_addr":[102,249,102,79,151,242,181,15,98,209,62,160,100,152,47,147,109,231,102,87]},"batch_merkle_root":[240,156,141,103,132,13,25,155,98,230,140,142,182,66,137,76,142,202,55,168,205,113,198,86,248,152,215,10,0,248,160,219],"batch_inclusion_proof":{"merkle_path":[[103,16,88,212,186,79,84,61,123,164,196,60,157,241,57,223,20,127,105,199,35,151,181,82,1,15,76,112,54,113,176,246],[8,148,160,152,182,227,83,42,224,84,226,17,186,81,161,179,96,84,137,174,13,196,209,113,199,84,123,248,201,226,71,178],[137,40,202,41,24,26,253,127,220,240,183,86,26,166,147,33,247,248,211,16,215,230,136,59,115,135,253,112,246,199,211,134],[104,121,121,56,69,144,181,29,22,193,204,249,151,16,33,102,188,118,216,109,95,249,184,6,53,112,228,25,203,64,238,72],[5,217,147,12,142,142,14,18,72,172,130,50,156,137,199,177,208,77,182,171,123,10,51,155,3,49,119,248,25,218,187,189],[94,102,50,252,206,197,151,118,154,17,218,88,24,170,205,83,154,241,184,165,212,16,197,148,152,43,94,56,237,187,17,29],[148,53,112,249,136,252,108,154,38,232,149,81,5,110,208,120,140,231,8,71,47,168,245,56,178,85,210,47,87,111,237,55],[210,244,137,176,63,13,152,51,180,72,204,27,138,182,143,46,51,112,163,62,224,62,49,118,103,40,249,232,92,196,241,197]]},"index_in_batch":30} \ No newline at end of file diff --git a/examples/validating-public-input/aligned-integration/src/main.rs b/examples/validating-public-input/aligned-integration/src/main.rs new file mode 100644 index 000000000..8e6ce831e --- /dev/null +++ b/examples/validating-public-input/aligned-integration/src/main.rs @@ -0,0 +1,104 @@ +use std::fs::File; +use std::io::Write; +use std::path::PathBuf; +use std::str::FromStr; + +use aligned_sdk::core::errors::SubmitError; +use aligned_sdk::core::types::Chain::Holesky; +use aligned_sdk::core::types::{AlignedVerificationData, ProvingSystemId, VerificationData}; +use aligned_sdk::sdk::submit_and_wait; +use ethers::signers::LocalWallet; +use ethers::types::Address; +use ethers::utils::hex; +use log::info; +use env_logger::Env; + +#[tokio::main] +async fn main() -> Result<(), SubmitError> { + env_logger::Builder::from_env(Env::default().default_filter_or("info")).init(); + + let proof = read_file(PathBuf::from( + "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof", + )) + .unwrap_or_default(); + let pub_input = read_file(PathBuf::from( + "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.pub", + )); + let image_id = read_file(PathBuf::from( + "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci_id.bin", + )); + + let proof_generator_addr = + Address::from_str("0x66f9664f97F2b50F62D13eA064982f936dE76657").unwrap(); + + let verification_data = VerificationData { + proving_system: ProvingSystemId::Risc0, + proof, + pub_input, + verification_key: None, + vm_program_code: image_id, + proof_generator_addr, + }; + + // Set to the 9th address of anvil that doesn't pay for the proof submission + let wallet = + LocalWallet::from_str("2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6") + .expect("Failed to create wallet"); + + info!("Submitting Fibonacci proof to Aligned and waiting for verification..."); + let aligned_verification_data = submit_and_wait( + "wss://batcher.alignedlayer.com", + "https://ethereum-holesky-rpc.publicnode.com", + Holesky, + &verification_data, + wallet, + ) + .await?; + + let batch_inclusion_data_directory_path = PathBuf::from("./batch_inclusion_data"); + + info!("Saving verification data to {:?}", batch_inclusion_data_directory_path); + if let Some(aligned_verification_data) = aligned_verification_data { + save_response( + batch_inclusion_data_directory_path, + &aligned_verification_data, + )?; + } else { + return Err(SubmitError::EmptyVerificationDataList); + } + + Ok(()) +} + +fn read_file(file_name: PathBuf) -> Option> { + std::fs::read(file_name).ok() +} + +fn save_response( + batch_inclusion_data_directory_path: PathBuf, + aligned_verification_data: &AlignedVerificationData, +) -> Result<(), SubmitError> { + + std::fs::create_dir_all(&batch_inclusion_data_directory_path).map_err(|e| { + SubmitError::IoError(batch_inclusion_data_directory_path.clone(), e) + })?; + + let batch_merkle_root = &hex::encode(aligned_verification_data.batch_merkle_root)[..8]; + let batch_inclusion_data_file_name = batch_merkle_root.to_owned() + + "_" + + &aligned_verification_data.index_in_batch.to_string() + + ".json"; + + let batch_inclusion_data_path = + batch_inclusion_data_directory_path.join(batch_inclusion_data_file_name); + + let data = serde_json::to_vec(&aligned_verification_data)?; + + let mut file = File::create(&batch_inclusion_data_path) + .map_err(|e| SubmitError::IoError(batch_inclusion_data_path.clone(), e))?; + + file.write_all(data.as_slice()) + .map_err(|e| SubmitError::IoError(batch_inclusion_data_path.clone(), e))?; + + Ok(()) +} diff --git a/examples/validating-public-input/contracts/.env.example b/examples/validating-public-input/contracts/.env.example new file mode 100644 index 000000000..674233d37 --- /dev/null +++ b/examples/validating-public-input/contracts/.env.example @@ -0,0 +1,3 @@ +RPC_URL= #You can use publicnode RPC: https://ethereum-holesky-rpc.publicnode.com +PRIVATE_KEY= +ALIGNED_SERVICE_MANAGER_ADDRESS= #0x58F280BeBE9B34c9939C3C39e0890C81f163B623 for Holesky diff --git a/examples/validating-public-input/contracts/deploy.sh b/examples/validating-public-input/contracts/deploy.sh new file mode 100755 index 000000000..108a07a0f --- /dev/null +++ b/examples/validating-public-input/contracts/deploy.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# cd to the directory of this script so that this can be run from anywhere +parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" || exit 1 ; pwd -P ) + +# At this point we are in aligned-example +cd "$parent_path" || exit 1 + +if [ -z "$ALIGNED_SERVICE_MANAGER_ADDRESS" ]; then + echo "ALIGNED_SERVICE_MANAGER_ADDRESS is not set. Please set it in .env" + exit 1 +fi + +if [ -z "$RPC_URL" ]; then + echo "RPC_URL is not set. Please set it in .env" + exit 1 +fi + +if [ -z "$PRIVATE_KEY" ]; then + echo "PRIVATE_KEY is not set. Please set it in .env" + exit 1 +fi + +forge install + +forge script script/Deployer.s.sol \ + "$ALIGNED_SERVICE_MANAGER_ADDRESS" \ + --rpc-url "$RPC_URL" \ + --private-key "$PRIVATE_KEY" \ + --broadcast \ + --sig "run(address _alignedServiceManager)" diff --git a/examples/validating-public-input/contracts/foundry.toml b/examples/validating-public-input/contracts/foundry.toml new file mode 100644 index 000000000..2bc70ba51 --- /dev/null +++ b/examples/validating-public-input/contracts/foundry.toml @@ -0,0 +1,4 @@ +[profile.default] +src = "src" +out = "out" +libs = ["lib"] diff --git a/examples/validating-public-input/contracts/lib/forge-std/.gitattributes b/examples/validating-public-input/contracts/lib/forge-std/.gitattributes new file mode 100644 index 000000000..27042d458 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/.gitattributes @@ -0,0 +1 @@ +src/Vm.sol linguist-generated diff --git a/examples/validating-public-input/contracts/lib/forge-std/.github/workflows/ci.yml b/examples/validating-public-input/contracts/lib/forge-std/.github/workflows/ci.yml new file mode 100644 index 000000000..2d68e91fb --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/.github/workflows/ci.yml @@ -0,0 +1,128 @@ +name: CI + +on: + workflow_dispatch: + pull_request: + push: + branches: + - master + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Print forge version + run: forge --version + + # Backwards compatibility checks: + # - the oldest and newest version of each supported minor version + # - versions with specific issues + - name: Check compatibility with latest + if: always() + run: | + output=$(forge build --skip test) + if echo "$output" | grep -q "Warning"; then + echo "$output" + exit 1 + fi + + - name: Check compatibility with 0.8.0 + if: always() + run: | + output=$(forge build --skip test --use solc:0.8.0) + if echo "$output" | grep -q "Warning"; then + echo "$output" + exit 1 + fi + + - name: Check compatibility with 0.7.6 + if: always() + run: | + output=$(forge build --skip test --use solc:0.7.6) + if echo "$output" | grep -q "Warning"; then + echo "$output" + exit 1 + fi + + - name: Check compatibility with 0.7.0 + if: always() + run: | + output=$(forge build --skip test --use solc:0.7.0) + if echo "$output" | grep -q "Warning"; then + echo "$output" + exit 1 + fi + + - name: Check compatibility with 0.6.12 + if: always() + run: | + output=$(forge build --skip test --use solc:0.6.12) + if echo "$output" | grep -q "Warning"; then + echo "$output" + exit 1 + fi + + - name: Check compatibility with 0.6.2 + if: always() + run: | + output=$(forge build --skip test --use solc:0.6.2) + if echo "$output" | grep -q "Warning"; then + echo "$output" + exit 1 + fi + + # via-ir compilation time checks. + - name: Measure compilation time of Test with 0.8.17 --via-ir + if: always() + run: forge build --skip test --contracts test/compilation/CompilationTest.sol --use solc:0.8.17 --via-ir + + - name: Measure compilation time of TestBase with 0.8.17 --via-ir + if: always() + run: forge build --skip test --contracts test/compilation/CompilationTestBase.sol --use solc:0.8.17 --via-ir + + - name: Measure compilation time of Script with 0.8.17 --via-ir + if: always() + run: forge build --skip test --contracts test/compilation/CompilationScript.sol --use solc:0.8.17 --via-ir + + - name: Measure compilation time of ScriptBase with 0.8.17 --via-ir + if: always() + run: forge build --skip test --contracts test/compilation/CompilationScriptBase.sol --use solc:0.8.17 --via-ir + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Print forge version + run: forge --version + + - name: Run tests + run: forge test -vvv + + fmt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Print forge version + run: forge --version + + - name: Check formatting + run: forge fmt --check diff --git a/examples/validating-public-input/contracts/lib/forge-std/.github/workflows/sync.yml b/examples/validating-public-input/contracts/lib/forge-std/.github/workflows/sync.yml new file mode 100644 index 000000000..9b170f0b7 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/.github/workflows/sync.yml @@ -0,0 +1,31 @@ +name: Sync Release Branch + +on: + release: + types: + - created + +jobs: + sync-release-branch: + runs-on: ubuntu-latest + if: startsWith(github.event.release.tag_name, 'v1') + steps: + - name: Check out the repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: v1 + + # The email is derived from the bots user id, + # found here: https://api.github.com/users/github-actions%5Bbot%5D + - name: Configure Git + run: | + git config user.name github-actions[bot] + git config user.email 41898282+github-actions[bot]@users.noreply.github.com + + - name: Sync Release Branch + run: | + git fetch --tags + git checkout v1 + git reset --hard ${GITHUB_REF} + git push --force diff --git a/examples/validating-public-input/contracts/lib/forge-std/.gitignore b/examples/validating-public-input/contracts/lib/forge-std/.gitignore new file mode 100644 index 000000000..756106d38 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/.gitignore @@ -0,0 +1,4 @@ +cache/ +out/ +.vscode +.idea diff --git a/examples/validating-public-input/contracts/lib/forge-std/LICENSE-APACHE b/examples/validating-public-input/contracts/lib/forge-std/LICENSE-APACHE new file mode 100644 index 000000000..cf01a499f --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/LICENSE-APACHE @@ -0,0 +1,203 @@ +Copyright Contributors to Forge Standard Library + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/examples/validating-public-input/contracts/lib/forge-std/LICENSE-MIT b/examples/validating-public-input/contracts/lib/forge-std/LICENSE-MIT new file mode 100644 index 000000000..28f98304a --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/LICENSE-MIT @@ -0,0 +1,25 @@ +Copyright Contributors to Forge Standard Library + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE O THE USE OR OTHER +DEALINGS IN THE SOFTWARE.R diff --git a/examples/validating-public-input/contracts/lib/forge-std/README.md b/examples/validating-public-input/contracts/lib/forge-std/README.md new file mode 100644 index 000000000..0cb86602e --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/README.md @@ -0,0 +1,250 @@ +# Forge Standard Library • [![CI status](https://github.com/foundry-rs/forge-std/actions/workflows/ci.yml/badge.svg)](https://github.com/foundry-rs/forge-std/actions/workflows/ci.yml) + +Forge Standard Library is a collection of helpful contracts and libraries for use with [Forge and Foundry](https://github.com/foundry-rs/foundry). It leverages Forge's cheatcodes to make writing tests easier and faster, while improving the UX of cheatcodes. + +**Learn how to use Forge-Std with the [📖 Foundry Book (Forge-Std Guide)](https://book.getfoundry.sh/forge/forge-std.html).** + +## Install + +```bash +forge install foundry-rs/forge-std +``` + +## Contracts +### stdError + +This is a helper contract for errors and reverts. In Forge, this contract is particularly helpful for the `expectRevert` cheatcode, as it provides all compiler builtin errors. + +See the contract itself for all error codes. + +#### Example usage + +```solidity + +import "forge-std/Test.sol"; + +contract TestContract is Test { + ErrorsTest test; + + function setUp() public { + test = new ErrorsTest(); + } + + function testExpectArithmetic() public { + vm.expectRevert(stdError.arithmeticError); + test.arithmeticError(10); + } +} + +contract ErrorsTest { + function arithmeticError(uint256 a) public { + uint256 a = a - 100; + } +} +``` + +### stdStorage + +This is a rather large contract due to all of the overloading to make the UX decent. Primarily, it is a wrapper around the `record` and `accesses` cheatcodes. It can *always* find and write the storage slot(s) associated with a particular variable without knowing the storage layout. The one _major_ caveat to this is while a slot can be found for packed storage variables, we can't write to that variable safely. If a user tries to write to a packed slot, the execution throws an error, unless it is uninitialized (`bytes32(0)`). + +This works by recording all `SLOAD`s and `SSTORE`s during a function call. If there is a single slot read or written to, it immediately returns the slot. Otherwise, behind the scenes, we iterate through and check each one (assuming the user passed in a `depth` parameter). If the variable is a struct, you can pass in a `depth` parameter which is basically the field depth. + +I.e.: +```solidity +struct T { + // depth 0 + uint256 a; + // depth 1 + uint256 b; +} +``` + +#### Example usage + +```solidity +import "forge-std/Test.sol"; + +contract TestContract is Test { + using stdStorage for StdStorage; + + Storage test; + + function setUp() public { + test = new Storage(); + } + + function testFindExists() public { + // Lets say we want to find the slot for the public + // variable `exists`. We just pass in the function selector + // to the `find` command + uint256 slot = stdstore.target(address(test)).sig("exists()").find(); + assertEq(slot, 0); + } + + function testWriteExists() public { + // Lets say we want to write to the slot for the public + // variable `exists`. We just pass in the function selector + // to the `checked_write` command + stdstore.target(address(test)).sig("exists()").checked_write(100); + assertEq(test.exists(), 100); + } + + // It supports arbitrary storage layouts, like assembly based storage locations + function testFindHidden() public { + // `hidden` is a random hash of a bytes, iteration through slots would + // not find it. Our mechanism does + // Also, you can use the selector instead of a string + uint256 slot = stdstore.target(address(test)).sig(test.hidden.selector).find(); + assertEq(slot, uint256(keccak256("my.random.var"))); + } + + // If targeting a mapping, you have to pass in the keys necessary to perform the find + // i.e.: + function testFindMapping() public { + uint256 slot = stdstore + .target(address(test)) + .sig(test.map_addr.selector) + .with_key(address(this)) + .find(); + // in the `Storage` constructor, we wrote that this address' value was 1 in the map + // so when we load the slot, we expect it to be 1 + assertEq(uint(vm.load(address(test), bytes32(slot))), 1); + } + + // If the target is a struct, you can specify the field depth: + function testFindStruct() public { + // NOTE: see the depth parameter - 0 means 0th field, 1 means 1st field, etc. + uint256 slot_for_a_field = stdstore + .target(address(test)) + .sig(test.basicStruct.selector) + .depth(0) + .find(); + + uint256 slot_for_b_field = stdstore + .target(address(test)) + .sig(test.basicStruct.selector) + .depth(1) + .find(); + + assertEq(uint(vm.load(address(test), bytes32(slot_for_a_field))), 1); + assertEq(uint(vm.load(address(test), bytes32(slot_for_b_field))), 2); + } +} + +// A complex storage contract +contract Storage { + struct UnpackedStruct { + uint256 a; + uint256 b; + } + + constructor() { + map_addr[msg.sender] = 1; + } + + uint256 public exists = 1; + mapping(address => uint256) public map_addr; + // mapping(address => Packed) public map_packed; + mapping(address => UnpackedStruct) public map_struct; + mapping(address => mapping(address => uint256)) public deep_map; + mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct; + UnpackedStruct public basicStruct = UnpackedStruct({ + a: 1, + b: 2 + }); + + function hidden() public view returns (bytes32 t) { + // an extremely hidden storage slot + bytes32 slot = keccak256("my.random.var"); + assembly { + t := sload(slot) + } + } +} +``` + +### stdCheats + +This is a wrapper over miscellaneous cheatcodes that need wrappers to be more dev friendly. Currently there are only functions related to `prank`. In general, users may expect ETH to be put into an address on `prank`, but this is not the case for safety reasons. Explicitly this `hoax` function should only be used for address that have expected balances as it will get overwritten. If an address already has ETH, you should just use `prank`. If you want to change that balance explicitly, just use `deal`. If you want to do both, `hoax` is also right for you. + + +#### Example usage: +```solidity + +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "forge-std/Test.sol"; + +// Inherit the stdCheats +contract StdCheatsTest is Test { + Bar test; + function setUp() public { + test = new Bar(); + } + + function testHoax() public { + // we call `hoax`, which gives the target address + // eth and then calls `prank` + hoax(address(1337)); + test.bar{value: 100}(address(1337)); + + // overloaded to allow you to specify how much eth to + // initialize the address with + hoax(address(1337), 1); + test.bar{value: 1}(address(1337)); + } + + function testStartHoax() public { + // we call `startHoax`, which gives the target address + // eth and then calls `startPrank` + // + // it is also overloaded so that you can specify an eth amount + startHoax(address(1337)); + test.bar{value: 100}(address(1337)); + test.bar{value: 100}(address(1337)); + vm.stopPrank(); + test.bar(address(this)); + } +} + +contract Bar { + function bar(address expectedSender) public payable { + require(msg.sender == expectedSender, "!prank"); + } +} +``` + +### Std Assertions + +Contains various assertions. + +### `console.log` + +Usage follows the same format as [Hardhat](https://hardhat.org/hardhat-network/reference/#console-log). +It's recommended to use `console2.sol` as shown below, as this will show the decoded logs in Forge traces. + +```solidity +// import it indirectly via Test.sol +import "forge-std/Test.sol"; +// or directly import it +import "forge-std/console2.sol"; +... +console2.log(someValue); +``` + +If you need compatibility with Hardhat, you must use the standard `console.sol` instead. +Due to a bug in `console.sol`, logs that use `uint256` or `int256` types will not be properly decoded in Forge traces. + +```solidity +// import it indirectly via Test.sol +import "forge-std/Test.sol"; +// or directly import it +import "forge-std/console.sol"; +... +console.log(someValue); +``` + +## License + +Forge Standard Library is offered under either [MIT](LICENSE-MIT) or [Apache 2.0](LICENSE-APACHE) license. diff --git a/examples/validating-public-input/contracts/lib/forge-std/foundry.toml b/examples/validating-public-input/contracts/lib/forge-std/foundry.toml new file mode 100644 index 000000000..2bc66fa77 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/foundry.toml @@ -0,0 +1,21 @@ +[profile.default] +fs_permissions = [{ access = "read-write", path = "./"}] + +[rpc_endpoints] +# The RPC URLs are modified versions of the default for testing initialization. +mainnet = "https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX" # Different API key. +optimism_sepolia = "https://sepolia.optimism.io/" # Adds a trailing slash. +arbitrum_one_sepolia = "https://sepolia-rollup.arbitrum.io/rpc/" # Adds a trailing slash. +needs_undefined_env_var = "${UNDEFINED_RPC_URL_PLACEHOLDER}" + +[fmt] +# These are all the `forge fmt` defaults. +line_length = 120 +tab_width = 4 +bracket_spacing = false +int_types = 'long' +multiline_func_header = 'attributes_first' +quote_style = 'double' +number_underscore = 'preserve' +single_line_statement_blocks = 'preserve' +ignore = ["src/console.sol", "src/console2.sol"] \ No newline at end of file diff --git a/examples/validating-public-input/contracts/lib/forge-std/package.json b/examples/validating-public-input/contracts/lib/forge-std/package.json new file mode 100644 index 000000000..7e6618589 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/package.json @@ -0,0 +1,16 @@ +{ + "name": "forge-std", + "version": "1.9.1", + "description": "Forge Standard Library is a collection of helpful contracts and libraries for use with Forge and Foundry.", + "homepage": "https://book.getfoundry.sh/forge/forge-std", + "bugs": "https://github.com/foundry-rs/forge-std/issues", + "license": "(Apache-2.0 OR MIT)", + "author": "Contributors to Forge Standard Library", + "files": [ + "src/**/*" + ], + "repository": { + "type": "git", + "url": "https://github.com/foundry-rs/forge-std.git" + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/scripts/vm.py b/examples/validating-public-input/contracts/lib/forge-std/scripts/vm.py new file mode 100755 index 000000000..f0537db9b --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/scripts/vm.py @@ -0,0 +1,635 @@ +#!/usr/bin/env python3 + +import copy +import json +import re +import subprocess +from enum import Enum as PyEnum +from typing import Callable +from urllib import request + +VoidFn = Callable[[], None] + +CHEATCODES_JSON_URL = "https://raw.githubusercontent.com/foundry-rs/foundry/master/crates/cheatcodes/assets/cheatcodes.json" +OUT_PATH = "src/Vm.sol" + +VM_SAFE_DOC = """\ +/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may +/// result in Script simulations differing from on-chain execution. It is recommended to only use +/// these cheats in scripts. +""" + +VM_DOC = """\ +/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used +/// in tests, but it is not recommended to use these cheats in scripts. +""" + + +def main(): + json_str = request.urlopen(CHEATCODES_JSON_URL).read().decode("utf-8") + contract = Cheatcodes.from_json(json_str) + + ccs = contract.cheatcodes + ccs = list(filter(lambda cc: cc.status not in ["experimental", "internal"], ccs)) + ccs.sort(key=lambda cc: cc.func.id) + + safe = list(filter(lambda cc: cc.safety == "safe", ccs)) + safe.sort(key=CmpCheatcode) + unsafe = list(filter(lambda cc: cc.safety == "unsafe", ccs)) + unsafe.sort(key=CmpCheatcode) + assert len(safe) + len(unsafe) == len(ccs) + + prefix_with_group_headers(safe) + prefix_with_group_headers(unsafe) + + out = "" + + out += "// Automatically @generated by scripts/vm.py. Do not modify manually.\n\n" + + pp = CheatcodesPrinter( + spdx_identifier="MIT OR Apache-2.0", + solidity_requirement=">=0.6.2 <0.9.0", + abicoder_pragma=True, + ) + pp.p_prelude() + pp.prelude = False + out += pp.finish() + + out += "\n\n" + out += VM_SAFE_DOC + vm_safe = Cheatcodes( + # TODO: Custom errors were introduced in 0.8.4 + errors=[], # contract.errors + events=contract.events, + enums=contract.enums, + structs=contract.structs, + cheatcodes=safe, + ) + pp.p_contract(vm_safe, "VmSafe") + out += pp.finish() + + out += "\n\n" + out += VM_DOC + vm_unsafe = Cheatcodes( + errors=[], + events=[], + enums=[], + structs=[], + cheatcodes=unsafe, + ) + pp.p_contract(vm_unsafe, "Vm", "VmSafe") + out += pp.finish() + + # Compatibility with <0.8.0 + def memory_to_calldata(m: re.Match) -> str: + return " calldata " + m.group(1) + + out = re.sub(r" memory (.*returns)", memory_to_calldata, out) + + with open(OUT_PATH, "w") as f: + f.write(out) + + forge_fmt = ["forge", "fmt", OUT_PATH] + res = subprocess.run(forge_fmt) + assert res.returncode == 0, f"command failed: {forge_fmt}" + + print(f"Wrote to {OUT_PATH}") + + +class CmpCheatcode: + cheatcode: "Cheatcode" + + def __init__(self, cheatcode: "Cheatcode"): + self.cheatcode = cheatcode + + def __lt__(self, other: "CmpCheatcode") -> bool: + return cmp_cheatcode(self.cheatcode, other.cheatcode) < 0 + + def __eq__(self, other: "CmpCheatcode") -> bool: + return cmp_cheatcode(self.cheatcode, other.cheatcode) == 0 + + def __gt__(self, other: "CmpCheatcode") -> bool: + return cmp_cheatcode(self.cheatcode, other.cheatcode) > 0 + + +def cmp_cheatcode(a: "Cheatcode", b: "Cheatcode") -> int: + if a.group != b.group: + return -1 if a.group < b.group else 1 + if a.status != b.status: + return -1 if a.status < b.status else 1 + if a.safety != b.safety: + return -1 if a.safety < b.safety else 1 + if a.func.id != b.func.id: + return -1 if a.func.id < b.func.id else 1 + return 0 + + +# HACK: A way to add group header comments without having to modify printer code +def prefix_with_group_headers(cheats: list["Cheatcode"]): + s = set() + for i, cheat in enumerate(cheats): + if cheat.group in s: + continue + + s.add(cheat.group) + + c = copy.deepcopy(cheat) + c.func.description = "" + c.func.declaration = f"// ======== {group(c.group)} ========" + cheats.insert(i, c) + return cheats + + +def group(s: str) -> str: + if s == "evm": + return "EVM" + if s == "json": + return "JSON" + return s[0].upper() + s[1:] + + +class Visibility(PyEnum): + EXTERNAL: str = "external" + PUBLIC: str = "public" + INTERNAL: str = "internal" + PRIVATE: str = "private" + + def __str__(self): + return self.value + + +class Mutability(PyEnum): + PURE: str = "pure" + VIEW: str = "view" + NONE: str = "" + + def __str__(self): + return self.value + + +class Function: + id: str + description: str + declaration: str + visibility: Visibility + mutability: Mutability + signature: str + selector: str + selector_bytes: bytes + + def __init__( + self, + id: str, + description: str, + declaration: str, + visibility: Visibility, + mutability: Mutability, + signature: str, + selector: str, + selector_bytes: bytes, + ): + self.id = id + self.description = description + self.declaration = declaration + self.visibility = visibility + self.mutability = mutability + self.signature = signature + self.selector = selector + self.selector_bytes = selector_bytes + + @staticmethod + def from_dict(d: dict) -> "Function": + return Function( + d["id"], + d["description"], + d["declaration"], + Visibility(d["visibility"]), + Mutability(d["mutability"]), + d["signature"], + d["selector"], + bytes(d["selectorBytes"]), + ) + + +class Cheatcode: + func: Function + group: str + status: str + safety: str + + def __init__(self, func: Function, group: str, status: str, safety: str): + self.func = func + self.group = group + self.status = status + self.safety = safety + + @staticmethod + def from_dict(d: dict) -> "Cheatcode": + return Cheatcode( + Function.from_dict(d["func"]), + str(d["group"]), + str(d["status"]), + str(d["safety"]), + ) + + +class Error: + name: str + description: str + declaration: str + + def __init__(self, name: str, description: str, declaration: str): + self.name = name + self.description = description + self.declaration = declaration + + @staticmethod + def from_dict(d: dict) -> "Error": + return Error(**d) + + +class Event: + name: str + description: str + declaration: str + + def __init__(self, name: str, description: str, declaration: str): + self.name = name + self.description = description + self.declaration = declaration + + @staticmethod + def from_dict(d: dict) -> "Event": + return Event(**d) + + +class EnumVariant: + name: str + description: str + + def __init__(self, name: str, description: str): + self.name = name + self.description = description + + +class Enum: + name: str + description: str + variants: list[EnumVariant] + + def __init__(self, name: str, description: str, variants: list[EnumVariant]): + self.name = name + self.description = description + self.variants = variants + + @staticmethod + def from_dict(d: dict) -> "Enum": + return Enum( + d["name"], + d["description"], + list(map(lambda v: EnumVariant(**v), d["variants"])), + ) + + +class StructField: + name: str + ty: str + description: str + + def __init__(self, name: str, ty: str, description: str): + self.name = name + self.ty = ty + self.description = description + + +class Struct: + name: str + description: str + fields: list[StructField] + + def __init__(self, name: str, description: str, fields: list[StructField]): + self.name = name + self.description = description + self.fields = fields + + @staticmethod + def from_dict(d: dict) -> "Struct": + return Struct( + d["name"], + d["description"], + list(map(lambda f: StructField(**f), d["fields"])), + ) + + +class Cheatcodes: + errors: list[Error] + events: list[Event] + enums: list[Enum] + structs: list[Struct] + cheatcodes: list[Cheatcode] + + def __init__( + self, + errors: list[Error], + events: list[Event], + enums: list[Enum], + structs: list[Struct], + cheatcodes: list[Cheatcode], + ): + self.errors = errors + self.events = events + self.enums = enums + self.structs = structs + self.cheatcodes = cheatcodes + + @staticmethod + def from_dict(d: dict) -> "Cheatcodes": + return Cheatcodes( + errors=[Error.from_dict(e) for e in d["errors"]], + events=[Event.from_dict(e) for e in d["events"]], + enums=[Enum.from_dict(e) for e in d["enums"]], + structs=[Struct.from_dict(e) for e in d["structs"]], + cheatcodes=[Cheatcode.from_dict(e) for e in d["cheatcodes"]], + ) + + @staticmethod + def from_json(s) -> "Cheatcodes": + return Cheatcodes.from_dict(json.loads(s)) + + @staticmethod + def from_json_file(file_path: str) -> "Cheatcodes": + with open(file_path, "r") as f: + return Cheatcodes.from_dict(json.load(f)) + + +class Item(PyEnum): + ERROR: str = "error" + EVENT: str = "event" + ENUM: str = "enum" + STRUCT: str = "struct" + FUNCTION: str = "function" + + +class ItemOrder: + _list: list[Item] + + def __init__(self, list: list[Item]) -> None: + assert len(list) <= len(Item), "list must not contain more items than Item" + assert len(list) == len(set(list)), "list must not contain duplicates" + self._list = list + pass + + def get_list(self) -> list[Item]: + return self._list + + @staticmethod + def default() -> "ItemOrder": + return ItemOrder( + [ + Item.ERROR, + Item.EVENT, + Item.ENUM, + Item.STRUCT, + Item.FUNCTION, + ] + ) + + +class CheatcodesPrinter: + buffer: str + + prelude: bool + spdx_identifier: str + solidity_requirement: str + abicoder_v2: bool + + block_doc_style: bool + + indent_level: int + _indent_str: str + + nl_str: str + + items_order: ItemOrder + + def __init__( + self, + buffer: str = "", + prelude: bool = True, + spdx_identifier: str = "UNLICENSED", + solidity_requirement: str = "", + abicoder_pragma: bool = False, + block_doc_style: bool = False, + indent_level: int = 0, + indent_with: int | str = 4, + nl_str: str = "\n", + items_order: ItemOrder = ItemOrder.default(), + ): + self.prelude = prelude + self.spdx_identifier = spdx_identifier + self.solidity_requirement = solidity_requirement + self.abicoder_v2 = abicoder_pragma + self.block_doc_style = block_doc_style + self.buffer = buffer + self.indent_level = indent_level + self.nl_str = nl_str + + if isinstance(indent_with, int): + assert indent_with >= 0 + self._indent_str = " " * indent_with + elif isinstance(indent_with, str): + self._indent_str = indent_with + else: + assert False, "indent_with must be int or str" + + self.items_order = items_order + + def finish(self) -> str: + ret = self.buffer.rstrip() + self.buffer = "" + return ret + + def p_contract(self, contract: Cheatcodes, name: str, inherits: str = ""): + if self.prelude: + self.p_prelude(contract) + + self._p_str("interface ") + name = name.strip() + if name != "": + self._p_str(name) + self._p_str(" ") + if inherits != "": + self._p_str("is ") + self._p_str(inherits) + self._p_str(" ") + self._p_str("{") + self._p_nl() + self._with_indent(lambda: self._p_items(contract)) + self._p_str("}") + self._p_nl() + + def _p_items(self, contract: Cheatcodes): + for item in self.items_order.get_list(): + if item == Item.ERROR: + self.p_errors(contract.errors) + elif item == Item.EVENT: + self.p_events(contract.events) + elif item == Item.ENUM: + self.p_enums(contract.enums) + elif item == Item.STRUCT: + self.p_structs(contract.structs) + elif item == Item.FUNCTION: + self.p_functions(contract.cheatcodes) + else: + assert False, f"unknown item {item}" + + def p_prelude(self, contract: Cheatcodes | None = None): + self._p_str(f"// SPDX-License-Identifier: {self.spdx_identifier}") + self._p_nl() + + if self.solidity_requirement != "": + req = self.solidity_requirement + elif contract and len(contract.errors) > 0: + req = ">=0.8.4 <0.9.0" + else: + req = ">=0.6.0 <0.9.0" + self._p_str(f"pragma solidity {req};") + self._p_nl() + + if self.abicoder_v2: + self._p_str("pragma experimental ABIEncoderV2;") + self._p_nl() + + self._p_nl() + + def p_errors(self, errors: list[Error]): + for error in errors: + self._p_line(lambda: self.p_error(error)) + + def p_error(self, error: Error): + self._p_comment(error.description, doc=True) + self._p_line(lambda: self._p_str(error.declaration)) + + def p_events(self, events: list[Event]): + for event in events: + self._p_line(lambda: self.p_event(event)) + + def p_event(self, event: Event): + self._p_comment(event.description, doc=True) + self._p_line(lambda: self._p_str(event.declaration)) + + def p_enums(self, enums: list[Enum]): + for enum in enums: + self._p_line(lambda: self.p_enum(enum)) + + def p_enum(self, enum: Enum): + self._p_comment(enum.description, doc=True) + self._p_line(lambda: self._p_str(f"enum {enum.name} {{")) + self._with_indent(lambda: self.p_enum_variants(enum.variants)) + self._p_line(lambda: self._p_str("}")) + + def p_enum_variants(self, variants: list[EnumVariant]): + for i, variant in enumerate(variants): + self._p_indent() + self._p_comment(variant.description) + + self._p_indent() + self._p_str(variant.name) + if i < len(variants) - 1: + self._p_str(",") + self._p_nl() + + def p_structs(self, structs: list[Struct]): + for struct in structs: + self._p_line(lambda: self.p_struct(struct)) + + def p_struct(self, struct: Struct): + self._p_comment(struct.description, doc=True) + self._p_line(lambda: self._p_str(f"struct {struct.name} {{")) + self._with_indent(lambda: self.p_struct_fields(struct.fields)) + self._p_line(lambda: self._p_str("}")) + + def p_struct_fields(self, fields: list[StructField]): + for field in fields: + self._p_line(lambda: self.p_struct_field(field)) + + def p_struct_field(self, field: StructField): + self._p_comment(field.description) + self._p_indented(lambda: self._p_str(f"{field.ty} {field.name};")) + + def p_functions(self, cheatcodes: list[Cheatcode]): + for cheatcode in cheatcodes: + self._p_line(lambda: self.p_function(cheatcode.func)) + + def p_function(self, func: Function): + self._p_comment(func.description, doc=True) + self._p_line(lambda: self._p_str(func.declaration)) + + def _p_comment(self, s: str, doc: bool = False): + s = s.strip() + if s == "": + return + + s = map(lambda line: line.lstrip(), s.split("\n")) + if self.block_doc_style: + self._p_str("/*") + if doc: + self._p_str("*") + self._p_nl() + for line in s: + self._p_indent() + self._p_str(" ") + if doc: + self._p_str("* ") + self._p_str(line) + self._p_nl() + self._p_indent() + self._p_str(" */") + self._p_nl() + else: + first_line = True + for line in s: + if not first_line: + self._p_indent() + first_line = False + + if doc: + self._p_str("/// ") + else: + self._p_str("// ") + self._p_str(line) + self._p_nl() + + def _with_indent(self, f: VoidFn): + self._inc_indent() + f() + self._dec_indent() + + def _p_line(self, f: VoidFn): + self._p_indent() + f() + self._p_nl() + + def _p_indented(self, f: VoidFn): + self._p_indent() + f() + + def _p_indent(self): + for _ in range(self.indent_level): + self._p_str(self._indent_str) + + def _p_nl(self): + self._p_str(self.nl_str) + + def _p_str(self, txt: str): + self.buffer += txt + + def _inc_indent(self): + self.indent_level += 1 + + def _dec_indent(self): + self.indent_level -= 1 + + +if __name__ == "__main__": + main() diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/Base.sol b/examples/validating-public-input/contracts/lib/forge-std/src/Base.sol new file mode 100644 index 000000000..851ac0cd2 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/Base.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +import {StdStorage} from "./StdStorage.sol"; +import {Vm, VmSafe} from "./Vm.sol"; + +abstract contract CommonBase { + // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D. + address internal constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); + // console.sol and console2.sol work by executing a staticcall to this address. + address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67; + // Used when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy. + address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; + // Default address for tx.origin and msg.sender, 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38. + address internal constant DEFAULT_SENDER = address(uint160(uint256(keccak256("foundry default caller")))); + // Address of the test contract, deployed by the DEFAULT_SENDER. + address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f; + // Deterministic deployment address of the Multicall3 contract. + address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11; + // The order of the secp256k1 curve. + uint256 internal constant SECP256K1_ORDER = + 115792089237316195423570985008687907852837564279074904382605163141518161494337; + + uint256 internal constant UINT256_MAX = + 115792089237316195423570985008687907853269984665640564039457584007913129639935; + + Vm internal constant vm = Vm(VM_ADDRESS); + StdStorage internal stdstore; +} + +abstract contract TestBase is CommonBase {} + +abstract contract ScriptBase is CommonBase { + VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS); +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/Script.sol b/examples/validating-public-input/contracts/lib/forge-std/src/Script.sol new file mode 100644 index 000000000..94e75f6cb --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/Script.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +// 💬 ABOUT +// Forge Std's default Script. + +// 🧩 MODULES +import {console} from "./console.sol"; +import {console2} from "./console2.sol"; +import {safeconsole} from "./safeconsole.sol"; +import {StdChains} from "./StdChains.sol"; +import {StdCheatsSafe} from "./StdCheats.sol"; +import {stdJson} from "./StdJson.sol"; +import {stdMath} from "./StdMath.sol"; +import {StdStorage, stdStorageSafe} from "./StdStorage.sol"; +import {StdStyle} from "./StdStyle.sol"; +import {StdUtils} from "./StdUtils.sol"; +import {VmSafe} from "./Vm.sol"; + +// 📦 BOILERPLATE +import {ScriptBase} from "./Base.sol"; + +// â­ï¸ SCRIPT +abstract contract Script is ScriptBase, StdChains, StdCheatsSafe, StdUtils { + // Note: IS_SCRIPT() must return true. + bool public IS_SCRIPT = true; +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdAssertions.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdAssertions.sol new file mode 100644 index 000000000..857ecd570 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/StdAssertions.sol @@ -0,0 +1,669 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; +pragma experimental ABIEncoderV2; + +import {Vm} from "./Vm.sol"; + +abstract contract StdAssertions { + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + event log(string); + event logs(bytes); + + event log_address(address); + event log_bytes32(bytes32); + event log_int(int256); + event log_uint(uint256); + event log_bytes(bytes); + event log_string(string); + + event log_named_address(string key, address val); + event log_named_bytes32(string key, bytes32 val); + event log_named_decimal_int(string key, int256 val, uint256 decimals); + event log_named_decimal_uint(string key, uint256 val, uint256 decimals); + event log_named_int(string key, int256 val); + event log_named_uint(string key, uint256 val); + event log_named_bytes(string key, bytes val); + event log_named_string(string key, string val); + + event log_array(uint256[] val); + event log_array(int256[] val); + event log_array(address[] val); + event log_named_array(string key, uint256[] val); + event log_named_array(string key, int256[] val); + event log_named_array(string key, address[] val); + + bool private _failed; + + function failed() public view returns (bool) { + if (_failed) { + return _failed; + } else { + return vm.load(address(vm), bytes32("failed")) != bytes32(0); + } + } + + function fail() internal virtual { + vm.store(address(vm), bytes32("failed"), bytes32(uint256(1))); + _failed = true; + } + + function assertTrue(bool data) internal pure virtual { + vm.assertTrue(data); + } + + function assertTrue(bool data, string memory err) internal pure virtual { + vm.assertTrue(data, err); + } + + function assertFalse(bool data) internal pure virtual { + vm.assertFalse(data); + } + + function assertFalse(bool data, string memory err) internal pure virtual { + vm.assertFalse(data, err); + } + + function assertEq(bool left, bool right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(bool left, bool right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(uint256 left, uint256 right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(uint256 left, uint256 right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { + vm.assertEqDecimal(left, right, decimals); + } + + function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertEqDecimal(left, right, decimals, err); + } + + function assertEq(int256 left, int256 right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(int256 left, int256 right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { + vm.assertEqDecimal(left, right, decimals); + } + + function assertEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertEqDecimal(left, right, decimals, err); + } + + function assertEq(address left, address right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(address left, address right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(bytes32 left, bytes32 right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(bytes32 left, bytes32 right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq32(bytes32 left, bytes32 right) internal pure virtual { + assertEq(left, right); + } + + function assertEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual { + assertEq(left, right, err); + } + + function assertEq(string memory left, string memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(string memory left, string memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(bytes memory left, bytes memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(bytes memory left, bytes memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(bool[] memory left, bool[] memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(uint256[] memory left, uint256[] memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(int256[] memory left, int256[] memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(address[] memory left, address[] memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(address[] memory left, address[] memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(string[] memory left, string[] memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(string[] memory left, string[] memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(bytes[] memory left, bytes[] memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + // Legacy helper + function assertEqUint(uint256 left, uint256 right) internal pure virtual { + assertEq(left, right); + } + + function assertNotEq(bool left, bool right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(bool left, bool right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(uint256 left, uint256 right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(uint256 left, uint256 right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { + vm.assertNotEqDecimal(left, right, decimals); + } + + function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) + internal + pure + virtual + { + vm.assertNotEqDecimal(left, right, decimals, err); + } + + function assertNotEq(int256 left, int256 right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(int256 left, int256 right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { + vm.assertNotEqDecimal(left, right, decimals); + } + + function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertNotEqDecimal(left, right, decimals, err); + } + + function assertNotEq(address left, address right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(address left, address right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(bytes32 left, bytes32 right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(bytes32 left, bytes32 right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq32(bytes32 left, bytes32 right) internal pure virtual { + assertNotEq(left, right); + } + + function assertNotEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual { + assertNotEq(left, right, err); + } + + function assertNotEq(string memory left, string memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(string memory left, string memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(bytes memory left, bytes memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(bytes memory left, bytes memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(bool[] memory left, bool[] memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(uint256[] memory left, uint256[] memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(int256[] memory left, int256[] memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(address[] memory left, address[] memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(address[] memory left, address[] memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(string[] memory left, string[] memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(string[] memory left, string[] memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(bytes[] memory left, bytes[] memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertLt(uint256 left, uint256 right) internal pure virtual { + vm.assertLt(left, right); + } + + function assertLt(uint256 left, uint256 right, string memory err) internal pure virtual { + vm.assertLt(left, right, err); + } + + function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { + vm.assertLtDecimal(left, right, decimals); + } + + function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertLtDecimal(left, right, decimals, err); + } + + function assertLt(int256 left, int256 right) internal pure virtual { + vm.assertLt(left, right); + } + + function assertLt(int256 left, int256 right, string memory err) internal pure virtual { + vm.assertLt(left, right, err); + } + + function assertLtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { + vm.assertLtDecimal(left, right, decimals); + } + + function assertLtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertLtDecimal(left, right, decimals, err); + } + + function assertGt(uint256 left, uint256 right) internal pure virtual { + vm.assertGt(left, right); + } + + function assertGt(uint256 left, uint256 right, string memory err) internal pure virtual { + vm.assertGt(left, right, err); + } + + function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { + vm.assertGtDecimal(left, right, decimals); + } + + function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertGtDecimal(left, right, decimals, err); + } + + function assertGt(int256 left, int256 right) internal pure virtual { + vm.assertGt(left, right); + } + + function assertGt(int256 left, int256 right, string memory err) internal pure virtual { + vm.assertGt(left, right, err); + } + + function assertGtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { + vm.assertGtDecimal(left, right, decimals); + } + + function assertGtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertGtDecimal(left, right, decimals, err); + } + + function assertLe(uint256 left, uint256 right) internal pure virtual { + vm.assertLe(left, right); + } + + function assertLe(uint256 left, uint256 right, string memory err) internal pure virtual { + vm.assertLe(left, right, err); + } + + function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { + vm.assertLeDecimal(left, right, decimals); + } + + function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertLeDecimal(left, right, decimals, err); + } + + function assertLe(int256 left, int256 right) internal pure virtual { + vm.assertLe(left, right); + } + + function assertLe(int256 left, int256 right, string memory err) internal pure virtual { + vm.assertLe(left, right, err); + } + + function assertLeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { + vm.assertLeDecimal(left, right, decimals); + } + + function assertLeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertLeDecimal(left, right, decimals, err); + } + + function assertGe(uint256 left, uint256 right) internal pure virtual { + vm.assertGe(left, right); + } + + function assertGe(uint256 left, uint256 right, string memory err) internal pure virtual { + vm.assertGe(left, right, err); + } + + function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { + vm.assertGeDecimal(left, right, decimals); + } + + function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertGeDecimal(left, right, decimals, err); + } + + function assertGe(int256 left, int256 right) internal pure virtual { + vm.assertGe(left, right); + } + + function assertGe(int256 left, int256 right, string memory err) internal pure virtual { + vm.assertGe(left, right, err); + } + + function assertGeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { + vm.assertGeDecimal(left, right, decimals); + } + + function assertGeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertGeDecimal(left, right, decimals, err); + } + + function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) internal pure virtual { + vm.assertApproxEqAbs(left, right, maxDelta); + } + + function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string memory err) + internal + pure + virtual + { + vm.assertApproxEqAbs(left, right, maxDelta, err); + } + + function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) + internal + pure + virtual + { + vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals); + } + + function assertApproxEqAbsDecimal( + uint256 left, + uint256 right, + uint256 maxDelta, + uint256 decimals, + string memory err + ) internal pure virtual { + vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err); + } + + function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) internal pure virtual { + vm.assertApproxEqAbs(left, right, maxDelta); + } + + function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string memory err) internal pure virtual { + vm.assertApproxEqAbs(left, right, maxDelta, err); + } + + function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) + internal + pure + virtual + { + vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals); + } + + function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals, string memory err) + internal + pure + virtual + { + vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err); + } + + function assertApproxEqRel( + uint256 left, + uint256 right, + uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100% + ) internal pure virtual { + vm.assertApproxEqRel(left, right, maxPercentDelta); + } + + function assertApproxEqRel( + uint256 left, + uint256 right, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + string memory err + ) internal pure virtual { + vm.assertApproxEqRel(left, right, maxPercentDelta, err); + } + + function assertApproxEqRelDecimal( + uint256 left, + uint256 right, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + uint256 decimals + ) internal pure virtual { + vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals); + } + + function assertApproxEqRelDecimal( + uint256 left, + uint256 right, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + uint256 decimals, + string memory err + ) internal pure virtual { + vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err); + } + + function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) internal pure virtual { + vm.assertApproxEqRel(left, right, maxPercentDelta); + } + + function assertApproxEqRel( + int256 left, + int256 right, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + string memory err + ) internal pure virtual { + vm.assertApproxEqRel(left, right, maxPercentDelta, err); + } + + function assertApproxEqRelDecimal( + int256 left, + int256 right, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + uint256 decimals + ) internal pure virtual { + vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals); + } + + function assertApproxEqRelDecimal( + int256 left, + int256 right, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + uint256 decimals, + string memory err + ) internal pure virtual { + vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err); + } + + // Inherited from DSTest, not used but kept for backwards-compatibility + function checkEq0(bytes memory left, bytes memory right) internal pure returns (bool) { + return keccak256(left) == keccak256(right); + } + + function assertEq0(bytes memory left, bytes memory right) internal pure virtual { + assertEq(left, right); + } + + function assertEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual { + assertEq(left, right, err); + } + + function assertNotEq0(bytes memory left, bytes memory right) internal pure virtual { + assertNotEq(left, right); + } + + function assertNotEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual { + assertNotEq(left, right, err); + } + + function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB) internal virtual { + assertEqCall(target, callDataA, target, callDataB, true); + } + + function assertEqCall(address targetA, bytes memory callDataA, address targetB, bytes memory callDataB) + internal + virtual + { + assertEqCall(targetA, callDataA, targetB, callDataB, true); + } + + function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB, bool strictRevertData) + internal + virtual + { + assertEqCall(target, callDataA, target, callDataB, strictRevertData); + } + + function assertEqCall( + address targetA, + bytes memory callDataA, + address targetB, + bytes memory callDataB, + bool strictRevertData + ) internal virtual { + (bool successA, bytes memory returnDataA) = address(targetA).call(callDataA); + (bool successB, bytes memory returnDataB) = address(targetB).call(callDataB); + + if (successA && successB) { + assertEq(returnDataA, returnDataB, "Call return data does not match"); + } + + if (!successA && !successB && strictRevertData) { + assertEq(returnDataA, returnDataB, "Call revert data does not match"); + } + + if (!successA && successB) { + emit log("Error: Calls were not equal"); + emit log_named_bytes(" Left call revert data", returnDataA); + emit log_named_bytes(" Right call return data", returnDataB); + revert("assertion failed"); + } + + if (successA && !successB) { + emit log("Error: Calls were not equal"); + emit log_named_bytes(" Left call return data", returnDataA); + emit log_named_bytes(" Right call revert data", returnDataB); + revert("assertion failed"); + } + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdChains.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdChains.sol new file mode 100644 index 000000000..0fe827e4d --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/StdChains.sol @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +import {VmSafe} from "./Vm.sol"; + +/** + * StdChains provides information about EVM compatible chains that can be used in scripts/tests. + * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are + * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of + * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the + * alias used in this contract, which can be found as the first argument to the + * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function. + * + * There are two main ways to use this contract: + * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or + * `setChain(string memory chainAlias, Chain memory chain)` + * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`. + * + * The first time either of those are used, chains are initialized with the default set of RPC URLs. + * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in + * `defaultRpcUrls`. + * + * The `setChain` function is straightforward, and it simply saves off the given chain data. + * + * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say + * we want to retrieve the RPC URL for `mainnet`: + * - If you have specified data with `setChain`, it will return that. + * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it + * is valid (e.g. a URL is specified, or an environment variable is given and exists). + * - If neither of the above conditions is met, the default data is returned. + * + * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults. + */ +abstract contract StdChains { + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + + bool private stdChainsInitialized; + + struct ChainData { + string name; + uint256 chainId; + string rpcUrl; + } + + struct Chain { + // The chain name. + string name; + // The chain's Chain ID. + uint256 chainId; + // The chain's alias. (i.e. what gets specified in `foundry.toml`). + string chainAlias; + // A default RPC endpoint for this chain. + // NOTE: This default RPC URL is included for convenience to facilitate quick tests and + // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy + // usage as you will be throttled and this is a disservice to others who need this endpoint. + string rpcUrl; + } + + // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data. + mapping(string => Chain) private chains; + // Maps from the chain's alias to it's default RPC URL. + mapping(string => string) private defaultRpcUrls; + // Maps from a chain ID to it's alias. + mapping(uint256 => string) private idToAlias; + + bool private fallbackToDefaultRpcUrls = true; + + // The RPC URL will be fetched from config or defaultRpcUrls if possible. + function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) { + require(bytes(chainAlias).length != 0, "StdChains getChain(string): Chain alias cannot be the empty string."); + + initializeStdChains(); + chain = chains[chainAlias]; + require( + chain.chainId != 0, + string(abi.encodePacked("StdChains getChain(string): Chain with alias \"", chainAlias, "\" not found.")) + ); + + chain = getChainWithUpdatedRpcUrl(chainAlias, chain); + } + + function getChain(uint256 chainId) internal virtual returns (Chain memory chain) { + require(chainId != 0, "StdChains getChain(uint256): Chain ID cannot be 0."); + initializeStdChains(); + string memory chainAlias = idToAlias[chainId]; + + chain = chains[chainAlias]; + + require( + chain.chainId != 0, + string(abi.encodePacked("StdChains getChain(uint256): Chain with ID ", vm.toString(chainId), " not found.")) + ); + + chain = getChainWithUpdatedRpcUrl(chainAlias, chain); + } + + // set chain info, with priority to argument's rpcUrl field. + function setChain(string memory chainAlias, ChainData memory chain) internal virtual { + require( + bytes(chainAlias).length != 0, + "StdChains setChain(string,ChainData): Chain alias cannot be the empty string." + ); + + require(chain.chainId != 0, "StdChains setChain(string,ChainData): Chain ID cannot be 0."); + + initializeStdChains(); + string memory foundAlias = idToAlias[chain.chainId]; + + require( + bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)), + string( + abi.encodePacked( + "StdChains setChain(string,ChainData): Chain ID ", + vm.toString(chain.chainId), + " already used by \"", + foundAlias, + "\"." + ) + ) + ); + + uint256 oldChainId = chains[chainAlias].chainId; + delete idToAlias[oldChainId]; + + chains[chainAlias] = + Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl}); + idToAlias[chain.chainId] = chainAlias; + } + + // set chain info, with priority to argument's rpcUrl field. + function setChain(string memory chainAlias, Chain memory chain) internal virtual { + setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl})); + } + + function _toUpper(string memory str) private pure returns (string memory) { + bytes memory strb = bytes(str); + bytes memory copy = new bytes(strb.length); + for (uint256 i = 0; i < strb.length; i++) { + bytes1 b = strb[i]; + if (b >= 0x61 && b <= 0x7A) { + copy[i] = bytes1(uint8(b) - 32); + } else { + copy[i] = b; + } + } + return string(copy); + } + + // lookup rpcUrl, in descending order of priority: + // current -> config (foundry.toml) -> environment variable -> default + function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain) + private + view + returns (Chain memory) + { + if (bytes(chain.rpcUrl).length == 0) { + try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) { + chain.rpcUrl = configRpcUrl; + } catch (bytes memory err) { + string memory envName = string(abi.encodePacked(_toUpper(chainAlias), "_RPC_URL")); + if (fallbackToDefaultRpcUrls) { + chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]); + } else { + chain.rpcUrl = vm.envString(envName); + } + // Distinguish 'not found' from 'cannot read' + // The upstream error thrown by forge for failing cheats changed so we check both the old and new versions + bytes memory oldNotFoundError = + abi.encodeWithSignature("CheatCodeError", string(abi.encodePacked("invalid rpc url ", chainAlias))); + bytes memory newNotFoundError = abi.encodeWithSignature( + "CheatcodeError(string)", string(abi.encodePacked("invalid rpc url: ", chainAlias)) + ); + bytes32 errHash = keccak256(err); + if ( + (errHash != keccak256(oldNotFoundError) && errHash != keccak256(newNotFoundError)) + || bytes(chain.rpcUrl).length == 0 + ) { + /// @solidity memory-safe-assembly + assembly { + revert(add(32, err), mload(err)) + } + } + } + } + return chain; + } + + function setFallbackToDefaultRpcUrls(bool useDefault) internal { + fallbackToDefaultRpcUrls = useDefault; + } + + function initializeStdChains() private { + if (stdChainsInitialized) return; + + stdChainsInitialized = true; + + // If adding an RPC here, make sure to test the default RPC URL in `test_Rpcs` in `StdChains.t.sol` + setChainWithDefaultRpcUrl("anvil", ChainData("Anvil", 31337, "http://127.0.0.1:8545")); + setChainWithDefaultRpcUrl( + "mainnet", ChainData("Mainnet", 1, "https://eth-mainnet.alchemyapi.io/v2/pwc5rmJhrdoaSEfimoKEmsvOjKSmPDrP") + ); + setChainWithDefaultRpcUrl( + "sepolia", ChainData("Sepolia", 11155111, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001") + ); + setChainWithDefaultRpcUrl("holesky", ChainData("Holesky", 17000, "https://rpc.holesky.ethpandaops.io")); + setChainWithDefaultRpcUrl("optimism", ChainData("Optimism", 10, "https://mainnet.optimism.io")); + setChainWithDefaultRpcUrl( + "optimism_sepolia", ChainData("Optimism Sepolia", 11155420, "https://sepolia.optimism.io") + ); + setChainWithDefaultRpcUrl("arbitrum_one", ChainData("Arbitrum One", 42161, "https://arb1.arbitrum.io/rpc")); + setChainWithDefaultRpcUrl( + "arbitrum_one_sepolia", ChainData("Arbitrum One Sepolia", 421614, "https://sepolia-rollup.arbitrum.io/rpc") + ); + setChainWithDefaultRpcUrl("arbitrum_nova", ChainData("Arbitrum Nova", 42170, "https://nova.arbitrum.io/rpc")); + setChainWithDefaultRpcUrl("polygon", ChainData("Polygon", 137, "https://polygon-rpc.com")); + setChainWithDefaultRpcUrl( + "polygon_amoy", ChainData("Polygon Amoy", 80002, "https://rpc-amoy.polygon.technology") + ); + setChainWithDefaultRpcUrl("avalanche", ChainData("Avalanche", 43114, "https://api.avax.network/ext/bc/C/rpc")); + setChainWithDefaultRpcUrl( + "avalanche_fuji", ChainData("Avalanche Fuji", 43113, "https://api.avax-test.network/ext/bc/C/rpc") + ); + setChainWithDefaultRpcUrl( + "bnb_smart_chain", ChainData("BNB Smart Chain", 56, "https://bsc-dataseed1.binance.org") + ); + setChainWithDefaultRpcUrl( + "bnb_smart_chain_testnet", + ChainData("BNB Smart Chain Testnet", 97, "https://rpc.ankr.com/bsc_testnet_chapel") + ); + setChainWithDefaultRpcUrl("gnosis_chain", ChainData("Gnosis Chain", 100, "https://rpc.gnosischain.com")); + setChainWithDefaultRpcUrl("moonbeam", ChainData("Moonbeam", 1284, "https://rpc.api.moonbeam.network")); + setChainWithDefaultRpcUrl( + "moonriver", ChainData("Moonriver", 1285, "https://rpc.api.moonriver.moonbeam.network") + ); + setChainWithDefaultRpcUrl("moonbase", ChainData("Moonbase", 1287, "https://rpc.testnet.moonbeam.network")); + setChainWithDefaultRpcUrl("base_sepolia", ChainData("Base Sepolia", 84532, "https://sepolia.base.org")); + setChainWithDefaultRpcUrl("base", ChainData("Base", 8453, "https://mainnet.base.org")); + setChainWithDefaultRpcUrl("blast_sepolia", ChainData("Blast Sepolia", 168587773, "https://sepolia.blast.io")); + setChainWithDefaultRpcUrl("blast", ChainData("Blast", 81457, "https://rpc.blast.io")); + setChainWithDefaultRpcUrl("fantom_opera", ChainData("Fantom Opera", 250, "https://rpc.ankr.com/fantom/")); + setChainWithDefaultRpcUrl( + "fantom_opera_testnet", ChainData("Fantom Opera Testnet", 4002, "https://rpc.ankr.com/fantom_testnet/") + ); + setChainWithDefaultRpcUrl("fraxtal", ChainData("Fraxtal", 252, "https://rpc.frax.com")); + setChainWithDefaultRpcUrl("fraxtal_testnet", ChainData("Fraxtal Testnet", 2522, "https://rpc.testnet.frax.com")); + setChainWithDefaultRpcUrl( + "berachain_bartio_testnet", ChainData("Berachain bArtio Testnet", 80084, "https://bartio.rpc.berachain.com") + ); + } + + // set chain info, with priority to chainAlias' rpc url in foundry.toml + function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private { + string memory rpcUrl = chain.rpcUrl; + defaultRpcUrls[chainAlias] = rpcUrl; + chain.rpcUrl = ""; + setChain(chainAlias, chain); + chain.rpcUrl = rpcUrl; // restore argument + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdCheats.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdCheats.sol new file mode 100644 index 000000000..f2933139c --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/StdCheats.sol @@ -0,0 +1,817 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {StdStorage, stdStorage} from "./StdStorage.sol"; +import {console2} from "./console2.sol"; +import {Vm} from "./Vm.sol"; + +abstract contract StdCheatsSafe { + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + uint256 private constant UINT256_MAX = + 115792089237316195423570985008687907853269984665640564039457584007913129639935; + + bool private gasMeteringOff; + + // Data structures to parse Transaction objects from the broadcast artifact + // that conform to EIP1559. The Raw structs is what is parsed from the JSON + // and then converted to the one that is used by the user for better UX. + + struct RawTx1559 { + string[] arguments; + address contractAddress; + string contractName; + // json value name = function + string functionSig; + bytes32 hash; + // json value name = tx + RawTx1559Detail txDetail; + // json value name = type + string opcode; + } + + struct RawTx1559Detail { + AccessList[] accessList; + bytes data; + address from; + bytes gas; + bytes nonce; + address to; + bytes txType; + bytes value; + } + + struct Tx1559 { + string[] arguments; + address contractAddress; + string contractName; + string functionSig; + bytes32 hash; + Tx1559Detail txDetail; + string opcode; + } + + struct Tx1559Detail { + AccessList[] accessList; + bytes data; + address from; + uint256 gas; + uint256 nonce; + address to; + uint256 txType; + uint256 value; + } + + // Data structures to parse Transaction objects from the broadcast artifact + // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON + // and then converted to the one that is used by the user for better UX. + + struct TxLegacy { + string[] arguments; + address contractAddress; + string contractName; + string functionSig; + string hash; + string opcode; + TxDetailLegacy transaction; + } + + struct TxDetailLegacy { + AccessList[] accessList; + uint256 chainId; + bytes data; + address from; + uint256 gas; + uint256 gasPrice; + bytes32 hash; + uint256 nonce; + bytes1 opcode; + bytes32 r; + bytes32 s; + uint256 txType; + address to; + uint8 v; + uint256 value; + } + + struct AccessList { + address accessAddress; + bytes32[] storageKeys; + } + + // Data structures to parse Receipt objects from the broadcast artifact. + // The Raw structs is what is parsed from the JSON + // and then converted to the one that is used by the user for better UX. + + struct RawReceipt { + bytes32 blockHash; + bytes blockNumber; + address contractAddress; + bytes cumulativeGasUsed; + bytes effectiveGasPrice; + address from; + bytes gasUsed; + RawReceiptLog[] logs; + bytes logsBloom; + bytes status; + address to; + bytes32 transactionHash; + bytes transactionIndex; + } + + struct Receipt { + bytes32 blockHash; + uint256 blockNumber; + address contractAddress; + uint256 cumulativeGasUsed; + uint256 effectiveGasPrice; + address from; + uint256 gasUsed; + ReceiptLog[] logs; + bytes logsBloom; + uint256 status; + address to; + bytes32 transactionHash; + uint256 transactionIndex; + } + + // Data structures to parse the entire broadcast artifact, assuming the + // transactions conform to EIP1559. + + struct EIP1559ScriptArtifact { + string[] libraries; + string path; + string[] pending; + Receipt[] receipts; + uint256 timestamp; + Tx1559[] transactions; + TxReturn[] txReturns; + } + + struct RawEIP1559ScriptArtifact { + string[] libraries; + string path; + string[] pending; + RawReceipt[] receipts; + TxReturn[] txReturns; + uint256 timestamp; + RawTx1559[] transactions; + } + + struct RawReceiptLog { + // json value = address + address logAddress; + bytes32 blockHash; + bytes blockNumber; + bytes data; + bytes logIndex; + bool removed; + bytes32[] topics; + bytes32 transactionHash; + bytes transactionIndex; + bytes transactionLogIndex; + } + + struct ReceiptLog { + // json value = address + address logAddress; + bytes32 blockHash; + uint256 blockNumber; + bytes data; + uint256 logIndex; + bytes32[] topics; + uint256 transactionIndex; + uint256 transactionLogIndex; + bool removed; + } + + struct TxReturn { + string internalType; + string value; + } + + struct Account { + address addr; + uint256 key; + } + + enum AddressType { + Payable, + NonPayable, + ZeroAddress, + Precompile, + ForgeAddress + } + + // Checks that `addr` is not blacklisted by token contracts that have a blacklist. + function assumeNotBlacklisted(address token, address addr) internal view virtual { + // Nothing to check if `token` is not a contract. + uint256 tokenCodeSize; + assembly { + tokenCodeSize := extcodesize(token) + } + require(tokenCodeSize > 0, "StdCheats assumeNotBlacklisted(address,address): Token address is not a contract."); + + bool success; + bytes memory returnData; + + // 4-byte selector for `isBlacklisted(address)`, used by USDC. + (success, returnData) = token.staticcall(abi.encodeWithSelector(0xfe575a87, addr)); + vm.assume(!success || abi.decode(returnData, (bool)) == false); + + // 4-byte selector for `isBlackListed(address)`, used by USDT. + (success, returnData) = token.staticcall(abi.encodeWithSelector(0xe47d6060, addr)); + vm.assume(!success || abi.decode(returnData, (bool)) == false); + } + + // Checks that `addr` is not blacklisted by token contracts that have a blacklist. + // This is identical to `assumeNotBlacklisted(address,address)` but with a different name, for + // backwards compatibility, since this name was used in the original PR which has already has + // a release. This function can be removed in a future release once we want a breaking change. + function assumeNoBlacklisted(address token, address addr) internal view virtual { + assumeNotBlacklisted(token, addr); + } + + function assumeAddressIsNot(address addr, AddressType addressType) internal virtual { + if (addressType == AddressType.Payable) { + assumeNotPayable(addr); + } else if (addressType == AddressType.NonPayable) { + assumePayable(addr); + } else if (addressType == AddressType.ZeroAddress) { + assumeNotZeroAddress(addr); + } else if (addressType == AddressType.Precompile) { + assumeNotPrecompile(addr); + } else if (addressType == AddressType.ForgeAddress) { + assumeNotForgeAddress(addr); + } + } + + function assumeAddressIsNot(address addr, AddressType addressType1, AddressType addressType2) internal virtual { + assumeAddressIsNot(addr, addressType1); + assumeAddressIsNot(addr, addressType2); + } + + function assumeAddressIsNot( + address addr, + AddressType addressType1, + AddressType addressType2, + AddressType addressType3 + ) internal virtual { + assumeAddressIsNot(addr, addressType1); + assumeAddressIsNot(addr, addressType2); + assumeAddressIsNot(addr, addressType3); + } + + function assumeAddressIsNot( + address addr, + AddressType addressType1, + AddressType addressType2, + AddressType addressType3, + AddressType addressType4 + ) internal virtual { + assumeAddressIsNot(addr, addressType1); + assumeAddressIsNot(addr, addressType2); + assumeAddressIsNot(addr, addressType3); + assumeAddressIsNot(addr, addressType4); + } + + // This function checks whether an address, `addr`, is payable. It works by sending 1 wei to + // `addr` and checking the `success` return value. + // NOTE: This function may result in state changes depending on the fallback/receive logic + // implemented by `addr`, which should be taken into account when this function is used. + function _isPayable(address addr) private returns (bool) { + require( + addr.balance < UINT256_MAX, + "StdCheats _isPayable(address): Balance equals max uint256, so it cannot receive any more funds" + ); + uint256 origBalanceTest = address(this).balance; + uint256 origBalanceAddr = address(addr).balance; + + vm.deal(address(this), 1); + (bool success,) = payable(addr).call{value: 1}(""); + + // reset balances + vm.deal(address(this), origBalanceTest); + vm.deal(addr, origBalanceAddr); + + return success; + } + + // NOTE: This function may result in state changes depending on the fallback/receive logic + // implemented by `addr`, which should be taken into account when this function is used. See the + // `_isPayable` method for more information. + function assumePayable(address addr) internal virtual { + vm.assume(_isPayable(addr)); + } + + function assumeNotPayable(address addr) internal virtual { + vm.assume(!_isPayable(addr)); + } + + function assumeNotZeroAddress(address addr) internal pure virtual { + vm.assume(addr != address(0)); + } + + function assumeNotPrecompile(address addr) internal pure virtual { + assumeNotPrecompile(addr, _pureChainId()); + } + + function assumeNotPrecompile(address addr, uint256 chainId) internal pure virtual { + // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific + // address), but the same rationale for excluding them applies so we include those too. + + // These should be present on all EVM-compatible chains. + vm.assume(addr < address(0x1) || addr > address(0x9)); + + // forgefmt: disable-start + if (chainId == 10 || chainId == 420) { + // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21 + vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800)); + } else if (chainId == 42161 || chainId == 421613) { + // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains + vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068)); + } else if (chainId == 43114 || chainId == 43113) { + // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59 + vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff)); + vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF)); + vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff)); + } + // forgefmt: disable-end + } + + function assumeNotForgeAddress(address addr) internal pure virtual { + // vm, console, and Create2Deployer addresses + vm.assume( + addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67 + && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C + ); + } + + function readEIP1559ScriptArtifact(string memory path) + internal + view + virtual + returns (EIP1559ScriptArtifact memory) + { + string memory data = vm.readFile(path); + bytes memory parsedData = vm.parseJson(data); + RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact)); + EIP1559ScriptArtifact memory artifact; + artifact.libraries = rawArtifact.libraries; + artifact.path = rawArtifact.path; + artifact.timestamp = rawArtifact.timestamp; + artifact.pending = rawArtifact.pending; + artifact.txReturns = rawArtifact.txReturns; + artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts); + artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions); + return artifact; + } + + function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) { + Tx1559[] memory txs = new Tx1559[](rawTxs.length); + for (uint256 i; i < rawTxs.length; i++) { + txs[i] = rawToConvertedEIPTx1559(rawTxs[i]); + } + return txs; + } + + function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) { + Tx1559 memory transaction; + transaction.arguments = rawTx.arguments; + transaction.contractName = rawTx.contractName; + transaction.functionSig = rawTx.functionSig; + transaction.hash = rawTx.hash; + transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail); + transaction.opcode = rawTx.opcode; + return transaction; + } + + function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail) + internal + pure + virtual + returns (Tx1559Detail memory) + { + Tx1559Detail memory txDetail; + txDetail.data = rawDetail.data; + txDetail.from = rawDetail.from; + txDetail.to = rawDetail.to; + txDetail.nonce = _bytesToUint(rawDetail.nonce); + txDetail.txType = _bytesToUint(rawDetail.txType); + txDetail.value = _bytesToUint(rawDetail.value); + txDetail.gas = _bytesToUint(rawDetail.gas); + txDetail.accessList = rawDetail.accessList; + return txDetail; + } + + function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) { + string memory deployData = vm.readFile(path); + bytes memory parsedDeployData = vm.parseJson(deployData, ".transactions"); + RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[])); + return rawToConvertedEIPTx1559s(rawTxs); + } + + function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) { + string memory deployData = vm.readFile(path); + string memory key = string(abi.encodePacked(".transactions[", vm.toString(index), "]")); + bytes memory parsedDeployData = vm.parseJson(deployData, key); + RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559)); + return rawToConvertedEIPTx1559(rawTx); + } + + // Analogous to readTransactions, but for receipts. + function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) { + string memory deployData = vm.readFile(path); + bytes memory parsedDeployData = vm.parseJson(deployData, ".receipts"); + RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[])); + return rawToConvertedReceipts(rawReceipts); + } + + function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) { + string memory deployData = vm.readFile(path); + string memory key = string(abi.encodePacked(".receipts[", vm.toString(index), "]")); + bytes memory parsedDeployData = vm.parseJson(deployData, key); + RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt)); + return rawToConvertedReceipt(rawReceipt); + } + + function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) { + Receipt[] memory receipts = new Receipt[](rawReceipts.length); + for (uint256 i; i < rawReceipts.length; i++) { + receipts[i] = rawToConvertedReceipt(rawReceipts[i]); + } + return receipts; + } + + function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) { + Receipt memory receipt; + receipt.blockHash = rawReceipt.blockHash; + receipt.to = rawReceipt.to; + receipt.from = rawReceipt.from; + receipt.contractAddress = rawReceipt.contractAddress; + receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice); + receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed); + receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed); + receipt.status = _bytesToUint(rawReceipt.status); + receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex); + receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber); + receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs); + receipt.logsBloom = rawReceipt.logsBloom; + receipt.transactionHash = rawReceipt.transactionHash; + return receipt; + } + + function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs) + internal + pure + virtual + returns (ReceiptLog[] memory) + { + ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length); + for (uint256 i; i < rawLogs.length; i++) { + logs[i].logAddress = rawLogs[i].logAddress; + logs[i].blockHash = rawLogs[i].blockHash; + logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber); + logs[i].data = rawLogs[i].data; + logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex); + logs[i].topics = rawLogs[i].topics; + logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex); + logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex); + logs[i].removed = rawLogs[i].removed; + } + return logs; + } + + // Deploy a contract by fetching the contract bytecode from + // the artifacts directory + // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))` + function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) { + bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); + /// @solidity memory-safe-assembly + assembly { + addr := create(0, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string,bytes): Deployment failed."); + } + + function deployCode(string memory what) internal virtual returns (address addr) { + bytes memory bytecode = vm.getCode(what); + /// @solidity memory-safe-assembly + assembly { + addr := create(0, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string): Deployment failed."); + } + + /// @dev deploy contract with value on construction + function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) { + bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); + /// @solidity memory-safe-assembly + assembly { + addr := create(val, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string,bytes,uint256): Deployment failed."); + } + + function deployCode(string memory what, uint256 val) internal virtual returns (address addr) { + bytes memory bytecode = vm.getCode(what); + /// @solidity memory-safe-assembly + assembly { + addr := create(val, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string,uint256): Deployment failed."); + } + + // creates a labeled address and the corresponding private key + function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) { + privateKey = uint256(keccak256(abi.encodePacked(name))); + addr = vm.addr(privateKey); + vm.label(addr, name); + } + + // creates a labeled address + function makeAddr(string memory name) internal virtual returns (address addr) { + (addr,) = makeAddrAndKey(name); + } + + // Destroys an account immediately, sending the balance to beneficiary. + // Destroying means: balance will be zero, code will be empty, and nonce will be 0 + // This is similar to selfdestruct but not identical: selfdestruct destroys code and nonce + // only after tx ends, this will run immediately. + function destroyAccount(address who, address beneficiary) internal virtual { + uint256 currBalance = who.balance; + vm.etch(who, abi.encode()); + vm.deal(who, 0); + vm.resetNonce(who); + + uint256 beneficiaryBalance = beneficiary.balance; + vm.deal(beneficiary, currBalance + beneficiaryBalance); + } + + // creates a struct containing both a labeled address and the corresponding private key + function makeAccount(string memory name) internal virtual returns (Account memory account) { + (account.addr, account.key) = makeAddrAndKey(name); + } + + function deriveRememberKey(string memory mnemonic, uint32 index) + internal + virtual + returns (address who, uint256 privateKey) + { + privateKey = vm.deriveKey(mnemonic, index); + who = vm.rememberKey(privateKey); + } + + function _bytesToUint(bytes memory b) private pure returns (uint256) { + require(b.length <= 32, "StdCheats _bytesToUint(bytes): Bytes length exceeds 32."); + return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); + } + + function isFork() internal view virtual returns (bool status) { + try vm.activeFork() { + status = true; + } catch (bytes memory) {} + } + + modifier skipWhenForking() { + if (!isFork()) { + _; + } + } + + modifier skipWhenNotForking() { + if (isFork()) { + _; + } + } + + modifier noGasMetering() { + vm.pauseGasMetering(); + // To prevent turning gas monitoring back on with nested functions that use this modifier, + // we check if gasMetering started in the off position. If it did, we don't want to turn + // it back on until we exit the top level function that used the modifier + // + // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well. + // funcA will have `gasStartedOff` as false, funcB will have it as true, + // so we only turn metering back on at the end of the funcA + bool gasStartedOff = gasMeteringOff; + gasMeteringOff = true; + + _; + + // if gas metering was on when this modifier was called, turn it back on at the end + if (!gasStartedOff) { + gasMeteringOff = false; + vm.resumeGasMetering(); + } + } + + // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no + // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We + // can't simply access the chain ID in a normal view or pure function because the solc View Pure + // Checker changed `chainid` from pure to view in 0.8.0. + function _viewChainId() private view returns (uint256 chainId) { + // Assembly required since `block.chainid` was introduced in 0.8.0. + assembly { + chainId := chainid() + } + + address(this); // Silence warnings in older Solc versions. + } + + function _pureChainId() private pure returns (uint256 chainId) { + function() internal view returns (uint256) fnIn = _viewChainId; + function() internal pure returns (uint256) pureChainId; + assembly { + pureChainId := fnIn + } + chainId = pureChainId(); + } +} + +// Wrappers around cheatcodes to avoid footguns +abstract contract StdCheats is StdCheatsSafe { + using stdStorage for StdStorage; + + StdStorage private stdstore; + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; + + // Skip forward or rewind time by the specified number of seconds + function skip(uint256 time) internal virtual { + vm.warp(block.timestamp + time); + } + + function rewind(uint256 time) internal virtual { + vm.warp(block.timestamp - time); + } + + // Setup a prank from an address that has some ether + function hoax(address msgSender) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.prank(msgSender); + } + + function hoax(address msgSender, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.prank(msgSender); + } + + function hoax(address msgSender, address origin) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.prank(msgSender, origin); + } + + function hoax(address msgSender, address origin, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.prank(msgSender, origin); + } + + // Start perpetual prank from an address that has some ether + function startHoax(address msgSender) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.startPrank(msgSender); + } + + function startHoax(address msgSender, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.startPrank(msgSender); + } + + // Start perpetual prank from an address that has some ether + // tx.origin is set to the origin parameter + function startHoax(address msgSender, address origin) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.startPrank(msgSender, origin); + } + + function startHoax(address msgSender, address origin, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.startPrank(msgSender, origin); + } + + function changePrank(address msgSender) internal virtual { + console2_log_StdCheats("changePrank is deprecated. Please use vm.startPrank instead."); + vm.stopPrank(); + vm.startPrank(msgSender); + } + + function changePrank(address msgSender, address txOrigin) internal virtual { + vm.stopPrank(); + vm.startPrank(msgSender, txOrigin); + } + + // The same as Vm's `deal` + // Use the alternative signature for ERC20 tokens + function deal(address to, uint256 give) internal virtual { + vm.deal(to, give); + } + + // Set the balance of an account for any ERC20 token + // Use the alternative signature to update `totalSupply` + function deal(address token, address to, uint256 give) internal virtual { + deal(token, to, give, false); + } + + // Set the balance of an account for any ERC1155 token + // Use the alternative signature to update `totalSupply` + function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual { + dealERC1155(token, to, id, give, false); + } + + function deal(address token, address to, uint256 give, bool adjust) internal virtual { + // get current balance + (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to)); + uint256 prevBal = abi.decode(balData, (uint256)); + + // update balance + stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give); + + // update total supply + if (adjust) { + (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0x18160ddd)); + uint256 totSup = abi.decode(totSupData, (uint256)); + if (give < prevBal) { + totSup -= (prevBal - give); + } else { + totSup += (give - prevBal); + } + stdstore.target(token).sig(0x18160ddd).checked_write(totSup); + } + } + + function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual { + // get current balance + (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x00fdd58e, to, id)); + uint256 prevBal = abi.decode(balData, (uint256)); + + // update balance + stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give); + + // update total supply + if (adjust) { + (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0xbd85b039, id)); + require( + totSupData.length != 0, + "StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply." + ); + uint256 totSup = abi.decode(totSupData, (uint256)); + if (give < prevBal) { + totSup -= (prevBal - give); + } else { + totSup += (give - prevBal); + } + stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup); + } + } + + function dealERC721(address token, address to, uint256 id) internal virtual { + // check if token id is already minted and the actual owner. + (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id)); + require(successMinted, "StdCheats deal(address,address,uint,bool): id not minted."); + + // get owner current balance + (, bytes memory fromBalData) = + token.staticcall(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address)))); + uint256 fromPrevBal = abi.decode(fromBalData, (uint256)); + + // get new user current balance + (, bytes memory toBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to)); + uint256 toPrevBal = abi.decode(toBalData, (uint256)); + + // update balances + stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal); + stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal); + + // update owner + stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to); + } + + function deployCodeTo(string memory what, address where) internal virtual { + deployCodeTo(what, "", 0, where); + } + + function deployCodeTo(string memory what, bytes memory args, address where) internal virtual { + deployCodeTo(what, args, 0, where); + } + + function deployCodeTo(string memory what, bytes memory args, uint256 value, address where) internal virtual { + bytes memory creationCode = vm.getCode(what); + vm.etch(where, abi.encodePacked(creationCode, args)); + (bool success, bytes memory runtimeBytecode) = where.call{value: value}(""); + require(success, "StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode."); + vm.etch(where, runtimeBytecode); + } + + // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere. + function console2_log_StdCheats(string memory p0) private view { + (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string)", p0)); + status; + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdError.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdError.sol new file mode 100644 index 000000000..a302191fa --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/StdError.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +// Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test +pragma solidity >=0.6.2 <0.9.0; + +library stdError { + bytes public constant assertionError = abi.encodeWithSignature("Panic(uint256)", 0x01); + bytes public constant arithmeticError = abi.encodeWithSignature("Panic(uint256)", 0x11); + bytes public constant divisionError = abi.encodeWithSignature("Panic(uint256)", 0x12); + bytes public constant enumConversionError = abi.encodeWithSignature("Panic(uint256)", 0x21); + bytes public constant encodeStorageError = abi.encodeWithSignature("Panic(uint256)", 0x22); + bytes public constant popError = abi.encodeWithSignature("Panic(uint256)", 0x31); + bytes public constant indexOOBError = abi.encodeWithSignature("Panic(uint256)", 0x32); + bytes public constant memOverflowError = abi.encodeWithSignature("Panic(uint256)", 0x41); + bytes public constant zeroVarError = abi.encodeWithSignature("Panic(uint256)", 0x51); +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdInvariant.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdInvariant.sol new file mode 100644 index 000000000..056db98fc --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/StdInvariant.sol @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +abstract contract StdInvariant { + struct FuzzSelector { + address addr; + bytes4[] selectors; + } + + struct FuzzArtifactSelector { + string artifact; + bytes4[] selectors; + } + + struct FuzzInterface { + address addr; + string[] artifacts; + } + + address[] private _excludedContracts; + address[] private _excludedSenders; + address[] private _targetedContracts; + address[] private _targetedSenders; + + string[] private _excludedArtifacts; + string[] private _targetedArtifacts; + + FuzzArtifactSelector[] private _targetedArtifactSelectors; + + FuzzSelector[] private _excludedSelectors; + FuzzSelector[] private _targetedSelectors; + + FuzzInterface[] private _targetedInterfaces; + + // Functions for users: + // These are intended to be called in tests. + + function excludeContract(address newExcludedContract_) internal { + _excludedContracts.push(newExcludedContract_); + } + + function excludeSelector(FuzzSelector memory newExcludedSelector_) internal { + _excludedSelectors.push(newExcludedSelector_); + } + + function excludeSender(address newExcludedSender_) internal { + _excludedSenders.push(newExcludedSender_); + } + + function excludeArtifact(string memory newExcludedArtifact_) internal { + _excludedArtifacts.push(newExcludedArtifact_); + } + + function targetArtifact(string memory newTargetedArtifact_) internal { + _targetedArtifacts.push(newTargetedArtifact_); + } + + function targetArtifactSelector(FuzzArtifactSelector memory newTargetedArtifactSelector_) internal { + _targetedArtifactSelectors.push(newTargetedArtifactSelector_); + } + + function targetContract(address newTargetedContract_) internal { + _targetedContracts.push(newTargetedContract_); + } + + function targetSelector(FuzzSelector memory newTargetedSelector_) internal { + _targetedSelectors.push(newTargetedSelector_); + } + + function targetSender(address newTargetedSender_) internal { + _targetedSenders.push(newTargetedSender_); + } + + function targetInterface(FuzzInterface memory newTargetedInterface_) internal { + _targetedInterfaces.push(newTargetedInterface_); + } + + // Functions for forge: + // These are called by forge to run invariant tests and don't need to be called in tests. + + function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) { + excludedArtifacts_ = _excludedArtifacts; + } + + function excludeContracts() public view returns (address[] memory excludedContracts_) { + excludedContracts_ = _excludedContracts; + } + + function excludeSelectors() public view returns (FuzzSelector[] memory excludedSelectors_) { + excludedSelectors_ = _excludedSelectors; + } + + function excludeSenders() public view returns (address[] memory excludedSenders_) { + excludedSenders_ = _excludedSenders; + } + + function targetArtifacts() public view returns (string[] memory targetedArtifacts_) { + targetedArtifacts_ = _targetedArtifacts; + } + + function targetArtifactSelectors() public view returns (FuzzArtifactSelector[] memory targetedArtifactSelectors_) { + targetedArtifactSelectors_ = _targetedArtifactSelectors; + } + + function targetContracts() public view returns (address[] memory targetedContracts_) { + targetedContracts_ = _targetedContracts; + } + + function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) { + targetedSelectors_ = _targetedSelectors; + } + + function targetSenders() public view returns (address[] memory targetedSenders_) { + targetedSenders_ = _targetedSenders; + } + + function targetInterfaces() public view returns (FuzzInterface[] memory targetedInterfaces_) { + targetedInterfaces_ = _targetedInterfaces; + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdJson.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdJson.sol new file mode 100644 index 000000000..6dbde8354 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/StdJson.sol @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {VmSafe} from "./Vm.sol"; + +// Helpers for parsing and writing JSON files +// To parse: +// ``` +// using stdJson for string; +// string memory json = vm.readFile(""); +// json.readUint(""); +// ``` +// To write: +// ``` +// using stdJson for string; +// string memory json = "json"; +// json.serialize("a", uint256(123)); +// string memory semiFinal = json.serialize("b", string("test")); +// string memory finalJson = json.serialize("c", semiFinal); +// finalJson.write(""); +// ``` + +library stdJson { + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) { + return vm.parseJson(json, key); + } + + function readUint(string memory json, string memory key) internal pure returns (uint256) { + return vm.parseJsonUint(json, key); + } + + function readUintArray(string memory json, string memory key) internal pure returns (uint256[] memory) { + return vm.parseJsonUintArray(json, key); + } + + function readInt(string memory json, string memory key) internal pure returns (int256) { + return vm.parseJsonInt(json, key); + } + + function readIntArray(string memory json, string memory key) internal pure returns (int256[] memory) { + return vm.parseJsonIntArray(json, key); + } + + function readBytes32(string memory json, string memory key) internal pure returns (bytes32) { + return vm.parseJsonBytes32(json, key); + } + + function readBytes32Array(string memory json, string memory key) internal pure returns (bytes32[] memory) { + return vm.parseJsonBytes32Array(json, key); + } + + function readString(string memory json, string memory key) internal pure returns (string memory) { + return vm.parseJsonString(json, key); + } + + function readStringArray(string memory json, string memory key) internal pure returns (string[] memory) { + return vm.parseJsonStringArray(json, key); + } + + function readAddress(string memory json, string memory key) internal pure returns (address) { + return vm.parseJsonAddress(json, key); + } + + function readAddressArray(string memory json, string memory key) internal pure returns (address[] memory) { + return vm.parseJsonAddressArray(json, key); + } + + function readBool(string memory json, string memory key) internal pure returns (bool) { + return vm.parseJsonBool(json, key); + } + + function readBoolArray(string memory json, string memory key) internal pure returns (bool[] memory) { + return vm.parseJsonBoolArray(json, key); + } + + function readBytes(string memory json, string memory key) internal pure returns (bytes memory) { + return vm.parseJsonBytes(json, key); + } + + function readBytesArray(string memory json, string memory key) internal pure returns (bytes[] memory) { + return vm.parseJsonBytesArray(json, key); + } + + function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) { + return vm.serializeJson(jsonKey, rootObject); + } + + function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) { + return vm.serializeBool(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bool[] memory value) + internal + returns (string memory) + { + return vm.serializeBool(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) { + return vm.serializeUint(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, uint256[] memory value) + internal + returns (string memory) + { + return vm.serializeUint(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) { + return vm.serializeInt(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, int256[] memory value) + internal + returns (string memory) + { + return vm.serializeInt(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) { + return vm.serializeAddress(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, address[] memory value) + internal + returns (string memory) + { + return vm.serializeAddress(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) { + return vm.serializeBytes32(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes32[] memory value) + internal + returns (string memory) + { + return vm.serializeBytes32(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) { + return vm.serializeBytes(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes[] memory value) + internal + returns (string memory) + { + return vm.serializeBytes(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, string memory value) + internal + returns (string memory) + { + return vm.serializeString(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, string[] memory value) + internal + returns (string memory) + { + return vm.serializeString(jsonKey, key, value); + } + + function write(string memory jsonKey, string memory path) internal { + vm.writeJson(jsonKey, path); + } + + function write(string memory jsonKey, string memory path, string memory valueKey) internal { + vm.writeJson(jsonKey, path, valueKey); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdMath.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdMath.sol new file mode 100644 index 000000000..459523bda --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/StdMath.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +library stdMath { + int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968; + + function abs(int256 a) internal pure returns (uint256) { + // Required or it will fail when `a = type(int256).min` + if (a == INT256_MIN) { + return 57896044618658097711785492504343953926634992332820282019728792003956564819968; + } + + return uint256(a > 0 ? a : -a); + } + + function delta(uint256 a, uint256 b) internal pure returns (uint256) { + return a > b ? a - b : b - a; + } + + function delta(int256 a, int256 b) internal pure returns (uint256) { + // a and b are of the same sign + // this works thanks to two's complement, the left-most bit is the sign bit + if ((a ^ b) > -1) { + return delta(abs(a), abs(b)); + } + + // a and b are of opposite signs + return abs(a) + abs(b); + } + + function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 absDelta = delta(a, b); + + return absDelta * 1e18 / b; + } + + function percentDelta(int256 a, int256 b) internal pure returns (uint256) { + uint256 absDelta = delta(a, b); + uint256 absB = abs(b); + + return absDelta * 1e18 / absB; + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdStorage.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdStorage.sol new file mode 100644 index 000000000..ffd668c55 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/StdStorage.sol @@ -0,0 +1,473 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +import {Vm} from "./Vm.sol"; + +struct FindData { + uint256 slot; + uint256 offsetLeft; + uint256 offsetRight; + bool found; +} + +struct StdStorage { + mapping(address => mapping(bytes4 => mapping(bytes32 => FindData))) finds; + bytes32[] _keys; + bytes4 _sig; + uint256 _depth; + address _target; + bytes32 _set; + bool _enable_packed_slots; + bytes _calldata; +} + +library stdStorageSafe { + event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot); + event WARNING_UninitedSlot(address who, uint256 slot); + + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + uint256 constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935; + + function sigs(string memory sigStr) internal pure returns (bytes4) { + return bytes4(keccak256(bytes(sigStr))); + } + + function getCallParams(StdStorage storage self) internal view returns (bytes memory) { + if (self._calldata.length == 0) { + return flatten(self._keys); + } else { + return self._calldata; + } + } + + // Calls target contract with configured parameters + function callTarget(StdStorage storage self) internal view returns (bool, bytes32) { + bytes memory cald = abi.encodePacked(self._sig, getCallParams(self)); + (bool success, bytes memory rdat) = self._target.staticcall(cald); + bytes32 result = bytesToBytes32(rdat, 32 * self._depth); + + return (success, result); + } + + // Tries mutating slot value to determine if the targeted value is stored in it. + // If current value is 0, then we are setting slot value to type(uint256).max + // Otherwise, we set it to 0. That way, return value should always be affected. + function checkSlotMutatesCall(StdStorage storage self, bytes32 slot) internal returns (bool) { + bytes32 prevSlotValue = vm.load(self._target, slot); + (bool success, bytes32 prevReturnValue) = callTarget(self); + + bytes32 testVal = prevReturnValue == bytes32(0) ? bytes32(UINT256_MAX) : bytes32(0); + vm.store(self._target, slot, testVal); + + (, bytes32 newReturnValue) = callTarget(self); + + vm.store(self._target, slot, prevSlotValue); + + return (success && (prevReturnValue != newReturnValue)); + } + + // Tries setting one of the bits in slot to 1 until return value changes. + // Index of resulted bit is an offset packed slot has from left/right side + function findOffset(StdStorage storage self, bytes32 slot, bool left) internal returns (bool, uint256) { + for (uint256 offset = 0; offset < 256; offset++) { + uint256 valueToPut = left ? (1 << (255 - offset)) : (1 << offset); + vm.store(self._target, slot, bytes32(valueToPut)); + + (bool success, bytes32 data) = callTarget(self); + + if (success && (uint256(data) > 0)) { + return (true, offset); + } + } + return (false, 0); + } + + function findOffsets(StdStorage storage self, bytes32 slot) internal returns (bool, uint256, uint256) { + bytes32 prevSlotValue = vm.load(self._target, slot); + + (bool foundLeft, uint256 offsetLeft) = findOffset(self, slot, true); + (bool foundRight, uint256 offsetRight) = findOffset(self, slot, false); + + // `findOffset` may mutate slot value, so we are setting it to initial value + vm.store(self._target, slot, prevSlotValue); + return (foundLeft && foundRight, offsetLeft, offsetRight); + } + + function find(StdStorage storage self) internal returns (FindData storage) { + return find(self, true); + } + + /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against + // slot complexity: + // if flat, will be bytes32(uint256(uint)); + // if map, will be keccak256(abi.encode(key, uint(slot))); + // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot))))); + // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth); + function find(StdStorage storage self, bool _clear) internal returns (FindData storage) { + address who = self._target; + bytes4 fsig = self._sig; + uint256 field_depth = self._depth; + bytes memory params = getCallParams(self); + + // calldata to test against + if (self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) { + if (_clear) { + clear(self); + } + return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))]; + } + vm.record(); + (, bytes32 callResult) = callTarget(self); + (bytes32[] memory reads,) = vm.accesses(address(who)); + + if (reads.length == 0) { + revert("stdStorage find(StdStorage): No storage use detected for target."); + } else { + for (uint256 i = 0; i < reads.length; i++) { + bytes32 prev = vm.load(who, reads[i]); + if (prev == bytes32(0)) { + emit WARNING_UninitedSlot(who, uint256(reads[i])); + } + + if (!checkSlotMutatesCall(self, reads[i])) { + continue; + } + + (uint256 offsetLeft, uint256 offsetRight) = (0, 0); + + if (self._enable_packed_slots) { + bool found; + (found, offsetLeft, offsetRight) = findOffsets(self, reads[i]); + if (!found) { + continue; + } + } + + // Check that value between found offsets is equal to the current call result + uint256 curVal = (uint256(prev) & getMaskByOffsets(offsetLeft, offsetRight)) >> offsetRight; + + if (uint256(callResult) != curVal) { + continue; + } + + emit SlotFound(who, fsig, keccak256(abi.encodePacked(params, field_depth)), uint256(reads[i])); + self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))] = + FindData(uint256(reads[i]), offsetLeft, offsetRight, true); + break; + } + } + + require( + self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found, + "stdStorage find(StdStorage): Slot(s) not found." + ); + + if (_clear) { + clear(self); + } + return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))]; + } + + function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { + self._target = _target; + return self; + } + + function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { + self._sig = _sig; + return self; + } + + function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { + self._sig = sigs(_sig); + return self; + } + + function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) { + self._calldata = _calldata; + return self; + } + + function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { + self._keys.push(bytes32(uint256(uint160(who)))); + return self; + } + + function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { + self._keys.push(bytes32(amt)); + return self; + } + + function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { + self._keys.push(key); + return self; + } + + function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) { + self._enable_packed_slots = true; + return self; + } + + function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { + self._depth = _depth; + return self; + } + + function read(StdStorage storage self) private returns (bytes memory) { + FindData storage data = find(self, false); + uint256 mask = getMaskByOffsets(data.offsetLeft, data.offsetRight); + uint256 value = (uint256(vm.load(self._target, bytes32(data.slot))) & mask) >> data.offsetRight; + clear(self); + return abi.encode(value); + } + + function read_bytes32(StdStorage storage self) internal returns (bytes32) { + return abi.decode(read(self), (bytes32)); + } + + function read_bool(StdStorage storage self) internal returns (bool) { + int256 v = read_int(self); + if (v == 0) return false; + if (v == 1) return true; + revert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool."); + } + + function read_address(StdStorage storage self) internal returns (address) { + return abi.decode(read(self), (address)); + } + + function read_uint(StdStorage storage self) internal returns (uint256) { + return abi.decode(read(self), (uint256)); + } + + function read_int(StdStorage storage self) internal returns (int256) { + return abi.decode(read(self), (int256)); + } + + function parent(StdStorage storage self) internal returns (uint256, bytes32) { + address who = self._target; + uint256 field_depth = self._depth; + vm.startMappingRecording(); + uint256 child = find(self, true).slot - field_depth; + (bool found, bytes32 key, bytes32 parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child)); + if (!found) { + revert( + "stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called." + ); + } + return (uint256(parent_slot), key); + } + + function root(StdStorage storage self) internal returns (uint256) { + address who = self._target; + uint256 field_depth = self._depth; + vm.startMappingRecording(); + uint256 child = find(self, true).slot - field_depth; + bool found; + bytes32 root_slot; + bytes32 parent_slot; + (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child)); + if (!found) { + revert( + "stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called." + ); + } + while (found) { + root_slot = parent_slot; + (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(root_slot)); + } + return uint256(root_slot); + } + + function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) { + bytes32 out; + + uint256 max = b.length > 32 ? 32 : b.length; + for (uint256 i = 0; i < max; i++) { + out |= bytes32(b[offset + i] & 0xFF) >> (i * 8); + } + return out; + } + + function flatten(bytes32[] memory b) private pure returns (bytes memory) { + bytes memory result = new bytes(b.length * 32); + for (uint256 i = 0; i < b.length; i++) { + bytes32 k = b[i]; + /// @solidity memory-safe-assembly + assembly { + mstore(add(result, add(32, mul(32, i))), k) + } + } + + return result; + } + + function clear(StdStorage storage self) internal { + delete self._target; + delete self._sig; + delete self._keys; + delete self._depth; + delete self._enable_packed_slots; + delete self._calldata; + } + + // Returns mask which contains non-zero bits for values between `offsetLeft` and `offsetRight` + // (slotValue & mask) >> offsetRight will be the value of the given packed variable + function getMaskByOffsets(uint256 offsetLeft, uint256 offsetRight) internal pure returns (uint256 mask) { + // mask = ((1 << (256 - (offsetRight + offsetLeft))) - 1) << offsetRight; + // using assembly because (1 << 256) causes overflow + assembly { + mask := shl(offsetRight, sub(shl(sub(256, add(offsetRight, offsetLeft)), 1), 1)) + } + } + + // Returns slot value with updated packed variable. + function getUpdatedSlotValue(bytes32 curValue, uint256 varValue, uint256 offsetLeft, uint256 offsetRight) + internal + pure + returns (bytes32 newValue) + { + return bytes32((uint256(curValue) & ~getMaskByOffsets(offsetLeft, offsetRight)) | (varValue << offsetRight)); + } +} + +library stdStorage { + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function sigs(string memory sigStr) internal pure returns (bytes4) { + return stdStorageSafe.sigs(sigStr); + } + + function find(StdStorage storage self) internal returns (uint256) { + return find(self, true); + } + + function find(StdStorage storage self, bool _clear) internal returns (uint256) { + return stdStorageSafe.find(self, _clear).slot; + } + + function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { + return stdStorageSafe.target(self, _target); + } + + function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { + return stdStorageSafe.sig(self, _sig); + } + + function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { + return stdStorageSafe.sig(self, _sig); + } + + function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { + return stdStorageSafe.with_key(self, who); + } + + function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { + return stdStorageSafe.with_key(self, amt); + } + + function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { + return stdStorageSafe.with_key(self, key); + } + + function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) { + return stdStorageSafe.with_calldata(self, _calldata); + } + + function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) { + return stdStorageSafe.enable_packed_slots(self); + } + + function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { + return stdStorageSafe.depth(self, _depth); + } + + function clear(StdStorage storage self) internal { + stdStorageSafe.clear(self); + } + + function checked_write(StdStorage storage self, address who) internal { + checked_write(self, bytes32(uint256(uint160(who)))); + } + + function checked_write(StdStorage storage self, uint256 amt) internal { + checked_write(self, bytes32(amt)); + } + + function checked_write_int(StdStorage storage self, int256 val) internal { + checked_write(self, bytes32(uint256(val))); + } + + function checked_write(StdStorage storage self, bool write) internal { + bytes32 t; + /// @solidity memory-safe-assembly + assembly { + t := write + } + checked_write(self, t); + } + + function checked_write(StdStorage storage self, bytes32 set) internal { + address who = self._target; + bytes4 fsig = self._sig; + uint256 field_depth = self._depth; + bytes memory params = stdStorageSafe.getCallParams(self); + + if (!self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) { + find(self, false); + } + FindData storage data = self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))]; + if ((data.offsetLeft + data.offsetRight) > 0) { + uint256 maxVal = 2 ** (256 - (data.offsetLeft + data.offsetRight)); + require( + uint256(set) < maxVal, + string( + abi.encodePacked( + "stdStorage find(StdStorage): Packed slot. We can't fit value greater than ", + vm.toString(maxVal) + ) + ) + ); + } + bytes32 curVal = vm.load(who, bytes32(data.slot)); + bytes32 valToSet = stdStorageSafe.getUpdatedSlotValue(curVal, uint256(set), data.offsetLeft, data.offsetRight); + + vm.store(who, bytes32(data.slot), valToSet); + + (bool success, bytes32 callResult) = stdStorageSafe.callTarget(self); + + if (!success || callResult != set) { + vm.store(who, bytes32(data.slot), curVal); + revert("stdStorage find(StdStorage): Failed to write value."); + } + clear(self); + } + + function read_bytes32(StdStorage storage self) internal returns (bytes32) { + return stdStorageSafe.read_bytes32(self); + } + + function read_bool(StdStorage storage self) internal returns (bool) { + return stdStorageSafe.read_bool(self); + } + + function read_address(StdStorage storage self) internal returns (address) { + return stdStorageSafe.read_address(self); + } + + function read_uint(StdStorage storage self) internal returns (uint256) { + return stdStorageSafe.read_uint(self); + } + + function read_int(StdStorage storage self) internal returns (int256) { + return stdStorageSafe.read_int(self); + } + + function parent(StdStorage storage self) internal returns (uint256, bytes32) { + return stdStorageSafe.parent(self); + } + + function root(StdStorage storage self) internal returns (uint256) { + return stdStorageSafe.root(self); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdStyle.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdStyle.sol new file mode 100644 index 000000000..d371e0c60 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/StdStyle.sol @@ -0,0 +1,333 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.4.22 <0.9.0; + +import {VmSafe} from "./Vm.sol"; + +library StdStyle { + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + + string constant RED = "\u001b[91m"; + string constant GREEN = "\u001b[92m"; + string constant YELLOW = "\u001b[93m"; + string constant BLUE = "\u001b[94m"; + string constant MAGENTA = "\u001b[95m"; + string constant CYAN = "\u001b[96m"; + string constant BOLD = "\u001b[1m"; + string constant DIM = "\u001b[2m"; + string constant ITALIC = "\u001b[3m"; + string constant UNDERLINE = "\u001b[4m"; + string constant INVERSE = "\u001b[7m"; + string constant RESET = "\u001b[0m"; + + function styleConcat(string memory style, string memory self) private pure returns (string memory) { + return string(abi.encodePacked(style, self, RESET)); + } + + function red(string memory self) internal pure returns (string memory) { + return styleConcat(RED, self); + } + + function red(uint256 self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function red(int256 self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function red(address self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function red(bool self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function redBytes(bytes memory self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function redBytes32(bytes32 self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function green(string memory self) internal pure returns (string memory) { + return styleConcat(GREEN, self); + } + + function green(uint256 self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function green(int256 self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function green(address self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function green(bool self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function greenBytes(bytes memory self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function greenBytes32(bytes32 self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function yellow(string memory self) internal pure returns (string memory) { + return styleConcat(YELLOW, self); + } + + function yellow(uint256 self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellow(int256 self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellow(address self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellow(bool self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellowBytes(bytes memory self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellowBytes32(bytes32 self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function blue(string memory self) internal pure returns (string memory) { + return styleConcat(BLUE, self); + } + + function blue(uint256 self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blue(int256 self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blue(address self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blue(bool self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blueBytes(bytes memory self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blueBytes32(bytes32 self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function magenta(string memory self) internal pure returns (string memory) { + return styleConcat(MAGENTA, self); + } + + function magenta(uint256 self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magenta(int256 self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magenta(address self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magenta(bool self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magentaBytes(bytes memory self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magentaBytes32(bytes32 self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function cyan(string memory self) internal pure returns (string memory) { + return styleConcat(CYAN, self); + } + + function cyan(uint256 self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyan(int256 self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyan(address self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyan(bool self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyanBytes(bytes memory self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyanBytes32(bytes32 self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function bold(string memory self) internal pure returns (string memory) { + return styleConcat(BOLD, self); + } + + function bold(uint256 self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function bold(int256 self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function bold(address self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function bold(bool self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function boldBytes(bytes memory self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function boldBytes32(bytes32 self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function dim(string memory self) internal pure returns (string memory) { + return styleConcat(DIM, self); + } + + function dim(uint256 self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dim(int256 self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dim(address self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dim(bool self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dimBytes(bytes memory self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dimBytes32(bytes32 self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function italic(string memory self) internal pure returns (string memory) { + return styleConcat(ITALIC, self); + } + + function italic(uint256 self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italic(int256 self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italic(address self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italic(bool self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italicBytes(bytes memory self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italicBytes32(bytes32 self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function underline(string memory self) internal pure returns (string memory) { + return styleConcat(UNDERLINE, self); + } + + function underline(uint256 self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underline(int256 self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underline(address self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underline(bool self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underlineBytes(bytes memory self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underlineBytes32(bytes32 self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function inverse(string memory self) internal pure returns (string memory) { + return styleConcat(INVERSE, self); + } + + function inverse(uint256 self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverse(int256 self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverse(address self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverse(bool self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverseBytes(bytes memory self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverseBytes32(bytes32 self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdToml.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdToml.sol new file mode 100644 index 000000000..ef88db6d2 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/StdToml.sol @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {VmSafe} from "./Vm.sol"; + +// Helpers for parsing and writing TOML files +// To parse: +// ``` +// using stdToml for string; +// string memory toml = vm.readFile(""); +// toml.readUint(""); +// ``` +// To write: +// ``` +// using stdToml for string; +// string memory json = "json"; +// json.serialize("a", uint256(123)); +// string memory semiFinal = json.serialize("b", string("test")); +// string memory finalJson = json.serialize("c", semiFinal); +// finalJson.write(""); +// ``` + +library stdToml { + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function parseRaw(string memory toml, string memory key) internal pure returns (bytes memory) { + return vm.parseToml(toml, key); + } + + function readUint(string memory toml, string memory key) internal pure returns (uint256) { + return vm.parseTomlUint(toml, key); + } + + function readUintArray(string memory toml, string memory key) internal pure returns (uint256[] memory) { + return vm.parseTomlUintArray(toml, key); + } + + function readInt(string memory toml, string memory key) internal pure returns (int256) { + return vm.parseTomlInt(toml, key); + } + + function readIntArray(string memory toml, string memory key) internal pure returns (int256[] memory) { + return vm.parseTomlIntArray(toml, key); + } + + function readBytes32(string memory toml, string memory key) internal pure returns (bytes32) { + return vm.parseTomlBytes32(toml, key); + } + + function readBytes32Array(string memory toml, string memory key) internal pure returns (bytes32[] memory) { + return vm.parseTomlBytes32Array(toml, key); + } + + function readString(string memory toml, string memory key) internal pure returns (string memory) { + return vm.parseTomlString(toml, key); + } + + function readStringArray(string memory toml, string memory key) internal pure returns (string[] memory) { + return vm.parseTomlStringArray(toml, key); + } + + function readAddress(string memory toml, string memory key) internal pure returns (address) { + return vm.parseTomlAddress(toml, key); + } + + function readAddressArray(string memory toml, string memory key) internal pure returns (address[] memory) { + return vm.parseTomlAddressArray(toml, key); + } + + function readBool(string memory toml, string memory key) internal pure returns (bool) { + return vm.parseTomlBool(toml, key); + } + + function readBoolArray(string memory toml, string memory key) internal pure returns (bool[] memory) { + return vm.parseTomlBoolArray(toml, key); + } + + function readBytes(string memory toml, string memory key) internal pure returns (bytes memory) { + return vm.parseTomlBytes(toml, key); + } + + function readBytesArray(string memory toml, string memory key) internal pure returns (bytes[] memory) { + return vm.parseTomlBytesArray(toml, key); + } + + function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) { + return vm.serializeJson(jsonKey, rootObject); + } + + function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) { + return vm.serializeBool(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bool[] memory value) + internal + returns (string memory) + { + return vm.serializeBool(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) { + return vm.serializeUint(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, uint256[] memory value) + internal + returns (string memory) + { + return vm.serializeUint(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) { + return vm.serializeInt(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, int256[] memory value) + internal + returns (string memory) + { + return vm.serializeInt(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) { + return vm.serializeAddress(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, address[] memory value) + internal + returns (string memory) + { + return vm.serializeAddress(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) { + return vm.serializeBytes32(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes32[] memory value) + internal + returns (string memory) + { + return vm.serializeBytes32(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) { + return vm.serializeBytes(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes[] memory value) + internal + returns (string memory) + { + return vm.serializeBytes(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, string memory value) + internal + returns (string memory) + { + return vm.serializeString(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, string[] memory value) + internal + returns (string memory) + { + return vm.serializeString(jsonKey, key, value); + } + + function write(string memory jsonKey, string memory path) internal { + vm.writeToml(jsonKey, path); + } + + function write(string memory jsonKey, string memory path, string memory valueKey) internal { + vm.writeToml(jsonKey, path, valueKey); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdUtils.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdUtils.sol new file mode 100644 index 000000000..5d120439f --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/StdUtils.sol @@ -0,0 +1,226 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {IMulticall3} from "./interfaces/IMulticall3.sol"; +import {MockERC20} from "./mocks/MockERC20.sol"; +import {MockERC721} from "./mocks/MockERC721.sol"; +import {VmSafe} from "./Vm.sol"; + +abstract contract StdUtils { + /*////////////////////////////////////////////////////////////////////////// + CONSTANTS + //////////////////////////////////////////////////////////////////////////*/ + + IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11); + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; + uint256 private constant INT256_MIN_ABS = + 57896044618658097711785492504343953926634992332820282019728792003956564819968; + uint256 private constant SECP256K1_ORDER = + 115792089237316195423570985008687907852837564279074904382605163141518161494337; + uint256 private constant UINT256_MAX = + 115792089237316195423570985008687907853269984665640564039457584007913129639935; + + // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy. + address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; + + /*////////////////////////////////////////////////////////////////////////// + INTERNAL FUNCTIONS + //////////////////////////////////////////////////////////////////////////*/ + + function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) { + require(min <= max, "StdUtils bound(uint256,uint256,uint256): Max is less than min."); + // If x is between min and max, return x directly. This is to ensure that dictionary values + // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188 + if (x >= min && x <= max) return x; + + uint256 size = max - min + 1; + + // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side. + // This helps ensure coverage of the min/max values. + if (x <= 3 && size > x) return min + x; + if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x); + + // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive. + if (x > max) { + uint256 diff = x - max; + uint256 rem = diff % size; + if (rem == 0) return max; + result = min + rem - 1; + } else if (x < min) { + uint256 diff = min - x; + uint256 rem = diff % size; + if (rem == 0) return min; + result = max - rem + 1; + } + } + + function bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) { + result = _bound(x, min, max); + console2_log_StdUtils("Bound result", result); + } + + function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) { + require(min <= max, "StdUtils bound(int256,int256,int256): Max is less than min."); + + // Shifting all int256 values to uint256 to use _bound function. The range of two types are: + // int256 : -(2**255) ~ (2**255 - 1) + // uint256: 0 ~ (2**256 - 1) + // So, add 2**255, INT256_MIN_ABS to the integer values. + // + // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow. + // So, use `~uint256(x) + 1` instead. + uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS); + uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS); + uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS); + + uint256 y = _bound(_x, _min, _max); + + // To move it back to int256 value, subtract INT256_MIN_ABS at here. + result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS); + } + + function bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) { + result = _bound(x, min, max); + console2_log_StdUtils("Bound result", vm.toString(result)); + } + + function boundPrivateKey(uint256 privateKey) internal pure virtual returns (uint256 result) { + result = _bound(privateKey, 1, SECP256K1_ORDER - 1); + } + + function bytesToUint(bytes memory b) internal pure virtual returns (uint256) { + require(b.length <= 32, "StdUtils bytesToUint(bytes): Bytes length exceeds 32."); + return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); + } + + /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce + /// @notice adapted from Solmate implementation (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibRLP.sol) + function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) { + console2_log_StdUtils("computeCreateAddress is deprecated. Please use vm.computeCreateAddress instead."); + return vm.computeCreateAddress(deployer, nonce); + } + + function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer) + internal + pure + virtual + returns (address) + { + console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead."); + return vm.computeCreate2Address(salt, initcodeHash, deployer); + } + + /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer + function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) { + console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead."); + return vm.computeCreate2Address(salt, initCodeHash); + } + + /// @dev returns an initialized mock ERC20 contract + function deployMockERC20(string memory name, string memory symbol, uint8 decimals) + internal + returns (MockERC20 mock) + { + mock = new MockERC20(); + mock.initialize(name, symbol, decimals); + } + + /// @dev returns an initialized mock ERC721 contract + function deployMockERC721(string memory name, string memory symbol) internal returns (MockERC721 mock) { + mock = new MockERC721(); + mock.initialize(name, symbol); + } + + /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments + /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode + function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) { + return hashInitCode(creationCode, ""); + } + + /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2 + /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode + /// @param args the ABI-encoded arguments to the constructor of C + function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) { + return keccak256(abi.encodePacked(creationCode, args)); + } + + // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses. + function getTokenBalances(address token, address[] memory addresses) + internal + virtual + returns (uint256[] memory balances) + { + uint256 tokenCodeSize; + assembly { + tokenCodeSize := extcodesize(token) + } + require(tokenCodeSize > 0, "StdUtils getTokenBalances(address,address[]): Token address is not a contract."); + + // ABI encode the aggregate call to Multicall3. + uint256 length = addresses.length; + IMulticall3.Call[] memory calls = new IMulticall3.Call[](length); + for (uint256 i = 0; i < length; ++i) { + // 0x70a08231 = bytes4("balanceOf(address)")) + calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))}); + } + + // Make the aggregate call. + (, bytes[] memory returnData) = multicall.aggregate(calls); + + // ABI decode the return data and return the balances. + balances = new uint256[](length); + for (uint256 i = 0; i < length; ++i) { + balances[i] = abi.decode(returnData[i], (uint256)); + } + } + + /*////////////////////////////////////////////////////////////////////////// + PRIVATE FUNCTIONS + //////////////////////////////////////////////////////////////////////////*/ + + function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) { + return address(uint160(uint256(bytesValue))); + } + + // This section is used to prevent the compilation of console, which shortens the compilation time when console is + // not used elsewhere. We also trick the compiler into letting us make the console log methods as `pure` to avoid + // any breaking changes to function signatures. + function _castLogPayloadViewToPure(function(bytes memory) internal view fnIn) + internal + pure + returns (function(bytes memory) internal pure fnOut) + { + assembly { + fnOut := fnIn + } + } + + function _sendLogPayload(bytes memory payload) internal pure { + _castLogPayloadViewToPure(_sendLogPayloadView)(payload); + } + + function _sendLogPayloadView(bytes memory payload) private view { + uint256 payloadLength = payload.length; + address consoleAddress = CONSOLE2_ADDRESS; + /// @solidity memory-safe-assembly + assembly { + let payloadStart := add(payload, 32) + let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) + } + } + + function console2_log_StdUtils(string memory p0) private pure { + _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); + } + + function console2_log_StdUtils(string memory p0, uint256 p1) private pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); + } + + function console2_log_StdUtils(string memory p0, string memory p1) private pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/Test.sol b/examples/validating-public-input/contracts/lib/forge-std/src/Test.sol new file mode 100644 index 000000000..5ff60ea3f --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/Test.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +// 💬 ABOUT +// Forge Std's default Test. + +// 🧩 MODULES +import {console} from "./console.sol"; +import {console2} from "./console2.sol"; +import {safeconsole} from "./safeconsole.sol"; +import {StdAssertions} from "./StdAssertions.sol"; +import {StdChains} from "./StdChains.sol"; +import {StdCheats} from "./StdCheats.sol"; +import {stdError} from "./StdError.sol"; +import {StdInvariant} from "./StdInvariant.sol"; +import {stdJson} from "./StdJson.sol"; +import {stdMath} from "./StdMath.sol"; +import {StdStorage, stdStorage} from "./StdStorage.sol"; +import {StdStyle} from "./StdStyle.sol"; +import {stdToml} from "./StdToml.sol"; +import {StdUtils} from "./StdUtils.sol"; +import {Vm} from "./Vm.sol"; + +// 📦 BOILERPLATE +import {TestBase} from "./Base.sol"; + +// â­ï¸ TEST +abstract contract Test is TestBase, StdAssertions, StdChains, StdCheats, StdInvariant, StdUtils { + // Note: IS_TEST() must return true. + bool public IS_TEST = true; +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/Vm.sol b/examples/validating-public-input/contracts/lib/forge-std/src/Vm.sol new file mode 100644 index 000000000..e13a386cd --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/Vm.sol @@ -0,0 +1,1763 @@ +// Automatically @generated by scripts/vm.py. Do not modify manually. + +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.6.2 <0.9.0; +pragma experimental ABIEncoderV2; + +/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may +/// result in Script simulations differing from on-chain execution. It is recommended to only use +/// these cheats in scripts. +interface VmSafe { + /// A modification applied to either `msg.sender` or `tx.origin`. Returned by `readCallers`. + enum CallerMode { + // No caller modification is currently active. + None, + // A one time broadcast triggered by a `vm.broadcast()` call is currently active. + Broadcast, + // A recurrent broadcast triggered by a `vm.startBroadcast()` call is currently active. + RecurrentBroadcast, + // A one time prank triggered by a `vm.prank()` call is currently active. + Prank, + // A recurrent prank triggered by a `vm.startPrank()` call is currently active. + RecurrentPrank + } + + /// The kind of account access that occurred. + enum AccountAccessKind { + // The account was called. + Call, + // The account was called via delegatecall. + DelegateCall, + // The account was called via callcode. + CallCode, + // The account was called via staticcall. + StaticCall, + // The account was created. + Create, + // The account was selfdestructed. + SelfDestruct, + // Synthetic access indicating the current context has resumed after a previous sub-context (AccountAccess). + Resume, + // The account's balance was read. + Balance, + // The account's codesize was read. + Extcodesize, + // The account's codehash was read. + Extcodehash, + // The account's code was copied. + Extcodecopy + } + + /// Forge execution contexts. + enum ForgeContext { + // Test group execution context (test, coverage or snapshot). + TestGroup, + // `forge test` execution context. + Test, + // `forge coverage` execution context. + Coverage, + // `forge snapshot` execution context. + Snapshot, + // Script group execution context (dry run, broadcast or resume). + ScriptGroup, + // `forge script` execution context. + ScriptDryRun, + // `forge script --broadcast` execution context. + ScriptBroadcast, + // `forge script --resume` execution context. + ScriptResume, + // Unknown `forge` execution context. + Unknown + } + + /// An Ethereum log. Returned by `getRecordedLogs`. + struct Log { + // The topics of the log, including the signature, if any. + bytes32[] topics; + // The raw data of the log. + bytes data; + // The address of the log's emitter. + address emitter; + } + + /// An RPC URL and its alias. Returned by `rpcUrlStructs`. + struct Rpc { + // The alias of the RPC URL. + string key; + // The RPC URL. + string url; + } + + /// An RPC log object. Returned by `eth_getLogs`. + struct EthGetLogs { + // The address of the log's emitter. + address emitter; + // The topics of the log, including the signature, if any. + bytes32[] topics; + // The raw data of the log. + bytes data; + // The block hash. + bytes32 blockHash; + // The block number. + uint64 blockNumber; + // The transaction hash. + bytes32 transactionHash; + // The transaction index in the block. + uint64 transactionIndex; + // The log index. + uint256 logIndex; + // Whether the log was removed. + bool removed; + } + + /// A single entry in a directory listing. Returned by `readDir`. + struct DirEntry { + // The error message, if any. + string errorMessage; + // The path of the entry. + string path; + // The depth of the entry. + uint64 depth; + // Whether the entry is a directory. + bool isDir; + // Whether the entry is a symlink. + bool isSymlink; + } + + /// Metadata information about a file. + /// This structure is returned from the `fsMetadata` function and represents known + /// metadata about a file such as its permissions, size, modification + /// times, etc. + struct FsMetadata { + // True if this metadata is for a directory. + bool isDir; + // True if this metadata is for a symlink. + bool isSymlink; + // The size of the file, in bytes, this metadata is for. + uint256 length; + // True if this metadata is for a readonly (unwritable) file. + bool readOnly; + // The last modification time listed in this metadata. + uint256 modified; + // The last access time of this metadata. + uint256 accessed; + // The creation time listed in this metadata. + uint256 created; + } + + /// A wallet with a public and private key. + struct Wallet { + // The wallet's address. + address addr; + // The wallet's public key `X`. + uint256 publicKeyX; + // The wallet's public key `Y`. + uint256 publicKeyY; + // The wallet's private key. + uint256 privateKey; + } + + /// The result of a `tryFfi` call. + struct FfiResult { + // The exit code of the call. + int32 exitCode; + // The optionally hex-decoded `stdout` data. + bytes stdout; + // The `stderr` data. + bytes stderr; + } + + /// Information on the chain and fork. + struct ChainInfo { + // The fork identifier. Set to zero if no fork is active. + uint256 forkId; + // The chain ID of the current fork. + uint256 chainId; + } + + /// The result of a `stopAndReturnStateDiff` call. + struct AccountAccess { + // The chain and fork the access occurred. + ChainInfo chainInfo; + // The kind of account access that determines what the account is. + // If kind is Call, DelegateCall, StaticCall or CallCode, then the account is the callee. + // If kind is Create, then the account is the newly created account. + // If kind is SelfDestruct, then the account is the selfdestruct recipient. + // If kind is a Resume, then account represents a account context that has resumed. + AccountAccessKind kind; + // The account that was accessed. + // It's either the account created, callee or a selfdestruct recipient for CREATE, CALL or SELFDESTRUCT. + address account; + // What accessed the account. + address accessor; + // If the account was initialized or empty prior to the access. + // An account is considered initialized if it has code, a + // non-zero nonce, or a non-zero balance. + bool initialized; + // The previous balance of the accessed account. + uint256 oldBalance; + // The potential new balance of the accessed account. + // That is, all balance changes are recorded here, even if reverts occurred. + uint256 newBalance; + // Code of the account deployed by CREATE. + bytes deployedCode; + // Value passed along with the account access + uint256 value; + // Input data provided to the CREATE or CALL + bytes data; + // If this access reverted in either the current or parent context. + bool reverted; + // An ordered list of storage accesses made during an account access operation. + StorageAccess[] storageAccesses; + // Call depth traversed during the recording of state differences + uint64 depth; + } + + /// The storage accessed during an `AccountAccess`. + struct StorageAccess { + // The account whose storage was accessed. + address account; + // The slot that was accessed. + bytes32 slot; + // If the access was a write. + bool isWrite; + // The previous value of the slot. + bytes32 previousValue; + // The new value of the slot. + bytes32 newValue; + // If the access was reverted. + bool reverted; + } + + /// Gas used. Returned by `lastCallGas`. + struct Gas { + // The gas limit of the call. + uint64 gasLimit; + // The total gas used. + uint64 gasTotalUsed; + // DEPRECATED: The amount of gas used for memory expansion. Ref: + uint64 gasMemoryUsed; + // The amount of gas refunded. + int64 gasRefunded; + // The amount of gas remaining. + uint64 gasRemaining; + } + + // ======== Environment ======== + + /// Gets the environment variable `name` and parses it as `address`. + /// Reverts if the variable was not found or could not be parsed. + function envAddress(string calldata name) external view returns (address value); + + /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`. + /// Reverts if the variable was not found or could not be parsed. + function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value); + + /// Gets the environment variable `name` and parses it as `bool`. + /// Reverts if the variable was not found or could not be parsed. + function envBool(string calldata name) external view returns (bool value); + + /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`. + /// Reverts if the variable was not found or could not be parsed. + function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value); + + /// Gets the environment variable `name` and parses it as `bytes32`. + /// Reverts if the variable was not found or could not be parsed. + function envBytes32(string calldata name) external view returns (bytes32 value); + + /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`. + /// Reverts if the variable was not found or could not be parsed. + function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value); + + /// Gets the environment variable `name` and parses it as `bytes`. + /// Reverts if the variable was not found or could not be parsed. + function envBytes(string calldata name) external view returns (bytes memory value); + + /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`. + /// Reverts if the variable was not found or could not be parsed. + function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value); + + /// Gets the environment variable `name` and returns true if it exists, else returns false. + function envExists(string calldata name) external view returns (bool result); + + /// Gets the environment variable `name` and parses it as `int256`. + /// Reverts if the variable was not found or could not be parsed. + function envInt(string calldata name) external view returns (int256 value); + + /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`. + /// Reverts if the variable was not found or could not be parsed. + function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value); + + /// Gets the environment variable `name` and parses it as `bool`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, bool defaultValue) external view returns (bool value); + + /// Gets the environment variable `name` and parses it as `uint256`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, uint256 defaultValue) external view returns (uint256 value); + + /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata delim, address[] calldata defaultValue) + external + view + returns (address[] memory value); + + /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue) + external + view + returns (bytes32[] memory value); + + /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata delim, string[] calldata defaultValue) + external + view + returns (string[] memory value); + + /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue) + external + view + returns (bytes[] memory value); + + /// Gets the environment variable `name` and parses it as `int256`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, int256 defaultValue) external view returns (int256 value); + + /// Gets the environment variable `name` and parses it as `address`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, address defaultValue) external view returns (address value); + + /// Gets the environment variable `name` and parses it as `bytes32`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, bytes32 defaultValue) external view returns (bytes32 value); + + /// Gets the environment variable `name` and parses it as `string`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata defaultValue) external view returns (string memory value); + + /// Gets the environment variable `name` and parses it as `bytes`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, bytes calldata defaultValue) external view returns (bytes memory value); + + /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue) + external + view + returns (bool[] memory value); + + /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue) + external + view + returns (uint256[] memory value); + + /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue) + external + view + returns (int256[] memory value); + + /// Gets the environment variable `name` and parses it as `string`. + /// Reverts if the variable was not found or could not be parsed. + function envString(string calldata name) external view returns (string memory value); + + /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`. + /// Reverts if the variable was not found or could not be parsed. + function envString(string calldata name, string calldata delim) external view returns (string[] memory value); + + /// Gets the environment variable `name` and parses it as `uint256`. + /// Reverts if the variable was not found or could not be parsed. + function envUint(string calldata name) external view returns (uint256 value); + + /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`. + /// Reverts if the variable was not found or could not be parsed. + function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value); + + /// Returns true if `forge` command was executed in given context. + function isContext(ForgeContext context) external view returns (bool result); + + /// Sets environment variables. + function setEnv(string calldata name, string calldata value) external; + + // ======== EVM ======== + + /// Gets all accessed reads and write slot from a `vm.record` session, for a given address. + function accesses(address target) external returns (bytes32[] memory readSlots, bytes32[] memory writeSlots); + + /// Gets the address for a given private key. + function addr(uint256 privateKey) external pure returns (address keyAddr); + + /// Gets all the logs according to specified filter. + function eth_getLogs(uint256 fromBlock, uint256 toBlock, address target, bytes32[] calldata topics) + external + returns (EthGetLogs[] memory logs); + + /// Gets the current `block.blobbasefee`. + /// You should use this instead of `block.blobbasefee` if you use `vm.blobBaseFee`, as `block.blobbasefee` is assumed to be constant across a transaction, + /// and as a result will get optimized out by the compiler. + /// See https://github.com/foundry-rs/foundry/issues/6180 + function getBlobBaseFee() external view returns (uint256 blobBaseFee); + + /// Gets the current `block.number`. + /// You should use this instead of `block.number` if you use `vm.roll`, as `block.number` is assumed to be constant across a transaction, + /// and as a result will get optimized out by the compiler. + /// See https://github.com/foundry-rs/foundry/issues/6180 + function getBlockNumber() external view returns (uint256 height); + + /// Gets the current `block.timestamp`. + /// You should use this instead of `block.timestamp` if you use `vm.warp`, as `block.timestamp` is assumed to be constant across a transaction, + /// and as a result will get optimized out by the compiler. + /// See https://github.com/foundry-rs/foundry/issues/6180 + function getBlockTimestamp() external view returns (uint256 timestamp); + + /// Gets the map key and parent of a mapping at a given slot, for a given address. + function getMappingKeyAndParentOf(address target, bytes32 elementSlot) + external + returns (bool found, bytes32 key, bytes32 parent); + + /// Gets the number of elements in the mapping at the given slot, for a given address. + function getMappingLength(address target, bytes32 mappingSlot) external returns (uint256 length); + + /// Gets the elements at index idx of the mapping at the given slot, for a given address. The + /// index must be less than the length of the mapping (i.e. the number of keys in the mapping). + function getMappingSlotAt(address target, bytes32 mappingSlot, uint256 idx) external returns (bytes32 value); + + /// Gets the nonce of an account. + function getNonce(address account) external view returns (uint64 nonce); + + /// Gets all the recorded logs. + function getRecordedLogs() external returns (Log[] memory logs); + + /// Gets the gas used in the last call. + function lastCallGas() external view returns (Gas memory gas); + + /// Loads a storage slot from an address. + function load(address target, bytes32 slot) external view returns (bytes32 data); + + /// Pauses gas metering (i.e. gas usage is not counted). Noop if already paused. + function pauseGasMetering() external; + + /// Records all storage reads and writes. + function record() external; + + /// Record all the transaction logs. + function recordLogs() external; + + /// Resumes gas metering (i.e. gas usage is counted again). Noop if already on. + function resumeGasMetering() external; + + /// Performs an Ethereum JSON-RPC request to the current fork URL. + function rpc(string calldata method, string calldata params) external returns (bytes memory data); + + /// Signs `digest` with `privateKey` using the secp256r1 curve. + function signP256(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 s); + + /// Signs `digest` with `privateKey` using the secp256k1 curve. + function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); + + /// Signs `digest` with signer provided to script using the secp256k1 curve. + /// If `--sender` is provided, the signer with provided address is used, otherwise, + /// if exactly one signer is provided to the script, that signer is used. + /// Raises error if signer passed through `--sender` does not match any unlocked signers or + /// if `--sender` is not provided and not exactly one signer is passed to the script. + function sign(bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); + + /// Signs `digest` with signer provided to script using the secp256k1 curve. + /// Raises error if none of the signers passed into the script have provided address. + function sign(address signer, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); + + /// Starts recording all map SSTOREs for later retrieval. + function startMappingRecording() external; + + /// Record all account accesses as part of CREATE, CALL or SELFDESTRUCT opcodes in order, + /// along with the context of the calls + function startStateDiffRecording() external; + + /// Returns an ordered array of all account accesses from a `vm.startStateDiffRecording` session. + function stopAndReturnStateDiff() external returns (AccountAccess[] memory accountAccesses); + + /// Stops recording all map SSTOREs for later retrieval and clears the recorded data. + function stopMappingRecording() external; + + // ======== Filesystem ======== + + /// Closes file for reading, resetting the offset and allowing to read it from beginning with readLine. + /// `path` is relative to the project root. + function closeFile(string calldata path) external; + + /// Copies the contents of one file to another. This function will **overwrite** the contents of `to`. + /// On success, the total number of bytes copied is returned and it is equal to the length of the `to` file as reported by `metadata`. + /// Both `from` and `to` are relative to the project root. + function copyFile(string calldata from, string calldata to) external returns (uint64 copied); + + /// Creates a new, empty directory at the provided path. + /// This cheatcode will revert in the following situations, but is not limited to just these cases: + /// - User lacks permissions to modify `path`. + /// - A parent of the given path doesn't exist and `recursive` is false. + /// - `path` already exists and `recursive` is false. + /// `path` is relative to the project root. + function createDir(string calldata path, bool recursive) external; + + /// Returns true if the given path points to an existing entity, else returns false. + function exists(string calldata path) external returns (bool result); + + /// Performs a foreign function call via the terminal. + function ffi(string[] calldata commandInput) external returns (bytes memory result); + + /// Given a path, query the file system to get information about a file, directory, etc. + function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata); + + /// Gets the creation bytecode from an artifact file. Takes in the relative path to the json file or the path to the + /// artifact in the form of :: where and parts are optional. + function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode); + + /// Gets the deployed bytecode from an artifact file. Takes in the relative path to the json file or the path to the + /// artifact in the form of :: where and parts are optional. + function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode); + + /// Returns true if the path exists on disk and is pointing at a directory, else returns false. + function isDir(string calldata path) external returns (bool result); + + /// Returns true if the path exists on disk and is pointing at a regular file, else returns false. + function isFile(string calldata path) external returns (bool result); + + /// Get the path of the current project root. + function projectRoot() external view returns (string memory path); + + /// Prompts the user for a string value in the terminal. + function prompt(string calldata promptText) external returns (string memory input); + + /// Prompts the user for an address in the terminal. + function promptAddress(string calldata promptText) external returns (address); + + /// Prompts the user for a hidden string value in the terminal. + function promptSecret(string calldata promptText) external returns (string memory input); + + /// Prompts the user for hidden uint256 in the terminal (usually pk). + function promptSecretUint(string calldata promptText) external returns (uint256); + + /// Prompts the user for uint256 in the terminal. + function promptUint(string calldata promptText) external returns (uint256); + + /// Reads the directory at the given path recursively, up to `maxDepth`. + /// `maxDepth` defaults to 1, meaning only the direct children of the given directory will be returned. + /// Follows symbolic links if `followLinks` is true. + function readDir(string calldata path) external view returns (DirEntry[] memory entries); + + /// See `readDir(string)`. + function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries); + + /// See `readDir(string)`. + function readDir(string calldata path, uint64 maxDepth, bool followLinks) + external + view + returns (DirEntry[] memory entries); + + /// Reads the entire content of file to string. `path` is relative to the project root. + function readFile(string calldata path) external view returns (string memory data); + + /// Reads the entire content of file as binary. `path` is relative to the project root. + function readFileBinary(string calldata path) external view returns (bytes memory data); + + /// Reads next line of file to string. + function readLine(string calldata path) external view returns (string memory line); + + /// Reads a symbolic link, returning the path that the link points to. + /// This cheatcode will revert in the following situations, but is not limited to just these cases: + /// - `path` is not a symbolic link. + /// - `path` does not exist. + function readLink(string calldata linkPath) external view returns (string memory targetPath); + + /// Removes a directory at the provided path. + /// This cheatcode will revert in the following situations, but is not limited to just these cases: + /// - `path` doesn't exist. + /// - `path` isn't a directory. + /// - User lacks permissions to modify `path`. + /// - The directory is not empty and `recursive` is false. + /// `path` is relative to the project root. + function removeDir(string calldata path, bool recursive) external; + + /// Removes a file from the filesystem. + /// This cheatcode will revert in the following situations, but is not limited to just these cases: + /// - `path` points to a directory. + /// - The file doesn't exist. + /// - The user lacks permissions to remove the file. + /// `path` is relative to the project root. + function removeFile(string calldata path) external; + + /// Performs a foreign function call via terminal and returns the exit code, stdout, and stderr. + function tryFfi(string[] calldata commandInput) external returns (FfiResult memory result); + + /// Returns the time since unix epoch in milliseconds. + function unixTime() external returns (uint256 milliseconds); + + /// Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does. + /// `path` is relative to the project root. + function writeFile(string calldata path, string calldata data) external; + + /// Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does. + /// `path` is relative to the project root. + function writeFileBinary(string calldata path, bytes calldata data) external; + + /// Writes line to file, creating a file if it does not exist. + /// `path` is relative to the project root. + function writeLine(string calldata path, string calldata data) external; + + // ======== JSON ======== + + /// Checks if `key` exists in a JSON object + /// `keyExists` is being deprecated in favor of `keyExistsJson`. It will be removed in future versions. + function keyExists(string calldata json, string calldata key) external view returns (bool); + + /// Checks if `key` exists in a JSON object. + function keyExistsJson(string calldata json, string calldata key) external view returns (bool); + + /// Parses a string of JSON data at `key` and coerces it to `address`. + function parseJsonAddress(string calldata json, string calldata key) external pure returns (address); + + /// Parses a string of JSON data at `key` and coerces it to `address[]`. + function parseJsonAddressArray(string calldata json, string calldata key) + external + pure + returns (address[] memory); + + /// Parses a string of JSON data at `key` and coerces it to `bool`. + function parseJsonBool(string calldata json, string calldata key) external pure returns (bool); + + /// Parses a string of JSON data at `key` and coerces it to `bool[]`. + function parseJsonBoolArray(string calldata json, string calldata key) external pure returns (bool[] memory); + + /// Parses a string of JSON data at `key` and coerces it to `bytes`. + function parseJsonBytes(string calldata json, string calldata key) external pure returns (bytes memory); + + /// Parses a string of JSON data at `key` and coerces it to `bytes32`. + function parseJsonBytes32(string calldata json, string calldata key) external pure returns (bytes32); + + /// Parses a string of JSON data at `key` and coerces it to `bytes32[]`. + function parseJsonBytes32Array(string calldata json, string calldata key) + external + pure + returns (bytes32[] memory); + + /// Parses a string of JSON data at `key` and coerces it to `bytes[]`. + function parseJsonBytesArray(string calldata json, string calldata key) external pure returns (bytes[] memory); + + /// Parses a string of JSON data at `key` and coerces it to `int256`. + function parseJsonInt(string calldata json, string calldata key) external pure returns (int256); + + /// Parses a string of JSON data at `key` and coerces it to `int256[]`. + function parseJsonIntArray(string calldata json, string calldata key) external pure returns (int256[] memory); + + /// Returns an array of all the keys in a JSON object. + function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys); + + /// Parses a string of JSON data at `key` and coerces it to `string`. + function parseJsonString(string calldata json, string calldata key) external pure returns (string memory); + + /// Parses a string of JSON data at `key` and coerces it to `string[]`. + function parseJsonStringArray(string calldata json, string calldata key) external pure returns (string[] memory); + + /// Parses a string of JSON data at `key` and coerces it to `uint256`. + function parseJsonUint(string calldata json, string calldata key) external pure returns (uint256); + + /// Parses a string of JSON data at `key` and coerces it to `uint256[]`. + function parseJsonUintArray(string calldata json, string calldata key) external pure returns (uint256[] memory); + + /// ABI-encodes a JSON object. + function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData); + + /// ABI-encodes a JSON object at `key`. + function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData); + + /// See `serializeJson`. + function serializeAddress(string calldata objectKey, string calldata valueKey, address value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeBool(string calldata objectKey, string calldata valueKey, bool value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeInt(string calldata objectKey, string calldata valueKey, int256 value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values) + external + returns (string memory json); + + /// Serializes a key and value to a JSON object stored in-memory that can be later written to a file. + /// Returns the stringified version of the specific JSON file up to that moment. + function serializeJson(string calldata objectKey, string calldata value) external returns (string memory json); + + /// See `serializeJson`. + function serializeString(string calldata objectKey, string calldata valueKey, string calldata value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeUintToHex(string calldata objectKey, string calldata valueKey, uint256 value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values) + external + returns (string memory json); + + /// Write a serialized JSON object to a file. If the file exists, it will be overwritten. + function writeJson(string calldata json, string calldata path) external; + + /// Write a serialized JSON object to an **existing** JSON file, replacing a value with key = + /// This is useful to replace a specific value of a JSON file, without having to parse the entire thing. + function writeJson(string calldata json, string calldata path, string calldata valueKey) external; + + // ======== Scripting ======== + + /// Has the next call (at this call depth only) create transactions that can later be signed and sent onchain. + /// Broadcasting address is determined by checking the following in order: + /// 1. If `--sender` argument was provided, that address is used. + /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used. + /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used. + function broadcast() external; + + /// Has the next call (at this call depth only) create a transaction with the address provided + /// as the sender that can later be signed and sent onchain. + function broadcast(address signer) external; + + /// Has the next call (at this call depth only) create a transaction with the private key + /// provided as the sender that can later be signed and sent onchain. + function broadcast(uint256 privateKey) external; + + /// Has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain. + /// Broadcasting address is determined by checking the following in order: + /// 1. If `--sender` argument was provided, that address is used. + /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used. + /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used. + function startBroadcast() external; + + /// Has all subsequent calls (at this call depth only) create transactions with the address + /// provided that can later be signed and sent onchain. + function startBroadcast(address signer) external; + + /// Has all subsequent calls (at this call depth only) create transactions with the private key + /// provided that can later be signed and sent onchain. + function startBroadcast(uint256 privateKey) external; + + /// Stops collecting onchain transactions. + function stopBroadcast() external; + + // ======== String ======== + + /// Returns the index of the first occurrence of a `key` in an `input` string. + /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `key` is not found. + /// Returns 0 in case of an empty `key`. + function indexOf(string calldata input, string calldata key) external pure returns (uint256); + + /// Parses the given `string` into an `address`. + function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue); + + /// Parses the given `string` into a `bool`. + function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue); + + /// Parses the given `string` into `bytes`. + function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue); + + /// Parses the given `string` into a `bytes32`. + function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue); + + /// Parses the given `string` into a `int256`. + function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue); + + /// Parses the given `string` into a `uint256`. + function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue); + + /// Replaces occurrences of `from` in the given `string` with `to`. + function replace(string calldata input, string calldata from, string calldata to) + external + pure + returns (string memory output); + + /// Splits the given `string` into an array of strings divided by the `delimiter`. + function split(string calldata input, string calldata delimiter) external pure returns (string[] memory outputs); + + /// Converts the given `string` value to Lowercase. + function toLowercase(string calldata input) external pure returns (string memory output); + + /// Converts the given value to a `string`. + function toString(address value) external pure returns (string memory stringifiedValue); + + /// Converts the given value to a `string`. + function toString(bytes calldata value) external pure returns (string memory stringifiedValue); + + /// Converts the given value to a `string`. + function toString(bytes32 value) external pure returns (string memory stringifiedValue); + + /// Converts the given value to a `string`. + function toString(bool value) external pure returns (string memory stringifiedValue); + + /// Converts the given value to a `string`. + function toString(uint256 value) external pure returns (string memory stringifiedValue); + + /// Converts the given value to a `string`. + function toString(int256 value) external pure returns (string memory stringifiedValue); + + /// Converts the given `string` value to Uppercase. + function toUppercase(string calldata input) external pure returns (string memory output); + + /// Trims leading and trailing whitespace from the given `string` value. + function trim(string calldata input) external pure returns (string memory output); + + // ======== Testing ======== + + /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. + /// Formats values with decimals in failure message. + function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) external pure; + + /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertApproxEqAbsDecimal( + uint256 left, + uint256 right, + uint256 maxDelta, + uint256 decimals, + string calldata error + ) external pure; + + /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. + /// Formats values with decimals in failure message. + function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) external pure; + + /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertApproxEqAbsDecimal( + int256 left, + int256 right, + uint256 maxDelta, + uint256 decimals, + string calldata error + ) external pure; + + /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. + function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) external pure; + + /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. + /// Includes error message into revert string on failure. + function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure; + + /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. + function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) external pure; + + /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. + /// Includes error message into revert string on failure. + function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure; + + /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + /// Formats values with decimals in failure message. + function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals) + external + pure; + + /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertApproxEqRelDecimal( + uint256 left, + uint256 right, + uint256 maxPercentDelta, + uint256 decimals, + string calldata error + ) external pure; + + /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + /// Formats values with decimals in failure message. + function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals) + external + pure; + + /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertApproxEqRelDecimal( + int256 left, + int256 right, + uint256 maxPercentDelta, + uint256 decimals, + string calldata error + ) external pure; + + /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta) external pure; + + /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + /// Includes error message into revert string on failure. + function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error) + external + pure; + + /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) external pure; + + /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + /// Includes error message into revert string on failure. + function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error) + external + pure; + + /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message. + function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure; + + /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message. + /// Includes error message into revert string on failure. + function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + + /// Asserts that two `int256` values are equal, formatting them with decimals in failure message. + function assertEqDecimal(int256 left, int256 right, uint256 decimals) external pure; + + /// Asserts that two `int256` values are equal, formatting them with decimals in failure message. + /// Includes error message into revert string on failure. + function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + + /// Asserts that two `bool` values are equal. + function assertEq(bool left, bool right) external pure; + + /// Asserts that two `bool` values are equal and includes error message into revert string on failure. + function assertEq(bool left, bool right, string calldata error) external pure; + + /// Asserts that two `string` values are equal. + function assertEq(string calldata left, string calldata right) external pure; + + /// Asserts that two `string` values are equal and includes error message into revert string on failure. + function assertEq(string calldata left, string calldata right, string calldata error) external pure; + + /// Asserts that two `bytes` values are equal. + function assertEq(bytes calldata left, bytes calldata right) external pure; + + /// Asserts that two `bytes` values are equal and includes error message into revert string on failure. + function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `bool` values are equal. + function assertEq(bool[] calldata left, bool[] calldata right) external pure; + + /// Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure. + function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `uint256 values are equal. + function assertEq(uint256[] calldata left, uint256[] calldata right) external pure; + + /// Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure. + function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `int256` values are equal. + function assertEq(int256[] calldata left, int256[] calldata right) external pure; + + /// Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure. + function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure; + + /// Asserts that two `uint256` values are equal. + function assertEq(uint256 left, uint256 right) external pure; + + /// Asserts that two arrays of `address` values are equal. + function assertEq(address[] calldata left, address[] calldata right) external pure; + + /// Asserts that two arrays of `address` values are equal and includes error message into revert string on failure. + function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `bytes32` values are equal. + function assertEq(bytes32[] calldata left, bytes32[] calldata right) external pure; + + /// Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure. + function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `string` values are equal. + function assertEq(string[] calldata left, string[] calldata right) external pure; + + /// Asserts that two arrays of `string` values are equal and includes error message into revert string on failure. + function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `bytes` values are equal. + function assertEq(bytes[] calldata left, bytes[] calldata right) external pure; + + /// Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure. + function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure; + + /// Asserts that two `uint256` values are equal and includes error message into revert string on failure. + function assertEq(uint256 left, uint256 right, string calldata error) external pure; + + /// Asserts that two `int256` values are equal. + function assertEq(int256 left, int256 right) external pure; + + /// Asserts that two `int256` values are equal and includes error message into revert string on failure. + function assertEq(int256 left, int256 right, string calldata error) external pure; + + /// Asserts that two `address` values are equal. + function assertEq(address left, address right) external pure; + + /// Asserts that two `address` values are equal and includes error message into revert string on failure. + function assertEq(address left, address right, string calldata error) external pure; + + /// Asserts that two `bytes32` values are equal. + function assertEq(bytes32 left, bytes32 right) external pure; + + /// Asserts that two `bytes32` values are equal and includes error message into revert string on failure. + function assertEq(bytes32 left, bytes32 right, string calldata error) external pure; + + /// Asserts that the given condition is false. + function assertFalse(bool condition) external pure; + + /// Asserts that the given condition is false and includes error message into revert string on failure. + function assertFalse(bool condition, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than or equal to second. + /// Formats values with decimals in failure message. + function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than or equal to second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be greater than or equal to second. + /// Formats values with decimals in failure message. + function assertGeDecimal(int256 left, int256 right, uint256 decimals) external pure; + + /// Compares two `int256` values. Expects first value to be greater than or equal to second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than or equal to second. + function assertGe(uint256 left, uint256 right) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than or equal to second. + /// Includes error message into revert string on failure. + function assertGe(uint256 left, uint256 right, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be greater than or equal to second. + function assertGe(int256 left, int256 right) external pure; + + /// Compares two `int256` values. Expects first value to be greater than or equal to second. + /// Includes error message into revert string on failure. + function assertGe(int256 left, int256 right, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than second. + /// Formats values with decimals in failure message. + function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be greater than second. + /// Formats values with decimals in failure message. + function assertGtDecimal(int256 left, int256 right, uint256 decimals) external pure; + + /// Compares two `int256` values. Expects first value to be greater than second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than second. + function assertGt(uint256 left, uint256 right) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than second. + /// Includes error message into revert string on failure. + function assertGt(uint256 left, uint256 right, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be greater than second. + function assertGt(int256 left, int256 right) external pure; + + /// Compares two `int256` values. Expects first value to be greater than second. + /// Includes error message into revert string on failure. + function assertGt(int256 left, int256 right, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be less than or equal to second. + /// Formats values with decimals in failure message. + function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) external pure; + + /// Compares two `uint256` values. Expects first value to be less than or equal to second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be less than or equal to second. + /// Formats values with decimals in failure message. + function assertLeDecimal(int256 left, int256 right, uint256 decimals) external pure; + + /// Compares two `int256` values. Expects first value to be less than or equal to second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be less than or equal to second. + function assertLe(uint256 left, uint256 right) external pure; + + /// Compares two `uint256` values. Expects first value to be less than or equal to second. + /// Includes error message into revert string on failure. + function assertLe(uint256 left, uint256 right, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be less than or equal to second. + function assertLe(int256 left, int256 right) external pure; + + /// Compares two `int256` values. Expects first value to be less than or equal to second. + /// Includes error message into revert string on failure. + function assertLe(int256 left, int256 right, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be less than second. + /// Formats values with decimals in failure message. + function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) external pure; + + /// Compares two `uint256` values. Expects first value to be less than second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be less than second. + /// Formats values with decimals in failure message. + function assertLtDecimal(int256 left, int256 right, uint256 decimals) external pure; + + /// Compares two `int256` values. Expects first value to be less than second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be less than second. + function assertLt(uint256 left, uint256 right) external pure; + + /// Compares two `uint256` values. Expects first value to be less than second. + /// Includes error message into revert string on failure. + function assertLt(uint256 left, uint256 right, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be less than second. + function assertLt(int256 left, int256 right) external pure; + + /// Compares two `int256` values. Expects first value to be less than second. + /// Includes error message into revert string on failure. + function assertLt(int256 left, int256 right, string calldata error) external pure; + + /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message. + function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure; + + /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message. + /// Includes error message into revert string on failure. + function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + + /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message. + function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) external pure; + + /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message. + /// Includes error message into revert string on failure. + function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + + /// Asserts that two `bool` values are not equal. + function assertNotEq(bool left, bool right) external pure; + + /// Asserts that two `bool` values are not equal and includes error message into revert string on failure. + function assertNotEq(bool left, bool right, string calldata error) external pure; + + /// Asserts that two `string` values are not equal. + function assertNotEq(string calldata left, string calldata right) external pure; + + /// Asserts that two `string` values are not equal and includes error message into revert string on failure. + function assertNotEq(string calldata left, string calldata right, string calldata error) external pure; + + /// Asserts that two `bytes` values are not equal. + function assertNotEq(bytes calldata left, bytes calldata right) external pure; + + /// Asserts that two `bytes` values are not equal and includes error message into revert string on failure. + function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `bool` values are not equal. + function assertNotEq(bool[] calldata left, bool[] calldata right) external pure; + + /// Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure. + function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `uint256` values are not equal. + function assertNotEq(uint256[] calldata left, uint256[] calldata right) external pure; + + /// Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure. + function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `int256` values are not equal. + function assertNotEq(int256[] calldata left, int256[] calldata right) external pure; + + /// Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure. + function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure; + + /// Asserts that two `uint256` values are not equal. + function assertNotEq(uint256 left, uint256 right) external pure; + + /// Asserts that two arrays of `address` values are not equal. + function assertNotEq(address[] calldata left, address[] calldata right) external pure; + + /// Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure. + function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `bytes32` values are not equal. + function assertNotEq(bytes32[] calldata left, bytes32[] calldata right) external pure; + + /// Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure. + function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `string` values are not equal. + function assertNotEq(string[] calldata left, string[] calldata right) external pure; + + /// Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure. + function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `bytes` values are not equal. + function assertNotEq(bytes[] calldata left, bytes[] calldata right) external pure; + + /// Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure. + function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure; + + /// Asserts that two `uint256` values are not equal and includes error message into revert string on failure. + function assertNotEq(uint256 left, uint256 right, string calldata error) external pure; + + /// Asserts that two `int256` values are not equal. + function assertNotEq(int256 left, int256 right) external pure; + + /// Asserts that two `int256` values are not equal and includes error message into revert string on failure. + function assertNotEq(int256 left, int256 right, string calldata error) external pure; + + /// Asserts that two `address` values are not equal. + function assertNotEq(address left, address right) external pure; + + /// Asserts that two `address` values are not equal and includes error message into revert string on failure. + function assertNotEq(address left, address right, string calldata error) external pure; + + /// Asserts that two `bytes32` values are not equal. + function assertNotEq(bytes32 left, bytes32 right) external pure; + + /// Asserts that two `bytes32` values are not equal and includes error message into revert string on failure. + function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure; + + /// Asserts that the given condition is true. + function assertTrue(bool condition) external pure; + + /// Asserts that the given condition is true and includes error message into revert string on failure. + function assertTrue(bool condition, string calldata error) external pure; + + /// If the condition is false, discard this run's fuzz inputs and generate new ones. + function assume(bool condition) external pure; + + /// Writes a breakpoint to jump to in the debugger. + function breakpoint(string calldata char) external; + + /// Writes a conditional breakpoint to jump to in the debugger. + function breakpoint(string calldata char, bool value) external; + + /// Returns the RPC url for the given alias. + function rpcUrl(string calldata rpcAlias) external view returns (string memory json); + + /// Returns all rpc urls and their aliases as structs. + function rpcUrlStructs() external view returns (Rpc[] memory urls); + + /// Returns all rpc urls and their aliases `[alias, url][]`. + function rpcUrls() external view returns (string[2][] memory urls); + + /// Suspends execution of the main thread for `duration` milliseconds. + function sleep(uint256 duration) external; + + // ======== Toml ======== + + /// Checks if `key` exists in a TOML table. + function keyExistsToml(string calldata toml, string calldata key) external view returns (bool); + + /// Parses a string of TOML data at `key` and coerces it to `address`. + function parseTomlAddress(string calldata toml, string calldata key) external pure returns (address); + + /// Parses a string of TOML data at `key` and coerces it to `address[]`. + function parseTomlAddressArray(string calldata toml, string calldata key) + external + pure + returns (address[] memory); + + /// Parses a string of TOML data at `key` and coerces it to `bool`. + function parseTomlBool(string calldata toml, string calldata key) external pure returns (bool); + + /// Parses a string of TOML data at `key` and coerces it to `bool[]`. + function parseTomlBoolArray(string calldata toml, string calldata key) external pure returns (bool[] memory); + + /// Parses a string of TOML data at `key` and coerces it to `bytes`. + function parseTomlBytes(string calldata toml, string calldata key) external pure returns (bytes memory); + + /// Parses a string of TOML data at `key` and coerces it to `bytes32`. + function parseTomlBytes32(string calldata toml, string calldata key) external pure returns (bytes32); + + /// Parses a string of TOML data at `key` and coerces it to `bytes32[]`. + function parseTomlBytes32Array(string calldata toml, string calldata key) + external + pure + returns (bytes32[] memory); + + /// Parses a string of TOML data at `key` and coerces it to `bytes[]`. + function parseTomlBytesArray(string calldata toml, string calldata key) external pure returns (bytes[] memory); + + /// Parses a string of TOML data at `key` and coerces it to `int256`. + function parseTomlInt(string calldata toml, string calldata key) external pure returns (int256); + + /// Parses a string of TOML data at `key` and coerces it to `int256[]`. + function parseTomlIntArray(string calldata toml, string calldata key) external pure returns (int256[] memory); + + /// Returns an array of all the keys in a TOML table. + function parseTomlKeys(string calldata toml, string calldata key) external pure returns (string[] memory keys); + + /// Parses a string of TOML data at `key` and coerces it to `string`. + function parseTomlString(string calldata toml, string calldata key) external pure returns (string memory); + + /// Parses a string of TOML data at `key` and coerces it to `string[]`. + function parseTomlStringArray(string calldata toml, string calldata key) external pure returns (string[] memory); + + /// Parses a string of TOML data at `key` and coerces it to `uint256`. + function parseTomlUint(string calldata toml, string calldata key) external pure returns (uint256); + + /// Parses a string of TOML data at `key` and coerces it to `uint256[]`. + function parseTomlUintArray(string calldata toml, string calldata key) external pure returns (uint256[] memory); + + /// ABI-encodes a TOML table. + function parseToml(string calldata toml) external pure returns (bytes memory abiEncodedData); + + /// ABI-encodes a TOML table at `key`. + function parseToml(string calldata toml, string calldata key) external pure returns (bytes memory abiEncodedData); + + /// Takes serialized JSON, converts to TOML and write a serialized TOML to a file. + function writeToml(string calldata json, string calldata path) external; + + /// Takes serialized JSON, converts to TOML and write a serialized TOML table to an **existing** TOML file, replacing a value with key = + /// This is useful to replace a specific value of a TOML file, without having to parse the entire thing. + function writeToml(string calldata json, string calldata path, string calldata valueKey) external; + + // ======== Utilities ======== + + /// Compute the address of a contract created with CREATE2 using the given CREATE2 deployer. + function computeCreate2Address(bytes32 salt, bytes32 initCodeHash, address deployer) + external + pure + returns (address); + + /// Compute the address of a contract created with CREATE2 using the default CREATE2 deployer. + function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) external pure returns (address); + + /// Compute the address a contract will be deployed at for a given deployer address and nonce. + function computeCreateAddress(address deployer, uint256 nonce) external pure returns (address); + + /// Derives a private key from the name, labels the account with that name, and returns the wallet. + function createWallet(string calldata walletLabel) external returns (Wallet memory wallet); + + /// Generates a wallet from the private key and returns the wallet. + function createWallet(uint256 privateKey) external returns (Wallet memory wallet); + + /// Generates a wallet from the private key, labels the account with that name, and returns the wallet. + function createWallet(uint256 privateKey, string calldata walletLabel) external returns (Wallet memory wallet); + + /// Derive a private key from a provided mnenomic string (or mnenomic file path) + /// at the derivation path `m/44'/60'/0'/0/{index}`. + function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey); + + /// Derive a private key from a provided mnenomic string (or mnenomic file path) + /// at `{derivationPath}{index}`. + function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index) + external + pure + returns (uint256 privateKey); + + /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language + /// at the derivation path `m/44'/60'/0'/0/{index}`. + function deriveKey(string calldata mnemonic, uint32 index, string calldata language) + external + pure + returns (uint256 privateKey); + + /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language + /// at `{derivationPath}{index}`. + function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index, string calldata language) + external + pure + returns (uint256 privateKey); + + /// Returns ENS namehash for provided string. + function ensNamehash(string calldata name) external pure returns (bytes32); + + /// Gets the label for the specified address. + function getLabel(address account) external view returns (string memory currentLabel); + + /// Get a `Wallet`'s nonce. + function getNonce(Wallet calldata wallet) external returns (uint64 nonce); + + /// Labels an address in call traces. + function label(address account, string calldata newLabel) external; + + /// Returns a random `address`. + function randomAddress() external returns (address); + + /// Returns a random uint256 value. + function randomUint() external returns (uint256); + + /// Returns random uin256 value between the provided range (=min..=max). + function randomUint(uint256 min, uint256 max) external returns (uint256); + + /// Adds a private key to the local forge wallet and returns the address. + function rememberKey(uint256 privateKey) external returns (address keyAddr); + + /// Signs data with a `Wallet`. + function sign(Wallet calldata wallet, bytes32 digest) external returns (uint8 v, bytes32 r, bytes32 s); + + /// Encodes a `bytes` value to a base64url string. + function toBase64URL(bytes calldata data) external pure returns (string memory); + + /// Encodes a `string` value to a base64url string. + function toBase64URL(string calldata data) external pure returns (string memory); + + /// Encodes a `bytes` value to a base64 string. + function toBase64(bytes calldata data) external pure returns (string memory); + + /// Encodes a `string` value to a base64 string. + function toBase64(string calldata data) external pure returns (string memory); +} + +/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used +/// in tests, but it is not recommended to use these cheats in scripts. +interface Vm is VmSafe { + // ======== EVM ======== + + /// Returns the identifier of the currently active fork. Reverts if no fork is currently active. + function activeFork() external view returns (uint256 forkId); + + /// In forking mode, explicitly grant the given address cheatcode access. + function allowCheatcodes(address account) external; + + /// Sets `block.blobbasefee` + function blobBaseFee(uint256 newBlobBaseFee) external; + + /// Sets the blobhashes in the transaction. + /// Not available on EVM versions before Cancun. + /// If used on unsupported EVM versions it will revert. + function blobhashes(bytes32[] calldata hashes) external; + + /// Sets `block.chainid`. + function chainId(uint256 newChainId) external; + + /// Clears all mocked calls. + function clearMockedCalls() external; + + /// Sets `block.coinbase`. + function coinbase(address newCoinbase) external; + + /// Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork. + function createFork(string calldata urlOrAlias) external returns (uint256 forkId); + + /// Creates a new fork with the given endpoint and block and returns the identifier of the fork. + function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); + + /// Creates a new fork with the given endpoint and at the block the given transaction was mined in, + /// replays all transaction mined in the block before the transaction, and returns the identifier of the fork. + function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); + + /// Creates and also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork. + function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId); + + /// Creates and also selects a new fork with the given endpoint and block and returns the identifier of the fork. + function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); + + /// Creates and also selects new fork with the given endpoint and at the block the given transaction was mined in, + /// replays all transaction mined in the block before the transaction, returns the identifier of the fork. + function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); + + /// Sets an address' balance. + function deal(address account, uint256 newBalance) external; + + /// Removes the snapshot with the given ID created by `snapshot`. + /// Takes the snapshot ID to delete. + /// Returns `true` if the snapshot was successfully deleted. + /// Returns `false` if the snapshot does not exist. + function deleteSnapshot(uint256 snapshotId) external returns (bool success); + + /// Removes _all_ snapshots previously created by `snapshot`. + function deleteSnapshots() external; + + /// Sets `block.difficulty`. + /// Not available on EVM versions from Paris onwards. Use `prevrandao` instead. + /// Reverts if used on unsupported EVM versions. + function difficulty(uint256 newDifficulty) external; + + /// Dump a genesis JSON file's `allocs` to disk. + function dumpState(string calldata pathToStateJson) external; + + /// Sets an address' code. + function etch(address target, bytes calldata newRuntimeBytecode) external; + + /// Sets `block.basefee`. + function fee(uint256 newBasefee) external; + + /// Gets the blockhashes from the current transaction. + /// Not available on EVM versions before Cancun. + /// If used on unsupported EVM versions it will revert. + function getBlobhashes() external view returns (bytes32[] memory hashes); + + /// Returns true if the account is marked as persistent. + function isPersistent(address account) external view returns (bool persistent); + + /// Load a genesis JSON file's `allocs` into the in-memory revm state. + function loadAllocs(string calldata pathToAllocsJson) external; + + /// Marks that the account(s) should use persistent storage across fork swaps in a multifork setup + /// Meaning, changes made to the state of this account will be kept when switching forks. + function makePersistent(address account) external; + + /// See `makePersistent(address)`. + function makePersistent(address account0, address account1) external; + + /// See `makePersistent(address)`. + function makePersistent(address account0, address account1, address account2) external; + + /// See `makePersistent(address)`. + function makePersistent(address[] calldata accounts) external; + + /// Reverts a call to an address with specified revert data. + function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external; + + /// Reverts a call to an address with a specific `msg.value`, with specified revert data. + function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData) + external; + + /// Mocks a call to an address, returning specified data. + /// Calldata can either be strict or a partial match, e.g. if you only + /// pass a Solidity selector to the expected calldata, then the entire Solidity + /// function will be mocked. + function mockCall(address callee, bytes calldata data, bytes calldata returnData) external; + + /// Mocks a call to an address with a specific `msg.value`, returning specified data. + /// Calldata match takes precedence over `msg.value` in case of ambiguity. + function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external; + + /// Sets the *next* call's `msg.sender` to be the input address. + function prank(address msgSender) external; + + /// Sets the *next* call's `msg.sender` to be the input address, and the `tx.origin` to be the second input. + function prank(address msgSender, address txOrigin) external; + + /// Sets `block.prevrandao`. + /// Not available on EVM versions before Paris. Use `difficulty` instead. + /// If used on unsupported EVM versions it will revert. + function prevrandao(bytes32 newPrevrandao) external; + + /// Sets `block.prevrandao`. + /// Not available on EVM versions before Paris. Use `difficulty` instead. + /// If used on unsupported EVM versions it will revert. + function prevrandao(uint256 newPrevrandao) external; + + /// Reads the current `msg.sender` and `tx.origin` from state and reports if there is any active caller modification. + function readCallers() external returns (CallerMode callerMode, address msgSender, address txOrigin); + + /// Resets the nonce of an account to 0 for EOAs and 1 for contract accounts. + function resetNonce(address account) external; + + /// Revert the state of the EVM to a previous snapshot + /// Takes the snapshot ID to revert to. + /// Returns `true` if the snapshot was successfully reverted. + /// Returns `false` if the snapshot does not exist. + /// **Note:** This does not automatically delete the snapshot. To delete the snapshot use `deleteSnapshot`. + function revertTo(uint256 snapshotId) external returns (bool success); + + /// Revert the state of the EVM to a previous snapshot and automatically deletes the snapshots + /// Takes the snapshot ID to revert to. + /// Returns `true` if the snapshot was successfully reverted and deleted. + /// Returns `false` if the snapshot does not exist. + function revertToAndDelete(uint256 snapshotId) external returns (bool success); + + /// Revokes persistent status from the address, previously added via `makePersistent`. + function revokePersistent(address account) external; + + /// See `revokePersistent(address)`. + function revokePersistent(address[] calldata accounts) external; + + /// Sets `block.height`. + function roll(uint256 newHeight) external; + + /// Updates the currently active fork to given block number + /// This is similar to `roll` but for the currently active fork. + function rollFork(uint256 blockNumber) external; + + /// Updates the currently active fork to given transaction. This will `rollFork` with the number + /// of the block the transaction was mined in and replays all transaction mined before it in the block. + function rollFork(bytes32 txHash) external; + + /// Updates the given fork to given block number. + function rollFork(uint256 forkId, uint256 blockNumber) external; + + /// Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block. + function rollFork(uint256 forkId, bytes32 txHash) external; + + /// Takes a fork identifier created by `createFork` and sets the corresponding forked state as active. + function selectFork(uint256 forkId) external; + + /// Sets the nonce of an account. Must be higher than the current nonce of the account. + function setNonce(address account, uint64 newNonce) external; + + /// Sets the nonce of an account to an arbitrary value. + function setNonceUnsafe(address account, uint64 newNonce) external; + + /// Snapshot the current state of the evm. + /// Returns the ID of the snapshot that was created. + /// To revert a snapshot use `revertTo`. + function snapshot() external returns (uint256 snapshotId); + + /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called. + function startPrank(address msgSender) external; + + /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input. + function startPrank(address msgSender, address txOrigin) external; + + /// Resets subsequent calls' `msg.sender` to be `address(this)`. + function stopPrank() external; + + /// Stores a value to an address' storage slot. + function store(address target, bytes32 slot, bytes32 value) external; + + /// Fetches the given transaction from the active fork and executes it on the current state. + function transact(bytes32 txHash) external; + + /// Fetches the given transaction from the given fork and executes it on the current state. + function transact(uint256 forkId, bytes32 txHash) external; + + /// Sets `tx.gasprice`. + function txGasPrice(uint256 newGasPrice) external; + + /// Sets `block.timestamp`. + function warp(uint256 newTimestamp) external; + + // ======== Testing ======== + + /// Expect a call to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas. + function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external; + + /// Expect given number of calls to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas. + function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count) + external; + + /// Expects a call to an address with the specified calldata. + /// Calldata can either be a strict or a partial match. + function expectCall(address callee, bytes calldata data) external; + + /// Expects given number of calls to an address with the specified calldata. + function expectCall(address callee, bytes calldata data, uint64 count) external; + + /// Expects a call to an address with the specified `msg.value` and calldata. + function expectCall(address callee, uint256 msgValue, bytes calldata data) external; + + /// Expects given number of calls to an address with the specified `msg.value` and calldata. + function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external; + + /// Expect a call to an address with the specified `msg.value`, gas, and calldata. + function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external; + + /// Expects given number of calls to an address with the specified `msg.value`, gas, and calldata. + function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external; + + /// Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.). + /// Call this function, then emit an event, then call a function. Internally after the call, we check if + /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans). + function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external; + + /// Same as the previous method, but also checks supplied address against emitting contract. + function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter) + external; + + /// Prepare an expected log with all topic and data checks enabled. + /// Call this function, then emit an event, then call a function. Internally after the call, we check if + /// logs were emitted in the expected order with the expected topics and data. + function expectEmit() external; + + /// Same as the previous method, but also checks supplied address against emitting contract. + function expectEmit(address emitter) external; + + /// Expects an error on next call with any revert data. + function expectRevert() external; + + /// Expects an error on next call that starts with the revert data. + function expectRevert(bytes4 revertData) external; + + /// Expects an error on next call that exactly matches the revert data. + function expectRevert(bytes calldata revertData) external; + + /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other + /// memory is written to, the test will fail. Can be called multiple times to add more ranges to the set. + function expectSafeMemory(uint64 min, uint64 max) external; + + /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext. + /// If any other memory is written to, the test will fail. Can be called multiple times to add more ranges + /// to the set. + function expectSafeMemoryCall(uint64 min, uint64 max) external; + + /// Marks a test as skipped. Must be called at the top of the test. + function skip(bool skipTest) external; + + /// Stops all safe memory expectation in the current subcontext. + function stopExpectSafeMemory() external; +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/console.sol b/examples/validating-public-input/contracts/lib/forge-std/src/console.sol new file mode 100644 index 000000000..755eedcd9 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/console.sol @@ -0,0 +1,1552 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.4.22 <0.9.0; + +library console { + address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); + + function _castLogPayloadViewToPure( + function(bytes memory) internal view fnIn + ) internal pure returns (function(bytes memory) internal pure fnOut) { + assembly { + fnOut := fnIn + } + } + + function _sendLogPayload(bytes memory payload) internal pure { + _castLogPayloadViewToPure(_sendLogPayloadView)(payload); + } + + function _sendLogPayloadView(bytes memory payload) private view { + uint256 payloadLength = payload.length; + address consoleAddress = CONSOLE_ADDRESS; + /// @solidity memory-safe-assembly + assembly { + let payloadStart := add(payload, 32) + let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) + } + } + + function log() internal pure { + _sendLogPayload(abi.encodeWithSignature("log()")); + } + + function logInt(int p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); + } + + function logUint(uint p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); + } + + function logString(string memory p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); + } + + function logBool(bool p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); + } + + function logAddress(address p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); + } + + function logBytes(bytes memory p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); + } + + function logBytes1(bytes1 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); + } + + function logBytes2(bytes2 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); + } + + function logBytes3(bytes3 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); + } + + function logBytes4(bytes4 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); + } + + function logBytes5(bytes5 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); + } + + function logBytes6(bytes6 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); + } + + function logBytes7(bytes7 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); + } + + function logBytes8(bytes8 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); + } + + function logBytes9(bytes9 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); + } + + function logBytes10(bytes10 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); + } + + function logBytes11(bytes11 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); + } + + function logBytes12(bytes12 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); + } + + function logBytes13(bytes13 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); + } + + function logBytes14(bytes14 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); + } + + function logBytes15(bytes15 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); + } + + function logBytes16(bytes16 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); + } + + function logBytes17(bytes17 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); + } + + function logBytes18(bytes18 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); + } + + function logBytes19(bytes19 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); + } + + function logBytes20(bytes20 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); + } + + function logBytes21(bytes21 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); + } + + function logBytes22(bytes22 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); + } + + function logBytes23(bytes23 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); + } + + function logBytes24(bytes24 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); + } + + function logBytes25(bytes25 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); + } + + function logBytes26(bytes26 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); + } + + function logBytes27(bytes27 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); + } + + function logBytes28(bytes28 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); + } + + function logBytes29(bytes29 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); + } + + function logBytes30(bytes30 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); + } + + function logBytes31(bytes31 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); + } + + function logBytes32(bytes32 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); + } + + function log(uint p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); + } + + function log(int p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); + } + + function log(string memory p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); + } + + function log(bool p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); + } + + function log(address p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); + } + + function log(uint p0, uint p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); + } + + function log(uint p0, string memory p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); + } + + function log(uint p0, bool p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); + } + + function log(uint p0, address p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); + } + + function log(string memory p0, uint p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); + } + + function log(string memory p0, int p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,int)", p0, p1)); + } + + function log(string memory p0, string memory p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); + } + + function log(string memory p0, bool p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); + } + + function log(string memory p0, address p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); + } + + function log(bool p0, uint p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); + } + + function log(bool p0, string memory p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); + } + + function log(bool p0, bool p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); + } + + function log(bool p0, address p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); + } + + function log(address p0, uint p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); + } + + function log(address p0, string memory p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); + } + + function log(address p0, bool p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); + } + + function log(address p0, address p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); + } + + function log(uint p0, uint p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); + } + + function log(uint p0, uint p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); + } + + function log(uint p0, uint p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); + } + + function log(uint p0, uint p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); + } + + function log(uint p0, string memory p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); + } + + function log(uint p0, string memory p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); + } + + function log(uint p0, string memory p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); + } + + function log(uint p0, string memory p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); + } + + function log(uint p0, bool p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); + } + + function log(uint p0, bool p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); + } + + function log(uint p0, bool p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); + } + + function log(uint p0, bool p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); + } + + function log(uint p0, address p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); + } + + function log(uint p0, address p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); + } + + function log(uint p0, address p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); + } + + function log(uint p0, address p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); + } + + function log(string memory p0, uint p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); + } + + function log(string memory p0, uint p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); + } + + function log(string memory p0, uint p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); + } + + function log(string memory p0, uint p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); + } + + function log(string memory p0, address p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); + } + + function log(string memory p0, address p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); + } + + function log(string memory p0, address p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); + } + + function log(string memory p0, address p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); + } + + function log(bool p0, uint p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); + } + + function log(bool p0, uint p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); + } + + function log(bool p0, uint p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); + } + + function log(bool p0, uint p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); + } + + function log(bool p0, bool p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); + } + + function log(bool p0, bool p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); + } + + function log(bool p0, bool p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); + } + + function log(bool p0, bool p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); + } + + function log(bool p0, address p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); + } + + function log(bool p0, address p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); + } + + function log(bool p0, address p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); + } + + function log(bool p0, address p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); + } + + function log(address p0, uint p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); + } + + function log(address p0, uint p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); + } + + function log(address p0, uint p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); + } + + function log(address p0, uint p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); + } + + function log(address p0, string memory p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); + } + + function log(address p0, string memory p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); + } + + function log(address p0, string memory p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); + } + + function log(address p0, string memory p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); + } + + function log(address p0, bool p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); + } + + function log(address p0, bool p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); + } + + function log(address p0, bool p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); + } + + function log(address p0, bool p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); + } + + function log(address p0, address p1, uint p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); + } + + function log(address p0, address p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); + } + + function log(address p0, address p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); + } + + function log(address p0, address p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); + } + + function log(uint p0, uint p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, uint p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/console2.sol b/examples/validating-public-input/contracts/lib/forge-std/src/console2.sol new file mode 100644 index 000000000..03531d91d --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/console2.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.4.22 <0.9.0; + +import {console as console2} from "./console.sol"; diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC1155.sol b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC1155.sol new file mode 100644 index 000000000..f7dd2b410 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC1155.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +import "./IERC165.sol"; + +/// @title ERC-1155 Multi Token Standard +/// @dev See https://eips.ethereum.org/EIPS/eip-1155 +/// Note: The ERC-165 identifier for this interface is 0xd9b67a26. +interface IERC1155 is IERC165 { + /// @dev + /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). + /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender). + /// - The `_from` argument MUST be the address of the holder whose balance is decreased. + /// - The `_to` argument MUST be the address of the recipient whose balance is increased. + /// - The `_id` argument MUST be the token type being transferred. + /// - The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by. + /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). + /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). + event TransferSingle( + address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value + ); + + /// @dev + /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). + /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender). + /// - The `_from` argument MUST be the address of the holder whose balance is decreased. + /// - The `_to` argument MUST be the address of the recipient whose balance is increased. + /// - The `_ids` argument MUST be the list of tokens being transferred. + /// - The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by. + /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). + /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). + event TransferBatch( + address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values + ); + + /// @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absence of an event assumes disabled). + event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); + + /// @dev MUST emit when the URI is updated for a token ID. URIs are defined in RFC 3986. + /// The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema". + event URI(string _value, uint256 indexed _id); + + /// @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call). + /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). + /// - MUST revert if `_to` is the zero address. + /// - MUST revert if balance of holder for token `_id` is lower than the `_value` sent. + /// - MUST revert on any other error. + /// - MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard). + /// - After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). + /// @param _from Source address + /// @param _to Target address + /// @param _id ID of the token type + /// @param _value Transfer amount + /// @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to` + function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external; + + /// @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call). + /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). + /// - MUST revert if `_to` is the zero address. + /// - MUST revert if length of `_ids` is not the same as length of `_values`. + /// - MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient. + /// - MUST revert on any other error. + /// - MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard). + /// - Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc). + /// - After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). + /// @param _from Source address + /// @param _to Target address + /// @param _ids IDs of each token type (order and length must match _values array) + /// @param _values Transfer amounts per token type (order and length must match _ids array) + /// @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to` + function safeBatchTransferFrom( + address _from, + address _to, + uint256[] calldata _ids, + uint256[] calldata _values, + bytes calldata _data + ) external; + + /// @notice Get the balance of an account's tokens. + /// @param _owner The address of the token holder + /// @param _id ID of the token + /// @return The _owner's balance of the token type requested + function balanceOf(address _owner, uint256 _id) external view returns (uint256); + + /// @notice Get the balance of multiple account/token pairs + /// @param _owners The addresses of the token holders + /// @param _ids ID of the tokens + /// @return The _owner's balance of the token types requested (i.e. balance for each (owner, id) pair) + function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) + external + view + returns (uint256[] memory); + + /// @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens. + /// @dev MUST emit the ApprovalForAll event on success. + /// @param _operator Address to add to the set of authorized operators + /// @param _approved True if the operator is approved, false to revoke approval + function setApprovalForAll(address _operator, bool _approved) external; + + /// @notice Queries the approval status of an operator for a given owner. + /// @param _owner The owner of the tokens + /// @param _operator Address of authorized operator + /// @return True if the operator is approved, false if not + function isApprovedForAll(address _owner, address _operator) external view returns (bool); +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC165.sol b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC165.sol new file mode 100644 index 000000000..9af4bf800 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC165.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +interface IERC165 { + /// @notice Query if a contract implements an interface + /// @param interfaceID The interface identifier, as specified in ERC-165 + /// @dev Interface identification is specified in ERC-165. This function + /// uses less than 30,000 gas. + /// @return `true` if the contract implements `interfaceID` and + /// `interfaceID` is not 0xffffffff, `false` otherwise + function supportsInterface(bytes4 interfaceID) external view returns (bool); +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC20.sol b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC20.sol new file mode 100644 index 000000000..ba40806c3 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC20.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +/// @dev Interface of the ERC20 standard as defined in the EIP. +/// @dev This includes the optional name, symbol, and decimals metadata. +interface IERC20 { + /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`). + event Transfer(address indexed from, address indexed to, uint256 value); + + /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value` + /// is the new allowance. + event Approval(address indexed owner, address indexed spender, uint256 value); + + /// @notice Returns the amount of tokens in existence. + function totalSupply() external view returns (uint256); + + /// @notice Returns the amount of tokens owned by `account`. + function balanceOf(address account) external view returns (uint256); + + /// @notice Moves `amount` tokens from the caller's account to `to`. + function transfer(address to, uint256 amount) external returns (bool); + + /// @notice Returns the remaining number of tokens that `spender` is allowed + /// to spend on behalf of `owner` + function allowance(address owner, address spender) external view returns (uint256); + + /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens. + /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + function approve(address spender, uint256 amount) external returns (bool); + + /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism. + /// `amount` is then deducted from the caller's allowance. + function transferFrom(address from, address to, uint256 amount) external returns (bool); + + /// @notice Returns the name of the token. + function name() external view returns (string memory); + + /// @notice Returns the symbol of the token. + function symbol() external view returns (string memory); + + /// @notice Returns the decimals places of the token. + function decimals() external view returns (uint8); +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC4626.sol b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC4626.sol new file mode 100644 index 000000000..bfe3a1155 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC4626.sol @@ -0,0 +1,190 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +import "./IERC20.sol"; + +/// @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in +/// https://eips.ethereum.org/EIPS/eip-4626 +interface IERC4626 is IERC20 { + event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares); + + event Withdraw( + address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares + ); + + /// @notice Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. + /// @dev + /// - MUST be an ERC-20 token contract. + /// - MUST NOT revert. + function asset() external view returns (address assetTokenAddress); + + /// @notice Returns the total amount of the underlying asset that is “managed†by Vault. + /// @dev + /// - SHOULD include any compounding that occurs from yield. + /// - MUST be inclusive of any fees that are charged against assets in the Vault. + /// - MUST NOT revert. + function totalAssets() external view returns (uint256 totalManagedAssets); + + /// @notice Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal + /// scenario where all the conditions are met. + /// @dev + /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault. + /// - MUST NOT show any variations depending on the caller. + /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. + /// - MUST NOT revert. + /// + /// NOTE: This calculation MAY NOT reflect the “per-user†price-per-share, and instead should reflect the + /// “average-user’s†price-per-share, meaning what the average user should expect to see when exchanging to and + /// from. + function convertToShares(uint256 assets) external view returns (uint256 shares); + + /// @notice Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal + /// scenario where all the conditions are met. + /// @dev + /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault. + /// - MUST NOT show any variations depending on the caller. + /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. + /// - MUST NOT revert. + /// + /// NOTE: This calculation MAY NOT reflect the “per-user†price-per-share, and instead should reflect the + /// “average-user’s†price-per-share, meaning what the average user should expect to see when exchanging to and + /// from. + function convertToAssets(uint256 shares) external view returns (uint256 assets); + + /// @notice Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver, + /// through a deposit call. + /// @dev + /// - MUST return a limited value if receiver is subject to some deposit limit. + /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited. + /// - MUST NOT revert. + function maxDeposit(address receiver) external view returns (uint256 maxAssets); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given + /// current on-chain conditions. + /// @dev + /// - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit + /// call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called + /// in the same transaction. + /// - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the + /// deposit would be accepted, regardless if the user has enough tokens approved, etc. + /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by depositing. + function previewDeposit(uint256 assets) external view returns (uint256 shares); + + /// @notice Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens. + /// @dev + /// - MUST emit the Deposit event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the + /// deposit execution, and are accounted for during deposit. + /// - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not + /// approving enough underlying tokens to the Vault contract, etc). + /// + /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. + function deposit(uint256 assets, address receiver) external returns (uint256 shares); + + /// @notice Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call. + /// @dev + /// - MUST return a limited value if receiver is subject to some mint limit. + /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted. + /// - MUST NOT revert. + function maxMint(address receiver) external view returns (uint256 maxShares); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given + /// current on-chain conditions. + /// @dev + /// - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call + /// in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the + /// same transaction. + /// - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint + /// would be accepted, regardless if the user has enough tokens approved, etc. + /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by minting. + function previewMint(uint256 shares) external view returns (uint256 assets); + + /// @notice Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens. + /// @dev + /// - MUST emit the Deposit event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint + /// execution, and are accounted for during mint. + /// - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not + /// approving enough underlying tokens to the Vault contract, etc). + /// + /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. + function mint(uint256 shares, address receiver) external returns (uint256 assets); + + /// @notice Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the + /// Vault, through a withdraw call. + /// @dev + /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock. + /// - MUST NOT revert. + function maxWithdraw(address owner) external view returns (uint256 maxAssets); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, + /// given current on-chain conditions. + /// @dev + /// - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw + /// call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if + /// called + /// in the same transaction. + /// - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though + /// the withdrawal would be accepted, regardless if the user has enough shares, etc. + /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by depositing. + function previewWithdraw(uint256 assets) external view returns (uint256 shares); + + /// @notice Burns shares from owner and sends exactly assets of underlying tokens to receiver. + /// @dev + /// - MUST emit the Withdraw event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the + /// withdraw execution, and are accounted for during withdraw. + /// - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner + /// not having enough shares, etc). + /// + /// Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. + /// Those methods should be performed separately. + function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares); + + /// @notice Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault, + /// through a redeem call. + /// @dev + /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock. + /// - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock. + /// - MUST NOT revert. + function maxRedeem(address owner) external view returns (uint256 maxShares); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block, + /// given current on-chain conditions. + /// @dev + /// - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call + /// in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the + /// same transaction. + /// - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the + /// redemption would be accepted, regardless if the user has enough shares, etc. + /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by redeeming. + function previewRedeem(uint256 shares) external view returns (uint256 assets); + + /// @notice Burns exactly shares from owner and sends assets of underlying tokens to receiver. + /// @dev + /// - MUST emit the Withdraw event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the + /// redeem execution, and are accounted for during redeem. + /// - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner + /// not having enough shares, etc). + /// + /// NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. + /// Those methods should be performed separately. + function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets); +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC721.sol b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC721.sol new file mode 100644 index 000000000..0a16f45cc --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC721.sol @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +import "./IERC165.sol"; + +/// @title ERC-721 Non-Fungible Token Standard +/// @dev See https://eips.ethereum.org/EIPS/eip-721 +/// Note: the ERC-165 identifier for this interface is 0x80ac58cd. +interface IERC721 is IERC165 { + /// @dev This emits when ownership of any NFT changes by any mechanism. + /// This event emits when NFTs are created (`from` == 0) and destroyed + /// (`to` == 0). Exception: during contract creation, any number of NFTs + /// may be created and assigned without emitting Transfer. At the time of + /// any transfer, the approved address for that NFT (if any) is reset to none. + event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); + + /// @dev This emits when the approved address for an NFT is changed or + /// reaffirmed. The zero address indicates there is no approved address. + /// When a Transfer event emits, this also indicates that the approved + /// address for that NFT (if any) is reset to none. + event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); + + /// @dev This emits when an operator is enabled or disabled for an owner. + /// The operator can manage all NFTs of the owner. + event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); + + /// @notice Count all NFTs assigned to an owner + /// @dev NFTs assigned to the zero address are considered invalid, and this + /// function throws for queries about the zero address. + /// @param _owner An address for whom to query the balance + /// @return The number of NFTs owned by `_owner`, possibly zero + function balanceOf(address _owner) external view returns (uint256); + + /// @notice Find the owner of an NFT + /// @dev NFTs assigned to zero address are considered invalid, and queries + /// about them do throw. + /// @param _tokenId The identifier for an NFT + /// @return The address of the owner of the NFT + function ownerOf(uint256 _tokenId) external view returns (address); + + /// @notice Transfers the ownership of an NFT from one address to another address + /// @dev Throws unless `msg.sender` is the current owner, an authorized + /// operator, or the approved address for this NFT. Throws if `_from` is + /// not the current owner. Throws if `_to` is the zero address. Throws if + /// `_tokenId` is not a valid NFT. When transfer is complete, this function + /// checks if `_to` is a smart contract (code size > 0). If so, it calls + /// `onERC721Received` on `_to` and throws if the return value is not + /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. + /// @param _from The current owner of the NFT + /// @param _to The new owner + /// @param _tokenId The NFT to transfer + /// @param data Additional data with no specified format, sent in call to `_to` + function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable; + + /// @notice Transfers the ownership of an NFT from one address to another address + /// @dev This works identically to the other function with an extra data parameter, + /// except this function just sets data to "". + /// @param _from The current owner of the NFT + /// @param _to The new owner + /// @param _tokenId The NFT to transfer + function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; + + /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE + /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE + /// THEY MAY BE PERMANENTLY LOST + /// @dev Throws unless `msg.sender` is the current owner, an authorized + /// operator, or the approved address for this NFT. Throws if `_from` is + /// not the current owner. Throws if `_to` is the zero address. Throws if + /// `_tokenId` is not a valid NFT. + /// @param _from The current owner of the NFT + /// @param _to The new owner + /// @param _tokenId The NFT to transfer + function transferFrom(address _from, address _to, uint256 _tokenId) external payable; + + /// @notice Change or reaffirm the approved address for an NFT + /// @dev The zero address indicates there is no approved address. + /// Throws unless `msg.sender` is the current NFT owner, or an authorized + /// operator of the current owner. + /// @param _approved The new approved NFT controller + /// @param _tokenId The NFT to approve + function approve(address _approved, uint256 _tokenId) external payable; + + /// @notice Enable or disable approval for a third party ("operator") to manage + /// all of `msg.sender`'s assets + /// @dev Emits the ApprovalForAll event. The contract MUST allow + /// multiple operators per owner. + /// @param _operator Address to add to the set of authorized operators + /// @param _approved True if the operator is approved, false to revoke approval + function setApprovalForAll(address _operator, bool _approved) external; + + /// @notice Get the approved address for a single NFT + /// @dev Throws if `_tokenId` is not a valid NFT. + /// @param _tokenId The NFT to find the approved address for + /// @return The approved address for this NFT, or the zero address if there is none + function getApproved(uint256 _tokenId) external view returns (address); + + /// @notice Query if an address is an authorized operator for another address + /// @param _owner The address that owns the NFTs + /// @param _operator The address that acts on behalf of the owner + /// @return True if `_operator` is an approved operator for `_owner`, false otherwise + function isApprovedForAll(address _owner, address _operator) external view returns (bool); +} + +/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02. +interface IERC721TokenReceiver { + /// @notice Handle the receipt of an NFT + /// @dev The ERC721 smart contract calls this function on the recipient + /// after a `transfer`. This function MAY throw to revert and reject the + /// transfer. Return of other than the magic value MUST result in the + /// transaction being reverted. + /// Note: the contract address is always the message sender. + /// @param _operator The address which called `safeTransferFrom` function + /// @param _from The address which previously owned the token + /// @param _tokenId The NFT identifier which is being transferred + /// @param _data Additional data with no specified format + /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` + /// unless throwing + function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) + external + returns (bytes4); +} + +/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension +/// @dev See https://eips.ethereum.org/EIPS/eip-721 +/// Note: the ERC-165 identifier for this interface is 0x5b5e139f. +interface IERC721Metadata is IERC721 { + /// @notice A descriptive name for a collection of NFTs in this contract + function name() external view returns (string memory _name); + + /// @notice An abbreviated name for NFTs in this contract + function symbol() external view returns (string memory _symbol); + + /// @notice A distinct Uniform Resource Identifier (URI) for a given asset. + /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC + /// 3986. The URI may point to a JSON file that conforms to the "ERC721 + /// Metadata JSON Schema". + function tokenURI(uint256 _tokenId) external view returns (string memory); +} + +/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension +/// @dev See https://eips.ethereum.org/EIPS/eip-721 +/// Note: the ERC-165 identifier for this interface is 0x780e9d63. +interface IERC721Enumerable is IERC721 { + /// @notice Count NFTs tracked by this contract + /// @return A count of valid NFTs tracked by this contract, where each one of + /// them has an assigned and queryable owner not equal to the zero address + function totalSupply() external view returns (uint256); + + /// @notice Enumerate valid NFTs + /// @dev Throws if `_index` >= `totalSupply()`. + /// @param _index A counter less than `totalSupply()` + /// @return The token identifier for the `_index`th NFT, + /// (sort order not specified) + function tokenByIndex(uint256 _index) external view returns (uint256); + + /// @notice Enumerate NFTs assigned to an owner + /// @dev Throws if `_index` >= `balanceOf(_owner)` or if + /// `_owner` is the zero address, representing invalid NFTs. + /// @param _owner An address where we are interested in NFTs owned by them + /// @param _index A counter less than `balanceOf(_owner)` + /// @return The token identifier for the `_index`th NFT assigned to `_owner`, + /// (sort order not specified) + function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256); +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IMulticall3.sol b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IMulticall3.sol new file mode 100644 index 000000000..0d031b71d --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IMulticall3.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +interface IMulticall3 { + struct Call { + address target; + bytes callData; + } + + struct Call3 { + address target; + bool allowFailure; + bytes callData; + } + + struct Call3Value { + address target; + bool allowFailure; + uint256 value; + bytes callData; + } + + struct Result { + bool success; + bytes returnData; + } + + function aggregate(Call[] calldata calls) + external + payable + returns (uint256 blockNumber, bytes[] memory returnData); + + function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData); + + function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData); + + function blockAndAggregate(Call[] calldata calls) + external + payable + returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); + + function getBasefee() external view returns (uint256 basefee); + + function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash); + + function getBlockNumber() external view returns (uint256 blockNumber); + + function getChainId() external view returns (uint256 chainid); + + function getCurrentBlockCoinbase() external view returns (address coinbase); + + function getCurrentBlockDifficulty() external view returns (uint256 difficulty); + + function getCurrentBlockGasLimit() external view returns (uint256 gaslimit); + + function getCurrentBlockTimestamp() external view returns (uint256 timestamp); + + function getEthBalance(address addr) external view returns (uint256 balance); + + function getLastBlockHash() external view returns (bytes32 blockHash); + + function tryAggregate(bool requireSuccess, Call[] calldata calls) + external + payable + returns (Result[] memory returnData); + + function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) + external + payable + returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC20.sol b/examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC20.sol new file mode 100644 index 000000000..2a022fa34 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC20.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +import {IERC20} from "../interfaces/IERC20.sol"; + +/// @notice This is a mock contract of the ERC20 standard for testing purposes only, it SHOULD NOT be used in production. +/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC20.sol +contract MockERC20 is IERC20 { + /*////////////////////////////////////////////////////////////// + METADATA STORAGE + //////////////////////////////////////////////////////////////*/ + + string internal _name; + + string internal _symbol; + + uint8 internal _decimals; + + function name() external view override returns (string memory) { + return _name; + } + + function symbol() external view override returns (string memory) { + return _symbol; + } + + function decimals() external view override returns (uint8) { + return _decimals; + } + + /*////////////////////////////////////////////////////////////// + ERC20 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal _totalSupply; + + mapping(address => uint256) internal _balanceOf; + + mapping(address => mapping(address => uint256)) internal _allowance; + + function totalSupply() external view override returns (uint256) { + return _totalSupply; + } + + function balanceOf(address owner) external view override returns (uint256) { + return _balanceOf[owner]; + } + + function allowance(address owner, address spender) external view override returns (uint256) { + return _allowance[owner][spender]; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 STORAGE + //////////////////////////////////////////////////////////////*/ + + uint256 internal INITIAL_CHAIN_ID; + + bytes32 internal INITIAL_DOMAIN_SEPARATOR; + + mapping(address => uint256) public nonces; + + /*////////////////////////////////////////////////////////////// + INITIALIZE + //////////////////////////////////////////////////////////////*/ + + /// @dev A bool to track whether the contract has been initialized. + bool private initialized; + + /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and + /// syntaxes, we add an initialization function that can be called only once. + function initialize(string memory name_, string memory symbol_, uint8 decimals_) public { + require(!initialized, "ALREADY_INITIALIZED"); + + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + + INITIAL_CHAIN_ID = _pureChainId(); + INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); + + initialized = true; + } + + /*////////////////////////////////////////////////////////////// + ERC20 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 amount) public virtual override returns (bool) { + _allowance[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + + return true; + } + + function transfer(address to, uint256 amount) public virtual override returns (bool) { + _balanceOf[msg.sender] = _sub(_balanceOf[msg.sender], amount); + _balanceOf[to] = _add(_balanceOf[to], amount); + + emit Transfer(msg.sender, to, amount); + + return true; + } + + function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { + uint256 allowed = _allowance[from][msg.sender]; // Saves gas for limited approvals. + + if (allowed != ~uint256(0)) _allowance[from][msg.sender] = _sub(allowed, amount); + + _balanceOf[from] = _sub(_balanceOf[from], amount); + _balanceOf[to] = _add(_balanceOf[to], amount); + + emit Transfer(from, to, amount); + + return true; + } + + /*////////////////////////////////////////////////////////////// + EIP-2612 LOGIC + //////////////////////////////////////////////////////////////*/ + + function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) + public + virtual + { + require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); + + address recoveredAddress = ecrecover( + keccak256( + abi.encodePacked( + "\x19\x01", + DOMAIN_SEPARATOR(), + keccak256( + abi.encode( + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ), + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ) + ) + ), + v, + r, + s + ); + + require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); + + _allowance[recoveredAddress][spender] = value; + + emit Approval(owner, spender, value); + } + + function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { + return _pureChainId() == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); + } + + function computeDomainSeparator() internal view virtual returns (bytes32) { + return keccak256( + abi.encode( + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256(bytes(_name)), + keccak256("1"), + _pureChainId(), + address(this) + ) + ); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 amount) internal virtual { + _totalSupply = _add(_totalSupply, amount); + _balanceOf[to] = _add(_balanceOf[to], amount); + + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal virtual { + _balanceOf[from] = _sub(_balanceOf[from], amount); + _totalSupply = _sub(_totalSupply, amount); + + emit Transfer(from, address(0), amount); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL SAFE MATH LOGIC + //////////////////////////////////////////////////////////////*/ + + function _add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + require(c >= a, "ERC20: addition overflow"); + return c; + } + + function _sub(uint256 a, uint256 b) internal pure returns (uint256) { + require(a >= b, "ERC20: subtraction underflow"); + return a - b; + } + + /*////////////////////////////////////////////////////////////// + HELPERS + //////////////////////////////////////////////////////////////*/ + + // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no + // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We + // can't simply access the chain ID in a normal view or pure function because the solc View Pure + // Checker changed `chainid` from pure to view in 0.8.0. + function _viewChainId() private view returns (uint256 chainId) { + // Assembly required since `block.chainid` was introduced in 0.8.0. + assembly { + chainId := chainid() + } + + address(this); // Silence warnings in older Solc versions. + } + + function _pureChainId() private pure returns (uint256 chainId) { + function() internal view returns (uint256) fnIn = _viewChainId; + function() internal pure returns (uint256) pureChainId; + assembly { + pureChainId := fnIn + } + chainId = pureChainId(); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC721.sol b/examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC721.sol new file mode 100644 index 000000000..7a4909e58 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC721.sol @@ -0,0 +1,231 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +import {IERC721Metadata, IERC721TokenReceiver} from "../interfaces/IERC721.sol"; + +/// @notice This is a mock contract of the ERC721 standard for testing purposes only, it SHOULD NOT be used in production. +/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC721.sol +contract MockERC721 is IERC721Metadata { + /*////////////////////////////////////////////////////////////// + METADATA STORAGE/LOGIC + //////////////////////////////////////////////////////////////*/ + + string internal _name; + + string internal _symbol; + + function name() external view override returns (string memory) { + return _name; + } + + function symbol() external view override returns (string memory) { + return _symbol; + } + + function tokenURI(uint256 id) public view virtual override returns (string memory) {} + + /*////////////////////////////////////////////////////////////// + ERC721 BALANCE/OWNER STORAGE + //////////////////////////////////////////////////////////////*/ + + mapping(uint256 => address) internal _ownerOf; + + mapping(address => uint256) internal _balanceOf; + + function ownerOf(uint256 id) public view virtual override returns (address owner) { + require((owner = _ownerOf[id]) != address(0), "NOT_MINTED"); + } + + function balanceOf(address owner) public view virtual override returns (uint256) { + require(owner != address(0), "ZERO_ADDRESS"); + + return _balanceOf[owner]; + } + + /*////////////////////////////////////////////////////////////// + ERC721 APPROVAL STORAGE + //////////////////////////////////////////////////////////////*/ + + mapping(uint256 => address) internal _getApproved; + + mapping(address => mapping(address => bool)) internal _isApprovedForAll; + + function getApproved(uint256 id) public view virtual override returns (address) { + return _getApproved[id]; + } + + function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { + return _isApprovedForAll[owner][operator]; + } + + /*////////////////////////////////////////////////////////////// + INITIALIZE + //////////////////////////////////////////////////////////////*/ + + /// @dev A bool to track whether the contract has been initialized. + bool private initialized; + + /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and + /// syntaxes, we add an initialization function that can be called only once. + function initialize(string memory name_, string memory symbol_) public { + require(!initialized, "ALREADY_INITIALIZED"); + + _name = name_; + _symbol = symbol_; + + initialized = true; + } + + /*////////////////////////////////////////////////////////////// + ERC721 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 id) public payable virtual override { + address owner = _ownerOf[id]; + + require(msg.sender == owner || _isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); + + _getApproved[id] = spender; + + emit Approval(owner, spender, id); + } + + function setApprovalForAll(address operator, bool approved) public virtual override { + _isApprovedForAll[msg.sender][operator] = approved; + + emit ApprovalForAll(msg.sender, operator, approved); + } + + function transferFrom(address from, address to, uint256 id) public payable virtual override { + require(from == _ownerOf[id], "WRONG_FROM"); + + require(to != address(0), "INVALID_RECIPIENT"); + + require( + msg.sender == from || _isApprovedForAll[from][msg.sender] || msg.sender == _getApproved[id], + "NOT_AUTHORIZED" + ); + + // Underflow of the sender's balance is impossible because we check for + // ownership above and the recipient's balance can't realistically overflow. + _balanceOf[from]--; + + _balanceOf[to]++; + + _ownerOf[id] = to; + + delete _getApproved[id]; + + emit Transfer(from, to, id); + } + + function safeTransferFrom(address from, address to, uint256 id) public payable virtual override { + transferFrom(from, to, id); + + require( + !_isContract(to) + || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") + == IERC721TokenReceiver.onERC721Received.selector, + "UNSAFE_RECIPIENT" + ); + } + + function safeTransferFrom(address from, address to, uint256 id, bytes memory data) + public + payable + virtual + override + { + transferFrom(from, to, id); + + require( + !_isContract(to) + || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) + == IERC721TokenReceiver.onERC721Received.selector, + "UNSAFE_RECIPIENT" + ); + } + + /*////////////////////////////////////////////////////////////// + ERC165 LOGIC + //////////////////////////////////////////////////////////////*/ + + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165 + || interfaceId == 0x80ac58cd // ERC165 Interface ID for ERC721 + || interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 id) internal virtual { + require(to != address(0), "INVALID_RECIPIENT"); + + require(_ownerOf[id] == address(0), "ALREADY_MINTED"); + + // Counter overflow is incredibly unrealistic. + + _balanceOf[to]++; + + _ownerOf[id] = to; + + emit Transfer(address(0), to, id); + } + + function _burn(uint256 id) internal virtual { + address owner = _ownerOf[id]; + + require(owner != address(0), "NOT_MINTED"); + + _balanceOf[owner]--; + + delete _ownerOf[id]; + + delete _getApproved[id]; + + emit Transfer(owner, address(0), id); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL SAFE MINT LOGIC + //////////////////////////////////////////////////////////////*/ + + function _safeMint(address to, uint256 id) internal virtual { + _mint(to, id); + + require( + !_isContract(to) + || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") + == IERC721TokenReceiver.onERC721Received.selector, + "UNSAFE_RECIPIENT" + ); + } + + function _safeMint(address to, uint256 id, bytes memory data) internal virtual { + _mint(to, id); + + require( + !_isContract(to) + || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) + == IERC721TokenReceiver.onERC721Received.selector, + "UNSAFE_RECIPIENT" + ); + } + + /*////////////////////////////////////////////////////////////// + HELPERS + //////////////////////////////////////////////////////////////*/ + + function _isContract(address _addr) private view returns (bool) { + uint256 codeLength; + + // Assembly required for versions < 0.8.0 to check extcodesize. + assembly { + codeLength := extcodesize(_addr) + } + + return codeLength > 0; + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/safeconsole.sol b/examples/validating-public-input/contracts/lib/forge-std/src/safeconsole.sol new file mode 100644 index 000000000..5714d0902 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/src/safeconsole.sol @@ -0,0 +1,13248 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +/// @author philogy +/// @dev Code generated automatically by script. +library safeconsole { + uint256 constant CONSOLE_ADDR = 0x000000000000000000000000000000000000000000636F6e736F6c652e6c6f67; + + // Credit to [0age](https://twitter.com/z0age/status/1654922202930888704) and [0xdapper](https://github.com/foundry-rs/forge-std/pull/374) + // for the view-to-pure log trick. + function _sendLogPayload(uint256 offset, uint256 size) private pure { + function(uint256, uint256) internal view fnIn = _sendLogPayloadView; + function(uint256, uint256) internal pure pureSendLogPayload; + assembly { + pureSendLogPayload := fnIn + } + pureSendLogPayload(offset, size); + } + + function _sendLogPayloadView(uint256 offset, uint256 size) private view { + assembly { + pop(staticcall(gas(), CONSOLE_ADDR, offset, size, 0x0, 0x0)) + } + } + + function _memcopy(uint256 fromOffset, uint256 toOffset, uint256 length) private pure { + function(uint256, uint256, uint256) internal view fnIn = _memcopyView; + function(uint256, uint256, uint256) internal pure pureMemcopy; + assembly { + pureMemcopy := fnIn + } + pureMemcopy(fromOffset, toOffset, length); + } + + function _memcopyView(uint256 fromOffset, uint256 toOffset, uint256 length) private view { + assembly { + pop(staticcall(gas(), 0x4, fromOffset, length, toOffset, length)) + } + } + + function logMemory(uint256 offset, uint256 length) internal pure { + if (offset >= 0x60) { + // Sufficient memory before slice to prepare call header. + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(sub(offset, 0x60)) + m1 := mload(sub(offset, 0x40)) + m2 := mload(sub(offset, 0x20)) + // Selector of `logBytes(bytes)`. + mstore(sub(offset, 0x60), 0xe17bf956) + mstore(sub(offset, 0x40), 0x20) + mstore(sub(offset, 0x20), length) + } + _sendLogPayload(offset - 0x44, length + 0x44); + assembly { + mstore(sub(offset, 0x60), m0) + mstore(sub(offset, 0x40), m1) + mstore(sub(offset, 0x20), m2) + } + } else { + // Insufficient space, so copy slice forward, add header and reverse. + bytes32 m0; + bytes32 m1; + bytes32 m2; + uint256 endOffset = offset + length; + assembly { + m0 := mload(add(endOffset, 0x00)) + m1 := mload(add(endOffset, 0x20)) + m2 := mload(add(endOffset, 0x40)) + } + _memcopy(offset, offset + 0x60, length); + assembly { + // Selector of `logBytes(bytes)`. + mstore(add(offset, 0x00), 0xe17bf956) + mstore(add(offset, 0x20), 0x20) + mstore(add(offset, 0x40), length) + } + _sendLogPayload(offset + 0x1c, length + 0x44); + _memcopy(offset + 0x60, offset, length); + assembly { + mstore(add(endOffset, 0x00), m0) + mstore(add(endOffset, 0x20), m1) + mstore(add(endOffset, 0x40), m2) + } + } + } + + function log(address p0) internal pure { + bytes32 m0; + bytes32 m1; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + // Selector of `log(address)`. + mstore(0x00, 0x2c2ecbc2) + mstore(0x20, p0) + } + _sendLogPayload(0x1c, 0x24); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + } + } + + function log(bool p0) internal pure { + bytes32 m0; + bytes32 m1; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + // Selector of `log(bool)`. + mstore(0x00, 0x32458eed) + mstore(0x20, p0) + } + _sendLogPayload(0x1c, 0x24); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + } + } + + function log(uint256 p0) internal pure { + bytes32 m0; + bytes32 m1; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + // Selector of `log(uint256)`. + mstore(0x00, 0xf82c50f1) + mstore(0x20, p0) + } + _sendLogPayload(0x1c, 0x24); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + } + } + + function log(bytes32 p0) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(string)`. + mstore(0x00, 0x41304fac) + mstore(0x20, 0x20) + writeString(0x40, p0) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, address p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(address,address)`. + mstore(0x00, 0xdaf0d4aa) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(address p0, bool p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(address,bool)`. + mstore(0x00, 0x75b605d3) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(address p0, uint256 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(address,uint256)`. + mstore(0x00, 0x8309e8a8) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(address p0, bytes32 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,string)`. + mstore(0x00, 0x759f86bb) + mstore(0x20, p0) + mstore(0x40, 0x40) + writeString(0x60, p1) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(bool,address)`. + mstore(0x00, 0x853c4849) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(bool p0, bool p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(bool,bool)`. + mstore(0x00, 0x2a110e83) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(bool p0, uint256 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(bool,uint256)`. + mstore(0x00, 0x399174d3) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(bool p0, bytes32 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,string)`. + mstore(0x00, 0x8feac525) + mstore(0x20, p0) + mstore(0x40, 0x40) + writeString(0x60, p1) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(uint256,address)`. + mstore(0x00, 0x69276c86) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(uint256 p0, bool p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(uint256,bool)`. + mstore(0x00, 0x1c9d7eb3) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(uint256 p0, uint256 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(uint256,uint256)`. + mstore(0x00, 0xf666715a) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(uint256 p0, bytes32 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,string)`. + mstore(0x00, 0x643fd0df) + mstore(0x20, p0) + mstore(0x40, 0x40) + writeString(0x60, p1) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bytes32 p0, address p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(string,address)`. + mstore(0x00, 0x319af333) + mstore(0x20, 0x40) + mstore(0x40, p1) + writeString(0x60, p0) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bytes32 p0, bool p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(string,bool)`. + mstore(0x00, 0xc3b55635) + mstore(0x20, 0x40) + mstore(0x40, p1) + writeString(0x60, p0) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bytes32 p0, uint256 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(string,uint256)`. + mstore(0x00, 0xb60e72cc) + mstore(0x20, 0x40) + mstore(0x40, p1) + writeString(0x60, p0) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bytes32 p0, bytes32 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,string)`. + mstore(0x00, 0x4b5c4277) + mstore(0x20, 0x40) + mstore(0x40, 0x80) + writeString(0x60, p0) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,address,address)`. + mstore(0x00, 0x018c84c2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, address p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,address,bool)`. + mstore(0x00, 0xf2a66286) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, address p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,address,uint256)`. + mstore(0x00, 0x17fe6185) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, address p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,address,string)`. + mstore(0x00, 0x007150be) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, bool p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,bool,address)`. + mstore(0x00, 0xf11699ed) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, bool p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,bool,bool)`. + mstore(0x00, 0xeb830c92) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, bool p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,bool,uint256)`. + mstore(0x00, 0x9c4f99fb) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, bool p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,bool,string)`. + mstore(0x00, 0x212255cc) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, uint256 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,uint256,address)`. + mstore(0x00, 0x7bc0d848) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, uint256 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,uint256,bool)`. + mstore(0x00, 0x678209a8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, uint256 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,uint256,uint256)`. + mstore(0x00, 0xb69bcaf6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, uint256 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,uint256,string)`. + mstore(0x00, 0xa1f2e8aa) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, bytes32 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,string,address)`. + mstore(0x00, 0xf08744e8) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, bytes32 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,string,bool)`. + mstore(0x00, 0xcf020fb1) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, bytes32 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,string,uint256)`. + mstore(0x00, 0x67dd6ff1) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, bytes32 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(address,string,string)`. + mstore(0x00, 0xfb772265) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, 0xa0) + writeString(0x80, p1) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bool p0, address p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,address,address)`. + mstore(0x00, 0xd2763667) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, address p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,address,bool)`. + mstore(0x00, 0x18c9c746) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, address p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,address,uint256)`. + mstore(0x00, 0x5f7b9afb) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, address p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,address,string)`. + mstore(0x00, 0xde9a9270) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, bool p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,bool,address)`. + mstore(0x00, 0x1078f68d) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, bool p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,bool,bool)`. + mstore(0x00, 0x50709698) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, bool p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,bool,uint256)`. + mstore(0x00, 0x12f21602) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, bool p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,bool,string)`. + mstore(0x00, 0x2555fa46) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, uint256 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,uint256,address)`. + mstore(0x00, 0x088ef9d2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, uint256 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,uint256,bool)`. + mstore(0x00, 0xe8defba9) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, uint256 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,uint256,uint256)`. + mstore(0x00, 0x37103367) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, uint256 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,uint256,string)`. + mstore(0x00, 0xc3fc3970) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, bytes32 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,string,address)`. + mstore(0x00, 0x9591b953) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, bytes32 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,string,bool)`. + mstore(0x00, 0xdbb4c247) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, bytes32 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,string,uint256)`. + mstore(0x00, 0x1093ee11) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, bytes32 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(bool,string,string)`. + mstore(0x00, 0xb076847f) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, 0xa0) + writeString(0x80, p1) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(uint256 p0, address p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,address,address)`. + mstore(0x00, 0xbcfd9be0) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, address p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,address,bool)`. + mstore(0x00, 0x9b6ec042) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, address p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,address,uint256)`. + mstore(0x00, 0x5a9b5ed5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, address p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,address,string)`. + mstore(0x00, 0x63cb41f9) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, bool p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,bool,address)`. + mstore(0x00, 0x35085f7b) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, bool p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,bool,bool)`. + mstore(0x00, 0x20718650) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, bool p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,bool,uint256)`. + mstore(0x00, 0x20098014) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, bool p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,bool,string)`. + mstore(0x00, 0x85775021) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, uint256 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,uint256,address)`. + mstore(0x00, 0x5c96b331) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, uint256 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,uint256,bool)`. + mstore(0x00, 0x4766da72) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, uint256 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,uint256,uint256)`. + mstore(0x00, 0xd1ed7a3c) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, uint256 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,uint256,string)`. + mstore(0x00, 0x71d04af2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, bytes32 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,string,address)`. + mstore(0x00, 0x7afac959) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, bytes32 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,string,bool)`. + mstore(0x00, 0x4ceda75a) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, bytes32 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,string,uint256)`. + mstore(0x00, 0x37aa7d4c) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, bytes32 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(uint256,string,string)`. + mstore(0x00, 0xb115611f) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, 0xa0) + writeString(0x80, p1) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, address p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,address,address)`. + mstore(0x00, 0xfcec75e0) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, address p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,address,bool)`. + mstore(0x00, 0xc91d5ed4) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, address p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,address,uint256)`. + mstore(0x00, 0x0d26b925) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, address p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,address,string)`. + mstore(0x00, 0xe0e9ad4f) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, 0xa0) + writeString(0x80, p0) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, bool p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,bool,address)`. + mstore(0x00, 0x932bbb38) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, bool p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,bool,bool)`. + mstore(0x00, 0x850b7ad6) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, bool p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,bool,uint256)`. + mstore(0x00, 0xc95958d6) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, bool p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,bool,string)`. + mstore(0x00, 0xe298f47d) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, 0xa0) + writeString(0x80, p0) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, uint256 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,uint256,address)`. + mstore(0x00, 0x1c7ec448) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, uint256 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,uint256,bool)`. + mstore(0x00, 0xca7733b1) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, uint256 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,uint256,uint256)`. + mstore(0x00, 0xca47c4eb) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, uint256 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,uint256,string)`. + mstore(0x00, 0x5970e089) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, 0xa0) + writeString(0x80, p0) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, bytes32 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,string,address)`. + mstore(0x00, 0x95ed0195) + mstore(0x20, 0x60) + mstore(0x40, 0xa0) + mstore(0x60, p2) + writeString(0x80, p0) + writeString(0xc0, p1) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, bytes32 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,string,bool)`. + mstore(0x00, 0xb0e0f9b5) + mstore(0x20, 0x60) + mstore(0x40, 0xa0) + mstore(0x60, p2) + writeString(0x80, p0) + writeString(0xc0, p1) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, bytes32 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,string,uint256)`. + mstore(0x00, 0x5821efa1) + mstore(0x20, 0x60) + mstore(0x40, 0xa0) + mstore(0x60, p2) + writeString(0x80, p0) + writeString(0xc0, p1) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, bytes32 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + // Selector of `log(string,string,string)`. + mstore(0x00, 0x2ced7cef) + mstore(0x20, 0x60) + mstore(0x40, 0xa0) + mstore(0x60, 0xe0) + writeString(0x80, p0) + writeString(0xc0, p1) + writeString(0x100, p2) + } + _sendLogPayload(0x1c, 0x124); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + } + } + + function log(address p0, address p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,address,address)`. + mstore(0x00, 0x665bf134) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,address,bool)`. + mstore(0x00, 0x0e378994) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,address,uint256)`. + mstore(0x00, 0x94250d77) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,address,string)`. + mstore(0x00, 0xf808da20) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,bool,address)`. + mstore(0x00, 0x9f1bc36e) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,bool,bool)`. + mstore(0x00, 0x2cd4134a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,bool,uint256)`. + mstore(0x00, 0x3971e78c) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,bool,string)`. + mstore(0x00, 0xaa6540c8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,uint256,address)`. + mstore(0x00, 0x8da6def5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,uint256,bool)`. + mstore(0x00, 0x9b4254e2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,uint256,uint256)`. + mstore(0x00, 0xbe553481) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,uint256,string)`. + mstore(0x00, 0xfdb4f990) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,string,address)`. + mstore(0x00, 0x8f736d16) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,string,bool)`. + mstore(0x00, 0x6f1a594e) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,string,uint256)`. + mstore(0x00, 0xef1cefe7) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,address,string,string)`. + mstore(0x00, 0x21bdaf25) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bool p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,address,address)`. + mstore(0x00, 0x660375dd) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,address,bool)`. + mstore(0x00, 0xa6f50b0f) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,address,uint256)`. + mstore(0x00, 0xa75c59de) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,address,string)`. + mstore(0x00, 0x2dd778e6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,bool,address)`. + mstore(0x00, 0xcf394485) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,bool,bool)`. + mstore(0x00, 0xcac43479) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,bool,uint256)`. + mstore(0x00, 0x8c4e5de6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,bool,string)`. + mstore(0x00, 0xdfc4a2e8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,uint256,address)`. + mstore(0x00, 0xccf790a1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,uint256,bool)`. + mstore(0x00, 0xc4643e20) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,uint256,uint256)`. + mstore(0x00, 0x386ff5f4) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,uint256,string)`. + mstore(0x00, 0x0aa6cfad) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,string,address)`. + mstore(0x00, 0x19fd4956) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,string,bool)`. + mstore(0x00, 0x50ad461d) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,string,uint256)`. + mstore(0x00, 0x80e6a20b) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,bool,string,string)`. + mstore(0x00, 0x475c5c33) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, uint256 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,address,address)`. + mstore(0x00, 0x478d1c62) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,address,bool)`. + mstore(0x00, 0xa1bcc9b3) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,address,uint256)`. + mstore(0x00, 0x100f650e) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,address,string)`. + mstore(0x00, 0x1da986ea) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,bool,address)`. + mstore(0x00, 0xa31bfdcc) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,bool,bool)`. + mstore(0x00, 0x3bf5e537) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,bool,uint256)`. + mstore(0x00, 0x22f6b999) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,bool,string)`. + mstore(0x00, 0xc5ad85f9) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,uint256,address)`. + mstore(0x00, 0x20e3984d) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,uint256,bool)`. + mstore(0x00, 0x66f1bc67) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,uint256,uint256)`. + mstore(0x00, 0x34f0e636) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,uint256,string)`. + mstore(0x00, 0x4a28c017) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,string,address)`. + mstore(0x00, 0x5c430d47) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,string,bool)`. + mstore(0x00, 0xcf18105c) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,string,uint256)`. + mstore(0x00, 0xbf01f891) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,uint256,string,string)`. + mstore(0x00, 0x88a8c406) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,address,address)`. + mstore(0x00, 0x0d36fa20) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,address,bool)`. + mstore(0x00, 0x0df12b76) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,address,uint256)`. + mstore(0x00, 0x457fe3cf) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,address,string)`. + mstore(0x00, 0xf7e36245) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,bool,address)`. + mstore(0x00, 0x205871c2) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,bool,bool)`. + mstore(0x00, 0x5f1d5c9f) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,bool,uint256)`. + mstore(0x00, 0x515e38b6) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,bool,string)`. + mstore(0x00, 0xbc0b61fe) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,uint256,address)`. + mstore(0x00, 0x63183678) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,uint256,bool)`. + mstore(0x00, 0x0ef7e050) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,uint256,uint256)`. + mstore(0x00, 0x1dc8e1b8) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,uint256,string)`. + mstore(0x00, 0x448830a8) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,string,address)`. + mstore(0x00, 0xa04e2f87) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,string,bool)`. + mstore(0x00, 0x35a5071f) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,string,uint256)`. + mstore(0x00, 0x159f8927) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(address,string,string,string)`. + mstore(0x00, 0x5d02c50b) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p1) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bool p0, address p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,address,address)`. + mstore(0x00, 0x1d14d001) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,address,bool)`. + mstore(0x00, 0x46600be0) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,address,uint256)`. + mstore(0x00, 0x0c66d1be) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,address,string)`. + mstore(0x00, 0xd812a167) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,bool,address)`. + mstore(0x00, 0x1c41a336) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,bool,bool)`. + mstore(0x00, 0x6a9c478b) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,bool,uint256)`. + mstore(0x00, 0x07831502) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,bool,string)`. + mstore(0x00, 0x4a66cb34) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,uint256,address)`. + mstore(0x00, 0x136b05dd) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,uint256,bool)`. + mstore(0x00, 0xd6019f1c) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,uint256,uint256)`. + mstore(0x00, 0x7bf181a1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,uint256,string)`. + mstore(0x00, 0x51f09ff8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,string,address)`. + mstore(0x00, 0x6f7c603e) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,string,bool)`. + mstore(0x00, 0xe2bfd60b) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,string,uint256)`. + mstore(0x00, 0xc21f64c7) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,address,string,string)`. + mstore(0x00, 0xa73c1db6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bool p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,address,address)`. + mstore(0x00, 0xf4880ea4) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,address,bool)`. + mstore(0x00, 0xc0a302d8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,address,uint256)`. + mstore(0x00, 0x4c123d57) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,address,string)`. + mstore(0x00, 0xa0a47963) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,bool,address)`. + mstore(0x00, 0x8c329b1a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,bool,bool)`. + mstore(0x00, 0x3b2a5ce0) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,bool,uint256)`. + mstore(0x00, 0x6d7045c1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,bool,string)`. + mstore(0x00, 0x2ae408d4) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,uint256,address)`. + mstore(0x00, 0x54a7a9a0) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,uint256,bool)`. + mstore(0x00, 0x619e4d0e) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,uint256,uint256)`. + mstore(0x00, 0x0bb00eab) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,uint256,string)`. + mstore(0x00, 0x7dd4d0e0) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,string,address)`. + mstore(0x00, 0xf9ad2b89) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,string,bool)`. + mstore(0x00, 0xb857163a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,string,uint256)`. + mstore(0x00, 0xe3a9ca2f) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,bool,string,string)`. + mstore(0x00, 0x6d1e8751) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, uint256 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,address,address)`. + mstore(0x00, 0x26f560a8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,address,bool)`. + mstore(0x00, 0xb4c314ff) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,address,uint256)`. + mstore(0x00, 0x1537dc87) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,address,string)`. + mstore(0x00, 0x1bb3b09a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,bool,address)`. + mstore(0x00, 0x9acd3616) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,bool,bool)`. + mstore(0x00, 0xceb5f4d7) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,bool,uint256)`. + mstore(0x00, 0x7f9bbca2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,bool,string)`. + mstore(0x00, 0x9143dbb1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,uint256,address)`. + mstore(0x00, 0x00dd87b9) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,uint256,bool)`. + mstore(0x00, 0xbe984353) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,uint256,uint256)`. + mstore(0x00, 0x374bb4b2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,uint256,string)`. + mstore(0x00, 0x8e69fb5d) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,string,address)`. + mstore(0x00, 0xfedd1fff) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,string,bool)`. + mstore(0x00, 0xe5e70b2b) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,string,uint256)`. + mstore(0x00, 0x6a1199e2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,uint256,string,string)`. + mstore(0x00, 0xf5bc2249) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,address,address)`. + mstore(0x00, 0x2b2b18dc) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,address,bool)`. + mstore(0x00, 0x6dd434ca) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,address,uint256)`. + mstore(0x00, 0xa5cada94) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,address,string)`. + mstore(0x00, 0x12d6c788) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,bool,address)`. + mstore(0x00, 0x538e06ab) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,bool,bool)`. + mstore(0x00, 0xdc5e935b) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,bool,uint256)`. + mstore(0x00, 0x1606a393) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,bool,string)`. + mstore(0x00, 0x483d0416) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,uint256,address)`. + mstore(0x00, 0x1596a1ce) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,uint256,bool)`. + mstore(0x00, 0x6b0e5d53) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,uint256,uint256)`. + mstore(0x00, 0x28863fcb) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,uint256,string)`. + mstore(0x00, 0x1ad96de6) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,string,address)`. + mstore(0x00, 0x97d394d8) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,string,bool)`. + mstore(0x00, 0x1e4b87e5) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,string,uint256)`. + mstore(0x00, 0x7be0c3eb) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(bool,string,string,string)`. + mstore(0x00, 0x1762e32a) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p1) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(uint256 p0, address p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,address,address)`. + mstore(0x00, 0x2488b414) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,address,bool)`. + mstore(0x00, 0x091ffaf5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,address,uint256)`. + mstore(0x00, 0x736efbb6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,address,string)`. + mstore(0x00, 0x031c6f73) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,bool,address)`. + mstore(0x00, 0xef72c513) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,bool,bool)`. + mstore(0x00, 0xe351140f) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,bool,uint256)`. + mstore(0x00, 0x5abd992a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,bool,string)`. + mstore(0x00, 0x90fb06aa) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,uint256,address)`. + mstore(0x00, 0x15c127b5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,uint256,bool)`. + mstore(0x00, 0x5f743a7c) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,uint256,uint256)`. + mstore(0x00, 0x0c9cd9c1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,uint256,string)`. + mstore(0x00, 0xddb06521) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,string,address)`. + mstore(0x00, 0x9cba8fff) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,string,bool)`. + mstore(0x00, 0xcc32ab07) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,string,uint256)`. + mstore(0x00, 0x46826b5d) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,address,string,string)`. + mstore(0x00, 0x3e128ca3) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bool p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,address,address)`. + mstore(0x00, 0xa1ef4cbb) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,address,bool)`. + mstore(0x00, 0x454d54a5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,address,uint256)`. + mstore(0x00, 0x078287f5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,address,string)`. + mstore(0x00, 0xade052c7) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,bool,address)`. + mstore(0x00, 0x69640b59) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,bool,bool)`. + mstore(0x00, 0xb6f577a1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,bool,uint256)`. + mstore(0x00, 0x7464ce23) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,bool,string)`. + mstore(0x00, 0xdddb9561) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,uint256,address)`. + mstore(0x00, 0x88cb6041) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,uint256,bool)`. + mstore(0x00, 0x91a02e2a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,uint256,uint256)`. + mstore(0x00, 0xc6acc7a8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,uint256,string)`. + mstore(0x00, 0xde03e774) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,string,address)`. + mstore(0x00, 0xef529018) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,string,bool)`. + mstore(0x00, 0xeb928d7f) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,string,uint256)`. + mstore(0x00, 0x2c1d0746) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,bool,string,string)`. + mstore(0x00, 0x68c8b8bd) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,address,address)`. + mstore(0x00, 0x56a5d1b1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,address,bool)`. + mstore(0x00, 0x15cac476) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,address,uint256)`. + mstore(0x00, 0x88f6e4b2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,address,string)`. + mstore(0x00, 0x6cde40b8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,bool,address)`. + mstore(0x00, 0x9a816a83) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,bool,bool)`. + mstore(0x00, 0xab085ae6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,bool,uint256)`. + mstore(0x00, 0xeb7f6fd2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,bool,string)`. + mstore(0x00, 0xa5b4fc99) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,uint256,address)`. + mstore(0x00, 0xfa8185af) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,uint256,bool)`. + mstore(0x00, 0xc598d185) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,uint256,uint256)`. + mstore(0x00, 0x193fb800) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,uint256,string)`. + mstore(0x00, 0x59cfcbe3) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,string,address)`. + mstore(0x00, 0x42d21db7) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,string,bool)`. + mstore(0x00, 0x7af6ab25) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,string,uint256)`. + mstore(0x00, 0x5da297eb) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,uint256,string,string)`. + mstore(0x00, 0x27d8afd2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,address,address)`. + mstore(0x00, 0x6168ed61) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,address,bool)`. + mstore(0x00, 0x90c30a56) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,address,uint256)`. + mstore(0x00, 0xe8d3018d) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,address,string)`. + mstore(0x00, 0x9c3adfa1) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,bool,address)`. + mstore(0x00, 0xae2ec581) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,bool,bool)`. + mstore(0x00, 0xba535d9c) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,bool,uint256)`. + mstore(0x00, 0xcf009880) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,bool,string)`. + mstore(0x00, 0xd2d423cd) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,uint256,address)`. + mstore(0x00, 0x3b2279b4) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,uint256,bool)`. + mstore(0x00, 0x691a8f74) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,uint256,uint256)`. + mstore(0x00, 0x82c25b74) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,uint256,string)`. + mstore(0x00, 0xb7b914ca) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,string,address)`. + mstore(0x00, 0xd583c602) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,string,bool)`. + mstore(0x00, 0xb3a6b6bd) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,string,uint256)`. + mstore(0x00, 0xb028c9bd) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(uint256,string,string,string)`. + mstore(0x00, 0x21ad0683) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p1) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, address p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,address,address)`. + mstore(0x00, 0xed8f28f6) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,address,bool)`. + mstore(0x00, 0xb59dbd60) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,address,uint256)`. + mstore(0x00, 0x8ef3f399) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,address,string)`. + mstore(0x00, 0x800a1c67) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,bool,address)`. + mstore(0x00, 0x223603bd) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,bool,bool)`. + mstore(0x00, 0x79884c2b) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,bool,uint256)`. + mstore(0x00, 0x3e9f866a) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,bool,string)`. + mstore(0x00, 0x0454c079) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,uint256,address)`. + mstore(0x00, 0x63fb8bc5) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,uint256,bool)`. + mstore(0x00, 0xfc4845f0) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,uint256,uint256)`. + mstore(0x00, 0xf8f51b1e) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,uint256,string)`. + mstore(0x00, 0x5a477632) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,string,address)`. + mstore(0x00, 0xaabc9a31) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,string,bool)`. + mstore(0x00, 0x5f15d28c) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,string,uint256)`. + mstore(0x00, 0x91d1112e) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,address,string,string)`. + mstore(0x00, 0x245986f2) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bool p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,address,address)`. + mstore(0x00, 0x33e9dd1d) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,address,bool)`. + mstore(0x00, 0x958c28c6) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,address,uint256)`. + mstore(0x00, 0x5d08bb05) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,address,string)`. + mstore(0x00, 0x2d8e33a4) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,bool,address)`. + mstore(0x00, 0x7190a529) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,bool,bool)`. + mstore(0x00, 0x895af8c5) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,bool,uint256)`. + mstore(0x00, 0x8e3f78a9) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,bool,string)`. + mstore(0x00, 0x9d22d5dd) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,uint256,address)`. + mstore(0x00, 0x935e09bf) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,uint256,bool)`. + mstore(0x00, 0x8af7cf8a) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,uint256,uint256)`. + mstore(0x00, 0x64b5bb67) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,uint256,string)`. + mstore(0x00, 0x742d6ee7) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,string,address)`. + mstore(0x00, 0xe0625b29) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,string,bool)`. + mstore(0x00, 0x3f8a701d) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,string,uint256)`. + mstore(0x00, 0x24f91465) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,bool,string,string)`. + mstore(0x00, 0xa826caeb) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, uint256 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,address,address)`. + mstore(0x00, 0x5ea2b7ae) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,address,bool)`. + mstore(0x00, 0x82112a42) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,address,uint256)`. + mstore(0x00, 0x4f04fdc6) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,address,string)`. + mstore(0x00, 0x9ffb2f93) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,bool,address)`. + mstore(0x00, 0xe0e95b98) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,bool,bool)`. + mstore(0x00, 0x354c36d6) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,bool,uint256)`. + mstore(0x00, 0xe41b6f6f) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,bool,string)`. + mstore(0x00, 0xabf73a98) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,uint256,address)`. + mstore(0x00, 0xe21de278) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,uint256,bool)`. + mstore(0x00, 0x7626db92) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,uint256,uint256)`. + mstore(0x00, 0xa7a87853) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,uint256,string)`. + mstore(0x00, 0x854b3496) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,string,address)`. + mstore(0x00, 0x7c4632a4) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,string,bool)`. + mstore(0x00, 0x7d24491d) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,string,uint256)`. + mstore(0x00, 0xc67ea9d1) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,uint256,string,string)`. + mstore(0x00, 0x5ab84e1f) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,address,address)`. + mstore(0x00, 0x439c7bef) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,address,bool)`. + mstore(0x00, 0x5ccd4e37) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,address,uint256)`. + mstore(0x00, 0x7cc3c607) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,address,string)`. + mstore(0x00, 0xeb1bff80) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,bool,address)`. + mstore(0x00, 0xc371c7db) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,bool,bool)`. + mstore(0x00, 0x40785869) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,bool,uint256)`. + mstore(0x00, 0xd6aefad2) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,bool,string)`. + mstore(0x00, 0x5e84b0ea) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,uint256,address)`. + mstore(0x00, 0x1023f7b2) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,uint256,bool)`. + mstore(0x00, 0xc3a8a654) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,uint256,uint256)`. + mstore(0x00, 0xf45d7d2c) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,uint256,string)`. + mstore(0x00, 0x5d1a971a) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,string,address)`. + mstore(0x00, 0x6d572f44) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, 0x100) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p2) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,string,bool)`. + mstore(0x00, 0x2c1754ed) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, 0x100) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p2) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,string,uint256)`. + mstore(0x00, 0x8eafb02b) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, 0x100) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p2) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + bytes32 m11; + bytes32 m12; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + m11 := mload(0x160) + m12 := mload(0x180) + // Selector of `log(string,string,string,string)`. + mstore(0x00, 0xde68f20a) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, 0x100) + mstore(0x80, 0x140) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p2) + writeString(0x160, p3) + } + _sendLogPayload(0x1c, 0x184); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + mstore(0x160, m11) + mstore(0x180, m12) + } + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdAssertions.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdAssertions.t.sol new file mode 100644 index 000000000..ea794687c --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/StdAssertions.t.sol @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/StdAssertions.sol"; +import {Vm} from "../src/Vm.sol"; + +interface VmInternal is Vm { + function _expectCheatcodeRevert(bytes memory message) external; +} + +contract StdAssertionsTest is StdAssertions { + string constant errorMessage = "User provided message"; + uint256 constant maxDecimals = 77; + + bool constant SHOULD_REVERT = true; + bool constant SHOULD_RETURN = false; + + bool constant STRICT_REVERT_DATA = true; + bool constant NON_STRICT_REVERT_DATA = false; + + VmInternal constant vm = VmInternal(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function testFuzz_AssertEqCall_Return_Pass( + bytes memory callDataA, + bytes memory callDataB, + bytes memory returnData, + bool strictRevertData + ) external { + address targetA = address(new TestMockCall(returnData, SHOULD_RETURN)); + address targetB = address(new TestMockCall(returnData, SHOULD_RETURN)); + + assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData); + } + + function testFuzz_RevertWhenCalled_AssertEqCall_Return_Fail( + bytes memory callDataA, + bytes memory callDataB, + bytes memory returnDataA, + bytes memory returnDataB, + bool strictRevertData + ) external { + vm.assume(keccak256(returnDataA) != keccak256(returnDataB)); + + address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN)); + address targetB = address(new TestMockCall(returnDataB, SHOULD_RETURN)); + + vm._expectCheatcodeRevert( + bytes( + string.concat( + "Call return data does not match: ", vm.toString(returnDataA), " != ", vm.toString(returnDataB) + ) + ) + ); + assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData); + } + + function testFuzz_AssertEqCall_Revert_Pass( + bytes memory callDataA, + bytes memory callDataB, + bytes memory revertDataA, + bytes memory revertDataB + ) external { + address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT)); + address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT)); + + assertEqCall(targetA, callDataA, targetB, callDataB, NON_STRICT_REVERT_DATA); + } + + function testFuzz_RevertWhenCalled_AssertEqCall_Revert_Fail( + bytes memory callDataA, + bytes memory callDataB, + bytes memory revertDataA, + bytes memory revertDataB + ) external { + vm.assume(keccak256(revertDataA) != keccak256(revertDataB)); + + address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT)); + address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT)); + + vm._expectCheatcodeRevert( + bytes( + string.concat( + "Call revert data does not match: ", vm.toString(revertDataA), " != ", vm.toString(revertDataB) + ) + ) + ); + assertEqCall(targetA, callDataA, targetB, callDataB, STRICT_REVERT_DATA); + } + + function testFuzz_RevertWhenCalled_AssertEqCall_Fail( + bytes memory callDataA, + bytes memory callDataB, + bytes memory returnDataA, + bytes memory returnDataB, + bool strictRevertData + ) external { + address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN)); + address targetB = address(new TestMockCall(returnDataB, SHOULD_REVERT)); + + vm.expectRevert(bytes("assertion failed")); + this.assertEqCallExternal(targetA, callDataA, targetB, callDataB, strictRevertData); + + vm.expectRevert(bytes("assertion failed")); + this.assertEqCallExternal(targetB, callDataB, targetA, callDataA, strictRevertData); + } + + // Helper function to test outcome of assertEqCall via `expect` cheatcodes + function assertEqCallExternal( + address targetA, + bytes memory callDataA, + address targetB, + bytes memory callDataB, + bool strictRevertData + ) public { + assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData); + } + + function testFailFail() public { + fail(); + } +} + +contract TestMockCall { + bytes returnData; + bool shouldRevert; + + constructor(bytes memory returnData_, bool shouldRevert_) { + returnData = returnData_; + shouldRevert = shouldRevert_; + } + + fallback() external payable { + bytes memory returnData_ = returnData; + + if (shouldRevert) { + assembly { + revert(add(returnData_, 0x20), mload(returnData_)) + } + } else { + assembly { + return(add(returnData_, 0x20), mload(returnData_)) + } + } + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdChains.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdChains.t.sol new file mode 100644 index 000000000..09059c233 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/StdChains.t.sol @@ -0,0 +1,226 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/Test.sol"; + +contract StdChainsMock is Test { + function exposed_getChain(string memory chainAlias) public returns (Chain memory) { + return getChain(chainAlias); + } + + function exposed_getChain(uint256 chainId) public returns (Chain memory) { + return getChain(chainId); + } + + function exposed_setChain(string memory chainAlias, ChainData memory chainData) public { + setChain(chainAlias, chainData); + } + + function exposed_setFallbackToDefaultRpcUrls(bool useDefault) public { + setFallbackToDefaultRpcUrls(useDefault); + } +} + +contract StdChainsTest is Test { + function test_ChainRpcInitialization() public { + // RPCs specified in `foundry.toml` should be updated. + assertEq(getChain(1).rpcUrl, "https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX"); + assertEq(getChain("optimism_sepolia").rpcUrl, "https://sepolia.optimism.io/"); + assertEq(getChain("arbitrum_one_sepolia").rpcUrl, "https://sepolia-rollup.arbitrum.io/rpc/"); + + // Environment variables should be the next fallback + assertEq(getChain("arbitrum_nova").rpcUrl, "https://nova.arbitrum.io/rpc"); + vm.setEnv("ARBITRUM_NOVA_RPC_URL", "myoverride"); + assertEq(getChain("arbitrum_nova").rpcUrl, "myoverride"); + vm.setEnv("ARBITRUM_NOVA_RPC_URL", "https://nova.arbitrum.io/rpc"); + + // Cannot override RPCs defined in `foundry.toml` + vm.setEnv("MAINNET_RPC_URL", "myoverride2"); + assertEq(getChain("mainnet").rpcUrl, "https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX"); + + // Other RPCs should remain unchanged. + assertEq(getChain(31337).rpcUrl, "http://127.0.0.1:8545"); + assertEq(getChain("sepolia").rpcUrl, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001"); + } + + // Named with a leading underscore to clarify this is not intended to be run as a normal test, + // and is intended to be used in the below `test_Rpcs` test. + function _testRpc(string memory rpcAlias) internal { + string memory rpcUrl = getChain(rpcAlias).rpcUrl; + vm.createSelectFork(rpcUrl); + } + + // Ensure we can connect to the default RPC URL for each chain. + // Currently commented out since this is slow and public RPCs are flaky, often resulting in failing CI. + // function test_Rpcs() public { + // _testRpc("mainnet"); + // _testRpc("sepolia"); + // _testRpc("holesky"); + // _testRpc("optimism"); + // _testRpc("optimism_sepolia"); + // _testRpc("arbitrum_one"); + // _testRpc("arbitrum_one_sepolia"); + // _testRpc("arbitrum_nova"); + // _testRpc("polygon"); + // _testRpc("polygon_amoy"); + // _testRpc("avalanche"); + // _testRpc("avalanche_fuji"); + // _testRpc("bnb_smart_chain"); + // _testRpc("bnb_smart_chain_testnet"); + // _testRpc("gnosis_chain"); + // _testRpc("moonbeam"); + // _testRpc("moonriver"); + // _testRpc("moonbase"); + // _testRpc("base_sepolia"); + // _testRpc("base"); + // _testRpc("blast_sepolia"); + // _testRpc("blast"); + // _testRpc("fantom_opera"); + // _testRpc("fantom_opera_testnet"); + // _testRpc("fraxtal"); + // _testRpc("fraxtal_testnet"); + // _testRpc("berachain_bartio_testnet"); + // } + + function test_ChainNoDefault() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains getChain(string): Chain with alias \"does_not_exist\" not found."); + stdChainsMock.exposed_getChain("does_not_exist"); + } + + function test_SetChainFirstFails() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains setChain(string,ChainData): Chain ID 31337 already used by \"anvil\"."); + stdChainsMock.exposed_setChain("anvil2", ChainData("Anvil", 31337, "URL")); + } + + function test_ChainBubbleUp() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + stdChainsMock.exposed_setChain("needs_undefined_env_var", ChainData("", 123456789, "")); + vm.expectRevert( + "Failed to resolve env var `UNDEFINED_RPC_URL_PLACEHOLDER` in `${UNDEFINED_RPC_URL_PLACEHOLDER}`: environment variable not found" + ); + stdChainsMock.exposed_getChain("needs_undefined_env_var"); + } + + function test_CannotSetChain_ChainIdExists() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + stdChainsMock.exposed_setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); + + vm.expectRevert('StdChains setChain(string,ChainData): Chain ID 123456789 already used by "custom_chain".'); + + stdChainsMock.exposed_setChain("another_custom_chain", ChainData("", 123456789, "")); + } + + function test_SetChain() public { + setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); + Chain memory customChain = getChain("custom_chain"); + assertEq(customChain.name, "Custom Chain"); + assertEq(customChain.chainId, 123456789); + assertEq(customChain.chainAlias, "custom_chain"); + assertEq(customChain.rpcUrl, "https://custom.chain/"); + Chain memory chainById = getChain(123456789); + assertEq(chainById.name, customChain.name); + assertEq(chainById.chainId, customChain.chainId); + assertEq(chainById.chainAlias, customChain.chainAlias); + assertEq(chainById.rpcUrl, customChain.rpcUrl); + customChain.name = "Another Custom Chain"; + customChain.chainId = 987654321; + setChain("another_custom_chain", customChain); + Chain memory anotherCustomChain = getChain("another_custom_chain"); + assertEq(anotherCustomChain.name, "Another Custom Chain"); + assertEq(anotherCustomChain.chainId, 987654321); + assertEq(anotherCustomChain.chainAlias, "another_custom_chain"); + assertEq(anotherCustomChain.rpcUrl, "https://custom.chain/"); + // Verify the first chain data was not overwritten + chainById = getChain(123456789); + assertEq(chainById.name, "Custom Chain"); + assertEq(chainById.chainId, 123456789); + } + + function test_SetNoEmptyAlias() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains setChain(string,ChainData): Chain alias cannot be the empty string."); + stdChainsMock.exposed_setChain("", ChainData("", 123456789, "")); + } + + function test_SetNoChainId0() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains setChain(string,ChainData): Chain ID cannot be 0."); + stdChainsMock.exposed_setChain("alias", ChainData("", 0, "")); + } + + function test_GetNoChainId0() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains getChain(uint256): Chain ID cannot be 0."); + stdChainsMock.exposed_getChain(0); + } + + function test_GetNoEmptyAlias() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains getChain(string): Chain alias cannot be the empty string."); + stdChainsMock.exposed_getChain(""); + } + + function test_ChainIdNotFound() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains getChain(string): Chain with alias \"no_such_alias\" not found."); + stdChainsMock.exposed_getChain("no_such_alias"); + } + + function test_ChainAliasNotFound() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains getChain(uint256): Chain with ID 321 not found."); + + stdChainsMock.exposed_getChain(321); + } + + function test_SetChain_ExistingOne() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); + assertEq(getChain(123456789).chainId, 123456789); + + setChain("custom_chain", ChainData("Modified Chain", 999999999, "https://modified.chain/")); + vm.expectRevert("StdChains getChain(uint256): Chain with ID 123456789 not found."); + stdChainsMock.exposed_getChain(123456789); + + Chain memory modifiedChain = getChain(999999999); + assertEq(modifiedChain.name, "Modified Chain"); + assertEq(modifiedChain.chainId, 999999999); + assertEq(modifiedChain.rpcUrl, "https://modified.chain/"); + } + + function test_DontUseDefaultRpcUrl() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + // Should error if default RPCs flag is set to false. + stdChainsMock.exposed_setFallbackToDefaultRpcUrls(false); + vm.expectRevert(); + stdChainsMock.exposed_getChain(31337); + vm.expectRevert(); + stdChainsMock.exposed_getChain("sepolia"); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdCheats.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdCheats.t.sol new file mode 100644 index 000000000..7bac4286f --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/StdCheats.t.sol @@ -0,0 +1,618 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/StdCheats.sol"; +import "../src/Test.sol"; +import "../src/StdJson.sol"; +import "../src/StdToml.sol"; +import "../src/interfaces/IERC20.sol"; + +contract StdCheatsTest is Test { + Bar test; + + using stdJson for string; + + function setUp() public { + test = new Bar(); + } + + function test_Skip() public { + vm.warp(100); + skip(25); + assertEq(block.timestamp, 125); + } + + function test_Rewind() public { + vm.warp(100); + rewind(25); + assertEq(block.timestamp, 75); + } + + function test_Hoax() public { + hoax(address(1337)); + test.bar{value: 100}(address(1337)); + } + + function test_HoaxOrigin() public { + hoax(address(1337), address(1337)); + test.origin{value: 100}(address(1337)); + } + + function test_HoaxDifferentAddresses() public { + hoax(address(1337), address(7331)); + test.origin{value: 100}(address(1337), address(7331)); + } + + function test_StartHoax() public { + startHoax(address(1337)); + test.bar{value: 100}(address(1337)); + test.bar{value: 100}(address(1337)); + vm.stopPrank(); + test.bar(address(this)); + } + + function test_StartHoaxOrigin() public { + startHoax(address(1337), address(1337)); + test.origin{value: 100}(address(1337)); + test.origin{value: 100}(address(1337)); + vm.stopPrank(); + test.bar(address(this)); + } + + function test_ChangePrankMsgSender() public { + vm.startPrank(address(1337)); + test.bar(address(1337)); + changePrank(address(0xdead)); + test.bar(address(0xdead)); + changePrank(address(1337)); + test.bar(address(1337)); + vm.stopPrank(); + } + + function test_ChangePrankMsgSenderAndTxOrigin() public { + vm.startPrank(address(1337), address(1338)); + test.origin(address(1337), address(1338)); + changePrank(address(0xdead), address(0xbeef)); + test.origin(address(0xdead), address(0xbeef)); + changePrank(address(1337), address(1338)); + test.origin(address(1337), address(1338)); + vm.stopPrank(); + } + + function test_MakeAccountEquivalence() public { + Account memory account = makeAccount("1337"); + (address addr, uint256 key) = makeAddrAndKey("1337"); + assertEq(account.addr, addr); + assertEq(account.key, key); + } + + function test_MakeAddrEquivalence() public { + (address addr,) = makeAddrAndKey("1337"); + assertEq(makeAddr("1337"), addr); + } + + function test_MakeAddrSigning() public { + (address addr, uint256 key) = makeAddrAndKey("1337"); + bytes32 hash = keccak256("some_message"); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(key, hash); + assertEq(ecrecover(hash, v, r, s), addr); + } + + function test_Deal() public { + deal(address(this), 1 ether); + assertEq(address(this).balance, 1 ether); + } + + function test_DealToken() public { + Bar barToken = new Bar(); + address bar = address(barToken); + deal(bar, address(this), 10000e18); + assertEq(barToken.balanceOf(address(this)), 10000e18); + } + + function test_DealTokenAdjustTotalSupply() public { + Bar barToken = new Bar(); + address bar = address(barToken); + deal(bar, address(this), 10000e18, true); + assertEq(barToken.balanceOf(address(this)), 10000e18); + assertEq(barToken.totalSupply(), 20000e18); + deal(bar, address(this), 0, true); + assertEq(barToken.balanceOf(address(this)), 0); + assertEq(barToken.totalSupply(), 10000e18); + } + + function test_DealERC1155Token() public { + BarERC1155 barToken = new BarERC1155(); + address bar = address(barToken); + dealERC1155(bar, address(this), 0, 10000e18, false); + assertEq(barToken.balanceOf(address(this), 0), 10000e18); + } + + function test_DealERC1155TokenAdjustTotalSupply() public { + BarERC1155 barToken = new BarERC1155(); + address bar = address(barToken); + dealERC1155(bar, address(this), 0, 10000e18, true); + assertEq(barToken.balanceOf(address(this), 0), 10000e18); + assertEq(barToken.totalSupply(0), 20000e18); + dealERC1155(bar, address(this), 0, 0, true); + assertEq(barToken.balanceOf(address(this), 0), 0); + assertEq(barToken.totalSupply(0), 10000e18); + } + + function test_DealERC721Token() public { + BarERC721 barToken = new BarERC721(); + address bar = address(barToken); + dealERC721(bar, address(2), 1); + assertEq(barToken.balanceOf(address(2)), 1); + assertEq(barToken.balanceOf(address(1)), 0); + dealERC721(bar, address(1), 2); + assertEq(barToken.balanceOf(address(1)), 1); + assertEq(barToken.balanceOf(bar), 1); + } + + function test_DeployCode() public { + address deployed = deployCode("StdCheats.t.sol:Bar", bytes("")); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + } + + function test_DestroyAccount() public { + // deploy something to destroy it + BarERC721 barToken = new BarERC721(); + address bar = address(barToken); + vm.setNonce(bar, 10); + deal(bar, 100); + + uint256 prevThisBalance = address(this).balance; + uint256 size; + assembly { + size := extcodesize(bar) + } + + assertGt(size, 0); + assertEq(bar.balance, 100); + assertEq(vm.getNonce(bar), 10); + + destroyAccount(bar, address(this)); + assembly { + size := extcodesize(bar) + } + assertEq(address(this).balance, prevThisBalance + 100); + assertEq(vm.getNonce(bar), 0); + assertEq(size, 0); + assertEq(bar.balance, 0); + } + + function test_DeployCodeNoArgs() public { + address deployed = deployCode("StdCheats.t.sol:Bar"); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + } + + function test_DeployCodeVal() public { + address deployed = deployCode("StdCheats.t.sol:Bar", bytes(""), 1 ether); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + assertEq(deployed.balance, 1 ether); + } + + function test_DeployCodeValNoArgs() public { + address deployed = deployCode("StdCheats.t.sol:Bar", 1 ether); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + assertEq(deployed.balance, 1 ether); + } + + // We need this so we can call "this.deployCode" rather than "deployCode" directly + function deployCodeHelper(string memory what) external { + deployCode(what); + } + + function test_DeployCodeFail() public { + vm.expectRevert(bytes("StdCheats deployCode(string): Deployment failed.")); + this.deployCodeHelper("StdCheats.t.sol:RevertingContract"); + } + + function getCode(address who) internal view returns (bytes memory o_code) { + /// @solidity memory-safe-assembly + assembly { + // retrieve the size of the code, this needs assembly + let size := extcodesize(who) + // allocate output byte array - this could also be done without assembly + // by using o_code = new bytes(size) + o_code := mload(0x40) + // new "memory end" including padding + mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f)))) + // store length in memory + mstore(o_code, size) + // actually retrieve the code, this needs assembly + extcodecopy(who, add(o_code, 0x20), 0, size) + } + } + + function test_DeriveRememberKey() public { + string memory mnemonic = "test test test test test test test test test test test junk"; + + (address deployer, uint256 privateKey) = deriveRememberKey(mnemonic, 0); + assertEq(deployer, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266); + assertEq(privateKey, 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80); + } + + function test_BytesToUint() public pure { + assertEq(3, bytesToUint_test(hex"03")); + assertEq(2, bytesToUint_test(hex"02")); + assertEq(255, bytesToUint_test(hex"ff")); + assertEq(29625, bytesToUint_test(hex"73b9")); + } + + function test_ParseJsonTxDetail() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + string memory json = vm.readFile(path); + bytes memory transactionDetails = json.parseRaw(".transactions[0].tx"); + RawTx1559Detail memory rawTxDetail = abi.decode(transactionDetails, (RawTx1559Detail)); + Tx1559Detail memory txDetail = rawToConvertedEIP1559Detail(rawTxDetail); + assertEq(txDetail.from, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266); + assertEq(txDetail.to, 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512); + assertEq( + txDetail.data, + hex"23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004" + ); + assertEq(txDetail.nonce, 3); + assertEq(txDetail.txType, 2); + assertEq(txDetail.gas, 29625); + assertEq(txDetail.value, 0); + } + + function test_ReadEIP1559Transaction() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + uint256 index = 0; + Tx1559 memory transaction = readTx1559(path, index); + transaction; + } + + function test_ReadEIP1559Transactions() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + Tx1559[] memory transactions = readTx1559s(path); + transactions; + } + + function test_ReadReceipt() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + uint256 index = 5; + Receipt memory receipt = readReceipt(path, index); + assertEq( + receipt.logsBloom, + hex"00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100" + ); + } + + function test_ReadReceipts() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + Receipt[] memory receipts = readReceipts(path); + receipts; + } + + function test_GasMeteringModifier() public { + uint256 gas_start_normal = gasleft(); + addInLoop(); + uint256 gas_used_normal = gas_start_normal - gasleft(); + + uint256 gas_start_single = gasleft(); + addInLoopNoGas(); + uint256 gas_used_single = gas_start_single - gasleft(); + + uint256 gas_start_double = gasleft(); + addInLoopNoGasNoGas(); + uint256 gas_used_double = gas_start_double - gasleft(); + + assertTrue(gas_used_double + gas_used_single < gas_used_normal); + } + + function addInLoop() internal pure returns (uint256) { + uint256 b; + for (uint256 i; i < 10000; i++) { + b += i; + } + return b; + } + + function addInLoopNoGas() internal noGasMetering returns (uint256) { + return addInLoop(); + } + + function addInLoopNoGasNoGas() internal noGasMetering returns (uint256) { + return addInLoopNoGas(); + } + + function bytesToUint_test(bytes memory b) private pure returns (uint256) { + uint256 number; + for (uint256 i = 0; i < b.length; i++) { + number = number + uint256(uint8(b[i])) * (2 ** (8 * (b.length - (i + 1)))); + } + return number; + } + + function testFuzz_AssumeAddressIsNot(address addr) external { + // skip over Payable and NonPayable enums + for (uint8 i = 2; i < uint8(type(AddressType).max); i++) { + assumeAddressIsNot(addr, AddressType(i)); + } + assertTrue(addr != address(0)); + assertTrue(addr < address(1) || addr > address(9)); + assertTrue(addr != address(vm) || addr != 0x000000000000000000636F6e736F6c652e6c6f67); + } + + function test_AssumePayable() external { + // We deploy a mock version so we can properly test the revert. + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + + // all should revert since these addresses are not payable + + // VM address + vm.expectRevert(); + stdCheatsMock.exposed_assumePayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D); + + // Console address + vm.expectRevert(); + stdCheatsMock.exposed_assumePayable(0x000000000000000000636F6e736F6c652e6c6f67); + + // Create2Deployer + vm.expectRevert(); + stdCheatsMock.exposed_assumePayable(0x4e59b44847b379578588920cA78FbF26c0B4956C); + + // all should pass since these addresses are payable + + // vitalik.eth + stdCheatsMock.exposed_assumePayable(0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045); + + // mock payable contract + MockContractPayable cp = new MockContractPayable(); + stdCheatsMock.exposed_assumePayable(address(cp)); + } + + function test_AssumeNotPayable() external { + // We deploy a mock version so we can properly test the revert. + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + + // all should pass since these addresses are not payable + + // VM address + stdCheatsMock.exposed_assumeNotPayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D); + + // Console address + stdCheatsMock.exposed_assumeNotPayable(0x000000000000000000636F6e736F6c652e6c6f67); + + // Create2Deployer + stdCheatsMock.exposed_assumeNotPayable(0x4e59b44847b379578588920cA78FbF26c0B4956C); + + // all should revert since these addresses are payable + + // vitalik.eth + vm.expectRevert(); + stdCheatsMock.exposed_assumeNotPayable(0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045); + + // mock payable contract + MockContractPayable cp = new MockContractPayable(); + vm.expectRevert(); + stdCheatsMock.exposed_assumeNotPayable(address(cp)); + } + + function testFuzz_AssumeNotPrecompile(address addr) external { + assumeNotPrecompile(addr, getChain("optimism_sepolia").chainId); + assertTrue( + addr < address(1) || (addr > address(9) && addr < address(0x4200000000000000000000000000000000000000)) + || addr > address(0x4200000000000000000000000000000000000800) + ); + } + + function testFuzz_AssumeNotForgeAddress(address addr) external pure { + assumeNotForgeAddress(addr); + assertTrue( + addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67 + && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C + ); + } + + function test_CannotDeployCodeTo() external { + vm.expectRevert("StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode."); + this._revertDeployCodeTo(); + } + + function _revertDeployCodeTo() external { + deployCodeTo("StdCheats.t.sol:RevertingContract", address(0)); + } + + function test_DeployCodeTo() external { + address arbitraryAddress = makeAddr("arbitraryAddress"); + + deployCodeTo( + "StdCheats.t.sol:MockContractWithConstructorArgs", + abi.encode(uint256(6), true, bytes20(arbitraryAddress)), + 1 ether, + arbitraryAddress + ); + + MockContractWithConstructorArgs ct = MockContractWithConstructorArgs(arbitraryAddress); + + assertEq(arbitraryAddress.balance, 1 ether); + assertEq(ct.x(), 6); + assertTrue(ct.y()); + assertEq(ct.z(), bytes20(arbitraryAddress)); + } +} + +contract StdCheatsMock is StdCheats { + function exposed_assumePayable(address addr) external { + assumePayable(addr); + } + + function exposed_assumeNotPayable(address addr) external { + assumeNotPayable(addr); + } + + // We deploy a mock version so we can properly test expected reverts. + function exposed_assumeNotBlacklisted(address token, address addr) external view { + return assumeNotBlacklisted(token, addr); + } +} + +contract StdCheatsForkTest is Test { + address internal constant SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE; + address internal constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; + address internal constant USDC_BLACKLISTED_USER = 0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD; + address internal constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7; + address internal constant USDT_BLACKLISTED_USER = 0x8f8a8F4B54a2aAC7799d7bc81368aC27b852822A; + + function setUp() public { + // All tests of the `assumeNotBlacklisted` method are fork tests using live contracts. + vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900}); + } + + function test_CannotAssumeNoBlacklisted_EOA() external { + // We deploy a mock version so we can properly test the revert. + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + address eoa = vm.addr({privateKey: 1}); + vm.expectRevert("StdCheats assumeNotBlacklisted(address,address): Token address is not a contract."); + stdCheatsMock.exposed_assumeNotBlacklisted(eoa, address(0)); + } + + function testFuzz_AssumeNotBlacklisted_TokenWithoutBlacklist(address addr) external view { + assumeNotBlacklisted(SHIB, addr); + assertTrue(true); + } + + function test_AssumeNoBlacklisted_USDC() external { + // We deploy a mock version so we can properly test the revert. + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + vm.expectRevert(); + stdCheatsMock.exposed_assumeNotBlacklisted(USDC, USDC_BLACKLISTED_USER); + } + + function testFuzz_AssumeNotBlacklisted_USDC(address addr) external view { + assumeNotBlacklisted(USDC, addr); + assertFalse(USDCLike(USDC).isBlacklisted(addr)); + } + + function test_AssumeNoBlacklisted_USDT() external { + // We deploy a mock version so we can properly test the revert. + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + vm.expectRevert(); + stdCheatsMock.exposed_assumeNotBlacklisted(USDT, USDT_BLACKLISTED_USER); + } + + function testFuzz_AssumeNotBlacklisted_USDT(address addr) external view { + assumeNotBlacklisted(USDT, addr); + assertFalse(USDTLike(USDT).isBlackListed(addr)); + } + + function test_dealUSDC() external { + // roll fork to the point when USDC contract updated to store balance in packed slots + vm.rollFork(19279215); + + uint256 balance = 100e6; + deal(USDC, address(this), balance); + assertEq(IERC20(USDC).balanceOf(address(this)), balance); + } +} + +contract Bar { + constructor() payable { + /// `DEAL` STDCHEAT + totalSupply = 10000e18; + balanceOf[address(this)] = totalSupply; + } + + /// `HOAX` and `CHANGEPRANK` STDCHEATS + function bar(address expectedSender) public payable { + require(msg.sender == expectedSender, "!prank"); + } + + function origin(address expectedSender) public payable { + require(msg.sender == expectedSender, "!prank"); + require(tx.origin == expectedSender, "!prank"); + } + + function origin(address expectedSender, address expectedOrigin) public payable { + require(msg.sender == expectedSender, "!prank"); + require(tx.origin == expectedOrigin, "!prank"); + } + + /// `DEAL` STDCHEAT + mapping(address => uint256) public balanceOf; + uint256 public totalSupply; +} + +contract BarERC1155 { + constructor() payable { + /// `DEALERC1155` STDCHEAT + _totalSupply[0] = 10000e18; + _balances[0][address(this)] = _totalSupply[0]; + } + + function balanceOf(address account, uint256 id) public view virtual returns (uint256) { + return _balances[id][account]; + } + + function totalSupply(uint256 id) public view virtual returns (uint256) { + return _totalSupply[id]; + } + + /// `DEALERC1155` STDCHEAT + mapping(uint256 => mapping(address => uint256)) private _balances; + mapping(uint256 => uint256) private _totalSupply; +} + +contract BarERC721 { + constructor() payable { + /// `DEALERC721` STDCHEAT + _owners[1] = address(1); + _balances[address(1)] = 1; + _owners[2] = address(this); + _owners[3] = address(this); + _balances[address(this)] = 2; + } + + function balanceOf(address owner) public view virtual returns (uint256) { + return _balances[owner]; + } + + function ownerOf(uint256 tokenId) public view virtual returns (address) { + address owner = _owners[tokenId]; + return owner; + } + + mapping(uint256 => address) private _owners; + mapping(address => uint256) private _balances; +} + +interface USDCLike { + function isBlacklisted(address) external view returns (bool); +} + +interface USDTLike { + function isBlackListed(address) external view returns (bool); +} + +contract RevertingContract { + constructor() { + revert(); + } +} + +contract MockContractWithConstructorArgs { + uint256 public immutable x; + bool public y; + bytes20 public z; + + constructor(uint256 _x, bool _y, bytes20 _z) payable { + x = _x; + y = _y; + z = _z; + } +} + +contract MockContractPayable { + receive() external payable {} +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdError.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdError.t.sol new file mode 100644 index 000000000..a306eaa78 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/StdError.t.sol @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.0 <0.9.0; + +import "../src/StdError.sol"; +import "../src/Test.sol"; + +contract StdErrorsTest is Test { + ErrorsTest test; + + function setUp() public { + test = new ErrorsTest(); + } + + function test_ExpectAssertion() public { + vm.expectRevert(stdError.assertionError); + test.assertionError(); + } + + function test_ExpectArithmetic() public { + vm.expectRevert(stdError.arithmeticError); + test.arithmeticError(10); + } + + function test_ExpectDiv() public { + vm.expectRevert(stdError.divisionError); + test.divError(0); + } + + function test_ExpectMod() public { + vm.expectRevert(stdError.divisionError); + test.modError(0); + } + + function test_ExpectEnum() public { + vm.expectRevert(stdError.enumConversionError); + test.enumConversion(1); + } + + function test_ExpectEncodeStg() public { + vm.expectRevert(stdError.encodeStorageError); + test.encodeStgError(); + } + + function test_ExpectPop() public { + vm.expectRevert(stdError.popError); + test.pop(); + } + + function test_ExpectOOB() public { + vm.expectRevert(stdError.indexOOBError); + test.indexOOBError(1); + } + + function test_ExpectMem() public { + vm.expectRevert(stdError.memOverflowError); + test.mem(); + } + + function test_ExpectIntern() public { + vm.expectRevert(stdError.zeroVarError); + test.intern(); + } +} + +contract ErrorsTest { + enum T { + T1 + } + + uint256[] public someArr; + bytes someBytes; + + function assertionError() public pure { + assert(false); + } + + function arithmeticError(uint256 a) public pure { + a -= 100; + } + + function divError(uint256 a) public pure { + 100 / a; + } + + function modError(uint256 a) public pure { + 100 % a; + } + + function enumConversion(uint256 a) public pure { + T(a); + } + + function encodeStgError() public { + /// @solidity memory-safe-assembly + assembly { + sstore(someBytes.slot, 1) + } + keccak256(someBytes); + } + + function pop() public { + someArr.pop(); + } + + function indexOOBError(uint256 a) public pure { + uint256[] memory t = new uint256[](0); + t[a]; + } + + function mem() public pure { + uint256 l = 2 ** 256 / 32; + new uint256[](l); + } + + function intern() public returns (uint256) { + function(uint256) internal returns (uint256) x; + x(2); + return 7; + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdJson.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdJson.t.sol new file mode 100644 index 000000000..e32b92ea3 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/StdJson.t.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/Test.sol"; + +contract StdJsonTest is Test { + using stdJson for string; + + string root; + string path; + + function setUp() public { + root = vm.projectRoot(); + path = string.concat(root, "/test/fixtures/test.json"); + } + + struct SimpleJson { + uint256 a; + string b; + } + + struct NestedJson { + uint256 a; + string b; + SimpleJson c; + } + + function test_readJson() public view { + string memory json = vm.readFile(path); + assertEq(json.readUint(".a"), 123); + } + + function test_writeJson() public { + string memory json = "json"; + json.serialize("a", uint256(123)); + string memory semiFinal = json.serialize("b", string("test")); + string memory finalJson = json.serialize("c", semiFinal); + finalJson.write(path); + + string memory json_ = vm.readFile(path); + bytes memory data = json_.parseRaw("$"); + NestedJson memory decodedData = abi.decode(data, (NestedJson)); + + assertEq(decodedData.a, 123); + assertEq(decodedData.b, "test"); + assertEq(decodedData.c.a, 123); + assertEq(decodedData.c.b, "test"); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdMath.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdMath.t.sol new file mode 100644 index 000000000..ed0f9baeb --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/StdMath.t.sol @@ -0,0 +1,212 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.0 <0.9.0; + +import "../src/StdMath.sol"; +import "../src/Test.sol"; + +contract StdMathMock is Test { + function exposed_percentDelta(uint256 a, uint256 b) public pure returns (uint256) { + return stdMath.percentDelta(a, b); + } + + function exposed_percentDelta(int256 a, int256 b) public pure returns (uint256) { + return stdMath.percentDelta(a, b); + } +} + +contract StdMathTest is Test { + function test_GetAbs() external pure { + assertEq(stdMath.abs(-50), 50); + assertEq(stdMath.abs(50), 50); + assertEq(stdMath.abs(-1337), 1337); + assertEq(stdMath.abs(0), 0); + + assertEq(stdMath.abs(type(int256).min), (type(uint256).max >> 1) + 1); + assertEq(stdMath.abs(type(int256).max), (type(uint256).max >> 1)); + } + + function testFuzz_GetAbs(int256 a) external pure { + uint256 manualAbs = getAbs(a); + + uint256 abs = stdMath.abs(a); + + assertEq(abs, manualAbs); + } + + function test_GetDelta_Uint() external pure { + assertEq(stdMath.delta(uint256(0), uint256(0)), 0); + assertEq(stdMath.delta(uint256(0), uint256(1337)), 1337); + assertEq(stdMath.delta(uint256(0), type(uint64).max), type(uint64).max); + assertEq(stdMath.delta(uint256(0), type(uint128).max), type(uint128).max); + assertEq(stdMath.delta(uint256(0), type(uint256).max), type(uint256).max); + + assertEq(stdMath.delta(0, uint256(0)), 0); + assertEq(stdMath.delta(1337, uint256(0)), 1337); + assertEq(stdMath.delta(type(uint64).max, uint256(0)), type(uint64).max); + assertEq(stdMath.delta(type(uint128).max, uint256(0)), type(uint128).max); + assertEq(stdMath.delta(type(uint256).max, uint256(0)), type(uint256).max); + + assertEq(stdMath.delta(1337, uint256(1337)), 0); + assertEq(stdMath.delta(type(uint256).max, type(uint256).max), 0); + assertEq(stdMath.delta(5000, uint256(1250)), 3750); + } + + function testFuzz_GetDelta_Uint(uint256 a, uint256 b) external pure { + uint256 manualDelta; + if (a > b) { + manualDelta = a - b; + } else { + manualDelta = b - a; + } + + uint256 delta = stdMath.delta(a, b); + + assertEq(delta, manualDelta); + } + + function test_GetDelta_Int() external pure { + assertEq(stdMath.delta(int256(0), int256(0)), 0); + assertEq(stdMath.delta(int256(0), int256(1337)), 1337); + assertEq(stdMath.delta(int256(0), type(int64).max), type(uint64).max >> 1); + assertEq(stdMath.delta(int256(0), type(int128).max), type(uint128).max >> 1); + assertEq(stdMath.delta(int256(0), type(int256).max), type(uint256).max >> 1); + + assertEq(stdMath.delta(0, int256(0)), 0); + assertEq(stdMath.delta(1337, int256(0)), 1337); + assertEq(stdMath.delta(type(int64).max, int256(0)), type(uint64).max >> 1); + assertEq(stdMath.delta(type(int128).max, int256(0)), type(uint128).max >> 1); + assertEq(stdMath.delta(type(int256).max, int256(0)), type(uint256).max >> 1); + + assertEq(stdMath.delta(-0, int256(0)), 0); + assertEq(stdMath.delta(-1337, int256(0)), 1337); + assertEq(stdMath.delta(type(int64).min, int256(0)), (type(uint64).max >> 1) + 1); + assertEq(stdMath.delta(type(int128).min, int256(0)), (type(uint128).max >> 1) + 1); + assertEq(stdMath.delta(type(int256).min, int256(0)), (type(uint256).max >> 1) + 1); + + assertEq(stdMath.delta(int256(0), -0), 0); + assertEq(stdMath.delta(int256(0), -1337), 1337); + assertEq(stdMath.delta(int256(0), type(int64).min), (type(uint64).max >> 1) + 1); + assertEq(stdMath.delta(int256(0), type(int128).min), (type(uint128).max >> 1) + 1); + assertEq(stdMath.delta(int256(0), type(int256).min), (type(uint256).max >> 1) + 1); + + assertEq(stdMath.delta(1337, int256(1337)), 0); + assertEq(stdMath.delta(type(int256).max, type(int256).max), 0); + assertEq(stdMath.delta(type(int256).min, type(int256).min), 0); + assertEq(stdMath.delta(type(int256).min, type(int256).max), type(uint256).max); + assertEq(stdMath.delta(5000, int256(1250)), 3750); + } + + function testFuzz_GetDelta_Int(int256 a, int256 b) external pure { + uint256 absA = getAbs(a); + uint256 absB = getAbs(b); + uint256 absDelta = absA > absB ? absA - absB : absB - absA; + + uint256 manualDelta; + if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) { + manualDelta = absDelta; + } + // (a < 0 && b >= 0) || (a >= 0 && b < 0) + else { + manualDelta = absA + absB; + } + + uint256 delta = stdMath.delta(a, b); + + assertEq(delta, manualDelta); + } + + function test_GetPercentDelta_Uint() external { + StdMathMock stdMathMock = new StdMathMock(); + + assertEq(stdMath.percentDelta(uint256(0), uint256(1337)), 1e18); + assertEq(stdMath.percentDelta(uint256(0), type(uint64).max), 1e18); + assertEq(stdMath.percentDelta(uint256(0), type(uint128).max), 1e18); + assertEq(stdMath.percentDelta(uint256(0), type(uint192).max), 1e18); + + assertEq(stdMath.percentDelta(1337, uint256(1337)), 0); + assertEq(stdMath.percentDelta(type(uint192).max, type(uint192).max), 0); + assertEq(stdMath.percentDelta(0, uint256(2500)), 1e18); + assertEq(stdMath.percentDelta(2500, uint256(2500)), 0); + assertEq(stdMath.percentDelta(5000, uint256(2500)), 1e18); + assertEq(stdMath.percentDelta(7500, uint256(2500)), 2e18); + + vm.expectRevert(stdError.divisionError); + stdMathMock.exposed_percentDelta(uint256(1), 0); + } + + function testFuzz_GetPercentDelta_Uint(uint192 a, uint192 b) external pure { + vm.assume(b != 0); + uint256 manualDelta; + if (a > b) { + manualDelta = a - b; + } else { + manualDelta = b - a; + } + + uint256 manualPercentDelta = manualDelta * 1e18 / b; + uint256 percentDelta = stdMath.percentDelta(a, b); + + assertEq(percentDelta, manualPercentDelta); + } + + function test_GetPercentDelta_Int() external { + // We deploy a mock version so we can properly test the revert. + StdMathMock stdMathMock = new StdMathMock(); + + assertEq(stdMath.percentDelta(int256(0), int256(1337)), 1e18); + assertEq(stdMath.percentDelta(int256(0), -1337), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int64).min), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int128).min), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int192).min), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int64).max), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int128).max), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int192).max), 1e18); + + assertEq(stdMath.percentDelta(1337, int256(1337)), 0); + assertEq(stdMath.percentDelta(type(int192).max, type(int192).max), 0); + assertEq(stdMath.percentDelta(type(int192).min, type(int192).min), 0); + + assertEq(stdMath.percentDelta(type(int192).min, type(int192).max), 2e18); // rounds the 1 wei diff down + assertEq(stdMath.percentDelta(type(int192).max, type(int192).min), 2e18 - 1); // rounds the 1 wei diff down + assertEq(stdMath.percentDelta(0, int256(2500)), 1e18); + assertEq(stdMath.percentDelta(2500, int256(2500)), 0); + assertEq(stdMath.percentDelta(5000, int256(2500)), 1e18); + assertEq(stdMath.percentDelta(7500, int256(2500)), 2e18); + + vm.expectRevert(stdError.divisionError); + stdMathMock.exposed_percentDelta(int256(1), 0); + } + + function testFuzz_GetPercentDelta_Int(int192 a, int192 b) external pure { + vm.assume(b != 0); + uint256 absA = getAbs(a); + uint256 absB = getAbs(b); + uint256 absDelta = absA > absB ? absA - absB : absB - absA; + + uint256 manualDelta; + if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) { + manualDelta = absDelta; + } + // (a < 0 && b >= 0) || (a >= 0 && b < 0) + else { + manualDelta = absA + absB; + } + + uint256 manualPercentDelta = manualDelta * 1e18 / absB; + uint256 percentDelta = stdMath.percentDelta(a, b); + + assertEq(percentDelta, manualPercentDelta); + } + + /*////////////////////////////////////////////////////////////////////////// + HELPERS + //////////////////////////////////////////////////////////////////////////*/ + + function getAbs(int256 a) private pure returns (uint256) { + if (a < 0) { + return a == type(int256).min ? uint256(type(int256).max) + 1 : uint256(-a); + } + + return uint256(a); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdStorage.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdStorage.t.sol new file mode 100644 index 000000000..e1e6aa0d0 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/StdStorage.t.sol @@ -0,0 +1,463 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/StdStorage.sol"; +import "../src/Test.sol"; + +contract StdStorageTest is Test { + using stdStorage for StdStorage; + + StorageTest internal test; + + function setUp() public { + test = new StorageTest(); + } + + function test_StorageHidden() public { + assertEq(uint256(keccak256("my.random.var")), stdstore.target(address(test)).sig("hidden()").find()); + } + + function test_StorageObvious() public { + assertEq(uint256(0), stdstore.target(address(test)).sig("exists()").find()); + } + + function test_StorageExtraSload() public { + assertEq(16, stdstore.target(address(test)).sig(test.extra_sload.selector).find()); + } + + function test_StorageCheckedWriteHidden() public { + stdstore.target(address(test)).sig(test.hidden.selector).checked_write(100); + assertEq(uint256(test.hidden()), 100); + } + + function test_StorageCheckedWriteObvious() public { + stdstore.target(address(test)).sig(test.exists.selector).checked_write(100); + assertEq(test.exists(), 100); + } + + function test_StorageCheckedWriteSignedIntegerHidden() public { + stdstore.target(address(test)).sig(test.hidden.selector).checked_write_int(-100); + assertEq(int256(uint256(test.hidden())), -100); + } + + function test_StorageCheckedWriteSignedIntegerObvious() public { + stdstore.target(address(test)).sig(test.tG.selector).checked_write_int(-100); + assertEq(test.tG(), -100); + } + + function test_StorageMapStructA() public { + uint256 slot = + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).find(); + assertEq(uint256(keccak256(abi.encode(address(this), 4))), slot); + } + + function test_StorageMapStructB() public { + uint256 slot = + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).find(); + assertEq(uint256(keccak256(abi.encode(address(this), 4))) + 1, slot); + } + + function test_StorageDeepMap() public { + uint256 slot = stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key( + address(this) + ).find(); + assertEq(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(5)))))), slot); + } + + function test_StorageCheckedWriteDeepMap() public { + stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key(address(this)) + .checked_write(100); + assertEq(100, test.deep_map(address(this), address(this))); + } + + function test_StorageDeepMapStructA() public { + uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)) + .with_key(address(this)).depth(0).find(); + assertEq( + bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 0), + bytes32(slot) + ); + } + + function test_StorageDeepMapStructB() public { + uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)) + .with_key(address(this)).depth(1).find(); + assertEq( + bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 1), + bytes32(slot) + ); + } + + function test_StorageCheckedWriteDeepMapStructA() public { + stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key( + address(this) + ).depth(0).checked_write(100); + (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this)); + assertEq(100, a); + assertEq(0, b); + } + + function test_StorageCheckedWriteDeepMapStructB() public { + stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key( + address(this) + ).depth(1).checked_write(100); + (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this)); + assertEq(0, a); + assertEq(100, b); + } + + function test_StorageCheckedWriteMapStructA() public { + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).checked_write(100); + (uint256 a, uint256 b) = test.map_struct(address(this)); + assertEq(a, 100); + assertEq(b, 0); + } + + function test_StorageCheckedWriteMapStructB() public { + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).checked_write(100); + (uint256 a, uint256 b) = test.map_struct(address(this)); + assertEq(a, 0); + assertEq(b, 100); + } + + function test_StorageStructA() public { + uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(0).find(); + assertEq(uint256(7), slot); + } + + function test_StorageStructB() public { + uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(1).find(); + assertEq(uint256(7) + 1, slot); + } + + function test_StorageCheckedWriteStructA() public { + stdstore.target(address(test)).sig(test.basic.selector).depth(0).checked_write(100); + (uint256 a, uint256 b) = test.basic(); + assertEq(a, 100); + assertEq(b, 1337); + } + + function test_StorageCheckedWriteStructB() public { + stdstore.target(address(test)).sig(test.basic.selector).depth(1).checked_write(100); + (uint256 a, uint256 b) = test.basic(); + assertEq(a, 1337); + assertEq(b, 100); + } + + function test_StorageMapAddrFound() public { + uint256 slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).find(); + assertEq(uint256(keccak256(abi.encode(address(this), uint256(1)))), slot); + } + + function test_StorageMapAddrRoot() public { + (uint256 slot, bytes32 key) = + stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).parent(); + assertEq(address(uint160(uint256(key))), address(this)); + assertEq(uint256(1), slot); + slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).root(); + assertEq(uint256(1), slot); + } + + function test_StorageMapUintFound() public { + uint256 slot = stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).find(); + assertEq(uint256(keccak256(abi.encode(100, uint256(2)))), slot); + } + + function test_StorageCheckedWriteMapUint() public { + stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).checked_write(100); + assertEq(100, test.map_uint(100)); + } + + function test_StorageCheckedWriteMapAddr() public { + stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).checked_write(100); + assertEq(100, test.map_addr(address(this))); + } + + function test_StorageCheckedWriteMapBool() public { + stdstore.target(address(test)).sig(test.map_bool.selector).with_key(address(this)).checked_write(true); + assertTrue(test.map_bool(address(this))); + } + + function testFuzz_StorageCheckedWriteMapPacked(address addr, uint128 value) public { + stdstore.enable_packed_slots().target(address(test)).sig(test.read_struct_lower.selector).with_key(addr) + .checked_write(value); + assertEq(test.read_struct_lower(addr), value); + + stdstore.enable_packed_slots().target(address(test)).sig(test.read_struct_upper.selector).with_key(addr) + .checked_write(value); + assertEq(test.read_struct_upper(addr), value); + } + + function test_StorageCheckedWriteMapPackedFullSuccess() public { + uint256 full = test.map_packed(address(1337)); + // keep upper 128, set lower 128 to 1337 + full = (full & (uint256((1 << 128) - 1) << 128)) | 1337; + stdstore.target(address(test)).sig(test.map_packed.selector).with_key(address(uint160(1337))).checked_write( + full + ); + assertEq(1337, test.read_struct_lower(address(1337))); + } + + function testFail_StorageConst() public { + // vm.expectRevert(abi.encodeWithSignature("NotStorage(bytes4)", bytes4(keccak256("const()")))); + stdstore.target(address(test)).sig("const()").find(); + } + + function testFuzz_StorageNativePack(uint248 val1, uint248 val2, bool boolVal1, bool boolVal2) public { + stdstore.enable_packed_slots().target(address(test)).sig(test.tA.selector).checked_write(val1); + stdstore.enable_packed_slots().target(address(test)).sig(test.tB.selector).checked_write(boolVal1); + stdstore.enable_packed_slots().target(address(test)).sig(test.tC.selector).checked_write(boolVal2); + stdstore.enable_packed_slots().target(address(test)).sig(test.tD.selector).checked_write(val2); + + assertEq(test.tA(), val1); + assertEq(test.tB(), boolVal1); + assertEq(test.tC(), boolVal2); + assertEq(test.tD(), val2); + } + + function test_StorageReadBytes32() public { + bytes32 val = stdstore.target(address(test)).sig(test.tE.selector).read_bytes32(); + assertEq(val, hex"1337"); + } + + function test_StorageReadBool_False() public { + bool val = stdstore.target(address(test)).sig(test.tB.selector).read_bool(); + assertEq(val, false); + } + + function test_StorageReadBool_True() public { + bool val = stdstore.target(address(test)).sig(test.tH.selector).read_bool(); + assertEq(val, true); + } + + function test_StorageReadBool_Revert() public { + vm.expectRevert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool."); + this.readNonBoolValue(); + } + + function readNonBoolValue() public { + stdstore.target(address(test)).sig(test.tE.selector).read_bool(); + } + + function test_StorageReadAddress() public { + address val = stdstore.target(address(test)).sig(test.tF.selector).read_address(); + assertEq(val, address(1337)); + } + + function test_StorageReadUint() public { + uint256 val = stdstore.target(address(test)).sig(test.exists.selector).read_uint(); + assertEq(val, 1); + } + + function test_StorageReadInt() public { + int256 val = stdstore.target(address(test)).sig(test.tG.selector).read_int(); + assertEq(val, type(int256).min); + } + + function testFuzzPacked(uint256 val, uint8 elemToGet) public { + // This function tries an assortment of packed slots, shifts meaning number of elements + // that are packed. Shiftsizes are the size of each element, i.e. 8 means a data type that is 8 bits, 16 == 16 bits, etc. + // Combined, these determine how a slot is packed. Making it random is too hard to avoid global rejection limit + // and make it performant. + + // change the number of shifts + for (uint256 i = 1; i < 5; i++) { + uint256 shifts = i; + + elemToGet = uint8(bound(elemToGet, 0, shifts - 1)); + + uint256[] memory shiftSizes = new uint256[](shifts); + for (uint256 j; j < shifts; j++) { + shiftSizes[j] = 8 * (j + 1); + } + + test.setRandomPacking(val); + + uint256 leftBits; + uint256 rightBits; + for (uint256 j; j < shiftSizes.length; j++) { + if (j < elemToGet) { + leftBits += shiftSizes[j]; + } else if (elemToGet != j) { + rightBits += shiftSizes[j]; + } + } + + // we may have some right bits unaccounted for + leftBits += 256 - (leftBits + shiftSizes[elemToGet] + rightBits); + // clear left bits, then clear right bits and realign + uint256 expectedValToRead = (val << leftBits) >> (leftBits + rightBits); + + uint256 readVal = stdstore.target(address(test)).enable_packed_slots().sig( + "getRandomPacked(uint8,uint8[],uint8)" + ).with_calldata(abi.encode(shifts, shiftSizes, elemToGet)).read_uint(); + + assertEq(readVal, expectedValToRead); + } + } + + function testFuzzPacked2(uint256 nvars, uint256 seed) public { + // Number of random variables to generate. + nvars = bound(nvars, 1, 20); + + // This will decrease as we generate values in the below loop. + uint256 bitsRemaining = 256; + + // Generate a random value and size for each variable. + uint256[] memory vals = new uint256[](nvars); + uint256[] memory sizes = new uint256[](nvars); + uint256[] memory offsets = new uint256[](nvars); + + for (uint256 i = 0; i < nvars; i++) { + // Generate a random value and size. + offsets[i] = i == 0 ? 0 : offsets[i - 1] + sizes[i - 1]; + + uint256 nvarsRemaining = nvars - i; + uint256 maxVarSize = bitsRemaining - nvarsRemaining + 1; + sizes[i] = bound(uint256(keccak256(abi.encodePacked(seed, i + 256))), 1, maxVarSize); + bitsRemaining -= sizes[i]; + + uint256 maxVal; + uint256 varSize = sizes[i]; + assembly { + // mask = (1 << varSize) - 1 + maxVal := sub(shl(varSize, 1), 1) + } + vals[i] = bound(uint256(keccak256(abi.encodePacked(seed, i))), 0, maxVal); + } + + // Pack all values into the slot. + for (uint256 i = 0; i < nvars; i++) { + stdstore.enable_packed_slots().target(address(test)).sig("getRandomPacked(uint256,uint256)").with_key( + sizes[i] + ).with_key(offsets[i]).checked_write(vals[i]); + } + + // Verify the read data matches. + for (uint256 i = 0; i < nvars; i++) { + uint256 readVal = stdstore.enable_packed_slots().target(address(test)).sig( + "getRandomPacked(uint256,uint256)" + ).with_key(sizes[i]).with_key(offsets[i]).read_uint(); + + uint256 retVal = test.getRandomPacked(sizes[i], offsets[i]); + + assertEq(readVal, vals[i]); + assertEq(retVal, vals[i]); + } + } +} + +contract StorageTest { + uint256 public exists = 1; + mapping(address => uint256) public map_addr; + mapping(uint256 => uint256) public map_uint; + mapping(address => uint256) public map_packed; + mapping(address => UnpackedStruct) public map_struct; + mapping(address => mapping(address => uint256)) public deep_map; + mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct; + UnpackedStruct public basic; + + uint248 public tA; + bool public tB; + + bool public tC = false; + uint248 public tD = 1; + + struct UnpackedStruct { + uint256 a; + uint256 b; + } + + mapping(address => bool) public map_bool; + + bytes32 public tE = hex"1337"; + address public tF = address(1337); + int256 public tG = type(int256).min; + bool public tH = true; + bytes32 private tI = ~bytes32(hex"1337"); + + uint256 randomPacking; + + constructor() { + basic = UnpackedStruct({a: 1337, b: 1337}); + + uint256 two = (1 << 128) | 1; + map_packed[msg.sender] = two; + map_packed[address(uint160(1337))] = 1 << 128; + } + + function read_struct_upper(address who) public view returns (uint256) { + return map_packed[who] >> 128; + } + + function read_struct_lower(address who) public view returns (uint256) { + return map_packed[who] & ((1 << 128) - 1); + } + + function hidden() public view returns (bytes32 t) { + bytes32 slot = keccak256("my.random.var"); + /// @solidity memory-safe-assembly + assembly { + t := sload(slot) + } + } + + function const() public pure returns (bytes32 t) { + t = bytes32(hex"1337"); + } + + function extra_sload() public view returns (bytes32 t) { + // trigger read on slot `tE`, and make a staticcall to make sure compiler doesn't optimize this SLOAD away + assembly { + pop(staticcall(gas(), sload(tE.slot), 0, 0, 0, 0)) + } + t = tI; + } + + function setRandomPacking(uint256 val) public { + randomPacking = val; + } + + function _getMask(uint256 size) internal pure returns (uint256 mask) { + assembly { + // mask = (1 << size) - 1 + mask := sub(shl(size, 1), 1) + } + } + + function setRandomPacking(uint256 val, uint256 size, uint256 offset) public { + // Generate mask based on the size of the value + uint256 mask = _getMask(size); + // Zero out all bits for the word we're about to set + uint256 cleanedWord = randomPacking & ~(mask << offset); + // Place val in the correct spot of the cleaned word + randomPacking = cleanedWord | val << offset; + } + + function getRandomPacked(uint256 size, uint256 offset) public view returns (uint256) { + // Generate mask based on the size of the value + uint256 mask = _getMask(size); + // Shift to place the bits in the correct position, and use mask to zero out remaining bits + return (randomPacking >> offset) & mask; + } + + function getRandomPacked(uint8 shifts, uint8[] memory shiftSizes, uint8 elem) public view returns (uint256) { + require(elem < shifts, "!elem"); + uint256 leftBits; + uint256 rightBits; + + for (uint256 i; i < shiftSizes.length; i++) { + if (i < elem) { + leftBits += shiftSizes[i]; + } else if (elem != i) { + rightBits += shiftSizes[i]; + } + } + + // we may have some right bits unaccounted for + leftBits += 256 - (leftBits + shiftSizes[elem] + rightBits); + + // clear left bits, then clear right bits and realign + return (randomPacking << leftBits) >> (leftBits + rightBits); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdStyle.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdStyle.t.sol new file mode 100644 index 000000000..e12c005ff --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/StdStyle.t.sol @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/Test.sol"; + +contract StdStyleTest is Test { + function test_StyleColor() public pure { + console2.log(StdStyle.red("StdStyle.red String Test")); + console2.log(StdStyle.red(uint256(10e18))); + console2.log(StdStyle.red(int256(-10e18))); + console2.log(StdStyle.red(true)); + console2.log(StdStyle.red(address(0))); + console2.log(StdStyle.redBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.redBytes32("StdStyle.redBytes32")); + console2.log(StdStyle.green("StdStyle.green String Test")); + console2.log(StdStyle.green(uint256(10e18))); + console2.log(StdStyle.green(int256(-10e18))); + console2.log(StdStyle.green(true)); + console2.log(StdStyle.green(address(0))); + console2.log(StdStyle.greenBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.greenBytes32("StdStyle.greenBytes32")); + console2.log(StdStyle.yellow("StdStyle.yellow String Test")); + console2.log(StdStyle.yellow(uint256(10e18))); + console2.log(StdStyle.yellow(int256(-10e18))); + console2.log(StdStyle.yellow(true)); + console2.log(StdStyle.yellow(address(0))); + console2.log(StdStyle.yellowBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.yellowBytes32("StdStyle.yellowBytes32")); + console2.log(StdStyle.blue("StdStyle.blue String Test")); + console2.log(StdStyle.blue(uint256(10e18))); + console2.log(StdStyle.blue(int256(-10e18))); + console2.log(StdStyle.blue(true)); + console2.log(StdStyle.blue(address(0))); + console2.log(StdStyle.blueBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.blueBytes32("StdStyle.blueBytes32")); + console2.log(StdStyle.magenta("StdStyle.magenta String Test")); + console2.log(StdStyle.magenta(uint256(10e18))); + console2.log(StdStyle.magenta(int256(-10e18))); + console2.log(StdStyle.magenta(true)); + console2.log(StdStyle.magenta(address(0))); + console2.log(StdStyle.magentaBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.magentaBytes32("StdStyle.magentaBytes32")); + console2.log(StdStyle.cyan("StdStyle.cyan String Test")); + console2.log(StdStyle.cyan(uint256(10e18))); + console2.log(StdStyle.cyan(int256(-10e18))); + console2.log(StdStyle.cyan(true)); + console2.log(StdStyle.cyan(address(0))); + console2.log(StdStyle.cyanBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.cyanBytes32("StdStyle.cyanBytes32")); + } + + function test_StyleFontWeight() public pure { + console2.log(StdStyle.bold("StdStyle.bold String Test")); + console2.log(StdStyle.bold(uint256(10e18))); + console2.log(StdStyle.bold(int256(-10e18))); + console2.log(StdStyle.bold(address(0))); + console2.log(StdStyle.bold(true)); + console2.log(StdStyle.boldBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.boldBytes32("StdStyle.boldBytes32")); + console2.log(StdStyle.dim("StdStyle.dim String Test")); + console2.log(StdStyle.dim(uint256(10e18))); + console2.log(StdStyle.dim(int256(-10e18))); + console2.log(StdStyle.dim(address(0))); + console2.log(StdStyle.dim(true)); + console2.log(StdStyle.dimBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.dimBytes32("StdStyle.dimBytes32")); + console2.log(StdStyle.italic("StdStyle.italic String Test")); + console2.log(StdStyle.italic(uint256(10e18))); + console2.log(StdStyle.italic(int256(-10e18))); + console2.log(StdStyle.italic(address(0))); + console2.log(StdStyle.italic(true)); + console2.log(StdStyle.italicBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.italicBytes32("StdStyle.italicBytes32")); + console2.log(StdStyle.underline("StdStyle.underline String Test")); + console2.log(StdStyle.underline(uint256(10e18))); + console2.log(StdStyle.underline(int256(-10e18))); + console2.log(StdStyle.underline(address(0))); + console2.log(StdStyle.underline(true)); + console2.log(StdStyle.underlineBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.underlineBytes32("StdStyle.underlineBytes32")); + console2.log(StdStyle.inverse("StdStyle.inverse String Test")); + console2.log(StdStyle.inverse(uint256(10e18))); + console2.log(StdStyle.inverse(int256(-10e18))); + console2.log(StdStyle.inverse(address(0))); + console2.log(StdStyle.inverse(true)); + console2.log(StdStyle.inverseBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.inverseBytes32("StdStyle.inverseBytes32")); + } + + function test_StyleCombined() public pure { + console2.log(StdStyle.red(StdStyle.bold("Red Bold String Test"))); + console2.log(StdStyle.green(StdStyle.dim(uint256(10e18)))); + console2.log(StdStyle.yellow(StdStyle.italic(int256(-10e18)))); + console2.log(StdStyle.blue(StdStyle.underline(address(0)))); + console2.log(StdStyle.magenta(StdStyle.inverse(true))); + } + + function test_StyleCustom() public pure { + console2.log(h1("Custom Style 1")); + console2.log(h2("Custom Style 2")); + } + + function h1(string memory a) private pure returns (string memory) { + return StdStyle.cyan(StdStyle.inverse(StdStyle.bold(a))); + } + + function h2(string memory a) private pure returns (string memory) { + return StdStyle.magenta(StdStyle.bold(StdStyle.underline(a))); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdToml.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdToml.t.sol new file mode 100644 index 000000000..631b1b534 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/StdToml.t.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/Test.sol"; + +contract StdTomlTest is Test { + using stdToml for string; + + string root; + string path; + + function setUp() public { + root = vm.projectRoot(); + path = string.concat(root, "/test/fixtures/test.toml"); + } + + struct SimpleToml { + uint256 a; + string b; + } + + struct NestedToml { + uint256 a; + string b; + SimpleToml c; + } + + function test_readToml() public view { + string memory json = vm.readFile(path); + assertEq(json.readUint(".a"), 123); + } + + function test_writeToml() public { + string memory json = "json"; + json.serialize("a", uint256(123)); + string memory semiFinal = json.serialize("b", string("test")); + string memory finalJson = json.serialize("c", semiFinal); + finalJson.write(path); + + string memory toml = vm.readFile(path); + bytes memory data = toml.parseRaw("$"); + NestedToml memory decodedData = abi.decode(data, (NestedToml)); + + assertEq(decodedData.a, 123); + assertEq(decodedData.b, "test"); + assertEq(decodedData.c.a, 123); + assertEq(decodedData.c.b, "test"); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdUtils.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdUtils.t.sol new file mode 100644 index 000000000..4994c6cb0 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/StdUtils.t.sol @@ -0,0 +1,342 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/Test.sol"; + +contract StdUtilsMock is StdUtils { + // We deploy a mock version so we can properly test expected reverts. + function exposed_getTokenBalances(address token, address[] memory addresses) + external + returns (uint256[] memory balances) + { + return getTokenBalances(token, addresses); + } + + function exposed_bound(int256 num, int256 min, int256 max) external pure returns (int256) { + return bound(num, min, max); + } + + function exposed_bound(uint256 num, uint256 min, uint256 max) external pure returns (uint256) { + return bound(num, min, max); + } + + function exposed_bytesToUint(bytes memory b) external pure returns (uint256) { + return bytesToUint(b); + } +} + +contract StdUtilsTest is Test { + /*////////////////////////////////////////////////////////////////////////// + BOUND UINT + //////////////////////////////////////////////////////////////////////////*/ + + function test_Bound() public pure { + assertEq(bound(uint256(5), 0, 4), 0); + assertEq(bound(uint256(0), 69, 69), 69); + assertEq(bound(uint256(0), 68, 69), 68); + assertEq(bound(uint256(10), 150, 190), 174); + assertEq(bound(uint256(300), 2800, 3200), 3107); + assertEq(bound(uint256(9999), 1337, 6666), 4669); + } + + function test_Bound_WithinRange() public pure { + assertEq(bound(uint256(51), 50, 150), 51); + assertEq(bound(uint256(51), 50, 150), bound(bound(uint256(51), 50, 150), 50, 150)); + assertEq(bound(uint256(149), 50, 150), 149); + assertEq(bound(uint256(149), 50, 150), bound(bound(uint256(149), 50, 150), 50, 150)); + } + + function test_Bound_EdgeCoverage() public pure { + assertEq(bound(uint256(0), 50, 150), 50); + assertEq(bound(uint256(1), 50, 150), 51); + assertEq(bound(uint256(2), 50, 150), 52); + assertEq(bound(uint256(3), 50, 150), 53); + assertEq(bound(type(uint256).max, 50, 150), 150); + assertEq(bound(type(uint256).max - 1, 50, 150), 149); + assertEq(bound(type(uint256).max - 2, 50, 150), 148); + assertEq(bound(type(uint256).max - 3, 50, 150), 147); + } + + function test_Bound_DistributionIsEven(uint256 min, uint256 size) public pure { + size = size % 100 + 1; + min = bound(min, UINT256_MAX / 2, UINT256_MAX / 2 + size); + uint256 max = min + size - 1; + uint256 result; + + for (uint256 i = 1; i <= size * 4; ++i) { + // x > max + result = bound(max + i, min, max); + assertEq(result, min + (i - 1) % size); + // x < min + result = bound(min - i, min, max); + assertEq(result, max - (i - 1) % size); + } + } + + function test_Bound(uint256 num, uint256 min, uint256 max) public pure { + if (min > max) (min, max) = (max, min); + + uint256 result = bound(num, min, max); + + assertGe(result, min); + assertLe(result, max); + assertEq(result, bound(result, min, max)); + if (num >= min && num <= max) assertEq(result, num); + } + + function test_BoundUint256Max() public pure { + assertEq(bound(0, type(uint256).max - 1, type(uint256).max), type(uint256).max - 1); + assertEq(bound(1, type(uint256).max - 1, type(uint256).max), type(uint256).max); + } + + function test_CannotBoundMaxLessThanMin() public { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min.")); + stdUtils.exposed_bound(uint256(5), 100, 10); + } + + function test_CannotBoundMaxLessThanMin(uint256 num, uint256 min, uint256 max) public { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + vm.assume(min > max); + vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min.")); + stdUtils.exposed_bound(num, min, max); + } + + /*////////////////////////////////////////////////////////////////////////// + BOUND INT + //////////////////////////////////////////////////////////////////////////*/ + + function test_BoundInt() public pure { + assertEq(bound(-3, 0, 4), 2); + assertEq(bound(0, -69, -69), -69); + assertEq(bound(0, -69, -68), -68); + assertEq(bound(-10, 150, 190), 154); + assertEq(bound(-300, 2800, 3200), 2908); + assertEq(bound(9999, -1337, 6666), 1995); + } + + function test_BoundInt_WithinRange() public pure { + assertEq(bound(51, -50, 150), 51); + assertEq(bound(51, -50, 150), bound(bound(51, -50, 150), -50, 150)); + assertEq(bound(149, -50, 150), 149); + assertEq(bound(149, -50, 150), bound(bound(149, -50, 150), -50, 150)); + } + + function test_BoundInt_EdgeCoverage() public pure { + assertEq(bound(type(int256).min, -50, 150), -50); + assertEq(bound(type(int256).min + 1, -50, 150), -49); + assertEq(bound(type(int256).min + 2, -50, 150), -48); + assertEq(bound(type(int256).min + 3, -50, 150), -47); + assertEq(bound(type(int256).min, 10, 150), 10); + assertEq(bound(type(int256).min + 1, 10, 150), 11); + assertEq(bound(type(int256).min + 2, 10, 150), 12); + assertEq(bound(type(int256).min + 3, 10, 150), 13); + + assertEq(bound(type(int256).max, -50, 150), 150); + assertEq(bound(type(int256).max - 1, -50, 150), 149); + assertEq(bound(type(int256).max - 2, -50, 150), 148); + assertEq(bound(type(int256).max - 3, -50, 150), 147); + assertEq(bound(type(int256).max, -50, -10), -10); + assertEq(bound(type(int256).max - 1, -50, -10), -11); + assertEq(bound(type(int256).max - 2, -50, -10), -12); + assertEq(bound(type(int256).max - 3, -50, -10), -13); + } + + function test_BoundInt_DistributionIsEven(int256 min, uint256 size) public pure { + size = size % 100 + 1; + min = bound(min, -int256(size / 2), int256(size - size / 2)); + int256 max = min + int256(size) - 1; + int256 result; + + for (uint256 i = 1; i <= size * 4; ++i) { + // x > max + result = bound(max + int256(i), min, max); + assertEq(result, min + int256((i - 1) % size)); + // x < min + result = bound(min - int256(i), min, max); + assertEq(result, max - int256((i - 1) % size)); + } + } + + function test_BoundInt(int256 num, int256 min, int256 max) public pure { + if (min > max) (min, max) = (max, min); + + int256 result = bound(num, min, max); + + assertGe(result, min); + assertLe(result, max); + assertEq(result, bound(result, min, max)); + if (num >= min && num <= max) assertEq(result, num); + } + + function test_BoundIntInt256Max() public pure { + assertEq(bound(0, type(int256).max - 1, type(int256).max), type(int256).max - 1); + assertEq(bound(1, type(int256).max - 1, type(int256).max), type(int256).max); + } + + function test_BoundIntInt256Min() public pure { + assertEq(bound(0, type(int256).min, type(int256).min + 1), type(int256).min); + assertEq(bound(1, type(int256).min, type(int256).min + 1), type(int256).min + 1); + } + + function test_CannotBoundIntMaxLessThanMin() public { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min.")); + stdUtils.exposed_bound(-5, 100, 10); + } + + function test_CannotBoundIntMaxLessThanMin(int256 num, int256 min, int256 max) public { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + vm.assume(min > max); + vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min.")); + stdUtils.exposed_bound(num, min, max); + } + + /*////////////////////////////////////////////////////////////////////////// + BOUND PRIVATE KEY + //////////////////////////////////////////////////////////////////////////*/ + + function test_BoundPrivateKey() public pure { + assertEq(boundPrivateKey(0), 1); + assertEq(boundPrivateKey(1), 1); + assertEq(boundPrivateKey(300), 300); + assertEq(boundPrivateKey(9999), 9999); + assertEq(boundPrivateKey(SECP256K1_ORDER - 1), SECP256K1_ORDER - 1); + assertEq(boundPrivateKey(SECP256K1_ORDER), 1); + assertEq(boundPrivateKey(SECP256K1_ORDER + 1), 2); + assertEq(boundPrivateKey(UINT256_MAX), UINT256_MAX & SECP256K1_ORDER - 1); // x&y is equivalent to x-x%y + } + + /*////////////////////////////////////////////////////////////////////////// + BYTES TO UINT + //////////////////////////////////////////////////////////////////////////*/ + + function test_BytesToUint() external pure { + bytes memory maxUint = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bytes memory two = hex"02"; + bytes memory millionEther = hex"d3c21bcecceda1000000"; + + assertEq(bytesToUint(maxUint), type(uint256).max); + assertEq(bytesToUint(two), 2); + assertEq(bytesToUint(millionEther), 1_000_000 ether); + } + + function test_CannotConvertGT32Bytes() external { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + bytes memory thirty3Bytes = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + vm.expectRevert("StdUtils bytesToUint(bytes): Bytes length exceeds 32."); + stdUtils.exposed_bytesToUint(thirty3Bytes); + } + + /*////////////////////////////////////////////////////////////////////////// + COMPUTE CREATE ADDRESS + //////////////////////////////////////////////////////////////////////////*/ + + function test_ComputeCreateAddress() external pure { + address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9; + uint256 nonce = 14; + address createAddress = computeCreateAddress(deployer, nonce); + assertEq(createAddress, 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45); + } + + /*////////////////////////////////////////////////////////////////////////// + COMPUTE CREATE2 ADDRESS + //////////////////////////////////////////////////////////////////////////*/ + + function test_ComputeCreate2Address() external pure { + bytes32 salt = bytes32(uint256(31415)); + bytes32 initcodeHash = keccak256(abi.encode(0x6080)); + address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9; + address create2Address = computeCreate2Address(salt, initcodeHash, deployer); + assertEq(create2Address, 0xB147a5d25748fda14b463EB04B111027C290f4d3); + } + + function test_ComputeCreate2AddressWithDefaultDeployer() external pure { + bytes32 salt = 0xc290c670fde54e5ef686f9132cbc8711e76a98f0333a438a92daa442c71403c0; + bytes32 initcodeHash = hashInitCode(hex"6080", ""); + assertEq(initcodeHash, 0x1a578b7a4b0b5755db6d121b4118d4bc68fe170dca840c59bc922f14175a76b0); + address create2Address = computeCreate2Address(salt, initcodeHash); + assertEq(create2Address, 0xc0ffEe2198a06235aAbFffe5Db0CacF1717f5Ac6); + } +} + +contract StdUtilsForkTest is Test { + /*////////////////////////////////////////////////////////////////////////// + GET TOKEN BALANCES + //////////////////////////////////////////////////////////////////////////*/ + + address internal SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE; + address internal SHIB_HOLDER_0 = 0x855F5981e831D83e6A4b4EBFCAdAa68D92333170; + address internal SHIB_HOLDER_1 = 0x8F509A90c2e47779cA408Fe00d7A72e359229AdA; + address internal SHIB_HOLDER_2 = 0x0e3bbc0D04fF62211F71f3e4C45d82ad76224385; + + address internal USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; + address internal USDC_HOLDER_0 = 0xDa9CE944a37d218c3302F6B82a094844C6ECEb17; + address internal USDC_HOLDER_1 = 0x3e67F4721E6d1c41a015f645eFa37BEd854fcf52; + + function setUp() public { + // All tests of the `getTokenBalances` method are fork tests using live contracts. + vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900}); + } + + function test_CannotGetTokenBalances_NonTokenContract() external { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + // The UniswapV2Factory contract has neither a `balanceOf` function nor a fallback function, + // so the `balanceOf` call should revert. + address token = address(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f); + address[] memory addresses = new address[](1); + addresses[0] = USDC_HOLDER_0; + + vm.expectRevert("Multicall3: call failed"); + stdUtils.exposed_getTokenBalances(token, addresses); + } + + function test_CannotGetTokenBalances_EOA() external { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + address eoa = vm.addr({privateKey: 1}); + address[] memory addresses = new address[](1); + addresses[0] = USDC_HOLDER_0; + vm.expectRevert("StdUtils getTokenBalances(address,address[]): Token address is not a contract."); + stdUtils.exposed_getTokenBalances(eoa, addresses); + } + + function test_GetTokenBalances_Empty() external { + address[] memory addresses = new address[](0); + uint256[] memory balances = getTokenBalances(USDC, addresses); + assertEq(balances.length, 0); + } + + function test_GetTokenBalances_USDC() external { + address[] memory addresses = new address[](2); + addresses[0] = USDC_HOLDER_0; + addresses[1] = USDC_HOLDER_1; + uint256[] memory balances = getTokenBalances(USDC, addresses); + assertEq(balances[0], 159_000_000_000_000); + assertEq(balances[1], 131_350_000_000_000); + } + + function test_GetTokenBalances_SHIB() external { + address[] memory addresses = new address[](3); + addresses[0] = SHIB_HOLDER_0; + addresses[1] = SHIB_HOLDER_1; + addresses[2] = SHIB_HOLDER_2; + uint256[] memory balances = getTokenBalances(SHIB, addresses); + assertEq(balances[0], 3_323_256_285_484.42e18); + assertEq(balances[1], 1_271_702_771_149.99999928e18); + assertEq(balances[2], 606_357_106_247e18); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/Vm.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/Vm.t.sol new file mode 100644 index 000000000..6f380ed02 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/Vm.t.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.0 <0.9.0; + +import {Test} from "../src/Test.sol"; +import {Vm, VmSafe} from "../src/Vm.sol"; + +contract VmTest is Test { + // This test ensures that functions are never accidentally removed from a Vm interface, or + // inadvertently moved between Vm and VmSafe. This test must be updated each time a function is + // added to or removed from Vm or VmSafe. + function test_interfaceId() public pure { + assertEq(type(VmSafe).interfaceId, bytes4(0x1c17c241), "VmSafe"); + assertEq(type(Vm).interfaceId, bytes4(0xb91a22ba), "Vm"); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScript.sol b/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScript.sol new file mode 100644 index 000000000..e205cfff3 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScript.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import "../../src/Script.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationScript is Script {} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol b/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol new file mode 100644 index 000000000..ce8e0e954 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import "../../src/Script.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationScriptBase is ScriptBase {} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTest.sol b/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTest.sol new file mode 100644 index 000000000..9beeafeb7 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTest.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import "../../src/Test.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationTest is Test {} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTestBase.sol b/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTestBase.sol new file mode 100644 index 000000000..e993535bc --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTestBase.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import "../../src/Test.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationTestBase is TestBase {} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/broadcast.log.json b/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/broadcast.log.json new file mode 100644 index 000000000..0a0200bca --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/broadcast.log.json @@ -0,0 +1,187 @@ +{ + "transactions": [ + { + "hash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f", + "type": "CALL", + "contractName": "Test", + "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "function": "multiple_arguments(uint256,address,uint256[]):(uint256)", + "arguments": ["1", "0000000000000000000000000000000000001337", "[3,4]"], + "tx": { + "type": "0x02", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "gas": "0x73b9", + "value": "0x0", + "data": "0x23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004", + "nonce": "0x3", + "accessList": [] + } + }, + { + "hash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298", + "type": "CALL", + "contractName": "Test", + "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "function": "inc():(uint256)", + "arguments": [], + "tx": { + "type": "0x02", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "gas": "0xdcb2", + "value": "0x0", + "data": "0x371303c0", + "nonce": "0x4", + "accessList": [] + } + }, + { + "hash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", + "type": "CALL", + "contractName": "Test", + "contractAddress": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "function": "t(uint256):(uint256)", + "arguments": ["1"], + "tx": { + "type": "0x02", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "gas": "0x8599", + "value": "0x0", + "data": "0xafe29f710000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x5", + "accessList": [] + } + } + ], + "receipts": [ + { + "transactionHash": "0x481dc86e40bba90403c76f8e144aa9ff04c1da2164299d0298573835f0991181", + "transactionIndex": "0x0", + "blockHash": "0xef0730448490304e5403be0fa8f8ce64f118e9adcca60c07a2ae1ab921d748af", + "blockNumber": "0x1", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "cumulativeGasUsed": "0x13f3a", + "gasUsed": "0x13f3a", + "contractAddress": "0x5fbdb2315678afecb367f032d93f642f64180aa3", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0x6a187183545b8a9e7f1790e847139379bf5622baff2cb43acf3f5c79470af782", + "transactionIndex": "0x0", + "blockHash": "0xf3acb96a90071640c2a8c067ae4e16aad87e634ea8d8bbbb5b352fba86ba0148", + "blockNumber": "0x2", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "cumulativeGasUsed": "0x45d80", + "gasUsed": "0x45d80", + "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0x064ad173b4867bdef2fb60060bbdaf01735fbf10414541ea857772974e74ea9d", + "transactionIndex": "0x0", + "blockHash": "0x8373d02109d3ee06a0225f23da4c161c656ccc48fe0fcee931d325508ae73e58", + "blockNumber": "0x3", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "cumulativeGasUsed": "0x45feb", + "gasUsed": "0x45feb", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f", + "transactionIndex": "0x0", + "blockHash": "0x16712fae5c0e18f75045f84363fb6b4d9a9fe25e660c4ce286833a533c97f629", + "blockNumber": "0x4", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "cumulativeGasUsed": "0x5905", + "gasUsed": "0x5905", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298", + "transactionIndex": "0x0", + "blockHash": "0x156b88c3eb9a1244ba00a1834f3f70de735b39e3e59006dd03af4fe7d5480c11", + "blockNumber": "0x5", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "cumulativeGasUsed": "0xa9c4", + "gasUsed": "0xa9c4", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", + "transactionIndex": "0x0", + "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb", + "blockNumber": "0x6", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "cumulativeGasUsed": "0x66c5", + "gasUsed": "0x66c5", + "contractAddress": null, + "logs": [ + { + "address": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "topics": [ + "0x0b2e13ff20ac7b474198655583edf70dedd2c1dc980e329c4fbb2fc0748b796b" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046865726500000000000000000000000000000000000000000000000000000000", + "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb", + "blockNumber": "0x6", + "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", + "transactionIndex": "0x1", + "logIndex": "0x0", + "transactionLogIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0x11fbb10230c168ca1e36a7e5c69a6dbcd04fd9e64ede39d10a83e36ee8065c16", + "transactionIndex": "0x0", + "blockHash": "0xf1e0ed2eda4e923626ec74621006ed50b3fc27580dc7b4cf68a07ca77420e29c", + "blockNumber": "0x7", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x0000000000000000000000000000000000001337", + "cumulativeGasUsed": "0x5208", + "gasUsed": "0x5208", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + } + ], + "libraries": [ + "src/Broadcast.t.sol:F:0x5fbdb2315678afecb367f032d93f642f64180aa3" + ], + "pending": [], + "path": "broadcast/Broadcast.t.sol/31337/run-latest.json", + "returns": {}, + "timestamp": 1655140035 +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.json b/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.json new file mode 100644 index 000000000..caebf6d96 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.json @@ -0,0 +1,8 @@ +{ + "a": 123, + "b": "test", + "c": { + "a": 123, + "b": "test" + } +} \ No newline at end of file diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.toml b/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.toml new file mode 100644 index 000000000..60692bc75 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.toml @@ -0,0 +1,6 @@ +a = 123 +b = "test" + +[c] +a = 123 +b = "test" diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC20.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC20.t.sol new file mode 100644 index 000000000..e24681093 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC20.t.sol @@ -0,0 +1,441 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import {MockERC20} from "../../src/mocks/MockERC20.sol"; +import {StdCheats} from "../../src/StdCheats.sol"; +import {Test} from "../../src/Test.sol"; + +contract Token_ERC20 is MockERC20 { + constructor(string memory name, string memory symbol, uint8 decimals) { + initialize(name, symbol, decimals); + } + + function mint(address to, uint256 value) public virtual { + _mint(to, value); + } + + function burn(address from, uint256 value) public virtual { + _burn(from, value); + } +} + +contract MockERC20Test is StdCheats, Test { + Token_ERC20 token; + + bytes32 constant PERMIT_TYPEHASH = + keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); + + function setUp() public { + token = new Token_ERC20("Token", "TKN", 18); + } + + function invariantMetadata() public view { + assertEq(token.name(), "Token"); + assertEq(token.symbol(), "TKN"); + assertEq(token.decimals(), 18); + } + + function testMint() public { + token.mint(address(0xBEEF), 1e18); + + assertEq(token.totalSupply(), 1e18); + assertEq(token.balanceOf(address(0xBEEF)), 1e18); + } + + function testBurn() public { + token.mint(address(0xBEEF), 1e18); + token.burn(address(0xBEEF), 0.9e18); + + assertEq(token.totalSupply(), 1e18 - 0.9e18); + assertEq(token.balanceOf(address(0xBEEF)), 0.1e18); + } + + function testApprove() public { + assertTrue(token.approve(address(0xBEEF), 1e18)); + + assertEq(token.allowance(address(this), address(0xBEEF)), 1e18); + } + + function testTransfer() public { + token.mint(address(this), 1e18); + + assertTrue(token.transfer(address(0xBEEF), 1e18)); + assertEq(token.totalSupply(), 1e18); + + assertEq(token.balanceOf(address(this)), 0); + assertEq(token.balanceOf(address(0xBEEF)), 1e18); + } + + function testTransferFrom() public { + address from = address(0xABCD); + + token.mint(from, 1e18); + + vm.prank(from); + token.approve(address(this), 1e18); + + assertTrue(token.transferFrom(from, address(0xBEEF), 1e18)); + assertEq(token.totalSupply(), 1e18); + + assertEq(token.allowance(from, address(this)), 0); + + assertEq(token.balanceOf(from), 0); + assertEq(token.balanceOf(address(0xBEEF)), 1e18); + } + + function testInfiniteApproveTransferFrom() public { + address from = address(0xABCD); + + token.mint(from, 1e18); + + vm.prank(from); + token.approve(address(this), type(uint256).max); + + assertTrue(token.transferFrom(from, address(0xBEEF), 1e18)); + assertEq(token.totalSupply(), 1e18); + + assertEq(token.allowance(from, address(this)), type(uint256).max); + + assertEq(token.balanceOf(from), 0); + assertEq(token.balanceOf(address(0xBEEF)), 1e18); + } + + function testPermit() public { + uint256 privateKey = 0xBEEF; + address owner = vm.addr(privateKey); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign( + privateKey, + keccak256( + abi.encodePacked( + "\x19\x01", + token.DOMAIN_SEPARATOR(), + keccak256(abi.encode(PERMIT_TYPEHASH, owner, address(0xCAFE), 1e18, 0, block.timestamp)) + ) + ) + ); + + token.permit(owner, address(0xCAFE), 1e18, block.timestamp, v, r, s); + + assertEq(token.allowance(owner, address(0xCAFE)), 1e18); + assertEq(token.nonces(owner), 1); + } + + function testFailTransferInsufficientBalance() public { + token.mint(address(this), 0.9e18); + token.transfer(address(0xBEEF), 1e18); + } + + function testFailTransferFromInsufficientAllowance() public { + address from = address(0xABCD); + + token.mint(from, 1e18); + + vm.prank(from); + token.approve(address(this), 0.9e18); + + token.transferFrom(from, address(0xBEEF), 1e18); + } + + function testFailTransferFromInsufficientBalance() public { + address from = address(0xABCD); + + token.mint(from, 0.9e18); + + vm.prank(from); + token.approve(address(this), 1e18); + + token.transferFrom(from, address(0xBEEF), 1e18); + } + + function testFailPermitBadNonce() public { + uint256 privateKey = 0xBEEF; + address owner = vm.addr(privateKey); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign( + privateKey, + keccak256( + abi.encodePacked( + "\x19\x01", + token.DOMAIN_SEPARATOR(), + keccak256(abi.encode(PERMIT_TYPEHASH, owner, address(0xCAFE), 1e18, 1, block.timestamp)) + ) + ) + ); + + token.permit(owner, address(0xCAFE), 1e18, block.timestamp, v, r, s); + } + + function testFailPermitBadDeadline() public { + uint256 privateKey = 0xBEEF; + address owner = vm.addr(privateKey); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign( + privateKey, + keccak256( + abi.encodePacked( + "\x19\x01", + token.DOMAIN_SEPARATOR(), + keccak256(abi.encode(PERMIT_TYPEHASH, owner, address(0xCAFE), 1e18, 0, block.timestamp)) + ) + ) + ); + + token.permit(owner, address(0xCAFE), 1e18, block.timestamp + 1, v, r, s); + } + + function testFailPermitPastDeadline() public { + uint256 oldTimestamp = block.timestamp; + uint256 privateKey = 0xBEEF; + address owner = vm.addr(privateKey); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign( + privateKey, + keccak256( + abi.encodePacked( + "\x19\x01", + token.DOMAIN_SEPARATOR(), + keccak256(abi.encode(PERMIT_TYPEHASH, owner, address(0xCAFE), 1e18, 0, oldTimestamp)) + ) + ) + ); + + vm.warp(block.timestamp + 1); + token.permit(owner, address(0xCAFE), 1e18, oldTimestamp, v, r, s); + } + + function testFailPermitReplay() public { + uint256 privateKey = 0xBEEF; + address owner = vm.addr(privateKey); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign( + privateKey, + keccak256( + abi.encodePacked( + "\x19\x01", + token.DOMAIN_SEPARATOR(), + keccak256(abi.encode(PERMIT_TYPEHASH, owner, address(0xCAFE), 1e18, 0, block.timestamp)) + ) + ) + ); + + token.permit(owner, address(0xCAFE), 1e18, block.timestamp, v, r, s); + token.permit(owner, address(0xCAFE), 1e18, block.timestamp, v, r, s); + } + + function testMetadata(string calldata name, string calldata symbol, uint8 decimals) public { + Token_ERC20 tkn = new Token_ERC20(name, symbol, decimals); + assertEq(tkn.name(), name); + assertEq(tkn.symbol(), symbol); + assertEq(tkn.decimals(), decimals); + } + + function testMint(address from, uint256 amount) public { + token.mint(from, amount); + + assertEq(token.totalSupply(), amount); + assertEq(token.balanceOf(from), amount); + } + + function testBurn(address from, uint256 mintAmount, uint256 burnAmount) public { + burnAmount = bound(burnAmount, 0, mintAmount); + + token.mint(from, mintAmount); + token.burn(from, burnAmount); + + assertEq(token.totalSupply(), mintAmount - burnAmount); + assertEq(token.balanceOf(from), mintAmount - burnAmount); + } + + function testApprove(address to, uint256 amount) public { + assertTrue(token.approve(to, amount)); + + assertEq(token.allowance(address(this), to), amount); + } + + function testTransfer(address from, uint256 amount) public { + token.mint(address(this), amount); + + assertTrue(token.transfer(from, amount)); + assertEq(token.totalSupply(), amount); + + if (address(this) == from) { + assertEq(token.balanceOf(address(this)), amount); + } else { + assertEq(token.balanceOf(address(this)), 0); + assertEq(token.balanceOf(from), amount); + } + } + + function testTransferFrom(address to, uint256 approval, uint256 amount) public { + amount = bound(amount, 0, approval); + + address from = address(0xABCD); + + token.mint(from, amount); + + vm.prank(from); + token.approve(address(this), approval); + + assertTrue(token.transferFrom(from, to, amount)); + assertEq(token.totalSupply(), amount); + + uint256 app = from == address(this) || approval == type(uint256).max ? approval : approval - amount; + assertEq(token.allowance(from, address(this)), app); + + if (from == to) { + assertEq(token.balanceOf(from), amount); + } else { + assertEq(token.balanceOf(from), 0); + assertEq(token.balanceOf(to), amount); + } + } + + function testPermit(uint248 privKey, address to, uint256 amount, uint256 deadline) public { + uint256 privateKey = privKey; + if (deadline < block.timestamp) deadline = block.timestamp; + if (privateKey == 0) privateKey = 1; + + address owner = vm.addr(privateKey); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign( + privateKey, + keccak256( + abi.encodePacked( + "\x19\x01", + token.DOMAIN_SEPARATOR(), + keccak256(abi.encode(PERMIT_TYPEHASH, owner, to, amount, 0, deadline)) + ) + ) + ); + + token.permit(owner, to, amount, deadline, v, r, s); + + assertEq(token.allowance(owner, to), amount); + assertEq(token.nonces(owner), 1); + } + + function testFailBurnInsufficientBalance(address to, uint256 mintAmount, uint256 burnAmount) public { + burnAmount = bound(burnAmount, mintAmount + 1, type(uint256).max); + + token.mint(to, mintAmount); + token.burn(to, burnAmount); + } + + function testFailTransferInsufficientBalance(address to, uint256 mintAmount, uint256 sendAmount) public { + sendAmount = bound(sendAmount, mintAmount + 1, type(uint256).max); + + token.mint(address(this), mintAmount); + token.transfer(to, sendAmount); + } + + function testFailTransferFromInsufficientAllowance(address to, uint256 approval, uint256 amount) public { + amount = bound(amount, approval + 1, type(uint256).max); + + address from = address(0xABCD); + + token.mint(from, amount); + + vm.prank(from); + token.approve(address(this), approval); + + token.transferFrom(from, to, amount); + } + + function testFailTransferFromInsufficientBalance(address to, uint256 mintAmount, uint256 sendAmount) public { + sendAmount = bound(sendAmount, mintAmount + 1, type(uint256).max); + + address from = address(0xABCD); + + token.mint(from, mintAmount); + + vm.prank(from); + token.approve(address(this), sendAmount); + + token.transferFrom(from, to, sendAmount); + } + + function testFailPermitBadNonce(uint256 privateKey, address to, uint256 amount, uint256 deadline, uint256 nonce) + public + { + if (deadline < block.timestamp) deadline = block.timestamp; + if (privateKey == 0) privateKey = 1; + if (nonce == 0) nonce = 1; + + address owner = vm.addr(privateKey); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign( + privateKey, + keccak256( + abi.encodePacked( + "\x19\x01", + token.DOMAIN_SEPARATOR(), + keccak256(abi.encode(PERMIT_TYPEHASH, owner, to, amount, nonce, deadline)) + ) + ) + ); + + token.permit(owner, to, amount, deadline, v, r, s); + } + + function testFailPermitBadDeadline(uint256 privateKey, address to, uint256 amount, uint256 deadline) public { + if (deadline < block.timestamp) deadline = block.timestamp; + if (privateKey == 0) privateKey = 1; + + address owner = vm.addr(privateKey); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign( + privateKey, + keccak256( + abi.encodePacked( + "\x19\x01", + token.DOMAIN_SEPARATOR(), + keccak256(abi.encode(PERMIT_TYPEHASH, owner, to, amount, 0, deadline)) + ) + ) + ); + + token.permit(owner, to, amount, deadline + 1, v, r, s); + } + + function testFailPermitPastDeadline(uint256 privateKey, address to, uint256 amount, uint256 deadline) public { + deadline = bound(deadline, 0, block.timestamp - 1); + if (privateKey == 0) privateKey = 1; + + address owner = vm.addr(privateKey); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign( + privateKey, + keccak256( + abi.encodePacked( + "\x19\x01", + token.DOMAIN_SEPARATOR(), + keccak256(abi.encode(PERMIT_TYPEHASH, owner, to, amount, 0, deadline)) + ) + ) + ); + + token.permit(owner, to, amount, deadline, v, r, s); + } + + function testFailPermitReplay(uint256 privateKey, address to, uint256 amount, uint256 deadline) public { + if (deadline < block.timestamp) deadline = block.timestamp; + if (privateKey == 0) privateKey = 1; + + address owner = vm.addr(privateKey); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign( + privateKey, + keccak256( + abi.encodePacked( + "\x19\x01", + token.DOMAIN_SEPARATOR(), + keccak256(abi.encode(PERMIT_TYPEHASH, owner, to, amount, 0, deadline)) + ) + ) + ); + + token.permit(owner, to, amount, deadline, v, r, s); + token.permit(owner, to, amount, deadline, v, r, s); + } +} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC721.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC721.t.sol new file mode 100644 index 000000000..f986d7967 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC721.t.sol @@ -0,0 +1,721 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import {MockERC721, IERC721TokenReceiver} from "../../src/mocks/MockERC721.sol"; +import {StdCheats} from "../../src/StdCheats.sol"; +import {Test} from "../../src/Test.sol"; + +contract ERC721Recipient is IERC721TokenReceiver { + address public operator; + address public from; + uint256 public id; + bytes public data; + + function onERC721Received(address _operator, address _from, uint256 _id, bytes calldata _data) + public + virtual + override + returns (bytes4) + { + operator = _operator; + from = _from; + id = _id; + data = _data; + + return IERC721TokenReceiver.onERC721Received.selector; + } +} + +contract RevertingERC721Recipient is IERC721TokenReceiver { + function onERC721Received(address, address, uint256, bytes calldata) public virtual override returns (bytes4) { + revert(string(abi.encodePacked(IERC721TokenReceiver.onERC721Received.selector))); + } +} + +contract WrongReturnDataERC721Recipient is IERC721TokenReceiver { + function onERC721Received(address, address, uint256, bytes calldata) public virtual override returns (bytes4) { + return 0xCAFEBEEF; + } +} + +contract NonERC721Recipient {} + +contract Token_ERC721 is MockERC721 { + constructor(string memory _name, string memory _symbol) { + initialize(_name, _symbol); + } + + function tokenURI(uint256) public pure virtual override returns (string memory) {} + + function mint(address to, uint256 tokenId) public virtual { + _mint(to, tokenId); + } + + function burn(uint256 tokenId) public virtual { + _burn(tokenId); + } + + function safeMint(address to, uint256 tokenId) public virtual { + _safeMint(to, tokenId); + } + + function safeMint(address to, uint256 tokenId, bytes memory data) public virtual { + _safeMint(to, tokenId, data); + } +} + +contract MockERC721Test is StdCheats, Test { + Token_ERC721 token; + + function setUp() public { + token = new Token_ERC721("Token", "TKN"); + } + + function invariantMetadata() public view { + assertEq(token.name(), "Token"); + assertEq(token.symbol(), "TKN"); + } + + function testMint() public { + token.mint(address(0xBEEF), 1337); + + assertEq(token.balanceOf(address(0xBEEF)), 1); + assertEq(token.ownerOf(1337), address(0xBEEF)); + } + + function testBurn() public { + token.mint(address(0xBEEF), 1337); + token.burn(1337); + + assertEq(token.balanceOf(address(0xBEEF)), 0); + + vm.expectRevert("NOT_MINTED"); + token.ownerOf(1337); + } + + function testApprove() public { + token.mint(address(this), 1337); + + token.approve(address(0xBEEF), 1337); + + assertEq(token.getApproved(1337), address(0xBEEF)); + } + + function testApproveBurn() public { + token.mint(address(this), 1337); + + token.approve(address(0xBEEF), 1337); + + token.burn(1337); + + assertEq(token.balanceOf(address(this)), 0); + assertEq(token.getApproved(1337), address(0)); + + vm.expectRevert("NOT_MINTED"); + token.ownerOf(1337); + } + + function testApproveAll() public { + token.setApprovalForAll(address(0xBEEF), true); + + assertTrue(token.isApprovedForAll(address(this), address(0xBEEF))); + } + + function testTransferFrom() public { + address from = address(0xABCD); + + token.mint(from, 1337); + + vm.prank(from); + token.approve(address(this), 1337); + + token.transferFrom(from, address(0xBEEF), 1337); + + assertEq(token.getApproved(1337), address(0)); + assertEq(token.ownerOf(1337), address(0xBEEF)); + assertEq(token.balanceOf(address(0xBEEF)), 1); + assertEq(token.balanceOf(from), 0); + } + + function testTransferFromSelf() public { + token.mint(address(this), 1337); + + token.transferFrom(address(this), address(0xBEEF), 1337); + + assertEq(token.getApproved(1337), address(0)); + assertEq(token.ownerOf(1337), address(0xBEEF)); + assertEq(token.balanceOf(address(0xBEEF)), 1); + assertEq(token.balanceOf(address(this)), 0); + } + + function testTransferFromApproveAll() public { + address from = address(0xABCD); + + token.mint(from, 1337); + + vm.prank(from); + token.setApprovalForAll(address(this), true); + + token.transferFrom(from, address(0xBEEF), 1337); + + assertEq(token.getApproved(1337), address(0)); + assertEq(token.ownerOf(1337), address(0xBEEF)); + assertEq(token.balanceOf(address(0xBEEF)), 1); + assertEq(token.balanceOf(from), 0); + } + + function testSafeTransferFromToEOA() public { + address from = address(0xABCD); + + token.mint(from, 1337); + + vm.prank(from); + token.setApprovalForAll(address(this), true); + + token.safeTransferFrom(from, address(0xBEEF), 1337); + + assertEq(token.getApproved(1337), address(0)); + assertEq(token.ownerOf(1337), address(0xBEEF)); + assertEq(token.balanceOf(address(0xBEEF)), 1); + assertEq(token.balanceOf(from), 0); + } + + function testSafeTransferFromToERC721Recipient() public { + address from = address(0xABCD); + ERC721Recipient recipient = new ERC721Recipient(); + + token.mint(from, 1337); + + vm.prank(from); + token.setApprovalForAll(address(this), true); + + token.safeTransferFrom(from, address(recipient), 1337); + + assertEq(token.getApproved(1337), address(0)); + assertEq(token.ownerOf(1337), address(recipient)); + assertEq(token.balanceOf(address(recipient)), 1); + assertEq(token.balanceOf(from), 0); + + assertEq(recipient.operator(), address(this)); + assertEq(recipient.from(), from); + assertEq(recipient.id(), 1337); + assertEq(recipient.data(), ""); + } + + function testSafeTransferFromToERC721RecipientWithData() public { + address from = address(0xABCD); + ERC721Recipient recipient = new ERC721Recipient(); + + token.mint(from, 1337); + + vm.prank(from); + token.setApprovalForAll(address(this), true); + + token.safeTransferFrom(from, address(recipient), 1337, "testing 123"); + + assertEq(token.getApproved(1337), address(0)); + assertEq(token.ownerOf(1337), address(recipient)); + assertEq(token.balanceOf(address(recipient)), 1); + assertEq(token.balanceOf(from), 0); + + assertEq(recipient.operator(), address(this)); + assertEq(recipient.from(), from); + assertEq(recipient.id(), 1337); + assertEq(recipient.data(), "testing 123"); + } + + function testSafeMintToEOA() public { + token.safeMint(address(0xBEEF), 1337); + + assertEq(token.ownerOf(1337), address(address(0xBEEF))); + assertEq(token.balanceOf(address(address(0xBEEF))), 1); + } + + function testSafeMintToERC721Recipient() public { + ERC721Recipient to = new ERC721Recipient(); + + token.safeMint(address(to), 1337); + + assertEq(token.ownerOf(1337), address(to)); + assertEq(token.balanceOf(address(to)), 1); + + assertEq(to.operator(), address(this)); + assertEq(to.from(), address(0)); + assertEq(to.id(), 1337); + assertEq(to.data(), ""); + } + + function testSafeMintToERC721RecipientWithData() public { + ERC721Recipient to = new ERC721Recipient(); + + token.safeMint(address(to), 1337, "testing 123"); + + assertEq(token.ownerOf(1337), address(to)); + assertEq(token.balanceOf(address(to)), 1); + + assertEq(to.operator(), address(this)); + assertEq(to.from(), address(0)); + assertEq(to.id(), 1337); + assertEq(to.data(), "testing 123"); + } + + function testFailMintToZero() public { + token.mint(address(0), 1337); + } + + function testFailDoubleMint() public { + token.mint(address(0xBEEF), 1337); + token.mint(address(0xBEEF), 1337); + } + + function testFailBurnUnMinted() public { + token.burn(1337); + } + + function testFailDoubleBurn() public { + token.mint(address(0xBEEF), 1337); + + token.burn(1337); + token.burn(1337); + } + + function testFailApproveUnMinted() public { + token.approve(address(0xBEEF), 1337); + } + + function testFailApproveUnAuthorized() public { + token.mint(address(0xCAFE), 1337); + + token.approve(address(0xBEEF), 1337); + } + + function testFailTransferFromUnOwned() public { + token.transferFrom(address(0xFEED), address(0xBEEF), 1337); + } + + function testFailTransferFromWrongFrom() public { + token.mint(address(0xCAFE), 1337); + + token.transferFrom(address(0xFEED), address(0xBEEF), 1337); + } + + function testFailTransferFromToZero() public { + token.mint(address(this), 1337); + + token.transferFrom(address(this), address(0), 1337); + } + + function testFailTransferFromNotOwner() public { + token.mint(address(0xFEED), 1337); + + token.transferFrom(address(0xFEED), address(0xBEEF), 1337); + } + + function testFailSafeTransferFromToNonERC721Recipient() public { + token.mint(address(this), 1337); + + token.safeTransferFrom(address(this), address(new NonERC721Recipient()), 1337); + } + + function testFailSafeTransferFromToNonERC721RecipientWithData() public { + token.mint(address(this), 1337); + + token.safeTransferFrom(address(this), address(new NonERC721Recipient()), 1337, "testing 123"); + } + + function testFailSafeTransferFromToRevertingERC721Recipient() public { + token.mint(address(this), 1337); + + token.safeTransferFrom(address(this), address(new RevertingERC721Recipient()), 1337); + } + + function testFailSafeTransferFromToRevertingERC721RecipientWithData() public { + token.mint(address(this), 1337); + + token.safeTransferFrom(address(this), address(new RevertingERC721Recipient()), 1337, "testing 123"); + } + + function testFailSafeTransferFromToERC721RecipientWithWrongReturnData() public { + token.mint(address(this), 1337); + + token.safeTransferFrom(address(this), address(new WrongReturnDataERC721Recipient()), 1337); + } + + function testFailSafeTransferFromToERC721RecipientWithWrongReturnDataWithData() public { + token.mint(address(this), 1337); + + token.safeTransferFrom(address(this), address(new WrongReturnDataERC721Recipient()), 1337, "testing 123"); + } + + function testFailSafeMintToNonERC721Recipient() public { + token.safeMint(address(new NonERC721Recipient()), 1337); + } + + function testFailSafeMintToNonERC721RecipientWithData() public { + token.safeMint(address(new NonERC721Recipient()), 1337, "testing 123"); + } + + function testFailSafeMintToRevertingERC721Recipient() public { + token.safeMint(address(new RevertingERC721Recipient()), 1337); + } + + function testFailSafeMintToRevertingERC721RecipientWithData() public { + token.safeMint(address(new RevertingERC721Recipient()), 1337, "testing 123"); + } + + function testFailSafeMintToERC721RecipientWithWrongReturnData() public { + token.safeMint(address(new WrongReturnDataERC721Recipient()), 1337); + } + + function testFailSafeMintToERC721RecipientWithWrongReturnDataWithData() public { + token.safeMint(address(new WrongReturnDataERC721Recipient()), 1337, "testing 123"); + } + + function testFailBalanceOfZeroAddress() public view { + token.balanceOf(address(0)); + } + + function testFailOwnerOfUnminted() public view { + token.ownerOf(1337); + } + + function testMetadata(string memory name, string memory symbol) public { + MockERC721 tkn = new Token_ERC721(name, symbol); + + assertEq(tkn.name(), name); + assertEq(tkn.symbol(), symbol); + } + + function testMint(address to, uint256 id) public { + if (to == address(0)) to = address(0xBEEF); + + token.mint(to, id); + + assertEq(token.balanceOf(to), 1); + assertEq(token.ownerOf(id), to); + } + + function testBurn(address to, uint256 id) public { + if (to == address(0)) to = address(0xBEEF); + + token.mint(to, id); + token.burn(id); + + assertEq(token.balanceOf(to), 0); + + vm.expectRevert("NOT_MINTED"); + token.ownerOf(id); + } + + function testApprove(address to, uint256 id) public { + if (to == address(0)) to = address(0xBEEF); + + token.mint(address(this), id); + + token.approve(to, id); + + assertEq(token.getApproved(id), to); + } + + function testApproveBurn(address to, uint256 id) public { + token.mint(address(this), id); + + token.approve(address(to), id); + + token.burn(id); + + assertEq(token.balanceOf(address(this)), 0); + assertEq(token.getApproved(id), address(0)); + + vm.expectRevert("NOT_MINTED"); + token.ownerOf(id); + } + + function testApproveAll(address to, bool approved) public { + token.setApprovalForAll(to, approved); + + assertEq(token.isApprovedForAll(address(this), to), approved); + } + + function testTransferFrom(uint256 id, address to) public { + address from = address(0xABCD); + + if (to == address(0) || to == from) to = address(0xBEEF); + + token.mint(from, id); + + vm.prank(from); + token.approve(address(this), id); + + token.transferFrom(from, to, id); + + assertEq(token.getApproved(id), address(0)); + assertEq(token.ownerOf(id), to); + assertEq(token.balanceOf(to), 1); + assertEq(token.balanceOf(from), 0); + } + + function testTransferFromSelf(uint256 id, address to) public { + if (to == address(0) || to == address(this)) to = address(0xBEEF); + + token.mint(address(this), id); + + token.transferFrom(address(this), to, id); + + assertEq(token.getApproved(id), address(0)); + assertEq(token.ownerOf(id), to); + assertEq(token.balanceOf(to), 1); + assertEq(token.balanceOf(address(this)), 0); + } + + function testTransferFromApproveAll(uint256 id, address to) public { + address from = address(0xABCD); + + if (to == address(0) || to == from) to = address(0xBEEF); + + token.mint(from, id); + + vm.prank(from); + token.setApprovalForAll(address(this), true); + + token.transferFrom(from, to, id); + + assertEq(token.getApproved(id), address(0)); + assertEq(token.ownerOf(id), to); + assertEq(token.balanceOf(to), 1); + assertEq(token.balanceOf(from), 0); + } + + function testSafeTransferFromToEOA(uint256 id, address to) public { + address from = address(0xABCD); + + if (to == address(0) || to == from) to = address(0xBEEF); + + if (uint256(uint160(to)) <= 18 || to.code.length > 0) return; + + token.mint(from, id); + + vm.prank(from); + token.setApprovalForAll(address(this), true); + + token.safeTransferFrom(from, to, id); + + assertEq(token.getApproved(id), address(0)); + assertEq(token.ownerOf(id), to); + assertEq(token.balanceOf(to), 1); + assertEq(token.balanceOf(from), 0); + } + + function testSafeTransferFromToERC721Recipient(uint256 id) public { + address from = address(0xABCD); + + ERC721Recipient recipient = new ERC721Recipient(); + + token.mint(from, id); + + vm.prank(from); + token.setApprovalForAll(address(this), true); + + token.safeTransferFrom(from, address(recipient), id); + + assertEq(token.getApproved(id), address(0)); + assertEq(token.ownerOf(id), address(recipient)); + assertEq(token.balanceOf(address(recipient)), 1); + assertEq(token.balanceOf(from), 0); + + assertEq(recipient.operator(), address(this)); + assertEq(recipient.from(), from); + assertEq(recipient.id(), id); + assertEq(recipient.data(), ""); + } + + function testSafeTransferFromToERC721RecipientWithData(uint256 id, bytes calldata data) public { + address from = address(0xABCD); + ERC721Recipient recipient = new ERC721Recipient(); + + token.mint(from, id); + + vm.prank(from); + token.setApprovalForAll(address(this), true); + + token.safeTransferFrom(from, address(recipient), id, data); + + assertEq(token.getApproved(id), address(0)); + assertEq(token.ownerOf(id), address(recipient)); + assertEq(token.balanceOf(address(recipient)), 1); + assertEq(token.balanceOf(from), 0); + + assertEq(recipient.operator(), address(this)); + assertEq(recipient.from(), from); + assertEq(recipient.id(), id); + assertEq(recipient.data(), data); + } + + function testSafeMintToEOA(uint256 id, address to) public { + if (to == address(0)) to = address(0xBEEF); + + if (uint256(uint160(to)) <= 18 || to.code.length > 0) return; + + token.safeMint(to, id); + + assertEq(token.ownerOf(id), address(to)); + assertEq(token.balanceOf(address(to)), 1); + } + + function testSafeMintToERC721Recipient(uint256 id) public { + ERC721Recipient to = new ERC721Recipient(); + + token.safeMint(address(to), id); + + assertEq(token.ownerOf(id), address(to)); + assertEq(token.balanceOf(address(to)), 1); + + assertEq(to.operator(), address(this)); + assertEq(to.from(), address(0)); + assertEq(to.id(), id); + assertEq(to.data(), ""); + } + + function testSafeMintToERC721RecipientWithData(uint256 id, bytes calldata data) public { + ERC721Recipient to = new ERC721Recipient(); + + token.safeMint(address(to), id, data); + + assertEq(token.ownerOf(id), address(to)); + assertEq(token.balanceOf(address(to)), 1); + + assertEq(to.operator(), address(this)); + assertEq(to.from(), address(0)); + assertEq(to.id(), id); + assertEq(to.data(), data); + } + + function testFailMintToZero(uint256 id) public { + token.mint(address(0), id); + } + + function testFailDoubleMint(uint256 id, address to) public { + if (to == address(0)) to = address(0xBEEF); + + token.mint(to, id); + token.mint(to, id); + } + + function testFailBurnUnMinted(uint256 id) public { + token.burn(id); + } + + function testFailDoubleBurn(uint256 id, address to) public { + if (to == address(0)) to = address(0xBEEF); + + token.mint(to, id); + + token.burn(id); + token.burn(id); + } + + function testFailApproveUnMinted(uint256 id, address to) public { + token.approve(to, id); + } + + function testFailApproveUnAuthorized(address owner, uint256 id, address to) public { + if (owner == address(0) || owner == address(this)) owner = address(0xBEEF); + + token.mint(owner, id); + + token.approve(to, id); + } + + function testFailTransferFromUnOwned(address from, address to, uint256 id) public { + token.transferFrom(from, to, id); + } + + function testFailTransferFromWrongFrom(address owner, address from, address to, uint256 id) public { + if (owner == address(0)) to = address(0xBEEF); + if (from == owner) revert(); + + token.mint(owner, id); + + token.transferFrom(from, to, id); + } + + function testFailTransferFromToZero(uint256 id) public { + token.mint(address(this), id); + + token.transferFrom(address(this), address(0), id); + } + + function testFailTransferFromNotOwner(address from, address to, uint256 id) public { + if (from == address(this)) from = address(0xBEEF); + + token.mint(from, id); + + token.transferFrom(from, to, id); + } + + function testFailSafeTransferFromToNonERC721Recipient(uint256 id) public { + token.mint(address(this), id); + + token.safeTransferFrom(address(this), address(new NonERC721Recipient()), id); + } + + function testFailSafeTransferFromToNonERC721RecipientWithData(uint256 id, bytes calldata data) public { + token.mint(address(this), id); + + token.safeTransferFrom(address(this), address(new NonERC721Recipient()), id, data); + } + + function testFailSafeTransferFromToRevertingERC721Recipient(uint256 id) public { + token.mint(address(this), id); + + token.safeTransferFrom(address(this), address(new RevertingERC721Recipient()), id); + } + + function testFailSafeTransferFromToRevertingERC721RecipientWithData(uint256 id, bytes calldata data) public { + token.mint(address(this), id); + + token.safeTransferFrom(address(this), address(new RevertingERC721Recipient()), id, data); + } + + function testFailSafeTransferFromToERC721RecipientWithWrongReturnData(uint256 id) public { + token.mint(address(this), id); + + token.safeTransferFrom(address(this), address(new WrongReturnDataERC721Recipient()), id); + } + + function testFailSafeTransferFromToERC721RecipientWithWrongReturnDataWithData(uint256 id, bytes calldata data) + public + { + token.mint(address(this), id); + + token.safeTransferFrom(address(this), address(new WrongReturnDataERC721Recipient()), id, data); + } + + function testFailSafeMintToNonERC721Recipient(uint256 id) public { + token.safeMint(address(new NonERC721Recipient()), id); + } + + function testFailSafeMintToNonERC721RecipientWithData(uint256 id, bytes calldata data) public { + token.safeMint(address(new NonERC721Recipient()), id, data); + } + + function testFailSafeMintToRevertingERC721Recipient(uint256 id) public { + token.safeMint(address(new RevertingERC721Recipient()), id); + } + + function testFailSafeMintToRevertingERC721RecipientWithData(uint256 id, bytes calldata data) public { + token.safeMint(address(new RevertingERC721Recipient()), id, data); + } + + function testFailSafeMintToERC721RecipientWithWrongReturnData(uint256 id) public { + token.safeMint(address(new WrongReturnDataERC721Recipient()), id); + } + + function testFailSafeMintToERC721RecipientWithWrongReturnDataWithData(uint256 id, bytes calldata data) public { + token.safeMint(address(new WrongReturnDataERC721Recipient()), id, data); + } + + function testFailOwnerOfUnminted(uint256 id) public view { + token.ownerOf(id); + } +} diff --git a/examples/validating-public-input/contracts/script/Deployer.s.sol b/examples/validating-public-input/contracts/script/Deployer.s.sol new file mode 100644 index 000000000..c012fb652 --- /dev/null +++ b/examples/validating-public-input/contracts/script/Deployer.s.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.12; + +import {Script, console} from "forge-std/Script.sol"; +import {FibonacciValidator} from "../src/FibonacciValidator.sol"; + +contract CounterScript is Script { + function setUp() public {} + + function run(address _targetContract) external returns (address) { + vm.startBroadcast(); + + FibonacciValidator fibonacciContract = new FibonacciValidator( + _targetContract + ); + + vm.stopBroadcast(); + + return address(fibonacciContract); + } +} diff --git a/examples/validating-public-input/contracts/src/FibonacciValidator.sol b/examples/validating-public-input/contracts/src/FibonacciValidator.sol new file mode 100644 index 000000000..7ee4b0393 --- /dev/null +++ b/examples/validating-public-input/contracts/src/FibonacciValidator.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.19; + +contract FibonacciValidator { + address public alignedServiceManager; + bytes32 public fibonacciImageId; + + bytes32 public fibonacciImageIdCommitment = + 0xbfa561e384be753bd6fd75b15db31eb511cd114ec76d619a87c2342af0ee1ed7; + + event FibonacciNumbersVerified(uint32 fibN, uint32 fibNPlusOne); + + constructor(address _alignedServiceManager) { + alignedServiceManager = _alignedServiceManager; + } + + function verifyBatchInclusion( + bytes32 proofCommitment, + bytes32 pubInputCommitment, + bytes32 provingSystemAuxDataCommitment, + bytes20 proofGeneratorAddr, + bytes32 batchMerkleRoot, + bytes memory merkleProof, + uint256 verificationDataBatchIndex, + uint32 fibN, + uint32 fibNPlusOne + ) public returns (bool) { + require( + fibonacciImageIdCommitment == provingSystemAuxDataCommitment, + "Image ID doesn't match" + ); + + bytes32 calculatedCommitment = calculateCommitment(fibN, fibNPlusOne); + + require( + pubInputCommitment == calculatedCommitment, + "Fibonacci numbers don't match with public input" + ); + + // Emit the event after the require statements + emit FibonacciNumbersVerified(fibN, fibNPlusOne); + + ( + bool callWasSuccessful, + bytes memory proofIsIncluded + ) = alignedServiceManager.staticcall( + abi.encodeWithSignature( + "verifyBatchInclusion(bytes32,bytes32,bytes32,bytes20,bytes32,bytes,uint256)", + proofCommitment, + pubInputCommitment, + provingSystemAuxDataCommitment, + proofGeneratorAddr, + batchMerkleRoot, + merkleProof, + verificationDataBatchIndex + ) + ); + + require(callWasSuccessful, "static_call failed"); + + return abi.decode(proofIsIncluded, (bool)); + } + + function calculateCommitment( + uint32 fibN, + uint32 fibNPlusOne + ) public pure returns (bytes32) { + bytes memory encoded = abi.encodePacked(fibN, fibNPlusOne); + return keccak256(encoded); + } +} diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/.gitignore b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/.gitignore new file mode 100644 index 000000000..1c670bc57 --- /dev/null +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/.gitignore @@ -0,0 +1,8 @@ +# Cargo build +**/target + +# Cargo config +.cargo + +# MacOS nuisances +.DS_Store diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.lock b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.lock new file mode 100644 index 000000000..b36901506 --- /dev/null +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.lock @@ -0,0 +1,3150 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addchain" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" +dependencies = [ + "num-bigint 0.3.3", + "num-integer", + "num-traits", +] + +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "cpp_demangle", + "fallible-iterator", + "gimli", + "memmap2", + "object 0.35.0", + "rustc-demangle", + "smallvec", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3a13b34da09176a8baba701233fdffbaa7c1b1192ce031a3da4e55ce1f1a56" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-snark", + "ark-std", + "blake2", + "derivative", + "digest", + "sha2", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools 0.10.5", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-groth16" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20ceafa83848c3e390f1cbf124bc3193b3e639b3f02009e0e290809a501b95fc" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-relations" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00796b6efc05a3f48225e59cb6a2cda78881e7c390872d5786aaf112f31fb4f0" +dependencies = [ + "ark-ff", + "ark-std", + "tracing", + "tracing-subscriber 0.2.25", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-snark" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d3cc6833a335bb8a600241889ead68ee89a3cf8448081fb7694c0fe503da63" +dependencies = [ + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object 0.36.1", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bonsai-sdk" +version = "0.8.0" +source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +dependencies = [ + "reqwest 0.12.5", + "risc0-groth16", + "serde", + "thiserror", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytemuck" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" +dependencies = [ + "serde", +] + +[[package]] +name = "camino" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cc" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpp_demangle" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8227005286ec39567949b33df9896bcadfa6051bccca2488129f108ca23119" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "subtle", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive-debug" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e53ef7e1cf756fd5a8e74b9a0a9504ec446eddde86c3063a76ff26a13b7773b1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "directories" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "docker-generate" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf673e0848ef09fa4aeeba78e681cf651c0c7d35f76ee38cec8e55bc32fa111" + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "downloader" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05213e96f184578b5f70105d4d0a644a168e99e12d7bea0b200c15d67b5c182" +dependencies = [ + "digest", + "futures", + "rand", + "reqwest 0.11.27", + "thiserror", + "tokio", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "elf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "erased-serde" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" +dependencies = [ + "serde", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "bitvec", + "byteorder", + "ff_derive", + "rand_core", + "subtle", +] + +[[package]] +name = "ff_derive" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f54704be45ed286151c5e11531316eaef5b8f5af7d597b806fdb8af108d84a" +dependencies = [ + "addchain", + "cfg-if", + "num-bigint 0.3.3", + "num-integer", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +dependencies = [ + "fallible-iterator", + "stable_deref_trait", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "host" +version = "0.1.0" +dependencies = [ + "bincode", + "methods", + "risc0-zkvm", + "serde", + "tracing-subscriber 0.3.18", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.30", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.4.1", + "hyper-util", + "rustls 0.23.11", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.0", + "tower-service", + "webpki-roots 0.26.3", +] + +[[package]] +name = "hyper-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "hyper 1.4.1", + "pin-project-lite", + "socket2", + "tokio", + "tower", + "tower-service", + "tracing", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", +] + +[[package]] +name = "inventory" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f958d3d68f4167080a18141e10381e7634563984a537f2a49a30fd8e53ac5767" + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy-regex" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d12be4595afdf58bd19e4a9f4e24187da2a66700786ff660a418e9059937a4c" +dependencies = [ + "lazy-regex-proc_macros", + "once_cell", + "regex", +] + +[[package]] +name = "lazy-regex-proc_macros" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44bcd58e6c97a7fcbaffcdc95728b393b8d98933bfadad49ed4097845b57ef0b" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.71", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "lockfree-object-pool" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matrixmultiply" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + +[[package]] +name = "methods" +version = "0.1.0" +dependencies = [ + "risc0-build", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "ndarray" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "rawpointer", + "rayon", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "nvtx" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad2e855e8019f99e4b94ac33670eb4e4f570a2e044f3749a0b2c7f83b841e52c" +dependencies = [ + "cc", +] + +[[package]] +name = "object" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" +dependencies = [ + "flate2", + "memchr", + "ruzstd", +] + +[[package]] +name = "object" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +dependencies = [ + "anyhow", + "itertools 0.12.1", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "quinn" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.11", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" +dependencies = [ + "bytes", + "rand", + "ring", + "rustc-hash", + "rustls 0.23.11", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" +dependencies = [ + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.4", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.30", + "hyper-rustls 0.24.2", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls 0.21.12", + "rustls-pemfile 1.0.4", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration", + "tokio", + "tokio-rustls 0.24.1", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.25.4", + "winreg 0.50.0", +] + +[[package]] +name = "reqwest" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", + "hyper-rustls 0.27.2", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.11", + "rustls-pemfile 2.1.2", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.1", + "tokio", + "tokio-rustls 0.26.0", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.26.3", + "winreg 0.52.0", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "risc0-binfmt" +version = "1.0.1" +source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +dependencies = [ + "anyhow", + "elf", + "risc0-zkp", + "risc0-zkvm-platform", + "serde", + "tracing", +] + +[[package]] +name = "risc0-build" +version = "1.0.1" +source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +dependencies = [ + "anyhow", + "cargo_metadata", + "dirs", + "docker-generate", + "risc0-binfmt", + "risc0-zkp", + "risc0-zkvm-platform", + "serde", + "serde_json", + "tempfile", +] + +[[package]] +name = "risc0-build-kernel" +version = "1.0.1" +source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +dependencies = [ + "cc", + "directories", + "glob", + "hex", + "rayon", + "sha2", + "tempfile", + "which", +] + +[[package]] +name = "risc0-circuit-recursion" +version = "1.0.1" +source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +dependencies = [ + "anyhow", + "bytemuck", + "downloader", + "hex", + "nvtx", + "rand", + "rayon", + "risc0-circuit-recursion-sys", + "risc0-core", + "risc0-sys", + "risc0-zkp", + "sha2", + "tracing", + "zip", +] + +[[package]] +name = "risc0-circuit-recursion-sys" +version = "1.0.1" +source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +dependencies = [ + "glob", + "risc0-build-kernel", + "risc0-core", + "risc0-sys", +] + +[[package]] +name = "risc0-circuit-rv32im" +version = "1.0.1" +source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +dependencies = [ + "anyhow", + "bytemuck", + "cfg-if", + "crossbeam", + "crypto-bigint", + "derive-debug", + "lazy-regex", + "nvtx", + "rand", + "rayon", + "risc0-binfmt", + "risc0-circuit-rv32im-sys", + "risc0-core", + "risc0-sys", + "risc0-zkp", + "risc0-zkvm-platform", + "serde", + "sha2", + "tracing", +] + +[[package]] +name = "risc0-circuit-rv32im-sys" +version = "1.0.1" +source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +dependencies = [ + "glob", + "risc0-build-kernel", + "risc0-core", + "risc0-sys", +] + +[[package]] +name = "risc0-core" +version = "1.0.1" +source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +dependencies = [ + "bytemuck", + "rand_core", +] + +[[package]] +name = "risc0-groth16" +version = "1.0.1" +source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ec", + "ark-groth16", + "ark-serialize", + "bytemuck", + "hex", + "num-bigint 0.4.6", + "num-traits", + "risc0-binfmt", + "risc0-core", + "risc0-zkp", + "serde", + "serde_json", + "tempfile", + "tracing", +] + +[[package]] +name = "risc0-sys" +version = "1.0.1" +source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +dependencies = [ + "cc", + "risc0-build-kernel", +] + +[[package]] +name = "risc0-zkp" +version = "1.0.1" +source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +dependencies = [ + "anyhow", + "blake2", + "bytemuck", + "cfg-if", + "digest", + "ff", + "hex", + "hex-literal", + "ndarray", + "nvtx", + "parking_lot", + "paste", + "rand", + "rand_core", + "rayon", + "risc0-core", + "risc0-sys", + "risc0-zkvm-platform", + "serde", + "sha2", + "tracing", +] + +[[package]] +name = "risc0-zkvm" +version = "1.0.1" +source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +dependencies = [ + "addr2line", + "anyhow", + "bincode", + "bonsai-sdk", + "bytemuck", + "bytes", + "cfg-if", + "elf", + "getrandom", + "hex", + "lazy-regex", + "nvtx", + "prost", + "rand", + "rayon", + "risc0-binfmt", + "risc0-circuit-recursion", + "risc0-circuit-rv32im", + "risc0-core", + "risc0-groth16", + "risc0-zkp", + "risc0-zkvm-platform", + "rrs-lib", + "rustc-demangle", + "semver", + "serde", + "sha2", + "tempfile", + "tracing", + "typetag", +] + +[[package]] +name = "risc0-zkvm-platform" +version = "1.0.1" +source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +dependencies = [ + "bytemuck", + "getrandom", + "libm", +] + +[[package]] +name = "rrs-lib" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" +dependencies = [ + "downcast-rs", + "paste", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls" +version = "0.23.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4828ea528154ae444e5a642dbb7d5623354030dc9822b83fd9bb79683c7399d0" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki 0.102.5", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.102.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "ruzstd" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5174a470eeb535a721ae9fdd6e291c2411a906b96592182d05217591d5c5cf7b" +dependencies = [ + "byteorder", + "derive_more", + "twox-hash", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "serde_json" +version = "1.0.120" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "thiserror" +version = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "socket2", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls 0.23.11", + "rustls-pki-types", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "static_assertions", +] + +[[package]] +name = "typeid" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "059d83cc991e7a42fc37bd50941885db0888e34209f8cfd9aab07ddec03bc9cf" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "typetag" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "661d18414ec032a49ece2d56eee03636e43c4e8d577047ab334c0ba892e29aaf" +dependencies = [ + "erased-serde", + "inventory", + "once_cell", + "serde", + "typetag-impl", +] + +[[package]] +name = "typetag-impl" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac73887f47b9312552aa90ef477927ff014d63d1920ca8037c6c1951eab64bb1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.71", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "webpki-roots" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "which" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8211e4f58a2b2805adfbefbc07bab82958fc91e3836339b1ab7ae32465dce0d7" +dependencies = [ + "either", + "home", + "rustix", + "winsafe", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "winsafe" +version = "0.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "zip" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775a2b471036342aa69bc5a602bc889cb0a06cda00477d0c69566757d5553d39" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "displaydoc", + "flate2", + "indexmap", + "memchr", + "thiserror", + "zopfli", +] + +[[package]] +name = "zopfli" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +dependencies = [ + "bumpalo", + "crc32fast", + "lockfree-object-pool", + "log", + "once_cell", + "simd-adler32", +] diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.toml b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.toml new file mode 100644 index 000000000..63b3854ee --- /dev/null +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.toml @@ -0,0 +1,11 @@ +[workspace] +resolver = "2" +members = ["host", "methods"] + +# Always optimize; building and running the guest takes much longer without optimization. +[profile.dev] +opt-level = 3 + +[profile.release] +debug = 1 +lto = true diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/Cargo.toml b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/Cargo.toml new file mode 100644 index 000000000..9a994c98f --- /dev/null +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "host" +version = "0.1.0" +edition = "2021" + +[dependencies] +methods = { path = "../methods" } +risc0-zkvm = { git = "https://github.com/risc0/risc0", tag="v1.0.1", default-features = false, features = ["prove"] } +tracing-subscriber = { version = "0.3", features = ["env-filter"] } +serde = "1.0" +bincode = "1.3.3" diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/src/main.rs b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/src/main.rs new file mode 100644 index 000000000..8aa0ab6bc --- /dev/null +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/src/main.rs @@ -0,0 +1,71 @@ +// These constants represent the RISC-V ELF and the image ID generated by risc0-build. +// The ELF is used for proving and the ID is used for verification. +use methods::{FIBONACCI_ELF, FIBONACCI_ID}; +use risc0_zkvm::{default_prover, ExecutorEnv}; + +const PROOF_FILE_PATH: &str = "risc_zero_fibonacci.proof"; +const PUB_INPUT_FILE_PATH: &str = "risc_zero_fibonacci.pub"; +const FIBONACCI_ID_FILE_PATH: &str = "risc_zero_fibonacci_id.bin"; + +fn main() { + // Initialize tracing. In order to view logs, run `RUST_LOG=info cargo run` + tracing_subscriber::fmt() + .with_env_filter(tracing_subscriber::filter::EnvFilter::from_default_env()) + .init(); + + // An executor environment describes the configurations for the zkVM + // including program inputs. + // An default ExecutorEnv can be created like so: + // `let env = ExecutorEnv::builder().build().unwrap();` + // However, this `env` does not have any inputs. + // + // To add guest input to the executor environment, use + // ExecutorEnvBuilder::write(). + // To access this method, you'll need to use ExecutorEnv::builder(), which + // creates an ExecutorEnvBuilder. When you're done adding input, call + // ExecutorEnvBuilder::build(). + + // For example: + let input: u32 = 500; + let env = ExecutorEnv::builder() + .write(&input) + .unwrap() + .build() + .unwrap(); + + // Obtain the default prover. + let prover = default_prover(); + + // Produce a receipt by proving the specified ELF binary. + let receipt = prover.prove(env, FIBONACCI_ELF).unwrap().receipt; + + // Retrieve receipt journal here. + let vars: (u32, u32) = receipt.journal.decode().unwrap(); + + let (a, b) = vars; + + println!("a: {}", a); + println!("b: {}", b); + + let verification_result = receipt.verify(FIBONACCI_ID).is_ok(); + + println!("Verification result: {}", verification_result); + + let serialized = bincode::serialize(&receipt).unwrap(); + + std::fs::write(PROOF_FILE_PATH, serialized).expect("Failed to write proof file"); + + std::fs::write(FIBONACCI_ID_FILE_PATH, convert(&FIBONACCI_ID)) + .expect("Failed to write fibonacci_id file"); + + std::fs::write(PUB_INPUT_FILE_PATH, receipt.journal.bytes) + .expect("Failed to write pub_input file"); +} + +pub fn convert(data: &[u32; 8]) -> [u8; 32] { + let mut res = [0; 32]; + for i in 0..8 { + res[4 * i..4 * (i + 1)].copy_from_slice(&data[i].to_le_bytes()); + } + res +} diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/Cargo.toml b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/Cargo.toml new file mode 100644 index 000000000..e46a466a7 --- /dev/null +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "methods" +version = "0.1.0" +edition = "2021" + +[build-dependencies] +risc0-build = { git = "https://github.com/risc0/risc0", tag="v1.0.1"} + +[package.metadata.risc0] +methods = ["guest"] diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/build.rs b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/build.rs new file mode 100644 index 000000000..08a8a4eb7 --- /dev/null +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/build.rs @@ -0,0 +1,3 @@ +fn main() { + risc0_build::embed_methods(); +} diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.lock b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.lock new file mode 100644 index 000000000..8369c3242 --- /dev/null +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.lock @@ -0,0 +1,774 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "anyhow" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25bdb32cbbdce2b519a9cd7df3a678443100e265d5e25ca763b7572a5104f5f3" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3a13b34da09176a8baba701233fdffbaa7c1b1192ce031a3da4e55ce1f1a56" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-snark", + "ark-std", + "blake2", + "derivative", + "digest", + "sha2", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown", + "itertools", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-groth16" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20ceafa83848c3e390f1cbf124bc3193b3e639b3f02009e0e290809a501b95fc" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown", +] + +[[package]] +name = "ark-relations" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00796b6efc05a3f48225e59cb6a2cda78881e7c390872d5786aaf112f31fb4f0" +dependencies = [ + "ark-ff", + "ark-std", + "tracing", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-snark" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d3cc6833a335bb8a600241889ead68ee89a3cf8448081fb7694c0fe503da63" +dependencies = [ + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bytemuck" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.64", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "either" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" + +[[package]] +name = "elf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" + +[[package]] +name = "fibonacci" +version = "0.1.0" +dependencies = [ + "risc0-zkvm", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "libc" +version = "0.2.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "num-bigint" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "risc0-binfmt" +version = "1.1.0-alpha.1" +source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +dependencies = [ + "anyhow", + "elf", + "risc0-zkp", + "risc0-zkvm-platform", + "serde", + "tracing", +] + +[[package]] +name = "risc0-circuit-recursion" +version = "1.1.0-alpha.1" +source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +dependencies = [ + "anyhow", + "bytemuck", + "hex", + "risc0-core", + "risc0-zkp", + "tracing", +] + +[[package]] +name = "risc0-circuit-rv32im" +version = "1.1.0-alpha.1" +source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +dependencies = [ + "anyhow", + "risc0-binfmt", + "risc0-core", + "risc0-zkp", + "risc0-zkvm-platform", + "serde", + "tracing", +] + +[[package]] +name = "risc0-core" +version = "1.1.0-alpha.1" +source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +dependencies = [ + "bytemuck", + "rand_core", +] + +[[package]] +name = "risc0-groth16" +version = "1.1.0-alpha.1" +source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ec", + "ark-groth16", + "ark-serialize", + "bytemuck", + "hex", + "num-bigint", + "risc0-binfmt", + "risc0-zkp", + "serde", +] + +[[package]] +name = "risc0-zkp" +version = "1.1.0-alpha.1" +source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +dependencies = [ + "anyhow", + "blake2", + "bytemuck", + "cfg-if", + "digest", + "hex", + "hex-literal", + "paste", + "rand_core", + "risc0-core", + "risc0-zkvm-platform", + "serde", + "sha2", + "tracing", +] + +[[package]] +name = "risc0-zkvm" +version = "1.1.0-alpha.1" +source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +dependencies = [ + "anyhow", + "bytemuck", + "cfg-if", + "getrandom", + "hex", + "risc0-binfmt", + "risc0-circuit-recursion", + "risc0-circuit-rv32im", + "risc0-core", + "risc0-groth16", + "risc0-zkp", + "risc0-zkvm-platform", + "rrs-lib", + "semver", + "serde", + "sha2", + "tracing", +] + +[[package]] +name = "risc0-zkvm-platform" +version = "1.1.0-alpha.1" +source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +dependencies = [ + "bytemuck", + "getrandom", + "libm", +] + +[[package]] +name = "rrs-lib" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" +dependencies = [ + "downcast-rs", + "paste", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.202" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.202" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.64", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ad3dee41f36859875573074334c200d1add8e4a87bb37113ebd31d926b7b11f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.64", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "zerocopy" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.64", +] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.64", +] diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.toml b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.toml new file mode 100644 index 000000000..39063d13b --- /dev/null +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "fibonacci" +version = "0.1.0" +edition = "2021" + +[workspace] + +[dependencies] +# If you want to try (experimental) std support, add `features = [ "std" ]` to risc0-zkvm +risc0-zkvm = { git = "https://github.com/risc0/risc0", default-features = false } diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/src/main.rs b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/src/main.rs new file mode 100644 index 000000000..8973a671d --- /dev/null +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/src/main.rs @@ -0,0 +1,22 @@ +#![no_main] +// If you want to try std support, also update the guest Cargo.toml file +#![no_std] // std support is experimental + +use risc0_zkvm::guest::env; + +risc0_zkvm::guest::entry!(main); + +fn main() { + let n: u32 = env::read::(); + + let mut a: u32 = 0; + let mut b: u32 = 1; + for _ in 0..n { + let mut c = a + b; + c %= 7919; // Modulus to prevent overflow. + a = b; + b = c; + } + + env::commit(&(a, b)); +} diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/src/lib.rs b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/src/lib.rs new file mode 100644 index 000000000..1bdb3085f --- /dev/null +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/src/lib.rs @@ -0,0 +1 @@ +include!(concat!(env!("OUT_DIR"), "/methods.rs")); diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof new file mode 100644 index 0000000000000000000000000000000000000000..8cf9d06eb57d2121d355a38074c77fe20041580d GIT binary patch literal 215590 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

cg2)x1etL+w+_zu11hYcE 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 z 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

cK6funOfJ_V))# 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 BR5btq literal 0 HcmV?d00001 diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.pub b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.pub new file mode 100644 index 0000000000000000000000000000000000000000..1d920b8af7fcc4f5c16d28f21c1acde6b4178689 GIT binary patch literal 8 Pcmeyu!obkR&cFZw3Go4j literal 0 HcmV?d00001 diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci_id.bin b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci_id.bin new file mode 100644 index 000000000..907ee6644 --- /dev/null +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci_id.bin @@ -0,0 +1 @@ +]$[ÙÍ®¯ù‘+À½»8d‚q๠Cß×™¹x9p \ No newline at end of file diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/rust-toolchain.toml b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/rust-toolchain.toml new file mode 100644 index 000000000..36614c30c --- /dev/null +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/rust-toolchain.toml @@ -0,0 +1,4 @@ +[toolchain] +channel = "stable" +components = ["rustfmt", "rust-src"] +profile = "minimal" From 03510e2e65df69aa3e8f25c6a96fea3e467e9eb9 Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 18 Jul 2024 11:29:49 -0300 Subject: [PATCH 04/28] fix: init project correctly --- .../contracts/.gitignore | 15 + .../contracts/.gitmodules | 3 + .../contracts/foundry.toml | 2 + .../contracts/lib/forge-std/.gitattributes | 1 - .../lib/forge-std/.github/workflows/ci.yml | 128 - .../lib/forge-std/.github/workflows/sync.yml | 31 - .../contracts/lib/forge-std/.gitignore | 4 - .../contracts/lib/forge-std/LICENSE-APACHE | 203 - .../contracts/lib/forge-std/LICENSE-MIT | 25 - .../contracts/lib/forge-std/README.md | 250 - .../contracts/lib/forge-std/foundry.toml | 21 - .../contracts/lib/forge-std/package.json | 16 - .../contracts/lib/forge-std/scripts/vm.py | 635 - .../contracts/lib/forge-std/src/Base.sol | 35 - .../contracts/lib/forge-std/src/Script.sol | 27 - .../lib/forge-std/src/StdAssertions.sol | 669 - .../contracts/lib/forge-std/src/StdChains.sol | 259 - .../contracts/lib/forge-std/src/StdCheats.sol | 817 - .../contracts/lib/forge-std/src/StdError.sol | 15 - .../lib/forge-std/src/StdInvariant.sol | 122 - .../contracts/lib/forge-std/src/StdJson.sol | 179 - .../contracts/lib/forge-std/src/StdMath.sol | 43 - .../lib/forge-std/src/StdStorage.sol | 473 - .../contracts/lib/forge-std/src/StdStyle.sol | 333 - .../contracts/lib/forge-std/src/StdToml.sol | 179 - .../contracts/lib/forge-std/src/StdUtils.sol | 226 - .../contracts/lib/forge-std/src/Test.sol | 33 - .../contracts/lib/forge-std/src/Vm.sol | 1763 -- .../contracts/lib/forge-std/src/console.sol | 1552 -- .../contracts/lib/forge-std/src/console2.sol | 4 - .../lib/forge-std/src/interfaces/IERC1155.sol | 105 - .../lib/forge-std/src/interfaces/IERC165.sol | 12 - .../lib/forge-std/src/interfaces/IERC20.sol | 43 - .../lib/forge-std/src/interfaces/IERC4626.sol | 190 - .../lib/forge-std/src/interfaces/IERC721.sol | 164 - .../forge-std/src/interfaces/IMulticall3.sol | 73 - .../lib/forge-std/src/mocks/MockERC20.sol | 234 - .../lib/forge-std/src/mocks/MockERC721.sol | 231 - .../lib/forge-std/src/safeconsole.sol | 13248 ---------------- .../lib/forge-std/test/StdAssertions.t.sol | 145 - .../lib/forge-std/test/StdChains.t.sol | 226 - .../lib/forge-std/test/StdCheats.t.sol | 618 - .../lib/forge-std/test/StdError.t.sol | 120 - .../lib/forge-std/test/StdJson.t.sol | 49 - .../lib/forge-std/test/StdMath.t.sol | 212 - .../lib/forge-std/test/StdStorage.t.sol | 463 - .../lib/forge-std/test/StdStyle.t.sol | 110 - .../lib/forge-std/test/StdToml.t.sol | 49 - .../lib/forge-std/test/StdUtils.t.sol | 342 - .../contracts/lib/forge-std/test/Vm.t.sol | 15 - .../test/compilation/CompilationScript.sol | 10 - .../compilation/CompilationScriptBase.sol | 10 - .../test/compilation/CompilationTest.sol | 10 - .../test/compilation/CompilationTestBase.sol | 10 - .../test/fixtures/broadcast.log.json | 187 - .../lib/forge-std/test/fixtures/test.json | 8 - .../lib/forge-std/test/fixtures/test.toml | 6 - .../lib/forge-std/test/mocks/MockERC20.t.sol | 441 - .../lib/forge-std/test/mocks/MockERC721.t.sol | 721 - 59 files changed, 20 insertions(+), 26095 deletions(-) create mode 100644 examples/validating-public-input/contracts/.gitignore create mode 100644 examples/validating-public-input/contracts/.gitmodules delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/.gitattributes delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/.github/workflows/ci.yml delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/.github/workflows/sync.yml delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/.gitignore delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/LICENSE-APACHE delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/LICENSE-MIT delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/README.md delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/foundry.toml delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/package.json delete mode 100755 examples/validating-public-input/contracts/lib/forge-std/scripts/vm.py delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/Base.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/Script.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdAssertions.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdChains.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdCheats.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdError.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdInvariant.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdJson.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdMath.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdStorage.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdStyle.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdToml.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/StdUtils.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/Test.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/Vm.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/console.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/console2.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC1155.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC165.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC20.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC4626.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC721.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IMulticall3.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC20.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC721.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/src/safeconsole.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdAssertions.t.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdChains.t.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdCheats.t.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdError.t.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdJson.t.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdMath.t.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdStorage.t.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdStyle.t.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdToml.t.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/StdUtils.t.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/Vm.t.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScript.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTest.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTestBase.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/fixtures/broadcast.log.json delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.json delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.toml delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC20.t.sol delete mode 100644 examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC721.t.sol diff --git a/examples/validating-public-input/contracts/.gitignore b/examples/validating-public-input/contracts/.gitignore new file mode 100644 index 000000000..7921ae371 --- /dev/null +++ b/examples/validating-public-input/contracts/.gitignore @@ -0,0 +1,15 @@ +# Compiler files +cache/ +out/ + +# Ignores development broadcast logs +!/broadcast +/broadcast/*/31337/ +/broadcast/**/dry-run/ +broadcast/ + +# Docs +docs/ + +# Dotenv file +.env diff --git a/examples/validating-public-input/contracts/.gitmodules b/examples/validating-public-input/contracts/.gitmodules new file mode 100644 index 000000000..888d42dcd --- /dev/null +++ b/examples/validating-public-input/contracts/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/examples/validating-public-input/contracts/foundry.toml b/examples/validating-public-input/contracts/foundry.toml index 2bc70ba51..25b918f9c 100644 --- a/examples/validating-public-input/contracts/foundry.toml +++ b/examples/validating-public-input/contracts/foundry.toml @@ -2,3 +2,5 @@ src = "src" out = "out" libs = ["lib"] + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/examples/validating-public-input/contracts/lib/forge-std/.gitattributes b/examples/validating-public-input/contracts/lib/forge-std/.gitattributes deleted file mode 100644 index 27042d458..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -src/Vm.sol linguist-generated diff --git a/examples/validating-public-input/contracts/lib/forge-std/.github/workflows/ci.yml b/examples/validating-public-input/contracts/lib/forge-std/.github/workflows/ci.yml deleted file mode 100644 index 2d68e91fb..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/.github/workflows/ci.yml +++ /dev/null @@ -1,128 +0,0 @@ -name: CI - -on: - workflow_dispatch: - pull_request: - push: - branches: - - master - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: nightly - - - name: Print forge version - run: forge --version - - # Backwards compatibility checks: - # - the oldest and newest version of each supported minor version - # - versions with specific issues - - name: Check compatibility with latest - if: always() - run: | - output=$(forge build --skip test) - if echo "$output" | grep -q "Warning"; then - echo "$output" - exit 1 - fi - - - name: Check compatibility with 0.8.0 - if: always() - run: | - output=$(forge build --skip test --use solc:0.8.0) - if echo "$output" | grep -q "Warning"; then - echo "$output" - exit 1 - fi - - - name: Check compatibility with 0.7.6 - if: always() - run: | - output=$(forge build --skip test --use solc:0.7.6) - if echo "$output" | grep -q "Warning"; then - echo "$output" - exit 1 - fi - - - name: Check compatibility with 0.7.0 - if: always() - run: | - output=$(forge build --skip test --use solc:0.7.0) - if echo "$output" | grep -q "Warning"; then - echo "$output" - exit 1 - fi - - - name: Check compatibility with 0.6.12 - if: always() - run: | - output=$(forge build --skip test --use solc:0.6.12) - if echo "$output" | grep -q "Warning"; then - echo "$output" - exit 1 - fi - - - name: Check compatibility with 0.6.2 - if: always() - run: | - output=$(forge build --skip test --use solc:0.6.2) - if echo "$output" | grep -q "Warning"; then - echo "$output" - exit 1 - fi - - # via-ir compilation time checks. - - name: Measure compilation time of Test with 0.8.17 --via-ir - if: always() - run: forge build --skip test --contracts test/compilation/CompilationTest.sol --use solc:0.8.17 --via-ir - - - name: Measure compilation time of TestBase with 0.8.17 --via-ir - if: always() - run: forge build --skip test --contracts test/compilation/CompilationTestBase.sol --use solc:0.8.17 --via-ir - - - name: Measure compilation time of Script with 0.8.17 --via-ir - if: always() - run: forge build --skip test --contracts test/compilation/CompilationScript.sol --use solc:0.8.17 --via-ir - - - name: Measure compilation time of ScriptBase with 0.8.17 --via-ir - if: always() - run: forge build --skip test --contracts test/compilation/CompilationScriptBase.sol --use solc:0.8.17 --via-ir - - test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: nightly - - - name: Print forge version - run: forge --version - - - name: Run tests - run: forge test -vvv - - fmt: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: nightly - - - name: Print forge version - run: forge --version - - - name: Check formatting - run: forge fmt --check diff --git a/examples/validating-public-input/contracts/lib/forge-std/.github/workflows/sync.yml b/examples/validating-public-input/contracts/lib/forge-std/.github/workflows/sync.yml deleted file mode 100644 index 9b170f0b7..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/.github/workflows/sync.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Sync Release Branch - -on: - release: - types: - - created - -jobs: - sync-release-branch: - runs-on: ubuntu-latest - if: startsWith(github.event.release.tag_name, 'v1') - steps: - - name: Check out the repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - ref: v1 - - # The email is derived from the bots user id, - # found here: https://api.github.com/users/github-actions%5Bbot%5D - - name: Configure Git - run: | - git config user.name github-actions[bot] - git config user.email 41898282+github-actions[bot]@users.noreply.github.com - - - name: Sync Release Branch - run: | - git fetch --tags - git checkout v1 - git reset --hard ${GITHUB_REF} - git push --force diff --git a/examples/validating-public-input/contracts/lib/forge-std/.gitignore b/examples/validating-public-input/contracts/lib/forge-std/.gitignore deleted file mode 100644 index 756106d38..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -cache/ -out/ -.vscode -.idea diff --git a/examples/validating-public-input/contracts/lib/forge-std/LICENSE-APACHE b/examples/validating-public-input/contracts/lib/forge-std/LICENSE-APACHE deleted file mode 100644 index cf01a499f..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/LICENSE-APACHE +++ /dev/null @@ -1,203 +0,0 @@ -Copyright Contributors to Forge Standard Library - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/examples/validating-public-input/contracts/lib/forge-std/LICENSE-MIT b/examples/validating-public-input/contracts/lib/forge-std/LICENSE-MIT deleted file mode 100644 index 28f98304a..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/LICENSE-MIT +++ /dev/null @@ -1,25 +0,0 @@ -Copyright Contributors to Forge Standard Library - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE O THE USE OR OTHER -DEALINGS IN THE SOFTWARE.R diff --git a/examples/validating-public-input/contracts/lib/forge-std/README.md b/examples/validating-public-input/contracts/lib/forge-std/README.md deleted file mode 100644 index 0cb86602e..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/README.md +++ /dev/null @@ -1,250 +0,0 @@ -# Forge Standard Library • [![CI status](https://github.com/foundry-rs/forge-std/actions/workflows/ci.yml/badge.svg)](https://github.com/foundry-rs/forge-std/actions/workflows/ci.yml) - -Forge Standard Library is a collection of helpful contracts and libraries for use with [Forge and Foundry](https://github.com/foundry-rs/foundry). It leverages Forge's cheatcodes to make writing tests easier and faster, while improving the UX of cheatcodes. - -**Learn how to use Forge-Std with the [📖 Foundry Book (Forge-Std Guide)](https://book.getfoundry.sh/forge/forge-std.html).** - -## Install - -```bash -forge install foundry-rs/forge-std -``` - -## Contracts -### stdError - -This is a helper contract for errors and reverts. In Forge, this contract is particularly helpful for the `expectRevert` cheatcode, as it provides all compiler builtin errors. - -See the contract itself for all error codes. - -#### Example usage - -```solidity - -import "forge-std/Test.sol"; - -contract TestContract is Test { - ErrorsTest test; - - function setUp() public { - test = new ErrorsTest(); - } - - function testExpectArithmetic() public { - vm.expectRevert(stdError.arithmeticError); - test.arithmeticError(10); - } -} - -contract ErrorsTest { - function arithmeticError(uint256 a) public { - uint256 a = a - 100; - } -} -``` - -### stdStorage - -This is a rather large contract due to all of the overloading to make the UX decent. Primarily, it is a wrapper around the `record` and `accesses` cheatcodes. It can *always* find and write the storage slot(s) associated with a particular variable without knowing the storage layout. The one _major_ caveat to this is while a slot can be found for packed storage variables, we can't write to that variable safely. If a user tries to write to a packed slot, the execution throws an error, unless it is uninitialized (`bytes32(0)`). - -This works by recording all `SLOAD`s and `SSTORE`s during a function call. If there is a single slot read or written to, it immediately returns the slot. Otherwise, behind the scenes, we iterate through and check each one (assuming the user passed in a `depth` parameter). If the variable is a struct, you can pass in a `depth` parameter which is basically the field depth. - -I.e.: -```solidity -struct T { - // depth 0 - uint256 a; - // depth 1 - uint256 b; -} -``` - -#### Example usage - -```solidity -import "forge-std/Test.sol"; - -contract TestContract is Test { - using stdStorage for StdStorage; - - Storage test; - - function setUp() public { - test = new Storage(); - } - - function testFindExists() public { - // Lets say we want to find the slot for the public - // variable `exists`. We just pass in the function selector - // to the `find` command - uint256 slot = stdstore.target(address(test)).sig("exists()").find(); - assertEq(slot, 0); - } - - function testWriteExists() public { - // Lets say we want to write to the slot for the public - // variable `exists`. We just pass in the function selector - // to the `checked_write` command - stdstore.target(address(test)).sig("exists()").checked_write(100); - assertEq(test.exists(), 100); - } - - // It supports arbitrary storage layouts, like assembly based storage locations - function testFindHidden() public { - // `hidden` is a random hash of a bytes, iteration through slots would - // not find it. Our mechanism does - // Also, you can use the selector instead of a string - uint256 slot = stdstore.target(address(test)).sig(test.hidden.selector).find(); - assertEq(slot, uint256(keccak256("my.random.var"))); - } - - // If targeting a mapping, you have to pass in the keys necessary to perform the find - // i.e.: - function testFindMapping() public { - uint256 slot = stdstore - .target(address(test)) - .sig(test.map_addr.selector) - .with_key(address(this)) - .find(); - // in the `Storage` constructor, we wrote that this address' value was 1 in the map - // so when we load the slot, we expect it to be 1 - assertEq(uint(vm.load(address(test), bytes32(slot))), 1); - } - - // If the target is a struct, you can specify the field depth: - function testFindStruct() public { - // NOTE: see the depth parameter - 0 means 0th field, 1 means 1st field, etc. - uint256 slot_for_a_field = stdstore - .target(address(test)) - .sig(test.basicStruct.selector) - .depth(0) - .find(); - - uint256 slot_for_b_field = stdstore - .target(address(test)) - .sig(test.basicStruct.selector) - .depth(1) - .find(); - - assertEq(uint(vm.load(address(test), bytes32(slot_for_a_field))), 1); - assertEq(uint(vm.load(address(test), bytes32(slot_for_b_field))), 2); - } -} - -// A complex storage contract -contract Storage { - struct UnpackedStruct { - uint256 a; - uint256 b; - } - - constructor() { - map_addr[msg.sender] = 1; - } - - uint256 public exists = 1; - mapping(address => uint256) public map_addr; - // mapping(address => Packed) public map_packed; - mapping(address => UnpackedStruct) public map_struct; - mapping(address => mapping(address => uint256)) public deep_map; - mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct; - UnpackedStruct public basicStruct = UnpackedStruct({ - a: 1, - b: 2 - }); - - function hidden() public view returns (bytes32 t) { - // an extremely hidden storage slot - bytes32 slot = keccak256("my.random.var"); - assembly { - t := sload(slot) - } - } -} -``` - -### stdCheats - -This is a wrapper over miscellaneous cheatcodes that need wrappers to be more dev friendly. Currently there are only functions related to `prank`. In general, users may expect ETH to be put into an address on `prank`, but this is not the case for safety reasons. Explicitly this `hoax` function should only be used for address that have expected balances as it will get overwritten. If an address already has ETH, you should just use `prank`. If you want to change that balance explicitly, just use `deal`. If you want to do both, `hoax` is also right for you. - - -#### Example usage: -```solidity - -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "forge-std/Test.sol"; - -// Inherit the stdCheats -contract StdCheatsTest is Test { - Bar test; - function setUp() public { - test = new Bar(); - } - - function testHoax() public { - // we call `hoax`, which gives the target address - // eth and then calls `prank` - hoax(address(1337)); - test.bar{value: 100}(address(1337)); - - // overloaded to allow you to specify how much eth to - // initialize the address with - hoax(address(1337), 1); - test.bar{value: 1}(address(1337)); - } - - function testStartHoax() public { - // we call `startHoax`, which gives the target address - // eth and then calls `startPrank` - // - // it is also overloaded so that you can specify an eth amount - startHoax(address(1337)); - test.bar{value: 100}(address(1337)); - test.bar{value: 100}(address(1337)); - vm.stopPrank(); - test.bar(address(this)); - } -} - -contract Bar { - function bar(address expectedSender) public payable { - require(msg.sender == expectedSender, "!prank"); - } -} -``` - -### Std Assertions - -Contains various assertions. - -### `console.log` - -Usage follows the same format as [Hardhat](https://hardhat.org/hardhat-network/reference/#console-log). -It's recommended to use `console2.sol` as shown below, as this will show the decoded logs in Forge traces. - -```solidity -// import it indirectly via Test.sol -import "forge-std/Test.sol"; -// or directly import it -import "forge-std/console2.sol"; -... -console2.log(someValue); -``` - -If you need compatibility with Hardhat, you must use the standard `console.sol` instead. -Due to a bug in `console.sol`, logs that use `uint256` or `int256` types will not be properly decoded in Forge traces. - -```solidity -// import it indirectly via Test.sol -import "forge-std/Test.sol"; -// or directly import it -import "forge-std/console.sol"; -... -console.log(someValue); -``` - -## License - -Forge Standard Library is offered under either [MIT](LICENSE-MIT) or [Apache 2.0](LICENSE-APACHE) license. diff --git a/examples/validating-public-input/contracts/lib/forge-std/foundry.toml b/examples/validating-public-input/contracts/lib/forge-std/foundry.toml deleted file mode 100644 index 2bc66fa77..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/foundry.toml +++ /dev/null @@ -1,21 +0,0 @@ -[profile.default] -fs_permissions = [{ access = "read-write", path = "./"}] - -[rpc_endpoints] -# The RPC URLs are modified versions of the default for testing initialization. -mainnet = "https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX" # Different API key. -optimism_sepolia = "https://sepolia.optimism.io/" # Adds a trailing slash. -arbitrum_one_sepolia = "https://sepolia-rollup.arbitrum.io/rpc/" # Adds a trailing slash. -needs_undefined_env_var = "${UNDEFINED_RPC_URL_PLACEHOLDER}" - -[fmt] -# These are all the `forge fmt` defaults. -line_length = 120 -tab_width = 4 -bracket_spacing = false -int_types = 'long' -multiline_func_header = 'attributes_first' -quote_style = 'double' -number_underscore = 'preserve' -single_line_statement_blocks = 'preserve' -ignore = ["src/console.sol", "src/console2.sol"] \ No newline at end of file diff --git a/examples/validating-public-input/contracts/lib/forge-std/package.json b/examples/validating-public-input/contracts/lib/forge-std/package.json deleted file mode 100644 index 7e6618589..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "forge-std", - "version": "1.9.1", - "description": "Forge Standard Library is a collection of helpful contracts and libraries for use with Forge and Foundry.", - "homepage": "https://book.getfoundry.sh/forge/forge-std", - "bugs": "https://github.com/foundry-rs/forge-std/issues", - "license": "(Apache-2.0 OR MIT)", - "author": "Contributors to Forge Standard Library", - "files": [ - "src/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/foundry-rs/forge-std.git" - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/scripts/vm.py b/examples/validating-public-input/contracts/lib/forge-std/scripts/vm.py deleted file mode 100755 index f0537db9b..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/scripts/vm.py +++ /dev/null @@ -1,635 +0,0 @@ -#!/usr/bin/env python3 - -import copy -import json -import re -import subprocess -from enum import Enum as PyEnum -from typing import Callable -from urllib import request - -VoidFn = Callable[[], None] - -CHEATCODES_JSON_URL = "https://raw.githubusercontent.com/foundry-rs/foundry/master/crates/cheatcodes/assets/cheatcodes.json" -OUT_PATH = "src/Vm.sol" - -VM_SAFE_DOC = """\ -/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may -/// result in Script simulations differing from on-chain execution. It is recommended to only use -/// these cheats in scripts. -""" - -VM_DOC = """\ -/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used -/// in tests, but it is not recommended to use these cheats in scripts. -""" - - -def main(): - json_str = request.urlopen(CHEATCODES_JSON_URL).read().decode("utf-8") - contract = Cheatcodes.from_json(json_str) - - ccs = contract.cheatcodes - ccs = list(filter(lambda cc: cc.status not in ["experimental", "internal"], ccs)) - ccs.sort(key=lambda cc: cc.func.id) - - safe = list(filter(lambda cc: cc.safety == "safe", ccs)) - safe.sort(key=CmpCheatcode) - unsafe = list(filter(lambda cc: cc.safety == "unsafe", ccs)) - unsafe.sort(key=CmpCheatcode) - assert len(safe) + len(unsafe) == len(ccs) - - prefix_with_group_headers(safe) - prefix_with_group_headers(unsafe) - - out = "" - - out += "// Automatically @generated by scripts/vm.py. Do not modify manually.\n\n" - - pp = CheatcodesPrinter( - spdx_identifier="MIT OR Apache-2.0", - solidity_requirement=">=0.6.2 <0.9.0", - abicoder_pragma=True, - ) - pp.p_prelude() - pp.prelude = False - out += pp.finish() - - out += "\n\n" - out += VM_SAFE_DOC - vm_safe = Cheatcodes( - # TODO: Custom errors were introduced in 0.8.4 - errors=[], # contract.errors - events=contract.events, - enums=contract.enums, - structs=contract.structs, - cheatcodes=safe, - ) - pp.p_contract(vm_safe, "VmSafe") - out += pp.finish() - - out += "\n\n" - out += VM_DOC - vm_unsafe = Cheatcodes( - errors=[], - events=[], - enums=[], - structs=[], - cheatcodes=unsafe, - ) - pp.p_contract(vm_unsafe, "Vm", "VmSafe") - out += pp.finish() - - # Compatibility with <0.8.0 - def memory_to_calldata(m: re.Match) -> str: - return " calldata " + m.group(1) - - out = re.sub(r" memory (.*returns)", memory_to_calldata, out) - - with open(OUT_PATH, "w") as f: - f.write(out) - - forge_fmt = ["forge", "fmt", OUT_PATH] - res = subprocess.run(forge_fmt) - assert res.returncode == 0, f"command failed: {forge_fmt}" - - print(f"Wrote to {OUT_PATH}") - - -class CmpCheatcode: - cheatcode: "Cheatcode" - - def __init__(self, cheatcode: "Cheatcode"): - self.cheatcode = cheatcode - - def __lt__(self, other: "CmpCheatcode") -> bool: - return cmp_cheatcode(self.cheatcode, other.cheatcode) < 0 - - def __eq__(self, other: "CmpCheatcode") -> bool: - return cmp_cheatcode(self.cheatcode, other.cheatcode) == 0 - - def __gt__(self, other: "CmpCheatcode") -> bool: - return cmp_cheatcode(self.cheatcode, other.cheatcode) > 0 - - -def cmp_cheatcode(a: "Cheatcode", b: "Cheatcode") -> int: - if a.group != b.group: - return -1 if a.group < b.group else 1 - if a.status != b.status: - return -1 if a.status < b.status else 1 - if a.safety != b.safety: - return -1 if a.safety < b.safety else 1 - if a.func.id != b.func.id: - return -1 if a.func.id < b.func.id else 1 - return 0 - - -# HACK: A way to add group header comments without having to modify printer code -def prefix_with_group_headers(cheats: list["Cheatcode"]): - s = set() - for i, cheat in enumerate(cheats): - if cheat.group in s: - continue - - s.add(cheat.group) - - c = copy.deepcopy(cheat) - c.func.description = "" - c.func.declaration = f"// ======== {group(c.group)} ========" - cheats.insert(i, c) - return cheats - - -def group(s: str) -> str: - if s == "evm": - return "EVM" - if s == "json": - return "JSON" - return s[0].upper() + s[1:] - - -class Visibility(PyEnum): - EXTERNAL: str = "external" - PUBLIC: str = "public" - INTERNAL: str = "internal" - PRIVATE: str = "private" - - def __str__(self): - return self.value - - -class Mutability(PyEnum): - PURE: str = "pure" - VIEW: str = "view" - NONE: str = "" - - def __str__(self): - return self.value - - -class Function: - id: str - description: str - declaration: str - visibility: Visibility - mutability: Mutability - signature: str - selector: str - selector_bytes: bytes - - def __init__( - self, - id: str, - description: str, - declaration: str, - visibility: Visibility, - mutability: Mutability, - signature: str, - selector: str, - selector_bytes: bytes, - ): - self.id = id - self.description = description - self.declaration = declaration - self.visibility = visibility - self.mutability = mutability - self.signature = signature - self.selector = selector - self.selector_bytes = selector_bytes - - @staticmethod - def from_dict(d: dict) -> "Function": - return Function( - d["id"], - d["description"], - d["declaration"], - Visibility(d["visibility"]), - Mutability(d["mutability"]), - d["signature"], - d["selector"], - bytes(d["selectorBytes"]), - ) - - -class Cheatcode: - func: Function - group: str - status: str - safety: str - - def __init__(self, func: Function, group: str, status: str, safety: str): - self.func = func - self.group = group - self.status = status - self.safety = safety - - @staticmethod - def from_dict(d: dict) -> "Cheatcode": - return Cheatcode( - Function.from_dict(d["func"]), - str(d["group"]), - str(d["status"]), - str(d["safety"]), - ) - - -class Error: - name: str - description: str - declaration: str - - def __init__(self, name: str, description: str, declaration: str): - self.name = name - self.description = description - self.declaration = declaration - - @staticmethod - def from_dict(d: dict) -> "Error": - return Error(**d) - - -class Event: - name: str - description: str - declaration: str - - def __init__(self, name: str, description: str, declaration: str): - self.name = name - self.description = description - self.declaration = declaration - - @staticmethod - def from_dict(d: dict) -> "Event": - return Event(**d) - - -class EnumVariant: - name: str - description: str - - def __init__(self, name: str, description: str): - self.name = name - self.description = description - - -class Enum: - name: str - description: str - variants: list[EnumVariant] - - def __init__(self, name: str, description: str, variants: list[EnumVariant]): - self.name = name - self.description = description - self.variants = variants - - @staticmethod - def from_dict(d: dict) -> "Enum": - return Enum( - d["name"], - d["description"], - list(map(lambda v: EnumVariant(**v), d["variants"])), - ) - - -class StructField: - name: str - ty: str - description: str - - def __init__(self, name: str, ty: str, description: str): - self.name = name - self.ty = ty - self.description = description - - -class Struct: - name: str - description: str - fields: list[StructField] - - def __init__(self, name: str, description: str, fields: list[StructField]): - self.name = name - self.description = description - self.fields = fields - - @staticmethod - def from_dict(d: dict) -> "Struct": - return Struct( - d["name"], - d["description"], - list(map(lambda f: StructField(**f), d["fields"])), - ) - - -class Cheatcodes: - errors: list[Error] - events: list[Event] - enums: list[Enum] - structs: list[Struct] - cheatcodes: list[Cheatcode] - - def __init__( - self, - errors: list[Error], - events: list[Event], - enums: list[Enum], - structs: list[Struct], - cheatcodes: list[Cheatcode], - ): - self.errors = errors - self.events = events - self.enums = enums - self.structs = structs - self.cheatcodes = cheatcodes - - @staticmethod - def from_dict(d: dict) -> "Cheatcodes": - return Cheatcodes( - errors=[Error.from_dict(e) for e in d["errors"]], - events=[Event.from_dict(e) for e in d["events"]], - enums=[Enum.from_dict(e) for e in d["enums"]], - structs=[Struct.from_dict(e) for e in d["structs"]], - cheatcodes=[Cheatcode.from_dict(e) for e in d["cheatcodes"]], - ) - - @staticmethod - def from_json(s) -> "Cheatcodes": - return Cheatcodes.from_dict(json.loads(s)) - - @staticmethod - def from_json_file(file_path: str) -> "Cheatcodes": - with open(file_path, "r") as f: - return Cheatcodes.from_dict(json.load(f)) - - -class Item(PyEnum): - ERROR: str = "error" - EVENT: str = "event" - ENUM: str = "enum" - STRUCT: str = "struct" - FUNCTION: str = "function" - - -class ItemOrder: - _list: list[Item] - - def __init__(self, list: list[Item]) -> None: - assert len(list) <= len(Item), "list must not contain more items than Item" - assert len(list) == len(set(list)), "list must not contain duplicates" - self._list = list - pass - - def get_list(self) -> list[Item]: - return self._list - - @staticmethod - def default() -> "ItemOrder": - return ItemOrder( - [ - Item.ERROR, - Item.EVENT, - Item.ENUM, - Item.STRUCT, - Item.FUNCTION, - ] - ) - - -class CheatcodesPrinter: - buffer: str - - prelude: bool - spdx_identifier: str - solidity_requirement: str - abicoder_v2: bool - - block_doc_style: bool - - indent_level: int - _indent_str: str - - nl_str: str - - items_order: ItemOrder - - def __init__( - self, - buffer: str = "", - prelude: bool = True, - spdx_identifier: str = "UNLICENSED", - solidity_requirement: str = "", - abicoder_pragma: bool = False, - block_doc_style: bool = False, - indent_level: int = 0, - indent_with: int | str = 4, - nl_str: str = "\n", - items_order: ItemOrder = ItemOrder.default(), - ): - self.prelude = prelude - self.spdx_identifier = spdx_identifier - self.solidity_requirement = solidity_requirement - self.abicoder_v2 = abicoder_pragma - self.block_doc_style = block_doc_style - self.buffer = buffer - self.indent_level = indent_level - self.nl_str = nl_str - - if isinstance(indent_with, int): - assert indent_with >= 0 - self._indent_str = " " * indent_with - elif isinstance(indent_with, str): - self._indent_str = indent_with - else: - assert False, "indent_with must be int or str" - - self.items_order = items_order - - def finish(self) -> str: - ret = self.buffer.rstrip() - self.buffer = "" - return ret - - def p_contract(self, contract: Cheatcodes, name: str, inherits: str = ""): - if self.prelude: - self.p_prelude(contract) - - self._p_str("interface ") - name = name.strip() - if name != "": - self._p_str(name) - self._p_str(" ") - if inherits != "": - self._p_str("is ") - self._p_str(inherits) - self._p_str(" ") - self._p_str("{") - self._p_nl() - self._with_indent(lambda: self._p_items(contract)) - self._p_str("}") - self._p_nl() - - def _p_items(self, contract: Cheatcodes): - for item in self.items_order.get_list(): - if item == Item.ERROR: - self.p_errors(contract.errors) - elif item == Item.EVENT: - self.p_events(contract.events) - elif item == Item.ENUM: - self.p_enums(contract.enums) - elif item == Item.STRUCT: - self.p_structs(contract.structs) - elif item == Item.FUNCTION: - self.p_functions(contract.cheatcodes) - else: - assert False, f"unknown item {item}" - - def p_prelude(self, contract: Cheatcodes | None = None): - self._p_str(f"// SPDX-License-Identifier: {self.spdx_identifier}") - self._p_nl() - - if self.solidity_requirement != "": - req = self.solidity_requirement - elif contract and len(contract.errors) > 0: - req = ">=0.8.4 <0.9.0" - else: - req = ">=0.6.0 <0.9.0" - self._p_str(f"pragma solidity {req};") - self._p_nl() - - if self.abicoder_v2: - self._p_str("pragma experimental ABIEncoderV2;") - self._p_nl() - - self._p_nl() - - def p_errors(self, errors: list[Error]): - for error in errors: - self._p_line(lambda: self.p_error(error)) - - def p_error(self, error: Error): - self._p_comment(error.description, doc=True) - self._p_line(lambda: self._p_str(error.declaration)) - - def p_events(self, events: list[Event]): - for event in events: - self._p_line(lambda: self.p_event(event)) - - def p_event(self, event: Event): - self._p_comment(event.description, doc=True) - self._p_line(lambda: self._p_str(event.declaration)) - - def p_enums(self, enums: list[Enum]): - for enum in enums: - self._p_line(lambda: self.p_enum(enum)) - - def p_enum(self, enum: Enum): - self._p_comment(enum.description, doc=True) - self._p_line(lambda: self._p_str(f"enum {enum.name} {{")) - self._with_indent(lambda: self.p_enum_variants(enum.variants)) - self._p_line(lambda: self._p_str("}")) - - def p_enum_variants(self, variants: list[EnumVariant]): - for i, variant in enumerate(variants): - self._p_indent() - self._p_comment(variant.description) - - self._p_indent() - self._p_str(variant.name) - if i < len(variants) - 1: - self._p_str(",") - self._p_nl() - - def p_structs(self, structs: list[Struct]): - for struct in structs: - self._p_line(lambda: self.p_struct(struct)) - - def p_struct(self, struct: Struct): - self._p_comment(struct.description, doc=True) - self._p_line(lambda: self._p_str(f"struct {struct.name} {{")) - self._with_indent(lambda: self.p_struct_fields(struct.fields)) - self._p_line(lambda: self._p_str("}")) - - def p_struct_fields(self, fields: list[StructField]): - for field in fields: - self._p_line(lambda: self.p_struct_field(field)) - - def p_struct_field(self, field: StructField): - self._p_comment(field.description) - self._p_indented(lambda: self._p_str(f"{field.ty} {field.name};")) - - def p_functions(self, cheatcodes: list[Cheatcode]): - for cheatcode in cheatcodes: - self._p_line(lambda: self.p_function(cheatcode.func)) - - def p_function(self, func: Function): - self._p_comment(func.description, doc=True) - self._p_line(lambda: self._p_str(func.declaration)) - - def _p_comment(self, s: str, doc: bool = False): - s = s.strip() - if s == "": - return - - s = map(lambda line: line.lstrip(), s.split("\n")) - if self.block_doc_style: - self._p_str("/*") - if doc: - self._p_str("*") - self._p_nl() - for line in s: - self._p_indent() - self._p_str(" ") - if doc: - self._p_str("* ") - self._p_str(line) - self._p_nl() - self._p_indent() - self._p_str(" */") - self._p_nl() - else: - first_line = True - for line in s: - if not first_line: - self._p_indent() - first_line = False - - if doc: - self._p_str("/// ") - else: - self._p_str("// ") - self._p_str(line) - self._p_nl() - - def _with_indent(self, f: VoidFn): - self._inc_indent() - f() - self._dec_indent() - - def _p_line(self, f: VoidFn): - self._p_indent() - f() - self._p_nl() - - def _p_indented(self, f: VoidFn): - self._p_indent() - f() - - def _p_indent(self): - for _ in range(self.indent_level): - self._p_str(self._indent_str) - - def _p_nl(self): - self._p_str(self.nl_str) - - def _p_str(self, txt: str): - self.buffer += txt - - def _inc_indent(self): - self.indent_level += 1 - - def _dec_indent(self): - self.indent_level -= 1 - - -if __name__ == "__main__": - main() diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/Base.sol b/examples/validating-public-input/contracts/lib/forge-std/src/Base.sol deleted file mode 100644 index 851ac0cd2..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/Base.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -import {StdStorage} from "./StdStorage.sol"; -import {Vm, VmSafe} from "./Vm.sol"; - -abstract contract CommonBase { - // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D. - address internal constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); - // console.sol and console2.sol work by executing a staticcall to this address. - address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67; - // Used when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy. - address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; - // Default address for tx.origin and msg.sender, 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38. - address internal constant DEFAULT_SENDER = address(uint160(uint256(keccak256("foundry default caller")))); - // Address of the test contract, deployed by the DEFAULT_SENDER. - address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f; - // Deterministic deployment address of the Multicall3 contract. - address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11; - // The order of the secp256k1 curve. - uint256 internal constant SECP256K1_ORDER = - 115792089237316195423570985008687907852837564279074904382605163141518161494337; - - uint256 internal constant UINT256_MAX = - 115792089237316195423570985008687907853269984665640564039457584007913129639935; - - Vm internal constant vm = Vm(VM_ADDRESS); - StdStorage internal stdstore; -} - -abstract contract TestBase is CommonBase {} - -abstract contract ScriptBase is CommonBase { - VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS); -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/Script.sol b/examples/validating-public-input/contracts/lib/forge-std/src/Script.sol deleted file mode 100644 index 94e75f6cb..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/Script.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -// 💬 ABOUT -// Forge Std's default Script. - -// 🧩 MODULES -import {console} from "./console.sol"; -import {console2} from "./console2.sol"; -import {safeconsole} from "./safeconsole.sol"; -import {StdChains} from "./StdChains.sol"; -import {StdCheatsSafe} from "./StdCheats.sol"; -import {stdJson} from "./StdJson.sol"; -import {stdMath} from "./StdMath.sol"; -import {StdStorage, stdStorageSafe} from "./StdStorage.sol"; -import {StdStyle} from "./StdStyle.sol"; -import {StdUtils} from "./StdUtils.sol"; -import {VmSafe} from "./Vm.sol"; - -// 📦 BOILERPLATE -import {ScriptBase} from "./Base.sol"; - -// â­ï¸ SCRIPT -abstract contract Script is ScriptBase, StdChains, StdCheatsSafe, StdUtils { - // Note: IS_SCRIPT() must return true. - bool public IS_SCRIPT = true; -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdAssertions.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdAssertions.sol deleted file mode 100644 index 857ecd570..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/StdAssertions.sol +++ /dev/null @@ -1,669 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; -pragma experimental ABIEncoderV2; - -import {Vm} from "./Vm.sol"; - -abstract contract StdAssertions { - Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - - event log(string); - event logs(bytes); - - event log_address(address); - event log_bytes32(bytes32); - event log_int(int256); - event log_uint(uint256); - event log_bytes(bytes); - event log_string(string); - - event log_named_address(string key, address val); - event log_named_bytes32(string key, bytes32 val); - event log_named_decimal_int(string key, int256 val, uint256 decimals); - event log_named_decimal_uint(string key, uint256 val, uint256 decimals); - event log_named_int(string key, int256 val); - event log_named_uint(string key, uint256 val); - event log_named_bytes(string key, bytes val); - event log_named_string(string key, string val); - - event log_array(uint256[] val); - event log_array(int256[] val); - event log_array(address[] val); - event log_named_array(string key, uint256[] val); - event log_named_array(string key, int256[] val); - event log_named_array(string key, address[] val); - - bool private _failed; - - function failed() public view returns (bool) { - if (_failed) { - return _failed; - } else { - return vm.load(address(vm), bytes32("failed")) != bytes32(0); - } - } - - function fail() internal virtual { - vm.store(address(vm), bytes32("failed"), bytes32(uint256(1))); - _failed = true; - } - - function assertTrue(bool data) internal pure virtual { - vm.assertTrue(data); - } - - function assertTrue(bool data, string memory err) internal pure virtual { - vm.assertTrue(data, err); - } - - function assertFalse(bool data) internal pure virtual { - vm.assertFalse(data); - } - - function assertFalse(bool data, string memory err) internal pure virtual { - vm.assertFalse(data, err); - } - - function assertEq(bool left, bool right) internal pure virtual { - vm.assertEq(left, right); - } - - function assertEq(bool left, bool right, string memory err) internal pure virtual { - vm.assertEq(left, right, err); - } - - function assertEq(uint256 left, uint256 right) internal pure virtual { - vm.assertEq(left, right); - } - - function assertEq(uint256 left, uint256 right, string memory err) internal pure virtual { - vm.assertEq(left, right, err); - } - - function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { - vm.assertEqDecimal(left, right, decimals); - } - - function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual { - vm.assertEqDecimal(left, right, decimals, err); - } - - function assertEq(int256 left, int256 right) internal pure virtual { - vm.assertEq(left, right); - } - - function assertEq(int256 left, int256 right, string memory err) internal pure virtual { - vm.assertEq(left, right, err); - } - - function assertEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { - vm.assertEqDecimal(left, right, decimals); - } - - function assertEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { - vm.assertEqDecimal(left, right, decimals, err); - } - - function assertEq(address left, address right) internal pure virtual { - vm.assertEq(left, right); - } - - function assertEq(address left, address right, string memory err) internal pure virtual { - vm.assertEq(left, right, err); - } - - function assertEq(bytes32 left, bytes32 right) internal pure virtual { - vm.assertEq(left, right); - } - - function assertEq(bytes32 left, bytes32 right, string memory err) internal pure virtual { - vm.assertEq(left, right, err); - } - - function assertEq32(bytes32 left, bytes32 right) internal pure virtual { - assertEq(left, right); - } - - function assertEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual { - assertEq(left, right, err); - } - - function assertEq(string memory left, string memory right) internal pure virtual { - vm.assertEq(left, right); - } - - function assertEq(string memory left, string memory right, string memory err) internal pure virtual { - vm.assertEq(left, right, err); - } - - function assertEq(bytes memory left, bytes memory right) internal pure virtual { - vm.assertEq(left, right); - } - - function assertEq(bytes memory left, bytes memory right, string memory err) internal pure virtual { - vm.assertEq(left, right, err); - } - - function assertEq(bool[] memory left, bool[] memory right) internal pure virtual { - vm.assertEq(left, right); - } - - function assertEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual { - vm.assertEq(left, right, err); - } - - function assertEq(uint256[] memory left, uint256[] memory right) internal pure virtual { - vm.assertEq(left, right); - } - - function assertEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual { - vm.assertEq(left, right, err); - } - - function assertEq(int256[] memory left, int256[] memory right) internal pure virtual { - vm.assertEq(left, right); - } - - function assertEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual { - vm.assertEq(left, right, err); - } - - function assertEq(address[] memory left, address[] memory right) internal pure virtual { - vm.assertEq(left, right); - } - - function assertEq(address[] memory left, address[] memory right, string memory err) internal pure virtual { - vm.assertEq(left, right, err); - } - - function assertEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual { - vm.assertEq(left, right); - } - - function assertEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual { - vm.assertEq(left, right, err); - } - - function assertEq(string[] memory left, string[] memory right) internal pure virtual { - vm.assertEq(left, right); - } - - function assertEq(string[] memory left, string[] memory right, string memory err) internal pure virtual { - vm.assertEq(left, right, err); - } - - function assertEq(bytes[] memory left, bytes[] memory right) internal pure virtual { - vm.assertEq(left, right); - } - - function assertEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual { - vm.assertEq(left, right, err); - } - - // Legacy helper - function assertEqUint(uint256 left, uint256 right) internal pure virtual { - assertEq(left, right); - } - - function assertNotEq(bool left, bool right) internal pure virtual { - vm.assertNotEq(left, right); - } - - function assertNotEq(bool left, bool right, string memory err) internal pure virtual { - vm.assertNotEq(left, right, err); - } - - function assertNotEq(uint256 left, uint256 right) internal pure virtual { - vm.assertNotEq(left, right); - } - - function assertNotEq(uint256 left, uint256 right, string memory err) internal pure virtual { - vm.assertNotEq(left, right, err); - } - - function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { - vm.assertNotEqDecimal(left, right, decimals); - } - - function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) - internal - pure - virtual - { - vm.assertNotEqDecimal(left, right, decimals, err); - } - - function assertNotEq(int256 left, int256 right) internal pure virtual { - vm.assertNotEq(left, right); - } - - function assertNotEq(int256 left, int256 right, string memory err) internal pure virtual { - vm.assertNotEq(left, right, err); - } - - function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { - vm.assertNotEqDecimal(left, right, decimals); - } - - function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { - vm.assertNotEqDecimal(left, right, decimals, err); - } - - function assertNotEq(address left, address right) internal pure virtual { - vm.assertNotEq(left, right); - } - - function assertNotEq(address left, address right, string memory err) internal pure virtual { - vm.assertNotEq(left, right, err); - } - - function assertNotEq(bytes32 left, bytes32 right) internal pure virtual { - vm.assertNotEq(left, right); - } - - function assertNotEq(bytes32 left, bytes32 right, string memory err) internal pure virtual { - vm.assertNotEq(left, right, err); - } - - function assertNotEq32(bytes32 left, bytes32 right) internal pure virtual { - assertNotEq(left, right); - } - - function assertNotEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual { - assertNotEq(left, right, err); - } - - function assertNotEq(string memory left, string memory right) internal pure virtual { - vm.assertNotEq(left, right); - } - - function assertNotEq(string memory left, string memory right, string memory err) internal pure virtual { - vm.assertNotEq(left, right, err); - } - - function assertNotEq(bytes memory left, bytes memory right) internal pure virtual { - vm.assertNotEq(left, right); - } - - function assertNotEq(bytes memory left, bytes memory right, string memory err) internal pure virtual { - vm.assertNotEq(left, right, err); - } - - function assertNotEq(bool[] memory left, bool[] memory right) internal pure virtual { - vm.assertNotEq(left, right); - } - - function assertNotEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual { - vm.assertNotEq(left, right, err); - } - - function assertNotEq(uint256[] memory left, uint256[] memory right) internal pure virtual { - vm.assertNotEq(left, right); - } - - function assertNotEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual { - vm.assertNotEq(left, right, err); - } - - function assertNotEq(int256[] memory left, int256[] memory right) internal pure virtual { - vm.assertNotEq(left, right); - } - - function assertNotEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual { - vm.assertNotEq(left, right, err); - } - - function assertNotEq(address[] memory left, address[] memory right) internal pure virtual { - vm.assertNotEq(left, right); - } - - function assertNotEq(address[] memory left, address[] memory right, string memory err) internal pure virtual { - vm.assertNotEq(left, right, err); - } - - function assertNotEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual { - vm.assertNotEq(left, right); - } - - function assertNotEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual { - vm.assertNotEq(left, right, err); - } - - function assertNotEq(string[] memory left, string[] memory right) internal pure virtual { - vm.assertNotEq(left, right); - } - - function assertNotEq(string[] memory left, string[] memory right, string memory err) internal pure virtual { - vm.assertNotEq(left, right, err); - } - - function assertNotEq(bytes[] memory left, bytes[] memory right) internal pure virtual { - vm.assertNotEq(left, right); - } - - function assertNotEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual { - vm.assertNotEq(left, right, err); - } - - function assertLt(uint256 left, uint256 right) internal pure virtual { - vm.assertLt(left, right); - } - - function assertLt(uint256 left, uint256 right, string memory err) internal pure virtual { - vm.assertLt(left, right, err); - } - - function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { - vm.assertLtDecimal(left, right, decimals); - } - - function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual { - vm.assertLtDecimal(left, right, decimals, err); - } - - function assertLt(int256 left, int256 right) internal pure virtual { - vm.assertLt(left, right); - } - - function assertLt(int256 left, int256 right, string memory err) internal pure virtual { - vm.assertLt(left, right, err); - } - - function assertLtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { - vm.assertLtDecimal(left, right, decimals); - } - - function assertLtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { - vm.assertLtDecimal(left, right, decimals, err); - } - - function assertGt(uint256 left, uint256 right) internal pure virtual { - vm.assertGt(left, right); - } - - function assertGt(uint256 left, uint256 right, string memory err) internal pure virtual { - vm.assertGt(left, right, err); - } - - function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { - vm.assertGtDecimal(left, right, decimals); - } - - function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual { - vm.assertGtDecimal(left, right, decimals, err); - } - - function assertGt(int256 left, int256 right) internal pure virtual { - vm.assertGt(left, right); - } - - function assertGt(int256 left, int256 right, string memory err) internal pure virtual { - vm.assertGt(left, right, err); - } - - function assertGtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { - vm.assertGtDecimal(left, right, decimals); - } - - function assertGtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { - vm.assertGtDecimal(left, right, decimals, err); - } - - function assertLe(uint256 left, uint256 right) internal pure virtual { - vm.assertLe(left, right); - } - - function assertLe(uint256 left, uint256 right, string memory err) internal pure virtual { - vm.assertLe(left, right, err); - } - - function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { - vm.assertLeDecimal(left, right, decimals); - } - - function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual { - vm.assertLeDecimal(left, right, decimals, err); - } - - function assertLe(int256 left, int256 right) internal pure virtual { - vm.assertLe(left, right); - } - - function assertLe(int256 left, int256 right, string memory err) internal pure virtual { - vm.assertLe(left, right, err); - } - - function assertLeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { - vm.assertLeDecimal(left, right, decimals); - } - - function assertLeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { - vm.assertLeDecimal(left, right, decimals, err); - } - - function assertGe(uint256 left, uint256 right) internal pure virtual { - vm.assertGe(left, right); - } - - function assertGe(uint256 left, uint256 right, string memory err) internal pure virtual { - vm.assertGe(left, right, err); - } - - function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { - vm.assertGeDecimal(left, right, decimals); - } - - function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual { - vm.assertGeDecimal(left, right, decimals, err); - } - - function assertGe(int256 left, int256 right) internal pure virtual { - vm.assertGe(left, right); - } - - function assertGe(int256 left, int256 right, string memory err) internal pure virtual { - vm.assertGe(left, right, err); - } - - function assertGeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { - vm.assertGeDecimal(left, right, decimals); - } - - function assertGeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { - vm.assertGeDecimal(left, right, decimals, err); - } - - function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) internal pure virtual { - vm.assertApproxEqAbs(left, right, maxDelta); - } - - function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string memory err) - internal - pure - virtual - { - vm.assertApproxEqAbs(left, right, maxDelta, err); - } - - function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) - internal - pure - virtual - { - vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals); - } - - function assertApproxEqAbsDecimal( - uint256 left, - uint256 right, - uint256 maxDelta, - uint256 decimals, - string memory err - ) internal pure virtual { - vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err); - } - - function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) internal pure virtual { - vm.assertApproxEqAbs(left, right, maxDelta); - } - - function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string memory err) internal pure virtual { - vm.assertApproxEqAbs(left, right, maxDelta, err); - } - - function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) - internal - pure - virtual - { - vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals); - } - - function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals, string memory err) - internal - pure - virtual - { - vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err); - } - - function assertApproxEqRel( - uint256 left, - uint256 right, - uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100% - ) internal pure virtual { - vm.assertApproxEqRel(left, right, maxPercentDelta); - } - - function assertApproxEqRel( - uint256 left, - uint256 right, - uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% - string memory err - ) internal pure virtual { - vm.assertApproxEqRel(left, right, maxPercentDelta, err); - } - - function assertApproxEqRelDecimal( - uint256 left, - uint256 right, - uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% - uint256 decimals - ) internal pure virtual { - vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals); - } - - function assertApproxEqRelDecimal( - uint256 left, - uint256 right, - uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% - uint256 decimals, - string memory err - ) internal pure virtual { - vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err); - } - - function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) internal pure virtual { - vm.assertApproxEqRel(left, right, maxPercentDelta); - } - - function assertApproxEqRel( - int256 left, - int256 right, - uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% - string memory err - ) internal pure virtual { - vm.assertApproxEqRel(left, right, maxPercentDelta, err); - } - - function assertApproxEqRelDecimal( - int256 left, - int256 right, - uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% - uint256 decimals - ) internal pure virtual { - vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals); - } - - function assertApproxEqRelDecimal( - int256 left, - int256 right, - uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% - uint256 decimals, - string memory err - ) internal pure virtual { - vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err); - } - - // Inherited from DSTest, not used but kept for backwards-compatibility - function checkEq0(bytes memory left, bytes memory right) internal pure returns (bool) { - return keccak256(left) == keccak256(right); - } - - function assertEq0(bytes memory left, bytes memory right) internal pure virtual { - assertEq(left, right); - } - - function assertEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual { - assertEq(left, right, err); - } - - function assertNotEq0(bytes memory left, bytes memory right) internal pure virtual { - assertNotEq(left, right); - } - - function assertNotEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual { - assertNotEq(left, right, err); - } - - function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB) internal virtual { - assertEqCall(target, callDataA, target, callDataB, true); - } - - function assertEqCall(address targetA, bytes memory callDataA, address targetB, bytes memory callDataB) - internal - virtual - { - assertEqCall(targetA, callDataA, targetB, callDataB, true); - } - - function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB, bool strictRevertData) - internal - virtual - { - assertEqCall(target, callDataA, target, callDataB, strictRevertData); - } - - function assertEqCall( - address targetA, - bytes memory callDataA, - address targetB, - bytes memory callDataB, - bool strictRevertData - ) internal virtual { - (bool successA, bytes memory returnDataA) = address(targetA).call(callDataA); - (bool successB, bytes memory returnDataB) = address(targetB).call(callDataB); - - if (successA && successB) { - assertEq(returnDataA, returnDataB, "Call return data does not match"); - } - - if (!successA && !successB && strictRevertData) { - assertEq(returnDataA, returnDataB, "Call revert data does not match"); - } - - if (!successA && successB) { - emit log("Error: Calls were not equal"); - emit log_named_bytes(" Left call revert data", returnDataA); - emit log_named_bytes(" Right call return data", returnDataB); - revert("assertion failed"); - } - - if (successA && !successB) { - emit log("Error: Calls were not equal"); - emit log_named_bytes(" Left call return data", returnDataA); - emit log_named_bytes(" Right call revert data", returnDataB); - revert("assertion failed"); - } - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdChains.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdChains.sol deleted file mode 100644 index 0fe827e4d..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/StdChains.sol +++ /dev/null @@ -1,259 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -import {VmSafe} from "./Vm.sol"; - -/** - * StdChains provides information about EVM compatible chains that can be used in scripts/tests. - * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are - * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of - * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the - * alias used in this contract, which can be found as the first argument to the - * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function. - * - * There are two main ways to use this contract: - * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or - * `setChain(string memory chainAlias, Chain memory chain)` - * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`. - * - * The first time either of those are used, chains are initialized with the default set of RPC URLs. - * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in - * `defaultRpcUrls`. - * - * The `setChain` function is straightforward, and it simply saves off the given chain data. - * - * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say - * we want to retrieve the RPC URL for `mainnet`: - * - If you have specified data with `setChain`, it will return that. - * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it - * is valid (e.g. a URL is specified, or an environment variable is given and exists). - * - If neither of the above conditions is met, the default data is returned. - * - * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults. - */ -abstract contract StdChains { - VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); - - bool private stdChainsInitialized; - - struct ChainData { - string name; - uint256 chainId; - string rpcUrl; - } - - struct Chain { - // The chain name. - string name; - // The chain's Chain ID. - uint256 chainId; - // The chain's alias. (i.e. what gets specified in `foundry.toml`). - string chainAlias; - // A default RPC endpoint for this chain. - // NOTE: This default RPC URL is included for convenience to facilitate quick tests and - // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy - // usage as you will be throttled and this is a disservice to others who need this endpoint. - string rpcUrl; - } - - // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data. - mapping(string => Chain) private chains; - // Maps from the chain's alias to it's default RPC URL. - mapping(string => string) private defaultRpcUrls; - // Maps from a chain ID to it's alias. - mapping(uint256 => string) private idToAlias; - - bool private fallbackToDefaultRpcUrls = true; - - // The RPC URL will be fetched from config or defaultRpcUrls if possible. - function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) { - require(bytes(chainAlias).length != 0, "StdChains getChain(string): Chain alias cannot be the empty string."); - - initializeStdChains(); - chain = chains[chainAlias]; - require( - chain.chainId != 0, - string(abi.encodePacked("StdChains getChain(string): Chain with alias \"", chainAlias, "\" not found.")) - ); - - chain = getChainWithUpdatedRpcUrl(chainAlias, chain); - } - - function getChain(uint256 chainId) internal virtual returns (Chain memory chain) { - require(chainId != 0, "StdChains getChain(uint256): Chain ID cannot be 0."); - initializeStdChains(); - string memory chainAlias = idToAlias[chainId]; - - chain = chains[chainAlias]; - - require( - chain.chainId != 0, - string(abi.encodePacked("StdChains getChain(uint256): Chain with ID ", vm.toString(chainId), " not found.")) - ); - - chain = getChainWithUpdatedRpcUrl(chainAlias, chain); - } - - // set chain info, with priority to argument's rpcUrl field. - function setChain(string memory chainAlias, ChainData memory chain) internal virtual { - require( - bytes(chainAlias).length != 0, - "StdChains setChain(string,ChainData): Chain alias cannot be the empty string." - ); - - require(chain.chainId != 0, "StdChains setChain(string,ChainData): Chain ID cannot be 0."); - - initializeStdChains(); - string memory foundAlias = idToAlias[chain.chainId]; - - require( - bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)), - string( - abi.encodePacked( - "StdChains setChain(string,ChainData): Chain ID ", - vm.toString(chain.chainId), - " already used by \"", - foundAlias, - "\"." - ) - ) - ); - - uint256 oldChainId = chains[chainAlias].chainId; - delete idToAlias[oldChainId]; - - chains[chainAlias] = - Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl}); - idToAlias[chain.chainId] = chainAlias; - } - - // set chain info, with priority to argument's rpcUrl field. - function setChain(string memory chainAlias, Chain memory chain) internal virtual { - setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl})); - } - - function _toUpper(string memory str) private pure returns (string memory) { - bytes memory strb = bytes(str); - bytes memory copy = new bytes(strb.length); - for (uint256 i = 0; i < strb.length; i++) { - bytes1 b = strb[i]; - if (b >= 0x61 && b <= 0x7A) { - copy[i] = bytes1(uint8(b) - 32); - } else { - copy[i] = b; - } - } - return string(copy); - } - - // lookup rpcUrl, in descending order of priority: - // current -> config (foundry.toml) -> environment variable -> default - function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain) - private - view - returns (Chain memory) - { - if (bytes(chain.rpcUrl).length == 0) { - try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) { - chain.rpcUrl = configRpcUrl; - } catch (bytes memory err) { - string memory envName = string(abi.encodePacked(_toUpper(chainAlias), "_RPC_URL")); - if (fallbackToDefaultRpcUrls) { - chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]); - } else { - chain.rpcUrl = vm.envString(envName); - } - // Distinguish 'not found' from 'cannot read' - // The upstream error thrown by forge for failing cheats changed so we check both the old and new versions - bytes memory oldNotFoundError = - abi.encodeWithSignature("CheatCodeError", string(abi.encodePacked("invalid rpc url ", chainAlias))); - bytes memory newNotFoundError = abi.encodeWithSignature( - "CheatcodeError(string)", string(abi.encodePacked("invalid rpc url: ", chainAlias)) - ); - bytes32 errHash = keccak256(err); - if ( - (errHash != keccak256(oldNotFoundError) && errHash != keccak256(newNotFoundError)) - || bytes(chain.rpcUrl).length == 0 - ) { - /// @solidity memory-safe-assembly - assembly { - revert(add(32, err), mload(err)) - } - } - } - } - return chain; - } - - function setFallbackToDefaultRpcUrls(bool useDefault) internal { - fallbackToDefaultRpcUrls = useDefault; - } - - function initializeStdChains() private { - if (stdChainsInitialized) return; - - stdChainsInitialized = true; - - // If adding an RPC here, make sure to test the default RPC URL in `test_Rpcs` in `StdChains.t.sol` - setChainWithDefaultRpcUrl("anvil", ChainData("Anvil", 31337, "http://127.0.0.1:8545")); - setChainWithDefaultRpcUrl( - "mainnet", ChainData("Mainnet", 1, "https://eth-mainnet.alchemyapi.io/v2/pwc5rmJhrdoaSEfimoKEmsvOjKSmPDrP") - ); - setChainWithDefaultRpcUrl( - "sepolia", ChainData("Sepolia", 11155111, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001") - ); - setChainWithDefaultRpcUrl("holesky", ChainData("Holesky", 17000, "https://rpc.holesky.ethpandaops.io")); - setChainWithDefaultRpcUrl("optimism", ChainData("Optimism", 10, "https://mainnet.optimism.io")); - setChainWithDefaultRpcUrl( - "optimism_sepolia", ChainData("Optimism Sepolia", 11155420, "https://sepolia.optimism.io") - ); - setChainWithDefaultRpcUrl("arbitrum_one", ChainData("Arbitrum One", 42161, "https://arb1.arbitrum.io/rpc")); - setChainWithDefaultRpcUrl( - "arbitrum_one_sepolia", ChainData("Arbitrum One Sepolia", 421614, "https://sepolia-rollup.arbitrum.io/rpc") - ); - setChainWithDefaultRpcUrl("arbitrum_nova", ChainData("Arbitrum Nova", 42170, "https://nova.arbitrum.io/rpc")); - setChainWithDefaultRpcUrl("polygon", ChainData("Polygon", 137, "https://polygon-rpc.com")); - setChainWithDefaultRpcUrl( - "polygon_amoy", ChainData("Polygon Amoy", 80002, "https://rpc-amoy.polygon.technology") - ); - setChainWithDefaultRpcUrl("avalanche", ChainData("Avalanche", 43114, "https://api.avax.network/ext/bc/C/rpc")); - setChainWithDefaultRpcUrl( - "avalanche_fuji", ChainData("Avalanche Fuji", 43113, "https://api.avax-test.network/ext/bc/C/rpc") - ); - setChainWithDefaultRpcUrl( - "bnb_smart_chain", ChainData("BNB Smart Chain", 56, "https://bsc-dataseed1.binance.org") - ); - setChainWithDefaultRpcUrl( - "bnb_smart_chain_testnet", - ChainData("BNB Smart Chain Testnet", 97, "https://rpc.ankr.com/bsc_testnet_chapel") - ); - setChainWithDefaultRpcUrl("gnosis_chain", ChainData("Gnosis Chain", 100, "https://rpc.gnosischain.com")); - setChainWithDefaultRpcUrl("moonbeam", ChainData("Moonbeam", 1284, "https://rpc.api.moonbeam.network")); - setChainWithDefaultRpcUrl( - "moonriver", ChainData("Moonriver", 1285, "https://rpc.api.moonriver.moonbeam.network") - ); - setChainWithDefaultRpcUrl("moonbase", ChainData("Moonbase", 1287, "https://rpc.testnet.moonbeam.network")); - setChainWithDefaultRpcUrl("base_sepolia", ChainData("Base Sepolia", 84532, "https://sepolia.base.org")); - setChainWithDefaultRpcUrl("base", ChainData("Base", 8453, "https://mainnet.base.org")); - setChainWithDefaultRpcUrl("blast_sepolia", ChainData("Blast Sepolia", 168587773, "https://sepolia.blast.io")); - setChainWithDefaultRpcUrl("blast", ChainData("Blast", 81457, "https://rpc.blast.io")); - setChainWithDefaultRpcUrl("fantom_opera", ChainData("Fantom Opera", 250, "https://rpc.ankr.com/fantom/")); - setChainWithDefaultRpcUrl( - "fantom_opera_testnet", ChainData("Fantom Opera Testnet", 4002, "https://rpc.ankr.com/fantom_testnet/") - ); - setChainWithDefaultRpcUrl("fraxtal", ChainData("Fraxtal", 252, "https://rpc.frax.com")); - setChainWithDefaultRpcUrl("fraxtal_testnet", ChainData("Fraxtal Testnet", 2522, "https://rpc.testnet.frax.com")); - setChainWithDefaultRpcUrl( - "berachain_bartio_testnet", ChainData("Berachain bArtio Testnet", 80084, "https://bartio.rpc.berachain.com") - ); - } - - // set chain info, with priority to chainAlias' rpc url in foundry.toml - function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private { - string memory rpcUrl = chain.rpcUrl; - defaultRpcUrls[chainAlias] = rpcUrl; - chain.rpcUrl = ""; - setChain(chainAlias, chain); - chain.rpcUrl = rpcUrl; // restore argument - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdCheats.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdCheats.sol deleted file mode 100644 index f2933139c..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/StdCheats.sol +++ /dev/null @@ -1,817 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -import {StdStorage, stdStorage} from "./StdStorage.sol"; -import {console2} from "./console2.sol"; -import {Vm} from "./Vm.sol"; - -abstract contract StdCheatsSafe { - Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - - uint256 private constant UINT256_MAX = - 115792089237316195423570985008687907853269984665640564039457584007913129639935; - - bool private gasMeteringOff; - - // Data structures to parse Transaction objects from the broadcast artifact - // that conform to EIP1559. The Raw structs is what is parsed from the JSON - // and then converted to the one that is used by the user for better UX. - - struct RawTx1559 { - string[] arguments; - address contractAddress; - string contractName; - // json value name = function - string functionSig; - bytes32 hash; - // json value name = tx - RawTx1559Detail txDetail; - // json value name = type - string opcode; - } - - struct RawTx1559Detail { - AccessList[] accessList; - bytes data; - address from; - bytes gas; - bytes nonce; - address to; - bytes txType; - bytes value; - } - - struct Tx1559 { - string[] arguments; - address contractAddress; - string contractName; - string functionSig; - bytes32 hash; - Tx1559Detail txDetail; - string opcode; - } - - struct Tx1559Detail { - AccessList[] accessList; - bytes data; - address from; - uint256 gas; - uint256 nonce; - address to; - uint256 txType; - uint256 value; - } - - // Data structures to parse Transaction objects from the broadcast artifact - // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON - // and then converted to the one that is used by the user for better UX. - - struct TxLegacy { - string[] arguments; - address contractAddress; - string contractName; - string functionSig; - string hash; - string opcode; - TxDetailLegacy transaction; - } - - struct TxDetailLegacy { - AccessList[] accessList; - uint256 chainId; - bytes data; - address from; - uint256 gas; - uint256 gasPrice; - bytes32 hash; - uint256 nonce; - bytes1 opcode; - bytes32 r; - bytes32 s; - uint256 txType; - address to; - uint8 v; - uint256 value; - } - - struct AccessList { - address accessAddress; - bytes32[] storageKeys; - } - - // Data structures to parse Receipt objects from the broadcast artifact. - // The Raw structs is what is parsed from the JSON - // and then converted to the one that is used by the user for better UX. - - struct RawReceipt { - bytes32 blockHash; - bytes blockNumber; - address contractAddress; - bytes cumulativeGasUsed; - bytes effectiveGasPrice; - address from; - bytes gasUsed; - RawReceiptLog[] logs; - bytes logsBloom; - bytes status; - address to; - bytes32 transactionHash; - bytes transactionIndex; - } - - struct Receipt { - bytes32 blockHash; - uint256 blockNumber; - address contractAddress; - uint256 cumulativeGasUsed; - uint256 effectiveGasPrice; - address from; - uint256 gasUsed; - ReceiptLog[] logs; - bytes logsBloom; - uint256 status; - address to; - bytes32 transactionHash; - uint256 transactionIndex; - } - - // Data structures to parse the entire broadcast artifact, assuming the - // transactions conform to EIP1559. - - struct EIP1559ScriptArtifact { - string[] libraries; - string path; - string[] pending; - Receipt[] receipts; - uint256 timestamp; - Tx1559[] transactions; - TxReturn[] txReturns; - } - - struct RawEIP1559ScriptArtifact { - string[] libraries; - string path; - string[] pending; - RawReceipt[] receipts; - TxReturn[] txReturns; - uint256 timestamp; - RawTx1559[] transactions; - } - - struct RawReceiptLog { - // json value = address - address logAddress; - bytes32 blockHash; - bytes blockNumber; - bytes data; - bytes logIndex; - bool removed; - bytes32[] topics; - bytes32 transactionHash; - bytes transactionIndex; - bytes transactionLogIndex; - } - - struct ReceiptLog { - // json value = address - address logAddress; - bytes32 blockHash; - uint256 blockNumber; - bytes data; - uint256 logIndex; - bytes32[] topics; - uint256 transactionIndex; - uint256 transactionLogIndex; - bool removed; - } - - struct TxReturn { - string internalType; - string value; - } - - struct Account { - address addr; - uint256 key; - } - - enum AddressType { - Payable, - NonPayable, - ZeroAddress, - Precompile, - ForgeAddress - } - - // Checks that `addr` is not blacklisted by token contracts that have a blacklist. - function assumeNotBlacklisted(address token, address addr) internal view virtual { - // Nothing to check if `token` is not a contract. - uint256 tokenCodeSize; - assembly { - tokenCodeSize := extcodesize(token) - } - require(tokenCodeSize > 0, "StdCheats assumeNotBlacklisted(address,address): Token address is not a contract."); - - bool success; - bytes memory returnData; - - // 4-byte selector for `isBlacklisted(address)`, used by USDC. - (success, returnData) = token.staticcall(abi.encodeWithSelector(0xfe575a87, addr)); - vm.assume(!success || abi.decode(returnData, (bool)) == false); - - // 4-byte selector for `isBlackListed(address)`, used by USDT. - (success, returnData) = token.staticcall(abi.encodeWithSelector(0xe47d6060, addr)); - vm.assume(!success || abi.decode(returnData, (bool)) == false); - } - - // Checks that `addr` is not blacklisted by token contracts that have a blacklist. - // This is identical to `assumeNotBlacklisted(address,address)` but with a different name, for - // backwards compatibility, since this name was used in the original PR which has already has - // a release. This function can be removed in a future release once we want a breaking change. - function assumeNoBlacklisted(address token, address addr) internal view virtual { - assumeNotBlacklisted(token, addr); - } - - function assumeAddressIsNot(address addr, AddressType addressType) internal virtual { - if (addressType == AddressType.Payable) { - assumeNotPayable(addr); - } else if (addressType == AddressType.NonPayable) { - assumePayable(addr); - } else if (addressType == AddressType.ZeroAddress) { - assumeNotZeroAddress(addr); - } else if (addressType == AddressType.Precompile) { - assumeNotPrecompile(addr); - } else if (addressType == AddressType.ForgeAddress) { - assumeNotForgeAddress(addr); - } - } - - function assumeAddressIsNot(address addr, AddressType addressType1, AddressType addressType2) internal virtual { - assumeAddressIsNot(addr, addressType1); - assumeAddressIsNot(addr, addressType2); - } - - function assumeAddressIsNot( - address addr, - AddressType addressType1, - AddressType addressType2, - AddressType addressType3 - ) internal virtual { - assumeAddressIsNot(addr, addressType1); - assumeAddressIsNot(addr, addressType2); - assumeAddressIsNot(addr, addressType3); - } - - function assumeAddressIsNot( - address addr, - AddressType addressType1, - AddressType addressType2, - AddressType addressType3, - AddressType addressType4 - ) internal virtual { - assumeAddressIsNot(addr, addressType1); - assumeAddressIsNot(addr, addressType2); - assumeAddressIsNot(addr, addressType3); - assumeAddressIsNot(addr, addressType4); - } - - // This function checks whether an address, `addr`, is payable. It works by sending 1 wei to - // `addr` and checking the `success` return value. - // NOTE: This function may result in state changes depending on the fallback/receive logic - // implemented by `addr`, which should be taken into account when this function is used. - function _isPayable(address addr) private returns (bool) { - require( - addr.balance < UINT256_MAX, - "StdCheats _isPayable(address): Balance equals max uint256, so it cannot receive any more funds" - ); - uint256 origBalanceTest = address(this).balance; - uint256 origBalanceAddr = address(addr).balance; - - vm.deal(address(this), 1); - (bool success,) = payable(addr).call{value: 1}(""); - - // reset balances - vm.deal(address(this), origBalanceTest); - vm.deal(addr, origBalanceAddr); - - return success; - } - - // NOTE: This function may result in state changes depending on the fallback/receive logic - // implemented by `addr`, which should be taken into account when this function is used. See the - // `_isPayable` method for more information. - function assumePayable(address addr) internal virtual { - vm.assume(_isPayable(addr)); - } - - function assumeNotPayable(address addr) internal virtual { - vm.assume(!_isPayable(addr)); - } - - function assumeNotZeroAddress(address addr) internal pure virtual { - vm.assume(addr != address(0)); - } - - function assumeNotPrecompile(address addr) internal pure virtual { - assumeNotPrecompile(addr, _pureChainId()); - } - - function assumeNotPrecompile(address addr, uint256 chainId) internal pure virtual { - // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific - // address), but the same rationale for excluding them applies so we include those too. - - // These should be present on all EVM-compatible chains. - vm.assume(addr < address(0x1) || addr > address(0x9)); - - // forgefmt: disable-start - if (chainId == 10 || chainId == 420) { - // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21 - vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800)); - } else if (chainId == 42161 || chainId == 421613) { - // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains - vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068)); - } else if (chainId == 43114 || chainId == 43113) { - // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59 - vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff)); - vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF)); - vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff)); - } - // forgefmt: disable-end - } - - function assumeNotForgeAddress(address addr) internal pure virtual { - // vm, console, and Create2Deployer addresses - vm.assume( - addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67 - && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C - ); - } - - function readEIP1559ScriptArtifact(string memory path) - internal - view - virtual - returns (EIP1559ScriptArtifact memory) - { - string memory data = vm.readFile(path); - bytes memory parsedData = vm.parseJson(data); - RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact)); - EIP1559ScriptArtifact memory artifact; - artifact.libraries = rawArtifact.libraries; - artifact.path = rawArtifact.path; - artifact.timestamp = rawArtifact.timestamp; - artifact.pending = rawArtifact.pending; - artifact.txReturns = rawArtifact.txReturns; - artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts); - artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions); - return artifact; - } - - function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) { - Tx1559[] memory txs = new Tx1559[](rawTxs.length); - for (uint256 i; i < rawTxs.length; i++) { - txs[i] = rawToConvertedEIPTx1559(rawTxs[i]); - } - return txs; - } - - function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) { - Tx1559 memory transaction; - transaction.arguments = rawTx.arguments; - transaction.contractName = rawTx.contractName; - transaction.functionSig = rawTx.functionSig; - transaction.hash = rawTx.hash; - transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail); - transaction.opcode = rawTx.opcode; - return transaction; - } - - function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail) - internal - pure - virtual - returns (Tx1559Detail memory) - { - Tx1559Detail memory txDetail; - txDetail.data = rawDetail.data; - txDetail.from = rawDetail.from; - txDetail.to = rawDetail.to; - txDetail.nonce = _bytesToUint(rawDetail.nonce); - txDetail.txType = _bytesToUint(rawDetail.txType); - txDetail.value = _bytesToUint(rawDetail.value); - txDetail.gas = _bytesToUint(rawDetail.gas); - txDetail.accessList = rawDetail.accessList; - return txDetail; - } - - function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) { - string memory deployData = vm.readFile(path); - bytes memory parsedDeployData = vm.parseJson(deployData, ".transactions"); - RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[])); - return rawToConvertedEIPTx1559s(rawTxs); - } - - function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) { - string memory deployData = vm.readFile(path); - string memory key = string(abi.encodePacked(".transactions[", vm.toString(index), "]")); - bytes memory parsedDeployData = vm.parseJson(deployData, key); - RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559)); - return rawToConvertedEIPTx1559(rawTx); - } - - // Analogous to readTransactions, but for receipts. - function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) { - string memory deployData = vm.readFile(path); - bytes memory parsedDeployData = vm.parseJson(deployData, ".receipts"); - RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[])); - return rawToConvertedReceipts(rawReceipts); - } - - function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) { - string memory deployData = vm.readFile(path); - string memory key = string(abi.encodePacked(".receipts[", vm.toString(index), "]")); - bytes memory parsedDeployData = vm.parseJson(deployData, key); - RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt)); - return rawToConvertedReceipt(rawReceipt); - } - - function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) { - Receipt[] memory receipts = new Receipt[](rawReceipts.length); - for (uint256 i; i < rawReceipts.length; i++) { - receipts[i] = rawToConvertedReceipt(rawReceipts[i]); - } - return receipts; - } - - function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) { - Receipt memory receipt; - receipt.blockHash = rawReceipt.blockHash; - receipt.to = rawReceipt.to; - receipt.from = rawReceipt.from; - receipt.contractAddress = rawReceipt.contractAddress; - receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice); - receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed); - receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed); - receipt.status = _bytesToUint(rawReceipt.status); - receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex); - receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber); - receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs); - receipt.logsBloom = rawReceipt.logsBloom; - receipt.transactionHash = rawReceipt.transactionHash; - return receipt; - } - - function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs) - internal - pure - virtual - returns (ReceiptLog[] memory) - { - ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length); - for (uint256 i; i < rawLogs.length; i++) { - logs[i].logAddress = rawLogs[i].logAddress; - logs[i].blockHash = rawLogs[i].blockHash; - logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber); - logs[i].data = rawLogs[i].data; - logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex); - logs[i].topics = rawLogs[i].topics; - logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex); - logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex); - logs[i].removed = rawLogs[i].removed; - } - return logs; - } - - // Deploy a contract by fetching the contract bytecode from - // the artifacts directory - // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))` - function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) { - bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); - /// @solidity memory-safe-assembly - assembly { - addr := create(0, add(bytecode, 0x20), mload(bytecode)) - } - - require(addr != address(0), "StdCheats deployCode(string,bytes): Deployment failed."); - } - - function deployCode(string memory what) internal virtual returns (address addr) { - bytes memory bytecode = vm.getCode(what); - /// @solidity memory-safe-assembly - assembly { - addr := create(0, add(bytecode, 0x20), mload(bytecode)) - } - - require(addr != address(0), "StdCheats deployCode(string): Deployment failed."); - } - - /// @dev deploy contract with value on construction - function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) { - bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); - /// @solidity memory-safe-assembly - assembly { - addr := create(val, add(bytecode, 0x20), mload(bytecode)) - } - - require(addr != address(0), "StdCheats deployCode(string,bytes,uint256): Deployment failed."); - } - - function deployCode(string memory what, uint256 val) internal virtual returns (address addr) { - bytes memory bytecode = vm.getCode(what); - /// @solidity memory-safe-assembly - assembly { - addr := create(val, add(bytecode, 0x20), mload(bytecode)) - } - - require(addr != address(0), "StdCheats deployCode(string,uint256): Deployment failed."); - } - - // creates a labeled address and the corresponding private key - function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) { - privateKey = uint256(keccak256(abi.encodePacked(name))); - addr = vm.addr(privateKey); - vm.label(addr, name); - } - - // creates a labeled address - function makeAddr(string memory name) internal virtual returns (address addr) { - (addr,) = makeAddrAndKey(name); - } - - // Destroys an account immediately, sending the balance to beneficiary. - // Destroying means: balance will be zero, code will be empty, and nonce will be 0 - // This is similar to selfdestruct but not identical: selfdestruct destroys code and nonce - // only after tx ends, this will run immediately. - function destroyAccount(address who, address beneficiary) internal virtual { - uint256 currBalance = who.balance; - vm.etch(who, abi.encode()); - vm.deal(who, 0); - vm.resetNonce(who); - - uint256 beneficiaryBalance = beneficiary.balance; - vm.deal(beneficiary, currBalance + beneficiaryBalance); - } - - // creates a struct containing both a labeled address and the corresponding private key - function makeAccount(string memory name) internal virtual returns (Account memory account) { - (account.addr, account.key) = makeAddrAndKey(name); - } - - function deriveRememberKey(string memory mnemonic, uint32 index) - internal - virtual - returns (address who, uint256 privateKey) - { - privateKey = vm.deriveKey(mnemonic, index); - who = vm.rememberKey(privateKey); - } - - function _bytesToUint(bytes memory b) private pure returns (uint256) { - require(b.length <= 32, "StdCheats _bytesToUint(bytes): Bytes length exceeds 32."); - return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); - } - - function isFork() internal view virtual returns (bool status) { - try vm.activeFork() { - status = true; - } catch (bytes memory) {} - } - - modifier skipWhenForking() { - if (!isFork()) { - _; - } - } - - modifier skipWhenNotForking() { - if (isFork()) { - _; - } - } - - modifier noGasMetering() { - vm.pauseGasMetering(); - // To prevent turning gas monitoring back on with nested functions that use this modifier, - // we check if gasMetering started in the off position. If it did, we don't want to turn - // it back on until we exit the top level function that used the modifier - // - // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well. - // funcA will have `gasStartedOff` as false, funcB will have it as true, - // so we only turn metering back on at the end of the funcA - bool gasStartedOff = gasMeteringOff; - gasMeteringOff = true; - - _; - - // if gas metering was on when this modifier was called, turn it back on at the end - if (!gasStartedOff) { - gasMeteringOff = false; - vm.resumeGasMetering(); - } - } - - // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no - // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We - // can't simply access the chain ID in a normal view or pure function because the solc View Pure - // Checker changed `chainid` from pure to view in 0.8.0. - function _viewChainId() private view returns (uint256 chainId) { - // Assembly required since `block.chainid` was introduced in 0.8.0. - assembly { - chainId := chainid() - } - - address(this); // Silence warnings in older Solc versions. - } - - function _pureChainId() private pure returns (uint256 chainId) { - function() internal view returns (uint256) fnIn = _viewChainId; - function() internal pure returns (uint256) pureChainId; - assembly { - pureChainId := fnIn - } - chainId = pureChainId(); - } -} - -// Wrappers around cheatcodes to avoid footguns -abstract contract StdCheats is StdCheatsSafe { - using stdStorage for StdStorage; - - StdStorage private stdstore; - Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; - - // Skip forward or rewind time by the specified number of seconds - function skip(uint256 time) internal virtual { - vm.warp(block.timestamp + time); - } - - function rewind(uint256 time) internal virtual { - vm.warp(block.timestamp - time); - } - - // Setup a prank from an address that has some ether - function hoax(address msgSender) internal virtual { - vm.deal(msgSender, 1 << 128); - vm.prank(msgSender); - } - - function hoax(address msgSender, uint256 give) internal virtual { - vm.deal(msgSender, give); - vm.prank(msgSender); - } - - function hoax(address msgSender, address origin) internal virtual { - vm.deal(msgSender, 1 << 128); - vm.prank(msgSender, origin); - } - - function hoax(address msgSender, address origin, uint256 give) internal virtual { - vm.deal(msgSender, give); - vm.prank(msgSender, origin); - } - - // Start perpetual prank from an address that has some ether - function startHoax(address msgSender) internal virtual { - vm.deal(msgSender, 1 << 128); - vm.startPrank(msgSender); - } - - function startHoax(address msgSender, uint256 give) internal virtual { - vm.deal(msgSender, give); - vm.startPrank(msgSender); - } - - // Start perpetual prank from an address that has some ether - // tx.origin is set to the origin parameter - function startHoax(address msgSender, address origin) internal virtual { - vm.deal(msgSender, 1 << 128); - vm.startPrank(msgSender, origin); - } - - function startHoax(address msgSender, address origin, uint256 give) internal virtual { - vm.deal(msgSender, give); - vm.startPrank(msgSender, origin); - } - - function changePrank(address msgSender) internal virtual { - console2_log_StdCheats("changePrank is deprecated. Please use vm.startPrank instead."); - vm.stopPrank(); - vm.startPrank(msgSender); - } - - function changePrank(address msgSender, address txOrigin) internal virtual { - vm.stopPrank(); - vm.startPrank(msgSender, txOrigin); - } - - // The same as Vm's `deal` - // Use the alternative signature for ERC20 tokens - function deal(address to, uint256 give) internal virtual { - vm.deal(to, give); - } - - // Set the balance of an account for any ERC20 token - // Use the alternative signature to update `totalSupply` - function deal(address token, address to, uint256 give) internal virtual { - deal(token, to, give, false); - } - - // Set the balance of an account for any ERC1155 token - // Use the alternative signature to update `totalSupply` - function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual { - dealERC1155(token, to, id, give, false); - } - - function deal(address token, address to, uint256 give, bool adjust) internal virtual { - // get current balance - (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to)); - uint256 prevBal = abi.decode(balData, (uint256)); - - // update balance - stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give); - - // update total supply - if (adjust) { - (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0x18160ddd)); - uint256 totSup = abi.decode(totSupData, (uint256)); - if (give < prevBal) { - totSup -= (prevBal - give); - } else { - totSup += (give - prevBal); - } - stdstore.target(token).sig(0x18160ddd).checked_write(totSup); - } - } - - function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual { - // get current balance - (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x00fdd58e, to, id)); - uint256 prevBal = abi.decode(balData, (uint256)); - - // update balance - stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give); - - // update total supply - if (adjust) { - (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0xbd85b039, id)); - require( - totSupData.length != 0, - "StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply." - ); - uint256 totSup = abi.decode(totSupData, (uint256)); - if (give < prevBal) { - totSup -= (prevBal - give); - } else { - totSup += (give - prevBal); - } - stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup); - } - } - - function dealERC721(address token, address to, uint256 id) internal virtual { - // check if token id is already minted and the actual owner. - (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id)); - require(successMinted, "StdCheats deal(address,address,uint,bool): id not minted."); - - // get owner current balance - (, bytes memory fromBalData) = - token.staticcall(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address)))); - uint256 fromPrevBal = abi.decode(fromBalData, (uint256)); - - // get new user current balance - (, bytes memory toBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to)); - uint256 toPrevBal = abi.decode(toBalData, (uint256)); - - // update balances - stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal); - stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal); - - // update owner - stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to); - } - - function deployCodeTo(string memory what, address where) internal virtual { - deployCodeTo(what, "", 0, where); - } - - function deployCodeTo(string memory what, bytes memory args, address where) internal virtual { - deployCodeTo(what, args, 0, where); - } - - function deployCodeTo(string memory what, bytes memory args, uint256 value, address where) internal virtual { - bytes memory creationCode = vm.getCode(what); - vm.etch(where, abi.encodePacked(creationCode, args)); - (bool success, bytes memory runtimeBytecode) = where.call{value: value}(""); - require(success, "StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode."); - vm.etch(where, runtimeBytecode); - } - - // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere. - function console2_log_StdCheats(string memory p0) private view { - (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string)", p0)); - status; - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdError.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdError.sol deleted file mode 100644 index a302191fa..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/StdError.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: MIT -// Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test -pragma solidity >=0.6.2 <0.9.0; - -library stdError { - bytes public constant assertionError = abi.encodeWithSignature("Panic(uint256)", 0x01); - bytes public constant arithmeticError = abi.encodeWithSignature("Panic(uint256)", 0x11); - bytes public constant divisionError = abi.encodeWithSignature("Panic(uint256)", 0x12); - bytes public constant enumConversionError = abi.encodeWithSignature("Panic(uint256)", 0x21); - bytes public constant encodeStorageError = abi.encodeWithSignature("Panic(uint256)", 0x22); - bytes public constant popError = abi.encodeWithSignature("Panic(uint256)", 0x31); - bytes public constant indexOOBError = abi.encodeWithSignature("Panic(uint256)", 0x32); - bytes public constant memOverflowError = abi.encodeWithSignature("Panic(uint256)", 0x41); - bytes public constant zeroVarError = abi.encodeWithSignature("Panic(uint256)", 0x51); -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdInvariant.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdInvariant.sol deleted file mode 100644 index 056db98fc..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/StdInvariant.sol +++ /dev/null @@ -1,122 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -abstract contract StdInvariant { - struct FuzzSelector { - address addr; - bytes4[] selectors; - } - - struct FuzzArtifactSelector { - string artifact; - bytes4[] selectors; - } - - struct FuzzInterface { - address addr; - string[] artifacts; - } - - address[] private _excludedContracts; - address[] private _excludedSenders; - address[] private _targetedContracts; - address[] private _targetedSenders; - - string[] private _excludedArtifacts; - string[] private _targetedArtifacts; - - FuzzArtifactSelector[] private _targetedArtifactSelectors; - - FuzzSelector[] private _excludedSelectors; - FuzzSelector[] private _targetedSelectors; - - FuzzInterface[] private _targetedInterfaces; - - // Functions for users: - // These are intended to be called in tests. - - function excludeContract(address newExcludedContract_) internal { - _excludedContracts.push(newExcludedContract_); - } - - function excludeSelector(FuzzSelector memory newExcludedSelector_) internal { - _excludedSelectors.push(newExcludedSelector_); - } - - function excludeSender(address newExcludedSender_) internal { - _excludedSenders.push(newExcludedSender_); - } - - function excludeArtifact(string memory newExcludedArtifact_) internal { - _excludedArtifacts.push(newExcludedArtifact_); - } - - function targetArtifact(string memory newTargetedArtifact_) internal { - _targetedArtifacts.push(newTargetedArtifact_); - } - - function targetArtifactSelector(FuzzArtifactSelector memory newTargetedArtifactSelector_) internal { - _targetedArtifactSelectors.push(newTargetedArtifactSelector_); - } - - function targetContract(address newTargetedContract_) internal { - _targetedContracts.push(newTargetedContract_); - } - - function targetSelector(FuzzSelector memory newTargetedSelector_) internal { - _targetedSelectors.push(newTargetedSelector_); - } - - function targetSender(address newTargetedSender_) internal { - _targetedSenders.push(newTargetedSender_); - } - - function targetInterface(FuzzInterface memory newTargetedInterface_) internal { - _targetedInterfaces.push(newTargetedInterface_); - } - - // Functions for forge: - // These are called by forge to run invariant tests and don't need to be called in tests. - - function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) { - excludedArtifacts_ = _excludedArtifacts; - } - - function excludeContracts() public view returns (address[] memory excludedContracts_) { - excludedContracts_ = _excludedContracts; - } - - function excludeSelectors() public view returns (FuzzSelector[] memory excludedSelectors_) { - excludedSelectors_ = _excludedSelectors; - } - - function excludeSenders() public view returns (address[] memory excludedSenders_) { - excludedSenders_ = _excludedSenders; - } - - function targetArtifacts() public view returns (string[] memory targetedArtifacts_) { - targetedArtifacts_ = _targetedArtifacts; - } - - function targetArtifactSelectors() public view returns (FuzzArtifactSelector[] memory targetedArtifactSelectors_) { - targetedArtifactSelectors_ = _targetedArtifactSelectors; - } - - function targetContracts() public view returns (address[] memory targetedContracts_) { - targetedContracts_ = _targetedContracts; - } - - function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) { - targetedSelectors_ = _targetedSelectors; - } - - function targetSenders() public view returns (address[] memory targetedSenders_) { - targetedSenders_ = _targetedSenders; - } - - function targetInterfaces() public view returns (FuzzInterface[] memory targetedInterfaces_) { - targetedInterfaces_ = _targetedInterfaces; - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdJson.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdJson.sol deleted file mode 100644 index 6dbde8354..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/StdJson.sol +++ /dev/null @@ -1,179 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.0 <0.9.0; - -pragma experimental ABIEncoderV2; - -import {VmSafe} from "./Vm.sol"; - -// Helpers for parsing and writing JSON files -// To parse: -// ``` -// using stdJson for string; -// string memory json = vm.readFile(""); -// json.readUint(""); -// ``` -// To write: -// ``` -// using stdJson for string; -// string memory json = "json"; -// json.serialize("a", uint256(123)); -// string memory semiFinal = json.serialize("b", string("test")); -// string memory finalJson = json.serialize("c", semiFinal); -// finalJson.write(""); -// ``` - -library stdJson { - VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); - - function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) { - return vm.parseJson(json, key); - } - - function readUint(string memory json, string memory key) internal pure returns (uint256) { - return vm.parseJsonUint(json, key); - } - - function readUintArray(string memory json, string memory key) internal pure returns (uint256[] memory) { - return vm.parseJsonUintArray(json, key); - } - - function readInt(string memory json, string memory key) internal pure returns (int256) { - return vm.parseJsonInt(json, key); - } - - function readIntArray(string memory json, string memory key) internal pure returns (int256[] memory) { - return vm.parseJsonIntArray(json, key); - } - - function readBytes32(string memory json, string memory key) internal pure returns (bytes32) { - return vm.parseJsonBytes32(json, key); - } - - function readBytes32Array(string memory json, string memory key) internal pure returns (bytes32[] memory) { - return vm.parseJsonBytes32Array(json, key); - } - - function readString(string memory json, string memory key) internal pure returns (string memory) { - return vm.parseJsonString(json, key); - } - - function readStringArray(string memory json, string memory key) internal pure returns (string[] memory) { - return vm.parseJsonStringArray(json, key); - } - - function readAddress(string memory json, string memory key) internal pure returns (address) { - return vm.parseJsonAddress(json, key); - } - - function readAddressArray(string memory json, string memory key) internal pure returns (address[] memory) { - return vm.parseJsonAddressArray(json, key); - } - - function readBool(string memory json, string memory key) internal pure returns (bool) { - return vm.parseJsonBool(json, key); - } - - function readBoolArray(string memory json, string memory key) internal pure returns (bool[] memory) { - return vm.parseJsonBoolArray(json, key); - } - - function readBytes(string memory json, string memory key) internal pure returns (bytes memory) { - return vm.parseJsonBytes(json, key); - } - - function readBytesArray(string memory json, string memory key) internal pure returns (bytes[] memory) { - return vm.parseJsonBytesArray(json, key); - } - - function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) { - return vm.serializeJson(jsonKey, rootObject); - } - - function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) { - return vm.serializeBool(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, bool[] memory value) - internal - returns (string memory) - { - return vm.serializeBool(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) { - return vm.serializeUint(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, uint256[] memory value) - internal - returns (string memory) - { - return vm.serializeUint(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) { - return vm.serializeInt(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, int256[] memory value) - internal - returns (string memory) - { - return vm.serializeInt(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) { - return vm.serializeAddress(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, address[] memory value) - internal - returns (string memory) - { - return vm.serializeAddress(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) { - return vm.serializeBytes32(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, bytes32[] memory value) - internal - returns (string memory) - { - return vm.serializeBytes32(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) { - return vm.serializeBytes(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, bytes[] memory value) - internal - returns (string memory) - { - return vm.serializeBytes(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, string memory value) - internal - returns (string memory) - { - return vm.serializeString(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, string[] memory value) - internal - returns (string memory) - { - return vm.serializeString(jsonKey, key, value); - } - - function write(string memory jsonKey, string memory path) internal { - vm.writeJson(jsonKey, path); - } - - function write(string memory jsonKey, string memory path, string memory valueKey) internal { - vm.writeJson(jsonKey, path, valueKey); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdMath.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdMath.sol deleted file mode 100644 index 459523bda..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/StdMath.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -library stdMath { - int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968; - - function abs(int256 a) internal pure returns (uint256) { - // Required or it will fail when `a = type(int256).min` - if (a == INT256_MIN) { - return 57896044618658097711785492504343953926634992332820282019728792003956564819968; - } - - return uint256(a > 0 ? a : -a); - } - - function delta(uint256 a, uint256 b) internal pure returns (uint256) { - return a > b ? a - b : b - a; - } - - function delta(int256 a, int256 b) internal pure returns (uint256) { - // a and b are of the same sign - // this works thanks to two's complement, the left-most bit is the sign bit - if ((a ^ b) > -1) { - return delta(abs(a), abs(b)); - } - - // a and b are of opposite signs - return abs(a) + abs(b); - } - - function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) { - uint256 absDelta = delta(a, b); - - return absDelta * 1e18 / b; - } - - function percentDelta(int256 a, int256 b) internal pure returns (uint256) { - uint256 absDelta = delta(a, b); - uint256 absB = abs(b); - - return absDelta * 1e18 / absB; - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdStorage.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdStorage.sol deleted file mode 100644 index ffd668c55..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/StdStorage.sol +++ /dev/null @@ -1,473 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -import {Vm} from "./Vm.sol"; - -struct FindData { - uint256 slot; - uint256 offsetLeft; - uint256 offsetRight; - bool found; -} - -struct StdStorage { - mapping(address => mapping(bytes4 => mapping(bytes32 => FindData))) finds; - bytes32[] _keys; - bytes4 _sig; - uint256 _depth; - address _target; - bytes32 _set; - bool _enable_packed_slots; - bytes _calldata; -} - -library stdStorageSafe { - event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot); - event WARNING_UninitedSlot(address who, uint256 slot); - - Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - uint256 constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935; - - function sigs(string memory sigStr) internal pure returns (bytes4) { - return bytes4(keccak256(bytes(sigStr))); - } - - function getCallParams(StdStorage storage self) internal view returns (bytes memory) { - if (self._calldata.length == 0) { - return flatten(self._keys); - } else { - return self._calldata; - } - } - - // Calls target contract with configured parameters - function callTarget(StdStorage storage self) internal view returns (bool, bytes32) { - bytes memory cald = abi.encodePacked(self._sig, getCallParams(self)); - (bool success, bytes memory rdat) = self._target.staticcall(cald); - bytes32 result = bytesToBytes32(rdat, 32 * self._depth); - - return (success, result); - } - - // Tries mutating slot value to determine if the targeted value is stored in it. - // If current value is 0, then we are setting slot value to type(uint256).max - // Otherwise, we set it to 0. That way, return value should always be affected. - function checkSlotMutatesCall(StdStorage storage self, bytes32 slot) internal returns (bool) { - bytes32 prevSlotValue = vm.load(self._target, slot); - (bool success, bytes32 prevReturnValue) = callTarget(self); - - bytes32 testVal = prevReturnValue == bytes32(0) ? bytes32(UINT256_MAX) : bytes32(0); - vm.store(self._target, slot, testVal); - - (, bytes32 newReturnValue) = callTarget(self); - - vm.store(self._target, slot, prevSlotValue); - - return (success && (prevReturnValue != newReturnValue)); - } - - // Tries setting one of the bits in slot to 1 until return value changes. - // Index of resulted bit is an offset packed slot has from left/right side - function findOffset(StdStorage storage self, bytes32 slot, bool left) internal returns (bool, uint256) { - for (uint256 offset = 0; offset < 256; offset++) { - uint256 valueToPut = left ? (1 << (255 - offset)) : (1 << offset); - vm.store(self._target, slot, bytes32(valueToPut)); - - (bool success, bytes32 data) = callTarget(self); - - if (success && (uint256(data) > 0)) { - return (true, offset); - } - } - return (false, 0); - } - - function findOffsets(StdStorage storage self, bytes32 slot) internal returns (bool, uint256, uint256) { - bytes32 prevSlotValue = vm.load(self._target, slot); - - (bool foundLeft, uint256 offsetLeft) = findOffset(self, slot, true); - (bool foundRight, uint256 offsetRight) = findOffset(self, slot, false); - - // `findOffset` may mutate slot value, so we are setting it to initial value - vm.store(self._target, slot, prevSlotValue); - return (foundLeft && foundRight, offsetLeft, offsetRight); - } - - function find(StdStorage storage self) internal returns (FindData storage) { - return find(self, true); - } - - /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against - // slot complexity: - // if flat, will be bytes32(uint256(uint)); - // if map, will be keccak256(abi.encode(key, uint(slot))); - // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot))))); - // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth); - function find(StdStorage storage self, bool _clear) internal returns (FindData storage) { - address who = self._target; - bytes4 fsig = self._sig; - uint256 field_depth = self._depth; - bytes memory params = getCallParams(self); - - // calldata to test against - if (self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) { - if (_clear) { - clear(self); - } - return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))]; - } - vm.record(); - (, bytes32 callResult) = callTarget(self); - (bytes32[] memory reads,) = vm.accesses(address(who)); - - if (reads.length == 0) { - revert("stdStorage find(StdStorage): No storage use detected for target."); - } else { - for (uint256 i = 0; i < reads.length; i++) { - bytes32 prev = vm.load(who, reads[i]); - if (prev == bytes32(0)) { - emit WARNING_UninitedSlot(who, uint256(reads[i])); - } - - if (!checkSlotMutatesCall(self, reads[i])) { - continue; - } - - (uint256 offsetLeft, uint256 offsetRight) = (0, 0); - - if (self._enable_packed_slots) { - bool found; - (found, offsetLeft, offsetRight) = findOffsets(self, reads[i]); - if (!found) { - continue; - } - } - - // Check that value between found offsets is equal to the current call result - uint256 curVal = (uint256(prev) & getMaskByOffsets(offsetLeft, offsetRight)) >> offsetRight; - - if (uint256(callResult) != curVal) { - continue; - } - - emit SlotFound(who, fsig, keccak256(abi.encodePacked(params, field_depth)), uint256(reads[i])); - self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))] = - FindData(uint256(reads[i]), offsetLeft, offsetRight, true); - break; - } - } - - require( - self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found, - "stdStorage find(StdStorage): Slot(s) not found." - ); - - if (_clear) { - clear(self); - } - return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))]; - } - - function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { - self._target = _target; - return self; - } - - function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { - self._sig = _sig; - return self; - } - - function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { - self._sig = sigs(_sig); - return self; - } - - function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) { - self._calldata = _calldata; - return self; - } - - function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { - self._keys.push(bytes32(uint256(uint160(who)))); - return self; - } - - function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { - self._keys.push(bytes32(amt)); - return self; - } - - function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { - self._keys.push(key); - return self; - } - - function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) { - self._enable_packed_slots = true; - return self; - } - - function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { - self._depth = _depth; - return self; - } - - function read(StdStorage storage self) private returns (bytes memory) { - FindData storage data = find(self, false); - uint256 mask = getMaskByOffsets(data.offsetLeft, data.offsetRight); - uint256 value = (uint256(vm.load(self._target, bytes32(data.slot))) & mask) >> data.offsetRight; - clear(self); - return abi.encode(value); - } - - function read_bytes32(StdStorage storage self) internal returns (bytes32) { - return abi.decode(read(self), (bytes32)); - } - - function read_bool(StdStorage storage self) internal returns (bool) { - int256 v = read_int(self); - if (v == 0) return false; - if (v == 1) return true; - revert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool."); - } - - function read_address(StdStorage storage self) internal returns (address) { - return abi.decode(read(self), (address)); - } - - function read_uint(StdStorage storage self) internal returns (uint256) { - return abi.decode(read(self), (uint256)); - } - - function read_int(StdStorage storage self) internal returns (int256) { - return abi.decode(read(self), (int256)); - } - - function parent(StdStorage storage self) internal returns (uint256, bytes32) { - address who = self._target; - uint256 field_depth = self._depth; - vm.startMappingRecording(); - uint256 child = find(self, true).slot - field_depth; - (bool found, bytes32 key, bytes32 parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child)); - if (!found) { - revert( - "stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called." - ); - } - return (uint256(parent_slot), key); - } - - function root(StdStorage storage self) internal returns (uint256) { - address who = self._target; - uint256 field_depth = self._depth; - vm.startMappingRecording(); - uint256 child = find(self, true).slot - field_depth; - bool found; - bytes32 root_slot; - bytes32 parent_slot; - (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child)); - if (!found) { - revert( - "stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called." - ); - } - while (found) { - root_slot = parent_slot; - (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(root_slot)); - } - return uint256(root_slot); - } - - function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) { - bytes32 out; - - uint256 max = b.length > 32 ? 32 : b.length; - for (uint256 i = 0; i < max; i++) { - out |= bytes32(b[offset + i] & 0xFF) >> (i * 8); - } - return out; - } - - function flatten(bytes32[] memory b) private pure returns (bytes memory) { - bytes memory result = new bytes(b.length * 32); - for (uint256 i = 0; i < b.length; i++) { - bytes32 k = b[i]; - /// @solidity memory-safe-assembly - assembly { - mstore(add(result, add(32, mul(32, i))), k) - } - } - - return result; - } - - function clear(StdStorage storage self) internal { - delete self._target; - delete self._sig; - delete self._keys; - delete self._depth; - delete self._enable_packed_slots; - delete self._calldata; - } - - // Returns mask which contains non-zero bits for values between `offsetLeft` and `offsetRight` - // (slotValue & mask) >> offsetRight will be the value of the given packed variable - function getMaskByOffsets(uint256 offsetLeft, uint256 offsetRight) internal pure returns (uint256 mask) { - // mask = ((1 << (256 - (offsetRight + offsetLeft))) - 1) << offsetRight; - // using assembly because (1 << 256) causes overflow - assembly { - mask := shl(offsetRight, sub(shl(sub(256, add(offsetRight, offsetLeft)), 1), 1)) - } - } - - // Returns slot value with updated packed variable. - function getUpdatedSlotValue(bytes32 curValue, uint256 varValue, uint256 offsetLeft, uint256 offsetRight) - internal - pure - returns (bytes32 newValue) - { - return bytes32((uint256(curValue) & ~getMaskByOffsets(offsetLeft, offsetRight)) | (varValue << offsetRight)); - } -} - -library stdStorage { - Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - - function sigs(string memory sigStr) internal pure returns (bytes4) { - return stdStorageSafe.sigs(sigStr); - } - - function find(StdStorage storage self) internal returns (uint256) { - return find(self, true); - } - - function find(StdStorage storage self, bool _clear) internal returns (uint256) { - return stdStorageSafe.find(self, _clear).slot; - } - - function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { - return stdStorageSafe.target(self, _target); - } - - function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { - return stdStorageSafe.sig(self, _sig); - } - - function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { - return stdStorageSafe.sig(self, _sig); - } - - function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { - return stdStorageSafe.with_key(self, who); - } - - function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { - return stdStorageSafe.with_key(self, amt); - } - - function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { - return stdStorageSafe.with_key(self, key); - } - - function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) { - return stdStorageSafe.with_calldata(self, _calldata); - } - - function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) { - return stdStorageSafe.enable_packed_slots(self); - } - - function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { - return stdStorageSafe.depth(self, _depth); - } - - function clear(StdStorage storage self) internal { - stdStorageSafe.clear(self); - } - - function checked_write(StdStorage storage self, address who) internal { - checked_write(self, bytes32(uint256(uint160(who)))); - } - - function checked_write(StdStorage storage self, uint256 amt) internal { - checked_write(self, bytes32(amt)); - } - - function checked_write_int(StdStorage storage self, int256 val) internal { - checked_write(self, bytes32(uint256(val))); - } - - function checked_write(StdStorage storage self, bool write) internal { - bytes32 t; - /// @solidity memory-safe-assembly - assembly { - t := write - } - checked_write(self, t); - } - - function checked_write(StdStorage storage self, bytes32 set) internal { - address who = self._target; - bytes4 fsig = self._sig; - uint256 field_depth = self._depth; - bytes memory params = stdStorageSafe.getCallParams(self); - - if (!self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) { - find(self, false); - } - FindData storage data = self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))]; - if ((data.offsetLeft + data.offsetRight) > 0) { - uint256 maxVal = 2 ** (256 - (data.offsetLeft + data.offsetRight)); - require( - uint256(set) < maxVal, - string( - abi.encodePacked( - "stdStorage find(StdStorage): Packed slot. We can't fit value greater than ", - vm.toString(maxVal) - ) - ) - ); - } - bytes32 curVal = vm.load(who, bytes32(data.slot)); - bytes32 valToSet = stdStorageSafe.getUpdatedSlotValue(curVal, uint256(set), data.offsetLeft, data.offsetRight); - - vm.store(who, bytes32(data.slot), valToSet); - - (bool success, bytes32 callResult) = stdStorageSafe.callTarget(self); - - if (!success || callResult != set) { - vm.store(who, bytes32(data.slot), curVal); - revert("stdStorage find(StdStorage): Failed to write value."); - } - clear(self); - } - - function read_bytes32(StdStorage storage self) internal returns (bytes32) { - return stdStorageSafe.read_bytes32(self); - } - - function read_bool(StdStorage storage self) internal returns (bool) { - return stdStorageSafe.read_bool(self); - } - - function read_address(StdStorage storage self) internal returns (address) { - return stdStorageSafe.read_address(self); - } - - function read_uint(StdStorage storage self) internal returns (uint256) { - return stdStorageSafe.read_uint(self); - } - - function read_int(StdStorage storage self) internal returns (int256) { - return stdStorageSafe.read_int(self); - } - - function parent(StdStorage storage self) internal returns (uint256, bytes32) { - return stdStorageSafe.parent(self); - } - - function root(StdStorage storage self) internal returns (uint256) { - return stdStorageSafe.root(self); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdStyle.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdStyle.sol deleted file mode 100644 index d371e0c60..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/StdStyle.sol +++ /dev/null @@ -1,333 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.4.22 <0.9.0; - -import {VmSafe} from "./Vm.sol"; - -library StdStyle { - VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); - - string constant RED = "\u001b[91m"; - string constant GREEN = "\u001b[92m"; - string constant YELLOW = "\u001b[93m"; - string constant BLUE = "\u001b[94m"; - string constant MAGENTA = "\u001b[95m"; - string constant CYAN = "\u001b[96m"; - string constant BOLD = "\u001b[1m"; - string constant DIM = "\u001b[2m"; - string constant ITALIC = "\u001b[3m"; - string constant UNDERLINE = "\u001b[4m"; - string constant INVERSE = "\u001b[7m"; - string constant RESET = "\u001b[0m"; - - function styleConcat(string memory style, string memory self) private pure returns (string memory) { - return string(abi.encodePacked(style, self, RESET)); - } - - function red(string memory self) internal pure returns (string memory) { - return styleConcat(RED, self); - } - - function red(uint256 self) internal pure returns (string memory) { - return red(vm.toString(self)); - } - - function red(int256 self) internal pure returns (string memory) { - return red(vm.toString(self)); - } - - function red(address self) internal pure returns (string memory) { - return red(vm.toString(self)); - } - - function red(bool self) internal pure returns (string memory) { - return red(vm.toString(self)); - } - - function redBytes(bytes memory self) internal pure returns (string memory) { - return red(vm.toString(self)); - } - - function redBytes32(bytes32 self) internal pure returns (string memory) { - return red(vm.toString(self)); - } - - function green(string memory self) internal pure returns (string memory) { - return styleConcat(GREEN, self); - } - - function green(uint256 self) internal pure returns (string memory) { - return green(vm.toString(self)); - } - - function green(int256 self) internal pure returns (string memory) { - return green(vm.toString(self)); - } - - function green(address self) internal pure returns (string memory) { - return green(vm.toString(self)); - } - - function green(bool self) internal pure returns (string memory) { - return green(vm.toString(self)); - } - - function greenBytes(bytes memory self) internal pure returns (string memory) { - return green(vm.toString(self)); - } - - function greenBytes32(bytes32 self) internal pure returns (string memory) { - return green(vm.toString(self)); - } - - function yellow(string memory self) internal pure returns (string memory) { - return styleConcat(YELLOW, self); - } - - function yellow(uint256 self) internal pure returns (string memory) { - return yellow(vm.toString(self)); - } - - function yellow(int256 self) internal pure returns (string memory) { - return yellow(vm.toString(self)); - } - - function yellow(address self) internal pure returns (string memory) { - return yellow(vm.toString(self)); - } - - function yellow(bool self) internal pure returns (string memory) { - return yellow(vm.toString(self)); - } - - function yellowBytes(bytes memory self) internal pure returns (string memory) { - return yellow(vm.toString(self)); - } - - function yellowBytes32(bytes32 self) internal pure returns (string memory) { - return yellow(vm.toString(self)); - } - - function blue(string memory self) internal pure returns (string memory) { - return styleConcat(BLUE, self); - } - - function blue(uint256 self) internal pure returns (string memory) { - return blue(vm.toString(self)); - } - - function blue(int256 self) internal pure returns (string memory) { - return blue(vm.toString(self)); - } - - function blue(address self) internal pure returns (string memory) { - return blue(vm.toString(self)); - } - - function blue(bool self) internal pure returns (string memory) { - return blue(vm.toString(self)); - } - - function blueBytes(bytes memory self) internal pure returns (string memory) { - return blue(vm.toString(self)); - } - - function blueBytes32(bytes32 self) internal pure returns (string memory) { - return blue(vm.toString(self)); - } - - function magenta(string memory self) internal pure returns (string memory) { - return styleConcat(MAGENTA, self); - } - - function magenta(uint256 self) internal pure returns (string memory) { - return magenta(vm.toString(self)); - } - - function magenta(int256 self) internal pure returns (string memory) { - return magenta(vm.toString(self)); - } - - function magenta(address self) internal pure returns (string memory) { - return magenta(vm.toString(self)); - } - - function magenta(bool self) internal pure returns (string memory) { - return magenta(vm.toString(self)); - } - - function magentaBytes(bytes memory self) internal pure returns (string memory) { - return magenta(vm.toString(self)); - } - - function magentaBytes32(bytes32 self) internal pure returns (string memory) { - return magenta(vm.toString(self)); - } - - function cyan(string memory self) internal pure returns (string memory) { - return styleConcat(CYAN, self); - } - - function cyan(uint256 self) internal pure returns (string memory) { - return cyan(vm.toString(self)); - } - - function cyan(int256 self) internal pure returns (string memory) { - return cyan(vm.toString(self)); - } - - function cyan(address self) internal pure returns (string memory) { - return cyan(vm.toString(self)); - } - - function cyan(bool self) internal pure returns (string memory) { - return cyan(vm.toString(self)); - } - - function cyanBytes(bytes memory self) internal pure returns (string memory) { - return cyan(vm.toString(self)); - } - - function cyanBytes32(bytes32 self) internal pure returns (string memory) { - return cyan(vm.toString(self)); - } - - function bold(string memory self) internal pure returns (string memory) { - return styleConcat(BOLD, self); - } - - function bold(uint256 self) internal pure returns (string memory) { - return bold(vm.toString(self)); - } - - function bold(int256 self) internal pure returns (string memory) { - return bold(vm.toString(self)); - } - - function bold(address self) internal pure returns (string memory) { - return bold(vm.toString(self)); - } - - function bold(bool self) internal pure returns (string memory) { - return bold(vm.toString(self)); - } - - function boldBytes(bytes memory self) internal pure returns (string memory) { - return bold(vm.toString(self)); - } - - function boldBytes32(bytes32 self) internal pure returns (string memory) { - return bold(vm.toString(self)); - } - - function dim(string memory self) internal pure returns (string memory) { - return styleConcat(DIM, self); - } - - function dim(uint256 self) internal pure returns (string memory) { - return dim(vm.toString(self)); - } - - function dim(int256 self) internal pure returns (string memory) { - return dim(vm.toString(self)); - } - - function dim(address self) internal pure returns (string memory) { - return dim(vm.toString(self)); - } - - function dim(bool self) internal pure returns (string memory) { - return dim(vm.toString(self)); - } - - function dimBytes(bytes memory self) internal pure returns (string memory) { - return dim(vm.toString(self)); - } - - function dimBytes32(bytes32 self) internal pure returns (string memory) { - return dim(vm.toString(self)); - } - - function italic(string memory self) internal pure returns (string memory) { - return styleConcat(ITALIC, self); - } - - function italic(uint256 self) internal pure returns (string memory) { - return italic(vm.toString(self)); - } - - function italic(int256 self) internal pure returns (string memory) { - return italic(vm.toString(self)); - } - - function italic(address self) internal pure returns (string memory) { - return italic(vm.toString(self)); - } - - function italic(bool self) internal pure returns (string memory) { - return italic(vm.toString(self)); - } - - function italicBytes(bytes memory self) internal pure returns (string memory) { - return italic(vm.toString(self)); - } - - function italicBytes32(bytes32 self) internal pure returns (string memory) { - return italic(vm.toString(self)); - } - - function underline(string memory self) internal pure returns (string memory) { - return styleConcat(UNDERLINE, self); - } - - function underline(uint256 self) internal pure returns (string memory) { - return underline(vm.toString(self)); - } - - function underline(int256 self) internal pure returns (string memory) { - return underline(vm.toString(self)); - } - - function underline(address self) internal pure returns (string memory) { - return underline(vm.toString(self)); - } - - function underline(bool self) internal pure returns (string memory) { - return underline(vm.toString(self)); - } - - function underlineBytes(bytes memory self) internal pure returns (string memory) { - return underline(vm.toString(self)); - } - - function underlineBytes32(bytes32 self) internal pure returns (string memory) { - return underline(vm.toString(self)); - } - - function inverse(string memory self) internal pure returns (string memory) { - return styleConcat(INVERSE, self); - } - - function inverse(uint256 self) internal pure returns (string memory) { - return inverse(vm.toString(self)); - } - - function inverse(int256 self) internal pure returns (string memory) { - return inverse(vm.toString(self)); - } - - function inverse(address self) internal pure returns (string memory) { - return inverse(vm.toString(self)); - } - - function inverse(bool self) internal pure returns (string memory) { - return inverse(vm.toString(self)); - } - - function inverseBytes(bytes memory self) internal pure returns (string memory) { - return inverse(vm.toString(self)); - } - - function inverseBytes32(bytes32 self) internal pure returns (string memory) { - return inverse(vm.toString(self)); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdToml.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdToml.sol deleted file mode 100644 index ef88db6d2..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/StdToml.sol +++ /dev/null @@ -1,179 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.0 <0.9.0; - -pragma experimental ABIEncoderV2; - -import {VmSafe} from "./Vm.sol"; - -// Helpers for parsing and writing TOML files -// To parse: -// ``` -// using stdToml for string; -// string memory toml = vm.readFile(""); -// toml.readUint(""); -// ``` -// To write: -// ``` -// using stdToml for string; -// string memory json = "json"; -// json.serialize("a", uint256(123)); -// string memory semiFinal = json.serialize("b", string("test")); -// string memory finalJson = json.serialize("c", semiFinal); -// finalJson.write(""); -// ``` - -library stdToml { - VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); - - function parseRaw(string memory toml, string memory key) internal pure returns (bytes memory) { - return vm.parseToml(toml, key); - } - - function readUint(string memory toml, string memory key) internal pure returns (uint256) { - return vm.parseTomlUint(toml, key); - } - - function readUintArray(string memory toml, string memory key) internal pure returns (uint256[] memory) { - return vm.parseTomlUintArray(toml, key); - } - - function readInt(string memory toml, string memory key) internal pure returns (int256) { - return vm.parseTomlInt(toml, key); - } - - function readIntArray(string memory toml, string memory key) internal pure returns (int256[] memory) { - return vm.parseTomlIntArray(toml, key); - } - - function readBytes32(string memory toml, string memory key) internal pure returns (bytes32) { - return vm.parseTomlBytes32(toml, key); - } - - function readBytes32Array(string memory toml, string memory key) internal pure returns (bytes32[] memory) { - return vm.parseTomlBytes32Array(toml, key); - } - - function readString(string memory toml, string memory key) internal pure returns (string memory) { - return vm.parseTomlString(toml, key); - } - - function readStringArray(string memory toml, string memory key) internal pure returns (string[] memory) { - return vm.parseTomlStringArray(toml, key); - } - - function readAddress(string memory toml, string memory key) internal pure returns (address) { - return vm.parseTomlAddress(toml, key); - } - - function readAddressArray(string memory toml, string memory key) internal pure returns (address[] memory) { - return vm.parseTomlAddressArray(toml, key); - } - - function readBool(string memory toml, string memory key) internal pure returns (bool) { - return vm.parseTomlBool(toml, key); - } - - function readBoolArray(string memory toml, string memory key) internal pure returns (bool[] memory) { - return vm.parseTomlBoolArray(toml, key); - } - - function readBytes(string memory toml, string memory key) internal pure returns (bytes memory) { - return vm.parseTomlBytes(toml, key); - } - - function readBytesArray(string memory toml, string memory key) internal pure returns (bytes[] memory) { - return vm.parseTomlBytesArray(toml, key); - } - - function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) { - return vm.serializeJson(jsonKey, rootObject); - } - - function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) { - return vm.serializeBool(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, bool[] memory value) - internal - returns (string memory) - { - return vm.serializeBool(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) { - return vm.serializeUint(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, uint256[] memory value) - internal - returns (string memory) - { - return vm.serializeUint(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) { - return vm.serializeInt(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, int256[] memory value) - internal - returns (string memory) - { - return vm.serializeInt(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) { - return vm.serializeAddress(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, address[] memory value) - internal - returns (string memory) - { - return vm.serializeAddress(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) { - return vm.serializeBytes32(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, bytes32[] memory value) - internal - returns (string memory) - { - return vm.serializeBytes32(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) { - return vm.serializeBytes(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, bytes[] memory value) - internal - returns (string memory) - { - return vm.serializeBytes(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, string memory value) - internal - returns (string memory) - { - return vm.serializeString(jsonKey, key, value); - } - - function serialize(string memory jsonKey, string memory key, string[] memory value) - internal - returns (string memory) - { - return vm.serializeString(jsonKey, key, value); - } - - function write(string memory jsonKey, string memory path) internal { - vm.writeToml(jsonKey, path); - } - - function write(string memory jsonKey, string memory path, string memory valueKey) internal { - vm.writeToml(jsonKey, path, valueKey); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/StdUtils.sol b/examples/validating-public-input/contracts/lib/forge-std/src/StdUtils.sol deleted file mode 100644 index 5d120439f..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/StdUtils.sol +++ /dev/null @@ -1,226 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -import {IMulticall3} from "./interfaces/IMulticall3.sol"; -import {MockERC20} from "./mocks/MockERC20.sol"; -import {MockERC721} from "./mocks/MockERC721.sol"; -import {VmSafe} from "./Vm.sol"; - -abstract contract StdUtils { - /*////////////////////////////////////////////////////////////////////////// - CONSTANTS - //////////////////////////////////////////////////////////////////////////*/ - - IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11); - VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); - address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; - uint256 private constant INT256_MIN_ABS = - 57896044618658097711785492504343953926634992332820282019728792003956564819968; - uint256 private constant SECP256K1_ORDER = - 115792089237316195423570985008687907852837564279074904382605163141518161494337; - uint256 private constant UINT256_MAX = - 115792089237316195423570985008687907853269984665640564039457584007913129639935; - - // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy. - address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; - - /*////////////////////////////////////////////////////////////////////////// - INTERNAL FUNCTIONS - //////////////////////////////////////////////////////////////////////////*/ - - function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) { - require(min <= max, "StdUtils bound(uint256,uint256,uint256): Max is less than min."); - // If x is between min and max, return x directly. This is to ensure that dictionary values - // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188 - if (x >= min && x <= max) return x; - - uint256 size = max - min + 1; - - // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side. - // This helps ensure coverage of the min/max values. - if (x <= 3 && size > x) return min + x; - if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x); - - // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive. - if (x > max) { - uint256 diff = x - max; - uint256 rem = diff % size; - if (rem == 0) return max; - result = min + rem - 1; - } else if (x < min) { - uint256 diff = min - x; - uint256 rem = diff % size; - if (rem == 0) return min; - result = max - rem + 1; - } - } - - function bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) { - result = _bound(x, min, max); - console2_log_StdUtils("Bound result", result); - } - - function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) { - require(min <= max, "StdUtils bound(int256,int256,int256): Max is less than min."); - - // Shifting all int256 values to uint256 to use _bound function. The range of two types are: - // int256 : -(2**255) ~ (2**255 - 1) - // uint256: 0 ~ (2**256 - 1) - // So, add 2**255, INT256_MIN_ABS to the integer values. - // - // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow. - // So, use `~uint256(x) + 1` instead. - uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS); - uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS); - uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS); - - uint256 y = _bound(_x, _min, _max); - - // To move it back to int256 value, subtract INT256_MIN_ABS at here. - result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS); - } - - function bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) { - result = _bound(x, min, max); - console2_log_StdUtils("Bound result", vm.toString(result)); - } - - function boundPrivateKey(uint256 privateKey) internal pure virtual returns (uint256 result) { - result = _bound(privateKey, 1, SECP256K1_ORDER - 1); - } - - function bytesToUint(bytes memory b) internal pure virtual returns (uint256) { - require(b.length <= 32, "StdUtils bytesToUint(bytes): Bytes length exceeds 32."); - return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); - } - - /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce - /// @notice adapted from Solmate implementation (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibRLP.sol) - function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) { - console2_log_StdUtils("computeCreateAddress is deprecated. Please use vm.computeCreateAddress instead."); - return vm.computeCreateAddress(deployer, nonce); - } - - function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer) - internal - pure - virtual - returns (address) - { - console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead."); - return vm.computeCreate2Address(salt, initcodeHash, deployer); - } - - /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer - function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) { - console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead."); - return vm.computeCreate2Address(salt, initCodeHash); - } - - /// @dev returns an initialized mock ERC20 contract - function deployMockERC20(string memory name, string memory symbol, uint8 decimals) - internal - returns (MockERC20 mock) - { - mock = new MockERC20(); - mock.initialize(name, symbol, decimals); - } - - /// @dev returns an initialized mock ERC721 contract - function deployMockERC721(string memory name, string memory symbol) internal returns (MockERC721 mock) { - mock = new MockERC721(); - mock.initialize(name, symbol); - } - - /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments - /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode - function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) { - return hashInitCode(creationCode, ""); - } - - /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2 - /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode - /// @param args the ABI-encoded arguments to the constructor of C - function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) { - return keccak256(abi.encodePacked(creationCode, args)); - } - - // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses. - function getTokenBalances(address token, address[] memory addresses) - internal - virtual - returns (uint256[] memory balances) - { - uint256 tokenCodeSize; - assembly { - tokenCodeSize := extcodesize(token) - } - require(tokenCodeSize > 0, "StdUtils getTokenBalances(address,address[]): Token address is not a contract."); - - // ABI encode the aggregate call to Multicall3. - uint256 length = addresses.length; - IMulticall3.Call[] memory calls = new IMulticall3.Call[](length); - for (uint256 i = 0; i < length; ++i) { - // 0x70a08231 = bytes4("balanceOf(address)")) - calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))}); - } - - // Make the aggregate call. - (, bytes[] memory returnData) = multicall.aggregate(calls); - - // ABI decode the return data and return the balances. - balances = new uint256[](length); - for (uint256 i = 0; i < length; ++i) { - balances[i] = abi.decode(returnData[i], (uint256)); - } - } - - /*////////////////////////////////////////////////////////////////////////// - PRIVATE FUNCTIONS - //////////////////////////////////////////////////////////////////////////*/ - - function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) { - return address(uint160(uint256(bytesValue))); - } - - // This section is used to prevent the compilation of console, which shortens the compilation time when console is - // not used elsewhere. We also trick the compiler into letting us make the console log methods as `pure` to avoid - // any breaking changes to function signatures. - function _castLogPayloadViewToPure(function(bytes memory) internal view fnIn) - internal - pure - returns (function(bytes memory) internal pure fnOut) - { - assembly { - fnOut := fnIn - } - } - - function _sendLogPayload(bytes memory payload) internal pure { - _castLogPayloadViewToPure(_sendLogPayloadView)(payload); - } - - function _sendLogPayloadView(bytes memory payload) private view { - uint256 payloadLength = payload.length; - address consoleAddress = CONSOLE2_ADDRESS; - /// @solidity memory-safe-assembly - assembly { - let payloadStart := add(payload, 32) - let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) - } - } - - function console2_log_StdUtils(string memory p0) private pure { - _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); - } - - function console2_log_StdUtils(string memory p0, uint256 p1) private pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); - } - - function console2_log_StdUtils(string memory p0, string memory p1) private pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/Test.sol b/examples/validating-public-input/contracts/lib/forge-std/src/Test.sol deleted file mode 100644 index 5ff60ea3f..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/Test.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -// 💬 ABOUT -// Forge Std's default Test. - -// 🧩 MODULES -import {console} from "./console.sol"; -import {console2} from "./console2.sol"; -import {safeconsole} from "./safeconsole.sol"; -import {StdAssertions} from "./StdAssertions.sol"; -import {StdChains} from "./StdChains.sol"; -import {StdCheats} from "./StdCheats.sol"; -import {stdError} from "./StdError.sol"; -import {StdInvariant} from "./StdInvariant.sol"; -import {stdJson} from "./StdJson.sol"; -import {stdMath} from "./StdMath.sol"; -import {StdStorage, stdStorage} from "./StdStorage.sol"; -import {StdStyle} from "./StdStyle.sol"; -import {stdToml} from "./StdToml.sol"; -import {StdUtils} from "./StdUtils.sol"; -import {Vm} from "./Vm.sol"; - -// 📦 BOILERPLATE -import {TestBase} from "./Base.sol"; - -// â­ï¸ TEST -abstract contract Test is TestBase, StdAssertions, StdChains, StdCheats, StdInvariant, StdUtils { - // Note: IS_TEST() must return true. - bool public IS_TEST = true; -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/Vm.sol b/examples/validating-public-input/contracts/lib/forge-std/src/Vm.sol deleted file mode 100644 index e13a386cd..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/Vm.sol +++ /dev/null @@ -1,1763 +0,0 @@ -// Automatically @generated by scripts/vm.py. Do not modify manually. - -// SPDX-License-Identifier: MIT OR Apache-2.0 -pragma solidity >=0.6.2 <0.9.0; -pragma experimental ABIEncoderV2; - -/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may -/// result in Script simulations differing from on-chain execution. It is recommended to only use -/// these cheats in scripts. -interface VmSafe { - /// A modification applied to either `msg.sender` or `tx.origin`. Returned by `readCallers`. - enum CallerMode { - // No caller modification is currently active. - None, - // A one time broadcast triggered by a `vm.broadcast()` call is currently active. - Broadcast, - // A recurrent broadcast triggered by a `vm.startBroadcast()` call is currently active. - RecurrentBroadcast, - // A one time prank triggered by a `vm.prank()` call is currently active. - Prank, - // A recurrent prank triggered by a `vm.startPrank()` call is currently active. - RecurrentPrank - } - - /// The kind of account access that occurred. - enum AccountAccessKind { - // The account was called. - Call, - // The account was called via delegatecall. - DelegateCall, - // The account was called via callcode. - CallCode, - // The account was called via staticcall. - StaticCall, - // The account was created. - Create, - // The account was selfdestructed. - SelfDestruct, - // Synthetic access indicating the current context has resumed after a previous sub-context (AccountAccess). - Resume, - // The account's balance was read. - Balance, - // The account's codesize was read. - Extcodesize, - // The account's codehash was read. - Extcodehash, - // The account's code was copied. - Extcodecopy - } - - /// Forge execution contexts. - enum ForgeContext { - // Test group execution context (test, coverage or snapshot). - TestGroup, - // `forge test` execution context. - Test, - // `forge coverage` execution context. - Coverage, - // `forge snapshot` execution context. - Snapshot, - // Script group execution context (dry run, broadcast or resume). - ScriptGroup, - // `forge script` execution context. - ScriptDryRun, - // `forge script --broadcast` execution context. - ScriptBroadcast, - // `forge script --resume` execution context. - ScriptResume, - // Unknown `forge` execution context. - Unknown - } - - /// An Ethereum log. Returned by `getRecordedLogs`. - struct Log { - // The topics of the log, including the signature, if any. - bytes32[] topics; - // The raw data of the log. - bytes data; - // The address of the log's emitter. - address emitter; - } - - /// An RPC URL and its alias. Returned by `rpcUrlStructs`. - struct Rpc { - // The alias of the RPC URL. - string key; - // The RPC URL. - string url; - } - - /// An RPC log object. Returned by `eth_getLogs`. - struct EthGetLogs { - // The address of the log's emitter. - address emitter; - // The topics of the log, including the signature, if any. - bytes32[] topics; - // The raw data of the log. - bytes data; - // The block hash. - bytes32 blockHash; - // The block number. - uint64 blockNumber; - // The transaction hash. - bytes32 transactionHash; - // The transaction index in the block. - uint64 transactionIndex; - // The log index. - uint256 logIndex; - // Whether the log was removed. - bool removed; - } - - /// A single entry in a directory listing. Returned by `readDir`. - struct DirEntry { - // The error message, if any. - string errorMessage; - // The path of the entry. - string path; - // The depth of the entry. - uint64 depth; - // Whether the entry is a directory. - bool isDir; - // Whether the entry is a symlink. - bool isSymlink; - } - - /// Metadata information about a file. - /// This structure is returned from the `fsMetadata` function and represents known - /// metadata about a file such as its permissions, size, modification - /// times, etc. - struct FsMetadata { - // True if this metadata is for a directory. - bool isDir; - // True if this metadata is for a symlink. - bool isSymlink; - // The size of the file, in bytes, this metadata is for. - uint256 length; - // True if this metadata is for a readonly (unwritable) file. - bool readOnly; - // The last modification time listed in this metadata. - uint256 modified; - // The last access time of this metadata. - uint256 accessed; - // The creation time listed in this metadata. - uint256 created; - } - - /// A wallet with a public and private key. - struct Wallet { - // The wallet's address. - address addr; - // The wallet's public key `X`. - uint256 publicKeyX; - // The wallet's public key `Y`. - uint256 publicKeyY; - // The wallet's private key. - uint256 privateKey; - } - - /// The result of a `tryFfi` call. - struct FfiResult { - // The exit code of the call. - int32 exitCode; - // The optionally hex-decoded `stdout` data. - bytes stdout; - // The `stderr` data. - bytes stderr; - } - - /// Information on the chain and fork. - struct ChainInfo { - // The fork identifier. Set to zero if no fork is active. - uint256 forkId; - // The chain ID of the current fork. - uint256 chainId; - } - - /// The result of a `stopAndReturnStateDiff` call. - struct AccountAccess { - // The chain and fork the access occurred. - ChainInfo chainInfo; - // The kind of account access that determines what the account is. - // If kind is Call, DelegateCall, StaticCall or CallCode, then the account is the callee. - // If kind is Create, then the account is the newly created account. - // If kind is SelfDestruct, then the account is the selfdestruct recipient. - // If kind is a Resume, then account represents a account context that has resumed. - AccountAccessKind kind; - // The account that was accessed. - // It's either the account created, callee or a selfdestruct recipient for CREATE, CALL or SELFDESTRUCT. - address account; - // What accessed the account. - address accessor; - // If the account was initialized or empty prior to the access. - // An account is considered initialized if it has code, a - // non-zero nonce, or a non-zero balance. - bool initialized; - // The previous balance of the accessed account. - uint256 oldBalance; - // The potential new balance of the accessed account. - // That is, all balance changes are recorded here, even if reverts occurred. - uint256 newBalance; - // Code of the account deployed by CREATE. - bytes deployedCode; - // Value passed along with the account access - uint256 value; - // Input data provided to the CREATE or CALL - bytes data; - // If this access reverted in either the current or parent context. - bool reverted; - // An ordered list of storage accesses made during an account access operation. - StorageAccess[] storageAccesses; - // Call depth traversed during the recording of state differences - uint64 depth; - } - - /// The storage accessed during an `AccountAccess`. - struct StorageAccess { - // The account whose storage was accessed. - address account; - // The slot that was accessed. - bytes32 slot; - // If the access was a write. - bool isWrite; - // The previous value of the slot. - bytes32 previousValue; - // The new value of the slot. - bytes32 newValue; - // If the access was reverted. - bool reverted; - } - - /// Gas used. Returned by `lastCallGas`. - struct Gas { - // The gas limit of the call. - uint64 gasLimit; - // The total gas used. - uint64 gasTotalUsed; - // DEPRECATED: The amount of gas used for memory expansion. Ref: - uint64 gasMemoryUsed; - // The amount of gas refunded. - int64 gasRefunded; - // The amount of gas remaining. - uint64 gasRemaining; - } - - // ======== Environment ======== - - /// Gets the environment variable `name` and parses it as `address`. - /// Reverts if the variable was not found or could not be parsed. - function envAddress(string calldata name) external view returns (address value); - - /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`. - /// Reverts if the variable was not found or could not be parsed. - function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value); - - /// Gets the environment variable `name` and parses it as `bool`. - /// Reverts if the variable was not found or could not be parsed. - function envBool(string calldata name) external view returns (bool value); - - /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`. - /// Reverts if the variable was not found or could not be parsed. - function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value); - - /// Gets the environment variable `name` and parses it as `bytes32`. - /// Reverts if the variable was not found or could not be parsed. - function envBytes32(string calldata name) external view returns (bytes32 value); - - /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`. - /// Reverts if the variable was not found or could not be parsed. - function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value); - - /// Gets the environment variable `name` and parses it as `bytes`. - /// Reverts if the variable was not found or could not be parsed. - function envBytes(string calldata name) external view returns (bytes memory value); - - /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`. - /// Reverts if the variable was not found or could not be parsed. - function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value); - - /// Gets the environment variable `name` and returns true if it exists, else returns false. - function envExists(string calldata name) external view returns (bool result); - - /// Gets the environment variable `name` and parses it as `int256`. - /// Reverts if the variable was not found or could not be parsed. - function envInt(string calldata name) external view returns (int256 value); - - /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`. - /// Reverts if the variable was not found or could not be parsed. - function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value); - - /// Gets the environment variable `name` and parses it as `bool`. - /// Reverts if the variable could not be parsed. - /// Returns `defaultValue` if the variable was not found. - function envOr(string calldata name, bool defaultValue) external view returns (bool value); - - /// Gets the environment variable `name` and parses it as `uint256`. - /// Reverts if the variable could not be parsed. - /// Returns `defaultValue` if the variable was not found. - function envOr(string calldata name, uint256 defaultValue) external view returns (uint256 value); - - /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`. - /// Reverts if the variable could not be parsed. - /// Returns `defaultValue` if the variable was not found. - function envOr(string calldata name, string calldata delim, address[] calldata defaultValue) - external - view - returns (address[] memory value); - - /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`. - /// Reverts if the variable could not be parsed. - /// Returns `defaultValue` if the variable was not found. - function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue) - external - view - returns (bytes32[] memory value); - - /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`. - /// Reverts if the variable could not be parsed. - /// Returns `defaultValue` if the variable was not found. - function envOr(string calldata name, string calldata delim, string[] calldata defaultValue) - external - view - returns (string[] memory value); - - /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`. - /// Reverts if the variable could not be parsed. - /// Returns `defaultValue` if the variable was not found. - function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue) - external - view - returns (bytes[] memory value); - - /// Gets the environment variable `name` and parses it as `int256`. - /// Reverts if the variable could not be parsed. - /// Returns `defaultValue` if the variable was not found. - function envOr(string calldata name, int256 defaultValue) external view returns (int256 value); - - /// Gets the environment variable `name` and parses it as `address`. - /// Reverts if the variable could not be parsed. - /// Returns `defaultValue` if the variable was not found. - function envOr(string calldata name, address defaultValue) external view returns (address value); - - /// Gets the environment variable `name` and parses it as `bytes32`. - /// Reverts if the variable could not be parsed. - /// Returns `defaultValue` if the variable was not found. - function envOr(string calldata name, bytes32 defaultValue) external view returns (bytes32 value); - - /// Gets the environment variable `name` and parses it as `string`. - /// Reverts if the variable could not be parsed. - /// Returns `defaultValue` if the variable was not found. - function envOr(string calldata name, string calldata defaultValue) external view returns (string memory value); - - /// Gets the environment variable `name` and parses it as `bytes`. - /// Reverts if the variable could not be parsed. - /// Returns `defaultValue` if the variable was not found. - function envOr(string calldata name, bytes calldata defaultValue) external view returns (bytes memory value); - - /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`. - /// Reverts if the variable could not be parsed. - /// Returns `defaultValue` if the variable was not found. - function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue) - external - view - returns (bool[] memory value); - - /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`. - /// Reverts if the variable could not be parsed. - /// Returns `defaultValue` if the variable was not found. - function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue) - external - view - returns (uint256[] memory value); - - /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`. - /// Reverts if the variable could not be parsed. - /// Returns `defaultValue` if the variable was not found. - function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue) - external - view - returns (int256[] memory value); - - /// Gets the environment variable `name` and parses it as `string`. - /// Reverts if the variable was not found or could not be parsed. - function envString(string calldata name) external view returns (string memory value); - - /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`. - /// Reverts if the variable was not found or could not be parsed. - function envString(string calldata name, string calldata delim) external view returns (string[] memory value); - - /// Gets the environment variable `name` and parses it as `uint256`. - /// Reverts if the variable was not found or could not be parsed. - function envUint(string calldata name) external view returns (uint256 value); - - /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`. - /// Reverts if the variable was not found or could not be parsed. - function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value); - - /// Returns true if `forge` command was executed in given context. - function isContext(ForgeContext context) external view returns (bool result); - - /// Sets environment variables. - function setEnv(string calldata name, string calldata value) external; - - // ======== EVM ======== - - /// Gets all accessed reads and write slot from a `vm.record` session, for a given address. - function accesses(address target) external returns (bytes32[] memory readSlots, bytes32[] memory writeSlots); - - /// Gets the address for a given private key. - function addr(uint256 privateKey) external pure returns (address keyAddr); - - /// Gets all the logs according to specified filter. - function eth_getLogs(uint256 fromBlock, uint256 toBlock, address target, bytes32[] calldata topics) - external - returns (EthGetLogs[] memory logs); - - /// Gets the current `block.blobbasefee`. - /// You should use this instead of `block.blobbasefee` if you use `vm.blobBaseFee`, as `block.blobbasefee` is assumed to be constant across a transaction, - /// and as a result will get optimized out by the compiler. - /// See https://github.com/foundry-rs/foundry/issues/6180 - function getBlobBaseFee() external view returns (uint256 blobBaseFee); - - /// Gets the current `block.number`. - /// You should use this instead of `block.number` if you use `vm.roll`, as `block.number` is assumed to be constant across a transaction, - /// and as a result will get optimized out by the compiler. - /// See https://github.com/foundry-rs/foundry/issues/6180 - function getBlockNumber() external view returns (uint256 height); - - /// Gets the current `block.timestamp`. - /// You should use this instead of `block.timestamp` if you use `vm.warp`, as `block.timestamp` is assumed to be constant across a transaction, - /// and as a result will get optimized out by the compiler. - /// See https://github.com/foundry-rs/foundry/issues/6180 - function getBlockTimestamp() external view returns (uint256 timestamp); - - /// Gets the map key and parent of a mapping at a given slot, for a given address. - function getMappingKeyAndParentOf(address target, bytes32 elementSlot) - external - returns (bool found, bytes32 key, bytes32 parent); - - /// Gets the number of elements in the mapping at the given slot, for a given address. - function getMappingLength(address target, bytes32 mappingSlot) external returns (uint256 length); - - /// Gets the elements at index idx of the mapping at the given slot, for a given address. The - /// index must be less than the length of the mapping (i.e. the number of keys in the mapping). - function getMappingSlotAt(address target, bytes32 mappingSlot, uint256 idx) external returns (bytes32 value); - - /// Gets the nonce of an account. - function getNonce(address account) external view returns (uint64 nonce); - - /// Gets all the recorded logs. - function getRecordedLogs() external returns (Log[] memory logs); - - /// Gets the gas used in the last call. - function lastCallGas() external view returns (Gas memory gas); - - /// Loads a storage slot from an address. - function load(address target, bytes32 slot) external view returns (bytes32 data); - - /// Pauses gas metering (i.e. gas usage is not counted). Noop if already paused. - function pauseGasMetering() external; - - /// Records all storage reads and writes. - function record() external; - - /// Record all the transaction logs. - function recordLogs() external; - - /// Resumes gas metering (i.e. gas usage is counted again). Noop if already on. - function resumeGasMetering() external; - - /// Performs an Ethereum JSON-RPC request to the current fork URL. - function rpc(string calldata method, string calldata params) external returns (bytes memory data); - - /// Signs `digest` with `privateKey` using the secp256r1 curve. - function signP256(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 s); - - /// Signs `digest` with `privateKey` using the secp256k1 curve. - function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); - - /// Signs `digest` with signer provided to script using the secp256k1 curve. - /// If `--sender` is provided, the signer with provided address is used, otherwise, - /// if exactly one signer is provided to the script, that signer is used. - /// Raises error if signer passed through `--sender` does not match any unlocked signers or - /// if `--sender` is not provided and not exactly one signer is passed to the script. - function sign(bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); - - /// Signs `digest` with signer provided to script using the secp256k1 curve. - /// Raises error if none of the signers passed into the script have provided address. - function sign(address signer, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); - - /// Starts recording all map SSTOREs for later retrieval. - function startMappingRecording() external; - - /// Record all account accesses as part of CREATE, CALL or SELFDESTRUCT opcodes in order, - /// along with the context of the calls - function startStateDiffRecording() external; - - /// Returns an ordered array of all account accesses from a `vm.startStateDiffRecording` session. - function stopAndReturnStateDiff() external returns (AccountAccess[] memory accountAccesses); - - /// Stops recording all map SSTOREs for later retrieval and clears the recorded data. - function stopMappingRecording() external; - - // ======== Filesystem ======== - - /// Closes file for reading, resetting the offset and allowing to read it from beginning with readLine. - /// `path` is relative to the project root. - function closeFile(string calldata path) external; - - /// Copies the contents of one file to another. This function will **overwrite** the contents of `to`. - /// On success, the total number of bytes copied is returned and it is equal to the length of the `to` file as reported by `metadata`. - /// Both `from` and `to` are relative to the project root. - function copyFile(string calldata from, string calldata to) external returns (uint64 copied); - - /// Creates a new, empty directory at the provided path. - /// This cheatcode will revert in the following situations, but is not limited to just these cases: - /// - User lacks permissions to modify `path`. - /// - A parent of the given path doesn't exist and `recursive` is false. - /// - `path` already exists and `recursive` is false. - /// `path` is relative to the project root. - function createDir(string calldata path, bool recursive) external; - - /// Returns true if the given path points to an existing entity, else returns false. - function exists(string calldata path) external returns (bool result); - - /// Performs a foreign function call via the terminal. - function ffi(string[] calldata commandInput) external returns (bytes memory result); - - /// Given a path, query the file system to get information about a file, directory, etc. - function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata); - - /// Gets the creation bytecode from an artifact file. Takes in the relative path to the json file or the path to the - /// artifact in the form of :: where and parts are optional. - function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode); - - /// Gets the deployed bytecode from an artifact file. Takes in the relative path to the json file or the path to the - /// artifact in the form of :: where and parts are optional. - function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode); - - /// Returns true if the path exists on disk and is pointing at a directory, else returns false. - function isDir(string calldata path) external returns (bool result); - - /// Returns true if the path exists on disk and is pointing at a regular file, else returns false. - function isFile(string calldata path) external returns (bool result); - - /// Get the path of the current project root. - function projectRoot() external view returns (string memory path); - - /// Prompts the user for a string value in the terminal. - function prompt(string calldata promptText) external returns (string memory input); - - /// Prompts the user for an address in the terminal. - function promptAddress(string calldata promptText) external returns (address); - - /// Prompts the user for a hidden string value in the terminal. - function promptSecret(string calldata promptText) external returns (string memory input); - - /// Prompts the user for hidden uint256 in the terminal (usually pk). - function promptSecretUint(string calldata promptText) external returns (uint256); - - /// Prompts the user for uint256 in the terminal. - function promptUint(string calldata promptText) external returns (uint256); - - /// Reads the directory at the given path recursively, up to `maxDepth`. - /// `maxDepth` defaults to 1, meaning only the direct children of the given directory will be returned. - /// Follows symbolic links if `followLinks` is true. - function readDir(string calldata path) external view returns (DirEntry[] memory entries); - - /// See `readDir(string)`. - function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries); - - /// See `readDir(string)`. - function readDir(string calldata path, uint64 maxDepth, bool followLinks) - external - view - returns (DirEntry[] memory entries); - - /// Reads the entire content of file to string. `path` is relative to the project root. - function readFile(string calldata path) external view returns (string memory data); - - /// Reads the entire content of file as binary. `path` is relative to the project root. - function readFileBinary(string calldata path) external view returns (bytes memory data); - - /// Reads next line of file to string. - function readLine(string calldata path) external view returns (string memory line); - - /// Reads a symbolic link, returning the path that the link points to. - /// This cheatcode will revert in the following situations, but is not limited to just these cases: - /// - `path` is not a symbolic link. - /// - `path` does not exist. - function readLink(string calldata linkPath) external view returns (string memory targetPath); - - /// Removes a directory at the provided path. - /// This cheatcode will revert in the following situations, but is not limited to just these cases: - /// - `path` doesn't exist. - /// - `path` isn't a directory. - /// - User lacks permissions to modify `path`. - /// - The directory is not empty and `recursive` is false. - /// `path` is relative to the project root. - function removeDir(string calldata path, bool recursive) external; - - /// Removes a file from the filesystem. - /// This cheatcode will revert in the following situations, but is not limited to just these cases: - /// - `path` points to a directory. - /// - The file doesn't exist. - /// - The user lacks permissions to remove the file. - /// `path` is relative to the project root. - function removeFile(string calldata path) external; - - /// Performs a foreign function call via terminal and returns the exit code, stdout, and stderr. - function tryFfi(string[] calldata commandInput) external returns (FfiResult memory result); - - /// Returns the time since unix epoch in milliseconds. - function unixTime() external returns (uint256 milliseconds); - - /// Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does. - /// `path` is relative to the project root. - function writeFile(string calldata path, string calldata data) external; - - /// Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does. - /// `path` is relative to the project root. - function writeFileBinary(string calldata path, bytes calldata data) external; - - /// Writes line to file, creating a file if it does not exist. - /// `path` is relative to the project root. - function writeLine(string calldata path, string calldata data) external; - - // ======== JSON ======== - - /// Checks if `key` exists in a JSON object - /// `keyExists` is being deprecated in favor of `keyExistsJson`. It will be removed in future versions. - function keyExists(string calldata json, string calldata key) external view returns (bool); - - /// Checks if `key` exists in a JSON object. - function keyExistsJson(string calldata json, string calldata key) external view returns (bool); - - /// Parses a string of JSON data at `key` and coerces it to `address`. - function parseJsonAddress(string calldata json, string calldata key) external pure returns (address); - - /// Parses a string of JSON data at `key` and coerces it to `address[]`. - function parseJsonAddressArray(string calldata json, string calldata key) - external - pure - returns (address[] memory); - - /// Parses a string of JSON data at `key` and coerces it to `bool`. - function parseJsonBool(string calldata json, string calldata key) external pure returns (bool); - - /// Parses a string of JSON data at `key` and coerces it to `bool[]`. - function parseJsonBoolArray(string calldata json, string calldata key) external pure returns (bool[] memory); - - /// Parses a string of JSON data at `key` and coerces it to `bytes`. - function parseJsonBytes(string calldata json, string calldata key) external pure returns (bytes memory); - - /// Parses a string of JSON data at `key` and coerces it to `bytes32`. - function parseJsonBytes32(string calldata json, string calldata key) external pure returns (bytes32); - - /// Parses a string of JSON data at `key` and coerces it to `bytes32[]`. - function parseJsonBytes32Array(string calldata json, string calldata key) - external - pure - returns (bytes32[] memory); - - /// Parses a string of JSON data at `key` and coerces it to `bytes[]`. - function parseJsonBytesArray(string calldata json, string calldata key) external pure returns (bytes[] memory); - - /// Parses a string of JSON data at `key` and coerces it to `int256`. - function parseJsonInt(string calldata json, string calldata key) external pure returns (int256); - - /// Parses a string of JSON data at `key` and coerces it to `int256[]`. - function parseJsonIntArray(string calldata json, string calldata key) external pure returns (int256[] memory); - - /// Returns an array of all the keys in a JSON object. - function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys); - - /// Parses a string of JSON data at `key` and coerces it to `string`. - function parseJsonString(string calldata json, string calldata key) external pure returns (string memory); - - /// Parses a string of JSON data at `key` and coerces it to `string[]`. - function parseJsonStringArray(string calldata json, string calldata key) external pure returns (string[] memory); - - /// Parses a string of JSON data at `key` and coerces it to `uint256`. - function parseJsonUint(string calldata json, string calldata key) external pure returns (uint256); - - /// Parses a string of JSON data at `key` and coerces it to `uint256[]`. - function parseJsonUintArray(string calldata json, string calldata key) external pure returns (uint256[] memory); - - /// ABI-encodes a JSON object. - function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData); - - /// ABI-encodes a JSON object at `key`. - function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData); - - /// See `serializeJson`. - function serializeAddress(string calldata objectKey, string calldata valueKey, address value) - external - returns (string memory json); - - /// See `serializeJson`. - function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values) - external - returns (string memory json); - - /// See `serializeJson`. - function serializeBool(string calldata objectKey, string calldata valueKey, bool value) - external - returns (string memory json); - - /// See `serializeJson`. - function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values) - external - returns (string memory json); - - /// See `serializeJson`. - function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value) - external - returns (string memory json); - - /// See `serializeJson`. - function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values) - external - returns (string memory json); - - /// See `serializeJson`. - function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value) - external - returns (string memory json); - - /// See `serializeJson`. - function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values) - external - returns (string memory json); - - /// See `serializeJson`. - function serializeInt(string calldata objectKey, string calldata valueKey, int256 value) - external - returns (string memory json); - - /// See `serializeJson`. - function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values) - external - returns (string memory json); - - /// Serializes a key and value to a JSON object stored in-memory that can be later written to a file. - /// Returns the stringified version of the specific JSON file up to that moment. - function serializeJson(string calldata objectKey, string calldata value) external returns (string memory json); - - /// See `serializeJson`. - function serializeString(string calldata objectKey, string calldata valueKey, string calldata value) - external - returns (string memory json); - - /// See `serializeJson`. - function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values) - external - returns (string memory json); - - /// See `serializeJson`. - function serializeUintToHex(string calldata objectKey, string calldata valueKey, uint256 value) - external - returns (string memory json); - - /// See `serializeJson`. - function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value) - external - returns (string memory json); - - /// See `serializeJson`. - function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values) - external - returns (string memory json); - - /// Write a serialized JSON object to a file. If the file exists, it will be overwritten. - function writeJson(string calldata json, string calldata path) external; - - /// Write a serialized JSON object to an **existing** JSON file, replacing a value with key = - /// This is useful to replace a specific value of a JSON file, without having to parse the entire thing. - function writeJson(string calldata json, string calldata path, string calldata valueKey) external; - - // ======== Scripting ======== - - /// Has the next call (at this call depth only) create transactions that can later be signed and sent onchain. - /// Broadcasting address is determined by checking the following in order: - /// 1. If `--sender` argument was provided, that address is used. - /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used. - /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used. - function broadcast() external; - - /// Has the next call (at this call depth only) create a transaction with the address provided - /// as the sender that can later be signed and sent onchain. - function broadcast(address signer) external; - - /// Has the next call (at this call depth only) create a transaction with the private key - /// provided as the sender that can later be signed and sent onchain. - function broadcast(uint256 privateKey) external; - - /// Has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain. - /// Broadcasting address is determined by checking the following in order: - /// 1. If `--sender` argument was provided, that address is used. - /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used. - /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used. - function startBroadcast() external; - - /// Has all subsequent calls (at this call depth only) create transactions with the address - /// provided that can later be signed and sent onchain. - function startBroadcast(address signer) external; - - /// Has all subsequent calls (at this call depth only) create transactions with the private key - /// provided that can later be signed and sent onchain. - function startBroadcast(uint256 privateKey) external; - - /// Stops collecting onchain transactions. - function stopBroadcast() external; - - // ======== String ======== - - /// Returns the index of the first occurrence of a `key` in an `input` string. - /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `key` is not found. - /// Returns 0 in case of an empty `key`. - function indexOf(string calldata input, string calldata key) external pure returns (uint256); - - /// Parses the given `string` into an `address`. - function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue); - - /// Parses the given `string` into a `bool`. - function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue); - - /// Parses the given `string` into `bytes`. - function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue); - - /// Parses the given `string` into a `bytes32`. - function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue); - - /// Parses the given `string` into a `int256`. - function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue); - - /// Parses the given `string` into a `uint256`. - function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue); - - /// Replaces occurrences of `from` in the given `string` with `to`. - function replace(string calldata input, string calldata from, string calldata to) - external - pure - returns (string memory output); - - /// Splits the given `string` into an array of strings divided by the `delimiter`. - function split(string calldata input, string calldata delimiter) external pure returns (string[] memory outputs); - - /// Converts the given `string` value to Lowercase. - function toLowercase(string calldata input) external pure returns (string memory output); - - /// Converts the given value to a `string`. - function toString(address value) external pure returns (string memory stringifiedValue); - - /// Converts the given value to a `string`. - function toString(bytes calldata value) external pure returns (string memory stringifiedValue); - - /// Converts the given value to a `string`. - function toString(bytes32 value) external pure returns (string memory stringifiedValue); - - /// Converts the given value to a `string`. - function toString(bool value) external pure returns (string memory stringifiedValue); - - /// Converts the given value to a `string`. - function toString(uint256 value) external pure returns (string memory stringifiedValue); - - /// Converts the given value to a `string`. - function toString(int256 value) external pure returns (string memory stringifiedValue); - - /// Converts the given `string` value to Uppercase. - function toUppercase(string calldata input) external pure returns (string memory output); - - /// Trims leading and trailing whitespace from the given `string` value. - function trim(string calldata input) external pure returns (string memory output); - - // ======== Testing ======== - - /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. - /// Formats values with decimals in failure message. - function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) external pure; - - /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. - /// Formats values with decimals in failure message. Includes error message into revert string on failure. - function assertApproxEqAbsDecimal( - uint256 left, - uint256 right, - uint256 maxDelta, - uint256 decimals, - string calldata error - ) external pure; - - /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. - /// Formats values with decimals in failure message. - function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) external pure; - - /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. - /// Formats values with decimals in failure message. Includes error message into revert string on failure. - function assertApproxEqAbsDecimal( - int256 left, - int256 right, - uint256 maxDelta, - uint256 decimals, - string calldata error - ) external pure; - - /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. - function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) external pure; - - /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. - /// Includes error message into revert string on failure. - function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure; - - /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. - function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) external pure; - - /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. - /// Includes error message into revert string on failure. - function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure; - - /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. - /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% - /// Formats values with decimals in failure message. - function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals) - external - pure; - - /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. - /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% - /// Formats values with decimals in failure message. Includes error message into revert string on failure. - function assertApproxEqRelDecimal( - uint256 left, - uint256 right, - uint256 maxPercentDelta, - uint256 decimals, - string calldata error - ) external pure; - - /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. - /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% - /// Formats values with decimals in failure message. - function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals) - external - pure; - - /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. - /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% - /// Formats values with decimals in failure message. Includes error message into revert string on failure. - function assertApproxEqRelDecimal( - int256 left, - int256 right, - uint256 maxPercentDelta, - uint256 decimals, - string calldata error - ) external pure; - - /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. - /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% - function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta) external pure; - - /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. - /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% - /// Includes error message into revert string on failure. - function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error) - external - pure; - - /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. - /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% - function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) external pure; - - /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. - /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% - /// Includes error message into revert string on failure. - function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error) - external - pure; - - /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message. - function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure; - - /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message. - /// Includes error message into revert string on failure. - function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; - - /// Asserts that two `int256` values are equal, formatting them with decimals in failure message. - function assertEqDecimal(int256 left, int256 right, uint256 decimals) external pure; - - /// Asserts that two `int256` values are equal, formatting them with decimals in failure message. - /// Includes error message into revert string on failure. - function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; - - /// Asserts that two `bool` values are equal. - function assertEq(bool left, bool right) external pure; - - /// Asserts that two `bool` values are equal and includes error message into revert string on failure. - function assertEq(bool left, bool right, string calldata error) external pure; - - /// Asserts that two `string` values are equal. - function assertEq(string calldata left, string calldata right) external pure; - - /// Asserts that two `string` values are equal and includes error message into revert string on failure. - function assertEq(string calldata left, string calldata right, string calldata error) external pure; - - /// Asserts that two `bytes` values are equal. - function assertEq(bytes calldata left, bytes calldata right) external pure; - - /// Asserts that two `bytes` values are equal and includes error message into revert string on failure. - function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure; - - /// Asserts that two arrays of `bool` values are equal. - function assertEq(bool[] calldata left, bool[] calldata right) external pure; - - /// Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure. - function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure; - - /// Asserts that two arrays of `uint256 values are equal. - function assertEq(uint256[] calldata left, uint256[] calldata right) external pure; - - /// Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure. - function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure; - - /// Asserts that two arrays of `int256` values are equal. - function assertEq(int256[] calldata left, int256[] calldata right) external pure; - - /// Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure. - function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure; - - /// Asserts that two `uint256` values are equal. - function assertEq(uint256 left, uint256 right) external pure; - - /// Asserts that two arrays of `address` values are equal. - function assertEq(address[] calldata left, address[] calldata right) external pure; - - /// Asserts that two arrays of `address` values are equal and includes error message into revert string on failure. - function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure; - - /// Asserts that two arrays of `bytes32` values are equal. - function assertEq(bytes32[] calldata left, bytes32[] calldata right) external pure; - - /// Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure. - function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure; - - /// Asserts that two arrays of `string` values are equal. - function assertEq(string[] calldata left, string[] calldata right) external pure; - - /// Asserts that two arrays of `string` values are equal and includes error message into revert string on failure. - function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure; - - /// Asserts that two arrays of `bytes` values are equal. - function assertEq(bytes[] calldata left, bytes[] calldata right) external pure; - - /// Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure. - function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure; - - /// Asserts that two `uint256` values are equal and includes error message into revert string on failure. - function assertEq(uint256 left, uint256 right, string calldata error) external pure; - - /// Asserts that two `int256` values are equal. - function assertEq(int256 left, int256 right) external pure; - - /// Asserts that two `int256` values are equal and includes error message into revert string on failure. - function assertEq(int256 left, int256 right, string calldata error) external pure; - - /// Asserts that two `address` values are equal. - function assertEq(address left, address right) external pure; - - /// Asserts that two `address` values are equal and includes error message into revert string on failure. - function assertEq(address left, address right, string calldata error) external pure; - - /// Asserts that two `bytes32` values are equal. - function assertEq(bytes32 left, bytes32 right) external pure; - - /// Asserts that two `bytes32` values are equal and includes error message into revert string on failure. - function assertEq(bytes32 left, bytes32 right, string calldata error) external pure; - - /// Asserts that the given condition is false. - function assertFalse(bool condition) external pure; - - /// Asserts that the given condition is false and includes error message into revert string on failure. - function assertFalse(bool condition, string calldata error) external pure; - - /// Compares two `uint256` values. Expects first value to be greater than or equal to second. - /// Formats values with decimals in failure message. - function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) external pure; - - /// Compares two `uint256` values. Expects first value to be greater than or equal to second. - /// Formats values with decimals in failure message. Includes error message into revert string on failure. - function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; - - /// Compares two `int256` values. Expects first value to be greater than or equal to second. - /// Formats values with decimals in failure message. - function assertGeDecimal(int256 left, int256 right, uint256 decimals) external pure; - - /// Compares two `int256` values. Expects first value to be greater than or equal to second. - /// Formats values with decimals in failure message. Includes error message into revert string on failure. - function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; - - /// Compares two `uint256` values. Expects first value to be greater than or equal to second. - function assertGe(uint256 left, uint256 right) external pure; - - /// Compares two `uint256` values. Expects first value to be greater than or equal to second. - /// Includes error message into revert string on failure. - function assertGe(uint256 left, uint256 right, string calldata error) external pure; - - /// Compares two `int256` values. Expects first value to be greater than or equal to second. - function assertGe(int256 left, int256 right) external pure; - - /// Compares two `int256` values. Expects first value to be greater than or equal to second. - /// Includes error message into revert string on failure. - function assertGe(int256 left, int256 right, string calldata error) external pure; - - /// Compares two `uint256` values. Expects first value to be greater than second. - /// Formats values with decimals in failure message. - function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) external pure; - - /// Compares two `uint256` values. Expects first value to be greater than second. - /// Formats values with decimals in failure message. Includes error message into revert string on failure. - function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; - - /// Compares two `int256` values. Expects first value to be greater than second. - /// Formats values with decimals in failure message. - function assertGtDecimal(int256 left, int256 right, uint256 decimals) external pure; - - /// Compares two `int256` values. Expects first value to be greater than second. - /// Formats values with decimals in failure message. Includes error message into revert string on failure. - function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; - - /// Compares two `uint256` values. Expects first value to be greater than second. - function assertGt(uint256 left, uint256 right) external pure; - - /// Compares two `uint256` values. Expects first value to be greater than second. - /// Includes error message into revert string on failure. - function assertGt(uint256 left, uint256 right, string calldata error) external pure; - - /// Compares two `int256` values. Expects first value to be greater than second. - function assertGt(int256 left, int256 right) external pure; - - /// Compares two `int256` values. Expects first value to be greater than second. - /// Includes error message into revert string on failure. - function assertGt(int256 left, int256 right, string calldata error) external pure; - - /// Compares two `uint256` values. Expects first value to be less than or equal to second. - /// Formats values with decimals in failure message. - function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) external pure; - - /// Compares two `uint256` values. Expects first value to be less than or equal to second. - /// Formats values with decimals in failure message. Includes error message into revert string on failure. - function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; - - /// Compares two `int256` values. Expects first value to be less than or equal to second. - /// Formats values with decimals in failure message. - function assertLeDecimal(int256 left, int256 right, uint256 decimals) external pure; - - /// Compares two `int256` values. Expects first value to be less than or equal to second. - /// Formats values with decimals in failure message. Includes error message into revert string on failure. - function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; - - /// Compares two `uint256` values. Expects first value to be less than or equal to second. - function assertLe(uint256 left, uint256 right) external pure; - - /// Compares two `uint256` values. Expects first value to be less than or equal to second. - /// Includes error message into revert string on failure. - function assertLe(uint256 left, uint256 right, string calldata error) external pure; - - /// Compares two `int256` values. Expects first value to be less than or equal to second. - function assertLe(int256 left, int256 right) external pure; - - /// Compares two `int256` values. Expects first value to be less than or equal to second. - /// Includes error message into revert string on failure. - function assertLe(int256 left, int256 right, string calldata error) external pure; - - /// Compares two `uint256` values. Expects first value to be less than second. - /// Formats values with decimals in failure message. - function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) external pure; - - /// Compares two `uint256` values. Expects first value to be less than second. - /// Formats values with decimals in failure message. Includes error message into revert string on failure. - function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; - - /// Compares two `int256` values. Expects first value to be less than second. - /// Formats values with decimals in failure message. - function assertLtDecimal(int256 left, int256 right, uint256 decimals) external pure; - - /// Compares two `int256` values. Expects first value to be less than second. - /// Formats values with decimals in failure message. Includes error message into revert string on failure. - function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; - - /// Compares two `uint256` values. Expects first value to be less than second. - function assertLt(uint256 left, uint256 right) external pure; - - /// Compares two `uint256` values. Expects first value to be less than second. - /// Includes error message into revert string on failure. - function assertLt(uint256 left, uint256 right, string calldata error) external pure; - - /// Compares two `int256` values. Expects first value to be less than second. - function assertLt(int256 left, int256 right) external pure; - - /// Compares two `int256` values. Expects first value to be less than second. - /// Includes error message into revert string on failure. - function assertLt(int256 left, int256 right, string calldata error) external pure; - - /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message. - function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure; - - /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message. - /// Includes error message into revert string on failure. - function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; - - /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message. - function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) external pure; - - /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message. - /// Includes error message into revert string on failure. - function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; - - /// Asserts that two `bool` values are not equal. - function assertNotEq(bool left, bool right) external pure; - - /// Asserts that two `bool` values are not equal and includes error message into revert string on failure. - function assertNotEq(bool left, bool right, string calldata error) external pure; - - /// Asserts that two `string` values are not equal. - function assertNotEq(string calldata left, string calldata right) external pure; - - /// Asserts that two `string` values are not equal and includes error message into revert string on failure. - function assertNotEq(string calldata left, string calldata right, string calldata error) external pure; - - /// Asserts that two `bytes` values are not equal. - function assertNotEq(bytes calldata left, bytes calldata right) external pure; - - /// Asserts that two `bytes` values are not equal and includes error message into revert string on failure. - function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure; - - /// Asserts that two arrays of `bool` values are not equal. - function assertNotEq(bool[] calldata left, bool[] calldata right) external pure; - - /// Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure. - function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure; - - /// Asserts that two arrays of `uint256` values are not equal. - function assertNotEq(uint256[] calldata left, uint256[] calldata right) external pure; - - /// Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure. - function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure; - - /// Asserts that two arrays of `int256` values are not equal. - function assertNotEq(int256[] calldata left, int256[] calldata right) external pure; - - /// Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure. - function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure; - - /// Asserts that two `uint256` values are not equal. - function assertNotEq(uint256 left, uint256 right) external pure; - - /// Asserts that two arrays of `address` values are not equal. - function assertNotEq(address[] calldata left, address[] calldata right) external pure; - - /// Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure. - function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure; - - /// Asserts that two arrays of `bytes32` values are not equal. - function assertNotEq(bytes32[] calldata left, bytes32[] calldata right) external pure; - - /// Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure. - function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure; - - /// Asserts that two arrays of `string` values are not equal. - function assertNotEq(string[] calldata left, string[] calldata right) external pure; - - /// Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure. - function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure; - - /// Asserts that two arrays of `bytes` values are not equal. - function assertNotEq(bytes[] calldata left, bytes[] calldata right) external pure; - - /// Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure. - function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure; - - /// Asserts that two `uint256` values are not equal and includes error message into revert string on failure. - function assertNotEq(uint256 left, uint256 right, string calldata error) external pure; - - /// Asserts that two `int256` values are not equal. - function assertNotEq(int256 left, int256 right) external pure; - - /// Asserts that two `int256` values are not equal and includes error message into revert string on failure. - function assertNotEq(int256 left, int256 right, string calldata error) external pure; - - /// Asserts that two `address` values are not equal. - function assertNotEq(address left, address right) external pure; - - /// Asserts that two `address` values are not equal and includes error message into revert string on failure. - function assertNotEq(address left, address right, string calldata error) external pure; - - /// Asserts that two `bytes32` values are not equal. - function assertNotEq(bytes32 left, bytes32 right) external pure; - - /// Asserts that two `bytes32` values are not equal and includes error message into revert string on failure. - function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure; - - /// Asserts that the given condition is true. - function assertTrue(bool condition) external pure; - - /// Asserts that the given condition is true and includes error message into revert string on failure. - function assertTrue(bool condition, string calldata error) external pure; - - /// If the condition is false, discard this run's fuzz inputs and generate new ones. - function assume(bool condition) external pure; - - /// Writes a breakpoint to jump to in the debugger. - function breakpoint(string calldata char) external; - - /// Writes a conditional breakpoint to jump to in the debugger. - function breakpoint(string calldata char, bool value) external; - - /// Returns the RPC url for the given alias. - function rpcUrl(string calldata rpcAlias) external view returns (string memory json); - - /// Returns all rpc urls and their aliases as structs. - function rpcUrlStructs() external view returns (Rpc[] memory urls); - - /// Returns all rpc urls and their aliases `[alias, url][]`. - function rpcUrls() external view returns (string[2][] memory urls); - - /// Suspends execution of the main thread for `duration` milliseconds. - function sleep(uint256 duration) external; - - // ======== Toml ======== - - /// Checks if `key` exists in a TOML table. - function keyExistsToml(string calldata toml, string calldata key) external view returns (bool); - - /// Parses a string of TOML data at `key` and coerces it to `address`. - function parseTomlAddress(string calldata toml, string calldata key) external pure returns (address); - - /// Parses a string of TOML data at `key` and coerces it to `address[]`. - function parseTomlAddressArray(string calldata toml, string calldata key) - external - pure - returns (address[] memory); - - /// Parses a string of TOML data at `key` and coerces it to `bool`. - function parseTomlBool(string calldata toml, string calldata key) external pure returns (bool); - - /// Parses a string of TOML data at `key` and coerces it to `bool[]`. - function parseTomlBoolArray(string calldata toml, string calldata key) external pure returns (bool[] memory); - - /// Parses a string of TOML data at `key` and coerces it to `bytes`. - function parseTomlBytes(string calldata toml, string calldata key) external pure returns (bytes memory); - - /// Parses a string of TOML data at `key` and coerces it to `bytes32`. - function parseTomlBytes32(string calldata toml, string calldata key) external pure returns (bytes32); - - /// Parses a string of TOML data at `key` and coerces it to `bytes32[]`. - function parseTomlBytes32Array(string calldata toml, string calldata key) - external - pure - returns (bytes32[] memory); - - /// Parses a string of TOML data at `key` and coerces it to `bytes[]`. - function parseTomlBytesArray(string calldata toml, string calldata key) external pure returns (bytes[] memory); - - /// Parses a string of TOML data at `key` and coerces it to `int256`. - function parseTomlInt(string calldata toml, string calldata key) external pure returns (int256); - - /// Parses a string of TOML data at `key` and coerces it to `int256[]`. - function parseTomlIntArray(string calldata toml, string calldata key) external pure returns (int256[] memory); - - /// Returns an array of all the keys in a TOML table. - function parseTomlKeys(string calldata toml, string calldata key) external pure returns (string[] memory keys); - - /// Parses a string of TOML data at `key` and coerces it to `string`. - function parseTomlString(string calldata toml, string calldata key) external pure returns (string memory); - - /// Parses a string of TOML data at `key` and coerces it to `string[]`. - function parseTomlStringArray(string calldata toml, string calldata key) external pure returns (string[] memory); - - /// Parses a string of TOML data at `key` and coerces it to `uint256`. - function parseTomlUint(string calldata toml, string calldata key) external pure returns (uint256); - - /// Parses a string of TOML data at `key` and coerces it to `uint256[]`. - function parseTomlUintArray(string calldata toml, string calldata key) external pure returns (uint256[] memory); - - /// ABI-encodes a TOML table. - function parseToml(string calldata toml) external pure returns (bytes memory abiEncodedData); - - /// ABI-encodes a TOML table at `key`. - function parseToml(string calldata toml, string calldata key) external pure returns (bytes memory abiEncodedData); - - /// Takes serialized JSON, converts to TOML and write a serialized TOML to a file. - function writeToml(string calldata json, string calldata path) external; - - /// Takes serialized JSON, converts to TOML and write a serialized TOML table to an **existing** TOML file, replacing a value with key = - /// This is useful to replace a specific value of a TOML file, without having to parse the entire thing. - function writeToml(string calldata json, string calldata path, string calldata valueKey) external; - - // ======== Utilities ======== - - /// Compute the address of a contract created with CREATE2 using the given CREATE2 deployer. - function computeCreate2Address(bytes32 salt, bytes32 initCodeHash, address deployer) - external - pure - returns (address); - - /// Compute the address of a contract created with CREATE2 using the default CREATE2 deployer. - function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) external pure returns (address); - - /// Compute the address a contract will be deployed at for a given deployer address and nonce. - function computeCreateAddress(address deployer, uint256 nonce) external pure returns (address); - - /// Derives a private key from the name, labels the account with that name, and returns the wallet. - function createWallet(string calldata walletLabel) external returns (Wallet memory wallet); - - /// Generates a wallet from the private key and returns the wallet. - function createWallet(uint256 privateKey) external returns (Wallet memory wallet); - - /// Generates a wallet from the private key, labels the account with that name, and returns the wallet. - function createWallet(uint256 privateKey, string calldata walletLabel) external returns (Wallet memory wallet); - - /// Derive a private key from a provided mnenomic string (or mnenomic file path) - /// at the derivation path `m/44'/60'/0'/0/{index}`. - function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey); - - /// Derive a private key from a provided mnenomic string (or mnenomic file path) - /// at `{derivationPath}{index}`. - function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index) - external - pure - returns (uint256 privateKey); - - /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language - /// at the derivation path `m/44'/60'/0'/0/{index}`. - function deriveKey(string calldata mnemonic, uint32 index, string calldata language) - external - pure - returns (uint256 privateKey); - - /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language - /// at `{derivationPath}{index}`. - function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index, string calldata language) - external - pure - returns (uint256 privateKey); - - /// Returns ENS namehash for provided string. - function ensNamehash(string calldata name) external pure returns (bytes32); - - /// Gets the label for the specified address. - function getLabel(address account) external view returns (string memory currentLabel); - - /// Get a `Wallet`'s nonce. - function getNonce(Wallet calldata wallet) external returns (uint64 nonce); - - /// Labels an address in call traces. - function label(address account, string calldata newLabel) external; - - /// Returns a random `address`. - function randomAddress() external returns (address); - - /// Returns a random uint256 value. - function randomUint() external returns (uint256); - - /// Returns random uin256 value between the provided range (=min..=max). - function randomUint(uint256 min, uint256 max) external returns (uint256); - - /// Adds a private key to the local forge wallet and returns the address. - function rememberKey(uint256 privateKey) external returns (address keyAddr); - - /// Signs data with a `Wallet`. - function sign(Wallet calldata wallet, bytes32 digest) external returns (uint8 v, bytes32 r, bytes32 s); - - /// Encodes a `bytes` value to a base64url string. - function toBase64URL(bytes calldata data) external pure returns (string memory); - - /// Encodes a `string` value to a base64url string. - function toBase64URL(string calldata data) external pure returns (string memory); - - /// Encodes a `bytes` value to a base64 string. - function toBase64(bytes calldata data) external pure returns (string memory); - - /// Encodes a `string` value to a base64 string. - function toBase64(string calldata data) external pure returns (string memory); -} - -/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used -/// in tests, but it is not recommended to use these cheats in scripts. -interface Vm is VmSafe { - // ======== EVM ======== - - /// Returns the identifier of the currently active fork. Reverts if no fork is currently active. - function activeFork() external view returns (uint256 forkId); - - /// In forking mode, explicitly grant the given address cheatcode access. - function allowCheatcodes(address account) external; - - /// Sets `block.blobbasefee` - function blobBaseFee(uint256 newBlobBaseFee) external; - - /// Sets the blobhashes in the transaction. - /// Not available on EVM versions before Cancun. - /// If used on unsupported EVM versions it will revert. - function blobhashes(bytes32[] calldata hashes) external; - - /// Sets `block.chainid`. - function chainId(uint256 newChainId) external; - - /// Clears all mocked calls. - function clearMockedCalls() external; - - /// Sets `block.coinbase`. - function coinbase(address newCoinbase) external; - - /// Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork. - function createFork(string calldata urlOrAlias) external returns (uint256 forkId); - - /// Creates a new fork with the given endpoint and block and returns the identifier of the fork. - function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); - - /// Creates a new fork with the given endpoint and at the block the given transaction was mined in, - /// replays all transaction mined in the block before the transaction, and returns the identifier of the fork. - function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); - - /// Creates and also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork. - function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId); - - /// Creates and also selects a new fork with the given endpoint and block and returns the identifier of the fork. - function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); - - /// Creates and also selects new fork with the given endpoint and at the block the given transaction was mined in, - /// replays all transaction mined in the block before the transaction, returns the identifier of the fork. - function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); - - /// Sets an address' balance. - function deal(address account, uint256 newBalance) external; - - /// Removes the snapshot with the given ID created by `snapshot`. - /// Takes the snapshot ID to delete. - /// Returns `true` if the snapshot was successfully deleted. - /// Returns `false` if the snapshot does not exist. - function deleteSnapshot(uint256 snapshotId) external returns (bool success); - - /// Removes _all_ snapshots previously created by `snapshot`. - function deleteSnapshots() external; - - /// Sets `block.difficulty`. - /// Not available on EVM versions from Paris onwards. Use `prevrandao` instead. - /// Reverts if used on unsupported EVM versions. - function difficulty(uint256 newDifficulty) external; - - /// Dump a genesis JSON file's `allocs` to disk. - function dumpState(string calldata pathToStateJson) external; - - /// Sets an address' code. - function etch(address target, bytes calldata newRuntimeBytecode) external; - - /// Sets `block.basefee`. - function fee(uint256 newBasefee) external; - - /// Gets the blockhashes from the current transaction. - /// Not available on EVM versions before Cancun. - /// If used on unsupported EVM versions it will revert. - function getBlobhashes() external view returns (bytes32[] memory hashes); - - /// Returns true if the account is marked as persistent. - function isPersistent(address account) external view returns (bool persistent); - - /// Load a genesis JSON file's `allocs` into the in-memory revm state. - function loadAllocs(string calldata pathToAllocsJson) external; - - /// Marks that the account(s) should use persistent storage across fork swaps in a multifork setup - /// Meaning, changes made to the state of this account will be kept when switching forks. - function makePersistent(address account) external; - - /// See `makePersistent(address)`. - function makePersistent(address account0, address account1) external; - - /// See `makePersistent(address)`. - function makePersistent(address account0, address account1, address account2) external; - - /// See `makePersistent(address)`. - function makePersistent(address[] calldata accounts) external; - - /// Reverts a call to an address with specified revert data. - function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external; - - /// Reverts a call to an address with a specific `msg.value`, with specified revert data. - function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData) - external; - - /// Mocks a call to an address, returning specified data. - /// Calldata can either be strict or a partial match, e.g. if you only - /// pass a Solidity selector to the expected calldata, then the entire Solidity - /// function will be mocked. - function mockCall(address callee, bytes calldata data, bytes calldata returnData) external; - - /// Mocks a call to an address with a specific `msg.value`, returning specified data. - /// Calldata match takes precedence over `msg.value` in case of ambiguity. - function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external; - - /// Sets the *next* call's `msg.sender` to be the input address. - function prank(address msgSender) external; - - /// Sets the *next* call's `msg.sender` to be the input address, and the `tx.origin` to be the second input. - function prank(address msgSender, address txOrigin) external; - - /// Sets `block.prevrandao`. - /// Not available on EVM versions before Paris. Use `difficulty` instead. - /// If used on unsupported EVM versions it will revert. - function prevrandao(bytes32 newPrevrandao) external; - - /// Sets `block.prevrandao`. - /// Not available on EVM versions before Paris. Use `difficulty` instead. - /// If used on unsupported EVM versions it will revert. - function prevrandao(uint256 newPrevrandao) external; - - /// Reads the current `msg.sender` and `tx.origin` from state and reports if there is any active caller modification. - function readCallers() external returns (CallerMode callerMode, address msgSender, address txOrigin); - - /// Resets the nonce of an account to 0 for EOAs and 1 for contract accounts. - function resetNonce(address account) external; - - /// Revert the state of the EVM to a previous snapshot - /// Takes the snapshot ID to revert to. - /// Returns `true` if the snapshot was successfully reverted. - /// Returns `false` if the snapshot does not exist. - /// **Note:** This does not automatically delete the snapshot. To delete the snapshot use `deleteSnapshot`. - function revertTo(uint256 snapshotId) external returns (bool success); - - /// Revert the state of the EVM to a previous snapshot and automatically deletes the snapshots - /// Takes the snapshot ID to revert to. - /// Returns `true` if the snapshot was successfully reverted and deleted. - /// Returns `false` if the snapshot does not exist. - function revertToAndDelete(uint256 snapshotId) external returns (bool success); - - /// Revokes persistent status from the address, previously added via `makePersistent`. - function revokePersistent(address account) external; - - /// See `revokePersistent(address)`. - function revokePersistent(address[] calldata accounts) external; - - /// Sets `block.height`. - function roll(uint256 newHeight) external; - - /// Updates the currently active fork to given block number - /// This is similar to `roll` but for the currently active fork. - function rollFork(uint256 blockNumber) external; - - /// Updates the currently active fork to given transaction. This will `rollFork` with the number - /// of the block the transaction was mined in and replays all transaction mined before it in the block. - function rollFork(bytes32 txHash) external; - - /// Updates the given fork to given block number. - function rollFork(uint256 forkId, uint256 blockNumber) external; - - /// Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block. - function rollFork(uint256 forkId, bytes32 txHash) external; - - /// Takes a fork identifier created by `createFork` and sets the corresponding forked state as active. - function selectFork(uint256 forkId) external; - - /// Sets the nonce of an account. Must be higher than the current nonce of the account. - function setNonce(address account, uint64 newNonce) external; - - /// Sets the nonce of an account to an arbitrary value. - function setNonceUnsafe(address account, uint64 newNonce) external; - - /// Snapshot the current state of the evm. - /// Returns the ID of the snapshot that was created. - /// To revert a snapshot use `revertTo`. - function snapshot() external returns (uint256 snapshotId); - - /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called. - function startPrank(address msgSender) external; - - /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input. - function startPrank(address msgSender, address txOrigin) external; - - /// Resets subsequent calls' `msg.sender` to be `address(this)`. - function stopPrank() external; - - /// Stores a value to an address' storage slot. - function store(address target, bytes32 slot, bytes32 value) external; - - /// Fetches the given transaction from the active fork and executes it on the current state. - function transact(bytes32 txHash) external; - - /// Fetches the given transaction from the given fork and executes it on the current state. - function transact(uint256 forkId, bytes32 txHash) external; - - /// Sets `tx.gasprice`. - function txGasPrice(uint256 newGasPrice) external; - - /// Sets `block.timestamp`. - function warp(uint256 newTimestamp) external; - - // ======== Testing ======== - - /// Expect a call to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas. - function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external; - - /// Expect given number of calls to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas. - function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count) - external; - - /// Expects a call to an address with the specified calldata. - /// Calldata can either be a strict or a partial match. - function expectCall(address callee, bytes calldata data) external; - - /// Expects given number of calls to an address with the specified calldata. - function expectCall(address callee, bytes calldata data, uint64 count) external; - - /// Expects a call to an address with the specified `msg.value` and calldata. - function expectCall(address callee, uint256 msgValue, bytes calldata data) external; - - /// Expects given number of calls to an address with the specified `msg.value` and calldata. - function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external; - - /// Expect a call to an address with the specified `msg.value`, gas, and calldata. - function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external; - - /// Expects given number of calls to an address with the specified `msg.value`, gas, and calldata. - function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external; - - /// Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.). - /// Call this function, then emit an event, then call a function. Internally after the call, we check if - /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans). - function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external; - - /// Same as the previous method, but also checks supplied address against emitting contract. - function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter) - external; - - /// Prepare an expected log with all topic and data checks enabled. - /// Call this function, then emit an event, then call a function. Internally after the call, we check if - /// logs were emitted in the expected order with the expected topics and data. - function expectEmit() external; - - /// Same as the previous method, but also checks supplied address against emitting contract. - function expectEmit(address emitter) external; - - /// Expects an error on next call with any revert data. - function expectRevert() external; - - /// Expects an error on next call that starts with the revert data. - function expectRevert(bytes4 revertData) external; - - /// Expects an error on next call that exactly matches the revert data. - function expectRevert(bytes calldata revertData) external; - - /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other - /// memory is written to, the test will fail. Can be called multiple times to add more ranges to the set. - function expectSafeMemory(uint64 min, uint64 max) external; - - /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext. - /// If any other memory is written to, the test will fail. Can be called multiple times to add more ranges - /// to the set. - function expectSafeMemoryCall(uint64 min, uint64 max) external; - - /// Marks a test as skipped. Must be called at the top of the test. - function skip(bool skipTest) external; - - /// Stops all safe memory expectation in the current subcontext. - function stopExpectSafeMemory() external; -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/console.sol b/examples/validating-public-input/contracts/lib/forge-std/src/console.sol deleted file mode 100644 index 755eedcd9..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/console.sol +++ /dev/null @@ -1,1552 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.4.22 <0.9.0; - -library console { - address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); - - function _castLogPayloadViewToPure( - function(bytes memory) internal view fnIn - ) internal pure returns (function(bytes memory) internal pure fnOut) { - assembly { - fnOut := fnIn - } - } - - function _sendLogPayload(bytes memory payload) internal pure { - _castLogPayloadViewToPure(_sendLogPayloadView)(payload); - } - - function _sendLogPayloadView(bytes memory payload) private view { - uint256 payloadLength = payload.length; - address consoleAddress = CONSOLE_ADDRESS; - /// @solidity memory-safe-assembly - assembly { - let payloadStart := add(payload, 32) - let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) - } - } - - function log() internal pure { - _sendLogPayload(abi.encodeWithSignature("log()")); - } - - function logInt(int p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); - } - - function logUint(uint p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); - } - - function logString(string memory p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); - } - - function logBool(bool p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); - } - - function logAddress(address p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); - } - - function logBytes(bytes memory p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); - } - - function logBytes1(bytes1 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); - } - - function logBytes2(bytes2 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); - } - - function logBytes3(bytes3 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); - } - - function logBytes4(bytes4 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); - } - - function logBytes5(bytes5 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); - } - - function logBytes6(bytes6 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); - } - - function logBytes7(bytes7 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); - } - - function logBytes8(bytes8 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); - } - - function logBytes9(bytes9 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); - } - - function logBytes10(bytes10 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); - } - - function logBytes11(bytes11 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); - } - - function logBytes12(bytes12 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); - } - - function logBytes13(bytes13 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); - } - - function logBytes14(bytes14 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); - } - - function logBytes15(bytes15 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); - } - - function logBytes16(bytes16 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); - } - - function logBytes17(bytes17 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); - } - - function logBytes18(bytes18 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); - } - - function logBytes19(bytes19 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); - } - - function logBytes20(bytes20 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); - } - - function logBytes21(bytes21 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); - } - - function logBytes22(bytes22 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); - } - - function logBytes23(bytes23 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); - } - - function logBytes24(bytes24 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); - } - - function logBytes25(bytes25 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); - } - - function logBytes26(bytes26 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); - } - - function logBytes27(bytes27 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); - } - - function logBytes28(bytes28 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); - } - - function logBytes29(bytes29 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); - } - - function logBytes30(bytes30 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); - } - - function logBytes31(bytes31 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); - } - - function logBytes32(bytes32 p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); - } - - function log(uint p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); - } - - function log(int p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); - } - - function log(string memory p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); - } - - function log(bool p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); - } - - function log(address p0) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); - } - - function log(uint p0, uint p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); - } - - function log(uint p0, string memory p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); - } - - function log(uint p0, bool p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); - } - - function log(uint p0, address p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); - } - - function log(string memory p0, uint p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); - } - - function log(string memory p0, int p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,int)", p0, p1)); - } - - function log(string memory p0, string memory p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); - } - - function log(string memory p0, bool p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); - } - - function log(string memory p0, address p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); - } - - function log(bool p0, uint p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); - } - - function log(bool p0, string memory p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); - } - - function log(bool p0, bool p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); - } - - function log(bool p0, address p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); - } - - function log(address p0, uint p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); - } - - function log(address p0, string memory p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); - } - - function log(address p0, bool p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); - } - - function log(address p0, address p1) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); - } - - function log(uint p0, uint p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); - } - - function log(uint p0, uint p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); - } - - function log(uint p0, uint p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); - } - - function log(uint p0, uint p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); - } - - function log(uint p0, string memory p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); - } - - function log(uint p0, string memory p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); - } - - function log(uint p0, string memory p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); - } - - function log(uint p0, string memory p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); - } - - function log(uint p0, bool p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); - } - - function log(uint p0, bool p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); - } - - function log(uint p0, bool p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); - } - - function log(uint p0, bool p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); - } - - function log(uint p0, address p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); - } - - function log(uint p0, address p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); - } - - function log(uint p0, address p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); - } - - function log(uint p0, address p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); - } - - function log(string memory p0, uint p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); - } - - function log(string memory p0, uint p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); - } - - function log(string memory p0, uint p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); - } - - function log(string memory p0, uint p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); - } - - function log(string memory p0, string memory p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); - } - - function log(string memory p0, string memory p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); - } - - function log(string memory p0, string memory p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); - } - - function log(string memory p0, string memory p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); - } - - function log(string memory p0, bool p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); - } - - function log(string memory p0, bool p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); - } - - function log(string memory p0, bool p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); - } - - function log(string memory p0, bool p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); - } - - function log(string memory p0, address p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); - } - - function log(string memory p0, address p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); - } - - function log(string memory p0, address p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); - } - - function log(string memory p0, address p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); - } - - function log(bool p0, uint p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); - } - - function log(bool p0, uint p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); - } - - function log(bool p0, uint p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); - } - - function log(bool p0, uint p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); - } - - function log(bool p0, string memory p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); - } - - function log(bool p0, string memory p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); - } - - function log(bool p0, string memory p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); - } - - function log(bool p0, string memory p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); - } - - function log(bool p0, bool p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); - } - - function log(bool p0, bool p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); - } - - function log(bool p0, bool p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); - } - - function log(bool p0, bool p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); - } - - function log(bool p0, address p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); - } - - function log(bool p0, address p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); - } - - function log(bool p0, address p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); - } - - function log(bool p0, address p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); - } - - function log(address p0, uint p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); - } - - function log(address p0, uint p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); - } - - function log(address p0, uint p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); - } - - function log(address p0, uint p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); - } - - function log(address p0, string memory p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); - } - - function log(address p0, string memory p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); - } - - function log(address p0, string memory p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); - } - - function log(address p0, string memory p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); - } - - function log(address p0, bool p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); - } - - function log(address p0, bool p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); - } - - function log(address p0, bool p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); - } - - function log(address p0, bool p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); - } - - function log(address p0, address p1, uint p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); - } - - function log(address p0, address p1, string memory p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); - } - - function log(address p0, address p1, bool p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); - } - - function log(address p0, address p1, address p2) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); - } - - function log(uint p0, uint p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, uint p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, string memory p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, bool p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); - } - - function log(uint p0, address p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, uint p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, string memory p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, bool p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); - } - - function log(string memory p0, address p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, uint p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, string memory p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, bool p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); - } - - function log(bool p0, address p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); - } - - function log(address p0, uint p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); - } - - function log(address p0, string memory p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); - } - - function log(address p0, bool p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, uint p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, uint p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, uint p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, uint p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, string memory p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, string memory p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, string memory p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, string memory p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, bool p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, bool p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, bool p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, bool p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, address p2, uint p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, address p2, string memory p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, address p2, bool p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); - } - - function log(address p0, address p1, address p2, address p3) internal pure { - _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/console2.sol b/examples/validating-public-input/contracts/lib/forge-std/src/console2.sol deleted file mode 100644 index 03531d91d..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/console2.sol +++ /dev/null @@ -1,4 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.4.22 <0.9.0; - -import {console as console2} from "./console.sol"; diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC1155.sol b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC1155.sol deleted file mode 100644 index f7dd2b410..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC1155.sol +++ /dev/null @@ -1,105 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2; - -import "./IERC165.sol"; - -/// @title ERC-1155 Multi Token Standard -/// @dev See https://eips.ethereum.org/EIPS/eip-1155 -/// Note: The ERC-165 identifier for this interface is 0xd9b67a26. -interface IERC1155 is IERC165 { - /// @dev - /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). - /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender). - /// - The `_from` argument MUST be the address of the holder whose balance is decreased. - /// - The `_to` argument MUST be the address of the recipient whose balance is increased. - /// - The `_id` argument MUST be the token type being transferred. - /// - The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by. - /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). - /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). - event TransferSingle( - address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value - ); - - /// @dev - /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). - /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender). - /// - The `_from` argument MUST be the address of the holder whose balance is decreased. - /// - The `_to` argument MUST be the address of the recipient whose balance is increased. - /// - The `_ids` argument MUST be the list of tokens being transferred. - /// - The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by. - /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). - /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). - event TransferBatch( - address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values - ); - - /// @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absence of an event assumes disabled). - event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); - - /// @dev MUST emit when the URI is updated for a token ID. URIs are defined in RFC 3986. - /// The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema". - event URI(string _value, uint256 indexed _id); - - /// @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call). - /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). - /// - MUST revert if `_to` is the zero address. - /// - MUST revert if balance of holder for token `_id` is lower than the `_value` sent. - /// - MUST revert on any other error. - /// - MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard). - /// - After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). - /// @param _from Source address - /// @param _to Target address - /// @param _id ID of the token type - /// @param _value Transfer amount - /// @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to` - function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external; - - /// @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call). - /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). - /// - MUST revert if `_to` is the zero address. - /// - MUST revert if length of `_ids` is not the same as length of `_values`. - /// - MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient. - /// - MUST revert on any other error. - /// - MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard). - /// - Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc). - /// - After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). - /// @param _from Source address - /// @param _to Target address - /// @param _ids IDs of each token type (order and length must match _values array) - /// @param _values Transfer amounts per token type (order and length must match _ids array) - /// @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to` - function safeBatchTransferFrom( - address _from, - address _to, - uint256[] calldata _ids, - uint256[] calldata _values, - bytes calldata _data - ) external; - - /// @notice Get the balance of an account's tokens. - /// @param _owner The address of the token holder - /// @param _id ID of the token - /// @return The _owner's balance of the token type requested - function balanceOf(address _owner, uint256 _id) external view returns (uint256); - - /// @notice Get the balance of multiple account/token pairs - /// @param _owners The addresses of the token holders - /// @param _ids ID of the tokens - /// @return The _owner's balance of the token types requested (i.e. balance for each (owner, id) pair) - function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) - external - view - returns (uint256[] memory); - - /// @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens. - /// @dev MUST emit the ApprovalForAll event on success. - /// @param _operator Address to add to the set of authorized operators - /// @param _approved True if the operator is approved, false to revoke approval - function setApprovalForAll(address _operator, bool _approved) external; - - /// @notice Queries the approval status of an operator for a given owner. - /// @param _owner The owner of the tokens - /// @param _operator Address of authorized operator - /// @return True if the operator is approved, false if not - function isApprovedForAll(address _owner, address _operator) external view returns (bool); -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC165.sol b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC165.sol deleted file mode 100644 index 9af4bf800..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC165.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2; - -interface IERC165 { - /// @notice Query if a contract implements an interface - /// @param interfaceID The interface identifier, as specified in ERC-165 - /// @dev Interface identification is specified in ERC-165. This function - /// uses less than 30,000 gas. - /// @return `true` if the contract implements `interfaceID` and - /// `interfaceID` is not 0xffffffff, `false` otherwise - function supportsInterface(bytes4 interfaceID) external view returns (bool); -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC20.sol b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC20.sol deleted file mode 100644 index ba40806c3..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC20.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2; - -/// @dev Interface of the ERC20 standard as defined in the EIP. -/// @dev This includes the optional name, symbol, and decimals metadata. -interface IERC20 { - /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`). - event Transfer(address indexed from, address indexed to, uint256 value); - - /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value` - /// is the new allowance. - event Approval(address indexed owner, address indexed spender, uint256 value); - - /// @notice Returns the amount of tokens in existence. - function totalSupply() external view returns (uint256); - - /// @notice Returns the amount of tokens owned by `account`. - function balanceOf(address account) external view returns (uint256); - - /// @notice Moves `amount` tokens from the caller's account to `to`. - function transfer(address to, uint256 amount) external returns (bool); - - /// @notice Returns the remaining number of tokens that `spender` is allowed - /// to spend on behalf of `owner` - function allowance(address owner, address spender) external view returns (uint256); - - /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens. - /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - function approve(address spender, uint256 amount) external returns (bool); - - /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism. - /// `amount` is then deducted from the caller's allowance. - function transferFrom(address from, address to, uint256 amount) external returns (bool); - - /// @notice Returns the name of the token. - function name() external view returns (string memory); - - /// @notice Returns the symbol of the token. - function symbol() external view returns (string memory); - - /// @notice Returns the decimals places of the token. - function decimals() external view returns (uint8); -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC4626.sol b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC4626.sol deleted file mode 100644 index bfe3a1155..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC4626.sol +++ /dev/null @@ -1,190 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2; - -import "./IERC20.sol"; - -/// @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in -/// https://eips.ethereum.org/EIPS/eip-4626 -interface IERC4626 is IERC20 { - event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares); - - event Withdraw( - address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares - ); - - /// @notice Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. - /// @dev - /// - MUST be an ERC-20 token contract. - /// - MUST NOT revert. - function asset() external view returns (address assetTokenAddress); - - /// @notice Returns the total amount of the underlying asset that is “managed†by Vault. - /// @dev - /// - SHOULD include any compounding that occurs from yield. - /// - MUST be inclusive of any fees that are charged against assets in the Vault. - /// - MUST NOT revert. - function totalAssets() external view returns (uint256 totalManagedAssets); - - /// @notice Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal - /// scenario where all the conditions are met. - /// @dev - /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault. - /// - MUST NOT show any variations depending on the caller. - /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. - /// - MUST NOT revert. - /// - /// NOTE: This calculation MAY NOT reflect the “per-user†price-per-share, and instead should reflect the - /// “average-user’s†price-per-share, meaning what the average user should expect to see when exchanging to and - /// from. - function convertToShares(uint256 assets) external view returns (uint256 shares); - - /// @notice Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal - /// scenario where all the conditions are met. - /// @dev - /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault. - /// - MUST NOT show any variations depending on the caller. - /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. - /// - MUST NOT revert. - /// - /// NOTE: This calculation MAY NOT reflect the “per-user†price-per-share, and instead should reflect the - /// “average-user’s†price-per-share, meaning what the average user should expect to see when exchanging to and - /// from. - function convertToAssets(uint256 shares) external view returns (uint256 assets); - - /// @notice Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver, - /// through a deposit call. - /// @dev - /// - MUST return a limited value if receiver is subject to some deposit limit. - /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited. - /// - MUST NOT revert. - function maxDeposit(address receiver) external view returns (uint256 maxAssets); - - /// @notice Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given - /// current on-chain conditions. - /// @dev - /// - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit - /// call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called - /// in the same transaction. - /// - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the - /// deposit would be accepted, regardless if the user has enough tokens approved, etc. - /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. - /// - MUST NOT revert. - /// - /// NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in - /// share price or some other type of condition, meaning the depositor will lose assets by depositing. - function previewDeposit(uint256 assets) external view returns (uint256 shares); - - /// @notice Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens. - /// @dev - /// - MUST emit the Deposit event. - /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the - /// deposit execution, and are accounted for during deposit. - /// - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not - /// approving enough underlying tokens to the Vault contract, etc). - /// - /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. - function deposit(uint256 assets, address receiver) external returns (uint256 shares); - - /// @notice Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call. - /// @dev - /// - MUST return a limited value if receiver is subject to some mint limit. - /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted. - /// - MUST NOT revert. - function maxMint(address receiver) external view returns (uint256 maxShares); - - /// @notice Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given - /// current on-chain conditions. - /// @dev - /// - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call - /// in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the - /// same transaction. - /// - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint - /// would be accepted, regardless if the user has enough tokens approved, etc. - /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. - /// - MUST NOT revert. - /// - /// NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in - /// share price or some other type of condition, meaning the depositor will lose assets by minting. - function previewMint(uint256 shares) external view returns (uint256 assets); - - /// @notice Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens. - /// @dev - /// - MUST emit the Deposit event. - /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint - /// execution, and are accounted for during mint. - /// - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not - /// approving enough underlying tokens to the Vault contract, etc). - /// - /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. - function mint(uint256 shares, address receiver) external returns (uint256 assets); - - /// @notice Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the - /// Vault, through a withdraw call. - /// @dev - /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock. - /// - MUST NOT revert. - function maxWithdraw(address owner) external view returns (uint256 maxAssets); - - /// @notice Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, - /// given current on-chain conditions. - /// @dev - /// - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw - /// call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if - /// called - /// in the same transaction. - /// - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though - /// the withdrawal would be accepted, regardless if the user has enough shares, etc. - /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. - /// - MUST NOT revert. - /// - /// NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in - /// share price or some other type of condition, meaning the depositor will lose assets by depositing. - function previewWithdraw(uint256 assets) external view returns (uint256 shares); - - /// @notice Burns shares from owner and sends exactly assets of underlying tokens to receiver. - /// @dev - /// - MUST emit the Withdraw event. - /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the - /// withdraw execution, and are accounted for during withdraw. - /// - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner - /// not having enough shares, etc). - /// - /// Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. - /// Those methods should be performed separately. - function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares); - - /// @notice Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault, - /// through a redeem call. - /// @dev - /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock. - /// - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock. - /// - MUST NOT revert. - function maxRedeem(address owner) external view returns (uint256 maxShares); - - /// @notice Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block, - /// given current on-chain conditions. - /// @dev - /// - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call - /// in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the - /// same transaction. - /// - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the - /// redemption would be accepted, regardless if the user has enough shares, etc. - /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. - /// - MUST NOT revert. - /// - /// NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in - /// share price or some other type of condition, meaning the depositor will lose assets by redeeming. - function previewRedeem(uint256 shares) external view returns (uint256 assets); - - /// @notice Burns exactly shares from owner and sends assets of underlying tokens to receiver. - /// @dev - /// - MUST emit the Withdraw event. - /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the - /// redeem execution, and are accounted for during redeem. - /// - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner - /// not having enough shares, etc). - /// - /// NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. - /// Those methods should be performed separately. - function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets); -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC721.sol b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC721.sol deleted file mode 100644 index 0a16f45cc..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IERC721.sol +++ /dev/null @@ -1,164 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2; - -import "./IERC165.sol"; - -/// @title ERC-721 Non-Fungible Token Standard -/// @dev See https://eips.ethereum.org/EIPS/eip-721 -/// Note: the ERC-165 identifier for this interface is 0x80ac58cd. -interface IERC721 is IERC165 { - /// @dev This emits when ownership of any NFT changes by any mechanism. - /// This event emits when NFTs are created (`from` == 0) and destroyed - /// (`to` == 0). Exception: during contract creation, any number of NFTs - /// may be created and assigned without emitting Transfer. At the time of - /// any transfer, the approved address for that NFT (if any) is reset to none. - event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); - - /// @dev This emits when the approved address for an NFT is changed or - /// reaffirmed. The zero address indicates there is no approved address. - /// When a Transfer event emits, this also indicates that the approved - /// address for that NFT (if any) is reset to none. - event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); - - /// @dev This emits when an operator is enabled or disabled for an owner. - /// The operator can manage all NFTs of the owner. - event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); - - /// @notice Count all NFTs assigned to an owner - /// @dev NFTs assigned to the zero address are considered invalid, and this - /// function throws for queries about the zero address. - /// @param _owner An address for whom to query the balance - /// @return The number of NFTs owned by `_owner`, possibly zero - function balanceOf(address _owner) external view returns (uint256); - - /// @notice Find the owner of an NFT - /// @dev NFTs assigned to zero address are considered invalid, and queries - /// about them do throw. - /// @param _tokenId The identifier for an NFT - /// @return The address of the owner of the NFT - function ownerOf(uint256 _tokenId) external view returns (address); - - /// @notice Transfers the ownership of an NFT from one address to another address - /// @dev Throws unless `msg.sender` is the current owner, an authorized - /// operator, or the approved address for this NFT. Throws if `_from` is - /// not the current owner. Throws if `_to` is the zero address. Throws if - /// `_tokenId` is not a valid NFT. When transfer is complete, this function - /// checks if `_to` is a smart contract (code size > 0). If so, it calls - /// `onERC721Received` on `_to` and throws if the return value is not - /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. - /// @param _from The current owner of the NFT - /// @param _to The new owner - /// @param _tokenId The NFT to transfer - /// @param data Additional data with no specified format, sent in call to `_to` - function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable; - - /// @notice Transfers the ownership of an NFT from one address to another address - /// @dev This works identically to the other function with an extra data parameter, - /// except this function just sets data to "". - /// @param _from The current owner of the NFT - /// @param _to The new owner - /// @param _tokenId The NFT to transfer - function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; - - /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE - /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE - /// THEY MAY BE PERMANENTLY LOST - /// @dev Throws unless `msg.sender` is the current owner, an authorized - /// operator, or the approved address for this NFT. Throws if `_from` is - /// not the current owner. Throws if `_to` is the zero address. Throws if - /// `_tokenId` is not a valid NFT. - /// @param _from The current owner of the NFT - /// @param _to The new owner - /// @param _tokenId The NFT to transfer - function transferFrom(address _from, address _to, uint256 _tokenId) external payable; - - /// @notice Change or reaffirm the approved address for an NFT - /// @dev The zero address indicates there is no approved address. - /// Throws unless `msg.sender` is the current NFT owner, or an authorized - /// operator of the current owner. - /// @param _approved The new approved NFT controller - /// @param _tokenId The NFT to approve - function approve(address _approved, uint256 _tokenId) external payable; - - /// @notice Enable or disable approval for a third party ("operator") to manage - /// all of `msg.sender`'s assets - /// @dev Emits the ApprovalForAll event. The contract MUST allow - /// multiple operators per owner. - /// @param _operator Address to add to the set of authorized operators - /// @param _approved True if the operator is approved, false to revoke approval - function setApprovalForAll(address _operator, bool _approved) external; - - /// @notice Get the approved address for a single NFT - /// @dev Throws if `_tokenId` is not a valid NFT. - /// @param _tokenId The NFT to find the approved address for - /// @return The approved address for this NFT, or the zero address if there is none - function getApproved(uint256 _tokenId) external view returns (address); - - /// @notice Query if an address is an authorized operator for another address - /// @param _owner The address that owns the NFTs - /// @param _operator The address that acts on behalf of the owner - /// @return True if `_operator` is an approved operator for `_owner`, false otherwise - function isApprovedForAll(address _owner, address _operator) external view returns (bool); -} - -/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02. -interface IERC721TokenReceiver { - /// @notice Handle the receipt of an NFT - /// @dev The ERC721 smart contract calls this function on the recipient - /// after a `transfer`. This function MAY throw to revert and reject the - /// transfer. Return of other than the magic value MUST result in the - /// transaction being reverted. - /// Note: the contract address is always the message sender. - /// @param _operator The address which called `safeTransferFrom` function - /// @param _from The address which previously owned the token - /// @param _tokenId The NFT identifier which is being transferred - /// @param _data Additional data with no specified format - /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` - /// unless throwing - function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) - external - returns (bytes4); -} - -/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension -/// @dev See https://eips.ethereum.org/EIPS/eip-721 -/// Note: the ERC-165 identifier for this interface is 0x5b5e139f. -interface IERC721Metadata is IERC721 { - /// @notice A descriptive name for a collection of NFTs in this contract - function name() external view returns (string memory _name); - - /// @notice An abbreviated name for NFTs in this contract - function symbol() external view returns (string memory _symbol); - - /// @notice A distinct Uniform Resource Identifier (URI) for a given asset. - /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC - /// 3986. The URI may point to a JSON file that conforms to the "ERC721 - /// Metadata JSON Schema". - function tokenURI(uint256 _tokenId) external view returns (string memory); -} - -/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension -/// @dev See https://eips.ethereum.org/EIPS/eip-721 -/// Note: the ERC-165 identifier for this interface is 0x780e9d63. -interface IERC721Enumerable is IERC721 { - /// @notice Count NFTs tracked by this contract - /// @return A count of valid NFTs tracked by this contract, where each one of - /// them has an assigned and queryable owner not equal to the zero address - function totalSupply() external view returns (uint256); - - /// @notice Enumerate valid NFTs - /// @dev Throws if `_index` >= `totalSupply()`. - /// @param _index A counter less than `totalSupply()` - /// @return The token identifier for the `_index`th NFT, - /// (sort order not specified) - function tokenByIndex(uint256 _index) external view returns (uint256); - - /// @notice Enumerate NFTs assigned to an owner - /// @dev Throws if `_index` >= `balanceOf(_owner)` or if - /// `_owner` is the zero address, representing invalid NFTs. - /// @param _owner An address where we are interested in NFTs owned by them - /// @param _index A counter less than `balanceOf(_owner)` - /// @return The token identifier for the `_index`th NFT assigned to `_owner`, - /// (sort order not specified) - function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256); -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IMulticall3.sol b/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IMulticall3.sol deleted file mode 100644 index 0d031b71d..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/interfaces/IMulticall3.sol +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -interface IMulticall3 { - struct Call { - address target; - bytes callData; - } - - struct Call3 { - address target; - bool allowFailure; - bytes callData; - } - - struct Call3Value { - address target; - bool allowFailure; - uint256 value; - bytes callData; - } - - struct Result { - bool success; - bytes returnData; - } - - function aggregate(Call[] calldata calls) - external - payable - returns (uint256 blockNumber, bytes[] memory returnData); - - function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData); - - function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData); - - function blockAndAggregate(Call[] calldata calls) - external - payable - returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); - - function getBasefee() external view returns (uint256 basefee); - - function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash); - - function getBlockNumber() external view returns (uint256 blockNumber); - - function getChainId() external view returns (uint256 chainid); - - function getCurrentBlockCoinbase() external view returns (address coinbase); - - function getCurrentBlockDifficulty() external view returns (uint256 difficulty); - - function getCurrentBlockGasLimit() external view returns (uint256 gaslimit); - - function getCurrentBlockTimestamp() external view returns (uint256 timestamp); - - function getEthBalance(address addr) external view returns (uint256 balance); - - function getLastBlockHash() external view returns (bytes32 blockHash); - - function tryAggregate(bool requireSuccess, Call[] calldata calls) - external - payable - returns (Result[] memory returnData); - - function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) - external - payable - returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC20.sol b/examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC20.sol deleted file mode 100644 index 2a022fa34..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC20.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -import {IERC20} from "../interfaces/IERC20.sol"; - -/// @notice This is a mock contract of the ERC20 standard for testing purposes only, it SHOULD NOT be used in production. -/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC20.sol -contract MockERC20 is IERC20 { - /*////////////////////////////////////////////////////////////// - METADATA STORAGE - //////////////////////////////////////////////////////////////*/ - - string internal _name; - - string internal _symbol; - - uint8 internal _decimals; - - function name() external view override returns (string memory) { - return _name; - } - - function symbol() external view override returns (string memory) { - return _symbol; - } - - function decimals() external view override returns (uint8) { - return _decimals; - } - - /*////////////////////////////////////////////////////////////// - ERC20 STORAGE - //////////////////////////////////////////////////////////////*/ - - uint256 internal _totalSupply; - - mapping(address => uint256) internal _balanceOf; - - mapping(address => mapping(address => uint256)) internal _allowance; - - function totalSupply() external view override returns (uint256) { - return _totalSupply; - } - - function balanceOf(address owner) external view override returns (uint256) { - return _balanceOf[owner]; - } - - function allowance(address owner, address spender) external view override returns (uint256) { - return _allowance[owner][spender]; - } - - /*////////////////////////////////////////////////////////////// - EIP-2612 STORAGE - //////////////////////////////////////////////////////////////*/ - - uint256 internal INITIAL_CHAIN_ID; - - bytes32 internal INITIAL_DOMAIN_SEPARATOR; - - mapping(address => uint256) public nonces; - - /*////////////////////////////////////////////////////////////// - INITIALIZE - //////////////////////////////////////////////////////////////*/ - - /// @dev A bool to track whether the contract has been initialized. - bool private initialized; - - /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and - /// syntaxes, we add an initialization function that can be called only once. - function initialize(string memory name_, string memory symbol_, uint8 decimals_) public { - require(!initialized, "ALREADY_INITIALIZED"); - - _name = name_; - _symbol = symbol_; - _decimals = decimals_; - - INITIAL_CHAIN_ID = _pureChainId(); - INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); - - initialized = true; - } - - /*////////////////////////////////////////////////////////////// - ERC20 LOGIC - //////////////////////////////////////////////////////////////*/ - - function approve(address spender, uint256 amount) public virtual override returns (bool) { - _allowance[msg.sender][spender] = amount; - - emit Approval(msg.sender, spender, amount); - - return true; - } - - function transfer(address to, uint256 amount) public virtual override returns (bool) { - _balanceOf[msg.sender] = _sub(_balanceOf[msg.sender], amount); - _balanceOf[to] = _add(_balanceOf[to], amount); - - emit Transfer(msg.sender, to, amount); - - return true; - } - - function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { - uint256 allowed = _allowance[from][msg.sender]; // Saves gas for limited approvals. - - if (allowed != ~uint256(0)) _allowance[from][msg.sender] = _sub(allowed, amount); - - _balanceOf[from] = _sub(_balanceOf[from], amount); - _balanceOf[to] = _add(_balanceOf[to], amount); - - emit Transfer(from, to, amount); - - return true; - } - - /*////////////////////////////////////////////////////////////// - EIP-2612 LOGIC - //////////////////////////////////////////////////////////////*/ - - function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) - public - virtual - { - require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); - - address recoveredAddress = ecrecover( - keccak256( - abi.encodePacked( - "\x19\x01", - DOMAIN_SEPARATOR(), - keccak256( - abi.encode( - keccak256( - "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" - ), - owner, - spender, - value, - nonces[owner]++, - deadline - ) - ) - ) - ), - v, - r, - s - ); - - require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); - - _allowance[recoveredAddress][spender] = value; - - emit Approval(owner, spender, value); - } - - function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { - return _pureChainId() == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); - } - - function computeDomainSeparator() internal view virtual returns (bytes32) { - return keccak256( - abi.encode( - keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), - keccak256(bytes(_name)), - keccak256("1"), - _pureChainId(), - address(this) - ) - ); - } - - /*////////////////////////////////////////////////////////////// - INTERNAL MINT/BURN LOGIC - //////////////////////////////////////////////////////////////*/ - - function _mint(address to, uint256 amount) internal virtual { - _totalSupply = _add(_totalSupply, amount); - _balanceOf[to] = _add(_balanceOf[to], amount); - - emit Transfer(address(0), to, amount); - } - - function _burn(address from, uint256 amount) internal virtual { - _balanceOf[from] = _sub(_balanceOf[from], amount); - _totalSupply = _sub(_totalSupply, amount); - - emit Transfer(from, address(0), amount); - } - - /*////////////////////////////////////////////////////////////// - INTERNAL SAFE MATH LOGIC - //////////////////////////////////////////////////////////////*/ - - function _add(uint256 a, uint256 b) internal pure returns (uint256) { - uint256 c = a + b; - require(c >= a, "ERC20: addition overflow"); - return c; - } - - function _sub(uint256 a, uint256 b) internal pure returns (uint256) { - require(a >= b, "ERC20: subtraction underflow"); - return a - b; - } - - /*////////////////////////////////////////////////////////////// - HELPERS - //////////////////////////////////////////////////////////////*/ - - // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no - // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We - // can't simply access the chain ID in a normal view or pure function because the solc View Pure - // Checker changed `chainid` from pure to view in 0.8.0. - function _viewChainId() private view returns (uint256 chainId) { - // Assembly required since `block.chainid` was introduced in 0.8.0. - assembly { - chainId := chainid() - } - - address(this); // Silence warnings in older Solc versions. - } - - function _pureChainId() private pure returns (uint256 chainId) { - function() internal view returns (uint256) fnIn = _viewChainId; - function() internal pure returns (uint256) pureChainId; - assembly { - pureChainId := fnIn - } - chainId = pureChainId(); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC721.sol b/examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC721.sol deleted file mode 100644 index 7a4909e58..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/mocks/MockERC721.sol +++ /dev/null @@ -1,231 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -import {IERC721Metadata, IERC721TokenReceiver} from "../interfaces/IERC721.sol"; - -/// @notice This is a mock contract of the ERC721 standard for testing purposes only, it SHOULD NOT be used in production. -/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC721.sol -contract MockERC721 is IERC721Metadata { - /*////////////////////////////////////////////////////////////// - METADATA STORAGE/LOGIC - //////////////////////////////////////////////////////////////*/ - - string internal _name; - - string internal _symbol; - - function name() external view override returns (string memory) { - return _name; - } - - function symbol() external view override returns (string memory) { - return _symbol; - } - - function tokenURI(uint256 id) public view virtual override returns (string memory) {} - - /*////////////////////////////////////////////////////////////// - ERC721 BALANCE/OWNER STORAGE - //////////////////////////////////////////////////////////////*/ - - mapping(uint256 => address) internal _ownerOf; - - mapping(address => uint256) internal _balanceOf; - - function ownerOf(uint256 id) public view virtual override returns (address owner) { - require((owner = _ownerOf[id]) != address(0), "NOT_MINTED"); - } - - function balanceOf(address owner) public view virtual override returns (uint256) { - require(owner != address(0), "ZERO_ADDRESS"); - - return _balanceOf[owner]; - } - - /*////////////////////////////////////////////////////////////// - ERC721 APPROVAL STORAGE - //////////////////////////////////////////////////////////////*/ - - mapping(uint256 => address) internal _getApproved; - - mapping(address => mapping(address => bool)) internal _isApprovedForAll; - - function getApproved(uint256 id) public view virtual override returns (address) { - return _getApproved[id]; - } - - function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { - return _isApprovedForAll[owner][operator]; - } - - /*////////////////////////////////////////////////////////////// - INITIALIZE - //////////////////////////////////////////////////////////////*/ - - /// @dev A bool to track whether the contract has been initialized. - bool private initialized; - - /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and - /// syntaxes, we add an initialization function that can be called only once. - function initialize(string memory name_, string memory symbol_) public { - require(!initialized, "ALREADY_INITIALIZED"); - - _name = name_; - _symbol = symbol_; - - initialized = true; - } - - /*////////////////////////////////////////////////////////////// - ERC721 LOGIC - //////////////////////////////////////////////////////////////*/ - - function approve(address spender, uint256 id) public payable virtual override { - address owner = _ownerOf[id]; - - require(msg.sender == owner || _isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); - - _getApproved[id] = spender; - - emit Approval(owner, spender, id); - } - - function setApprovalForAll(address operator, bool approved) public virtual override { - _isApprovedForAll[msg.sender][operator] = approved; - - emit ApprovalForAll(msg.sender, operator, approved); - } - - function transferFrom(address from, address to, uint256 id) public payable virtual override { - require(from == _ownerOf[id], "WRONG_FROM"); - - require(to != address(0), "INVALID_RECIPIENT"); - - require( - msg.sender == from || _isApprovedForAll[from][msg.sender] || msg.sender == _getApproved[id], - "NOT_AUTHORIZED" - ); - - // Underflow of the sender's balance is impossible because we check for - // ownership above and the recipient's balance can't realistically overflow. - _balanceOf[from]--; - - _balanceOf[to]++; - - _ownerOf[id] = to; - - delete _getApproved[id]; - - emit Transfer(from, to, id); - } - - function safeTransferFrom(address from, address to, uint256 id) public payable virtual override { - transferFrom(from, to, id); - - require( - !_isContract(to) - || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") - == IERC721TokenReceiver.onERC721Received.selector, - "UNSAFE_RECIPIENT" - ); - } - - function safeTransferFrom(address from, address to, uint256 id, bytes memory data) - public - payable - virtual - override - { - transferFrom(from, to, id); - - require( - !_isContract(to) - || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) - == IERC721TokenReceiver.onERC721Received.selector, - "UNSAFE_RECIPIENT" - ); - } - - /*////////////////////////////////////////////////////////////// - ERC165 LOGIC - //////////////////////////////////////////////////////////////*/ - - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165 - || interfaceId == 0x80ac58cd // ERC165 Interface ID for ERC721 - || interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata - } - - /*////////////////////////////////////////////////////////////// - INTERNAL MINT/BURN LOGIC - //////////////////////////////////////////////////////////////*/ - - function _mint(address to, uint256 id) internal virtual { - require(to != address(0), "INVALID_RECIPIENT"); - - require(_ownerOf[id] == address(0), "ALREADY_MINTED"); - - // Counter overflow is incredibly unrealistic. - - _balanceOf[to]++; - - _ownerOf[id] = to; - - emit Transfer(address(0), to, id); - } - - function _burn(uint256 id) internal virtual { - address owner = _ownerOf[id]; - - require(owner != address(0), "NOT_MINTED"); - - _balanceOf[owner]--; - - delete _ownerOf[id]; - - delete _getApproved[id]; - - emit Transfer(owner, address(0), id); - } - - /*////////////////////////////////////////////////////////////// - INTERNAL SAFE MINT LOGIC - //////////////////////////////////////////////////////////////*/ - - function _safeMint(address to, uint256 id) internal virtual { - _mint(to, id); - - require( - !_isContract(to) - || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") - == IERC721TokenReceiver.onERC721Received.selector, - "UNSAFE_RECIPIENT" - ); - } - - function _safeMint(address to, uint256 id, bytes memory data) internal virtual { - _mint(to, id); - - require( - !_isContract(to) - || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) - == IERC721TokenReceiver.onERC721Received.selector, - "UNSAFE_RECIPIENT" - ); - } - - /*////////////////////////////////////////////////////////////// - HELPERS - //////////////////////////////////////////////////////////////*/ - - function _isContract(address _addr) private view returns (bool) { - uint256 codeLength; - - // Assembly required for versions < 0.8.0 to check extcodesize. - assembly { - codeLength := extcodesize(_addr) - } - - return codeLength > 0; - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/src/safeconsole.sol b/examples/validating-public-input/contracts/lib/forge-std/src/safeconsole.sol deleted file mode 100644 index 5714d0902..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/src/safeconsole.sol +++ /dev/null @@ -1,13248 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -/// @author philogy -/// @dev Code generated automatically by script. -library safeconsole { - uint256 constant CONSOLE_ADDR = 0x000000000000000000000000000000000000000000636F6e736F6c652e6c6f67; - - // Credit to [0age](https://twitter.com/z0age/status/1654922202930888704) and [0xdapper](https://github.com/foundry-rs/forge-std/pull/374) - // for the view-to-pure log trick. - function _sendLogPayload(uint256 offset, uint256 size) private pure { - function(uint256, uint256) internal view fnIn = _sendLogPayloadView; - function(uint256, uint256) internal pure pureSendLogPayload; - assembly { - pureSendLogPayload := fnIn - } - pureSendLogPayload(offset, size); - } - - function _sendLogPayloadView(uint256 offset, uint256 size) private view { - assembly { - pop(staticcall(gas(), CONSOLE_ADDR, offset, size, 0x0, 0x0)) - } - } - - function _memcopy(uint256 fromOffset, uint256 toOffset, uint256 length) private pure { - function(uint256, uint256, uint256) internal view fnIn = _memcopyView; - function(uint256, uint256, uint256) internal pure pureMemcopy; - assembly { - pureMemcopy := fnIn - } - pureMemcopy(fromOffset, toOffset, length); - } - - function _memcopyView(uint256 fromOffset, uint256 toOffset, uint256 length) private view { - assembly { - pop(staticcall(gas(), 0x4, fromOffset, length, toOffset, length)) - } - } - - function logMemory(uint256 offset, uint256 length) internal pure { - if (offset >= 0x60) { - // Sufficient memory before slice to prepare call header. - bytes32 m0; - bytes32 m1; - bytes32 m2; - assembly { - m0 := mload(sub(offset, 0x60)) - m1 := mload(sub(offset, 0x40)) - m2 := mload(sub(offset, 0x20)) - // Selector of `logBytes(bytes)`. - mstore(sub(offset, 0x60), 0xe17bf956) - mstore(sub(offset, 0x40), 0x20) - mstore(sub(offset, 0x20), length) - } - _sendLogPayload(offset - 0x44, length + 0x44); - assembly { - mstore(sub(offset, 0x60), m0) - mstore(sub(offset, 0x40), m1) - mstore(sub(offset, 0x20), m2) - } - } else { - // Insufficient space, so copy slice forward, add header and reverse. - bytes32 m0; - bytes32 m1; - bytes32 m2; - uint256 endOffset = offset + length; - assembly { - m0 := mload(add(endOffset, 0x00)) - m1 := mload(add(endOffset, 0x20)) - m2 := mload(add(endOffset, 0x40)) - } - _memcopy(offset, offset + 0x60, length); - assembly { - // Selector of `logBytes(bytes)`. - mstore(add(offset, 0x00), 0xe17bf956) - mstore(add(offset, 0x20), 0x20) - mstore(add(offset, 0x40), length) - } - _sendLogPayload(offset + 0x1c, length + 0x44); - _memcopy(offset + 0x60, offset, length); - assembly { - mstore(add(endOffset, 0x00), m0) - mstore(add(endOffset, 0x20), m1) - mstore(add(endOffset, 0x40), m2) - } - } - } - - function log(address p0) internal pure { - bytes32 m0; - bytes32 m1; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - // Selector of `log(address)`. - mstore(0x00, 0x2c2ecbc2) - mstore(0x20, p0) - } - _sendLogPayload(0x1c, 0x24); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - } - } - - function log(bool p0) internal pure { - bytes32 m0; - bytes32 m1; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - // Selector of `log(bool)`. - mstore(0x00, 0x32458eed) - mstore(0x20, p0) - } - _sendLogPayload(0x1c, 0x24); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - } - } - - function log(uint256 p0) internal pure { - bytes32 m0; - bytes32 m1; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - // Selector of `log(uint256)`. - mstore(0x00, 0xf82c50f1) - mstore(0x20, p0) - } - _sendLogPayload(0x1c, 0x24); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - } - } - - function log(bytes32 p0) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(string)`. - mstore(0x00, 0x41304fac) - mstore(0x20, 0x20) - writeString(0x40, p0) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(address p0, address p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - // Selector of `log(address,address)`. - mstore(0x00, 0xdaf0d4aa) - mstore(0x20, p0) - mstore(0x40, p1) - } - _sendLogPayload(0x1c, 0x44); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - } - } - - function log(address p0, bool p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - // Selector of `log(address,bool)`. - mstore(0x00, 0x75b605d3) - mstore(0x20, p0) - mstore(0x40, p1) - } - _sendLogPayload(0x1c, 0x44); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - } - } - - function log(address p0, uint256 p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - // Selector of `log(address,uint256)`. - mstore(0x00, 0x8309e8a8) - mstore(0x20, p0) - mstore(0x40, p1) - } - _sendLogPayload(0x1c, 0x44); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - } - } - - function log(address p0, bytes32 p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,string)`. - mstore(0x00, 0x759f86bb) - mstore(0x20, p0) - mstore(0x40, 0x40) - writeString(0x60, p1) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, address p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - // Selector of `log(bool,address)`. - mstore(0x00, 0x853c4849) - mstore(0x20, p0) - mstore(0x40, p1) - } - _sendLogPayload(0x1c, 0x44); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - } - } - - function log(bool p0, bool p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - // Selector of `log(bool,bool)`. - mstore(0x00, 0x2a110e83) - mstore(0x20, p0) - mstore(0x40, p1) - } - _sendLogPayload(0x1c, 0x44); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - } - } - - function log(bool p0, uint256 p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - // Selector of `log(bool,uint256)`. - mstore(0x00, 0x399174d3) - mstore(0x20, p0) - mstore(0x40, p1) - } - _sendLogPayload(0x1c, 0x44); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - } - } - - function log(bool p0, bytes32 p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,string)`. - mstore(0x00, 0x8feac525) - mstore(0x20, p0) - mstore(0x40, 0x40) - writeString(0x60, p1) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, address p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - // Selector of `log(uint256,address)`. - mstore(0x00, 0x69276c86) - mstore(0x20, p0) - mstore(0x40, p1) - } - _sendLogPayload(0x1c, 0x44); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - } - } - - function log(uint256 p0, bool p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - // Selector of `log(uint256,bool)`. - mstore(0x00, 0x1c9d7eb3) - mstore(0x20, p0) - mstore(0x40, p1) - } - _sendLogPayload(0x1c, 0x44); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - } - } - - function log(uint256 p0, uint256 p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - // Selector of `log(uint256,uint256)`. - mstore(0x00, 0xf666715a) - mstore(0x20, p0) - mstore(0x40, p1) - } - _sendLogPayload(0x1c, 0x44); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - } - } - - function log(uint256 p0, bytes32 p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,string)`. - mstore(0x00, 0x643fd0df) - mstore(0x20, p0) - mstore(0x40, 0x40) - writeString(0x60, p1) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bytes32 p0, address p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(string,address)`. - mstore(0x00, 0x319af333) - mstore(0x20, 0x40) - mstore(0x40, p1) - writeString(0x60, p0) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bytes32 p0, bool p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(string,bool)`. - mstore(0x00, 0xc3b55635) - mstore(0x20, 0x40) - mstore(0x40, p1) - writeString(0x60, p0) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bytes32 p0, uint256 p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(string,uint256)`. - mstore(0x00, 0xb60e72cc) - mstore(0x20, 0x40) - mstore(0x40, p1) - writeString(0x60, p0) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bytes32 p0, bytes32 p1) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,string)`. - mstore(0x00, 0x4b5c4277) - mstore(0x20, 0x40) - mstore(0x40, 0x80) - writeString(0x60, p0) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, address p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(address,address,address)`. - mstore(0x00, 0x018c84c2) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(address p0, address p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(address,address,bool)`. - mstore(0x00, 0xf2a66286) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(address p0, address p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(address,address,uint256)`. - mstore(0x00, 0x17fe6185) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(address p0, address p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(address,address,string)`. - mstore(0x00, 0x007150be) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x60) - writeString(0x80, p2) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(address p0, bool p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(address,bool,address)`. - mstore(0x00, 0xf11699ed) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(address p0, bool p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(address,bool,bool)`. - mstore(0x00, 0xeb830c92) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(address p0, bool p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(address,bool,uint256)`. - mstore(0x00, 0x9c4f99fb) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(address p0, bool p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(address,bool,string)`. - mstore(0x00, 0x212255cc) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x60) - writeString(0x80, p2) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(address p0, uint256 p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(address,uint256,address)`. - mstore(0x00, 0x7bc0d848) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(address p0, uint256 p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(address,uint256,bool)`. - mstore(0x00, 0x678209a8) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(address p0, uint256 p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(address,uint256,uint256)`. - mstore(0x00, 0xb69bcaf6) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(address p0, uint256 p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(address,uint256,string)`. - mstore(0x00, 0xa1f2e8aa) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x60) - writeString(0x80, p2) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(address p0, bytes32 p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(address,string,address)`. - mstore(0x00, 0xf08744e8) - mstore(0x20, p0) - mstore(0x40, 0x60) - mstore(0x60, p2) - writeString(0x80, p1) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(address p0, bytes32 p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(address,string,bool)`. - mstore(0x00, 0xcf020fb1) - mstore(0x20, p0) - mstore(0x40, 0x60) - mstore(0x60, p2) - writeString(0x80, p1) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(address p0, bytes32 p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(address,string,uint256)`. - mstore(0x00, 0x67dd6ff1) - mstore(0x20, p0) - mstore(0x40, 0x60) - mstore(0x60, p2) - writeString(0x80, p1) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(address p0, bytes32 p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - // Selector of `log(address,string,string)`. - mstore(0x00, 0xfb772265) - mstore(0x20, p0) - mstore(0x40, 0x60) - mstore(0x60, 0xa0) - writeString(0x80, p1) - writeString(0xc0, p2) - } - _sendLogPayload(0x1c, 0xe4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - } - } - - function log(bool p0, address p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(bool,address,address)`. - mstore(0x00, 0xd2763667) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(bool p0, address p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(bool,address,bool)`. - mstore(0x00, 0x18c9c746) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(bool p0, address p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(bool,address,uint256)`. - mstore(0x00, 0x5f7b9afb) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(bool p0, address p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(bool,address,string)`. - mstore(0x00, 0xde9a9270) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x60) - writeString(0x80, p2) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(bool p0, bool p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(bool,bool,address)`. - mstore(0x00, 0x1078f68d) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(bool p0, bool p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(bool,bool,bool)`. - mstore(0x00, 0x50709698) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(bool p0, bool p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(bool,bool,uint256)`. - mstore(0x00, 0x12f21602) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(bool p0, bool p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(bool,bool,string)`. - mstore(0x00, 0x2555fa46) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x60) - writeString(0x80, p2) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(bool p0, uint256 p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(bool,uint256,address)`. - mstore(0x00, 0x088ef9d2) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(bool p0, uint256 p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(bool,uint256,bool)`. - mstore(0x00, 0xe8defba9) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(bool p0, uint256 p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(bool,uint256,uint256)`. - mstore(0x00, 0x37103367) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(bool p0, uint256 p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(bool,uint256,string)`. - mstore(0x00, 0xc3fc3970) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x60) - writeString(0x80, p2) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(bool p0, bytes32 p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(bool,string,address)`. - mstore(0x00, 0x9591b953) - mstore(0x20, p0) - mstore(0x40, 0x60) - mstore(0x60, p2) - writeString(0x80, p1) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(bool p0, bytes32 p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(bool,string,bool)`. - mstore(0x00, 0xdbb4c247) - mstore(0x20, p0) - mstore(0x40, 0x60) - mstore(0x60, p2) - writeString(0x80, p1) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(bool p0, bytes32 p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(bool,string,uint256)`. - mstore(0x00, 0x1093ee11) - mstore(0x20, p0) - mstore(0x40, 0x60) - mstore(0x60, p2) - writeString(0x80, p1) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(bool p0, bytes32 p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - // Selector of `log(bool,string,string)`. - mstore(0x00, 0xb076847f) - mstore(0x20, p0) - mstore(0x40, 0x60) - mstore(0x60, 0xa0) - writeString(0x80, p1) - writeString(0xc0, p2) - } - _sendLogPayload(0x1c, 0xe4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - } - } - - function log(uint256 p0, address p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(uint256,address,address)`. - mstore(0x00, 0xbcfd9be0) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(uint256 p0, address p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(uint256,address,bool)`. - mstore(0x00, 0x9b6ec042) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(uint256 p0, address p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(uint256,address,uint256)`. - mstore(0x00, 0x5a9b5ed5) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(uint256 p0, address p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(uint256,address,string)`. - mstore(0x00, 0x63cb41f9) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x60) - writeString(0x80, p2) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(uint256 p0, bool p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(uint256,bool,address)`. - mstore(0x00, 0x35085f7b) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(uint256 p0, bool p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(uint256,bool,bool)`. - mstore(0x00, 0x20718650) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(uint256 p0, bool p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(uint256,bool,uint256)`. - mstore(0x00, 0x20098014) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(uint256 p0, bool p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(uint256,bool,string)`. - mstore(0x00, 0x85775021) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x60) - writeString(0x80, p2) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(uint256 p0, uint256 p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(uint256,uint256,address)`. - mstore(0x00, 0x5c96b331) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(uint256 p0, uint256 p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(uint256,uint256,bool)`. - mstore(0x00, 0x4766da72) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(uint256 p0, uint256 p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - // Selector of `log(uint256,uint256,uint256)`. - mstore(0x00, 0xd1ed7a3c) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - } - _sendLogPayload(0x1c, 0x64); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - } - } - - function log(uint256 p0, uint256 p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(uint256,uint256,string)`. - mstore(0x00, 0x71d04af2) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x60) - writeString(0x80, p2) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(uint256 p0, bytes32 p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(uint256,string,address)`. - mstore(0x00, 0x7afac959) - mstore(0x20, p0) - mstore(0x40, 0x60) - mstore(0x60, p2) - writeString(0x80, p1) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(uint256 p0, bytes32 p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(uint256,string,bool)`. - mstore(0x00, 0x4ceda75a) - mstore(0x20, p0) - mstore(0x40, 0x60) - mstore(0x60, p2) - writeString(0x80, p1) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(uint256 p0, bytes32 p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(uint256,string,uint256)`. - mstore(0x00, 0x37aa7d4c) - mstore(0x20, p0) - mstore(0x40, 0x60) - mstore(0x60, p2) - writeString(0x80, p1) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(uint256 p0, bytes32 p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - // Selector of `log(uint256,string,string)`. - mstore(0x00, 0xb115611f) - mstore(0x20, p0) - mstore(0x40, 0x60) - mstore(0x60, 0xa0) - writeString(0x80, p1) - writeString(0xc0, p2) - } - _sendLogPayload(0x1c, 0xe4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - } - } - - function log(bytes32 p0, address p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(string,address,address)`. - mstore(0x00, 0xfcec75e0) - mstore(0x20, 0x60) - mstore(0x40, p1) - mstore(0x60, p2) - writeString(0x80, p0) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(bytes32 p0, address p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(string,address,bool)`. - mstore(0x00, 0xc91d5ed4) - mstore(0x20, 0x60) - mstore(0x40, p1) - mstore(0x60, p2) - writeString(0x80, p0) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(bytes32 p0, address p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(string,address,uint256)`. - mstore(0x00, 0x0d26b925) - mstore(0x20, 0x60) - mstore(0x40, p1) - mstore(0x60, p2) - writeString(0x80, p0) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(bytes32 p0, address p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - // Selector of `log(string,address,string)`. - mstore(0x00, 0xe0e9ad4f) - mstore(0x20, 0x60) - mstore(0x40, p1) - mstore(0x60, 0xa0) - writeString(0x80, p0) - writeString(0xc0, p2) - } - _sendLogPayload(0x1c, 0xe4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - } - } - - function log(bytes32 p0, bool p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(string,bool,address)`. - mstore(0x00, 0x932bbb38) - mstore(0x20, 0x60) - mstore(0x40, p1) - mstore(0x60, p2) - writeString(0x80, p0) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(bytes32 p0, bool p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(string,bool,bool)`. - mstore(0x00, 0x850b7ad6) - mstore(0x20, 0x60) - mstore(0x40, p1) - mstore(0x60, p2) - writeString(0x80, p0) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(bytes32 p0, bool p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(string,bool,uint256)`. - mstore(0x00, 0xc95958d6) - mstore(0x20, 0x60) - mstore(0x40, p1) - mstore(0x60, p2) - writeString(0x80, p0) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(bytes32 p0, bool p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - // Selector of `log(string,bool,string)`. - mstore(0x00, 0xe298f47d) - mstore(0x20, 0x60) - mstore(0x40, p1) - mstore(0x60, 0xa0) - writeString(0x80, p0) - writeString(0xc0, p2) - } - _sendLogPayload(0x1c, 0xe4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - } - } - - function log(bytes32 p0, uint256 p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(string,uint256,address)`. - mstore(0x00, 0x1c7ec448) - mstore(0x20, 0x60) - mstore(0x40, p1) - mstore(0x60, p2) - writeString(0x80, p0) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(bytes32 p0, uint256 p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(string,uint256,bool)`. - mstore(0x00, 0xca7733b1) - mstore(0x20, 0x60) - mstore(0x40, p1) - mstore(0x60, p2) - writeString(0x80, p0) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(bytes32 p0, uint256 p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - // Selector of `log(string,uint256,uint256)`. - mstore(0x00, 0xca47c4eb) - mstore(0x20, 0x60) - mstore(0x40, p1) - mstore(0x60, p2) - writeString(0x80, p0) - } - _sendLogPayload(0x1c, 0xa4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - } - } - - function log(bytes32 p0, uint256 p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - // Selector of `log(string,uint256,string)`. - mstore(0x00, 0x5970e089) - mstore(0x20, 0x60) - mstore(0x40, p1) - mstore(0x60, 0xa0) - writeString(0x80, p0) - writeString(0xc0, p2) - } - _sendLogPayload(0x1c, 0xe4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - } - } - - function log(bytes32 p0, bytes32 p1, address p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - // Selector of `log(string,string,address)`. - mstore(0x00, 0x95ed0195) - mstore(0x20, 0x60) - mstore(0x40, 0xa0) - mstore(0x60, p2) - writeString(0x80, p0) - writeString(0xc0, p1) - } - _sendLogPayload(0x1c, 0xe4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - } - } - - function log(bytes32 p0, bytes32 p1, bool p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - // Selector of `log(string,string,bool)`. - mstore(0x00, 0xb0e0f9b5) - mstore(0x20, 0x60) - mstore(0x40, 0xa0) - mstore(0x60, p2) - writeString(0x80, p0) - writeString(0xc0, p1) - } - _sendLogPayload(0x1c, 0xe4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - } - } - - function log(bytes32 p0, bytes32 p1, uint256 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - // Selector of `log(string,string,uint256)`. - mstore(0x00, 0x5821efa1) - mstore(0x20, 0x60) - mstore(0x40, 0xa0) - mstore(0x60, p2) - writeString(0x80, p0) - writeString(0xc0, p1) - } - _sendLogPayload(0x1c, 0xe4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - } - } - - function log(bytes32 p0, bytes32 p1, bytes32 p2) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - bytes32 m9; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - m9 := mload(0x120) - // Selector of `log(string,string,string)`. - mstore(0x00, 0x2ced7cef) - mstore(0x20, 0x60) - mstore(0x40, 0xa0) - mstore(0x60, 0xe0) - writeString(0x80, p0) - writeString(0xc0, p1) - writeString(0x100, p2) - } - _sendLogPayload(0x1c, 0x124); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - mstore(0x120, m9) - } - } - - function log(address p0, address p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,address,address,address)`. - mstore(0x00, 0x665bf134) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, address p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,address,address,bool)`. - mstore(0x00, 0x0e378994) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, address p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,address,address,uint256)`. - mstore(0x00, 0x94250d77) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, address p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,address,address,string)`. - mstore(0x00, 0xf808da20) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, address p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,address,bool,address)`. - mstore(0x00, 0x9f1bc36e) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, address p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,address,bool,bool)`. - mstore(0x00, 0x2cd4134a) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, address p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,address,bool,uint256)`. - mstore(0x00, 0x3971e78c) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, address p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,address,bool,string)`. - mstore(0x00, 0xaa6540c8) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, address p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,address,uint256,address)`. - mstore(0x00, 0x8da6def5) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, address p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,address,uint256,bool)`. - mstore(0x00, 0x9b4254e2) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,address,uint256,uint256)`. - mstore(0x00, 0xbe553481) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, address p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,address,uint256,string)`. - mstore(0x00, 0xfdb4f990) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, address p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,address,string,address)`. - mstore(0x00, 0x8f736d16) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, address p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,address,string,bool)`. - mstore(0x00, 0x6f1a594e) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, address p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,address,string,uint256)`. - mstore(0x00, 0xef1cefe7) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, address p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(address,address,string,string)`. - mstore(0x00, 0x21bdaf25) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, 0xc0) - writeString(0xa0, p2) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(address p0, bool p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,bool,address,address)`. - mstore(0x00, 0x660375dd) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, bool p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,bool,address,bool)`. - mstore(0x00, 0xa6f50b0f) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, bool p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,bool,address,uint256)`. - mstore(0x00, 0xa75c59de) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, bool p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,bool,address,string)`. - mstore(0x00, 0x2dd778e6) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, bool p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,bool,bool,address)`. - mstore(0x00, 0xcf394485) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, bool p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,bool,bool,bool)`. - mstore(0x00, 0xcac43479) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, bool p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,bool,bool,uint256)`. - mstore(0x00, 0x8c4e5de6) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, bool p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,bool,bool,string)`. - mstore(0x00, 0xdfc4a2e8) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, bool p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,bool,uint256,address)`. - mstore(0x00, 0xccf790a1) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, bool p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,bool,uint256,bool)`. - mstore(0x00, 0xc4643e20) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,bool,uint256,uint256)`. - mstore(0x00, 0x386ff5f4) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, bool p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,bool,uint256,string)`. - mstore(0x00, 0x0aa6cfad) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, bool p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,bool,string,address)`. - mstore(0x00, 0x19fd4956) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, bool p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,bool,string,bool)`. - mstore(0x00, 0x50ad461d) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, bool p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,bool,string,uint256)`. - mstore(0x00, 0x80e6a20b) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, bool p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(address,bool,string,string)`. - mstore(0x00, 0x475c5c33) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, 0xc0) - writeString(0xa0, p2) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(address p0, uint256 p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,uint256,address,address)`. - mstore(0x00, 0x478d1c62) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, uint256 p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,uint256,address,bool)`. - mstore(0x00, 0xa1bcc9b3) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,uint256,address,uint256)`. - mstore(0x00, 0x100f650e) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, uint256 p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,uint256,address,string)`. - mstore(0x00, 0x1da986ea) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, uint256 p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,uint256,bool,address)`. - mstore(0x00, 0xa31bfdcc) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, uint256 p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,uint256,bool,bool)`. - mstore(0x00, 0x3bf5e537) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,uint256,bool,uint256)`. - mstore(0x00, 0x22f6b999) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, uint256 p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,uint256,bool,string)`. - mstore(0x00, 0xc5ad85f9) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,uint256,uint256,address)`. - mstore(0x00, 0x20e3984d) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,uint256,uint256,bool)`. - mstore(0x00, 0x66f1bc67) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(address,uint256,uint256,uint256)`. - mstore(0x00, 0x34f0e636) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(address p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,uint256,uint256,string)`. - mstore(0x00, 0x4a28c017) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, uint256 p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,uint256,string,address)`. - mstore(0x00, 0x5c430d47) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, uint256 p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,uint256,string,bool)`. - mstore(0x00, 0xcf18105c) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,uint256,string,uint256)`. - mstore(0x00, 0xbf01f891) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(address,uint256,string,string)`. - mstore(0x00, 0x88a8c406) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, 0xc0) - writeString(0xa0, p2) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(address p0, bytes32 p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,string,address,address)`. - mstore(0x00, 0x0d36fa20) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, bytes32 p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,string,address,bool)`. - mstore(0x00, 0x0df12b76) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, bytes32 p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,string,address,uint256)`. - mstore(0x00, 0x457fe3cf) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, bytes32 p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(address,string,address,string)`. - mstore(0x00, 0xf7e36245) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p1) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(address p0, bytes32 p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,string,bool,address)`. - mstore(0x00, 0x205871c2) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, bytes32 p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,string,bool,bool)`. - mstore(0x00, 0x5f1d5c9f) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, bytes32 p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,string,bool,uint256)`. - mstore(0x00, 0x515e38b6) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, bytes32 p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(address,string,bool,string)`. - mstore(0x00, 0xbc0b61fe) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p1) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(address p0, bytes32 p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,string,uint256,address)`. - mstore(0x00, 0x63183678) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, bytes32 p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,string,uint256,bool)`. - mstore(0x00, 0x0ef7e050) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(address,string,uint256,uint256)`. - mstore(0x00, 0x1dc8e1b8) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(address p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(address,string,uint256,string)`. - mstore(0x00, 0x448830a8) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p1) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(address p0, bytes32 p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(address,string,string,address)`. - mstore(0x00, 0xa04e2f87) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p1) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(address p0, bytes32 p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(address,string,string,bool)`. - mstore(0x00, 0x35a5071f) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p1) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(address p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(address,string,string,uint256)`. - mstore(0x00, 0x159f8927) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p1) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(address p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - bytes32 m9; - bytes32 m10; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - m9 := mload(0x120) - m10 := mload(0x140) - // Selector of `log(address,string,string,string)`. - mstore(0x00, 0x5d02c50b) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, 0xc0) - mstore(0x80, 0x100) - writeString(0xa0, p1) - writeString(0xe0, p2) - writeString(0x120, p3) - } - _sendLogPayload(0x1c, 0x144); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - mstore(0x120, m9) - mstore(0x140, m10) - } - } - - function log(bool p0, address p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,address,address,address)`. - mstore(0x00, 0x1d14d001) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, address p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,address,address,bool)`. - mstore(0x00, 0x46600be0) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, address p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,address,address,uint256)`. - mstore(0x00, 0x0c66d1be) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, address p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,address,address,string)`. - mstore(0x00, 0xd812a167) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, address p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,address,bool,address)`. - mstore(0x00, 0x1c41a336) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, address p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,address,bool,bool)`. - mstore(0x00, 0x6a9c478b) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, address p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,address,bool,uint256)`. - mstore(0x00, 0x07831502) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, address p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,address,bool,string)`. - mstore(0x00, 0x4a66cb34) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, address p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,address,uint256,address)`. - mstore(0x00, 0x136b05dd) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, address p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,address,uint256,bool)`. - mstore(0x00, 0xd6019f1c) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,address,uint256,uint256)`. - mstore(0x00, 0x7bf181a1) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, address p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,address,uint256,string)`. - mstore(0x00, 0x51f09ff8) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, address p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,address,string,address)`. - mstore(0x00, 0x6f7c603e) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, address p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,address,string,bool)`. - mstore(0x00, 0xe2bfd60b) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, address p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,address,string,uint256)`. - mstore(0x00, 0xc21f64c7) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, address p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(bool,address,string,string)`. - mstore(0x00, 0xa73c1db6) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, 0xc0) - writeString(0xa0, p2) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bool p0, bool p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,bool,address,address)`. - mstore(0x00, 0xf4880ea4) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, bool p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,bool,address,bool)`. - mstore(0x00, 0xc0a302d8) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, bool p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,bool,address,uint256)`. - mstore(0x00, 0x4c123d57) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, bool p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,bool,address,string)`. - mstore(0x00, 0xa0a47963) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, bool p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,bool,bool,address)`. - mstore(0x00, 0x8c329b1a) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, bool p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,bool,bool,bool)`. - mstore(0x00, 0x3b2a5ce0) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,bool,bool,uint256)`. - mstore(0x00, 0x6d7045c1) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, bool p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,bool,bool,string)`. - mstore(0x00, 0x2ae408d4) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, bool p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,bool,uint256,address)`. - mstore(0x00, 0x54a7a9a0) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,bool,uint256,bool)`. - mstore(0x00, 0x619e4d0e) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,bool,uint256,uint256)`. - mstore(0x00, 0x0bb00eab) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, bool p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,bool,uint256,string)`. - mstore(0x00, 0x7dd4d0e0) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, bool p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,bool,string,address)`. - mstore(0x00, 0xf9ad2b89) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, bool p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,bool,string,bool)`. - mstore(0x00, 0xb857163a) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, bool p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,bool,string,uint256)`. - mstore(0x00, 0xe3a9ca2f) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, bool p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(bool,bool,string,string)`. - mstore(0x00, 0x6d1e8751) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, 0xc0) - writeString(0xa0, p2) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bool p0, uint256 p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,uint256,address,address)`. - mstore(0x00, 0x26f560a8) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, uint256 p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,uint256,address,bool)`. - mstore(0x00, 0xb4c314ff) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,uint256,address,uint256)`. - mstore(0x00, 0x1537dc87) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, uint256 p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,uint256,address,string)`. - mstore(0x00, 0x1bb3b09a) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, uint256 p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,uint256,bool,address)`. - mstore(0x00, 0x9acd3616) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,uint256,bool,bool)`. - mstore(0x00, 0xceb5f4d7) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,uint256,bool,uint256)`. - mstore(0x00, 0x7f9bbca2) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, uint256 p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,uint256,bool,string)`. - mstore(0x00, 0x9143dbb1) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,uint256,uint256,address)`. - mstore(0x00, 0x00dd87b9) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,uint256,uint256,bool)`. - mstore(0x00, 0xbe984353) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(bool,uint256,uint256,uint256)`. - mstore(0x00, 0x374bb4b2) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(bool p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,uint256,uint256,string)`. - mstore(0x00, 0x8e69fb5d) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, uint256 p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,uint256,string,address)`. - mstore(0x00, 0xfedd1fff) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, uint256 p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,uint256,string,bool)`. - mstore(0x00, 0xe5e70b2b) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,uint256,string,uint256)`. - mstore(0x00, 0x6a1199e2) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(bool,uint256,string,string)`. - mstore(0x00, 0xf5bc2249) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, 0xc0) - writeString(0xa0, p2) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bool p0, bytes32 p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,string,address,address)`. - mstore(0x00, 0x2b2b18dc) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, bytes32 p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,string,address,bool)`. - mstore(0x00, 0x6dd434ca) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, bytes32 p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,string,address,uint256)`. - mstore(0x00, 0xa5cada94) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, bytes32 p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(bool,string,address,string)`. - mstore(0x00, 0x12d6c788) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p1) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bool p0, bytes32 p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,string,bool,address)`. - mstore(0x00, 0x538e06ab) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, bytes32 p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,string,bool,bool)`. - mstore(0x00, 0xdc5e935b) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, bytes32 p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,string,bool,uint256)`. - mstore(0x00, 0x1606a393) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, bytes32 p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(bool,string,bool,string)`. - mstore(0x00, 0x483d0416) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p1) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bool p0, bytes32 p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,string,uint256,address)`. - mstore(0x00, 0x1596a1ce) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, bytes32 p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,string,uint256,bool)`. - mstore(0x00, 0x6b0e5d53) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(bool,string,uint256,uint256)`. - mstore(0x00, 0x28863fcb) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bool p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(bool,string,uint256,string)`. - mstore(0x00, 0x1ad96de6) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p1) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bool p0, bytes32 p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(bool,string,string,address)`. - mstore(0x00, 0x97d394d8) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p1) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bool p0, bytes32 p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(bool,string,string,bool)`. - mstore(0x00, 0x1e4b87e5) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p1) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bool p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(bool,string,string,uint256)`. - mstore(0x00, 0x7be0c3eb) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p1) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bool p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - bytes32 m9; - bytes32 m10; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - m9 := mload(0x120) - m10 := mload(0x140) - // Selector of `log(bool,string,string,string)`. - mstore(0x00, 0x1762e32a) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, 0xc0) - mstore(0x80, 0x100) - writeString(0xa0, p1) - writeString(0xe0, p2) - writeString(0x120, p3) - } - _sendLogPayload(0x1c, 0x144); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - mstore(0x120, m9) - mstore(0x140, m10) - } - } - - function log(uint256 p0, address p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,address,address,address)`. - mstore(0x00, 0x2488b414) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, address p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,address,address,bool)`. - mstore(0x00, 0x091ffaf5) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,address,address,uint256)`. - mstore(0x00, 0x736efbb6) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, address p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,address,address,string)`. - mstore(0x00, 0x031c6f73) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, address p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,address,bool,address)`. - mstore(0x00, 0xef72c513) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, address p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,address,bool,bool)`. - mstore(0x00, 0xe351140f) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,address,bool,uint256)`. - mstore(0x00, 0x5abd992a) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, address p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,address,bool,string)`. - mstore(0x00, 0x90fb06aa) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,address,uint256,address)`. - mstore(0x00, 0x15c127b5) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,address,uint256,bool)`. - mstore(0x00, 0x5f743a7c) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,address,uint256,uint256)`. - mstore(0x00, 0x0c9cd9c1) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, address p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,address,uint256,string)`. - mstore(0x00, 0xddb06521) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, address p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,address,string,address)`. - mstore(0x00, 0x9cba8fff) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, address p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,address,string,bool)`. - mstore(0x00, 0xcc32ab07) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, address p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,address,string,uint256)`. - mstore(0x00, 0x46826b5d) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, address p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(uint256,address,string,string)`. - mstore(0x00, 0x3e128ca3) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, 0xc0) - writeString(0xa0, p2) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(uint256 p0, bool p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,bool,address,address)`. - mstore(0x00, 0xa1ef4cbb) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, bool p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,bool,address,bool)`. - mstore(0x00, 0x454d54a5) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,bool,address,uint256)`. - mstore(0x00, 0x078287f5) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, bool p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,bool,address,string)`. - mstore(0x00, 0xade052c7) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, bool p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,bool,bool,address)`. - mstore(0x00, 0x69640b59) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,bool,bool,bool)`. - mstore(0x00, 0xb6f577a1) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,bool,bool,uint256)`. - mstore(0x00, 0x7464ce23) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, bool p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,bool,bool,string)`. - mstore(0x00, 0xdddb9561) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,bool,uint256,address)`. - mstore(0x00, 0x88cb6041) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,bool,uint256,bool)`. - mstore(0x00, 0x91a02e2a) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,bool,uint256,uint256)`. - mstore(0x00, 0xc6acc7a8) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, bool p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,bool,uint256,string)`. - mstore(0x00, 0xde03e774) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, bool p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,bool,string,address)`. - mstore(0x00, 0xef529018) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, bool p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,bool,string,bool)`. - mstore(0x00, 0xeb928d7f) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, bool p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,bool,string,uint256)`. - mstore(0x00, 0x2c1d0746) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, bool p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(uint256,bool,string,string)`. - mstore(0x00, 0x68c8b8bd) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, 0xc0) - writeString(0xa0, p2) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,uint256,address,address)`. - mstore(0x00, 0x56a5d1b1) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,uint256,address,bool)`. - mstore(0x00, 0x15cac476) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,uint256,address,uint256)`. - mstore(0x00, 0x88f6e4b2) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, uint256 p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,uint256,address,string)`. - mstore(0x00, 0x6cde40b8) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,uint256,bool,address)`. - mstore(0x00, 0x9a816a83) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,uint256,bool,bool)`. - mstore(0x00, 0xab085ae6) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,uint256,bool,uint256)`. - mstore(0x00, 0xeb7f6fd2) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, uint256 p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,uint256,bool,string)`. - mstore(0x00, 0xa5b4fc99) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,uint256,uint256,address)`. - mstore(0x00, 0xfa8185af) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,uint256,uint256,bool)`. - mstore(0x00, 0xc598d185) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - assembly { - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - // Selector of `log(uint256,uint256,uint256,uint256)`. - mstore(0x00, 0x193fb800) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - } - _sendLogPayload(0x1c, 0x84); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - } - } - - function log(uint256 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,uint256,uint256,string)`. - mstore(0x00, 0x59cfcbe3) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0x80) - writeString(0xa0, p3) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, uint256 p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,uint256,string,address)`. - mstore(0x00, 0x42d21db7) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, uint256 p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,uint256,string,bool)`. - mstore(0x00, 0x7af6ab25) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,uint256,string,uint256)`. - mstore(0x00, 0x5da297eb) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, p3) - writeString(0xa0, p2) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(uint256,uint256,string,string)`. - mstore(0x00, 0x27d8afd2) - mstore(0x20, p0) - mstore(0x40, p1) - mstore(0x60, 0x80) - mstore(0x80, 0xc0) - writeString(0xa0, p2) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(uint256 p0, bytes32 p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,string,address,address)`. - mstore(0x00, 0x6168ed61) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, bytes32 p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,string,address,bool)`. - mstore(0x00, 0x90c30a56) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, bytes32 p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,string,address,uint256)`. - mstore(0x00, 0xe8d3018d) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, bytes32 p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(uint256,string,address,string)`. - mstore(0x00, 0x9c3adfa1) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p1) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(uint256 p0, bytes32 p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,string,bool,address)`. - mstore(0x00, 0xae2ec581) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, bytes32 p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,string,bool,bool)`. - mstore(0x00, 0xba535d9c) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, bytes32 p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,string,bool,uint256)`. - mstore(0x00, 0xcf009880) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, bytes32 p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(uint256,string,bool,string)`. - mstore(0x00, 0xd2d423cd) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p1) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(uint256 p0, bytes32 p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,string,uint256,address)`. - mstore(0x00, 0x3b2279b4) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, bytes32 p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,string,uint256,bool)`. - mstore(0x00, 0x691a8f74) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(uint256,string,uint256,uint256)`. - mstore(0x00, 0x82c25b74) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p1) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(uint256 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(uint256,string,uint256,string)`. - mstore(0x00, 0xb7b914ca) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p1) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(uint256 p0, bytes32 p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(uint256,string,string,address)`. - mstore(0x00, 0xd583c602) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p1) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(uint256 p0, bytes32 p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(uint256,string,string,bool)`. - mstore(0x00, 0xb3a6b6bd) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p1) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(uint256 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(uint256,string,string,uint256)`. - mstore(0x00, 0xb028c9bd) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p1) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(uint256 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - bytes32 m9; - bytes32 m10; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - m9 := mload(0x120) - m10 := mload(0x140) - // Selector of `log(uint256,string,string,string)`. - mstore(0x00, 0x21ad0683) - mstore(0x20, p0) - mstore(0x40, 0x80) - mstore(0x60, 0xc0) - mstore(0x80, 0x100) - writeString(0xa0, p1) - writeString(0xe0, p2) - writeString(0x120, p3) - } - _sendLogPayload(0x1c, 0x144); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - mstore(0x120, m9) - mstore(0x140, m10) - } - } - - function log(bytes32 p0, address p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,address,address,address)`. - mstore(0x00, 0xed8f28f6) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, address p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,address,address,bool)`. - mstore(0x00, 0xb59dbd60) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, address p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,address,address,uint256)`. - mstore(0x00, 0x8ef3f399) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, address p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,address,address,string)`. - mstore(0x00, 0x800a1c67) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p0) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, address p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,address,bool,address)`. - mstore(0x00, 0x223603bd) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, address p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,address,bool,bool)`. - mstore(0x00, 0x79884c2b) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, address p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,address,bool,uint256)`. - mstore(0x00, 0x3e9f866a) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, address p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,address,bool,string)`. - mstore(0x00, 0x0454c079) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p0) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, address p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,address,uint256,address)`. - mstore(0x00, 0x63fb8bc5) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, address p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,address,uint256,bool)`. - mstore(0x00, 0xfc4845f0) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, address p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,address,uint256,uint256)`. - mstore(0x00, 0xf8f51b1e) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, address p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,address,uint256,string)`. - mstore(0x00, 0x5a477632) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p0) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, address p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,address,string,address)`. - mstore(0x00, 0xaabc9a31) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, address p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,address,string,bool)`. - mstore(0x00, 0x5f15d28c) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, address p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,address,string,uint256)`. - mstore(0x00, 0x91d1112e) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, address p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - bytes32 m9; - bytes32 m10; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - m9 := mload(0x120) - m10 := mload(0x140) - // Selector of `log(string,address,string,string)`. - mstore(0x00, 0x245986f2) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, 0xc0) - mstore(0x80, 0x100) - writeString(0xa0, p0) - writeString(0xe0, p2) - writeString(0x120, p3) - } - _sendLogPayload(0x1c, 0x144); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - mstore(0x120, m9) - mstore(0x140, m10) - } - } - - function log(bytes32 p0, bool p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,bool,address,address)`. - mstore(0x00, 0x33e9dd1d) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, bool p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,bool,address,bool)`. - mstore(0x00, 0x958c28c6) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, bool p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,bool,address,uint256)`. - mstore(0x00, 0x5d08bb05) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, bool p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,bool,address,string)`. - mstore(0x00, 0x2d8e33a4) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p0) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, bool p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,bool,bool,address)`. - mstore(0x00, 0x7190a529) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, bool p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,bool,bool,bool)`. - mstore(0x00, 0x895af8c5) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, bool p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,bool,bool,uint256)`. - mstore(0x00, 0x8e3f78a9) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, bool p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,bool,bool,string)`. - mstore(0x00, 0x9d22d5dd) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p0) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, bool p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,bool,uint256,address)`. - mstore(0x00, 0x935e09bf) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, bool p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,bool,uint256,bool)`. - mstore(0x00, 0x8af7cf8a) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, bool p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,bool,uint256,uint256)`. - mstore(0x00, 0x64b5bb67) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, bool p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,bool,uint256,string)`. - mstore(0x00, 0x742d6ee7) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p0) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, bool p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,bool,string,address)`. - mstore(0x00, 0xe0625b29) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, bool p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,bool,string,bool)`. - mstore(0x00, 0x3f8a701d) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, bool p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,bool,string,uint256)`. - mstore(0x00, 0x24f91465) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, bool p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - bytes32 m9; - bytes32 m10; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - m9 := mload(0x120) - m10 := mload(0x140) - // Selector of `log(string,bool,string,string)`. - mstore(0x00, 0xa826caeb) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, 0xc0) - mstore(0x80, 0x100) - writeString(0xa0, p0) - writeString(0xe0, p2) - writeString(0x120, p3) - } - _sendLogPayload(0x1c, 0x144); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - mstore(0x120, m9) - mstore(0x140, m10) - } - } - - function log(bytes32 p0, uint256 p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,uint256,address,address)`. - mstore(0x00, 0x5ea2b7ae) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, uint256 p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,uint256,address,bool)`. - mstore(0x00, 0x82112a42) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, uint256 p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,uint256,address,uint256)`. - mstore(0x00, 0x4f04fdc6) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, uint256 p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,uint256,address,string)`. - mstore(0x00, 0x9ffb2f93) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p0) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, uint256 p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,uint256,bool,address)`. - mstore(0x00, 0xe0e95b98) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, uint256 p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,uint256,bool,bool)`. - mstore(0x00, 0x354c36d6) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, uint256 p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,uint256,bool,uint256)`. - mstore(0x00, 0xe41b6f6f) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, uint256 p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,uint256,bool,string)`. - mstore(0x00, 0xabf73a98) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p0) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, uint256 p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,uint256,uint256,address)`. - mstore(0x00, 0xe21de278) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, uint256 p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,uint256,uint256,bool)`. - mstore(0x00, 0x7626db92) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - // Selector of `log(string,uint256,uint256,uint256)`. - mstore(0x00, 0xa7a87853) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - } - _sendLogPayload(0x1c, 0xc4); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - } - } - - function log(bytes32 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,uint256,uint256,string)`. - mstore(0x00, 0x854b3496) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, p2) - mstore(0x80, 0xc0) - writeString(0xa0, p0) - writeString(0xe0, p3) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, uint256 p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,uint256,string,address)`. - mstore(0x00, 0x7c4632a4) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, uint256 p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,uint256,string,bool)`. - mstore(0x00, 0x7d24491d) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,uint256,string,uint256)`. - mstore(0x00, 0xc67ea9d1) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, 0xc0) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p2) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - bytes32 m9; - bytes32 m10; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - m9 := mload(0x120) - m10 := mload(0x140) - // Selector of `log(string,uint256,string,string)`. - mstore(0x00, 0x5ab84e1f) - mstore(0x20, 0x80) - mstore(0x40, p1) - mstore(0x60, 0xc0) - mstore(0x80, 0x100) - writeString(0xa0, p0) - writeString(0xe0, p2) - writeString(0x120, p3) - } - _sendLogPayload(0x1c, 0x144); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - mstore(0x120, m9) - mstore(0x140, m10) - } - } - - function log(bytes32 p0, bytes32 p1, address p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,string,address,address)`. - mstore(0x00, 0x439c7bef) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p1) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, bytes32 p1, address p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,string,address,bool)`. - mstore(0x00, 0x5ccd4e37) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p1) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, bytes32 p1, address p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,string,address,uint256)`. - mstore(0x00, 0x7cc3c607) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p1) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, bytes32 p1, address p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - bytes32 m9; - bytes32 m10; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - m9 := mload(0x120) - m10 := mload(0x140) - // Selector of `log(string,string,address,string)`. - mstore(0x00, 0xeb1bff80) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, p2) - mstore(0x80, 0x100) - writeString(0xa0, p0) - writeString(0xe0, p1) - writeString(0x120, p3) - } - _sendLogPayload(0x1c, 0x144); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - mstore(0x120, m9) - mstore(0x140, m10) - } - } - - function log(bytes32 p0, bytes32 p1, bool p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,string,bool,address)`. - mstore(0x00, 0xc371c7db) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p1) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, bytes32 p1, bool p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,string,bool,bool)`. - mstore(0x00, 0x40785869) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p1) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, bytes32 p1, bool p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,string,bool,uint256)`. - mstore(0x00, 0xd6aefad2) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p1) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, bytes32 p1, bool p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - bytes32 m9; - bytes32 m10; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - m9 := mload(0x120) - m10 := mload(0x140) - // Selector of `log(string,string,bool,string)`. - mstore(0x00, 0x5e84b0ea) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, p2) - mstore(0x80, 0x100) - writeString(0xa0, p0) - writeString(0xe0, p1) - writeString(0x120, p3) - } - _sendLogPayload(0x1c, 0x144); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - mstore(0x120, m9) - mstore(0x140, m10) - } - } - - function log(bytes32 p0, bytes32 p1, uint256 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,string,uint256,address)`. - mstore(0x00, 0x1023f7b2) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p1) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, bytes32 p1, uint256 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,string,uint256,bool)`. - mstore(0x00, 0xc3a8a654) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p1) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - // Selector of `log(string,string,uint256,uint256)`. - mstore(0x00, 0xf45d7d2c) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, p2) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p1) - } - _sendLogPayload(0x1c, 0x104); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - } - } - - function log(bytes32 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - bytes32 m9; - bytes32 m10; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - m9 := mload(0x120) - m10 := mload(0x140) - // Selector of `log(string,string,uint256,string)`. - mstore(0x00, 0x5d1a971a) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, p2) - mstore(0x80, 0x100) - writeString(0xa0, p0) - writeString(0xe0, p1) - writeString(0x120, p3) - } - _sendLogPayload(0x1c, 0x144); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - mstore(0x120, m9) - mstore(0x140, m10) - } - } - - function log(bytes32 p0, bytes32 p1, bytes32 p2, address p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - bytes32 m9; - bytes32 m10; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - m9 := mload(0x120) - m10 := mload(0x140) - // Selector of `log(string,string,string,address)`. - mstore(0x00, 0x6d572f44) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, 0x100) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p1) - writeString(0x120, p2) - } - _sendLogPayload(0x1c, 0x144); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - mstore(0x120, m9) - mstore(0x140, m10) - } - } - - function log(bytes32 p0, bytes32 p1, bytes32 p2, bool p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - bytes32 m9; - bytes32 m10; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - m9 := mload(0x120) - m10 := mload(0x140) - // Selector of `log(string,string,string,bool)`. - mstore(0x00, 0x2c1754ed) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, 0x100) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p1) - writeString(0x120, p2) - } - _sendLogPayload(0x1c, 0x144); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - mstore(0x120, m9) - mstore(0x140, m10) - } - } - - function log(bytes32 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - bytes32 m9; - bytes32 m10; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - m9 := mload(0x120) - m10 := mload(0x140) - // Selector of `log(string,string,string,uint256)`. - mstore(0x00, 0x8eafb02b) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, 0x100) - mstore(0x80, p3) - writeString(0xa0, p0) - writeString(0xe0, p1) - writeString(0x120, p2) - } - _sendLogPayload(0x1c, 0x144); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - mstore(0x120, m9) - mstore(0x140, m10) - } - } - - function log(bytes32 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { - bytes32 m0; - bytes32 m1; - bytes32 m2; - bytes32 m3; - bytes32 m4; - bytes32 m5; - bytes32 m6; - bytes32 m7; - bytes32 m8; - bytes32 m9; - bytes32 m10; - bytes32 m11; - bytes32 m12; - assembly { - function writeString(pos, w) { - let length := 0 - for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } - mstore(pos, length) - let shift := sub(256, shl(3, length)) - mstore(add(pos, 0x20), shl(shift, shr(shift, w))) - } - m0 := mload(0x00) - m1 := mload(0x20) - m2 := mload(0x40) - m3 := mload(0x60) - m4 := mload(0x80) - m5 := mload(0xa0) - m6 := mload(0xc0) - m7 := mload(0xe0) - m8 := mload(0x100) - m9 := mload(0x120) - m10 := mload(0x140) - m11 := mload(0x160) - m12 := mload(0x180) - // Selector of `log(string,string,string,string)`. - mstore(0x00, 0xde68f20a) - mstore(0x20, 0x80) - mstore(0x40, 0xc0) - mstore(0x60, 0x100) - mstore(0x80, 0x140) - writeString(0xa0, p0) - writeString(0xe0, p1) - writeString(0x120, p2) - writeString(0x160, p3) - } - _sendLogPayload(0x1c, 0x184); - assembly { - mstore(0x00, m0) - mstore(0x20, m1) - mstore(0x40, m2) - mstore(0x60, m3) - mstore(0x80, m4) - mstore(0xa0, m5) - mstore(0xc0, m6) - mstore(0xe0, m7) - mstore(0x100, m8) - mstore(0x120, m9) - mstore(0x140, m10) - mstore(0x160, m11) - mstore(0x180, m12) - } - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdAssertions.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdAssertions.t.sol deleted file mode 100644 index ea794687c..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/StdAssertions.t.sol +++ /dev/null @@ -1,145 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.7.0 <0.9.0; - -import "../src/StdAssertions.sol"; -import {Vm} from "../src/Vm.sol"; - -interface VmInternal is Vm { - function _expectCheatcodeRevert(bytes memory message) external; -} - -contract StdAssertionsTest is StdAssertions { - string constant errorMessage = "User provided message"; - uint256 constant maxDecimals = 77; - - bool constant SHOULD_REVERT = true; - bool constant SHOULD_RETURN = false; - - bool constant STRICT_REVERT_DATA = true; - bool constant NON_STRICT_REVERT_DATA = false; - - VmInternal constant vm = VmInternal(address(uint160(uint256(keccak256("hevm cheat code"))))); - - function testFuzz_AssertEqCall_Return_Pass( - bytes memory callDataA, - bytes memory callDataB, - bytes memory returnData, - bool strictRevertData - ) external { - address targetA = address(new TestMockCall(returnData, SHOULD_RETURN)); - address targetB = address(new TestMockCall(returnData, SHOULD_RETURN)); - - assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData); - } - - function testFuzz_RevertWhenCalled_AssertEqCall_Return_Fail( - bytes memory callDataA, - bytes memory callDataB, - bytes memory returnDataA, - bytes memory returnDataB, - bool strictRevertData - ) external { - vm.assume(keccak256(returnDataA) != keccak256(returnDataB)); - - address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN)); - address targetB = address(new TestMockCall(returnDataB, SHOULD_RETURN)); - - vm._expectCheatcodeRevert( - bytes( - string.concat( - "Call return data does not match: ", vm.toString(returnDataA), " != ", vm.toString(returnDataB) - ) - ) - ); - assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData); - } - - function testFuzz_AssertEqCall_Revert_Pass( - bytes memory callDataA, - bytes memory callDataB, - bytes memory revertDataA, - bytes memory revertDataB - ) external { - address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT)); - address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT)); - - assertEqCall(targetA, callDataA, targetB, callDataB, NON_STRICT_REVERT_DATA); - } - - function testFuzz_RevertWhenCalled_AssertEqCall_Revert_Fail( - bytes memory callDataA, - bytes memory callDataB, - bytes memory revertDataA, - bytes memory revertDataB - ) external { - vm.assume(keccak256(revertDataA) != keccak256(revertDataB)); - - address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT)); - address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT)); - - vm._expectCheatcodeRevert( - bytes( - string.concat( - "Call revert data does not match: ", vm.toString(revertDataA), " != ", vm.toString(revertDataB) - ) - ) - ); - assertEqCall(targetA, callDataA, targetB, callDataB, STRICT_REVERT_DATA); - } - - function testFuzz_RevertWhenCalled_AssertEqCall_Fail( - bytes memory callDataA, - bytes memory callDataB, - bytes memory returnDataA, - bytes memory returnDataB, - bool strictRevertData - ) external { - address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN)); - address targetB = address(new TestMockCall(returnDataB, SHOULD_REVERT)); - - vm.expectRevert(bytes("assertion failed")); - this.assertEqCallExternal(targetA, callDataA, targetB, callDataB, strictRevertData); - - vm.expectRevert(bytes("assertion failed")); - this.assertEqCallExternal(targetB, callDataB, targetA, callDataA, strictRevertData); - } - - // Helper function to test outcome of assertEqCall via `expect` cheatcodes - function assertEqCallExternal( - address targetA, - bytes memory callDataA, - address targetB, - bytes memory callDataB, - bool strictRevertData - ) public { - assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData); - } - - function testFailFail() public { - fail(); - } -} - -contract TestMockCall { - bytes returnData; - bool shouldRevert; - - constructor(bytes memory returnData_, bool shouldRevert_) { - returnData = returnData_; - shouldRevert = shouldRevert_; - } - - fallback() external payable { - bytes memory returnData_ = returnData; - - if (shouldRevert) { - assembly { - revert(add(returnData_, 0x20), mload(returnData_)) - } - } else { - assembly { - return(add(returnData_, 0x20), mload(returnData_)) - } - } - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdChains.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdChains.t.sol deleted file mode 100644 index 09059c233..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/StdChains.t.sol +++ /dev/null @@ -1,226 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.7.0 <0.9.0; - -import "../src/Test.sol"; - -contract StdChainsMock is Test { - function exposed_getChain(string memory chainAlias) public returns (Chain memory) { - return getChain(chainAlias); - } - - function exposed_getChain(uint256 chainId) public returns (Chain memory) { - return getChain(chainId); - } - - function exposed_setChain(string memory chainAlias, ChainData memory chainData) public { - setChain(chainAlias, chainData); - } - - function exposed_setFallbackToDefaultRpcUrls(bool useDefault) public { - setFallbackToDefaultRpcUrls(useDefault); - } -} - -contract StdChainsTest is Test { - function test_ChainRpcInitialization() public { - // RPCs specified in `foundry.toml` should be updated. - assertEq(getChain(1).rpcUrl, "https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX"); - assertEq(getChain("optimism_sepolia").rpcUrl, "https://sepolia.optimism.io/"); - assertEq(getChain("arbitrum_one_sepolia").rpcUrl, "https://sepolia-rollup.arbitrum.io/rpc/"); - - // Environment variables should be the next fallback - assertEq(getChain("arbitrum_nova").rpcUrl, "https://nova.arbitrum.io/rpc"); - vm.setEnv("ARBITRUM_NOVA_RPC_URL", "myoverride"); - assertEq(getChain("arbitrum_nova").rpcUrl, "myoverride"); - vm.setEnv("ARBITRUM_NOVA_RPC_URL", "https://nova.arbitrum.io/rpc"); - - // Cannot override RPCs defined in `foundry.toml` - vm.setEnv("MAINNET_RPC_URL", "myoverride2"); - assertEq(getChain("mainnet").rpcUrl, "https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX"); - - // Other RPCs should remain unchanged. - assertEq(getChain(31337).rpcUrl, "http://127.0.0.1:8545"); - assertEq(getChain("sepolia").rpcUrl, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001"); - } - - // Named with a leading underscore to clarify this is not intended to be run as a normal test, - // and is intended to be used in the below `test_Rpcs` test. - function _testRpc(string memory rpcAlias) internal { - string memory rpcUrl = getChain(rpcAlias).rpcUrl; - vm.createSelectFork(rpcUrl); - } - - // Ensure we can connect to the default RPC URL for each chain. - // Currently commented out since this is slow and public RPCs are flaky, often resulting in failing CI. - // function test_Rpcs() public { - // _testRpc("mainnet"); - // _testRpc("sepolia"); - // _testRpc("holesky"); - // _testRpc("optimism"); - // _testRpc("optimism_sepolia"); - // _testRpc("arbitrum_one"); - // _testRpc("arbitrum_one_sepolia"); - // _testRpc("arbitrum_nova"); - // _testRpc("polygon"); - // _testRpc("polygon_amoy"); - // _testRpc("avalanche"); - // _testRpc("avalanche_fuji"); - // _testRpc("bnb_smart_chain"); - // _testRpc("bnb_smart_chain_testnet"); - // _testRpc("gnosis_chain"); - // _testRpc("moonbeam"); - // _testRpc("moonriver"); - // _testRpc("moonbase"); - // _testRpc("base_sepolia"); - // _testRpc("base"); - // _testRpc("blast_sepolia"); - // _testRpc("blast"); - // _testRpc("fantom_opera"); - // _testRpc("fantom_opera_testnet"); - // _testRpc("fraxtal"); - // _testRpc("fraxtal_testnet"); - // _testRpc("berachain_bartio_testnet"); - // } - - function test_ChainNoDefault() public { - // We deploy a mock to properly test the revert. - StdChainsMock stdChainsMock = new StdChainsMock(); - - vm.expectRevert("StdChains getChain(string): Chain with alias \"does_not_exist\" not found."); - stdChainsMock.exposed_getChain("does_not_exist"); - } - - function test_SetChainFirstFails() public { - // We deploy a mock to properly test the revert. - StdChainsMock stdChainsMock = new StdChainsMock(); - - vm.expectRevert("StdChains setChain(string,ChainData): Chain ID 31337 already used by \"anvil\"."); - stdChainsMock.exposed_setChain("anvil2", ChainData("Anvil", 31337, "URL")); - } - - function test_ChainBubbleUp() public { - // We deploy a mock to properly test the revert. - StdChainsMock stdChainsMock = new StdChainsMock(); - - stdChainsMock.exposed_setChain("needs_undefined_env_var", ChainData("", 123456789, "")); - vm.expectRevert( - "Failed to resolve env var `UNDEFINED_RPC_URL_PLACEHOLDER` in `${UNDEFINED_RPC_URL_PLACEHOLDER}`: environment variable not found" - ); - stdChainsMock.exposed_getChain("needs_undefined_env_var"); - } - - function test_CannotSetChain_ChainIdExists() public { - // We deploy a mock to properly test the revert. - StdChainsMock stdChainsMock = new StdChainsMock(); - - stdChainsMock.exposed_setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); - - vm.expectRevert('StdChains setChain(string,ChainData): Chain ID 123456789 already used by "custom_chain".'); - - stdChainsMock.exposed_setChain("another_custom_chain", ChainData("", 123456789, "")); - } - - function test_SetChain() public { - setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); - Chain memory customChain = getChain("custom_chain"); - assertEq(customChain.name, "Custom Chain"); - assertEq(customChain.chainId, 123456789); - assertEq(customChain.chainAlias, "custom_chain"); - assertEq(customChain.rpcUrl, "https://custom.chain/"); - Chain memory chainById = getChain(123456789); - assertEq(chainById.name, customChain.name); - assertEq(chainById.chainId, customChain.chainId); - assertEq(chainById.chainAlias, customChain.chainAlias); - assertEq(chainById.rpcUrl, customChain.rpcUrl); - customChain.name = "Another Custom Chain"; - customChain.chainId = 987654321; - setChain("another_custom_chain", customChain); - Chain memory anotherCustomChain = getChain("another_custom_chain"); - assertEq(anotherCustomChain.name, "Another Custom Chain"); - assertEq(anotherCustomChain.chainId, 987654321); - assertEq(anotherCustomChain.chainAlias, "another_custom_chain"); - assertEq(anotherCustomChain.rpcUrl, "https://custom.chain/"); - // Verify the first chain data was not overwritten - chainById = getChain(123456789); - assertEq(chainById.name, "Custom Chain"); - assertEq(chainById.chainId, 123456789); - } - - function test_SetNoEmptyAlias() public { - // We deploy a mock to properly test the revert. - StdChainsMock stdChainsMock = new StdChainsMock(); - - vm.expectRevert("StdChains setChain(string,ChainData): Chain alias cannot be the empty string."); - stdChainsMock.exposed_setChain("", ChainData("", 123456789, "")); - } - - function test_SetNoChainId0() public { - // We deploy a mock to properly test the revert. - StdChainsMock stdChainsMock = new StdChainsMock(); - - vm.expectRevert("StdChains setChain(string,ChainData): Chain ID cannot be 0."); - stdChainsMock.exposed_setChain("alias", ChainData("", 0, "")); - } - - function test_GetNoChainId0() public { - // We deploy a mock to properly test the revert. - StdChainsMock stdChainsMock = new StdChainsMock(); - - vm.expectRevert("StdChains getChain(uint256): Chain ID cannot be 0."); - stdChainsMock.exposed_getChain(0); - } - - function test_GetNoEmptyAlias() public { - // We deploy a mock to properly test the revert. - StdChainsMock stdChainsMock = new StdChainsMock(); - - vm.expectRevert("StdChains getChain(string): Chain alias cannot be the empty string."); - stdChainsMock.exposed_getChain(""); - } - - function test_ChainIdNotFound() public { - // We deploy a mock to properly test the revert. - StdChainsMock stdChainsMock = new StdChainsMock(); - - vm.expectRevert("StdChains getChain(string): Chain with alias \"no_such_alias\" not found."); - stdChainsMock.exposed_getChain("no_such_alias"); - } - - function test_ChainAliasNotFound() public { - // We deploy a mock to properly test the revert. - StdChainsMock stdChainsMock = new StdChainsMock(); - - vm.expectRevert("StdChains getChain(uint256): Chain with ID 321 not found."); - - stdChainsMock.exposed_getChain(321); - } - - function test_SetChain_ExistingOne() public { - // We deploy a mock to properly test the revert. - StdChainsMock stdChainsMock = new StdChainsMock(); - - setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); - assertEq(getChain(123456789).chainId, 123456789); - - setChain("custom_chain", ChainData("Modified Chain", 999999999, "https://modified.chain/")); - vm.expectRevert("StdChains getChain(uint256): Chain with ID 123456789 not found."); - stdChainsMock.exposed_getChain(123456789); - - Chain memory modifiedChain = getChain(999999999); - assertEq(modifiedChain.name, "Modified Chain"); - assertEq(modifiedChain.chainId, 999999999); - assertEq(modifiedChain.rpcUrl, "https://modified.chain/"); - } - - function test_DontUseDefaultRpcUrl() public { - // We deploy a mock to properly test the revert. - StdChainsMock stdChainsMock = new StdChainsMock(); - - // Should error if default RPCs flag is set to false. - stdChainsMock.exposed_setFallbackToDefaultRpcUrls(false); - vm.expectRevert(); - stdChainsMock.exposed_getChain(31337); - vm.expectRevert(); - stdChainsMock.exposed_getChain("sepolia"); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdCheats.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdCheats.t.sol deleted file mode 100644 index 7bac4286f..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/StdCheats.t.sol +++ /dev/null @@ -1,618 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.7.0 <0.9.0; - -import "../src/StdCheats.sol"; -import "../src/Test.sol"; -import "../src/StdJson.sol"; -import "../src/StdToml.sol"; -import "../src/interfaces/IERC20.sol"; - -contract StdCheatsTest is Test { - Bar test; - - using stdJson for string; - - function setUp() public { - test = new Bar(); - } - - function test_Skip() public { - vm.warp(100); - skip(25); - assertEq(block.timestamp, 125); - } - - function test_Rewind() public { - vm.warp(100); - rewind(25); - assertEq(block.timestamp, 75); - } - - function test_Hoax() public { - hoax(address(1337)); - test.bar{value: 100}(address(1337)); - } - - function test_HoaxOrigin() public { - hoax(address(1337), address(1337)); - test.origin{value: 100}(address(1337)); - } - - function test_HoaxDifferentAddresses() public { - hoax(address(1337), address(7331)); - test.origin{value: 100}(address(1337), address(7331)); - } - - function test_StartHoax() public { - startHoax(address(1337)); - test.bar{value: 100}(address(1337)); - test.bar{value: 100}(address(1337)); - vm.stopPrank(); - test.bar(address(this)); - } - - function test_StartHoaxOrigin() public { - startHoax(address(1337), address(1337)); - test.origin{value: 100}(address(1337)); - test.origin{value: 100}(address(1337)); - vm.stopPrank(); - test.bar(address(this)); - } - - function test_ChangePrankMsgSender() public { - vm.startPrank(address(1337)); - test.bar(address(1337)); - changePrank(address(0xdead)); - test.bar(address(0xdead)); - changePrank(address(1337)); - test.bar(address(1337)); - vm.stopPrank(); - } - - function test_ChangePrankMsgSenderAndTxOrigin() public { - vm.startPrank(address(1337), address(1338)); - test.origin(address(1337), address(1338)); - changePrank(address(0xdead), address(0xbeef)); - test.origin(address(0xdead), address(0xbeef)); - changePrank(address(1337), address(1338)); - test.origin(address(1337), address(1338)); - vm.stopPrank(); - } - - function test_MakeAccountEquivalence() public { - Account memory account = makeAccount("1337"); - (address addr, uint256 key) = makeAddrAndKey("1337"); - assertEq(account.addr, addr); - assertEq(account.key, key); - } - - function test_MakeAddrEquivalence() public { - (address addr,) = makeAddrAndKey("1337"); - assertEq(makeAddr("1337"), addr); - } - - function test_MakeAddrSigning() public { - (address addr, uint256 key) = makeAddrAndKey("1337"); - bytes32 hash = keccak256("some_message"); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign(key, hash); - assertEq(ecrecover(hash, v, r, s), addr); - } - - function test_Deal() public { - deal(address(this), 1 ether); - assertEq(address(this).balance, 1 ether); - } - - function test_DealToken() public { - Bar barToken = new Bar(); - address bar = address(barToken); - deal(bar, address(this), 10000e18); - assertEq(barToken.balanceOf(address(this)), 10000e18); - } - - function test_DealTokenAdjustTotalSupply() public { - Bar barToken = new Bar(); - address bar = address(barToken); - deal(bar, address(this), 10000e18, true); - assertEq(barToken.balanceOf(address(this)), 10000e18); - assertEq(barToken.totalSupply(), 20000e18); - deal(bar, address(this), 0, true); - assertEq(barToken.balanceOf(address(this)), 0); - assertEq(barToken.totalSupply(), 10000e18); - } - - function test_DealERC1155Token() public { - BarERC1155 barToken = new BarERC1155(); - address bar = address(barToken); - dealERC1155(bar, address(this), 0, 10000e18, false); - assertEq(barToken.balanceOf(address(this), 0), 10000e18); - } - - function test_DealERC1155TokenAdjustTotalSupply() public { - BarERC1155 barToken = new BarERC1155(); - address bar = address(barToken); - dealERC1155(bar, address(this), 0, 10000e18, true); - assertEq(barToken.balanceOf(address(this), 0), 10000e18); - assertEq(barToken.totalSupply(0), 20000e18); - dealERC1155(bar, address(this), 0, 0, true); - assertEq(barToken.balanceOf(address(this), 0), 0); - assertEq(barToken.totalSupply(0), 10000e18); - } - - function test_DealERC721Token() public { - BarERC721 barToken = new BarERC721(); - address bar = address(barToken); - dealERC721(bar, address(2), 1); - assertEq(barToken.balanceOf(address(2)), 1); - assertEq(barToken.balanceOf(address(1)), 0); - dealERC721(bar, address(1), 2); - assertEq(barToken.balanceOf(address(1)), 1); - assertEq(barToken.balanceOf(bar), 1); - } - - function test_DeployCode() public { - address deployed = deployCode("StdCheats.t.sol:Bar", bytes("")); - assertEq(string(getCode(deployed)), string(getCode(address(test)))); - } - - function test_DestroyAccount() public { - // deploy something to destroy it - BarERC721 barToken = new BarERC721(); - address bar = address(barToken); - vm.setNonce(bar, 10); - deal(bar, 100); - - uint256 prevThisBalance = address(this).balance; - uint256 size; - assembly { - size := extcodesize(bar) - } - - assertGt(size, 0); - assertEq(bar.balance, 100); - assertEq(vm.getNonce(bar), 10); - - destroyAccount(bar, address(this)); - assembly { - size := extcodesize(bar) - } - assertEq(address(this).balance, prevThisBalance + 100); - assertEq(vm.getNonce(bar), 0); - assertEq(size, 0); - assertEq(bar.balance, 0); - } - - function test_DeployCodeNoArgs() public { - address deployed = deployCode("StdCheats.t.sol:Bar"); - assertEq(string(getCode(deployed)), string(getCode(address(test)))); - } - - function test_DeployCodeVal() public { - address deployed = deployCode("StdCheats.t.sol:Bar", bytes(""), 1 ether); - assertEq(string(getCode(deployed)), string(getCode(address(test)))); - assertEq(deployed.balance, 1 ether); - } - - function test_DeployCodeValNoArgs() public { - address deployed = deployCode("StdCheats.t.sol:Bar", 1 ether); - assertEq(string(getCode(deployed)), string(getCode(address(test)))); - assertEq(deployed.balance, 1 ether); - } - - // We need this so we can call "this.deployCode" rather than "deployCode" directly - function deployCodeHelper(string memory what) external { - deployCode(what); - } - - function test_DeployCodeFail() public { - vm.expectRevert(bytes("StdCheats deployCode(string): Deployment failed.")); - this.deployCodeHelper("StdCheats.t.sol:RevertingContract"); - } - - function getCode(address who) internal view returns (bytes memory o_code) { - /// @solidity memory-safe-assembly - assembly { - // retrieve the size of the code, this needs assembly - let size := extcodesize(who) - // allocate output byte array - this could also be done without assembly - // by using o_code = new bytes(size) - o_code := mload(0x40) - // new "memory end" including padding - mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f)))) - // store length in memory - mstore(o_code, size) - // actually retrieve the code, this needs assembly - extcodecopy(who, add(o_code, 0x20), 0, size) - } - } - - function test_DeriveRememberKey() public { - string memory mnemonic = "test test test test test test test test test test test junk"; - - (address deployer, uint256 privateKey) = deriveRememberKey(mnemonic, 0); - assertEq(deployer, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266); - assertEq(privateKey, 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80); - } - - function test_BytesToUint() public pure { - assertEq(3, bytesToUint_test(hex"03")); - assertEq(2, bytesToUint_test(hex"02")); - assertEq(255, bytesToUint_test(hex"ff")); - assertEq(29625, bytesToUint_test(hex"73b9")); - } - - function test_ParseJsonTxDetail() public view { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); - string memory json = vm.readFile(path); - bytes memory transactionDetails = json.parseRaw(".transactions[0].tx"); - RawTx1559Detail memory rawTxDetail = abi.decode(transactionDetails, (RawTx1559Detail)); - Tx1559Detail memory txDetail = rawToConvertedEIP1559Detail(rawTxDetail); - assertEq(txDetail.from, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266); - assertEq(txDetail.to, 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512); - assertEq( - txDetail.data, - hex"23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004" - ); - assertEq(txDetail.nonce, 3); - assertEq(txDetail.txType, 2); - assertEq(txDetail.gas, 29625); - assertEq(txDetail.value, 0); - } - - function test_ReadEIP1559Transaction() public view { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); - uint256 index = 0; - Tx1559 memory transaction = readTx1559(path, index); - transaction; - } - - function test_ReadEIP1559Transactions() public view { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); - Tx1559[] memory transactions = readTx1559s(path); - transactions; - } - - function test_ReadReceipt() public view { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); - uint256 index = 5; - Receipt memory receipt = readReceipt(path, index); - assertEq( - receipt.logsBloom, - hex"00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100" - ); - } - - function test_ReadReceipts() public view { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); - Receipt[] memory receipts = readReceipts(path); - receipts; - } - - function test_GasMeteringModifier() public { - uint256 gas_start_normal = gasleft(); - addInLoop(); - uint256 gas_used_normal = gas_start_normal - gasleft(); - - uint256 gas_start_single = gasleft(); - addInLoopNoGas(); - uint256 gas_used_single = gas_start_single - gasleft(); - - uint256 gas_start_double = gasleft(); - addInLoopNoGasNoGas(); - uint256 gas_used_double = gas_start_double - gasleft(); - - assertTrue(gas_used_double + gas_used_single < gas_used_normal); - } - - function addInLoop() internal pure returns (uint256) { - uint256 b; - for (uint256 i; i < 10000; i++) { - b += i; - } - return b; - } - - function addInLoopNoGas() internal noGasMetering returns (uint256) { - return addInLoop(); - } - - function addInLoopNoGasNoGas() internal noGasMetering returns (uint256) { - return addInLoopNoGas(); - } - - function bytesToUint_test(bytes memory b) private pure returns (uint256) { - uint256 number; - for (uint256 i = 0; i < b.length; i++) { - number = number + uint256(uint8(b[i])) * (2 ** (8 * (b.length - (i + 1)))); - } - return number; - } - - function testFuzz_AssumeAddressIsNot(address addr) external { - // skip over Payable and NonPayable enums - for (uint8 i = 2; i < uint8(type(AddressType).max); i++) { - assumeAddressIsNot(addr, AddressType(i)); - } - assertTrue(addr != address(0)); - assertTrue(addr < address(1) || addr > address(9)); - assertTrue(addr != address(vm) || addr != 0x000000000000000000636F6e736F6c652e6c6f67); - } - - function test_AssumePayable() external { - // We deploy a mock version so we can properly test the revert. - StdCheatsMock stdCheatsMock = new StdCheatsMock(); - - // all should revert since these addresses are not payable - - // VM address - vm.expectRevert(); - stdCheatsMock.exposed_assumePayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D); - - // Console address - vm.expectRevert(); - stdCheatsMock.exposed_assumePayable(0x000000000000000000636F6e736F6c652e6c6f67); - - // Create2Deployer - vm.expectRevert(); - stdCheatsMock.exposed_assumePayable(0x4e59b44847b379578588920cA78FbF26c0B4956C); - - // all should pass since these addresses are payable - - // vitalik.eth - stdCheatsMock.exposed_assumePayable(0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045); - - // mock payable contract - MockContractPayable cp = new MockContractPayable(); - stdCheatsMock.exposed_assumePayable(address(cp)); - } - - function test_AssumeNotPayable() external { - // We deploy a mock version so we can properly test the revert. - StdCheatsMock stdCheatsMock = new StdCheatsMock(); - - // all should pass since these addresses are not payable - - // VM address - stdCheatsMock.exposed_assumeNotPayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D); - - // Console address - stdCheatsMock.exposed_assumeNotPayable(0x000000000000000000636F6e736F6c652e6c6f67); - - // Create2Deployer - stdCheatsMock.exposed_assumeNotPayable(0x4e59b44847b379578588920cA78FbF26c0B4956C); - - // all should revert since these addresses are payable - - // vitalik.eth - vm.expectRevert(); - stdCheatsMock.exposed_assumeNotPayable(0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045); - - // mock payable contract - MockContractPayable cp = new MockContractPayable(); - vm.expectRevert(); - stdCheatsMock.exposed_assumeNotPayable(address(cp)); - } - - function testFuzz_AssumeNotPrecompile(address addr) external { - assumeNotPrecompile(addr, getChain("optimism_sepolia").chainId); - assertTrue( - addr < address(1) || (addr > address(9) && addr < address(0x4200000000000000000000000000000000000000)) - || addr > address(0x4200000000000000000000000000000000000800) - ); - } - - function testFuzz_AssumeNotForgeAddress(address addr) external pure { - assumeNotForgeAddress(addr); - assertTrue( - addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67 - && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C - ); - } - - function test_CannotDeployCodeTo() external { - vm.expectRevert("StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode."); - this._revertDeployCodeTo(); - } - - function _revertDeployCodeTo() external { - deployCodeTo("StdCheats.t.sol:RevertingContract", address(0)); - } - - function test_DeployCodeTo() external { - address arbitraryAddress = makeAddr("arbitraryAddress"); - - deployCodeTo( - "StdCheats.t.sol:MockContractWithConstructorArgs", - abi.encode(uint256(6), true, bytes20(arbitraryAddress)), - 1 ether, - arbitraryAddress - ); - - MockContractWithConstructorArgs ct = MockContractWithConstructorArgs(arbitraryAddress); - - assertEq(arbitraryAddress.balance, 1 ether); - assertEq(ct.x(), 6); - assertTrue(ct.y()); - assertEq(ct.z(), bytes20(arbitraryAddress)); - } -} - -contract StdCheatsMock is StdCheats { - function exposed_assumePayable(address addr) external { - assumePayable(addr); - } - - function exposed_assumeNotPayable(address addr) external { - assumeNotPayable(addr); - } - - // We deploy a mock version so we can properly test expected reverts. - function exposed_assumeNotBlacklisted(address token, address addr) external view { - return assumeNotBlacklisted(token, addr); - } -} - -contract StdCheatsForkTest is Test { - address internal constant SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE; - address internal constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; - address internal constant USDC_BLACKLISTED_USER = 0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD; - address internal constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7; - address internal constant USDT_BLACKLISTED_USER = 0x8f8a8F4B54a2aAC7799d7bc81368aC27b852822A; - - function setUp() public { - // All tests of the `assumeNotBlacklisted` method are fork tests using live contracts. - vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900}); - } - - function test_CannotAssumeNoBlacklisted_EOA() external { - // We deploy a mock version so we can properly test the revert. - StdCheatsMock stdCheatsMock = new StdCheatsMock(); - address eoa = vm.addr({privateKey: 1}); - vm.expectRevert("StdCheats assumeNotBlacklisted(address,address): Token address is not a contract."); - stdCheatsMock.exposed_assumeNotBlacklisted(eoa, address(0)); - } - - function testFuzz_AssumeNotBlacklisted_TokenWithoutBlacklist(address addr) external view { - assumeNotBlacklisted(SHIB, addr); - assertTrue(true); - } - - function test_AssumeNoBlacklisted_USDC() external { - // We deploy a mock version so we can properly test the revert. - StdCheatsMock stdCheatsMock = new StdCheatsMock(); - vm.expectRevert(); - stdCheatsMock.exposed_assumeNotBlacklisted(USDC, USDC_BLACKLISTED_USER); - } - - function testFuzz_AssumeNotBlacklisted_USDC(address addr) external view { - assumeNotBlacklisted(USDC, addr); - assertFalse(USDCLike(USDC).isBlacklisted(addr)); - } - - function test_AssumeNoBlacklisted_USDT() external { - // We deploy a mock version so we can properly test the revert. - StdCheatsMock stdCheatsMock = new StdCheatsMock(); - vm.expectRevert(); - stdCheatsMock.exposed_assumeNotBlacklisted(USDT, USDT_BLACKLISTED_USER); - } - - function testFuzz_AssumeNotBlacklisted_USDT(address addr) external view { - assumeNotBlacklisted(USDT, addr); - assertFalse(USDTLike(USDT).isBlackListed(addr)); - } - - function test_dealUSDC() external { - // roll fork to the point when USDC contract updated to store balance in packed slots - vm.rollFork(19279215); - - uint256 balance = 100e6; - deal(USDC, address(this), balance); - assertEq(IERC20(USDC).balanceOf(address(this)), balance); - } -} - -contract Bar { - constructor() payable { - /// `DEAL` STDCHEAT - totalSupply = 10000e18; - balanceOf[address(this)] = totalSupply; - } - - /// `HOAX` and `CHANGEPRANK` STDCHEATS - function bar(address expectedSender) public payable { - require(msg.sender == expectedSender, "!prank"); - } - - function origin(address expectedSender) public payable { - require(msg.sender == expectedSender, "!prank"); - require(tx.origin == expectedSender, "!prank"); - } - - function origin(address expectedSender, address expectedOrigin) public payable { - require(msg.sender == expectedSender, "!prank"); - require(tx.origin == expectedOrigin, "!prank"); - } - - /// `DEAL` STDCHEAT - mapping(address => uint256) public balanceOf; - uint256 public totalSupply; -} - -contract BarERC1155 { - constructor() payable { - /// `DEALERC1155` STDCHEAT - _totalSupply[0] = 10000e18; - _balances[0][address(this)] = _totalSupply[0]; - } - - function balanceOf(address account, uint256 id) public view virtual returns (uint256) { - return _balances[id][account]; - } - - function totalSupply(uint256 id) public view virtual returns (uint256) { - return _totalSupply[id]; - } - - /// `DEALERC1155` STDCHEAT - mapping(uint256 => mapping(address => uint256)) private _balances; - mapping(uint256 => uint256) private _totalSupply; -} - -contract BarERC721 { - constructor() payable { - /// `DEALERC721` STDCHEAT - _owners[1] = address(1); - _balances[address(1)] = 1; - _owners[2] = address(this); - _owners[3] = address(this); - _balances[address(this)] = 2; - } - - function balanceOf(address owner) public view virtual returns (uint256) { - return _balances[owner]; - } - - function ownerOf(uint256 tokenId) public view virtual returns (address) { - address owner = _owners[tokenId]; - return owner; - } - - mapping(uint256 => address) private _owners; - mapping(address => uint256) private _balances; -} - -interface USDCLike { - function isBlacklisted(address) external view returns (bool); -} - -interface USDTLike { - function isBlackListed(address) external view returns (bool); -} - -contract RevertingContract { - constructor() { - revert(); - } -} - -contract MockContractWithConstructorArgs { - uint256 public immutable x; - bool public y; - bytes20 public z; - - constructor(uint256 _x, bool _y, bytes20 _z) payable { - x = _x; - y = _y; - z = _z; - } -} - -contract MockContractPayable { - receive() external payable {} -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdError.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdError.t.sol deleted file mode 100644 index a306eaa78..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/StdError.t.sol +++ /dev/null @@ -1,120 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.0 <0.9.0; - -import "../src/StdError.sol"; -import "../src/Test.sol"; - -contract StdErrorsTest is Test { - ErrorsTest test; - - function setUp() public { - test = new ErrorsTest(); - } - - function test_ExpectAssertion() public { - vm.expectRevert(stdError.assertionError); - test.assertionError(); - } - - function test_ExpectArithmetic() public { - vm.expectRevert(stdError.arithmeticError); - test.arithmeticError(10); - } - - function test_ExpectDiv() public { - vm.expectRevert(stdError.divisionError); - test.divError(0); - } - - function test_ExpectMod() public { - vm.expectRevert(stdError.divisionError); - test.modError(0); - } - - function test_ExpectEnum() public { - vm.expectRevert(stdError.enumConversionError); - test.enumConversion(1); - } - - function test_ExpectEncodeStg() public { - vm.expectRevert(stdError.encodeStorageError); - test.encodeStgError(); - } - - function test_ExpectPop() public { - vm.expectRevert(stdError.popError); - test.pop(); - } - - function test_ExpectOOB() public { - vm.expectRevert(stdError.indexOOBError); - test.indexOOBError(1); - } - - function test_ExpectMem() public { - vm.expectRevert(stdError.memOverflowError); - test.mem(); - } - - function test_ExpectIntern() public { - vm.expectRevert(stdError.zeroVarError); - test.intern(); - } -} - -contract ErrorsTest { - enum T { - T1 - } - - uint256[] public someArr; - bytes someBytes; - - function assertionError() public pure { - assert(false); - } - - function arithmeticError(uint256 a) public pure { - a -= 100; - } - - function divError(uint256 a) public pure { - 100 / a; - } - - function modError(uint256 a) public pure { - 100 % a; - } - - function enumConversion(uint256 a) public pure { - T(a); - } - - function encodeStgError() public { - /// @solidity memory-safe-assembly - assembly { - sstore(someBytes.slot, 1) - } - keccak256(someBytes); - } - - function pop() public { - someArr.pop(); - } - - function indexOOBError(uint256 a) public pure { - uint256[] memory t = new uint256[](0); - t[a]; - } - - function mem() public pure { - uint256 l = 2 ** 256 / 32; - new uint256[](l); - } - - function intern() public returns (uint256) { - function(uint256) internal returns (uint256) x; - x(2); - return 7; - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdJson.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdJson.t.sol deleted file mode 100644 index e32b92ea3..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/StdJson.t.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.7.0 <0.9.0; - -import "../src/Test.sol"; - -contract StdJsonTest is Test { - using stdJson for string; - - string root; - string path; - - function setUp() public { - root = vm.projectRoot(); - path = string.concat(root, "/test/fixtures/test.json"); - } - - struct SimpleJson { - uint256 a; - string b; - } - - struct NestedJson { - uint256 a; - string b; - SimpleJson c; - } - - function test_readJson() public view { - string memory json = vm.readFile(path); - assertEq(json.readUint(".a"), 123); - } - - function test_writeJson() public { - string memory json = "json"; - json.serialize("a", uint256(123)); - string memory semiFinal = json.serialize("b", string("test")); - string memory finalJson = json.serialize("c", semiFinal); - finalJson.write(path); - - string memory json_ = vm.readFile(path); - bytes memory data = json_.parseRaw("$"); - NestedJson memory decodedData = abi.decode(data, (NestedJson)); - - assertEq(decodedData.a, 123); - assertEq(decodedData.b, "test"); - assertEq(decodedData.c.a, 123); - assertEq(decodedData.c.b, "test"); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdMath.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdMath.t.sol deleted file mode 100644 index ed0f9baeb..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/StdMath.t.sol +++ /dev/null @@ -1,212 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.0 <0.9.0; - -import "../src/StdMath.sol"; -import "../src/Test.sol"; - -contract StdMathMock is Test { - function exposed_percentDelta(uint256 a, uint256 b) public pure returns (uint256) { - return stdMath.percentDelta(a, b); - } - - function exposed_percentDelta(int256 a, int256 b) public pure returns (uint256) { - return stdMath.percentDelta(a, b); - } -} - -contract StdMathTest is Test { - function test_GetAbs() external pure { - assertEq(stdMath.abs(-50), 50); - assertEq(stdMath.abs(50), 50); - assertEq(stdMath.abs(-1337), 1337); - assertEq(stdMath.abs(0), 0); - - assertEq(stdMath.abs(type(int256).min), (type(uint256).max >> 1) + 1); - assertEq(stdMath.abs(type(int256).max), (type(uint256).max >> 1)); - } - - function testFuzz_GetAbs(int256 a) external pure { - uint256 manualAbs = getAbs(a); - - uint256 abs = stdMath.abs(a); - - assertEq(abs, manualAbs); - } - - function test_GetDelta_Uint() external pure { - assertEq(stdMath.delta(uint256(0), uint256(0)), 0); - assertEq(stdMath.delta(uint256(0), uint256(1337)), 1337); - assertEq(stdMath.delta(uint256(0), type(uint64).max), type(uint64).max); - assertEq(stdMath.delta(uint256(0), type(uint128).max), type(uint128).max); - assertEq(stdMath.delta(uint256(0), type(uint256).max), type(uint256).max); - - assertEq(stdMath.delta(0, uint256(0)), 0); - assertEq(stdMath.delta(1337, uint256(0)), 1337); - assertEq(stdMath.delta(type(uint64).max, uint256(0)), type(uint64).max); - assertEq(stdMath.delta(type(uint128).max, uint256(0)), type(uint128).max); - assertEq(stdMath.delta(type(uint256).max, uint256(0)), type(uint256).max); - - assertEq(stdMath.delta(1337, uint256(1337)), 0); - assertEq(stdMath.delta(type(uint256).max, type(uint256).max), 0); - assertEq(stdMath.delta(5000, uint256(1250)), 3750); - } - - function testFuzz_GetDelta_Uint(uint256 a, uint256 b) external pure { - uint256 manualDelta; - if (a > b) { - manualDelta = a - b; - } else { - manualDelta = b - a; - } - - uint256 delta = stdMath.delta(a, b); - - assertEq(delta, manualDelta); - } - - function test_GetDelta_Int() external pure { - assertEq(stdMath.delta(int256(0), int256(0)), 0); - assertEq(stdMath.delta(int256(0), int256(1337)), 1337); - assertEq(stdMath.delta(int256(0), type(int64).max), type(uint64).max >> 1); - assertEq(stdMath.delta(int256(0), type(int128).max), type(uint128).max >> 1); - assertEq(stdMath.delta(int256(0), type(int256).max), type(uint256).max >> 1); - - assertEq(stdMath.delta(0, int256(0)), 0); - assertEq(stdMath.delta(1337, int256(0)), 1337); - assertEq(stdMath.delta(type(int64).max, int256(0)), type(uint64).max >> 1); - assertEq(stdMath.delta(type(int128).max, int256(0)), type(uint128).max >> 1); - assertEq(stdMath.delta(type(int256).max, int256(0)), type(uint256).max >> 1); - - assertEq(stdMath.delta(-0, int256(0)), 0); - assertEq(stdMath.delta(-1337, int256(0)), 1337); - assertEq(stdMath.delta(type(int64).min, int256(0)), (type(uint64).max >> 1) + 1); - assertEq(stdMath.delta(type(int128).min, int256(0)), (type(uint128).max >> 1) + 1); - assertEq(stdMath.delta(type(int256).min, int256(0)), (type(uint256).max >> 1) + 1); - - assertEq(stdMath.delta(int256(0), -0), 0); - assertEq(stdMath.delta(int256(0), -1337), 1337); - assertEq(stdMath.delta(int256(0), type(int64).min), (type(uint64).max >> 1) + 1); - assertEq(stdMath.delta(int256(0), type(int128).min), (type(uint128).max >> 1) + 1); - assertEq(stdMath.delta(int256(0), type(int256).min), (type(uint256).max >> 1) + 1); - - assertEq(stdMath.delta(1337, int256(1337)), 0); - assertEq(stdMath.delta(type(int256).max, type(int256).max), 0); - assertEq(stdMath.delta(type(int256).min, type(int256).min), 0); - assertEq(stdMath.delta(type(int256).min, type(int256).max), type(uint256).max); - assertEq(stdMath.delta(5000, int256(1250)), 3750); - } - - function testFuzz_GetDelta_Int(int256 a, int256 b) external pure { - uint256 absA = getAbs(a); - uint256 absB = getAbs(b); - uint256 absDelta = absA > absB ? absA - absB : absB - absA; - - uint256 manualDelta; - if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) { - manualDelta = absDelta; - } - // (a < 0 && b >= 0) || (a >= 0 && b < 0) - else { - manualDelta = absA + absB; - } - - uint256 delta = stdMath.delta(a, b); - - assertEq(delta, manualDelta); - } - - function test_GetPercentDelta_Uint() external { - StdMathMock stdMathMock = new StdMathMock(); - - assertEq(stdMath.percentDelta(uint256(0), uint256(1337)), 1e18); - assertEq(stdMath.percentDelta(uint256(0), type(uint64).max), 1e18); - assertEq(stdMath.percentDelta(uint256(0), type(uint128).max), 1e18); - assertEq(stdMath.percentDelta(uint256(0), type(uint192).max), 1e18); - - assertEq(stdMath.percentDelta(1337, uint256(1337)), 0); - assertEq(stdMath.percentDelta(type(uint192).max, type(uint192).max), 0); - assertEq(stdMath.percentDelta(0, uint256(2500)), 1e18); - assertEq(stdMath.percentDelta(2500, uint256(2500)), 0); - assertEq(stdMath.percentDelta(5000, uint256(2500)), 1e18); - assertEq(stdMath.percentDelta(7500, uint256(2500)), 2e18); - - vm.expectRevert(stdError.divisionError); - stdMathMock.exposed_percentDelta(uint256(1), 0); - } - - function testFuzz_GetPercentDelta_Uint(uint192 a, uint192 b) external pure { - vm.assume(b != 0); - uint256 manualDelta; - if (a > b) { - manualDelta = a - b; - } else { - manualDelta = b - a; - } - - uint256 manualPercentDelta = manualDelta * 1e18 / b; - uint256 percentDelta = stdMath.percentDelta(a, b); - - assertEq(percentDelta, manualPercentDelta); - } - - function test_GetPercentDelta_Int() external { - // We deploy a mock version so we can properly test the revert. - StdMathMock stdMathMock = new StdMathMock(); - - assertEq(stdMath.percentDelta(int256(0), int256(1337)), 1e18); - assertEq(stdMath.percentDelta(int256(0), -1337), 1e18); - assertEq(stdMath.percentDelta(int256(0), type(int64).min), 1e18); - assertEq(stdMath.percentDelta(int256(0), type(int128).min), 1e18); - assertEq(stdMath.percentDelta(int256(0), type(int192).min), 1e18); - assertEq(stdMath.percentDelta(int256(0), type(int64).max), 1e18); - assertEq(stdMath.percentDelta(int256(0), type(int128).max), 1e18); - assertEq(stdMath.percentDelta(int256(0), type(int192).max), 1e18); - - assertEq(stdMath.percentDelta(1337, int256(1337)), 0); - assertEq(stdMath.percentDelta(type(int192).max, type(int192).max), 0); - assertEq(stdMath.percentDelta(type(int192).min, type(int192).min), 0); - - assertEq(stdMath.percentDelta(type(int192).min, type(int192).max), 2e18); // rounds the 1 wei diff down - assertEq(stdMath.percentDelta(type(int192).max, type(int192).min), 2e18 - 1); // rounds the 1 wei diff down - assertEq(stdMath.percentDelta(0, int256(2500)), 1e18); - assertEq(stdMath.percentDelta(2500, int256(2500)), 0); - assertEq(stdMath.percentDelta(5000, int256(2500)), 1e18); - assertEq(stdMath.percentDelta(7500, int256(2500)), 2e18); - - vm.expectRevert(stdError.divisionError); - stdMathMock.exposed_percentDelta(int256(1), 0); - } - - function testFuzz_GetPercentDelta_Int(int192 a, int192 b) external pure { - vm.assume(b != 0); - uint256 absA = getAbs(a); - uint256 absB = getAbs(b); - uint256 absDelta = absA > absB ? absA - absB : absB - absA; - - uint256 manualDelta; - if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) { - manualDelta = absDelta; - } - // (a < 0 && b >= 0) || (a >= 0 && b < 0) - else { - manualDelta = absA + absB; - } - - uint256 manualPercentDelta = manualDelta * 1e18 / absB; - uint256 percentDelta = stdMath.percentDelta(a, b); - - assertEq(percentDelta, manualPercentDelta); - } - - /*////////////////////////////////////////////////////////////////////////// - HELPERS - //////////////////////////////////////////////////////////////////////////*/ - - function getAbs(int256 a) private pure returns (uint256) { - if (a < 0) { - return a == type(int256).min ? uint256(type(int256).max) + 1 : uint256(-a); - } - - return uint256(a); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdStorage.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdStorage.t.sol deleted file mode 100644 index e1e6aa0d0..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/StdStorage.t.sol +++ /dev/null @@ -1,463 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.7.0 <0.9.0; - -import "../src/StdStorage.sol"; -import "../src/Test.sol"; - -contract StdStorageTest is Test { - using stdStorage for StdStorage; - - StorageTest internal test; - - function setUp() public { - test = new StorageTest(); - } - - function test_StorageHidden() public { - assertEq(uint256(keccak256("my.random.var")), stdstore.target(address(test)).sig("hidden()").find()); - } - - function test_StorageObvious() public { - assertEq(uint256(0), stdstore.target(address(test)).sig("exists()").find()); - } - - function test_StorageExtraSload() public { - assertEq(16, stdstore.target(address(test)).sig(test.extra_sload.selector).find()); - } - - function test_StorageCheckedWriteHidden() public { - stdstore.target(address(test)).sig(test.hidden.selector).checked_write(100); - assertEq(uint256(test.hidden()), 100); - } - - function test_StorageCheckedWriteObvious() public { - stdstore.target(address(test)).sig(test.exists.selector).checked_write(100); - assertEq(test.exists(), 100); - } - - function test_StorageCheckedWriteSignedIntegerHidden() public { - stdstore.target(address(test)).sig(test.hidden.selector).checked_write_int(-100); - assertEq(int256(uint256(test.hidden())), -100); - } - - function test_StorageCheckedWriteSignedIntegerObvious() public { - stdstore.target(address(test)).sig(test.tG.selector).checked_write_int(-100); - assertEq(test.tG(), -100); - } - - function test_StorageMapStructA() public { - uint256 slot = - stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).find(); - assertEq(uint256(keccak256(abi.encode(address(this), 4))), slot); - } - - function test_StorageMapStructB() public { - uint256 slot = - stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).find(); - assertEq(uint256(keccak256(abi.encode(address(this), 4))) + 1, slot); - } - - function test_StorageDeepMap() public { - uint256 slot = stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key( - address(this) - ).find(); - assertEq(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(5)))))), slot); - } - - function test_StorageCheckedWriteDeepMap() public { - stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key(address(this)) - .checked_write(100); - assertEq(100, test.deep_map(address(this), address(this))); - } - - function test_StorageDeepMapStructA() public { - uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)) - .with_key(address(this)).depth(0).find(); - assertEq( - bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 0), - bytes32(slot) - ); - } - - function test_StorageDeepMapStructB() public { - uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)) - .with_key(address(this)).depth(1).find(); - assertEq( - bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 1), - bytes32(slot) - ); - } - - function test_StorageCheckedWriteDeepMapStructA() public { - stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key( - address(this) - ).depth(0).checked_write(100); - (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this)); - assertEq(100, a); - assertEq(0, b); - } - - function test_StorageCheckedWriteDeepMapStructB() public { - stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key( - address(this) - ).depth(1).checked_write(100); - (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this)); - assertEq(0, a); - assertEq(100, b); - } - - function test_StorageCheckedWriteMapStructA() public { - stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).checked_write(100); - (uint256 a, uint256 b) = test.map_struct(address(this)); - assertEq(a, 100); - assertEq(b, 0); - } - - function test_StorageCheckedWriteMapStructB() public { - stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).checked_write(100); - (uint256 a, uint256 b) = test.map_struct(address(this)); - assertEq(a, 0); - assertEq(b, 100); - } - - function test_StorageStructA() public { - uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(0).find(); - assertEq(uint256(7), slot); - } - - function test_StorageStructB() public { - uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(1).find(); - assertEq(uint256(7) + 1, slot); - } - - function test_StorageCheckedWriteStructA() public { - stdstore.target(address(test)).sig(test.basic.selector).depth(0).checked_write(100); - (uint256 a, uint256 b) = test.basic(); - assertEq(a, 100); - assertEq(b, 1337); - } - - function test_StorageCheckedWriteStructB() public { - stdstore.target(address(test)).sig(test.basic.selector).depth(1).checked_write(100); - (uint256 a, uint256 b) = test.basic(); - assertEq(a, 1337); - assertEq(b, 100); - } - - function test_StorageMapAddrFound() public { - uint256 slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).find(); - assertEq(uint256(keccak256(abi.encode(address(this), uint256(1)))), slot); - } - - function test_StorageMapAddrRoot() public { - (uint256 slot, bytes32 key) = - stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).parent(); - assertEq(address(uint160(uint256(key))), address(this)); - assertEq(uint256(1), slot); - slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).root(); - assertEq(uint256(1), slot); - } - - function test_StorageMapUintFound() public { - uint256 slot = stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).find(); - assertEq(uint256(keccak256(abi.encode(100, uint256(2)))), slot); - } - - function test_StorageCheckedWriteMapUint() public { - stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).checked_write(100); - assertEq(100, test.map_uint(100)); - } - - function test_StorageCheckedWriteMapAddr() public { - stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).checked_write(100); - assertEq(100, test.map_addr(address(this))); - } - - function test_StorageCheckedWriteMapBool() public { - stdstore.target(address(test)).sig(test.map_bool.selector).with_key(address(this)).checked_write(true); - assertTrue(test.map_bool(address(this))); - } - - function testFuzz_StorageCheckedWriteMapPacked(address addr, uint128 value) public { - stdstore.enable_packed_slots().target(address(test)).sig(test.read_struct_lower.selector).with_key(addr) - .checked_write(value); - assertEq(test.read_struct_lower(addr), value); - - stdstore.enable_packed_slots().target(address(test)).sig(test.read_struct_upper.selector).with_key(addr) - .checked_write(value); - assertEq(test.read_struct_upper(addr), value); - } - - function test_StorageCheckedWriteMapPackedFullSuccess() public { - uint256 full = test.map_packed(address(1337)); - // keep upper 128, set lower 128 to 1337 - full = (full & (uint256((1 << 128) - 1) << 128)) | 1337; - stdstore.target(address(test)).sig(test.map_packed.selector).with_key(address(uint160(1337))).checked_write( - full - ); - assertEq(1337, test.read_struct_lower(address(1337))); - } - - function testFail_StorageConst() public { - // vm.expectRevert(abi.encodeWithSignature("NotStorage(bytes4)", bytes4(keccak256("const()")))); - stdstore.target(address(test)).sig("const()").find(); - } - - function testFuzz_StorageNativePack(uint248 val1, uint248 val2, bool boolVal1, bool boolVal2) public { - stdstore.enable_packed_slots().target(address(test)).sig(test.tA.selector).checked_write(val1); - stdstore.enable_packed_slots().target(address(test)).sig(test.tB.selector).checked_write(boolVal1); - stdstore.enable_packed_slots().target(address(test)).sig(test.tC.selector).checked_write(boolVal2); - stdstore.enable_packed_slots().target(address(test)).sig(test.tD.selector).checked_write(val2); - - assertEq(test.tA(), val1); - assertEq(test.tB(), boolVal1); - assertEq(test.tC(), boolVal2); - assertEq(test.tD(), val2); - } - - function test_StorageReadBytes32() public { - bytes32 val = stdstore.target(address(test)).sig(test.tE.selector).read_bytes32(); - assertEq(val, hex"1337"); - } - - function test_StorageReadBool_False() public { - bool val = stdstore.target(address(test)).sig(test.tB.selector).read_bool(); - assertEq(val, false); - } - - function test_StorageReadBool_True() public { - bool val = stdstore.target(address(test)).sig(test.tH.selector).read_bool(); - assertEq(val, true); - } - - function test_StorageReadBool_Revert() public { - vm.expectRevert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool."); - this.readNonBoolValue(); - } - - function readNonBoolValue() public { - stdstore.target(address(test)).sig(test.tE.selector).read_bool(); - } - - function test_StorageReadAddress() public { - address val = stdstore.target(address(test)).sig(test.tF.selector).read_address(); - assertEq(val, address(1337)); - } - - function test_StorageReadUint() public { - uint256 val = stdstore.target(address(test)).sig(test.exists.selector).read_uint(); - assertEq(val, 1); - } - - function test_StorageReadInt() public { - int256 val = stdstore.target(address(test)).sig(test.tG.selector).read_int(); - assertEq(val, type(int256).min); - } - - function testFuzzPacked(uint256 val, uint8 elemToGet) public { - // This function tries an assortment of packed slots, shifts meaning number of elements - // that are packed. Shiftsizes are the size of each element, i.e. 8 means a data type that is 8 bits, 16 == 16 bits, etc. - // Combined, these determine how a slot is packed. Making it random is too hard to avoid global rejection limit - // and make it performant. - - // change the number of shifts - for (uint256 i = 1; i < 5; i++) { - uint256 shifts = i; - - elemToGet = uint8(bound(elemToGet, 0, shifts - 1)); - - uint256[] memory shiftSizes = new uint256[](shifts); - for (uint256 j; j < shifts; j++) { - shiftSizes[j] = 8 * (j + 1); - } - - test.setRandomPacking(val); - - uint256 leftBits; - uint256 rightBits; - for (uint256 j; j < shiftSizes.length; j++) { - if (j < elemToGet) { - leftBits += shiftSizes[j]; - } else if (elemToGet != j) { - rightBits += shiftSizes[j]; - } - } - - // we may have some right bits unaccounted for - leftBits += 256 - (leftBits + shiftSizes[elemToGet] + rightBits); - // clear left bits, then clear right bits and realign - uint256 expectedValToRead = (val << leftBits) >> (leftBits + rightBits); - - uint256 readVal = stdstore.target(address(test)).enable_packed_slots().sig( - "getRandomPacked(uint8,uint8[],uint8)" - ).with_calldata(abi.encode(shifts, shiftSizes, elemToGet)).read_uint(); - - assertEq(readVal, expectedValToRead); - } - } - - function testFuzzPacked2(uint256 nvars, uint256 seed) public { - // Number of random variables to generate. - nvars = bound(nvars, 1, 20); - - // This will decrease as we generate values in the below loop. - uint256 bitsRemaining = 256; - - // Generate a random value and size for each variable. - uint256[] memory vals = new uint256[](nvars); - uint256[] memory sizes = new uint256[](nvars); - uint256[] memory offsets = new uint256[](nvars); - - for (uint256 i = 0; i < nvars; i++) { - // Generate a random value and size. - offsets[i] = i == 0 ? 0 : offsets[i - 1] + sizes[i - 1]; - - uint256 nvarsRemaining = nvars - i; - uint256 maxVarSize = bitsRemaining - nvarsRemaining + 1; - sizes[i] = bound(uint256(keccak256(abi.encodePacked(seed, i + 256))), 1, maxVarSize); - bitsRemaining -= sizes[i]; - - uint256 maxVal; - uint256 varSize = sizes[i]; - assembly { - // mask = (1 << varSize) - 1 - maxVal := sub(shl(varSize, 1), 1) - } - vals[i] = bound(uint256(keccak256(abi.encodePacked(seed, i))), 0, maxVal); - } - - // Pack all values into the slot. - for (uint256 i = 0; i < nvars; i++) { - stdstore.enable_packed_slots().target(address(test)).sig("getRandomPacked(uint256,uint256)").with_key( - sizes[i] - ).with_key(offsets[i]).checked_write(vals[i]); - } - - // Verify the read data matches. - for (uint256 i = 0; i < nvars; i++) { - uint256 readVal = stdstore.enable_packed_slots().target(address(test)).sig( - "getRandomPacked(uint256,uint256)" - ).with_key(sizes[i]).with_key(offsets[i]).read_uint(); - - uint256 retVal = test.getRandomPacked(sizes[i], offsets[i]); - - assertEq(readVal, vals[i]); - assertEq(retVal, vals[i]); - } - } -} - -contract StorageTest { - uint256 public exists = 1; - mapping(address => uint256) public map_addr; - mapping(uint256 => uint256) public map_uint; - mapping(address => uint256) public map_packed; - mapping(address => UnpackedStruct) public map_struct; - mapping(address => mapping(address => uint256)) public deep_map; - mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct; - UnpackedStruct public basic; - - uint248 public tA; - bool public tB; - - bool public tC = false; - uint248 public tD = 1; - - struct UnpackedStruct { - uint256 a; - uint256 b; - } - - mapping(address => bool) public map_bool; - - bytes32 public tE = hex"1337"; - address public tF = address(1337); - int256 public tG = type(int256).min; - bool public tH = true; - bytes32 private tI = ~bytes32(hex"1337"); - - uint256 randomPacking; - - constructor() { - basic = UnpackedStruct({a: 1337, b: 1337}); - - uint256 two = (1 << 128) | 1; - map_packed[msg.sender] = two; - map_packed[address(uint160(1337))] = 1 << 128; - } - - function read_struct_upper(address who) public view returns (uint256) { - return map_packed[who] >> 128; - } - - function read_struct_lower(address who) public view returns (uint256) { - return map_packed[who] & ((1 << 128) - 1); - } - - function hidden() public view returns (bytes32 t) { - bytes32 slot = keccak256("my.random.var"); - /// @solidity memory-safe-assembly - assembly { - t := sload(slot) - } - } - - function const() public pure returns (bytes32 t) { - t = bytes32(hex"1337"); - } - - function extra_sload() public view returns (bytes32 t) { - // trigger read on slot `tE`, and make a staticcall to make sure compiler doesn't optimize this SLOAD away - assembly { - pop(staticcall(gas(), sload(tE.slot), 0, 0, 0, 0)) - } - t = tI; - } - - function setRandomPacking(uint256 val) public { - randomPacking = val; - } - - function _getMask(uint256 size) internal pure returns (uint256 mask) { - assembly { - // mask = (1 << size) - 1 - mask := sub(shl(size, 1), 1) - } - } - - function setRandomPacking(uint256 val, uint256 size, uint256 offset) public { - // Generate mask based on the size of the value - uint256 mask = _getMask(size); - // Zero out all bits for the word we're about to set - uint256 cleanedWord = randomPacking & ~(mask << offset); - // Place val in the correct spot of the cleaned word - randomPacking = cleanedWord | val << offset; - } - - function getRandomPacked(uint256 size, uint256 offset) public view returns (uint256) { - // Generate mask based on the size of the value - uint256 mask = _getMask(size); - // Shift to place the bits in the correct position, and use mask to zero out remaining bits - return (randomPacking >> offset) & mask; - } - - function getRandomPacked(uint8 shifts, uint8[] memory shiftSizes, uint8 elem) public view returns (uint256) { - require(elem < shifts, "!elem"); - uint256 leftBits; - uint256 rightBits; - - for (uint256 i; i < shiftSizes.length; i++) { - if (i < elem) { - leftBits += shiftSizes[i]; - } else if (elem != i) { - rightBits += shiftSizes[i]; - } - } - - // we may have some right bits unaccounted for - leftBits += 256 - (leftBits + shiftSizes[elem] + rightBits); - - // clear left bits, then clear right bits and realign - return (randomPacking << leftBits) >> (leftBits + rightBits); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdStyle.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdStyle.t.sol deleted file mode 100644 index e12c005ff..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/StdStyle.t.sol +++ /dev/null @@ -1,110 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.7.0 <0.9.0; - -import "../src/Test.sol"; - -contract StdStyleTest is Test { - function test_StyleColor() public pure { - console2.log(StdStyle.red("StdStyle.red String Test")); - console2.log(StdStyle.red(uint256(10e18))); - console2.log(StdStyle.red(int256(-10e18))); - console2.log(StdStyle.red(true)); - console2.log(StdStyle.red(address(0))); - console2.log(StdStyle.redBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); - console2.log(StdStyle.redBytes32("StdStyle.redBytes32")); - console2.log(StdStyle.green("StdStyle.green String Test")); - console2.log(StdStyle.green(uint256(10e18))); - console2.log(StdStyle.green(int256(-10e18))); - console2.log(StdStyle.green(true)); - console2.log(StdStyle.green(address(0))); - console2.log(StdStyle.greenBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); - console2.log(StdStyle.greenBytes32("StdStyle.greenBytes32")); - console2.log(StdStyle.yellow("StdStyle.yellow String Test")); - console2.log(StdStyle.yellow(uint256(10e18))); - console2.log(StdStyle.yellow(int256(-10e18))); - console2.log(StdStyle.yellow(true)); - console2.log(StdStyle.yellow(address(0))); - console2.log(StdStyle.yellowBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); - console2.log(StdStyle.yellowBytes32("StdStyle.yellowBytes32")); - console2.log(StdStyle.blue("StdStyle.blue String Test")); - console2.log(StdStyle.blue(uint256(10e18))); - console2.log(StdStyle.blue(int256(-10e18))); - console2.log(StdStyle.blue(true)); - console2.log(StdStyle.blue(address(0))); - console2.log(StdStyle.blueBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); - console2.log(StdStyle.blueBytes32("StdStyle.blueBytes32")); - console2.log(StdStyle.magenta("StdStyle.magenta String Test")); - console2.log(StdStyle.magenta(uint256(10e18))); - console2.log(StdStyle.magenta(int256(-10e18))); - console2.log(StdStyle.magenta(true)); - console2.log(StdStyle.magenta(address(0))); - console2.log(StdStyle.magentaBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); - console2.log(StdStyle.magentaBytes32("StdStyle.magentaBytes32")); - console2.log(StdStyle.cyan("StdStyle.cyan String Test")); - console2.log(StdStyle.cyan(uint256(10e18))); - console2.log(StdStyle.cyan(int256(-10e18))); - console2.log(StdStyle.cyan(true)); - console2.log(StdStyle.cyan(address(0))); - console2.log(StdStyle.cyanBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); - console2.log(StdStyle.cyanBytes32("StdStyle.cyanBytes32")); - } - - function test_StyleFontWeight() public pure { - console2.log(StdStyle.bold("StdStyle.bold String Test")); - console2.log(StdStyle.bold(uint256(10e18))); - console2.log(StdStyle.bold(int256(-10e18))); - console2.log(StdStyle.bold(address(0))); - console2.log(StdStyle.bold(true)); - console2.log(StdStyle.boldBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); - console2.log(StdStyle.boldBytes32("StdStyle.boldBytes32")); - console2.log(StdStyle.dim("StdStyle.dim String Test")); - console2.log(StdStyle.dim(uint256(10e18))); - console2.log(StdStyle.dim(int256(-10e18))); - console2.log(StdStyle.dim(address(0))); - console2.log(StdStyle.dim(true)); - console2.log(StdStyle.dimBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); - console2.log(StdStyle.dimBytes32("StdStyle.dimBytes32")); - console2.log(StdStyle.italic("StdStyle.italic String Test")); - console2.log(StdStyle.italic(uint256(10e18))); - console2.log(StdStyle.italic(int256(-10e18))); - console2.log(StdStyle.italic(address(0))); - console2.log(StdStyle.italic(true)); - console2.log(StdStyle.italicBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); - console2.log(StdStyle.italicBytes32("StdStyle.italicBytes32")); - console2.log(StdStyle.underline("StdStyle.underline String Test")); - console2.log(StdStyle.underline(uint256(10e18))); - console2.log(StdStyle.underline(int256(-10e18))); - console2.log(StdStyle.underline(address(0))); - console2.log(StdStyle.underline(true)); - console2.log(StdStyle.underlineBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); - console2.log(StdStyle.underlineBytes32("StdStyle.underlineBytes32")); - console2.log(StdStyle.inverse("StdStyle.inverse String Test")); - console2.log(StdStyle.inverse(uint256(10e18))); - console2.log(StdStyle.inverse(int256(-10e18))); - console2.log(StdStyle.inverse(address(0))); - console2.log(StdStyle.inverse(true)); - console2.log(StdStyle.inverseBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); - console2.log(StdStyle.inverseBytes32("StdStyle.inverseBytes32")); - } - - function test_StyleCombined() public pure { - console2.log(StdStyle.red(StdStyle.bold("Red Bold String Test"))); - console2.log(StdStyle.green(StdStyle.dim(uint256(10e18)))); - console2.log(StdStyle.yellow(StdStyle.italic(int256(-10e18)))); - console2.log(StdStyle.blue(StdStyle.underline(address(0)))); - console2.log(StdStyle.magenta(StdStyle.inverse(true))); - } - - function test_StyleCustom() public pure { - console2.log(h1("Custom Style 1")); - console2.log(h2("Custom Style 2")); - } - - function h1(string memory a) private pure returns (string memory) { - return StdStyle.cyan(StdStyle.inverse(StdStyle.bold(a))); - } - - function h2(string memory a) private pure returns (string memory) { - return StdStyle.magenta(StdStyle.bold(StdStyle.underline(a))); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdToml.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdToml.t.sol deleted file mode 100644 index 631b1b534..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/StdToml.t.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.7.0 <0.9.0; - -import "../src/Test.sol"; - -contract StdTomlTest is Test { - using stdToml for string; - - string root; - string path; - - function setUp() public { - root = vm.projectRoot(); - path = string.concat(root, "/test/fixtures/test.toml"); - } - - struct SimpleToml { - uint256 a; - string b; - } - - struct NestedToml { - uint256 a; - string b; - SimpleToml c; - } - - function test_readToml() public view { - string memory json = vm.readFile(path); - assertEq(json.readUint(".a"), 123); - } - - function test_writeToml() public { - string memory json = "json"; - json.serialize("a", uint256(123)); - string memory semiFinal = json.serialize("b", string("test")); - string memory finalJson = json.serialize("c", semiFinal); - finalJson.write(path); - - string memory toml = vm.readFile(path); - bytes memory data = toml.parseRaw("$"); - NestedToml memory decodedData = abi.decode(data, (NestedToml)); - - assertEq(decodedData.a, 123); - assertEq(decodedData.b, "test"); - assertEq(decodedData.c.a, 123); - assertEq(decodedData.c.b, "test"); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/StdUtils.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/StdUtils.t.sol deleted file mode 100644 index 4994c6cb0..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/StdUtils.t.sol +++ /dev/null @@ -1,342 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.7.0 <0.9.0; - -import "../src/Test.sol"; - -contract StdUtilsMock is StdUtils { - // We deploy a mock version so we can properly test expected reverts. - function exposed_getTokenBalances(address token, address[] memory addresses) - external - returns (uint256[] memory balances) - { - return getTokenBalances(token, addresses); - } - - function exposed_bound(int256 num, int256 min, int256 max) external pure returns (int256) { - return bound(num, min, max); - } - - function exposed_bound(uint256 num, uint256 min, uint256 max) external pure returns (uint256) { - return bound(num, min, max); - } - - function exposed_bytesToUint(bytes memory b) external pure returns (uint256) { - return bytesToUint(b); - } -} - -contract StdUtilsTest is Test { - /*////////////////////////////////////////////////////////////////////////// - BOUND UINT - //////////////////////////////////////////////////////////////////////////*/ - - function test_Bound() public pure { - assertEq(bound(uint256(5), 0, 4), 0); - assertEq(bound(uint256(0), 69, 69), 69); - assertEq(bound(uint256(0), 68, 69), 68); - assertEq(bound(uint256(10), 150, 190), 174); - assertEq(bound(uint256(300), 2800, 3200), 3107); - assertEq(bound(uint256(9999), 1337, 6666), 4669); - } - - function test_Bound_WithinRange() public pure { - assertEq(bound(uint256(51), 50, 150), 51); - assertEq(bound(uint256(51), 50, 150), bound(bound(uint256(51), 50, 150), 50, 150)); - assertEq(bound(uint256(149), 50, 150), 149); - assertEq(bound(uint256(149), 50, 150), bound(bound(uint256(149), 50, 150), 50, 150)); - } - - function test_Bound_EdgeCoverage() public pure { - assertEq(bound(uint256(0), 50, 150), 50); - assertEq(bound(uint256(1), 50, 150), 51); - assertEq(bound(uint256(2), 50, 150), 52); - assertEq(bound(uint256(3), 50, 150), 53); - assertEq(bound(type(uint256).max, 50, 150), 150); - assertEq(bound(type(uint256).max - 1, 50, 150), 149); - assertEq(bound(type(uint256).max - 2, 50, 150), 148); - assertEq(bound(type(uint256).max - 3, 50, 150), 147); - } - - function test_Bound_DistributionIsEven(uint256 min, uint256 size) public pure { - size = size % 100 + 1; - min = bound(min, UINT256_MAX / 2, UINT256_MAX / 2 + size); - uint256 max = min + size - 1; - uint256 result; - - for (uint256 i = 1; i <= size * 4; ++i) { - // x > max - result = bound(max + i, min, max); - assertEq(result, min + (i - 1) % size); - // x < min - result = bound(min - i, min, max); - assertEq(result, max - (i - 1) % size); - } - } - - function test_Bound(uint256 num, uint256 min, uint256 max) public pure { - if (min > max) (min, max) = (max, min); - - uint256 result = bound(num, min, max); - - assertGe(result, min); - assertLe(result, max); - assertEq(result, bound(result, min, max)); - if (num >= min && num <= max) assertEq(result, num); - } - - function test_BoundUint256Max() public pure { - assertEq(bound(0, type(uint256).max - 1, type(uint256).max), type(uint256).max - 1); - assertEq(bound(1, type(uint256).max - 1, type(uint256).max), type(uint256).max); - } - - function test_CannotBoundMaxLessThanMin() public { - // We deploy a mock version so we can properly test the revert. - StdUtilsMock stdUtils = new StdUtilsMock(); - - vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min.")); - stdUtils.exposed_bound(uint256(5), 100, 10); - } - - function test_CannotBoundMaxLessThanMin(uint256 num, uint256 min, uint256 max) public { - // We deploy a mock version so we can properly test the revert. - StdUtilsMock stdUtils = new StdUtilsMock(); - - vm.assume(min > max); - vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min.")); - stdUtils.exposed_bound(num, min, max); - } - - /*////////////////////////////////////////////////////////////////////////// - BOUND INT - //////////////////////////////////////////////////////////////////////////*/ - - function test_BoundInt() public pure { - assertEq(bound(-3, 0, 4), 2); - assertEq(bound(0, -69, -69), -69); - assertEq(bound(0, -69, -68), -68); - assertEq(bound(-10, 150, 190), 154); - assertEq(bound(-300, 2800, 3200), 2908); - assertEq(bound(9999, -1337, 6666), 1995); - } - - function test_BoundInt_WithinRange() public pure { - assertEq(bound(51, -50, 150), 51); - assertEq(bound(51, -50, 150), bound(bound(51, -50, 150), -50, 150)); - assertEq(bound(149, -50, 150), 149); - assertEq(bound(149, -50, 150), bound(bound(149, -50, 150), -50, 150)); - } - - function test_BoundInt_EdgeCoverage() public pure { - assertEq(bound(type(int256).min, -50, 150), -50); - assertEq(bound(type(int256).min + 1, -50, 150), -49); - assertEq(bound(type(int256).min + 2, -50, 150), -48); - assertEq(bound(type(int256).min + 3, -50, 150), -47); - assertEq(bound(type(int256).min, 10, 150), 10); - assertEq(bound(type(int256).min + 1, 10, 150), 11); - assertEq(bound(type(int256).min + 2, 10, 150), 12); - assertEq(bound(type(int256).min + 3, 10, 150), 13); - - assertEq(bound(type(int256).max, -50, 150), 150); - assertEq(bound(type(int256).max - 1, -50, 150), 149); - assertEq(bound(type(int256).max - 2, -50, 150), 148); - assertEq(bound(type(int256).max - 3, -50, 150), 147); - assertEq(bound(type(int256).max, -50, -10), -10); - assertEq(bound(type(int256).max - 1, -50, -10), -11); - assertEq(bound(type(int256).max - 2, -50, -10), -12); - assertEq(bound(type(int256).max - 3, -50, -10), -13); - } - - function test_BoundInt_DistributionIsEven(int256 min, uint256 size) public pure { - size = size % 100 + 1; - min = bound(min, -int256(size / 2), int256(size - size / 2)); - int256 max = min + int256(size) - 1; - int256 result; - - for (uint256 i = 1; i <= size * 4; ++i) { - // x > max - result = bound(max + int256(i), min, max); - assertEq(result, min + int256((i - 1) % size)); - // x < min - result = bound(min - int256(i), min, max); - assertEq(result, max - int256((i - 1) % size)); - } - } - - function test_BoundInt(int256 num, int256 min, int256 max) public pure { - if (min > max) (min, max) = (max, min); - - int256 result = bound(num, min, max); - - assertGe(result, min); - assertLe(result, max); - assertEq(result, bound(result, min, max)); - if (num >= min && num <= max) assertEq(result, num); - } - - function test_BoundIntInt256Max() public pure { - assertEq(bound(0, type(int256).max - 1, type(int256).max), type(int256).max - 1); - assertEq(bound(1, type(int256).max - 1, type(int256).max), type(int256).max); - } - - function test_BoundIntInt256Min() public pure { - assertEq(bound(0, type(int256).min, type(int256).min + 1), type(int256).min); - assertEq(bound(1, type(int256).min, type(int256).min + 1), type(int256).min + 1); - } - - function test_CannotBoundIntMaxLessThanMin() public { - // We deploy a mock version so we can properly test the revert. - StdUtilsMock stdUtils = new StdUtilsMock(); - - vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min.")); - stdUtils.exposed_bound(-5, 100, 10); - } - - function test_CannotBoundIntMaxLessThanMin(int256 num, int256 min, int256 max) public { - // We deploy a mock version so we can properly test the revert. - StdUtilsMock stdUtils = new StdUtilsMock(); - - vm.assume(min > max); - vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min.")); - stdUtils.exposed_bound(num, min, max); - } - - /*////////////////////////////////////////////////////////////////////////// - BOUND PRIVATE KEY - //////////////////////////////////////////////////////////////////////////*/ - - function test_BoundPrivateKey() public pure { - assertEq(boundPrivateKey(0), 1); - assertEq(boundPrivateKey(1), 1); - assertEq(boundPrivateKey(300), 300); - assertEq(boundPrivateKey(9999), 9999); - assertEq(boundPrivateKey(SECP256K1_ORDER - 1), SECP256K1_ORDER - 1); - assertEq(boundPrivateKey(SECP256K1_ORDER), 1); - assertEq(boundPrivateKey(SECP256K1_ORDER + 1), 2); - assertEq(boundPrivateKey(UINT256_MAX), UINT256_MAX & SECP256K1_ORDER - 1); // x&y is equivalent to x-x%y - } - - /*////////////////////////////////////////////////////////////////////////// - BYTES TO UINT - //////////////////////////////////////////////////////////////////////////*/ - - function test_BytesToUint() external pure { - bytes memory maxUint = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; - bytes memory two = hex"02"; - bytes memory millionEther = hex"d3c21bcecceda1000000"; - - assertEq(bytesToUint(maxUint), type(uint256).max); - assertEq(bytesToUint(two), 2); - assertEq(bytesToUint(millionEther), 1_000_000 ether); - } - - function test_CannotConvertGT32Bytes() external { - // We deploy a mock version so we can properly test the revert. - StdUtilsMock stdUtils = new StdUtilsMock(); - - bytes memory thirty3Bytes = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; - vm.expectRevert("StdUtils bytesToUint(bytes): Bytes length exceeds 32."); - stdUtils.exposed_bytesToUint(thirty3Bytes); - } - - /*////////////////////////////////////////////////////////////////////////// - COMPUTE CREATE ADDRESS - //////////////////////////////////////////////////////////////////////////*/ - - function test_ComputeCreateAddress() external pure { - address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9; - uint256 nonce = 14; - address createAddress = computeCreateAddress(deployer, nonce); - assertEq(createAddress, 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45); - } - - /*////////////////////////////////////////////////////////////////////////// - COMPUTE CREATE2 ADDRESS - //////////////////////////////////////////////////////////////////////////*/ - - function test_ComputeCreate2Address() external pure { - bytes32 salt = bytes32(uint256(31415)); - bytes32 initcodeHash = keccak256(abi.encode(0x6080)); - address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9; - address create2Address = computeCreate2Address(salt, initcodeHash, deployer); - assertEq(create2Address, 0xB147a5d25748fda14b463EB04B111027C290f4d3); - } - - function test_ComputeCreate2AddressWithDefaultDeployer() external pure { - bytes32 salt = 0xc290c670fde54e5ef686f9132cbc8711e76a98f0333a438a92daa442c71403c0; - bytes32 initcodeHash = hashInitCode(hex"6080", ""); - assertEq(initcodeHash, 0x1a578b7a4b0b5755db6d121b4118d4bc68fe170dca840c59bc922f14175a76b0); - address create2Address = computeCreate2Address(salt, initcodeHash); - assertEq(create2Address, 0xc0ffEe2198a06235aAbFffe5Db0CacF1717f5Ac6); - } -} - -contract StdUtilsForkTest is Test { - /*////////////////////////////////////////////////////////////////////////// - GET TOKEN BALANCES - //////////////////////////////////////////////////////////////////////////*/ - - address internal SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE; - address internal SHIB_HOLDER_0 = 0x855F5981e831D83e6A4b4EBFCAdAa68D92333170; - address internal SHIB_HOLDER_1 = 0x8F509A90c2e47779cA408Fe00d7A72e359229AdA; - address internal SHIB_HOLDER_2 = 0x0e3bbc0D04fF62211F71f3e4C45d82ad76224385; - - address internal USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; - address internal USDC_HOLDER_0 = 0xDa9CE944a37d218c3302F6B82a094844C6ECEb17; - address internal USDC_HOLDER_1 = 0x3e67F4721E6d1c41a015f645eFa37BEd854fcf52; - - function setUp() public { - // All tests of the `getTokenBalances` method are fork tests using live contracts. - vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900}); - } - - function test_CannotGetTokenBalances_NonTokenContract() external { - // We deploy a mock version so we can properly test the revert. - StdUtilsMock stdUtils = new StdUtilsMock(); - - // The UniswapV2Factory contract has neither a `balanceOf` function nor a fallback function, - // so the `balanceOf` call should revert. - address token = address(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f); - address[] memory addresses = new address[](1); - addresses[0] = USDC_HOLDER_0; - - vm.expectRevert("Multicall3: call failed"); - stdUtils.exposed_getTokenBalances(token, addresses); - } - - function test_CannotGetTokenBalances_EOA() external { - // We deploy a mock version so we can properly test the revert. - StdUtilsMock stdUtils = new StdUtilsMock(); - - address eoa = vm.addr({privateKey: 1}); - address[] memory addresses = new address[](1); - addresses[0] = USDC_HOLDER_0; - vm.expectRevert("StdUtils getTokenBalances(address,address[]): Token address is not a contract."); - stdUtils.exposed_getTokenBalances(eoa, addresses); - } - - function test_GetTokenBalances_Empty() external { - address[] memory addresses = new address[](0); - uint256[] memory balances = getTokenBalances(USDC, addresses); - assertEq(balances.length, 0); - } - - function test_GetTokenBalances_USDC() external { - address[] memory addresses = new address[](2); - addresses[0] = USDC_HOLDER_0; - addresses[1] = USDC_HOLDER_1; - uint256[] memory balances = getTokenBalances(USDC, addresses); - assertEq(balances[0], 159_000_000_000_000); - assertEq(balances[1], 131_350_000_000_000); - } - - function test_GetTokenBalances_SHIB() external { - address[] memory addresses = new address[](3); - addresses[0] = SHIB_HOLDER_0; - addresses[1] = SHIB_HOLDER_1; - addresses[2] = SHIB_HOLDER_2; - uint256[] memory balances = getTokenBalances(SHIB, addresses); - assertEq(balances[0], 3_323_256_285_484.42e18); - assertEq(balances[1], 1_271_702_771_149.99999928e18); - assertEq(balances[2], 606_357_106_247e18); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/Vm.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/Vm.t.sol deleted file mode 100644 index 6f380ed02..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/Vm.t.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.0 <0.9.0; - -import {Test} from "../src/Test.sol"; -import {Vm, VmSafe} from "../src/Vm.sol"; - -contract VmTest is Test { - // This test ensures that functions are never accidentally removed from a Vm interface, or - // inadvertently moved between Vm and VmSafe. This test must be updated each time a function is - // added to or removed from Vm or VmSafe. - function test_interfaceId() public pure { - assertEq(type(VmSafe).interfaceId, bytes4(0x1c17c241), "VmSafe"); - assertEq(type(Vm).interfaceId, bytes4(0xb91a22ba), "Vm"); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScript.sol b/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScript.sol deleted file mode 100644 index e205cfff3..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScript.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -import "../../src/Script.sol"; - -// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing -// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 -contract CompilationScript is Script {} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol b/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol deleted file mode 100644 index ce8e0e954..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -import "../../src/Script.sol"; - -// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing -// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 -contract CompilationScriptBase is ScriptBase {} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTest.sol b/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTest.sol deleted file mode 100644 index 9beeafeb7..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTest.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -import "../../src/Test.sol"; - -// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing -// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 -contract CompilationTest is Test {} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTestBase.sol b/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTestBase.sol deleted file mode 100644 index e993535bc..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/compilation/CompilationTestBase.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.6.2 <0.9.0; - -pragma experimental ABIEncoderV2; - -import "../../src/Test.sol"; - -// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing -// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 -contract CompilationTestBase is TestBase {} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/broadcast.log.json b/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/broadcast.log.json deleted file mode 100644 index 0a0200bca..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/broadcast.log.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - "transactions": [ - { - "hash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f", - "type": "CALL", - "contractName": "Test", - "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "function": "multiple_arguments(uint256,address,uint256[]):(uint256)", - "arguments": ["1", "0000000000000000000000000000000000001337", "[3,4]"], - "tx": { - "type": "0x02", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "gas": "0x73b9", - "value": "0x0", - "data": "0x23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004", - "nonce": "0x3", - "accessList": [] - } - }, - { - "hash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298", - "type": "CALL", - "contractName": "Test", - "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "function": "inc():(uint256)", - "arguments": [], - "tx": { - "type": "0x02", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "gas": "0xdcb2", - "value": "0x0", - "data": "0x371303c0", - "nonce": "0x4", - "accessList": [] - } - }, - { - "hash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", - "type": "CALL", - "contractName": "Test", - "contractAddress": "0x7c6b4bbe207d642d98d5c537142d85209e585087", - "function": "t(uint256):(uint256)", - "arguments": ["1"], - "tx": { - "type": "0x02", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087", - "gas": "0x8599", - "value": "0x0", - "data": "0xafe29f710000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x5", - "accessList": [] - } - } - ], - "receipts": [ - { - "transactionHash": "0x481dc86e40bba90403c76f8e144aa9ff04c1da2164299d0298573835f0991181", - "transactionIndex": "0x0", - "blockHash": "0xef0730448490304e5403be0fa8f8ce64f118e9adcca60c07a2ae1ab921d748af", - "blockNumber": "0x1", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": null, - "cumulativeGasUsed": "0x13f3a", - "gasUsed": "0x13f3a", - "contractAddress": "0x5fbdb2315678afecb367f032d93f642f64180aa3", - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0x6a187183545b8a9e7f1790e847139379bf5622baff2cb43acf3f5c79470af782", - "transactionIndex": "0x0", - "blockHash": "0xf3acb96a90071640c2a8c067ae4e16aad87e634ea8d8bbbb5b352fba86ba0148", - "blockNumber": "0x2", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": null, - "cumulativeGasUsed": "0x45d80", - "gasUsed": "0x45d80", - "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0x064ad173b4867bdef2fb60060bbdaf01735fbf10414541ea857772974e74ea9d", - "transactionIndex": "0x0", - "blockHash": "0x8373d02109d3ee06a0225f23da4c161c656ccc48fe0fcee931d325508ae73e58", - "blockNumber": "0x3", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "cumulativeGasUsed": "0x45feb", - "gasUsed": "0x45feb", - "contractAddress": null, - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f", - "transactionIndex": "0x0", - "blockHash": "0x16712fae5c0e18f75045f84363fb6b4d9a9fe25e660c4ce286833a533c97f629", - "blockNumber": "0x4", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "cumulativeGasUsed": "0x5905", - "gasUsed": "0x5905", - "contractAddress": null, - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298", - "transactionIndex": "0x0", - "blockHash": "0x156b88c3eb9a1244ba00a1834f3f70de735b39e3e59006dd03af4fe7d5480c11", - "blockNumber": "0x5", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "cumulativeGasUsed": "0xa9c4", - "gasUsed": "0xa9c4", - "contractAddress": null, - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", - "transactionIndex": "0x0", - "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb", - "blockNumber": "0x6", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087", - "cumulativeGasUsed": "0x66c5", - "gasUsed": "0x66c5", - "contractAddress": null, - "logs": [ - { - "address": "0x7c6b4bbe207d642d98d5c537142d85209e585087", - "topics": [ - "0x0b2e13ff20ac7b474198655583edf70dedd2c1dc980e329c4fbb2fc0748b796b" - ], - "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046865726500000000000000000000000000000000000000000000000000000000", - "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb", - "blockNumber": "0x6", - "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", - "transactionIndex": "0x1", - "logIndex": "0x0", - "transactionLogIndex": "0x0", - "removed": false - } - ], - "status": "0x1", - "logsBloom": "0x00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100", - "effectiveGasPrice": "0xee6b2800" - }, - { - "transactionHash": "0x11fbb10230c168ca1e36a7e5c69a6dbcd04fd9e64ede39d10a83e36ee8065c16", - "transactionIndex": "0x0", - "blockHash": "0xf1e0ed2eda4e923626ec74621006ed50b3fc27580dc7b4cf68a07ca77420e29c", - "blockNumber": "0x7", - "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "to": "0x0000000000000000000000000000000000001337", - "cumulativeGasUsed": "0x5208", - "gasUsed": "0x5208", - "contractAddress": null, - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "effectiveGasPrice": "0xee6b2800" - } - ], - "libraries": [ - "src/Broadcast.t.sol:F:0x5fbdb2315678afecb367f032d93f642f64180aa3" - ], - "pending": [], - "path": "broadcast/Broadcast.t.sol/31337/run-latest.json", - "returns": {}, - "timestamp": 1655140035 -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.json b/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.json deleted file mode 100644 index caebf6d96..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "a": 123, - "b": "test", - "c": { - "a": 123, - "b": "test" - } -} \ No newline at end of file diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.toml b/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.toml deleted file mode 100644 index 60692bc75..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/fixtures/test.toml +++ /dev/null @@ -1,6 +0,0 @@ -a = 123 -b = "test" - -[c] -a = 123 -b = "test" diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC20.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC20.t.sol deleted file mode 100644 index e24681093..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC20.t.sol +++ /dev/null @@ -1,441 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.7.0 <0.9.0; - -import {MockERC20} from "../../src/mocks/MockERC20.sol"; -import {StdCheats} from "../../src/StdCheats.sol"; -import {Test} from "../../src/Test.sol"; - -contract Token_ERC20 is MockERC20 { - constructor(string memory name, string memory symbol, uint8 decimals) { - initialize(name, symbol, decimals); - } - - function mint(address to, uint256 value) public virtual { - _mint(to, value); - } - - function burn(address from, uint256 value) public virtual { - _burn(from, value); - } -} - -contract MockERC20Test is StdCheats, Test { - Token_ERC20 token; - - bytes32 constant PERMIT_TYPEHASH = - keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); - - function setUp() public { - token = new Token_ERC20("Token", "TKN", 18); - } - - function invariantMetadata() public view { - assertEq(token.name(), "Token"); - assertEq(token.symbol(), "TKN"); - assertEq(token.decimals(), 18); - } - - function testMint() public { - token.mint(address(0xBEEF), 1e18); - - assertEq(token.totalSupply(), 1e18); - assertEq(token.balanceOf(address(0xBEEF)), 1e18); - } - - function testBurn() public { - token.mint(address(0xBEEF), 1e18); - token.burn(address(0xBEEF), 0.9e18); - - assertEq(token.totalSupply(), 1e18 - 0.9e18); - assertEq(token.balanceOf(address(0xBEEF)), 0.1e18); - } - - function testApprove() public { - assertTrue(token.approve(address(0xBEEF), 1e18)); - - assertEq(token.allowance(address(this), address(0xBEEF)), 1e18); - } - - function testTransfer() public { - token.mint(address(this), 1e18); - - assertTrue(token.transfer(address(0xBEEF), 1e18)); - assertEq(token.totalSupply(), 1e18); - - assertEq(token.balanceOf(address(this)), 0); - assertEq(token.balanceOf(address(0xBEEF)), 1e18); - } - - function testTransferFrom() public { - address from = address(0xABCD); - - token.mint(from, 1e18); - - vm.prank(from); - token.approve(address(this), 1e18); - - assertTrue(token.transferFrom(from, address(0xBEEF), 1e18)); - assertEq(token.totalSupply(), 1e18); - - assertEq(token.allowance(from, address(this)), 0); - - assertEq(token.balanceOf(from), 0); - assertEq(token.balanceOf(address(0xBEEF)), 1e18); - } - - function testInfiniteApproveTransferFrom() public { - address from = address(0xABCD); - - token.mint(from, 1e18); - - vm.prank(from); - token.approve(address(this), type(uint256).max); - - assertTrue(token.transferFrom(from, address(0xBEEF), 1e18)); - assertEq(token.totalSupply(), 1e18); - - assertEq(token.allowance(from, address(this)), type(uint256).max); - - assertEq(token.balanceOf(from), 0); - assertEq(token.balanceOf(address(0xBEEF)), 1e18); - } - - function testPermit() public { - uint256 privateKey = 0xBEEF; - address owner = vm.addr(privateKey); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign( - privateKey, - keccak256( - abi.encodePacked( - "\x19\x01", - token.DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, address(0xCAFE), 1e18, 0, block.timestamp)) - ) - ) - ); - - token.permit(owner, address(0xCAFE), 1e18, block.timestamp, v, r, s); - - assertEq(token.allowance(owner, address(0xCAFE)), 1e18); - assertEq(token.nonces(owner), 1); - } - - function testFailTransferInsufficientBalance() public { - token.mint(address(this), 0.9e18); - token.transfer(address(0xBEEF), 1e18); - } - - function testFailTransferFromInsufficientAllowance() public { - address from = address(0xABCD); - - token.mint(from, 1e18); - - vm.prank(from); - token.approve(address(this), 0.9e18); - - token.transferFrom(from, address(0xBEEF), 1e18); - } - - function testFailTransferFromInsufficientBalance() public { - address from = address(0xABCD); - - token.mint(from, 0.9e18); - - vm.prank(from); - token.approve(address(this), 1e18); - - token.transferFrom(from, address(0xBEEF), 1e18); - } - - function testFailPermitBadNonce() public { - uint256 privateKey = 0xBEEF; - address owner = vm.addr(privateKey); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign( - privateKey, - keccak256( - abi.encodePacked( - "\x19\x01", - token.DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, address(0xCAFE), 1e18, 1, block.timestamp)) - ) - ) - ); - - token.permit(owner, address(0xCAFE), 1e18, block.timestamp, v, r, s); - } - - function testFailPermitBadDeadline() public { - uint256 privateKey = 0xBEEF; - address owner = vm.addr(privateKey); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign( - privateKey, - keccak256( - abi.encodePacked( - "\x19\x01", - token.DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, address(0xCAFE), 1e18, 0, block.timestamp)) - ) - ) - ); - - token.permit(owner, address(0xCAFE), 1e18, block.timestamp + 1, v, r, s); - } - - function testFailPermitPastDeadline() public { - uint256 oldTimestamp = block.timestamp; - uint256 privateKey = 0xBEEF; - address owner = vm.addr(privateKey); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign( - privateKey, - keccak256( - abi.encodePacked( - "\x19\x01", - token.DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, address(0xCAFE), 1e18, 0, oldTimestamp)) - ) - ) - ); - - vm.warp(block.timestamp + 1); - token.permit(owner, address(0xCAFE), 1e18, oldTimestamp, v, r, s); - } - - function testFailPermitReplay() public { - uint256 privateKey = 0xBEEF; - address owner = vm.addr(privateKey); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign( - privateKey, - keccak256( - abi.encodePacked( - "\x19\x01", - token.DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, address(0xCAFE), 1e18, 0, block.timestamp)) - ) - ) - ); - - token.permit(owner, address(0xCAFE), 1e18, block.timestamp, v, r, s); - token.permit(owner, address(0xCAFE), 1e18, block.timestamp, v, r, s); - } - - function testMetadata(string calldata name, string calldata symbol, uint8 decimals) public { - Token_ERC20 tkn = new Token_ERC20(name, symbol, decimals); - assertEq(tkn.name(), name); - assertEq(tkn.symbol(), symbol); - assertEq(tkn.decimals(), decimals); - } - - function testMint(address from, uint256 amount) public { - token.mint(from, amount); - - assertEq(token.totalSupply(), amount); - assertEq(token.balanceOf(from), amount); - } - - function testBurn(address from, uint256 mintAmount, uint256 burnAmount) public { - burnAmount = bound(burnAmount, 0, mintAmount); - - token.mint(from, mintAmount); - token.burn(from, burnAmount); - - assertEq(token.totalSupply(), mintAmount - burnAmount); - assertEq(token.balanceOf(from), mintAmount - burnAmount); - } - - function testApprove(address to, uint256 amount) public { - assertTrue(token.approve(to, amount)); - - assertEq(token.allowance(address(this), to), amount); - } - - function testTransfer(address from, uint256 amount) public { - token.mint(address(this), amount); - - assertTrue(token.transfer(from, amount)); - assertEq(token.totalSupply(), amount); - - if (address(this) == from) { - assertEq(token.balanceOf(address(this)), amount); - } else { - assertEq(token.balanceOf(address(this)), 0); - assertEq(token.balanceOf(from), amount); - } - } - - function testTransferFrom(address to, uint256 approval, uint256 amount) public { - amount = bound(amount, 0, approval); - - address from = address(0xABCD); - - token.mint(from, amount); - - vm.prank(from); - token.approve(address(this), approval); - - assertTrue(token.transferFrom(from, to, amount)); - assertEq(token.totalSupply(), amount); - - uint256 app = from == address(this) || approval == type(uint256).max ? approval : approval - amount; - assertEq(token.allowance(from, address(this)), app); - - if (from == to) { - assertEq(token.balanceOf(from), amount); - } else { - assertEq(token.balanceOf(from), 0); - assertEq(token.balanceOf(to), amount); - } - } - - function testPermit(uint248 privKey, address to, uint256 amount, uint256 deadline) public { - uint256 privateKey = privKey; - if (deadline < block.timestamp) deadline = block.timestamp; - if (privateKey == 0) privateKey = 1; - - address owner = vm.addr(privateKey); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign( - privateKey, - keccak256( - abi.encodePacked( - "\x19\x01", - token.DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, to, amount, 0, deadline)) - ) - ) - ); - - token.permit(owner, to, amount, deadline, v, r, s); - - assertEq(token.allowance(owner, to), amount); - assertEq(token.nonces(owner), 1); - } - - function testFailBurnInsufficientBalance(address to, uint256 mintAmount, uint256 burnAmount) public { - burnAmount = bound(burnAmount, mintAmount + 1, type(uint256).max); - - token.mint(to, mintAmount); - token.burn(to, burnAmount); - } - - function testFailTransferInsufficientBalance(address to, uint256 mintAmount, uint256 sendAmount) public { - sendAmount = bound(sendAmount, mintAmount + 1, type(uint256).max); - - token.mint(address(this), mintAmount); - token.transfer(to, sendAmount); - } - - function testFailTransferFromInsufficientAllowance(address to, uint256 approval, uint256 amount) public { - amount = bound(amount, approval + 1, type(uint256).max); - - address from = address(0xABCD); - - token.mint(from, amount); - - vm.prank(from); - token.approve(address(this), approval); - - token.transferFrom(from, to, amount); - } - - function testFailTransferFromInsufficientBalance(address to, uint256 mintAmount, uint256 sendAmount) public { - sendAmount = bound(sendAmount, mintAmount + 1, type(uint256).max); - - address from = address(0xABCD); - - token.mint(from, mintAmount); - - vm.prank(from); - token.approve(address(this), sendAmount); - - token.transferFrom(from, to, sendAmount); - } - - function testFailPermitBadNonce(uint256 privateKey, address to, uint256 amount, uint256 deadline, uint256 nonce) - public - { - if (deadline < block.timestamp) deadline = block.timestamp; - if (privateKey == 0) privateKey = 1; - if (nonce == 0) nonce = 1; - - address owner = vm.addr(privateKey); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign( - privateKey, - keccak256( - abi.encodePacked( - "\x19\x01", - token.DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, to, amount, nonce, deadline)) - ) - ) - ); - - token.permit(owner, to, amount, deadline, v, r, s); - } - - function testFailPermitBadDeadline(uint256 privateKey, address to, uint256 amount, uint256 deadline) public { - if (deadline < block.timestamp) deadline = block.timestamp; - if (privateKey == 0) privateKey = 1; - - address owner = vm.addr(privateKey); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign( - privateKey, - keccak256( - abi.encodePacked( - "\x19\x01", - token.DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, to, amount, 0, deadline)) - ) - ) - ); - - token.permit(owner, to, amount, deadline + 1, v, r, s); - } - - function testFailPermitPastDeadline(uint256 privateKey, address to, uint256 amount, uint256 deadline) public { - deadline = bound(deadline, 0, block.timestamp - 1); - if (privateKey == 0) privateKey = 1; - - address owner = vm.addr(privateKey); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign( - privateKey, - keccak256( - abi.encodePacked( - "\x19\x01", - token.DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, to, amount, 0, deadline)) - ) - ) - ); - - token.permit(owner, to, amount, deadline, v, r, s); - } - - function testFailPermitReplay(uint256 privateKey, address to, uint256 amount, uint256 deadline) public { - if (deadline < block.timestamp) deadline = block.timestamp; - if (privateKey == 0) privateKey = 1; - - address owner = vm.addr(privateKey); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign( - privateKey, - keccak256( - abi.encodePacked( - "\x19\x01", - token.DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, to, amount, 0, deadline)) - ) - ) - ); - - token.permit(owner, to, amount, deadline, v, r, s); - token.permit(owner, to, amount, deadline, v, r, s); - } -} diff --git a/examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC721.t.sol b/examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC721.t.sol deleted file mode 100644 index f986d7967..000000000 --- a/examples/validating-public-input/contracts/lib/forge-std/test/mocks/MockERC721.t.sol +++ /dev/null @@ -1,721 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.7.0 <0.9.0; - -import {MockERC721, IERC721TokenReceiver} from "../../src/mocks/MockERC721.sol"; -import {StdCheats} from "../../src/StdCheats.sol"; -import {Test} from "../../src/Test.sol"; - -contract ERC721Recipient is IERC721TokenReceiver { - address public operator; - address public from; - uint256 public id; - bytes public data; - - function onERC721Received(address _operator, address _from, uint256 _id, bytes calldata _data) - public - virtual - override - returns (bytes4) - { - operator = _operator; - from = _from; - id = _id; - data = _data; - - return IERC721TokenReceiver.onERC721Received.selector; - } -} - -contract RevertingERC721Recipient is IERC721TokenReceiver { - function onERC721Received(address, address, uint256, bytes calldata) public virtual override returns (bytes4) { - revert(string(abi.encodePacked(IERC721TokenReceiver.onERC721Received.selector))); - } -} - -contract WrongReturnDataERC721Recipient is IERC721TokenReceiver { - function onERC721Received(address, address, uint256, bytes calldata) public virtual override returns (bytes4) { - return 0xCAFEBEEF; - } -} - -contract NonERC721Recipient {} - -contract Token_ERC721 is MockERC721 { - constructor(string memory _name, string memory _symbol) { - initialize(_name, _symbol); - } - - function tokenURI(uint256) public pure virtual override returns (string memory) {} - - function mint(address to, uint256 tokenId) public virtual { - _mint(to, tokenId); - } - - function burn(uint256 tokenId) public virtual { - _burn(tokenId); - } - - function safeMint(address to, uint256 tokenId) public virtual { - _safeMint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId, bytes memory data) public virtual { - _safeMint(to, tokenId, data); - } -} - -contract MockERC721Test is StdCheats, Test { - Token_ERC721 token; - - function setUp() public { - token = new Token_ERC721("Token", "TKN"); - } - - function invariantMetadata() public view { - assertEq(token.name(), "Token"); - assertEq(token.symbol(), "TKN"); - } - - function testMint() public { - token.mint(address(0xBEEF), 1337); - - assertEq(token.balanceOf(address(0xBEEF)), 1); - assertEq(token.ownerOf(1337), address(0xBEEF)); - } - - function testBurn() public { - token.mint(address(0xBEEF), 1337); - token.burn(1337); - - assertEq(token.balanceOf(address(0xBEEF)), 0); - - vm.expectRevert("NOT_MINTED"); - token.ownerOf(1337); - } - - function testApprove() public { - token.mint(address(this), 1337); - - token.approve(address(0xBEEF), 1337); - - assertEq(token.getApproved(1337), address(0xBEEF)); - } - - function testApproveBurn() public { - token.mint(address(this), 1337); - - token.approve(address(0xBEEF), 1337); - - token.burn(1337); - - assertEq(token.balanceOf(address(this)), 0); - assertEq(token.getApproved(1337), address(0)); - - vm.expectRevert("NOT_MINTED"); - token.ownerOf(1337); - } - - function testApproveAll() public { - token.setApprovalForAll(address(0xBEEF), true); - - assertTrue(token.isApprovedForAll(address(this), address(0xBEEF))); - } - - function testTransferFrom() public { - address from = address(0xABCD); - - token.mint(from, 1337); - - vm.prank(from); - token.approve(address(this), 1337); - - token.transferFrom(from, address(0xBEEF), 1337); - - assertEq(token.getApproved(1337), address(0)); - assertEq(token.ownerOf(1337), address(0xBEEF)); - assertEq(token.balanceOf(address(0xBEEF)), 1); - assertEq(token.balanceOf(from), 0); - } - - function testTransferFromSelf() public { - token.mint(address(this), 1337); - - token.transferFrom(address(this), address(0xBEEF), 1337); - - assertEq(token.getApproved(1337), address(0)); - assertEq(token.ownerOf(1337), address(0xBEEF)); - assertEq(token.balanceOf(address(0xBEEF)), 1); - assertEq(token.balanceOf(address(this)), 0); - } - - function testTransferFromApproveAll() public { - address from = address(0xABCD); - - token.mint(from, 1337); - - vm.prank(from); - token.setApprovalForAll(address(this), true); - - token.transferFrom(from, address(0xBEEF), 1337); - - assertEq(token.getApproved(1337), address(0)); - assertEq(token.ownerOf(1337), address(0xBEEF)); - assertEq(token.balanceOf(address(0xBEEF)), 1); - assertEq(token.balanceOf(from), 0); - } - - function testSafeTransferFromToEOA() public { - address from = address(0xABCD); - - token.mint(from, 1337); - - vm.prank(from); - token.setApprovalForAll(address(this), true); - - token.safeTransferFrom(from, address(0xBEEF), 1337); - - assertEq(token.getApproved(1337), address(0)); - assertEq(token.ownerOf(1337), address(0xBEEF)); - assertEq(token.balanceOf(address(0xBEEF)), 1); - assertEq(token.balanceOf(from), 0); - } - - function testSafeTransferFromToERC721Recipient() public { - address from = address(0xABCD); - ERC721Recipient recipient = new ERC721Recipient(); - - token.mint(from, 1337); - - vm.prank(from); - token.setApprovalForAll(address(this), true); - - token.safeTransferFrom(from, address(recipient), 1337); - - assertEq(token.getApproved(1337), address(0)); - assertEq(token.ownerOf(1337), address(recipient)); - assertEq(token.balanceOf(address(recipient)), 1); - assertEq(token.balanceOf(from), 0); - - assertEq(recipient.operator(), address(this)); - assertEq(recipient.from(), from); - assertEq(recipient.id(), 1337); - assertEq(recipient.data(), ""); - } - - function testSafeTransferFromToERC721RecipientWithData() public { - address from = address(0xABCD); - ERC721Recipient recipient = new ERC721Recipient(); - - token.mint(from, 1337); - - vm.prank(from); - token.setApprovalForAll(address(this), true); - - token.safeTransferFrom(from, address(recipient), 1337, "testing 123"); - - assertEq(token.getApproved(1337), address(0)); - assertEq(token.ownerOf(1337), address(recipient)); - assertEq(token.balanceOf(address(recipient)), 1); - assertEq(token.balanceOf(from), 0); - - assertEq(recipient.operator(), address(this)); - assertEq(recipient.from(), from); - assertEq(recipient.id(), 1337); - assertEq(recipient.data(), "testing 123"); - } - - function testSafeMintToEOA() public { - token.safeMint(address(0xBEEF), 1337); - - assertEq(token.ownerOf(1337), address(address(0xBEEF))); - assertEq(token.balanceOf(address(address(0xBEEF))), 1); - } - - function testSafeMintToERC721Recipient() public { - ERC721Recipient to = new ERC721Recipient(); - - token.safeMint(address(to), 1337); - - assertEq(token.ownerOf(1337), address(to)); - assertEq(token.balanceOf(address(to)), 1); - - assertEq(to.operator(), address(this)); - assertEq(to.from(), address(0)); - assertEq(to.id(), 1337); - assertEq(to.data(), ""); - } - - function testSafeMintToERC721RecipientWithData() public { - ERC721Recipient to = new ERC721Recipient(); - - token.safeMint(address(to), 1337, "testing 123"); - - assertEq(token.ownerOf(1337), address(to)); - assertEq(token.balanceOf(address(to)), 1); - - assertEq(to.operator(), address(this)); - assertEq(to.from(), address(0)); - assertEq(to.id(), 1337); - assertEq(to.data(), "testing 123"); - } - - function testFailMintToZero() public { - token.mint(address(0), 1337); - } - - function testFailDoubleMint() public { - token.mint(address(0xBEEF), 1337); - token.mint(address(0xBEEF), 1337); - } - - function testFailBurnUnMinted() public { - token.burn(1337); - } - - function testFailDoubleBurn() public { - token.mint(address(0xBEEF), 1337); - - token.burn(1337); - token.burn(1337); - } - - function testFailApproveUnMinted() public { - token.approve(address(0xBEEF), 1337); - } - - function testFailApproveUnAuthorized() public { - token.mint(address(0xCAFE), 1337); - - token.approve(address(0xBEEF), 1337); - } - - function testFailTransferFromUnOwned() public { - token.transferFrom(address(0xFEED), address(0xBEEF), 1337); - } - - function testFailTransferFromWrongFrom() public { - token.mint(address(0xCAFE), 1337); - - token.transferFrom(address(0xFEED), address(0xBEEF), 1337); - } - - function testFailTransferFromToZero() public { - token.mint(address(this), 1337); - - token.transferFrom(address(this), address(0), 1337); - } - - function testFailTransferFromNotOwner() public { - token.mint(address(0xFEED), 1337); - - token.transferFrom(address(0xFEED), address(0xBEEF), 1337); - } - - function testFailSafeTransferFromToNonERC721Recipient() public { - token.mint(address(this), 1337); - - token.safeTransferFrom(address(this), address(new NonERC721Recipient()), 1337); - } - - function testFailSafeTransferFromToNonERC721RecipientWithData() public { - token.mint(address(this), 1337); - - token.safeTransferFrom(address(this), address(new NonERC721Recipient()), 1337, "testing 123"); - } - - function testFailSafeTransferFromToRevertingERC721Recipient() public { - token.mint(address(this), 1337); - - token.safeTransferFrom(address(this), address(new RevertingERC721Recipient()), 1337); - } - - function testFailSafeTransferFromToRevertingERC721RecipientWithData() public { - token.mint(address(this), 1337); - - token.safeTransferFrom(address(this), address(new RevertingERC721Recipient()), 1337, "testing 123"); - } - - function testFailSafeTransferFromToERC721RecipientWithWrongReturnData() public { - token.mint(address(this), 1337); - - token.safeTransferFrom(address(this), address(new WrongReturnDataERC721Recipient()), 1337); - } - - function testFailSafeTransferFromToERC721RecipientWithWrongReturnDataWithData() public { - token.mint(address(this), 1337); - - token.safeTransferFrom(address(this), address(new WrongReturnDataERC721Recipient()), 1337, "testing 123"); - } - - function testFailSafeMintToNonERC721Recipient() public { - token.safeMint(address(new NonERC721Recipient()), 1337); - } - - function testFailSafeMintToNonERC721RecipientWithData() public { - token.safeMint(address(new NonERC721Recipient()), 1337, "testing 123"); - } - - function testFailSafeMintToRevertingERC721Recipient() public { - token.safeMint(address(new RevertingERC721Recipient()), 1337); - } - - function testFailSafeMintToRevertingERC721RecipientWithData() public { - token.safeMint(address(new RevertingERC721Recipient()), 1337, "testing 123"); - } - - function testFailSafeMintToERC721RecipientWithWrongReturnData() public { - token.safeMint(address(new WrongReturnDataERC721Recipient()), 1337); - } - - function testFailSafeMintToERC721RecipientWithWrongReturnDataWithData() public { - token.safeMint(address(new WrongReturnDataERC721Recipient()), 1337, "testing 123"); - } - - function testFailBalanceOfZeroAddress() public view { - token.balanceOf(address(0)); - } - - function testFailOwnerOfUnminted() public view { - token.ownerOf(1337); - } - - function testMetadata(string memory name, string memory symbol) public { - MockERC721 tkn = new Token_ERC721(name, symbol); - - assertEq(tkn.name(), name); - assertEq(tkn.symbol(), symbol); - } - - function testMint(address to, uint256 id) public { - if (to == address(0)) to = address(0xBEEF); - - token.mint(to, id); - - assertEq(token.balanceOf(to), 1); - assertEq(token.ownerOf(id), to); - } - - function testBurn(address to, uint256 id) public { - if (to == address(0)) to = address(0xBEEF); - - token.mint(to, id); - token.burn(id); - - assertEq(token.balanceOf(to), 0); - - vm.expectRevert("NOT_MINTED"); - token.ownerOf(id); - } - - function testApprove(address to, uint256 id) public { - if (to == address(0)) to = address(0xBEEF); - - token.mint(address(this), id); - - token.approve(to, id); - - assertEq(token.getApproved(id), to); - } - - function testApproveBurn(address to, uint256 id) public { - token.mint(address(this), id); - - token.approve(address(to), id); - - token.burn(id); - - assertEq(token.balanceOf(address(this)), 0); - assertEq(token.getApproved(id), address(0)); - - vm.expectRevert("NOT_MINTED"); - token.ownerOf(id); - } - - function testApproveAll(address to, bool approved) public { - token.setApprovalForAll(to, approved); - - assertEq(token.isApprovedForAll(address(this), to), approved); - } - - function testTransferFrom(uint256 id, address to) public { - address from = address(0xABCD); - - if (to == address(0) || to == from) to = address(0xBEEF); - - token.mint(from, id); - - vm.prank(from); - token.approve(address(this), id); - - token.transferFrom(from, to, id); - - assertEq(token.getApproved(id), address(0)); - assertEq(token.ownerOf(id), to); - assertEq(token.balanceOf(to), 1); - assertEq(token.balanceOf(from), 0); - } - - function testTransferFromSelf(uint256 id, address to) public { - if (to == address(0) || to == address(this)) to = address(0xBEEF); - - token.mint(address(this), id); - - token.transferFrom(address(this), to, id); - - assertEq(token.getApproved(id), address(0)); - assertEq(token.ownerOf(id), to); - assertEq(token.balanceOf(to), 1); - assertEq(token.balanceOf(address(this)), 0); - } - - function testTransferFromApproveAll(uint256 id, address to) public { - address from = address(0xABCD); - - if (to == address(0) || to == from) to = address(0xBEEF); - - token.mint(from, id); - - vm.prank(from); - token.setApprovalForAll(address(this), true); - - token.transferFrom(from, to, id); - - assertEq(token.getApproved(id), address(0)); - assertEq(token.ownerOf(id), to); - assertEq(token.balanceOf(to), 1); - assertEq(token.balanceOf(from), 0); - } - - function testSafeTransferFromToEOA(uint256 id, address to) public { - address from = address(0xABCD); - - if (to == address(0) || to == from) to = address(0xBEEF); - - if (uint256(uint160(to)) <= 18 || to.code.length > 0) return; - - token.mint(from, id); - - vm.prank(from); - token.setApprovalForAll(address(this), true); - - token.safeTransferFrom(from, to, id); - - assertEq(token.getApproved(id), address(0)); - assertEq(token.ownerOf(id), to); - assertEq(token.balanceOf(to), 1); - assertEq(token.balanceOf(from), 0); - } - - function testSafeTransferFromToERC721Recipient(uint256 id) public { - address from = address(0xABCD); - - ERC721Recipient recipient = new ERC721Recipient(); - - token.mint(from, id); - - vm.prank(from); - token.setApprovalForAll(address(this), true); - - token.safeTransferFrom(from, address(recipient), id); - - assertEq(token.getApproved(id), address(0)); - assertEq(token.ownerOf(id), address(recipient)); - assertEq(token.balanceOf(address(recipient)), 1); - assertEq(token.balanceOf(from), 0); - - assertEq(recipient.operator(), address(this)); - assertEq(recipient.from(), from); - assertEq(recipient.id(), id); - assertEq(recipient.data(), ""); - } - - function testSafeTransferFromToERC721RecipientWithData(uint256 id, bytes calldata data) public { - address from = address(0xABCD); - ERC721Recipient recipient = new ERC721Recipient(); - - token.mint(from, id); - - vm.prank(from); - token.setApprovalForAll(address(this), true); - - token.safeTransferFrom(from, address(recipient), id, data); - - assertEq(token.getApproved(id), address(0)); - assertEq(token.ownerOf(id), address(recipient)); - assertEq(token.balanceOf(address(recipient)), 1); - assertEq(token.balanceOf(from), 0); - - assertEq(recipient.operator(), address(this)); - assertEq(recipient.from(), from); - assertEq(recipient.id(), id); - assertEq(recipient.data(), data); - } - - function testSafeMintToEOA(uint256 id, address to) public { - if (to == address(0)) to = address(0xBEEF); - - if (uint256(uint160(to)) <= 18 || to.code.length > 0) return; - - token.safeMint(to, id); - - assertEq(token.ownerOf(id), address(to)); - assertEq(token.balanceOf(address(to)), 1); - } - - function testSafeMintToERC721Recipient(uint256 id) public { - ERC721Recipient to = new ERC721Recipient(); - - token.safeMint(address(to), id); - - assertEq(token.ownerOf(id), address(to)); - assertEq(token.balanceOf(address(to)), 1); - - assertEq(to.operator(), address(this)); - assertEq(to.from(), address(0)); - assertEq(to.id(), id); - assertEq(to.data(), ""); - } - - function testSafeMintToERC721RecipientWithData(uint256 id, bytes calldata data) public { - ERC721Recipient to = new ERC721Recipient(); - - token.safeMint(address(to), id, data); - - assertEq(token.ownerOf(id), address(to)); - assertEq(token.balanceOf(address(to)), 1); - - assertEq(to.operator(), address(this)); - assertEq(to.from(), address(0)); - assertEq(to.id(), id); - assertEq(to.data(), data); - } - - function testFailMintToZero(uint256 id) public { - token.mint(address(0), id); - } - - function testFailDoubleMint(uint256 id, address to) public { - if (to == address(0)) to = address(0xBEEF); - - token.mint(to, id); - token.mint(to, id); - } - - function testFailBurnUnMinted(uint256 id) public { - token.burn(id); - } - - function testFailDoubleBurn(uint256 id, address to) public { - if (to == address(0)) to = address(0xBEEF); - - token.mint(to, id); - - token.burn(id); - token.burn(id); - } - - function testFailApproveUnMinted(uint256 id, address to) public { - token.approve(to, id); - } - - function testFailApproveUnAuthorized(address owner, uint256 id, address to) public { - if (owner == address(0) || owner == address(this)) owner = address(0xBEEF); - - token.mint(owner, id); - - token.approve(to, id); - } - - function testFailTransferFromUnOwned(address from, address to, uint256 id) public { - token.transferFrom(from, to, id); - } - - function testFailTransferFromWrongFrom(address owner, address from, address to, uint256 id) public { - if (owner == address(0)) to = address(0xBEEF); - if (from == owner) revert(); - - token.mint(owner, id); - - token.transferFrom(from, to, id); - } - - function testFailTransferFromToZero(uint256 id) public { - token.mint(address(this), id); - - token.transferFrom(address(this), address(0), id); - } - - function testFailTransferFromNotOwner(address from, address to, uint256 id) public { - if (from == address(this)) from = address(0xBEEF); - - token.mint(from, id); - - token.transferFrom(from, to, id); - } - - function testFailSafeTransferFromToNonERC721Recipient(uint256 id) public { - token.mint(address(this), id); - - token.safeTransferFrom(address(this), address(new NonERC721Recipient()), id); - } - - function testFailSafeTransferFromToNonERC721RecipientWithData(uint256 id, bytes calldata data) public { - token.mint(address(this), id); - - token.safeTransferFrom(address(this), address(new NonERC721Recipient()), id, data); - } - - function testFailSafeTransferFromToRevertingERC721Recipient(uint256 id) public { - token.mint(address(this), id); - - token.safeTransferFrom(address(this), address(new RevertingERC721Recipient()), id); - } - - function testFailSafeTransferFromToRevertingERC721RecipientWithData(uint256 id, bytes calldata data) public { - token.mint(address(this), id); - - token.safeTransferFrom(address(this), address(new RevertingERC721Recipient()), id, data); - } - - function testFailSafeTransferFromToERC721RecipientWithWrongReturnData(uint256 id) public { - token.mint(address(this), id); - - token.safeTransferFrom(address(this), address(new WrongReturnDataERC721Recipient()), id); - } - - function testFailSafeTransferFromToERC721RecipientWithWrongReturnDataWithData(uint256 id, bytes calldata data) - public - { - token.mint(address(this), id); - - token.safeTransferFrom(address(this), address(new WrongReturnDataERC721Recipient()), id, data); - } - - function testFailSafeMintToNonERC721Recipient(uint256 id) public { - token.safeMint(address(new NonERC721Recipient()), id); - } - - function testFailSafeMintToNonERC721RecipientWithData(uint256 id, bytes calldata data) public { - token.safeMint(address(new NonERC721Recipient()), id, data); - } - - function testFailSafeMintToRevertingERC721Recipient(uint256 id) public { - token.safeMint(address(new RevertingERC721Recipient()), id); - } - - function testFailSafeMintToRevertingERC721RecipientWithData(uint256 id, bytes calldata data) public { - token.safeMint(address(new RevertingERC721Recipient()), id, data); - } - - function testFailSafeMintToERC721RecipientWithWrongReturnData(uint256 id) public { - token.safeMint(address(new WrongReturnDataERC721Recipient()), id); - } - - function testFailSafeMintToERC721RecipientWithWrongReturnDataWithData(uint256 id, bytes calldata data) public { - token.safeMint(address(new WrongReturnDataERC721Recipient()), id, data); - } - - function testFailOwnerOfUnminted(uint256 id) public view { - token.ownerOf(id); - } -} From 3674fa914e30c5ea5ee3db1ff076a625e83475fb Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 18 Jul 2024 15:47:36 -0300 Subject: [PATCH 05/28] feat: final contract version --- .../aligned-integration/.gitignore | 1 + .../batch_inclusion_data/f09c8d67_30.json | 1 - .../aligned-integration/src/main.rs | 19 +++++++---- .../contracts/src/FibonacciValidator.sol | 32 ++++++++++++++----- 4 files changed, 38 insertions(+), 15 deletions(-) create mode 100644 examples/validating-public-input/aligned-integration/.gitignore delete mode 100644 examples/validating-public-input/aligned-integration/batch_inclusion_data/f09c8d67_30.json diff --git a/examples/validating-public-input/aligned-integration/.gitignore b/examples/validating-public-input/aligned-integration/.gitignore new file mode 100644 index 000000000..c833a9aad --- /dev/null +++ b/examples/validating-public-input/aligned-integration/.gitignore @@ -0,0 +1 @@ +batch_inclusion_data/ diff --git a/examples/validating-public-input/aligned-integration/batch_inclusion_data/f09c8d67_30.json b/examples/validating-public-input/aligned-integration/batch_inclusion_data/f09c8d67_30.json deleted file mode 100644 index d42484e05..000000000 --- a/examples/validating-public-input/aligned-integration/batch_inclusion_data/f09c8d67_30.json +++ /dev/null @@ -1 +0,0 @@ -{"verification_data_commitment":{"proof_commitment":[151,166,22,225,170,216,137,245,192,96,83,114,14,29,132,93,14,58,100,196,170,213,243,30,139,153,89,122,254,140,78,219],"pub_input_commitment":[215,12,219,66,161,99,16,27,152,188,231,11,35,219,222,94,8,151,45,43,150,205,27,44,44,139,239,70,207,60,161,176],"proving_system_aux_data_commitment":[191,165,97,227,132,190,117,59,214,253,117,177,93,179,30,181,17,205,17,78,199,109,97,154,135,194,52,42,240,238,30,215],"proof_generator_addr":[102,249,102,79,151,242,181,15,98,209,62,160,100,152,47,147,109,231,102,87]},"batch_merkle_root":[240,156,141,103,132,13,25,155,98,230,140,142,182,66,137,76,142,202,55,168,205,113,198,86,248,152,215,10,0,248,160,219],"batch_inclusion_proof":{"merkle_path":[[103,16,88,212,186,79,84,61,123,164,196,60,157,241,57,223,20,127,105,199,35,151,181,82,1,15,76,112,54,113,176,246],[8,148,160,152,182,227,83,42,224,84,226,17,186,81,161,179,96,84,137,174,13,196,209,113,199,84,123,248,201,226,71,178],[137,40,202,41,24,26,253,127,220,240,183,86,26,166,147,33,247,248,211,16,215,230,136,59,115,135,253,112,246,199,211,134],[104,121,121,56,69,144,181,29,22,193,204,249,151,16,33,102,188,118,216,109,95,249,184,6,53,112,228,25,203,64,238,72],[5,217,147,12,142,142,14,18,72,172,130,50,156,137,199,177,208,77,182,171,123,10,51,155,3,49,119,248,25,218,187,189],[94,102,50,252,206,197,151,118,154,17,218,88,24,170,205,83,154,241,184,165,212,16,197,148,152,43,94,56,237,187,17,29],[148,53,112,249,136,252,108,154,38,232,149,81,5,110,208,120,140,231,8,71,47,168,245,56,178,85,210,47,87,111,237,55],[210,244,137,176,63,13,152,51,180,72,204,27,138,182,143,46,51,112,163,62,224,62,49,118,103,40,249,232,92,196,241,197]]},"index_in_batch":30} \ No newline at end of file diff --git a/examples/validating-public-input/aligned-integration/src/main.rs b/examples/validating-public-input/aligned-integration/src/main.rs index 8e6ce831e..a123fb3e1 100644 --- a/examples/validating-public-input/aligned-integration/src/main.rs +++ b/examples/validating-public-input/aligned-integration/src/main.rs @@ -7,11 +7,11 @@ use aligned_sdk::core::errors::SubmitError; use aligned_sdk::core::types::Chain::Holesky; use aligned_sdk::core::types::{AlignedVerificationData, ProvingSystemId, VerificationData}; use aligned_sdk::sdk::submit_and_wait; +use env_logger::Env; use ethers::signers::LocalWallet; use ethers::types::Address; use ethers::utils::hex; use log::info; -use env_logger::Env; #[tokio::main] async fn main() -> Result<(), SubmitError> { @@ -21,13 +21,19 @@ async fn main() -> Result<(), SubmitError> { "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof", )) .unwrap_or_default(); + let pub_input = read_file(PathBuf::from( "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.pub", )); + let image_id = read_file(PathBuf::from( "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci_id.bin", )); + let pub_input_hex = hex::encode(pub_input.as_ref().unwrap()); + + info!("Pub input bytes as hex: {:?}", pub_input_hex); + let proof_generator_addr = Address::from_str("0x66f9664f97F2b50F62D13eA064982f936dE76657").unwrap(); @@ -57,7 +63,10 @@ async fn main() -> Result<(), SubmitError> { let batch_inclusion_data_directory_path = PathBuf::from("./batch_inclusion_data"); - info!("Saving verification data to {:?}", batch_inclusion_data_directory_path); + info!( + "Saving verification data to {:?}", + batch_inclusion_data_directory_path + ); if let Some(aligned_verification_data) = aligned_verification_data { save_response( batch_inclusion_data_directory_path, @@ -78,11 +87,9 @@ fn save_response( batch_inclusion_data_directory_path: PathBuf, aligned_verification_data: &AlignedVerificationData, ) -> Result<(), SubmitError> { + std::fs::create_dir_all(&batch_inclusion_data_directory_path) + .map_err(|e| SubmitError::IoError(batch_inclusion_data_directory_path.clone(), e))?; - std::fs::create_dir_all(&batch_inclusion_data_directory_path).map_err(|e| { - SubmitError::IoError(batch_inclusion_data_directory_path.clone(), e) - })?; - let batch_merkle_root = &hex::encode(aligned_verification_data.batch_merkle_root)[..8]; let batch_inclusion_data_file_name = batch_merkle_root.to_owned() + "_" diff --git a/examples/validating-public-input/contracts/src/FibonacciValidator.sol b/examples/validating-public-input/contracts/src/FibonacciValidator.sol index 7ee4b0393..316622a4b 100644 --- a/examples/validating-public-input/contracts/src/FibonacciValidator.sol +++ b/examples/validating-public-input/contracts/src/FibonacciValidator.sol @@ -8,7 +8,7 @@ contract FibonacciValidator { bytes32 public fibonacciImageIdCommitment = 0xbfa561e384be753bd6fd75b15db31eb511cd114ec76d619a87c2342af0ee1ed7; - event FibonacciNumbersVerified(uint32 fibN, uint32 fibNPlusOne); + event FibonacciNumbers(uint32 fibN, uint32 fibNPlusOne); constructor(address _alignedServiceManager) { alignedServiceManager = _alignedServiceManager; @@ -22,23 +22,21 @@ contract FibonacciValidator { bytes32 batchMerkleRoot, bytes memory merkleProof, uint256 verificationDataBatchIndex, - uint32 fibN, - uint32 fibNPlusOne + bytes memory journalBytes ) public returns (bool) { require( fibonacciImageIdCommitment == provingSystemAuxDataCommitment, "Image ID doesn't match" ); - bytes32 calculatedCommitment = calculateCommitment(fibN, fibNPlusOne); - require( - pubInputCommitment == calculatedCommitment, + pubInputCommitment == keccak256(abi.encodePacked(journalBytes)), "Fibonacci numbers don't match with public input" ); - // Emit the event after the require statements - emit FibonacciNumbersVerified(fibN, fibNPlusOne); + (uint32 fibN, uint32 fibNPlusOne) = bytesToTwoUint32(journalBytes); + + emit FibonacciNumbers(fibN, fibNPlusOne); ( bool callWasSuccessful, @@ -68,4 +66,22 @@ contract FibonacciValidator { bytes memory encoded = abi.encodePacked(fibN, fibNPlusOne); return keccak256(encoded); } + + function bytesToTwoUint32( + bytes memory data + ) public pure returns (uint32, uint32) { + require(data.length >= 8, "Input bytes must be at least 8 bytes long"); + + uint32 first = uint32(uint8(data[0])) | + (uint32(uint8(data[1])) << 8) | + (uint32(uint8(data[2])) << 16) | + (uint32(uint8(data[3])) << 24); + + uint32 second = uint32(uint8(data[4])) | + (uint32(uint8(data[5])) << 8) | + (uint32(uint8(data[6])) << 16) | + (uint32(uint8(data[7])) << 24); + + return (first, second); + } } From 0ebfb6796c45d55d5162ada42d8e2121cd6600f8 Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 18 Jul 2024 15:49:10 -0300 Subject: [PATCH 06/28] feat: add forge-std --- examples/validating-public-input/contracts/lib/forge-std | 1 + 1 file changed, 1 insertion(+) create mode 160000 examples/validating-public-input/contracts/lib/forge-std diff --git a/examples/validating-public-input/contracts/lib/forge-std b/examples/validating-public-input/contracts/lib/forge-std new file mode 160000 index 000000000..07263d193 --- /dev/null +++ b/examples/validating-public-input/contracts/lib/forge-std @@ -0,0 +1 @@ +Subproject commit 07263d193d621c4b2b0ce8b4d54af58f6957d97d From 05aa04693aae272257e52032a7f5fca2f7d78e40 Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:18:06 -0300 Subject: [PATCH 07/28] docs: update docs to be more concise --- docs/guides/3_validating_public_input.md | 202 +++++------------- .../contracts/src/FibonacciValidator.sol | 8 - 2 files changed, 57 insertions(+), 153 deletions(-) diff --git a/docs/guides/3_validating_public_input.md b/docs/guides/3_validating_public_input.md index d5ba6e095..7ccec1f54 100644 --- a/docs/guides/3_validating_public_input.md +++ b/docs/guides/3_validating_public_input.md @@ -4,13 +4,15 @@ You can validate that the public input of the proof sent to Aligned for verifica This guide demonstrates the submission of a Risc0 proof to Aligned using the Aligned SDK. The Risc0 program to be proven is a Fibonacci sequence calculator. Risc0 generates a public input corresponding to the last two Fibonacci numbers of the sequence taken modulo 7919, and we want to validate in a smart contract that the public input commitments correspond to those two numbers. +In this case, the Fibonacci number to be calculated is **500** and the last two numbers of the sequence modulo 7919 are **1268** and **1926**. + +This guide assumes you are in the `examples/validating-public-input` directory. + ## Generate your ZK Proof To submit proofs to Aligned and get them verified, first you need to generate those proofs. Every proving system has its own way of generating proofs. -You can find examples on how to generate proofs in the [generating proofs guide](3_generating_proofs.md). - -Additionally, you can find an example of the Fibonacci program proof and the script that generates it in the risc_zero directory. +You can find examples on how to generate proofs in the [generating proofs guide](4_generating_proofs.md). To generate the proof needed to try this example, run `make generate_risc_zero_fibonacci_proof`. @@ -41,7 +43,7 @@ contract FibonacciValidator { bytes32 public fibonacciImageIdCommitment = 0xbfa561e384be753bd6fd75b15db31eb511cd114ec76d619a87c2342af0ee1ed7; - event FibonacciNumbersVerified(uint32 fibN, uint32 fibNPlusOne); + event FibonacciNumbers(uint32 fibN, uint32 fibNPlusOne); constructor(address _alignedServiceManager) { alignedServiceManager = _alignedServiceManager; @@ -55,23 +57,21 @@ contract FibonacciValidator { bytes32 batchMerkleRoot, bytes memory merkleProof, uint256 verificationDataBatchIndex, - uint32 fibN, - uint32 fibNPlusOne + bytes memory journalBytes ) public returns (bool) { require( fibonacciImageIdCommitment == provingSystemAuxDataCommitment, "Image ID doesn't match" ); - bytes32 calculatedCommitment = calculateCommitment(fibN, fibNPlusOne); - require( - pubInputCommitment == calculatedCommitment, + pubInputCommitment == keccak256(abi.encodePacked(journalBytes)), "Fibonacci numbers don't match with public input" ); - // Emit the event after the require statements - emit FibonacciNumbersVerified(fibN, fibNPlusOne); + (uint32 fibN, uint32 fibNPlusOne) = bytesToTwoUint32(journalBytes); + + emit FibonacciNumbers(fibN, fibNPlusOne); ( bool callWasSuccessful, @@ -94,12 +94,22 @@ contract FibonacciValidator { return abi.decode(proofIsIncluded, (bool)); } - function calculateCommitment( - uint32 fibN, - uint32 fibNPlusOne - ) public pure returns (bytes32) { - bytes memory encoded = abi.encodePacked(fibN, fibNPlusOne); - return keccak256(encoded); + function bytesToTwoUint32( + bytes memory data + ) public pure returns (uint32, uint32) { + require(data.length >= 8, "Input bytes must be at least 8 bytes long"); + + uint32 first = uint32(uint8(data[0])) | + (uint32(uint8(data[1])) << 8) | + (uint32(uint8(data[2])) << 16) | + (uint32(uint8(data[3])) << 24); + + uint32 second = uint32(uint8(data[4])) | + (uint32(uint8(data[5])) << 8) | + (uint32(uint8(data[6])) << 16) | + (uint32(uint8(data[7])) << 24); + + return (first, second); } } ``` @@ -115,26 +125,17 @@ require( ); ``` -1. **Commitment Calculation and Validation:** It calculates the commitment of the last two Fibonacci numbers modulo 7919, validates it against the submitted public input commitment, and emits an event. +2. **Public Input Commitment Validation:** The contract validates that the public input commitment matches the keccak256 hash of the journalBytes. It then extracts the last two Fibonacci numbers from the journalBytes and emits an event. ```solidity -bytes32 calculatedCommitment = calculateCommitment(fibN, fibNPlusOne); - require( - pubInputCommitment == calculatedCommitment, + pubInputCommitment == keccak256(abi.encodePacked(journalBytes)), "Fibonacci numbers don't match with public input" ); -emit FibonacciNumbersVerified(fibN, fibNPlusOne); -``` -```solidity -function calculateCommitment( - uint32 fibN, - uint32 fibNPlusOne - ) public pure returns (bytes32) { - bytes memory encoded = abi.encodePacked(fibN, fibNPlusOne); - return keccak256(encoded); - } +(uint32 fibN, uint32 fibNPlusOne) = bytesToTwoUint32(journalBytes); + +emit FibonacciNumbers(fibN, fibNPlusOne); ``` 3. **Static Call to AlignedServiceManager**: The contract makes a static call to the `AlignedServiceManager` contract to check if the proof was verified in Aligned. @@ -159,7 +160,29 @@ function calculateCommitment( require(callWasSuccessful, "static_call failed"); ``` -To deploy the contract, first you will need to setup the `.env` file in the contracts folder with the following variables: +4. **Bytes to two `uint32` conversion:** A helper function to convert a byte array into two `uint32` numbers, used for extracting the last two Fibonacci numbers from the `journalBytes`. + +```solidity +function bytesToTwoUint32( + bytes memory data +) public pure returns (uint32, uint32) { + require(data.length >= 8, "Input bytes must be at least 8 bytes long"); + + uint32 first = uint32(uint8(data[0])) | + (uint32(uint8(data[1])) << 8) | + (uint32(uint8(data[2])) << 16) | + (uint32(uint8(data[3])) << 24); + + uint32 second = uint32(uint8(data[4])) | + (uint32(uint8(data[5])) << 8) | + (uint32(uint8(data[6])) << 16) | + (uint32(uint8(data[7])) << 24); + + return (first, second); +} +``` + +To deploy the contract, first you will need to set up the `.env` file in the contracts folder with the following variables: ``` RPC_URL= #You can use publicnode RPC: https://ethereum-holesky-rpc.publicnode.com @@ -173,117 +196,6 @@ Then, run `make deploy_fibonacci_validator`. The proof submission and verification can be done either with the SDK or by using the Aligned CLI. -#### Using the SDK - -To submit and check if the proof was correctly verified in Aligned using the SDK, you can use the `submit_and_wait` function. - -The following code is an example of how to submit and wait for the verification of a proof using the SDK and then store the AlignedVerificationData in a `.json` file - -```rust -use std::fs::File; -use std::io::Write; -use std::path::PathBuf; -use std::str::FromStr; - -use aligned_sdk::core::errors::SubmitError; -use aligned_sdk::core::types::Chain::Holesky; -use aligned_sdk::core::types::{AlignedVerificationData, ProvingSystemId, VerificationData}; -use aligned_sdk::sdk::submit_and_wait; -use ethers::signers::LocalWallet; -use ethers::types::Address; -use ethers::utils::hex; - -#[tokio::main] -async fn main() -> Result<(), SubmitError> { - let proof = read_file(PathBuf::from( - "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof", - )) - .unwrap_or_default(); - let pub_input = read_file(PathBuf::from( - "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.pub", - )); - let image_id = read_file(PathBuf::from( - "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci_id.bin", - )); - - let proof_generator_addr = - Address::from_str("0x66f9664f97F2b50F62D13eA064982f936dE76657").unwrap(); - - let verification_data = VerificationData { - proving_system: ProvingSystemId::Risc0, - proof, - pub_input, - verification_key: None, - vm_program_code: image_id, - proof_generator_addr, - }; - - // Set to the 9th address of anvil that doesn't pay for the proof submission - let wallet = - LocalWallet::from_str("2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6") - .expect("Failed to create wallet"); - - let aligned_verification_data = submit_and_wait( - "wss://batcher.alignedlayer.com", - "https://ethereum-holesky-rpc.publicnode.com", - Holesky, - &verification_data, - wallet, - ) - .await?; - - let batch_inclusion_data_directory_path = PathBuf::from("./batch_inclusion_data"); - - if let Some(aligned_verification_data) = aligned_verification_data { - save_response( - batch_inclusion_data_directory_path, - &aligned_verification_data, - )?; - } else { - return Err(SubmitError::EmptyVerificationDataList); - } - - Ok(()) -} - -fn read_file(file_name: PathBuf) -> Option> { - std::fs::read(file_name).ok() -} - -fn save_response( - batch_inclusion_data_directory_path: PathBuf, - aligned_verification_data: &AlignedVerificationData, -) -> Result<(), SubmitError> { - - std::fs::create_dir_all(&batch_inclusion_data_directory_path).map_err(|e| { - SubmitError::IoError(batch_inclusion_data_directory_path.clone(), e) - })?; - - let batch_merkle_root = &hex::encode(aligned_verification_data.batch_merkle_root)[..8]; - let batch_inclusion_data_file_name = batch_merkle_root.to_owned() - + "_" - + &aligned_verification_data.index_in_batch.to_string() - + ".json"; - - let batch_inclusion_data_path = - batch_inclusion_data_directory_path.join(batch_inclusion_data_file_name); - - let data = serde_json::to_vec(&aligned_verification_data)?; - - let mut file = File::create(&batch_inclusion_data_path) - .map_err(|e| SubmitError::IoError(batch_inclusion_data_path.clone(), e))?; - - file.write_all(data.as_slice()) - .map_err(|e| SubmitError::IoError(batch_inclusion_data_path.clone(), e))?; - - Ok(()) -} -``` - -This example generates a proof, instantiates a wallet to submit the proof, and then submits the proof to Aligned for verification. It then waits for the proof to be verified in Aligned and stores the verification data. - -To submit the proof using the code provided above, run `make submit_fibonacci_proof`. - -#### Using the CLI +To submit the proof generated in this example, run `make submit_fibonacci_proof`. This will output the `AlignedVerificationData` needed to send to the `verifyBatchInclusion` method of the contract in the `batch_inclusion_data` directory inside `aligned-integration`. -You can find examples of how to submit a proof using the CLI in the [submitting proofs guide](0_submitting_proofs.md). +For more details on submitting proofs, refer to the [submitting proofs guide](0_submitting_proofs.md). diff --git a/examples/validating-public-input/contracts/src/FibonacciValidator.sol b/examples/validating-public-input/contracts/src/FibonacciValidator.sol index 316622a4b..198faad5b 100644 --- a/examples/validating-public-input/contracts/src/FibonacciValidator.sol +++ b/examples/validating-public-input/contracts/src/FibonacciValidator.sol @@ -59,14 +59,6 @@ contract FibonacciValidator { return abi.decode(proofIsIncluded, (bool)); } - function calculateCommitment( - uint32 fibN, - uint32 fibNPlusOne - ) public pure returns (bytes32) { - bytes memory encoded = abi.encodePacked(fibN, fibNPlusOne); - return keccak256(encoded); - } - function bytesToTwoUint32( bytes memory data ) public pure returns (uint32, uint32) { From 07e196e68204e8c5079e249059edb23daa392f3a Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:31:24 -0300 Subject: [PATCH 08/28] fix: remove .gitmodules --- examples/validating-public-input/contracts/.gitmodules | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 examples/validating-public-input/contracts/.gitmodules diff --git a/examples/validating-public-input/contracts/.gitmodules b/examples/validating-public-input/contracts/.gitmodules deleted file mode 100644 index 888d42dcd..000000000 --- a/examples/validating-public-input/contracts/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "lib/forge-std"] - path = lib/forge-std - url = https://github.com/foundry-rs/forge-std From 1ad2d37cbeaa2a35cb4b8905c97b1bcc52b1b11a Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:39:35 -0300 Subject: [PATCH 09/28] fix: downgrade solidity version --- .../contracts/src/FibonacciValidator.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/validating-public-input/contracts/src/FibonacciValidator.sol b/examples/validating-public-input/contracts/src/FibonacciValidator.sol index 198faad5b..c17886d61 100644 --- a/examples/validating-public-input/contracts/src/FibonacciValidator.sol +++ b/examples/validating-public-input/contracts/src/FibonacciValidator.sol @@ -1,5 +1,5 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.19; +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.12; contract FibonacciValidator { address public alignedServiceManager; From 6a504ff13711d65415fc07697b05eeae0ff9ec49 Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:45:03 -0300 Subject: [PATCH 10/28] chore: add remappings --- examples/validating-public-input/.gitignore | 14 ++++++++++++++ .../validating-public-input/contracts/.gitignore | 5 +---- .../validating-public-input/contracts/foundry.toml | 1 + .../contracts/remappings.txt | 1 + 4 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 examples/validating-public-input/.gitignore create mode 100644 examples/validating-public-input/contracts/remappings.txt diff --git a/examples/validating-public-input/.gitignore b/examples/validating-public-input/.gitignore new file mode 100644 index 000000000..85198aaa5 --- /dev/null +++ b/examples/validating-public-input/.gitignore @@ -0,0 +1,14 @@ +# Compiler files +cache/ +out/ + +# Ignores development broadcast logs +!/broadcast +/broadcast/*/31337/ +/broadcast/**/dry-run/ + +# Docs +docs/ + +# Dotenv file +.env diff --git a/examples/validating-public-input/contracts/.gitignore b/examples/validating-public-input/contracts/.gitignore index 7921ae371..7366ba461 100644 --- a/examples/validating-public-input/contracts/.gitignore +++ b/examples/validating-public-input/contracts/.gitignore @@ -3,10 +3,7 @@ cache/ out/ # Ignores development broadcast logs -!/broadcast -/broadcast/*/31337/ -/broadcast/**/dry-run/ -broadcast/ +broadcast # Docs docs/ diff --git a/examples/validating-public-input/contracts/foundry.toml b/examples/validating-public-input/contracts/foundry.toml index 25b918f9c..3dc3c6945 100644 --- a/examples/validating-public-input/contracts/foundry.toml +++ b/examples/validating-public-input/contracts/foundry.toml @@ -2,5 +2,6 @@ src = "src" out = "out" libs = ["lib"] +remappings = ["@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/"] # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/examples/validating-public-input/contracts/remappings.txt b/examples/validating-public-input/contracts/remappings.txt new file mode 100644 index 000000000..6fdbafda9 --- /dev/null +++ b/examples/validating-public-input/contracts/remappings.txt @@ -0,0 +1 @@ +@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/ From c46abb4930eb68c95ed2e2196592bb655dc5b6da Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:57:03 -0300 Subject: [PATCH 11/28] chore: update .gitmodules --- .gitmodules | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitmodules b/.gitmodules index 77788dccf..b5ce81243 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,6 @@ [submodule "examples/zkquiz/contracts/lib/openzeppelin-contracts"] path = examples/zkquiz/contracts/lib/openzeppelin-contracts url = https://github.com/OpenZeppelin/openzeppelin-contracts +[submodule "examples/validating-public-input/contracts/lib/forge-std"] + path = examples/validating-public-input/contracts/lib/forge-std + url = https://github.com/foundry-rs/forge-std From 098bd93274cdae2f9d06a90212af20c96b65ceea Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Fri, 19 Jul 2024 19:16:09 -0300 Subject: [PATCH 12/28] docs: fix purpose of the guide --- docs/guides/3_validating_public_input.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guides/3_validating_public_input.md b/docs/guides/3_validating_public_input.md index 7ccec1f54..51e89366b 100644 --- a/docs/guides/3_validating_public_input.md +++ b/docs/guides/3_validating_public_input.md @@ -1,8 +1,8 @@ # Validating public input -You can validate that the public input of the proof sent to Aligned for verification is correct in a few simple steps. +In some applications, it is crucial to ensure that a third party has performed a computation correctly and to make use of the result of that computation. To achieve this, the third party must first interact with Aligned and obtain the `AlignedVerificationData`, a receipt indicating that the proof of the computation was verified correctly. The application should then receive both the `AlignedVerificationData` and the result of the computation. After confirming that the proof was verified by Aligned, it must check that the posted result matches the one committed in the `AlignedVerificationData`. -This guide demonstrates the submission of a Risc0 proof to Aligned using the Aligned SDK. The Risc0 program to be proven is a Fibonacci sequence calculator. Risc0 generates a public input corresponding to the last two Fibonacci numbers of the sequence taken modulo 7919, and we want to validate in a smart contract that the public input commitments correspond to those two numbers. +This guide demonstrates how to validate a Risc0 proof using the Aligned SDK. The Risc0 program in this example is a Fibonacci sequence calculator. It generates a public input that corresponds to the last two Fibonacci numbers of the sequence, taken modulo 7919. Our goal is to validate, within a smart contract, that the public input commitments match these two numbers. In this case, the Fibonacci number to be calculated is **500** and the last two numbers of the sequence modulo 7919 are **1268** and **1926**. From dcfc37f9f22b1db6851da0332b3af936364401cf Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 25 Jul 2024 10:35:27 -0300 Subject: [PATCH 13/28] fix: merge conflicts --- docs/SUMMARY.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 4bea7eac3..93dd6b80f 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -27,8 +27,8 @@ * [Integrating Aligned into your Application](guides/2_integrating_aligned_into_your_application.md) * [Validating public input](guides/3_validating_public_input.md) * [SDK](guides/1_SDK.md) -* [Generating proofs for Aligned](guides/3_generating_proofs.md) -* [Contract Addresses](guides/4_contract_addresses.md) +* [Generating proofs for Aligned](guides/4_generating_proofs.md) +* [Contract Addresses](guides/5_contract_addresses.md) * [Generating & submitting proofs of Rust code with ZKRust](guides/0_5_using_zkrust.md) From bc4fa195fe395fd6b590437e330ee8943ec792be Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Tue, 6 Aug 2024 14:56:04 -0300 Subject: [PATCH 14/28] fix: add variables to env in docs --- docs/guides/3_validating_public_input.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guides/3_validating_public_input.md b/docs/guides/3_validating_public_input.md index 51e89366b..009d69760 100644 --- a/docs/guides/3_validating_public_input.md +++ b/docs/guides/3_validating_public_input.md @@ -185,9 +185,9 @@ function bytesToTwoUint32( To deploy the contract, first you will need to set up the `.env` file in the contracts folder with the following variables: ``` -RPC_URL= #You can use publicnode RPC: https://ethereum-holesky-rpc.publicnode.com -PRIVATE_KEY= -ALIGNED_SERVICE_MANAGER_ADDRESS= #0x58F280BeBE9B34c9939C3C39e0890C81f163B623 for Holesky +RPC_URL= #You can use publicnode RPC: https://ethereum-holesky-rpc.publicnode.com +PRIVATE_KEY= +ALIGNED_SERVICE_MANAGER_ADDRESS= #0x58F280BeBE9B34c9939C3C39e0890C81f163B623 for Holesky ``` Then, run `make deploy_fibonacci_validator`. From c82254288832f0258e72d0fcaa71b617a9a73b16 Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Tue, 6 Aug 2024 14:56:41 -0300 Subject: [PATCH 15/28] fix: add variables to .env.example --- examples/validating-public-input/contracts/.env.example | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/validating-public-input/contracts/.env.example b/examples/validating-public-input/contracts/.env.example index 674233d37..8be214766 100644 --- a/examples/validating-public-input/contracts/.env.example +++ b/examples/validating-public-input/contracts/.env.example @@ -1,3 +1,3 @@ -RPC_URL= #You can use publicnode RPC: https://ethereum-holesky-rpc.publicnode.com -PRIVATE_KEY= -ALIGNED_SERVICE_MANAGER_ADDRESS= #0x58F280BeBE9B34c9939C3C39e0890C81f163B623 for Holesky +RPC_URL= #You can use publicnode RPC: https://ethereum-holesky-rpc.publicnode.com +PRIVATE_KEY= +ALIGNED_SERVICE_MANAGER_ADDRESS= #0x58F280BeBE9B34c9939C3C39e0890C81f163B623 for Holesky From 7bc5736e446209ff3da92b740696fea242c00b8c Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Tue, 6 Aug 2024 14:59:00 -0300 Subject: [PATCH 16/28] refactor: rename deployer contract to FibonacciDeployer --- .../validating-public-input/contracts/script/Deployer.s.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/validating-public-input/contracts/script/Deployer.s.sol b/examples/validating-public-input/contracts/script/Deployer.s.sol index c012fb652..2efdc7156 100644 --- a/examples/validating-public-input/contracts/script/Deployer.s.sol +++ b/examples/validating-public-input/contracts/script/Deployer.s.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.12; import {Script, console} from "forge-std/Script.sol"; import {FibonacciValidator} from "../src/FibonacciValidator.sol"; -contract CounterScript is Script { +contract FibonacciDeployer is Script { function setUp() public {} function run(address _targetContract) external returns (address) { From eb6aa2eada3299e0b497f73848a57014b8fe3f74 Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Tue, 6 Aug 2024 15:02:26 -0300 Subject: [PATCH 17/28] refactor: emit event after verification --- docs/guides/3_validating_public_input.md | 19 ++++++++++--------- .../contracts/src/FibonacciValidator.sol | 8 ++++---- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/docs/guides/3_validating_public_input.md b/docs/guides/3_validating_public_input.md index 009d69760..0fb6d1655 100644 --- a/docs/guides/3_validating_public_input.md +++ b/docs/guides/3_validating_public_input.md @@ -69,10 +69,6 @@ contract FibonacciValidator { "Fibonacci numbers don't match with public input" ); - (uint32 fibN, uint32 fibNPlusOne) = bytesToTwoUint32(journalBytes); - - emit FibonacciNumbers(fibN, fibNPlusOne); - ( bool callWasSuccessful, bytes memory proofIsIncluded @@ -91,6 +87,10 @@ contract FibonacciValidator { require(callWasSuccessful, "static_call failed"); + (uint32 fibN, uint32 fibNPlusOne) = bytesToTwoUint32(journalBytes); + + emit FibonacciNumbers(fibN, fibNPlusOne); + return abi.decode(proofIsIncluded, (bool)); } @@ -125,7 +125,7 @@ require( ); ``` -2. **Public Input Commitment Validation:** The contract validates that the public input commitment matches the keccak256 hash of the journalBytes. It then extracts the last two Fibonacci numbers from the journalBytes and emits an event. +2. **Public Input Commitment Validation:** The contract validates that the public input commitment matches the keccak256 hash of the journalBytes. ```solidity require( @@ -133,12 +133,9 @@ require( "Fibonacci numbers don't match with public input" ); -(uint32 fibN, uint32 fibNPlusOne) = bytesToTwoUint32(journalBytes); - -emit FibonacciNumbers(fibN, fibNPlusOne); ``` -3. **Static Call to AlignedServiceManager**: The contract makes a static call to the `AlignedServiceManager` contract to check if the proof was verified in Aligned. +3. **Static Call to AlignedServiceManager**: The contract makes a static call to the `AlignedServiceManager` contract to check if the proof was verified in Aligned. It then extracts the last two Fibonacci numbers from the journalBytes and emits an event. ```solidity ( @@ -158,6 +155,10 @@ emit FibonacciNumbers(fibN, fibNPlusOne); ); require(callWasSuccessful, "static_call failed"); + +(uint32 fibN, uint32 fibNPlusOne) = bytesToTwoUint32(journalBytes); + +emit FibonacciNumbers(fibN, fibNPlusOne); ``` 4. **Bytes to two `uint32` conversion:** A helper function to convert a byte array into two `uint32` numbers, used for extracting the last two Fibonacci numbers from the `journalBytes`. diff --git a/examples/validating-public-input/contracts/src/FibonacciValidator.sol b/examples/validating-public-input/contracts/src/FibonacciValidator.sol index c17886d61..daecc8bd8 100644 --- a/examples/validating-public-input/contracts/src/FibonacciValidator.sol +++ b/examples/validating-public-input/contracts/src/FibonacciValidator.sol @@ -34,10 +34,6 @@ contract FibonacciValidator { "Fibonacci numbers don't match with public input" ); - (uint32 fibN, uint32 fibNPlusOne) = bytesToTwoUint32(journalBytes); - - emit FibonacciNumbers(fibN, fibNPlusOne); - ( bool callWasSuccessful, bytes memory proofIsIncluded @@ -56,6 +52,10 @@ contract FibonacciValidator { require(callWasSuccessful, "static_call failed"); + (uint32 fibN, uint32 fibNPlusOne) = bytesToTwoUint32(journalBytes); + + emit FibonacciNumbers(fibN, fibNPlusOne); + return abi.decode(proofIsIncluded, (bool)); } From 87dee6d2fa5d60a56d34a719553d34e99c8df9be Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Tue, 6 Aug 2024 15:23:57 -0300 Subject: [PATCH 18/28] chore: bump up sdk version to v0.4.0 --- .../aligned-integration/Cargo.lock | 2 +- .../aligned-integration/Cargo.toml | 2 +- .../aligned-integration/src/main.rs | 45 ++++++++++--------- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/examples/validating-public-input/aligned-integration/Cargo.lock b/examples/validating-public-input/aligned-integration/Cargo.lock index 84c322841..6064458f8 100644 --- a/examples/validating-public-input/aligned-integration/Cargo.lock +++ b/examples/validating-public-input/aligned-integration/Cargo.lock @@ -63,7 +63,7 @@ dependencies = [ [[package]] name = "aligned-sdk" version = "0.1.0" -source = "git+https://github.com/yetanotherco/aligned_layer?tag=v0.3.0#a885386e83156c4bb5fe036a07a04fe0150768ac" +source = "git+https://github.com/yetanotherco/aligned_layer?tag=v0.4.0#325aef8c3f54ec596b4733956a8ac487d5535fc3" dependencies = [ "ethers", "futures-util", diff --git a/examples/validating-public-input/aligned-integration/Cargo.toml b/examples/validating-public-input/aligned-integration/Cargo.toml index 06a010324..102eff59c 100644 --- a/examples/validating-public-input/aligned-integration/Cargo.toml +++ b/examples/validating-public-input/aligned-integration/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -aligned-sdk = { git = "https://github.com/yetanotherco/aligned_layer", tag="v0.3.0" } +aligned-sdk = { git = "https://github.com/yetanotherco/aligned_layer", tag="v0.4.0" } tokio = { version = "1.37.0", features = ["io-std", "time", "macros", "rt", "rt-multi-thread", "sync"] } ethers = { tag = "v2.0.15-fix-reconnections", features = ["ws", "rustls"], git = "https://github.com/yetanotherco/ethers-rs.git" } serde = { version = "1.0.201", features = ["derive"] } diff --git a/examples/validating-public-input/aligned-integration/src/main.rs b/examples/validating-public-input/aligned-integration/src/main.rs index a123fb3e1..b5eb87ed7 100644 --- a/examples/validating-public-input/aligned-integration/src/main.rs +++ b/examples/validating-public-input/aligned-integration/src/main.rs @@ -6,36 +6,39 @@ use std::str::FromStr; use aligned_sdk::core::errors::SubmitError; use aligned_sdk::core::types::Chain::Holesky; use aligned_sdk::core::types::{AlignedVerificationData, ProvingSystemId, VerificationData}; -use aligned_sdk::sdk::submit_and_wait; +use aligned_sdk::sdk::{get_next_nonce, submit_and_wait}; use env_logger::Env; -use ethers::signers::LocalWallet; +use ethers::signers::{LocalWallet, Signer}; use ethers::types::Address; use ethers::utils::hex; use log::info; +const BATCHER_URL: &str = "wss://batcher.alignedlayer.com"; +const BATCHER_PAYMENTS_ADDRESS: &str = "0x815aeCA64a974297942D2Bbf034ABEe22a38A003"; +const RPC_URL: &str = "https://ethereum-holesky-rpc.publicnode.com"; +const PROOF_FILE_PATH: &str = "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof"; +const PUB_INPUT_FILE_PATH: &str = "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.pub"; +const IMAGE_ID_FILE_PATH: &str = + "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci_id.bin"; +const PROOF_GENERATOR_ADDRESS: &str = "0x66f9664f97F2b50F62D13eA064982f936dE76657"; +// Set to the 9th address of anvil that doesn't pay for the proof submission +const WALLET_PRIVATE_KEY: &str = "2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6"; + #[tokio::main] async fn main() -> Result<(), SubmitError> { env_logger::Builder::from_env(Env::default().default_filter_or("info")).init(); - let proof = read_file(PathBuf::from( - "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof", - )) - .unwrap_or_default(); + let proof = read_file(PathBuf::from(PROOF_FILE_PATH)).unwrap_or_default(); - let pub_input = read_file(PathBuf::from( - "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.pub", - )); + let pub_input = read_file(PathBuf::from(PUB_INPUT_FILE_PATH)); - let image_id = read_file(PathBuf::from( - "../risc_zero/fibonacci_proof_generator/risc_zero_fibonacci_id.bin", - )); + let image_id = read_file(PathBuf::from(IMAGE_ID_FILE_PATH)); let pub_input_hex = hex::encode(pub_input.as_ref().unwrap()); info!("Pub input bytes as hex: {:?}", pub_input_hex); - let proof_generator_addr = - Address::from_str("0x66f9664f97F2b50F62D13eA064982f936dE76657").unwrap(); + let proof_generator_addr = Address::from_str(PROOF_GENERATOR_ADDRESS).unwrap(); let verification_data = VerificationData { proving_system: ProvingSystemId::Risc0, @@ -46,18 +49,20 @@ async fn main() -> Result<(), SubmitError> { proof_generator_addr, }; - // Set to the 9th address of anvil that doesn't pay for the proof submission - let wallet = - LocalWallet::from_str("2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6") - .expect("Failed to create wallet"); + let wallet = LocalWallet::from_str(WALLET_PRIVATE_KEY).expect("Failed to create wallet"); + + let nonce = get_next_nonce(RPC_URL, wallet.address(), BATCHER_PAYMENTS_ADDRESS) + .await + .expect("Failed to get next nonce"); info!("Submitting Fibonacci proof to Aligned and waiting for verification..."); let aligned_verification_data = submit_and_wait( - "wss://batcher.alignedlayer.com", - "https://ethereum-holesky-rpc.publicnode.com", + BATCHER_URL, + RPC_URL, Holesky, &verification_data, wallet, + nonce, ) .await?; From b6f335654a66bfc92eeba9b60f605509bad3ec0b Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Tue, 6 Aug 2024 16:18:59 -0300 Subject: [PATCH 19/28] refactor: remove get-commitment --- docs/guides/3_validating_public_input.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/docs/guides/3_validating_public_input.md b/docs/guides/3_validating_public_input.md index 0fb6d1655..2c386a49a 100644 --- a/docs/guides/3_validating_public_input.md +++ b/docs/guides/3_validating_public_input.md @@ -20,16 +20,6 @@ To generate the proof needed to try this example, run `make generate_risc_zero_f To check if a proof was verified in Aligned, you need to make a call to the `AlignedServiceManager` contract inside your smart contract. -Also, you will need a way to check that the proven program is the correct one. - -The Aligned CLI provides a way for you to get the verification key commitment without actually generating and submitting a proof. - -You can do this by running the following command: - -```bash -aligned get-commitment --input -``` - The following is an example of how to validate the public input of the Risc0 proof in your smart contract. ```solidity From 63e68af4b6e4c6465622854cdc29603b2f6daca7 Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Tue, 6 Aug 2024 16:52:42 -0300 Subject: [PATCH 20/28] docs: clarify explanation --- docs/guides/3_validating_public_input.md | 41 +++++++++---------- .../contracts/src/FibonacciValidator.sol | 18 ++++---- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/docs/guides/3_validating_public_input.md b/docs/guides/3_validating_public_input.md index 2c386a49a..2669ead64 100644 --- a/docs/guides/3_validating_public_input.md +++ b/docs/guides/3_validating_public_input.md @@ -23,14 +23,14 @@ To check if a proof was verified in Aligned, you need to make a call to the `Ali The following is an example of how to validate the public input of the Risc0 proof in your smart contract. ```solidity -// SPDX-License-Identifier: MIT -pragma solidity 0.8.19; +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.12; contract FibonacciValidator { address public alignedServiceManager; - bytes32 public fibonacciImageId; + bytes32 public fibonacciProgramId; - bytes32 public fibonacciImageIdCommitment = + bytes32 public fibonacciProgramIdCommitment = 0xbfa561e384be753bd6fd75b15db31eb511cd114ec76d619a87c2342af0ee1ed7; event FibonacciNumbers(uint32 fibN, uint32 fibNPlusOne); @@ -42,20 +42,20 @@ contract FibonacciValidator { function verifyBatchInclusion( bytes32 proofCommitment, bytes32 pubInputCommitment, - bytes32 provingSystemAuxDataCommitment, + bytes32 programIdCommitment, bytes20 proofGeneratorAddr, bytes32 batchMerkleRoot, bytes memory merkleProof, uint256 verificationDataBatchIndex, - bytes memory journalBytes + bytes memory pubInputBytes ) public returns (bool) { require( - fibonacciImageIdCommitment == provingSystemAuxDataCommitment, - "Image ID doesn't match" + fibonacciProgramIdCommitment == programIdCommitment, + "Program ID doesn't match" ); require( - pubInputCommitment == keccak256(abi.encodePacked(journalBytes)), + pubInputCommitment == keccak256(abi.encodePacked(pubInputBytes)), "Fibonacci numbers don't match with public input" ); @@ -67,7 +67,7 @@ contract FibonacciValidator { "verifyBatchInclusion(bytes32,bytes32,bytes32,bytes20,bytes32,bytes,uint256)", proofCommitment, pubInputCommitment, - provingSystemAuxDataCommitment, + programIdCommitment, proofGeneratorAddr, batchMerkleRoot, merkleProof, @@ -77,7 +77,7 @@ contract FibonacciValidator { require(callWasSuccessful, "static_call failed"); - (uint32 fibN, uint32 fibNPlusOne) = bytesToTwoUint32(journalBytes); + (uint32 fibN, uint32 fibNPlusOne) = bytesToTwoUint32(pubInputBytes); emit FibonacciNumbers(fibN, fibNPlusOne); @@ -106,23 +106,22 @@ contract FibonacciValidator { ### Explanation -1. **Verification Key Check:** The contract first checks if the verification key commitment matches the Fibonacci Image ID commitment. +1. **Program Identifier Validation:** The contract first validates if the provided program identifier matches the expected one. ```solidity require( - fibonacciImageIdCommitment == provingSystemAuxDataCommitment, - "Image ID doesn't match" - ); + fibonacciProgramIdCommitment == programIdCommitment, + "Program ID doesn't match" +); ``` -2. **Public Input Commitment Validation:** The contract validates that the public input commitment matches the keccak256 hash of the journalBytes. +2. **Public Input Validation:** The contract then checks that the commitment of the public inputs matches the keccak 256 hash of the actual public inputs. ```solidity require( - pubInputCommitment == keccak256(abi.encodePacked(journalBytes)), - "Fibonacci numbers don't match with public input" + pubInputCommitment == keccak256(abi.encodePacked(pubInputBytes)), + "Fibonacci numbers don't match with public input" ); - ``` 3. **Static Call to AlignedServiceManager**: The contract makes a static call to the `AlignedServiceManager` contract to check if the proof was verified in Aligned. It then extracts the last two Fibonacci numbers from the journalBytes and emits an event. @@ -136,12 +135,12 @@ require( "verifyBatchInclusion(bytes32,bytes32,bytes32,bytes20,bytes32,bytes,uint256)", proofCommitment, pubInputCommitment, - provingSystemAuxDataCommitment, + programIdCommitment, proofGeneratorAddr, batchMerkleRoot, merkleProof, verificationDataBatchIndex - ) + ) ); require(callWasSuccessful, "static_call failed"); diff --git a/examples/validating-public-input/contracts/src/FibonacciValidator.sol b/examples/validating-public-input/contracts/src/FibonacciValidator.sol index daecc8bd8..32c2d42c8 100644 --- a/examples/validating-public-input/contracts/src/FibonacciValidator.sol +++ b/examples/validating-public-input/contracts/src/FibonacciValidator.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.12; contract FibonacciValidator { address public alignedServiceManager; - bytes32 public fibonacciImageId; + bytes32 public fibonacciProgramId; - bytes32 public fibonacciImageIdCommitment = + bytes32 public fibonacciProgramIdCommitment = 0xbfa561e384be753bd6fd75b15db31eb511cd114ec76d619a87c2342af0ee1ed7; event FibonacciNumbers(uint32 fibN, uint32 fibNPlusOne); @@ -17,20 +17,20 @@ contract FibonacciValidator { function verifyBatchInclusion( bytes32 proofCommitment, bytes32 pubInputCommitment, - bytes32 provingSystemAuxDataCommitment, + bytes32 programIdCommitment, bytes20 proofGeneratorAddr, bytes32 batchMerkleRoot, bytes memory merkleProof, uint256 verificationDataBatchIndex, - bytes memory journalBytes + bytes memory pubInputBytes ) public returns (bool) { require( - fibonacciImageIdCommitment == provingSystemAuxDataCommitment, - "Image ID doesn't match" + fibonacciProgramIdCommitment == programIdCommitment, + "Program ID doesn't match" ); require( - pubInputCommitment == keccak256(abi.encodePacked(journalBytes)), + pubInputCommitment == keccak256(abi.encodePacked(pubInputBytes)), "Fibonacci numbers don't match with public input" ); @@ -42,7 +42,7 @@ contract FibonacciValidator { "verifyBatchInclusion(bytes32,bytes32,bytes32,bytes20,bytes32,bytes,uint256)", proofCommitment, pubInputCommitment, - provingSystemAuxDataCommitment, + programIdCommitment, proofGeneratorAddr, batchMerkleRoot, merkleProof, @@ -52,7 +52,7 @@ contract FibonacciValidator { require(callWasSuccessful, "static_call failed"); - (uint32 fibN, uint32 fibNPlusOne) = bytesToTwoUint32(journalBytes); + (uint32 fibN, uint32 fibNPlusOne) = bytesToTwoUint32(pubInputBytes); emit FibonacciNumbers(fibN, fibNPlusOne); From df3c9e1552f2f8a517604b7de757923e9ddeddeb Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 8 Aug 2024 10:38:59 -0300 Subject: [PATCH 21/28] chore: bump up risc0 version --- examples/validating-public-input/Makefile | 2 +- .../fibonacci_proof_generator/Cargo.lock | 346 +++++++++++------- .../fibonacci_proof_generator/host/Cargo.toml | 2 +- .../methods/Cargo.toml | 2 +- .../methods/build.rs | 16 +- .../methods/guest/Cargo.lock | 116 +++--- .../methods/guest/Cargo.toml | 2 +- 7 files changed, 292 insertions(+), 194 deletions(-) diff --git a/examples/validating-public-input/Makefile b/examples/validating-public-input/Makefile index 42246187d..59b00d230 100644 --- a/examples/validating-public-input/Makefile +++ b/examples/validating-public-input/Makefile @@ -1,6 +1,6 @@ generate_risc_zero_fibonacci_proof: @cd risc_zero/fibonacci_proof_generator && \ - cargo run --release && \ + cargo run && \ echo "Fibonacci proof, pub input and image ID generated in risc_zero folder" submit_fibonacci_proof: diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.lock b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.lock index b36901506..cf83f9a7b 100644 --- a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.lock +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.lock @@ -261,7 +261,7 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object 0.36.1", + "object 0.36.3", "rustc-demangle", ] @@ -330,9 +330,11 @@ dependencies = [ [[package]] name = "bonsai-sdk" -version = "0.8.0" -source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +version = "0.9.0" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ + "duplicate", + "maybe-async", "reqwest 0.12.5", "risc0-groth16", "serde", @@ -347,9 +349,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.16.1" +version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" +checksum = "102087e286b4677862ea56cf8fc58bb2cdfa8725c40ffb80fe3a008eb7f2fc83" dependencies = [ "bytemuck_derive", ] @@ -362,7 +364,7 @@ checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -373,9 +375,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" dependencies = [ "serde", ] @@ -414,9 +416,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.5" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052" +checksum = "504bdec147f2cc13c8b57ed9401fd8a147cc66b67ad5cb241394244f2c947549" dependencies = [ "jobserver", "libc", @@ -582,7 +584,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -593,7 +595,7 @@ checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -646,7 +648,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -675,6 +677,16 @@ dependencies = [ "tokio", ] +[[package]] +name = "duplicate" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de78e66ac9061e030587b2a2e75cc88f22304913c907b11307bca737141230cb" +dependencies = [ + "heck", + "proc-macro-error", +] + [[package]] name = "either" version = "1.13.0" @@ -765,9 +777,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920" dependencies = [ "crc32fast", "miniz_oxide", @@ -850,7 +862,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -954,6 +966,12 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.3.9" @@ -1127,7 +1145,7 @@ dependencies = [ "http 1.1.0", "hyper 1.4.1", "hyper-util", - "rustls 0.23.11", + "rustls 0.23.12", "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", @@ -1137,9 +1155,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" +checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" dependencies = [ "bytes", "futures-channel", @@ -1167,9 +1185,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0" dependencies = [ "equivalent", "hashbrown 0.14.5", @@ -1213,9 +1231,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] @@ -1231,9 +1249,9 @@ dependencies = [ [[package]] name = "lazy-regex" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d12be4595afdf58bd19e4a9f4e24187da2a66700786ff660a418e9059937a4c" +checksum = "576c8060ecfdf2e56995cf3274b4f2d71fa5e4fa3607c1c0b63c10180ee58741" dependencies = [ "lazy-regex-proc_macros", "once_cell", @@ -1242,14 +1260,14 @@ dependencies = [ [[package]] name = "lazy-regex-proc_macros" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44bcd58e6c97a7fcbaffcdc95728b393b8d98933bfadad49ed4097845b57ef0b" +checksum = "9efb9e65d4503df81c615dc33ff07042a9408ac7f26b45abee25566f7fbfd12c" dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -1319,14 +1337,25 @@ dependencies = [ [[package]] name = "matrixmultiply" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" dependencies = [ "autocfg", "rawpointer", ] +[[package]] +name = "maybe-async" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "memchr" version = "2.7.4" @@ -1366,13 +1395,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.11" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" dependencies = [ + "hermit-abi", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -1447,16 +1477,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "nvtx" version = "1.3.0" @@ -1479,9 +1499,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.1" +version = "0.36.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" dependencies = [ "memchr", ] @@ -1556,7 +1576,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -1573,9 +1593,36 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] [[package]] name = "proc-macro2" @@ -1606,21 +1653,22 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] name = "quinn" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" +checksum = "b22d8e7369034b9a7132bc2008cac12f2013c8132b45e0554e6e20e2617f2156" dependencies = [ "bytes", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.11", + "rustls 0.23.12", + "socket2", "thiserror", "tokio", "tracing", @@ -1628,15 +1676,15 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.3" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" +checksum = "ba92fb39ec7ad06ca2582c0ca834dfeadcaf06ddfc8e635c80aa7e1c05315fdd" dependencies = [ "bytes", "rand", "ring", "rustc-hash", - "rustls 0.23.11", + "rustls 0.23.12", "slab", "thiserror", "tinyvec", @@ -1645,9 +1693,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" +checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" dependencies = [ "libc", "once_cell", @@ -1749,9 +1797,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.5" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -1857,8 +1905,8 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.11", - "rustls-pemfile 2.1.2", + "rustls 0.23.12", + "rustls-pemfile 2.1.3", "rustls-pki-types", "serde", "serde_json", @@ -1866,10 +1914,12 @@ dependencies = [ "sync_wrapper 1.0.1", "tokio", "tokio-rustls 0.26.0", + "tokio-util", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", + "wasm-streams", "web-sys", "webpki-roots 0.26.3", "winreg 0.52.0", @@ -1892,8 +1942,8 @@ dependencies = [ [[package]] name = "risc0-binfmt" -version = "1.0.1" -source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "anyhow", "elf", @@ -1905,8 +1955,8 @@ dependencies = [ [[package]] name = "risc0-build" -version = "1.0.1" -source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "anyhow", "cargo_metadata", @@ -1922,8 +1972,8 @@ dependencies = [ [[package]] name = "risc0-build-kernel" -version = "1.0.1" -source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "cc", "directories", @@ -1937,8 +1987,8 @@ dependencies = [ [[package]] name = "risc0-circuit-recursion" -version = "1.0.1" -source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "anyhow", "bytemuck", @@ -1958,8 +2008,8 @@ dependencies = [ [[package]] name = "risc0-circuit-recursion-sys" -version = "1.0.1" -source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "glob", "risc0-build-kernel", @@ -1969,8 +2019,8 @@ dependencies = [ [[package]] name = "risc0-circuit-rv32im" -version = "1.0.1" -source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "anyhow", "bytemuck", @@ -1995,8 +2045,8 @@ dependencies = [ [[package]] name = "risc0-circuit-rv32im-sys" -version = "1.0.1" -source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "glob", "risc0-build-kernel", @@ -2006,8 +2056,8 @@ dependencies = [ [[package]] name = "risc0-core" -version = "1.0.1" -source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "bytemuck", "rand_core", @@ -2015,8 +2065,8 @@ dependencies = [ [[package]] name = "risc0-groth16" -version = "1.0.1" -source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "anyhow", "ark-bn254", @@ -2038,8 +2088,8 @@ dependencies = [ [[package]] name = "risc0-sys" -version = "1.0.1" -source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "cc", "risc0-build-kernel", @@ -2047,8 +2097,8 @@ dependencies = [ [[package]] name = "risc0-zkp" -version = "1.0.1" -source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "anyhow", "blake2", @@ -2075,8 +2125,8 @@ dependencies = [ [[package]] name = "risc0-zkvm" -version = "1.0.1" -source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "addr2line", "anyhow", @@ -2112,8 +2162,8 @@ dependencies = [ [[package]] name = "risc0-zkvm-platform" -version = "1.0.1" -source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "bytemuck", "getrandom", @@ -2138,9 +2188,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" [[package]] name = "rustc_version" @@ -2178,14 +2228,14 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.11" +version = "0.23.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4828ea528154ae444e5a642dbb7d5623354030dc9822b83fd9bb79683c7399d0" +checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.5", + "rustls-webpki 0.102.6", "subtle", "zeroize", ] @@ -2201,9 +2251,9 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" dependencies = [ "base64 0.22.1", "rustls-pki-types", @@ -2211,9 +2261,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" [[package]] name = "rustls-webpki" @@ -2227,9 +2277,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.5" +version = "0.102.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78" +checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" dependencies = [ "ring", "rustls-pki-types", @@ -2280,31 +2330,32 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.204" +version = "1.0.205" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.204" +version = "1.0.205" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -2409,9 +2460,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.71" +version = "2.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" dependencies = [ "proc-macro2", "quote", @@ -2459,34 +2510,35 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.10.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", "fastrand", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "thiserror" -version = "1.0.62" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.62" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -2516,18 +2568,17 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.1" +version = "1.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "pin-project-lite", "socket2", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2546,7 +2597,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.11", + "rustls 0.23.12", "rustls-pki-types", "tokio", ] @@ -2611,7 +2662,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -2692,9 +2743,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "typetag" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "661d18414ec032a49ece2d56eee03636e43c4e8d577047ab334c0ba892e29aaf" +checksum = "1f7ec175048b96728c30152928c52161bfcc8ea2bd3fb7ed4ccb7dec060b2834" dependencies = [ "erased-serde", "inventory", @@ -2705,13 +2756,13 @@ dependencies = [ [[package]] name = "typetag-impl" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac73887f47b9312552aa90ef477927ff014d63d1920ca8037c6c1951eab64bb1" +checksum = "84b5474fd169a5b02b6782b56bbbbff27e85947d4488e5501123687db3148647" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -2760,9 +2811,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "want" @@ -2800,7 +2851,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", "wasm-bindgen-shared", ] @@ -2834,7 +2885,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2845,6 +2896,19 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +[[package]] +name = "wasm-streams" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "web-sys" version = "0.3.69" @@ -2872,9 +2936,9 @@ dependencies = [ [[package]] name = "which" -version = "6.0.1" +version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8211e4f58a2b2805adfbefbc07bab82958fc91e3836339b1ab7ae32465dce0d7" +checksum = "3d9c5ed668ee1f17edb3b627225343d210006a90bb1e3745ce1f30b1fb115075" dependencies = [ "either", "home", @@ -2922,6 +2986,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -3084,6 +3157,7 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] @@ -3095,7 +3169,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -3115,14 +3189,14 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] name = "zip" -version = "2.1.3" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775a2b471036342aa69bc5a602bc889cb0a06cda00477d0c69566757d5553d39" +checksum = "40dd8c92efc296286ce1fbd16657c5dbefff44f1b4ca01cc5f517d8b7b3d3e2e" dependencies = [ "arbitrary", "crc32fast", diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/Cargo.toml b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/Cargo.toml index 9a994c98f..e62ab139e 100644 --- a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/Cargo.toml +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" [dependencies] methods = { path = "../methods" } -risc0-zkvm = { git = "https://github.com/risc0/risc0", tag="v1.0.1", default-features = false, features = ["prove"] } +risc0-zkvm = { git = "https://github.com/risc0/risc0", tag="v1.0.5", default-features = false, features = ["prove"] } tracing-subscriber = { version = "0.3", features = ["env-filter"] } serde = "1.0" bincode = "1.3.3" diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/Cargo.toml b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/Cargo.toml index e46a466a7..1f3809b1f 100644 --- a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/Cargo.toml +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [build-dependencies] -risc0-build = { git = "https://github.com/risc0/risc0", tag="v1.0.1"} +risc0-build = { git = "https://github.com/risc0/risc0", tag="v1.0.5"} [package.metadata.risc0] methods = ["guest"] diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/build.rs b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/build.rs index 08a8a4eb7..4496ee2bf 100644 --- a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/build.rs +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/build.rs @@ -1,3 +1,17 @@ +use std::collections::HashMap; + +use risc0_build::{DockerOptions, GuestOptions}; + fn main() { - risc0_build::embed_methods(); + let docker_options = Some(DockerOptions { root_dir: None }); + + let guest_options = HashMap::from([( + "risc0-zkvm-methods-guest", + GuestOptions { + features: vec![], + use_docker: docker_options, + }, + )]); + + risc0_build::embed_methods_with_options(guest_options); } diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.lock b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.lock index 8369c3242..458a866c4 100644 --- a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.lock +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.lock @@ -16,9 +16,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.83" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bdb32cbbdce2b519a9cd7df3a678443100e265d5e25ca763b7572a5104f5f3" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "ark-bn254" @@ -219,24 +219,30 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.16.0" +version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5" +checksum = "102087e286b4677862ea56cf8fc58bb2cdfa8725c40ffb80fe3a008eb7f2fc83" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.64", + "syn 2.0.72", ] +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "cfg-if" version = "1.0.0" @@ -299,9 +305,9 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "either" -version = "1.11.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "elf" @@ -369,9 +375,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.154" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libm" @@ -381,9 +387,9 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "num-bigint" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", @@ -427,15 +433,18 @@ checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro2" -version = "1.0.82" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -477,8 +486,8 @@ checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" [[package]] name = "risc0-binfmt" -version = "1.1.0-alpha.1" -source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "anyhow", "elf", @@ -490,8 +499,8 @@ dependencies = [ [[package]] name = "risc0-circuit-recursion" -version = "1.1.0-alpha.1" -source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "anyhow", "bytemuck", @@ -503,8 +512,8 @@ dependencies = [ [[package]] name = "risc0-circuit-rv32im" -version = "1.1.0-alpha.1" -source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "anyhow", "risc0-binfmt", @@ -517,8 +526,8 @@ dependencies = [ [[package]] name = "risc0-core" -version = "1.1.0-alpha.1" -source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "bytemuck", "rand_core", @@ -526,8 +535,8 @@ dependencies = [ [[package]] name = "risc0-groth16" -version = "1.1.0-alpha.1" -source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "anyhow", "ark-bn254", @@ -544,8 +553,8 @@ dependencies = [ [[package]] name = "risc0-zkp" -version = "1.1.0-alpha.1" -source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "anyhow", "blake2", @@ -565,8 +574,8 @@ dependencies = [ [[package]] name = "risc0-zkvm" -version = "1.1.0-alpha.1" -source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "anyhow", "bytemuck", @@ -589,8 +598,8 @@ dependencies = [ [[package]] name = "risc0-zkvm-platform" -version = "1.1.0-alpha.1" -source = "git+https://github.com/risc0/risc0#39d729690ebe97dcb4244099948be89e538d439d" +version = "1.0.5" +source = "git+https://github.com/risc0/risc0?tag=v1.0.5#a165a6e3443fbc2e4f7093d7552399cd56337928" dependencies = [ "bytemuck", "getrandom", @@ -624,22 +633,22 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.202" +version = "1.0.205" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.202" +version = "1.0.205" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.64", + "syn 2.0.72", ] [[package]] @@ -655,9 +664,9 @@ dependencies = [ [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -672,9 +681,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.64" +version = "2.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ad3dee41f36859875573074334c200d1add8e4a87bb37113ebd31d926b7b11f" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" dependencies = [ "proc-macro2", "quote", @@ -700,7 +709,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.64", + "syn 2.0.72", ] [[package]] @@ -723,9 +732,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" @@ -735,29 +744,30 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "zerocopy" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.64", + "syn 2.0.72", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -770,5 +780,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.64", + "syn 2.0.72", ] diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.toml b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.toml index 39063d13b..ee4029c28 100644 --- a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.toml +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/guest/Cargo.toml @@ -7,4 +7,4 @@ edition = "2021" [dependencies] # If you want to try (experimental) std support, add `features = [ "std" ]` to risc0-zkvm -risc0-zkvm = { git = "https://github.com/risc0/risc0", default-features = false } +risc0-zkvm = { git = "https://github.com/risc0/risc0", tag="v1.0.5", default-features = false } From 2d1b01b91cfcc441886e4819d752873c98336713 Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 8 Aug 2024 13:58:32 -0300 Subject: [PATCH 22/28] fix: docker container --- .../methods/build.rs | 34 ++++++++++++------ .../risc_zero_fibonacci.proof | Bin 215590 -> 215590 bytes .../risc_zero_fibonacci_id.bin | Bin 32 -> 32 bytes 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/build.rs b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/build.rs index 4496ee2bf..c10babb5f 100644 --- a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/build.rs +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/methods/build.rs @@ -1,17 +1,31 @@ -use std::collections::HashMap; +use std::{collections::HashMap, env, path::PathBuf}; use risc0_build::{DockerOptions, GuestOptions}; fn main() { - let docker_options = Some(DockerOptions { root_dir: None }); + match env::current_dir() { + Ok(current_dir) => { + if let Some(parent) = current_dir.parent() { + let parent_path = PathBuf::from(parent); + // Set the root directory for Docker to risc_zero/fibonacci_proof_generator - let guest_options = HashMap::from([( - "risc0-zkvm-methods-guest", - GuestOptions { - features: vec![], - use_docker: docker_options, - }, - )]); + let docker_options = Some(DockerOptions { + root_dir: Some(parent_path), + }); - risc0_build::embed_methods_with_options(guest_options); + let guest_options = HashMap::from([( + "fibonacci", + GuestOptions { + features: vec![], + use_docker: docker_options, + }, + )]); + + risc0_build::embed_methods_with_options(guest_options); + } else { + println!("The current directory does not have a parent."); + } + } + Err(e) => println!("Error getting current directory: {}", e), + } } diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof index 8cf9d06eb57d2121d355a38074c77fe20041580d..f22360927967ee2913a53fcb3bb0326b933bf912 100644 GIT binary patch literal 215590 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

cg2)x1etL+w+_zu11hYcE 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 z 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 Q2Td&bzx{vC`2W)XFKYDcH2?qr delta 213408 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%0A`|4NNUy^>$sLU}6zACN&0qP-x1 zC>vEbZ#XK?CEHutqmoyERk}t-cXvs=4;C_gWbZgs+&KCZ5LU2t6iq*AK z(%)KWK%Na&<*SDbZ3G)D?~aBuHAYP>fUR*)176A_h}m&JOAD_N__eJlsg=w)oOxd> z{m*AE%_8n3-Bv<9K=TbJ{U?9(9eGl1XeZAj5RV2bb?i6C528@e7lk1WRVyq+LX|zC zUg_CGM_QwXIB^Ct4s-3XfNR(JLI|4aw+KHMUQAQ0P9A$X${jPLf+70U!c;TcBn+%AXH;r~-%Pz<1P1XH zrx{*`Txf6X5=WfREm`<8&jHe7sS*=y8zevc_if0%d@R~jcq@}ibO&$O=12@dzEKd~ zmL>`*nzyCfFOGz)+A_z6TYbj=TPeo1XkVGl}EQ{@&oa8q^ui7r;Wd$|qx+z}jF zYXV(~#5_qlL&HOUus#IKcUV9aN#`sZhg@~R+<|S{)yYVZ_q1x1Xx?2{n`}#!2OLDy zp%FrFbc+r>!zDLoa9CBoM;k=JQLqa{Bm++ONgHrkq+8o-V3%7z z1mS%i%V?2Jfp)_fzEId=!c{+04X&pLY8d1K7JYJSkw8vs&oQ3}(p=DC@_NZBg|B5! zuS~WzdL5p1SrFR-rfw5<)dmP5vXJ&_a}@F&BLVtg4J0vI*2e2=;rCq)8{*ks+hngU z;RtXYZ?~RS2rPf+5r`~VaYQ`ACdFu$MS{t}27LtW5l9IX8NdH~T7k)iYHjYr5jl}Q z07apiYVgReOPcUGc6ZnF8EKmYF52UN4*Ln6Lo>m$Ji`uoOVDfq2D`cgJHmoZJu(|0 zDGm7bEuI+H3ADCXO_)YbU(0XEZ53uObV!4YUh8$nQNVxfBWTkPsxnp`VmY(V^#e%k@DYhe7&>4eyk9L*I&|YU&~dZQ?p`)5JQP9h4h37& zn`bdXVpm93z9xD&av;^YO(!mrNJ9U#4Kj_YjRix59b=9CJtBqfhz6I#P9Qhh7d0i@ zc~aCV&>w$Wbl?^2*4SmnF=tDHuAE7{N~LC){<=^q3(ziClXfFEOCT;t23~fp25x3; zC+Kf0+^Zk&c^xnM)~rN{$6jG&?zlpdszY(tD?mmhnlMJ6Z0`^hD>5FO%i%k{Pf-?x zSoA(AR%kF3q%Ah%bIo5D-4QAAAn+PLUA7M>kxYLN!>0r@6B4{5B~u0Je<`{)x#N0NE7+j_}z7)QVh7HsPBbY?YK-RtSn?su6TbK^dD?UAkTl8vXKC zMW=s$G~QKv2Jv9?FxI;~7wCC`YecrME5TctA7Bo{J>Z=ZIlR-ORt_bP8iivK91O%^ zWf?-s1AT$zDHlkPDXConEA)w0Wj~yL0c{TSZq$BnZsr$FNd1vxcY-`-cDNO;a-Aez zRj+^tav5tTM6cbyMm@>G3Z;r#NB4YpHTZwf8y(u7bXpG&0yX6fG)J-Q-)6`XQZK>h z6F)-0vP_wSV?eX-(qF;knJD*MH&xYk7X+P$03o>dpD~UIsaCp(SXSvJlO)!N4o2nM zzh|$q>saG=&oMvskxA5xzFON4SZ`u^U3SSn{UQdXR!<`TSxhk;hBU$Rj|@Z{S5AM| z{61pr5(F(@t{ppczo$u!VUh*GrGQy+B48%Jtm{vMku-Lwbh8*rG-*^rk;7CSv2_Xp zHl9hB4A?Ddqz+`Chr%}HDatmhNvB{{|F2s|^4MDVAX+V%IVx;mcKmTDHheeg!8li> zPAx<|Gx$#*v7jA9dPpg83r;MNVU2$)t_Dg~&Z)i;b(BeBRF7^y=~^C5LXSNahxV@~ zyQ{GqOd)9kze0s|MH}Z529k$YDT2}vH+KFX%V)0<{p1A`2)M}>ir}Mi3hlHielq%T zq3C`I3}-F}OhHy8Gkgn2^RbvZ2W<#1c3&aAHAy9HX6hD%?1K(4BOTY5vGDI5g8+j988(>2Z9dX=n4&U2)ZTGr7CVkf-Ho9Jz z1W@H_2UtsKYZEVk5U*Y^Mr7g2O6V?HHb{G=Wys-&MloIfF1WVl8N#joL@(4}H+-WB z0a}a~F@})` zJOWRuydNvbrD=ERnnzsY-xdw^*b6AMwQsAk($eaKa035{W( z`&2jgutsMAB*Q>;F~I=)N@hzX!R$4-QX>>Z8G$f64RmWL8HPQ(S(8P_WxZV^FiAMt zD*{;27KsLw*DYrrZ66*Y%>`<4VK*pqmVj0AIfh}i3vp#ky-sk$QG^^8i5>$5K}>39 zl$Q_8LQZ5wv#fPrr)z&3lb|sGb?L(Z6nZFeUJl%Vgw}`YACu6 z+D$JD*=9~0P{EBgL9FyB?SZa!(5fydgrn>tx-E1g$D_LjS{PX}WX4MZj?jf}LmtL* zR5yAR(5#U?tLp+>Q_f@xYYv$-l3K?s*TeT2))KfHIXmQZB*A|a3_;;W6N|}rVvlgq zM%{8rY3T~!OzR(MucA*U|K zOFSKzyi|9kOP>tsrA%pv8q`woWF0n~E<9tgUl3QCre|~iauX)sfU8dcQ~|`EUtkJgOf+o6==A)qS!9wKifqsIEZ^+NU~ZT`)LutR+Dl zHnW{D!C93a@?zgnuy@g&SO0{YQtcO}Jdr4yY& zvf}Dggx0)WVkzS}divWuUM3GBg^JE{h9xIYVXA*tManS3I)geuL}fwy48Z8ZQ`LRh zL)*UeA~meX2tf&`FCKpkGm)#1T(?d14LE!^TKrg;Jn;a!Z)0J(be^>76%p`BPAKLD z3qMJ*ThCt|G_uXq1kAg1azaN2K`gESYlc(NaVoLhXm*=`S46;wDAB0}S*xot2)m%8 zHaLGUH#VkGOj79X$pHj7sUnEgHCm_&R&|)u>jjP~kR$DFdOu-pXbPYwRtF9ezI6t| z&PVVLWm4^g!#3^~6;3+z0XVPGBX!g7su&9tjA1pw|$QYXg71xNRTs5C31nvW+BkNfk}-{5Lq}cgqEp z(fu*7yp>qWu*pT_vTivT?}Zy(6(Jw+7E3lFk5pjbKptN9vXfix zC_r~XQMnf`4)6roRT4aRwJ>964Wb+-!>CMWjH(@eK~@zEkiip_dN5zlEqOH*abSOA zZW#YRnsz^C&r7pY6k7scigcwUzc?y14>+Ax0dA=Pl1eX6Lx!0FJXTy_ak_s(l4cej z@@sQdL8v?=bn+x;+5b^kkFpMI%7;f#*L5&h0ZQC$HBsIjyk3heYoT@ov|n%#CMqB< z%VTB)|MA*wT|~V#{p^_tVY;hA>ra2MSXB8MXWAM_JY*FoU%JlNI7pula8uTuJxkEJ zbk4C^Q}or!L>jEnYS2^}EFtShAkt8DNGpe2Y!uT+1nUm)S(bGLAdet?Bj_=Q90YfE z9mu5GU=1@x6Se8qxm!T=n)<^!@<=~&IuacwD%a1w9Y(*i0hkr4ZXpAbi3 zYA~a`Lk(WnEe7w58ZA8RWD|d%^S?tc;#fRIh{2QZhXh8&bg5cM#_Kw; zAOT4@NcclY(pfOK4CXk-7u6}pO+X%=Ht|QhcpG%SjnE`Ae2Yuy#OHq;j=vxjy;S9I zb`U&UoB(10Eg@8Q#gEw|{4>C9qvRVhQjuRU==HNw`so5<&XVyTg>-`@s$%0F#bniW zZq#aO7dwd>sI+Sptfd)ovUkZd@>*mYAy>L>>kCj_Epfgd{CrDCG0etG7DGh@#eaJ@ z1~b)QZbh^jRNm}eiJpIsVUMTETPcw*1T)n4ajtzmM*mBtJ6O0gL{?T%SZ>2GRop2X z80)$HL!2EH5N%R;80%ymO^`w$S6<5QP1yy%X>OcGC&Q549$$2TBc{AOXVh7_AIV7u zT)6xgIh3B>UNiLuBkQ6c1*V8dH9n2`OQ>yDAgoa76QdeRK^=chw_=EEux1L!|3kS` z$_O_szHZaQ-bzh*_)@E>wO6zkBw}Jf!5|`D<3--D$y~WNpcYNj=Q8IsB4T*!gj2xk z?ot^`=Rb7En_@nkz#L(Gd_*lex;7%EcyNC{Nl(KFT0!+Gj|8M~AxZUIPfD!w8Wk+> zuU&D|l~Wo=wp)L`OLQD|Z%ZIu^fMYR*ESz}S4t;Zp8zbBySGfRgk=z0SXMc=I9XLz zI`A|j+3ExRw8sH^pQshh=WaMMdp}`1akd{Vo$7Qrn}`S5E;2U9qZ|%hc^MkBfhJIo zTo4FEDf}t2y$%=doyIqS91}`lvX*xHG=DCE-U&k+A~=65ko})ijb#I7sCZ=2aL<8UDEQyM*k<*3v;NDMwrbcAhVAhw>*{5tuCv^w;S`Ql{RV#^@qQO zNx&7$zgC?A@BXF>U5@PVP~}}wTYnwngN@Kr{fne_a4IbOjw@lrO?QZS&*UTB#m^GKnKHGR&-r#k4vng0| zVrn>4V?h{CvCxxfdLD04X1FhiI3ZC!%VYAJ9A&X@qn7>;JDodOcm9ZE+AY90^p~wH<&q-bd?~p><<&uT2EoH+XS4Hdh9d z4Sowo?vkS1!UsLd|2ks|7+&%H8j2_9X2I}J1Yto^zb)b!c7)+5f!UCz>~JN%D?&<+ zQ`c-=)g~DBI(lgeZZ*2bUKs84YCWAK`tMY&zX=A6zSkS0bcV$pwb1NXp6_9fPgem( zIh@zH>zGiqM2+=m-Mek34;StDWuf=uNxvxeZxQ;DmN$PwI`$uOpD9+FJC6AC0`Hs` zdEGsr_d}t}PQ>TTX+38|36-}L*r_06%v+e?NfN&;a;e}{)A>iWgIA!h1!<%qmM*8B z2jcZG^rp;B3$5R^J-~h>5n8#bupV21+H)Osz=h=x2dk88k zR0-X7bd$dI_X*p~q$hN4>$6Qs(6p@0mkEvrZTm2_9dD_}`rD509%aau8{41}Orw4( zLi(Boe0QO9CKc+uMPSs{?BC$q`D>2*pAV!y$1cMWA0NX%j#^pr+i|*YDbW|CpD9WB zsK4YjFHG%4HYyqeCk0Q*u5;IMZrCAv@{8vt9O)lzB+Q2W?Zboq1xZ#pQ49>>;qo(V zJc7gO;z!je1*&ZDcASZK=?)Er>AaV4QD@i`eb6}m{+(F=z$+l>$|EM}edurD;E5a7^Wm2E!~qozLUo7n zJt6&|zjPGLho^{S3@v(2>We};@&khc}9tG z?0yjqc&C}fiCHs(g}&#sttmGZZ9NE%<)S#{5?Hmb4S8@Ix(SBUrziICzoyMRLF zKx!IB2F$POST_9~V_6QH@Wj>uCFol#5mTQ~VWj4EAf@yXU&^Wl=;NJVC_;Z1>z^%7 zSLSEok^2;jf1N_XOlaCPqgzQx5c8V=DTyE*vA3D0T5NWCHdSeV7{?#xCh)g!V#(&& zTpfbPv~%?S7}|*tBbv@9#*qFa)iZbQk-<+rY5Dn`3IlHbDumLn77=7sq^v_VSzYiZ zgz3|l23bMIR)qM(V>P>UJ~#SnF`}TWS9sFmFP|E0wzslrj4x*91taZ^xlh}sA{El} zGDdbk5Nt^KFHFZfTZpvG0sp(84p`^haQn7qY(e+$Oq94vFmyDAOdBj!VjU$N4D|{= ze77yuFjf)^P&JWb*HWtGhWVPjv-g&@M0)_SKu;evkb51gU_522S7Y>#hr-6m`B3=D zV?nELlfflLo1UeLVTP7lXw+;A7ehDXg)+Ha0V)0|-suk}z~UJq*z2Lu*Emnk5EQ0G zg6_^K2*Z<{kK*sGrD}{>ozMtH|2f!s6~MX^0IqXiRvj@tUunN!OTpsV--FJ6<79iY z5YbEv>|CGjSjW1M1Z-ASGTHAH3+uOje*itP4Ku&?`wRR+G+M|K>7WO`=E$+bUC$^r z_LN%Kbz;f=RWs^eVwakw)9U!Q-QLyhIsF|bmQR~+!NMHz4Qy@u)9N9&-11}oNl!sH zxk(qx2)Hfb(ys-i_Rl^0U3hH#$m7K5l4nl^D(^K*a6YqCD}AI7{EsJ+*&^S=6O{SZ zT+DyLI@V)V@j8byIGnFn!hKguD9P5)D@UVDHb4?bExW0}p?)FPZ{)rZr*TpV*of}W z=xu33)S8HHH`9nf8CFkkE2!`%n)cKmiJq{JGY`Qv#YShR%)v^Xu{>MvU}Hp4scqFz z8xMDA{Q0zN;J(c%Un!&W?Ao$ZjNE_wH3kh{2CS%!0Y(rNE|pGswo|LN93SeL_59qY z;lL>@DWX1%wNEP;e|dw)WkkISLocXozCTH(zzLF9MYzf z>hQl8HhqO69$H-Hx+sBV*b8_392m5skRakzlggD<{nORa_rSjVkEvhZ{j}iIm`J|2 zCs7LPE3pCT-P)1QQM%?X3TB1`X*x*^kJAtOg3vk_Yz2H;8OSH-l=-a8CJ6FADPL7-4bb|Q!SG^xHaUb zN|OxNaV|IXQ#}rEdY#+73Bk73U*sHrM_;+2#KwG|8Nq+PuGx_ZoMHZ1eIQ==R{(b7 zj+Y^w@{OOD!6BBqbQRt8HQweI&exm~!b>@S={}Er^1N&5I1ryi=kAsaMw>ZgKL4SQ zy|U)*Z$&V8F9%U?g$#RKv^rwx5$TWt6iNbm#2f98=V)rz+j8Y|Q;qEO}vDP|J+Aivug?Uh_zPP zgg$kr)E{y^OH)#zo6RXYz9>lIvOf;d(cG?z{W;YLe7Y5A^zqMUI6spH|7Vaa!;yyr zOVVtjLRch?;uL%$stx^*bsuSKFA-1m{>5=Ay^jvC+BP>pA!^B7k>;yAcJ%599K8&*6? zLxF`6)Px=lO3v|Q6nn>sUB_&v`L#Ry5F^TtQ0L-ED2Zbz@GW3P_0y)6{*dRQXTiRS zd;QG6_Qb(=Di^CRdvTWY1+R|1v*$Dr3v1`}R10fUF!BjgCM;i+QonVWjPr>4q~d4L zs?`V730uyl3&qDWIoPF;LE2ARJhU&|USQ*gO~xvd8S(yhZUU;aJ#6n>FTgS{DPiMw zq(a1RcSwlT`3OD?Ph*{#JFuVfD-%e)@`fR|9Yp1qb@7bxz87EjNL*`MFefY`jjpiZUWlW%!f+)(2^FstaK?lJ%9Awgv1k-J3idCZol(8pg`J9+&xw?)Q;<$ zS1>#kKrjXK7%j4pf5yoI1FyX(TWohBNhL??jUQFEU@}`>nSmYg6@=iL>;- zFq3i();LuO7Y)HiMLjibLcKQ^P_gilR*3E~UHsK%xp&&2vA_TGbKIL@L!viAr+K@* zI^+qSz3Q32vPrC3n=I}sJ=`PtJeKAM#qk55lF&JiMESb|E#rzfo&kR9UH6W;ziu2{ zlxb#d)~Vgd%B(kY8fBNy(P3~96eypOI|~!j4@GJY-Hg`BkI+x-8wac>?pSP!B!)~q zrswd2ikBTv21hU+LKJeW^r?Du1A_81{+apf%|?{8m_4rcvIx{Uo|WG!B;PeYrWIUG z-8R`a+rm^lR|^7|-P>1+`{?35`0;*|7U!I75n)*y}@2XZ9=JFBS%#I*sTs51Ue}BSI z{MM4;9RrAOz*?P8-aZwc-K_yK(NN`(QP3e9Xm^98Sl>h!F6e`A{&J)o<2J!=+i*R+ zA6zmi^p})Ho@yw1ktr(v@Vw?}>314-;x+Nl5KU5wshC^K9*u7tjS56&@G{cLNqex{ zng?OMWE|khudlwy97Qz+O=%&${4If)ui{?QOLs&Rf+ieuukQ(Tr01b4T;*UvC13px zyyN`wCQnIyq*deg3&F@pm>XQGeO0~^w(MwL!h;HF=T*%Jm*wKCIAYMQY>L}&Ytl%j zi3jQU^Oz5(u&6#4zR7iF7k|TO3P7a`020|Cq#tbK+f9M+<}(WR<9Co-X@9`e!YY}P zKT#Y}j!AI4m!@8JcStb%RRFx0$iZ+)?y<(>5qCX}gdgDLZUH((1^dhi z9{5gtVQ0$9jYY$^PxK93+a`jg)u~Qrt}7|j0CAw#Iy0-*(Y`NHU1iN=*<=jI5;*X;U6|SUJnN2Hqw#vvG zX>Y{1|C)>cz8xhkF=T7BdrFrSU8sBs|8t|>WAXi-?Kkf)svOLx?o#6yLFFOhp;1*Y zbvHkKaaPd(q4ToAj_X6$nsIC42|L+;bQsnG}?q>6zbN7vQmLEp{(Sd+SrLIU^JcNs_ZW%z@@kDgZ zJA0f^-=gkGGl*>MT8qCWWO2SbuOA?JYU)c{Hx^CYKJt-w^`mRFynGS@+%m=Q7oV}R znZtPwM~rx#FF^TQm&-jqR8$*8VjszQ$*iiXgUwuL-iZo~7kC5bKWtbpTnA|=gZkrz z!sJLmk1AKJRE$gOt5SKnb|>kKei@>6vbpMQM2ldyQMX_n-(KWjH4DG=X|PoK!=?n~ zI(Y}UoEX%uh~A?jGRY)vnwb*g^#KCE5qyju7ZVM7#JMEriw<)AH06Pr_?_aCLJaW# z>JQN|(F1!9Fl{s8MjHg35#6M5*pjm4{=TKspuJ}CMkgg|uU)0_yF7@iQHuly zEU2-imU}R!)dZW(@@sB!6N!&Tp!k7q{a}E)k3#}ItI*`lnoG>AhKlBGo2#C&uBZrq zWDhgXOFG_iY=m_fF$`bGjmGIYXv)2)i)WOm&h{^#&t!G1X;GfJkf(2*_a}nT79#v1 z*H=X2m=HDiw8lf&W}c>lDiUu|5RCW<%V%L&LE^NBGeZ7Yh}-7stYZ`xOmyPoZny^v z$iV2!N5g)jH)9wpq1R+AAEYT)y=npdD-uPj{0QcJuPUhRf%dLGtHd2#dx3+jy+8+al>uz~()1N6mFK-cd9 znrRBApEgZANAGz%N|D2iL{?qO)7&A0cO9_AQ-i>lo6j`2>R-YWxHtWeA5F`)fawpE zq{W>$YpJz1Z2Q$gztU1f3jl+PZCDwJJ3k)t)Vl&~1XcJcuYaJl#@N2{^z-mKS4?-r zDoO`?Wqj{r%*oAT^=SS^Xs??B_qX=L9(zs6lwXm?sNf_h8JIkB#I?21#U2mAklzo~ z|8Vp~`!-B*@*jJO))6*FycmFULDP6~0Fws}*}g-lWU!m0-k5!XO@At(=R$xG}C zk{WKsnje$(Ouce{#aOhSSE%IHV1MP{56HZe;j8cYmPxKdO6CVp#q>_eq>)tkExyOG zjZ#16hRqQ&8Il=~1P#qr6XN;qx0!BgQ(P|yti(HxsWC8__6EYnY4X%{b_;sRCk@&8 zBWq3VOr>bvSWc*R$bb_^buFUj?w;-CglHXpiJa(Z>kd8=A{k-(GaYjk+DgfJJx_=$ zUi2@GdxNxYIFFQk)f3YGHPVu7))tUB*d<0B%K^}`a=BoKjZF2%5fmKlql(z5GWyw{ z=V7xjM((WH0kW9y5Uz64fUZ81E)ro~Rc5a$`xe(!xxw`~CX$g+S)SSh5Q`2Kh6Z|- zcN-b^rlP}N=c?3Wjyc4aE}CZ_HfWbj1!^6R7Fg)MUSVP$I}tLS`3wKA@x%uAipzdm z31uO`XUT7U>AIEQrz{VVOEcyNaam5ti^BREWJq}J^9=66g|9BtO7t=YYc_rHtY=ii zg5{5RXt!Bp-%6E>g#1Y+XlMD63+qNv zX@y#2cv0ca;7d_1bf~<*r1Y=?MJ9<>j)77`fboh^ie*Mc!=0#)FYdvfGR&Fy`cObh ztxA#)p1p{_e;FWKS^GqIL@YQ`ikuKoC+%)TnA7&Xc%rIpgN_Po96zV0-Rq~|$T#oo zxDgIFmk9|g%v4g6eEW*L_E(mNZ2ep?*E&kMYpn%~!g6xa25!;0zdf9we2sX(*Xn9Rli^$oTa9!;n9c}_Vz{47A8t`Q5)t0ZQN`JSH zD5`LZ$@rij=dD_yz`*Tgv9K>im6R+q=V?BY0`}7X3fO*c)3tw;&fU4-3!cAUD!Hxg z1>0f!0#H~sR8R<8)ogaVj5Z9WQ$cH;n#T+EDrU^>oMx>;B$K*lq}dCZF|KZF@+%$& z%J8G-fmdG?#IPkP131;?T+%E$`tds<|;JJ>l9~(3DQ4KNIdZ+fW&X z45gbcYDlH0k+b-?kxBpg3TZ;8?R#CXDS@EhP?>VpddL4Uu%~SSVwyo^s%1q{4!7&d zV1QT3Zi278l=&6l;@O>P(tsjpvZc1la$gl+CBNj+OmTZ34=dWe3&4CcL$#2B zk39F$7sbgPv2bNks=O<=jt;}yDbeIpcZNqsl6-|VAno$|gH9uKUCEmPso`_f6S~~e ztNCyn9^Zh;?_H(>9oDM#3XbOb+`~A;2rqK%Q;MJ3OFXAl_y{>UgU&TMV&-KxO_RYr z{G%yZGwWIU@Em(|!7s&dJ!=b&+vikW3Lvht1j& z9cNrS$Aw0TE1ph=V-Impai>PYR5}}+1QCVcGureIW(tJ#-A|*nz%%NW@4i`Ai@8t@ z^Ou=;8(|4XP!{7rnOL#B%s=9Kyu6V=T89m-&I~~1j345y|EV0M-v`{ZU*9z3E}A0< zJ^AgVuxx>FxO36KdSNMkK`!4)^V4@@n+kWZ0AxUhk*U|G@MSzjc-js$OxH`X>l;I= zO?;6xsGkmuN|p5#*j-=Zc;9=?$0`8hX!}?nr?=4(TGl7WCt>(YVxzJ{%$aePqS&$P zBwuo5`qNMgJJ;~s@c2E|3(xI>2wDO1L-Kazd7i!Vg7wTA-7QdrAqy@Xp*p@Cw>Z6&sG=|Vf`i%I9)X`8cwpF%W_3&~&#Pa%o06|U<74yO)R-p`fOjj8p zumqIJM=BDQsRJ8;489PVk5ih%FV=teBz=AF0n|6ZhvY9xbj1t#2Va+v>%E@_nJpuN zl6RN5zE-?Z|3#~1VB=FmUTTgB@@rx;U=)6)rbSA}{Za3=d8Y@Z$GzjWQlXq-O=toK zZ1Xc1E9Nf$e~U}LsKjElvWxXo8?D3-OgWrabw$sYhCg|=4~fnNhB}-VhwZzEdc5D; zGKfP?;NUuejImvY{%1k9LVQf>K=8l782reYxy(IJFMd@FlEQcm+DE_7r5M(tN}rDq z2XZp_K4ZKH`7e*21pmliLc135M793{M5COj55I!j#P^cAy=#&A64Ft-7Jh8+rI86O z!HYZFW^7O2n>X}}xV%A^7_!!&EQnUgaU-n8UJqw?Syq>7YynYCd@!lkPG`G{4yB9R zDy@p%{utwI4o7#Ap~wT2wS{-5MWeHfE_&>faiG!&kcmF0>02PbgB|4>ko}7!(+2sk z#GN(68~^Z_L>mNqwE^SGm?&Rr00O3AFJk2lcQP<~e+rW! z4SJus*GWB(F@k=&!zYAYi{^gbU_r(|KlMx*oQw6;zM&ofeQ#u};w*RB7Vlk>qsTh0 zvub=xVpuG5&Rf9*mLU)PFlTXephLa;{HDSdu$eCS*!eY<>D;eKmy2(mX9toIhOc!Z z*AF9*PaVcB_#5U-qC}328*7ikQ)QDNoTi`MKTZy*A%$jQdDTZ4B*YitS<)T&>``Sot(J96G>OAF13=kS3?#RA6X_p z?2986o@i&_$S5OUE6Go8t$G!V>x`onJA$7z`Dn;>?)gU9cr!SmT!HzzDkNKHZ*%iIYdS4Rnt+BfIbegM|ks7(w z%VqglTqFg4qDD0(d&$O1Z{L`bRJ_gZ=3I$NJ>d0R6pNB?+U`=-%bl<;(!nU~H!%=i zJjkbX3op2|zquaiKN)L#waQ)bOD>Y`Hd^N)X68c)V@P2F^T39){hio_3Zb< zCO>3AGk-Q{Aq_4n%(;SPPW>|h5wm?vUQXvDPjfY${v?lS;eu(lC7?2!`j2k%8MBVu zSM;X5i8l*XvVHO_8^4W7Y*1jYFmWJx+nm+@WX1N zu;v4kmJEWjO_vwy>A(YD&o>UyKc>_K$+ukXkM?ron3ipHR4WJlby7=X6k9NY7l{NX zxv$^3UnE>n)}3H8kK`AQvZ31+d%l@hj}?-P@#Hu`m|h8;q&&Y=A~78B+KJluLz%)= zqwID38fLr z0DuU*inPB~?do!Uj>Ovj+~rkPu~-f&fOYW4uwRO{;i0-P#5kx>Ef8oh3s)h8g5G(^QXh3cx)el2NfV0so!{hz>lJ?YsMV9@ z5#{)gR1ErU^+b3U&7Shv1+*Yd2zNg3+9G`D+e=$#we|DyY&xOCRC;MYC0whcgVEbC zvHz&LF8SBKSOtMad6^Sq^qqR1%k^@TFhyHf)y-300-cMIwK9o6V1hWH2)2DLaW3?a zfAYm?DPh%ia$?y9h2m%O(dR)q+-^=wXoqr5zg0aw;TjnSvSo1t;m(+|acX4sVgoeagXvU`ME0;Uh`%6Dk zQHSogGl49v@jA_OtjC6uw$^jDs#i3%5j}P;IvMB_{8}rIWAP+SVr+HP-tSx{XwIb9 zXJ}RmK6cxT?^fDp%w6+Cxl{)&wUG0}cCYq&EVs@y9O*Ir7{T1LMcav>lOU6jrykZZ z-wdYKwp1J*xTEIpgmNrqSQ%Qfos+KAKXZ4hevcOTTnT1&-V|*0l!-zvXYxUFZb|kMW(s@1ZbvqIE*K`eaNaN9!&OzOZBiU*n8kE0>7(Ad zDk1bt;v*gGHuKsk=$ESQ{Wuqj5EU8c6rtmi@{l>&F%Dr@b794wp}rc!s`%D{A+Jbb zJ7mKH_@O7H>|for+^&h2c#5gasC0@$>7E6w-dQ0*LR!?cAaGNH-Sn>mZTF+iaBe?i z4BK+75k?8wZ<1>Wj1&)B zgh8wL{;hK0+oC_%4w~ z`MVu=yX^ofIutJN_&A;~Zzvw8%1tt^DOL&_83}N@d-w_@@ncy{Vc|Vxb1oT5{hbm# zK>ya|1Dl|O*e;!73~l{*WC~*a@fv2x{$g{#{TIe|`_PvJ$ARnGCGAEQfRuEOGmbVY z^UjJ(Mdn6y!jBH=k`W%Cr4(1PlLIEPm-(KmJ<&eE9R>wN z?imFK+YA?TKP?k*=z_&TvmO_sCN}6cblF9312?`Clh!JTn<~C0utx2@`4~@s#AjrI zVm^^OaHg9v8gHg!y<w*HP zCpsMF&`JiM2Q0w&RdtHvkl ze2khUZP*+@QxZ}M|E7B(w}1R${Cw}5`ZVc|K9=z*C7<}f{jQ6Pu(HZG!#CE<0xDUV z(B;!5W5SIMJnX__;{9J7Cc+u?d6Pf-c;z(*aiQz3AU~P-CUAiv0e{ktM_Tw^^ub$7 z7znOa@$E^AqV0`qkl{T%>RBHJJl31ez`dnP!T%{KtFDl~u;zDms*h`DdZd58%L3Kk zvDx2~_Ruaeiv5nN4`g_AUgU|{3>TC4g5>mPG>c7jEba1(eU}riSfnZ4uPqqh)({SZ z{EBQIDddd*!Yqjywxiy-%pCG&#f0$lP9CQYhNPTxu}HW$;+cs;NSN=yEj7VfDQ0NJ z<6Y`2#zc$p_By?h<_Vbk;-IF=aJl(&a|Dm*UW3Ssy%OW~KW;WrGs|4>8Rs~j!7ou?cIgRKrk>7Wv?uhQ2 z@jTmA?`aW{eOFkdLnw|Xg=2}{Day+_+b{nZY)Ode3j-p-rpf%=ESk+61O5(dr+tmQ zh3p>)<+9&B_oO>w@`Kh-|Z#tFQv2R?_QQxzx9F$q^EDtW|^K+)qZj^YYJph zMPK&mr3|V$xBZ6jK4aI#8MMYZfpi`!oR{gwn_a=BeBrDmN)`RxgJ`3EH%L)4| zmtdTRxd2|@d`Y@QdJp8ZkeLtX6mBK>wjcKh;j|DUJJ+6vsC#et z-1{e`yJ6J?>0M{qK9@(6p`Qq6UIX9%>TaZU=$V>yMm$<)bLbc)#7UT)8cU^*2X`?P zI39K@I{bEcN4ZEySH?GxRX(RbP^&zJI+hD(#5NyxSvDN8>pu(O6o_A1a0s-zXLuzv zGL-GFUzB#M8pmQ<23KI@IxWqv79V);4E1+?1sLdr{!w`a$|mP2bjSRUqoHOQE& z0l&_Z!@gkjieq2ztx`g-0ZHoUz|qZ$$A^A>gNtAKP^B1xft~%c)Jc~K=*?b<0GF66 zdHpx?UVJof%fXfI?H=bCgQWSskly?X<%pxJ2=h5^S%-dD$QYae&&vu+C>j32=A`L9i^+Hvh{b^ z2iW(iE$pO_FAG8b0pAamXrTuGq%DN_&#n%q^9K!ho?Ju%<8FOIW9U0)Yf@tDv;j_W z{5nH$ohXXSTr5jQeU-*iiw#Cz_`7Q?to|Y7{nt$k<>_qi;T}PIt0cWh!7ub_w~?Fc;{Ag~a6wqWYg7+%hV9K^cbzN=mkKP=aGQ z_oXz7iP;l-ktd_UI4_jEah6oSS_frYcoV7;fHmfzss!{M8Tr~POG0arN1J~H$HjjkjR^oOKRQbHpZNq?O7GsfsbIxf^ zg3iZ&zhKYdI4fa)9_~BMO-xnH+(PH=_;vHlKk8o7^c6LH@KBSf!Im7pSgLrn36hY# zcVG=Gd`qz?a29=68=!=OYmrj!d9$f~2Fv6Wx}j}vo%kOADdorW-D!*^{gD#U(Uxkp9%0Wd`gl@&Ef^tZkAv+E^OK=BONJgp$fXsk6ug7uSkS7n)ph=0(Wmg8rDi`_<7>phoeV4qe*?$Gd{>g5YZPixE<5Nj3M_{`G9O@8 zH?8*?ZqYRu%B-`CzJ=gUsaMcm0C6xXH{P<6jQ>ZoGiw8TFs7c^X}?azQ4yBra^LY@pH{Y9OIlaB~+Bp)SDd6n&= zt|`uto`hsSMvygJC#52;ZIEFl5%x-y+&{L@;;tIhdU$JyEg3}@$Ivu+Og@O#x!`^0 zGj^n!yvT+t{Z0wop9ef&NFRyR_er^4y3fV>qPy6T(yZiB$co~vX{^yeDEu*)`VF&g z`S&C5avF)Y3uVP|g~`VcS-oYkPRNV!QJ)r~^CsYeJZ_a^WAN!ZHtbCt^we|;1K)4ca9((yRInUoxz_u-% z&XA*#N-H>)53x8JVJUlvWBL?QC!qLzLoj$_PFb~>4GXV4r_Zcj!RM5bCdOuVEl~Gy ztmeqeA$Z||DYbw%kC6H(m$cH^WrlSv3(p+lmEku%r#m<)EIks)srdNSt~8*+ldsh! zL2Dkzrc>BXHaG3))zaW*L3Zr4pu->1|5;EA!~iA%htVTj!SWq{L@d^NpRo-#zt&z= zqj=GzYP>Cjgb{yb%i>uA?+UuNpFqIyA#FLQDl5j{h5FY<>_wrz+2%=p=eRru!g(>i zRCeEKUkkHHa|i184(}zved!xf7Y%c-S}JOX=tZ1r)#w^6O<~UNe+n6V{7}`NPFFJX zgE4z|u4%h9x{rAz&!};nvs3Z=Xy1%4G?4);i}+Lb6WD||Qh;oP)M=5`!DWr=>p|`m zK9yLSQCwi{2A)k>=B0}3(|1Zwmzu>h+Q)?(op@{mYJ8}fsY4Oto1f#e+s{0{SVhM6 z*+tnYCF8V-yHjMG+g<%(Sq>w*fK`SO3j_9_S;SFUZ$le&Y&tDNATe;c7#Sk7Bj$zvuJ$tw_H|3co0>&z?3==DR+GpWkz_dA#&~Q1 zz}6MA3RjNISu`0ox)lA-ch0!o^A!QT!N36k1;el90WCGn%Pn^$N6BGAq9Y4hvM@5D3ugKi| zXZ*OQ2MJLH#Gk58y*HJL>Qe(GdZrP{LkDK9O+uvqP>8kRgtJChMy3DTY|~I#f`be$|Ozk*oq541K7_+JBYn z&}|g=7tf{=tPJb=+P1MQ+xGduQA`8-m*do^2Q%<+n{ z#M?fyOwUU`qRb10yH+`_LWM1s-$D;1MgJ5j?w5%(7q?U@2H`}wa}i;@oMXy93Zgv0 z0v0`<`}$@?dK8sMxQA8EP3q-ytp`~#VrgR&Himx~j763j*<`v?n0(@V*~Pzq$9|K+ z8#>(Q;6c31areKOEev}kgEwg`|KXGGrjv%ojRjzn@>8=5&>iqKY(kyJo_jt z{3=TNp z^m*L(INiik-f+f2&%3U<3>Q0?&B1c5GXY7| z6ZdHQ;yZ5qT+^Y>HT#p?Y_k3klUII{awq!)yz9E|;{2yr=zDf_Q^>x;Cjq*zT7xu# zsl-7I0>evN=64?hA3D#W{3W;@t8I$-+?@Zd+WC1hG!(B;--sR>%%y(8$mn&(4Yrly z#~b`ar|4yBwTf4jWA&FIJ2b68>&tP1JYbl)>VB+%kfSfw-s>prO8Pz1$|0hD-N!aU z$OwWfNhgXV@lw#EN&`V~q@S}#T~5v?_kzNS6p+va6IHst991GFPI24^0Y+pzb@6QTI!ZJ{jOn}SW~9+ z^SfP$1xo}O9(ABSlXOFDF-HUdsWS(H&`4kA4j;XMRY}@WTm}n0>gt;5*@{2MsnIzn z@y@UD1+Sgr2f6p$@0UW*L^l$Q{|-%=Ofik?KGzpt{n9)jq+Xp3u2P|+mrUeIEf`Z7 z8~lWhfAW@5Xu}H|UA3jO@4h8J2EC9l5L*nIdA-2ll_eeZ=v^_kH-&)0-V*|xh7 z1b)gsF27>dp;|?UKU2G9`axj;NxM?v&VM5s@YmMO-!%Z`_5UJWm$fir=$4+!{Y?mG6G?pS&rDemVL$~&}xiC{vSteQM6p!iOp#fv9I zyzAjEbPO{Z9MxQCLcD551bJbssp>lcQ@Do?W6h`L$(tq2;^gjV;@Sn>{}hQDX61oG zh5zcPBgehen9V*Yl;358R}#(P>qmRcD$c{2n=4yNET30;pA;{2sUo8<7#4XK% zy%(%F{#QEea3aBQBh-vyYiw#mABBghJV;cIstx&0$YB-ac=`MxpaIMhcNWDL@=`F% znKg<_OQPCZ5xGSjhC;tmZI&lr64;mlK3)dB4kiUBx3Hv=i`^2Z^xCj+zcm30RHXz3J%XilK8job_6xu8su zY>J-FhU#U0jxc%-D77j>|AFZ%v<$r5;=iswLGK5bq9TP&333<%7?|Z4`gh8m+rkIT zu0LH7;g1+p9<}gxuLywn=l==^b)_~i&lv{AP?$#ii}6}CIYx-AIl@9V!Z{FOe$|1U zO=;XSl{MGqpg1eS*G7hlpA2AiPj6st+luj(EB`AMPv;L7SgO%x`MS-n|F{Ut=dG&8 z+sd?MT4#R(C5DzsP3XUqEju(-hg?9~8cYuY+B+a-l0t%_c>#?4#Jl()i`96~bDR!( zj^HjcVv4a>aug~EF!~srREu?lP}Kp^Z|AM)A8ryPfD0PZc!Cfl;X3|0`H}X+-bt>Z zU&jQxs)ev{cc6pL=$10g_%WMlMpd*Lh9||OW9)gL$@^OzMBy&oabD8^K2~wObAh&c z_oxhG*^(0>PT)|wvwOoZDzn$_jiCT5ivxi3Y5nJ@!@r%{#WmF!KJ9C4 zp&o2@j5oI#Xc1O+gzgp&RRL{m%KiJ?pUaf#++v&#(8#J&clL@${*T$W)P_$ls2z>v zv$kDPm+QEq0IIZbP%l~qNvo~=a)AKb_5V}SaQ$-kA@aVLkA%r3sB6JZQN5@DPO;ac zH$%7wM#Y|zMYy_8ShV{-3&mv)R_QW=U0rK;%mo%RdeM83T{YpGX5I~~2bxE(6lBhR z&|3&gGFghYTZ2G*s(|aRwk{HLdI#}vZUW27c?$t=n6~pxgt53*{InF@;fT9*&d#0u zO(6P5i?Vun;)(Wy9y8+0;1J^5@P6-df3la2*G;ttmn#|b0IjHdGOzW*8R*8WP4x=A zt7!Dm^KYnbP_C+y!xOS}WTQMxzt!)6PN>0;=?%oFDEu2OIUKbAcFN1*pd%T(SPzs~ zBNQdP9WV47odA(0wu@vEp1z9Ne0#&}Mya~6Hlr`<>g7fC+S>)*?<6zPqH7FVjmzUk zPM?FVrMVN#{f$4Hd~_)>77yFzE2Ity)!Wki5sBXZiKh{oJqsq<120YNQt99Ebb1R5 z*1ch#CqOm^mMa8RTq5z)a>BP@iUbP~T!kpn$suAREg}FG*Sf&B^G#7dNPO1xUu$qE z*`$`!IIqb~Z`66NAkbWCDlFtWV(QC?25d;m=TBF&tOwulEO`D+DeZ^lQax!-#!h?Q-6dwt~!ft zFMO*uZ-+rIsQa1CJ@Yjdb`CQ(*h}MCZhLQh$}?k8BO~+g%HEOUZla@Da;-0l$X0YB zmxhBu+-~sro&+N1cGLG@{|*SlxqcmrWN33#UzM*d_z6%}!v6wbPSxM4?|KoD`V=Yl z+20>)b=wwyYyY*W$Ez@;!P+$Fy?AqEpyxjhb)29L@aUidy_titwh!do&XsajSGoE3 z9~D6Aa-&t}CunLw`tonR-W@iJ8q9AG{+?CV_%?UbdzwGFSMTC6LpGHfvdXOj|1Z)V z*TktITK-4cSvNHOhHHF`u@Pf*jxn0i3>ZB+M(1D~F?zsYbQtg@ekw>xhZ0Iih=iaL zf*=aEh=LfP0s?}hf`lH=D>#3gSMl8Ub6?lz6Kyj)Nq0jA@6r)c^|H=YGqQ*<9|vGI zuuzd()J-s^Iv=qj&2){2XrDyqo=c8aFf z;>50h`2cuf)abklLPm0cQD_w&XAI$ONfVW1)E;^gD6lV=#p8( zv)hcjdeO`#pXv}rCHKQCwLUW6)c0nT+(lr=gf4P>TH9e7r;Bj6YS1FTDuL5nCjo}y zVIrRCT@J+8IsUyE_} zmgU}mf{~AAtD!;XbWmn_vQc`Ua=g>tt+Ngk`Fp{RCJ+LpAx`SgIYflBYq+Fejk|u# z7ng^}Bzumayj^))t%;R-NP*{jG4%Uezm;mfE0e>41|K2&P@cxQ=Zx#)AcaNoA(l|! zt$*DIHoyg%y+AVDX?73*XUUj*cX=?CFk1=q?~DA@Y(lGF+Ge@+y#S=^R~+--@4$d_ zQrza)*PI^F6FF)vHiwaOH=H8>iaSJKFVD7swM5x#V_p(=#atOM)mgbe`;+QEa(K1h z`NirtzNRDyGiy7)(ZyoR9%qNcci-^~?p=1}JOb{EFvdrnz9cm8Ph7d5Fx@2`@MHEk zGNz54JfC`KgBG?6S+u0VHaW_zyj?fgnTQemb~jw5edg6Ie|{ARvR#gg4~KMu2Ch$t z4_!XxEYzEeCqUkqE$+;VtwCQnzKuDh&|5kkI{AK|Ywdi$fb;BUh|>-~%%mAG?!q#g zu>jkZ_)i%l_|sZjb~&&v`D8QA09DOlgS?3sO01Qb3dE^avPC!s&} zCl<9F!i!#SfX0!cBl3?uoVewGT2DB8BnFMt$>x>UE8?x^bY#~1a3;$qddWp^;Z7Sv z955G{=v#=Ipk(nME`ht2?n148TDez-)rh8kTtQr^p6FpoanoBDq9Tg8LTXT70O&)- zaEPqJ9nd0AK-k_jwn)KG>`_CfQBI3JM({EeEN-Da)$l11m~fUF^I5vzp8- z7T9m?0yN8)tj2@>0nu3>;9#^LU@e~=c#*iJ(d1Gxtp<8HIqKf<^&8Iqd?{n^S48xq z!wARc7=WR7I+1gxDLHZf&I`?xyjIHUv5zcEXr#N&D}RUhQC{-t$Su~ei)$~ z3bw=zf3j*D@-zo& zjN1j%TcPLErr63{8K)B6-tyIN2KqTnN%Bu(#0Yd2drl;%Cn>M|@_9B}6{r!9H}r3%?5nb0vOfIh**Fha#sI zhkmhTF(DLhajlaLab1T;<7>GSEb6-&Y^8V=$G_gGb}VrwDN^~o{~%X=^xilaLE=4a zYYf0es}|K=)0C1>=kYJam#iL;x;uzU{sv;6qkf&(m$yK6R~`!jytiImbGY+ioz887 zl`is*;7AlbL?<=BA#wP*2R?hJsBl+Tmw0OL7}3omV*S`Yiob~|ltOxCXkY9L*F9sm zVnoyhhwTKmu(`=f>TL`31j{KZE6V3Nxa;Y<<0syXYyI^f3maN^3J#jD31||J*QrT+ zz=Ll2%X0c6tHzKZ@D%jGYnJTzs86+#SS|S~!jfcFp#!NxrI7F_1C40w>ryrw^%|#= zJ6-j|Vs-ZMe<6l}?xX_Nr}C3zAzAlP36j+lAwwN>2du9S9T)rW|794NBrL6o^I{%c z*0{_6*Y4;~l5UIkTHGRR%EJI>Kmp9W9m<0A4IBPp4y zbol8z_MYT@*yLn`h`XAg+=rA;)~qvm7-b-jnDy^nj4!>z%&|C4Ixan@X~5%CprAkUfXDIj}7spr5tCXF) z4dEHW!DYkU6M~k`OHMzf2QA^whfgX7K|JCURIUn_Lv)f zCL8MUb;nUg3GV6}OAXT?K2pa6cT*CzSMz;tA<^i+NE^SHPKcpRFlXH4^RPT@eWJZc zuB&&XAO2@)ncMq~Bg6BzBeh2plS2gSuA03+HRT%3ddv6RDkTp3pp;1{s~}11jg!xy z1E6m?#5d-nr1;zW%_LKBp7Xd#%~uuC1yeQLkvdbLy4XWa>+>s?FV2JpO#3N1P%~~s!)Eh8P0+0`aetWQp2{qk-dIy`SNRMCRTZk+RqCJ1Z z0YCS}t*qYFBI2B~hBCWbM8GL^(_-zXfeKy?eE#82)SyXc!7K&}27?-`EKF~4A{_{l zxrc{@MIm?&R`~V;M{AlEdVqC8O5*)FJxm~As_i(-`o6G}^ZjDANM>cSdH9EQ9w4g& zqrA_yt!?^+Rbk<~wBT0hnqITwv?ZuROwVJY$!5C7k%BtmiCc_K4dn?O26sf5A~N&Q zfv?uGi1SyWVhhc>fmE>yEWbb~7T;+IyBX(eFv0JJlbXIS;GkxXD9ZAZoq0GYo!Vr? zd0i$m-pYT%ej^GgrDv#`BttC)=$<VGqb zunu`k6!^gl@ARG&nW3CZ!ZjyRFpuPHftbJ;U7gE9M6Y*FU}fNG()-OMp598ZGHI~V z$wLz4aF~{-m7N$QT>C;AH)*M&nk@Il94*k`dHLZPg}IpuQiox-)R!utT5QGeHQq9M zKpSv>XA^4=#g^FBaDQI^7s-dODPQbYb0Eo-nOs}#a@hwZ#~8kMB)&9LFi*2aHs)th}9i&1%&y(BJEhP7s}-LjX|Of}H_~zSz(Z%#@Csh~d@nBEw~kz1 z;o={jbtq)xb_yc*W(TuUriAO73`ad#{=@xl`w3V4nHHx%0%D#(N^Uu!`4bnXo~pfJ z=Nr1j$kSFYe&h$Q^PL0c8eRf={2w@?9xx90&KlH2NUNrbAL^4Rfu7X{)GM5!K@B%pZ>Vop}b5T(8vma`bUn{M^-s zEfELdNA6Z;EUqyCcI}RS@WGQ*6-Et{$krnsrn_}rs%Zd8BW{8g{S<|=W^3!ZNa_A`-`&sd`C$HZ`yB{i!DK$nTX8B*jt`Yq;30-UE=T|%A6vh+6Cb^$ra>xZ1lFi>W@9_@dPl}=g zSk$@AngJxY9~;*OBml|pcKcIDtm~fx+0v7Kj_w>Sb>g@gsuzyt{m<&VIrRZa=p9MG z)k#)bT-qPWR2qn7npGDL5Dqgm1!=qy$oTJ$>qT<17HYCvfRq6T#RsjqIv1NoTT*Kc z8XXuMA<%hS9(9P{=gS-D(=9es*P&~KMqN%pz`j7iRDKTZR+Cl}+19ma@h25-Jyvtc zmCf-)&^i5-<*#>Q37W;PLmTRlge22?Db_a>dp+14U1-fSoYOg+xGq$~PG#tH$d}yb z;+PGwFsm+4ufGjwVcsLLxTl5PILnL4p6eqn2>z0v2Bgvst_-k;S}=DW5-YCc$X&h% z2wMf>sVdLN!Q=JK;e=TzU#j*&e8!xK&`|WMUDbI_9=FXD+@fO3Kepc#?}t5h7p@6QhvIaHbI2zjvD-+&ZKb42J@`7Tr~3SbzCGD zxAbg5csxTem>5^IU_)FY^zol%s0&;xL}Mk4GM{g|*40=wdn3L zIp8R^n&t8H3zlg#N|&68pU!gtMK18mVgoTTCdMU?q{aILAi)eqN4Mg!fu z5uYBY@y+=v=y=S~L~+=#-QO6*O)RvF=wcKR<)U_NBK&R}8KJ$Xy8U3BaIZ}lvq zwNk~!-z?F09AysnTXkpq{Y^5sjx6THoWq;qMaV&B8N6~7%YdO-2f%yr)h{!;_o7|o zyHrHYoipIC-Y)Wy9S=h9`M)D7jhvJI>=?%^eHDWYt8q4KQ34UKKa-&r5MIb-J-REX z+7)OawVY@g3m*%9%yUE)V3U%3FJg=0WJ-t&yg#H+&!sDGG!56Lh}{#nr~g){%U{#e zyx6LMTyRGb=1oD@(tu(jH9wia|M-()q6)v}ne(|U^ATx2Tw&wd1i6nW@KULOQtcDU z`o}b#g6M8PX4qA$U1F?!WZx(_^SfxsXCq(1>z5k*H?G~|HkUbZ;0qt1DW|8Xwf?jq zW*(YW8D9Kr6~V{?TH z)gFl$(DH4oRsJo?sjcwCTdei9ujz3JSeD;i!=;kB2CeHI6wBrk;oRPM4w|4#)uO!G z=kf5XWFWr26YMB?sbkfhX?&Oy95sH>fL!pqU~Th41dy-nL>TO&PDMMENV7|Aa=VRR zsqy}HQee!iylAM`aGO8*~%tY9SDG^yNDb!3s0 zW1elE7_qRb-ngJuy1S-yX~NH6OVBW@vBb8!MKamyJO%1QsyBUza<_1wc zxlwOSfd&w^w-Yu(gZ%>x|me8q|M-iX51^IF10lSz8( zZl(by_dD$JX`+GdqqiFGSE05+v?N;VG1;lP*#+vD6-lA+^sDzCeW6#JNQ!70Yx36V z;`v7G%tXFF^<_(M-3gm+WCZH{EOs{VDV0e8u6PmmZq;#r2>fVC_B;dDNBkAHNz0?m z3Eju4^p)A6mO#DAa7E-7zfXwzBX1 zEeFdNB~u1!$k*nQ`yl1Vy>+q7@mDCPXE$L9GO9X324H60)S{#petaZPYN`FR-F9Oj znN5!;E~`tIJ^7zWH?Uh$o6aLF@a2Ja(4HFf+C#fQWAFQR>~0wZd&^4SnI{3RiTA!m z`LzRVC-39A;#x-pS^|DCjHOONbM80Nw3-IZ_yX>$IY_n%I#0kX`3J>uMcL1iq{u_D zVwoe%C4;(TO?M5#8KF5rIPMhP(yknk9M?+K%X&$3FjnVaX5U58V?;NZ#na$qqsO64 zoByR5^^8igpb&VR&bdr%TiGXwIRZK$(zMdQ(^$k!6NAL0gtzEwFWJlPn@;-qv zw6lH;llYLDx+!Wma2nyTy6ysW4y%jwX9(bNJyP??Z5f5M4@?l}Nle>Az*)78WJnyP z#H!1T0$AbYC}N}x2JuGR)p`|eFJYpzp&tpq$25k{^@l6s_|{GnnP=v$Z4m`0<~zsf ztT~7Oacwn^OAgeg#JTmWfx9A7=#E!biGy0EtW;*jL`A3P_U6Bs0WI!>!773)dO;!xvr9e z!Ww!*iQU@qEQ`4kTBZdAyIJfAs%39E?&cQA>DJI=WO05LXOhr)aIJT`PQO!($HVJc z^3PK~2b@#@NkHRiF{jIBtgJFUDkm5uYf^ix&W15baXR*=6hQkL1d0d?V9S?Z(Yfj= zk6yw9T*o*b1-XuykSQnc2za!OxFH&s~D!BBY*~Q8Fk+^0U#_X{N>(jh@`f_UKmS z;)BEvC~5c~qaSA8bz5tS(gDAZBmB5ICB^eXOC>z>o4l-A4sYBg2`(?LbG8zvD^W`? zvgk4dR(iN^Gi!DvPmr6sgXe8Fae@5UDjk~-O_a`jU?pPo<2iEv%$8nw|FlFYc*{w1 zZHC__l1!U#+0+aplRW=8FmA;Tgh%5FoCPnSt;CgJQp zH}&$)9@AdhmFVs(y}F@%9v(HPNA~lVULV1tlS47PdluR%MqK)t2`WasAF`z-8@LmHl|+NqzXi}$ zp0RrEf9_$|A2EjF)>e4yPFS6!gnzhPwlD~oxNTy7a$h3c=-X0&d8(St@`EiUH|Bnc z)#n@TD}~hHbTenM4GlWeStW6wogWDOoQ;75VA%gn>~||Xjvj#cpf{mRj;29u~-w-K0~w+SO|U=)Oz)+0hi?%!t~mPQcF)aCuemTL30)Y zi0gCCnz0ZXP_|#yK%r4)ahjj{eeNNq<>a!eobPV!`k?q(Eeyg<9j$$YP~Pm4DpxBU z`OCad8)Y@jyBoTyhWvVeHds$Nh>X2)MR9yE(@U}bv5F9)+toIVOX1l1Uz%k<&S#ss z#^g$xwcXOSJXNvjecfp9RlWAIqliE%I>zZLx1C{^{#=-9 z#l2Xx!$sRYJRBdJCuZvQ>ykQN zz1uz~Kbq~&?LIJm_QVd#{KLx`c->`fw_fr%a=;Ss%7=9av27weYSs0iQft4NlEf!e znd!GBXL~nrhkk}SPTYb5UwxF#+i4{ACK%S%W&4-VxP*zt-b2~o^W7i7hd-s0cG<@z zFULNWyl~DQvW!v>7nd}Wl995-rp9;ad@ZC#`+DUPYEHuv^aXE3s58j{^o;9Xww?W# z*-tt=)$ZkF3z7@>j5crVb6rQD7s+iCQY;-F3?VVxy_wcE*3_iq(+MFHH1V1P-QhG}lUbS1L zZ6>;qPw6^D#eWCOeB=Z^^4BQlCf&E{3jJ5c)U`dyg-m5kh@GBWqGUI;h!**67*sXg z_B)Ec;=8~8G49$>GWBs`PZ0cIfYb$Rl5}!I5CsPFH0U&Qd;k5L(0yMG!;0N&EK51rTKThb}B!0M# zA%2#efmd&W6M*FS8caf8RCO-Qof1NF&LPP^V){ft@eWJp*E}^$r zTpT8fqhvp;=?Vi%&A%um>R2zL>#*KyNO*YT%PUrur?y=6;2o+jT-*dzU*FQt6i7Gw zQ1Q^SV3%rsJ)2!#a#aXNj*pV+>$NsZ`LWJX|D?x;!l|XRJE;wp>032aGwN~5l#8L4 zu2N)!vtI<3eoTW*N4f>vc+$l*GTY~C$=Qo0H*)h`tNaWEw0slOh$yn_-7gfHt#QFb5Nq~agLgRmg}g`3ft7^*wMg<2 zvIJ4ULU53Y;s%9EfBvu1C*SToy;Xi!EaR74B1kjCDKBBcENkPrJN+hGkS(3$;ynH| zYswV(eg?onWX=@)E0KR&6=`R60K>2(Arr zex+Pr0ZHN@R^kk9O+JQB1GcF{ZrvD_I2)ilZLDJgMpJl-OyI zMEYo2fS;?QbbBb)jHukil=6cNEB-i%A19yZ8~O$c%|~1#yB4tVKG4W}`tCpq&&+#2rEMhC_hw=%>-w)Wc0;Qc-}m9^cCXWyIo9hB z-AwWJ>_IX2?d`-KgZ|i6az5`JZ%0n? zpQF18ddX`(&^0S|Wu+aGyrp23KteMfDwa3#OQcDaTl71Ujc;s;PhoNVtwL3prD7z{ zN6UeZ4EzCMhk6&f06APY$JGLaD~=UI%l~R0Xk{DMP@_tvQ|z__QKSzM5CoH)2ej#g z9BIKK;~9bafV&xcnybQt8$>^zrz`Yw>i{QE+p<4G+Q-S^gk%0)bzEnNq^RowmP*BZGE zOQ=L`AF{4#8QSf$?&4DiZc<*xSjM>dB{6`fqBO=XYGK=m^KB!3c+^DoXNoE%eu!CViPz(*~THTU(9D~00N*pXxr^<6z(n)d;- z%~dLd&(vS8xw@Ul-k-~>R5^{`{T|>j^!AAr$Q+Bk@z9%TOa^Flx0tfUPNiHW#(mWcXX|-hhjsWL)~Ht~oEA5hS@Mme{A1KF zNWdruZ&1V=Q6pd@Q!Mytj;A&PtI-khR0D*$>wPQM04$h_i$#5llKd2=?6&fxSM(tC zKkMY>9Wvj49x|_*+w4vC{E0Uaa(*ENHh2-C?ua)%;p|kBbzn^x%ql5IM}F+fvEZe* zm&i$am>ByshKQ2rW{BhxK2gH&*!kA6lL?E4J+nHpM;PF5c*n=;wW9C+;SDTV`-baO z_k!Yq**oSqR=B^ZS)``F;!s#NWrp?V?Rk4)+U0oJ$TgwNwI1=iplk=F8_qVa^I`&o znM3I(Ov9AU?2lR{5HH>rDL9Agm`x%F6i|59JH^e$u8m&5;w)8~b4U>g)|M#fUyU8s zEakgs`2;XIRTnE(4jt2tZz`wjt)yce{Iq=CCQd1*O5%Nx$}*e>_m1c!n-1~WkO9KT zic7){0wu1Pzv$FwFoh)+u< z4bx56YM=Amc6*i3a>(POHaIT<;1r}Li1(s8Buq)b%O~PyPe1WMCRaINX?rM~HCm7+ zlpfw_aay36<6-RckEf#f4U0o+Ph7a#({=e2Dz0FOt$om>vLsizOD3Fw)s$$TgjHA- z@Y>vpZWzHf$ZCNtg8HJLzj!YxoS)D0`R{TPQ^zU&mHbW4XK2+>(oMPPViM*U|iZd zC&GmF?b|q?gMaevM|QFN%QoFH`JNJ7Ktr&n-0`ZUUKJ?Jub{zDmH@%~G` zXsZSruLlAlfm2L-h0ysXCp`0G}x zR&@a_q@UCSGxEfgF=xKMjo&1vs{|OzU-1)x`RazT3hz4;yq8}lpdZ}rT;9i`@~7>l zPKN%Z5U&1)fa5PU@a6s^M>&rWNVRW-_rscdY80VDsga^O{r!+E6Nm9C5%giXu{fhG)2ilZ%FaSj<<*A(BV=4Oxj$-$z1WVK4(vl~Kxl*)bhc4}+gG z?&BiWGJV}8hPy4bS{aa2>Q-F^5S}(!-XXyO@w$;*ejPpr&(~Msp8G&*mWrZ5vg(ia z4scv<5f$Un!+~h@RNQoMPFN|P(hSb$kh*$rC)j-EZq!!c=|szUR+i$P6VD$aN**6) z-JP|T393?a9I7vK+H{WJ-O>B-TR)Unh?`mS+eZ$~r|$!nnWXrK6Ei)BF{J3%0Wfsl z_d0fu(QBqc>o1aw{*hY%1x2ForJ^b`-t^wkh|OJb1Acqu-7-z3OFmqL0-pyw`oC`Q zJ7R{&hfHH|OK`V*9O9>P%xXXsp{onabC(Cg*JEwIE1f14Lcs=v*SX@^rto2pTGLIU z%zhbnk_x0R+0PJ~y1IheYdnPZAnqqmB zXs)EriN*t^&G;&vrPUMeJK#;O##%G`q9z&etIkV|u0*!5-W%7#-YAvu7QQcuJE9>e zX(GIFhxeipKr`@Ga4U#v2A|}m_wB{nn(q3TPFK*~Q|>JwB9%6XwllXCEeFyV8}4Co zjbFla%RiP!R=e28!*dJuN@pwrh^lMeHo0b!eZ|$t>yw3CFa2{P3ik*9I5M3eX zm*lPE4fuP$qc(Wef_j=u73Xh8TB1U7p$&iUP&OF3{vs%2Oai%vKCtj3c7c${^xxQA z;JKJiS^;j>j&VobDR@c2a%%ZdT+iUT^fU545`-2N+ld&KwcUeq$KjO}342^Hc3&15 zohUh?$KNr|+(OX^P(IT7@goe1k6SSb4-ErkMN}C=5gG(8p`CN?*-J;!&1nee$&VSM z`w1BcRi6W0lZTGPk60-`r=#aWa*_R>=PM;(qFmFaN=#EOeHmRM8nf1t1CIc;!&(^y zlUEnxZntDR(c@pqSAY}Z1)gyTMi4l~9u-UTyM&GtPH>y-GI8u#e}L|<_p-1bjR}tl(ot11UX+z5 zBsPZYplVh;fz)+bTJu-P8KdxpPWF+#Y>n7HIjzMTDTX^y0wJtI<(M##PB_aYdB&M2 zKyl)0FcSVEk+v#SuIb3uXa$;`G5I4D~`k` zI@{vW^xrYT+F0L#bI}e@BsJn>-{i`EeX$JnR?Bz)=&b^eI3r?LVB)7Y|DsIUViZI% z&?-ZlIHe;URUW}VE{?=B%^3$UY3=KLH8xYN<2Ga}f^Ms)46W(c-MOUr&EO5!=9Q+n zvK)@^YNLXHL#LZ&T=`@*mnlKOt2-u5gf)4S$wlHaGv?!2o(r9A?nzHdthy2k_+wv6 z$w=gtD?HSK2MpH|rC+)D*$_Rpgo_EWpif4%8_G%hLA8&3^ja#jTg(u&Re4TNdVOP_!sOkb|Qg}|?E z?>K>F@`R19#GFPo;>?yPXpQfWxmI{Ey;xF=cazPH%J6hjXiNHO&L)i^G+ix-a7lh> z$a;I%?iG_Ztp9IVOj^o}zUF&%I&*}(AHU-rvl`D`or#rDbj0au{B)n79X!BHN;f(L zMpHE~euMO)r;lY}lz^E+nV)MqaJerP;c}Y`OfL4ChW&>X=7X$~)Mxb(r2EX6?TwPxA#=m@-icUNnadDCslmRy5#M%9iOE}+QmO!0g zfR=Silz3j!lrJ{w2L?N(XMDV5!{>0TLF2p;d!iwAN-*0@J!-p3Kn4703AxkWXjakp z6q-T}#=!kE-JYBlk+Hn>LU>=7Lq2BZY^=nxDC5S1Mg!{y(74mdB@+H`se(gkA>jfo zTdWeheLFNjjOdJ;;&@Ib!LVWVp6sv+Ln3EJ@|KiHl^Glfl^ z1Co|{zw&Ec1xFCfrW97;S~?FmSDm`~&Wrj>z`_TOLxrA+ha^g*&UpL%6IBUjmZ(pa zO{n+k&2fISaE;|fUoieX4DdQ|2dnKqX2?u8Dkrpl0N!FH`;)Ei*?YxJj~_|s?=YeD zQWp@9tD)31g#c?zR5`Qa+$aj}mBKP;)vIwYThuN2O={rf$V~?mhddd+sspAZy$s8G zHh_hm&F6c(aZlft{{iw8wH1Z`80Km8bta)bJ%*gCmL8W`!X8nwIvqNA^9o#_pG7~X z^&Er^xY8s^aMw-+v^{e3OW( z`yegKrZs_UsS`H3E^g2`zu6Utv{ueDEZQ;HrA2N11*Q;<(H`2L zjkQ8uac9{~gejnVHncZqgzhIgpiMU84L^+y@ICOY7ZvdM&m;lus5dl*_623rz3r=f zEXku1p3ojgS#F(3ZqC3@QQktvMhoF7VV`Ce>=7|}0&BYh5Sh=%8MB)h4D~dvmXaJAJq{fB)+^7L04&^Q?J5p?N4Lt9NSRAOiH3@wyPdg1 z1ktE__tiMG^;bna3F){ivD1m)N!$THc7_$mwNdIqLQE8p=_{Fi#oBP?@*~$TuBy^F zrYaZSPC@-1%wSXn_rDSXYFC1df8JD{JYf|p!4>2!Jb`RBz8yZzSD+Z9P(!Q+LOyBV zkfQ~^n%s_b(bVu*4ck?$(3AJE{H@3SOCrhXKYtX>0fdEDR;1c0jgpyKY;wrIiaL;T zojzPjyb~(^zm`>zL-E1*djS+X7~s&#nMoHcUCsp2Y^{oaVWWspw+>v_|z#C2Dlh_$b?#&P23skJMQ zlt%mvz@$P&zm&%$MVlW&#;4}X_yWxXh~gtK&oM%o^k633H??Xs;J~KM9@9EOs+9Z1 zeKoXG|K#ebh0otCd!a<&v~I-KRd8bJJMOPnHt4X+$xhb5k&~xwr{g`Nt*|P?R-5YR zeF1T13r`M|jbd6dt7qW_kUXwSUC*|xpHKV0MDgNnu5>{P63lD4p*JL^OmW_AT(O%P4cT!Pszh3o-ff zsi9HKpSTN?7a1BH_?Q6&w01pgL8PDav(xL8Xp-X z=xi$PjH~i;_X0M2Dz&)Fnj*_}O|1UE{-3;w`cQ@NX8e~kIqJ^eQ*oE~Q{)@2r3ocB zT+>bZ$R9C+6!FhX8cq5mh2iTz!y7r?H9O<5Um#;ZluE%y2XDw0DJ;U3l-0!)P z+Z?I35ka*3Oec#YZIWcW$c|yb@2z#6*8YJ}UpwoDsS^GyuHzjqIR{Js++gwl1`kna zdyeQ1%aP^qESK{S3>DgXtH)&oT)IZM6ne`>8TiAh)N(6fwc!rKewMC=*7lZe<4$0` zY6npeS>v=?{RoXtB6%t*?bSkp>~AH_agGUJ5ParRu5wNY@u6M%oFR*Qi7_03SpyD0nYJ9gGMsx`JHGu7`>Xulzl;eSaP>CR9e zmjw|Mo6CKwcMMn#KfT0rYsraa=}dUMB)+qXt*H%iVh&VLjvl9dH+c=}8K=Z*%N=TJ z`7a7J-iUx)m`F}~zOqIGz6XrBa^_0DNOC{{7ohm6Kk z4Y@2nkl%})cV|~(5px9mnwxcXgL!boD^@ktmJ%=1C>w zwIWXZ_{zLx>|ZQzdW;pK9QdUMWpa!D8kD|bpi6#EYP4`ITdY<42_T&CVuM4}9TY-!ZXVK8?y zT;oRttK{GrvccKFXJKo#l}h9+qL*apH<1qaC2hENzqL-M2_!d3fr+1njy&I4Y+WT} z8ck858!7l_GM9u?1!^qB&GX!5RpHM4L6}Pe3LmDD@D?m;)1Kgt`+>L|TmM&?_e6D21oAcYZin{7Zr&o#^o|W{M3+hY^gTA zWKppH|TJC^A7t_a?bQR9>ya1cMU zo8USq`bk{ieJRh}f}^Ivife)c(8_EeX&))LGhP}LDRab8Lx97k3a?9*wa1&mY^Qzx zp2AS>f_KE;dj`jOzCf}WY4@>gIBH0k6Bn)yMo;w zS?%b8242MkZ8M2M3e}8{wCgeVVqM8%Ww$~#tE=poWq!yRbP2JXEz?ZMdnOCNcgs8~ zq3k^ga1}&*e=&&1Uw#RXv!3))Gm;FLjkgVN`%qkd%HvX)OLD{V?}`onw4L5Z1f$QDN2 z66X*{+Lix{z4GsnRMDessx26fdGT8@@at{UB7r_*>$}G`@cY?_8%;q3&OszHD)j~H zM<#FI-^+?YbFBI98w~NVip0O>#d(N?VD)6pq9k4$r=nKm$Gt_T*|-C7JF$PD#lcQL zKORFKp;P;T<|6AHv_Ni@L}VX@+PAOz4!0~j>$S|}ndqzp7#mqcQu_7z?^W!JuDGct z+FUqveOf*qetWnTMNx8=bsSU`=%mT;BsZGG4L+YtSn9uuZ`Z6g9lppb&q-VXODue| z`A)fP^Y!K_0+kFmPG^@1rG+-dQE?X|sBK|9ho3GBk$G3Cp}+(}r2|O(HIYgiG~q># z*WkhD2MPgJ|1n98c1u%MQ+ScL^QM+a8Dw7n{<6G`!!gbGurom7GvtK`?eXORGhbD* zR38LMU%e})mG(CT_eEOEZeB{ih$n|ly<^qhASY65k1dd119q^p8Kd*R(N1>%uni;3 z324c#1{0<37dgPL#9X(SkL@(+g?ghow)WfwtATSSMWR&RHj&e+QrbmgGX8pjjh;c? zkzZ7O>TG|Y@~O8)>#o1D`Od8zK>hqm!60~pW@)k;pGo%vVHFG%Wu93umA=T5TMOb* z&6yG-Y-ZoWHf&>^tH0M9Unl4ps?VdiCOECk4-YXG1HT$nN|+gfhWZ!nq3|0)*t?{# zFM!K`2)BW!Nnt@Kor|q~4Bc8q##4<<1xk*KvW9R!G8|oHdzR~kwG9Oce^iQPfmUlH zs!yiuALD~US$s)wsP1P4S>_4VH1HZn<%PuP)7*cokUhOBFP7b-npMAvR7ocJ&>?7W z#QOm2YOe0sflLjGO{b@Rz8ynUy5%Y#AWi0gH2v}?hm=l3BFP3J{R5NM1CaIv6@wqJ z;`w|rzhW(tyOOoav!etGvgQrvV?&~D#+-U&PFo9J^QA7Oftr@MM=%$(pE+T_(<8`q z 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 dLAvcW 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 Date: Thu, 8 Aug 2024 14:39:31 -0300 Subject: [PATCH 24/28] chore: add program id to output --- .../risc_zero/fibonacci_proof_generator/host/src/main.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/src/main.rs b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/src/main.rs index 8aa0ab6bc..666277b31 100644 --- a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/src/main.rs +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/src/main.rs @@ -8,6 +8,13 @@ const PUB_INPUT_FILE_PATH: &str = "risc_zero_fibonacci.pub"; const FIBONACCI_ID_FILE_PATH: &str = "risc_zero_fibonacci_id.bin"; fn main() { + let hex_string: String = FIBONACCI_ID + .iter() + .map(|&num| format!("{:08x}", num)) + .collect::(); + + println!("Program ID: 0x{}", hex_string); + // Initialize tracing. In order to view logs, run `RUST_LOG=info cargo run` tracing_subscriber::fmt() .with_env_filter(tracing_subscriber::filter::EnvFilter::from_default_env()) From 4818c34952859adad1001783db2bbd11921693c0 Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 8 Aug 2024 16:41:05 -0300 Subject: [PATCH 25/28] fix: program id should be keccaked --- .../contracts/src/FibonacciValidator.sol | 2 +- .../fibonacci_proof_generator/Cargo.lock | 1 + .../fibonacci_proof_generator/host/Cargo.toml | 1 + .../host/src/main.rs | 14 ++++++++------ .../risc_zero_fibonacci.proof | Bin 215590 -> 215590 bytes 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/examples/validating-public-input/contracts/src/FibonacciValidator.sol b/examples/validating-public-input/contracts/src/FibonacciValidator.sol index 9702172f7..8afa39737 100644 --- a/examples/validating-public-input/contracts/src/FibonacciValidator.sol +++ b/examples/validating-public-input/contracts/src/FibonacciValidator.sol @@ -6,7 +6,7 @@ contract FibonacciValidator { bytes32 public fibonacciProgramId; bytes32 public fibonacciProgramIdCommitment = - 0xf000637ed63d26fc664f16666aebf05440ddb7071931240dc49d9bbcfbac304a; + 0x069ed9f3972550a2901523723f4beb5e240749dcafa30e1623d0778e17d69d70; event FibonacciNumbers(uint32 fibN, uint32 fibNPlusOne); diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.lock b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.lock index cf83f9a7b..f8073a597 100644 --- a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.lock +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/Cargo.lock @@ -1004,6 +1004,7 @@ name = "host" version = "0.1.0" dependencies = [ "bincode", + "hex", "methods", "risc0-zkvm", "serde", diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/Cargo.toml b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/Cargo.toml index e62ab139e..b29e39d92 100644 --- a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/Cargo.toml +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/Cargo.toml @@ -9,3 +9,4 @@ risc0-zkvm = { git = "https://github.com/risc0/risc0", tag="v1.0.5", default-fea tracing-subscriber = { version = "0.3", features = ["env-filter"] } serde = "1.0" bincode = "1.3.3" +hex = "0.4.3" diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/src/main.rs b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/src/main.rs index 666277b31..7fa621a74 100644 --- a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/src/main.rs +++ b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/host/src/main.rs @@ -8,12 +8,14 @@ const PUB_INPUT_FILE_PATH: &str = "risc_zero_fibonacci.pub"; const FIBONACCI_ID_FILE_PATH: &str = "risc_zero_fibonacci_id.bin"; fn main() { - let hex_string: String = FIBONACCI_ID - .iter() - .map(|&num| format!("{:08x}", num)) - .collect::(); - - println!("Program ID: 0x{}", hex_string); + let program_id_le: Vec = FIBONACCI_ID + .clone() + .into_iter() + .map(|n| n.to_le_bytes()) + .flatten() + .collect(); + + println!("Program ID: 0x{}", hex::encode(program_id_le)); // Initialize tracing. In order to view logs, run `RUST_LOG=info cargo run` tracing_subscriber::fmt() diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof index 50bc2d8260589c32b0c5a4470003c112bf204f7d..4f992198297adadf8783a2970e5aee4910584fbc 100644 GIT binary patch literal 215590 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�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

4^v>p{7VrXswHv}3sn;EZ7dcs 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

WGT;1ML9mGBs;eGx8`?qa|Ib~Qv5 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 VlVLL{*l+fo&)Wa{jQ<_}{{hBRsi*(| literal 215590 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∋aY636>qD#J6LQr(|Im!QQT=Xgw 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 Q2Td&bzx{vC`2W)XFKYDcH2?qr From ccf9efbdc1c4dad26ac6e54acab59c1299214e1f Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 8 Aug 2024 16:45:48 -0300 Subject: [PATCH 26/28] feat: add 0x to public input print --- .../validating-public-input/aligned-integration/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/validating-public-input/aligned-integration/src/main.rs b/examples/validating-public-input/aligned-integration/src/main.rs index b5eb87ed7..1a0458c6f 100644 --- a/examples/validating-public-input/aligned-integration/src/main.rs +++ b/examples/validating-public-input/aligned-integration/src/main.rs @@ -36,7 +36,7 @@ async fn main() -> Result<(), SubmitError> { let pub_input_hex = hex::encode(pub_input.as_ref().unwrap()); - info!("Pub input bytes as hex: {:?}", pub_input_hex); + info!("Pub input bytes as hex: 0x{}", pub_input_hex); let proof_generator_addr = Address::from_str(PROOF_GENERATOR_ADDRESS).unwrap(); From 7aae9bc3f58464b0a5b8fe5df15692899e30d735 Mon Sep 17 00:00:00 2001 From: "Mariano A. Nicolini" Date: Thu, 8 Aug 2024 16:48:07 -0300 Subject: [PATCH 27/28] Update docs/guides/3_validating_public_input.md --- docs/guides/3_validating_public_input.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guides/3_validating_public_input.md b/docs/guides/3_validating_public_input.md index cf375e79e..a346c79f4 100644 --- a/docs/guides/3_validating_public_input.md +++ b/docs/guides/3_validating_public_input.md @@ -11,8 +11,8 @@ This guide assumes you are in the `examples/validating-public-input` directory. ## Generate your ZK Proof > [!IMPORTANT] -> To generate the proof ensure you have [docker](https://www.docker.com/get-started/) installed. -> This is necessary because the program and identifier may differ based on your operating system. +> To generate the proof ensure you have [docker](https://www.docker.com/get-started/) installed and the docker daemon running. +> This is necessary to ensure deterministic builds of the binary we want to generate a proof of. If not used, builds may differ depending on the system you are running on. To know more about this, check [this link](https://dev.risczero.com/terminology#deterministic-builds) from RiscZero docs. To submit proofs to Aligned and get them verified, first you need to generate those proofs. Every proving system has its own way of generating proofs. From 394eb545f9ab245d4e5e05904019907f1c6201bf Mon Sep 17 00:00:00 2001 From: NicolasRampoldi <58613770+NicolasRampoldi@users.noreply.github.com> Date: Thu, 8 Aug 2024 17:01:38 -0300 Subject: [PATCH 28/28] docs: add cast --- docs/guides/3_validating_public_input.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/guides/3_validating_public_input.md b/docs/guides/3_validating_public_input.md index cf375e79e..7032b0a55 100644 --- a/docs/guides/3_validating_public_input.md +++ b/docs/guides/3_validating_public_input.md @@ -45,7 +45,7 @@ contract FibonacciValidator { bytes32 public fibonacciProgramId; bytes32 public fibonacciProgramIdCommitment = - 0xbfa561e384be753bd6fd75b15db31eb511cd114ec76d619a87c2342af0ee1ed7; + 0x069ed9f3972550a2901523723f4beb5e240749dcafa30e1623d0778e17d69d70; event FibonacciNumbers(uint32 fibN, uint32 fibNPlusOne); @@ -196,6 +196,12 @@ ALIGNED_SERVICE_MANAGER_ADDRESS= #0x58F280BeBE9B34c9939 Then, run `make deploy_fibonacci_validator`. +To call the function in the contract with [cast](https://book.getfoundry.sh/cast/) run: + +``` +cast send --rpc-url https://ethereum-holesky-rpc.publicnode.com "verifyBatchInclusion(bytes32,bytes32,bytes32,bytes20,bytes32,bytes,uint256,bytes)" --private-key +``` + ## Submit and verify the proof to Aligned The proof submission and verification can be done either with the SDK or by using the Aligned CLI.

cK6funOfJ_V))# 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 BR5btq diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci_id.bin b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci_id.bin index 907ee66448ea051bc2be7b924102e6ddf9fe893e..710bc748d29a44544e6ccd59cb409f3ad87c0ca1 100644 GIT binary patch literal 32 ocmb Date: Thu, 8 Aug 2024 14:39:22 -0300 Subject: [PATCH 23/28] chore: add program id to output --- docs/guides/3_validating_public_input.md | 14 ++++++++++++++ .../contracts/src/FibonacciValidator.sol | 2 +- .../risc_zero_fibonacci.proof | Bin 215590 -> 215590 bytes 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/guides/3_validating_public_input.md b/docs/guides/3_validating_public_input.md index 2669ead64..cf375e79e 100644 --- a/docs/guides/3_validating_public_input.md +++ b/docs/guides/3_validating_public_input.md @@ -10,12 +10,26 @@ This guide assumes you are in the `examples/validating-public-input` directory. ## Generate your ZK Proof +> [!IMPORTANT] +> To generate the proof ensure you have [docker](https://www.docker.com/get-started/) installed. +> This is necessary because the program and identifier may differ based on your operating system. + To submit proofs to Aligned and get them verified, first you need to generate those proofs. Every proving system has its own way of generating proofs. You can find examples on how to generate proofs in the [generating proofs guide](4_generating_proofs.md). To generate the proof needed to try this example, run `make generate_risc_zero_fibonacci_proof`. +Once finished, you will see the program id, the two last fibonacci numbers of the sequence and the result of the verification like so: + +``` +Program ID: 0xf000637ed63d26fc664f16666aebf05440ddb7071931240dc49d9bbcfbac304a +a: 1268 +b: 1926 +Verification result: true +Fibonacci proof, pub input and image ID generated in risc_zero folder +``` + ## Write your smart contract To check if a proof was verified in Aligned, you need to make a call to the `AlignedServiceManager` contract inside your smart contract. diff --git a/examples/validating-public-input/contracts/src/FibonacciValidator.sol b/examples/validating-public-input/contracts/src/FibonacciValidator.sol index 32c2d42c8..9702172f7 100644 --- a/examples/validating-public-input/contracts/src/FibonacciValidator.sol +++ b/examples/validating-public-input/contracts/src/FibonacciValidator.sol @@ -6,7 +6,7 @@ contract FibonacciValidator { bytes32 public fibonacciProgramId; bytes32 public fibonacciProgramIdCommitment = - 0xbfa561e384be753bd6fd75b15db31eb511cd114ec76d619a87c2342af0ee1ed7; + 0xf000637ed63d26fc664f16666aebf05440ddb7071931240dc49d9bbcfbac304a; event FibonacciNumbers(uint32 fibN, uint32 fibNPlusOne); diff --git a/examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof b/examples/validating-public-input/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof index f22360927967ee2913a53fcb3bb0326b933bf912..50bc2d8260589c32b0c5a4470003c112bf204f7d 100644 GIT binary patch literal 215590 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∋aY636>qD#J6LQr(|Im!QQT=Xgw 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