Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- TwoBearsBotsHelp
- Optimization enabled
- false
- Compiler version
- v0.8.16+commit.07a7930e
- EVM Version
- default
- Verified at
- 2024-09-26T15:35:10.064250Z
Contract source code
// All rights reserved. // SPDX-License-Identifier: No License (None) pragma solidity ^0.8.16; interface IContractDeposits { function getTokenMinValue(address _token) external view returns (uint256); function getTokenPriority(address _token) external view returns (uint256); function getTypeAndValue(address _token_in, address _token_out, uint _value, uint _price) external view returns (uint8, uint256); function getWrappedAndPricelimit() external view returns (address, uint256, uint256); } interface IERC20 { function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); } contract TwoBearsBotsHelp { struct Variables { // структура переменных (обходим ошибку глубину стека) uint _min_in; uint _min_out; uint _value2; uint8 _bot_type; uint8 _code_err; } address public constant contractDeposits = 0x820b5c3835B731DdeB1155ac0b37009E37524a53; // Контракт с депозитами function checkTokensOnDex(address _token_in, address _token_out) public view returns (uint8, uint256, uint256) { // проверка залистинных токенов для бота распродажи/закупа // Возвращаемые значения: код_ошибки, минимально_допустимое_количество_входящего_токена, минимально_допустимое_количество_выходящего_токена if(_token_in == _token_out) return (1, 0, 0); // торговые токены одинаковы uint256 min_in = IContractDeposits(contractDeposits).getTokenMinValue(_token_in); // возвращает допустимый минимум для торговли if(min_in == 0) return (2, 0, 0); // Входящий токен не существует на бирже uint256 min_out = IContractDeposits(contractDeposits).getTokenMinValue(_token_out); // возвращает допустимый минимум для торговли if(min_out == 0) return (3, 0, 0); // Выходящий токен не существует на бирже return (0, min_in, min_out); } function checkTokensOnDexType3(address _token_in, address _token_out) public view returns (uint8, uint256, uint256) { // проверка залистинных токенов для сеточного бота // Возвращаемые значения: код_ошибки, нужен_ли_реверс_токенов, минимально_допустимое_количество_токена_с_максимальным_приоритетом if(_token_in == _token_out) return (1, 0, 0); // торговые токены одинаковы uint256 _token_in_priority = IContractDeposits(contractDeposits).getTokenPriority(_token_in); // возвращаем приоритет входящего токена if(_token_in_priority == 0) return (2, 0, 0); // Входящий токен не существует на бирже uint256 _token_out_priority = IContractDeposits(contractDeposits).getTokenPriority(_token_out); // возвращаем приоритет выходящего токена if(_token_out_priority == 0) return (3, 0, 0); // Выходящий токен не существует на бирже uint256 _revers; uint256 _min; if(_token_in_priority < _token_out_priority){ // _revers = 0; _min = IContractDeposits(contractDeposits).getTokenMinValue(_token_out); } else{ _revers = 1; _min = IContractDeposits(contractDeposits).getTokenMinValue(_token_in); } return (0, _revers, _min); } function checkGasOwner(address _owner) public view returns (uint8) { // проверка доступности газа у владельца бота (address _token_native, uint _gas_price, uint _gas_limit) = IContractDeposits(contractDeposits).getWrappedAndPricelimit(); // вернем адрес обернутой нативной монеты, цену газа и максимальный лимит газа uint _value_native = _gas_price * _gas_limit; // количество обернутой нативной монеты uint256 res; res = IERC20(_token_native).allowance(_owner, contractDeposits); if(_value_native > res) return (14); // у контракта депозитов нет доступа на списания обернутой нативной монеты с адреса владельца бота res = IERC20(_token_native).balanceOf(_owner); if(_value_native > res) return (15); // на адресе владельца бота недостаточно обернутой нативной монеты return (0); } function checkApproveAndBalance(address _owner, address _token_in, uint _value_in, uint _value_inc_balance) public view returns (uint8) { // проверка апрува и баланса у владельца бота // функция так же проверяет что у владельца бота есть необходимое количество нативного токена для оплаты работы бота // Проверяем что у владельца есть нативный токен хотя бы для одной перестановки ордеров по схеме бота // _value_inc_balance - на сколько увеличится баланс владельца по данному токену в этой транзакции // Возвращаемые значения: код_ошибки. 0 - если ошибок нет uint256 res; // function getWrappedAndPricelimit() external view returns (address, uint256, uint256); (address _token_native, uint _gas_price, uint _gas_limit) = IContractDeposits(contractDeposits).getWrappedAndPricelimit(); // вернем адрес обернутой нативной монеты, цену газа и максимальный лимит газа uint _value_native = _gas_price * _gas_limit; // количество нативной монеты if(_token_in == _token_native){ // если это ордер на обмен нативного токена, то нужно учесть комиссию за работу бота _value_in += _value_native; } else{ // иначе комиссию за работу бота надо проверить отдельно res = IERC20(_token_native).allowance(_owner, contractDeposits); if(_value_native > res) return (14); // у контракта депозитов нет доступа на списания обернутой нативной монеты с адреса владельца бота res = IERC20(_token_native).balanceOf(_owner); if(_value_native > res) return (15); // на адресе владельца бота недостаточно обернутой нативной монеты } res = IERC20(_token_in).allowance(_owner, contractDeposits); if(_value_in > res) return (11); // у контракта депозитов нет доступа на списания необходимой суммы с адреса владельца бота res = IERC20(_token_in).balanceOf(_owner); res += _value_inc_balance; if(_value_in > res) return (12); // на адресе владельца бота недостаточно средств return (0); } /* Возвращаемые коды ошибок 200 - бот полностью завершил схему 100 - ошибок нет 101 - ошибок нет (но входящий и выходящий токены будут поменяны местами). Данный код используется только для сеточной торговли. После того как токены поменяются местами, статус измениться на 100 1 - торговые токены одинаковы 2 - входящий токен не существует на бирже 3 - выходящий токен не существует на бирже 4 - цена равна нулю 5 - количество входящего или выходящего токена равно нулю 6 - не соответствие минималке (пылевой ордер) 7 - слишком большой шаг, может вызвать переполнение переменной с ценой 8 - ценовой предел ниже стартовой цены 9 - ценовой шаг больше установленного предела (может вызвать переполнение переменной) 10 - ценовой предел выше стартовой цены 11 - у контракта депозитов нет доступа на списания необходимой суммы с адреса владельца бота 12 - на адресе владельца бота недостаточно средств 13 - слишком большое увеличение ставки (приводит к переполнению переменной с количеством токена) 14 - у контракта депозитов нет доступа на списания обернутой нативной монеты с адреса владельца бота 15 - на адресе владельца бота недостаточно обернутой нативной монеты 16 - количество продаваемого токена равно 0 (сеточная торговля) 17 - количество покупаемого токена равно 0 (сеточная торговля) 18 - самый последний ордер в боте закупок не соответствие минималке (пылевой ордер) 19 - ценовой шаг установлен 0 (сеточная торговля) 20 - цена выше верхнего ценового предела (сеточная торговля) 21 - цена ниже нижнего ценового предела (сеточная торговля) 22 - нижний ценовой предел меньше шага (сеточная торговля) 23 - разница между максимальным значением переменной и верхним пределом меньше шага (может вызвать переполнение переменной) 24 - объем токена с максимальным приоритетом ниже минималки (пылевой ордер) в ордере продажи по минимально допустимой цене 25 - объем токена с максимальным приоритетом ниже минималки (пылевой ордер) в ордере покупки по минимально допустимой цене 26 - ордер покупки и ордер продажи не попадают в рабочий диапазон (сеточная торговля). Нужно чтобы хотя бы 1 ордер попадал в рабочий диапазон 27 - у контракта депозитов нет доступа на списания необходимой суммы (токен с макс. приоритетом) с адреса владельца бота 28 - на адресе владельца бота недостаточно средств (в токене с макс. приоритетом) */ function checkCreateBotSellBuy(address _owner, address _token_in, address _token_out, uint _value, uint _value_inc, uint _price, uint _price_step, uint _price_limit) public view returns (uint8, uint8, uint256, uint256) { // проверка создания бота распродажи / закупа // _owner - адрес владельца, который создает бота // _value - объем токена с наименьшим приоритетом // _price - цена в токене с максимальным приоритетом // Возвращаемые значения: код_ошибки, тип_бота, количество_входящего_токена, количество_выходящего_токена if(_price == 0) return (4, 0, 0, 0); // цена должна быть больше 0 if(_value == 0) return (5, 0, 0, 0); // количество токена должно быть больше 0 if((uint(int(-1)) - _value_inc) < _value) return (13, 0, 0, 0); Variables memory variable; (variable._code_err, variable._min_in, variable._min_out) = checkTokensOnDex(_token_in, _token_out); // проверяем торговую пару и возвращаем минималки по токенам if(variable._code_err > 0) return (variable._code_err, 0, 0, 0); // Ошибка торговой пары (variable._bot_type, variable._value2) = IContractDeposits(contractDeposits).getTypeAndValue(_token_in, _token_out, _value, _price); if(variable._value2 == 0) return (5, 0, 0, 0); // количество второго токена должно быть больше 0 // проверяем что количество токена в ордере соответствуем минимально-допустимому значению if(variable._bot_type == 1){ // если это бот распродажи // _value - это объем _token_in, variable._value2 - это объем _token_out if(variable._value2 < variable._min_out) return (6, 0, 0, 0); // проверяем ценовой шаг и предел (цена растет) if((uint(int(-1)) - _price_limit) < _price_step) return (7, 0, 0, 0); if(_price_limit < _price) return (8, 0, 0, 0); } else{ // если это бот закупки (_value, variable._value2) = (variable._value2, _value); // _value - это объем _token_in, variable._value2 - это объем _token_out if(_value < variable._min_in) return (6, 0, 0, 0); // проверяем ценовой шаг и предел (цена падает) if(_price_limit < _price_step) return (9, 0, 0, 0); if(_price < _price_limit) return (10, 0, 0, 0); // проверим что последний ордер в схеме закупки соответствует допустимому минимуму uint _frame = (_price - _price_limit) / _price_step; // количество ордеров что будет выполнено в схеме uint _val_temp = _value_inc * _frame + variable._value2; // найдем объем последнего ордера в схеме //uint _price_temp = _price - (_price_step * _frame); // найдем цену последнего ордера в схеме (, _val_temp) = IContractDeposits(contractDeposits).getTypeAndValue(_token_in, _token_out, _val_temp, (_price - (_price_step * _frame))); if(_val_temp < variable._min_in) return (18, 0, 0, 0); } // проверяем что пользователь дал разрешение контракту депозитов и имеет достаточный баланс на своем кошельке variable._code_err = checkApproveAndBalance(_owner, _token_in, _value, 0); if(variable._code_err > 0) return (variable._code_err, 0, 0, 0); // Нет апрува или баланса return (100, variable._bot_type, _value, variable._value2); } function checkCreateBotNetTrade(address _owner, address _token_in, address _token_out, uint _value_sell, uint _value_buy, uint _price, uint _price_step, uint _price_up_limit, uint _price_down_limit) public view returns (uint8, uint256, uint256) { // создание бота сеточной торговли // _owner - адрес владельца, который создает бота // _value_sell и _value_buy - объем токена с наименьшим приоритетом // _price - цена в токене с максимальным приоритетом // _token_in - будет установлен токен с минимальным приоритетом (сперва идет ордер продажи, а затем ордер покупки) // Возвращаемые значения: код_ошибки, получаем токена с макс. приоритером при продаже, отдаем токен с макс. приоритером при покупке if(_value_sell == 0) return (16, 0, 0); // количество продаваемого токена должно быть больше 0 if(_value_buy == 0) return (17, 0, 0); // количество покупаемого токена должно быть больше 0 uint[] memory _variable = new uint[](5); /* индексы массива _variable: 0 - получаем токена с макс. приоритером при продаже 1 - отдаем токен с макс. приоритером при покупке 2 - если = 1, то поменять входящий и выходящий токены местами, в противном случае 0 3 - минимально допустимое количество токена с максимальным приоритетом 4 - код ошибки (uint8) */ // проверяем торговую пару. Возвращаем нужно ли сделать реверс токенов, а так же минимальное количество токена с максимальным приоритетом (_variable[4], _variable[2], _variable[3]) = checkTokensOnDexType3(_token_in, _token_out); if(_variable[4] > 0) return (uint8(_variable[4]), 0, 0); // Ошибка торговой пары if(_variable[2] == 1){ (_token_in, _token_out) = (_token_out, _token_in); // меняем входящие токены местами. Теперь в _token_in находится токен с минимальным приоритетом } // проверяем цену, шаг и ценовые пределы if(_price_step == 0) return (19, 0, 0); // ценовой шаг должен быть больше 0 if(_price > _price_up_limit) return (20, 0, 0); // цена должна быть меньше, либо равна верхнему ценовому пределу if(_price < _price_down_limit) return (21, 0, 0); // цена должна быть выше, либо равна нижнему ценовому пределу if(_price_down_limit < _price_step) return (22, 0, 0); // нижний ценовой предел должен быть больше или равен шагу if((uint(int(-1)) - _price_up_limit) < _price_step) return (23, 0, 0); // разница между максимальным значением переменной и верхним ценовым пределом должна быть больше или равена шагу // проверяем объемы ордеров при самой низкой цене (они не должны быть пылью) _variable[4] = getValueWithMaxPriority(_token_in, _token_out, _value_sell, (_price_down_limit + _price_step)); // вернем объем самого нижнего ордера продажи if(_variable[4] < _variable[3]) return (24, 0, 0); // объем токена с максимальным приоритетом ниже минималки (пылевой ордер) _variable[4] = getValueWithMaxPriority(_token_out, _token_in, _value_buy, _price_down_limit); // вернем объем самого нижнего ордера покупки if(_variable[4] < _variable[3]) return (25, 0, 0); // объем токена с максимальным приоритетом ниже минималки (пылевой ордер) // проверяем что пользователь дал разрешение контракту депозитов и имеет достаточный баланс на своем кошельке if((_price + _price_step) <= _price_up_limit){ // ордер продажи будет выставлен при создании бота _variable[0] = getValueWithMaxPriority(_token_in, _token_out, _value_sell, (_price + _price_step)); // получаем при продаже // проверяем объем токена, который пользователь отдает _variable[4] = checkApproveAndBalance(_owner, _token_in, _value_sell, 0); if(_variable[4] > 0) return (uint8(_variable[4]), 0, 0); // Нет апрува или баланса } if((_price - _price_step) >= _price_down_limit){ // ордер покупки будет выставлен при создании бота _variable[1] = getValueWithMaxPriority(_token_out, _token_in, _value_buy, (_price - _price_step)); // отдаем при покупке // проверяем объем токена, который пользователь отдает _variable[4] = checkApproveAndBalance(_owner, _token_out, _variable[1], 0); if(_variable[4] > 0){ // Нет апрува или баланса if(_variable[4] == 11) _variable[4] = 27; // Если нет апрува, помечаем что это у токена с макс. приоритетом if(_variable[4] == 12) _variable[4] = 28; // Если нет баланса, помечаем что это у токена с макс. приоритетом return (uint8(_variable[4]), 0, 0); // Нет апрува или баланса } } // Если ни один ордер не попадает в рабочий диапазон, то функцию завершаем с ошибкой if((_variable[0] == 0) && ((_variable[1] == 0))) return (26, 0, 0); // Ни один ордер не попадает в рабочий диапазон if(_variable[2] == 1){ // Если входящий и выходящий токен нужно поменять местами return (101, _variable[0], _variable[1]); } else{ return (100, _variable[0], _variable[1]); } } function checkSchemeBotSellBuy(address _owner, address _token_in, address _token_out, uint _value, uint _price, uint _price_limit) public view returns (uint8, uint256, uint256) { // Проверка схемы бота распродажи / закупа // Возвращаемые значения: код_ошибки, количество_входящего_токена, количество_выходящего_токена uint256 _value_max_priority; // объем токена с максимальным приоритетом uint8 _order_type; // тип ордера uint8 _code_err; _code_err = checkGasOwner(_owner); // проверка доступности газа у владельца бота if(_code_err > 0) return (_code_err, 0, 0); // Нет апрува или баланса (_order_type, _value_max_priority) = IContractDeposits(contractDeposits).getTypeAndValue(_token_in, _token_out, _value, _price); if(_order_type == 1){ // продажа if(_price > _price_limit) return (200, 0, 0); // цена вышла за установленный предел. Бот полностью завершил схему } else{ // покупка if(_price < _price_limit) return (200, 0, 0); // цена вышла за установленный предел. Бот полностью завершил схему (_value, _value_max_priority) = (_value_max_priority, _value); } // _value - количество входящего токена. _value_max_priority - количество выходящего токена // у владельца есть газ, схема бота еще активна. // проверяем что пользователь дал разрешение контракту депозитов и имеет достаточный баланс на своем кошельке _code_err = checkApproveAndBalance(_owner, _token_in, _value, 0); if(_code_err > 0) return (_code_err, 0, 0); // Нет апрува или баланса return (100, _value, _value_max_priority); } function checkSchemeBotNetTrade(address _owner, address _token_in, address _token_out, uint[] memory _param, uint[] memory _order_data, uint[] memory _order_data_2) public view returns (uint8, uint[] memory) { // Проверка схемы бота сеточной торговли // _param - [количество_продажи, количество_покупки, цена, шаг, верхний_предел_цены, нижний_предел_цены] // _order_data - данные отработавщего ордера - [статус, тип_ордера, осталось_отдать, осталось_получить, отдал, получил, комиссия] // _order_data_2 - данные второго ордера из схемы - [статус, тип_ордера, осталось_отдать, осталось_получить, отдал, получил, комиссия] uint8 _code_err; uint[] memory _result = new uint[](4); // [отдаем, получаем, отдаем, получаем] - первые 2 параметра это ордер продажи, вторые 2 параметра это ордер покупки uint _value_sell; // сколько по факту продавать в токене с наименьшим приоритетом uint _value_buy; // сколько по факту покупать в токене с наименьшим приоритетом uint _add_balance_token_in; // сколько поступит на баланс _token_in uint _add_balance_token_out; // сколько поступит на баланс _token_out if(_order_data[1] == 1){ // если тип исполненого ордера продажа _value_sell = _param[0]; // продавать полный объем _value_buy = _order_data_2[3]; // покупать надо необмененый остаток второго ордера if(_value_buy == 0) _value_buy = _param[1]; // если противоположный ордер со статусом 7 или 0, тогда следующая покупка в полном объеме _add_balance_token_out = _order_data[5] + _order_data_2[2]; // количество выходящего получаемого токена _add_balance_token_in = _order_data_2[5]; // количество входящего получаемого токена } else{ // иначе это была покупка _value_buy = _param[1]; // покупать полный объем _value_sell = _order_data_2[2]; // продавать надо необмененый остаток второго ордера if(_value_sell == 0) _value_sell = _param[0]; // если противоположный ордер со статусом 7 или 0, тогда следующая продажа в полном объеме _add_balance_token_in = _order_data[5] + _order_data_2[2]; // количество выходящего получаемого токена _add_balance_token_out = _order_data_2[5]; // количество входящего получаемого токена } // проверяем что пользователь дал разрешение контракту депозитов и имеет достаточный баланс на своем кошельке if((_param[2] + _param[3]) <= _param[4]){ // ордер продажи будет выставлен _result[0] = _value_sell; _result[1] = getValueWithMaxPriority(_token_in, _token_out, _value_sell, (_param[2] + _param[3])); // получаем при продаже // проверяем объем токена, который пользователь отдает _code_err = checkApproveAndBalance(_owner, _token_in, _value_sell, _add_balance_token_in); if(_code_err > 0) return (_code_err, _result); // Нет апрува или баланса } if((_param[2] - _param[3]) >= _param[5]){ // ордер покупки будет выставлен _result[2] = getValueWithMaxPriority(_token_out, _token_in, _value_buy, (_param[2] - _param[3])); // отдаем при покупке _result[3] = _value_buy; // проверяем объем токена, который пользователь отдает _code_err = checkApproveAndBalance(_owner, _token_out, _result[2], _add_balance_token_out); if(_code_err > 0){ // Нет апрува или баланса if(_code_err == 11) _code_err = 27; // Если нет апрува, помечаем что это у токена с макс. приоритетом if(_code_err == 12) _code_err = 28; // Если нет баланса, помечаем что это у токена с макс. приоритетом return (_code_err, _result); // Нет апрува или баланса } } return (0, _result); // все проверки успешно пройдены } function getValueWithMaxPriority(address _token_in, address _token_out, uint _value, uint _price) public view returns (uint) { // функция возвращает объем токена с максимальным приоритетом // _value - объем токена с минимальным приоритетом uint _value_max_priority; // объем токена с максимальным приоритетом (, _value_max_priority) = IContractDeposits(contractDeposits).getTypeAndValue(_token_in, _token_out, _value, _price); return (_value_max_priority); } }
Contract ABI
[{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"checkApproveAndBalance","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_token_in","internalType":"address"},{"type":"uint256","name":"_value_in","internalType":"uint256"},{"type":"uint256","name":"_value_inc_balance","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"checkCreateBotNetTrade","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value_sell","internalType":"uint256"},{"type":"uint256","name":"_value_buy","internalType":"uint256"},{"type":"uint256","name":"_price","internalType":"uint256"},{"type":"uint256","name":"_price_step","internalType":"uint256"},{"type":"uint256","name":"_price_up_limit","internalType":"uint256"},{"type":"uint256","name":"_price_down_limit","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"checkCreateBotSellBuy","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"uint256","name":"_value_inc","internalType":"uint256"},{"type":"uint256","name":"_price","internalType":"uint256"},{"type":"uint256","name":"_price_step","internalType":"uint256"},{"type":"uint256","name":"_price_limit","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"checkGasOwner","inputs":[{"type":"address","name":"_owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"checkSchemeBotNetTrade","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256[]","name":"_param","internalType":"uint256[]"},{"type":"uint256[]","name":"_order_data","internalType":"uint256[]"},{"type":"uint256[]","name":"_order_data_2","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"checkSchemeBotSellBuy","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"uint256","name":"_price","internalType":"uint256"},{"type":"uint256","name":"_price_limit","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"checkTokensOnDex","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"checkTokensOnDexType3","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"contractDeposits","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getValueWithMaxPriority","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"uint256","name":"_price","internalType":"uint256"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50612900806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063acbfa21d11610066578063acbfa21d14610185578063ad148af4146101b8578063b1055734146101e8578063de14efc414610219578063fe908a9c1461024b5761009e565b80630c40aaf3146100a3578063127e1197146100d557806320903720146100f35780637d25728a1461012357806390b5ef7714610153575b600080fd5b6100bd60048036038101906100b89190611e80565b61027d565b6040516100cc93929190611ef5565b60405180910390f35b6100dd610567565b6040516100ea9190611f3b565b60405180910390f35b61010d60048036038101906101089190611f56565b61057f565b60405161011a9190611f83565b60405180910390f35b61013d60048036038101906101389190611fca565b610769565b60405161014a9190612031565b60405180910390f35b61016d6004803603810190610168919061204c565b610811565b60405161017c93929190611ef5565b60405180910390f35b61019f600480360381019061019a9190612116565b610e78565b6040516101af94939291906121cc565b60405180910390f35b6101d260048036038101906101cd9190611fca565b6112ab565b6040516101df9190611f83565b60405180910390f35b61020260048036038101906101fd919061236a565b611627565b604051610210929190612509565b60405180910390f35b610233600480360381019061022e9190611e80565b611ac1565b60405161024293929190611ef5565b60405180910390f35b61026560048036038101906102609190612539565b611c74565b60405161027493929190611ef5565b60405180910390f35b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036102c5576001600080925092509250610560565b600073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103149190611f3b565b602060405180830381865afa158015610331573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035591906125db565b90506000810361037057600260008093509350935050610560565b600073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103bf9190611f3b565b602060405180830381865afa1580156103dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040091906125db565b90506000810361041c5760036000809450945094505050610560565b600080828410156104bc5773820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff1663f41a710d896040518263ffffffff1660e01b81526004016104749190611f3b565b602060405180830381865afa158015610491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b591906125db565b9050610551565b6001915073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff1663f41a710d8a6040518263ffffffff1660e01b815260040161050d9190611f3b565b602060405180830381865afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e91906125db565b90505b60008282965096509650505050505b9250925092565b73820b5c3835b731ddeb1155ac0b37009e37524a5381565b60008060008073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610608919061261d565b9250925092506000818361061c919061269f565b905060008473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8873820b5c3835b731ddeb1155ac0b37009e37524a536040518363ffffffff1660e01b815260040161066f9291906126f9565b602060405180830381865afa15801561068c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b091906125db565b9050808211156106c857600e95505050505050610764565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b81526004016107019190611f3b565b602060405180830381865afa15801561071e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074291906125db565b90508082111561075a57600f95505050505050610764565b6000955050505050505b919050565b60008073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff166365593d7b878787876040518563ffffffff1660e01b81526004016107bf9493929190612722565b6040805180830381865afa1580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff9190612793565b90508091505080915050949350505050565b600080600080890361082d576010600080925092509250610e69565b60008803610845576011600080925092509250610e69565b6000600567ffffffffffffffff81111561086257610861612227565b5b6040519080825280602002602001820160405280156108905781602001602082028036833780820191505090505b50905061089d8c8c61027d565b8260ff169250836004815181106108b7576108b66127d3565b5b60200260200101846002815181106108d2576108d16127d3565b5b60200260200101856003815181106108ed576108ec6127d3565b5b60200260200101838152508381525083815250505050600081600481518110610919576109186127d3565b5b60200260200101511115610952578060048151811061093b5761093a6127d3565b5b602002602001015160008093509350935050610e69565b600181600281518110610968576109676127d3565b5b602002602001015103610980578a8c809c50819d5050505b6000870361099957601360008093509350935050610e69565b858811156109b257601460008093509350935050610e69565b848810156109cb57601560008093509350935050610e69565b868510156109e457601660008093509350935050610e69565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610a119190612802565b1015610a2857601760008093509350935050610e69565b610a3f8c8c8c8a89610a3a9190612836565b610769565b81600481518110610a5357610a526127d3565b5b60200260200101818152505080600381518110610a7357610a726127d3565b5b602002602001015181600481518110610a8f57610a8e6127d3565b5b60200260200101511015610aae57601860008093509350935050610e69565b610aba8b8d8b88610769565b81600481518110610ace57610acd6127d3565b5b60200260200101818152505080600381518110610aee57610aed6127d3565b5b602002602001015181600481518110610b0a57610b096127d3565b5b60200260200101511015610b2957601960008093509350935050610e69565b858789610b369190612836565b11610bf257610b528c8c8c8a8c610b4d9190612836565b610769565b81600081518110610b6657610b656127d3565b5b602002602001018181525050610b7f8d8d8c60006112ab565b60ff1681600481518110610b9657610b956127d3565b5b602002602001018181525050600081600481518110610bb857610bb76127d3565b5b60200260200101511115610bf15780600481518110610bda57610bd96127d3565b5b602002602001015160008093509350935050610e69565b5b848789610bff9190612802565b10610d6257610c1b8b8d8b8a8c610c169190612802565b610769565b81600181518110610c2f57610c2e6127d3565b5b602002602001018181525050610c638d8c83600181518110610c5457610c536127d3565b5b602002602001015160006112ab565b60ff1681600481518110610c7a57610c796127d3565b5b602002602001018181525050600081600481518110610c9c57610c9b6127d3565b5b60200260200101511115610d6157600b81600481518110610cc057610cbf6127d3565b5b602002602001015103610cf057601b81600481518110610ce357610ce26127d3565b5b6020026020010181815250505b600c81600481518110610d0657610d056127d3565b5b602002602001015103610d3657601c81600481518110610d2957610d286127d3565b5b6020026020010181815250505b80600481518110610d4a57610d496127d3565b5b602002602001015160008093509350935050610e69565b5b600081600081518110610d7857610d776127d3565b5b6020026020010151148015610da85750600081600181518110610d9e57610d9d6127d3565b5b6020026020010151145b15610dbe57601a60008093509350935050610e69565b600181600281518110610dd457610dd36127d3565b5b602002602001015103610e2757606581600081518110610df757610df66127d3565b5b602002602001015182600181518110610e1357610e126127d3565b5b602002602001015193509350935050610e69565b606481600081518110610e3d57610e3c6127d3565b5b602002602001015182600181518110610e5957610e586127d3565b5b6020026020010151935093509350505b99509950999650505050505050565b60008060008060008703610e9a5760046000806000935093509350935061129c565b60008903610eb65760056000806000935093509350935061129c565b88887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610ee39190612802565b1015610efd57600d6000806000935093509350935061129c565b610f05611dd9565b610f0f8c8c611ac1565b83608001846000018560200183815250838152508360ff1660ff168152505050506000816080015160ff161115610f58578060800151600080600094509450945094505061129c565b73820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff166365593d7b8d8d8d8c6040518563ffffffff1660e01b8152600401610fab9493929190612722565b6040805180830381865afa158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610feb9190612793565b8260600183604001828152508260ff1660ff1681525050506000816040015103611024576005600080600094509450945094505061129c565b6001816060015160ff16036110c257806020015181604001511015611058576006600080600094509450945094505061129c565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6110859190612802565b10156110a0576007600080600094509450945094505061129c565b878610156110bd576008600080600094509450945094505061129c565b61123f565b80604001518a8260400181815250819b50505080600001518a10156110f6576006600080600094509450945094505061129c565b86861015611113576009600080600094509450945094505061129c565b8588101561113057600a600080600094509450945094505061129c565b600087878a61113f9190612802565b6111499190612899565b905060008260400151828c61115e919061269f565b6111689190612836565b905073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff166365593d7b8f8f84868e6111a9919061269f565b8f6111b49190612802565b6040518563ffffffff1660e01b81526004016111d39493929190612722565b6040805180830381865afa1580156111ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112139190612793565b905080915050826000015181101561123c5760126000806000965096509650965050505061129c565b50505b61124c8d8d8c60006112ab565b816080019060ff16908160ff16815250506000816080015160ff161115611285578060800151600080600094509450945094505061129c565b606481606001518b83604001519450945094509450505b98509850985098945050505050565b600080600080600073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa158015611312573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611336919061261d565b9250925092506000818361134a919061269f565b90508373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff160361139257808861138b9190612836565b97506114cd565b8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b73820b5c3835b731ddeb1155ac0b37009e37524a536040518363ffffffff1660e01b81526004016113e19291906126f9565b602060405180830381865afa1580156113fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142291906125db565b94508481111561143a57600e9550505050505061161f565b8373ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016114739190611f3b565b602060405180830381865afa158015611490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b491906125db565b9450848111156114cc57600f9550505050505061161f565b5b8873ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b73820b5c3835b731ddeb1155ac0b37009e37524a536040518363ffffffff1660e01b815260040161151c9291906126f9565b602060405180830381865afa158015611539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155d91906125db565b94508488111561157557600b9550505050505061161f565b8873ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016115ae9190611f3b565b602060405180830381865afa1580156115cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ef91906125db565b945086856115fd9190612836565b94508488111561161557600c9550505050505061161f565b6000955050505050505b949350505050565b60006060600080600467ffffffffffffffff81111561164957611648612227565b5b6040519080825280602002602001820160405280156116775781602001602082028036833780820191505090505b50905060008060008060018a600181518110611696576116956127d3565b5b60200260200101510361176d578a6000815181106116b7576116b66127d3565b5b60200260200101519350886003815181106116d5576116d46127d3565b5b6020026020010151925060008303611706578a6001815181106116fb576116fa6127d3565b5b602002602001015192505b8860028151811061171a576117196127d3565b5b60200260200101518a600581518110611736576117356127d3565b5b60200260200101516117489190612836565b90508860058151811061175e5761175d6127d3565b5b60200260200101519150611833565b8a600181518110611781576117806127d3565b5b602002602001015192508860028151811061179f5761179e6127d3565b5b60200260200101519350600084036117d0578a6000815181106117c5576117c46127d3565b5b602002602001015193505b886002815181106117e4576117e36127d3565b5b60200260200101518a600581518110611800576117ff6127d3565b5b60200260200101516118129190612836565b915088600581518110611828576118276127d3565b5b602002602001015190505b8a600481518110611847576118466127d3565b5b60200260200101518b600381518110611863576118626127d3565b5b60200260200101518c60028151811061187f5761187e6127d3565b5b60200260200101516118919190612836565b116119505783856000815181106118ab576118aa6127d3565b5b6020026020010181815250506119048d8d868e6003815181106118d1576118d06127d3565b5b60200260200101518f6002815181106118ed576118ec6127d3565b5b60200260200101516118ff9190612836565b610769565b85600181518110611918576119176127d3565b5b6020026020010181815250506119308e8e86856112ab565b955060008660ff16111561194f57858597509750505050505050611ab6565b5b8a600581518110611964576119636127d3565b5b60200260200101518b6003815181106119805761197f6127d3565b5b60200260200101518c60028151811061199c5761199b6127d3565b5b60200260200101516119ae9190612802565b10611aa857611a008c8e858e6003815181106119cd576119cc6127d3565b5b60200260200101518f6002815181106119e9576119e86127d3565b5b60200260200101516119fb9190612802565b610769565b85600281518110611a1457611a136127d3565b5b6020026020010181815250508285600381518110611a3557611a346127d3565b5b602002602001018181525050611a688e8d87600281518110611a5a57611a596127d3565b5b6020026020010151846112ab565b955060008660ff161115611aa757600b8660ff1603611a8657601b95505b600c8660ff1603611a9657601c95505b858597509750505050505050611ab6565b5b600085975097505050505050505b965096945050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611b09576001600080925092509250611c6d565b600073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611b589190611f3b565b602060405180830381865afa158015611b75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9991906125db565b905060008103611bb457600260008093509350935050611c6d565b600073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611c039190611f3b565b602060405180830381865afa158015611c20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4491906125db565b905060008103611c605760036000809450945094505050611c6d565b6000828294509450945050505b9250925092565b600080600080600080611c868c61057f565b905060008160ff161115611ca65780600080955095509550505050611dcd565b73820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff166365593d7b8c8c8c8c6040518563ffffffff1660e01b8152600401611cf99493929190612722565b6040805180830381865afa158015611d15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d399190612793565b809450819350505060018260ff1603611d6c5786881115611d675760c8600080955095509550505050611dcd565b611d92565b86881015611d875760c8600080955095509550505050611dcd565b8289809450819a5050505b611d9f8c8c8b60006112ab565b905060008160ff161115611dbf5780600080955095509550505050611dcd565b606489849550955095505050505b96509650969350505050565b6040518060a00160405280600081526020016000815260200160008152602001600060ff168152602001600060ff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e4d82611e22565b9050919050565b611e5d81611e42565b8114611e6857600080fd5b50565b600081359050611e7a81611e54565b92915050565b60008060408385031215611e9757611e96611e18565b5b6000611ea585828601611e6b565b9250506020611eb685828601611e6b565b9150509250929050565b600060ff82169050919050565b611ed681611ec0565b82525050565b6000819050919050565b611eef81611edc565b82525050565b6000606082019050611f0a6000830186611ecd565b611f176020830185611ee6565b611f246040830184611ee6565b949350505050565b611f3581611e42565b82525050565b6000602082019050611f506000830184611f2c565b92915050565b600060208284031215611f6c57611f6b611e18565b5b6000611f7a84828501611e6b565b91505092915050565b6000602082019050611f986000830184611ecd565b92915050565b611fa781611edc565b8114611fb257600080fd5b50565b600081359050611fc481611f9e565b92915050565b60008060008060808587031215611fe457611fe3611e18565b5b6000611ff287828801611e6b565b945050602061200387828801611e6b565b935050604061201487828801611fb5565b925050606061202587828801611fb5565b91505092959194509250565b60006020820190506120466000830184611ee6565b92915050565b60008060008060008060008060006101208a8c03121561206f5761206e611e18565b5b600061207d8c828d01611e6b565b995050602061208e8c828d01611e6b565b985050604061209f8c828d01611e6b565b97505060606120b08c828d01611fb5565b96505060806120c18c828d01611fb5565b95505060a06120d28c828d01611fb5565b94505060c06120e38c828d01611fb5565b93505060e06120f48c828d01611fb5565b9250506101006121068c828d01611fb5565b9150509295985092959850929598565b600080600080600080600080610100898b03121561213757612136611e18565b5b60006121458b828c01611e6b565b98505060206121568b828c01611e6b565b97505060406121678b828c01611e6b565b96505060606121788b828c01611fb5565b95505060806121898b828c01611fb5565b94505060a061219a8b828c01611fb5565b93505060c06121ab8b828c01611fb5565b92505060e06121bc8b828c01611fb5565b9150509295985092959890939650565b60006080820190506121e16000830187611ecd565b6121ee6020830186611ecd565b6121fb6040830185611ee6565b6122086060830184611ee6565b95945050505050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61225f82612216565b810181811067ffffffffffffffff8211171561227e5761227d612227565b5b80604052505050565b6000612291611e0e565b905061229d8282612256565b919050565b600067ffffffffffffffff8211156122bd576122bc612227565b5b602082029050602081019050919050565b600080fd5b60006122e66122e1846122a2565b612287565b90508083825260208201905060208402830185811115612309576123086122ce565b5b835b81811015612332578061231e8882611fb5565b84526020840193505060208101905061230b565b5050509392505050565b600082601f83011261235157612350612211565b5b81356123618482602086016122d3565b91505092915050565b60008060008060008060c0878903121561238757612386611e18565b5b600061239589828a01611e6b565b96505060206123a689828a01611e6b565b95505060406123b789828a01611e6b565b945050606087013567ffffffffffffffff8111156123d8576123d7611e1d565b5b6123e489828a0161233c565b935050608087013567ffffffffffffffff81111561240557612404611e1d565b5b61241189828a0161233c565b92505060a087013567ffffffffffffffff81111561243257612431611e1d565b5b61243e89828a0161233c565b9150509295509295509295565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61248081611edc565b82525050565b60006124928383612477565b60208301905092915050565b6000602082019050919050565b60006124b68261244b565b6124c08185612456565b93506124cb83612467565b8060005b838110156124fc5781516124e38882612486565b97506124ee8361249e565b9250506001810190506124cf565b5085935050505092915050565b600060408201905061251e6000830185611ecd565b818103602083015261253081846124ab565b90509392505050565b60008060008060008060c0878903121561255657612555611e18565b5b600061256489828a01611e6b565b965050602061257589828a01611e6b565b955050604061258689828a01611e6b565b945050606061259789828a01611fb5565b93505060806125a889828a01611fb5565b92505060a06125b989828a01611fb5565b9150509295509295509295565b6000815190506125d581611f9e565b92915050565b6000602082840312156125f1576125f0611e18565b5b60006125ff848285016125c6565b91505092915050565b60008151905061261781611e54565b92915050565b60008060006060848603121561263657612635611e18565b5b600061264486828701612608565b9350506020612655868287016125c6565b9250506040612666868287016125c6565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126aa82611edc565b91506126b583611edc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156126ee576126ed612670565b5b828202905092915050565b600060408201905061270e6000830185611f2c565b61271b6020830184611f2c565b9392505050565b60006080820190506127376000830187611f2c565b6127446020830186611f2c565b6127516040830185611ee6565b61275e6060830184611ee6565b95945050505050565b61277081611ec0565b811461277b57600080fd5b50565b60008151905061278d81612767565b92915050565b600080604083850312156127aa576127a9611e18565b5b60006127b88582860161277e565b92505060206127c9858286016125c6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061280d82611edc565b915061281883611edc565b92508282039050818111156128305761282f612670565b5b92915050565b600061284182611edc565b915061284c83611edc565b925082820190508082111561286457612863612670565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006128a482611edc565b91506128af83611edc565b9250826128bf576128be61286a565b5b82820490509291505056fea26469706673582212200cf320eac57965b7acacc0eefde09e1e45054e7a882f4b32d64b656cac5b166a64736f6c63430008100033
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063acbfa21d11610066578063acbfa21d14610185578063ad148af4146101b8578063b1055734146101e8578063de14efc414610219578063fe908a9c1461024b5761009e565b80630c40aaf3146100a3578063127e1197146100d557806320903720146100f35780637d25728a1461012357806390b5ef7714610153575b600080fd5b6100bd60048036038101906100b89190611e80565b61027d565b6040516100cc93929190611ef5565b60405180910390f35b6100dd610567565b6040516100ea9190611f3b565b60405180910390f35b61010d60048036038101906101089190611f56565b61057f565b60405161011a9190611f83565b60405180910390f35b61013d60048036038101906101389190611fca565b610769565b60405161014a9190612031565b60405180910390f35b61016d6004803603810190610168919061204c565b610811565b60405161017c93929190611ef5565b60405180910390f35b61019f600480360381019061019a9190612116565b610e78565b6040516101af94939291906121cc565b60405180910390f35b6101d260048036038101906101cd9190611fca565b6112ab565b6040516101df9190611f83565b60405180910390f35b61020260048036038101906101fd919061236a565b611627565b604051610210929190612509565b60405180910390f35b610233600480360381019061022e9190611e80565b611ac1565b60405161024293929190611ef5565b60405180910390f35b61026560048036038101906102609190612539565b611c74565b60405161027493929190611ef5565b60405180910390f35b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036102c5576001600080925092509250610560565b600073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103149190611f3b565b602060405180830381865afa158015610331573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035591906125db565b90506000810361037057600260008093509350935050610560565b600073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103bf9190611f3b565b602060405180830381865afa1580156103dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040091906125db565b90506000810361041c5760036000809450945094505050610560565b600080828410156104bc5773820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff1663f41a710d896040518263ffffffff1660e01b81526004016104749190611f3b565b602060405180830381865afa158015610491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b591906125db565b9050610551565b6001915073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff1663f41a710d8a6040518263ffffffff1660e01b815260040161050d9190611f3b565b602060405180830381865afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e91906125db565b90505b60008282965096509650505050505b9250925092565b73820b5c3835b731ddeb1155ac0b37009e37524a5381565b60008060008073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610608919061261d565b9250925092506000818361061c919061269f565b905060008473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8873820b5c3835b731ddeb1155ac0b37009e37524a536040518363ffffffff1660e01b815260040161066f9291906126f9565b602060405180830381865afa15801561068c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b091906125db565b9050808211156106c857600e95505050505050610764565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b81526004016107019190611f3b565b602060405180830381865afa15801561071e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074291906125db565b90508082111561075a57600f95505050505050610764565b6000955050505050505b919050565b60008073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff166365593d7b878787876040518563ffffffff1660e01b81526004016107bf9493929190612722565b6040805180830381865afa1580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff9190612793565b90508091505080915050949350505050565b600080600080890361082d576010600080925092509250610e69565b60008803610845576011600080925092509250610e69565b6000600567ffffffffffffffff81111561086257610861612227565b5b6040519080825280602002602001820160405280156108905781602001602082028036833780820191505090505b50905061089d8c8c61027d565b8260ff169250836004815181106108b7576108b66127d3565b5b60200260200101846002815181106108d2576108d16127d3565b5b60200260200101856003815181106108ed576108ec6127d3565b5b60200260200101838152508381525083815250505050600081600481518110610919576109186127d3565b5b60200260200101511115610952578060048151811061093b5761093a6127d3565b5b602002602001015160008093509350935050610e69565b600181600281518110610968576109676127d3565b5b602002602001015103610980578a8c809c50819d5050505b6000870361099957601360008093509350935050610e69565b858811156109b257601460008093509350935050610e69565b848810156109cb57601560008093509350935050610e69565b868510156109e457601660008093509350935050610e69565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610a119190612802565b1015610a2857601760008093509350935050610e69565b610a3f8c8c8c8a89610a3a9190612836565b610769565b81600481518110610a5357610a526127d3565b5b60200260200101818152505080600381518110610a7357610a726127d3565b5b602002602001015181600481518110610a8f57610a8e6127d3565b5b60200260200101511015610aae57601860008093509350935050610e69565b610aba8b8d8b88610769565b81600481518110610ace57610acd6127d3565b5b60200260200101818152505080600381518110610aee57610aed6127d3565b5b602002602001015181600481518110610b0a57610b096127d3565b5b60200260200101511015610b2957601960008093509350935050610e69565b858789610b369190612836565b11610bf257610b528c8c8c8a8c610b4d9190612836565b610769565b81600081518110610b6657610b656127d3565b5b602002602001018181525050610b7f8d8d8c60006112ab565b60ff1681600481518110610b9657610b956127d3565b5b602002602001018181525050600081600481518110610bb857610bb76127d3565b5b60200260200101511115610bf15780600481518110610bda57610bd96127d3565b5b602002602001015160008093509350935050610e69565b5b848789610bff9190612802565b10610d6257610c1b8b8d8b8a8c610c169190612802565b610769565b81600181518110610c2f57610c2e6127d3565b5b602002602001018181525050610c638d8c83600181518110610c5457610c536127d3565b5b602002602001015160006112ab565b60ff1681600481518110610c7a57610c796127d3565b5b602002602001018181525050600081600481518110610c9c57610c9b6127d3565b5b60200260200101511115610d6157600b81600481518110610cc057610cbf6127d3565b5b602002602001015103610cf057601b81600481518110610ce357610ce26127d3565b5b6020026020010181815250505b600c81600481518110610d0657610d056127d3565b5b602002602001015103610d3657601c81600481518110610d2957610d286127d3565b5b6020026020010181815250505b80600481518110610d4a57610d496127d3565b5b602002602001015160008093509350935050610e69565b5b600081600081518110610d7857610d776127d3565b5b6020026020010151148015610da85750600081600181518110610d9e57610d9d6127d3565b5b6020026020010151145b15610dbe57601a60008093509350935050610e69565b600181600281518110610dd457610dd36127d3565b5b602002602001015103610e2757606581600081518110610df757610df66127d3565b5b602002602001015182600181518110610e1357610e126127d3565b5b602002602001015193509350935050610e69565b606481600081518110610e3d57610e3c6127d3565b5b602002602001015182600181518110610e5957610e586127d3565b5b6020026020010151935093509350505b99509950999650505050505050565b60008060008060008703610e9a5760046000806000935093509350935061129c565b60008903610eb65760056000806000935093509350935061129c565b88887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610ee39190612802565b1015610efd57600d6000806000935093509350935061129c565b610f05611dd9565b610f0f8c8c611ac1565b83608001846000018560200183815250838152508360ff1660ff168152505050506000816080015160ff161115610f58578060800151600080600094509450945094505061129c565b73820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff166365593d7b8d8d8d8c6040518563ffffffff1660e01b8152600401610fab9493929190612722565b6040805180830381865afa158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610feb9190612793565b8260600183604001828152508260ff1660ff1681525050506000816040015103611024576005600080600094509450945094505061129c565b6001816060015160ff16036110c257806020015181604001511015611058576006600080600094509450945094505061129c565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6110859190612802565b10156110a0576007600080600094509450945094505061129c565b878610156110bd576008600080600094509450945094505061129c565b61123f565b80604001518a8260400181815250819b50505080600001518a10156110f6576006600080600094509450945094505061129c565b86861015611113576009600080600094509450945094505061129c565b8588101561113057600a600080600094509450945094505061129c565b600087878a61113f9190612802565b6111499190612899565b905060008260400151828c61115e919061269f565b6111689190612836565b905073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff166365593d7b8f8f84868e6111a9919061269f565b8f6111b49190612802565b6040518563ffffffff1660e01b81526004016111d39493929190612722565b6040805180830381865afa1580156111ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112139190612793565b905080915050826000015181101561123c5760126000806000965096509650965050505061129c565b50505b61124c8d8d8c60006112ab565b816080019060ff16908160ff16815250506000816080015160ff161115611285578060800151600080600094509450945094505061129c565b606481606001518b83604001519450945094509450505b98509850985098945050505050565b600080600080600073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa158015611312573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611336919061261d565b9250925092506000818361134a919061269f565b90508373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff160361139257808861138b9190612836565b97506114cd565b8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b73820b5c3835b731ddeb1155ac0b37009e37524a536040518363ffffffff1660e01b81526004016113e19291906126f9565b602060405180830381865afa1580156113fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142291906125db565b94508481111561143a57600e9550505050505061161f565b8373ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016114739190611f3b565b602060405180830381865afa158015611490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b491906125db565b9450848111156114cc57600f9550505050505061161f565b5b8873ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b73820b5c3835b731ddeb1155ac0b37009e37524a536040518363ffffffff1660e01b815260040161151c9291906126f9565b602060405180830381865afa158015611539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155d91906125db565b94508488111561157557600b9550505050505061161f565b8873ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016115ae9190611f3b565b602060405180830381865afa1580156115cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ef91906125db565b945086856115fd9190612836565b94508488111561161557600c9550505050505061161f565b6000955050505050505b949350505050565b60006060600080600467ffffffffffffffff81111561164957611648612227565b5b6040519080825280602002602001820160405280156116775781602001602082028036833780820191505090505b50905060008060008060018a600181518110611696576116956127d3565b5b60200260200101510361176d578a6000815181106116b7576116b66127d3565b5b60200260200101519350886003815181106116d5576116d46127d3565b5b6020026020010151925060008303611706578a6001815181106116fb576116fa6127d3565b5b602002602001015192505b8860028151811061171a576117196127d3565b5b60200260200101518a600581518110611736576117356127d3565b5b60200260200101516117489190612836565b90508860058151811061175e5761175d6127d3565b5b60200260200101519150611833565b8a600181518110611781576117806127d3565b5b602002602001015192508860028151811061179f5761179e6127d3565b5b60200260200101519350600084036117d0578a6000815181106117c5576117c46127d3565b5b602002602001015193505b886002815181106117e4576117e36127d3565b5b60200260200101518a600581518110611800576117ff6127d3565b5b60200260200101516118129190612836565b915088600581518110611828576118276127d3565b5b602002602001015190505b8a600481518110611847576118466127d3565b5b60200260200101518b600381518110611863576118626127d3565b5b60200260200101518c60028151811061187f5761187e6127d3565b5b60200260200101516118919190612836565b116119505783856000815181106118ab576118aa6127d3565b5b6020026020010181815250506119048d8d868e6003815181106118d1576118d06127d3565b5b60200260200101518f6002815181106118ed576118ec6127d3565b5b60200260200101516118ff9190612836565b610769565b85600181518110611918576119176127d3565b5b6020026020010181815250506119308e8e86856112ab565b955060008660ff16111561194f57858597509750505050505050611ab6565b5b8a600581518110611964576119636127d3565b5b60200260200101518b6003815181106119805761197f6127d3565b5b60200260200101518c60028151811061199c5761199b6127d3565b5b60200260200101516119ae9190612802565b10611aa857611a008c8e858e6003815181106119cd576119cc6127d3565b5b60200260200101518f6002815181106119e9576119e86127d3565b5b60200260200101516119fb9190612802565b610769565b85600281518110611a1457611a136127d3565b5b6020026020010181815250508285600381518110611a3557611a346127d3565b5b602002602001018181525050611a688e8d87600281518110611a5a57611a596127d3565b5b6020026020010151846112ab565b955060008660ff161115611aa757600b8660ff1603611a8657601b95505b600c8660ff1603611a9657601c95505b858597509750505050505050611ab6565b5b600085975097505050505050505b965096945050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611b09576001600080925092509250611c6d565b600073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611b589190611f3b565b602060405180830381865afa158015611b75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9991906125db565b905060008103611bb457600260008093509350935050611c6d565b600073820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611c039190611f3b565b602060405180830381865afa158015611c20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4491906125db565b905060008103611c605760036000809450945094505050611c6d565b6000828294509450945050505b9250925092565b600080600080600080611c868c61057f565b905060008160ff161115611ca65780600080955095509550505050611dcd565b73820b5c3835b731ddeb1155ac0b37009e37524a5373ffffffffffffffffffffffffffffffffffffffff166365593d7b8c8c8c8c6040518563ffffffff1660e01b8152600401611cf99493929190612722565b6040805180830381865afa158015611d15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d399190612793565b809450819350505060018260ff1603611d6c5786881115611d675760c8600080955095509550505050611dcd565b611d92565b86881015611d875760c8600080955095509550505050611dcd565b8289809450819a5050505b611d9f8c8c8b60006112ab565b905060008160ff161115611dbf5780600080955095509550505050611dcd565b606489849550955095505050505b96509650969350505050565b6040518060a00160405280600081526020016000815260200160008152602001600060ff168152602001600060ff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e4d82611e22565b9050919050565b611e5d81611e42565b8114611e6857600080fd5b50565b600081359050611e7a81611e54565b92915050565b60008060408385031215611e9757611e96611e18565b5b6000611ea585828601611e6b565b9250506020611eb685828601611e6b565b9150509250929050565b600060ff82169050919050565b611ed681611ec0565b82525050565b6000819050919050565b611eef81611edc565b82525050565b6000606082019050611f0a6000830186611ecd565b611f176020830185611ee6565b611f246040830184611ee6565b949350505050565b611f3581611e42565b82525050565b6000602082019050611f506000830184611f2c565b92915050565b600060208284031215611f6c57611f6b611e18565b5b6000611f7a84828501611e6b565b91505092915050565b6000602082019050611f986000830184611ecd565b92915050565b611fa781611edc565b8114611fb257600080fd5b50565b600081359050611fc481611f9e565b92915050565b60008060008060808587031215611fe457611fe3611e18565b5b6000611ff287828801611e6b565b945050602061200387828801611e6b565b935050604061201487828801611fb5565b925050606061202587828801611fb5565b91505092959194509250565b60006020820190506120466000830184611ee6565b92915050565b60008060008060008060008060006101208a8c03121561206f5761206e611e18565b5b600061207d8c828d01611e6b565b995050602061208e8c828d01611e6b565b985050604061209f8c828d01611e6b565b97505060606120b08c828d01611fb5565b96505060806120c18c828d01611fb5565b95505060a06120d28c828d01611fb5565b94505060c06120e38c828d01611fb5565b93505060e06120f48c828d01611fb5565b9250506101006121068c828d01611fb5565b9150509295985092959850929598565b600080600080600080600080610100898b03121561213757612136611e18565b5b60006121458b828c01611e6b565b98505060206121568b828c01611e6b565b97505060406121678b828c01611e6b565b96505060606121788b828c01611fb5565b95505060806121898b828c01611fb5565b94505060a061219a8b828c01611fb5565b93505060c06121ab8b828c01611fb5565b92505060e06121bc8b828c01611fb5565b9150509295985092959890939650565b60006080820190506121e16000830187611ecd565b6121ee6020830186611ecd565b6121fb6040830185611ee6565b6122086060830184611ee6565b95945050505050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61225f82612216565b810181811067ffffffffffffffff8211171561227e5761227d612227565b5b80604052505050565b6000612291611e0e565b905061229d8282612256565b919050565b600067ffffffffffffffff8211156122bd576122bc612227565b5b602082029050602081019050919050565b600080fd5b60006122e66122e1846122a2565b612287565b90508083825260208201905060208402830185811115612309576123086122ce565b5b835b81811015612332578061231e8882611fb5565b84526020840193505060208101905061230b565b5050509392505050565b600082601f83011261235157612350612211565b5b81356123618482602086016122d3565b91505092915050565b60008060008060008060c0878903121561238757612386611e18565b5b600061239589828a01611e6b565b96505060206123a689828a01611e6b565b95505060406123b789828a01611e6b565b945050606087013567ffffffffffffffff8111156123d8576123d7611e1d565b5b6123e489828a0161233c565b935050608087013567ffffffffffffffff81111561240557612404611e1d565b5b61241189828a0161233c565b92505060a087013567ffffffffffffffff81111561243257612431611e1d565b5b61243e89828a0161233c565b9150509295509295509295565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61248081611edc565b82525050565b60006124928383612477565b60208301905092915050565b6000602082019050919050565b60006124b68261244b565b6124c08185612456565b93506124cb83612467565b8060005b838110156124fc5781516124e38882612486565b97506124ee8361249e565b9250506001810190506124cf565b5085935050505092915050565b600060408201905061251e6000830185611ecd565b818103602083015261253081846124ab565b90509392505050565b60008060008060008060c0878903121561255657612555611e18565b5b600061256489828a01611e6b565b965050602061257589828a01611e6b565b955050604061258689828a01611e6b565b945050606061259789828a01611fb5565b93505060806125a889828a01611fb5565b92505060a06125b989828a01611fb5565b9150509295509295509295565b6000815190506125d581611f9e565b92915050565b6000602082840312156125f1576125f0611e18565b5b60006125ff848285016125c6565b91505092915050565b60008151905061261781611e54565b92915050565b60008060006060848603121561263657612635611e18565b5b600061264486828701612608565b9350506020612655868287016125c6565b9250506040612666868287016125c6565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126aa82611edc565b91506126b583611edc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156126ee576126ed612670565b5b828202905092915050565b600060408201905061270e6000830185611f2c565b61271b6020830184611f2c565b9392505050565b60006080820190506127376000830187611f2c565b6127446020830186611f2c565b6127516040830185611ee6565b61275e6060830184611ee6565b95945050505050565b61277081611ec0565b811461277b57600080fd5b50565b60008151905061278d81612767565b92915050565b600080604083850312156127aa576127a9611e18565b5b60006127b88582860161277e565b92505060206127c9858286016125c6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061280d82611edc565b915061281883611edc565b92508282039050818111156128305761282f612670565b5b92915050565b600061284182611edc565b915061284c83611edc565b925082820190508082111561286457612863612670565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006128a482611edc565b91506128af83611edc565b9250826128bf576128be61286a565b5b82820490509291505056fea26469706673582212200cf320eac57965b7acacc0eefde09e1e45054e7a882f4b32d64b656cac5b166a64736f6c63430008100033