false
true
0

Contract Address Details

0x1995BF10BE3D98136c853294f7434650E2138C55

Contract Name
DssGov
Creator
0xbcaee0–64cea5 at 0x1d6370–cb35bd
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
253 Transactions
Transfers
106 Transfers
Gas Used
151,592,734
Last Balance Update
25961537
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
DssGov




Optimization enabled
true
Compiler version
v0.8.28+commit.7893614a




Optimization runs
200
EVM Version
paris




Verified at
2026-02-15T09:53:06.649489Z

Constructor Arguments

0x00000000000000000000000036d8c21602ada33ab50070214c6e9e24be0ab97e000000000000000000000000c8c136a42ba279df2637686e5e59789674048fbe

Arg [0] (address) : 0x36d8c21602ada33ab50070214c6e9e24be0ab97e
Arg [1] (address) : 0xc8c136a42ba279df2637686e5e59789674048fbe

              

contracts/dss/DssGov.sol

// SPDX-License-Identifier: AGPL-3.0-or-later

/// DssGov.sol -- Modernized Governance Contract

// Copyright (C) 2020 Maker Ecosystem Growth Holdings, INC.
// Modernized for Solidity ^0.8.20
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

pragma solidity ^0.8.20;

interface TokenLike {
    function transferFrom(address, address, uint256) external;
    function transfer(address, uint256) external;
}

interface MintableTokenLike {
    function mint(address, uint256) external;
    function burn(address, uint256) external;
}

interface ExecLike {
    function delay() external view returns (uint256);
    function drop(address) external;
    function exec(address) external;
    function plot(address) external;
}

