Transactions
Token Transfers
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
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
0x608060405273ebe894814554c8382ea6a24ccddf1527407a24f66000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073810059e1406dedafd1bdca4e0137cba306c0ce36600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156100b957600080fd5b506802b5e3af16b1880000600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506802b5e3af16b188000060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550611d64806101ac6000396000f3fe6080604052600436106100895760003560e01c806348eca45c1161005957806348eca45c1461013d5780636c3fc4451461017c5780638943ec02146101a5578063f5537ede146101e2578063fe37f7fe1461020b57610090565b8062667f2914610095578063082455ce146100c05780630fb35fc6146100e95780632d5823711461011257610090565b3661009057005b600080fd5b3480156100a157600080fd5b506100aa610248565b6040516100b79190611479565b60405180910390f35b3480156100cc57600080fd5b506100e760048036038101906100e291906114de565b61026e565b005b3480156100f557600080fd5b50610110600480360381019061010b9190611537565b610629565b005b34801561011e57600080fd5b506101276108e0565b6040516101349190611479565b60405180910390f35b34801561014957600080fd5b50610164600480360381019061015f9190611577565b610904565b6040516101739392919061165f565b60405180910390f35b34801561018857600080fd5b506101a3600480360381019061019e9190611577565b610a85565b005b3480156101b157600080fd5b506101cc60048036038101906101c791906117d2565b610e3b565b6040516101d9919061187c565b60405180910390f35b3480156101ee57600080fd5b5061020960048036038101906102049190611897565b610e4e565b005b34801561021757600080fd5b50610232600480360381019061022d9190611577565b610f9e565b60405161023f9190611928565b60405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103155750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034b9061198f565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050808211156103a857600080fd5b6103b06111b3565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104835781600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461047291906119de565b828261047e9190611a12565b610500565b818161048f9190611a12565b8260026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546104ff91906119de565b5b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008491905055839190505550503373ffffffffffffffffffffffffffffffffffffffff167f700115a5a47daa46c4a0c7d6d282a2d45aa8aed28137136d59064f090a38a3238360405161061d9190611a46565b60405180910390a25050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106d05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61070f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107069061198f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561077857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61078157600080fd5b6107896111b3565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050808211156107dd57600080fd5b81816107e99190611a12565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610875573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4ddebed7447a12da95902559eac51ea2594f93265e70f2d11da210e33abdafcd846040516108d39190611a46565b60405180910390a3505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080606060008473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109449190611479565b602060405180830381865afa158015610961573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109859190611a76565b905060008573ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f89190611acf565b905060008673ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a709190611b9d565b90508282829550955095505050509193909250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b2c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b629061198f565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090555050604051806040016040528083815260200182815250600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015590505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d305760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610d55565b82600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b600080600160008491906101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508391906101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f68dd0f2c9ca18dce1e14e2e3f99123a6292bfde61698d10163545ee09a2bb7bb60405160405180910390a3505050565b6000638943ec0260e01b90509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ea857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610f1157503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b610f1a57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610f55929190611be6565b6020604051808303816000875af1158015610f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f989190611c47565b50505050565b610fa661141e565b610fae61141e565b6000600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000818361108d91906119de565b476110989190611a12565b9050600068056bc75e2d6310000082600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546110f49190611c74565b6110fe9190611cfd565b90506040518060400160405280600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154815260200182600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546111a191906119de565b81525094508495505050505050919050565b6000600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000818361129291906119de565b4761129d9190611a12565b9050600068056bc75e2d6310000082600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461131a9190611c74565b6113249190611cfd565b9050808461133291906119de565b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555080826113a59190611a12565b836113b091906119de565b60026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555050505050565b604051806040016040528060008152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061146382611438565b9050919050565b61147381611458565b82525050565b600060208201905061148e600083018461146a565b92915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6114bb816114a8565b81146114c657600080fd5b50565b6000813590506114d8816114b2565b92915050565b6000602082840312156114f4576114f361149e565b5b6000611502848285016114c9565b91505092915050565b61151481611458565b811461151f57600080fd5b50565b6000813590506115318161150b565b92915050565b6000806040838503121561154e5761154d61149e565b5b600061155c85828601611522565b925050602061156d858286016114c9565b9150509250929050565b60006020828403121561158d5761158c61149e565b5b600061159b84828501611522565b91505092915050565b6115ad816114a8565b82525050565b600060ff82169050919050565b6115c9816115b3565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156116095780820151818401526020810190506115ee565b60008484015250505050565b6000601f19601f8301169050919050565b6000611631826115cf565b61163b81856115da565b935061164b8185602086016115eb565b61165481611615565b840191505092915050565b600060608201905061167460008301866115a4565b61168160208301856115c0565b81810360408301526116938184611626565b9050949350505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6116df82611615565b810181811067ffffffffffffffff821117156116fe576116fd6116a7565b5b80604052505050565b6000611711611494565b905061171d82826116d6565b919050565b600067ffffffffffffffff82111561173d5761173c6116a7565b5b61174682611615565b9050602081019050919050565b82818337600083830152505050565b600061177561177084611722565b611707565b905082815260208101848484011115611791576117906116a2565b5b61179c848285611753565b509392505050565b600082601f8301126117b9576117b861169d565b5b81356117c9848260208601611762565b91505092915050565b6000806000606084860312156117eb576117ea61149e565b5b60006117f986828701611522565b935050602061180a868287016114c9565b925050604084013567ffffffffffffffff81111561182b5761182a6114a3565b5b611837868287016117a4565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61187681611841565b82525050565b6000602082019050611891600083018461186d565b92915050565b6000806000606084860312156118b0576118af61149e565b5b60006118be86828701611522565b93505060206118cf86828701611522565b92505060406118e0868287016114c9565b9150509250925092565b6118f3816114a8565b82525050565b60408201600082015161190f60008501826118ea565b50602082015161192260208501826118ea565b50505050565b600060408201905061193d60008301846118f9565b92915050565b7f4f6e6c7920726563697069656e74000000000000000000000000000000000000600082015250565b6000611979600e836115da565b915061198482611943565b602082019050919050565b600060208201905081810360008301526119a88161196c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006119e9826114a8565b91506119f4836114a8565b9250828201905080821115611a0c57611a0b6119af565b5b92915050565b6000611a1d826114a8565b9150611a28836114a8565b9250828203905081811115611a4057611a3f6119af565b5b92915050565b6000602082019050611a5b60008301846115a4565b92915050565b600081519050611a70816114b2565b92915050565b600060208284031215611a8c57611a8b61149e565b5b6000611a9a84828501611a61565b91505092915050565b611aac816115b3565b8114611ab757600080fd5b50565b600081519050611ac981611aa3565b92915050565b600060208284031215611ae557611ae461149e565b5b6000611af384828501611aba565b91505092915050565b600067ffffffffffffffff821115611b1757611b166116a7565b5b611b2082611615565b9050602081019050919050565b6000611b40611b3b84611afc565b611707565b905082815260208101848484011115611b5c57611b5b6116a2565b5b611b678482856115eb565b509392505050565b600082601f830112611b8457611b8361169d565b5b8151611b94848260208601611b2d565b91505092915050565b600060208284031215611bb357611bb261149e565b5b600082015167ffffffffffffffff811115611bd157611bd06114a3565b5b611bdd84828501611b6f565b91505092915050565b6000604082019050611bfb600083018561146a565b611c0860208301846115a4565b9392505050565b60008115159050919050565b611c2481611c0f565b8114611c2f57600080fd5b50565b600081519050611c4181611c1b565b92915050565b600060208284031215611c5d57611c5c61149e565b5b6000611c6b84828501611c32565b91505092915050565b6000611c7f826114a8565b9150611c8a836114a8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611cc357611cc26119af565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611d08826114a8565b9150611d13836114a8565b925082611d2357611d22611cce565b5b82820490509291505056fea26469706673582212202c6851d3cd23abf70098f1e5fc87239703f5098d1163d8d03e2185264cea3ac064736f6c63430008100033
Deployed ByteCode
0x6080604052600436106100895760003560e01c806348eca45c1161005957806348eca45c1461013d5780636c3fc4451461017c5780638943ec02146101a5578063f5537ede146101e2578063fe37f7fe1461020b57610090565b8062667f2914610095578063082455ce146100c05780630fb35fc6146100e95780632d5823711461011257610090565b3661009057005b600080fd5b3480156100a157600080fd5b506100aa610248565b6040516100b79190611479565b60405180910390f35b3480156100cc57600080fd5b506100e760048036038101906100e291906114de565b61026e565b005b3480156100f557600080fd5b50610110600480360381019061010b9190611537565b610629565b005b34801561011e57600080fd5b506101276108e0565b6040516101349190611479565b60405180910390f35b34801561014957600080fd5b50610164600480360381019061015f9190611577565b610904565b6040516101739392919061165f565b60405180910390f35b34801561018857600080fd5b506101a3600480360381019061019e9190611577565b610a85565b005b3480156101b157600080fd5b506101cc60048036038101906101c791906117d2565b610e3b565b6040516101d9919061187c565b60405180910390f35b3480156101ee57600080fd5b5061020960048036038101906102049190611897565b610e4e565b005b34801561021757600080fd5b50610232600480360381019061022d9190611577565b610f9e565b60405161023f9190611928565b60405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103155750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034b9061198f565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050808211156103a857600080fd5b6103b06111b3565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104835781600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461047291906119de565b828261047e9190611a12565b610500565b818161048f9190611a12565b8260026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546104ff91906119de565b5b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008491905055839190505550503373ffffffffffffffffffffffffffffffffffffffff167f700115a5a47daa46c4a0c7d6d282a2d45aa8aed28137136d59064f090a38a3238360405161061d9190611a46565b60405180910390a25050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106d05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61070f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107069061198f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561077857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61078157600080fd5b6107896111b3565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050808211156107dd57600080fd5b81816107e99190611a12565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610875573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4ddebed7447a12da95902559eac51ea2594f93265e70f2d11da210e33abdafcd846040516108d39190611a46565b60405180910390a3505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080606060008473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109449190611479565b602060405180830381865afa158015610961573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109859190611a76565b905060008573ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f89190611acf565b905060008673ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a709190611b9d565b90508282829550955095505050509193909250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b2c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b629061198f565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090555050604051806040016040528083815260200182815250600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015590505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d305760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610d55565b82600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b600080600160008491906101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508391906101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f68dd0f2c9ca18dce1e14e2e3f99123a6292bfde61698d10163545ee09a2bb7bb60405160405180910390a3505050565b6000638943ec0260e01b90509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ea857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610f1157503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b610f1a57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610f55929190611be6565b6020604051808303816000875af1158015610f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f989190611c47565b50505050565b610fa661141e565b610fae61141e565b6000600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000818361108d91906119de565b476110989190611a12565b9050600068056bc75e2d6310000082600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546110f49190611c74565b6110fe9190611cfd565b90506040518060400160405280600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154815260200182600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546111a191906119de565b81525094508495505050505050919050565b6000600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600060026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000818361129291906119de565b4761129d9190611a12565b9050600068056bc75e2d6310000082600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461131a9190611c74565b6113249190611cfd565b9050808461133291906119de565b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555080826113a59190611a12565b836113b091906119de565b60026000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555050505050565b604051806040016040528060008152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061146382611438565b9050919050565b61147381611458565b82525050565b600060208201905061148e600083018461146a565b92915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6114bb816114a8565b81146114c657600080fd5b50565b6000813590506114d8816114b2565b92915050565b6000602082840312156114f4576114f361149e565b5b6000611502848285016114c9565b91505092915050565b61151481611458565b811461151f57600080fd5b50565b6000813590506115318161150b565b92915050565b6000806040838503121561154e5761154d61149e565b5b600061155c85828601611522565b925050602061156d858286016114c9565b9150509250929050565b60006020828403121561158d5761158c61149e565b5b600061159b84828501611522565b91505092915050565b6115ad816114a8565b82525050565b600060ff82169050919050565b6115c9816115b3565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156116095780820151818401526020810190506115ee565b60008484015250505050565b6000601f19601f8301169050919050565b6000611631826115cf565b61163b81856115da565b935061164b8185602086016115eb565b61165481611615565b840191505092915050565b600060608201905061167460008301866115a4565b61168160208301856115c0565b81810360408301526116938184611626565b9050949350505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6116df82611615565b810181811067ffffffffffffffff821117156116fe576116fd6116a7565b5b80604052505050565b6000611711611494565b905061171d82826116d6565b919050565b600067ffffffffffffffff82111561173d5761173c6116a7565b5b61174682611615565b9050602081019050919050565b82818337600083830152505050565b600061177561177084611722565b611707565b905082815260208101848484011115611791576117906116a2565b5b61179c848285611753565b509392505050565b600082601f8301126117b9576117b861169d565b5b81356117c9848260208601611762565b91505092915050565b6000806000606084860312156117eb576117ea61149e565b5b60006117f986828701611522565b935050602061180a868287016114c9565b925050604084013567ffffffffffffffff81111561182b5761182a6114a3565b5b611837868287016117a4565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61187681611841565b82525050565b6000602082019050611891600083018461186d565b92915050565b6000806000606084860312156118b0576118af61149e565b5b60006118be86828701611522565b93505060206118cf86828701611522565b92505060406118e0868287016114c9565b9150509250925092565b6118f3816114a8565b82525050565b60408201600082015161190f60008501826118ea565b50602082015161192260208501826118ea565b50505050565b600060408201905061193d60008301846118f9565b92915050565b7f4f6e6c7920726563697069656e74000000000000000000000000000000000000600082015250565b6000611979600e836115da565b915061198482611943565b602082019050919050565b600060208201905081810360008301526119a88161196c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006119e9826114a8565b91506119f4836114a8565b9250828201905080821115611a0c57611a0b6119af565b5b92915050565b6000611a1d826114a8565b9150611a28836114a8565b9250828203905081811115611a4057611a3f6119af565b5b92915050565b6000602082019050611a5b60008301846115a4565b92915050565b600081519050611a70816114b2565b92915050565b600060208284031215611a8c57611a8b61149e565b5b6000611a9a84828501611a61565b91505092915050565b611aac816115b3565b8114611ab757600080fd5b50565b600081519050611ac981611aa3565b92915050565b600060208284031215611ae557611ae461149e565b5b6000611af384828501611aba565b91505092915050565b600067ffffffffffffffff821115611b1757611b166116a7565b5b611b2082611615565b9050602081019050919050565b6000611b40611b3b84611afc565b611707565b905082815260208101848484011115611b5c57611b5b6116a2565b5b611b678482856115eb565b509392505050565b600082601f830112611b8457611b8361169d565b5b8151611b94848260208601611b2d565b91505092915050565b600060208284031215611bb357611bb261149e565b5b600082015167ffffffffffffffff811115611bd157611bd06114a3565b5b611bdd84828501611b6f565b91505092915050565b6000604082019050611bfb600083018561146a565b611c0860208301846115a4565b9392505050565b60008115159050919050565b611c2481611c0f565b8114611c2f57600080fd5b50565b600081519050611c4181611c1b565b92915050565b600060208284031215611c5d57611c5c61149e565b5b6000611c6b84828501611c32565b91505092915050565b6000611c7f826114a8565b9150611c8a836114a8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611cc357611cc26119af565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611d08826114a8565b9150611d13836114a8565b925082611d2357611d22611cce565b5b82820490509291505056fea26469706673582212202c6851d3cd23abf70098f1e5fc87239703f5098d1163d8d03e2185264cea3ac064736f6c63430008100033