ETH Price: $1,975.00 (+0.06%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CallProxy

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity Multiple files format)

File 1 of 5: CallProxy.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

import "IFactRegistry.sol";
import "StorageSlots.sol";
import "BlockDirectCall.sol";
import "Common.sol";

/**
  CallProxy is a 'call' based proxy.
  It is a facade to a real implementation,
  only that unlike the Proxy pattern, it uses call and not delegatecall,
  so that the state is recorded on the called contract.

  This contract is expected to be placed behind the regular proxy,
  thus:
  1. Implementation address is stored in a hashed slot (other than proxy's one...).
  2. No state variable is allowed in low address ranges.
  3. Setting of implementation is done in initialize.
  4. isFrozen and initialize are implemented, to be compliant with Proxy.

  This implementation is intentionally minimal,
  and has no management or governance.
  The assumption is that if a different implementation is needed, it will be performed
  in an upgradeTo a new deployed CallProxy, pointing to a new implementation.
*/
// NOLINTNEXTLINE locked-ether.
contract CallProxy is BlockDirectCall, StorageSlots {
    using Addresses for address;

    string public constant CALL_PROXY_VERSION = "3.1.0";

    // Proxy client - initialize & isFrozen.
    // NOLINTNEXTLINE: external-function.
    function isFrozen() public pure returns (bool) {
        return false;
    }

    /*
      This function is called by the Proxy upon activating an implementation.
      The data passed in to this function contains the implementation address,
      and if applicable, an address of an EIC (ExternalInitializerContract) and its data.

      The expected data format is as following:

      Case I (no EIC):
        data.length == 64.
        [0 :32] implementation address
        [32:64] Zero address.

      Case II (EIC):
        data length >= 64
        [0 :32] implementation address
        [32:64] EIC address
        [64:  ] EIC init data.
    */
    function initialize(bytes calldata data) external notCalledDirectly {
        require(data.length >= 64, "INCORRECT_DATA_SIZE");
        (address impl, address eic) = abi.decode(data, (address, address));
        require(impl.isContract(), "ADDRESS_NOT_CONTRACT");
        setCallProxyImplementation(impl);
        if (eic != address(0x0)) {
            callExternalInitializer(eic, data[64:]);
        } else {
            require(data.length == 64, "INVALID_INIT_DATA");
        }
    }

    function callExternalInitializer(address externalInitializerAddr, bytes calldata eicData)
        private
    {
        require(externalInitializerAddr.isContract(), "EIC_NOT_A_CONTRACT");

        // NOLINTNEXTLINE: low-level-calls, controlled-delegatecall.
        (bool success, bytes memory returndata) = externalInitializerAddr.delegatecall(
            abi.encodeWithSelector(this.initialize.selector, eicData)
        );
        require(success, string(returndata));
        require(returndata.length == 0, string(returndata));
    }

    /*
      Returns the call proxy implementation address.
    */
    function callProxyImplementation() public view returns (address _implementation) {
        bytes32 slot = CALL_PROXY_IMPL_SLOT;
        assembly {
            _implementation := sload(slot)
        }
    }

    /*
      Sets the call proxy implementation address.
    */
    function setCallProxyImplementation(address newImplementation) private {
        bytes32 slot = CALL_PROXY_IMPL_SLOT;
        assembly {
            sstore(slot, newImplementation)
        }
    }

    /*
      An explicit isValid entry point, used to make isValid a part of the ABI and visible
      on Etherscan (and alike).
    */
    function isValid(bytes32 fact) external view returns (bool) {
        return IFactRegistry(callProxyImplementation()).isValid(fact);
    }

    /*
      This entry point serves only transactions with empty calldata. (i.e. pure value transfer tx).
      We don't expect to receive such, thus block them.
    */
    receive() external payable {
        revert("CONTRACT_NOT_EXPECTED_TO_RECEIVE");
    }

    /*
      Contract's default function. Pass execution to the implementation contract (using call).
      It returns back to the external caller whatever the implementation called code returns.
    */
    fallback() external payable {
        // NOLINT locked-ether.
        address _implementation = callProxyImplementation();
        require(_implementation != address(0x0), "MISSING_IMPLEMENTATION");
        uint256 value = msg.value;
        assembly {
            // Copy msg.data. We take full control of memory in this inline assembly
            // block because it will not return to Solidity code. We overwrite the
            // Solidity scratch pad at memory position 0.
            calldatacopy(0, 0, calldatasize())

            // Call the implementation.
            // out and outsize are 0 for now, as we don't know the out size yet.
            let result := call(gas(), _implementation, value, 0, calldatasize(), 0, 0)

            // Copy the returned data.
            returndatacopy(0, 0, returndatasize())

            switch result
            // delegatecall returns 0 on error.
            case 0 {
                revert(0, returndatasize())
            }
            default {
                return(0, returndatasize())
            }
        }
    }
}

