Contract 0x797887e464e49e6b376fe15da9fddf15a770cd6b 1

Contract Overview

Balance:
0 MATIC
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xf0da70aa8982c42fecd0fd4ecba95846fef2313316136df9be88569f0e848457Set Fx Root Tunn...196931192021-10-03 2:05:04539 days 10 hrs ago0xc102f76973f4890cab1b5d1ed26f3623381983af IN  0x797887e464e49e6b376fe15da9fddf15a770cd6b0 MATIC0.0008687730
0x33a3175bb378337e905382c3a47b1587a122333c48d753e14b7bcf56bbcc80efSet Fx Root Tunn...196908302021-10-03 0:46:26539 days 12 hrs ago0xc102f76973f4890cab1b5d1ed26f3623381983af IN  0x797887e464e49e6b376fe15da9fddf15a770cd6b0 MATIC0.0013817730
0x29db6f197715bddd7ae765053cd3bf5dfde6875f91c3cbbe12ad3440838b1d2a0x60806040196907092021-10-03 0:42:16539 days 12 hrs ago0xc102f76973f4890cab1b5d1ed26f3623381983af IN  Create: PolygonOwnershipCache0 MATIC0.0146349930
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PolygonOwnershipCache

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 4 : PolygonOwnershipCache.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import {FxBaseChildTunnel} from "../Libraries/tunnel/FxBaseChildTunnel.sol";

contract PolygonOwnershipCache is FxBaseChildTunnel {
    mapping(address => mapping(uint256 => address)) internal layerOneOwnership;

    constructor(address _fxChild) FxBaseChildTunnel(_fxChild) {} // solhint-disable-line no-empty-blocks

    function _processMessageFromRoot(
        uint256 stateId,
        address sender,
        bytes memory data
    ) internal override validateSender(sender) {
        (address contractAddress, uint256 tokenId, address layerOneOwner) = abi.decode(
            data,
            (address, uint256, address)
        );

        layerOneOwnership[contractAddress][tokenId] = layerOneOwner;
    }

    function getOwner(address contractAddress, uint256 tokenId) public view returns (address owner) {
        return layerOneOwnership[contractAddress][tokenId];
    }

    function isOwner(
        address contractAddress,
        uint256 tokenId,
        address actingAddress
    ) public view returns (bool) {
        return getOwner(contractAddress, tokenId) == actingAddress;
    }
}

File 2 of 4 : FxBaseChildTunnel.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";

// IFxMessageProcessor represents interface to process message
interface IFxMessageProcessor {
    function processMessageFromRoot(
        uint256 stateId,
        address rootMessageSender,
        bytes calldata data
    ) external;
}

/**
 * @notice Mock child tunnel contract to receive and send message from L2
 */
abstract contract FxBaseChildTunnel is IFxMessageProcessor, Ownable {
    // MessageTunnel on L1 will get data from this event
    event MessageSent(bytes message);

    // fx child
    address public fxChild;

    // fx root tunnel
    address public fxRootTunnel;

    constructor(address _fxChild) {
        fxChild = _fxChild;
    }

    // Sender must be fxRootTunnel in case of ERC20 tunnel
    modifier validateSender(address sender) {
        require(sender == fxRootTunnel, "FxBaseChildTunnel: INVALID_SENDER_FROM_ROOT");
        _;
    }

    // set fxRootTunnel if not set already
    function setFxRootTunnel(address _fxRootTunnel) public onlyOwner {
        fxRootTunnel = _fxRootTunnel;
    }

    function processMessageFromRoot(
        uint256 stateId,
        address rootMessageSender,
        bytes memory data
    ) public override {
        require(_msgSender() == fxChild, "FxBaseChildTunnel: INVALID_SENDER");
        _processMessageFromRoot(stateId, rootMessageSender, data);
    }

    /**
     * @notice Emit message that can be received on Root Tunnel
     * @dev Call the internal function when need to emit message
     * @param message bytes message that will be sent to Root Tunnel
     * some message examples -
     *   abi.encode(tokenId);
     *   abi.encode(tokenId, tokenMetadata);
     *   abi.encode(messageType, messageData);
     */
    function _sendMessageToRoot(bytes memory message) internal {
        emit MessageSent(message);
    }

    /**
     * @notice Process message received from Root Tunnel
     * @dev function needs to be implemented to handle message as per requirement
     * This is called by onStateReceive function.
     * Since it is called via a system call, any event will not be emitted during its execution.
     * @param stateId unique state id
     * @param sender root message sender
     * @param message bytes message that was sent from Root Tunnel
     */
    function _processMessageFromRoot(
        uint256 stateId,
        address sender,
        bytes memory message
    ) internal virtual;
}

