ETH Price: $3,185.28 (+4.67%)

Contract

0xFE413cF641478C0AC9FE4b6DD93776e0342621d6
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Redeem Reward198554712024-05-12 17:37:11246 days ago1715535431IN
0xFE413cF6...0342621d6
0 ETH0.00165454
Redeem Reward194587952024-03-18 2:44:59302 days ago1710729899IN
0xFE413cF6...0342621d6
0 ETH0.0061868721.09640388
Redeem Reward191722582024-02-06 22:48:11342 days ago1707259691IN
0xFE413cF6...0342621d6
0 ETH0.0024891823.08858348
Redeem Reward173414502023-05-26 6:19:23599 days ago1685081963IN
0xFE413cF6...0342621d6
0 ETH0.0056975425.9122023
Redeem Reward173262262023-05-24 2:56:47601 days ago1684897007IN
0xFE413cF6...0342621d6
0 ETH0.0060208129.6944607
Redeem Reward173231892023-05-23 16:43:11601 days ago1684860191IN
0xFE413cF6...0342621d6
0 ETH0.0119459763.65010526
Redeem Reward169057592023-03-25 16:47:23660 days ago1679762843IN
0xFE413cF6...0342621d6
0 ETH0.0061481527.71011979
Redeem Reward168973212023-03-24 12:20:23662 days ago1679660423IN
0xFE413cF6...0342621d6
0 ETH0.0079829238.97796619
Redeem Reward168962222023-03-24 8:38:23662 days ago1679647103IN
0xFE413cF6...0342621d6
0 ETH0.0033576316.39421226
Redeem Reward168861102023-03-22 22:29:59663 days ago1679524199IN
0xFE413cF6...0342621d6
0 ETH0.0033770616.49069504
Redeem Reward166692802023-02-20 10:52:23694 days ago1676890343IN
0xFE413cF6...0342621d6
0 ETH0.0041347920.19121624
Redeem Reward166369592023-02-15 21:56:11698 days ago1676498171IN
0xFE413cF6...0342621d6
0 ETH0.0170480883.23527242
Redeem Reward164782622023-01-24 17:48:11720 days ago1674582491IN
0xFE413cF6...0342621d6
0 ETH0.004336319.54295872
Redeem Reward163398692023-01-05 10:03:11740 days ago1672912991IN
0xFE413cF6...0342621d6
0 ETH0.002444113.02232233
Redeem Reward162709412022-12-26 19:13:11749 days ago1672081991IN
0xFE413cF6...0342621d6
0 ETH0.003731118.22060178
Redeem Reward160026062022-11-19 7:35:47787 days ago1668843347IN
0xFE413cF6...0342621d6
0 ETH0.0021723510.60691324
Redeem Reward159832382022-11-16 14:39:47789 days ago1668609587IN
0xFE413cF6...0342621d6
0 ETH0.0033222616.22150428
Redeem Reward159606272022-11-13 10:52:47793 days ago1668336767IN
0xFE413cF6...0342621d6
0 ETH0.0021048210.27939349
Redeem Reward159488572022-11-11 19:27:35794 days ago1668194855IN
0xFE413cF6...0342621d6
0 ETH0.0034083316.64175751
Redeem Reward157916862022-10-20 20:25:35816 days ago1666297535IN
0xFE413cF6...0342621d6
0 ETH0.0056714827.69633155
Redeem Reward156646562022-10-03 2:30:35834 days ago1664764235IN
0xFE413cF6...0342621d6
0 ETH0.00158418.34999471
Redeem Reward155175922022-09-11 23:24:12855 days ago1662938652IN
0xFE413cF6...0342621d6
0 ETH0.001471035.90615653
Redeem Reward155175922022-09-11 23:24:12855 days ago1662938652IN
0xFE413cF6...0342621d6
0 ETH0.001374275.32607268
Redeem Reward155111312022-09-10 21:45:38856 days ago1662846338IN
0xFE413cF6...0342621d6
0 ETH0.0051568218.06711245
Redeem Reward152560022022-08-01 10:04:37897 days ago1659348277IN
0xFE413cF6...0342621d6
0 ETH0.001721376.90915894
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SGN

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-10-27
*/

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
    * @dev Multiplies two unsigned integers, reverts on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
    * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
    * @dev Adds two unsigned integers, reverts on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
    * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
    * reverts when dividing by zero.
    */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

// File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.5.0;

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(address from, address to, uint256 value) external returns (bool);

    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol

pragma solidity ^0.5.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        require(token.transfer(to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        require(token.transferFrom(from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require((value == 0) || (token.allowance(address(this), spender) == 0));
        require(token.approve(spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        require(token.approve(spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value);
        require(token.approve(spender, newAllowance));
    }
}

// File: openzeppelin-solidity/contracts/access/Roles.sol

pragma solidity ^0.5.0;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev give an account access to this role
     */
    function add(Role storage role, address account) internal {
        require(account != address(0));
        require(!has(role, account));

        role.bearer[account] = true;
    }

    /**
     * @dev remove an account's access to this role
     */
    function remove(Role storage role, address account) internal {
        require(account != address(0));
        require(has(role, account));

        role.bearer[account] = false;
    }

    /**
     * @dev check if an account has this role
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0));
        return role.bearer[account];
    }
}

// File: openzeppelin-solidity/contracts/access/roles/PauserRole.sol

pragma solidity ^0.5.0;


contract PauserRole {
    using Roles for Roles.Role;

    event PauserAdded(address indexed account);
    event PauserRemoved(address indexed account);

    Roles.Role private _pausers;

    constructor () internal {
        _addPauser(msg.sender);
    }

    modifier onlyPauser() {
        require(isPauser(msg.sender));
        _;
    }

    function isPauser(address account) public view returns (bool) {
        return _pausers.has(account);
    }

    function addPauser(address account) public onlyPauser {
        _addPauser(account);
    }

    function renouncePauser() public {
        _removePauser(msg.sender);
    }

    function _addPauser(address account) internal {
        _pausers.add(account);
        emit PauserAdded(account);
    }

    function _removePauser(address account) internal {
        _pausers.remove(account);
        emit PauserRemoved(account);
    }
}

// File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol

pragma solidity ^0.5.0;


/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is PauserRole {
    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;

    constructor () internal {
        _paused = false;
    }

    /**
     * @return true if the contract is paused, false otherwise.
     */
    function paused() public view returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     */
    modifier whenNotPaused() {
        require(!_paused);
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     */
    modifier whenPaused() {
        require(_paused);
        _;
    }

    /**
     * @dev called by the owner to pause, triggers stopped state
     */
    function pause() public onlyPauser whenNotPaused {
        _paused = true;
        emit Paused(msg.sender);
    }

    /**
     * @dev called by the owner to unpause, returns to normal state
     */
    function unpause() public onlyPauser whenPaused {
        _paused = false;
        emit Unpaused(msg.sender);
    }
}

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

pragma solidity ^0.5.0;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address private _owner;

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner());
        _;
    }

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     * @notice Renouncing to ownership will leave the contract without an owner.
     * It will not be possible to call the functions with the `onlyOwner`
     * modifier anymore.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/lib/interface/ISGN.sol

pragma solidity 0.5.17;

/**
 * @title SGN interface
 */
interface ISGN {
    // functions
    function updateSidechainAddr(bytes calldata _sidechainAddr) external;

    function subscribe(uint _amount) external;

    function redeemReward(bytes calldata _rewardRequest) external;

    // events
    event UpdateSidechainAddr(address indexed candidate, bytes indexed oldSidechainAddr, bytes indexed newSidechainAddr);

    event AddSubscriptionBalance(address indexed consumer, uint amount);

    event RedeemReward(address indexed receiver, uint cumulativeMiningReward, uint serviceReward, uint servicePool);
}

// File: contracts/lib/interface/IDPoS.sol

pragma solidity 0.5.17;

/**
 * @title DPoS interface
 */
interface IDPoS {
    enum ValidatorChangeType { Add, Removal }

    // functions
    function contributeToMiningPool(uint _amount) external;

    function redeemMiningReward(address _receiver, uint _cumulativeReward) external;

    function registerSidechain(address _addr) external;

    function initializeCandidate(uint _minSelfStake, uint _commissionRate, uint _rateLockEndTime) external;

    function announceIncreaseCommissionRate(uint _newRate, uint _newLockEndTime) external;

    function confirmIncreaseCommissionRate() external;

    function nonIncreaseCommissionRate(uint _newRate, uint _newLockEndTime) external;

    function updateMinSelfStake(uint256 _minSelfStake) external;

    function delegate(address _candidateAddr, uint _amount) external;

    function withdrawFromUnbondedCandidate(address _candidateAddr, uint _amount) external;

    function intendWithdraw(address _candidateAddr, uint _amount) external;

    function confirmWithdraw(address _candidateAddr) external;

    function claimValidator() external;

    function confirmUnbondedCandidate(address _candidateAddr) external;

    function slash(bytes calldata _penaltyRequest) external;

    function validateMultiSigMessage(bytes calldata _request) external returns(bool);

    function isValidDPoS() external view returns (bool);

    function isValidator(address _addr) external view returns (bool);

    function getValidatorNum() external view returns (uint);

    function getMinStakingPool() external view returns (uint);

    function getCandidateInfo(address _candidateAddr) external view returns (bool, uint, uint, uint, uint, uint, uint);

    function getDelegatorInfo(address _candidateAddr, address _delegatorAddr) external view returns (uint, uint, uint[] memory, uint[] memory);

    function getMinQuorumStakingPool() external view returns(uint);

    function getTotalValidatorStakingPool() external view returns(uint);

    // TODO: interface can't be inherited, so VoteType is not declared here
    // function voteParam(uint _proposalId, VoteType _vote) external;

    // function confirmParamProposal(uint _proposalId) external;

    // function voteSidechain(uint _proposalId, VoteType _vote) external;

    // function confirmSidechainProposal(uint _proposalId) external;

    // events
    event InitializeCandidate(address indexed candidate, uint minSelfStake, uint commissionRate, uint rateLockEndTime);

    event CommissionRateAnnouncement(address indexed candidate, uint announcedRate, uint announcedLockEndTime);

    event UpdateCommissionRate(address indexed candidate, uint newRate, uint newLockEndTime);

    event UpdateMinSelfStake(address indexed candidate, uint minSelfStake);

    event Delegate(address indexed delegator, address indexed candidate, uint newStake, uint stakingPool);

    event ValidatorChange(address indexed ethAddr, ValidatorChangeType indexed changeType);

    event WithdrawFromUnbondedCandidate(address indexed delegator, address indexed candidate, uint amount);

    event IntendWithdraw(address indexed delegator, address indexed candidate, uint withdrawAmount, uint proposedTime);

    event ConfirmWithdraw(address indexed delegator, address indexed candidate, uint amount);

    event Slash(address indexed validator, address indexed delegator, uint amount);

    event UpdateDelegatedStake(address indexed delegator, address indexed candidate, uint delegatorStake, uint candidatePool);

    event Compensate(address indexed indemnitee, uint amount);

    event CandidateUnbonded(address indexed candidate);

    event RedeemMiningReward(address indexed receiver, uint reward, uint miningPool);

    event MiningPoolContribution(address indexed contributor, uint contribution, uint miningPoolSize);
}

// File: contracts/lib/data/Pb.sol

pragma solidity 0.5.17;

// runtime proto sol library
library Pb {
    enum WireType { Varint, Fixed64, LengthDelim, StartGroup, EndGroup, Fixed32 }

    struct Buffer {
        uint idx;  // the start index of next read. when idx=b.length, we're done
        bytes b;   // hold serialized proto msg, readonly
    }

    // create a new in-memory Buffer object from raw msg bytes
    function fromBytes(bytes memory raw) internal pure returns (Buffer memory buf) {
        buf.b = raw;
        buf.idx = 0;
    }

    // whether there are unread bytes
    function hasMore(Buffer memory buf) internal pure returns (bool) {
        return buf.idx < buf.b.length;
    }

    // decode current field number and wiretype
    function decKey(Buffer memory buf) internal pure returns (uint tag, WireType wiretype) {
        uint v = decVarint(buf);
        tag = v / 8;
        wiretype = WireType(v & 7);
    }

    // count tag occurrences, return an array due to no memory map support
	// have to create array for (maxtag+1) size. cnts[tag] = occurrences
	// should keep buf.idx unchanged because this is only a count function
    function cntTags(Buffer memory buf, uint maxtag) internal pure returns (uint[] memory cnts) {
        uint originalIdx = buf.idx;
        cnts = new uint[](maxtag+1);  // protobuf's tags are from 1 rather than 0
        uint tag;
        WireType wire;
        while (hasMore(buf)) {
            (tag, wire) = decKey(buf);
            cnts[tag] += 1;
            skipValue(buf, wire);
        }
        buf.idx = originalIdx;
    }

    // read varint from current buf idx, move buf.idx to next read, return the int value
    function decVarint(Buffer memory buf) internal pure returns (uint v) {
        bytes10 tmp;  // proto int is at most 10 bytes (7 bits can be used per byte)
        bytes memory bb = buf.b;  // get buf.b mem addr to use in assembly
        v = buf.idx;  // use v to save one additional uint variable
        assembly {
            tmp := mload(add(add(bb, 32), v)) // load 10 bytes from buf.b[buf.idx] to tmp
        }
        uint b; // store current byte content
        v = 0; // reset to 0 for return value
        for (uint i=0; i<10; i++) {
            assembly {
                b := byte(i, tmp)  // don't use tmp[i] because it does bound check and costs extra
            }
            v |= (b & 0x7F) << (i * 7);
            if (b & 0x80 == 0) {
                buf.idx += i + 1;
                return v;
            }
        }
        revert(); // i=10, invalid varint stream
    }

    // read length delimited field and return bytes
    function decBytes(Buffer memory buf) internal pure returns (bytes memory b) {
        uint len = decVarint(buf);
        uint end = buf.idx + len;
        require(end <= buf.b.length);  // avoid overflow
        b = new bytes(len);
        bytes memory bufB = buf.b;  // get buf.b mem addr to use in assembly
        uint bStart;
        uint bufBStart = buf.idx;
        assembly {
            bStart := add(b, 32)
            bufBStart := add(add(bufB, 32), bufBStart)
        }
        for (uint i=0; i<len; i+=32) {
            assembly{
                mstore(add(bStart, i), mload(add(bufBStart, i)))
            }
        }
        buf.idx = end;
    }

    // return packed ints
    function decPacked(Buffer memory buf) internal pure returns (uint[] memory t) {
        uint len = decVarint(buf);
        uint end = buf.idx + len;
        require(end <= buf.b.length);  // avoid overflow
        // array in memory must be init w/ known length
        // so we have to create a tmp array w/ max possible len first
        uint[] memory tmp = new uint[](len);
        uint i; // count how many ints are there
        while (buf.idx < end) {
            tmp[i] = decVarint(buf);
            i++;
        }
        t = new uint[](i); // init t with correct length
        for (uint j=0; j<i; j++) {
            t[j] = tmp[j];
        }
        return t;
    }

    // move idx pass current value field, to beginning of next tag or msg end
    function skipValue(Buffer memory buf, WireType wire) internal pure {
        if (wire == WireType.Varint) { decVarint(buf); }
        else if (wire == WireType.LengthDelim) {
            uint len = decVarint(buf);
            buf.idx += len; // skip len bytes value data
            require(buf.idx <= buf.b.length);  // avoid overflow
        } else { revert(); }  // unsupported wiretype
    }

    // type conversion help utils
    function _bool(uint x) internal pure returns (bool v) {
        return x != 0;
    }

    function _uint256(bytes memory b) internal pure returns (uint256 v) {
        require(b.length <= 32);  // b's length must be smaller than or equal to 32
        assembly { v := mload(add(b, 32)) }  // load all 32bytes to v
        v = v >> (8 * (32 - b.length));  // only first b.length is valid
    }

    function _address(bytes memory b) internal pure returns (address v) {
        v = _addressPayable(b);
    }

    function _addressPayable(bytes memory b) internal pure returns (address payable v) {
        require(b.length == 20);
        //load 32bytes then shift right 12 bytes
        assembly { v := div(mload(add(b, 32)), 0x1000000000000000000000000) }
    }

    function _bytes32(bytes memory b) internal pure returns (bytes32 v) {
        require(b.length == 32);
        assembly { v := mload(add(b, 32)) }
    }

    // uint[] to uint8[]
    function uint8s(uint[] memory arr) internal pure returns (uint8[] memory t) {
        t = new uint8[](arr.length);
        for (uint i = 0; i < t.length; i++) { t[i] = uint8(arr[i]); }
    }

    function uint32s(uint[] memory arr) internal pure returns (uint32[] memory t) {
        t = new uint32[](arr.length);
        for (uint i = 0; i < t.length; i++) { t[i] = uint32(arr[i]); }
    }

    function uint64s(uint[] memory arr) internal pure returns (uint64[] memory t) {
        t = new uint64[](arr.length);
        for (uint i = 0; i < t.length; i++) { t[i] = uint64(arr[i]); }
    }

    function bools(uint[] memory arr) internal pure returns (bool[] memory t) {
        t = new bool[](arr.length);
        for (uint i = 0; i < t.length; i++) { t[i] = arr[i]!=0; }
    }
}

// File: contracts/lib/data/PbSgn.sol

// Code generated by protoc-gen-sol. DO NOT EDIT.
// source: sgn.proto
pragma solidity 0.5.17;


library PbSgn {
    using Pb for Pb.Buffer;  // so we can call Pb funcs on Buffer obj

    struct MultiSigMessage {
        bytes msg;   // tag: 1
        bytes[] sigs;   // tag: 2
    } // end struct MultiSigMessage

    function decMultiSigMessage(bytes memory raw) internal pure returns (MultiSigMessage memory m) {
        Pb.Buffer memory buf = Pb.fromBytes(raw);

        uint[] memory cnts = buf.cntTags(2);
        m.sigs = new bytes[](cnts[2]);
        cnts[2] = 0;  // reset counter for later use
        
        uint tag;
        Pb.WireType wire;
        while (buf.hasMore()) {
            (tag, wire) = buf.decKey();
            if (false) {} // solidity has no switch/case
            else if (tag == 1) {
                m.msg = bytes(buf.decBytes());
            }
            else if (tag == 2) {
                m.sigs[cnts[2]] = bytes(buf.decBytes());
                cnts[2]++;
            }
            else { buf.skipValue(wire); } // skip value of unknown tag
        }
    } // end decoder MultiSigMessage

    struct PenaltyRequest {
        bytes penalty;   // tag: 1
        bytes[] sigs;   // tag: 2
    } // end struct PenaltyRequest

    function decPenaltyRequest(bytes memory raw) internal pure returns (PenaltyRequest memory m) {
        Pb.Buffer memory buf = Pb.fromBytes(raw);

        uint[] memory cnts = buf.cntTags(2);
        m.sigs = new bytes[](cnts[2]);
        cnts[2] = 0;  // reset counter for later use
        
        uint tag;
        Pb.WireType wire;
        while (buf.hasMore()) {
            (tag, wire) = buf.decKey();
            if (false) {} // solidity has no switch/case
            else if (tag == 1) {
                m.penalty = bytes(buf.decBytes());
            }
            else if (tag == 2) {
                m.sigs[cnts[2]] = bytes(buf.decBytes());
                cnts[2]++;
            }
            else { buf.skipValue(wire); } // skip value of unknown tag
        }
    } // end decoder PenaltyRequest

    struct RewardRequest {
        bytes reward;   // tag: 1
        bytes[] sigs;   // tag: 2
    } // end struct RewardRequest

    function decRewardRequest(bytes memory raw) internal pure returns (RewardRequest memory m) {
        Pb.Buffer memory buf = Pb.fromBytes(raw);

        uint[] memory cnts = buf.cntTags(2);
        m.sigs = new bytes[](cnts[2]);
        cnts[2] = 0;  // reset counter for later use
        
        uint tag;
        Pb.WireType wire;
        while (buf.hasMore()) {
            (tag, wire) = buf.decKey();
            if (false) {} // solidity has no switch/case
            else if (tag == 1) {
                m.reward = bytes(buf.decBytes());
            }
            else if (tag == 2) {
                m.sigs[cnts[2]] = bytes(buf.decBytes());
                cnts[2]++;
            }
            else { buf.skipValue(wire); } // skip value of unknown tag
        }
    } // end decoder RewardRequest

    struct Penalty {
        uint64 nonce;   // tag: 1
        uint64 expireTime;   // tag: 2
        address validatorAddress;   // tag: 3
        AccountAmtPair[] penalizedDelegators;   // tag: 4
        AccountAmtPair[] beneficiaries;   // tag: 5
    } // end struct Penalty

    function decPenalty(bytes memory raw) internal pure returns (Penalty memory m) {
        Pb.Buffer memory buf = Pb.fromBytes(raw);

        uint[] memory cnts = buf.cntTags(5);
        m.penalizedDelegators = new AccountAmtPair[](cnts[4]);
        cnts[4] = 0;  // reset counter for later use
        m.beneficiaries = new AccountAmtPair[](cnts[5]);
        cnts[5] = 0;  // reset counter for later use
        
        uint tag;
        Pb.WireType wire;
        while (buf.hasMore()) {
            (tag, wire) = buf.decKey();
            if (false) {} // solidity has no switch/case
            else if (tag == 1) {
                m.nonce = uint64(buf.decVarint());
            }
            else if (tag == 2) {
                m.expireTime = uint64(buf.decVarint());
            }
            else if (tag == 3) {
                m.validatorAddress = Pb._address(buf.decBytes());
            }
            else if (tag == 4) {
                m.penalizedDelegators[cnts[4]] = decAccountAmtPair(buf.decBytes());
                cnts[4]++;
            }
            else if (tag == 5) {
                m.beneficiaries[cnts[5]] = decAccountAmtPair(buf.decBytes());
                cnts[5]++;
            }
            else { buf.skipValue(wire); } // skip value of unknown tag
        }
    } // end decoder Penalty

    struct AccountAmtPair {
        address account;   // tag: 1
        uint256 amt;   // tag: 2
    } // end struct AccountAmtPair

    function decAccountAmtPair(bytes memory raw) internal pure returns (AccountAmtPair memory m) {
        Pb.Buffer memory buf = Pb.fromBytes(raw);

        uint tag;
        Pb.WireType wire;
        while (buf.hasMore()) {
            (tag, wire) = buf.decKey();
            if (false) {} // solidity has no switch/case
            else if (tag == 1) {
                m.account = Pb._address(buf.decBytes());
            }
            else if (tag == 2) {
                m.amt = Pb._uint256(buf.decBytes());
            }
            else { buf.skipValue(wire); } // skip value of unknown tag
        }
    } // end decoder AccountAmtPair

    struct Reward {
        address receiver;   // tag: 1
        uint256 cumulativeMiningReward;   // tag: 2
        uint256 cumulativeServiceReward;   // tag: 3
    } // end struct Reward

    function decReward(bytes memory raw) internal pure returns (Reward memory m) {
        Pb.Buffer memory buf = Pb.fromBytes(raw);

        uint tag;
        Pb.WireType wire;
        while (buf.hasMore()) {
            (tag, wire) = buf.decKey();
            if (false) {} // solidity has no switch/case
            else if (tag == 1) {
                m.receiver = Pb._address(buf.decBytes());
            }
            else if (tag == 2) {
                m.cumulativeMiningReward = Pb._uint256(buf.decBytes());
            }
            else if (tag == 3) {
                m.cumulativeServiceReward = Pb._uint256(buf.decBytes());
            }
            else { buf.skipValue(wire); } // skip value of unknown tag
        }
    } // end decoder Reward

}

// File: contracts/lib/DPoSCommon.sol

pragma solidity 0.5.17;

/**
 * @title DPoS contract common Library
 * @notice Common items used in DPoS contract
 */
library DPoSCommon {
    // Unbonded: not a validator and not responsible for previous validator behaviors if any.
    //   Delegators now are free to withdraw stakes (directly).
    // Bonded: active validator. Delegators have to wait for slashTimeout to withdraw stakes.
    // Unbonding: transitional status from Bonded to Unbonded. Candidate has lost the right of
    //   validator but is still responsible for any misbehaviour done during being validator.
    //   Delegators should wait until candidate's unbondTime to freely withdraw stakes.
    enum CandidateStatus { Unbonded, Bonded, Unbonding }
}

// File: contracts/SGN.sol

pragma solidity 0.5.17;










/**
 * @title Sidechain contract of State Guardian Network
 * @notice This contract implements the mainchain logic of Celer State Guardian Network sidechain
 * @dev specs: https://www.celer.network/docs/celercore/sgn/sidechain.html#mainchain-contracts
 */
contract SGN is ISGN, Ownable, Pausable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    IERC20 public celerToken;
    IDPoS public dPoSContract;
    mapping(address => uint256) public subscriptionDeposits;
    uint256 public servicePool;
    mapping(address => uint256) public redeemedServiceReward;
    mapping(address => bytes) public sidechainAddrMap;

    /**
     * @notice Throws if SGN sidechain is not valid
     * @dev Check this before sidechain's operations
     */
    modifier onlyValidSidechain() {
        require(dPoSContract.isValidDPoS(), 'DPoS is not valid');
        _;
    }

    /**
     * @notice SGN constructor
     * @dev Need to deploy DPoS contract first before deploying SGN contract
     * @param _celerTokenAddress address of Celer Token Contract
     * @param _DPoSAddress address of DPoS Contract
     */
    constructor(address _celerTokenAddress, address _DPoSAddress) public {
        celerToken = IERC20(_celerTokenAddress);
        dPoSContract = IDPoS(_DPoSAddress);
    }

    /**
     * @notice Owner drains one type of tokens when the contract is paused
     * @dev This is for emergency situations.
     * @param _amount drained token amount
     */
    function drainToken(uint256 _amount) external whenPaused onlyOwner {
        celerToken.safeTransfer(msg.sender, _amount);
    }

    /**
     * @notice Update sidechain address
     * @dev Note that the "sidechain address" here means the address in the offchain sidechain system,
         which is different from the sidechain contract address
     * @param _sidechainAddr the new address in the offchain sidechain system
     */
    function updateSidechainAddr(bytes calldata _sidechainAddr) external {
        address msgSender = msg.sender;

        (bool initialized, , , uint256 status, , , ) = dPoSContract.getCandidateInfo(msgSender);
        require(
            status == uint256(DPoSCommon.CandidateStatus.Unbonded),
            'msg.sender is not unbonded'
        );
        require(initialized, 'Candidate is not initialized');

        bytes memory oldSidechainAddr = sidechainAddrMap[msgSender];
        sidechainAddrMap[msgSender] = _sidechainAddr;

        emit UpdateSidechainAddr(msgSender, oldSidechainAddr, _sidechainAddr);
    }

    /**
     * @notice Subscribe the guardian service
     * @param _amount subscription fee paid along this function call in CELR tokens
     */
    function subscribe(uint256 _amount) external whenNotPaused onlyValidSidechain {
        address msgSender = msg.sender;

        servicePool = servicePool.add(_amount);
        subscriptionDeposits[msgSender] = subscriptionDeposits[msgSender].add(_amount);

        celerToken.safeTransferFrom(msgSender, address(this), _amount);

        emit AddSubscriptionBalance(msgSender, _amount);
    }

    /**
     * @notice Redeem rewards
     * @dev The rewards include both the service reward and mining reward
     * @dev SGN contract acts as an interface for users to redeem mining rewards
     * @param _rewardRequest reward request bytes coded in protobuf
     */
    function redeemReward(bytes calldata _rewardRequest) external whenNotPaused onlyValidSidechain {
        require(
            dPoSContract.validateMultiSigMessage(_rewardRequest),
            'Validator sigs verification failed'
        );

        PbSgn.RewardRequest memory rewardRequest = PbSgn.decRewardRequest(_rewardRequest);
        PbSgn.Reward memory reward = PbSgn.decReward(rewardRequest.reward);
        uint256 newServiceReward = reward.cumulativeServiceReward.sub(
            redeemedServiceReward[reward.receiver]
        );

        require(servicePool >= newServiceReward, 'Service pool is smaller than new service reward');
        redeemedServiceReward[reward.receiver] = reward.cumulativeServiceReward;
        servicePool = servicePool.sub(newServiceReward);

        dPoSContract.redeemMiningReward(reward.receiver, reward.cumulativeMiningReward);
        celerToken.safeTransfer(reward.receiver, newServiceReward);

        emit RedeemReward(
            reward.receiver,
            reward.cumulativeMiningReward,
            newServiceReward,
            servicePool
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_celerTokenAddress","type":"address"},{"internalType":"address","name":"_DPoSAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"consumer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AddSubscriptionBalance","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"cumulativeMiningReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"serviceReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"servicePool","type":"uint256"}],"name":"RedeemReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"candidate","type":"address"},{"indexed":true,"internalType":"bytes","name":"oldSidechainAddr","type":"bytes"},{"indexed":true,"internalType":"bytes","name":"newSidechainAddr","type":"bytes"}],"name":"UpdateSidechainAddr","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"celerToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dPoSContract","outputs":[{"internalType":"contract IDPoS","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"drainToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_rewardRequest","type":"bytes"}],"name":"redeemReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"redeemedServiceReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"servicePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sidechainAddrMap","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"subscribe","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"subscriptionDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_sidechainAddr","type":"bytes"}],"name":"updateSidechainAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620019da380380620019da833981810160405260408110156200003757600080fd5b508051602090910151600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36200009d336001600160e01b03620000d816565b600280546001600160a81b0319166101006001600160a01b0394851602179055600380546001600160a01b03191691909216179055620001b9565b620000f38160016200012a60201b620015cf1790919060201c565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6001600160a01b0381166200013e57600080fd5b6200015382826001600160e01b036200018316565b156200015e57600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b0382166200019957600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b61181180620001c96000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c806382dc1ec4116100ad578063c6c21e9d11610071578063c6c21e9d146102f7578063e02f39bd146102ff578063e27b41101461036f578063e42a06c81461040a578063f2fde38b146104125761012c565b806382dc1ec4146102935780638456cb59146102b95780638da5cb5b146102c15780638f32d59b146102c9578063c57f6661146102d15761012c565b806346fbf68e116100f457806346fbf68e146101d15780635c975abb1461020b5780636ef8d66d14610213578063715018a61461021b57806373a6e450146102235761012c565b80630f574ba714610131578063145aa116146101505780631e77733a1461016d578063291a3eb2146101a55780633f4ba83a146101c9575b600080fd5b61014e6004803603602081101561014757600080fd5b5035610438565b005b61014e6004803603602081101561016657600080fd5b50356105c4565b6101936004803603602081101561018357600080fd5b50356001600160a01b0316610603565b60408051918252519081900360200190f35b6101ad610615565b604080516001600160a01b039092168252519081900360200190f35b61014e610624565b6101f7600480360360208110156101e757600080fd5b50356001600160a01b0316610684565b604080519115158252519081900360200190f35b6101f761069f565b61014e6106a9565b61014e6106b4565b61014e6004803603602081101561023957600080fd5b81019060208101813564010000000081111561025457600080fd5b82018360208201111561026657600080fd5b8035906020019184600183028401116401000000008311171561028857600080fd5b50909250905061070f565b61014e600480360360208110156102a957600080fd5b50356001600160a01b0316610ab1565b61014e610acc565b6101ad610b30565b6101f7610b3f565b610193600480360360208110156102e757600080fd5b50356001600160a01b0316610b50565b6101ad610b62565b61014e6004803603602081101561031557600080fd5b81019060208101813564010000000081111561033057600080fd5b82018360208201111561034257600080fd5b8035906020019184600183028401116401000000008311171561036457600080fd5b509092509050610b76565b6103956004803603602081101561038557600080fd5b50356001600160a01b0316610e23565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103cf5781810151838201526020016103b7565b50505050905090810190601f1680156103fc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610193610ebe565b61014e6004803603602081101561042857600080fd5b50356001600160a01b0316610ec4565b60025460ff161561044857600080fd5b600360009054906101000a90046001600160a01b03166001600160a01b031663eab2ed8c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561049657600080fd5b505afa1580156104aa573d6000803e3d6000fd5b505050506040513d60208110156104c057600080fd5b5051610507576040805162461bcd60e51b815260206004820152601160248201527011141bd4c81a5cc81b9bdd081d985b1a59607a1b604482015290519081900360640190fd5b600554339061051c908363ffffffff610ede16565b6005556001600160a01b038116600090815260046020526040902054610548908363ffffffff610ede16565b6001600160a01b03808316600090815260046020526040902091909155600254610581916101009091041682308563ffffffff610ef716565b6040805183815290516001600160a01b038316917fac095ced75d400384d8404a37883183a56b937b8ff8195fa0c52c3ccc8bb8a49919081900360200190a25050565b60025460ff166105d357600080fd5b6105db610b3f565b6105e457600080fd5b6002546106009061010090046001600160a01b03163383610f8d565b50565b60046020526000908152604090205481565b6003546001600160a01b031681565b61062d33610684565b61063657600080fd5b60025460ff1661064557600080fd5b6002805460ff191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b600061069760018363ffffffff61102716565b90505b919050565b60025460ff165b90565b6106b23361105c565b565b6106bc610b3f565b6106c557600080fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60025460ff161561071f57600080fd5b600360009054906101000a90046001600160a01b03166001600160a01b031663eab2ed8c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561076d57600080fd5b505afa158015610781573d6000803e3d6000fd5b505050506040513d602081101561079757600080fd5b50516107de576040805162461bcd60e51b815260206004820152601160248201527011141bd4c81a5cc81b9bdd081d985b1a59607a1b604482015290519081900360640190fd5b600354604051631c0efd9d60e01b8152602060048201908152602482018490526001600160a01b0390921691631c0efd9d91859185918190604401848480828437600081840152601f19601f8201169050808301925050509350505050602060405180830381600087803b15801561085557600080fd5b505af1158015610869573d6000803e3d6000fd5b505050506040513d602081101561087f57600080fd5b50516108bc5760405162461bcd60e51b815260040180806020018281038252602281526020018061178c6022913960400191505060405180910390fd5b6108c4611695565b61090383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110a492505050565b905061090d6116af565b8151610918906111fb565b80516001600160a01b03166000908152600660205260408082205490830151929350909161094b9163ffffffff6112c016565b905080600554101561098e5760405162461bcd60e51b815260040180806020018281038252602f8152602001806117ae602f913960400191505060405180910390fd5b60408083015183516001600160a01b03166000908152600660205291909120556005546109c1908263ffffffff6112c016565b6005556003548251602084015160408051630fbd844360e11b81526001600160a01b0393841660048201526024810192909252519190921691631f7b088691604480830192600092919082900301818387803b158015610a2057600080fd5b505af1158015610a34573d6000803e3d6000fd5b50508351600254610a56935061010090046001600160a01b0316915083610f8d565b8151602080840151600554604080519283529282018590528183015290516001600160a01b03909216917f09251621f2e88c5e7f8df91fe1d9e9a70610e20e122945470fddd48af05104269181900360600190a25050505050565b610aba33610684565b610ac357600080fd5b610600816112d5565b610ad533610684565b610ade57600080fd5b60025460ff1615610aee57600080fd5b6002805460ff191660011790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60066020526000908152604090205481565b60025461010090046001600160a01b031681565b600354604080516328bde1e160e01b815233600482018190529151919260009283926001600160a01b03909216916328bde1e19160248083019260e0929190829003018186803b158015610bc957600080fd5b505afa158015610bdd573d6000803e3d6000fd5b505050506040513d60e0811015610bf357600080fd5b50805160609091015190925090508015610c54576040805162461bcd60e51b815260206004820152601a60248201527f6d73672e73656e646572206973206e6f7420756e626f6e646564000000000000604482015290519081900360640190fd5b81610ca6576040805162461bcd60e51b815260206004820152601c60248201527f43616e646964617465206973206e6f7420696e697469616c697a656400000000604482015290519081900360640190fd5b6001600160a01b03831660009081526007602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610d455780601f10610d1a57610100808354040283529160200191610d45565b820191906000526020600020905b815481529060010190602001808311610d2857829003601f168201915b505050506001600160a01b0386166000908152600760205260409020919250610d7191905087876116d9565b5085856040518083838082843760405192018290038220865190955086945091925082916020850191508083835b60208310610dbe5780518252601f199092019160209182019101610d9f565b5181516020939093036101000a6000190180199091169216919091179052604051920182900382209350506001600160a01b03881691507f16de3299ab034ce7e21b22d55f4f9a1474bd3c4d20dbd1cc9bcd39c1ad3d5a2c90600090a4505050505050565b60076020908152600091825260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610eb65780601f10610e8b57610100808354040283529160200191610eb6565b820191906000526020600020905b815481529060010190602001808311610e9957829003601f168201915b505050505081565b60055481565b610ecc610b3f565b610ed557600080fd5b6106008161131d565b600082820183811015610ef057600080fd5b9392505050565b604080516323b872dd60e01b81526001600160a01b0385811660048301528481166024830152604482018490529151918616916323b872dd916064808201926020929091908290030181600087803b158015610f5257600080fd5b505af1158015610f66573d6000803e3d6000fd5b505050506040513d6020811015610f7c57600080fd5b5051610f8757600080fd5b50505050565b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610fed57600080fd5b505af1158015611001573d6000803e3d6000fd5b505050506040513d602081101561101757600080fd5b505161102257600080fd5b505050565b60006001600160a01b03821661103c57600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b61106d60018263ffffffff61138b16565b6040516001600160a01b038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b6110ac611695565b6110b4611757565b6110bd836113d3565b905060606110d282600263ffffffff6113ea16565b9050806002815181106110e157fe5b602002602001015160405190808252806020026020018201604052801561111c57816020015b60608152602001906001900390816111075790505b50836020018190525060008160028151811061113457fe5b6020026020010181815250506000805b61114d8461147a565b156111f25761115b84611486565b9092509050816001141561117957611172846114b3565b85526111ed565b81600214156111dd5761118b846114b3565b85602001518460028151811061119d57fe5b6020026020010151815181106111af57fe5b6020026020010181905250826002815181106111c757fe5b60209081029190910101805160010190526111ed565b6111ed848263ffffffff61154016565b611144565b50505050919050565b6112036116af565b61120b611757565b611214836113d3565b90506000805b6112238361147a565b156112b85761123183611486565b909250905081600114156112605761125061124b846114b3565b6115a1565b6001600160a01b031684526112b3565b81600214156112845761127a611275846114b3565b6115ac565b60208501526112b3565b81600314156112a357611299611275846114b3565b60408501526112b3565b6112b3838263ffffffff61154016565b61121a565b505050919050565b6000828211156112cf57600080fd5b50900390565b6112e660018263ffffffff6115cf16565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6001600160a01b03811661133057600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811661139e57600080fd5b6113a88282611027565b6113b157600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6113db611757565b60208101919091526000815290565b81516040805160018401808252602080820283010190925260609291801561141c578160200160208202803883390190505b5091506000805b61142c8661147a565b156114715761143a86611486565b8092508193505050600184838151811061145057fe5b60200260200101818151019150818152505061146c8682611540565b611423565b50509092525090565b60208101515190511090565b60008060006114948461161b565b90506008810492508060071660058111156114ab57fe5b915050915091565b606060006114c08361161b565b83516020850151519192508201908111156114da57600080fd5b816040519080825280601f01601f191660200182016040528015611505576020820181803883390190505b50602080860151865192955091818601919083010160005b8581101561153557818101518382015260200161151d565b505050935250919050565b600081600581111561154e57fe5b14156115635761155d8261161b565b5061159d565b600281600581111561157157fe5b141561012c5760006115828361161b565b83518101808552602085015151919250111561155d57600080fd5b5050565b600061069782611676565b60006020825111156115bd57600080fd5b50602081810151915160089103021c90565b6001600160a01b0381166115e257600080fd5b6115ec8282611027565b156115f657600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b602080820151825181019091015160009182805b600a8110156116705783811a91508060070282607f16901b8517945081608016600014156116685785510160010185525061069a915050565b60010161162f565b50600080fd5b6000815160141461168657600080fd5b5060200151600160601b900490565b604051806040016040528060608152602001606081525090565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061171a5782800160ff19823516178555611747565b82800160010185558215611747579182015b8281111561174757823582559160200191906001019061172c565b50611753929150611771565b5090565b604051806040016040528060008152602001606081525090565b6106a691905b80821115611753576000815560010161177756fe56616c696461746f72207369677320766572696669636174696f6e206661696c65645365727669636520706f6f6c20697320736d616c6c6572207468616e206e6577207365727669636520726577617264a265627a7a723158200ef48f0fa8c2c39f174999979f900f8eed58c0a95e79562343d0db5c5f94678a64736f6c634300051100320000000000000000000000004f9254c83eb525f9fcf346490bbb3ed28a81c6670000000000000000000000005216db4d4cb22d1ba38866867c38d8e862974e82

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061012c5760003560e01c806382dc1ec4116100ad578063c6c21e9d11610071578063c6c21e9d146102f7578063e02f39bd146102ff578063e27b41101461036f578063e42a06c81461040a578063f2fde38b146104125761012c565b806382dc1ec4146102935780638456cb59146102b95780638da5cb5b146102c15780638f32d59b146102c9578063c57f6661146102d15761012c565b806346fbf68e116100f457806346fbf68e146101d15780635c975abb1461020b5780636ef8d66d14610213578063715018a61461021b57806373a6e450146102235761012c565b80630f574ba714610131578063145aa116146101505780631e77733a1461016d578063291a3eb2146101a55780633f4ba83a146101c9575b600080fd5b61014e6004803603602081101561014757600080fd5b5035610438565b005b61014e6004803603602081101561016657600080fd5b50356105c4565b6101936004803603602081101561018357600080fd5b50356001600160a01b0316610603565b60408051918252519081900360200190f35b6101ad610615565b604080516001600160a01b039092168252519081900360200190f35b61014e610624565b6101f7600480360360208110156101e757600080fd5b50356001600160a01b0316610684565b604080519115158252519081900360200190f35b6101f761069f565b61014e6106a9565b61014e6106b4565b61014e6004803603602081101561023957600080fd5b81019060208101813564010000000081111561025457600080fd5b82018360208201111561026657600080fd5b8035906020019184600183028401116401000000008311171561028857600080fd5b50909250905061070f565b61014e600480360360208110156102a957600080fd5b50356001600160a01b0316610ab1565b61014e610acc565b6101ad610b30565b6101f7610b3f565b610193600480360360208110156102e757600080fd5b50356001600160a01b0316610b50565b6101ad610b62565b61014e6004803603602081101561031557600080fd5b81019060208101813564010000000081111561033057600080fd5b82018360208201111561034257600080fd5b8035906020019184600183028401116401000000008311171561036457600080fd5b509092509050610b76565b6103956004803603602081101561038557600080fd5b50356001600160a01b0316610e23565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103cf5781810151838201526020016103b7565b50505050905090810190601f1680156103fc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610193610ebe565b61014e6004803603602081101561042857600080fd5b50356001600160a01b0316610ec4565b60025460ff161561044857600080fd5b600360009054906101000a90046001600160a01b03166001600160a01b031663eab2ed8c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561049657600080fd5b505afa1580156104aa573d6000803e3d6000fd5b505050506040513d60208110156104c057600080fd5b5051610507576040805162461bcd60e51b815260206004820152601160248201527011141bd4c81a5cc81b9bdd081d985b1a59607a1b604482015290519081900360640190fd5b600554339061051c908363ffffffff610ede16565b6005556001600160a01b038116600090815260046020526040902054610548908363ffffffff610ede16565b6001600160a01b03808316600090815260046020526040902091909155600254610581916101009091041682308563ffffffff610ef716565b6040805183815290516001600160a01b038316917fac095ced75d400384d8404a37883183a56b937b8ff8195fa0c52c3ccc8bb8a49919081900360200190a25050565b60025460ff166105d357600080fd5b6105db610b3f565b6105e457600080fd5b6002546106009061010090046001600160a01b03163383610f8d565b50565b60046020526000908152604090205481565b6003546001600160a01b031681565b61062d33610684565b61063657600080fd5b60025460ff1661064557600080fd5b6002805460ff191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b600061069760018363ffffffff61102716565b90505b919050565b60025460ff165b90565b6106b23361105c565b565b6106bc610b3f565b6106c557600080fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60025460ff161561071f57600080fd5b600360009054906101000a90046001600160a01b03166001600160a01b031663eab2ed8c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561076d57600080fd5b505afa158015610781573d6000803e3d6000fd5b505050506040513d602081101561079757600080fd5b50516107de576040805162461bcd60e51b815260206004820152601160248201527011141bd4c81a5cc81b9bdd081d985b1a59607a1b604482015290519081900360640190fd5b600354604051631c0efd9d60e01b8152602060048201908152602482018490526001600160a01b0390921691631c0efd9d91859185918190604401848480828437600081840152601f19601f8201169050808301925050509350505050602060405180830381600087803b15801561085557600080fd5b505af1158015610869573d6000803e3d6000fd5b505050506040513d602081101561087f57600080fd5b50516108bc5760405162461bcd60e51b815260040180806020018281038252602281526020018061178c6022913960400191505060405180910390fd5b6108c4611695565b61090383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110a492505050565b905061090d6116af565b8151610918906111fb565b80516001600160a01b03166000908152600660205260408082205490830151929350909161094b9163ffffffff6112c016565b905080600554101561098e5760405162461bcd60e51b815260040180806020018281038252602f8152602001806117ae602f913960400191505060405180910390fd5b60408083015183516001600160a01b03166000908152600660205291909120556005546109c1908263ffffffff6112c016565b6005556003548251602084015160408051630fbd844360e11b81526001600160a01b0393841660048201526024810192909252519190921691631f7b088691604480830192600092919082900301818387803b158015610a2057600080fd5b505af1158015610a34573d6000803e3d6000fd5b50508351600254610a56935061010090046001600160a01b0316915083610f8d565b8151602080840151600554604080519283529282018590528183015290516001600160a01b03909216917f09251621f2e88c5e7f8df91fe1d9e9a70610e20e122945470fddd48af05104269181900360600190a25050505050565b610aba33610684565b610ac357600080fd5b610600816112d5565b610ad533610684565b610ade57600080fd5b60025460ff1615610aee57600080fd5b6002805460ff191660011790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60066020526000908152604090205481565b60025461010090046001600160a01b031681565b600354604080516328bde1e160e01b815233600482018190529151919260009283926001600160a01b03909216916328bde1e19160248083019260e0929190829003018186803b158015610bc957600080fd5b505afa158015610bdd573d6000803e3d6000fd5b505050506040513d60e0811015610bf357600080fd5b50805160609091015190925090508015610c54576040805162461bcd60e51b815260206004820152601a60248201527f6d73672e73656e646572206973206e6f7420756e626f6e646564000000000000604482015290519081900360640190fd5b81610ca6576040805162461bcd60e51b815260206004820152601c60248201527f43616e646964617465206973206e6f7420696e697469616c697a656400000000604482015290519081900360640190fd5b6001600160a01b03831660009081526007602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610d455780601f10610d1a57610100808354040283529160200191610d45565b820191906000526020600020905b815481529060010190602001808311610d2857829003601f168201915b505050506001600160a01b0386166000908152600760205260409020919250610d7191905087876116d9565b5085856040518083838082843760405192018290038220865190955086945091925082916020850191508083835b60208310610dbe5780518252601f199092019160209182019101610d9f565b5181516020939093036101000a6000190180199091169216919091179052604051920182900382209350506001600160a01b03881691507f16de3299ab034ce7e21b22d55f4f9a1474bd3c4d20dbd1cc9bcd39c1ad3d5a2c90600090a4505050505050565b60076020908152600091825260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610eb65780601f10610e8b57610100808354040283529160200191610eb6565b820191906000526020600020905b815481529060010190602001808311610e9957829003601f168201915b505050505081565b60055481565b610ecc610b3f565b610ed557600080fd5b6106008161131d565b600082820183811015610ef057600080fd5b9392505050565b604080516323b872dd60e01b81526001600160a01b0385811660048301528481166024830152604482018490529151918616916323b872dd916064808201926020929091908290030181600087803b158015610f5257600080fd5b505af1158015610f66573d6000803e3d6000fd5b505050506040513d6020811015610f7c57600080fd5b5051610f8757600080fd5b50505050565b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610fed57600080fd5b505af1158015611001573d6000803e3d6000fd5b505050506040513d602081101561101757600080fd5b505161102257600080fd5b505050565b60006001600160a01b03821661103c57600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b61106d60018263ffffffff61138b16565b6040516001600160a01b038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b6110ac611695565b6110b4611757565b6110bd836113d3565b905060606110d282600263ffffffff6113ea16565b9050806002815181106110e157fe5b602002602001015160405190808252806020026020018201604052801561111c57816020015b60608152602001906001900390816111075790505b50836020018190525060008160028151811061113457fe5b6020026020010181815250506000805b61114d8461147a565b156111f25761115b84611486565b9092509050816001141561117957611172846114b3565b85526111ed565b81600214156111dd5761118b846114b3565b85602001518460028151811061119d57fe5b6020026020010151815181106111af57fe5b6020026020010181905250826002815181106111c757fe5b60209081029190910101805160010190526111ed565b6111ed848263ffffffff61154016565b611144565b50505050919050565b6112036116af565b61120b611757565b611214836113d3565b90506000805b6112238361147a565b156112b85761123183611486565b909250905081600114156112605761125061124b846114b3565b6115a1565b6001600160a01b031684526112b3565b81600214156112845761127a611275846114b3565b6115ac565b60208501526112b3565b81600314156112a357611299611275846114b3565b60408501526112b3565b6112b3838263ffffffff61154016565b61121a565b505050919050565b6000828211156112cf57600080fd5b50900390565b6112e660018263ffffffff6115cf16565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6001600160a01b03811661133057600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811661139e57600080fd5b6113a88282611027565b6113b157600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6113db611757565b60208101919091526000815290565b81516040805160018401808252602080820283010190925260609291801561141c578160200160208202803883390190505b5091506000805b61142c8661147a565b156114715761143a86611486565b8092508193505050600184838151811061145057fe5b60200260200101818151019150818152505061146c8682611540565b611423565b50509092525090565b60208101515190511090565b60008060006114948461161b565b90506008810492508060071660058111156114ab57fe5b915050915091565b606060006114c08361161b565b83516020850151519192508201908111156114da57600080fd5b816040519080825280601f01601f191660200182016040528015611505576020820181803883390190505b50602080860151865192955091818601919083010160005b8581101561153557818101518382015260200161151d565b505050935250919050565b600081600581111561154e57fe5b14156115635761155d8261161b565b5061159d565b600281600581111561157157fe5b141561012c5760006115828361161b565b83518101808552602085015151919250111561155d57600080fd5b5050565b600061069782611676565b60006020825111156115bd57600080fd5b50602081810151915160089103021c90565b6001600160a01b0381166115e257600080fd5b6115ec8282611027565b156115f657600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b602080820151825181019091015160009182805b600a8110156116705783811a91508060070282607f16901b8517945081608016600014156116685785510160010185525061069a915050565b60010161162f565b50600080fd5b6000815160141461168657600080fd5b5060200151600160601b900490565b604051806040016040528060608152602001606081525090565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061171a5782800160ff19823516178555611747565b82800160010185558215611747579182015b8281111561174757823582559160200191906001019061172c565b50611753929150611771565b5090565b604051806040016040528060008152602001606081525090565b6106a691905b80821115611753576000815560010161177756fe56616c696461746f72207369677320766572696669636174696f6e206661696c65645365727669636520706f6f6c20697320736d616c6c6572207468616e206e6577207365727669636520726577617264a265627a7a723158200ef48f0fa8c2c39f174999979f900f8eed58c0a95e79562343d0db5c5f94678a64736f6c63430005110032

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

