ETH Price: $2,340.31 (-0.72%)

Contract

0xFED599513aB078Edea7Cf46574154f92b0B9FCAB
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x61012060160913032022-12-01 16:59:23651 days ago1669913963IN
 Create: AdvancedStakeRewardAdviserAndMsgSender
0 ETH0.0057334813.91005672

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AdvancedStakeRewardAdviserAndMsgSender

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 800 runs

Other Settings:
default evmVersion, BSL 1.1 license
File 1 of 9 : AdvancedStakeRewardAdviserAndMsgSender.sol
// SPDX-License-Identifier: BUSL-1.1
// SPDX-FileCopyrightText: Copyright 2021-22 Panther Ventures Limited Gibraltar
pragma solidity 0.8.16;

import "./actions/AdvancedStakingBridgedDataCoder.sol";
import "./actions/Constants.sol";
import "./interfaces/IActionMsgReceiver.sol";
import "./interfaces/IFxStateSender.sol";
import "./StakeZeroRewardAdviser.sol";

/***
 * @title AdvancedStakeRewardAdviserAndMsgSender
 * @notice The "zero reward adviser" for the `RewardMaster` that sends `STAKE` action messages over
 * the PoS bridge to the STAKE_MSG_RECEIVER.
 * @dev It is assumed to run on the mainnet/Goerli and be authorized with the `RewardMaster` on the
 * same network as the "Reward Adviser" for "advanced" stakes.
 * As the "Reward Adviser" it gets called `getRewardAdvice` by the `RewardMaster` every time a user
 * creates or withdraws an "advanced" stake. It returns the "zero" advices, i.e. the `Advice` data
 * structure with zero `sharesToCreate` and `sharesToRedeem`.
 * On "zero" advices, the RewardMaster skips creating/redeeming "treasure shares" for/to stakers.
 * If the `getRewardAdvice` is called w/ the action STAKE (i.e. a new stake is being created), this
 * contract sends the STAKE message over the "Fx-Portal" (the PoS bridge run by the Polygon team)
 * to the STAKE_MSG_RECEIVER on the Polygon/Mumbai. The STAKE_MSG_RECEIVER is supposed to be the
 * `AdvancedStakeActionMsgRelayer` contract that processes the bridged messages, rewarding stakers
 * on the Polygon/Mumbai.
 */
contract AdvancedStakeRewardAdviserAndMsgSender is
    StakeZeroRewardAdviser,
    AdvancedStakingBridgedDataCoder
{
    event StakeMsgBridged(uint256 _nonce, bytes data);

    // solhint-disable var-name-mixedcase

    /// @notice Address of the `FxRoot` contract on the mainnet/Goerli network
    /// @dev `FxRoot` is the contract of the "Fx-Portal" on the mainnet/Goerli.
    address public immutable FX_ROOT;

    /// @notice Address of the RewardMaster contract on the mainnet/Goerli
    address public immutable REWARD_MASTER;

    /// @notice Address on the AdvancedStakeActionMsgRelayer on the Polygon/Mumbai
    address public immutable ACTION_MSG_RECEIVER;

    // solhint-enable var-name-mixedcase

    /// @notice Message nonce (i.e. sequential number of the latest message)
    uint256 public nonce;

    /// @param _rewardMaster Address of the RewardMaster contract on the mainnet/Goerli
    /// @param _actionMsgReceiver Address of the AdvancedStakeActionMsgRelayer on Polygon/Mumbai
    /// @param _fxRoot Address of the `FxRoot` (PoS Bridge) contract on mainnet/Goerli
    constructor(
        // slither-disable-next-line similar-names
        address _rewardMaster,
        address _actionMsgReceiver,
        address _fxRoot
    ) StakeZeroRewardAdviser(ADVANCED_STAKE, ADVANCED_UNSTAKE) {
        require(
            _fxRoot != address(0) &&
                _actionMsgReceiver != address(0) &&
                _rewardMaster != address(0),
            "AMS:E01"
        );

        FX_ROOT = _fxRoot;
        REWARD_MASTER = _rewardMaster;
        ACTION_MSG_RECEIVER = _actionMsgReceiver;
    }

    // It is called withing the `function getRewardAdvice`
    function _onRequest(bytes4 action, bytes memory message) internal override {
        // Ignore other messages except the STAKE
        if (action != STAKE) return;

        // Overflow ignored as the nonce is unexpected ever be that big
        uint24 _nonce = uint24(nonce + 1);
        nonce = uint256(_nonce);

        bytes memory content = _encodeBridgedData(_nonce, action, message);
        // known contract call - no need in reentrancy guard
        // slither-disable-next-line reentrancy-benign,reentrancy-events
        IFxStateSender(FX_ROOT).sendMessageToChild(
            ACTION_MSG_RECEIVER,
            content
        );

        emit StakeMsgBridged(_nonce, content);
    }
}