File 3 of 4 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 4 of 4 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_fxChild","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"}],"name":"MessageSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"fxChild","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fxRootTunnel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwner","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"actingAddress","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"stateId","type":"uint256"},{"internalType":"address","name":"rootMessageSender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"processMessageFromRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fxRootTunnel","type":"address"}],"name":"setFxRootTunnel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b506040516107cb3803806107cb83398101604081905261002f91610096565b600080546001600160a01b031916339081178255604051839282917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b0319166001600160a01b0392909216919091179055506100c4565b6000602082840312156100a7578081fd5b81516001600160a01b03811681146100bd578182fd5b9392505050565b6106f8806100d36000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80637f1e9cb0116100665780637f1e9cb01461012b578063888370941461013e5780638da5cb5b146101515780639a7c4b7114610162578063f2fde38b1461017557610093565b80632f634a9014610098578063450d11f0146100eb578063514c78c1146100fe578063715018a614610121575b600080fd5b6100ce6100a6366004610536565b6001600160a01b03918216600090815260036020908152604080832093835292905220541690565b6040516001600160a01b0390911681526020015b60405180910390f35b6001546100ce906001600160a01b031681565b61011161010c366004610561565b610188565b60405190151581526020016100e2565b6101296101d3565b005b6002546100ce906001600160a01b031681565b61012961014c3660046104d1565b610250565b6000546001600160a01b03166100ce565b610129610170366004610597565b61029c565b6101296101833660046104d1565b610319565b6000816001600160a01b03166101c185856001600160a01b03918216600090815260036020908152604080832093835292905220541690565b6001600160a01b031614949350505050565b6000546001600160a01b031633146102065760405162461bcd60e51b81526004016101fd9061065f565b60405180910390fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461027a5760405162461bcd60e51b81526004016101fd9061065f565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316336001600160a01b0316146103095760405162461bcd60e51b815260206004820152602160248201527f4678426173654368696c6454756e6e656c3a20494e56414c49445f53454e44456044820152602960f91b60648201526084016101fd565b610314838383610403565b505050565b6000546001600160a01b031633146103435760405162461bcd60e51b81526004016101fd9061065f565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101fd565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60025482906001600160a01b038083169116146104765760405162461bcd60e51b815260206004820152602b60248201527f4678426173654368696c6454756e6e656c3a20494e56414c49445f53454e444560448201526a1497d19493d357d493d3d560aa1b60648201526084016101fd565b60008060008480602001905181019061048f91906104f4565b6001600160a01b0392831660009081526003602090815260408083209483529390529190912080546001600160a01b0319169190921617905550505050505050565b6000602082840312156104e2578081fd5b81356104ed816106aa565b9392505050565b600080600060608486031215610508578182fd5b8351610513816106aa565b60208501516040860151919450925061052b816106aa565b809150509250925092565b60008060408385031215610548578182fd5b8235610553816106aa565b946020939093013593505050565b600080600060608486031215610575578283fd5b8335610580816106aa565b925060208401359150604084013561052b816106aa565b6000806000606084860312156105ab578283fd5b8335925060208401356105bd816106aa565b9150604084013567ffffffffffffffff808211156105d9578283fd5b818601915086601f8301126105ec578283fd5b8135818111156105fe576105fe610694565b604051601f8201601f19908116603f0116810190838211818310171561062657610626610694565b8160405282815289602084870101111561063e578586fd5b82602086016020830137856020848301015280955050505050509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146106bf57600080fd5b5056fea26469706673582212208bf7c434e8316b20a341536bf2bf5a477fceac42d249ab18390831dd5b61fbff64736f6c63430008020033000000000000000000000000cf73231f28b7331bbe3124b907840a94851f9f11

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000cf73231f28b7331bbe3124b907840a94851f9f11

-----Decoded View---------------
Arg [0] : _fxChild (address): 0xcf73231f28b7331bbe3124b907840a94851f9f11

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000cf73231f28b7331bbe3124b907840a94851f9f11


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading