false
false
0

Contract Address Details

0x6F8A583c11615C7CF713A76e79131FDF8761C3fE

Contract Name
TwoBearsBotsHelp
Creator
0xebe894–7a24f6 at 0x602763–617703
Balance
0 CLO
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
16290514
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

Verify & Publish
0x608060405234801561001057600080fd5b50612854806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063acbfa21d11610066578063acbfa21d14610185578063ad148af4146101b8578063b1055734146101e8578063de14efc414610219578063fe908a9c1461024b5761009e565b80630c40aaf3146100a3578063127e1197146100d557806320903720146100f35780637d25728a1461012357806390b5ef7714610153575b600080fd5b6100bd60048036038101906100b89190611dd4565b61027d565b6040516100cc93929190611e49565b60405180910390f35b6100dd610567565b6040516100ea9190611e8f565b60405180910390f35b61010d60048036038101906101089190611eaa565b61057f565b60405161011a9190611ed7565b60405180910390f35b61013d60048036038101906101389190611f1e565b610769565b60405161014a9190611f85565b60405180910390f35b61016d60048036038101906101689190611fa0565b610811565b60405161017c93929190611e49565b60405180910390f35b61019f600480360381019061019a919061206a565b610dec565b6040516101af9493929190612120565b60405180910390f35b6101d260048036038101906101cd9190611f1e565b61121f565b6040516101df9190611ed7565b60405180910390f35b61020260048036038101906101fd91906122be565b61159b565b60405161021092919061245d565b60405180910390f35b610233600480360381019061022e9190611dd4565b611a15565b60405161024293929190611e49565b60405180910390f35b6102656004803603810190610260919061248d565b611bc8565b60405161027493929190611e49565b60405180910390f35b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036102c5576001600080925092509250610560565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103149190611e8f565b602060405180830381865afa158015610331573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610355919061252f565b90506000810361037057600260008093509350935050610560565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103bf9190611e8f565b602060405180830381865afa1580156103dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610400919061252f565b90506000810361041c5760036000809450945094505050610560565b600080828410156104bc577301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d896040518263ffffffff1660e01b81526004016104749190611e8f565b602060405180830381865afa158015610491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b5919061252f565b9050610551565b600191507301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d8a6040518263ffffffff1660e01b815260040161050d9190611e8f565b602060405180830381865afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e919061252f565b90505b60008282965096509650505050505b9250925092565b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c781565b6000806000807301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106089190612571565b9250925092506000818361061c91906125f3565b905060008473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e887301c81c93f38f42497b4cebfa23eeb03f7ccfa8c76040518363ffffffff1660e01b815260040161066f92919061264d565b602060405180830381865afa15801561068c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b0919061252f565b9050808211156106c857600e95505050505050610764565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b81526004016107019190611e8f565b602060405180830381865afa15801561071e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610742919061252f565b90508082111561075a57600f95505050505050610764565b6000955050505050505b919050565b6000807301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b878787876040518563ffffffff1660e01b81526004016107bf9493929190612676565b6040805180830381865afa1580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff91906126e7565b90508091505080915050949350505050565b600080600080890361082d576010600080925092509250610ddd565b60008803610845576011600080925092509250610ddd565b6000600567ffffffffffffffff8111156108625761086161217b565b5b6040519080825280602002602001820160405280156108905781602001602082028036833780820191505090505b50905061089d8c8c61027d565b8260ff169250836004815181106108b7576108b6612727565b5b60200260200101846002815181106108d2576108d1612727565b5b60200260200101856003815181106108ed576108ec612727565b5b6020026020010183815250838152508381525050505060008160048151811061091957610918612727565b5b60200260200101511115610952578060048151811061093b5761093a612727565b5b602002602001015160008093509350935050610ddd565b60018160028151811061096857610967612727565b5b602002602001015103610980578a8c809c50819d5050505b6000870361099957601360008093509350935050610ddd565b858811156109b257601460008093509350935050610ddd565b848810156109cb57601560008093509350935050610ddd565b868510156109e457601660008093509350935050610ddd565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610a119190612756565b1015610a2857601760008093509350935050610ddd565b610a3f8c8c8c8a89610a3a919061278a565b610769565b81600481518110610a5357610a52612727565b5b60200260200101818152505080600381518110610a7357610a72612727565b5b602002602001015181600481518110610a8f57610a8e612727565b5b60200260200101511015610aae57601860008093509350935050610ddd565b610aba8b8d8b88610769565b81600481518110610ace57610acd612727565b5b60200260200101818152505080600381518110610aee57610aed612727565b5b602002602001015181600481518110610b0a57610b09612727565b5b60200260200101511015610b2957601960008093509350935050610ddd565b858789610b36919061278a565b11610bf257610b528c8c8c8a8c610b4d919061278a565b610769565b81600081518110610b6657610b65612727565b5b602002602001018181525050610b7f8d8d8c600061121f565b60ff1681600481518110610b9657610b95612727565b5b602002602001018181525050600081600481518110610bb857610bb7612727565b5b60200260200101511115610bf15780600481518110610bda57610bd9612727565b5b602002602001015160008093509350935050610ddd565b5b848789610bff9190612756565b10610cd657610c1b8b8d8b8a8c610c169190612756565b610769565b81600181518110610c2f57610c2e612727565b5b602002602001018181525050610c638d8c83600181518110610c5457610c53612727565b5b6020026020010151600061121f565b60ff1681600481518110610c7a57610c79612727565b5b602002602001018181525050600081600481518110610c9c57610c9b612727565b5b60200260200101511115610cd55780600481518110610cbe57610cbd612727565b5b602002602001015160008093509350935050610ddd565b5b600081600081518110610cec57610ceb612727565b5b6020026020010151148015610d1c5750600081600181518110610d1257610d11612727565b5b6020026020010151145b15610d3257601a60008093509350935050610ddd565b600181600281518110610d4857610d47612727565b5b602002602001015103610d9b57606581600081518110610d6b57610d6a612727565b5b602002602001015182600181518110610d8757610d86612727565b5b602002602001015193509350935050610ddd565b606481600081518110610db157610db0612727565b5b602002602001015182600181518110610dcd57610dcc612727565b5b6020026020010151935093509350505b99509950999650505050505050565b60008060008060008703610e0e57600460008060009350935093509350611210565b60008903610e2a57600560008060009350935093509350611210565b88887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610e579190612756565b1015610e7157600d60008060009350935093509350611210565b610e79611d2d565b610e838c8c611a15565b83608001846000018560200183815250838152508360ff1660ff168152505050506000816080015160ff161115610ecc5780608001516000806000945094509450945050611210565b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b8d8d8d8c6040518563ffffffff1660e01b8152600401610f1f9493929190612676565b6040805180830381865afa158015610f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5f91906126e7565b8260600183604001828152508260ff1660ff1681525050506000816040015103610f985760056000806000945094509450945050611210565b6001816060015160ff160361103657806020015181604001511015610fcc5760066000806000945094509450945050611210565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610ff99190612756565b10156110145760076000806000945094509450945050611210565b878610156110315760086000806000945094509450945050611210565b6111b3565b80604001518a8260400181815250819b50505080600001518a101561106a5760066000806000945094509450945050611210565b868610156110875760096000806000945094509450945050611210565b858810156110a457600a6000806000945094509450945050611210565b600087878a6110b39190612756565b6110bd91906127ed565b905060008260400151828c6110d291906125f3565b6110dc919061278a565b90507301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b8f8f84868e61111d91906125f3565b8f6111289190612756565b6040518563ffffffff1660e01b81526004016111479493929190612676565b6040805180830381865afa158015611163573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118791906126e7565b90508091505082600001518110156111b057601260008060009650965096509650505050611210565b50505b6111c08d8d8c600061121f565b816080019060ff16908160ff16815250506000816080015160ff1611156111f95780608001516000806000945094509450945050611210565b606481606001518b83604001519450945094509450505b98509850985098945050505050565b60008060008060007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190612571565b925092509250600081836112be91906125f3565b90508373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16036113065780886112ff919061278a565b9750611441565b8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c76040518363ffffffff1660e01b815260040161135592919061264d565b602060405180830381865afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611396919061252f565b9450848111156113ae57600e95505050505050611593565b8373ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016113e79190611e8f565b602060405180830381865afa158015611404573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611428919061252f565b94508481111561144057600f95505050505050611593565b5b8873ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c76040518363ffffffff1660e01b815260040161149092919061264d565b602060405180830381865afa1580156114ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d1919061252f565b9450848811156114e957600b95505050505050611593565b8873ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016115229190611e8f565b602060405180830381865afa15801561153f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611563919061252f565b94508685611571919061278a565b94508488111561158957600c95505050505050611593565b6000955050505050505b949350505050565b60006060600080600467ffffffffffffffff8111156115bd576115bc61217b565b5b6040519080825280602002602001820160405280156115eb5781602001602082028036833780820191505090505b50905060008060008060018a60018151811061160a57611609612727565b5b6020026020010151036116e1578a60008151811061162b5761162a612727565b5b602002602001015193508860038151811061164957611648612727565b5b602002602001015192506000830361167a578a60018151811061166f5761166e612727565b5b602002602001015192505b8860028151811061168e5761168d612727565b5b60200260200101518a6005815181106116aa576116a9612727565b5b60200260200101516116bc919061278a565b9050886005815181106116d2576116d1612727565b5b602002602001015191506117a7565b8a6001815181106116f5576116f4612727565b5b602002602001015192508860028151811061171357611712612727565b5b6020026020010151935060008403611744578a60008151811061173957611738612727565b5b602002602001015193505b8860028151811061175857611757612727565b5b60200260200101518a60058151811061177457611773612727565b5b6020026020010151611786919061278a565b91508860058151811061179c5761179b612727565b5b602002602001015190505b8a6004815181106117bb576117ba612727565b5b60200260200101518b6003815181106117d7576117d6612727565b5b60200260200101518c6002815181106117f3576117f2612727565b5b6020026020010151611805919061278a565b116118c457838560008151811061181f5761181e612727565b5b6020026020010181815250506118788d8d868e60038151811061184557611844612727565b5b60200260200101518f60028151811061186157611860612727565b5b6020026020010151611873919061278a565b610769565b8560018151811061188c5761188b612727565b5b6020026020010181815250506118a48e8e868561121f565b955060008660ff1611156118c357858597509750505050505050611a0a565b5b8a6005815181106118d8576118d7612727565b5b60200260200101518b6003815181106118f4576118f3612727565b5b60200260200101518c6002815181106119105761190f612727565b5b60200260200101516119229190612756565b106119fc576119748c8e858e60038151811061194157611940612727565b5b60200260200101518f60028151811061195d5761195c612727565b5b602002602001015161196f9190612756565b610769565b8560028151811061198857611987612727565b5b60200260200101818152505082856003815181106119a9576119a8612727565b5b6020026020010181815250506119dc8e8d876002815181106119ce576119cd612727565b5b60200260200101518461121f565b955060008660ff1611156119fb57858597509750505050505050611a0a565b5b600085975097505050505050505b965096945050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611a5d576001600080925092509250611bc1565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611aac9190611e8f565b602060405180830381865afa158015611ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aed919061252f565b905060008103611b0857600260008093509350935050611bc1565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611b579190611e8f565b602060405180830381865afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b98919061252f565b905060008103611bb45760036000809450945094505050611bc1565b6000828294509450945050505b9250925092565b600080600080600080611bda8c61057f565b905060008160ff161115611bfa5780600080955095509550505050611d21565b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b8c8c8c8c6040518563ffffffff1660e01b8152600401611c4d9493929190612676565b6040805180830381865afa158015611c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8d91906126e7565b809450819350505060018260ff1603611cc05786881115611cbb5760c8600080955095509550505050611d21565b611ce6565b86881015611cdb5760c8600080955095509550505050611d21565b8289809450819a5050505b611cf38c8c8b600061121f565b905060008160ff161115611d135780600080955095509550505050611d21565b606489849550955095505050505b96509650969350505050565b6040518060a00160405280600081526020016000815260200160008152602001600060ff168152602001600060ff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611da182611d76565b9050919050565b611db181611d96565b8114611dbc57600080fd5b50565b600081359050611dce81611da8565b92915050565b60008060408385031215611deb57611dea611d6c565b5b6000611df985828601611dbf565b9250506020611e0a85828601611dbf565b9150509250929050565b600060ff82169050919050565b611e2a81611e14565b82525050565b6000819050919050565b611e4381611e30565b82525050565b6000606082019050611e5e6000830186611e21565b611e6b6020830185611e3a565b611e786040830184611e3a565b949350505050565b611e8981611d96565b82525050565b6000602082019050611ea46000830184611e80565b92915050565b600060208284031215611ec057611ebf611d6c565b5b6000611ece84828501611dbf565b91505092915050565b6000602082019050611eec6000830184611e21565b92915050565b611efb81611e30565b8114611f0657600080fd5b50565b600081359050611f1881611ef2565b92915050565b60008060008060808587031215611f3857611f37611d6c565b5b6000611f4687828801611dbf565b9450506020611f5787828801611dbf565b9350506040611f6887828801611f09565b9250506060611f7987828801611f09565b91505092959194509250565b6000602082019050611f9a6000830184611e3a565b92915050565b60008060008060008060008060006101208a8c031215611fc357611fc2611d6c565b5b6000611fd18c828d01611dbf565b9950506020611fe28c828d01611dbf565b9850506040611ff38c828d01611dbf565b97505060606120048c828d01611f09565b96505060806120158c828d01611f09565b95505060a06120268c828d01611f09565b94505060c06120378c828d01611f09565b93505060e06120488c828d01611f09565b92505061010061205a8c828d01611f09565b9150509295985092959850929598565b600080600080600080600080610100898b03121561208b5761208a611d6c565b5b60006120998b828c01611dbf565b98505060206120aa8b828c01611dbf565b97505060406120bb8b828c01611dbf565b96505060606120cc8b828c01611f09565b95505060806120dd8b828c01611f09565b94505060a06120ee8b828c01611f09565b93505060c06120ff8b828c01611f09565b92505060e06121108b828c01611f09565b9150509295985092959890939650565b60006080820190506121356000830187611e21565b6121426020830186611e21565b61214f6040830185611e3a565b61215c6060830184611e3a565b95945050505050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6121b38261216a565b810181811067ffffffffffffffff821117156121d2576121d161217b565b5b80604052505050565b60006121e5611d62565b90506121f182826121aa565b919050565b600067ffffffffffffffff8211156122115761221061217b565b5b602082029050602081019050919050565b600080fd5b600061223a612235846121f6565b6121db565b9050808382526020820190506020840283018581111561225d5761225c612222565b5b835b8181101561228657806122728882611f09565b84526020840193505060208101905061225f565b5050509392505050565b600082601f8301126122a5576122a4612165565b5b81356122b5848260208601612227565b91505092915050565b60008060008060008060c087890312156122db576122da611d6c565b5b60006122e989828a01611dbf565b96505060206122fa89828a01611dbf565b955050604061230b89828a01611dbf565b945050606087013567ffffffffffffffff81111561232c5761232b611d71565b5b61233889828a01612290565b935050608087013567ffffffffffffffff81111561235957612358611d71565b5b61236589828a01612290565b92505060a087013567ffffffffffffffff81111561238657612385611d71565b5b61239289828a01612290565b9150509295509295509295565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6123d481611e30565b82525050565b60006123e683836123cb565b60208301905092915050565b6000602082019050919050565b600061240a8261239f565b61241481856123aa565b935061241f836123bb565b8060005b8381101561245057815161243788826123da565b9750612442836123f2565b925050600181019050612423565b5085935050505092915050565b60006040820190506124726000830185611e21565b818103602083015261248481846123ff565b90509392505050565b60008060008060008060c087890312156124aa576124a9611d6c565b5b60006124b889828a01611dbf565b96505060206124c989828a01611dbf565b95505060406124da89828a01611dbf565b94505060606124eb89828a01611f09565b93505060806124fc89828a01611f09565b92505060a061250d89828a01611f09565b9150509295509295509295565b60008151905061252981611ef2565b92915050565b60006020828403121561254557612544611d6c565b5b60006125538482850161251a565b91505092915050565b60008151905061256b81611da8565b92915050565b60008060006060848603121561258a57612589611d6c565b5b60006125988682870161255c565b93505060206125a98682870161251a565b92505060406125ba8682870161251a565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125fe82611e30565b915061260983611e30565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612642576126416125c4565b5b828202905092915050565b60006040820190506126626000830185611e80565b61266f6020830184611e80565b9392505050565b600060808201905061268b6000830187611e80565b6126986020830186611e80565b6126a56040830185611e3a565b6126b26060830184611e3a565b95945050505050565b6126c481611e14565b81146126cf57600080fd5b50565b6000815190506126e1816126bb565b92915050565b600080604083850312156126fe576126fd611d6c565b5b600061270c858286016126d2565b925050602061271d8582860161251a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061276182611e30565b915061276c83611e30565b9250828203905081811115612784576127836125c4565b5b92915050565b600061279582611e30565b91506127a083611e30565b92508282019050808211156127b8576127b76125c4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127f882611e30565b915061280383611e30565b925082612813576128126127be565b5b82820490509291505056fea2646970667358221220124da4f8dd5ed0d07451f1a29e35f670c182a647030d3d0d77bb3f6c0d8a2bda64736f6c63430008100033

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063acbfa21d11610066578063acbfa21d14610185578063ad148af4146101b8578063b1055734146101e8578063de14efc414610219578063fe908a9c1461024b5761009e565b80630c40aaf3146100a3578063127e1197146100d557806320903720146100f35780637d25728a1461012357806390b5ef7714610153575b600080fd5b6100bd60048036038101906100b89190611dd4565b61027d565b6040516100cc93929190611e49565b60405180910390f35b6100dd610567565b6040516100ea9190611e8f565b60405180910390f35b61010d60048036038101906101089190611eaa565b61057f565b60405161011a9190611ed7565b60405180910390f35b61013d60048036038101906101389190611f1e565b610769565b60405161014a9190611f85565b60405180910390f35b61016d60048036038101906101689190611fa0565b610811565b60405161017c93929190611e49565b60405180910390f35b61019f600480360381019061019a919061206a565b610dec565b6040516101af9493929190612120565b60405180910390f35b6101d260048036038101906101cd9190611f1e565b61121f565b6040516101df9190611ed7565b60405180910390f35b61020260048036038101906101fd91906122be565b61159b565b60405161021092919061245d565b60405180910390f35b610233600480360381019061022e9190611dd4565b611a15565b60405161024293929190611e49565b60405180910390f35b6102656004803603810190610260919061248d565b611bc8565b60405161027493929190611e49565b60405180910390f35b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036102c5576001600080925092509250610560565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103149190611e8f565b602060405180830381865afa158015610331573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610355919061252f565b90506000810361037057600260008093509350935050610560565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f3f9d41a876040518263ffffffff1660e01b81526004016103bf9190611e8f565b602060405180830381865afa1580156103dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610400919061252f565b90506000810361041c5760036000809450945094505050610560565b600080828410156104bc577301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d896040518263ffffffff1660e01b81526004016104749190611e8f565b602060405180830381865afa158015610491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b5919061252f565b9050610551565b600191507301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d8a6040518263ffffffff1660e01b815260040161050d9190611e8f565b602060405180830381865afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e919061252f565b90505b60008282965096509650505050505b9250925092565b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c781565b6000806000807301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106089190612571565b9250925092506000818361061c91906125f3565b905060008473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e887301c81c93f38f42497b4cebfa23eeb03f7ccfa8c76040518363ffffffff1660e01b815260040161066f92919061264d565b602060405180830381865afa15801561068c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b0919061252f565b9050808211156106c857600e95505050505050610764565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b81526004016107019190611e8f565b602060405180830381865afa15801561071e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610742919061252f565b90508082111561075a57600f95505050505050610764565b6000955050505050505b919050565b6000807301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b878787876040518563ffffffff1660e01b81526004016107bf9493929190612676565b6040805180830381865afa1580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff91906126e7565b90508091505080915050949350505050565b600080600080890361082d576010600080925092509250610ddd565b60008803610845576011600080925092509250610ddd565b6000600567ffffffffffffffff8111156108625761086161217b565b5b6040519080825280602002602001820160405280156108905781602001602082028036833780820191505090505b50905061089d8c8c61027d565b8260ff169250836004815181106108b7576108b6612727565b5b60200260200101846002815181106108d2576108d1612727565b5b60200260200101856003815181106108ed576108ec612727565b5b6020026020010183815250838152508381525050505060008160048151811061091957610918612727565b5b60200260200101511115610952578060048151811061093b5761093a612727565b5b602002602001015160008093509350935050610ddd565b60018160028151811061096857610967612727565b5b602002602001015103610980578a8c809c50819d5050505b6000870361099957601360008093509350935050610ddd565b858811156109b257601460008093509350935050610ddd565b848810156109cb57601560008093509350935050610ddd565b868510156109e457601660008093509350935050610ddd565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610a119190612756565b1015610a2857601760008093509350935050610ddd565b610a3f8c8c8c8a89610a3a919061278a565b610769565b81600481518110610a5357610a52612727565b5b60200260200101818152505080600381518110610a7357610a72612727565b5b602002602001015181600481518110610a8f57610a8e612727565b5b60200260200101511015610aae57601860008093509350935050610ddd565b610aba8b8d8b88610769565b81600481518110610ace57610acd612727565b5b60200260200101818152505080600381518110610aee57610aed612727565b5b602002602001015181600481518110610b0a57610b09612727565b5b60200260200101511015610b2957601960008093509350935050610ddd565b858789610b36919061278a565b11610bf257610b528c8c8c8a8c610b4d919061278a565b610769565b81600081518110610b6657610b65612727565b5b602002602001018181525050610b7f8d8d8c600061121f565b60ff1681600481518110610b9657610b95612727565b5b602002602001018181525050600081600481518110610bb857610bb7612727565b5b60200260200101511115610bf15780600481518110610bda57610bd9612727565b5b602002602001015160008093509350935050610ddd565b5b848789610bff9190612756565b10610cd657610c1b8b8d8b8a8c610c169190612756565b610769565b81600181518110610c2f57610c2e612727565b5b602002602001018181525050610c638d8c83600181518110610c5457610c53612727565b5b6020026020010151600061121f565b60ff1681600481518110610c7a57610c79612727565b5b602002602001018181525050600081600481518110610c9c57610c9b612727565b5b60200260200101511115610cd55780600481518110610cbe57610cbd612727565b5b602002602001015160008093509350935050610ddd565b5b600081600081518110610cec57610ceb612727565b5b6020026020010151148015610d1c5750600081600181518110610d1257610d11612727565b5b6020026020010151145b15610d3257601a60008093509350935050610ddd565b600181600281518110610d4857610d47612727565b5b602002602001015103610d9b57606581600081518110610d6b57610d6a612727565b5b602002602001015182600181518110610d8757610d86612727565b5b602002602001015193509350935050610ddd565b606481600081518110610db157610db0612727565b5b602002602001015182600181518110610dcd57610dcc612727565b5b6020026020010151935093509350505b99509950999650505050505050565b60008060008060008703610e0e57600460008060009350935093509350611210565b60008903610e2a57600560008060009350935093509350611210565b88887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610e579190612756565b1015610e7157600d60008060009350935093509350611210565b610e79611d2d565b610e838c8c611a15565b83608001846000018560200183815250838152508360ff1660ff168152505050506000816080015160ff161115610ecc5780608001516000806000945094509450945050611210565b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b8d8d8d8c6040518563ffffffff1660e01b8152600401610f1f9493929190612676565b6040805180830381865afa158015610f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5f91906126e7565b8260600183604001828152508260ff1660ff1681525050506000816040015103610f985760056000806000945094509450945050611210565b6001816060015160ff160361103657806020015181604001511015610fcc5760066000806000945094509450945050611210565b86867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610ff99190612756565b10156110145760076000806000945094509450945050611210565b878610156110315760086000806000945094509450945050611210565b6111b3565b80604001518a8260400181815250819b50505080600001518a101561106a5760066000806000945094509450945050611210565b868610156110875760096000806000945094509450945050611210565b858810156110a457600a6000806000945094509450945050611210565b600087878a6110b39190612756565b6110bd91906127ed565b905060008260400151828c6110d291906125f3565b6110dc919061278a565b90507301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b8f8f84868e61111d91906125f3565b8f6111289190612756565b6040518563ffffffff1660e01b81526004016111479493929190612676565b6040805180830381865afa158015611163573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118791906126e7565b90508091505082600001518110156111b057601260008060009650965096509650505050611210565b50505b6111c08d8d8c600061121f565b816080019060ff16908160ff16815250506000816080015160ff1611156111f95780608001516000806000945094509450945050611210565b606481606001518b83604001519450945094509450505b98509850985098945050505050565b60008060008060007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff16634b4265a36040518163ffffffff1660e01b8152600401606060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190612571565b925092509250600081836112be91906125f3565b90508373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16036113065780886112ff919061278a565b9750611441565b8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c76040518363ffffffff1660e01b815260040161135592919061264d565b602060405180830381865afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611396919061252f565b9450848111156113ae57600e95505050505050611593565b8373ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016113e79190611e8f565b602060405180830381865afa158015611404573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611428919061252f565b94508481111561144057600f95505050505050611593565b5b8873ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c76040518363ffffffff1660e01b815260040161149092919061264d565b602060405180830381865afa1580156114ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d1919061252f565b9450848811156114e957600b95505050505050611593565b8873ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b81526004016115229190611e8f565b602060405180830381865afa15801561153f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611563919061252f565b94508685611571919061278a565b94508488111561158957600c95505050505050611593565b6000955050505050505b949350505050565b60006060600080600467ffffffffffffffff8111156115bd576115bc61217b565b5b6040519080825280602002602001820160405280156115eb5781602001602082028036833780820191505090505b50905060008060008060018a60018151811061160a57611609612727565b5b6020026020010151036116e1578a60008151811061162b5761162a612727565b5b602002602001015193508860038151811061164957611648612727565b5b602002602001015192506000830361167a578a60018151811061166f5761166e612727565b5b602002602001015192505b8860028151811061168e5761168d612727565b5b60200260200101518a6005815181106116aa576116a9612727565b5b60200260200101516116bc919061278a565b9050886005815181106116d2576116d1612727565b5b602002602001015191506117a7565b8a6001815181106116f5576116f4612727565b5b602002602001015192508860028151811061171357611712612727565b5b6020026020010151935060008403611744578a60008151811061173957611738612727565b5b602002602001015193505b8860028151811061175857611757612727565b5b60200260200101518a60058151811061177457611773612727565b5b6020026020010151611786919061278a565b91508860058151811061179c5761179b612727565b5b602002602001015190505b8a6004815181106117bb576117ba612727565b5b60200260200101518b6003815181106117d7576117d6612727565b5b60200260200101518c6002815181106117f3576117f2612727565b5b6020026020010151611805919061278a565b116118c457838560008151811061181f5761181e612727565b5b6020026020010181815250506118788d8d868e60038151811061184557611844612727565b5b60200260200101518f60028151811061186157611860612727565b5b6020026020010151611873919061278a565b610769565b8560018151811061188c5761188b612727565b5b6020026020010181815250506118a48e8e868561121f565b955060008660ff1611156118c357858597509750505050505050611a0a565b5b8a6005815181106118d8576118d7612727565b5b60200260200101518b6003815181106118f4576118f3612727565b5b60200260200101518c6002815181106119105761190f612727565b5b60200260200101516119229190612756565b106119fc576119748c8e858e60038151811061194157611940612727565b5b60200260200101518f60028151811061195d5761195c612727565b5b602002602001015161196f9190612756565b610769565b8560028151811061198857611987612727565b5b60200260200101818152505082856003815181106119a9576119a8612727565b5b6020026020010181815250506119dc8e8d876002815181106119ce576119cd612727565b5b60200260200101518461121f565b955060008660ff1611156119fb57858597509750505050505050611a0a565b5b600085975097505050505050505b965096945050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611a5d576001600080925092509250611bc1565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611aac9190611e8f565b602060405180830381865afa158015611ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aed919061252f565b905060008103611b0857600260008093509350935050611bc1565b60007301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff1663f41a710d876040518263ffffffff1660e01b8152600401611b579190611e8f565b602060405180830381865afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b98919061252f565b905060008103611bb45760036000809450945094505050611bc1565b6000828294509450945050505b9250925092565b600080600080600080611bda8c61057f565b905060008160ff161115611bfa5780600080955095509550505050611d21565b7301c81c93f38f42497b4cebfa23eeb03f7ccfa8c773ffffffffffffffffffffffffffffffffffffffff166365593d7b8c8c8c8c6040518563ffffffff1660e01b8152600401611c4d9493929190612676565b6040805180830381865afa158015611c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8d91906126e7565b809450819350505060018260ff1603611cc05786881115611cbb5760c8600080955095509550505050611d21565b611ce6565b86881015611cdb5760c8600080955095509550505050611d21565b8289809450819a5050505b611cf38c8c8b600061121f565b905060008160ff161115611d135780600080955095509550505050611d21565b606489849550955095505050505b96509650969350505050565b6040518060a00160405280600081526020016000815260200160008152602001600060ff168152602001600060ff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611da182611d76565b9050919050565b611db181611d96565b8114611dbc57600080fd5b50565b600081359050611dce81611da8565b92915050565b60008060408385031215611deb57611dea611d6c565b5b6000611df985828601611dbf565b9250506020611e0a85828601611dbf565b9150509250929050565b600060ff82169050919050565b611e2a81611e14565b82525050565b6000819050919050565b611e4381611e30565b82525050565b6000606082019050611e5e6000830186611e21565b611e6b6020830185611e3a565b611e786040830184611e3a565b949350505050565b611e8981611d96565b82525050565b6000602082019050611ea46000830184611e80565b92915050565b600060208284031215611ec057611ebf611d6c565b5b6000611ece84828501611dbf565b91505092915050565b6000602082019050611eec6000830184611e21565b92915050565b611efb81611e30565b8114611f0657600080fd5b50565b600081359050611f1881611ef2565b92915050565b60008060008060808587031215611f3857611f37611d6c565b5b6000611f4687828801611dbf565b9450506020611f5787828801611dbf565b9350506040611f6887828801611f09565b9250506060611f7987828801611f09565b91505092959194509250565b6000602082019050611f9a6000830184611e3a565b92915050565b60008060008060008060008060006101208a8c031215611fc357611fc2611d6c565b5b6000611fd18c828d01611dbf565b9950506020611fe28c828d01611dbf565b9850506040611ff38c828d01611dbf565b97505060606120048c828d01611f09565b96505060806120158c828d01611f09565b95505060a06120268c828d01611f09565b94505060c06120378c828d01611f09565b93505060e06120488c828d01611f09565b92505061010061205a8c828d01611f09565b9150509295985092959850929598565b600080600080600080600080610100898b03121561208b5761208a611d6c565b5b60006120998b828c01611dbf565b98505060206120aa8b828c01611dbf565b97505060406120bb8b828c01611dbf565b96505060606120cc8b828c01611f09565b95505060806120dd8b828c01611f09565b94505060a06120ee8b828c01611f09565b93505060c06120ff8b828c01611f09565b92505060e06121108b828c01611f09565b9150509295985092959890939650565b60006080820190506121356000830187611e21565b6121426020830186611e21565b61214f6040830185611e3a565b61215c6060830184611e3a565b95945050505050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6121b38261216a565b810181811067ffffffffffffffff821117156121d2576121d161217b565b5b80604052505050565b60006121e5611d62565b90506121f182826121aa565b919050565b600067ffffffffffffffff8211156122115761221061217b565b5b602082029050602081019050919050565b600080fd5b600061223a612235846121f6565b6121db565b9050808382526020820190506020840283018581111561225d5761225c612222565b5b835b8181101561228657806122728882611f09565b84526020840193505060208101905061225f565b5050509392505050565b600082601f8301126122a5576122a4612165565b5b81356122b5848260208601612227565b91505092915050565b60008060008060008060c087890312156122db576122da611d6c565b5b60006122e989828a01611dbf565b96505060206122fa89828a01611dbf565b955050604061230b89828a01611dbf565b945050606087013567ffffffffffffffff81111561232c5761232b611d71565b5b61233889828a01612290565b935050608087013567ffffffffffffffff81111561235957612358611d71565b5b61236589828a01612290565b92505060a087013567ffffffffffffffff81111561238657612385611d71565b5b61239289828a01612290565b9150509295509295509295565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6123d481611e30565b82525050565b60006123e683836123cb565b60208301905092915050565b6000602082019050919050565b600061240a8261239f565b61241481856123aa565b935061241f836123bb565b8060005b8381101561245057815161243788826123da565b9750612442836123f2565b925050600181019050612423565b5085935050505092915050565b60006040820190506124726000830185611e21565b818103602083015261248481846123ff565b90509392505050565b60008060008060008060c087890312156124aa576124a9611d6c565b5b60006124b889828a01611dbf565b96505060206124c989828a01611dbf565b95505060406124da89828a01611dbf565b94505060606124eb89828a01611f09565b93505060806124fc89828a01611f09565b92505060a061250d89828a01611f09565b9150509295509295509295565b60008151905061252981611ef2565b92915050565b60006020828403121561254557612544611d6c565b5b60006125538482850161251a565b91505092915050565b60008151905061256b81611da8565b92915050565b60008060006060848603121561258a57612589611d6c565b5b60006125988682870161255c565b93505060206125a98682870161251a565b92505060406125ba8682870161251a565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125fe82611e30565b915061260983611e30565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612642576126416125c4565b5b828202905092915050565b60006040820190506126626000830185611e80565b61266f6020830184611e80565b9392505050565b600060808201905061268b6000830187611e80565b6126986020830186611e80565b6126a56040830185611e3a565b6126b26060830184611e3a565b95945050505050565b6126c481611e14565b81146126cf57600080fd5b50565b6000815190506126e1816126bb565b92915050565b600080604083850312156126fe576126fd611d6c565b5b600061270c858286016126d2565b925050602061271d8582860161251a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061276182611e30565b915061276c83611e30565b9250828203905081811115612784576127836125c4565b5b92915050565b600061279582611e30565b91506127a083611e30565b92508282019050808211156127b8576127b76125c4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127f882611e30565b915061280383611e30565b925082612813576128126127be565b5b82820490509291505056fea2646970667358221220124da4f8dd5ed0d07451f1a29e35f670c182a647030d3d0d77bb3f6c0d8a2bda64736f6c63430008100033