Contract Address Details

0xbD62acE2BC78B7ABdEb84E00fdBCa54544929d0b

Contract Name
Treasury
Creator
0xebe894–7a24f6 at 0x8b36cf–4bebfe
Balance
0 CLO ( )
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
15579473
Contract name:
Treasury




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




EVM Version
default




Verified at
2024-03-04T10:10:07.625803Z

Contract source code

// All rights reserved.
// SPDX-License-Identifier: No License (None)
// Разработчик: Upaut

pragma solidity ^0.8.16;


interface IERC20 {
    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 = 0xfc8f3324B6D71d14BfD625ECdbD18f3bc29A9935; // Второй получатель

    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) // Возвращаем текущий процент и текущий баланс CLO у получателя
    {   
        uint _balance = IERC20(_token).balanceOf(address(this)); // получаем баланс этого контракта в запрошенном токене
        return (_balance);
    }


    // Контракт принимает пожертвования в нативной монете, любые токены 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"}],"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

0x608060405273ebe894814554c8382ea6a24ccddf1527407a24f66000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073fc8f3324b6d71d14bfd625ecdbd18f3bc29a9935600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156100b957600080fd5b506802b5e3af16b1880000600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506802b5e3af16b188000060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550611a5e806101ac6000396000f3fe6080604052600436106100895760003560e01c806348eca45c1161005957806348eca45c1461013d5780636c3fc4451461017a5780638943ec02146101a3578063f5537ede146101e0578063fe37f7fe1461020957610090565b8062667f2914610095578063082455ce146100c05780630fb35fc6146100e95780632d5823711461011257610090565b3661009057005b600080fd5b3480156100a157600080fd5b506100aa610246565b6040516100b7919061137e565b60405180910390f35b3480156100cc57600080fd5b506100e760048036038101906100e291906113e3565b61026c565b005b3480156100f557600080fd5b50610110600480360381019061010b919061143c565b610627565b005b34801561011e57600080fd5b506101276108de565b604051610134919061137e565b60405180910390f35b34801561014957600080fd5b50610164600480360381019061015f919061147c565b610902565b60405161017191906114b8565b60405180910390f35b34801561018657600080fd5b506101a1600480360381019061019c919061147c565b61098a565b005b3480156101af57600080fd5b506101ca60048036038101906101c59190611619565b610d40565b6040516101d791906116c3565b60405180910390f35b3480156101ec57600080fd5b50610207600480360381019061020291906116de565b610d53565b005b34801561021557600080fd5b50610230600480360381019061022b919061147c565b610ea3565b60405161023d919061176f565b60405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103135750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610352576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610349906117e7565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050808211156103a657600080fd5b6103ae6110b8565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104815781600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546104709190611836565b828261047c919061186a565b6104fe565b818161048d919061186a565b8260026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546104fd9190611836565b5b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008491905055839190505550503373ffffffffffffffffffffffffffffffffffffffff167f700115a5a47daa46c4a0c7d6d282a2d45aa8aed28137136d59064f090a38a3238360405161061b91906114b8565b60405180910390a25050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106ce5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61070d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610704906117e7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561077657503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61077f57600080fd5b6107876110b8565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050808211156107db57600080fd5b81816107e7919061186a565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610873573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4ddebed7447a12da95902559eac51ea2594f93265e70f2d11da210e33abdafcd846040516108d191906114b8565b60405180910390a3505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161093e919061137e565b602060405180830381865afa15801561095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097f91906118b3565b905080915050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a315750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a67906117e7565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090555050604051806040016040528083815260200182815250600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015590505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c355760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610c5a565b82600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b600080600160008491906101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508391906101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f68dd0f2c9ca18dce1e14e2e3f99123a6292bfde61698d10163545ee09a2bb7bb60405160405180910390a3505050565b6000638943ec0260e01b90509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dad57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610e1657503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b610e1f57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610e5a9291906118e0565b6020604051808303816000875af1158015610e79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9d9190611941565b50505050565b610eab611323565b610eb3611323565b6000600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905060008183610f929190611836565b47610f9d919061186a565b9050600068056bc75e2d6310000082600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154610ff9919061196e565b61100391906119f7565b90506040518060400160405280600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154815260200182600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546110a69190611836565b81525094508495505050505050919050565b6000600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600081836111979190611836565b476111a2919061186a565b9050600068056bc75e2d6310000082600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461121f919061196e565b61122991906119f7565b905080846112379190611836565b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555080826112aa919061186a565b836112b59190611836565b60026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555050505050565b604051806040016040528060008152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006113688261133d565b9050919050565b6113788161135d565b82525050565b6000602082019050611393600083018461136f565b92915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6113c0816113ad565b81146113cb57600080fd5b50565b6000813590506113dd816113b7565b92915050565b6000602082840312156113f9576113f86113a3565b5b6000611407848285016113ce565b91505092915050565b6114198161135d565b811461142457600080fd5b50565b60008135905061143681611410565b92915050565b60008060408385031215611453576114526113a3565b5b600061146185828601611427565b9250506020611472858286016113ce565b9150509250929050565b600060208284031215611492576114916113a3565b5b60006114a084828501611427565b91505092915050565b6114b2816113ad565b82525050565b60006020820190506114cd60008301846114a9565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611526826114dd565b810181811067ffffffffffffffff82111715611545576115446114ee565b5b80604052505050565b6000611558611399565b9050611564828261151d565b919050565b600067ffffffffffffffff821115611584576115836114ee565b5b61158d826114dd565b9050602081019050919050565b82818337600083830152505050565b60006115bc6115b784611569565b61154e565b9050828152602081018484840111156115d8576115d76114d8565b5b6115e384828561159a565b509392505050565b600082601f830112611600576115ff6114d3565b5b81356116108482602086016115a9565b91505092915050565b600080600060608486031215611632576116316113a3565b5b600061164086828701611427565b9350506020611651868287016113ce565b925050604084013567ffffffffffffffff811115611672576116716113a8565b5b61167e868287016115eb565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6116bd81611688565b82525050565b60006020820190506116d860008301846116b4565b92915050565b6000806000606084860312156116f7576116f66113a3565b5b600061170586828701611427565b935050602061171686828701611427565b9250506040611727868287016113ce565b9150509250925092565b61173a816113ad565b82525050565b6040820160008201516117566000850182611731565b5060208201516117696020850182611731565b50505050565b60006040820190506117846000830184611740565b92915050565b600082825260208201905092915050565b7f4f6e6c7920726563697069656e74000000000000000000000000000000000000600082015250565b60006117d1600e8361178a565b91506117dc8261179b565b602082019050919050565b60006020820190508181036000830152611800816117c4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611841826113ad565b915061184c836113ad565b925082820190508082111561186457611863611807565b5b92915050565b6000611875826113ad565b9150611880836113ad565b925082820390508181111561189857611897611807565b5b92915050565b6000815190506118ad816113b7565b92915050565b6000602082840312156118c9576118c86113a3565b5b60006118d78482850161189e565b91505092915050565b60006040820190506118f5600083018561136f565b61190260208301846114a9565b9392505050565b60008115159050919050565b61191e81611909565b811461192957600080fd5b50565b60008151905061193b81611915565b92915050565b600060208284031215611957576119566113a3565b5b60006119658482850161192c565b91505092915050565b6000611979826113ad565b9150611984836113ad565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156119bd576119bc611807565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611a02826113ad565b9150611a0d836113ad565b925082611a1d57611a1c6119c8565b5b82820490509291505056fea26469706673582212201e8b3640b064a1943bfd1168c3556393dc3d343a2ad21854afd1199e85d76c9964736f6c63430008100033

