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:11.026910Z
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 = 0x01C81c93f38F42497b4ceBfA23eeb03f7ccFA8C7; // Контракт с депозитами
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 ордер попадал в рабочий диапазон
*/
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) 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) 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
0x608060405234801561001057600080fd5b50612854806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063acbfa21d11610066578063acbfa21d14610185578063ad148af4146101b8578063b1055734146101e8578063de14efc414610219578063fe908a9c1461024b5761009e565b80630c40aaf3146100a3578063127e1197146100d557806320903720146100f35780637d25728a1461012357806390b5ef7714610153575b600080fd5b6100bd60048036038101906100b89190611dd4565b61027d565b6040516100cc93929190611e49565b60405180910390f35b6100dd610567565b6040516100ea9190611e8f565b60405180910390f35b61010d60048036038101906101089190611eaa565b61057f565b60405161011a9190611ed7565b60405180910390f35b61013d60048036038101906101389190611f1e565b610769565b60405161014a9190611f85565b60405180910390f35b61016d60048036038101906101689190611fa0565b610811565b60405161017c93929190611e49565b60405180910390f35b61019f600480360381019061019a919061206a565b610dec565b6040516101af9493929190612120565b60405180910390f35b6101d260048036038101906101cd9190611f1e565b61121f565b6040516101df9190611ed7565b60405180910390f35b61020260048036038101906101fd91906122be565b61159b565b60405161021092919061245d565b60405180910390f35b610233600480360381019061022e9190611dd4565b611a15565b60405161024293929190611e49565b60405180910390f35b6102656004803603810190610260919061248d565b611bc8565b60405161027493929190611e49565b60405180910390f35b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036102c5576001600080925092509250610560565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103149190611e8f565b602060405180830381865afa158015610331573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610355919061252f565b90506000810361037057600260008093509350935050610560565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103bf9190611e8f565b602060405180830381865afa1580156103dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610400919061252f565b90506000810361041c5760036000809450945094505050610560565b600080828410156104bc577301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d896040518263ffffffff1660e01b81526004016104749190611e8f565b602060405180830381865afa158015610491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b5919061252f565b9050610551565b600191507301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d8a6040518263ffffffff1660e01b815260040161050d9190611e8f565b602060405180830381865afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e919061252f565b90505b60008282965096509650505050505b9250925092565b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c781565b6000806000807301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106089190612571565b9250925092506000818361061c91906125f3565b905060008473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e887301c81c93f38f42497b4cebfa23eeb03f7ccfa8c76040518363ffffffff1660e01b815260040161066f92919061264d565b602060405180830381865afa15801561068c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b0919061252f565b9050808211156106c857600e95505050505050610764565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b81526004016107019190611e8f565b602060405180830381865afa15801561071e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610742919061252f565b90508082111561075a57600f95505050505050610764565b6000955050505050505b919050565b6000807301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b878787876040518563ffffffff1660e01b81526004016107bf9493929190612676565b6040805180830381865afa1580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff91906126e7565b90508091505080915050949350505050565b600080600080890361082d576010600080925092509250610ddd565b60008803610845576011600080925092509250610ddd565b6000600567ffffffffffffffff8111156108625761086161217b565b5b6040519080825280602002602001820160405280156108905781602001602082028036833780820191505090505b50905061089d8c8c61027d565b8260ff169250836004815181106108b7576108b6612727565b5b60200260200101846002815181106108d2576108d1612727565b5b60200260200101856003815181106108ed576108ec612727565b5b6020026020010183815250838152508381525050505060008160048151811061091957610918612727565b5b60200260200101511115610952578060048151811061093b5761093a612727565b5b602002602001015160008093509350935050610ddd565b60018160028151811061096857610967612727565b5b602002602001015103610980578a8c809c50819d5050505b6000870361099957601360008093509350935050610ddd565b858811156109b257601460008093509350935050610ddd565b848810156109cb57601560008093509350935050610ddd565b868510156109e457601660008093509350935050610ddd565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610a119190612756565b1015610a2857601760008093509350935050610ddd565b610a3f8c8c8c8a89610a3a919061278a565b610769565b81600481518110610a5357610a52612727565b5b60200260200101818152505080600381518110610a7357610a72612727565b5b602002602001015181600481518110610a8f57610a8e612727565b5b60200260200101511015610aae57601860008093509350935050610ddd565b610aba8b8d8b88610769565b81600481518110610ace57610acd612727565b5b60200260200101818152505080600381518110610aee57610aed612727565b5b602002602001015181600481518110610b0a57610b09612727565b5b60200260200101511015610b2957601960008093509350935050610ddd565b858789610b36919061278a565b11610bf257610b528c8c8c8a8c610b4d919061278a565b610769565b81600081518110610b6657610b65612727565b5b602002602001018181525050610b7f8d8d8c600061121f565b60ff1681600481518110610b9657610b95612727565b5b602002602001018181525050600081600481518110610bb857610bb7612727565b5b60200260200101511115610bf15780600481518110610bda57610bd9612727565b5b602002602001015160008093509350935050610ddd565b5b848789610bff9190612756565b10610cd657610c1b8b8d8b8a8c610c169190612756565b610769565b81600181518110610c2f57610c2e612727565b5b602002602001018181525050610c638d8c83600181518110610c5457610c53612727565b5b6020026020010151600061121f565b60ff1681600481518110610c7a57610c79612727565b5b602002602001018181525050600081600481518110610c9c57610c9b612727565b5b60200260200101511115610cd55780600481518110610cbe57610cbd612727565b5b602002602001015160008093509350935050610ddd565b5b600081600081518110610cec57610ceb612727565b5b6020026020010151148015610d1c5750600081600181518110610d1257610d11612727565b5b6020026020010151145b15610d3257601a60008093509350935050610ddd565b600181600281518110610d4857610d47612727565b5b602002602001015103610d9b57606581600081518110610d6b57610d6a612727565b5b602002602001015182600181518110610d8757610d86612727565b5b602002602001015193509350935050610ddd565b606481600081518110610db157610db0612727565b5b602002602001015182600181518110610dcd57610dcc612727565b5b6020026020010151935093509350505b99509950999650505050505050565b60008060008060008703610e0e57600460008060009350935093509350611210565b60008903610e2a57600560008060009350935093509350611210565b88887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610e579190612756565b1015610e7157600d60008060009350935093509350611210565b610e79611d2d565b610e838c8c611a15565b83608001846000018560200183815250838152508360ff1660ff168152505050506000816080015160ff161115610ecc5780608001516000806000945094509450945050611210565b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b8d8d8d8c6040518563ffffffff1660e01b8152600401610f1f9493929190612676565b6040805180830381865afa158015610f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5f91906126e7565b8260600183604001828152508260ff1660ff1681525050506000816040015103610f985760056000806000945094509450945050611210565b6001816060015160ff160361103657806020015181604001511015610fcc5760066000806000945094509450945050611210565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610ff99190612756565b10156110145760076000806000945094509450945050611210565b878610156110315760086000806000945094509450945050611210565b6111b3565b80604001518a8260400181815250819b50505080600001518a101561106a5760066000806000945094509450945050611210565b868610156110875760096000806000945094509450945050611210565b858810156110a457600a6000806000945094509450945050611210565b600087878a6110b39190612756565b6110bd91906127ed565b905060008260400151828c6110d291906125f3565b6110dc919061278a565b90507301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b8f8f84868e61111d91906125f3565b8f6111289190612756565b6040518563ffffffff1660e01b81526004016111479493929190612676565b6040805180830381865afa158015611163573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118791906126e7565b90508091505082600001518110156111b057601260008060009650965096509650505050611210565b50505b6111c08d8d8c600061121f565b816080019060ff16908160ff16815250506000816080015160ff1611156111f95780608001516000806000945094509450945050611210565b606481606001518b83604001519450945094509450505b98509850985098945050505050565b60008060008060007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190612571565b925092509250600081836112be91906125f3565b90508373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16036113065780886112ff919061278a565b9750611441565b8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c76040518363ffffffff1660e01b815260040161135592919061264d565b602060405180830381865afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611396919061252f565b9450848111156113ae57600e95505050505050611593565b8373ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016113e79190611e8f565b602060405180830381865afa158015611404573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611428919061252f565b94508481111561144057600f95505050505050611593565b5b8873ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c76040518363ffffffff1660e01b815260040161149092919061264d565b602060405180830381865afa1580156114ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d1919061252f565b9450848811156114e957600b95505050505050611593565b8873ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016115229190611e8f565b602060405180830381865afa15801561153f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611563919061252f565b94508685611571919061278a565b94508488111561158957600c95505050505050611593565b6000955050505050505b949350505050565b60006060600080600467ffffffffffffffff8111156115bd576115bc61217b565b5b6040519080825280602002602001820160405280156115eb5781602001602082028036833780820191505090505b50905060008060008060018a60018151811061160a57611609612727565b5b6020026020010151036116e1578a60008151811061162b5761162a612727565b5b602002602001015193508860038151811061164957611648612727565b5b602002602001015192506000830361167a578a60018151811061166f5761166e612727565b5b602002602001015192505b8860028151811061168e5761168d612727565b5b60200260200101518a6005815181106116aa576116a9612727565b5b60200260200101516116bc919061278a565b9050886005815181106116d2576116d1612727565b5b602002602001015191506117a7565b8a6001815181106116f5576116f4612727565b5b602002602001015192508860028151811061171357611712612727565b5b6020026020010151935060008403611744578a60008151811061173957611738612727565b5b602002602001015193505b8860028151811061175857611757612727565b5b60200260200101518a60058151811061177457611773612727565b5b6020026020010151611786919061278a565b91508860058151811061179c5761179b612727565b5b602002602001015190505b8a6004815181106117bb576117ba612727565b5b60200260200101518b6003815181106117d7576117d6612727565b5b60200260200101518c6002815181106117f3576117f2612727565b5b6020026020010151611805919061278a565b116118c457838560008151811061181f5761181e612727565b5b6020026020010181815250506118788d8d868e60038151811061184557611844612727565b5b60200260200101518f60028151811061186157611860612727565b5b6020026020010151611873919061278a565b610769565b8560018151811061188c5761188b612727565b5b6020026020010181815250506118a48e8e868561121f565b955060008660ff1611156118c357858597509750505050505050611a0a565b5b8a6005815181106118d8576118d7612727565b5b60200260200101518b6003815181106118f4576118f3612727565b5b60200260200101518c6002815181106119105761190f612727565b5b60200260200101516119229190612756565b106119fc576119748c8e858e60038151811061194157611940612727565b5b60200260200101518f60028151811061195d5761195c612727565b5b602002602001015161196f9190612756565b610769565b8560028151811061198857611987612727565b5b60200260200101818152505082856003815181106119a9576119a8612727565b5b6020026020010181815250506119dc8e8d876002815181106119ce576119cd612727565b5b60200260200101518461121f565b955060008660ff1611156119fb57858597509750505050505050611a0a565b5b600085975097505050505050505b965096945050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611a5d576001600080925092509250611bc1565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611aac9190611e8f565b602060405180830381865afa158015611ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aed919061252f565b905060008103611b0857600260008093509350935050611bc1565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611b579190611e8f565b602060405180830381865afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b98919061252f565b905060008103611bb45760036000809450945094505050611bc1565b6000828294509450945050505b9250925092565b600080600080600080611bda8c61057f565b905060008160ff161115611bfa5780600080955095509550505050611d21565b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b8c8c8c8c6040518563ffffffff1660e01b8152600401611c4d9493929190612676565b6040805180830381865afa158015611c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8d91906126e7565b809450819350505060018260ff1603611cc05786881115611cbb5760c8600080955095509550505050611d21565b611ce6565b86881015611cdb5760c8600080955095509550505050611d21565b8289809450819a5050505b611cf38c8c8b600061121f565b905060008160ff161115611d135780600080955095509550505050611d21565b606489849550955095505050505b96509650969350505050565b6040518060a00160405280600081526020016000815260200160008152602001600060ff168152602001600060ff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611da182611d76565b9050919050565b611db181611d96565b8114611dbc57600080fd5b50565b600081359050611dce81611da8565b92915050565b60008060408385031215611deb57611dea611d6c565b5b6000611df985828601611dbf565b9250506020611e0a85828601611dbf565b9150509250929050565b600060ff82169050919050565b611e2a81611e14565b82525050565b6000819050919050565b611e4381611e30565b82525050565b6000606082019050611e5e6000830186611e21565b611e6b6020830185611e3a565b611e786040830184611e3a565b949350505050565b611e8981611d96565b82525050565b6000602082019050611ea46000830184611e80565b92915050565b600060208284031215611ec057611ebf611d6c565b5b6000611ece84828501611dbf565b91505092915050565b6000602082019050611eec6000830184611e21565b92915050565b611efb81611e30565b8114611f0657600080fd5b50565b600081359050611f1881611ef2565b92915050565b60008060008060808587031215611f3857611f37611d6c565b5b6000611f4687828801611dbf565b9450506020611f5787828801611dbf565b9350506040611f6887828801611f09565b9250506060611f7987828801611f09565b91505092959194509250565b6000602082019050611f9a6000830184611e3a565b92915050565b60008060008060008060008060006101208a8c031215611fc357611fc2611d6c565b5b6000611fd18c828d01611dbf565b9950506020611fe28c828d01611dbf565b9850506040611ff38c828d01611dbf565b97505060606120048c828d01611f09565b96505060806120158c828d01611f09565b95505060a06120268c828d01611f09565b94505060c06120378c828d01611f09565b93505060e06120488c828d01611f09565b92505061010061205a8c828d01611f09565b9150509295985092959850929598565b600080600080600080600080610100898b03121561208b5761208a611d6c565b5b60006120998b828c01611dbf565b98505060206120aa8b828c01611dbf565b97505060406120bb8b828c01611dbf565b96505060606120cc8b828c01611f09565b95505060806120dd8b828c01611f09565b94505060a06120ee8b828c01611f09565b93505060c06120ff8b828c01611f09565b92505060e06121108b828c01611f09565b9150509295985092959890939650565b60006080820190506121356000830187611e21565b6121426020830186611e21565b61214f6040830185611e3a565b61215c6060830184611e3a565b95945050505050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6121b38261216a565b810181811067ffffffffffffffff821117156121d2576121d161217b565b5b80604052505050565b60006121e5611d62565b90506121f182826121aa565b919050565b600067ffffffffffffffff8211156122115761221061217b565b5b602082029050602081019050919050565b600080fd5b600061223a612235846121f6565b6121db565b9050808382526020820190506020840283018581111561225d5761225c612222565b5b835b8181101561228657806122728882611f09565b84526020840193505060208101905061225f565b5050509392505050565b600082601f8301126122a5576122a4612165565b5b81356122b5848260208601612227565b91505092915050565b60008060008060008060c087890312156122db576122da611d6c565b5b60006122e989828a01611dbf565b96505060206122fa89828a01611dbf565b955050604061230b89828a01611dbf565b945050606087013567ffffffffffffffff81111561232c5761232b611d71565b5b61233889828a01612290565b935050608087013567ffffffffffffffff81111561235957612358611d71565b5b61236589828a01612290565b92505060a087013567ffffffffffffffff81111561238657612385611d71565b5b61239289828a01612290565b9150509295509295509295565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6123d481611e30565b82525050565b60006123e683836123cb565b60208301905092915050565b6000602082019050919050565b600061240a8261239f565b61241481856123aa565b935061241f836123bb565b8060005b8381101561245057815161243788826123da565b9750612442836123f2565b925050600181019050612423565b5085935050505092915050565b60006040820190506124726000830185611e21565b818103602083015261248481846123ff565b90509392505050565b60008060008060008060c087890312156124aa576124a9611d6c565b5b60006124b889828a01611dbf565b96505060206124c989828a01611dbf565b95505060406124da89828a01611dbf565b94505060606124eb89828a01611f09565b93505060806124fc89828a01611f09565b92505060a061250d89828a01611f09565b9150509295509295509295565b60008151905061252981611ef2565b92915050565b60006020828403121561254557612544611d6c565b5b60006125538482850161251a565b91505092915050565b60008151905061256b81611da8565b92915050565b60008060006060848603121561258a57612589611d6c565b5b60006125988682870161255c565b93505060206125a98682870161251a565b92505060406125ba8682870161251a565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125fe82611e30565b915061260983611e30565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612642576126416125c4565b5b828202905092915050565b60006040820190506126626000830185611e80565b61266f6020830184611e80565b9392505050565b600060808201905061268b6000830187611e80565b6126986020830186611e80565b6126a56040830185611e3a565b6126b26060830184611e3a565b95945050505050565b6126c481611e14565b81146126cf57600080fd5b50565b6000815190506126e1816126bb565b92915050565b600080604083850312156126fe576126fd611d6c565b5b600061270c858286016126d2565b925050602061271d8582860161251a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061276182611e30565b915061276c83611e30565b9250828203905081811115612784576127836125c4565b5b92915050565b600061279582611e30565b91506127a083611e30565b92508282019050808211156127b8576127b76125c4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127f882611e30565b915061280383611e30565b925082612813576128126127be565b5b82820490509291505056fea2646970667358221220124da4f8dd5ed0d07451f1a29e35f670c182a647030d3d0d77bb3f6c0d8a2bda64736f6c63430008100033
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063acbfa21d11610066578063acbfa21d14610185578063ad148af4146101b8578063b1055734146101e8578063de14efc414610219578063fe908a9c1461024b5761009e565b80630c40aaf3146100a3578063127e1197146100d557806320903720146100f35780637d25728a1461012357806390b5ef7714610153575b600080fd5b6100bd60048036038101906100b89190611dd4565b61027d565b6040516100cc93929190611e49565b60405180910390f35b6100dd610567565b6040516100ea9190611e8f565b60405180910390f35b61010d60048036038101906101089190611eaa565b61057f565b60405161011a9190611ed7565b60405180910390f35b61013d60048036038101906101389190611f1e565b610769565b60405161014a9190611f85565b60405180910390f35b61016d60048036038101906101689190611fa0565b610811565b60405161017c93929190611e49565b60405180910390f35b61019f600480360381019061019a919061206a565b610dec565b6040516101af9493929190612120565b60405180910390f35b6101d260048036038101906101cd9190611f1e565b61121f565b6040516101df9190611ed7565b60405180910390f35b61020260048036038101906101fd91906122be565b61159b565b60405161021092919061245d565b60405180910390f35b610233600480360381019061022e9190611dd4565b611a15565b60405161024293929190611e49565b60405180910390f35b6102656004803603810190610260919061248d565b611bc8565b60405161027493929190611e49565b60405180910390f35b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036102c5576001600080925092509250610560565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103149190611e8f565b602060405180830381865afa158015610331573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610355919061252f565b90506000810361037057600260008093509350935050610560565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103bf9190611e8f565b602060405180830381865afa1580156103dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610400919061252f565b90506000810361041c5760036000809450945094505050610560565b600080828410156104bc577301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d896040518263ffffffff1660e01b81526004016104749190611e8f565b602060405180830381865afa158015610491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b5919061252f565b9050610551565b600191507301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d8a6040518263ffffffff1660e01b815260040161050d9190611e8f565b602060405180830381865afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e919061252f565b90505b60008282965096509650505050505b9250925092565b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c781565b6000806000807301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106089190612571565b9250925092506000818361061c91906125f3565b905060008473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e887301c81c93f38f42497b4cebfa23eeb03f7ccfa8c76040518363ffffffff1660e01b815260040161066f92919061264d565b602060405180830381865afa15801561068c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b0919061252f565b9050808211156106c857600e95505050505050610764565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b81526004016107019190611e8f565b602060405180830381865afa15801561071e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610742919061252f565b90508082111561075a57600f95505050505050610764565b6000955050505050505b919050565b6000807301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b878787876040518563ffffffff1660e01b81526004016107bf9493929190612676565b6040805180830381865afa1580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff91906126e7565b90508091505080915050949350505050565b600080600080890361082d576010600080925092509250610ddd565b60008803610845576011600080925092509250610ddd565b6000600567ffffffffffffffff8111156108625761086161217b565b5b6040519080825280602002602001820160405280156108905781602001602082028036833780820191505090505b50905061089d8c8c61027d565b8260ff169250836004815181106108b7576108b6612727565b5b60200260200101846002815181106108d2576108d1612727565b5b60200260200101856003815181106108ed576108ec612727565b5b6020026020010183815250838152508381525050505060008160048151811061091957610918612727565b5b60200260200101511115610952578060048151811061093b5761093a612727565b5b602002602001015160008093509350935050610ddd565b60018160028151811061096857610967612727565b5b602002602001015103610980578a8c809c50819d5050505b6000870361099957601360008093509350935050610ddd565b858811156109b257601460008093509350935050610ddd565b848810156109cb57601560008093509350935050610ddd565b868510156109e457601660008093509350935050610ddd565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610a119190612756565b1015610a2857601760008093509350935050610ddd565b610a3f8c8c8c8a89610a3a919061278a565b610769565b81600481518110610a5357610a52612727565b5b60200260200101818152505080600381518110610a7357610a72612727565b5b602002602001015181600481518110610a8f57610a8e612727565b5b60200260200101511015610aae57601860008093509350935050610ddd565b610aba8b8d8b88610769565b81600481518110610ace57610acd612727565b5b60200260200101818152505080600381518110610aee57610aed612727565b5b602002602001015181600481518110610b0a57610b09612727565b5b60200260200101511015610b2957601960008093509350935050610ddd565b858789610b36919061278a565b11610bf257610b528c8c8c8a8c610b4d919061278a565b610769565b81600081518110610b6657610b65612727565b5b602002602001018181525050610b7f8d8d8c600061121f565b60ff1681600481518110610b9657610b95612727565b5b602002602001018181525050600081600481518110610bb857610bb7612727565b5b60200260200101511115610bf15780600481518110610bda57610bd9612727565b5b602002602001015160008093509350935050610ddd565b5b848789610bff9190612756565b10610cd657610c1b8b8d8b8a8c610c169190612756565b610769565b81600181518110610c2f57610c2e612727565b5b602002602001018181525050610c638d8c83600181518110610c5457610c53612727565b5b6020026020010151600061121f565b60ff1681600481518110610c7a57610c79612727565b5b602002602001018181525050600081600481518110610c9c57610c9b612727565b5b60200260200101511115610cd55780600481518110610cbe57610cbd612727565b5b602002602001015160008093509350935050610ddd565b5b600081600081518110610cec57610ceb612727565b5b6020026020010151148015610d1c5750600081600181518110610d1257610d11612727565b5b6020026020010151145b15610d3257601a60008093509350935050610ddd565b600181600281518110610d4857610d47612727565b5b602002602001015103610d9b57606581600081518110610d6b57610d6a612727565b5b602002602001015182600181518110610d8757610d86612727565b5b602002602001015193509350935050610ddd565b606481600081518110610db157610db0612727565b5b602002602001015182600181518110610dcd57610dcc612727565b5b6020026020010151935093509350505b99509950999650505050505050565b60008060008060008703610e0e57600460008060009350935093509350611210565b60008903610e2a57600560008060009350935093509350611210565b88887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610e579190612756565b1015610e7157600d60008060009350935093509350611210565b610e79611d2d565b610e838c8c611a15565b83608001846000018560200183815250838152508360ff1660ff168152505050506000816080015160ff161115610ecc5780608001516000806000945094509450945050611210565b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b8d8d8d8c6040518563ffffffff1660e01b8152600401610f1f9493929190612676565b6040805180830381865afa158015610f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5f91906126e7565b8260600183604001828152508260ff1660ff1681525050506000816040015103610f985760056000806000945094509450945050611210565b6001816060015160ff160361103657806020015181604001511015610fcc5760066000806000945094509450945050611210565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610ff99190612756565b10156110145760076000806000945094509450945050611210565b878610156110315760086000806000945094509450945050611210565b6111b3565b80604001518a8260400181815250819b50505080600001518a101561106a5760066000806000945094509450945050611210565b868610156110875760096000806000945094509450945050611210565b858810156110a457600a6000806000945094509450945050611210565b600087878a6110b39190612756565b6110bd91906127ed565b905060008260400151828c6110d291906125f3565b6110dc919061278a565b90507301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b8f8f84868e61111d91906125f3565b8f6111289190612756565b6040518563ffffffff1660e01b81526004016111479493929190612676565b6040805180830381865afa158015611163573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118791906126e7565b90508091505082600001518110156111b057601260008060009650965096509650505050611210565b50505b6111c08d8d8c600061121f565b816080019060ff16908160ff16815250506000816080015160ff1611156111f95780608001516000806000945094509450945050611210565b606481606001518b83604001519450945094509450505b98509850985098945050505050565b60008060008060007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190612571565b925092509250600081836112be91906125f3565b90508373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16036113065780886112ff919061278a565b9750611441565b8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c76040518363ffffffff1660e01b815260040161135592919061264d565b602060405180830381865afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611396919061252f565b9450848111156113ae57600e95505050505050611593565b8373ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016113e79190611e8f565b602060405180830381865afa158015611404573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611428919061252f565b94508481111561144057600f95505050505050611593565b5b8873ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c76040518363ffffffff1660e01b815260040161149092919061264d565b602060405180830381865afa1580156114ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d1919061252f565b9450848811156114e957600b95505050505050611593565b8873ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016115229190611e8f565b602060405180830381865afa15801561153f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611563919061252f565b94508685611571919061278a565b94508488111561158957600c95505050505050611593565b6000955050505050505b949350505050565b60006060600080600467ffffffffffffffff8111156115bd576115bc61217b565b5b6040519080825280602002602001820160405280156115eb5781602001602082028036833780820191505090505b50905060008060008060018a60018151811061160a57611609612727565b5b6020026020010151036116e1578a60008151811061162b5761162a612727565b5b602002602001015193508860038151811061164957611648612727565b5b602002602001015192506000830361167a578a60018151811061166f5761166e612727565b5b602002602001015192505b8860028151811061168e5761168d612727565b5b60200260200101518a6005815181106116aa576116a9612727565b5b60200260200101516116bc919061278a565b9050886005815181106116d2576116d1612727565b5b602002602001015191506117a7565b8a6001815181106116f5576116f4612727565b5b602002602001015192508860028151811061171357611712612727565b5b6020026020010151935060008403611744578a60008151811061173957611738612727565b5b602002602001015193505b8860028151811061175857611757612727565b5b60200260200101518a60058151811061177457611773612727565b5b6020026020010151611786919061278a565b91508860058151811061179c5761179b612727565b5b602002602001015190505b8a6004815181106117bb576117ba612727565b5b60200260200101518b6003815181106117d7576117d6612727565b5b60200260200101518c6002815181106117f3576117f2612727565b5b6020026020010151611805919061278a565b116118c457838560008151811061181f5761181e612727565b5b6020026020010181815250506118788d8d868e60038151811061184557611844612727565b5b60200260200101518f60028151811061186157611860612727565b5b6020026020010151611873919061278a565b610769565b8560018151811061188c5761188b612727565b5b6020026020010181815250506118a48e8e868561121f565b955060008660ff1611156118c357858597509750505050505050611a0a565b5b8a6005815181106118d8576118d7612727565b5b60200260200101518b6003815181106118f4576118f3612727565b5b60200260200101518c6002815181106119105761190f612727565b5b60200260200101516119229190612756565b106119fc576119748c8e858e60038151811061194157611940612727565b5b60200260200101518f60028151811061195d5761195c612727565b5b602002602001015161196f9190612756565b610769565b8560028151811061198857611987612727565b5b60200260200101818152505082856003815181106119a9576119a8612727565b5b6020026020010181815250506119dc8e8d876002815181106119ce576119cd612727565b5b60200260200101518461121f565b955060008660ff1611156119fb57858597509750505050505050611a0a565b5b600085975097505050505050505b965096945050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611a5d576001600080925092509250611bc1565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611aac9190611e8f565b602060405180830381865afa158015611ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aed919061252f565b905060008103611b0857600260008093509350935050611bc1565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611b579190611e8f565b602060405180830381865afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b98919061252f565b905060008103611bb45760036000809450945094505050611bc1565b6000828294509450945050505b9250925092565b600080600080600080611bda8c61057f565b905060008160ff161115611bfa5780600080955095509550505050611d21565b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b8c8c8c8c6040518563ffffffff1660e01b8152600401611c4d9493929190612676565b6040805180830381865afa158015611c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8d91906126e7565b809450819350505060018260ff1603611cc05786881115611cbb5760c8600080955095509550505050611d21565b611ce6565b86881015611cdb5760c8600080955095509550505050611d21565b8289809450819a5050505b611cf38c8c8b600061121f565b905060008160ff161115611d135780600080955095509550505050611d21565b606489849550955095505050505b96509650969350505050565b6040518060a00160405280600081526020016000815260200160008152602001600060ff168152602001600060ff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611da182611d76565b9050919050565b611db181611d96565b8114611dbc57600080fd5b50565b600081359050611dce81611da8565b92915050565b60008060408385031215611deb57611dea611d6c565b5b6000611df985828601611dbf565b9250506020611e0a85828601611dbf565b9150509250929050565b600060ff82169050919050565b611e2a81611e14565b82525050565b6000819050919050565b611e4381611e30565b82525050565b6000606082019050611e5e6000830186611e21565b611e6b6020830185611e3a565b611e786040830184611e3a565b949350505050565b611e8981611d96565b82525050565b6000602082019050611ea46000830184611e80565b92915050565b600060208284031215611ec057611ebf611d6c565b5b6000611ece84828501611dbf565b91505092915050565b6000602082019050611eec6000830184611e21565b92915050565b611efb81611e30565b8114611f0657600080fd5b50565b600081359050611f1881611ef2565b92915050565b60008060008060808587031215611f3857611f37611d6c565b5b6000611f4687828801611dbf565b9450506020611f5787828801611dbf565b9350506040611f6887828801611f09565b9250506060611f7987828801611f09565b91505092959194509250565b6000602082019050611f9a6000830184611e3a565b92915050565b60008060008060008060008060006101208a8c031215611fc357611fc2611d6c565b5b6000611fd18c828d01611dbf565b9950506020611fe28c828d01611dbf565b9850506040611ff38c828d01611dbf565b97505060606120048c828d01611f09565b96505060806120158c828d01611f09565b95505060a06120268c828d01611f09565b94505060c06120378c828d01611f09565b93505060e06120488c828d01611f09565b92505061010061205a8c828d01611f09565b9150509295985092959850929598565b600080600080600080600080610100898b03121561208b5761208a611d6c565b5b60006120998b828c01611dbf565b98505060206120aa8b828c01611dbf565b97505060406120bb8b828c01611dbf565b96505060606120cc8b828c01611f09565b95505060806120dd8b828c01611f09565b94505060a06120ee8b828c01611f09565b93505060c06120ff8b828c01611f09565b92505060e06121108b828c01611f09565b9150509295985092959890939650565b60006080820190506121356000830187611e21565b6121426020830186611e21565b61214f6040830185611e3a565b61215c6060830184611e3a565b95945050505050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6121b38261216a565b810181811067ffffffffffffffff821117156121d2576121d161217b565b5b80604052505050565b60006121e5611d62565b90506121f182826121aa565b919050565b600067ffffffffffffffff8211156122115761221061217b565b5b602082029050602081019050919050565b600080fd5b600061223a612235846121f6565b6121db565b9050808382526020820190506020840283018581111561225d5761225c612222565b5b835b8181101561228657806122728882611f09565b84526020840193505060208101905061225f565b5050509392505050565b600082601f8301126122a5576122a4612165565b5b81356122b5848260208601612227565b91505092915050565b60008060008060008060c087890312156122db576122da611d6c565b5b60006122e989828a01611dbf565b96505060206122fa89828a01611dbf565b955050604061230b89828a01611dbf565b945050606087013567ffffffffffffffff81111561232c5761232b611d71565b5b61233889828a01612290565b935050608087013567ffffffffffffffff81111561235957612358611d71565b5b61236589828a01612290565b92505060a087013567ffffffffffffffff81111561238657612385611d71565b5b61239289828a01612290565b9150509295509295509295565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6123d481611e30565b82525050565b60006123e683836123cb565b60208301905092915050565b6000602082019050919050565b600061240a8261239f565b61241481856123aa565b935061241f836123bb565b8060005b8381101561245057815161243788826123da565b9750612442836123f2565b925050600181019050612423565b5085935050505092915050565b60006040820190506124726000830185611e21565b818103602083015261248481846123ff565b90509392505050565b60008060008060008060c087890312156124aa576124a9611d6c565b5b60006124b889828a01611dbf565b96505060206124c989828a01611dbf565b95505060406124da89828a01611dbf565b94505060606124eb89828a01611f09565b93505060806124fc89828a01611f09565b92505060a061250d89828a01611f09565b9150509295509295509295565b60008151905061252981611ef2565b92915050565b60006020828403121561254557612544611d6c565b5b60006125538482850161251a565b91505092915050565b60008151905061256b81611da8565b92915050565b60008060006060848603121561258a57612589611d6c565b5b60006125988682870161255c565b93505060206125a98682870161251a565b92505060406125ba8682870161251a565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125fe82611e30565b915061260983611e30565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612642576126416125c4565b5b828202905092915050565b60006040820190506126626000830185611e80565b61266f6020830184611e80565b9392505050565b600060808201905061268b6000830187611e80565b6126986020830186611e80565b6126a56040830185611e3a565b6126b26060830184611e3a565b95945050505050565b6126c481611e14565b81146126cf57600080fd5b50565b6000815190506126e1816126bb565b92915050565b600080604083850312156126fe576126fd611d6c565b5b600061270c858286016126d2565b925050602061271d8582860161251a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061276182611e30565b915061276c83611e30565b9250828203905081811115612784576127836125c4565b5b92915050565b600061279582611e30565b91506127a083611e30565b92508282019050808211156127b8576127b76125c4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127f882611e30565b915061280383611e30565b925082612813576128126127be565b5b82820490509291505056fea2646970667358221220124da4f8dd5ed0d07451f1a29e35f670c182a647030d3d0d77bb3f6c0d8a2bda64736f6c63430008100033