File 2 of 9 : StakeZeroRewardAdviser.sol
// SPDX-License-Identifier: BUSL-1.1
// SPDX-FileCopyrightText: Copyright 2021-22 Panther Ventures Limited Gibraltar
pragma solidity ^0.8.16;

import "./actions/StakingMsgProcessor.sol";
import "./interfaces/IRewardAdviser.sol";

/**
 * @title StakeZeroRewardAdviser
 * @notice The "reward adviser" for the `RewardMaster` that returns the "zero reward advice" only.
 * @dev The "zero" reward advice is the `Advice` with zero `sharesToCreate` and `sharesToRedeem`.
 * On "zero" advices, the RewardMaster skips creating/redeeming "treasure shares" for/to stakers.
 */
abstract contract StakeZeroRewardAdviser is
    StakingMsgProcessor,
    IRewardAdviser
{
    // solhint-disable var-name-mixedcase

    // `stakeAction` for the STAKE
    bytes4 internal immutable STAKE;

    // `stakeAction` for the UNSTAKE
    bytes4 internal immutable UNSTAKE;

    // solhint-enable var-name-mixedcase

    /// @param stakeAction The STAKE action type (see StakingMsgProcessor::_encodeStakeActionType)
    /// @param unstakeAction The UNSTAKE action type (see StakingMsgProcessor::_encodeUNstakeActionType)
    constructor(bytes4 stakeAction, bytes4 unstakeAction) {
        require(
            stakeAction != bytes4(0) && unstakeAction != bytes4(0),
            "ZRA:E1"
        );
        STAKE = stakeAction;
        UNSTAKE = unstakeAction;
    }

    /// @dev It is assumed to be called by the RewardMaster contract.
    /// It returns the "zero" reward advises, no matter who calls it.
    function getRewardAdvice(bytes4 action, bytes memory message)
        external
        override
        returns (Advice memory)
    {
        require(
            action == STAKE || action == UNSTAKE,
            "ZRA: unsupported action"
        );

        _onRequest(action, message);

        // Return the "zero" advice
        return
            Advice(
                address(0), // createSharesFor
                0, // sharesToCreate
                address(0), // redeemSharesFrom
                0, // sharesToRedeem
                address(0) // sendRewardTo
            );
    }

    // solhint-disable no-empty-blocks
    // slither-disable-next-line dead-code
    function _onRequest(bytes4 action, bytes memory message) internal virtual {
        // Child contracts may re-define it
    }
    // solhint-enable no-empty-blocks
}

File 3 of 9 : AdvancedStakingBridgedDataCoder.sol
// SPDX-License-Identifier: BUSL-1.1
// SPDX-FileCopyrightText: Copyright 2021-22 Panther Ventures Limited Gibraltar
pragma solidity ^0.8.16;

/***
 * @title AdvancedStakingBridgedDataDecoder
 * @dev It encode (pack) and decodes (unpack) messages for bridging them between networks
 */
abstract contract AdvancedStakingBridgedDataCoder {
    function _encodeBridgedData(
        uint24 _nonce,
        bytes4 action,
        bytes memory message
    ) internal pure returns (bytes memory content) {
        content = abi.encodePacked(_nonce, action, message);
    }

    // For efficiency we use "packed" (rather than "ABI") encoding.
    // It results in shorter data, but requires custom unpack function.
    function _decodeBridgedData(bytes memory content)
        internal
        pure
        returns (
            uint256 _nonce,
            bytes4 action,
            bytes memory message
        )
    {
        require(content.length >= 7, "ABD:WRONG_LENGTH");

        _nonce =
            (uint256(uint8(content[0])) << 16) |
            (uint256(uint8(content[1])) << 8) |
            uint256(uint8(content[2]));

        action = bytes4(
            uint32(
                (uint256(uint8(content[3])) << 24) |
                    (uint256(uint8(content[4])) << 16) |
                    (uint256(uint8(content[5])) << 8) |
                    uint256(uint8(content[6]))
            )
        );

        uint256 curPos = 7;
        uint256 msgLength = content.length - curPos;
        message = new bytes(msgLength);
        if (msgLength > 0) {
            uint256 i = 0;
            while (i < msgLength) {
                message[i++] = content[curPos++];
            }
        }
    }
}

