{
  "address": "0xf0fD3C872FD7ae5aF60d866A293322d0e98fAe53",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IElection",
          "name": "election",
          "type": "address"
        }
      ],
      "name": "ElectionUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "MaxMajorCandidateUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "candidate",
          "type": "address"
        }
      ],
      "name": "RemoveCandidate",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IStake",
          "name": "stake",
          "type": "address"
        }
      ],
      "name": "StakeUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "candidate",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "UpsetCandidate",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "MAX_MAJOR_CANDIDATES",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "candidates",
      "outputs": [
        {
          "internalType": "address",
          "name": "prev",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "next",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "election",
      "outputs": [
        {
          "internalType": "contract IElection",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "candidate",
          "type": "address"
        }
      ],
      "name": "exists",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "headCandidate",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IStake",
          "name": "_stake",
          "type": "address"
        },
        {
          "internalType": "contract IElection",
          "name": "_election",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "candidate",
          "type": "address"
        }
      ],
      "name": "isMajor",
      "outputs": [
        {
          "internalType": "bool",
          "name": "existed",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "majorCandidateList",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "majors",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "candidate",
          "type": "address"
        }
      ],
      "name": "remove",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stake",
      "outputs": [
        {
          "internalType": "contract IStake",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "tailCandidate",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalCandidates",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "candidate",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "anchor",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "maxSlippage",
          "type": "uint256"
        }
      ],
      "name": "upsetCandidateWithAnchor",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x3e0d6fdebfc25752e2dc843180e0fba80f7a7db874b94cb34fad9ab7e24d531f",
  "receipt": {
    "to": null,
    "from": "0xF1658C608708172655A8e70a1624c29F956Ee63D",
    "contractAddress": "0xf0fD3C872FD7ae5aF60d866A293322d0e98fAe53",
    "transactionIndex": 38,
    "gasUsed": "1434973",
    "logsBloom": "0x00000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000010000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000080000000000000000000000000000000000000000004000000000000000000001200000000100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000",
    "blockHash": "0x5d80fd6f224d51bab39a19ae5d3692e087f7dd82f25f8439c39d33ff326387b4",
    "transactionHash": "0x3e0d6fdebfc25752e2dc843180e0fba80f7a7db874b94cb34fad9ab7e24d531f",
    "logs": [
      {
        "transactionIndex": 38,
        "blockNumber": 28316103,
        "transactionHash": "0x3e0d6fdebfc25752e2dc843180e0fba80f7a7db874b94cb34fad9ab7e24d531f",
        "address": "0x0000000000000000000000000000000000001010",
        "topics": [
          "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63",
          "0x0000000000000000000000000000000000000000000000000000000000001010",
          "0x000000000000000000000000f1658c608708172655a8e70a1624c29f956ee63d",
          "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484"
        ],
        "data": "0x000000000000000000000000000000000000000000000000000cbec039717ae700000000000000000000000000000000000000000000000049bd9e28ab6866e4000000000000000000000000000000000000000000000000738cc4a10d20f5fd00000000000000000000000000000000000000000000000049b0df6871f6ebfd00000000000000000000000000000000000000000000000073998361469270e4",
        "logIndex": 230,
        "blockHash": "0x5d80fd6f224d51bab39a19ae5d3692e087f7dd82f25f8439c39d33ff326387b4"
      }
    ],
    "blockNumber": 28316103,
    "cumulativeGasUsed": "9386956",
    "status": 1,
    "byzantium": true
  },
  "args": [],
  "numDeployments": 1,
  "solcInputHash": "28a0b0bba0d34a2e0f97b06f2c3c6d0b",
  "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IElection\",\"name\":\"election\",\"type\":\"address\"}],\"name\":\"ElectionUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"MaxMajorCandidateUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"candidate\",\"type\":\"address\"}],\"name\":\"RemoveCandidate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IStake\",\"name\":\"stake\",\"type\":\"address\"}],\"name\":\"StakeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"candidate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"UpsetCandidate\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_MAJOR_CANDIDATES\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"candidates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"prev\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"next\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"election\",\"outputs\":[{\"internalType\":\"contract IElection\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"candidate\",\"type\":\"address\"}],\"name\":\"exists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"headCandidate\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IStake\",\"name\":\"_stake\",\"type\":\"address\"},{\"internalType\":\"contract IElection\",\"name\":\"_election\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"candidate\",\"type\":\"address\"}],\"name\":\"isMajor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"existed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"majorCandidateList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"majors\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"candidate\",\"type\":\"address\"}],\"name\":\"remove\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stake\",\"outputs\":[{\"internalType\":\"contract IStake\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tailCandidate\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalCandidates\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"candidate\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"anchor\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxSlippage\",\"type\":\"uint256\"}],\"name\":\"upsetCandidateWithAnchor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Alexandas\",\"details\":\"MajorCandidates contract\",\"kind\":\"dev\",\"methods\":{\"exists(address)\":{\"details\":\"return whether a candidate is existed in the sorted list\",\"params\":{\"candidate\":\"candidate address\"},\"returns\":{\"_0\":\"whether the candidate is existed in the sorted list\"}},\"initialize(address,address)\":{\"details\":\"proxy initialize function\",\"params\":{\"_election\":\"`Election` contract\",\"_stake\":\"`Stake` contract\"}},\"isMajor(address)\":{\"details\":\"return whether a candidate is a major candidate\",\"params\":{\"candidate\":\"candidate address\"},\"returns\":{\"existed\":\"the candidate is a major candidate\"}},\"majorCandidateList()\":{\"details\":\"return all major candidates\",\"returns\":{\"majors\":\"all major candidates\"}},\"remove(address)\":{\"details\":\"emit removed a candidate from the sorted list\",\"params\":{\"candidate\":\"candidate address\"}},\"upsetCandidateWithAnchor(address,uint256,address,uint256)\":{\"details\":\"insert or update a candidate in the sorted list\",\"params\":{\"amount\":\"candidate votes\",\"anchor\":\"anchor candidate address\",\"candidate\":\"candidate address\",\"maxSlippage\":\"maximum rank change value for the candidate from the anchor candidate\"}}},\"stateVariables\":{\"MAX_MAJOR_CANDIDATES\":{\"details\":\"return max major candidates\"},\"candidates\":{\"details\":\"return candidate inforamtion\"},\"election\":{\"details\":\"return `Election` contract address\"},\"headCandidate\":{\"details\":\"return head candidate address\"},\"stake\":{\"details\":\"return `Stake` contract address\"},\"tailCandidate\":{\"details\":\"return tail candidate address\"},\"totalCandidates\":{\"details\":\"return total candidates\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/election/MajorCandidates.sol\":\"MajorCandidates\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":false},\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n *     function initialize() initializer public {\\n *         __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n *     }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n *     function initializeV2() reinitializer(2) public {\\n *         __ERC20Permit_init(\\\"MyToken\\\");\\n *     }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n *     _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     * @custom:oz-retyped-from bool\\n     */\\n    uint8 private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Triggered when the contract has been initialized or reinitialized.\\n     */\\n    event Initialized(uint8 version);\\n\\n    /**\\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n     * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n     */\\n    modifier initializer() {\\n        bool isTopLevelCall = !_initializing;\\n        require(\\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\\n            \\\"Initializable: contract is already initialized\\\"\\n        );\\n        _initialized = 1;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n        }\\n        _;\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n            emit Initialized(1);\\n        }\\n    }\\n\\n    /**\\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n     * used to initialize parent contracts.\\n     *\\n     * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n     * initialization step. This is essential to configure modules that are added through upgrades and that require\\n     * initialization.\\n     *\\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n     * a contract, executing them in the right order is up to the developer or operator.\\n     */\\n    modifier reinitializer(uint8 version) {\\n        require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n        _initialized = version;\\n        _initializing = true;\\n        _;\\n        _initializing = false;\\n        emit Initialized(version);\\n    }\\n\\n    /**\\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n     */\\n    modifier onlyInitializing() {\\n        require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n     * through proxies.\\n     */\\n    function _disableInitializers() internal virtual {\\n        require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n        if (_initialized < type(uint8).max) {\\n            _initialized = type(uint8).max;\\n            emit Initialized(type(uint8).max);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `from` to `to` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x4e733d3164f73f461eaf9d8087a7ad1ea180bdc8ba0d3d61b0e1ae16d8e63dff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n     *\\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n     * constructor.\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize/address.code.length, which returns 0\\n        // for contracts in construction, since the code is only stored at the end\\n        // of the constructor execution.\\n\\n        return account.code.length > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n                /// @solidity memory-safe-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\"},\"contracts/election/MajorCandidates.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\n\\npragma solidity >0.8.0;\\n\\nimport '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';\\nimport '../interfaces/IMajorCandidates.sol';\\n\\n/// @dev MajorCandidates contract\\n/// @author Alexandas\\ncontract MajorCandidates is IMajorCandidates, Initializable {\\n\\tstruct Candidate {\\n\\t\\taddress prev;\\n\\t\\taddress next;\\n\\t\\tuint256 amount;\\n\\t}\\n\\n\\t/// @dev return `Stake` contract address\\n\\tIStake public override stake;\\n\\n\\t/// @dev return `Election` contract address\\n\\tIElection public override election;\\n\\n\\t/// @dev return head candidate address\\n\\taddress public headCandidate;\\n\\n\\t/// @dev return tail candidate address\\n\\taddress public tailCandidate;\\n\\n\\t/// @dev return total candidates\\n\\tuint256 public totalCandidates;\\n\\n\\t/// @dev return candidate inforamtion\\n\\tmapping(address => Candidate) public candidates;\\n\\n\\t/// @dev return max major candidates\\n\\tuint256 public override MAX_MAJOR_CANDIDATES;\\n\\n\\tmodifier onlyStake() {\\n\\t\\trequire(msg.sender == address(stake), 'MajorCandidates: caller must be Stake contract');\\n\\t\\t_;\\n\\t}\\n\\n\\tmodifier onlyElection() {\\n\\t\\trequire(msg.sender == address(election), 'MajorCandidates: caller must be Election contract');\\n\\t\\t_;\\n\\t}\\n\\n\\tmodifier validateGrades() {\\n\\t\\taddress[] memory olds = majorCandidateList();\\n\\t\\t_;\\n\\t\\taddress[] memory news = majorCandidateList();\\n\\t\\taddress downgrade = _differOne(olds, news);\\n\\t\\taddress upgrade = _differOne(news, olds);\\n\\t\\tif (downgrade != address(0)) {\\n\\t\\t\\tstake.downgrade(downgrade);\\n\\t\\t}\\n\\t\\tif (upgrade != address(0)) {\\n\\t\\t\\tstake.upgrade(upgrade);\\n\\t\\t}\\n\\t}\\n\\n\\t/// @dev proxy initialize function\\n\\t/// @param _stake `Stake` contract\\n\\t/// @param _election `Election` contract\\n\\tfunction initialize(IStake _stake, IElection _election) external initializer {\\n\\t\\t_setStake(_stake);\\n\\t\\t_setElection(_election);\\n\\t\\t_setMaxMajorLength(1);\\n\\t}\\n\\n\\t/// @dev return whether a candidate is a major candidate\\n\\t/// @param candidate candidate address\\n\\t/// @return existed the candidate is a major candidate\\n\\tfunction isMajor(address candidate) public view override returns (bool existed) {\\n\\t\\tif (headCandidate != address(0)) {\\n\\t\\t\\taddress from = headCandidate;\\n\\t\\t\\tfor (uint256 i = 0; i < MAX_MAJOR_CANDIDATES; i++) {\\n\\t\\t\\t\\tif (from == candidate) {\\n\\t\\t\\t\\t\\texisted = true;\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tfrom = candidates[from].next;\\n\\t\\t\\t\\tif (from == address(0)) {\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t/// @dev return all major candidates\\n\\t/// @return majors all major candidates\\n\\tfunction majorCandidateList() public view override returns (address[] memory majors) {\\n\\t\\tuint256 limit = totalCandidates > MAX_MAJOR_CANDIDATES ? MAX_MAJOR_CANDIDATES : totalCandidates;\\n\\t\\tif (headCandidate != address(0)) {\\n\\t\\t\\tmajors = new address[](limit);\\n\\t\\t\\taddress candidate = headCandidate;\\n\\t\\t\\tfor (uint256 i = 0; i < limit; i++) {\\n\\t\\t\\t\\tmajors[i] = candidate;\\n\\t\\t\\t\\tcandidate = candidates[candidate].next;\\n\\t\\t\\t\\tif (candidate == address(0)) {\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _differOne(address[] memory inner, address[] memory outer) internal pure returns (address one) {\\n\\t\\tfor (uint256 i = 0; i < inner.length; i++) {\\n\\t\\t\\tbool _exists = false;\\n\\t\\t\\tfor (uint256 j = 0; j < outer.length; j++) {\\n\\t\\t\\t\\tif (inner[i] == outer[j]) {\\n\\t\\t\\t\\t\\t_exists = true;\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tif (!_exists) {\\n\\t\\t\\t\\tone = inner[i];\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t/// @dev insert or update a candidate in the sorted list\\n\\t/// @param candidate candidate address\\n\\t/// @param amount candidate votes\\n\\t/// @param anchor anchor candidate address\\n\\t/// @param maxSlippage maximum rank change value for the candidate from the anchor candidate\\n\\tfunction upsetCandidateWithAnchor(\\n\\t\\taddress candidate,\\n\\t\\tuint256 amount,\\n\\t\\taddress anchor,\\n\\t\\tuint256 maxSlippage\\n\\t) external override onlyElection validateGrades {\\n\\t\\trequire(candidate != address(0), 'MajorCandidates: invalid candidate');\\n\\t\\tif (totalCandidates == 0) {\\n\\t\\t\\t// insert the first candidate into the list\\n\\t\\t\\trequire(amount > 0, 'MajorCandidates: zero amount');\\n\\t\\t\\ttotalCandidates++;\\n\\t\\t\\theadCandidate = candidate;\\n\\t\\t\\ttailCandidate = candidate;\\n\\t\\t} else {\\n\\t\\t\\tif (amount == 0) {\\n\\t\\t\\t\\tif (!exists(candidate)) {\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn _removeCandidate(candidate);\\n\\t\\t\\t}\\n\\t\\t\\tif (!exists(anchor)) {\\n\\t\\t\\t\\tif (exists(candidate)) {\\n\\t\\t\\t\\t\\tanchor = candidate;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tanchor = tailCandidate;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tif (!exists(candidate)) {\\n\\t\\t\\t\\ttotalCandidates++;\\n\\t\\t\\t}\\n\\t\\t\\taddress start = anchor;\\n\\t\\t\\tif (amount > candidates[start].amount) {\\n\\t\\t\\t\\tfor (uint256 i = 0; i < maxSlippage; i++) {\\n\\t\\t\\t\\t\\tif (start == headCandidate) {\\n\\t\\t\\t\\t\\t\\tif (start != candidate) {\\n\\t\\t\\t\\t\\t\\t\\t_resetCandidate(candidate);\\n\\t\\t\\t\\t\\t\\t\\tcandidates[candidate].prev = address(0);\\n\\t\\t\\t\\t\\t\\t\\theadCandidate = candidate;\\n\\t\\t\\t\\t\\t\\t\\tcandidates[start].prev = candidate;\\n\\t\\t\\t\\t\\t\\t\\tcandidates[candidate].next = start;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\taddress startPrev = candidates[start].prev;\\n\\t\\t\\t\\t\\tuint256 startPrevAmount = candidates[startPrev].amount;\\n\\t\\t\\t\\t\\tif (startPrevAmount > amount) {\\n\\t\\t\\t\\t\\t\\tif (startPrev != candidate) {\\n\\t\\t\\t\\t\\t\\t\\t_resetCandidate(candidate);\\n\\t\\t\\t\\t\\t\\t\\tcandidates[start].prev = candidate;\\n\\t\\t\\t\\t\\t\\t\\tcandidates[startPrev].next = candidate;\\n\\t\\t\\t\\t\\t\\t\\tcandidates[candidate].prev = startPrev;\\n\\t\\t\\t\\t\\t\\t\\tcandidates[candidate].next = start;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tstart = startPrev;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else if (amount < candidates[start].amount) {\\n\\t\\t\\t\\tfor (uint256 i = 0; i < maxSlippage; i++) {\\n\\t\\t\\t\\t\\tif (start == tailCandidate) {\\n\\t\\t\\t\\t\\t\\tif (start != candidate) {\\n\\t\\t\\t\\t\\t\\t\\t_resetCandidate(candidate);\\n\\t\\t\\t\\t\\t\\t\\tcandidates[candidate].next = address(0);\\n\\t\\t\\t\\t\\t\\t\\ttailCandidate = candidate;\\n\\t\\t\\t\\t\\t\\t\\tcandidates[start].next = candidate;\\n\\t\\t\\t\\t\\t\\t\\tcandidates[candidate].prev = start;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\taddress startNext = candidates[start].next;\\n\\t\\t\\t\\t\\tuint256 startNextAmount = candidates[startNext].amount;\\n\\t\\t\\t\\t\\tif (startNextAmount < amount) {\\n\\t\\t\\t\\t\\t\\tif (startNext != candidate) {\\n\\t\\t\\t\\t\\t\\t\\t_resetCandidate(candidate);\\n\\t\\t\\t\\t\\t\\t\\tcandidates[start].next = candidate;\\n\\t\\t\\t\\t\\t\\t\\tcandidates[startNext].prev = candidate;\\n\\t\\t\\t\\t\\t\\t\\tcandidates[candidate].prev = start;\\n\\t\\t\\t\\t\\t\\t\\tcandidates[candidate].next = startNext;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tstart = startNext;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tcandidates[candidate].amount = amount;\\n\\t\\taddress prev = candidates[candidate].prev;\\n\\t\\taddress next = candidates[candidate].next;\\n\\t\\tif (prev == address(0)) {\\n\\t\\t\\trequire(candidate == headCandidate, 'MajorCandidates: invalid order 1');\\n\\t\\t} else {\\n\\t\\t\\trequire(candidates[prev].amount > amount, 'MajorCandidates: invalid order 2');\\n\\t\\t}\\n\\t\\tif (next == address(0)) {\\n\\t\\t\\trequire(candidate == tailCandidate, 'MajorCandidates: invalid order 3');\\n\\t\\t} else {\\n\\t\\t\\trequire(candidates[next].amount < amount, 'MajorCandidates: invalid order 4');\\n\\t\\t}\\n\\t\\temit UpsetCandidate(candidate, amount);\\n\\t}\\n\\n\\t/// @dev emit removed a candidate from the sorted list\\n\\t/// @param candidate candidate address\\n\\tfunction remove(address candidate) external override onlyStake validateGrades {\\n\\t\\t_removeCandidate(candidate);\\n\\t}\\n\\n\\tfunction _resetCandidate(address candidate) internal {\\n\\t\\tif (!exists(candidate)) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\tif (headCandidate == candidate) {\\n\\t\\t\\taddress candidateNext = candidates[candidate].next;\\n\\t\\t\\tif (candidateNext != address(0)) {\\n\\t\\t\\t\\tcandidates[candidateNext].prev = address(0);\\n\\t\\t\\t\\theadCandidate = candidateNext;\\n\\t\\t\\t}\\n\\t\\t} else if (tailCandidate == candidate) {\\n\\t\\t\\taddress candidatePrev = candidates[candidate].prev;\\n\\t\\t\\tif (candidatePrev != address(0)) {\\n\\t\\t\\t\\tcandidates[candidatePrev].next = address(0);\\n\\t\\t\\t}\\n\\t\\t\\ttailCandidate = candidatePrev;\\n\\t\\t} else {\\n\\t\\t\\taddress candidatePrev = candidates[candidate].prev;\\n\\t\\t\\taddress candidateNext = candidates[candidate].next;\\n\\t\\t\\tcandidates[candidateNext].prev = candidatePrev;\\n\\t\\t\\tcandidates[candidatePrev].next = candidateNext;\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _removeCandidate(address candidate) internal {\\n\\t\\trequire(exists(candidate), 'MajorCandidates: nonexistent candidate');\\n\\t\\taddress curPrev = candidates[candidate].prev;\\n\\t\\taddress curNext = candidates[candidate].next;\\n\\t\\tif (curPrev == address(0)) {\\n\\t\\t\\t// remove head\\n\\t\\t\\tif (curNext == address(0)) {\\n\\t\\t\\t\\theadCandidate = address(0);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tcandidates[curNext].prev = address(0);\\n\\t\\t\\t\\theadCandidate = curNext;\\n\\t\\t\\t}\\n\\t\\t} else if (curNext == address(0)) {\\n\\t\\t\\t// remove tail\\n\\t\\t\\tcandidates[curPrev].next = address(0);\\n\\t\\t\\ttailCandidate = curPrev;\\n\\t\\t} else {\\n\\t\\t\\t// remove body\\n\\t\\t\\tcandidates[curPrev].next = curNext;\\n\\t\\t\\tcandidates[curNext].prev = curPrev;\\n\\t\\t}\\n\\t\\tdelete candidates[candidate];\\n\\t\\ttotalCandidates--;\\n\\t\\tif (totalCandidates == 0) {\\n\\t\\t\\theadCandidate = address(0);\\n\\t\\t\\ttailCandidate = address(0);\\n\\t\\t}\\n\\t\\temit RemoveCandidate(candidate);\\n\\t}\\n\\n\\t/// @dev return whether a candidate is existed in the sorted list\\n\\t/// @param candidate candidate address\\n\\t/// @return whether the candidate is existed in the sorted list\\n\\tfunction exists(address candidate) public view override returns (bool) {\\n\\t\\treturn candidates[candidate].amount > 0;\\n\\t}\\n\\n\\tfunction _setStake(IStake _stake) internal {\\n\\t\\tstake = _stake;\\n\\t\\temit StakeUpdated(_stake);\\n\\t}\\n\\n\\tfunction _setElection(IElection _election) internal {\\n\\t\\telection = _election;\\n\\t\\temit ElectionUpdated(_election);\\n\\t}\\n\\n\\tfunction _setMaxMajorLength(uint256 max) internal {\\n\\t\\tMAX_MAJOR_CANDIDATES = max;\\n\\t\\temit MaxMajorCandidateUpdated(max);\\n\\t}\\n}\\n\",\"keccak256\":\"0x0374e2b911b731db749ba7dda37b7dc8422d8f52757b47646cf1ea733d53fc3d\",\"license\":\"GPL-2.0-or-later\"},\"contracts/interfaces/ICandidateRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\nimport '../libraries/Types.sol';\\n\\n/// @dev Candidate registry interface\\n/// @author Alexandas\\ninterface ICandidateRegistry {\\n\\n\\t/// @dev emit when candidate registered\\n\\t/// @param candidate candidate address\\n\\tevent Register(address candidate);\\n\\n\\t/// @dev register a candidate with node manifest\\n\\t/// @param manifest node manifest\\n\\tfunction register(string memory manifest) external;\\n\\n\\t/// @dev return a candidate\\n\\t/// @param candidate candidate address\\n\\t/// @return candidate information\\n\\tfunction candidateInfo(address candidate) external view returns(Types.CandidateInfo memory);\\n\\n\\t/// @dev return a candidate address for a specific node manifest\\n\\t/// @param manifest node manifest\\n\\t/// @return candidate address\\n\\tfunction manifestMap(string memory manifest) external view returns(address);\\n\\n\\t/// @dev return whether a candidate is registered\\n\\t/// @param candidate candidate address\\n\\t/// @return whether the candidate is registered\\n\\tfunction isCandidateRegistered(address candidate) external view returns (bool);\\n\\n\\t/// @dev return grade of a candidate\\n\\t/// @param candidate candidate address\\n\\t/// @return candidate grade\\n\\tfunction gradeOf(address candidate) external view returns (Types.Grade);\\n\\n}\\n\",\"keccak256\":\"0xd8519308649be704107281712dcbe57e3720c5458193a2ab40dc51cebcb43b80\",\"license\":\"GPL-2.0-or-later\"},\"contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\nimport '@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol';\\n\\n/// @dev Burnable ERC20 Token interface\\n/// @author Alexandas\\ninterface IERC20 is IERC20Upgradeable {\\n\\n\\t/// @dev burn tokens\\n\\t/// @param amount token amount\\n\\tfunction burn(uint256 amount) external;\\n\\n\\t/// @dev burn tokens\\n\\t/// @param account user address\\n\\t/// @param amount token amount\\n\\tfunction burnFrom(address account, uint256 amount) external;\\n\\n}\\n\",\"keccak256\":\"0xb45f4f11d5a0a93d60c5238dfce558196db50b3986cee01f2e65b8781bcb7d4f\",\"license\":\"GPL-2.0-or-later\"},\"contracts/interfaces/IElection.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\nimport './IRewarder.sol';\\nimport './IStake.sol';\\nimport './IMajorCandidates.sol';\\nimport './IERC20.sol';\\n\\n/// @dev Election contract interface\\n/// @author Alexandas\\ninterface IElection {\\n\\n\\t/// @dev emit when ERC20 token address updated\\n\\t/// @param token ERC20 token address\\n\\tevent TokenUpdated(IERC20 token);\\n\\n\\t/// @dev emit when `Rewarder` contract updated\\n\\t/// @param rewarder `Rewarder` contract \\n\\tevent RewarderUpdated(IRewarder rewarder);\\n\\n\\t/// @dev emit when `Stake` contract updated\\n\\t/// @param stake `Stake` contract \\n\\tevent StakeUpdated(IStake stake);\\n\\n\\t/// @dev emit when `MajorCandidates` contract updated\\n\\t/// @param majorCandidates `MajorCandidates` contract \\n\\tevent MajorCandidatesUpdated(IMajorCandidates majorCandidates);\\n\\n\\t/// @dev emit when vote frozen period updated\\n\\t/// @param period vote frozen period\\n\\tevent VoteFrozenPeriodUpdated(uint256 period);\\n\\n\\t/// @dev emit when shares updated for a specific candidate\\n\\t/// @param candidate candidate address\\n\\tevent ShareUpdated(address candidate);\\n\\n\\t/// @dev emit when voter voted for a candidate\\n\\t/// @param candidate candidate address\\n\\t/// @param voter voter address\\n\\t/// @param amount token amount\\n\\tevent Vote(address candidate, address voter, uint256 amount);\\n\\n\\t/// @dev emit when voter claimed the reward\\n\\t/// @param candidate candidate address\\n\\t/// @param voter voter address\\n\\t/// @param to receiver address\\n\\t/// @param amount reward amount\\n\\tevent Claimed(address candidate, address voter, address to, uint256 amount);\\n\\n\\t/// @dev emit when voter withdrawn the votes\\n\\t/// @param candidate candidate address\\n\\t/// @param voter voter address\\n\\t/// @param to receiver address\\n\\t/// @param amount reward amount\\n\\tevent Withdrawn(address candidate, address voter, address to, uint256 amount);\\n\\n\\t/// @dev voter vote a specific candidate\\n\\t/// @param candidate candidate address\\n\\t/// @param voter voter address\\n\\t/// @param amount reward amount\\n\\t/// @param anchor anchor candidate address\\n\\t/// @param maxSlippage maximum rank change value for the candidate from the anchor candidate\\n\\tfunction vote(\\n\\t\\taddress candidate,\\n\\t\\taddress voter,\\n\\t\\tuint256 amount,\\n\\t\\taddress anchor,\\n\\t\\tuint256 maxSlippage\\n\\t) external;\\n\\n\\t/// @dev voter claim reward for a specific candidate\\n\\t/// @param candidate candidate address\\n\\t/// @param to receiver address\\n\\tfunction claim(address candidate, address to) external;\\n\\n\\t/// @dev voter withdraw reward for a specific candidate\\n\\t/// @param candidate candidate address\\n\\t/// @param amount reward amount\\n\\t/// @param to receiver address\\n\\t/// @param anchor anchor candidate address\\n\\t/// @param maxSlippage maximum rank change value for the candidate from the anchor candidate\\n\\tfunction withdraw(\\n\\t\\taddress candidate,\\n\\t\\tuint256 amount,\\n\\t\\taddress to,\\n\\t\\taddress anchor,\\n\\t\\tuint256 maxSlippage\\n\\t) external;\\n\\n\\t/// @dev voter withdraw votes and claim reward for a specific candidate\\n\\t/// @param candidate candidate address\\n\\t/// @param amount reward amount\\n\\t/// @param to receiver address\\n\\t/// @param anchor anchor candidate address\\n\\t/// @param maxSlippage maximum rank change value for the candidate from the anchor candidate\\n\\tfunction withdrawAndClaim(\\n\\t\\taddress candidate,\\n\\t\\tuint256 amount,\\n\\t\\taddress to,\\n\\t\\taddress anchor,\\n\\t\\tuint256 maxSlippage\\n\\t) external;\\n\\n\\t/// @dev candidate allocate reward for the voters\\n\\t/// @param candidate candidate address\\n\\t/// @param amount reward amount\\n\\tfunction onAllocate(address candidate, uint256 amount) external;\\n\\n\\t/// @dev return ERC20 token address\\n\\tfunction token() external view returns(IERC20);\\n\\n\\t/// @dev return `Rewarder` contract address\\n\\tfunction rewarder() external view returns(IRewarder);\\n\\n\\t/// @dev return `Stake` contract address\\n\\tfunction stake() external view returns(IStake);\\n\\n\\t/// @dev return `MajorCandidates` contract address\\n\\tfunction majorCandidates() external view returns(IMajorCandidates);\\n\\n\\t/// @dev return precision for shares\\n\\tfunction ACC_PRECISION() external view returns(uint256);\\n\\n\\t/// @dev return votes for a specific candidate\\n\\t/// @param candidate candidate address\\n\\t/// @return votes for a specific candidate\\n\\tfunction voteSupply(address candidate) external view returns(uint256);\\n\\n\\t/// @dev pending reward for a voter given a candidate\\n\\t/// @param candidate candidate address\\n\\t/// @param voter voter address\\n\\t/// @return pending pending reward\\n\\tfunction pendingReward(address candidate, address voter) external view returns (uint256 pending);\\n\\n}\\n\",\"keccak256\":\"0xad12e388dbfd8245c6e33fc8bd3adeb0a77c5ebcf28fd189114044d026670e7d\",\"license\":\"GPL-2.0-or-later\"},\"contracts/interfaces/IMajorCandidates.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\nimport './IElection.sol';\\nimport './IStake.sol';\\n\\n/// @dev MajorCandidates interface\\n/// @author Alexandas\\ninterface IMajorCandidates {\\n\\n\\t/// @dev emit when max major candidates changed\\n\\t/// @param max max major candidates\\n\\tevent MaxMajorCandidateUpdated(uint256 max);\\n\\n\\t/// @dev emit when `Election` contract changed\\n\\t/// @param election `Election` contract address\\n\\tevent ElectionUpdated(IElection election);\\n\\n\\t/// @dev emit when `Stake` contract updated\\n\\t/// @param stake `Stake` contract \\n\\tevent StakeUpdated(IStake stake);\\n\\n\\t/// @dev emit when a candidate insert or update in the sorted list\\n\\t/// @param candidate candidate address\\n\\t/// @param amount candidate votes\\n\\tevent UpsetCandidate(address candidate, uint256 amount);\\n\\n\\t/// @dev emit when a candidate removed from the sorted list\\n\\t/// @param candidate candidate address\\n\\tevent RemoveCandidate(address candidate);\\n\\n\\t/// @dev insert or update a candidate in the sorted list\\n\\t/// @param candidate candidate address\\n\\t/// @param amount candidate votes\\n\\t/// @param anchor anchor candidate address\\n\\t/// @param maxSlippage maximum rank change value for the candidate from the anchor candidate\\n\\tfunction upsetCandidateWithAnchor(\\n\\t\\taddress candidate,\\n\\t\\tuint256 amount,\\n\\t\\taddress anchor,\\n\\t\\tuint256 maxSlippage\\n\\t) external;\\n\\n\\t/// @dev emit removed a candidate from the sorted list\\n\\t/// @param candidate candidate address\\n\\tfunction remove(address candidate) external;\\n\\n\\t/// @dev return max major candidates\\n\\tfunction MAX_MAJOR_CANDIDATES() external view returns(uint256);\\n\\n\\t/// @dev return `Election` contract address\\n\\tfunction election() external view returns(IElection);\\n\\n\\t/// @dev return `Stake` contract address\\n\\tfunction stake() external view returns(IStake);\\n\\n\\t/// @dev return whether a candidate is existed in the sorted list\\n\\t/// @param candidate candidate address\\n\\t/// @return whether the candidate is existed in the sorted list\\n\\tfunction exists(address candidate) external view returns (bool);\\n\\n\\t/// @dev return whether a candidate is a major candidate\\n\\t/// @param candidate candidate address\\n\\t/// @return existed the candidate is a major candidate\\n\\tfunction isMajor(address candidate) external view returns(bool existed);\\n\\n\\t/// @dev return all major candidates\\n\\t/// @return majors all major candidates\\n\\tfunction majorCandidateList() external view returns(address[] memory majors);\\n\\n\\n}\\n\",\"keccak256\":\"0xe81b3600f2652084188b90a53ca9078786c17c5ffa59486a56c4a62250660f9b\",\"license\":\"GPL-2.0-or-later\"},\"contracts/interfaces/IPools.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\nimport './IERC20.sol';\\nimport './IRewarder.sol';\\nimport '../libraries/Types.sol';\\n\\n/// @dev Pools interface\\n/// @author Alexandas\\ninterface IPools {\\n\\n\\t/// @dev emit when ERC20 Token contract updated\\n\\t/// @param token ERC20 Token contract\\n\\tevent TokenUpdated(IERC20 token);\\n\\n\\t/// @dev emit when `Rewarder` contract updated\\n\\t/// @param rewarder `Rewarder` contract \\n\\tevent RewarderUpdated(IRewarder rewarder);\\n\\n\\t/// @dev emit when `rewardPerSecond` updated\\n\\t/// @param rewardPerSecond reward generated for per second\\n\\tevent RewardPerSecondUpdated(uint256 rewardPerSecond);\\n\\n\\t/// @dev emit when shares precision updated\\n\\t/// @param precision shares precision\\n\\tevent PrecisionUpdated(uint256 precision);\\n\\n\\t/// @dev emit when max coefficient updated\\n\\t/// @param maxCoef max coefficient\\n\\tevent MaxCoefUpdated(uint256 maxCoef);\\n\\n\\t/// @dev emit when add a pool\\n\\t/// @param grade pool grade\\n\\tevent AddPool(Types.Grade grade);\\n\\n\\t/// @dev emit when pool updated\\n\\t/// @param grade pool grade\\n\\tevent PoolUpdated(Types.Grade grade);\\n\\n\\t/// @dev return ERC20 token address\\n\\tfunction token() external view returns(IERC20);\\n\\n\\t/// @dev return `Rewarder` contract address\\n\\tfunction rewarder() external view returns(IRewarder);\\n\\n\\t/// @dev return precision for shares\\n\\tfunction ACC_PRECISION() external view returns(uint256);\\n\\n\\t/// @dev return max coefficient\\n\\tfunction MAXCOEF() external view returns(uint256);\\n\\n\\t/// @dev return total pools allocation points\\n\\tfunction totalAllocPoint() external view returns(uint256);\\n\\n\\t/// @dev return reward generated for per second\\n\\tfunction rewardPerSecond() external view returns(uint256);\\n\\n\\t/// @dev update a specific pool\\n\\t/// @param grade pool grade\\n\\t/// @return pool pool info\\n\\tfunction updatePool(Types.Grade grade) external returns (Types.PoolInfo memory pool);\\n\\n\\t/// @dev return a specific pool\\n\\t/// @param grade pool grade\\n\\t/// @return pool pool info\\n\\tfunction poolInfo(Types.Grade grade) external view returns(Types.PoolInfo memory);\\n\\n}\\n\",\"keccak256\":\"0xc5f1962a2579d1fadb8669766b62564436a6c4b779e38b0f9271fe74c7cbd613\",\"license\":\"GPL-2.0-or-later\"},\"contracts/interfaces/IRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\nimport '@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol';\\nimport './IERC20.sol';\\n\\n/// @dev Rewarder interface\\n/// @author Alexandas\\ninterface IRewarder {\\n\\n\\t/// @dev emit when ERC20 token address updated\\n\\t/// @param token ERC20 token address\\n\\tevent TokenUpdated(IERC20 token);\\n\\n\\t/// @dev emit when auth address updated\\n\\t/// @param auth authorized address\\n\\tevent AuthUpdated(address auth);\\n\\n\\t/// @dev emit when reward minted\\n\\t/// @param from authorized address\\n\\t/// @param to receiver address\\n\\t/// @param amount token amount\\n\\tevent Minted(address from, address to, uint256 amount);\\n\\n\\t/// @dev return ERC20 token address\\n\\tfunction token() external view returns(IERC20);\\n\\n\\t/// @dev mint reward to receiver\\n\\t/// @param to receiver address\\n\\t/// @param amount token amount\\n\\tfunction mint(address to, uint256 amount) external;\\n\\n}\",\"keccak256\":\"0xc41fb19972737ba746c9dea24922b35745aaff3a6c5839993269a843bffe3160\",\"license\":\"GPL-2.0-or-later\"},\"contracts/interfaces/ISlasher.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\nimport '../libraries/Types.sol';\\nimport './IMajorCandidates.sol';\\nimport './IStake.sol';\\n\\n/// @dev Slasher interface\\n/// @author Alexandas\\ninterface ISlasher {\\n\\n\\t/// @dev emit when governance address updated\\n\\t/// @param governance governance address\\n\\tevent GovernanceUpdated(address governance);\\n\\n\\t/// @dev emit when `Stake` contract updated\\n\\t/// @param stake `Stake` contract \\n\\tevent StakeUpdated(IStake stake);\\n\\n\\t/// @dev emit when `MajorCandidates` contract updated\\n\\t/// @param majorCandidates `MajorCandidates` contract \\n\\tevent MajorCandidatesUpdated(IMajorCandidates majorCandidates);\\n\\n\\t/// @dev emit when default slash amount updated\\n\\t/// @param amount slash amount\\n\\tevent DefaultSlashAmountUpdated(uint256 amount);\\n\\n\\t/// @dev emit when public notice period updated\\n\\t/// @param period public notice period\\n\\tevent PublicNoticePeriodUpdated(uint256 period);\\n\\n\\t/// @dev emit when max coefficient updated\\n\\t/// @param maxCoef max coefficient\\n\\tevent MaxCoefUpdated(uint256 maxCoef);\\n\\n\\t/// @dev emit when drafter slash reward coefficient updated\\n\\t/// @param drafterCoef drafter slash reward coefficient\\n\\tevent DrafterCoefUpdated(uint64 drafterCoef);\\n\\n\\t/// @dev emit when validator slash reward coefficient updated\\n\\t/// @param validatorCoef validator slash reward coefficient\\n\\tevent ValidatorCoefUpdated(uint256 validatorCoef);\\n\\n\\t/// @dev emit when executor slash reward coefficient updated\\n\\t/// @param executorCoef executor slash reward coefficient\\n\\tevent ExecutorCoefUpdated(uint256 executorCoef);\\n\\n\\t/// @dev emit when slash drafted\\n\\t/// @param nonce slash number\\n\\t/// @param candidate candidate address\\n\\t/// @param slashBlock slashed block in posc\\n\\t/// @param manifest node manifest\\n\\t/// @param accuracy posc accuracy\\n\\tevent DraftSlash(uint256 nonce, address candidate, uint64 slashBlock, string manifest, uint64 accuracy);\\n\\n\\t/// @dev emit when slash drafted\\n\\t/// @param nonce slash number\\n\\tevent RejectSlash(uint256 nonce);\\n\\n\\t/// @dev emit when slash drafted\\n\\t/// @param nonce slash number\\n\\tevent ExecuteSlash(uint256 nonce, address executor);\\n\\n\\t/// @dev return `Stake` contract address\\n\\tfunction stake() external view returns(IStake);\\n\\n\\t/// @dev return `MajorCandidates` contract address\\n\\tfunction majorCandidates() external view returns(IMajorCandidates);\\n\\n\\t/// @dev return default slash amount\\n\\tfunction defaultSlashAmount() external view returns(uint256);\\n\\n\\t/// @dev return public notice period\\n\\tfunction publicNoticePeriod() external view returns(uint256);\\n\\n\\t/// @dev return current slash nonce\\n\\tfunction nonce() external view returns(uint256);\\n\\n\\t/// @dev return max coefficient\\n\\tfunction MAXCOEF() external view returns(uint64);\\n\\n\\t/// @dev return drafter slash reward coefficient\\n\\tfunction drafterCoef() external view returns(uint64);\\n\\n\\t/// @dev return validator slash reward coefficient\\n\\tfunction validatorCoef() external view returns(uint64);\\n\\n\\t/// @dev return executor slash reward coefficient\\n\\tfunction executorCoef() external view returns(uint64);\\n\\n\\t/// @dev return slash information at a specific nonce\\n\\t/// @param _nonce nonce number\\n\\t/// @return slash information\\n\\tfunction getSlashAt(uint256 _nonce) external view returns(Types.SlashInfo memory);\\n\\n\\t/// @dev return nonce given a candidate if the candidate is in slashing\\n\\t/// @param candidate candidate address\\n\\t/// @return nonce number\\n\\tfunction nonceOf(address candidate) external view returns(uint256);\\n\\n\\t/// @dev set drafter slash reward coefficient\\n\\t/// @param _drafterCoef drafter slash reward coefficient\\n\\tfunction setDrafterCoef(uint64 _drafterCoef) external;\\n\\n\\t/// @dev set validator slash reward coefficient\\n\\t/// @param _validatorCoef validator slash reward coefficient\\n\\tfunction setValidatorCoef(uint64 _validatorCoef) external;\\n\\n\\t/// @dev set executor slash reward coefficient\\n\\t/// @param _executorCoef executor slash reward coefficient\\n\\tfunction setExecutorCoef(uint64 _executorCoef) external;\\n\\n\\t/// @dev draft a slash\\n\\t/// @param slashBlock slashed block in posc\\n\\t/// @param manifest node manifest\\n\\t/// @param accuracy posc accuracy\\n\\t/// @param signatures major candidates signatures\\n\\tfunction draft(uint64 slashBlock, string memory manifest, uint64 accuracy, bytes[] memory signatures) external;\\n\\n\\t/// @dev reject a slash\\n\\t/// @param manifest node manifest\\n\\tfunction reject(string memory manifest) external;\\n\\n\\t/// @dev execute a slash\\n\\t/// @param manifest node manifest\\n\\tfunction execute(string memory manifest) external;\\n\\n\\t/// @dev return whether candidate is in slashing\\n\\t/// @param candidate candidate address\\n\\t/// @return whether candidate is in slashing\\n\\tfunction slashExists(address candidate) external view returns(bool);\\n\\n\\t/// @dev check whether signatures is valid\\n\\t/// @param hash message hash\\n\\t/// @param signatures signatures for major candidates\\n\\t/// @param signers major candidate signers\\n\\tfunction checkNSignatures(bytes32 hash, bytes[] memory signatures) external view returns(address[] memory signers);\\n\\n}\\n\",\"keccak256\":\"0x2a098f6fdb061970bf7f00c0018f3950b5d96d7d0702b21bfde897f973e6e36b\",\"license\":\"GPL-2.0-or-later\"},\"contracts/interfaces/IStake.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\nimport './IElection.sol';\\nimport './IMajorCandidates.sol';\\nimport './ISlasher.sol';\\nimport './IPools.sol';\\nimport './ICandidateRegistry.sol';\\n\\n/// @dev Stake interface\\n/// @author Alexandas\\ninterface IStake is IPools, ICandidateRegistry {\\n\\n\\t/// @dev emit when `Election` contract changed\\n\\t/// @param election `Election` contract address\\n\\tevent ElectionUpdated(IElection election);\\n\\n\\t/// @dev emit when `MajorCandidates` contract updated\\n\\t/// @param majorCandidates `MajorCandidates` contract \\n\\tevent IMajorCandidatesUpdated(IMajorCandidates majorCandidates);\\n\\n\\t/// @dev emit when `Slasher` contract updated\\n\\t/// @param slasher `Slasher` contract \\n\\tevent SlasherUpdated(ISlasher slasher);\\n\\n\\t/// @dev emit when minimum stake updated\\n\\t/// @param amount minimum stake\\n\\tevent MinStakeUpdated(uint256 amount);\\n\\n\\t/// @dev emit when stake frozen period updated\\n\\t/// @param period stake frozen period\\n\\tevent StakeFrozenPeriodUpdated(uint256 period);\\n\\n\\t/// @dev emit when claim frozen period updated\\n\\t/// @param period claim frozen period\\n\\tevent ClaimFrozenPeriodUpdated(uint256 period);\\n\\n\\t/// @dev emit when a candidate upgraded\\n\\t/// @param candidate candidate address\\n\\t/// @param fromGrade from grade\\n\\t/// @param toGrade to grade\\n\\tevent Upgrade(address candidate, Types.Grade fromGrade, Types.Grade toGrade);\\n\\n\\t/// @dev emit when a candidate downgraded\\n\\t/// @param candidate candidate address\\n\\t/// @param fromGrade from grade\\n\\t/// @param toGrade to grade\\n\\tevent Downgrade(address candidate, Types.Grade fromGrade, Types.Grade toGrade);\\n\\n\\t/// @dev emit when a candidate staked tokens\\n\\t/// @param from token consumer\\n\\t/// @param candidate candidate address\\n\\t/// @param amount token amount\\n\\tevent Stake(address from, address candidate, uint256 amount);\\n\\n\\t/// @dev emit when a candidate withdraw tokens\\n\\t/// @param candidate candidate address\\n\\t/// @param to token receiver\\n\\t/// @param amount token amount\\n\\tevent Withdrawn(address candidate, address to, uint256 amount);\\n\\n\\t/// @dev emit when a candidate claimed reward\\n\\t/// @param candidate candidate address\\n\\t/// @param to token receiver\\n\\t/// @param pending token amount\\n\\tevent Claimed(address candidate, address to, uint256 pending);\\n\\n\\t/// @dev emit when a candidate quit from the protocol\\n\\t/// @param grade candidate grade\\n\\t/// @param candidate candidate address\\n\\tevent Quit(Types.Grade grade, address candidate);\\n\\n\\t/// @dev emit when a candidate allocate reward for the voters\\n\\t/// @param candidate candidate address\\n\\t/// @param amount token amount\\n\\tevent VoterAllocated(address candidate, uint256 amount);\\n\\n\\t/// @dev emit when the reward for a candidate\\n\\t/// @param candidate candidate address\\n\\t/// @param amount token amount\\n\\tevent CandidateAllocated(address candidate, uint256 amount);\\n\\n\\t/// @dev emit when the vote reward coefficient updated\\n\\t/// @param coef vote reward coefficient\\n\\tevent VoteRewardCoefUpdated(uint256 coef);\\n\\n\\t/// @dev emit when drafted a slash\\n\\t/// @param candidate candidate address\\n\\t/// @param pendingSlash pending slash amount\\n\\tevent DraftSlash(address candidate, uint256 pendingSlash);\\n\\n\\t/// @dev emit when rejected a slash\\n\\t/// @param candidate candidate address\\n\\t/// @param pendingSlash pending slash amount\\n\\tevent RejectSlash(address candidate, uint256 pendingSlash);\\n\\n\\t/// @dev emit when executed a slash\\n\\t/// @param candidate candidate address\\n\\t/// @param pendingSlash pending slash amount\\n\\t/// @param beneficiaries slash reward beneficiaries\\n\\t/// @param amounts slash reward amounts\\n\\t/// @param burned burned amount\\n\\tevent ExcuteSlash(address candidate, uint256 pendingSlash, address[] beneficiaries, uint256[] amounts, uint256 burned);\\n\\n\\t/// @dev return `Election` contract\\n\\tfunction election() external view returns(IElection);\\n\\n\\t/// @dev return `MajorCandidates` contract\\n\\tfunction majorCandidates() external view returns(IMajorCandidates);\\n\\n\\t/// @dev return `Slasher` contract\\n\\tfunction slasher() external returns(ISlasher);\\n\\n\\t/// @dev candidate stake tokens\\n\\t/// @param amount token amount\\n\\tfunction stake(uint256 amount) external;\\n\\n\\t/// @dev register a candidate and stake tokens\\n\\t/// @param amount token amount\\n\\t/// @param manifest node manifest\\n\\tfunction registerAndStake(uint256 amount, string memory manifest) external;\\n\\n\\t/// @dev candidate quit from the protocol\\n\\t/// @param to token receiver\\n\\tfunction quit(address to) external;\\n\\n\\t/// @dev candidate claim reward from the protocol\\n\\t/// @param to token receiver\\n\\tfunction claim(address to) external;\\n\\n\\t/// @dev candidate withdraw the tokens and claim reward from the protocol\\n\\t/// @param amount token amount\\n\\t/// @param to token receiver\\n\\t// function withdrawAndClaim(uint256 amount, address to) external;\\n\\n\\t/// @dev return pending reward for a specific candidate\\n\\t/// @param candidate candidate address\\n\\t/// @return pending reward for the candidate\\n\\tfunction pendingReward(address candidate) external view returns (uint256 pending);\\n\\n\\t/// @dev set voter slash reward coefficient\\n\\t/// @param coef voter reward coefficient\\n\\tfunction setVoteRewardCoef(uint256 coef) external;\\n\\n\\t/// @dev set allocate the reward to voters from the candidate\\n\\t/// @param candidate candidate address\\n\\tfunction voterAllocate(address candidate) external;\\n\\n\\t/// @dev return voter reward coefficient for a specific candidate\\n\\t/// @param candidate candidate address\\n\\t/// @return coef voter reward coefficient\\n\\tfunction voteRewardCoef(address candidate) external view returns (uint256 coef);\\n\\n\\t/// @dev return pending voters allocation for a specific candidate\\n\\t/// @param candidate candidate address\\n\\t/// @return pending pending voters allocation\\n\\tfunction pendingVoterAllocation(address candidate) external view returns (uint256 pending);\\n\\n\\t/// @dev return pending candidate allocation\\n\\t/// @param candidate candidate address\\n\\t/// @return pending pending candidate allocation\\n\\tfunction pendingCandidateAllocation(address candidate) external view returns (uint256 pending);\\n\\n\\t/// @dev upgrade a candidate\\n\\t/// @param candidate candidate address\\n\\tfunction upgrade(address candidate) external;\\n\\n\\t/// @dev downgrade a candidate\\n\\t/// @param candidate candidate address\\n\\tfunction downgrade(address candidate) external;\\n\\n\\t/// @dev draft a slash for a candidate\\n\\t/// @param candidate candidate address\\n\\t/// @param amount slash amount\\n\\t/// @return pendingSlash real slash amount\\n\\tfunction draftSlash(address candidate, uint256 amount) external returns(uint256 pendingSlash);\\n\\n\\t/// @dev reject a slash for a candidate\\n\\t/// @param candidate candidate address\\n\\t/// @param pendingSlash real slash amount\\n\\tfunction rejectSlash(address candidate, uint256 pendingSlash) external;\\n\\n\\t/// @dev executed a slash for a candiate\\n\\t/// @param candidate candidate address\\n\\t/// @param slash slash amount\\n\\t/// @param beneficiaries slash reward beneficiaries\\n\\t/// @param amounts slash reward amounts\\n\\t/// @param burned burned amount\\n\\tfunction executeSlash(\\n\\t\\taddress candidate, \\n\\t\\tuint256 slash,\\n\\t\\taddress[] memory beneficiaries, \\n\\t\\tuint256[] memory amounts,\\n\\t\\tuint256 burned\\n\\t) external;\\n}\",\"keccak256\":\"0x9eeba75d51080c9762f25fb5872a0dc0e92aa3f7ec3533957379e6f10cb7978a\",\"license\":\"GPL-2.0-or-later\"},\"contracts/libraries/Types.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\nlibrary Types {\\n\\n\\tenum Grade {\\n\\t\\tNull,\\n\\t\\tMajor,\\n\\t\\tSecondary\\n\\t}\\n\\n\\tstruct CandidateInfo {\\n\\t\\tGrade grade;\\n\\t\\tuint256 amount;\\n\\t\\tint256 rewardDebt;\\n\\t\\tuint256 allocation;\\n\\t\\tstring manifest;\\n\\t}\\n\\n\\tstruct PoolInfo {\\n\\t\\tuint256 accPerShare;\\n\\t\\tuint256 lastRewardTime;\\n\\t\\tuint256 allocPoint;\\n\\t}\\n\\n\\tenum SlashStatus {\\n\\t\\tDrafted,\\n\\t\\tRejected,\\n\\t\\tExecuted\\n\\t}\\n\\n\\tstruct SlashInfo {\\n\\t\\taddress candidate;\\n\\t\\taddress drafter;\\n\\t\\taddress[] validators;\\n\\t\\tuint256 amount;\\n\\t\\tuint256 timestamp;\\n\\t\\tSlashStatus status;\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x5260f5f3e8e5cf789e355d0f4827e5c6a9c4289545a2a9d94732830cd80a9a1e\",\"license\":\"GPL-2.0-or-later\"}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b50611900806100206000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806340cdc3471161008c5780637809d1c8116100665780637809d1c8146101bc5780638ab66a90146101c5578063e9e9d2f414610210578063f6a3d24e1461022357600080fd5b806340cdc34714610181578063485cc955146101965780634b1d3ede146101a957600080fd5b80630cd282d5146100d4578063246c32f8146100fd57806329092d0e1461011d5780632a744e25146101325780633866965c146101455780633a4b66f11461015b575b600080fd5b6003546100e7906001600160a01b031681565b6040516100f491906112e5565b60405180910390f35b61011061010b366004611312565b610236565b6040516100f49190611343565b61013061012b366004611312565b6102cb565b005b6002546100e7906001600160a01b031681565b61014e60045481565b6040516100f49190611357565b600054610174906201000090046001600160a01b031681565b6040516100f49190611395565b610189610435565b6040516100f49190611400565b6101306101a4366004611437565b61052b565b600154610174906001600160a01b031681565b61014e60065481565b6102016101d3366004611312565b6005602052600090815260409020805460018201546002909201546001600160a01b03918216929091169083565b6040516100f493929190611474565b61013061021e3660046114ad565b610610565b610110610231366004611312565b610dcd565b6002546000906001600160a01b0316156102c6576002546001600160a01b031660005b6006548110156102c357836001600160a01b0316826001600160a01b0316141561028657600192506102c3565b6001600160a01b0391821660009081526005602052604090206001015490911690816102b1576102c3565b806102bb81611527565b915050610259565b50505b919050565b6000546201000090046001600160a01b031633146103045760405162461bcd60e51b81526004016102fb90611590565b60405180910390fd5b600061030e610435565b905061031982610ded565b6000610323610435565b905060006103318383610fc4565b9050600061033f8385610fc4565b90506001600160a01b038216156103b857600054604051632ae7f09960e01b8152620100009091046001600160a01b031690632ae7f099906103859085906004016112e5565b600060405180830381600087803b15801561039f57600080fd5b505af11580156103b3573d6000803e3d6000fd5b505050505b6001600160a01b0381161561042e5760005460405162900f0160e41b8152620100009091046001600160a01b031690630900f010906103fb9084906004016112e5565b600060405180830381600087803b15801561041557600080fd5b505af1158015610429573d6000803e3d6000fd5b505050505b5050505050565b606060006006546004541161044c57600454610450565b6006545b6002549091506001600160a01b031615610527578067ffffffffffffffff81111561047d5761047d6115a0565b6040519080825280602002602001820160405280156104a6578160200160208202803683370190505b506002549092506001600160a01b031660005b8281101561052457818482815181106104d4576104d46115b6565b6001600160a01b0392831660209182029290920181019190915292811660009081526005909352604090922060010154909116908161051257610524565b8061051c81611527565b9150506104b9565b50505b5090565b600054610100900460ff161580801561054b5750600054600160ff909116105b806105655750303b158015610565575060005460ff166001145b6105815760405162461bcd60e51b81526004016102fb90611617565b6000805460ff1916600117905580156105a4576000805461ff0019166101001790555b6105ad83611087565b6105b6826110e4565b6105c0600161112f565b801561060b576000805461ff00191690556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906106029060019061163b565b60405180910390a15b505050565b6001546001600160a01b0316331461063a5760405162461bcd60e51b81526004016102fb90611697565b6000610644610435565b90506001600160a01b03851661066c5760405162461bcd60e51b81526004016102fb906116e6565b6004546106d857600084116106935760405162461bcd60e51b81526004016102fb9061172d565b600480549060006106a383611527565b9091555050600280546001600160a01b0387166001600160a01b03199182168117909255600380549091169091179055610b5a565b836106fd576106e685610dcd565b6106ef57610cae565b6106f885610ded565b610cae565b61070683610dcd565b61072f5761071385610dcd565b156107205784925061072f565b6003546001600160a01b031692505b61073885610dcd565b610752576004805490600061074c83611527565b91905055505b6001600160a01b03831660009081526005602052604090206002015483908511156108ea5760005b838110156108e4576002546001600160a01b038381169116141561081657866001600160a01b0316826001600160a01b031614610811576107ba87611164565b6001600160a01b0380881660008181526005602052604080822080546001600160a01b0319908116825560028054821686179055948716808452918320805486168517905592909152600190910180549092161790555b6108e4565b6001600160a01b038083166000908152600560205260408082205490921680825291902060020154878111156108cf57886001600160a01b0316826001600160a01b0316146108c85761086889611164565b6001600160a01b038085166000818152600560205260408082208054858f166001600160a01b0319918216811790925594871680845282842060019081018054881684179055918452919092208054851690911781550180549092161790555b50506108e4565b509150806108dc81611527565b91505061077a565b50610b58565b6001600160a01b038116600090815260056020526040902060020154851015610b585760005b83811015610b56576003546001600160a01b03838116911614156109b057866001600160a01b0316826001600160a01b0316146109ab5761095087611164565b6001600160a01b03808816600081815260056020526040808220600180820180546001600160a01b03199081169091556003805482168717905595881680855292842001805486168517905592909152815490921690911790555b610b56565b6001600160a01b03808316600090815260056020526040808220600101549092168082529190206002015487811015610b4157886001600160a01b0316826001600160a01b031614610b3a57610a0589611164565b8860056000866001600160a01b03166001600160a01b0316815260200190815260200160002060010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508860056000846001600160a01b03166001600160a01b0316815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555083600560008b6001600160a01b03166001600160a01b0316815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600560008b6001600160a01b03166001600160a01b0316815260200190815260200160002060010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b5050610b56565b50915080610b4e81611527565b915050610910565b505b505b6001600160a01b038086166000908152600560205260409020600281018690558054600190910154908216911681610bbe576002546001600160a01b03888116911614610bb95760405162461bcd60e51b81526004016102fb9061176f565b610bf8565b6001600160a01b0382166000908152600560205260409020600201548610610bf85760405162461bcd60e51b81526004016102fb906117b1565b6001600160a01b038116610c38576003546001600160a01b03888116911614610c335760405162461bcd60e51b81526004016102fb906117f3565b610c72565b6001600160a01b0381166000908152600560205260409020600201548611610c725760405162461bcd60e51b81526004016102fb90611835565b7feff82fca26d998df78a0fc670cf8363cdb3a7ddccfb532d88c33517375fb65fe8787604051610ca3929190611845565b60405180910390a150505b6000610cb8610435565b90506000610cc68383610fc4565b90506000610cd48385610fc4565b90506001600160a01b03821615610d4d57600054604051632ae7f09960e01b8152620100009091046001600160a01b031690632ae7f09990610d1a9085906004016112e5565b600060405180830381600087803b158015610d3457600080fd5b505af1158015610d48573d6000803e3d6000fd5b505050505b6001600160a01b03811615610dc35760005460405162900f0160e41b8152620100009091046001600160a01b031690630900f01090610d909084906004016112e5565b600060405180830381600087803b158015610daa57600080fd5b505af1158015610dbe573d6000803e3d6000fd5b505050505b5050505050505050565b6001600160a01b0316600090815260056020526040902060020154151590565b610df681610dcd565b610e125760405162461bcd60e51b81526004016102fb906118a3565b6001600160a01b0380821660009081526005602052604090208054600190910154908216911681610e9a576001600160a01b038116610e6057600280546001600160a01b0319169055610f25565b6001600160a01b038116600081815260056020526040902080546001600160a01b0319908116909155600280549091169091179055610f25565b6001600160a01b038116610ee5576001600160a01b038216600081815260056020526040902060010180546001600160a01b0319908116909155600380549091169091179055610f25565b6001600160a01b0380831660008181526005602052604080822060010180549486166001600160a01b031995861681179091558252902080549092161790555b6001600160a01b038316600090815260056020526040812080546001600160a01b0319908116825560018201805490911690556002018190556004805491610f6c836118b3565b9091555050600454610f9557600280546001600160a01b03199081169091556003805490911690555b7f25fdba415343a102573f708646afaddf264fa02f6202a2954661cbe06dc38db08360405161060291906112e5565b6000805b8351811015611080576000805b845181101561104557848181518110610ff057610ff06115b6565b60200260200101516001600160a01b0316868481518110611013576110136115b6565b60200260200101516001600160a01b031614156110335760019150611045565b8061103d81611527565b915050610fd5565b508061106d5784828151811061105d5761105d6115b6565b6020026020010151925050611080565b508061107881611527565b915050610fc8565b5092915050565b6000805462010000600160b01b031916620100006001600160a01b038416021790556040517f27a2474ca8353642fab173d2cadd631382797bbd4f01c76aa56f932bceaf580f906110d9908390611395565b60405180910390a150565b600180546001600160a01b0319166001600160a01b0383161790556040517f3f7da2154195a521ba8386807142c92f7d6baa166e4423097ae33ed518f1fbd7906110d9908390611395565b60068190556040517f5aa2ae5881d32b84c3b63e7b0377e7b885d7a5e65e91519366956bb8d4c71a23906110d9908390611357565b61116d81610dcd565b6111745750565b6002546001600160a01b03828116911614156111e8576001600160a01b038082166000908152600560205260409020600101541680156111e4576001600160a01b038116600081815260056020526040902080546001600160a01b03199081169091556002805490911690911790555b5050565b6003546001600160a01b038281169116141561126c576001600160a01b03808216600090815260056020526040902054168015611249576001600160a01b038116600090815260056020526040902060010180546001600160a01b03191690555b600380546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b038082166000908152600560205260408082208054600191820154851680855283852080546001600160a01b03199081169390971692831790559084529190922090910180549092161790555b50565b60006001600160a01b0382165b92915050565b6112df816112c3565b82525050565b602081016112d082846112d6565b6112fc816112c3565b81146112c057600080fd5b80356112d0816112f3565b60006020828403121561132757611327600080fd5b60006113338484611307565b949350505050565b8015156112df565b602081016112d0828461133b565b806112df565b602081016112d08284611351565b60006001600160a01b0382166112d0565b60006112d082611365565b60006112d082611376565b6112df81611381565b602081016112d0828461138c565b60006113af83836112d6565b505060200190565b60006113c1825190565b80845260209384019383018060005b838110156113f55781516113e488826113a3565b9750602083019250506001016113d0565b509495945050505050565b6020808252810161141181846113b7565b9392505050565b60006112d0826112c3565b6112fc81611418565b80356112d081611423565b6000806040838503121561144d5761144d600080fd5b6000611459858561142c565b925050602061146a8582860161142c565b9150509250929050565b6060810161148282866112d6565b61148f60208301856112d6565b6113336040830184611351565b806112fc565b80356112d08161149c565b600080600080608085870312156114c6576114c6600080fd5b60006114d28787611307565b94505060206114e3878288016114a2565b93505060406114f487828801611307565b9250506060611505878288016114a2565b91505092959194509250565b634e487b7160e01b600052601160045260246000fd5b600060001982141561153b5761153b611511565b5060010190565b602e81526000602082017f4d616a6f7243616e646964617465733a2063616c6c6572206d7573742062652081526d14dd185ad94818dbdb9d1c9858dd60921b602082015291505b5060400190565b602080825281016112d081611542565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b602e81526000602082017f496e697469616c697a61626c653a20636f6e747261637420697320616c72656181526d191e481a5b9a5d1a585b1a5e995960921b60208201529150611589565b602080825281016112d0816115cc565b600060ff82166112d0565b6112df81611627565b602081016112d08284611632565b603181526000602082017f4d616a6f7243616e646964617465733a2063616c6c6572206d75737420626520815270115b1958dd1a5bdb8818dbdb9d1c9858dd607a1b60208201529150611589565b602080825281016112d081611649565b602281526000602082017f4d616a6f7243616e646964617465733a20696e76616c69642063616e64696461815261746560f01b60208201529150611589565b602080825281016112d0816116a7565b601c81526000602082017f4d616a6f7243616e646964617465733a207a65726f20616d6f756e7400000000815291505b5060200190565b602080825281016112d0816116f6565b60208082527f4d616a6f7243616e646964617465733a20696e76616c6964206f72646572203191019081526000611726565b602080825281016112d08161173d565b60208082527f4d616a6f7243616e646964617465733a20696e76616c6964206f72646572203291019081526000611726565b602080825281016112d08161177f565b60208082527f4d616a6f7243616e646964617465733a20696e76616c6964206f72646572203391019081526000611726565b602080825281016112d0816117c1565b60208082527f4d616a6f7243616e646964617465733a20696e76616c6964206f72646572203491019081526000611726565b602080825281016112d081611803565b6040810161185382856112d6565b6114116020830184611351565b602681526000602082017f4d616a6f7243616e646964617465733a206e6f6e6578697374656e742063616e81526564696461746560d01b60208201529150611589565b602080825281016112d081611860565b6000816118c2576118c2611511565b50600019019056fea26469706673582212203badbdc53a0ccb3390d66a5665c190233bebd8b147810bf12268b2b2c0cb9d5264736f6c63430008090033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c806340cdc3471161008c5780637809d1c8116100665780637809d1c8146101bc5780638ab66a90146101c5578063e9e9d2f414610210578063f6a3d24e1461022357600080fd5b806340cdc34714610181578063485cc955146101965780634b1d3ede146101a957600080fd5b80630cd282d5146100d4578063246c32f8146100fd57806329092d0e1461011d5780632a744e25146101325780633866965c146101455780633a4b66f11461015b575b600080fd5b6003546100e7906001600160a01b031681565b6040516100f491906112e5565b60405180910390f35b61011061010b366004611312565b610236565b6040516100f49190611343565b61013061012b366004611312565b6102cb565b005b6002546100e7906001600160a01b031681565b61014e60045481565b6040516100f49190611357565b600054610174906201000090046001600160a01b031681565b6040516100f49190611395565b610189610435565b6040516100f49190611400565b6101306101a4366004611437565b61052b565b600154610174906001600160a01b031681565b61014e60065481565b6102016101d3366004611312565b6005602052600090815260409020805460018201546002909201546001600160a01b03918216929091169083565b6040516100f493929190611474565b61013061021e3660046114ad565b610610565b610110610231366004611312565b610dcd565b6002546000906001600160a01b0316156102c6576002546001600160a01b031660005b6006548110156102c357836001600160a01b0316826001600160a01b0316141561028657600192506102c3565b6001600160a01b0391821660009081526005602052604090206001015490911690816102b1576102c3565b806102bb81611527565b915050610259565b50505b919050565b6000546201000090046001600160a01b031633146103045760405162461bcd60e51b81526004016102fb90611590565b60405180910390fd5b600061030e610435565b905061031982610ded565b6000610323610435565b905060006103318383610fc4565b9050600061033f8385610fc4565b90506001600160a01b038216156103b857600054604051632ae7f09960e01b8152620100009091046001600160a01b031690632ae7f099906103859085906004016112e5565b600060405180830381600087803b15801561039f57600080fd5b505af11580156103b3573d6000803e3d6000fd5b505050505b6001600160a01b0381161561042e5760005460405162900f0160e41b8152620100009091046001600160a01b031690630900f010906103fb9084906004016112e5565b600060405180830381600087803b15801561041557600080fd5b505af1158015610429573d6000803e3d6000fd5b505050505b5050505050565b606060006006546004541161044c57600454610450565b6006545b6002549091506001600160a01b031615610527578067ffffffffffffffff81111561047d5761047d6115a0565b6040519080825280602002602001820160405280156104a6578160200160208202803683370190505b506002549092506001600160a01b031660005b8281101561052457818482815181106104d4576104d46115b6565b6001600160a01b0392831660209182029290920181019190915292811660009081526005909352604090922060010154909116908161051257610524565b8061051c81611527565b9150506104b9565b50505b5090565b600054610100900460ff161580801561054b5750600054600160ff909116105b806105655750303b158015610565575060005460ff166001145b6105815760405162461bcd60e51b81526004016102fb90611617565b6000805460ff1916600117905580156105a4576000805461ff0019166101001790555b6105ad83611087565b6105b6826110e4565b6105c0600161112f565b801561060b576000805461ff00191690556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906106029060019061163b565b60405180910390a15b505050565b6001546001600160a01b0316331461063a5760405162461bcd60e51b81526004016102fb90611697565b6000610644610435565b90506001600160a01b03851661066c5760405162461bcd60e51b81526004016102fb906116e6565b6004546106d857600084116106935760405162461bcd60e51b81526004016102fb9061172d565b600480549060006106a383611527565b9091555050600280546001600160a01b0387166001600160a01b03199182168117909255600380549091169091179055610b5a565b836106fd576106e685610dcd565b6106ef57610cae565b6106f885610ded565b610cae565b61070683610dcd565b61072f5761071385610dcd565b156107205784925061072f565b6003546001600160a01b031692505b61073885610dcd565b610752576004805490600061074c83611527565b91905055505b6001600160a01b03831660009081526005602052604090206002015483908511156108ea5760005b838110156108e4576002546001600160a01b038381169116141561081657866001600160a01b0316826001600160a01b031614610811576107ba87611164565b6001600160a01b0380881660008181526005602052604080822080546001600160a01b0319908116825560028054821686179055948716808452918320805486168517905592909152600190910180549092161790555b6108e4565b6001600160a01b038083166000908152600560205260408082205490921680825291902060020154878111156108cf57886001600160a01b0316826001600160a01b0316146108c85761086889611164565b6001600160a01b038085166000818152600560205260408082208054858f166001600160a01b0319918216811790925594871680845282842060019081018054881684179055918452919092208054851690911781550180549092161790555b50506108e4565b509150806108dc81611527565b91505061077a565b50610b58565b6001600160a01b038116600090815260056020526040902060020154851015610b585760005b83811015610b56576003546001600160a01b03838116911614156109b057866001600160a01b0316826001600160a01b0316146109ab5761095087611164565b6001600160a01b03808816600081815260056020526040808220600180820180546001600160a01b03199081169091556003805482168717905595881680855292842001805486168517905592909152815490921690911790555b610b56565b6001600160a01b03808316600090815260056020526040808220600101549092168082529190206002015487811015610b4157886001600160a01b0316826001600160a01b031614610b3a57610a0589611164565b8860056000866001600160a01b03166001600160a01b0316815260200190815260200160002060010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508860056000846001600160a01b03166001600160a01b0316815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555083600560008b6001600160a01b03166001600160a01b0316815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600560008b6001600160a01b03166001600160a01b0316815260200190815260200160002060010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b5050610b56565b50915080610b4e81611527565b915050610910565b505b505b6001600160a01b038086166000908152600560205260409020600281018690558054600190910154908216911681610bbe576002546001600160a01b03888116911614610bb95760405162461bcd60e51b81526004016102fb9061176f565b610bf8565b6001600160a01b0382166000908152600560205260409020600201548610610bf85760405162461bcd60e51b81526004016102fb906117b1565b6001600160a01b038116610c38576003546001600160a01b03888116911614610c335760405162461bcd60e51b81526004016102fb906117f3565b610c72565b6001600160a01b0381166000908152600560205260409020600201548611610c725760405162461bcd60e51b81526004016102fb90611835565b7feff82fca26d998df78a0fc670cf8363cdb3a7ddccfb532d88c33517375fb65fe8787604051610ca3929190611845565b60405180910390a150505b6000610cb8610435565b90506000610cc68383610fc4565b90506000610cd48385610fc4565b90506001600160a01b03821615610d4d57600054604051632ae7f09960e01b8152620100009091046001600160a01b031690632ae7f09990610d1a9085906004016112e5565b600060405180830381600087803b158015610d3457600080fd5b505af1158015610d48573d6000803e3d6000fd5b505050505b6001600160a01b03811615610dc35760005460405162900f0160e41b8152620100009091046001600160a01b031690630900f01090610d909084906004016112e5565b600060405180830381600087803b158015610daa57600080fd5b505af1158015610dbe573d6000803e3d6000fd5b505050505b5050505050505050565b6001600160a01b0316600090815260056020526040902060020154151590565b610df681610dcd565b610e125760405162461bcd60e51b81526004016102fb906118a3565b6001600160a01b0380821660009081526005602052604090208054600190910154908216911681610e9a576001600160a01b038116610e6057600280546001600160a01b0319169055610f25565b6001600160a01b038116600081815260056020526040902080546001600160a01b0319908116909155600280549091169091179055610f25565b6001600160a01b038116610ee5576001600160a01b038216600081815260056020526040902060010180546001600160a01b0319908116909155600380549091169091179055610f25565b6001600160a01b0380831660008181526005602052604080822060010180549486166001600160a01b031995861681179091558252902080549092161790555b6001600160a01b038316600090815260056020526040812080546001600160a01b0319908116825560018201805490911690556002018190556004805491610f6c836118b3565b9091555050600454610f9557600280546001600160a01b03199081169091556003805490911690555b7f25fdba415343a102573f708646afaddf264fa02f6202a2954661cbe06dc38db08360405161060291906112e5565b6000805b8351811015611080576000805b845181101561104557848181518110610ff057610ff06115b6565b60200260200101516001600160a01b0316868481518110611013576110136115b6565b60200260200101516001600160a01b031614156110335760019150611045565b8061103d81611527565b915050610fd5565b508061106d5784828151811061105d5761105d6115b6565b6020026020010151925050611080565b508061107881611527565b915050610fc8565b5092915050565b6000805462010000600160b01b031916620100006001600160a01b038416021790556040517f27a2474ca8353642fab173d2cadd631382797bbd4f01c76aa56f932bceaf580f906110d9908390611395565b60405180910390a150565b600180546001600160a01b0319166001600160a01b0383161790556040517f3f7da2154195a521ba8386807142c92f7d6baa166e4423097ae33ed518f1fbd7906110d9908390611395565b60068190556040517f5aa2ae5881d32b84c3b63e7b0377e7b885d7a5e65e91519366956bb8d4c71a23906110d9908390611357565b61116d81610dcd565b6111745750565b6002546001600160a01b03828116911614156111e8576001600160a01b038082166000908152600560205260409020600101541680156111e4576001600160a01b038116600081815260056020526040902080546001600160a01b03199081169091556002805490911690911790555b5050565b6003546001600160a01b038281169116141561126c576001600160a01b03808216600090815260056020526040902054168015611249576001600160a01b038116600090815260056020526040902060010180546001600160a01b03191690555b600380546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b038082166000908152600560205260408082208054600191820154851680855283852080546001600160a01b03199081169390971692831790559084529190922090910180549092161790555b50565b60006001600160a01b0382165b92915050565b6112df816112c3565b82525050565b602081016112d082846112d6565b6112fc816112c3565b81146112c057600080fd5b80356112d0816112f3565b60006020828403121561132757611327600080fd5b60006113338484611307565b949350505050565b8015156112df565b602081016112d0828461133b565b806112df565b602081016112d08284611351565b60006001600160a01b0382166112d0565b60006112d082611365565b60006112d082611376565b6112df81611381565b602081016112d0828461138c565b60006113af83836112d6565b505060200190565b60006113c1825190565b80845260209384019383018060005b838110156113f55781516113e488826113a3565b9750602083019250506001016113d0565b509495945050505050565b6020808252810161141181846113b7565b9392505050565b60006112d0826112c3565b6112fc81611418565b80356112d081611423565b6000806040838503121561144d5761144d600080fd5b6000611459858561142c565b925050602061146a8582860161142c565b9150509250929050565b6060810161148282866112d6565b61148f60208301856112d6565b6113336040830184611351565b806112fc565b80356112d08161149c565b600080600080608085870312156114c6576114c6600080fd5b60006114d28787611307565b94505060206114e3878288016114a2565b93505060406114f487828801611307565b9250506060611505878288016114a2565b91505092959194509250565b634e487b7160e01b600052601160045260246000fd5b600060001982141561153b5761153b611511565b5060010190565b602e81526000602082017f4d616a6f7243616e646964617465733a2063616c6c6572206d7573742062652081526d14dd185ad94818dbdb9d1c9858dd60921b602082015291505b5060400190565b602080825281016112d081611542565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b602e81526000602082017f496e697469616c697a61626c653a20636f6e747261637420697320616c72656181526d191e481a5b9a5d1a585b1a5e995960921b60208201529150611589565b602080825281016112d0816115cc565b600060ff82166112d0565b6112df81611627565b602081016112d08284611632565b603181526000602082017f4d616a6f7243616e646964617465733a2063616c6c6572206d75737420626520815270115b1958dd1a5bdb8818dbdb9d1c9858dd607a1b60208201529150611589565b602080825281016112d081611649565b602281526000602082017f4d616a6f7243616e646964617465733a20696e76616c69642063616e64696461815261746560f01b60208201529150611589565b602080825281016112d0816116a7565b601c81526000602082017f4d616a6f7243616e646964617465733a207a65726f20616d6f756e7400000000815291505b5060200190565b602080825281016112d0816116f6565b60208082527f4d616a6f7243616e646964617465733a20696e76616c6964206f72646572203191019081526000611726565b602080825281016112d08161173d565b60208082527f4d616a6f7243616e646964617465733a20696e76616c6964206f72646572203291019081526000611726565b602080825281016112d08161177f565b60208082527f4d616a6f7243616e646964617465733a20696e76616c6964206f72646572203391019081526000611726565b602080825281016112d0816117c1565b60208082527f4d616a6f7243616e646964617465733a20696e76616c6964206f72646572203491019081526000611726565b602080825281016112d081611803565b6040810161185382856112d6565b6114116020830184611351565b602681526000602082017f4d616a6f7243616e646964617465733a206e6f6e6578697374656e742063616e81526564696461746560d01b60208201529150611589565b602080825281016112d081611860565b6000816118c2576118c2611511565b50600019019056fea26469706673582212203badbdc53a0ccb3390d66a5665c190233bebd8b147810bf12268b2b2c0cb9d5264736f6c63430008090033",
  "devdoc": {
    "author": "Alexandas",
    "details": "MajorCandidates contract",
    "kind": "dev",
    "methods": {
      "exists(address)": {
        "details": "return whether a candidate is existed in the sorted list",
        "params": {
          "candidate": "candidate address"
        },
        "returns": {
          "_0": "whether the candidate is existed in the sorted list"
        }
      },
      "initialize(address,address)": {
        "details": "proxy initialize function",
        "params": {
          "_election": "`Election` contract",
          "_stake": "`Stake` contract"
        }
      },
      "isMajor(address)": {
        "details": "return whether a candidate is a major candidate",
        "params": {
          "candidate": "candidate address"
        },
        "returns": {
          "existed": "the candidate is a major candidate"
        }
      },
      "majorCandidateList()": {
        "details": "return all major candidates",
        "returns": {
          "majors": "all major candidates"
        }
      },
      "remove(address)": {
        "details": "emit removed a candidate from the sorted list",
        "params": {
          "candidate": "candidate address"
        }
      },
      "upsetCandidateWithAnchor(address,uint256,address,uint256)": {
        "details": "insert or update a candidate in the sorted list",
        "params": {
          "amount": "candidate votes",
          "anchor": "anchor candidate address",
          "candidate": "candidate address",
          "maxSlippage": "maximum rank change value for the candidate from the anchor candidate"
        }
      }
    },
    "stateVariables": {
      "MAX_MAJOR_CANDIDATES": {
        "details": "return max major candidates"
      },
      "candidates": {
        "details": "return candidate inforamtion"
      },
      "election": {
        "details": "return `Election` contract address"
      },
      "headCandidate": {
        "details": "return head candidate address"
      },
      "stake": {
        "details": "return `Stake` contract address"
      },
      "tailCandidate": {
        "details": "return tail candidate address"
      },
      "totalCandidates": {
        "details": "return total candidates"
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 138,
        "contract": "contracts/election/MajorCandidates.sol:MajorCandidates",
        "label": "_initialized",
        "offset": 0,
        "slot": "0",
        "type": "t_uint8"
      },
      {
        "astId": 141,
        "contract": "contracts/election/MajorCandidates.sol:MajorCandidates",
        "label": "_initializing",
        "offset": 1,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 4612,
        "contract": "contracts/election/MajorCandidates.sol:MajorCandidates",
        "label": "stake",
        "offset": 2,
        "slot": "0",
        "type": "t_contract(IStake)6698"
      },
      {
        "astId": 4617,
        "contract": "contracts/election/MajorCandidates.sol:MajorCandidates",
        "label": "election",
        "offset": 0,
        "slot": "1",
        "type": "t_contract(IElection)5954"
      },
      {
        "astId": 4620,
        "contract": "contracts/election/MajorCandidates.sol:MajorCandidates",
        "label": "headCandidate",
        "offset": 0,
        "slot": "2",
        "type": "t_address"
      },
      {
        "astId": 4623,
        "contract": "contracts/election/MajorCandidates.sol:MajorCandidates",
        "label": "tailCandidate",
        "offset": 0,
        "slot": "3",
        "type": "t_address"
      },
      {
        "astId": 4626,
        "contract": "contracts/election/MajorCandidates.sol:MajorCandidates",
        "label": "totalCandidates",
        "offset": 0,
        "slot": "4",
        "type": "t_uint256"
      },
      {
        "astId": 4632,
        "contract": "contracts/election/MajorCandidates.sol:MajorCandidates",
        "label": "candidates",
        "offset": 0,
        "slot": "5",
        "type": "t_mapping(t_address,t_struct(Candidate)4607_storage)"
      },
      {
        "astId": 4636,
        "contract": "contracts/election/MajorCandidates.sol:MajorCandidates",
        "label": "MAX_MAJOR_CANDIDATES",
        "offset": 0,
        "slot": "6",
        "type": "t_uint256"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_contract(IElection)5954": {
        "encoding": "inplace",
        "label": "contract IElection",
        "numberOfBytes": "20"
      },
      "t_contract(IStake)6698": {
        "encoding": "inplace",
        "label": "contract IStake",
        "numberOfBytes": "20"
      },
      "t_mapping(t_address,t_struct(Candidate)4607_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct MajorCandidates.Candidate)",
        "numberOfBytes": "32",
        "value": "t_struct(Candidate)4607_storage"
      },
      "t_struct(Candidate)4607_storage": {
        "encoding": "inplace",
        "label": "struct MajorCandidates.Candidate",
        "members": [
          {
            "astId": 4602,
            "contract": "contracts/election/MajorCandidates.sol:MajorCandidates",
            "label": "prev",
            "offset": 0,
            "slot": "0",
            "type": "t_address"
          },
          {
            "astId": 4604,
            "contract": "contracts/election/MajorCandidates.sol:MajorCandidates",
            "label": "next",
            "offset": 0,
            "slot": "1",
            "type": "t_address"
          },
          {
            "astId": 4606,
            "contract": "contracts/election/MajorCandidates.sol:MajorCandidates",
            "label": "amount",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "96"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint8": {
        "encoding": "inplace",
        "label": "uint8",
        "numberOfBytes": "1"
      }
    }
  }
}