false
false

Contract Address Details

0xe2dCA969624795985F2f083BcD0b674337ba130a

Token
Saakuru (SKR)
Creator
0x0b8f4b–cf44b8 at 0x8ec41c–ff81bf
Balance
0 Oasys ( )
Tokens
Fetching tokens...
Transactions
53,195 Transactions
Transfers
7 Transfers
Gas Used
3,587,531,416
Last Balance Update
34271088
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
SKR




Optimization enabled
true
Compiler version
v0.8.2+commit.661d1103




Optimization runs
200
EVM Version
berlin




Verified at
2024-05-02T09:38:31.495890Z

Constructor Arguments

0x00000000000000000000000057fb3a4205dcdfae514d13c211d6c8c08be58e8600000000000000000000000053745cc2c6dc4b1468f41d286cd1aab7aa7a1b81000000000000000000000000000000000000000000000000000000000001518000000000000000000000000038d40f5c8375f84c5b90bc460a94a436d09133fb

Arg [0] (address) : 0x57fb3a4205dcdfae514d13c211d6c8c08be58e86
Arg [1] (address) : 0x53745cc2c6dc4b1468f41d286cd1aab7aa7a1b81
Arg [2] (uint256) : 86400
Arg [3] (address) : 0x38d40f5c8375f84c5b90bc460a94a436d09133fb

              

contracts/SKR.sol

Sol2uml
new
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./core/LERC20.sol";
import "@openzeppelin/contracts/utils/Context.sol";

contract SKR is Context, LERC20 {
    constructor(
      address admin_, 
      address recoveryAdmin_, 
      uint256 timelockPeriod_, 
      address lossless_
    ) LERC20(
      "Saakuru", 
      "SKR", 
      admin_, 
      recoveryAdmin_, 
      timelockPeriod_, 
      lossless_
    ) {
        _mint(recoveryAdmin_, 10**9 * 10**18);
    }

    modifier lssBurn(address account, uint256 amount) {
        if (isLosslessOn) {
            lossless.beforeBurn(account, amount);
        } 
        _;
    }

    function burn(uint256 amount) public virtual lssBurn(_msgSender(), amount) {
        _burn(_msgSender(), amount);
    }

    function burnFrom(address account, uint256 amount) public virtual lssBurn(account, amount) {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}
        

contracts/interfaces/ILosslessReporting.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ILosslessERC20.sol";
import "./ILosslessGovernance.sol";
import "./ILosslessStaking.sol";
import "./ILosslessController.sol";

interface ILssReporting {
  function reporterReward() external returns(uint256);
  function losslessReward() external returns(uint256);
  function stakersReward() external returns(uint256);
  function committeeReward() external returns(uint256);
  function reportLifetime() external view returns(uint256);
  function reportingAmount() external returns(uint256);
  function reportCount() external returns(uint256);
  function stakingToken() external returns(ILERC20);
  function losslessController() external returns(ILssController);
  function losslessGovernance() external returns(ILssGovernance);
  function getVersion() external pure returns (uint256);
  function getRewards() external view returns (uint256 _reporter, uint256 _lossless, uint256 _committee, uint256 _stakers);
  function report(ILERC20 _token, address _account) external returns (uint256);
  function reporterClaimableAmount(uint256 _reportId) external view returns (uint256);
  function getReportInfo(uint256 _reportId) external view returns(address _reporter,
        address _reportedAddress,
        address _secondReportedAddress,
        uint256 _reportTimestamps,
        ILERC20 _reportTokens,
        bool _secondReports,
        bool _reporterClaimStatus);
  
  function pause() external;
  function unpause() external;
  function setStakingToken(ILERC20 _stakingToken) external;
  function setLosslessGovernance(ILssGovernance _losslessGovernance) external;
  function setReportingAmount(uint256 _reportingAmount) external;
  function setReporterReward(uint256 _reward) external;
  function setLosslessReward(uint256 _reward) external;
  function setStakersReward(uint256 _reward) external;
  function setCommitteeReward(uint256 _reward) external;
  function setReportLifetime(uint256 _lifetime) external;
  function secondReport(uint256 _reportId, address _account) external;
  function reporterClaim(uint256 _reportId) external;
  function retrieveCompensation(address _adr, uint256 _amount) external;

  event ReportSubmission(ILERC20 indexed _token, address indexed _account, uint256 indexed _reportId);
  event SecondReportSubmission(ILERC20 indexed _token, address indexed _account, uint256 indexed _reportId);
  event NewReportingAmount(uint256 indexed _newAmount);
  event NewStakingToken(ILERC20 indexed _token);
  event NewGovernanceContract(ILssGovernance indexed _adr);
  event NewReporterReward(uint256 indexed _newValue);
  event NewLosslessReward(uint256 indexed _newValue);
  event NewStakersReward(uint256 indexed _newValue);
  event NewCommitteeReward(uint256 indexed _newValue);
  event NewReportLifetime(uint256 indexed _newValue);
  event ReporterClaim(address indexed _reporter, uint256 indexed _reportId, uint256 indexed _amount);
  event CompensationRetrieve(address indexed _adr, uint256 indexed _amount);
}
          

@openzeppelin/contracts/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
          

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}
          

contracts/core/LERC20.sol

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

import "../interfaces/ILosslessERC20.sol";
import "../interfaces/ILosslessController.sol";