File 2 of 5: BlockDirectCall.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

/*
  This contract provides means to block direct call of an external function.
  A derived contract (e.g. MainDispatcherBase) should decorate sensitive functions with the
  notCalledDirectly modifier, thereby preventing it from being called directly, and allowing only calling
  using delegate_call.

  This Guard contract uses pseudo-random slot, So each deployed contract would have its own guard.
*/
abstract contract BlockDirectCall {
    bytes32 immutable UNIQUE_SAFEGUARD_SLOT; // NOLINT naming-convention.

    constructor() internal {
        // The slot is pseudo-random to allow hierarchy of contracts with guarded functions.
        bytes32 slot = keccak256(abi.encode(this, block.timestamp, gasleft()));
        UNIQUE_SAFEGUARD_SLOT = slot;
        assembly {
            sstore(slot, 42)
        }
    }

    modifier notCalledDirectly() {
        {
            // Prevent too many local variables in stack.
            uint256 safeGuardValue;
            bytes32 slot = UNIQUE_SAFEGUARD_SLOT;
            assembly {
                safeGuardValue := sload(slot)
            }
            require(safeGuardValue == 0, "DIRECT_CALL_DISALLOWED");
        }
        _;
    }
}

File 3 of 5: Common.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

/*
  Common Utility librarries.
  I. Addresses (extending address).
*/
library Addresses {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function performEthTransfer(address recipient, uint256 amount) internal {
        (bool success, ) = recipient.call{value: amount}(""); // NOLINT: low-level-calls.
        require(success, "ETH_TRANSFER_FAILED");
    }

    /*
      Safe wrapper around ERC20/ERC721 calls.
      This is required because many deployed ERC20 contracts don't return a value.
      See https://github.com/ethereum/solidity/issues/4116.
    */
    function safeTokenContractCall(address tokenAddress, bytes memory callData) internal {
        require(isContract(tokenAddress), "BAD_TOKEN_ADDRESS");
        // NOLINTNEXTLINE: low-level-calls.
        (bool success, bytes memory returndata) = tokenAddress.call(callData);
        require(success, string(returndata));

        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "TOKEN_OPERATION_FAILED");
        }
    }

    /*
      Validates that the passed contract address is of a real contract,
      and that its id hash (as infered fromn identify()) matched the expected one.
    */
    function validateContractId(address contractAddress, bytes32 expectedIdHash) internal {
        require(isContract(contractAddress), "ADDRESS_NOT_CONTRACT");
        (bool success, bytes memory returndata) = contractAddress.call( // NOLINT: low-level-calls.
            abi.encodeWithSignature("identify()")
        );
        require(success, "FAILED_TO_IDENTIFY_CONTRACT");
        string memory realContractId = abi.decode(returndata, (string));
        require(
            keccak256(abi.encodePacked(realContractId)) == expectedIdHash,
            "UNEXPECTED_CONTRACT_IDENTIFIER"
        );
    }

    /*
      Similar to safeTokenContractCall, but always ignores the return value.

      Assumes some other method is used to detect the failures
      (e.g. balance is checked before and after the call).
    */
    function uncheckedTokenContractCall(address tokenAddress, bytes memory callData) internal {
        // NOLINTNEXTLINE: low-level-calls.
        (bool success, bytes memory returndata) = tokenAddress.call(callData);
        require(success, string(returndata));
    }
}