0000000000000000000000004f9254c83eb525f9fcf346490bbb3ed28a81c6670000000000000000000000005216db4d4cb22d1ba38866867c38d8e862974e82

-----Decoded View---------------
Arg [0] : _celerTokenAddress (address): 0x4F9254C83EB525f9FCf346490bbb3ed28a81C667
Arg [1] : _DPoSAddress (address): 0x5216Db4d4cB22d1BA38866867c38d8E862974E82

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000004f9254c83eb525f9fcf346490bbb3ed28a81c667
Arg [1] : 0000000000000000000000005216db4d4cb22d1ba38866867c38d8e862974e82


Deployed Bytecode Sourcemap

28962:4312:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28962:4312:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31452:402;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31452:402:0;;:::i;:::-;;30218:130;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30218:130:0;;:::i;29140:55::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29140:55:0;-1:-1:-1;;;;;29140:55:0;;:::i;:::-;;;;;;;;;;;;;;;;29108:25;;;:::i;:::-;;;;-1:-1:-1;;;;;29108:25:0;;;;;;;;;;;;;;7832:118;;;:::i;6010:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6010:109:0;-1:-1:-1;;;;;6010:109:0;;:::i;:::-;;;;;;;;;;;;;;;;;;7085:78;;;:::i;6227:77::-;;;:::i;9419:140::-;;;:::i;32137:1134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32137:1134:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;32137:1134:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32137:1134:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;32137:1134:0;;-1:-1:-1;32137:1134:0;-1:-1:-1;32137:1134:0;:::i;6127:92::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6127:92:0;-1:-1:-1;;;;;6127:92:0;;:::i;7621:116::-;;;:::i;8706:79::-;;;:::i;9041:92::-;;;:::i;29235:56::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29235:56:0;-1:-1:-1;;;;;29235:56:0;;:::i;29077:24::-;;;:::i;30663:631::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30663:631:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;30663:631:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30663:631:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;30663:631:0;;-1:-1:-1;30663:631:0;-1:-1:-1;30663:631:0;:::i;29298:49::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29298:49:0;-1:-1:-1;;;;;29298:49:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29298:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29202:26;;;:::i;9736:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9736:109:0;-1:-1:-1;;;;;9736:109:0;;:::i;31452:402::-;7322:7;;;;7321:8;7313:17;;;;;;29530:12;;;;;;;;;-1:-1:-1;;;;;29530:12:0;-1:-1:-1;;;;;29530:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29530:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29530:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29530:26:0;29522:56;;;;;-1:-1:-1;;;29522:56:0;;;;;;;;;;;;-1:-1:-1;;;29522:56:0;;;;;;;;;;;;;;;31598:11;;31561:10;;31598:24;;31614:7;31598:24;:15;:24;:::i;:::-;31584:11;:38;-1:-1:-1;;;;;31667:31:0;;;;;;:20;:31;;;;;;:44;;31703:7;31667:44;:35;:44;:::i;:::-;-1:-1:-1;;;;;31633:31:0;;;;;;;:20;:31;;;;;:78;;;;31724:10;;:62;;:10;;;;;31654:9;31771:4;31778:7;31724:62;:27;:62;:::i;:::-;31804:42;;;;;;;;-1:-1:-1;;;;;31804:42:0;;;;;;;;;;;;;29589:1;31452:402;:::o;30218:130::-;7501:7;;;;7493:16;;;;;;8918:9;:7;:9::i;:::-;8910:18;;;;;;30296:10;;:44;;:10;;;-1:-1:-1;;;;;30296:10:0;30320;30332:7;30296:23;:44::i;:::-;30218:130;:::o;29140:55::-;;;;;;;;;;;;;:::o;29108:25::-;;;-1:-1:-1;;;;;29108:25:0;;:::o;7832:118::-;5961:20;5970:10;5961:8;:20::i;:::-;5953:29;;;;;;7501:7;;;;7493:16;;;;;;7891:7;:15;;-1:-1:-1;;7891:15:0;;;7922:20;;;7931:10;7922:20;;;;;;;;;;;;;7832:118::o;6010:109::-;6066:4;6090:21;:8;6103:7;6090:21;:12;:21;:::i;:::-;6083:28;;6010:109;;;;:::o;7085:78::-;7148:7;;;;7085:78;;:::o;6227:77::-;6271:25;6285:10;6271:13;:25::i;:::-;6227:77::o;9419:140::-;8918:9;:7;:9::i;:::-;8910:18;;;;;;9518:1;9502:6;;9481:40;;-1:-1:-1;;;;;9502:6:0;;;;9481:40;;9518:1;;9481:40;9549:1;9532:19;;-1:-1:-1;;;;;;9532:19:0;;;9419:140::o;32137:1134::-;7322:7;;;;7321:8;7313:17;;;;;;29530:12;;;;;;;;;-1:-1:-1;;;;;29530:12:0;-1:-1:-1;;;;;29530:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29530:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29530:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29530:26:0;29522:56;;;;;-1:-1:-1;;;29522:56:0;;;;;;;;;;;;-1:-1:-1;;;29522:56:0;;;;;;;;;;;;;;;32265:12;;:52;;-1:-1:-1;;;32265:52:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32265:12:0;;;;:36;;32302:14;;;;32265:52;;;;32302:14;;;;32265:52;1:33:-1;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;32265:52:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32265:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32265:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32265:52:0;32243:136;;;;-1:-1:-1;;;32243:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32392:40;;:::i;:::-;32435:38;32458:14;;32435:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;32435:22:0;;-1:-1:-1;;;32435:38:0:i;:::-;32392:81;;32484:26;;:::i;:::-;32529:20;;32513:37;;:15;:37::i;:::-;32659:15;;-1:-1:-1;;;;;32637:38:0;32561:24;32637:38;;;:21;:38;;;;;;;32588:30;;;;32484:66;;-1:-1:-1;32561:24:0;;32588:98;;;:34;:98;:::i;:::-;32561:125;;32722:16;32707:11;;:31;;32699:91;;;;-1:-1:-1;;;32699:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32842:30;;;;;32823:15;;-1:-1:-1;;;;;32801:38:0;;;;;:21;:38;;;;;;:71;32897:11;;:33;;32913:16;32897:33;:15;:33;:::i;:::-;32883:11;:47;32943:12;;32975:15;;32992:29;;;;32943:79;;;-1:-1:-1;;;32943:79:0;;-1:-1:-1;;;;;32943:79:0;;;;;;;;;;;;;;;:12;;;;;:31;;:79;;;;;:12;;:79;;;;;;;:12;;:79;;;5:2:-1;;;;30:1;27;20:12;5:2;32943:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;33057:15:0;;33033:10;;:58;;-1:-1:-1;33033:10:0;;;-1:-1:-1;;;;;33033:10:0;;-1:-1:-1;33074:16:0;33033:23;:58::i;:::-;33136:15;;33166:29;;;;;33241:11;;33109:154;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33109:154:0;;;;;;;;;;;;;29589:1;;;32137:1134;;:::o;6127:92::-;5961:20;5970:10;5961:8;:20::i;:::-;5953:29;;;;;;6192:19;6203:7;6192:10;:19::i;7621:116::-;5961:20;5970:10;5961:8;:20::i;:::-;5953:29;;;;;;7322:7;;;;7321:8;7313:17;;;;;;7681:7;:14;;-1:-1:-1;;7681:14:0;7691:4;7681:14;;;7711:18;;;7718:10;7711:18;;;;;;;;;;;;;7621:116::o;8706:79::-;8744:7;8771:6;-1:-1:-1;;;;;8771:6:0;8706:79;:::o;9041:92::-;9081:4;9119:6;-1:-1:-1;;;;;9119:6:0;9105:10;:20;;9041:92::o;29235:56::-;;;;;;;;;;;;;:::o;29077:24::-;;;;;;-1:-1:-1;;;;;29077:24:0;;:::o;30663:631::-;30833:12;;:40;;;-1:-1:-1;;;30833:40:0;;30763:10;30833:40;;;;;;;;30763:10;;30743:17;;;;-1:-1:-1;;;;;30833:12:0;;;;:29;;:40;;;;;;;;;;;;;;:12;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;30833:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30833:40:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;30833:40:0;;;;;;;;;-1:-1:-1;30833:40:0;-1:-1:-1;30906:54:0;;30884:130;;;;;-1:-1:-1;;;30884:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31033:11;31025:52;;;;;-1:-1:-1;;;31025:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31122:27:0;;;;;;:16;:27;;;;;;;;;31090:59;;;;;;-1:-1:-1;;31090:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;:59;;;31122:27;31090:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;31160:27:0;;;;;;:16;:27;;;;;31090:59;;-1:-1:-1;31160:44:0;;:27;-1:-1:-1;31190:14:0;;31160:44;:::i;:::-;;31271:14;;31222:64;;;;;30:3:-1;22:6;14;1:33;31222:64:0;;45:16:-1;;31222:64:0;;;;;;;;;-1:-1:-1;31253:16:0;;-1:-1:-1;31222:64:0;;-1:-1:-1;31222:64:0;;;;;;-1:-1:-1;31222:64:0;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;31222:64:0;;;;;;;;;;-1:-1:-1;;;;;;;31222:64:0;;;-1:-1:-1;31222:64:0;;-1:-1:-1;;31222:64:0;30663:631;;;;;;:::o;29298:49::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29298:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29202:26::-;;;;:::o;9736:109::-;8918:9;:7;:9::i;:::-;8910:18;;;;;;9809:28;9828:8;9809:18;:28::i;1542:150::-;1600:7;1632:5;;;1656:6;;;;1648:15;;;;;;1683:1;1542:150;-1:-1:-1;;;1542:150:0:o;3405:153::-;3514:35;;;-1:-1:-1;;;3514:35:0;;-1:-1:-1;;;;;3514:35:0;;;;;;;;;;;;;;;;;;;;;;:18;;;;;;:35;;;;;;;;;;;;;;;-1:-1:-1;3514:18:0;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;3514:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3514:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3514:35:0;3506:44;;;;;;3405:153;;;;:::o;3272:125::-;3363:5;-1:-1:-1;;;;;3363:14:0;;3378:2;3382:5;3363:25;;;;;;;;;;;;;-1:-1:-1;;;;;3363:25:0;-1:-1:-1;;;;;3363:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3363:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3363:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3363:25:0;3355:34;;;;;;3272:125;;;:::o;5374:165::-;5446:4;-1:-1:-1;;;;;5471:21:0;;5463:30;;;;;;-1:-1:-1;;;;;;5511:20:0;:11;:20;;;;;;;;;;;;;;;5374:165::o;6442:130::-;6502:24;:8;6518:7;6502:24;:15;:24;:::i;:::-;6542:22;;-1:-1:-1;;;;;6542:22:0;;;;;;;;6442:130;:::o;23578:798::-;23645:22;;:::i;:::-;23680:20;;:::i;:::-;23703:17;23716:3;23703:12;:17::i;:::-;23680:40;-1:-1:-1;23733:18:0;23754:14;23680:40;23766:1;23754:14;:11;:14;:::i;:::-;23733:35;;23800:4;23805:1;23800:7;;;;;;;;;;;;;;23788:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23779:1;:6;;:29;;;;23829:1;23819:4;23824:1;23819:7;;;;;;;;;;;;;:11;;;;;23883:8;23902:16;23929:440;23936:13;:3;:11;:13::i;:::-;23929:440;;;23980:12;:3;:10;:12::i;:::-;23966:26;;-1:-1:-1;23966:26:0;-1:-1:-1;24074:3:0;24081:1;24074:8;24070:259;;;24120:14;:3;:12;:14::i;:::-;24103:32;;24070:259;;;24174:3;24181:1;24174:8;24170:159;;;24227:14;:3;:12;:14::i;:::-;24203:1;:6;;;24210:4;24215:1;24210:7;;;;;;;;;;;;;;24203:15;;;;;;;;;;;;;:39;;;;24261:4;24266:1;24261:7;;;;;;;;;;;;;;;;;:9;;;;;;24170:159;;;24307:19;:3;24321:4;24307:19;:13;:19;:::i;:::-;23929:440;;;23578:798;;;;;;;:::o;27058:752::-;27118:15;;:::i;:::-;27146:20;;:::i;:::-;27169:17;27182:3;27169:12;:17::i;:::-;27146:40;;27199:8;27218:16;27245:558;27252:13;:3;:11;:13::i;:::-;27245:558;;;27296:12;:3;:10;:12::i;:::-;27282:26;;-1:-1:-1;27282:26:0;-1:-1:-1;27390:3:0;27397:1;27390:8;27386:377;;;27432:27;27444:14;:3;:12;:14::i;:::-;27432:11;:27::i;:::-;-1:-1:-1;;;;;27419:40:0;;;27386:377;;;27498:3;27505:1;27498:8;27494:269;;;27554:27;27566:14;:3;:12;:14::i;:::-;27554:11;:27::i;:::-;27527:24;;;:54;27494:269;;;27620:3;27627:1;27620:8;27616:147;;;27677:27;27689:14;:3;:12;:14::i;27677:27::-;27649:25;;;:55;27616:147;;;27741:19;:3;27755:4;27741:19;:13;:19;:::i;:::-;27245:558;;;27058:752;;;;;;:::o;1306:150::-;1364:7;1397:1;1392;:6;;1384:15;;;;;;-1:-1:-1;1422:5:0;;;1306:150::o;6312:122::-;6369:21;:8;6382:7;6369:21;:12;:21;:::i;:::-;6406:20;;-1:-1:-1;;;;;6406:20:0;;;;;;;;6312:122;:::o;9995:187::-;-1:-1:-1;;;;;10069:22:0;;10061:31;;;;;;10129:6;;;10108:38;;-1:-1:-1;;;;;10108:38:0;;;;10129:6;;;10108:38;;;10157:6;:17;;-1:-1:-1;;;;;;10157:17:0;-1:-1:-1;;;;;10157:17:0;;;;;;;;;;9995:187::o;5091:189::-;-1:-1:-1;;;;;5171:21:0;;5163:30;;;;;;5212:18;5216:4;5222:7;5212:3;:18::i;:::-;5204:27;;;;;;-1:-1:-1;;;;;5244:20:0;5267:5;5244:20;;;;;;;;;;;:28;;-1:-1:-1;;5244:28:0;;;5091:189::o;15262:131::-;15322:17;;:::i;:::-;15352:5;;;:11;;;;15384:1;15374:11;;15352:3;15262:131::o;16026:442::-;16148:7;;16173:20;;;16191:1;16184:8;;16173:20;;;;;;;;;;;;;16098:18;;16148:7;16173:20;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;16173:20:0;;16166:27;;16249:8;16268:13;16292:137;16299:12;16307:3;16299:7;:12::i;:::-;16292:137;;;16342:11;16349:3;16342:6;:11::i;:::-;16328:25;;;;;;;;16381:1;16368:4;16373:3;16368:9;;;;;;;;;;;;;:14;;;;;;;;;;;16397:20;16407:3;16412:4;16397:9;:20::i;:::-;16292:137;;;-1:-1:-1;;16439:21:0;;;-1:-1:-1;16026:442:0;:::o;15440:113::-;15533:5;;;;:12;15523:7;;:22;;15440:113::o;15610:188::-;15668:8;15678:17;15708:6;15717:14;15727:3;15717:9;:14::i;:::-;15708:23;-1:-1:-1;15752:1:0;15708:23;15748:5;15742:11;;15784:1;15788;15784:5;15775:15;;;;;;;;15764:26;;15610:188;;;;:::o;17540:677::-;17600:14;17627:8;17638:14;17648:3;17638:9;:14::i;:::-;17674:7;;17713:5;;;;:12;17627:25;;-1:-1:-1;17674:13:0;;;17706:19;;;17698:28;;;;;;17770:3;17760:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;17760:14:0;87:34:-1;135:17;;-1:-1;17760:14:0;-1:-1:-1;17805:5:0;;;;;17902:7;;17756:18;;-1:-1:-1;17805:5:0;17954:10;;;;17991:29;;;;17863:11;18041:145;18058:3;18056:1;:5;18041:145;;;18141:17;;;18135:24;18119:14;;;18112:48;18066:2;18063:5;18041:145;;;-1:-1:-1;;;18196:13:0;;-1:-1:-1;17540:677:0;;-1:-1:-1;17540:677:0:o;19030:402::-;19120:15;19112:4;:23;;;;;;;;;19108:292;;;19139:14;19149:3;19139:9;:14::i;:::-;;19108:292;;;19183:20;19175:4;:28;;;;;;;;;19171:229;;;19220:8;19231:14;19241:3;19231:9;:14::i;:::-;19260;;;;;;;19337:5;;;;:12;19220:25;;-1:-1:-1;19326:23:0;;19318:32;;;;;19171:229;19030:402;;:::o;19883:109::-;19940:9;19966:18;19982:1;19966:15;:18::i;19569:306::-;19626:9;19668:2;19656:1;:8;:14;;19648:23;;;;;;-1:-1:-1;19762:2:0;19755:10;;;19749:17;19824:8;;19814:1;19819:13;;19814:19;19808:26;;19569:306::o;4826:186::-;-1:-1:-1;;;;;4903:21:0;;4895:30;;;;;;4945:18;4949:4;4955:7;4945:3;:18::i;:::-;4944:19;4936:28;;;;;;-1:-1:-1;;;;;4977:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;4977:27:0;5000:4;4977:27;;;4826:186::o;16566:913::-;16750:5;;;;;16812:7;;16914:19;;;;;16908:26;16627:6;;;;17093:329;17110:2;17108:1;:4;17093:329;;;17175:3;17172:1;17167:12;17162:17;;17293:1;17297;17293:5;17279:1;17283:4;17279:8;17278:21;;17273:26;;;;17318:1;17322:4;17318:8;17330:1;17318:13;17314:97;;;17352:16;;;17367:1;17352:16;;;-1:-1:-1;17387:8:0;;-1:-1:-1;;17387:8:0;17314:97;17114:3;;17093:329;;;;17432:8;;;20000:254;20064:17;20102:1;:8;20114:2;20102:14;20094:23;;;;;;-1:-1:-1;20211:2:0;20204:10;20198:17;-1:-1:-1;;;20194:51:0;;;20187:60::o;28962:4312::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;28962:4312:0;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28962:4312:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28962:4312:0;;;-1:-1:-1;28962:4312:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://0ef48f0fa8c2c39f174999979f900f8eed58c0a95e79562343d0db5c5f94678a

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.