contract LERC20 is Context, ILERC20 {
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    address public recoveryAdmin;
    address private recoveryAdminCandidate;
    bytes32 private recoveryAdminKeyHash;
    address override public admin;
    uint256 public timelockPeriod;
    uint256 public losslessTurnOffTimestamp;
    bool public isLosslessOn = true;
    ILssController public lossless;

    constructor(string memory name_, string memory symbol_, address admin_, address recoveryAdmin_, uint256 timelockPeriod_, address lossless_) {
        require(recoveryAdmin_ != address(0), "LERC20: Recovery admin cannot be zero address");
        require(admin_ != address(0), "LERC20: Recovery admin cannot be zero address");
        _name = name_;
        _symbol = symbol_;
        admin = admin_;
        recoveryAdmin = recoveryAdmin_;
        recoveryAdminCandidate = address(0);
        recoveryAdminKeyHash = "";
        require(timelockPeriod_ > 2 hours, "LERC20: Timelock period must be greater than 0");
        require(timelockPeriod_ < 2 days, "LERC20: Timelock period must be less than 2 days");
        // Note: should not be changed after deployment, due to potential security risk in case of loss of owner private key
        timelockPeriod = timelockPeriod_;
        losslessTurnOffTimestamp = 0;
        require(lossless_ != address(0), "LERC20: Lossless cannot be zero address");
        lossless = ILssController(lossless_);
    }

    // --- LOSSLESS modifiers ---
    modifier lssAprove(address spender, uint256 amount) {
        if (isLosslessOn) {
            lossless.beforeApprove(_msgSender(), spender, amount);
        } 
        _;
    }

    modifier lssTransfer(address recipient, uint256 amount) {
        if (isLosslessOn) {
            lossless.beforeTransfer(_msgSender(), recipient, amount);
        } 
        _;
    }

    modifier lssTransferFrom(address sender, address recipient, uint256 amount) {
        if (isLosslessOn) {
            lossless.beforeTransferFrom(_msgSender(),sender, recipient, amount);
        }
        _;
    }

    modifier lssIncreaseAllowance(address spender, uint256 addedValue) {
        if (isLosslessOn) {
            lossless.beforeIncreaseAllowance(_msgSender(), spender, addedValue);
        }
        _;
    }

    modifier lssDecreaseAllowance(address spender, uint256 subtractedValue) {
        if (isLosslessOn) {
            lossless.beforeDecreaseAllowance(_msgSender(), spender, subtractedValue);
        }
        _;
    }

    modifier onlyRecoveryAdmin() {
        require(_msgSender() == recoveryAdmin, "LERC20: Must be recovery admin");
        _;
    }

    // --- LOSSLESS management ---
    function transferOutBlacklistedFunds(address[] calldata from) override external {
        require(_msgSender() == address(lossless), "LERC20: Only lossless contract");
        require(isLosslessOn, "LERC20: Lossless is off");

        uint256 fromLength = from.length;
        uint256 totalAmount = 0;
        
        for (uint256 i = 0; i < fromLength; i++) {
            address fromAddress = from[i];
            uint256 fromBalance = _balances[fromAddress];
            _balances[fromAddress] = 0;
            totalAmount += fromBalance;
            emit Transfer(fromAddress, address(lossless), fromBalance);
        }

        _balances[address(lossless)] += totalAmount;
    }

    function setLosslessAdmin(address newAdmin) override external onlyRecoveryAdmin {
        require(newAdmin != admin, "LERC20: Cannot set same address");
        emit NewAdmin(newAdmin);
        admin = newAdmin;
    }

    function transferRecoveryAdminOwnership(address candidate, bytes32 keyHash) override  external onlyRecoveryAdmin {
        require(candidate != address(0), "LERC20: Candidate cannot be zero address");
        recoveryAdminCandidate = candidate;
        recoveryAdminKeyHash = keyHash;
        emit NewRecoveryAdminProposal(candidate);
    }

    function acceptRecoveryAdminOwnership(bytes memory key) override external {
        require(_msgSender() == recoveryAdminCandidate, "LERC20: Must be canditate");
        require(keccak256(key) == recoveryAdminKeyHash, "LERC20: Invalid key");
        emit NewRecoveryAdmin(recoveryAdminCandidate);
        require(recoveryAdminCandidate != address(0), "LERC20: Candidate cannot be zero address");
        recoveryAdmin = recoveryAdminCandidate;
        recoveryAdminCandidate = address(0);
        recoveryAdminKeyHash = "";
    }

    function proposeLosslessTurnOff() override external onlyRecoveryAdmin {
        require(losslessTurnOffTimestamp == 0, "LERC20: TurnOff already proposed");
        require(isLosslessOn, "LERC20: Lossless already off");
        losslessTurnOffTimestamp = block.timestamp + timelockPeriod;
        emit LosslessTurnOffProposal(losslessTurnOffTimestamp);
    }

    function executeLosslessTurnOff() override external onlyRecoveryAdmin {
        require(losslessTurnOffTimestamp != 0, "ERC20: TurnOff not proposed");
        require(losslessTurnOffTimestamp <= block.timestamp, "ERC20: Time lock in progress");
        isLosslessOn = false;
        losslessTurnOffTimestamp = 0;
        emit LosslessOff();
    }

    function executeLosslessTurnOn() override external onlyRecoveryAdmin {
        require(!isLosslessOn, "LERC20: Lossless already on");
        losslessTurnOffTimestamp = 0;
        isLosslessOn = true;
        emit LosslessOn();
    }

    function getAdmin() override public view virtual returns (address) {
        return admin;
    }

    // --- ERC20 methods ---

    function name() override public view virtual returns (string memory) {
        return _name;
    }

    function symbol() override public view virtual returns (string memory) {
        return _symbol;
    }

    function decimals() override public view virtual returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override lssTransfer(recipient, amount) returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override lssAprove(spender, amount) returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override lssTransferFrom(sender, recipient, amount) returns (bool) {
        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _transfer(sender, recipient, amount);
        
        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) override public virtual lssIncreaseAllowance(spender, addedValue) returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) override public virtual lssDecreaseAllowance(spender, subtractedValue) returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
    
        _totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked { 
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC20).interfaceId || interfaceId == type(ILERC20).interfaceId;
    }
}
          

contracts/interfaces/ILosslessController.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ILosslessERC20.sol";
import "./ILosslessGovernance.sol";
import "./ILosslessStaking.sol";
import "./ILosslessReporting.sol";
import "./IProtectionStrategy.sol";

interface ILssController {
    // function getLockedAmount(ILERC20 _token, address _account)  returns (uint256);
    // function getAvailableAmount(ILERC20 _token, address _account) external view returns (uint256 amount);
    function retrieveBlacklistedFunds(address[] calldata _addresses, ILERC20 _token, uint256 _reportId) external returns(uint256);
    function whitelist(address _adr) external view returns (bool);
    function dexList(address _dexAddress) external returns (bool);
    function blacklist(address _adr) external view returns (bool);
    function admin() external view returns (address);
    function pauseAdmin() external view returns (address);
    function recoveryAdmin() external view returns (address);
    function guardian() external view returns (address);
    function losslessStaking() external view returns (ILssStaking);
    function losslessReporting() external view returns (ILssReporting);
    function losslessGovernance() external view returns (ILssGovernance);
    function dexTranferThreshold() external view returns (uint256);
    function settlementTimeLock() external view returns (uint256);
    function extraordinaryRetrievalProposalPeriod() external view returns (uint256);
    