File 4 of 9 : Constants.sol
// SPDX-License-Identifier: BUSL-1.1
// SPDX-FileCopyrightText: Copyright 2021-22 Panther Ventures Limited Gibraltar
// slither-disable-next-line solc-version
pragma solidity ^0.8.4;

// solhint-disable var-name-mixedcase

// The "stake type" for the "classic staking"
// bytes4(keccak256("classic"))
bytes4 constant CLASSIC_STAKE_TYPE = 0x4ab0941a;

// STAKE "action type" for the "classic staking"
// bytes4(keccak256(abi.encodePacked(bytes4(keccak256("stake"), CLASSIC_STAKE_TYPE)))
bytes4 constant CLASSIC_STAKE = 0x1e4d02b5;

// UNSTAKE "action type" for the "classic staking"
// bytes4(keccak256(abi.encodePacked(bytes4(keccak256("unstake"), CLASSIC_STAKE_TYPE)))
bytes4 constant CLASSIC_UNSTAKE = 0x493bdf45;

// The "stake type" for the "advance staking"
// bytes4(keccak256("advanced"))
bytes4 constant ADVANCED_STAKE_TYPE = 0x7ec13a06;

// STAKE "action type" for the "advanced staking"
// bytes4(keccak256(abi.encodePacked(bytes4(keccak256("stake"), ADVANCED_STAKE_TYPE)))
bytes4 constant ADVANCED_STAKE = 0xcc995ce8;

// UNSTAKE "action type" for the "advanced staking"
// bytes4(keccak256(abi.encodePacked(bytes4(keccak256("unstake"), ADVANCED_STAKE_TYPE)))
bytes4 constant ADVANCED_UNSTAKE = 0xb8372e55;

// PRP grant type for the "advanced" stake
// bytes4(keccak256("forAdvancedStakeGrant"))
bytes4 constant FOR_ADVANCED_STAKE_GRANT = 0x31a180d4;

// solhint-enable var-name-mixedcase

File 5 of 9 : StakingMsgProcessor.sol
// SPDX-License-Identifier: BUSL-1.1
// SPDX-FileCopyrightText: Copyright 2021-22 Panther Ventures Limited Gibraltar
// slither-disable-next-line solc-version
pragma solidity ^0.8.4;

import "../interfaces/IStakingTypes.sol";

abstract contract StakingMsgProcessor {
    bytes4 internal constant STAKE_ACTION = bytes4(keccak256("stake"));
    bytes4 internal constant UNSTAKE_ACTION = bytes4(keccak256("unstake"));

    function _encodeStakeActionType(bytes4 stakeType)
        internal
        pure
        returns (bytes4)
    {
        return bytes4(keccak256(abi.encodePacked(STAKE_ACTION, stakeType)));
    }

    function _encodeUnstakeActionType(bytes4 stakeType)
        internal
        pure
        returns (bytes4)
    {
        return bytes4(keccak256(abi.encodePacked(UNSTAKE_ACTION, stakeType)));
    }

    function _packStakingActionMsg(
        address staker,
        IStakingTypes.Stake memory stake,
        bytes calldata data
    ) internal pure returns (bytes memory) {
        return
            abi.encodePacked(
                staker, // address
                stake.amount, // uint96
                stake.id, // uint32
                stake.stakedAt, // uint32
                stake.lockedTill, // uint32
                stake.claimedAt, // uint32
                data // bytes
            );
    }

    // For efficiency we use "packed" (rather than "ABI") encoding.
    // It results in shorter data, but requires custom unpack function.
    function _unpackStakingActionMsg(bytes memory message)
        internal
        pure
        returns (
            address staker,
            uint96 amount,
            uint32 id,
            uint32 stakedAt,
            uint32 lockedTill,
            uint32 claimedAt,
            bytes memory data
        )
    {
        // staker, amount, id and 3 timestamps occupy exactly 48 bytes
        // (`data` may be of zero length)
        require(message.length >= 48, "SMP: unexpected msg length");

        uint256 stakerAndAmount;
        uint256 idAndStamps;
        // solhint-disable no-inline-assembly
        // slither-disable-next-line assembly
        assembly {
            // the 1st word (32 bytes) contains the `message.length`
            // we need the (entire) 2nd word ..
            stakerAndAmount := mload(add(message, 0x20))
            // .. and (16 bytes of) the 3rd word
            idAndStamps := mload(add(message, 0x40))
        }
        // solhint-enable no-inline-assembly

        staker = address(uint160(stakerAndAmount >> 96));
        amount = uint96(stakerAndAmount & 0xFFFFFFFFFFFFFFFFFFFFFFFF);

        id = uint32((idAndStamps >> 224) & 0xFFFFFFFF);
        stakedAt = uint32((idAndStamps >> 192) & 0xFFFFFFFF);
        lockedTill = uint32((idAndStamps >> 160) & 0xFFFFFFFF);
        claimedAt = uint32((idAndStamps >> 128) & 0xFFFFFFFF);

        uint256 dataLength = message.length - 48;
        data = new bytes(dataLength);
        for (uint256 i = 0; i < dataLength; i++) {
            data[i] = message[i + 48];
        }
    }
}

