ETH Price: $3,396.52 (+2.04%)

Contract

0xa8047C2a86D5A188B0e15C3C10E2bc144cB272C2
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute164118162023-01-15 11:10:23713 days ago1673781023IN
0xa8047C2a...44cB272C2
0 ETH0.0017914214.03552199
Queue164005572023-01-13 21:27:47715 days ago1673645267IN
0xa8047C2a...44cB272C2
0 ETH0.0038144529
Cast Vote163916342023-01-12 15:31:47716 days ago1673537507IN
0xa8047C2a...44cB272C2
0 ETH0.0027920620
Cast Vote163915562023-01-12 15:15:47716 days ago1673536547IN
0xa8047C2a...44cB272C2
0 ETH0.0029621622
Cast Vote163912852023-01-12 14:21:11716 days ago1673533271IN
0xa8047C2a...44cB272C2
0 ETH0.0035007426
Cast Vote163875862023-01-12 1:58:11716 days ago1673488691IN
0xa8047C2a...44cB272C2
0 ETH0.0030348820
Propose163716772023-01-09 20:37:47719 days ago1673296667IN
0xa8047C2a...44cB272C2
0 ETH0.0302747825.70037683
Execute153338472022-08-13 14:05:19868 days ago1660399519IN
0xa8047C2a...44cB272C2
0 ETH0.0060346636.68040503
Queue153272762022-08-12 13:38:16869 days ago1660311496IN
0xa8047C2a...44cB272C2
0 ETH0.0056032533.20879125
Cast Vote153261632022-08-12 9:14:18869 days ago1660295658IN
0xa8047C2a...44cB272C2
0 ETH0.001211799
Cast Vote153239572022-08-12 0:50:35869 days ago1660265435IN
0xa8047C2a...44cB272C2
0 ETH0.0022889417
Cast Vote153230192022-08-11 21:19:36870 days ago1660252776IN
0xa8047C2a...44cB272C2
0 ETH0.0025644819
Cast Vote153215902022-08-11 15:50:05870 days ago1660233005IN
0xa8047C2a...44cB272C2
0 ETH0.0076154453.78027125
Cast Vote153214522022-08-11 15:17:20870 days ago1660231040IN
0xa8047C2a...44cB272C2
0 ETH0.0037700328
Cast Vote153203952022-08-11 11:17:27870 days ago1660216647IN
0xa8047C2a...44cB272C2
0 ETH0.0017503713
Cast Vote153200382022-08-11 9:58:40870 days ago1660211920IN
0xa8047C2a...44cB272C2
0 ETH0.0014810811
Cast Vote153200382022-08-11 9:58:40870 days ago1660211920IN
0xa8047C2a...44cB272C2
0 ETH0.0014810811
Cast Vote153200362022-08-11 9:58:21870 days ago1660211901IN
0xa8047C2a...44cB272C2
0 ETH0.0016157212
Cast Vote153200002022-08-11 9:50:53870 days ago1660211453IN
0xa8047C2a...44cB272C2
0 ETH0.0026928820
Cast Vote153199402022-08-11 9:36:12870 days ago1660210572IN
0xa8047C2a...44cB272C2
0 ETH0.0017503713
Cast Vote153198552022-08-11 9:14:51870 days ago1660209291IN
0xa8047C2a...44cB272C2
0 ETH0.0024235918
Cast Vote153194922022-08-11 7:45:25870 days ago1660203925IN
0xa8047C2a...44cB272C2
0 ETH0.0022185516.47721467
Cast Vote153174432022-08-11 0:04:27870 days ago1660176267IN
0xa8047C2a...44cB272C2
0 ETH0.0037700328
Cast Vote153168942022-08-10 22:00:37871 days ago1660168837IN
0xa8047C2a...44cB272C2
0 ETH0.0033478725.2395827
Cast Vote153160342022-08-10 18:50:05871 days ago1660157405IN
0xa8047C2a...44cB272C2
0 ETH0.0082129758
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
189009902023-12-30 21:25:23364 days ago1703971523
0xa8047C2a...44cB272C2
0.00045 ETH
189009792023-12-30 21:23:11364 days ago1703971391
0xa8047C2a...44cB272C2
0.0009 ETH
189009592023-12-30 21:19:11364 days ago1703971151
0xa8047C2a...44cB272C2
0.00045 ETH
188859262023-12-28 18:36:23366 days ago1703788583
0xa8047C2a...44cB272C2
0.00000007 ETH
187890762023-12-15 4:16:23379 days ago1702613783
0xa8047C2a...44cB272C2
0.000185 ETH
186659092023-11-27 22:19:23397 days ago1701123563
0xa8047C2a...44cB272C2
0.0003425 ETH
186522422023-11-26 0:20:35398 days ago1700958035
0xa8047C2a...44cB272C2
0.000085 ETH
185465702023-11-11 5:20:59413 days ago1699680059
0xa8047C2a...44cB272C2
0.0000425 ETH
183520132023-10-14 23:50:59441 days ago1697327459
0xa8047C2a...44cB272C2
0.0000425 ETH
183520132023-10-14 23:50:59441 days ago1697327459
0xa8047C2a...44cB272C2
0.0000425 ETH
183520132023-10-14 23:50:59441 days ago1697327459
0xa8047C2a...44cB272C2
0.000525 ETH
183520132023-10-14 23:50:59441 days ago1697327459
0xa8047C2a...44cB272C2
0.0005175 ETH
181590102023-09-17 23:32:47468 days ago1694993567
0xa8047C2a...44cB272C2
0.00075 ETH
181590102023-09-17 23:32:47468 days ago1694993567
0xa8047C2a...44cB272C2
0.00075 ETH
181590102023-09-17 23:32:47468 days ago1694993567
0xa8047C2a...44cB272C2
0.00075 ETH
181590102023-09-17 23:32:47468 days ago1694993567
0xa8047C2a...44cB272C2
0.00075 ETH
181590102023-09-17 23:32:47468 days ago1694993567
0xa8047C2a...44cB272C2
0.00075 ETH
181539792023-09-17 6:24:59468 days ago1694931899
0xa8047C2a...44cB272C2
0.00075 ETH
180646512023-09-04 17:37:11481 days ago1693849031
0xa8047C2a...44cB272C2
0.00236145 ETH
177995802023-07-29 15:26:47518 days ago1690644407
0xa8047C2a...44cB272C2
0.0006 ETH
177948562023-07-28 23:34:59519 days ago1690587299
0xa8047C2a...44cB272C2
0.000045 ETH
176612152023-07-10 5:33:35537 days ago1688967215
0xa8047C2a...44cB272C2
0.0003 ETH
176612142023-07-10 5:33:23537 days ago1688967203
0xa8047C2a...44cB272C2
0.00075 ETH
175591242023-06-25 21:20:59552 days ago1687728059
0xa8047C2a...44cB272C2
0.0006 ETH
175340782023-06-22 8:49:23555 days ago1687423763
0xa8047C2a...44cB272C2
0.0002268 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Governance

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion
File 1 of 5 : Governance.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;
pragma experimental ABIEncoderV2;

import "./interfaces/ISupernova.sol";
import "./Bridge.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";