contract DssGov {

    /*** Structs ***/
    struct Proposal {
        uint256 blockNum;
        uint256 end;
        address exec;
        address action;
        uint256 totActive;
        uint256 totVotes;
        uint256 status;
        mapping(address => uint256) votes;
    }

    struct User {
        uint256                      deposit;            
        address                      delegate;           
        uint256                      rights;             
        uint256                      active;             
        uint256                      lastActivity;       
        uint256                      proposalUnlockTime; 
        uint256                      voteUnlockTime;     
        uint256                      numSnapshots;       
        mapping(uint256 => Snapshot) snapshots;          
        mapping(bytes32 => uint256)  gasOwners;          
    }

    struct Proposer {
        uint256 allowed;  
        uint256 lastDay;  
        uint256 count;    
    }

    struct Snapshot {
        uint256 fromBlock;
        uint256 rights;
    }

    /*** Storage ***/
    mapping(address => uint256)  public           wards;         
    uint256                      public           live;          
    TokenLike                    public immutable govToken;      
    MintableTokenLike            public immutable iouToken;      
    uint256[]                    public           gasStorage;    
    uint256                      public           totActive;     
    uint256                      public           numProposals;  
    mapping(uint256 => Proposal) public           proposals;     
    mapping(address => Proposer) public           proposers;     
    mapping(address => User)     public           users;         

    /*** Governance Params */
    uint256 public rightsLifetime;       
    uint256 public delegationLifetime;   
    uint256 public proposalLockDuration; 
    uint256 public voteLockDuration;     
    uint256 public proposalLifetime;     
    uint256 public minGovStake;          
    uint256 public threshold;            
    uint256 public gasStakeAmt;          
    uint256 public maxProposerAmount;    

    /*** Getters ***/
    function votes(uint256 id, address usr)      external view returns (uint256) { return proposals[id].votes[usr];  }
    function gasOwners(address usr, bytes32 src) external view returns (uint256) { return users[usr].gasOwners[src]; }
    function gasStorageLength()                  external view returns (uint256) { return gasStorage.length; }
    function snapshots(address usr, uint256 num) external view returns (uint256, uint256) {
        return (users[usr].snapshots[num].fromBlock, users[usr].snapshots[num].rights);
    }

    /*** Constants ***/
    uint256 constant public LAUNCH_THRESHOLD   = 555 ether;     
    uint256 constant public MIN_THRESHOLD      = 40;            
    uint256 constant public MAX_THRESHOLD      = 60;            
    uint256 constant public PROPOSAL_PENDING   = 0;             
    uint256 constant public PROPOSAL_SCHEDULED = 1;             
    uint256 constant public PROPOSAL_EXECUTED  = 2;             
    uint256 constant public PROPOSAL_CANCELLED = 3;             

    /*** Events ***/
    event Rely(address indexed usr);
    event Deny(address indexed usr);
    event File(bytes32 indexed what, uint256 data);
    event AddProposer(address indexed usr);
    event RemoveProposer(address indexed usr);
    event MintGas(bytes32 indexed src, address indexed usr, uint256 amt);
    event BurnGas(bytes32 indexed src, address indexed usr, uint256 amt);
    event Delegate(address indexed owner, address indexed newDelegate);
    event Lock(address indexed usr, uint256 wad);
    event Free(address indexed usr, uint256 wad);
    event Clear(address indexed usr);
    event Ping(address indexed usr);
    event UpdateTotalActive(uint256 wad);
    event Launch();
    event Propose(address indexed exec, address indexed action, uint256 indexed id);
    event Vote(uint256 indexed id, uint256 indexed snapshotIndex, uint256 wad);
    event Plot(uint256 indexed id);
    event Exec(uint256 indexed id);
    event Drop(uint256 indexed id);

    /*** Modifiers ***/
    modifier auth {
        require(wards[msg.sender] == 1, "DssGov/not-authorized");
        _;
    }
    modifier warm {
        _;
        users[msg.sender].lastActivity = block.timestamp;
    }

    /*** Internal Functions ***/
    function _save(address usr, uint256 wad) internal {
        uint256 num = users[usr].numSnapshots;
        if (num > 0 && users[usr].snapshots[num].fromBlock == block.number) {
            users[usr].snapshots[num].rights = wad;
        } else {
            unchecked {
                users[usr].numSnapshots = num + 1;
                users[usr].snapshots[num + 1] = Snapshot(block.number, wad);
            }
        }
    }

    function _mint(bytes32 src, address usr) internal {
        uint256 amt = gasStakeAmt;
        // Optimized loop using unchecked for gas efficiency
        for (uint256 i = 0; i < amt; ) {
            gasStorage.push(1);
            unchecked { ++i; }
        }
        users[usr].gasOwners[src] = amt;
        emit MintGas(src, usr, amt);
    }

    function _burn(bytes32 src, address usr) internal {
        uint256 l = gasStorage.length;
        uint256 amt = users[usr].gasOwners[src];
        // Optimized loop using unchecked for gas efficiency
        for (uint256 i = 1; i <= amt; ) {
            gasStorage[l - i] = 0; // Clear storage to potentially trigger gas refund
            gasStorage.pop();
            unchecked { ++i; }
        }
        users[usr].gasOwners[src] = 0;
        emit BurnGas(src, usr, amt);
    }

    function _getUserRights(address usr, uint256 index, uint256 blockNum) internal view returns (uint256 amount) {
        uint256 num = users[usr].numSnapshots;
        require(num >= index, "DssGov/not-existing-index");
        Snapshot memory snapshot = users[usr].snapshots[index];
        require(snapshot.fromBlock < blockNum, "DssGov/not-correct-snapshot-1"); 
        require(index == num || users[usr].snapshots[index + 1].fromBlock >= blockNum, "DssGov/not-correct-snapshot-2");

        amount = snapshot.rights;
    }


    /*** Constructor ***/
    constructor(address govToken_, address iouToken_) {
        govToken = TokenLike(govToken_);
        iouToken = MintableTokenLike(iouToken_);
        wards[msg.sender] = 1;
        emit Rely(msg.sender);
        // live defaults to 0, requiring launch(), matching original behavior
    }


    /*** External Functions ***/
    function rely(address usr) external auth {
        wards[usr] = 1;
        emit Rely(usr);
    }

    function deny(address usr) external auth {
        wards[usr] = 0;
        emit Deny(usr);
    }

    function file(bytes32 what, uint256 data) external auth {
        if (what == "rightsLifetime") rightsLifetime = data;
        else if (what == "delegationLifetime") delegationLifetime = data;
        else if (what == "proposalLockDuration") proposalLockDuration = data; 
        else if (what == "voteLockDuration") voteLockDuration = data;
        else if (what == "proposalLifetime") proposalLifetime = data;
        else if (what == "minGovStake") minGovStake = data;
        else if (what == "threshold") {
            require(data >= MIN_THRESHOLD && data <= MAX_THRESHOLD, "DssGov/threshold-not-safe-range");
            threshold = data;
        }
        else if (what == "gasStakeAmt") gasStakeAmt = data;
        else if (what == "maxProposerAmount") maxProposerAmount = data;
        else revert("DssGov/file-unrecognized-param");
        emit File(what, data);
    }

    function addProposer(address usr) external auth {
        proposers[usr].allowed = 1;
        emit AddProposer(usr);
    }

    function removeProposer(address usr) external auth {
        proposers[usr].allowed = 0;
        emit RemoveProposer(usr);
    }

    function delegate(address owner, address newDelegated) external warm {
        address oldDelegated = users[owner].delegate;
        require(newDelegated != oldDelegated, "DssGov/already-delegated");

        require(
            owner == msg.sender || 
            (oldDelegated == msg.sender && newDelegated == address(0)) || 
            (users[owner].lastActivity + delegationLifetime < block.timestamp && newDelegated == address(0)), 
            "DssGov/not-authorized-delegation"
        );

        users[owner].delegate = newDelegated;
        uint256 deposit = users[owner].deposit;

        bool activeOld = oldDelegated != address(0) && users[oldDelegated].active == 1;
        bool activeNew = newDelegated != address(0) && users[newDelegated].active == 1;

        if (activeOld && !activeNew) {
            totActive -= deposit;
            emit UpdateTotalActive(totActive);
        } else if (!activeOld && activeNew) {
            totActive += deposit;
            emit UpdateTotalActive(totActive);
        }

        if (oldDelegated != address(0)) {
            users[owner].voteUnlockTime = users[owner].voteUnlockTime > users[oldDelegated].voteUnlockTime ? 
                                          users[owner].voteUnlockTime : users[oldDelegated].voteUnlockTime;
            users[oldDelegated].rights -= deposit;
            if(activeOld) {
                _save(oldDelegated, users[oldDelegated].rights);
            }
        } else {
            _mint("owner", owner);
        }

        if (newDelegated != address(0)) {
            users[newDelegated].rights += deposit;
            if(activeNew) {
                _save(newDelegated, users[newDelegated].rights);
            }
        } else {
            _burn("owner", owner);
        }

        emit Delegate(owner, newDelegated);
    }

    function lock(uint256 wad) external warm {
        govToken.transferFrom(msg.sender, address(this), wad);
        iouToken.mint(msg.sender, wad);

        users[msg.sender].deposit += wad;

        address delegated = users[msg.sender].delegate;
        if (delegated != address(0)) {
            users[delegated].rights += wad;
            if (users[delegated].active == 1) {
                _save(delegated, users[delegated].rights);
                totActive += wad;
                emit UpdateTotalActive(totActive);
            }
        }

        emit Lock(msg.sender, wad);
    }

    function free(uint256 wad) external warm {
        require(users[msg.sender].proposalUnlockTime <= block.timestamp, "DssGov/user-locked");
        require(users[msg.sender].voteUnlockTime <= block.timestamp, "DssGov/user-locked");

        iouToken.burn(msg.sender, wad);
        users[msg.sender].deposit -= wad;

        address delegated = users[msg.sender].delegate;
        if (delegated != address(0)) {
            require(users[delegated].voteUnlockTime <= block.timestamp, "DssGov/user-locked");
            users[delegated].rights -= wad;
            if (users[delegated].active == 1) {
                _save(delegated, users[delegated].rights);
                totActive -= wad;
                emit UpdateTotalActive(totActive);
            }
        }

        govToken.transfer(msg.sender, wad);
        emit Free(msg.sender, wad);
    }

    function clear(address usr) external {
        if (users[usr].active == 0) return;

        require(users[usr].lastActivity + rightsLifetime < block.timestamp, "DssGov/not-allowed-to-clear");

        users[usr].active = 0;

        uint256 r = users[usr].rights;
        totActive -= r;
        emit UpdateTotalActive(totActive);

        _save(usr, 0);
        _burn("delegated", usr);

        emit Clear(usr);
    }

    function ping() external warm {
        if (users[msg.sender].active == 1) return;

        users[msg.sender].active = 1;

        uint256 r = users[msg.sender].rights;
        totActive += r;
        emit UpdateTotalActive(totActive);

        _save(msg.sender, r);
        _mint("delegated", msg.sender);

        emit Ping(msg.sender);
    }

    function launch() external warm {
        require(live == 0, "DssGov/already-launched");
        require(totActive >= LAUNCH_THRESHOLD, "DssGov/not-minimum");

        live = 1;
        emit Launch();
    }

    function propose(address execute, address action) external warm returns (uint256) {
        require(live == 1, "DssGov/not-launched");

        if (proposers[msg.sender].allowed == 1) {
            uint256 lastDay = proposers[msg.sender].lastDay;
            uint256 count   = proposers[msg.sender].count;
            uint256 today = block.timestamp / 1 days;
            
            count = lastDay == today ? count : 0;
            require(count < maxProposerAmount, "DssGov/max-amount-proposals-proposer");
            
            proposers[msg.sender].lastDay = today;
            proposers[msg.sender].count = count + 1;
        } else {
            require(users[msg.sender].deposit >= minGovStake, "DssGov/not-minimum-amount");
            require(users[msg.sender].proposalUnlockTime <= block.timestamp, "DssGov/user-locked");
            users[msg.sender].proposalUnlockTime = block.timestamp + proposalLockDuration;
        }

        unchecked { numProposals += 1; }
        uint256 id = numProposals;
        
        Proposal storage prop = proposals[id];
        prop.blockNum = block.number;
        prop.end = block.timestamp + proposalLifetime;
        prop.exec = execute;
        prop.action = action;
        prop.totActive = totActive;
        prop.totVotes = 0;
        prop.status = 0;

        emit Propose(execute, action, id);
        return id;
    }

    function vote(uint256 id, uint256 snapshotIndex, uint256 wad) external warm {
        require(proposals[id].status == PROPOSAL_PENDING, "DssGov/wrong-status");
        require(proposals[id].end >= block.timestamp, "DssGov/proposal-expired");
        require(wad <= _getUserRights(msg.sender, snapshotIndex, proposals[id].blockNum), "DssGov/amount-exceeds-rights");

        users[msg.sender].voteUnlockTime = users[msg.sender].voteUnlockTime > block.timestamp + voteLockDuration ? 
                                            users[msg.sender].voteUnlockTime : block.timestamp + voteLockDuration;

        uint256 prev = proposals[id].votes[msg.sender];
        proposals[id].votes[msg.sender] = wad;
        proposals[id].totVotes = proposals[id].totVotes - prev + wad;

        emit Vote(id, snapshotIndex, wad);
    }

    function plot(uint256 id) external warm {
        require(proposals[id].status == PROPOSAL_PENDING, "DssGov/wrong-status");
        require(proposals[id].end >= block.timestamp, "DssGov/vote-expired");
        require(proposals[id].totVotes > (proposals[id].totActive * threshold) / 100, "DssGov/not-enough-votes");

        proposals[id].status = PROPOSAL_SCHEDULED;
        ExecLike(proposals[id].exec).plot(proposals[id].action);

        emit Plot(id);
    }

    function exec(uint256 id) external warm {
        require(proposals[id].status == PROPOSAL_SCHEDULED, "DssGov/wrong-status");

        proposals[id].status = PROPOSAL_EXECUTED;
        ExecLike(proposals[id].exec).exec(proposals[id].action);

        emit Exec(id);
    }

    function drop(uint256 id) external auth {
        require(proposals[id].status < PROPOSAL_EXECUTED, "DssGov/wrong-status");

        proposals[id].status = PROPOSAL_CANCELLED;
        ExecLike(proposals[id].exec).drop(proposals[id].action);

        emit Drop(id);
    }
}
        