File 6 of 9 : IActionMsgReceiver.sol
// SPDX-License-Identifier: MIT
// slither-disable-next-line solc-version
pragma solidity ^0.8.4;

interface IActionMsgReceiver {
    function onAction(bytes4 action, bytes memory message) external;
}

File 7 of 9 : IFxStateSender.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;

/***
 * @dev An interface of the `FxRoot` contract
 * `FxRoot` is the contract of the "Fx-Portal" (a PoS bridge run by the Polygon team) on the
 * mainnet/Goerli network. It passes data to s user-defined contract on the Polygon/Mumbai.
 * See https://docs.polygon.technology/docs/develop/l1-l2-communication/fx-portal
 */
interface IFxStateSender {
    function sendMessageToChild(address _receiver, bytes calldata _data)
        external;
}

File 8 of 9 : IRewardAdviser.sol
// SPDX-License-Identifier: MIT
// slither-disable-next-line solc-version
pragma solidity ^0.8.4;

interface IRewardAdviser {
    struct Advice {
        // advice on new "shares" (in the reward pool) to create
        address createSharesFor;
        uint96 sharesToCreate;
        // advice on "shares" to redeem
        address redeemSharesFrom;
        uint96 sharesToRedeem;
        // advice on address the reward against redeemed shares to send to
        address sendRewardTo;
    }

    function getRewardAdvice(bytes4 action, bytes memory message)
        external
        returns (Advice memory);
}

File 9 of 9 : IStakingTypes.sol
// SPDX-License-Identifier: MIT
// slither-disable-next-line solc-version
pragma solidity ^0.8.4;

interface IStakingTypes {
    // Stake type terms
    struct Terms {
        // if stakes of this kind allowed
        bool isEnabled;
        // if messages on stakes to be sent to the {RewardMaster}
        bool isRewarded;
        // limit on the minimum amount staked, no limit if zero
        uint32 minAmountScaled;
        // limit on the maximum amount staked, no limit if zero
        uint32 maxAmountScaled;
        // Stakes not accepted before this time, has no effect if zero
        uint32 allowedSince;
        // Stakes not accepted after this time, has no effect if zero
        uint32 allowedTill;
        // One (at least) of the following three params must be non-zero
        // if non-zero, overrides both `exactLockPeriod` and `minLockPeriod`
        uint32 lockedTill;
        // ignored if non-zero `lockedTill` defined, overrides `minLockPeriod`
        uint32 exactLockPeriod;
        // has effect only if both `lockedTill` and `exactLockPeriod` are zero
        uint32 minLockPeriod;
    }

    struct Stake {
        // index in the `Stake[]` array of `stakes`
        uint32 id;
        // defines Terms
        bytes4 stakeType;
        // time this stake was created at
        uint32 stakedAt;
        // time this stake can be claimed at
        uint32 lockedTill;
        // time this stake was claimed at (unclaimed if 0)
        uint32 claimedAt;
        // amount of tokens on this stake (assumed to be less 1e27)
        uint96 amount;
        // address stake voting power is delegated to
        address delegatee;
    }
}