Deployed ByteCode

0x6080604052600436106100895760003560e01c806348eca45c1161005957806348eca45c1461013d5780636c3fc4451461017a5780638943ec02146101a3578063f5537ede146101e0578063fe37f7fe1461020957610090565b8062667f2914610095578063082455ce146100c05780630fb35fc6146100e95780632d5823711461011257610090565b3661009057005b600080fd5b3480156100a157600080fd5b506100aa610246565b6040516100b7919061137e565b60405180910390f35b3480156100cc57600080fd5b506100e760048036038101906100e291906113e3565b61026c565b005b3480156100f557600080fd5b50610110600480360381019061010b919061143c565b610627565b005b34801561011e57600080fd5b506101276108de565b604051610134919061137e565b60405180910390f35b34801561014957600080fd5b50610164600480360381019061015f919061147c565b610902565b60405161017191906114b8565b60405180910390f35b34801561018657600080fd5b506101a1600480360381019061019c919061147c565b61098a565b005b3480156101af57600080fd5b506101ca60048036038101906101c59190611619565b610d40565b6040516101d791906116c3565b60405180910390f35b3480156101ec57600080fd5b50610207600480360381019061020291906116de565b610d53565b005b34801561021557600080fd5b50610230600480360381019061022b919061147c565b610ea3565b60405161023d919061176f565b60405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103135750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610352576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610349906117e7565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050808211156103a657600080fd5b6103ae6110b8565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104815781600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546104709190611836565b828261047c919061186a565b6104fe565b818161048d919061186a565b8260026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546104fd9190611836565b5b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008491905055839190505550503373ffffffffffffffffffffffffffffffffffffffff167f700115a5a47daa46c4a0c7d6d282a2d45aa8aed28137136d59064f090a38a3238360405161061b91906114b8565b60405180910390a25050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106ce5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61070d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610704906117e7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561077657503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61077f57600080fd5b6107876110b8565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050808211156107db57600080fd5b81816107e7919061186a565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610873573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4ddebed7447a12da95902559eac51ea2594f93265e70f2d11da210e33abdafcd846040516108d191906114b8565b60405180910390a3505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161093e919061137e565b602060405180830381865afa15801561095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097f91906118b3565b905080915050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a315750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a67906117e7565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090555050604051806040016040528083815260200182815250600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015590505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c355760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610c5a565b82600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b600080600160008491906101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508391906101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f68dd0f2c9ca18dce1e14e2e3f99123a6292bfde61698d10163545ee09a2bb7bb60405160405180910390a3505050565b6000638943ec0260e01b90509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dad57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610e1657503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b610e1f57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610e5a9291906118e0565b6020604051808303816000875af1158015610e79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9d9190611941565b50505050565b610eab611323565b610eb3611323565b6000600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905060008183610f929190611836565b47610f9d919061186a565b9050600068056bc75e2d6310000082600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154610ff9919061196e565b61100391906119f7565b90506040518060400160405280600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154815260200182600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546110a69190611836565b81525094508495505050505050919050565b6000600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600081836111979190611836565b476111a2919061186a565b9050600068056bc75e2d6310000082600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461121f919061196e565b61122991906119f7565b905080846112379190611836565b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555080826112aa919061186a565b836112b59190611836565b60026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555050505050565b604051806040016040528060008152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006113688261133d565b9050919050565b6113788161135d565b82525050565b6000602082019050611393600083018461136f565b92915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6113c0816113ad565b81146113cb57600080fd5b50565b6000813590506113dd816113b7565b92915050565b6000602082840312156113f9576113f86113a3565b5b6000611407848285016113ce565b91505092915050565b6114198161135d565b811461142457600080fd5b50565b60008135905061143681611410565b92915050565b60008060408385031215611453576114526113a3565b5b600061146185828601611427565b9250506020611472858286016113ce565b9150509250929050565b600060208284031215611492576114916113a3565b5b60006114a084828501611427565b91505092915050565b6114b2816113ad565b82525050565b60006020820190506114cd60008301846114a9565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611526826114dd565b810181811067ffffffffffffffff82111715611545576115446114ee565b5b80604052505050565b6000611558611399565b9050611564828261151d565b919050565b600067ffffffffffffffff821115611584576115836114ee565b5b61158d826114dd565b9050602081019050919050565b82818337600083830152505050565b60006115bc6115b784611569565b61154e565b9050828152602081018484840111156115d8576115d76114d8565b5b6115e384828561159a565b509392505050565b600082601f830112611600576115ff6114d3565b5b81356116108482602086016115a9565b91505092915050565b600080600060608486031215611632576116316113a3565b5b600061164086828701611427565b9350506020611651868287016113ce565b925050604084013567ffffffffffffffff811115611672576116716113a8565b5b61167e868287016115eb565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6116bd81611688565b82525050565b60006020820190506116d860008301846116b4565b92915050565b6000806000606084860312156116f7576116f66113a3565b5b600061170586828701611427565b935050602061171686828701611427565b9250506040611727868287016113ce565b9150509250925092565b61173a816113ad565b82525050565b6040820160008201516117566000850182611731565b5060208201516117696020850182611731565b50505050565b60006040820190506117846000830184611740565b92915050565b600082825260208201905092915050565b7f4f6e6c7920726563697069656e74000000000000000000000000000000000000600082015250565b60006117d1600e8361178a565b91506117dc8261179b565b602082019050919050565b60006020820190508181036000830152611800816117c4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611841826113ad565b915061184c836113ad565b925082820190508082111561186457611863611807565b5b92915050565b6000611875826113ad565b9150611880836113ad565b925082820390508181111561189857611897611807565b5b92915050565b6000815190506118ad816113b7565b92915050565b6000602082840312156118c9576118c86113a3565b5b60006118d78482850161189e565b91505092915050565b60006040820190506118f5600083018561136f565b61190260208301846114a9565b9392505050565b60008115159050919050565b61191e81611909565b811461192957600080fd5b50565b60008151905061193b81611915565b92915050565b600060208284031215611957576119566113a3565b5b60006119658482850161192c565b91505092915050565b6000611979826113ad565b9150611984836113ad565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156119bd576119bc611807565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611a02826113ad565b9150611a0d836113ad565b925082611a1d57611a1c6119c8565b5b82820490509291505056fea26469706673582212201e8b3640b064a1943bfd1168c3556393dc3d343a2ad21854afd1199e85d76c9964736f6c63430008100033