Compiler Settings

{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"paris"}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"govToken_","internalType":"address"},{"type":"address","name":"iouToken_","internalType":"address"}]},{"type":"event","name":"AddProposer","inputs":[{"type":"address","name":"usr","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"BurnGas","inputs":[{"type":"bytes32","name":"src","internalType":"bytes32","indexed":true},{"type":"address","name":"usr","internalType":"address","indexed":true},{"type":"uint256","name":"amt","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Clear","inputs":[{"type":"address","name":"usr","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Delegate","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"newDelegate","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Deny","inputs":[{"type":"address","name":"usr","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Drop","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"Exec","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"File","inputs":[{"type":"bytes32","name":"what","internalType":"bytes32","indexed":true},{"type":"uint256","name":"data","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Free","inputs":[{"type":"address","name":"usr","internalType":"address","indexed":true},{"type":"uint256","name":"wad","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Launch","inputs":[],"anonymous":false},{"type":"event","name":"Lock","inputs":[{"type":"address","name":"usr","internalType":"address","indexed":true},{"type":"uint256","name":"wad","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MintGas","inputs":[{"type":"bytes32","name":"src","internalType":"bytes32","indexed":true},{"type":"address","name":"usr","internalType":"address","indexed":true},{"type":"uint256","name":"amt","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Ping","inputs":[{"type":"address","name":"usr","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Plot","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"Propose","inputs":[{"type":"address","name":"exec","internalType":"address","indexed":true},{"type":"address","name":"action","internalType":"address","indexed":true},{"type":"uint256","name":"id","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"Rely","inputs":[{"type":"address","name":"usr","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RemoveProposer","inputs":[{"type":"address","name":"usr","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"UpdateTotalActive","inputs":[{"type":"uint256","name":"wad","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Vote","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":true},{"type":"uint256","name":"snapshotIndex","internalType":"uint256","indexed":true},{"type":"uint256","name":"wad","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"LAUNCH_THRESHOLD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_THRESHOLD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MIN_THRESHOLD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"PROPOSAL_CANCELLED","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"PROPOSAL_EXECUTED","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"PROPOSAL_PENDING","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"PROPOSAL_SCHEDULED","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addProposer","inputs":[{"type":"address","name":"usr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"clear","inputs":[{"type":"address","name":"usr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"delegate","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"newDelegated","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"delegationLifetime","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deny","inputs":[{"type":"address","name":"usr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"drop","inputs":[{"type":"uint256","name":"id","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"exec","inputs":[{"type":"uint256","name":"id","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"file","inputs":[{"type":"bytes32","name":"what","internalType":"bytes32"},{"type":"uint256","name":"data","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"free","inputs":[{"type":"uint256","name":"wad","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gasOwners","inputs":[{"type":"address","name":"usr","internalType":"address"},{"type":"bytes32","name":"src","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gasStakeAmt","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gasStorage","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gasStorageLength","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract TokenLike"}],"name":"govToken","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract MintableTokenLike"}],"name":"iouToken","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"launch","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"live","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"lock","inputs":[{"type":"uint256","name":"wad","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxProposerAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minGovStake","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"numProposals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"ping","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"plot","inputs":[{"type":"uint256","name":"id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalLifetime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalLockDuration","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"blockNum","internalType":"uint256"},{"type":"uint256","name":"end","internalType":"uint256"},{"type":"address","name":"exec","internalType":"address"},{"type":"address","name":"action","internalType":"address"},{"type":"uint256","name":"totActive","internalType":"uint256"},{"type":"uint256","name":"totVotes","internalType":"uint256"},{"type":"uint256","name":"status","internalType":"uint256"}],"name":"proposals","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"propose","inputs":[{"type":"address","name":"execute","internalType":"address"},{"type":"address","name":"action","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"allowed","internalType":"uint256"},{"type":"uint256","name":"lastDay","internalType":"uint256"},{"type":"uint256","name":"count","internalType":"uint256"}],"name":"proposers","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rely","inputs":[{"type":"address","name":"usr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeProposer","inputs":[{"type":"address","name":"usr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"rightsLifetime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"snapshots","inputs":[{"type":"address","name":"usr","internalType":"address"},{"type":"uint256","name":"num","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"threshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totActive","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"deposit","internalType":"uint256"},{"type":"address","name":"delegate","internalType":"address"},{"type":"uint256","name":"rights","internalType":"uint256"},{"type":"uint256","name":"active","internalType":"uint256"},{"type":"uint256","name":"lastActivity","internalType":"uint256"},{"type":"uint256","name":"proposalUnlockTime","internalType":"uint256"},{"type":"uint256","name":"voteUnlockTime","internalType":"uint256"},{"type":"uint256","name":"numSnapshots","internalType":"uint256"}],"name":"users","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"vote","inputs":[{"type":"uint256","name":"id","internalType":"uint256"},{"type":"uint256","name":"snapshotIndex","internalType":"uint256"},{"type":"uint256","name":"wad","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"voteLockDuration","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"votes","inputs":[{"type":"uint256","name":"id","internalType":"uint256"},{"type":"address","name":"usr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"wards","inputs":[{"type":"address","name":"","internalType":"address"}]}]
              

Contract Creation Code

0x60c060405234801561001057600080fd5b5060405161286738038061286783398101604081905261002f9161009e565b6001600160a01b03808316608052811660a0523360008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250506100d1565b80516001600160a01b038116811461009957600080fd5b919050565b600080604083850312156100b157600080fd5b6100ba83610082565b91506100c860208401610082565b90509250929050565b60805160a051612755610112600039600081816104b70152818161166d01526119790152600081816103530152818161182501526118fb01526127556000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c80639c52a7f11161015c578063d23254b4116100ce578063ed4b39a611610087578063ed4b39a6146106af578063f151f183146106b7578063f43032e7146106ca578063f873cb9114610704578063fa211e1b14610717578063fe620fe01461072a57600080fd5b8063d23254b414610604578063d8ccd0f314610617578063d8d2c89e1461062a578063db5517b014610632578063dd46706414610689578063e8f158641461069c57600080fd5b8063a8d0823511610120578063a8d08235146105af578063ade114e7146105b7578063b03cd418146105c0578063bd015f5d146105d3578063bd11c4c0146105dc578063bf353dbb146105e457600080fd5b80639c52a7f1146104e25780639ee6deb6146104f5578063a1bf8824146104fd578063a5e787c814610506578063a87430ba1461050f57600080fd5b80633d0a406111610200578063682f7c98116101b9578063682f7c981461047a5780638a00b259146104835780638a6655d61461048c5780638ab656861461049f5780638e34b194146104b2578063957aa58c146104d957600080fd5b80633d0a406114610431578063400e39491461044457806342cde4e81461044d578063465a6852146104565780635c36b1861461045f57806365fae35e1461046757600080fd5b806309d632d31161025257806309d632d31461039557806318177497146103a85780631d32c2da146103f2578063211d9a531461040257806329ae8114146104155780632e0497d91461042857600080fd5b806301339c211461028f578063013cf08b14610299578063016bc1fb1461033757806305268cff1461034e57806308af54311461038d575b600080fd5b610297610732565b005b6102f16102a73660046124b1565b60056020819052600091825260409091208054600182015460028301546003840154600485015495850154600690950154939592946001600160a01b039283169492909116929187565b6040805197885260208801969096526001600160a01b0394851695870195909552929091166060850152608084015260a083015260c082015260e0015b60405180910390f35b610340600a5481565b60405190815260200161032e565b6103757f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161032e565b610340603c81565b6102976103a33660046124e6565b61081c565b6103d76103b63660046124e6565b60066020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161032e565b610340681e162c177be5cc000081565b6102976104103660046124b1565b61088f565b610297610423366004612508565b610998565b610340600d5481565b61029761043f3660046124e6565b610be3565b61034060045481565b610340600e5481565b61034060095481565b610297610d39565b6102976104753660046124e6565b610e13565b610340600f5481565b61034060105481565b61029761049a36600461252a565b610e87565b6102976104ad366004612556565b611095565b6103757f000000000000000000000000000000000000000000000000000000000000000081565b61034060015481565b6102976104f03660046124e6565b6114d9565b610340600181565b610340600b5481565b61034060085481565b61056c61051d3660046124e6565b60076020819052600091825260409091208054600182015460028301546003840154600485015460058601546006870154969097015494966001600160a01b0390941695929491939092909188565b604080519889526001600160a01b039097166020890152958701949094526060860192909252608085015260a084015260c083015260e08201526101000161032e565b610340600281565b61034060035481565b6102976105ce3660046124e6565b61154c565b610340600c5481565b610340602881565b6103406105f23660046124e6565b60006020819052908152604090205481565b610340610612366004612589565b6115c0565b6102976106253660046124b1565b6115ed565b610340600381565b6106746106403660046125ac565b6001600160a01b03919091166000908152600760209081526040808320938352600890930190522080546001909101549091565b6040805192835260208301919091520161032e565b6102976106973660046124b1565b6118d9565b6103406106aa366004612556565b611b0e565b610340600081565b6102976106c53660046124b1565b611dbc565b6103406106d83660046125ac565b6001600160a01b0391909116600090815260076020908152604080832093835260099093019052205490565b6102976107123660046124b1565b611f8d565b6103406107253660046124b1565b61207e565b600254610340565b600154156107875760405162461bcd60e51b815260206004820152601760248201527f447373476f762f616c72656164792d6c61756e6368656400000000000000000060448201526064015b60405180910390fd5b681e162c177be5cc000060035410156107d75760405162461bcd60e51b8152602060048201526012602482015271447373476f762f6e6f742d6d696e696d756d60701b604482015260640161077e565b600180556040517f02ac8168caf2f254b394bd39e19417c5c28124ab89c9bc2d44921b19808e266990600090a133600090815260076020526040902042600490910155565b3360009081526020819052604090205460011461084b5760405162461bcd60e51b815260040161077e906125d6565b6001600160a01b038116600081815260066020526040808220829055517f256af26f1351c681046ee0732c0c6db916efd9f5bbf014a11b9abb53820546ee9190a250565b336000908152602081905260409020546001146108be5760405162461bcd60e51b815260040161077e906125d6565b6000818152600560205260409020600601546002116108ef5760405162461bcd60e51b815260040161077e90612605565b60008181526005602052604090819020600360068201819055600282015491015491516348f9380560e11b81526001600160a01b0392831660048201529116906391f2700a90602401600060405180830381600087803b15801561095257600080fd5b505af1158015610966573d6000803e3d6000fd5b50506040518392507fe704fbab0d635f982f78dc600e6d474c2152885d7c32530ac271eb00f38259df9150600090a250565b336000908152602081905260409020546001146109c75760405162461bcd60e51b815260040161077e906125d6565b816d7269676874734c69666574696d6560901b036109e9576008819055610ba5565b817164656c65676174696f6e4c69666574696d6560701b03610a0f576009819055610ba5565b8173383937b837b9b0b62637b1b5a23ab930ba34b7b760611b03610a3757600a819055610ba5565b816f3b37ba32a637b1b5a23ab930ba34b7b760811b03610a5b57600b819055610ba5565b816f70726f706f73616c4c69666574696d6560801b03610a7f57600c819055610ba5565b816a6d696e476f765374616b6560a81b03610a9e57600d819055610ba5565b81681d1a1c995cda1bdb1960ba1b03610b195760288110158015610ac35750603c8111155b610b0f5760405162461bcd60e51b815260206004820152601f60248201527f447373476f762f7468726573686f6c642d6e6f742d736166652d72616e676500604482015260640161077e565b600e819055610ba5565b816a19d85cd4dd185ad9505b5d60aa1b03610b3857600f819055610ba5565b81701b585e141c9bdc1bdcd95c905b5bdd5b9d607a1b03610b5d576010819055610ba5565b60405162461bcd60e51b815260206004820152601e60248201527f447373476f762f66696c652d756e7265636f676e697a65642d706172616d0000604482015260640161077e565b817fe986e40cc8c151830d4f61050f4fb2e4add8567caad2d5f5496f9158e91fe4c782604051610bd791815260200190565b60405180910390a25050565b6001600160a01b0381166000908152600760205260408120600301549003610c085750565b6008546001600160a01b0382166000908152600760205260409020600401544291610c3291612648565b10610c7f5760405162461bcd60e51b815260206004820152601b60248201527f447373476f762f6e6f742d616c6c6f7765642d746f2d636c6561720000000000604482015260640161077e565b6001600160a01b0381166000908152600760205260408120600380820183905560029091015481549092839291610cb790849061265b565b90915550506003546040519081526000805160206127008339815191529060200160405180910390a1610ceb82600061209f565b610d016819195b1959d85d195960ba1b83612175565b6040516001600160a01b038316907f832e6903187c7c13e6dd325d0792d02ed4fb30e708d69386ece3ddc029fd9b4f90600090a25050565b33600090815260076020526040902060030154600114610dfb57336000908152600760205260408120600160038083019190915560029091015481549092839291610d85908490612648565b90915550506003546040519081526000805160206127008339815191529060200160405180910390a1610db8338261209f565b610dce6819195b1959d85d195960ba1b33612268565b60405133907ffee8775ba9b0f00b87db291c081d99de518bdebb6ccfa2482cc5882fe69307e590600090a2505b33600090815260076020526040902042600490910155565b33600090815260208190526040902054600114610e425760405162461bcd60e51b815260040161077e906125d6565b6001600160a01b03811660008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b60008381526005602052604090206006015415610eb65760405162461bcd60e51b815260040161077e90612605565b600083815260056020526040902060010154421115610f175760405162461bcd60e51b815260206004820152601760248201527f447373476f762f70726f706f73616c2d65787069726564000000000000000000604482015260640161077e565b600083815260056020526040902054610f339033908490612314565b811115610f825760405162461bcd60e51b815260206004820152601c60248201527f447373476f762f616d6f756e742d657863656564732d72696768747300000000604482015260640161077e565b600b54610f8f9042612648565b3360009081526007602052604090206006015411610fb957600b54610fb49042612648565b610fcd565b336000908152600760205260409020600601545b33600081815260076020818152604080842060060195909555878352600580825285842094845291840181529382208054908690559187905292839052910154829061101a90839061265b565b6110249190612648565b600560008681526020019081526020016000206005018190555082847f6bbb2afba842b206b06bf91942742fa3dc08583f4653646faadfcffea72402ba8460405161107191815260200190565b60405180910390a35050336000908152600760205260409020426004909101555050565b6001600160a01b0380831660009081526007602052604090206001015481169082168190036111065760405162461bcd60e51b815260206004820152601860248201527f447373476f762f616c72656164792d64656c6567617465640000000000000000604482015260640161077e565b6001600160a01b03831633148061113757506001600160a01b0381163314801561113757506001600160a01b038216155b8061117b57506009546001600160a01b038416600090815260076020526040902060040154429161116791612648565b10801561117b57506001600160a01b038216155b6111c75760405162461bcd60e51b815260206004820181905260248201527f447373476f762f6e6f742d617574686f72697a65642d64656c65676174696f6e604482015260640161077e565b6001600160a01b0383811660009081526007602052604081206001810180546001600160a01b031916868516179055549183161580159061122357506001600160a01b0383166000908152600760205260409020600301546001145b905060006001600160a01b0385161580159061125a57506001600160a01b0385166000908152600760205260409020600301546001145b9050818015611267575080155b156112ac57826003600082825461127e919061265b565b90915550506003546040519081526000805160206127008339815191529060200160405180910390a16112f8565b811580156112b75750805b156112f85782600360008282546112ce9190612648565b90915550506003546040519081526000805160206127008339815191529060200160405180910390a15b6001600160a01b038416156113e6576001600160a01b03808516600090815260076020526040808220600690810154938a1683529120015411611356576001600160a01b038416600090815260076020526040902060060154611373565b6001600160a01b0386166000908152600760205260409020600601545b6001600160a01b0380881660009081526007602052604080822060060193909355908616815290812060020180548592906113af90849061265b565b909155505081156113e1576001600160a01b0384166000908152600760205260409020600201546113e190859061209f565b6113f8565b6113f86437bbb732b960d91b87612268565b6001600160a01b03851615611469576001600160a01b03851660009081526007602052604081206002018054859290611432908490612648565b90915550508015611464576001600160a01b03851660009081526007602052604090206002015461146490869061209f565b61147b565b61147b6437bbb732b960d91b87612175565b846001600160a01b0316866001600160a01b03167fab7d75eccd27c9989942a3a6e4137e415df0ad90ec428751b16361f16fe8780f60405160405180910390a350503360009081526007602052604090204260049091015550505050565b336000908152602081905260409020546001146115085760405162461bcd60e51b815260040161077e906125d6565b6001600160a01b038116600081815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b3360009081526020819052604090205460011461157b5760405162461bcd60e51b815260040161077e906125d6565b6001600160a01b03811660008181526006602052604080822060019055517f8a2aab8185d72e0f5c307500011dc19302fcd5688455fb2f5638dc10202a98289190a250565b60008281526005602090815260408083206001600160a01b03851684526007019091529020545b92915050565b3360009081526007602052604090206005015442101561161f5760405162461bcd60e51b815260040161077e9061266e565b336000908152600760205260409020600601544210156116515760405162461bcd60e51b815260040161077e9061266e565b604051632770a7eb60e21b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639dc29fac90604401600060405180830381600087803b1580156116b957600080fd5b505af11580156116cd573d6000803e3d6000fd5b505033600090815260076020526040812080548594509092506116f190849061265b565b9091555050336000908152600760205260409020600101546001600160a01b03168015611809576001600160a01b0381166000908152600760205260409020600601544210156117535760405162461bcd60e51b815260040161077e9061266e565b6001600160a01b0381166000908152600760205260408120600201805484929061177e90849061265b565b90915550506001600160a01b038116600090815260076020526040902060030154600103611809576001600160a01b0381166000908152600760205260409020600201546117cd90829061209f565b81600360008282546117df919061265b565b90915550506003546040519081526000805160206127008339815191529060200160405180910390a15b60405163a9059cbb60e01b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb90604401600060405180830381600087803b15801561187157600080fd5b505af1158015611885573d6000803e3d6000fd5b50506040518481523392507fce6c5af8fd109993cb40da4d5dc9e4dd8e61bc2e48f1e3901472141e4f56f29391506020015b60405180910390a2505033600090815260076020526040902042600490910155565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd90606401600060405180830381600087803b15801561194757600080fd5b505af115801561195b573d6000803e3d6000fd5b50506040516340c10f1960e01b8152336004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692506340c10f199150604401600060405180830381600087803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505033600090815260076020526040812080548594509092506119ff908490612648565b9091555050336000908152600760205260409020600101546001600160a01b03168015611adc576001600160a01b03811660009081526007602052604081206002018054849290611a51908490612648565b90915550506001600160a01b038116600090815260076020526040902060030154600103611adc576001600160a01b038116600090815260076020526040902060020154611aa090829061209f565b8160036000828254611ab29190612648565b90915550506003546040519081526000805160206127008339815191529060200160405180910390a15b60405182815233907f625fed9875dada8643f2418b838ae0bc78d9a148a18eee4ee1979ff0f3f5d427906020016118b7565b6000600154600114611b585760405162461bcd60e51b8152602060048201526013602482015272111cdcd1dbdd8bdb9bdd0b5b185d5b98da1959606a1b604482015260640161077e565b33600090815260066020526040902054600103611c475733600090815260066020526040812060018101546002909101549091611b98620151804261269a565b9050808314611ba8576000611baa565b815b91506010548210611c095760405162461bcd60e51b8152602060048201526024808201527f447373476f762f6d61782d616d6f756e742d70726f706f73616c732d70726f7060448201526337b9b2b960e11b606482015260840161077e565b3360009081526006602052604090206001908101829055611c2b908390612648565b3360009081526006602052604090206002015550611cfb915050565b600d54336000908152600760205260409020541015611ca85760405162461bcd60e51b815260206004820152601960248201527f447373476f762f6e6f742d6d696e696d756d2d616d6f756e7400000000000000604482015260640161077e565b33600090815260076020526040902060050154421015611cda5760405162461bcd60e51b815260040161077e9061266e565b600a54611ce79042612648565b336000908152600760205260409020600501555b60048054600101908190556000818152600560205260409020438155600c54611d249042612648565b60018201556002810180546001600160a01b038088166001600160a01b031992831681179093556003808501805492891692909316821790925590546004840155600060058401819055600684018190556040518593917f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c191a450336000908152600760205260409020426004909101559392505050565b60008181526005602052604090206006015415611deb5760405162461bcd60e51b815260040161077e90612605565b600081815260056020526040902060010154421115611e425760405162461bcd60e51b8152602060048201526013602482015272111cdcd1dbdd8bdd9bdd194b595e1c1a5c9959606a1b604482015260640161077e565b600e54600082815260056020526040902060040154606491611e63916126bc565b611e6d919061269a565b6000828152600560208190526040909120015411611ecd5760405162461bcd60e51b815260206004820152601760248201527f447373476f762f6e6f742d656e6f7567682d766f746573000000000000000000604482015260640161077e565b60008181526005602052604090819020600160068201556002810154600390910154915163a12191ab60e01b81526001600160a01b03928316600482015291169063a12191ab90602401600060405180830381600087803b158015611f3157600080fd5b505af1158015611f45573d6000803e3d6000fd5b50506040518392507f666a52a16fa433390211812f8a08f667304fdff23a0788b92ecd1405c525fd039150600090a25033600090815260076020526040902042600490910155565b600081815260056020526040902060060154600114611fbe5760405162461bcd60e51b815260040161077e90612605565b6000818152600560205260409081902060026006820181905581015460039091015491516335db093760e11b81526001600160a01b039283166004820152911690636bb6126e90602401600060405180830381600087803b15801561202257600080fd5b505af1158015612036573d6000803e3d6000fd5b50506040518392507f2521b0e1f676d7218baad3ddbb01bda39899b3c05f986ffc4437016bb21979769150600090a25033600090815260076020526040902042600490910155565b6002818154811061208e57600080fd5b600091825260209091200154905081565b6001600160a01b0382166000908152600760208190526040909120015480158015906120f057506001600160a01b038316600090815260076020908152604080832084845260080190915290205443145b15612126576001600160a01b03831660009081526007602090815260408083208484526008019091529020600101829055505050565b6001600160a01b03929092166000908152600760208181526040808420600196870193810184905581518083018352438152808401968752938552600801909152909120905181559051910155565b6002546001600160a01b038216600090815260076020908152604080832086845260090190915290205460015b81811161220557600060026121b7838661265b565b815481106121c7576121c76126d3565b60009182526020909120015560028054806121e4576121e46126e9565b600190038181906000526020600020016000905590558060010190506121a2565b506001600160a01b0383166000818152600760209081526040808320888452600901825280832092909255905183815286917f8dfb7db4b6134280990762590a27e9832984cf1a10bce8e44303c412df184951910160405180910390a350505050565b600f5460005b818110156122b25760028054600181810183556000929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace018190550161226e565b506001600160a01b0382166000818152600760209081526040808320878452600901825291829020849055905183815285917f39592c77bd9e2d2a153b91a26c6d6e1fca1a09ecbfe2266389295aac9873f080910160405180910390a3505050565b6001600160a01b038316600090815260076020819052604082200154838110156123805760405162461bcd60e51b815260206004820152601960248201527f447373476f762f6e6f742d6578697374696e672d696e64657800000000000000604482015260640161077e565b6001600160a01b03851660009081526007602090815260408083208784526008018252918290208251808401909352805480845260019091015491830191909152841161240f5760405162461bcd60e51b815260206004820152601d60248201527f447373476f762f6e6f742d636f72726563742d736e617073686f742d31000000604482015260640161077e565b8185148061245857506001600160a01b03861660009081526007602052604081208591600890910190612443886001612648565b81526020019081526020016000206000015410155b6124a45760405162461bcd60e51b815260206004820152601d60248201527f447373476f762f6e6f742d636f72726563742d736e617073686f742d32000000604482015260640161077e565b6020015195945050505050565b6000602082840312156124c357600080fd5b5035919050565b80356001600160a01b03811681146124e157600080fd5b919050565b6000602082840312156124f857600080fd5b612501826124ca565b9392505050565b6000806040838503121561251b57600080fd5b50508035926020909101359150565b60008060006060848603121561253f57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561256957600080fd5b612572836124ca565b9150612580602084016124ca565b90509250929050565b6000806040838503121561259c57600080fd5b82359150612580602084016124ca565b600080604083850312156125bf57600080fd5b6125c8836124ca565b946020939093013593505050565b602080825260159082015274111cdcd1dbdd8bdb9bdd0b585d5d1a1bdc9a5e9959605a1b604082015260600190565b602080825260139082015272447373476f762f77726f6e672d73746174757360681b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156115e7576115e7612632565b818103818111156115e7576115e7612632565b602080825260129082015271111cdcd1dbdd8bdd5cd95c8b5b1bd8dad95960721b604082015260600190565b6000826126b757634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176115e7576115e7612632565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfe6b30bd87bd1850cfa4241ebd90c471dad096f0e44a75f007daa801eff5c60d11a26469706673582212206c609bc5600d9166c943b7d7046f52034ee2e5e5c289c6e0d91090e8335d0fae64736f6c634300081c003300000000000000000000000036d8c21602ada33ab50070214c6e9e24be0ab97e000000000000000000000000c8c136a42ba279df2637686e5e59789674048fbe

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061028a5760003560e01c80639c52a7f11161015c578063d23254b4116100ce578063ed4b39a611610087578063ed4b39a6146106af578063f151f183146106b7578063f43032e7146106ca578063f873cb9114610704578063fa211e1b14610717578063fe620fe01461072a57600080fd5b8063d23254b414610604578063d8ccd0f314610617578063d8d2c89e1461062a578063db5517b014610632578063dd46706414610689578063e8f158641461069c57600080fd5b8063a8d0823511610120578063a8d08235146105af578063ade114e7146105b7578063b03cd418146105c0578063bd015f5d146105d3578063bd11c4c0146105dc578063bf353dbb146105e457600080fd5b80639c52a7f1146104e25780639ee6deb6146104f5578063a1bf8824146104fd578063a5e787c814610506578063a87430ba1461050f57600080fd5b80633d0a406111610200578063682f7c98116101b9578063682f7c981461047a5780638a00b259146104835780638a6655d61461048c5780638ab656861461049f5780638e34b194146104b2578063957aa58c146104d957600080fd5b80633d0a406114610431578063400e39491461044457806342cde4e81461044d578063465a6852146104565780635c36b1861461045f57806365fae35e1461046757600080fd5b806309d632d31161025257806309d632d31461039557806318177497146103a85780631d32c2da146103f2578063211d9a531461040257806329ae8114146104155780632e0497d91461042857600080fd5b806301339c211461028f578063013cf08b14610299578063016bc1fb1461033757806305268cff1461034e57806308af54311461038d575b600080fd5b610297610732565b005b6102f16102a73660046124b1565b60056020819052600091825260409091208054600182015460028301546003840154600485015495850154600690950154939592946001600160a01b039283169492909116929187565b6040805197885260208801969096526001600160a01b0394851695870195909552929091166060850152608084015260a083015260c082015260e0015b60405180910390f35b610340600a5481565b60405190815260200161032e565b6103757f00000000000000000000000036d8c21602ada33ab50070214c6e9e24be0ab97e81565b6040516001600160a01b03909116815260200161032e565b610340603c81565b6102976103a33660046124e6565b61081c565b6103d76103b63660046124e6565b60066020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161032e565b610340681e162c177be5cc000081565b6102976104103660046124b1565b61088f565b610297610423366004612508565b610998565b610340600d5481565b61029761043f3660046124e6565b610be3565b61034060045481565b610340600e5481565b61034060095481565b610297610d39565b6102976104753660046124e6565b610e13565b610340600f5481565b61034060105481565b61029761049a36600461252a565b610e87565b6102976104ad366004612556565b611095565b6103757f000000000000000000000000c8c136a42ba279df2637686e5e59789674048fbe81565b61034060015481565b6102976104f03660046124e6565b6114d9565b610340600181565b610340600b5481565b61034060085481565b61056c61051d3660046124e6565b60076020819052600091825260409091208054600182015460028301546003840154600485015460058601546006870154969097015494966001600160a01b0390941695929491939092909188565b604080519889526001600160a01b039097166020890152958701949094526060860192909252608085015260a084015260c083015260e08201526101000161032e565b610340600281565b61034060035481565b6102976105ce3660046124e6565b61154c565b610340600c5481565b610340602881565b6103406105f23660046124e6565b60006020819052908152604090205481565b610340610612366004612589565b6115c0565b6102976106253660046124b1565b6115ed565b610340600381565b6106746106403660046125ac565b6001600160a01b03919091166000908152600760209081526040808320938352600890930190522080546001909101549091565b6040805192835260208301919091520161032e565b6102976106973660046124b1565b6118d9565b6103406106aa366004612556565b611b0e565b610340600081565b6102976106c53660046124b1565b611dbc565b6103406106d83660046125ac565b6001600160a01b0391909116600090815260076020908152604080832093835260099093019052205490565b6102976107123660046124b1565b611f8d565b6103406107253660046124b1565b61207e565b600254610340565b600154156107875760405162461bcd60e51b815260206004820152601760248201527f447373476f762f616c72656164792d6c61756e6368656400000000000000000060448201526064015b60405180910390fd5b681e162c177be5cc000060035410156107d75760405162461bcd60e51b8152602060048201526012602482015271447373476f762f6e6f742d6d696e696d756d60701b604482015260640161077e565b600180556040517f02ac8168caf2f254b394bd39e19417c5c28124ab89c9bc2d44921b19808e266990600090a133600090815260076020526040902042600490910155565b3360009081526020819052604090205460011461084b5760405162461bcd60e51b815260040161077e906125d6565b6001600160a01b038116600081815260066020526040808220829055517f256af26f1351c681046ee0732c0c6db916efd9f5bbf014a11b9abb53820546ee9190a250565b336000908152602081905260409020546001146108be5760405162461bcd60e51b815260040161077e906125d6565b6000818152600560205260409020600601546002116108ef5760405162461bcd60e51b815260040161077e90612605565b60008181526005602052604090819020600360068201819055600282015491015491516348f9380560e11b81526001600160a01b0392831660048201529116906391f2700a90602401600060405180830381600087803b15801561095257600080fd5b505af1158015610966573d6000803e3d6000fd5b50506040518392507fe704fbab0d635f982f78dc600e6d474c2152885d7c32530ac271eb00f38259df9150600090a250565b336000908152602081905260409020546001146109c75760405162461bcd60e51b815260040161077e906125d6565b816d7269676874734c69666574696d6560901b036109e9576008819055610ba5565b817164656c65676174696f6e4c69666574696d6560701b03610a0f576009819055610ba5565b8173383937b837b9b0b62637b1b5a23ab930ba34b7b760611b03610a3757600a819055610ba5565b816f3b37ba32a637b1b5a23ab930ba34b7b760811b03610a5b57600b819055610ba5565b816f70726f706f73616c4c69666574696d6560801b03610a7f57600c819055610ba5565b816a6d696e476f765374616b6560a81b03610a9e57600d819055610ba5565b81681d1a1c995cda1bdb1960ba1b03610b195760288110158015610ac35750603c8111155b610b0f5760405162461bcd60e51b815260206004820152601f60248201527f447373476f762f7468726573686f6c642d6e6f742d736166652d72616e676500604482015260640161077e565b600e819055610ba5565b816a19d85cd4dd185ad9505b5d60aa1b03610b3857600f819055610ba5565b81701b585e141c9bdc1bdcd95c905b5bdd5b9d607a1b03610b5d576010819055610ba5565b60405162461bcd60e51b815260206004820152601e60248201527f447373476f762f66696c652d756e7265636f676e697a65642d706172616d0000604482015260640161077e565b817fe986e40cc8c151830d4f61050f4fb2e4add8567caad2d5f5496f9158e91fe4c782604051610bd791815260200190565b60405180910390a25050565b6001600160a01b0381166000908152600760205260408120600301549003610c085750565b6008546001600160a01b0382166000908152600760205260409020600401544291610c3291612648565b10610c7f5760405162461bcd60e51b815260206004820152601b60248201527f447373476f762f6e6f742d616c6c6f7765642d746f2d636c6561720000000000604482015260640161077e565b6001600160a01b0381166000908152600760205260408120600380820183905560029091015481549092839291610cb790849061265b565b90915550506003546040519081526000805160206127008339815191529060200160405180910390a1610ceb82600061209f565b610d016819195b1959d85d195960ba1b83612175565b6040516001600160a01b038316907f832e6903187c7c13e6dd325d0792d02ed4fb30e708d69386ece3ddc029fd9b4f90600090a25050565b33600090815260076020526040902060030154600114610dfb57336000908152600760205260408120600160038083019190915560029091015481549092839291610d85908490612648565b90915550506003546040519081526000805160206127008339815191529060200160405180910390a1610db8338261209f565b610dce6819195b1959d85d195960ba1b33612268565b60405133907ffee8775ba9b0f00b87db291c081d99de518bdebb6ccfa2482cc5882fe69307e590600090a2505b33600090815260076020526040902042600490910155565b33600090815260208190526040902054600114610e425760405162461bcd60e51b815260040161077e906125d6565b6001600160a01b03811660008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b60008381526005602052604090206006015415610eb65760405162461bcd60e51b815260040161077e90612605565b600083815260056020526040902060010154421115610f175760405162461bcd60e51b815260206004820152601760248201527f447373476f762f70726f706f73616c2d65787069726564000000000000000000604482015260640161077e565b600083815260056020526040902054610f339033908490612314565b811115610f825760405162461bcd60e51b815260206004820152601c60248201527f447373476f762f616d6f756e742d657863656564732d72696768747300000000604482015260640161077e565b600b54610f8f9042612648565b3360009081526007602052604090206006015411610fb957600b54610fb49042612648565b610fcd565b336000908152600760205260409020600601545b33600081815260076020818152604080842060060195909555878352600580825285842094845291840181529382208054908690559187905292839052910154829061101a90839061265b565b6110249190612648565b600560008681526020019081526020016000206005018190555082847f6bbb2afba842b206b06bf91942742fa3dc08583f4653646faadfcffea72402ba8460405161107191815260200190565b60405180910390a35050336000908152600760205260409020426004909101555050565b6001600160a01b0380831660009081526007602052604090206001015481169082168190036111065760405162461bcd60e51b815260206004820152601860248201527f447373476f762f616c72656164792d64656c6567617465640000000000000000604482015260640161077e565b6001600160a01b03831633148061113757506001600160a01b0381163314801561113757506001600160a01b038216155b8061117b57506009546001600160a01b038416600090815260076020526040902060040154429161116791612648565b10801561117b57506001600160a01b038216155b6111c75760405162461bcd60e51b815260206004820181905260248201527f447373476f762f6e6f742d617574686f72697a65642d64656c65676174696f6e604482015260640161077e565b6001600160a01b0383811660009081526007602052604081206001810180546001600160a01b031916868516179055549183161580159061122357506001600160a01b0383166000908152600760205260409020600301546001145b905060006001600160a01b0385161580159061125a57506001600160a01b0385166000908152600760205260409020600301546001145b9050818015611267575080155b156112ac57826003600082825461127e919061265b565b90915550506003546040519081526000805160206127008339815191529060200160405180910390a16112f8565b811580156112b75750805b156112f85782600360008282546112ce9190612648565b90915550506003546040519081526000805160206127008339815191529060200160405180910390a15b6001600160a01b038416156113e6576001600160a01b03808516600090815260076020526040808220600690810154938a1683529120015411611356576001600160a01b038416600090815260076020526040902060060154611373565b6001600160a01b0386166000908152600760205260409020600601545b6001600160a01b0380881660009081526007602052604080822060060193909355908616815290812060020180548592906113af90849061265b565b909155505081156113e1576001600160a01b0384166000908152600760205260409020600201546113e190859061209f565b6113f8565b6113f86437bbb732b960d91b87612268565b6001600160a01b03851615611469576001600160a01b03851660009081526007602052604081206002018054859290611432908490612648565b90915550508015611464576001600160a01b03851660009081526007602052604090206002015461146490869061209f565b61147b565b61147b6437bbb732b960d91b87612175565b846001600160a01b0316866001600160a01b03167fab7d75eccd27c9989942a3a6e4137e415df0ad90ec428751b16361f16fe8780f60405160405180910390a350503360009081526007602052604090204260049091015550505050565b336000908152602081905260409020546001146115085760405162461bcd60e51b815260040161077e906125d6565b6001600160a01b038116600081815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b3360009081526020819052604090205460011461157b5760405162461bcd60e51b815260040161077e906125d6565b6001600160a01b03811660008181526006602052604080822060019055517f8a2aab8185d72e0f5c307500011dc19302fcd5688455fb2f5638dc10202a98289190a250565b60008281526005602090815260408083206001600160a01b03851684526007019091529020545b92915050565b3360009081526007602052604090206005015442101561161f5760405162461bcd60e51b815260040161077e9061266e565b336000908152600760205260409020600601544210156116515760405162461bcd60e51b815260040161077e9061266e565b604051632770a7eb60e21b8152336004820152602481018290527f000000000000000000000000c8c136a42ba279df2637686e5e59789674048fbe6001600160a01b031690639dc29fac90604401600060405180830381600087803b1580156116b957600080fd5b505af11580156116cd573d6000803e3d6000fd5b505033600090815260076020526040812080548594509092506116f190849061265b565b9091555050336000908152600760205260409020600101546001600160a01b03168015611809576001600160a01b0381166000908152600760205260409020600601544210156117535760405162461bcd60e51b815260040161077e9061266e565b6001600160a01b0381166000908152600760205260408120600201805484929061177e90849061265b565b90915550506001600160a01b038116600090815260076020526040902060030154600103611809576001600160a01b0381166000908152600760205260409020600201546117cd90829061209f565b81600360008282546117df919061265b565b90915550506003546040519081526000805160206127008339815191529060200160405180910390a15b60405163a9059cbb60e01b8152336004820152602481018390527f00000000000000000000000036d8c21602ada33ab50070214c6e9e24be0ab97e6001600160a01b03169063a9059cbb90604401600060405180830381600087803b15801561187157600080fd5b505af1158015611885573d6000803e3d6000fd5b50506040518481523392507fce6c5af8fd109993cb40da4d5dc9e4dd8e61bc2e48f1e3901472141e4f56f29391506020015b60405180910390a2505033600090815260076020526040902042600490910155565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000036d8c21602ada33ab50070214c6e9e24be0ab97e6001600160a01b0316906323b872dd90606401600060405180830381600087803b15801561194757600080fd5b505af115801561195b573d6000803e3d6000fd5b50506040516340c10f1960e01b8152336004820152602481018490527f000000000000000000000000c8c136a42ba279df2637686e5e59789674048fbe6001600160a01b031692506340c10f199150604401600060405180830381600087803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505033600090815260076020526040812080548594509092506119ff908490612648565b9091555050336000908152600760205260409020600101546001600160a01b03168015611adc576001600160a01b03811660009081526007602052604081206002018054849290611a51908490612648565b90915550506001600160a01b038116600090815260076020526040902060030154600103611adc576001600160a01b038116600090815260076020526040902060020154611aa090829061209f565b8160036000828254611ab29190612648565b90915550506003546040519081526000805160206127008339815191529060200160405180910390a15b60405182815233907f625fed9875dada8643f2418b838ae0bc78d9a148a18eee4ee1979ff0f3f5d427906020016118b7565b6000600154600114611b585760405162461bcd60e51b8152602060048201526013602482015272111cdcd1dbdd8bdb9bdd0b5b185d5b98da1959606a1b604482015260640161077e565b33600090815260066020526040902054600103611c475733600090815260066020526040812060018101546002909101549091611b98620151804261269a565b9050808314611ba8576000611baa565b815b91506010548210611c095760405162461bcd60e51b8152602060048201526024808201527f447373476f762f6d61782d616d6f756e742d70726f706f73616c732d70726f7060448201526337b9b2b960e11b606482015260840161077e565b3360009081526006602052604090206001908101829055611c2b908390612648565b3360009081526006602052604090206002015550611cfb915050565b600d54336000908152600760205260409020541015611ca85760405162461bcd60e51b815260206004820152601960248201527f447373476f762f6e6f742d6d696e696d756d2d616d6f756e7400000000000000604482015260640161077e565b33600090815260076020526040902060050154421015611cda5760405162461bcd60e51b815260040161077e9061266e565b600a54611ce79042612648565b336000908152600760205260409020600501555b60048054600101908190556000818152600560205260409020438155600c54611d249042612648565b60018201556002810180546001600160a01b038088166001600160a01b031992831681179093556003808501805492891692909316821790925590546004840155600060058401819055600684018190556040518593917f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c191a450336000908152600760205260409020426004909101559392505050565b60008181526005602052604090206006015415611deb5760405162461bcd60e51b815260040161077e90612605565b600081815260056020526040902060010154421115611e425760405162461bcd60e51b8152602060048201526013602482015272111cdcd1dbdd8bdd9bdd194b595e1c1a5c9959606a1b604482015260640161077e565b600e54600082815260056020526040902060040154606491611e63916126bc565b611e6d919061269a565b6000828152600560208190526040909120015411611ecd5760405162461bcd60e51b815260206004820152601760248201527f447373476f762f6e6f742d656e6f7567682d766f746573000000000000000000604482015260640161077e565b60008181526005602052604090819020600160068201556002810154600390910154915163a12191ab60e01b81526001600160a01b03928316600482015291169063a12191ab90602401600060405180830381600087803b158015611f3157600080fd5b505af1158015611f45573d6000803e3d6000fd5b50506040518392507f666a52a16fa433390211812f8a08f667304fdff23a0788b92ecd1405c525fd039150600090a25033600090815260076020526040902042600490910155565b600081815260056020526040902060060154600114611fbe5760405162461bcd60e51b815260040161077e90612605565b6000818152600560205260409081902060026006820181905581015460039091015491516335db093760e11b81526001600160a01b039283166004820152911690636bb6126e90602401600060405180830381600087803b15801561202257600080fd5b505af1158015612036573d6000803e3d6000fd5b50506040518392507f2521b0e1f676d7218baad3ddbb01bda39899b3c05f986ffc4437016bb21979769150600090a25033600090815260076020526040902042600490910155565b6002818154811061208e57600080fd5b600091825260209091200154905081565b6001600160a01b0382166000908152600760208190526040909120015480158015906120f057506001600160a01b038316600090815260076020908152604080832084845260080190915290205443145b15612126576001600160a01b03831660009081526007602090815260408083208484526008019091529020600101829055505050565b6001600160a01b03929092166000908152600760208181526040808420600196870193810184905581518083018352438152808401968752938552600801909152909120905181559051910155565b6002546001600160a01b038216600090815260076020908152604080832086845260090190915290205460015b81811161220557600060026121b7838661265b565b815481106121c7576121c76126d3565b60009182526020909120015560028054806121e4576121e46126e9565b600190038181906000526020600020016000905590558060010190506121a2565b506001600160a01b0383166000818152600760209081526040808320888452600901825280832092909255905183815286917f8dfb7db4b6134280990762590a27e9832984cf1a10bce8e44303c412df184951910160405180910390a350505050565b600f5460005b818110156122b25760028054600181810183556000929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace018190550161226e565b506001600160a01b0382166000818152600760209081526040808320878452600901825291829020849055905183815285917f39592c77bd9e2d2a153b91a26c6d6e1fca1a09ecbfe2266389295aac9873f080910160405180910390a3505050565b6001600160a01b038316600090815260076020819052604082200154838110156123805760405162461bcd60e51b815260206004820152601960248201527f447373476f762f6e6f742d6578697374696e672d696e64657800000000000000604482015260640161077e565b6001600160a01b03851660009081526007602090815260408083208784526008018252918290208251808401909352805480845260019091015491830191909152841161240f5760405162461bcd60e51b815260206004820152601d60248201527f447373476f762f6e6f742d636f72726563742d736e617073686f742d31000000604482015260640161077e565b8185148061245857506001600160a01b03861660009081526007602052604081208591600890910190612443886001612648565b81526020019081526020016000206000015410155b6124a45760405162461bcd60e51b815260206004820152601d60248201527f447373476f762f6e6f742d636f72726563742d736e617073686f742d32000000604482015260640161077e565b6020015195945050505050565b6000602082840312156124c357600080fd5b5035919050565b80356001600160a01b03811681146124e157600080fd5b919050565b6000602082840312156124f857600080fd5b612501826124ca565b9392505050565b6000806040838503121561251b57600080fd5b50508035926020909101359150565b60008060006060848603121561253f57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561256957600080fd5b612572836124ca565b9150612580602084016124ca565b90509250929050565b6000806040838503121561259c57600080fd5b82359150612580602084016124ca565b600080604083850312156125bf57600080fd5b6125c8836124ca565b946020939093013593505050565b602080825260159082015274111cdcd1dbdd8bdb9bdd0b585d5d1a1bdc9a5e9959605a1b604082015260600190565b602080825260139082015272447373476f762f77726f6e672d73746174757360681b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156115e7576115e7612632565b818103818111156115e7576115e7612632565b602080825260129082015271111cdcd1dbdd8bdd5cd95c8b5b1bd8dad95960721b604082015260600190565b6000826126b757634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176115e7576115e7612632565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfe6b30bd87bd1850cfa4241ebd90c471dad096f0e44a75f007daa801eff5c60d11a26469706673582212206c609bc5600d9166c943b7d7046f52034ee2e5e5c289c6e0d91090e8335d0fae64736f6c634300081c0033