/*
  II. StarkExTypes - Common data types.
*/
library StarkExTypes {
    // Structure representing a list of verifiers (validity/availability).
    // A statement is valid only if all the verifiers in the list agree on it.
    // Adding a verifier to the list is immediate - this is used for fast resolution of
    // any soundness issues.
    // Removing from the list is time-locked, to ensure that any user of the system
    // not content with the announced removal has ample time to leave the system before it is
    // removed.
    struct ApprovalChainData {
        address[] list;
        // Represents the time after which the verifier with the given address can be removed.
        // Removal of the verifier with address A is allowed only in the case the value
        // of unlockedForRemovalTime[A] != 0 and unlockedForRemovalTime[A] < (current time).
        mapping(address => uint256) unlockedForRemovalTime;
    }
}

File 4 of 5: IFactRegistry.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

/*
  The Fact Registry design pattern is a way to separate cryptographic verification from the
  business logic of the contract flow.

  A fact registry holds a hash table of verified "facts" which are represented by a hash of claims
  that the registry hash check and found valid. This table may be queried by accessing the
  isValid() function of the registry with a given hash.

  In addition, each fact registry exposes a registry specific function for submitting new claims
  together with their proofs. The information submitted varies from one registry to the other
  depending of the type of fact requiring verification.

  For further reading on the Fact Registry design pattern see this
  `StarkWare blog post <https://medium.com/starkware/the-fact-registry-a64aafb598b6>`_.
*/
interface IFactRegistry {
    /*
      Returns true if the given fact was previously registered in the contract.
    */
    function isValid(bytes32 fact) external view returns (bool);
}

File 5 of 5: StorageSlots.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

/**
  StorageSlots holds the arbitrary storage slots used throughout the Proxy pattern.
  Storage address slots are a mechanism to define an arbitrary location, that will not be
  overlapped by the logical contracts.
*/
contract StorageSlots {
    // Storage slot with the address of the current implementation.
    // The address of the slot is keccak256("StarkWare2019.implemntation-slot").
    // We need to keep this variable stored outside of the commonly used space,
    // so that it's not overrun by the logical implementation (the proxied contract).
    bytes32 internal constant IMPLEMENTATION_SLOT =
        0x177667240aeeea7e35eabe3a35e18306f336219e1386f7710a6bf8783f761b24;

    // Storage slot with the address of the call-proxy current implementation.
    // The address of the slot is keccak256("'StarkWare2020.CallProxy.Implemntation.Slot'").
    // We need to keep this variable stored outside of the commonly used space.
    // so that it's not overrun by the logical implementation (the proxied contract).
    bytes32 internal constant CALL_PROXY_IMPL_SLOT =
        0x7184681641399eb4ad2fdb92114857ee6ff239f94ad635a1779978947b8843be;

    // This storage slot stores the finalization flag.
    // Once the value stored in this slot is set to non-zero
    // the proxy blocks implementation upgrades.
    // The current implementation is then referred to as Finalized.
    // Web3.solidityKeccak(['string'], ["StarkWare2019.finalization-flag-slot"]).
    bytes32 internal constant FINALIZED_STATE_SLOT =
        0x7d433c6f837e8f93009937c466c82efbb5ba621fae36886d0cac433c5d0aa7d2;

    // Storage slot to hold the upgrade delay (time-lock).
    // The intention of this slot is to allow modification using an EIC.
    // Web3.solidityKeccak(['string'], ['StarkWare.Upgradibility.Delay.Slot']).
    bytes32 public constant UPGRADE_DELAY_SLOT =
        0xc21dbb3089fcb2c4f4c6a67854ab4db2b0f233ea4b21b21f912d52d18fc5db1f;
}

Contract Security Audit

Contract ABI