contract Governance is Bridge {
    using SafeMath for uint256;

    enum ProposalState {
        WarmUp,
        Active,
        Canceled,
        Failed,
        Accepted,
        Queued,
        Grace,
        Expired,
        Executed,
        Abrogated
    }

    struct Receipt {
        // Whether or not a vote has been cast
        bool hasVoted;
        // The number of votes the voter had, which were cast
        uint256 votes;
        // support
        bool support;
    }

    struct AbrogationProposal {
        address creator;
        uint256 createTime;
        string description;

        uint256 forVotes;
        uint256 againstVotes;

        mapping(address => Receipt) receipts;
    }

    struct ProposalParameters {
        uint256 warmUpDuration;
        uint256 activeDuration;
        uint256 queueDuration;
        uint256 gracePeriodDuration;
        uint256 acceptanceThreshold;
        uint256 minQuorum;
    }

    struct Proposal {
        // proposal identifiers
        // unique id
        uint256 id;
        // Creator of the proposal
        address proposer;
        // proposal description
        string description;
        string title;

        // proposal technical details
        // ordered list of target addresses to be made
        address[] targets;
        // The ordered list of values (i.e. msg.value) to be passed to the calls to be made
        uint256[] values;
        // The ordered list of function signatures to be called
        string[] signatures;
        // The ordered list of calldata to be passed to each call
        bytes[] calldatas;

        // proposal creation time - 1
        uint256 createTime;

        // votes status
        // The timestamp that the proposal will be available for execution, set once the vote succeeds
        uint256 eta;
        // Current number of votes in favor of this proposal
        uint256 forVotes;
        // Current number of votes in opposition to this proposal
        uint256 againstVotes;

        bool canceled;
        bool executed;

        // Receipts of ballots for the entire set of voters
        mapping(address => Receipt) receipts;

        ProposalParameters parameters;
    }

    uint256 public lastProposalId;
    mapping(uint256 => Proposal) public proposals;
    mapping(uint256 => AbrogationProposal) public abrogationProposals;
    mapping(address => uint256) public latestProposalIds;
    ISupernova supernova;
    bool isInitialized;
    bool public isActive;

    event ProposalCreated(uint256 indexed proposalId);
    event Vote(uint256 indexed proposalId, address indexed user, bool support, uint256 power);
    event VoteCanceled(uint256 indexed proposalId, address indexed user);
    event ProposalQueued(uint256 indexed proposalId, address caller, uint256 eta);
    event ProposalExecuted(uint256 indexed proposalId, address caller);
    event ProposalCanceled(uint256 indexed proposalId, address caller);
    event AbrogationProposalStarted(uint256 indexed proposalId, address caller);
    event AbrogationProposalExecuted(uint256 indexed proposalId, address caller);
    event AbrogationProposalVote(uint256 indexed proposalId, address indexed user, bool support, uint256 power);
    event AbrogationProposalVoteCancelled(uint256 indexed proposalId, address indexed user);

    receive() external payable {}

    // executed only once
    function initialize(address supernovaAddr) public {
        require(isInitialized == false, "Contract already initialized.");
        require(supernovaAddr != address(0), "supernova must not be 0x0");

        supernova = ISupernova(supernovaAddr);
        isInitialized = true;
    }

    function activate() public {
        require(!isActive, "DAO already active");
        require(supernova.xyzStaked() >= ACTIVATION_THRESHOLD, "Threshold not met yet");

        isActive = true;
    }

    function propose(
        address[] memory targets,
        uint256[] memory values,
        string[] memory signatures,
        bytes[] memory calldatas,
        string memory description,
        string memory title
    )
    public returns (uint256)
    {
        if (!isActive) {
            require(supernova.xyzStaked() >= ACTIVATION_THRESHOLD, "DAO not yet active");
            isActive = true;
        }

        require(
            supernova.votingPowerAtTs(msg.sender, block.timestamp - 1) >= _getCreationThreshold(),
            "Creation threshold not met"
        );
        require(
            targets.length == values.length && targets.length == signatures.length && targets.length == calldatas.length,
            "Proposal function information arity mismatch"
        );
        require(targets.length != 0, "Must provide actions");
        require(targets.length <= PROPOSAL_MAX_ACTIONS, "Too many actions on a vote");
        require(bytes(title).length > 0, "title can't be empty");
        require(bytes(description).length > 0, "description can't be empty");

        // check if user has another running vote
        uint256 previousProposalId = latestProposalIds[msg.sender];
        if (previousProposalId != 0) {
            require(_isLiveState(previousProposalId) == false, "One live proposal per proposer");
        }

        uint256 newProposalId = lastProposalId + 1;
        Proposal storage newProposal = proposals[newProposalId];
        newProposal.id = newProposalId;
        newProposal.proposer = msg.sender;
        newProposal.description = description;
        newProposal.title = title;
        newProposal.targets = targets;
        newProposal.values = values;
        newProposal.signatures = signatures;
        newProposal.calldatas = calldatas;
        newProposal.createTime = block.timestamp - 1;
        newProposal.parameters.warmUpDuration = warmUpDuration;
        newProposal.parameters.activeDuration = activeDuration;
        newProposal.parameters.queueDuration = queueDuration;
        newProposal.parameters.gracePeriodDuration = gracePeriodDuration;
        newProposal.parameters.acceptanceThreshold = acceptanceThreshold;
        newProposal.parameters.minQuorum = minQuorum;

        lastProposalId = newProposalId;
        latestProposalIds[msg.sender] = newProposalId;

        emit ProposalCreated(newProposalId);

        return newProposalId;
    }

    function queue(uint256 proposalId) public {
        require(state(proposalId) == ProposalState.Accepted, "Proposal can only be queued if it is succeeded");

        Proposal storage proposal = proposals[proposalId];
        uint256 eta = proposal.createTime + proposal.parameters.warmUpDuration + proposal.parameters.activeDuration + proposal.parameters.queueDuration;
        proposal.eta = eta;

        for (uint256 i = 0; i < proposal.targets.length; i++) {
            require(
                !queuedTransactions[_getTxHash(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], eta)],
                "proposal action already queued at eta"
            );

            queueTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], eta);
        }

        emit ProposalQueued(proposalId, msg.sender, eta);
    }

    function execute(uint256 proposalId) public payable {
        require(_canBeExecuted(proposalId), "Cannot be executed");

        Proposal storage proposal = proposals[proposalId];
        proposal.executed = true;

        for (uint256 i = 0; i < proposal.targets.length; i++) {
            executeTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta);
        }

        emit ProposalExecuted(proposalId, msg.sender);
    }

    function cancelProposal(uint256 proposalId) public {
        require(_isCancellableState(proposalId), "Proposal in state that does not allow cancellation");
        require(_canCancelProposal(proposalId), "Cancellation requirements not met");

        Proposal storage proposal = proposals[proposalId];
        proposal.canceled = true;

        for (uint256 i = 0; i < proposal.targets.length; i++) {
            cancelTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta);
        }

        emit ProposalCanceled(proposalId, msg.sender);
    }

    function castVote(uint256 proposalId, bool support) public {
        require(state(proposalId) == ProposalState.Active, "Voting is closed");

        Proposal storage proposal = proposals[proposalId];
        Receipt storage receipt = proposal.receipts[msg.sender];

        // exit if user already voted
        require(receipt.hasVoted == false || receipt.hasVoted && receipt.support != support, "Already voted this option");

        uint256 votes = supernova.votingPowerAtTs(msg.sender, _getSnapshotTimestamp(proposal));
        require(votes > 0, "no voting power");

        // means it changed its vote
        if (receipt.hasVoted) {
            if (receipt.support) {
                proposal.forVotes = proposal.forVotes.sub(receipt.votes);
            } else {
                proposal.againstVotes = proposal.againstVotes.sub(receipt.votes);
            }
        }

        if (support) {
            proposal.forVotes = proposal.forVotes.add(votes);
        } else {
            proposal.againstVotes = proposal.againstVotes.add(votes);
        }

        receipt.hasVoted = true;
        receipt.votes = votes;
        receipt.support = support;

        emit Vote(proposalId, msg.sender, support, votes);
    }

    function cancelVote(uint256 proposalId) public {
        require(state(proposalId) == ProposalState.Active, "Voting is closed");

        Proposal storage proposal = proposals[proposalId];
        Receipt storage receipt = proposal.receipts[msg.sender];

        uint256 votes = supernova.votingPowerAtTs(msg.sender, _getSnapshotTimestamp(proposal));

        require(receipt.hasVoted, "Cannot cancel if not voted yet");

        if (receipt.support) {
            proposal.forVotes = proposal.forVotes.sub(votes);
        } else {
            proposal.againstVotes = proposal.againstVotes.sub(votes);
        }

        receipt.hasVoted = false;
        receipt.votes = 0;
        receipt.support = false;

        emit VoteCanceled(proposalId, msg.sender);
    }

    // ======================================================================================================
    // Abrogation proposal methods
    // ======================================================================================================

    // the Abrogation Proposal is a mechanism for the DAO participants to veto the execution of a proposal that was already
    // accepted and it is currently queued. For the Abrogation Proposal to pass, 50% + 1 of the vBOND holders
    // must vote FOR the Abrogation Proposal
    function startAbrogationProposal(uint256 proposalId, string memory description) public {
        require(state(proposalId) == ProposalState.Queued, "Proposal must be in queue");
        require(
            supernova.votingPowerAtTs(msg.sender, block.timestamp - 1) >= _getCreationThreshold(),
            "Creation threshold not met"
        );

        AbrogationProposal storage ap = abrogationProposals[proposalId];

        require(ap.createTime == 0, "Abrogation proposal already exists");
        require(bytes(description).length > 0, "description can't be empty");

        ap.createTime = block.timestamp;
        ap.creator = msg.sender;
        ap.description = description;

        emit AbrogationProposalStarted(proposalId, msg.sender);
    }

    // abrogateProposal cancels a proposal if there's an Abrogation Proposal that passed
    function abrogateProposal(uint256 proposalId) public {
        require(state(proposalId) == ProposalState.Abrogated, "Cannot be abrogated");

        Proposal storage proposal = proposals[proposalId];

        require(proposal.canceled == false, "Cannot be abrogated");

        proposal.canceled = true;

        for (uint256 i = 0; i < proposal.targets.length; i++) {
            cancelTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta);
        }

        emit AbrogationProposalExecuted(proposalId, msg.sender);
    }

    function abrogationProposal_castVote(uint256 proposalId, bool support) public {
        require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id");

        AbrogationProposal storage abrogationProposal = abrogationProposals[proposalId];
        require(
            state(proposalId) == ProposalState.Queued && abrogationProposal.createTime != 0,
            "Abrogation Proposal not active"
        );

        Receipt storage receipt = abrogationProposal.receipts[msg.sender];
        require(
            receipt.hasVoted == false || receipt.hasVoted && receipt.support != support,
            "Already voted this option"
        );

        uint256 votes = supernova.votingPowerAtTs(msg.sender, abrogationProposal.createTime - 1);
        require(votes > 0, "no voting power");

        // means it changed its vote
        if (receipt.hasVoted) {
            if (receipt.support) {
                abrogationProposal.forVotes = abrogationProposal.forVotes.sub(receipt.votes);
            } else {
                abrogationProposal.againstVotes = abrogationProposal.againstVotes.sub(receipt.votes);
            }
        }

        if (support) {
            abrogationProposal.forVotes = abrogationProposal.forVotes.add(votes);
        } else {
            abrogationProposal.againstVotes = abrogationProposal.againstVotes.add(votes);
        }

        receipt.hasVoted = true;
        receipt.votes = votes;
        receipt.support = support;

        emit AbrogationProposalVote(proposalId, msg.sender, support, votes);
    }

    function abrogationProposal_cancelVote(uint256 proposalId) public {
        require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id");

        AbrogationProposal storage abrogationProposal = abrogationProposals[proposalId];
        Receipt storage receipt = abrogationProposal.receipts[msg.sender];

        require(
            state(proposalId) == ProposalState.Queued && abrogationProposal.createTime != 0,
            "Abrogation Proposal not active"
        );

        uint256 votes = supernova.votingPowerAtTs(msg.sender, abrogationProposal.createTime - 1);

        require(receipt.hasVoted, "Cannot cancel if not voted yet");

        if (receipt.support) {
            abrogationProposal.forVotes = abrogationProposal.forVotes.sub(votes);
        } else {
            abrogationProposal.againstVotes = abrogationProposal.againstVotes.sub(votes);
        }

        receipt.hasVoted = false;
        receipt.votes = 0;
        receipt.support = false;

        emit AbrogationProposalVoteCancelled(proposalId, msg.sender);
    }

    // ======================================================================================================
    // views
    // ======================================================================================================

    function state(uint256 proposalId) public view returns (ProposalState) {
        require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id");

        Proposal storage proposal = proposals[proposalId];

        if (proposal.canceled) {
            return ProposalState.Canceled;
        }

        if (proposal.executed) {
            return ProposalState.Executed;
        }

        if (block.timestamp <= proposal.createTime + proposal.parameters.warmUpDuration) {
            return ProposalState.WarmUp;
        }

        if (block.timestamp <= proposal.createTime + proposal.parameters.warmUpDuration + proposal.parameters.activeDuration) {
            return ProposalState.Active;
        }

        if ((proposal.forVotes + proposal.againstVotes) < _getQuorum(proposal) ||
            (proposal.forVotes < _getMinForVotes(proposal))) {
            return ProposalState.Failed;
        }

        if (proposal.eta == 0) {
            return ProposalState.Accepted;
        }

        if (block.timestamp < proposal.eta) {
            return ProposalState.Queued;
        }

        if (_proposalAbrogated(proposalId)) {
            return ProposalState.Abrogated;
        }

        if (block.timestamp <= proposal.eta + proposal.parameters.gracePeriodDuration) {
            return ProposalState.Grace;
        }

        return ProposalState.Expired;
    }

    function getReceipt(uint256 proposalId, address voter) public view returns (Receipt memory) {
        return proposals[proposalId].receipts[voter];
    }

    function getProposalParameters(uint256 proposalId) public view returns (ProposalParameters memory) {
        return proposals[proposalId].parameters;
    }

    function getAbrogationProposalReceipt(uint256 proposalId, address voter) public view returns (Receipt memory) {
        return abrogationProposals[proposalId].receipts[voter];
    }

    function getActions(uint256 proposalId) public view returns (
        address[] memory targets,
        uint256[] memory values,
        string[] memory signatures,
        bytes[] memory calldatas
    ) {
        Proposal storage p = proposals[proposalId];
        return (p.targets, p.values, p.signatures, p.calldatas);
    }

    function getProposalQuorum(uint256 proposalId) public view returns (uint256) {
        require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id");

        return _getQuorum(proposals[proposalId]);
    }

    // ======================================================================================================
    // internal methods
    // ======================================================================================================

    function _canCancelProposal(uint256 proposalId) internal view returns (bool){
        Proposal storage proposal = proposals[proposalId];

        if (msg.sender == proposal.proposer ||
            supernova.votingPower(proposal.proposer) < _getCreationThreshold()
        ) {
            return true;
        }

        return false;
    }

    function _isCancellableState(uint256 proposalId) internal view returns (bool) {
        ProposalState s = state(proposalId);

        return s == ProposalState.WarmUp || s == ProposalState.Active;
    }

    function _isLiveState(uint256 proposalId) internal view returns (bool) {
        ProposalState s = state(proposalId);

        return s == ProposalState.WarmUp ||
        s == ProposalState.Active ||
        s == ProposalState.Accepted ||
        s == ProposalState.Queued ||
        s == ProposalState.Grace;
    }

    function _canBeExecuted(uint256 proposalId) internal view returns (bool) {
        return state(proposalId) == ProposalState.Grace;
    }

    function _getMinForVotes(Proposal storage proposal) internal view returns (uint256) {
        return (proposal.forVotes + proposal.againstVotes).mul(proposal.parameters.acceptanceThreshold).div(100);
    }

    function _getCreationThreshold() internal view returns (uint256) {
        return supernova.xyzStaked().div(100);
    }

    // Returns the timestamp of the snapshot for a given proposal
    // If the current block's timestamp is equal to `proposal.createTime + warmUpDuration` then the state function
    // will return WarmUp as state which will prevent any vote to be cast which will gracefully avoid any flashloan attack
    function _getSnapshotTimestamp(Proposal storage proposal) internal view returns (uint256) {
        return proposal.createTime + proposal.parameters.warmUpDuration;
    }

    function _getQuorum(Proposal storage proposal) internal view returns (uint256) {
        return supernova.xyzStakedAtTs(_getSnapshotTimestamp(proposal)).mul(proposal.parameters.minQuorum).div(100);
    }

    function _proposalAbrogated(uint256 proposalId) internal view returns (bool) {
        Proposal storage p = proposals[proposalId];
        AbrogationProposal storage cp = abrogationProposals[proposalId];

        if (cp.createTime == 0 || block.timestamp < p.eta) {
            return false;
        }

        return cp.forVotes >= supernova.xyzStakedAtTs(cp.createTime - 1).div(2);
    }
}

