false
false
0

Contract Address Details

0x5633F30748A435322030fB02F1097CFe9D311bA4

Contract Name
Treasury
Creator
0xebe894–7a24f6 at 0x45aa77–c6ba83
Balance
18,488,597.118751938103344092 CLO
Tokens
Fetching tokens...
Transactions
17 Transactions
Transfers
2 Transfers
Gas Used
572,384
Last Balance Update
18597405
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
Treasury




Optimization enabled
false
Compiler version
v0.8.16+commit.07a7930e




EVM Version
default




Verified at
2024-09-26T15:34:50.165128Z

Contract source code

// SPDX-License-Identifier: GPL-3.0-only
// Разработчик: Upaut

pragma solidity ^0.8.16;

interface IERC20 {
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
}


contract Treasury {

    struct RecipientData { // структура описывающая данные каждого получателя
        uint256 percent; // установленный процент получателя
        uint256 balance; // баланс получателя
    }

    address public callistoNetwork = 0xeBE894814554c8382EA6a24CcDdf1527407A24f6; // Первый получатель
    address public callistoCommunity = 0x810059e1406dEDAFd1BdCa4E0137CbA306c0Ce36; // Второй получатель

    mapping(address => RecipientData) private recipients; // связь получателей с их структурой данных

    event ChangeRecipient(address indexed _old, address indexed _new);
    event TransferPercent(address indexed _sender, uint _percent);
    event TransferCLO(address indexed _sender, address indexed _recipient, uint _value);


    modifier onlyRecipients() {
        require((msg.sender == callistoNetwork) || (msg.sender == callistoCommunity), "Only recipient");
        _;
    }

    constructor()
    {
        // Проценты имеют decimal = 18
        recipients[callistoNetwork].percent = 50 * 1e18; // 50% от трежери для CallistoNetwork
        recipients[callistoCommunity].percent = 50 * 1e18; // 50% от трежери для сообщества Callisto
    }


    function changeRecepient(address _newRecepient) external onlyRecipients // изменение адреса получателя. Новый получатель сохраняет за собой право на проценты и баланс старого получателя
    {
        uint256 _percent = recipients[msg.sender].percent; // процент старого получателя
        uint256 _balance = recipients[msg.sender].balance; // баланс старого получателя
        delete recipients[msg.sender]; // удаляем данные старого получателя

        // Инициализируем данные нового получателя
        recipients[_newRecepient] = RecipientData(_percent, _balance);
        (callistoNetwork, callistoCommunity) = msg.sender == callistoNetwork ? (_newRecepient, callistoCommunity) : (callistoNetwork, _newRecepient);

        emit ChangeRecipient(msg.sender, _newRecepient); // логируем изменение получателя
    }


    function transferPercent(uint256 _percent) external onlyRecipients // передача части процента под управление второго получателя
    {
        uint256 _tekPercent = recipients[msg.sender].percent; // текущий процент получателя
        require(_percent <= _tekPercent); // проверяем что отправитель имеет в распоряжении передаваемые проценты
        
        _balanceDistribution(); // получатели делят нераспределенный баланс трежери

        // передаем управление процентом второму получателю
        (recipients[callistoNetwork].percent, recipients[callistoCommunity].percent) = msg.sender == callistoNetwork ? (_tekPercent - _percent, recipients[callistoCommunity].percent + _percent) : (recipients[callistoNetwork].percent + _percent, _tekPercent - _percent);
        emit TransferPercent(msg.sender, _percent); // логируем передачу процента отправителем
    }


    function transferCLO(address _recipient, uint256 _value) external onlyRecipients // отправка CLO
    {
        require((_recipient != address(0x00)) && (_recipient != address(this))); // получателем не может быть нулевой адрес, или контракт трежери
        _balanceDistribution(); // получатели делят нераспределенный баланс трежери

        uint256 _tekBalance = recipients[msg.sender].balance; // текущий баланс отправителя
        require(_value <= _tekBalance); // проверяем что отправитель имеет в распоряжении достаточный баланс

        recipients[msg.sender].balance = _tekBalance - _value; // корректировка баланса отправителя
        payable(_recipient).transfer(_value); // отправляем CLO получателю

        emit TransferCLO(msg.sender, _recipient, _value); // логируем отправку CLO
    }


    function transferToken(address _token, address _recipient, uint256 _value) external // отправка токена
    {
        require(msg.sender == callistoCommunity); // Распоряжаться любыми токенами разрешено только сообществу
        require((_recipient != address(0x00)) && (_recipient != address(this))); // получателем не может быть нулевой адрес, или контракт трежери
        IERC20(_token).transfer(_recipient, _value); // отправляем токен получателю
    }



    function _balanceDistribution() private { // распределение CLO в трежери, между получателями
        uint256 _cn = recipients[callistoNetwork].balance; // текущий баланс callistoNetwork
        uint256 _cc = recipients[callistoCommunity].balance; // текущий баланс callistoCommunity
        uint256 _contractBalance = address(this).balance - (_cn + _cc); // получаем нераспределенный баланс нативной монеты у контракта трежери
        uint256 _cnShare = recipients[callistoNetwork].percent * _contractBalance / (100 * 1e18); // рассчитываем долю callistoNetwork в свободных CLO у контракта
        recipients[callistoNetwork].balance = _cn + _cnShare; // передаем эту долю в распоряжение callistoNetwork
        recipients[callistoCommunity].balance = _cc + (_contractBalance - _cnShare); // остаток переходит под управление callistoCommunity
    }


    function getRecipientData(address _recipient) public view returns (RecipientData memory) // Возвращаем текущий процент и текущий баланс CLO у получателя
    {   
        RecipientData memory _result;
        uint256 _cn = recipients[callistoNetwork].balance; // текущий баланс callistoNetwork
        uint256 _cc = recipients[callistoCommunity].balance; // текущий баланс callistoCommunity
        uint256 _contractBalance = address(this).balance - (_cn + _cc); // получаем нераспределенный баланс нативной монеты у контракта трежери
        uint256 _share = recipients[_recipient].percent * _contractBalance / (100 * 1e18); // рассчитываем долю запрошенного получателя
        _result = RecipientData(recipients[_recipient].percent, recipients[_recipient].balance + _share); // получаем текущий процент и весь доступный баланс для запрошенного получателя
        return (_result); // возвращаем массив с инфой по токенам
    }


    function getBalanceToken(address _token) public view returns (uint256, uint8, string memory) // Возвращаем текущий баланс контракта в запрошенном токене, а также количество десятичных знаков и символ данного токена
    {   
        uint _balance = IERC20(_token).balanceOf(address(this)); // получаем баланс этого контракта в запрошенном токене
        uint8 _decimal = IERC20(_token).decimals(); // получаем количество десятичных знаков у запрошенного токена
        string memory _symb = IERC20(_token).symbol(); // Получаем символ токена
        return (_balance, _decimal, _symb);
    }


    // Контракт принимает пожертвования в нативной монете, любые токены ERC223 и ERC20
    // Любые пожертвования в токенах ERC223 и ERC20 переходят под управление сообществом в полном объеме

    receive() external payable {} // принимаем CLO. Он будет распределен между получателями согласно установленным процентам

    function tokenReceived(address _from, uint _value, bytes memory _data) public returns (bytes4) { // принимаем токены ERC223
        return this.tokenReceived.selector; // возвращаем селектор этой функции
    }

}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"ChangeRecipient","inputs":[{"type":"address","name":"_old","internalType":"address","indexed":true},{"type":"address","name":"_new","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"TransferCLO","inputs":[{"type":"address","name":"_sender","internalType":"address","indexed":true},{"type":"address","name":"_recipient","internalType":"address","indexed":true},{"type":"uint256","name":"_value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TransferPercent","inputs":[{"type":"address","name":"_sender","internalType":"address","indexed":true},{"type":"uint256","name":"_percent","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"callistoCommunity","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"callistoNetwork","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeRecepient","inputs":[{"type":"address","name":"_newRecepient","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint8","name":"","internalType":"uint8"},{"type":"string","name":"","internalType":"string"}],"name":"getBalanceToken","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct Treasury.RecipientData","components":[{"type":"uint256","name":"percent","internalType":"uint256"},{"type":"uint256","name":"balance","internalType":"uint256"}]}],"name":"getRecipientData","inputs":[{"type":"address","name":"_recipient","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"tokenReceived","inputs":[{"type":"address","name":"_from","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferCLO","inputs":[{"type":"address","name":"_recipient","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferPercent","inputs":[{"type":"uint256","name":"_percent","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferToken","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_recipient","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x608060405273ebe894814554c8382ea6a24ccddf1527407a24f66000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073810059e1406dedafd1bdca4e0137cba306c0ce36600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156100b957600080fd5b506802b5e3af16b1880000600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506802b5e3af16b188000060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550611d64806101ac6000396000f3fe6080604052600436106100895760003560e01c806348eca45c1161005957806348eca45c1461013d5780636c3fc4451461017c5780638943ec02146101a5578063f5537ede146101e2578063fe37f7fe1461020b57610090565b8062667f2914610095578063082455ce146100c05780630fb35fc6146100e95780632d5823711461011257610090565b3661009057005b600080fd5b3480156100a157600080fd5b506100aa610248565b6040516100b79190611479565b60405180910390f35b3480156100cc57600080fd5b506100e760048036038101906100e291906114de565b61026e565b005b3480156100f557600080fd5b50610110600480360381019061010b9190611537565b610629565b005b34801561011e57600080fd5b506101276108e0565b6040516101349190611479565b60405180910390f35b34801561014957600080fd5b50610164600480360381019061015f9190611577565b610904565b6040516101739392919061165f565b60405180910390f35b34801561018857600080fd5b506101a3600480360381019061019e9190611577565b610a85565b005b3480156101b157600080fd5b506101cc60048036038101906101c791906117d2565b610e3b565b6040516101d9919061187c565b60405180910390f35b3480156101ee57600080fd5b5061020960048036038101906102049190611897565b610e4e565b005b34801561021757600080fd5b50610232600480360381019061022d9190611577565b610f9e565b60405161023f9190611928565b60405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103155750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034b9061198f565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050808211156103a857600080fd5b6103b06111b3565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104835781600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461047291906119de565b828261047e9190611a12565b610500565b818161048f9190611a12565b8260026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546104ff91906119de565b5b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008491905055839190505550503373ffffffffffffffffffffffffffffffffffffffff167f700115a5a47daa46c4a0c7d6d282a2d45aa8aed28137136d59064f090a38a3238360405161061d9190611a46565b60405180910390a25050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106d05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61070f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107069061198f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561077857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61078157600080fd5b6107896111b3565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050808211156107dd57600080fd5b81816107e99190611a12565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610875573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4ddebed7447a12da95902559eac51ea2594f93265e70f2d11da210e33abdafcd846040516108d39190611a46565b60405180910390a3505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080606060008473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109449190611479565b602060405180830381865afa158015610961573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109859190611a76565b905060008573ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f89190611acf565b905060008673ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a709190611b9d565b90508282829550955095505050509193909250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b2c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b629061198f565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090555050604051806040016040528083815260200182815250600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015590505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d305760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610d55565b82600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b600080600160008491906101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508391906101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f68dd0f2c9ca18dce1e14e2e3f99123a6292bfde61698d10163545ee09a2bb7bb60405160405180910390a3505050565b6000638943ec0260e01b90509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ea857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610f1157503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b610f1a57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610f55929190611be6565b6020604051808303816000875af1158015610f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f989190611c47565b50505050565b610fa661141e565b610fae61141e565b6000600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000818361108d91906119de565b476110989190611a12565b9050600068056bc75e2d6310000082600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546110f49190611c74565b6110fe9190611cfd565b90506040518060400160405280600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154815260200182600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546111a191906119de565b81525094508495505050505050919050565b6000600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000818361129291906119de565b4761129d9190611a12565b9050600068056bc75e2d6310000082600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461131a9190611c74565b6113249190611cfd565b9050808461133291906119de565b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555080826113a59190611a12565b836113b091906119de565b60026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555050505050565b604051806040016040528060008152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061146382611438565b9050919050565b61147381611458565b82525050565b600060208201905061148e600083018461146a565b92915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6114bb816114a8565b81146114c657600080fd5b50565b6000813590506114d8816114b2565b92915050565b6000602082840312156114f4576114f361149e565b5b6000611502848285016114c9565b91505092915050565b61151481611458565b811461151f57600080fd5b50565b6000813590506115318161150b565b92915050565b6000806040838503121561154e5761154d61149e565b5b600061155c85828601611522565b925050602061156d858286016114c9565b9150509250929050565b60006020828403121561158d5761158c61149e565b5b600061159b84828501611522565b91505092915050565b6115ad816114a8565b82525050565b600060ff82169050919050565b6115c9816115b3565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156116095780820151818401526020810190506115ee565b60008484015250505050565b6000601f19601f8301169050919050565b6000611631826115cf565b61163b81856115da565b935061164b8185602086016115eb565b61165481611615565b840191505092915050565b600060608201905061167460008301866115a4565b61168160208301856115c0565b81810360408301526116938184611626565b9050949350505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6116df82611615565b810181811067ffffffffffffffff821117156116fe576116fd6116a7565b5b80604052505050565b6000611711611494565b905061171d82826116d6565b919050565b600067ffffffffffffffff82111561173d5761173c6116a7565b5b61174682611615565b9050602081019050919050565b82818337600083830152505050565b600061177561177084611722565b611707565b905082815260208101848484011115611791576117906116a2565b5b61179c848285611753565b509392505050565b600082601f8301126117b9576117b861169d565b5b81356117c9848260208601611762565b91505092915050565b6000806000606084860312156117eb576117ea61149e565b5b60006117f986828701611522565b935050602061180a868287016114c9565b925050604084013567ffffffffffffffff81111561182b5761182a6114a3565b5b611837868287016117a4565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61187681611841565b82525050565b6000602082019050611891600083018461186d565b92915050565b6000806000606084860312156118b0576118af61149e565b5b60006118be86828701611522565b93505060206118cf86828701611522565b92505060406118e0868287016114c9565b9150509250925092565b6118f3816114a8565b82525050565b60408201600082015161190f60008501826118ea565b50602082015161192260208501826118ea565b50505050565b600060408201905061193d60008301846118f9565b92915050565b7f4f6e6c7920726563697069656e74000000000000000000000000000000000000600082015250565b6000611979600e836115da565b915061198482611943565b602082019050919050565b600060208201905081810360008301526119a88161196c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006119e9826114a8565b91506119f4836114a8565b9250828201905080821115611a0c57611a0b6119af565b5b92915050565b6000611a1d826114a8565b9150611a28836114a8565b9250828203905081811115611a4057611a3f6119af565b5b92915050565b6000602082019050611a5b60008301846115a4565b92915050565b600081519050611a70816114b2565b92915050565b600060208284031215611a8c57611a8b61149e565b5b6000611a9a84828501611a61565b91505092915050565b611aac816115b3565b8114611ab757600080fd5b50565b600081519050611ac981611aa3565b92915050565b600060208284031215611ae557611ae461149e565b5b6000611af384828501611aba565b91505092915050565b600067ffffffffffffffff821115611b1757611b166116a7565b5b611b2082611615565b9050602081019050919050565b6000611b40611b3b84611afc565b611707565b905082815260208101848484011115611b5c57611b5b6116a2565b5b611b678482856115eb565b509392505050565b600082601f830112611b8457611b8361169d565b5b8151611b94848260208601611b2d565b91505092915050565b600060208284031215611bb357611bb261149e565b5b600082015167ffffffffffffffff811115611bd157611bd06114a3565b5b611bdd84828501611b6f565b91505092915050565b6000604082019050611bfb600083018561146a565b611c0860208301846115a4565b9392505050565b60008115159050919050565b611c2481611c0f565b8114611c2f57600080fd5b50565b600081519050611c4181611c1b565b92915050565b600060208284031215611c5d57611c5c61149e565b5b6000611c6b84828501611c32565b91505092915050565b6000611c7f826114a8565b9150611c8a836114a8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611cc357611cc26119af565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611d08826114a8565b9150611d13836114a8565b925082611d2357611d22611cce565b5b82820490509291505056fea26469706673582212202c6851d3cd23abf70098f1e5fc87239703f5098d1163d8d03e2185264cea3ac064736f6c63430008100033

Deployed ByteCode

0x6080604052600436106100895760003560e01c806348eca45c1161005957806348eca45c1461013d5780636c3fc4451461017c5780638943ec02146101a5578063f5537ede146101e2578063fe37f7fe1461020b57610090565b8062667f2914610095578063082455ce146100c05780630fb35fc6146100e95780632d5823711461011257610090565b3661009057005b600080fd5b3480156100a157600080fd5b506100aa610248565b6040516100b79190611479565b60405180910390f35b3480156100cc57600080fd5b506100e760048036038101906100e291906114de565b61026e565b005b3480156100f557600080fd5b50610110600480360381019061010b9190611537565b610629565b005b34801561011e57600080fd5b506101276108e0565b6040516101349190611479565b60405180910390f35b34801561014957600080fd5b50610164600480360381019061015f9190611577565b610904565b6040516101739392919061165f565b60405180910390f35b34801561018857600080fd5b506101a3600480360381019061019e9190611577565b610a85565b005b3480156101b157600080fd5b506101cc60048036038101906101c791906117d2565b610e3b565b6040516101d9919061187c565b60405180910390f35b3480156101ee57600080fd5b5061020960048036038101906102049190611897565b610e4e565b005b34801561021757600080fd5b50610232600480360381019061022d9190611577565b610f9e565b60405161023f9190611928565b60405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103155750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034b9061198f565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050808211156103a857600080fd5b6103b06111b3565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104835781600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461047291906119de565b828261047e9190611a12565b610500565b818161048f9190611a12565b8260026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546104ff91906119de565b5b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008491905055839190505550503373ffffffffffffffffffffffffffffffffffffffff167f700115a5a47daa46c4a0c7d6d282a2d45aa8aed28137136d59064f090a38a3238360405161061d9190611a46565b60405180910390a25050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106d05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61070f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107069061198f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561077857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61078157600080fd5b6107896111b3565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050808211156107dd57600080fd5b81816107e99190611a12565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610875573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4ddebed7447a12da95902559eac51ea2594f93265e70f2d11da210e33abdafcd846040516108d39190611a46565b60405180910390a3505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080606060008473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109449190611479565b602060405180830381865afa158015610961573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109859190611a76565b905060008573ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f89190611acf565b905060008673ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a709190611b9d565b90508282829550955095505050509193909250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b2c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b629061198f565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090555050604051806040016040528083815260200182815250600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015590505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d305760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610d55565b82600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b600080600160008491906101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508391906101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f68dd0f2c9ca18dce1e14e2e3f99123a6292bfde61698d10163545ee09a2bb7bb60405160405180910390a3505050565b6000638943ec0260e01b90509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ea857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610f1157503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b610f1a57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610f55929190611be6565b6020604051808303816000875af1158015610f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f989190611c47565b50505050565b610fa661141e565b610fae61141e565b6000600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000818361108d91906119de565b476110989190611a12565b9050600068056bc75e2d6310000082600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546110f49190611c74565b6110fe9190611cfd565b90506040518060400160405280600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154815260200182600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546111a191906119de565b81525094508495505050505050919050565b6000600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000818361129291906119de565b4761129d9190611a12565b9050600068056bc75e2d6310000082600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461131a9190611c74565b6113249190611cfd565b9050808461133291906119de565b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555080826113a59190611a12565b836113b091906119de565b60026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555050505050565b604051806040016040528060008152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061146382611438565b9050919050565b61147381611458565b82525050565b600060208201905061148e600083018461146a565b92915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6114bb816114a8565b81146114c657600080fd5b50565b6000813590506114d8816114b2565b92915050565b6000602082840312156114f4576114f361149e565b5b6000611502848285016114c9565b91505092915050565b61151481611458565b811461151f57600080fd5b50565b6000813590506115318161150b565b92915050565b6000806040838503121561154e5761154d61149e565b5b600061155c85828601611522565b925050602061156d858286016114c9565b9150509250929050565b60006020828403121561158d5761158c61149e565b5b600061159b84828501611522565b91505092915050565b6115ad816114a8565b82525050565b600060ff82169050919050565b6115c9816115b3565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156116095780820151818401526020810190506115ee565b60008484015250505050565b6000601f19601f8301169050919050565b6000611631826115cf565b61163b81856115da565b935061164b8185602086016115eb565b61165481611615565b840191505092915050565b600060608201905061167460008301866115a4565b61168160208301856115c0565b81810360408301526116938184611626565b9050949350505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6116df82611615565b810181811067ffffffffffffffff821117156116fe576116fd6116a7565b5b80604052505050565b6000611711611494565b905061171d82826116d6565b919050565b600067ffffffffffffffff82111561173d5761173c6116a7565b5b61174682611615565b9050602081019050919050565b82818337600083830152505050565b600061177561177084611722565b611707565b905082815260208101848484011115611791576117906116a2565b5b61179c848285611753565b509392505050565b600082601f8301126117b9576117b861169d565b5b81356117c9848260208601611762565b91505092915050565b6000806000606084860312156117eb576117ea61149e565b5b60006117f986828701611522565b935050602061180a868287016114c9565b925050604084013567ffffffffffffffff81111561182b5761182a6114a3565b5b611837868287016117a4565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61187681611841565b82525050565b6000602082019050611891600083018461186d565b92915050565b6000806000606084860312156118b0576118af61149e565b5b60006118be86828701611522565b93505060206118cf86828701611522565b92505060406118e0868287016114c9565b9150509250925092565b6118f3816114a8565b82525050565b60408201600082015161190f60008501826118ea565b50602082015161192260208501826118ea565b50505050565b600060408201905061193d60008301846118f9565b92915050565b7f4f6e6c7920726563697069656e74000000000000000000000000000000000000600082015250565b6000611979600e836115da565b915061198482611943565b602082019050919050565b600060208201905081810360008301526119a88161196c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006119e9826114a8565b91506119f4836114a8565b9250828201905080821115611a0c57611a0b6119af565b5b92915050565b6000611a1d826114a8565b9150611a28836114a8565b9250828203905081811115611a4057611a3f6119af565b5b92915050565b6000602082019050611a5b60008301846115a4565b92915050565b600081519050611a70816114b2565b92915050565b600060208284031215611a8c57611a8b61149e565b5b6000611a9a84828501611a61565b91505092915050565b611aac816115b3565b8114611ab757600080fd5b50565b600081519050611ac981611aa3565b92915050565b600060208284031215611ae557611ae461149e565b5b6000611af384828501611aba565b91505092915050565b600067ffffffffffffffff821115611b1757611b166116a7565b5b611b2082611615565b9050602081019050919050565b6000611b40611b3b84611afc565b611707565b905082815260208101848484011115611b5c57611b5b6116a2565b5b611b678482856115eb565b509392505050565b600082601f830112611b8457611b8361169d565b5b8151611b94848260208601611b2d565b91505092915050565b600060208284031215611bb357611bb261149e565b5b600082015167ffffffffffffffff811115611bd157611bd06114a3565b5b611bdd84828501611b6f565b91505092915050565b6000604082019050611bfb600083018561146a565b611c0860208301846115a4565b9392505050565b60008115159050919050565b611c2481611c0f565b8114611c2f57600080fd5b50565b600081519050611c4181611c1b565b92915050565b600060208284031215611c5d57611c5c61149e565b5b6000611c6b84828501611c32565b91505092915050565b6000611c7f826114a8565b9150611c8a836114a8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611cc357611cc26119af565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611d08826114a8565b9150611d13836114a8565b925082611d2357611d22611cce565b5b82820490509291505056fea26469706673582212202c6851d3cd23abf70098f1e5fc87239703f5098d1163d8d03e2185264cea3ac064736f6c63430008100033