ETH Price: $3,256.92 (+2.57%)
Gas: 2 Gwei

Contract

0xE3eFf2b5e9B13910ECb4332c478380C485c37757
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Open Position126722862021-06-20 16:35:511131 days ago1624206951IN
0xE3eFf2b5...485c37757
0.22368181 ETH0.0102353116
Open Position126619522021-06-19 1:45:351133 days ago1624067135IN
0xE3eFf2b5...485c37757
0.3 ETH0.0063970710
Open Position126505772021-06-17 7:21:211135 days ago1623914481IN
0xE3eFf2b5...485c37757
0.5 ETH0.0127943820
Open Position126456812021-06-16 13:12:401135 days ago1623849160IN
0xE3eFf2b5...485c37757
0.3 ETH0.0098158414.3
Open Position126455202021-06-16 12:32:591135 days ago1623846779IN
0xE3eFf2b5...485c37757
0.5 ETH0.0070835110
Open Position126454902021-06-16 12:27:481135 days ago1623846468IN
0xE3eFf2b5...485c37757
0.5 ETH0.0092179213
Open Position126454762021-06-16 12:24:401135 days ago1623846280IN
0xE3eFf2b5...485c37757
0.5 ETH0.0091805313.00000145
Open Position126454392021-06-16 12:16:321135 days ago1623845792IN
0xE3eFf2b5...485c37757
0.5 ETH0.0099993213.00000145
Open Position126454392021-06-16 12:16:321135 days ago1623845792IN
0xE3eFf2b5...485c37757
0.5 ETH0.0089236513
Open Position126454392021-06-16 12:16:321135 days ago1623845792IN
0xE3eFf2b5...485c37757
0.5 ETH0.0081832212
Open Position126454352021-06-16 12:15:421135 days ago1623845742IN
0xE3eFf2b5...485c37757
0.5 ETH0.0082372212
Open Position126453892021-06-16 12:03:461135 days ago1623845026IN
0xE3eFf2b5...485c37757
1 ETH0.0071844210.2
Open Position126453892021-06-16 12:03:461135 days ago1623845026IN
0xE3eFf2b5...485c37757
1.8 ETH0.0070192610
Open Position126453782021-06-16 12:01:141135 days ago1623844874IN
0xE3eFf2b5...485c37757
1.8 ETH0.0077480311
Open Position126453632021-06-16 11:58:251135 days ago1623844705IN
0xE3eFf2b5...485c37757
1.8 ETH0.0077211811
Open Position126407012021-06-15 18:31:281136 days ago1623781888IN
0xE3eFf2b5...485c37757
0.01 ETH0.0179114628
Open Position126386692021-06-15 11:03:311136 days ago1623755011IN
0xE3eFf2b5...485c37757
0.01 ETH0.012793920
Open Position126386432021-06-15 10:58:531136 days ago1623754733IN
0xE3eFf2b5...485c37757
0.01 ETH0.013728420
Open Position126386362021-06-15 10:57:361136 days ago1623754656IN
0xE3eFf2b5...485c37757
0.01 ETH0.0148736220
Open Position126386352021-06-15 10:57:071136 days ago1623754627IN
0xE3eFf2b5...485c37757
0.01 ETH0.0115924817
Open Position126386262021-06-15 10:55:491136 days ago1623754549IN
0xE3eFf2b5...485c37757
0.01 ETH0.0142005420
Open Position126386142021-06-15 10:51:431136 days ago1623754303IN
0xE3eFf2b5...485c37757
0.01 ETH0.0141722420
Open Position126386132021-06-15 10:51:231136 days ago1623754283IN
0xE3eFf2b5...485c37757
0.01 ETH0.0145085420
Open Position126386132021-06-15 10:51:231136 days ago1623754283IN
0xE3eFf2b5...485c37757
0.01 ETH0.0137279820
Open Position126386112021-06-15 10:50:541136 days ago1623754254IN
0xE3eFf2b5...485c37757
0.01 ETH0.0145985420
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
126722862021-06-20 16:35:511131 days ago1624206951
0xE3eFf2b5...485c37757
0.00422948 ETH
126722862021-06-20 16:35:511131 days ago1624206951
0xE3eFf2b5...485c37757
0.11137885 ETH
126722862021-06-20 16:35:511131 days ago1624206951
0xE3eFf2b5...485c37757
0.10807347 ETH
126619522021-06-19 1:45:351133 days ago1624067135
0xE3eFf2b5...485c37757
0.00814534 ETH
126619522021-06-19 1:45:351133 days ago1624067135
0xE3eFf2b5...485c37757
0.14919214 ETH
126619522021-06-19 1:45:351133 days ago1624067135
0xE3eFf2b5...485c37757
0.14266251 ETH
126505772021-06-17 7:21:211135 days ago1623914481
0xE3eFf2b5...485c37757
0.03371919 ETH
126505772021-06-17 7:21:211135 days ago1623914481
0xE3eFf2b5...485c37757
0.24577969 ETH
126505772021-06-17 7:21:211135 days ago1623914481
0xE3eFf2b5...485c37757
0.22050111 ETH
126456812021-06-16 13:12:401135 days ago1623849160
0xE3eFf2b5...485c37757
0.0006885 ETH
126456812021-06-16 13:12:401135 days ago1623849160
0xE3eFf2b5...485c37757
0.14954962 ETH
126456812021-06-16 13:12:401135 days ago1623849160
0xE3eFf2b5...485c37757
0.14976187 ETH
126455202021-06-16 12:32:591135 days ago1623846779
0xE3eFf2b5...485c37757
0.00210474 ETH
126455202021-06-16 12:32:591135 days ago1623846779
0xE3eFf2b5...485c37757
0.24857465 ETH
126455202021-06-16 12:32:591135 days ago1623846779
0xE3eFf2b5...485c37757
0.24932059 ETH
126454902021-06-16 12:27:481135 days ago1623846468
0xE3eFf2b5...485c37757
0.04583939 ETH
126454902021-06-16 12:27:481135 days ago1623846468
0xE3eFf2b5...485c37757
0.24317864 ETH
126454902021-06-16 12:27:481135 days ago1623846468
0xE3eFf2b5...485c37757
0.21098196 ETH
126454762021-06-16 12:24:401135 days ago1623846280
0xE3eFf2b5...485c37757
0.01521727 ETH
126454762021-06-16 12:24:401135 days ago1623846280
0xE3eFf2b5...485c37757
0.24849964 ETH
126454762021-06-16 12:24:401135 days ago1623846280
0xE3eFf2b5...485c37757
0.23628308 ETH
126454392021-06-16 12:16:321135 days ago1623845792
0xE3eFf2b5...485c37757
0.25056551 ETH
126454392021-06-16 12:16:321135 days ago1623845792
0xE3eFf2b5...485c37757
0.24933574 ETH
126454392021-06-16 12:16:321135 days ago1623845792
0xE3eFf2b5...485c37757
0.0010679 ETH
126454392021-06-16 12:16:321135 days ago1623845792
0xE3eFf2b5...485c37757
0.24924959 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FarmingPresto

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-15
*/

// File: contracts\presto\PrestoData.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;

struct PrestoOperation {

    address inputTokenAddress;
    uint256 inputTokenAmount;

    address ammPlugin;
    address[] liquidityPoolAddresses;
    address[] swapPath;
    bool enterInETH;
    bool exitInETH;

    address[] receivers;
    uint256[] receiversPercentages;
}

// File: contracts\presto\IPresto.sol

//SPDX_License_Identifier: MIT
pragma solidity ^0.7.6;
pragma abicoder v2;


interface IPresto {

    function ONE_HUNDRED() external view returns (uint256);
    function doubleProxy() external view returns (address);
    function feePercentage() external view returns (uint256);

    function feePercentageInfo() external view returns (uint256, address);

    function setDoubleProxy(address _doubleProxy) external;

    function setFeePercentage(uint256 _feePercentage) external;

    function execute(PrestoOperation[] memory operations) external payable;
}

// File: contracts\presto\util\IERC20.sol

//SPDX_License_Identifier: MIT
pragma solidity ^0.7.6;

interface IERC20 {
    function totalSupply() external view returns(uint256);
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    function decimals() external view returns (uint8);
}

// File: contracts\amm-aggregator\common\AMMData.sol

//SPDX_License_Identifier: MIT
pragma solidity ^0.7.6;

struct LiquidityPoolData {
    address liquidityPoolAddress;
    uint256 amount;
    address tokenAddress;
    bool amountIsLiquidityPool;
    bool involvingETH;
    address receiver;
}

struct SwapData {
    bool enterInETH;
    bool exitInETH;
    address[] liquidityPoolAddresses;
    address[] path;
    address inputToken;
    uint256 amount;
    address receiver;
}

// File: contracts\amm-aggregator\common\IAMM.sol

//SPDX_License_Identifier: MIT
pragma solidity ^0.7.6;
//pragma abicoder v2;


interface IAMM {

    event NewLiquidityPoolAddress(address indexed);

    function info() external view returns(string memory name, uint256 version);

    function data() external view returns(address ethereumAddress, uint256 maxTokensPerLiquidityPool, bool hasUniqueLiquidityPools);

    function balanceOf(address liquidityPoolAddress, address owner) external view returns(uint256, uint256[] memory, address[] memory);

    function byLiquidityPool(address liquidityPoolAddress) external view returns(uint256, uint256[] memory, address[] memory);

    function byTokens(address[] calldata liquidityPoolTokens) external view returns(uint256, uint256[] memory, address, address[] memory);

    function byPercentage(address liquidityPoolAddress, uint256 numerator, uint256 denominator) external view returns (uint256, uint256[] memory, address[] memory);

    function byLiquidityPoolAmount(address liquidityPoolAddress, uint256 liquidityPoolAmount) external view returns(uint256[] memory, address[] memory);

    function byTokenAmount(address liquidityPoolAddress, address tokenAddress, uint256 tokenAmount) external view returns(uint256, uint256[] memory, address[] memory);