File 2 of 5 : ISupernova.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;
pragma experimental ABIEncoderV2;

interface ISupernova {
    struct Stake {
        uint256 timestamp;
        uint256 amount;
        uint256 expiryTimestamp;
        address delegatedTo;
    }

    // deposit allows a user to add more xyz to his staked balance
    function deposit(uint256 amount) external;

    // withdraw allows a user to withdraw funds if the balance is not locked
    function withdraw(uint256 amount) external;

    // lock a user's currently staked balance until timestamp & add the bonus to his voting power
    function lock(uint256 timestamp) external;

    // delegate allows a user to delegate his voting power to another user
    function delegate(address to) external;

    // stopDelegate allows a user to take back the delegated voting power
    function stopDelegate() external;

    // balanceOf returns the current BOND balance of a user (bonus not included)
    function balanceOf(address user) external view returns (uint256);

    // balanceAtTs returns the amount of BOND that the user currently staked (bonus NOT included)
    function balanceAtTs(address user, uint256 timestamp) external view returns (uint256);

    // stakeAtTs returns the Stake object of the user that was valid at `timestamp`
    function stakeAtTs(address user, uint256 timestamp) external view returns (Stake memory);

    // votingPower returns the voting power (bonus included) + delegated voting power for a user at the current block
    function votingPower(address user) external view returns (uint256);

    // votingPowerAtTs returns the voting power (bonus included) + delegated voting power for a user at a point in time
    function votingPowerAtTs(address user, uint256 timestamp) external view returns (uint256);

    // xyzStaked returns the total raw amount of BOND staked at the current block
    function xyzStaked() external view returns (uint256);

    // xyzStakedAtTs returns the total raw amount of BOND users have deposited into the contract
    // it does not include any bonus
    function xyzStakedAtTs(uint256 timestamp) external view returns (uint256);

    // delegatedPower returns the total voting power that a user received from other users
    function delegatedPower(address user) external view returns (uint256);

    // delegatedPowerAtTs returns the total voting power that a user received from other users at a point in time
    function delegatedPowerAtTs(address user, uint256 timestamp) external view returns (uint256);

    // multiplierAtTs calculates the multiplier at a given timestamp based on the user's stake a the given timestamp
    // it includes the decay mechanism
    function multiplierAtTs(address user, uint256 timestamp) external view returns (uint256);

    // userLockedUntil returns the timestamp until the user's balance is locked
    function userLockedUntil(address user) external view returns (uint256);

    // userDidDelegate returns the address to which a user delegated their voting power; address(0) if not delegated
    function userDelegatedTo(address user) external view returns (address);
}

File 3 of 5 : Bridge.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;

import "./Parameters.sol";

abstract contract Bridge is Parameters {

    mapping(bytes32 => bool) public queuedTransactions;

    function queueTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal returns (bytes32) {
        bytes32 txHash = _getTxHash(target, value, signature, data, eta);
        queuedTransactions[txHash] = true;

        return txHash;
    }

    function cancelTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal {
        bytes32 txHash = _getTxHash(target, value, signature, data, eta);
        queuedTransactions[txHash] = false;
    }

    function executeTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal returns (bytes memory) {
        bytes32 txHash = _getTxHash(target, value, signature, data, eta);

        require(block.timestamp >= eta, "executeTransaction: Transaction hasn't surpassed time lock.");
        require(block.timestamp <= eta + gracePeriodDuration, "executeTransaction: Transaction is stale.");

        queuedTransactions[txHash] = false;

        bytes memory callData;

        if (bytes(signature).length == 0) {
            callData = data;
        } else {
            callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data);
        }

        // solium-disable-next-line security/no-call-value
        (bool success, bytes memory returnData) = target.call{value : value}(callData);
        require(success, string(returnData));

        return returnData;
    }

    function _getTxHash(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal returns (bytes32) {
        return keccak256(abi.encode(target, value, signature, data, eta));
    }
}

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

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 5 of 5 : Parameters.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;

