Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- SimulateTxAccessor
- Optimization enabled
- false
- Compiler version
- v0.7.6+commit.7338295f
- EVM Version
- default
- Verified at
- 2024-09-14T09:30:43.862704Z
contracts/accessors/SimulateTxAccessor.sol
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; import {Executor, Enum} from "../base/Executor.sol"; /** * @title Simulate Transaction Accessor. * @notice Can be used with StorageAccessible to simulate Safe transactions. * @author Richard Meissner - @rmeissner */ contract SimulateTxAccessor is Executor { address private immutable ACCESSOR_SINGLETON; constructor() { ACCESSOR_SINGLETON = address(this); } /** * @notice Modifier to make a function callable via delegatecall only. * If the function is called via a regular call, it will revert. */ modifier onlyDelegateCall() { require(address(this) != ACCESSOR_SINGLETON, "SimulateTxAccessor should only be called via delegatecall"); _; } /** * @notice Simulates a Safe transaction and returns the used gas, success boolean and the return data. * @dev Executes the specified operation {Call, DelegateCall} and returns operation-specific data. * Has to be called via delegatecall. * This returns the data equal to `abi.encode(uint256(estimate), bool(success), bytes(returnData))`. * Specifically, the returndata will be: * `estimate:uint256 || success:bool || returnData.length:uint256 || returnData:bytes`. * @param to Destination address . * @param value Native token value. * @param data Data payload. * @param operation Operation type {Call, DelegateCall}. * @return estimate Gas used. * @return success Success boolean value. * @return returnData Return data. */ function simulate( address to, uint256 value, bytes calldata data, Enum.Operation operation ) external onlyDelegateCall returns (uint256 estimate, bool success, bytes memory returnData) { uint256 startGas = gasleft(); success = execute(to, value, data, operation, gasleft()); estimate = startGas - gasleft(); /* solhint-disable no-inline-assembly */ /// @solidity memory-safe-assembly assembly { // Load free memory location let ptr := mload(0x40) // We allocate memory for the return data by setting the free memory location to // current free memory location + data size + 32 bytes for data size value mstore(0x40, add(ptr, add(returndatasize(), 0x20))) // Store the size mstore(ptr, returndatasize()) // Store the data returndatacopy(add(ptr, 0x20), 0, returndatasize()) // Point the return data to the correct memory location returnData := ptr } /* solhint-enable no-inline-assembly */ } }
contracts/base/Executor.sol
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; import {Enum} from "../libraries/Enum.sol"; /** * @title Executor - A contract that can execute transactions * @author Richard Meissner - @rmeissner */ abstract contract Executor { /** * @notice Executes either a delegatecall or a call with provided parameters. * @dev This method doesn't perform any sanity check of the transaction, such as: * - if the contract at `to` address has code or not * It is the responsibility of the caller to perform such checks. * @param to Destination address. * @param value Ether value. * @param data Data payload. * @param operation Operation type. * @return success boolean flag indicating if the call succeeded. */ function execute( address to, uint256 value, bytes memory data, Enum.Operation operation, uint256 txGas ) internal returns (bool success) { if (operation == Enum.Operation.DelegateCall) { /* solhint-disable no-inline-assembly */ /// @solidity memory-safe-assembly assembly { success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0) } /* solhint-enable no-inline-assembly */ } else { /* solhint-disable no-inline-assembly */ /// @solidity memory-safe-assembly assembly { success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0) } /* solhint-enable no-inline-assembly */ } } }
contracts/libraries/Enum.sol
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.7.0 <0.9.0; /** * @title Enum - Collection of enums used in Safe Smart Account contracts. * @author @safe-global/safe-protocol */ library Enum { enum Operation { Call, DelegateCall } }
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata","devdoc","userdoc","storageLayout","evm.gasEstimates"],"":["ast"]}},"optimizer":{"runs":200,"enabled":false},"metadata":{"useLiteralContent":true},"libraries":{}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"estimate","internalType":"uint256"},{"type":"bool","name":"success","internalType":"bool"},{"type":"bytes","name":"returnData","internalType":"bytes"}],"name":"simulate","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint8","name":"operation","internalType":"enum Enum.Operation"}]}]
Contract Creation Code
0x60a060405234801561001057600080fd5b503073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505060805160601c6103526100656000398061017052506103526000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80631c5fb21114610030575b600080fd5b6100de6004803603608081101561004657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561008d57600080fd5b82018360208201111561009f57600080fd5b803590602001918460018302840111640100000000831117156100c157600080fd5b9091929391929390803560ff169060200190929190505050610169565b60405180848152602001831515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561012c578082015181840152602081019050610111565b50505050905090810190601f1680156101595780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b60008060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610213576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806102e46039913960400191505060405180910390fd5b60005a9050610269898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050885a610297565b92505a8103935060405160203d0181016040523d81523d6000602083013e8092505050955095509592505050565b60006001808111156102a557fe5b8360018111156102b157fe5b14156102ca576000808551602087018986f490506102da565b600080855160208701888a87f190505b9594505050505056fe53696d756c61746554784163636573736f722073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca2646970667358221220fd430144adb49f3c41232dfb6304536647edd8ba193872e74bf6864e1b781cca64736f6c63430007060033
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80631c5fb21114610030575b600080fd5b6100de6004803603608081101561004657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561008d57600080fd5b82018360208201111561009f57600080fd5b803590602001918460018302840111640100000000831117156100c157600080fd5b9091929391929390803560ff169060200190929190505050610169565b60405180848152602001831515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561012c578082015181840152602081019050610111565b50505050905090810190601f1680156101595780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b60008060607f00000000000000000000000038710e559a67ef07bcf8eea70b076ac8e756de0873ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610213576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806102e46039913960400191505060405180910390fd5b60005a9050610269898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050885a610297565b92505a8103935060405160203d0181016040523d81523d6000602083013e8092505050955095509592505050565b60006001808111156102a557fe5b8360018111156102b157fe5b14156102ca576000808551602087018986f490506102da565b600080855160208701888a87f190505b9594505050505056fe53696d756c61746554784163636573736f722073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca2646970667358221220fd430144adb49f3c41232dfb6304536647edd8ba193872e74bf6864e1b781cca64736f6c63430007060033