Settings
{
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "none",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 800
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_rewardMaster","type":"address"},{"internalType":"address","name":"_actionMsgReceiver","type":"address"},{"internalType":"address","name":"_fxRoot","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_nonce","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"StakeMsgBridged","type":"event"},{"inputs":[],"name":"ACTION_MSG_RECEIVER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FX_ROOT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_MASTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"action","type":"bytes4"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"getRewardAdvice","outputs":[{"components":[{"internalType":"address","name":"createSharesFor","type":"address"},{"internalType":"uint96","name":"sharesToCreate","type":"uint96"},{"internalType":"address","name":"redeemSharesFrom","type":"address"},{"internalType":"uint96","name":"sharesToRedeem","type":"uint96"},{"internalType":"address","name":"sendRewardTo","type":"address"}],"internalType":"struct IRewardAdviser.Advice","name":"","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

61012060405234801561001157600080fd5b5060405161080b38038061080b83398101604081905261003091610105565b6319932b9d60e31b63b8372e5560e01b61004e565b60405180910390fd5b6001600160e01b03199182166080521660a0526001600160a01b0381161580159061008157506001600160a01b03821615155b801561009557506001600160a01b03831615155b6100cb5760405162461bcd60e51b8152602060048201526007602482015266414d533a45303160c81b6044820152606401610045565b6001600160a01b0390811660c05291821660e0521661010052610148565b80516001600160a01b038116811461010057600080fd5b919050565b60008060006060848603121561011a57600080fd5b610123846100e9565b9250610131602085016100e9565b915061013f604085016100e9565b90509250925092565b60805160a05160c05160e0516101005161066d61019e6000396000818160b501526103680152600060dc0152600081816071015261033b015260006101f70152600081816101ba01526102bc015261066d6000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c8063576eadd211610050578063576eadd2146100d7578063affed0e0146100fe578063e9cb03241461011557600080fd5b806329c9e0581461006c578063479169c4146100b0575b600080fd5b6100937f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6100937f000000000000000000000000000000000000000000000000000000000000000081565b6100937f000000000000000000000000000000000000000000000000000000000000000081565b61010760005481565b6040519081526020016100a7565b610128610123366004610448565b61018d565b6040516100a79190600060a0820190506001600160a01b0380845116835260208401516bffffffffffffffffffffffff808216602086015282604087015116604086015280606087015116606086015250508060808501511660808401525092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160e01b031916836001600160e01b031916148061022d57507f00000000000000000000000000000000000000000000000000000000000000006001600160e01b031916836001600160e01b031916145b61027d5760405162461bcd60e51b815260206004820152601760248201527f5a52413a20756e737570706f7274656420616374696f6e000000000000000000604482015260640160405180910390fd5b61028783836102ba565b506040805160a0810182526000808252602082018190529181018290526060810182905260808101919091525b92915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160e01b031916826001600160e01b031916146102f9575050565b60008054610308906001610531565b62ffffff81166000908155909150610321828585610403565b60405163b472047760e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b472047790610392907f00000000000000000000000000000000000000000000000000000000000000009085906004016105a2565b600060405180830381600087803b1580156103ac57600080fd5b505af11580156103c0573d6000803e3d6000fd5b505050507f572041cd38e1e969e2595e37f964dff9c8ff6352e81996136313b838c3873d3a82826040516103f59291906105cc565b60405180910390a150505050565b606083838360405160200161041a939291906105ea565b60405160208183030381529060405290509392505050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561045b57600080fd5b82357fffffffff000000000000000000000000000000000000000000000000000000008116811461048b57600080fd5b9150602083013567ffffffffffffffff808211156104a857600080fd5b818501915085601f8301126104bc57600080fd5b8135818111156104ce576104ce610432565b604051601f8201601f19908116603f011681019083821181831017156104f6576104f6610432565b8160405282815288602084870101111561050f57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b808201808211156102b457634e487b7160e01b600052601160045260246000fd5b60005b8381101561056d578181015183820152602001610555565b50506000910152565b6000815180845261058e816020860160208601610552565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082015260006105c46040830184610576565b949350505050565b62ffffff831681526040602082015260006105c46040830184610576565b60e884901b7fffffff00000000000000000000000000000000000000000000000000000000001681527fffffffff00000000000000000000000000000000000000000000000000000000831660038201528151600090610651816007850160208701610552565b9190910160070194935050505056fea164736f6c6343000810000a000000000000000000000000347a58878d04951588741d4d16d54b742c7f60fc00000000000000000000000047374fbe2289c0442f33a388590385a0b32a20ff000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a2

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100675760003560e01c8063576eadd211610050578063576eadd2146100d7578063affed0e0146100fe578063e9cb03241461011557600080fd5b806329c9e0581461006c578063479169c4146100b0575b600080fd5b6100937f000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a281565b6040516001600160a01b0390911681526020015b60405180910390f35b6100937f00000000000000000000000047374fbe2289c0442f33a388590385a0b32a20ff81565b6100937f000000000000000000000000347a58878d04951588741d4d16d54b742c7f60fc81565b61010760005481565b6040519081526020016100a7565b610128610123366004610448565b61018d565b6040516100a79190600060a0820190506001600160a01b0380845116835260208401516bffffffffffffffffffffffff808216602086015282604087015116604086015280606087015116606086015250508060808501511660808401525092915050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091527fcc995ce8000000000000000000000000000000000000000000000000000000006001600160e01b031916836001600160e01b031916148061022d57507fb8372e55000000000000000000000000000000000000000000000000000000006001600160e01b031916836001600160e01b031916145b61027d5760405162461bcd60e51b815260206004820152601760248201527f5a52413a20756e737570706f7274656420616374696f6e000000000000000000604482015260640160405180910390fd5b61028783836102ba565b506040805160a0810182526000808252602082018190529181018290526060810182905260808101919091525b92915050565b7fcc995ce8000000000000000000000000000000000000000000000000000000006001600160e01b031916826001600160e01b031916146102f9575050565b60008054610308906001610531565b62ffffff81166000908155909150610321828585610403565b60405163b472047760e01b81529091506001600160a01b037f000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a2169063b472047790610392907f00000000000000000000000047374fbe2289c0442f33a388590385a0b32a20ff9085906004016105a2565b600060405180830381600087803b1580156103ac57600080fd5b505af11580156103c0573d6000803e3d6000fd5b505050507f572041cd38e1e969e2595e37f964dff9c8ff6352e81996136313b838c3873d3a82826040516103f59291906105cc565b60405180910390a150505050565b606083838360405160200161041a939291906105ea565b60405160208183030381529060405290509392505050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561045b57600080fd5b82357fffffffff000000000000000000000000000000000000000000000000000000008116811461048b57600080fd5b9150602083013567ffffffffffffffff808211156104a857600080fd5b818501915085601f8301126104bc57600080fd5b8135818111156104ce576104ce610432565b604051601f8201601f19908116603f011681019083821181831017156104f6576104f6610432565b8160405282815288602084870101111561050f57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b808201808211156102b457634e487b7160e01b600052601160045260246000fd5b60005b8381101561056d578181015183820152602001610555565b50506000910152565b6000815180845261058e816020860160208601610552565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082015260006105c46040830184610576565b949350505050565b62ffffff831681526040602082015260006105c46040830184610576565b60e884901b7fffffff00000000000000000000000000000000000000000000000000000000001681527fffffffff00000000000000000000000000000000000000000000000000000000831660038201528151600090610651816007850160208701610552565b9190910160070194935050505056fea164736f6c6343000810000a

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

000000000000000000000000347a58878d04951588741d4d16d54b742c7f60fc00000000000000000000000047374fbe2289c0442f33a388590385a0b32a20ff000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a2

-----Decoded View---------------
Arg [0] : _rewardMaster (address): 0x347a58878D04951588741d4d16d54B742c7f60fC
Arg [1] : _actionMsgReceiver (address): 0x47374FBE2289c0442f33a388590385A0b32a20Ff
Arg [2] : _fxRoot (address): 0xfe5e5D361b2ad62c541bAb87C45a0B9B018389a2

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000347a58878d04951588741d4d16d54b742c7f60fc
Arg [1] : 00000000000000000000000047374fbe2289c0442f33a388590385a0b32a20ff
Arg [2] : 000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a2


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

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.