abstract contract Parameters {
    uint256 public warmUpDuration = 2 days;
    uint256 public activeDuration = 2 days;
    uint256 public queueDuration = 1 days;
    uint256 public gracePeriodDuration = 4 days;

    uint256 public acceptanceThreshold = 60;
    uint256 public minQuorum = 40;

    uint256 constant ACTIVATION_THRESHOLD = 50_000_000 * 10**18;
    uint256 constant PROPOSAL_MAX_ACTIONS = 10;

    modifier onlyDAO() {
        require(msg.sender == address(this), "Only DAO can call");
        _;
    }

    function setWarmUpDuration(uint256 period) public onlyDAO {
        warmUpDuration = period;
    }

    function setActiveDuration(uint256 period) public onlyDAO {
        require(period >= 4 hours, "period must be > 0");
        activeDuration = period;
    }

    function setQueueDuration(uint256 period) public onlyDAO {
        queueDuration = period;
    }

    function setGracePeriodDuration(uint256 period) public onlyDAO {
        require(period >= 4 hours, "period must be > 0");
        gracePeriodDuration = period;
    }

    function setAcceptanceThreshold(uint256 threshold) public onlyDAO {
        require(threshold <= 100, "Maximum is 100.");
        require(threshold > 50, "Minimum is 50.");

        acceptanceThreshold = threshold;
    }

    function setMinQuorum(uint256 quorum) public onlyDAO {
        require(quorum > 5, "quorum must be greater than 5");
        require(quorum <= 100, "Maximum is 100.");

        minQuorum = quorum;
    }
}

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

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"AbrogationProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"AbrogationProposalStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"},{"indexed":false,"internalType":"uint256","name":"power","type":"uint256"}],"name":"AbrogationProposalVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"AbrogationProposalVoteCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"ProposalCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"ProposalQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"},{"indexed":false,"internalType":"uint256","name":"power","type":"uint256"}],"name":"Vote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"VoteCanceled","type":"event"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"abrogateProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"abrogationProposal_cancelVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"abrogationProposal_castVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"abrogationProposals","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"createTime","type":"uint256"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptanceThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activeDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancelProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancelVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"castVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getAbrogationProposalReceipt","outputs":[{"components":[{"internalType":"bool","name":"hasVoted","type":"bool"},{"internalType":"uint256","name":"votes","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"internalType":"struct Governance.Receipt","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getActions","outputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalParameters","outputs":[{"components":[{"internalType":"uint256","name":"warmUpDuration","type":"uint256"},{"internalType":"uint256","name":"activeDuration","type":"uint256"},{"internalType":"uint256","name":"queueDuration","type":"uint256"},{"internalType":"uint256","name":"gracePeriodDuration","type":"uint256"},{"internalType":"uint256","name":"acceptanceThreshold","type":"uint256"},{"internalType":"uint256","name":"minQuorum","type":"uint256"}],"internalType":"struct Governance.ProposalParameters","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getReceipt","outputs":[{"components":[{"internalType":"bool","name":"hasVoted","type":"bool"},{"internalType":"uint256","name":"votes","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"internalType":"struct Governance.Receipt","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gracePeriodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"supernovaAddr","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProposalId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"latestProposalIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"title","type":"string"},{"internalType":"uint256","name":"createTime","type":"uint256"},{"internalType":"uint256","name":"eta","type":"uint256"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"},{"components":[{"internalType":"uint256","name":"warmUpDuration","type":"uint256"},{"internalType":"uint256","name":"activeDuration","type":"uint256"},{"internalType":"uint256","name":"queueDuration","type":"uint256"},{"internalType":"uint256","name":"gracePeriodDuration","type":"uint256"},{"internalType":"uint256","name":"acceptanceThreshold","type":"uint256"},{"internalType":"uint256","name":"minQuorum","type":"uint256"}],"internalType":"struct Governance.ProposalParameters","name":"parameters","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"title","type":"string"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"queue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"queueDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"queuedTransactions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"setAcceptanceThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setActiveDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setGracePeriodDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quorum","type":"uint256"}],"name":"setMinQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setQueueDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setWarmUpDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"string","name":"description","type":"string"}],"name":"startAbrogationProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"state","outputs":[{"internalType":"enum Governance.ProposalState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"warmUpDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526202a3006000556202a3006001556201518060025562054600600355603c600455602860055534801561003657600080fd5b50614988806100466000396000f3fe6080604052600436106102535760003560e01c80635f2e9f6011610138578063c4d66de8116100b0578063e0a8f6f51161007f578063e4e2d26111610064578063e4e2d261146106a0578063f2b06537146106c0578063fe0d94c1146106e05761025a565b8063e0a8f6f514610653578063e23a9a52146106735761025a565b8063c4d66de8146105d3578063d0cd595e146105f3578063d1291f1914610613578063ddf0b009146106335761025a565b80639e70a23411610107578063b5a127e5116100ec578063b5a127e514610589578063bacbe2da1461059e578063c099f575146105be5761025a565b80639e70a23414610554578063b0edbb9b146105745761025a565b80635f2e9f60146104d957806374cb3041146104ee5780638b787e3014610503578063984690db146105345761025a565b8063328dd982116101cb5780633e4f49e61161019a578063490145c81161017f578063490145c81461047957806353e5056a14610499578063563909de146104b95761025a565b80633e4f49e61461041f578063458921551461044c5761025a565b8063328dd9821461039a578063342d067a146103ca57806339e778ee146103ea5780633d05f0091461040a5761025a565b80631e9d1e641161022257806324b437871161020757806324b437871461034557806324cd62d3146103655780632e8e34e1146103855761025a565b80631e9d1e641461030357806322f3e2d4146103235761025a565b8063013cf08b1461025f5780630f15f4c01461029f57806315373e3d146102b657806317977c61146102d65761025a565b3661025a57005b600080fd5b34801561026b57600080fd5b5061027f61027a366004613e00565b6106f3565b6040516102969b9a999897969594939291906147f6565b60405180910390f35b3480156102ab57600080fd5b506102b46108b9565b005b3480156102c257600080fd5b506102b46102d1366004613e5b565b610a0b565b3480156102e257600080fd5b506102f66102f1366004613cf8565b610c42565b60405161029691906147ed565b34801561030f57600080fd5b506102b461031e366004613e00565b610c54565b34801561032f57600080fd5b50610338610e43565b6040516102969190614111565b34801561035157600080fd5b506102b4610360366004613e00565b610e65565b34801561037157600080fd5b506102b4610380366004613e00565b6110ce565b34801561039157600080fd5b506102f661117e565b3480156103a657600080fd5b506103ba6103b5366004613e00565b611184565b6040516102969493929190614059565b3480156103d657600080fd5b506102b46103e5366004613e00565b611420565b3480156103f657600080fd5b506102b4610405366004613e8e565b6114d0565b34801561041657600080fd5b506102f66116a7565b34801561042b57600080fd5b5061043f61043a366004613e00565b6116ad565b604051610296919061412c565b34801561045857600080fd5b5061046c610467366004613e00565b6117fb565b60405161029691906147ba565b34801561048557600080fd5b506102f6610494366004613d12565b61185f565b3480156104a557600080fd5b506102b46104b4366004613e00565b611cac565b3480156104c557600080fd5b506102b46104d4366004613e00565b611d05565b3480156104e557600080fd5b506102f6611e09565b3480156104fa57600080fd5b506102f6611e0f565b34801561050f57600080fd5b5061052361051e366004613e00565b611e15565b604051610296959493929190614010565b34801561054057600080fd5b506102b461054f366004613e00565b611ee4565b34801561056057600080fd5b506102b461056f366004613e5b565b611f3d565b34801561058057600080fd5b506102f66121be565b34801561059557600080fd5b506102f66121c4565b3480156105aa57600080fd5b506102b46105b9366004613e00565b6121ca565b3480156105ca57600080fd5b506102f6612367565b3480156105df57600080fd5b506102b46105ee366004613cf8565b61236d565b3480156105ff57600080fd5b506102f661060e366004613e00565b61245c565b34801561061f57600080fd5b506102b461062e366004613e00565b6124a9565b34801561063f57600080fd5b506102b461064e366004613e00565b6125ad565b34801561065f57600080fd5b506102b461066e366004613e00565b6129cb565b34801561067f57600080fd5b5061069361068e366004613e30565b612a8b565b60405161029691906147c8565b3480156106ac57600080fd5b506106936106bb366004613e30565b612afc565b3480156106cc57600080fd5b506103386106db366004613e00565b612b6d565b6102b46106ee366004613e00565b612b82565b60086020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f8101879004870284018701909752868352929573ffffffffffffffffffffffffffffffffffffffff909116949192918301828280156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505060038301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505060088401546009850154600a860154600b870154600c8801546040805160c081018252600e8b01548152600f8b0154602082015260108b01549181019190915260118a0154606082015260128a0154608082015260139099015460a08a0152969793969295509093509160ff80831692610100900416908b565b600b547501000000000000000000000000000000000000000000900460ff16156108fe5760405162461bcd60e51b81526004016108f59061429f565b60405180910390fd5b600b54604080517f2139353f00000000000000000000000000000000000000000000000000000000815290516a295be96e640669720000009273ffffffffffffffffffffffffffffffffffffffff1691632139353f916004808301926020929190829003018186803b15801561097357600080fd5b505afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190613e18565b10156109c95760405162461bcd60e51b81526004016108f59061437b565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6001610a16836116ad565b6009811115610a2157fe5b14610a3e5760405162461bcd60e51b81526004016108f59061474c565b6000828152600860209081526040808320338452600d8101909252909120805460ff161580610a845750805460ff168015610a845750600281015460ff16151583151514155b610aa05760405162461bcd60e51b81526004016108f5906146b8565b600b5460009073ffffffffffffffffffffffffffffffffffffffff1663cbf8eda933610acb86612dcb565b6040518363ffffffff1660e01b8152600401610ae8929190613fea565b60206040518083038186803b158015610b0057600080fd5b505afa158015610b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b389190613e18565b905060008111610b5a5760405162461bcd60e51b81526004016108f5906141ae565b815460ff1615610ba757600282015460ff1615610b8e576001820154600a840154610b8491612dda565b600a840155610ba7565b6001820154600b840154610ba191612dda565b600b8401555b8315610bc657600a830154610bbc9082612e37565b600a840155610bdb565b600b830154610bd59082612e37565b600b8401555b8154600160ff19918216811784558301829055600283018054909116851515179055604051339086907f88d35328232823f54954b6627e9f732371656f6daa40cb1b01b27dc7875a7b4790610c33908890869061411c565b60405180910390a35050505050565b600a6020526000908152604090205481565b806000108015610c6657506007548111155b610c825760405162461bcd60e51b81526004016108f5906142d6565b60008181526009602090815260408083203384526005808201909352922090610caa846116ad565b6009811115610cb557fe5b148015610cc55750600182015415155b610ce15760405162461bcd60e51b81526004016108f590614446565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda991610d4491339160001990910190600401613fea565b60206040518083038186803b158015610d5c57600080fd5b505afa158015610d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d949190613e18565b825490915060ff16610db85760405162461bcd60e51b81526004016108f59061457f565b600282015460ff1615610dde576003830154610dd49082612dda565b6003840155610df3565b6004830154610ded9082612dda565b60048401555b815460ff199081168355600060018401819055600284018054909216909155604051339186917f5e8ee24f838173ed2ae7989835696f6e11945ac8fbc5259aef01cc4d7f0d49209190a350505050565b600b547501000000000000000000000000000000000000000000900460ff1681565b6009610e70826116ad565b6009811115610e7b57fe5b14610e985760405162461bcd60e51b81526004016108f59061447d565b6000818152600860205260409020600c81015460ff1615610ecb5760405162461bcd60e51b81526004016108f59061447d565b600c8101805460ff1916600117905560005b600482015481101561109157611089826004018281548110610efb57fe5b60009182526020909120015460058401805473ffffffffffffffffffffffffffffffffffffffff9092169184908110610f3057fe5b9060005260206000200154846006018481548110610f4a57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610fd85780601f10610fad57610100808354040283529160200191610fd8565b820191906000526020600020905b815481529060010190602001808311610fbb57829003601f168201915b5050505050856007018581548110610fec57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561107a5780601f1061104f5761010080835404028352916020019161107a565b820191906000526020600020905b81548152906001019060200180831161105d57829003601f168201915b50505050508660090154612e98565b600101610edd565b50817f6d7acd63bebeaf524f1761a88687951f776fc7c182205f820424c7fb572c7235336040516110c29190613fc9565b60405180910390a25050565b333014611122576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b613840811015611179576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600155565b60025481565b6060806060806000600860008781526020019081526020016000209050806004018160050182600601836007018380548060200260200160405190810160405280929190818152602001828054801561121357602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111e8575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561126557602002820191906000526020600020905b815481526020019060010190808311611251575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b828210156113385760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113245780601f106112f957610100808354040283529160200191611324565b820191906000526020600020905b81548152906001019060200180831161130757829003601f168201915b50505050508152602001906001019061128d565b50505050915080805480602002602001604051908101604052809291908181526020016000905b8282101561140a5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113f65780601f106113cb576101008083540402835291602001916113f6565b820191906000526020600020905b8154815290600101906020018083116113d957829003601f168201915b50505050508152602001906001019061135f565b5050505090509450945094509450509193509193565b333014611474576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6138408110156114cb576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600355565b60056114db836116ad565b60098111156114e657fe5b146115035760405162461bcd60e51b81526004016108f59061430d565b61150b612ec5565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda990611567903390600019420190600401613fea565b60206040518083038186803b15801561157f57600080fd5b505afa158015611593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b79190613e18565b10156115d55760405162461bcd60e51b81526004016108f590614344565b60008281526009602052604090206001810154156116055760405162461bcd60e51b81526004016108f5906144eb565b60008251116116265760405162461bcd60e51b81526004016108f590614177565b42600182015580547fffffffffffffffffffffffff00000000000000000000000000000000000000001633178155815161166990600283019060208501906137db565b50827f27eba018e1c52b84f732fe4d806fd9750c60752f1d37e7f70bcb4cbec65b1c6a3360405161169a9190613fc9565b60405180910390a2505050565b60015481565b60008160001080156116c157506007548211155b6116dd5760405162461bcd60e51b81526004016108f5906142d6565b6000828152600860205260409020600c81015460ff16156117025760029150506117f6565b600c810154610100900460ff161561171e5760089150506117f6565b600e81015460088201540142116117395760009150506117f6565b600f810154600e82015460088301540101421161175a5760019150506117f6565b61176381612f77565b81600b015482600a0154011080611785575061177e81613023565b81600a0154105b156117945760039150506117f6565b60098101546117a75760049150506117f6565b80600901544210156117bd5760059150506117f6565b6117c68361304e565b156117d55760099150506117f6565b601181015460098201540142116117f05760069150506117f6565b60079150505b919050565b611803613867565b50600090815260086020908152604091829020825160c081018452600e8201548152600f82015492810192909252601081015492820192909252601182015460608201526012820154608082015260139091015460a082015290565b600b546000907501000000000000000000000000000000000000000000900460ff1661199157600b54604080517f2139353f00000000000000000000000000000000000000000000000000000000815290516a295be96e640669720000009273ffffffffffffffffffffffffffffffffffffffff1691632139353f916004808301926020929190829003018186803b1580156118fa57600080fd5b505afa15801561190e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119329190613e18565b10156119505760405162461bcd60e51b81526004016108f590614140565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b611999612ec5565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda9906119f5903390600019420190600401613fea565b60206040518083038186803b158015611a0d57600080fd5b505afa158015611a21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a459190613e18565b1015611a635760405162461bcd60e51b81526004016108f590614344565b85518751148015611a75575084518751145b8015611a82575083518751145b611a9e5760405162461bcd60e51b81526004016108f5906146ef565b8651611abc5760405162461bcd60e51b81526004016108f590614613565b600a87511115611ade5760405162461bcd60e51b81526004016108f59061464a565b6000825111611aff5760405162461bcd60e51b81526004016108f59061440f565b6000835111611b205760405162461bcd60e51b81526004016108f590614177565b336000908152600a60205260409020548015611b5c57611b3f81613118565b15611b5c5760405162461bcd60e51b81526004016108f5906144b4565b6007546001908101600081815260086020908152604090912082815592830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790558651919291611bba916002840191908901906137db565b508451611bd090600383019060208801906137db565b508951611be690600483019060208d019061389d565b508851611bfc90600583019060208c0190613917565b508751611c1290600683019060208b0190613951565b508651611c2890600783019060208a01906139aa565b506000194201600882015560008054600e830155600154600f83015560025460108301556003546011830155600454601283015560055460138301556007839055338152600a60205260408082208490555183917fc2c021f5d73c63c481d336fbbafec58f694fc45095f00b02d2deb8cca59afe0791a25098975050505050505050565b333014611d00576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600255565b333014611d59576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b60058111611dae576040805162461bcd60e51b815260206004820152601d60248201527f71756f72756d206d7573742062652067726561746572207468616e2035000000604482015290519081900360640190fd5b6064811115611e04576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b600555565b60005481565b60075481565b60096020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f810187900487028401870190975286835273ffffffffffffffffffffffffffffffffffffffff909316959094919291830182828015611ece5780601f10611ea357610100808354040283529160200191611ece565b820191906000526020600020905b815481529060010190602001808311611eb157829003601f168201915b5050505050908060030154908060040154905085565b333014611f38576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600055565b816000108015611f4f57506007548211155b611f6b5760405162461bcd60e51b81526004016108f5906142d6565b60008281526009602052604090206005611f84846116ad565b6009811115611f8f57fe5b148015611f9f5750600181015415155b611fbb5760405162461bcd60e51b81526004016108f590614446565b3360009081526005820160205260409020805460ff161580611ff45750805460ff168015611ff45750600281015460ff16151583151514155b6120105760405162461bcd60e51b81526004016108f5906146b8565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda99161207391339160001990910190600401613fea565b60206040518083038186803b15801561208b57600080fd5b505afa15801561209f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c39190613e18565b9050600081116120e55760405162461bcd60e51b81526004016108f5906141ae565b815460ff161561213257600282015460ff1615612119576001820154600384015461210f91612dda565b6003840155612132565b6001820154600484015461212c91612dda565b60048401555b83156121515760038301546121479082612e37565b6003840155612166565b60048301546121609082612e37565b60048401555b8154600160ff19918216811784558301829055600283018054909116851515179055604051339086907f80f2ad7e3e83d197670402663f224adb2f649967b9629c67dcfafa40c94d30f990610c33908890869061411c565b60045481565b60055481565b60016121d5826116ad565b60098111156121e057fe5b146121fd5760405162461bcd60e51b81526004016108f59061474c565b600081815260086020908152604080832033808552600d8201909352908320600b5491939092909173ffffffffffffffffffffffffffffffffffffffff169063cbf8eda99061224b86612dcb565b6040518363ffffffff1660e01b8152600401612268929190613fea565b60206040518083038186803b15801561228057600080fd5b505afa158015612294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b89190613e18565b825490915060ff166122dc5760405162461bcd60e51b81526004016108f59061457f565b600282015460ff161561230257600a8301546122f89082612dda565b600a840155612317565b600b8301546123119082612dda565b600b8401555b815460ff199081168355600060018401819055600284018054909216909155604051339186917f12beef84830227673717dd5522ee1228a8004e88dc2678d8740f582264efb2b69190a350505050565b60035481565b600b5474010000000000000000000000000000000000000000900460ff16156123a85760405162461bcd60e51b81526004016108f590614548565b73ffffffffffffffffffffffffffffffffffffffff81166123db5760405162461bcd60e51b81526004016108f590614681565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179190911674010000000000000000000000000000000000000000179055565b600081600010801561247057506007548211155b61248c5760405162461bcd60e51b81526004016108f5906142d6565b60008281526008602052604090206124a390612f77565b92915050565b3330146124fd576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6064811115612553576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b603281116125a8576040805162461bcd60e51b815260206004820152600e60248201527f4d696e696d756d2069732035302e000000000000000000000000000000000000604482015290519081900360640190fd5b600455565b60046125b8826116ad565b60098111156125c357fe5b146125e05760405162461bcd60e51b81526004016108f5906141e5565b600081815260086020819052604082206010810154600f820154600e830154938301549093019092019091016009820181905590915b600483015481101561299857600660006127c285600401848154811061263857fe5b60009182526020909120015460058701805473ffffffffffffffffffffffffffffffffffffffff909216918690811061266d57fe5b906000526020600020015487600601868154811061268757fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127155780601f106126ea57610100808354040283529160200191612715565b820191906000526020600020905b8154815290600101906020018083116126f857829003601f168201915b505050505088600701878154811061272957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127b75780601f1061278c576101008083540402835291602001916127b7565b820191906000526020600020905b81548152906001019060200180831161279a57829003601f168201915b505050505088613194565b815260208101919091526040016000205460ff16156127f35760405162461bcd60e51b81526004016108f5906143b2565b61298f83600401828154811061280557fe5b60009182526020909120015460058501805473ffffffffffffffffffffffffffffffffffffffff909216918490811061283a57fe5b906000526020600020015485600601848154811061285457fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156128e25780601f106128b7576101008083540402835291602001916128e2565b820191906000526020600020905b8154815290600101906020018083116128c557829003601f168201915b50505050508660070185815481106128f657fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156129845780601f1061295957610100808354040283529160200191612984565b820191906000526020600020905b81548152906001019060200180831161296757829003601f168201915b5050505050866132bf565b50600101612616565b50827ff7230a453b4c21e4f2d0ef1ad055635b08cb2c884eaf24a5ddc7147c79fd8c22338360405161169a929190613fea565b6129d4816132f4565b6129f05760405162461bcd60e51b81526004016108f5906145b6565b6129f98161331e565b612a155760405162461bcd60e51b81526004016108f590614242565b6000818152600860205260408120600c8101805460ff19166001179055905b6004820154811015612a5a57612a52826004018281548110610efb57fe5b600101612a34565b50817f253042c67143aeb6d431bb762d75e5905f18fa7850b7b9edb31fedb7c362d7e8336040516110c29190613fc9565b612a93613a03565b50600091825260086020908152604080842073ffffffffffffffffffffffffffffffffffffffff939093168452600d9092018152918190208151606081018352815460ff9081161515825260018301549482019490945260029091015490921615159082015290565b612b04613a03565b50600091825260096020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845260059092018152918190208151606081018352815460ff9081161515825260018301549482019490945260029091015490921615159082015290565b60066020526000908152604090205460ff1681565b612b8b8161341d565b612ba75760405162461bcd60e51b81526004016108f590614783565b6000818152600860205260408120600c810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055905b6004820154811015612d9a57612d91826004018281548110612c0357fe5b60009182526020909120015460058401805473ffffffffffffffffffffffffffffffffffffffff9092169184908110612c3857fe5b9060005260206000200154846006018481548110612c5257fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ce05780601f10612cb557610100808354040283529160200191612ce0565b820191906000526020600020905b815481529060010190602001808311612cc357829003601f168201915b5050505050856007018581548110612cf457fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612d825780601f10612d5757610100808354040283529160200191612d82565b820191906000526020600020905b815481529060010190602001808311612d6557829003601f168201915b5050505050866009015461343c565b50600101612be5565b50817f9c85b616f29fca57a17eafe71cf9ff82ffef41766e2cf01ea7f8f7878dd3ec24336040516110c29190613fc9565b600e8101546008909101540190565b600082821115612e31576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015612e91576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000612ea78686868686613194565b6000908152600660205260409020805460ff19169055505050505050565b6000612f726064600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632139353f6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f3457600080fd5b505afa158015612f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f6c9190613e18565b9061371b565b905090565b6013810154600b546000916124a391606491612f6c9173ffffffffffffffffffffffffffffffffffffffff1663e5190046612fb188612dcb565b6040518263ffffffff1660e01b8152600401612fcd91906147ed565b60206040518083038186803b158015612fe557600080fd5b505afa158015612ff9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301d9190613e18565b90613782565b60006124a36064612f6c84600e016004015485600b015486600a01540161378290919063ffffffff16565b6000818152600860209081526040808320600990925282206001810154158061307a5750816009015442105b1561308a576000925050506117f6565b600b5460018201546040517fe51900460000000000000000000000000000000000000000000000000000000081526131099260029273ffffffffffffffffffffffffffffffffffffffff9091169163e5190046916130f191600019909101906004016147ed565b60206040518083038186803b158015612f3457600080fd5b60039091015410159392505050565b600080613124836116ad565b9050600081600981111561313457fe5b148061314b5750600181600981111561314957fe5b145b806131615750600481600981111561315f57fe5b145b806131775750600581600981111561317557fe5b145b80612e91575060065b81600981111561318c57fe5b149392505050565b60008585858585604051602001808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156132075781810151838201526020016131ef565b50505050905090810190601f1680156132345780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561326757818101518382015260200161324f565b50505050905090810190601f1680156132945780820380516001836020036101000a031916815260200191505b5097505050505050505060405160208183030381529060405280519060200120905095945050505050565b6000806132cf8787878787613194565b6000818152600660205260409020805460ff1916600117905591505095945050505050565b600080613300836116ad565b9050600081600981111561331057fe5b1480612e9157506001613180565b6000818152600860205260408120600181015473ffffffffffffffffffffffffffffffffffffffff163314806134055750613357612ec5565b600b5460018301546040517fc07473f600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169263c07473f6926133b392911690600401613fc9565b60206040518083038186803b1580156133cb57600080fd5b505afa1580156133df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134039190613e18565b105b156134145760019150506117f6565b50600092915050565b6000600661342a836116ad565b600981111561343557fe5b1492915050565b6060600061344d8787878787613194565b90508242101561348e5760405162461bcd60e51b815260040180806020018281038252603b8152602001806148ce603b913960400191505060405180910390fd5b60035483014211156134d15760405162461bcd60e51b81526004018080602001828103825260298152602001806149096029913960400191505060405180910390fd5b6000818152600660205260409020805460ff1916905584516060906134f75750836135ad565b85805190602001208560405160200180837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260040182805190602001908083835b6020831061357557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613538565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff1689846040518082805190602001908083835b6020831061361657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016135d9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613678576040519150601f19603f3d011682016040523d82523d6000602084013e61367d565b606091505b509150915081819061370d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136d25781810151838201526020016136ba565b50505050905090810190601f1680156136ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509998505050505050505050565b6000808211613771576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161377a57fe5b049392505050565b600082613791575060006124a3565b8282028284828161379e57fe5b0414612e915760405162461bcd60e51b81526004018080602001828103825260218152602001806149326021913960400191505060405180910390fd5b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826138115760008555613857565b82601f1061382a57805160ff1916838001178555613857565b82800160010185558215613857579182015b8281111561385757825182559160200191906001019061383c565b50613863929150613a23565b5090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054828255906000526020600020908101928215613857579160200282015b8281111561385757825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906138bd565b828054828255906000526020600020908101928215613857579160200282018281111561385757825182559160200191906001019061383c565b82805482825590600052602060002090810192821561399e579160200282015b8281111561399e578251805161398e9184916020909101906137db565b5091602001919060010190613971565b50613863929150613a38565b8280548282559060005260206000209081019282156139f7579160200282015b828111156139f757825180516139e79184916020909101906137db565b50916020019190600101906139ca565b50613863929150613a55565b604080516060810182526000808252602082018190529181019190915290565b5b808211156138635760008155600101613a24565b80821115613863576000613a4c8282613a72565b50600101613a38565b80821115613863576000613a698282613a72565b50600101613a55565b50805460018160011615610100020316600290046000825580601f10613a985750613ab6565b601f016020900490600052602060002090810190613ab69190613a23565b50565b600067ffffffffffffffff831115613acd57fe5b613afe60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161488b565b9050828152838383011115613b1257600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146117f657600080fd5b600082601f830112613b5d578081fd5b81356020613b72613b6d836148af565b61488b565b8281528181019085830183850287018401881015613b8e578586fd5b855b85811015613bb357613ba182613b29565b84529284019290840190600101613b90565b5090979650505050505050565b600082601f830112613bd0578081fd5b81356020613be0613b6d836148af565b82815281810190858301855b85811015613bb3578135880189603f820112613c06578788fd5b613c178a8783013560408401613ab9565b8552509284019290840190600101613bec565b600082601f830112613c3a578081fd5b81356020613c4a613b6d836148af565b82815281810190858301855b85811015613bb357613c6d898684358b0101613cd9565b84529284019290840190600101613c56565b600082601f830112613c8f578081fd5b81356020613c9f613b6d836148af565b8281528181019085830183850287018401881015613cbb578586fd5b855b85811015613bb357813584529284019290840190600101613cbd565b600082601f830112613ce9578081fd5b612e9183833560208501613ab9565b600060208284031215613d09578081fd5b612e9182613b29565b60008060008060008060c08789031215613d2a578182fd5b863567ffffffffffffffff80821115613d41578384fd5b613d4d8a838b01613b4d565b97506020890135915080821115613d62578384fd5b613d6e8a838b01613c7f565b96506040890135915080821115613d83578384fd5b613d8f8a838b01613c2a565b95506060890135915080821115613da4578384fd5b613db08a838b01613bc0565b94506080890135915080821115613dc5578384fd5b613dd18a838b01613cd9565b935060a0890135915080821115613de6578283fd5b50613df389828a01613cd9565b9150509295509295509295565b600060208284031215613e11578081fd5b5035919050565b600060208284031215613e29578081fd5b5051919050565b60008060408385031215613e42578182fd5b82359150613e5260208401613b29565b90509250929050565b60008060408385031215613e6d578182fd5b8235915060208301358015158114613e83578182fd5b809150509250929050565b60008060408385031215613ea0578182fd5b82359150602083013567ffffffffffffffff811115613ebd578182fd5b613ec985828601613cd9565b9150509250929050565b6000815180845260208085018081965082840281019150828601855b85811015613f19578284038952613f07848351613f26565b98850198935090840190600101613eef565b5091979650505050505050565b60008151808452815b81811015613f4b57602081850181015186830182015201613f2f565b81811115613f5c5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8716825285602083015260a0604083015261404560a0830186613f26565b606083019490945250608001529392505050565b6080808252855190820181905260009060209060a0840190828901845b828110156140a857815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101614076565b50505083810382850152865180825287830191830190845b818110156140dc578351835292840192918401916001016140c0565b505084810360408601526140f08188613ed3565b9250505082810360608401526141068185613ed3565b979650505050505050565b901515815260200190565b9115158252602082015260400190565b60208101600a831061413a57fe5b91905290565b60208082526012908201527f44414f206e6f7420796574206163746976650000000000000000000000000000604082015260600190565b6020808252601a908201527f6465736372697074696f6e2063616e277420626520656d707479000000000000604082015260600190565b6020808252600f908201527f6e6f20766f74696e6720706f7765720000000000000000000000000000000000604082015260600190565b6020808252602e908201527f50726f706f73616c2063616e206f6e6c7920626520717565756564206966206960408201527f7420697320737563636565646564000000000000000000000000000000000000606082015260800190565b60208082526021908201527f43616e63656c6c6174696f6e20726571756972656d656e7473206e6f74206d6560408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f44414f20616c7265616479206163746976650000000000000000000000000000604082015260600190565b60208082526013908201527f696e76616c69642070726f706f73616c20696400000000000000000000000000604082015260600190565b60208082526019908201527f50726f706f73616c206d75737420626520696e20717565756500000000000000604082015260600190565b6020808252601a908201527f4372656174696f6e207468726573686f6c64206e6f74206d6574000000000000604082015260600190565b60208082526015908201527f5468726573686f6c64206e6f74206d6574207965740000000000000000000000604082015260600190565b60208082526025908201527f70726f706f73616c20616374696f6e20616c726561647920717565756564206160408201527f7420657461000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f7469746c652063616e277420626520656d707479000000000000000000000000604082015260600190565b6020808252601e908201527f4162726f676174696f6e2050726f706f73616c206e6f74206163746976650000604082015260600190565b60208082526013908201527f43616e6e6f74206265206162726f676174656400000000000000000000000000604082015260600190565b6020808252601e908201527f4f6e65206c6976652070726f706f73616c207065722070726f706f7365720000604082015260600190565b60208082526022908201527f4162726f676174696f6e2070726f706f73616c20616c7265616479206578697360408201527f7473000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f436f6e747261637420616c726561647920696e697469616c697a65642e000000604082015260600190565b6020808252601e908201527f43616e6e6f742063616e63656c206966206e6f7420766f746564207965740000604082015260600190565b60208082526032908201527f50726f706f73616c20696e207374617465207468617420646f6573206e6f742060408201527f616c6c6f772063616e63656c6c6174696f6e0000000000000000000000000000606082015260800190565b60208082526014908201527f4d7573742070726f7669646520616374696f6e73000000000000000000000000604082015260600190565b6020808252601a908201527f546f6f206d616e7920616374696f6e73206f6e206120766f7465000000000000604082015260600190565b60208082526019908201527f73757065726e6f7661206d757374206e6f742062652030783000000000000000604082015260600190565b60208082526019908201527f416c726561647920766f7465642074686973206f7074696f6e00000000000000604082015260600190565b6020808252602c908201527f50726f706f73616c2066756e6374696f6e20696e666f726d6174696f6e20617260408201527f697479206d69736d617463680000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f566f74696e6720697320636c6f73656400000000000000000000000000000000604082015260600190565b60208082526012908201527f43616e6e6f742062652065786563757465640000000000000000000000000000604082015260600190565b60c081016124a38284613f8f565b8151151581526020808301519082015260409182015115159181019190915260600190565b90815260200190565b60006102008d835273ffffffffffffffffffffffffffffffffffffffff8d16602084015280604084015261482c8184018d613f26565b90508281036060840152614840818c613f26565b9150508860808301528760a08301528660c08301528560e083015284151561010083015283151561012083015261487b610140830184613f8f565b9c9b505050505050505050505050565b60405181810167ffffffffffffffff811182821017156148a757fe5b604052919050565b600067ffffffffffffffff8211156148c357fe5b506020908102019056fe657865637574655472616e73616374696f6e3a205472616e73616374696f6e206861736e2774207375727061737365642074696d65206c6f636b2e657865637574655472616e73616374696f6e3a205472616e73616374696f6e206973207374616c652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220aedc1117df8a9a88ae6cd920d906ce9db5260ae69cb9c20fd53f95741aa0ba3564736f6c63430007060033

Deployed Bytecode

0x6080604052600436106102535760003560e01c80635f2e9f6011610138578063c4d66de8116100b0578063e0a8f6f51161007f578063e4e2d26111610064578063e4e2d261146106a0578063f2b06537146106c0578063fe0d94c1146106e05761025a565b8063e0a8f6f514610653578063e23a9a52146106735761025a565b8063c4d66de8146105d3578063d0cd595e146105f3578063d1291f1914610613578063ddf0b009146106335761025a565b80639e70a23411610107578063b5a127e5116100ec578063b5a127e514610589578063bacbe2da1461059e578063c099f575146105be5761025a565b80639e70a23414610554578063b0edbb9b146105745761025a565b80635f2e9f60146104d957806374cb3041146104ee5780638b787e3014610503578063984690db146105345761025a565b8063328dd982116101cb5780633e4f49e61161019a578063490145c81161017f578063490145c81461047957806353e5056a14610499578063563909de146104b95761025a565b80633e4f49e61461041f578063458921551461044c5761025a565b8063328dd9821461039a578063342d067a146103ca57806339e778ee146103ea5780633d05f0091461040a5761025a565b80631e9d1e641161022257806324b437871161020757806324b437871461034557806324cd62d3146103655780632e8e34e1146103855761025a565b80631e9d1e641461030357806322f3e2d4146103235761025a565b8063013cf08b1461025f5780630f15f4c01461029f57806315373e3d146102b657806317977c61146102d65761025a565b3661025a57005b600080fd5b34801561026b57600080fd5b5061027f61027a366004613e00565b6106f3565b6040516102969b9a999897969594939291906147f6565b60405180910390f35b3480156102ab57600080fd5b506102b46108b9565b005b3480156102c257600080fd5b506102b46102d1366004613e5b565b610a0b565b3480156102e257600080fd5b506102f66102f1366004613cf8565b610c42565b60405161029691906147ed565b34801561030f57600080fd5b506102b461031e366004613e00565b610c54565b34801561032f57600080fd5b50610338610e43565b6040516102969190614111565b34801561035157600080fd5b506102b4610360366004613e00565b610e65565b34801561037157600080fd5b506102b4610380366004613e00565b6110ce565b34801561039157600080fd5b506102f661117e565b3480156103a657600080fd5b506103ba6103b5366004613e00565b611184565b6040516102969493929190614059565b3480156103d657600080fd5b506102b46103e5366004613e00565b611420565b3480156103f657600080fd5b506102b4610405366004613e8e565b6114d0565b34801561041657600080fd5b506102f66116a7565b34801561042b57600080fd5b5061043f61043a366004613e00565b6116ad565b604051610296919061412c565b34801561045857600080fd5b5061046c610467366004613e00565b6117fb565b60405161029691906147ba565b34801561048557600080fd5b506102f6610494366004613d12565b61185f565b3480156104a557600080fd5b506102b46104b4366004613e00565b611cac565b3480156104c557600080fd5b506102b46104d4366004613e00565b611d05565b3480156104e557600080fd5b506102f6611e09565b3480156104fa57600080fd5b506102f6611e0f565b34801561050f57600080fd5b5061052361051e366004613e00565b611e15565b604051610296959493929190614010565b34801561054057600080fd5b506102b461054f366004613e00565b611ee4565b34801561056057600080fd5b506102b461056f366004613e5b565b611f3d565b34801561058057600080fd5b506102f66121be565b34801561059557600080fd5b506102f66121c4565b3480156105aa57600080fd5b506102b46105b9366004613e00565b6121ca565b3480156105ca57600080fd5b506102f6612367565b3480156105df57600080fd5b506102b46105ee366004613cf8565b61236d565b3480156105ff57600080fd5b506102f661060e366004613e00565b61245c565b34801561061f57600080fd5b506102b461062e366004613e00565b6124a9565b34801561063f57600080fd5b506102b461064e366004613e00565b6125ad565b34801561065f57600080fd5b506102b461066e366004613e00565b6129cb565b34801561067f57600080fd5b5061069361068e366004613e30565b612a8b565b60405161029691906147c8565b3480156106ac57600080fd5b506106936106bb366004613e30565b612afc565b3480156106cc57600080fd5b506103386106db366004613e00565b612b6d565b6102b46106ee366004613e00565b612b82565b60086020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f8101879004870284018701909752868352929573ffffffffffffffffffffffffffffffffffffffff909116949192918301828280156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505060038301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505060088401546009850154600a860154600b870154600c8801546040805160c081018252600e8b01548152600f8b0154602082015260108b01549181019190915260118a0154606082015260128a0154608082015260139099015460a08a0152969793969295509093509160ff80831692610100900416908b565b600b547501000000000000000000000000000000000000000000900460ff16156108fe5760405162461bcd60e51b81526004016108f59061429f565b60405180910390fd5b600b54604080517f2139353f00000000000000000000000000000000000000000000000000000000815290516a295be96e640669720000009273ffffffffffffffffffffffffffffffffffffffff1691632139353f916004808301926020929190829003018186803b15801561097357600080fd5b505afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190613e18565b10156109c95760405162461bcd60e51b81526004016108f59061437b565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6001610a16836116ad565b6009811115610a2157fe5b14610a3e5760405162461bcd60e51b81526004016108f59061474c565b6000828152600860209081526040808320338452600d8101909252909120805460ff161580610a845750805460ff168015610a845750600281015460ff16151583151514155b610aa05760405162461bcd60e51b81526004016108f5906146b8565b600b5460009073ffffffffffffffffffffffffffffffffffffffff1663cbf8eda933610acb86612dcb565b6040518363ffffffff1660e01b8152600401610ae8929190613fea565b60206040518083038186803b158015610b0057600080fd5b505afa158015610b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b389190613e18565b905060008111610b5a5760405162461bcd60e51b81526004016108f5906141ae565b815460ff1615610ba757600282015460ff1615610b8e576001820154600a840154610b8491612dda565b600a840155610ba7565b6001820154600b840154610ba191612dda565b600b8401555b8315610bc657600a830154610bbc9082612e37565b600a840155610bdb565b600b830154610bd59082612e37565b600b8401555b8154600160ff19918216811784558301829055600283018054909116851515179055604051339086907f88d35328232823f54954b6627e9f732371656f6daa40cb1b01b27dc7875a7b4790610c33908890869061411c565b60405180910390a35050505050565b600a6020526000908152604090205481565b806000108015610c6657506007548111155b610c825760405162461bcd60e51b81526004016108f5906142d6565b60008181526009602090815260408083203384526005808201909352922090610caa846116ad565b6009811115610cb557fe5b148015610cc55750600182015415155b610ce15760405162461bcd60e51b81526004016108f590614446565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda991610d4491339160001990910190600401613fea565b60206040518083038186803b158015610d5c57600080fd5b505afa158015610d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d949190613e18565b825490915060ff16610db85760405162461bcd60e51b81526004016108f59061457f565b600282015460ff1615610dde576003830154610dd49082612dda565b6003840155610df3565b6004830154610ded9082612dda565b60048401555b815460ff199081168355600060018401819055600284018054909216909155604051339186917f5e8ee24f838173ed2ae7989835696f6e11945ac8fbc5259aef01cc4d7f0d49209190a350505050565b600b547501000000000000000000000000000000000000000000900460ff1681565b6009610e70826116ad565b6009811115610e7b57fe5b14610e985760405162461bcd60e51b81526004016108f59061447d565b6000818152600860205260409020600c81015460ff1615610ecb5760405162461bcd60e51b81526004016108f59061447d565b600c8101805460ff1916600117905560005b600482015481101561109157611089826004018281548110610efb57fe5b60009182526020909120015460058401805473ffffffffffffffffffffffffffffffffffffffff9092169184908110610f3057fe5b9060005260206000200154846006018481548110610f4a57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610fd85780601f10610fad57610100808354040283529160200191610fd8565b820191906000526020600020905b815481529060010190602001808311610fbb57829003601f168201915b5050505050856007018581548110610fec57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561107a5780601f1061104f5761010080835404028352916020019161107a565b820191906000526020600020905b81548152906001019060200180831161105d57829003601f168201915b50505050508660090154612e98565b600101610edd565b50817f6d7acd63bebeaf524f1761a88687951f776fc7c182205f820424c7fb572c7235336040516110c29190613fc9565b60405180910390a25050565b333014611122576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b613840811015611179576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600155565b60025481565b6060806060806000600860008781526020019081526020016000209050806004018160050182600601836007018380548060200260200160405190810160405280929190818152602001828054801561121357602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111e8575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561126557602002820191906000526020600020905b815481526020019060010190808311611251575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b828210156113385760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113245780601f106112f957610100808354040283529160200191611324565b820191906000526020600020905b81548152906001019060200180831161130757829003601f168201915b50505050508152602001906001019061128d565b50505050915080805480602002602001604051908101604052809291908181526020016000905b8282101561140a5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113f65780601f106113cb576101008083540402835291602001916113f6565b820191906000526020600020905b8154815290600101906020018083116113d957829003601f168201915b50505050508152602001906001019061135f565b5050505090509450945094509450509193509193565b333014611474576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6138408110156114cb576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600355565b60056114db836116ad565b60098111156114e657fe5b146115035760405162461bcd60e51b81526004016108f59061430d565b61150b612ec5565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda990611567903390600019420190600401613fea565b60206040518083038186803b15801561157f57600080fd5b505afa158015611593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b79190613e18565b10156115d55760405162461bcd60e51b81526004016108f590614344565b60008281526009602052604090206001810154156116055760405162461bcd60e51b81526004016108f5906144eb565b60008251116116265760405162461bcd60e51b81526004016108f590614177565b42600182015580547fffffffffffffffffffffffff00000000000000000000000000000000000000001633178155815161166990600283019060208501906137db565b50827f27eba018e1c52b84f732fe4d806fd9750c60752f1d37e7f70bcb4cbec65b1c6a3360405161169a9190613fc9565b60405180910390a2505050565b60015481565b60008160001080156116c157506007548211155b6116dd5760405162461bcd60e51b81526004016108f5906142d6565b6000828152600860205260409020600c81015460ff16156117025760029150506117f6565b600c810154610100900460ff161561171e5760089150506117f6565b600e81015460088201540142116117395760009150506117f6565b600f810154600e82015460088301540101421161175a5760019150506117f6565b61176381612f77565b81600b015482600a0154011080611785575061177e81613023565b81600a0154105b156117945760039150506117f6565b60098101546117a75760049150506117f6565b80600901544210156117bd5760059150506117f6565b6117c68361304e565b156117d55760099150506117f6565b601181015460098201540142116117f05760069150506117f6565b60079150505b919050565b611803613867565b50600090815260086020908152604091829020825160c081018452600e8201548152600f82015492810192909252601081015492820192909252601182015460608201526012820154608082015260139091015460a082015290565b600b546000907501000000000000000000000000000000000000000000900460ff1661199157600b54604080517f2139353f00000000000000000000000000000000000000000000000000000000815290516a295be96e640669720000009273ffffffffffffffffffffffffffffffffffffffff1691632139353f916004808301926020929190829003018186803b1580156118fa57600080fd5b505afa15801561190e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119329190613e18565b10156119505760405162461bcd60e51b81526004016108f590614140565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b611999612ec5565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda9906119f5903390600019420190600401613fea565b60206040518083038186803b158015611a0d57600080fd5b505afa158015611a21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a459190613e18565b1015611a635760405162461bcd60e51b81526004016108f590614344565b85518751148015611a75575084518751145b8015611a82575083518751145b611a9e5760405162461bcd60e51b81526004016108f5906146ef565b8651611abc5760405162461bcd60e51b81526004016108f590614613565b600a87511115611ade5760405162461bcd60e51b81526004016108f59061464a565b6000825111611aff5760405162461bcd60e51b81526004016108f59061440f565b6000835111611b205760405162461bcd60e51b81526004016108f590614177565b336000908152600a60205260409020548015611b5c57611b3f81613118565b15611b5c5760405162461bcd60e51b81526004016108f5906144b4565b6007546001908101600081815260086020908152604090912082815592830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790558651919291611bba916002840191908901906137db565b508451611bd090600383019060208801906137db565b508951611be690600483019060208d019061389d565b508851611bfc90600583019060208c0190613917565b508751611c1290600683019060208b0190613951565b508651611c2890600783019060208a01906139aa565b506000194201600882015560008054600e830155600154600f83015560025460108301556003546011830155600454601283015560055460138301556007839055338152600a60205260408082208490555183917fc2c021f5d73c63c481d336fbbafec58f694fc45095f00b02d2deb8cca59afe0791a25098975050505050505050565b333014611d00576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600255565b333014611d59576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b60058111611dae576040805162461bcd60e51b815260206004820152601d60248201527f71756f72756d206d7573742062652067726561746572207468616e2035000000604482015290519081900360640190fd5b6064811115611e04576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b600555565b60005481565b60075481565b60096020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f810187900487028401870190975286835273ffffffffffffffffffffffffffffffffffffffff909316959094919291830182828015611ece5780601f10611ea357610100808354040283529160200191611ece565b820191906000526020600020905b815481529060010190602001808311611eb157829003601f168201915b5050505050908060030154908060040154905085565b333014611f38576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600055565b816000108015611f4f57506007548211155b611f6b5760405162461bcd60e51b81526004016108f5906142d6565b60008281526009602052604090206005611f84846116ad565b6009811115611f8f57fe5b148015611f9f5750600181015415155b611fbb5760405162461bcd60e51b81526004016108f590614446565b3360009081526005820160205260409020805460ff161580611ff45750805460ff168015611ff45750600281015460ff16151583151514155b6120105760405162461bcd60e51b81526004016108f5906146b8565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda99161207391339160001990910190600401613fea565b60206040518083038186803b15801561208b57600080fd5b505afa15801561209f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c39190613e18565b9050600081116120e55760405162461bcd60e51b81526004016108f5906141ae565b815460ff161561213257600282015460ff1615612119576001820154600384015461210f91612dda565b6003840155612132565b6001820154600484015461212c91612dda565b60048401555b83156121515760038301546121479082612e37565b6003840155612166565b60048301546121609082612e37565b60048401555b8154600160ff19918216811784558301829055600283018054909116851515179055604051339086907f80f2ad7e3e83d197670402663f224adb2f649967b9629c67dcfafa40c94d30f990610c33908890869061411c565b60045481565b60055481565b60016121d5826116ad565b60098111156121e057fe5b146121fd5760405162461bcd60e51b81526004016108f59061474c565b600081815260086020908152604080832033808552600d8201909352908320600b5491939092909173ffffffffffffffffffffffffffffffffffffffff169063cbf8eda99061224b86612dcb565b6040518363ffffffff1660e01b8152600401612268929190613fea565b60206040518083038186803b15801561228057600080fd5b505afa158015612294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b89190613e18565b825490915060ff166122dc5760405162461bcd60e51b81526004016108f59061457f565b600282015460ff161561230257600a8301546122f89082612dda565b600a840155612317565b600b8301546123119082612dda565b600b8401555b815460ff199081168355600060018401819055600284018054909216909155604051339186917f12beef84830227673717dd5522ee1228a8004e88dc2678d8740f582264efb2b69190a350505050565b60035481565b600b5474010000000000000000000000000000000000000000900460ff16156123a85760405162461bcd60e51b81526004016108f590614548565b73ffffffffffffffffffffffffffffffffffffffff81166123db5760405162461bcd60e51b81526004016108f590614681565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179190911674010000000000000000000000000000000000000000179055565b600081600010801561247057506007548211155b61248c5760405162461bcd60e51b81526004016108f5906142d6565b60008281526008602052604090206124a390612f77565b92915050565b3330146124fd576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6064811115612553576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b603281116125a8576040805162461bcd60e51b815260206004820152600e60248201527f4d696e696d756d2069732035302e000000000000000000000000000000000000604482015290519081900360640190fd5b600455565b60046125b8826116ad565b60098111156125c357fe5b146125e05760405162461bcd60e51b81526004016108f5906141e5565b600081815260086020819052604082206010810154600f820154600e830154938301549093019092019091016009820181905590915b600483015481101561299857600660006127c285600401848154811061263857fe5b60009182526020909120015460058701805473ffffffffffffffffffffffffffffffffffffffff909216918690811061266d57fe5b906000526020600020015487600601868154811061268757fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127155780601f106126ea57610100808354040283529160200191612715565b820191906000526020600020905b8154815290600101906020018083116126f857829003601f168201915b505050505088600701878154811061272957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127b75780601f1061278c576101008083540402835291602001916127b7565b820191906000526020600020905b81548152906001019060200180831161279a57829003601f168201915b505050505088613194565b815260208101919091526040016000205460ff16156127f35760405162461bcd60e51b81526004016108f5906143b2565b61298f83600401828154811061280557fe5b60009182526020909120015460058501805473ffffffffffffffffffffffffffffffffffffffff909216918490811061283a57fe5b906000526020600020015485600601848154811061285457fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156128e25780601f106128b7576101008083540402835291602001916128e2565b820191906000526020600020905b8154815290600101906020018083116128c557829003601f168201915b50505050508660070185815481106128f657fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156129845780601f1061295957610100808354040283529160200191612984565b820191906000526020600020905b81548152906001019060200180831161296757829003601f168201915b5050505050866132bf565b50600101612616565b50827ff7230a453b4c21e4f2d0ef1ad055635b08cb2c884eaf24a5ddc7147c79fd8c22338360405161169a929190613fea565b6129d4816132f4565b6129f05760405162461bcd60e51b81526004016108f5906145b6565b6129f98161331e565b612a155760405162461bcd60e51b81526004016108f590614242565b6000818152600860205260408120600c8101805460ff19166001179055905b6004820154811015612a5a57612a52826004018281548110610efb57fe5b600101612a34565b50817f253042c67143aeb6d431bb762d75e5905f18fa7850b7b9edb31fedb7c362d7e8336040516110c29190613fc9565b612a93613a03565b50600091825260086020908152604080842073ffffffffffffffffffffffffffffffffffffffff939093168452600d9092018152918190208151606081018352815460ff9081161515825260018301549482019490945260029091015490921615159082015290565b612b04613a03565b50600091825260096020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845260059092018152918190208151606081018352815460ff9081161515825260018301549482019490945260029091015490921615159082015290565b60066020526000908152604090205460ff1681565b612b8b8161341d565b612ba75760405162461bcd60e51b81526004016108f590614783565b6000818152600860205260408120600c810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055905b6004820154811015612d9a57612d91826004018281548110612c0357fe5b60009182526020909120015460058401805473ffffffffffffffffffffffffffffffffffffffff9092169184908110612c3857fe5b9060005260206000200154846006018481548110612c5257fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ce05780601f10612cb557610100808354040283529160200191612ce0565b820191906000526020600020905b815481529060010190602001808311612cc357829003601f168201915b5050505050856007018581548110612cf457fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612d825780601f10612d5757610100808354040283529160200191612d82565b820191906000526020600020905b815481529060010190602001808311612d6557829003601f168201915b5050505050866009015461343c565b50600101612be5565b50817f9c85b616f29fca57a17eafe71cf9ff82ffef41766e2cf01ea7f8f7878dd3ec24336040516110c29190613fc9565b600e8101546008909101540190565b600082821115612e31576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015612e91576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000612ea78686868686613194565b6000908152600660205260409020805460ff19169055505050505050565b6000612f726064600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632139353f6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f3457600080fd5b505afa158015612f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f6c9190613e18565b9061371b565b905090565b6013810154600b546000916124a391606491612f6c9173ffffffffffffffffffffffffffffffffffffffff1663e5190046612fb188612dcb565b6040518263ffffffff1660e01b8152600401612fcd91906147ed565b60206040518083038186803b158015612fe557600080fd5b505afa158015612ff9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301d9190613e18565b90613782565b60006124a36064612f6c84600e016004015485600b015486600a01540161378290919063ffffffff16565b6000818152600860209081526040808320600990925282206001810154158061307a5750816009015442105b1561308a576000925050506117f6565b600b5460018201546040517fe51900460000000000000000000000000000000000000000000000000000000081526131099260029273ffffffffffffffffffffffffffffffffffffffff9091169163e5190046916130f191600019909101906004016147ed565b60206040518083038186803b158015612f3457600080fd5b60039091015410159392505050565b600080613124836116ad565b9050600081600981111561313457fe5b148061314b5750600181600981111561314957fe5b145b806131615750600481600981111561315f57fe5b145b806131775750600581600981111561317557fe5b145b80612e91575060065b81600981111561318c57fe5b149392505050565b60008585858585604051602001808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156132075781810151838201526020016131ef565b50505050905090810190601f1680156132345780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561326757818101518382015260200161324f565b50505050905090810190601f1680156132945780820380516001836020036101000a031916815260200191505b5097505050505050505060405160208183030381529060405280519060200120905095945050505050565b6000806132cf8787878787613194565b6000818152600660205260409020805460ff1916600117905591505095945050505050565b600080613300836116ad565b9050600081600981111561331057fe5b1480612e9157506001613180565b6000818152600860205260408120600181015473ffffffffffffffffffffffffffffffffffffffff163314806134055750613357612ec5565b600b5460018301546040517fc07473f600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169263c07473f6926133b392911690600401613fc9565b60206040518083038186803b1580156133cb57600080fd5b505afa1580156133df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134039190613e18565b105b156134145760019150506117f6565b50600092915050565b6000600661342a836116ad565b600981111561343557fe5b1492915050565b6060600061344d8787878787613194565b90508242101561348e5760405162461bcd60e51b815260040180806020018281038252603b8152602001806148ce603b913960400191505060405180910390fd5b60035483014211156134d15760405162461bcd60e51b81526004018080602001828103825260298152602001806149096029913960400191505060405180910390fd5b6000818152600660205260409020805460ff1916905584516060906134f75750836135ad565b85805190602001208560405160200180837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260040182805190602001908083835b6020831061357557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613538565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff1689846040518082805190602001908083835b6020831061361657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016135d9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613678576040519150601f19603f3d011682016040523d82523d6000602084013e61367d565b606091505b509150915081819061370d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136d25781810151838201526020016136ba565b50505050905090810190601f1680156136ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509998505050505050505050565b6000808211613771576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161377a57fe5b049392505050565b600082613791575060006124a3565b8282028284828161379e57fe5b0414612e915760405162461bcd60e51b81526004018080602001828103825260218152602001806149326021913960400191505060405180910390fd5b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826138115760008555613857565b82601f1061382a57805160ff1916838001178555613857565b82800160010185558215613857579182015b8281111561385757825182559160200191906001019061383c565b50613863929150613a23565b5090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054828255906000526020600020908101928215613857579160200282015b8281111561385757825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906138bd565b828054828255906000526020600020908101928215613857579160200282018281111561385757825182559160200191906001019061383c565b82805482825590600052602060002090810192821561399e579160200282015b8281111561399e578251805161398e9184916020909101906137db565b5091602001919060010190613971565b50613863929150613a38565b8280548282559060005260206000209081019282156139f7579160200282015b828111156139f757825180516139e79184916020909101906137db565b50916020019190600101906139ca565b50613863929150613a55565b604080516060810182526000808252602082018190529181019190915290565b5b808211156138635760008155600101613a24565b80821115613863576000613a4c8282613a72565b50600101613a38565b80821115613863576000613a698282613a72565b50600101613a55565b50805460018160011615610100020316600290046000825580601f10613a985750613ab6565b601f016020900490600052602060002090810190613ab69190613a23565b50565b600067ffffffffffffffff831115613acd57fe5b613afe60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161488b565b9050828152838383011115613b1257600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146117f657600080fd5b600082601f830112613b5d578081fd5b81356020613b72613b6d836148af565b61488b565b8281528181019085830183850287018401881015613b8e578586fd5b855b85811015613bb357613ba182613b29565b84529284019290840190600101613b90565b5090979650505050505050565b600082601f830112613bd0578081fd5b81356020613be0613b6d836148af565b82815281810190858301855b85811015613bb3578135880189603f820112613c06578788fd5b613c178a8783013560408401613ab9565b8552509284019290840190600101613bec565b600082601f830112613c3a578081fd5b81356020613c4a613b6d836148af565b82815281810190858301855b85811015613bb357613c6d898684358b0101613cd9565b84529284019290840190600101613c56565b600082601f830112613c8f578081fd5b81356020613c9f613b6d836148af565b8281528181019085830183850287018401881015613cbb578586fd5b855b85811015613bb357813584529284019290840190600101613cbd565b600082601f830112613ce9578081fd5b612e9183833560208501613ab9565b600060208284031215613d09578081fd5b612e9182613b29565b60008060008060008060c08789031215613d2a578182fd5b863567ffffffffffffffff80821115613d41578384fd5b613d4d8a838b01613b4d565b97506020890135915080821115613d62578384fd5b613d6e8a838b01613c7f565b96506040890135915080821115613d83578384fd5b613d8f8a838b01613c2a565b95506060890135915080821115613da4578384fd5b613db08a838b01613bc0565b94506080890135915080821115613dc5578384fd5b613dd18a838b01613cd9565b935060a0890135915080821115613de6578283fd5b50613df389828a01613cd9565b9150509295509295509295565b600060208284031215613e11578081fd5b5035919050565b600060208284031215613e29578081fd5b5051919050565b60008060408385031215613e42578182fd5b82359150613e5260208401613b29565b90509250929050565b60008060408385031215613e6d578182fd5b8235915060208301358015158114613e83578182fd5b809150509250929050565b60008060408385031215613ea0578182fd5b82359150602083013567ffffffffffffffff811115613ebd578182fd5b613ec985828601613cd9565b9150509250929050565b6000815180845260208085018081965082840281019150828601855b85811015613f19578284038952613f07848351613f26565b98850198935090840190600101613eef565b5091979650505050505050565b60008151808452815b81811015613f4b57602081850181015186830182015201613f2f565b81811115613f5c5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8716825285602083015260a0604083015261404560a0830186613f26565b606083019490945250608001529392505050565b6080808252855190820181905260009060209060a0840190828901845b828110156140a857815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101614076565b50505083810382850152865180825287830191830190845b818110156140dc578351835292840192918401916001016140c0565b505084810360408601526140f08188613ed3565b9250505082810360608401526141068185613ed3565b979650505050505050565b901515815260200190565b9115158252602082015260400190565b60208101600a831061413a57fe5b91905290565b60208082526012908201527f44414f206e6f7420796574206163746976650000000000000000000000000000604082015260600190565b6020808252601a908201527f6465736372697074696f6e2063616e277420626520656d707479000000000000604082015260600190565b6020808252600f908201527f6e6f20766f74696e6720706f7765720000000000000000000000000000000000604082015260600190565b6020808252602e908201527f50726f706f73616c2063616e206f6e6c7920626520717565756564206966206960408201527f7420697320737563636565646564000000000000000000000000000000000000606082015260800190565b60208082526021908201527f43616e63656c6c6174696f6e20726571756972656d656e7473206e6f74206d6560408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f44414f20616c7265616479206163746976650000000000000000000000000000604082015260600190565b60208082526013908201527f696e76616c69642070726f706f73616c20696400000000000000000000000000604082015260600190565b60208082526019908201527f50726f706f73616c206d75737420626520696e20717565756500000000000000604082015260600190565b6020808252601a908201527f4372656174696f6e207468726573686f6c64206e6f74206d6574000000000000604082015260600190565b60208082526015908201527f5468726573686f6c64206e6f74206d6574207965740000000000000000000000604082015260600190565b60208082526025908201527f70726f706f73616c20616374696f6e20616c726561647920717565756564206160408201527f7420657461000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f7469746c652063616e277420626520656d707479000000000000000000000000604082015260600190565b6020808252601e908201527f4162726f676174696f6e2050726f706f73616c206e6f74206163746976650000604082015260600190565b60208082526013908201527f43616e6e6f74206265206162726f676174656400000000000000000000000000604082015260600190565b6020808252601e908201527f4f6e65206c6976652070726f706f73616c207065722070726f706f7365720000604082015260600190565b60208082526022908201527f4162726f676174696f6e2070726f706f73616c20616c7265616479206578697360408201527f7473000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f436f6e747261637420616c726561647920696e697469616c697a65642e000000604082015260600190565b6020808252601e908201527f43616e6e6f742063616e63656c206966206e6f7420766f746564207965740000604082015260600190565b60208082526032908201527f50726f706f73616c20696e207374617465207468617420646f6573206e6f742060408201527f616c6c6f772063616e63656c6c6174696f6e0000000000000000000000000000606082015260800190565b60208082526014908201527f4d7573742070726f7669646520616374696f6e73000000000000000000000000604082015260600190565b6020808252601a908201527f546f6f206d616e7920616374696f6e73206f6e206120766f7465000000000000604082015260600190565b60208082526019908201527f73757065726e6f7661206d757374206e6f742062652030783000000000000000604082015260600190565b60208082526019908201527f416c726561647920766f7465642074686973206f7074696f6e00000000000000604082015260600190565b6020808252602c908201527f50726f706f73616c2066756e6374696f6e20696e666f726d6174696f6e20617260408201527f697479206d69736d617463680000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f566f74696e6720697320636c6f73656400000000000000000000000000000000604082015260600190565b60208082526012908201527f43616e6e6f742062652065786563757465640000000000000000000000000000604082015260600190565b60c081016124a38284613f8f565b8151151581526020808301519082015260409182015115159181019190915260600190565b90815260200190565b60006102008d835273ffffffffffffffffffffffffffffffffffffffff8d16602084015280604084015261482c8184018d613f26565b90508281036060840152614840818c613f26565b9150508860808301528760a08301528660c08301528560e083015284151561010083015283151561012083015261487b610140830184613f8f565b9c9b505050505050505050505050565b60405181810167ffffffffffffffff811182821017156148a757fe5b604052919050565b600067ffffffffffffffff8211156148c357fe5b506020908102019056fe657865637574655472616e73616374696f6e3a205472616e73616374696f6e206861736e2774207375727061737365642074696d65206c6f636b2e657865637574655472616e73616374696f6e3a205472616e73616374696f6e206973207374616c652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220aedc1117df8a9a88ae6cd920d906ce9db5260ae69cb9c20fd53f95741aa0ba3564736f6c63430007060033

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  ]
[ 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.