    function pause() external;
    function unpause() external;
    function setAdmin(address _newAdmin) external;
    function setRecoveryAdmin(address _newRecoveryAdmin) external;
    function setPauseAdmin(address _newPauseAdmin) external;
    function setSettlementTimeLock(uint256 _newTimelock) external;
    function setDexTransferThreshold(uint256 _newThreshold) external;
    function setDexList(address[] calldata _dexList, bool _value) external;
    function setWhitelist(address[] calldata _addrList, bool _value) external;
    function addToBlacklist(address _adr) external;
    function resolvedNegatively(address _adr) external;
    function setStakingContractAddress(ILssStaking _adr) external;
    function setReportingContractAddress(ILssReporting _adr) external; 
    function setGovernanceContractAddress(ILssGovernance _adr) external;
    function setTokenMintLimit(ILERC20 _token, uint256 limit) external;
    function setTokenMintPeriod(ILERC20 _token, uint256 _period) external;
    function setTokenBurnLimit(ILERC20 _token, uint256 _limit) external;
    function setTokenBurnPeriod(ILERC20 _token, uint256 _period) external;
    function proposeNewSettlementPeriod(ILERC20 _token, uint256 _seconds) external;
    function executeNewSettlementPeriod(ILERC20 _token) external;
    function activateEmergency(ILERC20 _token) external;
    function deactivateEmergency(ILERC20 _token) external;
    function setGuardian(address _newGuardian) external;
    function removeProtectedAddress(ILERC20 _token, address _protectedAddresss) external;
    function beforeTransfer(address _sender, address _recipient, uint256 _amount) external;
    function beforeTransferFrom(address _msgSender, address _sender, address _recipient, uint256 _amount) external;
    function beforeApprove(address _sender, address _spender, uint256 _amount) external;
    function beforeIncreaseAllowance(address _msgSender, address _spender, uint256 _addedValue) external;
    function beforeDecreaseAllowance(address _msgSender, address _spender, uint256 _subtractedValue) external;
    function beforeMint(address _to, uint256 _amount) external;
    function beforeBurn(address _account, uint256 _amount) external;
    function afterTransfer(address _sender, address _recipient, uint256 _amount) external;
    function setProtectedAddress(ILERC20 _token, address _protectedAddress, ProtectionStrategy _strategy) external;
    function setExtraordinaryRetrievalPeriod(uint256 _newPEriod) external;
    function extraordinaryRetrieval(ILERC20 _token, address[] calldata addresses, uint256 fundsToRetrieve) external;

    event AdminChange(address indexed _newAdmin);
    event RecoveryAdminChange(address indexed _newAdmin);
    event PauseAdminChange(address indexed _newAdmin);
    event GuardianSet(address indexed _oldGuardian, address indexed _newGuardian);
    event NewProtectedAddress(ILERC20 indexed _token, address indexed _protectedAddress, address indexed _strategy);
    event RemovedProtectedAddress(ILERC20 indexed _token, address indexed _protectedAddress);
    event NewSettlementPeriodProposal(ILERC20 indexed _token, uint256 _seconds);
    event SettlementPeriodChange(ILERC20 indexed _token, uint256 _proposedTokenLockTimeframe);
    event NewSettlementTimelock(uint256 indexed _timelock);
    event NewDexThreshold(uint256 indexed _newThreshold);
    event NewDex(address indexed _dexAddress);
    event DexRemoval(address indexed _dexAddress);
    event NewWhitelistedAddress(address indexed _whitelistAdr);
    event WhitelistedAddressRemoval(address indexed _whitelistAdr);
    event NewBlacklistedAddress(address indexed _blacklistedAddres);
    event AccountBlacklistRemoval(address indexed _adr);
    event NewStakingContract(ILssStaking indexed _newAdr);
    event NewReportingContract(ILssReporting indexed _newAdr);
    event NewGovernanceContract(ILssGovernance indexed _newAdr);
    event EmergencyActive(ILERC20 indexed _token);
    event EmergencyDeactivation(ILERC20 indexed _token);
    event NewMint(ILERC20 indexed token, address indexed account, uint256 indexed amount);
    event NewMintLimit(ILERC20 indexed token, uint256 indexed limit);
    event NewMintPeriod(ILERC20 indexed token, uint256 indexed period);
    event NewBurn(ILERC20 indexed token, address indexed account, uint256 indexed amount);
    event NewBurnLimit(ILERC20 indexed token, uint256 indexed limit);
    event NewBurnPeriod(ILERC20 indexed token, uint256 indexed period);
    event NewExtraordinaryPeriod(uint256 indexed extraordinaryRetrievalProposalPeriod);
}
          

contracts/interfaces/ILosslessERC20.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface ILERC20 {
    function name() external view returns (string memory);
    function admin() external view returns (address);
    function getAdmin() external view returns (address);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address _account) external view returns (uint256);
    function transfer(address _recipient, uint256 _amount) external returns (bool);
    function allowance(address _owner, address _spender) external view returns (uint256);
    function approve(address _spender, uint256 _amount) external returns (bool);
    function transferFrom(address _sender, address _recipient, uint256 _amount) external returns (bool);
    function increaseAllowance(address _spender, uint256 _addedValue) external returns (bool);
    function decreaseAllowance(address _spender, uint256 _subtractedValue) external returns (bool);
    
    function transferOutBlacklistedFunds(address[] calldata _from) external;
    function setLosslessAdmin(address _newAdmin) external;
    function transferRecoveryAdminOwnership(address _candidate, bytes32 _keyHash) external;
    function acceptRecoveryAdminOwnership(bytes memory _key) external;
    function proposeLosslessTurnOff() external;
    function executeLosslessTurnOff() external;
    function executeLosslessTurnOn() external;

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
    event NewAdmin(address indexed _newAdmin);
    event NewRecoveryAdminProposal(address indexed _candidate);
    event NewRecoveryAdmin(address indexed _newAdmin);
    event LosslessTurnOffProposal(uint256 _turnOffDate);
    event LosslessOff();
    event LosslessOn();
}
          

contracts/interfaces/ILosslessGovernance.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ILosslessERC20.sol";
import "./ILosslessStaking.sol";
import "./ILosslessReporting.sol";
import "./ILosslessController.sol";

interface ILssGovernance {
    function LSS_TEAM_INDEX() external view returns(uint256);
    function TOKEN_OWNER_INDEX() external view returns(uint256);
    function COMMITEE_INDEX() external view returns(uint256);
    function committeeMembersCount() external view returns(uint256);
    function walletDisputePeriod() external view returns(uint256);
    function losslessStaking() external view returns (ILssStaking);
    function losslessReporting() external view returns (ILssReporting);
    function losslessController() external view returns (ILssController);
    function isCommitteeMember(address _account) external view returns(bool);
    function getIsVoted(uint256 _reportId, uint256 _voterIndex) external view returns(bool);
    function getVote(uint256 _reportId, uint256 _voterIndex) external view returns(bool);
    function isReportSolved(uint256 _reportId) external view returns(bool);
    function reportResolution(uint256 _reportId) external view returns(bool);
    function getAmountReported(uint256 _reportId) external view returns(uint256);
    