    function createLiquidityPoolAndAddLiquidity(address[] calldata tokenAddresses, uint256[] calldata amounts, bool involvingETH, address receiver) external payable returns(uint256, uint256[] memory, address, address[] memory);

    function addLiquidity(LiquidityPoolData calldata data) external payable returns(uint256, uint256[] memory, address[] memory);
    function addLiquidityBatch(LiquidityPoolData[] calldata data) external payable returns(uint256[] memory, uint256[][] memory, address[][] memory);

    function removeLiquidity(LiquidityPoolData calldata data) external returns(uint256, uint256[] memory, address[] memory);
    function removeLiquidityBatch(LiquidityPoolData[] calldata data) external returns(uint256[] memory, uint256[][] memory, address[][] memory);

    function getSwapOutput(address tokenAddress, uint256 tokenAmount, address[] calldata, address[] calldata path) view external returns(uint256[] memory);

    function swapLiquidity(SwapData calldata data) external payable returns(uint256);
    function swapLiquidityBatch(SwapData[] calldata data) external payable returns(uint256[] memory);
}

// File: contracts\farming\FarmData.sol

//SPDX_License_Identifier: MIT
pragma solidity ^0.7.6;

struct FarmingPositionRequest {
    uint256 setupIndex; // index of the chosen setup.
    uint256 amount; // amount of main token or liquidity pool token.
    bool amountIsLiquidityPool; //true if user wants to directly share the liquidity pool token amount, false to add liquidity to AMM
    address positionOwner; // position extension or address(0) [msg.sender].
}

struct FarmingSetupConfiguration {
    bool add; // true if we're adding a new setup, false we're updating it.
    bool disable;
    uint256 index; // index of the setup we're updating.
    FarmingSetupInfo info; // data of the new or updated setup
}

struct FarmingSetupInfo {
    bool free; // if the setup is a free farming setup or a locked one.
    uint256 blockDuration; // duration of setup
    uint256 startBlock; // optional start block used for the delayed activation of the first setup
    uint256 originalRewardPerBlock;
    uint256 minStakeable; // minimum amount of staking tokens.
    uint256 maxStakeable; // maximum amount stakeable in the setup (used only if free is false).
    uint256 renewTimes; // if the setup is renewable or if it's one time.
    address ammPlugin; // amm plugin address used for this setup (eg. uniswap amm plugin address).
    address liquidityPoolTokenAddress; // address of the liquidity pool token
    address mainTokenAddress; // eg. buidl address.
    address ethereumAddress;
    bool involvingETH; // if the setup involves ETH or not.
    uint256 penaltyFee; // fee paid when the user exits a still active locked farming setup (used only if free is false).
    uint256 setupsCount; // number of setups created by this info.
    uint256 lastSetupIndex; // index of last setup;
}

struct FarmingSetup {
    uint256 infoIndex; // setup info
    bool active; // if the setup is active or not.
    uint256 startBlock; // farming setup start block.
    uint256 endBlock; // farming setup end block.
    uint256 lastUpdateBlock; // number of the block where an update was triggered.
    uint256 objectId; // items object id for the liquidity pool token (used only if free is false).
    uint256 rewardPerBlock; // farming setup reward per single block.
    uint256 totalSupply; // If free it's the LP amount, if locked is currentlyStaked.
}

struct FarmingPosition {
    address uniqueOwner; // address representing the owner of the position.
    uint256 setupIndex; // the setup index related to this position.
    uint256 creationBlock; // block when this position was created.
    uint256 liquidityPoolTokenAmount; // amount of liquidity pool token in the position.
    uint256 mainTokenAmount; // amount of main token in the position (used only if free is false).
    uint256 reward; // position reward (used only if free is false).
    uint256 lockedRewardPerBlock; // position locked reward per block (used only if free is false).
}

// File: contracts\farming\IFarmMain.sol

//SPDX_License_Identifier: MIT
pragma solidity ^0.7.6;
//pragma abicoder v2;


interface IFarmMain {

    function ONE_HUNDRED() external view returns(uint256);
    function _rewardTokenAddress() external view returns(address);
    function position(uint256 positionId) external view returns (FarmingPosition memory);
    function setups() external view returns (FarmingSetup[] memory);
    function setup(uint256 setupIndex) external view returns (FarmingSetup memory, FarmingSetupInfo memory);
    function setFarmingSetups(FarmingSetupConfiguration[] memory farmingSetups) external;
    function openPosition(FarmingPositionRequest calldata request) external payable returns(uint256 positionId);
    function addLiquidity(uint256 positionId, FarmingPositionRequest calldata request) external payable;
}

// File: contracts\presto\util\IERC1155.sol

// SPDX_License_Identifier: MIT

pragma solidity ^0.7.6;

interface IERC1155 {

    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);

    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    event URI(string value, uint256 indexed id);

    function balanceOf(address account, uint256 id) external view returns (uint256);

    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);

    function setApprovalForAll(address operator, bool approved) external;

    function isApprovedForAll(address account, address operator) external view returns (bool);

    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;

    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}

// File: contracts\presto\util\IEthItemInteroperableInterface.sol

// SPDX_License_Identifier: MIT

pragma solidity ^0.7.6;


interface IEthItemInteroperableInterface is IERC20 {

    function mainInterface() external view returns (address);

    function objectId() external view returns (uint256);

    function mint(address owner, uint256 amount) external;

    function burn(address owner, uint256 amount) external;

    function permitNonce(address sender) external view returns(uint256);

    function permit(address owner, address spender, uint value, uint8 v, bytes32 r, bytes32 s) external;

    function interoperableInterfaceVersion() external pure returns(uint256 ethItemInteroperableInterfaceVersion);
}

// File: contracts\presto\util\IEthItem.sol

// SPDX_License_Identifier: MIT

pragma solidity ^0.7.6;



interface IEthItem is IERC1155 {

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function totalSupply(uint256 objectId) external view returns (uint256);

    function name(uint256 objectId) external view returns (string memory);

    function symbol(uint256 objectId) external view returns (string memory);

    function decimals(uint256 objectId) external view returns (uint256);

    function uri(uint256 objectId) external view returns (string memory);

    function mainInterfaceVersion() external pure returns(uint256 ethItemInteroperableVersion);

    function toInteroperableInterfaceAmount(uint256 objectId, uint256 ethItemAmount) external view returns (uint256 interoperableInterfaceAmount);

    function toMainInterfaceAmount(uint256 objectId, uint256 erc20WrapperAmount) external view returns (uint256 mainInterfaceAmount);

    function interoperableInterfaceModel() external view returns (address, uint256);

    function asInteroperable(uint256 objectId) external view returns (IEthItemInteroperableInterface);

    function emitTransferSingleEvent(address sender, address from, address to, uint256 objectId, uint256 amount) external;

    function mint(uint256 amount, string calldata partialUri)
        external
        returns (uint256, address);

    function burn(
        uint256 objectId,
        uint256 amount
    ) external;

    function burnBatch(
        uint256[] calldata objectIds,
        uint256[] calldata amounts
    ) external;
}

// File: contracts\presto\util\INativeV1.sol

//SPDX_License_Identifier: MIT

pragma solidity ^0.7.6;


interface INativeV1 is IEthItem {

    function init(string calldata name, string calldata symbol, bool hasDecimals, string calldata collectionUri, address extensionAddress, bytes calldata extensionInitPayload) external returns(bytes memory extensionInitCallResponse);

    function extension() external view returns (address extensionAddress);

    function canMint(address operator) external view returns (bool result);

    function isEditable(uint256 objectId) external view returns (bool result);

    function releaseExtension() external;

    function uri() external view returns (string memory);

    function decimals() external view returns (uint256);

    function mint(uint256 amount, string calldata tokenName, string calldata tokenSymbol, string calldata objectUri, bool editable) external returns (uint256 objectId, address tokenAddress);

    function mint(uint256 amount, string calldata tokenName, string calldata tokenSymbol, string calldata objectUri) external returns (uint256 objectId, address tokenAddress);

    function mint(uint256 objectId, uint256 amount) external;

    function makeReadOnly(uint256 objectId) external;

    function setUri(string calldata newUri) external;

    function setUri(uint256 objectId, string calldata newUri) external;
}

// File: contracts\presto\verticalizations\FarmingPresto.sol

//SPDX_License_Identifier: MIT
pragma solidity ^0.7.6;
//pragma abicoder v2;