API
[{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"CALL_PROXY_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_DELAY_SLOT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callProxyImplementation","outputs":[{"internalType":"address","name":"_implementation","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"fact","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a060405234801561001057600080fd5b50600030425a60405160200180846001600160a01b0316815260200183815260200182815260200193505050506040516020818303038152906040528051906020012090508060808181525050602a81555060805161086e61007c60003980610335525061086e6000f3fe6080604052600436106100595760003560e01c806320cea94d1461013157806333eeb14714610158578063439fab91146101815780636499eb12146102005780636a93856714610231578063895f0abe1461025b576100ab565b366100ab576040805162461bcd60e51b815260206004820181905260248201527f434f4e54524143545f4e4f545f45585045435445445f544f5f52454345495645604482015290519081900360640190fd5b60006100b56102e5565b90506001600160a01b03811661010b576040805162461bcd60e51b815260206004820152601660248201527526a4a9a9a4a723afa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b34366000803760008036600084865af13d6000803e80801561012c573d6000f35b3d6000fd5b34801561013d57600080fd5b5061014661030a565b60408051918252519081900360200190f35b34801561016457600080fd5b5061016d61032e565b604080519115158252519081900360200190f35b34801561018d57600080fd5b506101fe600480360360208110156101a457600080fd5b8101906020810181356401000000008111156101bf57600080fd5b8201836020820111156101d157600080fd5b803590602001918460018302840111640100000000831117156101f357600080fd5b509092509050610333565b005b34801561020c57600080fd5b506102156102e5565b604080516001600160a01b039092168252519081900360200190f35b34801561023d57600080fd5b5061016d6004803603602081101561025457600080fd5b50356104ef565b34801561026757600080fd5b5061027061056e565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102aa578181015183820152602001610292565b50505050905090810190601f1680156102d75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b7f7184681641399eb4ad2fdb92114857ee6ff239f94ad635a1779978947b8843be5490565b7fc21dbb3089fcb2c4f4c6a67854ab4db2b0f233ea4b21b21f912d52d18fc5db1f81565b600090565b7f000000000000000000000000000000000000000000000000000000000000000080549081156103a3576040805162461bcd60e51b81526020600482015260166024820152751112549150d517d0d0531317d11254d0531313d5d15160521b604482015290519081900360640190fd5b505060408110156103f1576040805162461bcd60e51b8152602060048201526013602482015272494e434f52524543545f444154415f53495a4560681b604482015290519081900360640190fd5b6000808383604081101561040457600080fd5b506001600160a01b038135811693506020909101351690506104258261058f565b61046d576040805162461bcd60e51b8152602060048201526014602482015273105111149154d4d7d393d517d0d3d395149050d560621b604482015290519081900360640190fd5b61047682610595565b6001600160a01b038116156104a05761049b816104968560408189610810565b6105b9565b6104e9565b604083146104e9576040805162461bcd60e51b8152602060048201526011602482015270494e56414c49445f494e49545f4441544160781b604482015290519081900360640190fd5b50505050565b60006104f96102e5565b6001600160a01b0316636a938567836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561053c57600080fd5b505afa158015610550573d6000803e3d6000fd5b505050506040513d602081101561056657600080fd5b505192915050565b604051806040016040528060058152602001640332e312e360dc1b81525081565b3b151590565b7f7184681641399eb4ad2fdb92114857ee6ff239f94ad635a1779978947b8843be55565b6105cb836001600160a01b031661058f565b610611576040805162461bcd60e51b8152602060048201526012602482015271115250d7d393d517d057d0d3d395149050d560721b604482015290519081900360640190fd5b60006060846001600160a01b031663439fab9160e01b85856040516024018080602001828103825284848281815260200192508082843760008382015260408051601f909201601f1990811690940182810390940182529283526020810180516001600160e01b03166001600160e01b0319909916989098178852915182519297909650869550935090915081905083835b602083106106c25780518252601f1990920191602091820191016106a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610722576040519150601f19603f3d011682016040523d82523d6000602084013e610727565b606091505b50915091508181906107b75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561077c578181015183820152602001610764565b50505050905090810190601f1680156107a95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5080518190156108085760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561077c578181015183820152602001610764565b505050505050565b6000808585111561081f578182fd5b8386111561082b578182fd5b505082019391909203915056fea2646970667358221220f61891aaa78840b44149d473b452429158106ae9db3e8ed9085b73863741260564736f6c634300060c0033

Deployed Bytecode

0x6080604052600436106100595760003560e01c806320cea94d1461013157806333eeb14714610158578063439fab91146101815780636499eb12146102005780636a93856714610231578063895f0abe1461025b576100ab565b366100ab576040805162461bcd60e51b815260206004820181905260248201527f434f4e54524143545f4e4f545f45585045435445445f544f5f52454345495645604482015290519081900360640190fd5b60006100b56102e5565b90506001600160a01b03811661010b576040805162461bcd60e51b815260206004820152601660248201527526a4a9a9a4a723afa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b34366000803760008036600084865af13d6000803e80801561012c573d6000f35b3d6000fd5b34801561013d57600080fd5b5061014661030a565b60408051918252519081900360200190f35b34801561016457600080fd5b5061016d61032e565b604080519115158252519081900360200190f35b34801561018d57600080fd5b506101fe600480360360208110156101a457600080fd5b8101906020810181356401000000008111156101bf57600080fd5b8201836020820111156101d157600080fd5b803590602001918460018302840111640100000000831117156101f357600080fd5b509092509050610333565b005b34801561020c57600080fd5b506102156102e5565b604080516001600160a01b039092168252519081900360200190f35b34801561023d57600080fd5b5061016d6004803603602081101561025457600080fd5b50356104ef565b34801561026757600080fd5b5061027061056e565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102aa578181015183820152602001610292565b50505050905090810190601f1680156102d75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b7f7184681641399eb4ad2fdb92114857ee6ff239f94ad635a1779978947b8843be5490565b7fc21dbb3089fcb2c4f4c6a67854ab4db2b0f233ea4b21b21f912d52d18fc5db1f81565b600090565b7fc337e0e55e61c2cfdad2c2cf8a4fbc074b131f6d2b4d935a947ac88b792ab2b280549081156103a3576040805162461bcd60e51b81526020600482015260166024820152751112549150d517d0d0531317d11254d0531313d5d15160521b604482015290519081900360640190fd5b505060408110156103f1576040805162461bcd60e51b8152602060048201526013602482015272494e434f52524543545f444154415f53495a4560681b604482015290519081900360640190fd5b6000808383604081101561040457600080fd5b506001600160a01b038135811693506020909101351690506104258261058f565b61046d576040805162461bcd60e51b8152602060048201526014602482015273105111149154d4d7d393d517d0d3d395149050d560621b604482015290519081900360640190fd5b61047682610595565b6001600160a01b038116156104a05761049b816104968560408189610810565b6105b9565b6104e9565b604083146104e9576040805162461bcd60e51b8152602060048201526011602482015270494e56414c49445f494e49545f4441544160781b604482015290519081900360640190fd5b50505050565b60006104f96102e5565b6001600160a01b0316636a938567836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561053c57600080fd5b505afa158015610550573d6000803e3d6000fd5b505050506040513d602081101561056657600080fd5b505192915050565b604051806040016040528060058152602001640332e312e360dc1b81525081565b3b151590565b7f7184681641399eb4ad2fdb92114857ee6ff239f94ad635a1779978947b8843be55565b6105cb836001600160a01b031661058f565b610611576040805162461bcd60e51b8152602060048201526012602482015271115250d7d393d517d057d0d3d395149050d560721b604482015290519081900360640190fd5b60006060846001600160a01b031663439fab9160e01b85856040516024018080602001828103825284848281815260200192508082843760008382015260408051601f909201601f1990811690940182810390940182529283526020810180516001600160e01b03166001600160e01b0319909916989098178852915182519297909650869550935090915081905083835b602083106106c25780518252601f1990920191602091820191016106a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610722576040519150601f19603f3d011682016040523d82523d6000602084013e610727565b606091505b50915091508181906107b75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561077c578181015183820152602001610764565b50505050905090810190601f1680156107a95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5080518190156108085760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561077c578181015183820152602001610764565b505050505050565b6000808585111561081f578182fd5b8386111561082b578182fd5b505082019391909203915056fea2646970667358221220f61891aaa78840b44149d473b452429158106ae9db3e8ed9085b73863741260564736f6c634300060c0033

Deployed Bytecode Sourcemap

1615:4301:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4581:42;;;-1:-1:-1;;;4581:42:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;1615:4301;4909:23;4935:25;:23;:25::i;:::-;4909:51;-1:-1:-1;;;;;;4978:31:1;;4970:66;;;;;-1:-1:-1;;;4970:66:1;;;;;;;;;;;;-1:-1:-1;;;4970:66:1;;;;;;;;;;;;;;;5062:9;5349:14;5046:13;;5330:34;5571:1;5568;5552:14;5549:1;5542:5;5525:15;5518:5;5513:60;5647:16;5644:1;5641;5626:38;5685:6;5752:66;;;;5867:16;5864:1;5857:27;5752:66;5787:16;5784:1;5777:27;2479:119:4;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1852:76:1;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;2510:488;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2510:488:1;;-1:-1:-1;2510:488:1;-1:-1:-1;2510:488:1;:::i;:::-;;3617:205;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;3617:205:1;;;;;;;;;;;;;;4230:138;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4230:138:1;;:::i;1707:51::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3617:205;1749:66:4;3795:11:1;;3762:54::o;2479:119:4:-;2532:66;2479:119;:::o;1852:76:1:-;1893:4;1852:76;:::o;2510:488::-;1648:21:0;1728:11;;;1774:19;;1766:54;;;;;-1:-1:-1;;;1766:54:0;;;;;;;;;;;;-1:-1:-1;;;1766:54:0;;;;;;;;;;;;;;;-1:-1:-1;;2611:2:1::1;2596:17:::0;::::1;;2588:49;;;::::0;;-1:-1:-1;;;2588:49:1;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;2588:49:1;;;;;;;;;;;;;::::1;;2648:12;2662:11:::0;2688:4:::1;;2677:36;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;;2677:36:1;::::1;::::0;::::1;::::0;-1:-1:-1;2677:36:1::1;::::0;;::::1;;;::::0;-1:-1:-1;2731:17:1::1;2677:36:::0;2731:15:::1;:17::i;:::-;2723:50;;;::::0;;-1:-1:-1;;;2723:50:1;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;2723:50:1;;;;;;;;;;;;;::::1;;2783:32;2810:4;2783:26;:32::i;:::-;-1:-1:-1::0;;;;;2829:19:1;::::1;::::0;2825:167:::1;;2864:39;2888:3:::0;2893:9:::1;:4:::0;2898:2:::1;2893:4:::0;;:9:::1;:::i;:::-;2864:23;:39::i;:::-;2825:167;;;2957:2;2942:17:::0;::::1;2934:47;;;::::0;;-1:-1:-1;;;2934:47:1;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;2934:47:1;;;;;;;;;;;;;::::1;;1840:1:0;;2510:488:1::0;;:::o;4230:138::-;4284:4;4321:25;:23;:25::i;:::-;-1:-1:-1;;;;;4307:48:1;;4356:4;4307:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4307:54:1;;4230:138;-1:-1:-1;;4230:138:1:o;1707:51::-;;;;;;;;;;;;;;-1:-1:-1;;;1707:51:1;;;;:::o;757:190:2:-;886:20;932:8;;;757:190::o;3892:196:1:-;1749:66:4;4041:31:1;4027:55::o;3004:540::-;3132:36;:23;-1:-1:-1;;;;;3132:34:1;;:36::i;:::-;3124:67;;;;;-1:-1:-1;;;3124:67:1;;;;;;;;;;;;-1:-1:-1;;;3124:67:1;;;;;;;;;;;;;;;3272:12;3286:23;3313;-1:-1:-1;;;;;3313:36:1;3386:24;;;3412:7;;3363:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3363:57:1;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3363:57:1;-1:-1:-1;;;;;;3363:57:1;;;;;;;;;3313:117;;;;3363:57;;3313:117;;-1:-1:-1;3313:117:1;;-1:-1:-1;3363:57:1;-1:-1:-1;3313:117:1;;-1:-1:-1;3313:117:1;;-1:-1:-1;3313:117:1;3363:57;3313:117;;;;;;;;;;-1:-1:-1;;3313:117:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:159;;;;3448:7;3464:10;3440:36;;;;;-1:-1:-1;;;3440:36:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3494:17:1;;:10;;:22;3486:51;;;;-1:-1:-1;;;3486:51:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3004:540;;;;;:::o;5:318:-1:-;;;155:8;143:10;140:24;137:2;;;-1:-1;;167:12;137:2;202:6;192:8;189:20;186:2;;;-1:-1;;212:12;186:2;-1:-1;;244:31;;;293:25;;;;;-1:-1;131:192::o

Swarm Source

ipfs://f61891aaa78840b44149d473b452429158106ae9db3e8ed9085b738637412605

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.