    function setDisputePeriod(uint256 _timeFrame) external;
    function addCommitteeMembers(address[] memory _members) external;
    function removeCommitteeMembers(address[] memory _members) external;
    function losslessVote(uint256 _reportId, bool _vote) external;
    function tokenOwnersVote(uint256 _reportId, bool _vote) external;
    function committeeMemberVote(uint256 _reportId, bool _vote) external;
    function resolveReport(uint256 _reportId) external;
    function proposeWallet(uint256 _reportId, address wallet) external;
    function rejectWallet(uint256 _reportId) external;
    function retrieveFunds(uint256 _reportId) external;
    function retrieveCompensation() external;
    function claimCommitteeReward(uint256 _reportId) external;
    function setCompensationAmount(uint256 _amount) external;
    function losslessClaim(uint256 _reportId) external;
    function extaordinaryRetrieval(address[] calldata _address, ILERC20 _token) external;

    event NewCommitteeMembers(address[] _members);
    event CommitteeMembersRemoval(address[] _members);
    event LosslessTeamPositiveVote(uint256 indexed _reportId);
    event LosslessTeamNegativeVote(uint256 indexed _reportId);
    event TokenOwnersPositiveVote(uint256 indexed _reportId);
    event TokenOwnersNegativeVote(uint256 indexed _reportId);
    event CommitteeMemberPositiveVote(uint256 indexed _reportId, address indexed _member);
    event CommitteeMemberNegativeVote(uint256 indexed _reportId, address indexed _member);
    event ReportResolve(uint256 indexed _reportId, bool indexed _resolution);
    event WalletProposal(uint256 indexed _reportId, address indexed _wallet);
    event CommitteeMemberClaim(uint256 indexed _reportId, address indexed _member, uint256 indexed _amount);
    event CommitteeMajorityReach(uint256 indexed _reportId, bool indexed _result);
    event NewDisputePeriod(uint256 indexed _newPeriod);
    event WalletRejection(uint256 indexed _reportId);
    event FundsRetrieval(uint256 indexed _reportId, uint256 indexed _amount);
    event CompensationRetrieval(address indexed _wallet, uint256 indexed _amount);
    event LosslessClaim(ILERC20 indexed _token, uint256 indexed _reportID, uint256 indexed _amount);
    event ExtraordinaryProposalAccept(ILERC20 indexed _token);
}

          

contracts/interfaces/ILosslessStaking.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ILosslessERC20.sol";
import "./ILosslessGovernance.sol";
import "./ILosslessReporting.sol";
import "./ILosslessController.sol";

interface ILssStaking {
  function stakingToken() external returns(ILERC20);
  function losslessReporting() external returns(ILssReporting);
  function losslessController() external returns(ILssController);
  function losslessGovernance() external returns(ILssGovernance);
  function stakingAmount() external returns(uint256);
  function getVersion() external pure returns (uint256);
  function getIsAccountStaked(uint256 _reportId, address _account) external view returns(bool);
  function getStakerCoefficient(uint256 _reportId, address _address) external view returns (uint256);
  function stakerClaimableAmount(uint256 _reportId) external view returns (uint256);
  function reportCoefficient(uint256 _reportId) external view returns (uint256);
  
  function pause() external;
  function unpause() external;
  function setLssReporting(ILssReporting _losslessReporting) external;
  function setStakingToken(ILERC20 _stakingToken) external;
  function setLosslessGovernance(ILssGovernance _losslessGovernance) external;
  function setStakingAmount(uint256 _stakingAmount) external;
  function stake(uint256 _reportId) external;
  function stakerClaim(uint256 _reportId) external;

  event NewStake(ILERC20 indexed _token, address indexed _account, uint256 indexed _reportId);
  event StakerClaim(address indexed _staker, ILERC20 indexed _token, uint256 indexed _reportID, uint256 _amount);
  event NewStakingAmount(uint256 indexed _newAmount);
  event NewStakingToken(ILERC20 indexed _newToken);
  event NewReportingContract(ILssReporting indexed _newContract);
  event NewGovernanceContract(ILssGovernance indexed _newContract);
}
          

contracts/interfaces/IProtectionStrategy.sol

pragma solidity ^0.8.0;

interface ProtectionStrategy {
    function isTransferAllowed(address token, address sender, address recipient, uint256 amount) external;
}
          