contract FarmingPresto {

    mapping(address => uint256) private _tokenIndex;
    address[] private _tokensToTransfer;
    uint256[] private _tokenAmounts;
    PrestoOperation[] private _operations;

    receive() external payable {
    }

    function openPosition(
        address prestoAddress,
        PrestoOperation[] memory operations,
        address farmMainAddress,
        FarmingPositionRequest memory request
    ) public payable returns(uint256 positionId) {
        request.positionOwner = request.positionOwner != address(0) ? request.positionOwner : msg.sender;
        uint256 eth = _transferToMeAndCheckAllowance(operations, prestoAddress);
        IPresto(prestoAddress).execute{value : eth}(_operations);
        IFarmMain farmMain = IFarmMain(farmMainAddress);
        (address[] memory tokenAddresses, uint256 ethereumValue) = _calculateAmountsAndApprove(farmMain, request.setupIndex, request.amount);
        positionId = farmMain.openPosition{value : ethereumValue}(request);
        _flushAndClear(tokenAddresses, msg.sender);
    }

    function _calculateAmountsAndApprove(IFarmMain farmMain, uint256 setupIndex, uint256 requestAmount) private returns(address[] memory tokenAddresses, uint256 ethereumValue) {
        (, FarmingSetupInfo memory setupInfo) = farmMain.setup(setupIndex);
        uint256[] memory tokensAmounts;
        (, tokensAmounts, tokenAddresses) = IAMM(setupInfo.ammPlugin).byTokenAmount(setupInfo.liquidityPoolTokenAddress, setupInfo.mainTokenAddress, requestAmount);
        for(uint256 i = 0; i < tokenAddresses.length; i++) {
            if(setupInfo.involvingETH && tokenAddresses[i] == setupInfo.ethereumAddress) {
                ethereumValue = tokensAmounts[i];
            }
            if(tokenAddresses[i] != address(0)) {
                _safeApprove(tokenAddresses[i], address(farmMain), tokensAmounts[i]);
            }
        }
    }

    function _flushAndClear(address[] memory tokenAddresses, address receiver) private {
        for(uint256 i = 0; i < tokenAddresses.length; i++) {
            if(_tokensToTransfer.length == 0 || _tokensToTransfer[_tokenIndex[tokenAddresses[i]]] != tokenAddresses[i]) {
                _safeTransfer(tokenAddresses[i], receiver, _balanceOf(tokenAddresses[i]));
            }
        }
        if(_tokensToTransfer.length == 0 || _tokensToTransfer[_tokenIndex[address(0)]] != address(0)) {
            _safeTransfer(address(0), receiver, address(this).balance);
        }
        _flushAndClear(receiver);
    }

    function _transferToMeAndCheckAllowance(PrestoOperation[] memory operations, address operator) private returns (uint256 eth) {
        eth = _collectTokensAndCheckAllowance(operations, operator);
        for(uint256 i = 0; i < _tokensToTransfer.length; i++) {
            if(_tokensToTransfer[i] == address(0)) {
                require(msg.value >= _tokenAmounts[i], "Incorrect ETH value");
            } else {
                _safeTransferFrom(_tokensToTransfer[i], msg.sender, address(this), _tokenAmounts[i]);
            }
        }
    }

    function _collectTokensAndCheckAllowance(PrestoOperation[] memory operations, address operator) private returns (uint256 eth) {
        for(uint256 i = 0; i < operations.length; i++) {
            PrestoOperation memory operation = operations[i];
            require(operation.ammPlugin == address(0) || operation.liquidityPoolAddresses.length > 0, "AddLiquidity not allowed"); 
            _collectTokenData(operation.ammPlugin != address(0) && operation.enterInETH ? address(0) : operation.inputTokenAddress, operation.inputTokenAmount);
            if(operation.ammPlugin != address(0)) {
                _operations.push(operation);
                if(operation.inputTokenAddress == address(0) || operation.enterInETH) {
                    eth += operation.inputTokenAmount;
                }
            }
        }
        for(uint256 i = 0 ; i < _tokensToTransfer.length; i++) {
            if(_tokensToTransfer[i] != address(0)) {
                _safeApprove(_tokensToTransfer[i], operator, _tokenAmounts[i]);
            }
        }
    }

    function _collectTokenData(address inputTokenAddress, uint256 inputTokenAmount) private {
        if(inputTokenAmount == 0) {
            return;
        }

        uint256 position = _tokenIndex[inputTokenAddress];

        if(_tokensToTransfer.length == 0 || _tokensToTransfer[position] != inputTokenAddress) {
            _tokenIndex[inputTokenAddress] = (position = _tokensToTransfer.length);
            _tokensToTransfer.push(inputTokenAddress);
            _tokenAmounts.push(0);
        }
        _tokenAmounts[position] = _tokenAmounts[position] + inputTokenAmount;
    }

    function _flushAndClear(address receiver) private {
        for(uint256 i = 0; i < _tokensToTransfer.length; i++) {
            _safeTransfer(_tokensToTransfer[i], receiver, _balanceOf(_tokensToTransfer[i]));
            delete _tokenIndex[_tokensToTransfer[i]];
        }
        delete _tokensToTransfer;
        delete _tokenAmounts;
        delete _operations;
    }

    function _balanceOf(address tokenAddress) private view returns(uint256) {
        if(tokenAddress == address(0)) {
            return address(this).balance;
        }
        return IERC20(tokenAddress).balanceOf(address(this));
    }

    function _safeApprove(address erc20TokenAddress, address to, uint256 value) internal {
        bytes memory returnData = _call(erc20TokenAddress, abi.encodeWithSelector(IERC20(erc20TokenAddress).approve.selector, to, value));
        require(returnData.length == 0 || abi.decode(returnData, (bool)), 'APPROVE_FAILED');
    }

    function _safeTransfer(address erc20TokenAddress, address to, uint256 value) private {
        if(value == 0) {
            return;
        }
        if(erc20TokenAddress == address(0)) {
            (bool result,) = to.call{value:value}("");
            require(result, "ETH transfer failed");
            return;
        }
        bytes memory returnData = _call(erc20TokenAddress, abi.encodeWithSelector(IERC20(erc20TokenAddress).transfer.selector, to, value));
        require(returnData.length == 0 || abi.decode(returnData, (bool)), 'TRANSFER_FAILED');
    }

    function _safeTransferFrom(address erc20TokenAddress, address from, address to, uint256 value) internal {
        bytes memory returnData = _call(erc20TokenAddress, abi.encodeWithSelector(IERC20(erc20TokenAddress).transferFrom.selector, from, to, value));
        require(returnData.length == 0 || abi.decode(returnData, (bool)), 'TRANSFERFROM_FAILED');
    }

    function _call(address location, bytes memory payload) private returns(bytes memory returnData) {
        assembly {
            let result := call(gas(), location, 0, add(payload, 0x20), mload(payload), 0, 0)
            let size := returndatasize()
            returnData := mload(0x40)
            mstore(returnData, size)
            let returnDataPayloadStart := add(returnData, 0x20)
            returndatacopy(returnDataPayloadStart, 0, size)
            mstore(0x40, add(returnDataPayloadStart, size))
            switch result case 0 {revert(returnDataPayloadStart, size)}
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"prestoAddress","type":"address"},{"components":[{"internalType":"address","name":"inputTokenAddress","type":"address"},{"internalType":"uint256","name":"inputTokenAmount","type":"uint256"},{"internalType":"address","name":"ammPlugin","type":"address"},{"internalType":"address[]","name":"liquidityPoolAddresses","type":"address[]"},{"internalType":"address[]","name":"swapPath","type":"address[]"},{"internalType":"bool","name":"enterInETH","type":"bool"},{"internalType":"bool","name":"exitInETH","type":"bool"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"receiversPercentages","type":"uint256[]"}],"internalType":"struct PrestoOperation[]","name":"operations","type":"tuple[]"},{"internalType":"address","name":"farmMainAddress","type":"address"},{"components":[{"internalType":"uint256","name":"setupIndex","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"amountIsLiquidityPool","type":"bool"},{"internalType":"address","name":"positionOwner","type":"address"}],"internalType":"struct FarmingPositionRequest","name":"request","type":"tuple"}],"name":"openPosition","outputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50611923806100206000396000f3fe6080604052600436106100225760003560e01c80636aeba4f11461002e57610029565b3661002957005b600080fd5b61004161003c3660046111c5565b610057565b60405161004e9190611873565b60405180910390f35b60608101516000906001600160a01b03166100725733610078565b81606001515b6001600160a01b03166060830152600061009285876101aa565b9050856001600160a01b031663b1445b6d8260036040518363ffffffff1660e01b81526004016100c29190611614565b6000604051808303818588803b1580156100db57600080fd5b505af11580156100ef573d6000803e3d6000fd5b5050505050600084905060008061010f8387600001518860200151610299565b91509150826001600160a01b031663c8df9d3182886040518363ffffffff1660e01b8152600401610140919061183d565b6020604051808303818588803b15801561015957600080fd5b505af115801561016d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610192919061145a565b945061019e823361048c565b50505050949350505050565b60006101b683836105dd565b905060005b6001548110156102925760006001600160a01b0316600182815481106101dd57fe5b6000918252602090912001546001600160a01b0316141561023d576002818154811061020557fe5b90600052602060002001543410156102385760405162461bcd60e51b815260040161022f90611810565b60405180910390fd5b61028a565b61028a6001828154811061024d57fe5b9060005260206000200160009054906101000a90046001600160a01b031633306002858154811061027a57fe5b90600052602060002001546108d1565b6001016101bb565b5092915050565b6060600080856001600160a01b0316634313b9e5866040518263ffffffff1660e01b81526004016102ca9190611873565b6102e06040518083038186803b1580156102e357600080fd5b505afa1580156102f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061031b91906113ab565b91505060608160e001516001600160a01b03166379d16e0d836101000151846101200151886040518463ffffffff1660e01b815260040161035e939291906115d7565b60006040518083038186803b15801561037657600080fd5b505afa15801561038a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103b29190810190611472565b95509150600090505b84518110156104815782610160015180156103ff57508261014001516001600160a01b03168582815181106103ec57fe5b60200260200101516001600160a01b0316145b1561041b5781818151811061041057fe5b602002602001015193505b60006001600160a01b031685828151811061043257fe5b60200260200101516001600160a01b0316146104795761047985828151811061045757fe5b60200260200101518984848151811061046c57fe5b602002602001015161096f565b6001016103bb565b505050935093915050565b60005b825181101561056157600154158061051b57508281815181106104ae57fe5b60200260200101516001600160a01b031660016000808685815181106104d057fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020548154811061050357fe5b6000918252602090912001546001600160a01b031614155b156105595761055983828151811061052f57fe5b60200260200101518361055486858151811061054757fe5b60200260200101516109d3565b610a6e565b60010161048f565b5060015415806105bf5750600080805260208190527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5546001805490919081106105a757fe5b6000918252602090912001546001600160a01b031614155b156105d0576105d060008247610a6e565b6105d981610b6b565b5050565b6000805b835181101561083d5760008482815181106105f857fe5b6020026020010151905060006001600160a01b031681604001516001600160a01b0316148061062c57506000816060015151115b6106485760405162461bcd60e51b815260040161022f90611784565b6040810151610681906001600160a01b03161580159061066957508160a001515b610674578151610677565b60005b8260200151610c36565b60408101516001600160a01b031615610834576003805460018101825560009190915281517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b600890920291820180546001600160a01b03199081166001600160a01b039384161782556020808601517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c86015560408601517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d8601805490931694169390931790556060840151805185949293610783937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e01920190610d9f565b506080820151805161079f916004840191602090910190610d9f565b5060a082015160058201805460c085015115156101000261ff001993151560ff19909216919091179290921691909117905560e082015180516107ec916006840191602090910190610d9f565b506101008201518051610809916007840191602090910190610e04565b505081516001600160a01b03161590508061082557508060a001515b15610834578060200151830192505b506001016105e1565b5060005b6001548110156102925760006001600160a01b03166001828154811061086357fe5b6000918252602090912001546001600160a01b0316146108c9576108c96001828154811061088d57fe5b9060005260206000200160009054906101000a90046001600160a01b031684600284815481106108b957fe5b906000526020600020015461096f565b600101610841565b600061092b856323b872dd60e01b8686866040516024016108f4939291906115d7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610d5d565b905080516000148061094c57508080602001905181019061094c9190611388565b6109685760405162461bcd60e51b815260040161022f9061172e565b5050505050565b60006109908463095ea7b360e01b85856040516024016108f49291906115fb565b90508051600014806109b15750808060200190518101906109b19190611388565b6109cd5760405162461bcd60e51b815260040161022f906117e8565b50505050565b60006001600160a01b0382166109ea575047610a69565b6040516370a0823160e01b81526001600160a01b038316906370a0823190610a169030906004016115c3565b60206040518083038186803b158015610a2e57600080fd5b505afa158015610a42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a66919061145a565b90505b919050565b80610a7857610b66565b6001600160a01b038316610b08576000826001600160a01b031682604051610a9f906115c0565b60006040518083038185875af1925050503d8060008114610adc576040519150601f19603f3d011682016040523d82523d6000602084013e610ae1565b606091505b5050905080610b025760405162461bcd60e51b815260040161022f906117bb565b50610b66565b6000610b298463a9059cbb60e01b85856040516024016108f49291906115fb565b9050805160001480610b4a575080806020019051810190610b4a9190611388565b6109cd5760405162461bcd60e51b815260040161022f9061175b565b505050565b60005b600154811015610c0e57610bd160018281548110610b8857fe5b9060005260206000200160009054906101000a90046001600160a01b03168361055460018581548110610bb757fe5b6000918252602090912001546001600160a01b03166109d3565b60008060018381548110610be157fe5b60009182526020808320909101546001600160a01b03168352820192909252604001812055600101610b6e565b50610c1b60016000610e3f565b610c2760026000610e3f565b610c3360036000610e5d565b50565b80610c40576105d9565b6001600160a01b0382166000908152602081905260409020546001541580610c925750826001600160a01b031660018281548110610c7a57fe5b6000918252602090912001546001600160a01b031614155b15610d255750600180546001600160a01b038416600081815260208190526040812083905582840184557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6830180546001600160a01b03191690921790915560028054938401815581527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909201919091555b8160028281548110610d3357fe5b90600052602060002001540160028281548110610d4c57fe5b600091825260209091200155505050565b60606000808351602085016000875af13d604051925080835260208301816000823e808201604052828015610d9157610d95565b8282fd5b5050505092915050565b828054828255906000526020600020908101928215610df4579160200282015b82811115610df457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190610dbf565b50610e00929150610e7e565b5090565b828054828255906000526020600020908101928215610df4579160200282015b82811115610df4578251825591602001919060010190610e24565b5080546000825590600052602060002090810190610c339190610e7e565b5080546000825560080290600052602060002090810190610c339190610e93565b5b80821115610e005760008155600101610e7f565b80821115610e005780546001600160a01b03199081168255600060018301819055600283018054909216909155610ecd6003830182610e3f565b610edb600483016000610e3f565b60058201805461ffff19169055610ef6600683016000610e3f565b610f04600783016000610e3f565b50600801610e93565b8035610a69816118ca565b8051610a69816118ca565b600082601f830112610f33578081fd5b81356020610f48610f43836118a0565b61187c565b8281528181019085830183850287018401881015610f64578586fd5b855b85811015610f8b578135610f79816118ca565b84529284019290840190600101610f66565b5090979650505050505050565b600082601f830112610fa8578081fd5b81516020610fb8610f43836118a0565b8281528181019085830183850287018401881015610fd4578586fd5b855b85811015610f8b578151610fe9816118ca565b84529284019290840190600101610fd6565b600082601f83011261100b578081fd5b8135602061101b610f43836118a0565b8281528181019085830183850287018401881015611037578586fd5b855b85811015610f8b57813584529284019290840190600101611039565b8035610a69816118df565b8051610a69816118df565b60006080828403121561107c578081fd5b6040516080810181811067ffffffffffffffff8211171561109957fe5b8060405250809150823581526020830135602082015260408301356110bd816118df565b604082015260608301356110d0816118ca565b6060919091015292915050565b60006101e08083850312156110f0578182fd5b6110f98161187c565b91505061110582611060565b81526020820151602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c082015160c082015261114f60e08301610f18565b60e0820152610100611162818401610f18565b90820152610120611174838201610f18565b90820152610140611186838201610f18565b90820152610160611198838201611060565b9082015261018082810151908201526101a080830151908201526101c09182015191810191909152919050565b60008060008060e085870312156111da578384fd5b6111e485356118ca565b84359350602085013567ffffffffffffffff80821115611202578485fd5b818701915087601f830112611215578485fd5b611222610f4383356118a0565b82358152602080820191908401875b85358110156113595781358601610120818e03601f1901121561125257898afd5b61125d61012061187c565b61126960208301610f0d565b81526040820135602082015261128160608301610f0d565b6040820152608082013587811115611297578b8cfd5b6112a68f602083860101610f23565b60608301525060a0820135878111156112bd578b8cfd5b6112cc8f602083860101610f23565b6080830152506112de60c08301611055565b60a08201526112ef60e08301611055565b60c082015261010082013587811115611306578b8cfd5b6113158f602083860101610f23565b60e0830152506101208201358781111561132d578b8cfd5b61133c8f602083860101610ffb565b610100830152508552506020938401939190910190600101611231565b50508096505050505061136e60408601610f0d565b915061137d866060870161106b565b905092959194509250565b600060208284031215611399578081fd5b81516113a4816118df565b9392505050565b6000808284036102e08112156113bf578283fd5b610100808212156113ce578384fd5b604051915080820182811067ffffffffffffffff821117156113ec57fe5b604052845182526113ff60208601611060565b602083015260408501516040830152606085015160608301526080850151608083015260a085015160a083015260c085015160c083015260e085015160e083015281935061144f868287016110dd565b925050509250929050565b60006020828403121561146b578081fd5b5051919050565b600080600060608486031215611486578081fd5b8351925060208085015167ffffffffffffffff808211156114a5578384fd5b818701915087601f8301126114b8578384fd5b81516114c6610f43826118a0565b81815284810190848601868402860187018c10156114e2578788fd5b8795505b838610156115045780518352600195909501949186019186016114e6565b5060408a0151909750945050508083111561151d578384fd5b505061152b86828701610f98565b9150509250925092565b6001600160a01b03169052565b6000815480845260208085019450838352808320835b8381101561157d5781546001600160a01b031687529582019560019182019101611558565b509495945050505050565b6000815480845260208085019450838352808320835b8381101561157d5781548752958201956001918201910161159e565b15159052565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6000602080830181845280855480835260409250828601915082848202870101878652848620865b8381101561172057603f198984030185526101206116638461165e85546118be565b611535565b60018301548885015261167960028401546118be565b61168588860182611535565b5080606085015261169b81850160038501611542565b905083810360808501526116b28160048501611542565b9050600583015460ff6116ca60a087018284166115ba565b60086116dd60c088018385841c166115ba565b86840360e08801526116f28460068801611542565b935086840361010088015261170a8460078801611588565b988b01989650949094019350505060010161163c565b509098975050505050505050565b6020808252601390820152721514905394d19154919493d357d19052531151606a1b604082015260600190565b6020808252600f908201526e1514905394d1915497d19052531151608a1b604082015260600190565b60208082526018908201527f4164644c6971756964697479206e6f7420616c6c6f7765640000000000000000604082015260600190565b602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b6020808252600e908201526d1054141493d59157d1905253115160921b604082015260600190565b602080825260139082015272496e636f7272656374204554482076616c756560681b604082015260600190565b81518152602080830151908201526040808301511515908201526060918201516001600160a01b03169181019190915260800190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561189857fe5b604052919050565b600067ffffffffffffffff8211156118b457fe5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114610c3357600080fd5b8015158114610c3357600080fdfea2646970667358221220d4dd3ef96ca848b6d3b7ec26c5a8845fb2ea81c8033997cab9c786ca917420d564736f6c63430007060033

Deployed Bytecode

0x6080604052600436106100225760003560e01c80636aeba4f11461002e57610029565b3661002957005b600080fd5b61004161003c3660046111c5565b610057565b60405161004e9190611873565b60405180910390f35b60608101516000906001600160a01b03166100725733610078565b81606001515b6001600160a01b03166060830152600061009285876101aa565b9050856001600160a01b031663b1445b6d8260036040518363ffffffff1660e01b81526004016100c29190611614565b6000604051808303818588803b1580156100db57600080fd5b505af11580156100ef573d6000803e3d6000fd5b5050505050600084905060008061010f8387600001518860200151610299565b91509150826001600160a01b031663c8df9d3182886040518363ffffffff1660e01b8152600401610140919061183d565b6020604051808303818588803b15801561015957600080fd5b505af115801561016d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610192919061145a565b945061019e823361048c565b50505050949350505050565b60006101b683836105dd565b905060005b6001548110156102925760006001600160a01b0316600182815481106101dd57fe5b6000918252602090912001546001600160a01b0316141561023d576002818154811061020557fe5b90600052602060002001543410156102385760405162461bcd60e51b815260040161022f90611810565b60405180910390fd5b61028a565b61028a6001828154811061024d57fe5b9060005260206000200160009054906101000a90046001600160a01b031633306002858154811061027a57fe5b90600052602060002001546108d1565b6001016101bb565b5092915050565b6060600080856001600160a01b0316634313b9e5866040518263ffffffff1660e01b81526004016102ca9190611873565b6102e06040518083038186803b1580156102e357600080fd5b505afa1580156102f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061031b91906113ab565b91505060608160e001516001600160a01b03166379d16e0d836101000151846101200151886040518463ffffffff1660e01b815260040161035e939291906115d7565b60006040518083038186803b15801561037657600080fd5b505afa15801561038a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103b29190810190611472565b95509150600090505b84518110156104815782610160015180156103ff57508261014001516001600160a01b03168582815181106103ec57fe5b60200260200101516001600160a01b0316145b1561041b5781818151811061041057fe5b602002602001015193505b60006001600160a01b031685828151811061043257fe5b60200260200101516001600160a01b0316146104795761047985828151811061045757fe5b60200260200101518984848151811061046c57fe5b602002602001015161096f565b6001016103bb565b505050935093915050565b60005b825181101561056157600154158061051b57508281815181106104ae57fe5b60200260200101516001600160a01b031660016000808685815181106104d057fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020548154811061050357fe5b6000918252602090912001546001600160a01b031614155b156105595761055983828151811061052f57fe5b60200260200101518361055486858151811061054757fe5b60200260200101516109d3565b610a6e565b60010161048f565b5060015415806105bf5750600080805260208190527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5546001805490919081106105a757fe5b6000918252602090912001546001600160a01b031614155b156105d0576105d060008247610a6e565b6105d981610b6b565b5050565b6000805b835181101561083d5760008482815181106105f857fe5b6020026020010151905060006001600160a01b031681604001516001600160a01b0316148061062c57506000816060015151115b6106485760405162461bcd60e51b815260040161022f90611784565b6040810151610681906001600160a01b03161580159061066957508160a001515b610674578151610677565b60005b8260200151610c36565b60408101516001600160a01b031615610834576003805460018101825560009190915281517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b600890920291820180546001600160a01b03199081166001600160a01b039384161782556020808601517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c86015560408601517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d8601805490931694169390931790556060840151805185949293610783937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e01920190610d9f565b506080820151805161079f916004840191602090910190610d9f565b5060a082015160058201805460c085015115156101000261ff001993151560ff19909216919091179290921691909117905560e082015180516107ec916006840191602090910190610d9f565b506101008201518051610809916007840191602090910190610e04565b505081516001600160a01b03161590508061082557508060a001515b15610834578060200151830192505b506001016105e1565b5060005b6001548110156102925760006001600160a01b03166001828154811061086357fe5b6000918252602090912001546001600160a01b0316146108c9576108c96001828154811061088d57fe5b9060005260206000200160009054906101000a90046001600160a01b031684600284815481106108b957fe5b906000526020600020015461096f565b600101610841565b600061092b856323b872dd60e01b8686866040516024016108f4939291906115d7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610d5d565b905080516000148061094c57508080602001905181019061094c9190611388565b6109685760405162461bcd60e51b815260040161022f9061172e565b5050505050565b60006109908463095ea7b360e01b85856040516024016108f49291906115fb565b90508051600014806109b15750808060200190518101906109b19190611388565b6109cd5760405162461bcd60e51b815260040161022f906117e8565b50505050565b60006001600160a01b0382166109ea575047610a69565b6040516370a0823160e01b81526001600160a01b038316906370a0823190610a169030906004016115c3565b60206040518083038186803b158015610a2e57600080fd5b505afa158015610a42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a66919061145a565b90505b919050565b80610a7857610b66565b6001600160a01b038316610b08576000826001600160a01b031682604051610a9f906115c0565b60006040518083038185875af1925050503d8060008114610adc576040519150601f19603f3d011682016040523d82523d6000602084013e610ae1565b606091505b5050905080610b025760405162461bcd60e51b815260040161022f906117bb565b50610b66565b6000610b298463a9059cbb60e01b85856040516024016108f49291906115fb565b9050805160001480610b4a575080806020019051810190610b4a9190611388565b6109cd5760405162461bcd60e51b815260040161022f9061175b565b505050565b60005b600154811015610c0e57610bd160018281548110610b8857fe5b9060005260206000200160009054906101000a90046001600160a01b03168361055460018581548110610bb757fe5b6000918252602090912001546001600160a01b03166109d3565b60008060018381548110610be157fe5b60009182526020808320909101546001600160a01b03168352820192909252604001812055600101610b6e565b50610c1b60016000610e3f565b610c2760026000610e3f565b610c3360036000610e5d565b50565b80610c40576105d9565b6001600160a01b0382166000908152602081905260409020546001541580610c925750826001600160a01b031660018281548110610c7a57fe5b6000918252602090912001546001600160a01b031614155b15610d255750600180546001600160a01b038416600081815260208190526040812083905582840184557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6830180546001600160a01b03191690921790915560028054938401815581527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909201919091555b8160028281548110610d3357fe5b90600052602060002001540160028281548110610d4c57fe5b600091825260209091200155505050565b60606000808351602085016000875af13d604051925080835260208301816000823e808201604052828015610d9157610d95565b8282fd5b5050505092915050565b828054828255906000526020600020908101928215610df4579160200282015b82811115610df457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190610dbf565b50610e00929150610e7e565b5090565b828054828255906000526020600020908101928215610df4579160200282015b82811115610df4578251825591602001919060010190610e24565b5080546000825590600052602060002090810190610c339190610e7e565b5080546000825560080290600052602060002090810190610c339190610e93565b5b80821115610e005760008155600101610e7f565b80821115610e005780546001600160a01b03199081168255600060018301819055600283018054909216909155610ecd6003830182610e3f565b610edb600483016000610e3f565b60058201805461ffff19169055610ef6600683016000610e3f565b610f04600783016000610e3f565b50600801610e93565b8035610a69816118ca565b8051610a69816118ca565b600082601f830112610f33578081fd5b81356020610f48610f43836118a0565b61187c565b8281528181019085830183850287018401881015610f64578586fd5b855b85811015610f8b578135610f79816118ca565b84529284019290840190600101610f66565b5090979650505050505050565b600082601f830112610fa8578081fd5b81516020610fb8610f43836118a0565b8281528181019085830183850287018401881015610fd4578586fd5b855b85811015610f8b578151610fe9816118ca565b84529284019290840190600101610fd6565b600082601f83011261100b578081fd5b8135602061101b610f43836118a0565b8281528181019085830183850287018401881015611037578586fd5b855b85811015610f8b57813584529284019290840190600101611039565b8035610a69816118df565b8051610a69816118df565b60006080828403121561107c578081fd5b6040516080810181811067ffffffffffffffff8211171561109957fe5b8060405250809150823581526020830135602082015260408301356110bd816118df565b604082015260608301356110d0816118ca565b6060919091015292915050565b60006101e08083850312156110f0578182fd5b6110f98161187c565b91505061110582611060565b81526020820151602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c082015160c082015261114f60e08301610f18565b60e0820152610100611162818401610f18565b90820152610120611174838201610f18565b90820152610140611186838201610f18565b90820152610160611198838201611060565b9082015261018082810151908201526101a080830151908201526101c09182015191810191909152919050565b60008060008060e085870312156111da578384fd5b6111e485356118ca565b84359350602085013567ffffffffffffffff80821115611202578485fd5b818701915087601f830112611215578485fd5b611222610f4383356118a0565b82358152602080820191908401875b85358110156113595781358601610120818e03601f1901121561125257898afd5b61125d61012061187c565b61126960208301610f0d565b81526040820135602082015261128160608301610f0d565b6040820152608082013587811115611297578b8cfd5b6112a68f602083860101610f23565b60608301525060a0820135878111156112bd578b8cfd5b6112cc8f602083860101610f23565b6080830152506112de60c08301611055565b60a08201526112ef60e08301611055565b60c082015261010082013587811115611306578b8cfd5b6113158f602083860101610f23565b60e0830152506101208201358781111561132d578b8cfd5b61133c8f602083860101610ffb565b610100830152508552506020938401939190910190600101611231565b50508096505050505061136e60408601610f0d565b915061137d866060870161106b565b905092959194509250565b600060208284031215611399578081fd5b81516113a4816118df565b9392505050565b6000808284036102e08112156113bf578283fd5b610100808212156113ce578384fd5b604051915080820182811067ffffffffffffffff821117156113ec57fe5b604052845182526113ff60208601611060565b602083015260408501516040830152606085015160608301526080850151608083015260a085015160a083015260c085015160c083015260e085015160e083015281935061144f868287016110dd565b925050509250929050565b60006020828403121561146b578081fd5b5051919050565b600080600060608486031215611486578081fd5b8351925060208085015167ffffffffffffffff808211156114a5578384fd5b818701915087601f8301126114b8578384fd5b81516114c6610f43826118a0565b81815284810190848601868402860187018c10156114e2578788fd5b8795505b838610156115045780518352600195909501949186019186016114e6565b5060408a0151909750945050508083111561151d578384fd5b505061152b86828701610f98565b9150509250925092565b6001600160a01b03169052565b6000815480845260208085019450838352808320835b8381101561157d5781546001600160a01b031687529582019560019182019101611558565b509495945050505050565b6000815480845260208085019450838352808320835b8381101561157d5781548752958201956001918201910161159e565b15159052565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6000602080830181845280855480835260409250828601915082848202870101878652848620865b8381101561172057603f198984030185526101206116638461165e85546118be565b611535565b60018301548885015261167960028401546118be565b61168588860182611535565b5080606085015261169b81850160038501611542565b905083810360808501526116b28160048501611542565b9050600583015460ff6116ca60a087018284166115ba565b60086116dd60c088018385841c166115ba565b86840360e08801526116f28460068801611542565b935086840361010088015261170a8460078801611588565b988b01989650949094019350505060010161163c565b509098975050505050505050565b6020808252601390820152721514905394d19154919493d357d19052531151606a1b604082015260600190565b6020808252600f908201526e1514905394d1915497d19052531151608a1b604082015260600190565b60208082526018908201527f4164644c6971756964697479206e6f7420616c6c6f7765640000000000000000604082015260600190565b602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b6020808252600e908201526d1054141493d59157d1905253115160921b604082015260600190565b602080825260139082015272496e636f7272656374204554482076616c756560681b604082015260600190565b81518152602080830151908201526040808301511515908201526060918201516001600160a01b03169181019190915260800190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561189857fe5b604052919050565b600067ffffffffffffffff8211156118b457fe5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114610c3357600080fd5b8015158114610c3357600080fdfea2646970667358221220d4dd3ef96ca848b6d3b7ec26c5a8845fb2ea81c8033997cab9c786ca917420d564736f6c63430007060033

Deployed Bytecode Sourcemap

13769:7340:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14024:827;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;14291:21;;;;14236:18;;-1:-1:-1;;;;;14291:35:0;:72;;14353:10;14291:72;;;14329:7;:21;;;14291:72;-1:-1:-1;;;;;14267:96:0;:21;;;:96;14374:11;14388:57;14419:10;14431:13;14388:30;:57::i;:::-;14374:71;;14464:13;-1:-1:-1;;;;;14456:30:0;;14495:3;14500:11;14456:56;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14523:18;14554:15;14523:47;;14582:31;14615:21;14640:73;14668:8;14678:7;:18;;;14698:7;:14;;;14640:27;:73::i;:::-;14581:132;;;;14737:8;-1:-1:-1;;;;;14737:21:0;;14767:13;14782:7;14737:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14724:66;;14801:42;14816:14;14832:10;14801:14;:42::i;:::-;14024:827;;;;;;;;;;:::o;16341:553::-;16453:11;16483:53;16515:10;16527:8;16483:31;:53::i;:::-;16477:59;;16551:9;16547:340;16570:17;:24;16566:28;;16547:340;;;16651:1;-1:-1:-1;;;;;16619:34:0;:17;16637:1;16619:20;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16619:20:0;:34;16616:260;;;16695:13;16709:1;16695:16;;;;;;;;;;;;;;;;16682:9;:29;;16674:61;;;;-1:-1:-1;;;16674:61:0;;;;;;;:::i;:::-;;;;;;;;;16616:260;;;16776:84;16794:17;16812:1;16794:20;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16794:20:0;16816:10;16836:4;16843:13;16857:1;16843:16;;;;;;;;;;;;;;;;16776:17;:84::i;:::-;16596:3;;16547:340;;;;16341:553;;;;:::o;14859:848::-;14975:31;15008:21;15045:33;15082:8;-1:-1:-1;;;;;15082:14:0;;15097:10;15082:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15042:66;;;15119:30;15201:9;:19;;;-1:-1:-1;;;;;15196:39:0;;15236:9;:35;;;15273:9;:26;;;15301:13;15196:119;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15196:119:0;;;;;;;;;;;;:::i;:::-;15160:155;-1:-1:-1;15160:155:0;-1:-1:-1;15330:9:0;;-1:-1:-1;15326:374:0;15349:14;:21;15345:1;:25;15326:374;;;15395:9;:22;;;:72;;;;;15442:9;:25;;;-1:-1:-1;;;;;15421:46:0;:14;15436:1;15421:17;;;;;;;;;;;;;;-1:-1:-1;;;;;15421:46:0;;15395:72;15392:144;;;15504:13;15518:1;15504:16;;;;;;;;;;;;;;15488:32;;15392:144;15582:1;-1:-1:-1;;;;;15553:31:0;:14;15568:1;15553:17;;;;;;;;;;;;;;-1:-1:-1;;;;;15553:31:0;;15550:139;;15605:68;15618:14;15633:1;15618:17;;;;;;;;;;;;;;15645:8;15656:13;15670:1;15656:16;;;;;;;;;;;;;;15605:12;:68::i;:::-;15372:3;;15326:374;;;;14859:848;;;;;;;;:::o;15715:618::-;15813:9;15809:293;15832:14;:21;15828:1;:25;15809:293;;;15878:17;:24;:29;;:103;;;15964:14;15979:1;15964:17;;;;;;;;;;;;;;-1:-1:-1;;;;;15911:70:0;:17;15929:11;:30;15941:14;15956:1;15941:17;;;;;;;;;;;;;;-1:-1:-1;;;;;15929:30:0;-1:-1:-1;;;;;15929:30:0;;;;;;;;;;;;;15911:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15911:49:0;:70;;15878:103;15875:216;;;16002:73;16016:14;16031:1;16016:17;;;;;;;;;;;;;;16035:8;16045:29;16056:14;16071:1;16056:17;;;;;;;;;;;;;;16045:10;:29::i;:::-;16002:13;:73::i;:::-;15855:3;;15809:293;;;-1:-1:-1;16115:17:0;:24;:29;;:89;;-1:-1:-1;16202:1:0;16166:23;;;;;;;;;16148:17;:42;;:17;;16166:23;16148:42;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16148:42:0;:56;;16115:89;16112:179;;;16221:58;16243:1;16247:8;16257:21;16221:13;:58::i;:::-;16301:24;16316:8;16301:14;:24::i;:::-;15715:618;;:::o;16902:1066::-;17015:11;;17039:695;17062:10;:17;17058:1;:21;17039:695;;;17101:32;17136:10;17147:1;17136:13;;;;;;;;;;;;;;17101:48;;17203:1;-1:-1:-1;;;;;17172:33:0;:9;:19;;;-1:-1:-1;;;;;17172:33:0;;:80;;;;17251:1;17209:9;:32;;;:39;:43;17172:80;17164:117;;;;-1:-1:-1;;;17164:117:0;;;;;;;:::i;:::-;17315:19;;;;17297:147;;-1:-1:-1;;;;;17315:33:0;;;;;:57;;;17352:9;:20;;;17315:57;:100;;17388:27;;17315:100;;;17383:1;17315:100;17417:9;:26;;;17297:17;:147::i;:::-;17462:19;;;;-1:-1:-1;;;;;17462:33:0;;17459:264;;17516:11;:27;;;;;;;-1:-1:-1;17516:27:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17516:27:0;;;-1:-1:-1;;;;;17516:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;17516:27:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;17516:27:0;;;;;;;;;;;;;;;;;-1:-1:-1;;17516:27:0;;;-1:-1:-1;;17516:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;17516:27:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;17565:27:0;;-1:-1:-1;;;;;17565:41:0;;;-1:-1:-1;17565:41:0;:65;;;17610:9;:20;;;17565:65;17562:146;;;17662:9;:26;;;17655:33;;;;17562:146;-1:-1:-1;17081:3:0;;17039:695;;;;17748:9;17744:217;17768:17;:24;17764:28;;17744:217;;;17849:1;-1:-1:-1;;;;;17817:34:0;:17;17835:1;17817:20;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17817:20:0;:34;17814:136;;17872:62;17885:17;17903:1;17885:20;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17885:20:0;17907:8;17917:13;17931:1;17917:16;;;;;;;;;;;;;;;;17872:12;:62::i;:::-;17794:3;;17744:217;;20128:362;20243:23;20269:114;20275:17;20317:47;;;20366:4;20372:2;20376:5;20294:88;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;20294:88:0;;;;;;;;;;;;;;-1:-1:-1;;;;;20294:88:0;-1:-1:-1;;;;;;20294:88:0;;;;;;;;;;20269:5;:114::i;:::-;20243:140;;20402:10;:17;20423:1;20402:22;:56;;;;20439:10;20428:30;;;;;;;;;;;;:::i;:::-;20394:88;;;;-1:-1:-1;;;20394:88:0;;;;;;;:::i;:::-;20128:362;;;;;:::o;19210:327::-;19306:23;19332:103;19338:17;19380:42;;;19424:2;19428:5;19357:77;;;;;;;;;:::i;19332:103::-;19306:129;;19454:10;:17;19475:1;19454:22;:56;;;;19491:10;19480:30;;;;;;;;;;;;:::i;:::-;19446:83;;;;-1:-1:-1;;;19446:83:0;;;;;;;:::i;:::-;19210:327;;;;:::o;18963:239::-;19026:7;-1:-1:-1;;;;;19049:26:0;;19046:86;;-1:-1:-1;19099:21:0;19092:28;;19046:86;19149:45;;-1:-1:-1;;;19149:45:0;;-1:-1:-1;;;;;19149:30:0;;;;;:45;;19188:4;;19149:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19142:52;;18963:239;;;;:::o;19545:575::-;19644:10;19641:48;;19671:7;;19641:48;-1:-1:-1;;;;;19702:31:0;;19699:178;;19751:11;19767:2;-1:-1:-1;;;;;19767:7:0;19781:5;19767:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19750:41;;;19814:6;19806:38;;;;-1:-1:-1;;;19806:38:0;;;;;;;:::i;:::-;19859:7;;;19699:178;19887:23;19913:104;19919:17;19961:43;;;20006:2;20010:5;19938:78;;;;;;;;;:::i;19913:104::-;19887:130;;20036:10;:17;20057:1;20036:22;:56;;;;20073:10;20062:30;;;;;;;;;;;;:::i;:::-;20028:84;;;;-1:-1:-1;;;20028:84:0;;;;;;;:::i;19545:575::-;;;;:::o;18577:378::-;18642:9;18638:215;18661:17;:24;18657:28;;18638:215;;;18707:79;18721:17;18739:1;18721:20;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18721:20:0;18743:8;18753:32;18764:17;18782:1;18764:20;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18764:20:0;18753:10;:32::i;18707:79::-;18808:11;:33;18820:17;18838:1;18820:20;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18820:20:0;18808:33;;;;;;;;;;;;18801:40;18820:20;18687:3;18638:215;;;-1:-1:-1;18863:24:0;18870:17;;18863:24;:::i;:::-;18898:20;18905:13;;18898:20;:::i;:::-;18929:18;18936:11;;18929:18;:::i;:::-;18577:378;:::o;17976:593::-;18078:21;18075:59;;18116:7;;18075:59;-1:-1:-1;;;;;18165:30:0;;18146:16;18165:30;;;;;;;;;;;18211:17;:24;:29;;:81;;;18275:17;-1:-1:-1;;;;;18244:48:0;:17;18262:8;18244:27;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18244:27:0;:48;;18211:81;18208:275;;;-1:-1:-1;18354:17:0;:24;;-1:-1:-1;;;;;18309:30:0;;:11;:30;;;;;;;;;;:70;;;18394:41;;;;;;;;;;-1:-1:-1;;;;;;18394:41:0;;;;;;;18450:13;:21;;;;;;;;;;;;;;;;;18208:275;18545:16;18519:13;18533:8;18519:23;;;;;;;;;;;;;;;;:42;18493:13;18507:8;18493:23;;;;;;;;;;;;;;;;;:68;-1:-1:-1;17976:593:0;;:::o;20498:608::-;20569:23;20707:1;20704;20694:7;20688:14;20681:4;20672:7;20668:18;20665:1;20655:8;20648:5;20643:66;20735:16;20785:4;20779:11;20765:25;;20823:4;20811:10;20804:24;20888:4;20876:10;20872:21;20949:4;20946:1;20922:22;20907:47;20981:33;;;20975:4;20968:47;21036:6;21043:45;;;;21029:59;;21043:45;21082:4;21058:22;21051:36;21029:59;;;;;20614:485;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;14:138:1;84:20;;113:33;84:20;113:33;:::i;157:142::-;238:13;;260:33;238:13;260:33;:::i;304:782::-;;417:3;410:4;402:6;398:17;394:27;384:2;;439:5;432;425:20;384:2;479:6;466:20;505:4;529:65;544:49;590:2;544:49;:::i;:::-;529:65;:::i;:::-;628:15;;;659:12;;;;691:15;;;737:11;;;725:24;;721:33;;718:42;-1:-1:-1;715:2:1;;;777:5;770;763:20;715:2;803:5;817:240;831:2;828:1;825:9;817:240;;;902:3;889:17;919:33;946:5;919:33;:::i;:::-;965:18;;1003:12;;;;1035;;;;849:1;842:9;817:240;;;-1:-1:-1;1075:5:1;;374:712;-1:-1:-1;;;;;;;374:712:1:o;1091:779::-;;1215:3;1208:4;1200:6;1196:17;1192:27;1182:2;;1237:5;1230;1223:20;1182:2;1270:6;1264:13;1296:4;1320:65;1335:49;1381:2;1335:49;:::i;1320:65::-;1419:15;;;1450:12;;;;1482:15;;;1528:11;;;1516:24;;1512:33;;1509:42;-1:-1:-1;1506:2:1;;;1568:5;1561;1554:20;1506:2;1594:5;1608:233;1622:2;1619:1;1616:9;1608:233;;;1686:3;1680:10;1703:33;1730:5;1703:33;:::i;:::-;1749:18;;1787:12;;;;1819;;;;1640:1;1633:9;1608:233;;1875:705;;1988:3;1981:4;1973:6;1969:17;1965:27;1955:2;;2010:5;2003;1996:20;1955:2;2050:6;2037:20;2076:4;2100:65;2115:49;2161:2;2115:49;:::i;2100:65::-;2199:15;;;2230:12;;;;2262:15;;;2308:11;;;2296:24;;2292:33;;2289:42;-1:-1:-1;2286:2:1;;;2348:5;2341;2334:20;2286:2;2374:5;2388:163;2402:2;2399:1;2396:9;2388:163;;;2459:17;;2447:30;;2497:12;;;;2529;;;;2420:1;2413:9;2388:163;;2585:132;2652:20;;2681:30;2652:20;2681:30;:::i;2722:136::-;2800:13;;2822:30;2800:13;2822:30;:::i;2863:768::-;;2983:4;2971:9;2966:3;2962:19;2958:30;2955:2;;;3005:5;2998;2991:20;2955:2;3042;3036:9;3084:4;3076:6;3072:17;3155:6;3143:10;3140:22;3119:18;3107:10;3104:34;3101:62;3098:2;;;3166:9;3098:2;3197:10;3193:2;3186:22;;3226:6;3217:15;;3269:9;3256:23;3248:6;3241:39;3341:2;3330:9;3326:18;3313:32;3308:2;3300:6;3296:15;3289:57;3398:2;3387:9;3383:18;3370:32;3411;3435:7;3411:32;:::i;:::-;3471:2;3459:15;;3452:32;3536:2;3521:18;;3508:32;3549:35;3508:32;3549:35;:::i;:::-;3612:2;3600:15;;;;3593:32;2945:686;;-1:-1:-1;;2945:686:1:o;3636:1384::-;;3743:6;3786:2;3774:9;3769:3;3765:19;3761:28;3758:2;;;3806:5;3799;3792:20;3758:2;3832:18;3847:2;3832:18;:::i;:::-;3823:27;;;3873:39;3902:9;3873:39;:::i;:::-;3866:5;3859:54;3966:2;3955:9;3951:18;3945:25;3940:2;3933:5;3929:14;3922:49;4024:2;4013:9;4009:18;4003:25;3998:2;3991:5;3987:14;3980:49;4082:2;4071:9;4067:18;4061:25;4056:2;4049:5;4045:14;4038:49;4141:3;4130:9;4126:19;4120:26;4114:3;4107:5;4103:15;4096:51;4201:3;4190:9;4186:19;4180:26;4174:3;4167:5;4163:15;4156:51;4261:3;4250:9;4246:19;4240:26;4234:3;4227:5;4223:15;4216:51;4300:52;4347:3;4336:9;4332:19;4300:52;:::i;:::-;4294:3;4287:5;4283:15;4276:77;4372:3;4407:51;4454:2;4443:9;4439:18;4407:51;:::i;:::-;4391:14;;;4384:75;4478:3;4513:51;4545:18;;;4513:51;:::i;:::-;4497:14;;;4490:75;4584:3;4619:51;4651:18;;;4619:51;:::i;:::-;4603:14;;;4596:75;4690:3;4725:48;4754:18;;;4725:48;:::i;:::-;4709:14;;;4702:72;4793:3;4834:18;;;4828:25;4812:14;;;4805:49;4873:3;4914:18;;;4908:25;4892:14;;;4885:49;4953:3;4994:18;;;4988:25;4972:14;;;4965:49;;;;4713:5;3723:1297;-1:-1:-1;3723:1297:1:o;5025:2658::-;;;;;5283:3;5271:9;5262:7;5258:23;5254:33;5251:2;;;5305:6;5297;5290:22;5251:2;5323:51;5363:9;5350:23;5323:51;:::i;:::-;5406:9;5393:23;5383:33;;5467:2;5456:9;5452:18;5439:32;5490:18;5531:2;5523:6;5520:14;5517:2;;;5552:6;5544;5537:22;5517:2;5595:6;5584:9;5580:22;5570:32;;5640:7;5633:4;5629:2;5625:13;5621:27;5611:2;;5667:6;5659;5652:22;5611:2;5696:79;5711:63;5770:2;5757:16;5711:63;:::i;5696:79::-;5821:16;;5809:29;;5863:2;5854:12;;;;5797:3;5886:11;;5915:6;5930:1573;5957:2;5944:16;5941:1;5938:23;5930:1573;;;6021:17;;6013:26;;6091:6;6063:16;;;-1:-1:-1;;6059:30:1;6055:43;6052:2;;;6116:6;6108;6101:22;6052:2;6151:22;6166:6;6151:22;:::i;:::-;6200:33;6229:2;6225;6221:11;6200:33;:::i;:::-;6193:5;6186:48;6291:2;6287;6283:11;6270:25;6265:2;6258:5;6254:14;6247:49;6332:33;6361:2;6357;6353:11;6332:33;:::i;:::-;6327:2;6320:5;6316:14;6309:57;6416:3;6412:2;6408:12;6395:26;6450:2;6440:8;6437:16;6434:2;;;6471:6;6463;6456:22;6434:2;6516:71;6579:7;6574:2;6563:8;6559:2;6555:17;6551:26;6516:71;:::i;:::-;6511:2;6504:5;6500:14;6493:95;;6638:3;6634:2;6630:12;6617:26;6672:2;6662:8;6659:16;6656:2;;;6693:6;6685;6678:22;6656:2;6739:71;6802:7;6797:2;6786:8;6782:2;6778:17;6774:26;6739:71;:::i;:::-;6733:3;6726:5;6722:15;6715:96;;6848:31;6874:3;6870:2;6866:12;6848:31;:::i;:::-;6842:3;6835:5;6831:15;6824:56;6917:31;6943:3;6939:2;6935:12;6917:31;:::i;:::-;6911:3;6904:5;6900:15;6893:56;6999:3;6995:2;6991:12;6978:26;7033:2;7023:8;7020:16;7017:2;;;7054:6;7046;7039:22;7017:2;7100:71;7163:7;7158:2;7147:8;7143:2;7139:17;7135:26;7100:71;:::i;:::-;7094:3;7087:5;7083:15;7076:96;;7222:6;7218:2;7214:15;7201:29;7259:2;7249:8;7246:16;7243:2;;;7280:6;7272;7265:22;7243:2;7326:71;7389:7;7384:2;7373:8;7369:2;7365:17;7361:26;7326:71;:::i;:::-;7320:3;7309:15;;7302:96;-1:-1:-1;7411:18:1;;-1:-1:-1;7458:2:1;7449:12;;;;7481;;;;;5976:1;5969:9;5930:1573;;;5934:3;;7522:5;7512:15;;;;;;7546:40;7582:2;7571:9;7567:18;7546:40;:::i;:::-;7536:50;;7605:72;7669:7;7664:2;7653:9;7649:18;7605:72;:::i;:::-;7595:82;;5241:2442;;;;;;;:::o;7688:257::-;;7808:2;7796:9;7787:7;7783:23;7779:32;7776:2;;;7829:6;7821;7814:22;7776:2;7866:9;7860:16;7885:30;7909:5;7885:30;:::i;:::-;7934:5;7766:179;-1:-1:-1;;;7766:179:1:o;7950:1134::-;;;8143:9;8134:7;8130:23;8173:3;8169:2;8165:12;8162:2;;;8195:6;8187;8180:22;8162:2;8223:6;8249:2;8245;8241:11;8238:2;;;8270:6;8262;8255:22;8238:2;8308;8302:9;8288:23;;8350:2;8342:6;8338:15;8419:6;8407:10;8404:22;8383:18;8371:10;8368:34;8365:62;8362:2;;;8430:9;8362:2;8457;8450:22;8496:16;;8481:32;;8546:48;8590:2;8575:18;;8546:48;:::i;:::-;8541:2;8533:6;8529:15;8522:73;8649:2;8638:9;8634:18;8628:25;8623:2;8615:6;8611:15;8604:50;8708:2;8697:9;8693:18;8687:25;8682:2;8674:6;8670:15;8663:50;8768:3;8757:9;8753:19;8747:26;8741:3;8733:6;8729:16;8722:52;8829:3;8818:9;8814:19;8808:26;8802:3;8794:6;8790:16;8783:52;8890:3;8879:9;8875:19;8869:26;8863:3;8855:6;8851:16;8844:52;8951:3;8940:9;8936:19;8930:26;8924:3;8916:6;8912:16;8905:52;8976:6;8966:16;;9001:77;9070:7;9065:2;9054:9;9050:18;9001:77;:::i;:::-;8991:87;;;;8110:974;;;;;:::o;9089:194::-;;9212:2;9200:9;9191:7;9187:23;9183:32;9180:2;;;9233:6;9225;9218:22;9180:2;-1:-1:-1;9261:16:1;;9170:113;-1:-1:-1;9170:113:1:o;9288:1271::-;;;;9495:2;9483:9;9474:7;9470:23;9466:32;9463:2;;;9516:6;9508;9501:22;9463:2;9550:9;9544:16;9534:26;;9579:2;9625;9614:9;9610:18;9604:25;9648:18;9689:2;9681:6;9678:14;9675:2;;;9710:6;9702;9695:22;9675:2;9753:6;9742:9;9738:22;9728:32;;9798:7;9791:4;9787:2;9783:13;9779:27;9769:2;;9825:6;9817;9810:22;9769:2;9859;9853:9;9882:65;9897:49;9943:2;9897:49;:::i;9882:65::-;9981:15;;;10012:12;;;;10044:11;;;10082;;;10074:20;;10070:29;;10067:42;-1:-1:-1;10064:2:1;;;10127:6;10119;10112:22;10064:2;10154:6;10145:15;;10169:156;10183:2;10180:1;10177:9;10169:156;;;10240:10;;10228:23;;10201:1;10194:9;;;;;10271:12;;;;10303;;10169:156;;;-1:-1:-1;10395:2:1;10380:18;;10374:25;10344:5;;-1:-1:-1;10374:25:1;-1:-1:-1;;;10411:16:1;;;10408:2;;;10445:6;10437;10430:22;10408:2;;;10473:80;10545:7;10534:8;10523:9;10519:24;10473:80;:::i;:::-;10463:90;;;9453:1106;;;;;:::o;10564:106::-;-1:-1:-1;;;;;10632:31:1;10620:44;;10610:60::o;10675:507::-;;10780:5;10774:12;10807:6;10802:3;10795:19;10833:4;10862:2;10857:3;10853:12;10846:19;;10886:5;10881:3;10874:18;10930:2;10925:3;10915:18;10951:3;10963:194;10977:6;10974:1;10971:13;10963:194;;;11042:13;;-1:-1:-1;;;;;11038:39:1;11026:52;;11098:12;;;;11074:1;11133:14;;;;10992:9;10963:194;;;-1:-1:-1;11173:3:1;;10750:432;-1:-1:-1;;;;;10750:432:1:o;11187:481::-;;11292:5;11286:12;11319:6;11314:3;11307:19;11345:4;11374:2;11369:3;11365:12;11358:19;;11398:5;11393:3;11386:18;11442:2;11437:3;11427:18;11463:3;11475:168;11489:6;11486:1;11483:13;11475:168;;;11550:13;;11538:26;;11584:12;;;;11631:1;11619:14;;;;11504:9;11475:168;;11673:93;11745:13;11738:21;11726:34;;11716:50::o;11771:205::-;11971:3;11962:14::o;11981:211::-;-1:-1:-1;;;;;12153:32:1;;;;12135:51;;12123:2;12108:18;;12090:102::o;12197:375::-;-1:-1:-1;;;;;12455:15:1;;;12437:34;;12507:15;;;;12502:2;12487:18;;12480:43;12554:2;12539:18;;12532:34;;;;12387:2;12372:18;;12354:218::o;12577:274::-;-1:-1:-1;;;;;12769:32:1;;;;12751:51;;12833:2;12818:18;;12811:34;12739:2;12724:18;;12706:145::o;12856:2025::-;;13083:2;13123;13112:9;13108:18;13153:2;13142:9;13135:21;13176:6;13211;13205:13;13242:6;13234;13227:22;13268:2;13258:12;;13301:2;13290:9;13286:18;13279:25;;13364:2;13358;13350:6;13346:15;13335:9;13331:31;13327:40;13389:6;13383:4;13376:20;13435:2;13429:4;13419:19;13456:4;13469:1383;13483:6;13480:1;13477:13;13469:1383;;;13576:2;13572:7;13560:9;13552:6;13548:22;13544:36;13539:3;13532:49;13604:6;13623:75;13691:6;13644:45;13681:6;13675:13;13644:45;:::i;:::-;13623:75;:::i;:::-;13753:1;13745:6;13741:14;13735:21;13730:2;13722:6;13718:15;13711:46;13790:56;13839:4;13831:6;13827:17;13821:24;13790:56;:::i;:::-;13859:51;13906:2;13898:6;13894:15;13880:12;13859:51;:::i;:::-;;13949:2;13942:4;13934:6;13930:17;13923:29;13979:78;14053:2;14045:6;14041:15;14034:4;14026:6;14022:17;13979:78;:::i;:::-;13965:92;;14108:6;14100;14096:19;14089:4;14081:6;14077:17;14070:46;14143:69;14205:6;14198:4;14190:6;14186:17;14143:69;:::i;:::-;14129:83;;14260:4;14252:6;14248:17;14242:24;14289:4;14306:56;14356:4;14348:6;14344:17;14339:2;14328:9;14324:18;14306:56;:::i;:::-;14385:1;14399:65;14458:4;14450:6;14446:17;14441:2;14429:9;14425:2;14421:18;14417:27;14399:65;:::i;:::-;14515:6;14507;14503:19;14496:4;14488:6;14484:17;14477:46;14550:69;14612:6;14605:4;14597:6;14593:17;14550:69;:::i;:::-;14536:83;;14672:6;14664;14660:19;14651:6;14643;14639:19;14632:48;14703:69;14765:6;14758:4;14750:6;14746:17;14703:69;:::i;:::-;14830:12;;;;14693:79;-1:-1:-1;14795:15:1;;;;;-1:-1:-1;;;13505:1:1;13498:9;13469:1383;;;-1:-1:-1;14869:6:1;;13063:1818;-1:-1:-1;;;;;;;;13063:1818:1:o;14886:343::-;15088:2;15070:21;;;15127:2;15107:18;;;15100:30;-1:-1:-1;;;15161:2:1;15146:18;;15139:49;15220:2;15205:18;;15060:169::o;15234:339::-;15436:2;15418:21;;;15475:2;15455:18;;;15448:30;-1:-1:-1;;;15509:2:1;15494:18;;15487:45;15564:2;15549:18;;15408:165::o;15578:348::-;15780:2;15762:21;;;15819:2;15799:18;;;15792:30;15858:26;15853:2;15838:18;;15831:54;15917:2;15902:18;;15752:174::o;15931:343::-;16133:2;16115:21;;;16172:2;16152:18;;;16145:30;-1:-1:-1;;;16206:2:1;16191:18;;16184:49;16265:2;16250:18;;16105:169::o;16279:338::-;16481:2;16463:21;;;16520:2;16500:18;;;16493:30;-1:-1:-1;;;16554:2:1;16539:18;;16532:44;16608:2;16593:18;;16453:164::o;16622:343::-;16824:2;16806:21;;;16863:2;16843:18;;;16836:30;-1:-1:-1;;;16897:2:1;16882:18;;16875:49;16956:2;16941:18;;16796:169::o;16970:494::-;17213:13;;17195:32;;17283:4;17271:17;;;17265:24;17243:20;;;17236:54;17360:4;17348:17;;;17342:24;17335:32;17328:40;17306:20;;;17299:70;17429:4;17417:17;;;17411:24;-1:-1:-1;;;;;17407:50:1;17385:20;;;17378:80;;;;17182:3;17167:19;;17149:315::o;17469:177::-;17615:25;;;17603:2;17588:18;;17570:76::o;17651:242::-;17721:2;17715:9;17751:17;;;17798:18;17783:34;;17819:22;;;17780:62;17777:2;;;17845:9;17777:2;17872;17865:22;17695:198;;-1:-1:-1;17695:198:1:o;17898:183::-;;17997:18;17989:6;17986:30;17983:2;;;18019:9;17983:2;-1:-1:-1;18070:4:1;18051:17;;;18047:28;;17973:108::o;18086:120::-;-1:-1:-1;;;;;18169:31:1;;18148:58::o;18211:133::-;-1:-1:-1;;;;;18288:31:1;;18278:42;;18268:2;;18334:1;18331;18324:12;18349:120;18437:5;18430:13;18423:21;18416:5;18413:32;18403:2;;18459:1;18456;18449:12

Swarm Source

ipfs://d4dd3ef96ca848b6d3b7ec26c5a8845fb2ea81c8033997cab9c786ca917420d5

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.