Compiler Settings

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

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"admin_","internalType":"address"},{"type":"address","name":"recoveryAdmin_","internalType":"address"},{"type":"uint256","name":"timelockPeriod_","internalType":"uint256"},{"type":"address","name":"lossless_","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"_owner","internalType":"address","indexed":true},{"type":"address","name":"_spender","internalType":"address","indexed":true},{"type":"uint256","name":"_value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LosslessOff","inputs":[],"anonymous":false},{"type":"event","name":"LosslessOn","inputs":[],"anonymous":false},{"type":"event","name":"LosslessTurnOffProposal","inputs":[{"type":"uint256","name":"_turnOffDate","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewAdmin","inputs":[{"type":"address","name":"_newAdmin","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"NewRecoveryAdmin","inputs":[{"type":"address","name":"_newAdmin","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"NewRecoveryAdminProposal","inputs":[{"type":"address","name":"_candidate","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"_from","internalType":"address","indexed":true},{"type":"address","name":"_to","internalType":"address","indexed":true},{"type":"uint256","name":"_value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"acceptRecoveryAdminOwnership","inputs":[{"type":"bytes","name":"key","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnFrom","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"executeLosslessTurnOff","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"executeLosslessTurnOn","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getAdmin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isLosslessOn","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ILssController"}],"name":"lossless","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"losslessTurnOffTimestamp","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"proposeLosslessTurnOff","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"recoveryAdmin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLosslessAdmin","inputs":[{"type":"address","name":"newAdmin","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timelockPeriod","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOutBlacklistedFunds","inputs":[{"type":"address[]","name":"from","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferRecoveryAdminOwnership","inputs":[{"type":"address","name":"candidate","internalType":"address"},{"type":"bytes32","name":"keyHash","internalType":"bytes32"}]}]
              

Contract Creation Code

0x6080604052600b805460ff191660011790553480156200001e57600080fd5b5060405162001f8138038062001f818339810160408190526200004191620004b3565b604051806040016040528060078152602001665361616b75727560c81b8152506040518060400160405280600381526020016229a5a960e91b8152508585858560006001600160a01b0316836001600160a01b03161415620000ef5760405162461bcd60e51b815260206004820152602d602482015260008051602062001f6183398151915260448201526c207a65726f206164647265737360981b60648201526084015b60405180910390fd5b6001600160a01b0384166200014c5760405162461bcd60e51b815260206004820152602d602482015260008051602062001f6183398151915260448201526c207a65726f206164647265737360981b6064820152608401620000e6565b855162000161906003906020890190620003f0565b50845162000177906004906020880190620003f0565b50600880546001600160a01b038087166001600160a01b03199283161790925560058054928616928216929092179091556006805490911690556000600755611c2082116200020f5760405162461bcd60e51b815260206004820152602e602482015260008051602062001f4183398151915260448201526d067726561746572207468616e20360941b6064820152608401620000e6565b6202a30082106200026b5760405162461bcd60e51b8152602060048201526030602482015260008051602062001f4183398151915260448201526f6c657373207468616e2032206461797360801b6064820152608401620000e6565b60098290556000600a556001600160a01b038116620002dd5760405162461bcd60e51b815260206004820152602760248201527f4c45524332303a204c6f73736c6573732063616e6e6f74206265207a65726f206044820152666164647265737360c81b6064820152608401620000e6565b600b80546001600160a01b0390921661010002610100600160a81b0319909216919091179055506200032393508692506b033b2e3c9fd0803ce80000009150506200032d565b5050505062000568565b6001600160a01b038216620003855760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620000e6565b806002600082825462000399919062000506565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b828054620003fe906200052b565b90600052602060002090601f0160209004810192826200042257600085556200046d565b82601f106200043d57805160ff19168380011785556200046d565b828001600101855582156200046d579182015b828111156200046d57825182559160200191906001019062000450565b506200047b9291506200047f565b5090565b5b808211156200047b576000815560010162000480565b80516001600160a01b0381168114620004ae57600080fd5b919050565b60008060008060808587031215620004c9578384fd5b620004d48562000496565b9350620004e46020860162000496565b925060408501519150620004fb6060860162000496565b905092959194509250565b600082198211156200052657634e487b7160e01b81526011600452602481fd5b500190565b6002810460018216806200054057607f821691505b602082108114156200056257634e487b7160e01b600052602260045260246000fd5b50919050565b6119c980620005786000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636e9960c3116100f9578063a9059cbb11610097578063ccfa214f11610071578063ccfa214f146103a1578063d6e242b8146103ae578063dd62ed3e146103b6578063f851a440146103ef576101c4565b8063a9059cbb14610373578063b38fe95714610386578063b5c228771461038e576101c4565b806393310ffe116100d357806393310ffe14610332578063936af9111461034557806395d89b4114610358578063a457c2d714610360576101c4565b80636e9960c3146102e557806370a08231146102f657806379cc67901461031f576101c4565b8063313ce5671161016657806342966c681161014057806342966c68146102ae5780635b8a194a146102c15780635f6529a3146102c957806361086b00146102dc576101c4565b8063313ce5671461025c57806334f6ebf51461026b578063395093511461029b576101c4565b806318160ddd116101a257806318160ddd1461021957806323b872dd1461022b5780632baa3c9e1461023e5780632ecaf67514610253576101c4565b806301ffc9a7146101c957806306fdde03146101f1578063095ea7b314610206575b600080fd5b6101dc6101d7366004611702565b610402565b60405190151581526020015b60405180910390f35b6101f961043b565b6040516101e89190611810565b6101dc61021436600461166a565b6104cd565b6002545b6040519081526020016101e8565b6101dc61023936600461162f565b610565565b61025161024c3660046115dc565b6106be565b005b61021d60095481565b604051601281526020016101e8565b600b546102839061010090046001600160a01b031681565b6040516001600160a01b0390911681526020016101e8565b6101dc6102a936600461166a565b6107a5565b6102516102bc3660046117d4565b61085d565b6102516108e7565b600554610283906001600160a01b031681565b61021d600a5481565b6008546001600160a01b0316610283565b61021d6103043660046115dc565b6001600160a01b031660009081526020819052604090205490565b61025161032d36600461166a565b6109aa565b61025161034036600461166a565b610aae565b610251610353366004611693565b610b57565b6101f9610d23565b6101dc61036e36600461166a565b610d32565b6101dc61038136600461166a565b610e51565b610251610ede565b61025161039c36600461172a565b610fec565b600b546101dc9060ff1681565b610251611129565b61021d6103c43660046115fd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600854610283906001600160a01b031681565b60006001600160e01b031982166336372b0760e01b148061043357506001600160e01b03198216630fcd53a160e21b145b90505b919050565b60606003805461044a90611911565b80601f016020809104026020016040519081016040528092919081815260200182805461047690611911565b80156104c35780601f10610498576101008083540402835291602001916104c3565b820191906000526020600020905b8154815290600101906020018083116104a657829003601f168201915b5050505050905090565b600b546000908390839060ff161561054f57600b5461010090046001600160a01b03166347abf3be6104fc3390565b84846040518463ffffffff1660e01b815260040161051c939291906117ec565b600060405180830381600087803b15801561053657600080fd5b505af115801561054a573d6000803e3d6000fd5b505050505b61055a338686611245565b506001949350505050565b600b5460009084908490849060ff161561060757600b5461010090046001600160a01b031663379f5c696105963390565b6040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528187166024820152908516604482015260648101849052608401600060405180830381600087803b1580156105ee57600080fd5b505af1158015610602573d6000803e3d6000fd5b505050505b6001600160a01b0387166000908152600160209081526040808320338452909152902054858110156106915760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b61069c8888886112a7565b6106b088336106ab89856118fa565b611245565b506001979650505050505050565b6005546001600160a01b0316336001600160a01b0316146106f15760405162461bcd60e51b815260040161068890611863565b6008546001600160a01b038281169116141561074f5760405162461bcd60e51b815260206004820152601f60248201527f4c45524332303a2043616e6e6f74207365742073616d652061646472657373006044820152606401610688565b6040516001600160a01b038216907f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c90600090a2600880546001600160a01b0319166001600160a01b0392909216919091179055565b600b546000908390839060ff161561082757600b5461010090046001600160a01b031663cf5961bb6107d43390565b84846040518463ffffffff1660e01b81526004016107f4939291906117ec565b600060405180830381600087803b15801561080e57600080fd5b505af1158015610822573d6000803e3d6000fd5b505050505b3360008181526001602090815260408083206001600160a01b038a16845290915290205461055a919087906106ab9088906118e2565b33600b54829060ff16156108d857600b54604051634a1fefbd60e01b81526001600160a01b0384811660048301526024820184905261010090920490911690634a1fefbd90604401600060405180830381600087803b1580156108bf57600080fd5b505af11580156108d3573d6000803e3d6000fd5b505050505b6108e2338461147f565b505050565b6005546001600160a01b0316336001600160a01b03161461091a5760405162461bcd60e51b815260040161068890611863565b600b5460ff161561096d5760405162461bcd60e51b815260206004820152601b60248201527f4c45524332303a204c6f73736c65737320616c7265616479206f6e00000000006044820152606401610688565b6000600a819055600b805460ff191660011790556040517f1ba3b66404043da8297d0b876fa6464f2cb127edfc6626308046d4503028322b9190a1565b600b548290829060ff1615610a2657600b54604051634a1fefbd60e01b81526001600160a01b0384811660048301526024820184905261010090920490911690634a1fefbd90604401600060405180830381600087803b158015610a0d57600080fd5b505af1158015610a21573d6000803e3d6000fd5b505050505b6000610a3285336103c4565b905083811015610a905760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610688565b610a9d8533868403611245565b610aa7858561147f565b5050505050565b6005546001600160a01b0316336001600160a01b031614610ae15760405162461bcd60e51b815260040161068890611863565b6001600160a01b038216610b075760405162461bcd60e51b81526004016106889061189a565b600680546001600160a01b0319166001600160a01b03841690811790915560078290556040517f6c591da8da2f6e69746d7d9ae61c27ee29fbe303798141b4942ae2aef54274b190600090a25050565b600b5461010090046001600160a01b0316610b6f3390565b6001600160a01b031614610bc55760405162461bcd60e51b815260206004820152601e60248201527f4c45524332303a204f6e6c79206c6f73736c65737320636f6e747261637400006044820152606401610688565b600b5460ff16610c175760405162461bcd60e51b815260206004820152601760248201527f4c45524332303a204c6f73736c657373206973206f66660000000000000000006044820152606401610688565b806000805b82811015610ce8576000858583818110610c4657634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c5b91906115dc565b6001600160a01b03811660009081526020819052604081208054919055909150610c8581856118e2565b600b546040518381529195506001600160a01b03610100909104811691908416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350508080610ce09061194c565b915050610c1c565b50600b5461010090046001600160a01b031660009081526020819052604081208054839290610d189084906118e2565b909155505050505050565b60606004805461044a90611911565b600b546000908390839060ff1615610db457600b5461010090046001600160a01b031663568c75a9610d613390565b84846040518463ffffffff1660e01b8152600401610d81939291906117ec565b600060405180830381600087803b158015610d9b57600080fd5b505af1158015610daf573d6000803e3d6000fd5b505050505b3360009081526001602090815260408083206001600160a01b038916845290915290205484811015610e365760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610688565b610e4533876106ab88856118fa565b50600195945050505050565b600b546000908390839060ff1615610ed357600b5461010090046001600160a01b0316631ffb811f610e803390565b84846040518463ffffffff1660e01b8152600401610ea0939291906117ec565b600060405180830381600087803b158015610eba57600080fd5b505af1158015610ece573d6000803e3d6000fd5b505050505b61055a3386866112a7565b6005546001600160a01b0316336001600160a01b031614610f115760405162461bcd60e51b815260040161068890611863565b600a54610f605760405162461bcd60e51b815260206004820152601b60248201527f45524332303a205475726e4f6666206e6f742070726f706f73656400000000006044820152606401610688565b42600a541115610fb25760405162461bcd60e51b815260206004820152601c60248201527f45524332303a2054696d65206c6f636b20696e2070726f6772657373000000006044820152606401610688565b600b805460ff191690556000600a8190556040517f3eb72350c9c7928d31e9ab450bfff2c159434aa4b82658a7d8eae7f109cb4e7b9190a1565b6006546001600160a01b0316336001600160a01b03161461104f5760405162461bcd60e51b815260206004820152601960248201527f4c45524332303a204d7573742062652063616e646974617465000000000000006044820152606401610688565b600754815160208301201461109c5760405162461bcd60e51b81526020600482015260136024820152724c45524332303a20496e76616c6964206b657960681b6044820152606401610688565b6006546040516001600160a01b03909116907fb94bba6936ec7f75ee931dadf6e1a4d66b43d09b6fa0178fb13df9b77fb5841f90600090a26006546001600160a01b03166110fc5760405162461bcd60e51b81526004016106889061189a565b5060068054600580546001600160a01b03199081166001600160a01b038416179091551690556000600755565b6005546001600160a01b0316336001600160a01b03161461115c5760405162461bcd60e51b815260040161068890611863565b600a54156111ac5760405162461bcd60e51b815260206004820181905260248201527f4c45524332303a205475726e4f666620616c72656164792070726f706f7365646044820152606401610688565b600b5460ff166111fe5760405162461bcd60e51b815260206004820152601c60248201527f4c45524332303a204c6f73736c65737320616c7265616479206f6666000000006044820152606401610688565b60095461120b90426118e2565b600a8190556040519081527f6ca688e6e3ddd707280140b2bf0106afe883689b6c74e68cbd517576dd9c245a9060200160405180910390a1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661130b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610688565b6001600160a01b03821661136d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610688565b6001600160a01b038316600090815260208190526040902054818110156113e55760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610688565b6113ef82826118fa565b6001600160a01b0380861660009081526020819052604080822093909355908516815290812080548492906114259084906118e2565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161147191815260200190565b60405180910390a350505050565b6001600160a01b0382166114df5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610688565b6001600160a01b038216600090815260208190526040902054818110156115535760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610688565b6001600160a01b03831660009081526020819052604081208383039055600280548492906115829084906118fa565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161129a565b80356001600160a01b038116811461043657600080fd5b6000602082840312156115ed578081fd5b6115f6826115c5565b9392505050565b6000806040838503121561160f578081fd5b611618836115c5565b9150611626602084016115c5565b90509250929050565b600080600060608486031215611643578081fd5b61164c846115c5565b925061165a602085016115c5565b9150604084013590509250925092565b6000806040838503121561167c578182fd5b611685836115c5565b946020939093013593505050565b600080602083850312156116a5578182fd5b823567ffffffffffffffff808211156116bc578384fd5b818501915085601f8301126116cf578384fd5b8135818111156116dd578485fd5b86602080830285010111156116f0578485fd5b60209290920196919550909350505050565b600060208284031215611713578081fd5b81356001600160e01b0319811681146115f6578182fd5b60006020828403121561173b578081fd5b813567ffffffffffffffff80821115611752578283fd5b818401915084601f830112611765578283fd5b8135818111156117775761177761197d565b604051601f8201601f19908116603f0116810190838211818310171561179f5761179f61197d565b816040528281528760208487010111156117b7578586fd5b826020860160208301379182016020019490945295945050505050565b6000602082840312156117e5578081fd5b5035919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6000602080835283518082850152825b8181101561183c57858101830151858201604001528201611820565b8181111561184d5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601e908201527f4c45524332303a204d757374206265207265636f766572792061646d696e0000604082015260600190565b60208082526028908201527f4c45524332303a2043616e6469646174652063616e6e6f74206265207a65726f604082015267206164647265737360c01b606082015260800190565b600082198211156118f5576118f5611967565b500190565b60008282101561190c5761190c611967565b500390565b60028104600182168061192557607f821691505b6020821081141561194657634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561196057611960611967565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212209bf74befecb099637926d39c6cc4102c8ca77f41f8081e8f90480e68b4680a3a64736f6c634300080200334c45524332303a2054696d656c6f636b20706572696f64206d757374206265204c45524332303a205265636f766572792061646d696e2063616e6e6f7420626500000000000000000000000057fb3a4205dcdfae514d13c211d6c8c08be58e8600000000000000000000000053745cc2c6dc4b1468f41d286cd1aab7aa7a1b81000000000000000000000000000000000000000000000000000000000001518000000000000000000000000038d40f5c8375f84c5b90bc460a94a436d09133fb

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80636e9960c3116100f9578063a9059cbb11610097578063ccfa214f11610071578063ccfa214f146103a1578063d6e242b8146103ae578063dd62ed3e146103b6578063f851a440146103ef576101c4565b8063a9059cbb14610373578063b38fe95714610386578063b5c228771461038e576101c4565b806393310ffe116100d357806393310ffe14610332578063936af9111461034557806395d89b4114610358578063a457c2d714610360576101c4565b80636e9960c3146102e557806370a08231146102f657806379cc67901461031f576101c4565b8063313ce5671161016657806342966c681161014057806342966c68146102ae5780635b8a194a146102c15780635f6529a3146102c957806361086b00146102dc576101c4565b8063313ce5671461025c57806334f6ebf51461026b578063395093511461029b576101c4565b806318160ddd116101a257806318160ddd1461021957806323b872dd1461022b5780632baa3c9e1461023e5780632ecaf67514610253576101c4565b806301ffc9a7146101c957806306fdde03146101f1578063095ea7b314610206575b600080fd5b6101dc6101d7366004611702565b610402565b60405190151581526020015b60405180910390f35b6101f961043b565b6040516101e89190611810565b6101dc61021436600461166a565b6104cd565b6002545b6040519081526020016101e8565b6101dc61023936600461162f565b610565565b61025161024c3660046115dc565b6106be565b005b61021d60095481565b604051601281526020016101e8565b600b546102839061010090046001600160a01b031681565b6040516001600160a01b0390911681526020016101e8565b6101dc6102a936600461166a565b6107a5565b6102516102bc3660046117d4565b61085d565b6102516108e7565b600554610283906001600160a01b031681565b61021d600a5481565b6008546001600160a01b0316610283565b61021d6103043660046115dc565b6001600160a01b031660009081526020819052604090205490565b61025161032d36600461166a565b6109aa565b61025161034036600461166a565b610aae565b610251610353366004611693565b610b57565b6101f9610d23565b6101dc61036e36600461166a565b610d32565b6101dc61038136600461166a565b610e51565b610251610ede565b61025161039c36600461172a565b610fec565b600b546101dc9060ff1681565b610251611129565b61021d6103c43660046115fd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600854610283906001600160a01b031681565b60006001600160e01b031982166336372b0760e01b148061043357506001600160e01b03198216630fcd53a160e21b145b90505b919050565b60606003805461044a90611911565b80601f016020809104026020016040519081016040528092919081815260200182805461047690611911565b80156104c35780601f10610498576101008083540402835291602001916104c3565b820191906000526020600020905b8154815290600101906020018083116104a657829003601f168201915b5050505050905090565b600b546000908390839060ff161561054f57600b5461010090046001600160a01b03166347abf3be6104fc3390565b84846040518463ffffffff1660e01b815260040161051c939291906117ec565b600060405180830381600087803b15801561053657600080fd5b505af115801561054a573d6000803e3d6000fd5b505050505b61055a338686611245565b506001949350505050565b600b5460009084908490849060ff161561060757600b5461010090046001600160a01b031663379f5c696105963390565b6040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528187166024820152908516604482015260648101849052608401600060405180830381600087803b1580156105ee57600080fd5b505af1158015610602573d6000803e3d6000fd5b505050505b6001600160a01b0387166000908152600160209081526040808320338452909152902054858110156106915760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b61069c8888886112a7565b6106b088336106ab89856118fa565b611245565b506001979650505050505050565b6005546001600160a01b0316336001600160a01b0316146106f15760405162461bcd60e51b815260040161068890611863565b6008546001600160a01b038281169116141561074f5760405162461bcd60e51b815260206004820152601f60248201527f4c45524332303a2043616e6e6f74207365742073616d652061646472657373006044820152606401610688565b6040516001600160a01b038216907f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c90600090a2600880546001600160a01b0319166001600160a01b0392909216919091179055565b600b546000908390839060ff161561082757600b5461010090046001600160a01b031663cf5961bb6107d43390565b84846040518463ffffffff1660e01b81526004016107f4939291906117ec565b600060405180830381600087803b15801561080e57600080fd5b505af1158015610822573d6000803e3d6000fd5b505050505b3360008181526001602090815260408083206001600160a01b038a16845290915290205461055a919087906106ab9088906118e2565b33600b54829060ff16156108d857600b54604051634a1fefbd60e01b81526001600160a01b0384811660048301526024820184905261010090920490911690634a1fefbd90604401600060405180830381600087803b1580156108bf57600080fd5b505af11580156108d3573d6000803e3d6000fd5b505050505b6108e2338461147f565b505050565b6005546001600160a01b0316336001600160a01b03161461091a5760405162461bcd60e51b815260040161068890611863565b600b5460ff161561096d5760405162461bcd60e51b815260206004820152601b60248201527f4c45524332303a204c6f73736c65737320616c7265616479206f6e00000000006044820152606401610688565b6000600a819055600b805460ff191660011790556040517f1ba3b66404043da8297d0b876fa6464f2cb127edfc6626308046d4503028322b9190a1565b600b548290829060ff1615610a2657600b54604051634a1fefbd60e01b81526001600160a01b0384811660048301526024820184905261010090920490911690634a1fefbd90604401600060405180830381600087803b158015610a0d57600080fd5b505af1158015610a21573d6000803e3d6000fd5b505050505b6000610a3285336103c4565b905083811015610a905760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610688565b610a9d8533868403611245565b610aa7858561147f565b5050505050565b6005546001600160a01b0316336001600160a01b031614610ae15760405162461bcd60e51b815260040161068890611863565b6001600160a01b038216610b075760405162461bcd60e51b81526004016106889061189a565b600680546001600160a01b0319166001600160a01b03841690811790915560078290556040517f6c591da8da2f6e69746d7d9ae61c27ee29fbe303798141b4942ae2aef54274b190600090a25050565b600b5461010090046001600160a01b0316610b6f3390565b6001600160a01b031614610bc55760405162461bcd60e51b815260206004820152601e60248201527f4c45524332303a204f6e6c79206c6f73736c65737320636f6e747261637400006044820152606401610688565b600b5460ff16610c175760405162461bcd60e51b815260206004820152601760248201527f4c45524332303a204c6f73736c657373206973206f66660000000000000000006044820152606401610688565b806000805b82811015610ce8576000858583818110610c4657634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c5b91906115dc565b6001600160a01b03811660009081526020819052604081208054919055909150610c8581856118e2565b600b546040518381529195506001600160a01b03610100909104811691908416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350508080610ce09061194c565b915050610c1c565b50600b5461010090046001600160a01b031660009081526020819052604081208054839290610d189084906118e2565b909155505050505050565b60606004805461044a90611911565b600b546000908390839060ff1615610db457600b5461010090046001600160a01b031663568c75a9610d613390565b84846040518463ffffffff1660e01b8152600401610d81939291906117ec565b600060405180830381600087803b158015610d9b57600080fd5b505af1158015610daf573d6000803e3d6000fd5b505050505b3360009081526001602090815260408083206001600160a01b038916845290915290205484811015610e365760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610688565b610e4533876106ab88856118fa565b50600195945050505050565b600b546000908390839060ff1615610ed357600b5461010090046001600160a01b0316631ffb811f610e803390565b84846040518463ffffffff1660e01b8152600401610ea0939291906117ec565b600060405180830381600087803b158015610eba57600080fd5b505af1158015610ece573d6000803e3d6000fd5b505050505b61055a3386866112a7565b6005546001600160a01b0316336001600160a01b031614610f115760405162461bcd60e51b815260040161068890611863565b600a54610f605760405162461bcd60e51b815260206004820152601b60248201527f45524332303a205475726e4f6666206e6f742070726f706f73656400000000006044820152606401610688565b42600a541115610fb25760405162461bcd60e51b815260206004820152601c60248201527f45524332303a2054696d65206c6f636b20696e2070726f6772657373000000006044820152606401610688565b600b805460ff191690556000600a8190556040517f3eb72350c9c7928d31e9ab450bfff2c159434aa4b82658a7d8eae7f109cb4e7b9190a1565b6006546001600160a01b0316336001600160a01b03161461104f5760405162461bcd60e51b815260206004820152601960248201527f4c45524332303a204d7573742062652063616e646974617465000000000000006044820152606401610688565b600754815160208301201461109c5760405162461bcd60e51b81526020600482015260136024820152724c45524332303a20496e76616c6964206b657960681b6044820152606401610688565b6006546040516001600160a01b03909116907fb94bba6936ec7f75ee931dadf6e1a4d66b43d09b6fa0178fb13df9b77fb5841f90600090a26006546001600160a01b03166110fc5760405162461bcd60e51b81526004016106889061189a565b5060068054600580546001600160a01b03199081166001600160a01b038416179091551690556000600755565b6005546001600160a01b0316336001600160a01b03161461115c5760405162461bcd60e51b815260040161068890611863565b600a54156111ac5760405162461bcd60e51b815260206004820181905260248201527f4c45524332303a205475726e4f666620616c72656164792070726f706f7365646044820152606401610688565b600b5460ff166111fe5760405162461bcd60e51b815260206004820152601c60248201527f4c45524332303a204c6f73736c65737320616c7265616479206f6666000000006044820152606401610688565b60095461120b90426118e2565b600a8190556040519081527f6ca688e6e3ddd707280140b2bf0106afe883689b6c74e68cbd517576dd9c245a9060200160405180910390a1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661130b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610688565b6001600160a01b03821661136d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610688565b6001600160a01b038316600090815260208190526040902054818110156113e55760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610688565b6113ef82826118fa565b6001600160a01b0380861660009081526020819052604080822093909355908516815290812080548492906114259084906118e2565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161147191815260200190565b60405180910390a350505050565b6001600160a01b0382166114df5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610688565b6001600160a01b038216600090815260208190526040902054818110156115535760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610688565b6001600160a01b03831660009081526020819052604081208383039055600280548492906115829084906118fa565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161129a565b80356001600160a01b038116811461043657600080fd5b6000602082840312156115ed578081fd5b6115f6826115c5565b9392505050565b6000806040838503121561160f578081fd5b611618836115c5565b9150611626602084016115c5565b90509250929050565b600080600060608486031215611643578081fd5b61164c846115c5565b925061165a602085016115c5565b9150604084013590509250925092565b6000806040838503121561167c578182fd5b611685836115c5565b946020939093013593505050565b600080602083850312156116a5578182fd5b823567ffffffffffffffff808211156116bc578384fd5b818501915085601f8301126116cf578384fd5b8135818111156116dd578485fd5b86602080830285010111156116f0578485fd5b60209290920196919550909350505050565b600060208284031215611713578081fd5b81356001600160e01b0319811681146115f6578182fd5b60006020828403121561173b578081fd5b813567ffffffffffffffff80821115611752578283fd5b818401915084601f830112611765578283fd5b8135818111156117775761177761197d565b604051601f8201601f19908116603f0116810190838211818310171561179f5761179f61197d565b816040528281528760208487010111156117b7578586fd5b826020860160208301379182016020019490945295945050505050565b6000602082840312156117e5578081fd5b5035919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6000602080835283518082850152825b8181101561183c57858101830151858201604001528201611820565b8181111561184d5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601e908201527f4c45524332303a204d757374206265207265636f766572792061646d696e0000604082015260600190565b60208082526028908201527f4c45524332303a2043616e6469646174652063616e6e6f74206265207a65726f604082015267206164647265737360c01b606082015260800190565b600082198211156118f5576118f5611967565b500190565b60008282101561190c5761190c611967565b500390565b60028104600182168061192557607f821691505b6020821081141561194657634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561196057611960611967565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212209bf74befecb099637926d39c6cc4102c8ca77f41f8081e8f90480e68b4680a3a64736f6c63430008020033