ETH Price: $1,877.10 (-1.76%)
Gas: 0.46 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Open Position126382452021-06-15 9:28:301366 days ago1623749310IN
0x8C41E3D4...db1ae4F65
0.01 ETH0.014763920
Open Position126382442021-06-15 9:28:141366 days ago1623749294IN
0x8C41E3D4...db1ae4F65
0.01 ETH0.0154876220
Open Position126382362021-06-15 9:26:391366 days ago1623749199IN
0x8C41E3D4...db1ae4F65
0.01 ETH0.0142796220
Open Position126382352021-06-15 9:26:191366 days ago1623749179IN
0x8C41E3D4...db1ae4F65
0.01 ETH0.013661820
Open Position126382292021-06-15 9:25:351366 days ago1623749135IN
0x8C41E3D4...db1ae4F65
0.01 ETH0.0136844620
Open Position126382252021-06-15 9:24:411366 days ago1623749081IN
0x8C41E3D4...db1ae4F65
0.01 ETH0.0135944620
Open Position126382212021-06-15 9:23:561366 days ago1623749036IN
0x8C41E3D4...db1ae4F65
0.01 ETH0.0140264620
Open Position126382122021-06-15 9:23:001366 days ago1623748980IN
0x8C41E3D4...db1ae4F65
0.01 ETH0.0153978620
Open Position126382022021-06-15 9:20:241366 days ago1623748824IN
0x8C41E3D4...db1ae4F65
0.01 ETH0.013913820
Open Position126382022021-06-15 9:20:241366 days ago1623748824IN
0x8C41E3D4...db1ae4F65
0.01 ETH0.013684720
Open Position126381992021-06-15 9:20:111366 days ago1623748811IN
0x8C41E3D4...db1ae4F65
0.01 ETH0.013684720
Open Position126381892021-06-15 9:17:241366 days ago1623748644IN
0x8C41E3D4...db1ae4F65
0.01 ETH0.013594720
Open Position126381862021-06-15 9:16:411366 days ago1623748601IN
0x8C41E3D4...db1ae4F65
0.01 ETH0.0142029420
Open Position126381642021-06-15 9:11:341366 days ago1623748294IN
0x8C41E3D4...db1ae4F65
0.02 ETH0.0154878620
Open Position126381582021-06-15 9:10:361366 days ago1623748236IN
0x8C41E3D4...db1ae4F65
0.01 ETH0.0142929420
Open Position126381522021-06-15 9:09:471366 days ago1623748187IN
0x8C41E3D4...db1ae4F65
0.001 ETH0.0122958318
Open Position126381522021-06-15 9:09:471366 days ago1623748187IN
0x8C41E3D4...db1ae4F65
0.001 ETH0.013684720
Open Position126381512021-06-15 9:09:261366 days ago1623748166IN
0x8C41E3D4...db1ae4F65
0.001 ETH0.013594720
Open Position126381442021-06-15 9:08:131366 days ago1623748093IN
0x8C41E3D4...db1ae4F65
0.01 ETH0.013684720
Open Position126341142021-06-14 18:18:371367 days ago1623694717IN
0x8C41E3D4...db1ae4F65
0.02 ETH0.0239482235
Open Position125426102021-05-31 14:22:091381 days ago1622470929IN
0x8C41E3D4...db1ae4F65
0.6 ETH0.0293733443
Open Position124671472021-05-19 21:07:021393 days ago1621458422IN
0x8C41E3D4...db1ae4F65
0.6 ETH0.10141408146
Open Position123520282021-05-02 2:12:571411 days ago1619921577IN
0x8C41E3D4...db1ae4F65
8 ETH0.0169942725
Open Position123151602021-04-26 9:42:041416 days ago1619430124IN
0x8C41E3D4...db1ae4F65
0.3 ETH0.0526971970
Open Position123151552021-04-26 9:40:481416 days ago1619430048IN
0x8C41E3D4...db1ae4F65
0.3 ETH0.0602253680
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
-126382452021-06-15 9:28:301366 days ago1623749310
0x8C41E3D4...db1ae4F65
0.00002083 ETH
-126382452021-06-15 9:28:301366 days ago1623749310
0x8C41E3D4...db1ae4F65
0.00498499 ETH
-126382452021-06-15 9:28:301366 days ago1623749310
0x8C41E3D4...db1ae4F65
0.00499417 ETH
-126382442021-06-15 9:28:141366 days ago1623749294
0x8C41E3D4...db1ae4F65
0.00001525 ETH
-126382442021-06-15 9:28:141366 days ago1623749294
0x8C41E3D4...db1ae4F65
0.00498499 ETH
-126382442021-06-15 9:28:141366 days ago1623749294
0x8C41E3D4...db1ae4F65
0.00499974 ETH
-126382362021-06-15 9:26:391366 days ago1623749199
0x8C41E3D4...db1ae4F65
0.00002621 ETH
-126382362021-06-15 9:26:391366 days ago1623749199
0x8C41E3D4...db1ae4F65
0.00498497 ETH
-126382362021-06-15 9:26:391366 days ago1623749199
0x8C41E3D4...db1ae4F65
0.0049888 ETH
-126382352021-06-15 9:26:191366 days ago1623749179
0x8C41E3D4...db1ae4F65
0.0000604 ETH
-126382352021-06-15 9:26:191366 days ago1623749179
0x8C41E3D4...db1ae4F65
0.00496233 ETH
-126382352021-06-15 9:26:191366 days ago1623749179
0x8C41E3D4...db1ae4F65
0.00497726 ETH
-126382292021-06-15 9:25:351366 days ago1623749135
0x8C41E3D4...db1ae4F65
0.0000151 ETH
-126382292021-06-15 9:25:351366 days ago1623749135
0x8C41E3D4...db1ae4F65
0.00498499 ETH
-126382292021-06-15 9:25:351366 days ago1623749135
0x8C41E3D4...db1ae4F65
0.00499989 ETH
-126382252021-06-15 9:24:411366 days ago1623749081
0x8C41E3D4...db1ae4F65
0.00001526 ETH
-126382252021-06-15 9:24:411366 days ago1623749081
0x8C41E3D4...db1ae4F65
0.00498499 ETH
-126382252021-06-15 9:24:411366 days ago1623749081
0x8C41E3D4...db1ae4F65
0.00499973 ETH
-126382212021-06-15 9:23:561366 days ago1623749036
0x8C41E3D4...db1ae4F65
0.00001525 ETH
-126382212021-06-15 9:23:561366 days ago1623749036
0x8C41E3D4...db1ae4F65
0.00498499 ETH
-126382212021-06-15 9:23:561366 days ago1623749036
0x8C41E3D4...db1ae4F65
0.00499974 ETH
-126382122021-06-15 9:23:001366 days ago1623748980
0x8C41E3D4...db1ae4F65
0.00001526 ETH
-126382122021-06-15 9:23:001366 days ago1623748980
0x8C41E3D4...db1ae4F65
0.00498499 ETH
-126382122021-06-15 9:23:001366 days ago1623748980
0x8C41E3D4...db1ae4F65
0.00499973 ETH
-126382022021-06-15 9:20:241366 days ago1623748824
0x8C41E3D4...db1ae4F65
0.00003556 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-03-20
*/

// 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 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

API
[{"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"}]

608060405234801561001057600080fd5b50611917806100206000396000f3fe6080604052600436106100225760003560e01c80636aeba4f11461002e57610029565b3661002957005b600080fd5b61004161003c3660046111b9565b610057565b60405161004e9190611867565b60405180910390f35b60608101516000906001600160a01b03166100725733610078565b81606001515b6001600160a01b03166060830152600061009285876101aa565b9050856001600160a01b031663b1445b6d8260036040518363ffffffff1660e01b81526004016100c29190611608565b6000604051808303818588803b1580156100db57600080fd5b505af11580156100ef573d6000803e3d6000fd5b5050505050600084905060008061010f8387600001518860200151610299565b91509150826001600160a01b031663c8df9d3182886040518363ffffffff1660e01b81526004016101409190611831565b6020604051808303818588803b15801561015957600080fd5b505af115801561016d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610192919061144e565b945061019e823361048b565b50505050949350505050565b60006101b683836105dc565b905060005b6001548110156102925760006001600160a01b0316600182815481106101dd57fe5b6000918252602090912001546001600160a01b0316141561023d576002818154811061020557fe5b90600052602060002001543410156102385760405162461bcd60e51b815260040161022f90611804565b60405180910390fd5b61028a565b61028a6001828154811061024d57fe5b9060005260206000200160009054906101000a90046001600160a01b031633306002858154811061027a57fe5b90600052602060002001546108d0565b6001016101bb565b5092915050565b6060600080856001600160a01b0316634313b9e5866040518263ffffffff1660e01b81526004016102ca9190611867565b6102c06040518083038186803b1580156102e357600080fd5b505afa1580156102f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061031b919061139f565b91505060608160c001516001600160a01b03166379d16e0d8360e00151846101000151886040518463ffffffff1660e01b815260040161035d939291906115cb565b60006040518083038186803b15801561037557600080fd5b505afa158015610389573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103b19190810190611466565b95509150600090505b84518110156104805782610140015180156103fe57508261012001516001600160a01b03168582815181106103eb57fe5b60200260200101516001600160a01b0316145b1561041a5781818151811061040f57fe5b602002602001015193505b60006001600160a01b031685828151811061043157fe5b60200260200101516001600160a01b0316146104785761047885828151811061045657fe5b60200260200101518984848151811061046b57fe5b602002602001015161096e565b6001016103ba565b505050935093915050565b60005b825181101561056057600154158061051a57508281815181106104ad57fe5b60200260200101516001600160a01b031660016000808685815181106104cf57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020548154811061050257fe5b6000918252602090912001546001600160a01b031614155b156105585761055883828151811061052e57fe5b60200260200101518361055386858151811061054657fe5b60200260200101516109d2565b610a6d565b60010161048e565b5060015415806105be5750600080805260208190527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5546001805490919081106105a657fe5b6000918252602090912001546001600160a01b031614155b156105cf576105cf60008247610a6d565b6105d881610b6a565b5050565b6000805b835181101561083c5760008482815181106105f757fe5b6020026020010151905060006001600160a01b031681604001516001600160a01b0316148061062b57506000816060015151115b6106475760405162461bcd60e51b815260040161022f90611778565b6040810151610680906001600160a01b03161580159061066857508160a001515b610673578151610676565b60005b8260200151610c35565b60408101516001600160a01b031615610833576003805460018101825560009190915281517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b600890920291820180546001600160a01b03199081166001600160a01b039384161782556020808601517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c86015560408601517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d8601805490931694169390931790556060840151805185949293610782937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e01920190610d9e565b506080820151805161079e916004840191602090910190610d9e565b5060a082015160058201805460c085015115156101000261ff001993151560ff19909216919091179290921691909117905560e082015180516107eb916006840191602090910190610d9e565b506101008201518051610808916007840191602090910190610e03565b505081516001600160a01b03161590508061082457508060a001515b15610833578060200151830192505b506001016105e0565b5060005b6001548110156102925760006001600160a01b03166001828154811061086257fe5b6000918252602090912001546001600160a01b0316146108c8576108c86001828154811061088c57fe5b9060005260206000200160009054906101000a90046001600160a01b031684600284815481106108b857fe5b906000526020600020015461096e565b600101610840565b600061092a856323b872dd60e01b8686866040516024016108f3939291906115cb565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610d5c565b905080516000148061094b57508080602001905181019061094b919061137c565b6109675760405162461bcd60e51b815260040161022f90611722565b5050505050565b600061098f8463095ea7b360e01b85856040516024016108f39291906115ef565b90508051600014806109b05750808060200190518101906109b0919061137c565b6109cc5760405162461bcd60e51b815260040161022f906117dc565b50505050565b60006001600160a01b0382166109e9575047610a68565b6040516370a0823160e01b81526001600160a01b038316906370a0823190610a159030906004016115b7565b60206040518083038186803b158015610a2d57600080fd5b505afa158015610a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a65919061144e565b90505b919050565b80610a7757610b65565b6001600160a01b038316610b07576000826001600160a01b031682604051610a9e906115b4565b60006040518083038185875af1925050503d8060008114610adb576040519150601f19603f3d011682016040523d82523d6000602084013e610ae0565b606091505b5050905080610b015760405162461bcd60e51b815260040161022f906117af565b50610b65565b6000610b288463a9059cbb60e01b85856040516024016108f39291906115ef565b9050805160001480610b49575080806020019051810190610b49919061137c565b6109cc5760405162461bcd60e51b815260040161022f9061174f565b505050565b60005b600154811015610c0d57610bd060018281548110610b8757fe5b9060005260206000200160009054906101000a90046001600160a01b03168361055360018581548110610bb657fe5b6000918252602090912001546001600160a01b03166109d2565b60008060018381548110610be057fe5b60009182526020808320909101546001600160a01b03168352820192909252604001812055600101610b6d565b50610c1a60016000610e3e565b610c2660026000610e3e565b610c3260036000610e5c565b50565b80610c3f576105d8565b6001600160a01b0382166000908152602081905260409020546001541580610c915750826001600160a01b031660018281548110610c7957fe5b6000918252602090912001546001600160a01b031614155b15610d245750600180546001600160a01b038416600081815260208190526040812083905582840184557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6830180546001600160a01b03191690921790915560028054938401815581527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909201919091555b8160028281548110610d3257fe5b90600052602060002001540160028281548110610d4b57fe5b600091825260209091200155505050565b60606000808351602085016000875af13d604051925080835260208301816000823e808201604052828015610d9057610d94565b8282fd5b5050505092915050565b828054828255906000526020600020908101928215610df3579160200282015b82811115610df357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190610dbe565b50610dff929150610e7d565b5090565b828054828255906000526020600020908101928215610df3579160200282015b82811115610df3578251825591602001919060010190610e23565b5080546000825590600052602060002090810190610c329190610e7d565b5080546000825560080290600052602060002090810190610c329190610e92565b5b80821115610dff5760008155600101610e7e565b80821115610dff5780546001600160a01b03199081168255600060018301819055600283018054909216909155610ecc6003830182610e3e565b610eda600483016000610e3e565b60058201805461ffff19169055610ef5600683016000610e3e565b610f03600783016000610e3e565b50600801610e92565b8035610a68816118be565b8051610a68816118be565b600082601f830112610f32578081fd5b81356020610f47610f4283611894565b611870565b8281528181019085830183850287018401881015610f63578586fd5b855b85811015610f8a578135610f78816118be565b84529284019290840190600101610f65565b5090979650505050505050565b600082601f830112610fa7578081fd5b81516020610fb7610f4283611894565b8281528181019085830183850287018401881015610fd3578586fd5b855b85811015610f8a578151610fe8816118be565b84529284019290840190600101610fd5565b600082601f83011261100a578081fd5b8135602061101a610f4283611894565b8281528181019085830183850287018401881015611036578586fd5b855b85811015610f8a57813584529284019290840190600101611038565b8035610a68816118d3565b8051610a68816118d3565b60006080828403121561107b578081fd5b6040516080810181811067ffffffffffffffff8211171561109857fe5b8060405250809150823581526020830135602082015260408301356110bc816118d3565b604082015260608301356110cf816118be565b6060919091015292915050565b60006101c08083850312156110ef578182fd5b6110f881611870565b9150506111048261105f565b81526020820151602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015261114460c08301610f17565b60c082015261115560e08301610f17565b60e0820152610100611168818401610f17565b9082015261012061117a838201610f17565b9082015261014061118c83820161105f565b90820152610160828101519082015261018080830151908201526101a09182015191810191909152919050565b60008060008060e085870312156111ce578384fd5b6111d885356118be565b84359350602085013567ffffffffffffffff808211156111f6578485fd5b818701915087601f830112611209578485fd5b611216610f428335611894565b82358152602080820191908401875b853581101561134d5781358601610120818e03601f1901121561124657898afd5b611251610120611870565b61125d60208301610f0c565b81526040820135602082015261127560608301610f0c565b604082015260808201358781111561128b578b8cfd5b61129a8f602083860101610f22565b60608301525060a0820135878111156112b1578b8cfd5b6112c08f602083860101610f22565b6080830152506112d260c08301611054565b60a08201526112e360e08301611054565b60c0820152610100820135878111156112fa578b8cfd5b6113098f602083860101610f22565b60e08301525061012082013587811115611321578b8cfd5b6113308f602083860101610ffa565b610100830152508552506020938401939190910190600101611225565b50508096505050505061136260408601610f0c565b9150611371866060870161106a565b905092959194509250565b60006020828403121561138d578081fd5b8151611398816118d3565b9392505050565b6000808284036102c08112156113b3578283fd5b610100808212156113c2578384fd5b604051915080820182811067ffffffffffffffff821117156113e057fe5b604052845182526113f36020860161105f565b602083015260408501516040830152606085015160608301526080850151608083015260a085015160a083015260c085015160c083015260e085015160e0830152819350611443868287016110dc565b925050509250929050565b60006020828403121561145f578081fd5b5051919050565b60008060006060848603121561147a578081fd5b8351925060208085015167ffffffffffffffff80821115611499578384fd5b818701915087601f8301126114ac578384fd5b81516114ba610f4282611894565b81815284810190848601868402860187018c10156114d6578788fd5b8795505b838610156114f85780518352600195909501949186019186016114da565b5060408a01519097509450505080831115611511578384fd5b505061151f86828701610f97565b9150509250925092565b6001600160a01b03169052565b6000815480845260208085019450838352808320835b838110156115715781546001600160a01b03168752958201956001918201910161154c565b509495945050505050565b6000815480845260208085019450838352808320835b8381101561157157815487529582019560019182019101611592565b15159052565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6000602080830181845280855480835260409250828601915082848202870101878652848620865b8381101561171457603f198984030185526101206116578461165285546118b2565b611529565b60018301548885015261166d60028401546118b2565b61167988860182611529565b5080606085015261168f81850160038501611536565b905083810360808501526116a68160048501611536565b9050600583015460ff6116be60a087018284166115ae565b60086116d160c088018385841c166115ae565b86840360e08801526116e68460068801611536565b93508684036101008801526116fe846007880161157c565b988b019896509490940193505050600101611630565b509098975050505050505050565b6020808252601390820152721514905394d19154919493d357d19052531151606a1b604082015260600190565b6020808252600f908201526e1514905394d1915497d19052531151608a1b604082015260600190565b60208082526018908201527f4164644c6971756964697479206e6f7420616c6c6f7765640000000000000000604082015260600190565b602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b6020808252600e908201526d1054141493d59157d1905253115160921b604082015260600190565b602080825260139082015272496e636f7272656374204554482076616c756560681b604082015260600190565b81518152602080830151908201526040808301511515908201526060918201516001600160a01b03169181019190915260800190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561188c57fe5b604052919050565b600067ffffffffffffffff8211156118a857fe5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114610c3257600080fd5b8015158114610c3257600080fdfea264697066735822122095fd60e4db1b37b86dfa55d5236f37c57d720299101d89117965a8fcd7042dda64736f6c63430007060033

Deployed Bytecode

0x6080604052600436106100225760003560e01c80636aeba4f11461002e57610029565b3661002957005b600080fd5b61004161003c3660046111b9565b610057565b60405161004e9190611867565b60405180910390f35b60608101516000906001600160a01b03166100725733610078565b81606001515b6001600160a01b03166060830152600061009285876101aa565b9050856001600160a01b031663b1445b6d8260036040518363ffffffff1660e01b81526004016100c29190611608565b6000604051808303818588803b1580156100db57600080fd5b505af11580156100ef573d6000803e3d6000fd5b5050505050600084905060008061010f8387600001518860200151610299565b91509150826001600160a01b031663c8df9d3182886040518363ffffffff1660e01b81526004016101409190611831565b6020604051808303818588803b15801561015957600080fd5b505af115801561016d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610192919061144e565b945061019e823361048b565b50505050949350505050565b60006101b683836105dc565b905060005b6001548110156102925760006001600160a01b0316600182815481106101dd57fe5b6000918252602090912001546001600160a01b0316141561023d576002818154811061020557fe5b90600052602060002001543410156102385760405162461bcd60e51b815260040161022f90611804565b60405180910390fd5b61028a565b61028a6001828154811061024d57fe5b9060005260206000200160009054906101000a90046001600160a01b031633306002858154811061027a57fe5b90600052602060002001546108d0565b6001016101bb565b5092915050565b6060600080856001600160a01b0316634313b9e5866040518263ffffffff1660e01b81526004016102ca9190611867565b6102c06040518083038186803b1580156102e357600080fd5b505afa1580156102f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061031b919061139f565b91505060608160c001516001600160a01b03166379d16e0d8360e00151846101000151886040518463ffffffff1660e01b815260040161035d939291906115cb565b60006040518083038186803b15801561037557600080fd5b505afa158015610389573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103b19190810190611466565b95509150600090505b84518110156104805782610140015180156103fe57508261012001516001600160a01b03168582815181106103eb57fe5b60200260200101516001600160a01b0316145b1561041a5781818151811061040f57fe5b602002602001015193505b60006001600160a01b031685828151811061043157fe5b60200260200101516001600160a01b0316146104785761047885828151811061045657fe5b60200260200101518984848151811061046b57fe5b602002602001015161096e565b6001016103ba565b505050935093915050565b60005b825181101561056057600154158061051a57508281815181106104ad57fe5b60200260200101516001600160a01b031660016000808685815181106104cf57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020548154811061050257fe5b6000918252602090912001546001600160a01b031614155b156105585761055883828151811061052e57fe5b60200260200101518361055386858151811061054657fe5b60200260200101516109d2565b610a6d565b60010161048e565b5060015415806105be5750600080805260208190527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5546001805490919081106105a657fe5b6000918252602090912001546001600160a01b031614155b156105cf576105cf60008247610a6d565b6105d881610b6a565b5050565b6000805b835181101561083c5760008482815181106105f757fe5b6020026020010151905060006001600160a01b031681604001516001600160a01b0316148061062b57506000816060015151115b6106475760405162461bcd60e51b815260040161022f90611778565b6040810151610680906001600160a01b03161580159061066857508160a001515b610673578151610676565b60005b8260200151610c35565b60408101516001600160a01b031615610833576003805460018101825560009190915281517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b600890920291820180546001600160a01b03199081166001600160a01b039384161782556020808601517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c86015560408601517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d8601805490931694169390931790556060840151805185949293610782937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e01920190610d9e565b506080820151805161079e916004840191602090910190610d9e565b5060a082015160058201805460c085015115156101000261ff001993151560ff19909216919091179290921691909117905560e082015180516107eb916006840191602090910190610d9e565b506101008201518051610808916007840191602090910190610e03565b505081516001600160a01b03161590508061082457508060a001515b15610833578060200151830192505b506001016105e0565b5060005b6001548110156102925760006001600160a01b03166001828154811061086257fe5b6000918252602090912001546001600160a01b0316146108c8576108c86001828154811061088c57fe5b9060005260206000200160009054906101000a90046001600160a01b031684600284815481106108b857fe5b906000526020600020015461096e565b600101610840565b600061092a856323b872dd60e01b8686866040516024016108f3939291906115cb565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610d5c565b905080516000148061094b57508080602001905181019061094b919061137c565b6109675760405162461bcd60e51b815260040161022f90611722565b5050505050565b600061098f8463095ea7b360e01b85856040516024016108f39291906115ef565b90508051600014806109b05750808060200190518101906109b0919061137c565b6109cc5760405162461bcd60e51b815260040161022f906117dc565b50505050565b60006001600160a01b0382166109e9575047610a68565b6040516370a0823160e01b81526001600160a01b038316906370a0823190610a159030906004016115b7565b60206040518083038186803b158015610a2d57600080fd5b505afa158015610a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a65919061144e565b90505b919050565b80610a7757610b65565b6001600160a01b038316610b07576000826001600160a01b031682604051610a9e906115b4565b60006040518083038185875af1925050503d8060008114610adb576040519150601f19603f3d011682016040523d82523d6000602084013e610ae0565b606091505b5050905080610b015760405162461bcd60e51b815260040161022f906117af565b50610b65565b6000610b288463a9059cbb60e01b85856040516024016108f39291906115ef565b9050805160001480610b49575080806020019051810190610b49919061137c565b6109cc5760405162461bcd60e51b815260040161022f9061174f565b505050565b60005b600154811015610c0d57610bd060018281548110610b8757fe5b9060005260206000200160009054906101000a90046001600160a01b03168361055360018581548110610bb657fe5b6000918252602090912001546001600160a01b03166109d2565b60008060018381548110610be057fe5b60009182526020808320909101546001600160a01b03168352820192909252604001812055600101610b6d565b50610c1a60016000610e3e565b610c2660026000610e3e565b610c3260036000610e5c565b50565b80610c3f576105d8565b6001600160a01b0382166000908152602081905260409020546001541580610c915750826001600160a01b031660018281548110610c7957fe5b6000918252602090912001546001600160a01b031614155b15610d245750600180546001600160a01b038416600081815260208190526040812083905582840184557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6830180546001600160a01b03191690921790915560028054938401815581527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909201919091555b8160028281548110610d3257fe5b90600052602060002001540160028281548110610d4b57fe5b600091825260209091200155505050565b60606000808351602085016000875af13d604051925080835260208301816000823e808201604052828015610d9057610d94565b8282fd5b5050505092915050565b828054828255906000526020600020908101928215610df3579160200282015b82811115610df357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190610dbe565b50610dff929150610e7d565b5090565b828054828255906000526020600020908101928215610df3579160200282015b82811115610df3578251825591602001919060010190610e23565b5080546000825590600052602060002090810190610c329190610e7d565b5080546000825560080290600052602060002090810190610c329190610e92565b5b80821115610dff5760008155600101610e7e565b80821115610dff5780546001600160a01b03199081168255600060018301819055600283018054909216909155610ecc6003830182610e3e565b610eda600483016000610e3e565b60058201805461ffff19169055610ef5600683016000610e3e565b610f03600783016000610e3e565b50600801610e92565b8035610a68816118be565b8051610a68816118be565b600082601f830112610f32578081fd5b81356020610f47610f4283611894565b611870565b8281528181019085830183850287018401881015610f63578586fd5b855b85811015610f8a578135610f78816118be565b84529284019290840190600101610f65565b5090979650505050505050565b600082601f830112610fa7578081fd5b81516020610fb7610f4283611894565b8281528181019085830183850287018401881015610fd3578586fd5b855b85811015610f8a578151610fe8816118be565b84529284019290840190600101610fd5565b600082601f83011261100a578081fd5b8135602061101a610f4283611894565b8281528181019085830183850287018401881015611036578586fd5b855b85811015610f8a57813584529284019290840190600101611038565b8035610a68816118d3565b8051610a68816118d3565b60006080828403121561107b578081fd5b6040516080810181811067ffffffffffffffff8211171561109857fe5b8060405250809150823581526020830135602082015260408301356110bc816118d3565b604082015260608301356110cf816118be565b6060919091015292915050565b60006101c08083850312156110ef578182fd5b6110f881611870565b9150506111048261105f565b81526020820151602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015261114460c08301610f17565b60c082015261115560e08301610f17565b60e0820152610100611168818401610f17565b9082015261012061117a838201610f17565b9082015261014061118c83820161105f565b90820152610160828101519082015261018080830151908201526101a09182015191810191909152919050565b60008060008060e085870312156111ce578384fd5b6111d885356118be565b84359350602085013567ffffffffffffffff808211156111f6578485fd5b818701915087601f830112611209578485fd5b611216610f428335611894565b82358152602080820191908401875b853581101561134d5781358601610120818e03601f1901121561124657898afd5b611251610120611870565b61125d60208301610f0c565b81526040820135602082015261127560608301610f0c565b604082015260808201358781111561128b578b8cfd5b61129a8f602083860101610f22565b60608301525060a0820135878111156112b1578b8cfd5b6112c08f602083860101610f22565b6080830152506112d260c08301611054565b60a08201526112e360e08301611054565b60c0820152610100820135878111156112fa578b8cfd5b6113098f602083860101610f22565b60e08301525061012082013587811115611321578b8cfd5b6113308f602083860101610ffa565b610100830152508552506020938401939190910190600101611225565b50508096505050505061136260408601610f0c565b9150611371866060870161106a565b905092959194509250565b60006020828403121561138d578081fd5b8151611398816118d3565b9392505050565b6000808284036102c08112156113b3578283fd5b610100808212156113c2578384fd5b604051915080820182811067ffffffffffffffff821117156113e057fe5b604052845182526113f36020860161105f565b602083015260408501516040830152606085015160608301526080850151608083015260a085015160a083015260c085015160c083015260e085015160e0830152819350611443868287016110dc565b925050509250929050565b60006020828403121561145f578081fd5b5051919050565b60008060006060848603121561147a578081fd5b8351925060208085015167ffffffffffffffff80821115611499578384fd5b818701915087601f8301126114ac578384fd5b81516114ba610f4282611894565b81815284810190848601868402860187018c10156114d6578788fd5b8795505b838610156114f85780518352600195909501949186019186016114da565b5060408a01519097509450505080831115611511578384fd5b505061151f86828701610f97565b9150509250925092565b6001600160a01b03169052565b6000815480845260208085019450838352808320835b838110156115715781546001600160a01b03168752958201956001918201910161154c565b509495945050505050565b6000815480845260208085019450838352808320835b8381101561157157815487529582019560019182019101611592565b15159052565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6000602080830181845280855480835260409250828601915082848202870101878652848620865b8381101561171457603f198984030185526101206116578461165285546118b2565b611529565b60018301548885015261166d60028401546118b2565b61167988860182611529565b5080606085015261168f81850160038501611536565b905083810360808501526116a68160048501611536565b9050600583015460ff6116be60a087018284166115ae565b60086116d160c088018385841c166115ae565b86840360e08801526116e68460068801611536565b93508684036101008801526116fe846007880161157c565b988b019896509490940193505050600101611630565b509098975050505050505050565b6020808252601390820152721514905394d19154919493d357d19052531151606a1b604082015260600190565b6020808252600f908201526e1514905394d1915497d19052531151608a1b604082015260600190565b60208082526018908201527f4164644c6971756964697479206e6f7420616c6c6f7765640000000000000000604082015260600190565b602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b6020808252600e908201526d1054141493d59157d1905253115160921b604082015260600190565b602080825260139082015272496e636f7272656374204554482076616c756560681b604082015260600190565b81518152602080830151908201526040808301511515908201526060918201516001600160a01b03169181019190915260800190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561188c57fe5b604052919050565b600067ffffffffffffffff8211156118a857fe5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114610c3257600080fd5b8015158114610c3257600080fdfea264697066735822122095fd60e4db1b37b86dfa55d5236f37c57d720299101d89117965a8fcd7042dda64736f6c63430007060033

Deployed Bytecode Sourcemap

13669:7340:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13924:827;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;14191:21;;;;14136:18;;-1:-1:-1;;;;;14191:35:0;:72;;14253:10;14191:72;;;14229:7;:21;;;14191:72;-1:-1:-1;;;;;14167:96:0;:21;;;:96;14274:11;14288:57;14319:10;14331:13;14288:30;:57::i;:::-;14274:71;;14364:13;-1:-1:-1;;;;;14356:30:0;;14395:3;14400:11;14356:56;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14423:18;14454:15;14423:47;;14482:31;14515:21;14540:73;14568:8;14578:7;:18;;;14598:7;:14;;;14540:27;:73::i;:::-;14481:132;;;;14637:8;-1:-1:-1;;;;;14637:21:0;;14667:13;14682:7;14637:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14624:66;;14701:42;14716:14;14732:10;14701:14;:42::i;:::-;13924:827;;;;;;;;;;:::o;16241:553::-;16353:11;16383:53;16415:10;16427:8;16383:31;:53::i;:::-;16377:59;;16451:9;16447:340;16470:17;:24;16466:28;;16447:340;;;16551:1;-1:-1:-1;;;;;16519:34:0;:17;16537:1;16519:20;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16519:20:0;:34;16516:260;;;16595:13;16609:1;16595:16;;;;;;;;;;;;;;;;16582:9;:29;;16574:61;;;;-1:-1:-1;;;16574:61:0;;;;;;;:::i;:::-;;;;;;;;;16516:260;;;16676:84;16694:17;16712:1;16694:20;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16694:20:0;16716:10;16736:4;16743:13;16757:1;16743:16;;;;;;;;;;;;;;;;16676:17;:84::i;:::-;16496:3;;16447:340;;;;16241:553;;;;:::o;14759:848::-;14875:31;14908:21;14945:33;14982:8;-1:-1:-1;;;;;14982:14:0;;14997:10;14982:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14942:66;;;15019:30;15101:9;:19;;;-1:-1:-1;;;;;15096:39:0;;15136:9;:35;;;15173:9;:26;;;15201:13;15096:119;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15096:119:0;;;;;;;;;;;;:::i;:::-;15060:155;-1:-1:-1;15060:155:0;-1:-1:-1;15230:9:0;;-1:-1:-1;15226:374:0;15249:14;:21;15245:1;:25;15226:374;;;15295:9;:22;;;:72;;;;;15342:9;:25;;;-1:-1:-1;;;;;15321:46:0;:14;15336:1;15321:17;;;;;;;;;;;;;;-1:-1:-1;;;;;15321:46:0;;15295:72;15292:144;;;15404:13;15418:1;15404:16;;;;;;;;;;;;;;15388:32;;15292:144;15482:1;-1:-1:-1;;;;;15453:31:0;:14;15468:1;15453:17;;;;;;;;;;;;;;-1:-1:-1;;;;;15453:31:0;;15450:139;;15505:68;15518:14;15533:1;15518:17;;;;;;;;;;;;;;15545:8;15556:13;15570:1;15556:16;;;;;;;;;;;;;;15505:12;:68::i;:::-;15272:3;;15226:374;;;;14759:848;;;;;;;;:::o;15615:618::-;15713:9;15709:293;15732:14;:21;15728:1;:25;15709:293;;;15778:17;:24;:29;;:103;;;15864:14;15879:1;15864:17;;;;;;;;;;;;;;-1:-1:-1;;;;;15811:70:0;:17;15829:11;:30;15841:14;15856:1;15841:17;;;;;;;;;;;;;;-1:-1:-1;;;;;15829:30:0;-1:-1:-1;;;;;15829:30:0;;;;;;;;;;;;;15811:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15811:49:0;:70;;15778:103;15775:216;;;15902:73;15916:14;15931:1;15916:17;;;;;;;;;;;;;;15935:8;15945:29;15956:14;15971:1;15956:17;;;;;;;;;;;;;;15945:10;:29::i;:::-;15902:13;:73::i;:::-;15755:3;;15709:293;;;-1:-1:-1;16015:17:0;:24;:29;;:89;;-1:-1:-1;16102:1:0;16066:23;;;;;;;;;16048:17;:42;;:17;;16066:23;16048:42;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16048:42:0;:56;;16015:89;16012:179;;;16121:58;16143:1;16147:8;16157:21;16121:13;:58::i;:::-;16201:24;16216:8;16201:14;:24::i;:::-;15615:618;;:::o;16802:1066::-;16915:11;;16939:695;16962:10;:17;16958:1;:21;16939:695;;;17001:32;17036:10;17047:1;17036:13;;;;;;;;;;;;;;17001:48;;17103:1;-1:-1:-1;;;;;17072:33:0;:9;:19;;;-1:-1:-1;;;;;17072:33:0;;:80;;;;17151:1;17109:9;:32;;;:39;:43;17072:80;17064:117;;;;-1:-1:-1;;;17064:117:0;;;;;;;:::i;:::-;17215:19;;;;17197:147;;-1:-1:-1;;;;;17215:33:0;;;;;:57;;;17252:9;:20;;;17215:57;:100;;17288:27;;17215:100;;;17283:1;17215:100;17317:9;:26;;;17197:17;:147::i;:::-;17362:19;;;;-1:-1:-1;;;;;17362:33:0;;17359:264;;17416:11;:27;;;;;;;-1:-1:-1;17416:27:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17416:27:0;;;-1:-1:-1;;;;;17416:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;17416:27:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;17416:27:0;;;;;;;;;;;;;;;;;-1:-1:-1;;17416:27:0;;;-1:-1:-1;;17416:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;17416:27:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;17465:27:0;;-1:-1:-1;;;;;17465:41:0;;;-1:-1:-1;17465:41:0;:65;;;17510:9;:20;;;17465:65;17462:146;;;17562:9;:26;;;17555:33;;;;17462:146;-1:-1:-1;16981:3:0;;16939:695;;;;17648:9;17644:217;17668:17;:24;17664:28;;17644:217;;;17749:1;-1:-1:-1;;;;;17717:34:0;:17;17735:1;17717:20;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17717:20:0;:34;17714:136;;17772:62;17785:17;17803:1;17785:20;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17785:20:0;17807:8;17817:13;17831:1;17817:16;;;;;;;;;;;;;;;;17772:12;:62::i;:::-;17694:3;;17644:217;;20028:362;20143:23;20169:114;20175:17;20217:47;;;20266:4;20272:2;20276:5;20194:88;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;20194:88:0;;;;;;;;;;;;;;-1:-1:-1;;;;;20194:88:0;-1:-1:-1;;;;;;20194:88:0;;;;;;;;;;20169:5;:114::i;:::-;20143:140;;20302:10;:17;20323:1;20302:22;:56;;;;20339:10;20328:30;;;;;;;;;;;;:::i;:::-;20294:88;;;;-1:-1:-1;;;20294:88:0;;;;;;;:::i;:::-;20028:362;;;;;:::o;19110:327::-;19206:23;19232:103;19238:17;19280:42;;;19324:2;19328:5;19257:77;;;;;;;;;:::i;19232:103::-;19206:129;;19354:10;:17;19375:1;19354:22;:56;;;;19391:10;19380:30;;;;;;;;;;;;:::i;:::-;19346:83;;;;-1:-1:-1;;;19346:83:0;;;;;;;:::i;:::-;19110:327;;;;:::o;18863:239::-;18926:7;-1:-1:-1;;;;;18949:26:0;;18946:86;;-1:-1:-1;18999:21:0;18992:28;;18946:86;19049:45;;-1:-1:-1;;;19049:45:0;;-1:-1:-1;;;;;19049:30:0;;;;;:45;;19088:4;;19049:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19042:52;;18863:239;;;;:::o;19445:575::-;19544:10;19541:48;;19571:7;;19541:48;-1:-1:-1;;;;;19602:31:0;;19599:178;;19651:11;19667:2;-1:-1:-1;;;;;19667:7:0;19681:5;19667:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19650:41;;;19714:6;19706:38;;;;-1:-1:-1;;;19706:38:0;;;;;;;:::i;:::-;19759:7;;;19599:178;19787:23;19813:104;19819:17;19861:43;;;19906:2;19910:5;19838:78;;;;;;;;;:::i;19813:104::-;19787:130;;19936:10;:17;19957:1;19936:22;:56;;;;19973:10;19962:30;;;;;;;;;;;;:::i;:::-;19928:84;;;;-1:-1:-1;;;19928:84:0;;;;;;;:::i;19445:575::-;;;;:::o;18477:378::-;18542:9;18538:215;18561:17;:24;18557:28;;18538:215;;;18607:79;18621:17;18639:1;18621:20;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18621:20:0;18643:8;18653:32;18664:17;18682:1;18664:20;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18664:20:0;18653:10;:32::i;18607:79::-;18708:11;:33;18720:17;18738:1;18720:20;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18720:20:0;18708:33;;;;;;;;;;;;18701:40;18720:20;18587:3;18538:215;;;-1:-1:-1;18763:24:0;18770:17;;18763:24;:::i;:::-;18798:20;18805:13;;18798:20;:::i;:::-;18829:18;18836:11;;18829:18;:::i;:::-;18477:378;:::o;17876:593::-;17978:21;17975:59;;18016:7;;17975:59;-1:-1:-1;;;;;18065:30:0;;18046:16;18065:30;;;;;;;;;;;18111:17;:24;:29;;:81;;;18175:17;-1:-1:-1;;;;;18144:48:0;:17;18162:8;18144:27;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18144:27:0;:48;;18111:81;18108:275;;;-1:-1:-1;18254:17:0;:24;;-1:-1:-1;;;;;18209:30:0;;:11;:30;;;;;;;;;;:70;;;18294:41;;;;;;;;;;-1:-1:-1;;;;;;18294:41:0;;;;;;;18350:13;:21;;;;;;;;;;;;;;;;;18108:275;18445:16;18419:13;18433:8;18419:23;;;;;;;;;;;;;;;;:42;18393:13;18407:8;18393:23;;;;;;;;;;;;;;;;;:68;-1:-1:-1;17876:593:0;;:::o;20398:608::-;20469:23;20607:1;20604;20594:7;20588:14;20581:4;20572:7;20568:18;20565:1;20555:8;20548:5;20543:66;20635:16;20685:4;20679:11;20665:25;;20723:4;20711:10;20704:24;20788:4;20776:10;20772:21;20849:4;20846:1;20822:22;20807:47;20881:33;;;20875:4;20868:47;20936:6;20943:45;;;;20929:59;;20943:45;20982:4;20958:22;20951:36;20929:59;;;;;20514: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:1304::-;;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;4240:52;4287:3;4276:9;4272:19;4240:52;:::i;:::-;4234:3;4227:5;4223:15;4216:77;4326:52;4373:3;4362:9;4358:19;4326:52;:::i;:::-;4320:3;4313:5;4309:15;4302:77;4398:3;4433:51;4480:2;4469:9;4465:18;4433:51;:::i;:::-;4417:14;;;4410:75;4504:3;4539:51;4571:18;;;4539:51;:::i;:::-;4523:14;;;4516:75;4610:3;4645:48;4674:18;;;4645:48;:::i;:::-;4629:14;;;4622:72;4713:3;4754:18;;;4748:25;4732:14;;;4725:49;4793:3;4834:18;;;4828:25;4812:14;;;4805:49;4873:3;4914:18;;;4908:25;4892:14;;;4885:49;;;;4633:5;3723:1217;-1:-1:-1;3723:1217:1:o;4945:2658::-;;;;;5203:3;5191:9;5182:7;5178:23;5174:33;5171:2;;;5225:6;5217;5210:22;5171:2;5243:51;5283:9;5270:23;5243:51;:::i;:::-;5326:9;5313:23;5303:33;;5387:2;5376:9;5372:18;5359:32;5410:18;5451:2;5443:6;5440:14;5437:2;;;5472:6;5464;5457:22;5437:2;5515:6;5504:9;5500:22;5490:32;;5560:7;5553:4;5549:2;5545:13;5541:27;5531:2;;5587:6;5579;5572:22;5531:2;5616:79;5631:63;5690:2;5677:16;5631:63;:::i;5616:79::-;5741:16;;5729:29;;5783:2;5774:12;;;;5717:3;5806:11;;5835:6;5850:1573;5877:2;5864:16;5861:1;5858:23;5850:1573;;;5941:17;;5933:26;;6011:6;5983:16;;;-1:-1:-1;;5979:30:1;5975:43;5972:2;;;6036:6;6028;6021:22;5972:2;6071:22;6086:6;6071:22;:::i;:::-;6120:33;6149:2;6145;6141:11;6120:33;:::i;:::-;6113:5;6106:48;6211:2;6207;6203:11;6190:25;6185:2;6178:5;6174:14;6167:49;6252:33;6281:2;6277;6273:11;6252:33;:::i;:::-;6247:2;6240:5;6236:14;6229:57;6336:3;6332:2;6328:12;6315:26;6370:2;6360:8;6357:16;6354:2;;;6391:6;6383;6376:22;6354:2;6436:71;6499:7;6494:2;6483:8;6479:2;6475:17;6471:26;6436:71;:::i;:::-;6431:2;6424:5;6420:14;6413:95;;6558:3;6554:2;6550:12;6537:26;6592:2;6582:8;6579:16;6576:2;;;6613:6;6605;6598:22;6576:2;6659:71;6722:7;6717:2;6706:8;6702:2;6698:17;6694:26;6659:71;:::i;:::-;6653:3;6646:5;6642:15;6635:96;;6768:31;6794:3;6790:2;6786:12;6768:31;:::i;:::-;6762:3;6755:5;6751:15;6744:56;6837:31;6863:3;6859:2;6855:12;6837:31;:::i;:::-;6831:3;6824:5;6820:15;6813:56;6919:3;6915:2;6911:12;6898:26;6953:2;6943:8;6940:16;6937:2;;;6974:6;6966;6959:22;6937:2;7020:71;7083:7;7078:2;7067:8;7063:2;7059:17;7055:26;7020:71;:::i;:::-;7014:3;7007:5;7003:15;6996:96;;7142:6;7138:2;7134:15;7121:29;7179:2;7169:8;7166:16;7163:2;;;7200:6;7192;7185:22;7163:2;7246:71;7309:7;7304:2;7293:8;7289:2;7285:17;7281:26;7246:71;:::i;:::-;7240:3;7229:15;;7222:96;-1:-1:-1;7331:18:1;;-1:-1:-1;7378:2:1;7369:12;;;;7401;;;;;5896:1;5889:9;5850:1573;;;5854:3;;7442:5;7432:15;;;;;;7466:40;7502:2;7491:9;7487:18;7466:40;:::i;:::-;7456:50;;7525:72;7589:7;7584:2;7573:9;7569:18;7525:72;:::i;:::-;7515:82;;5161:2442;;;;;;;:::o;7608:257::-;;7728:2;7716:9;7707:7;7703:23;7699:32;7696:2;;;7749:6;7741;7734:22;7696:2;7786:9;7780:16;7805:30;7829:5;7805:30;:::i;:::-;7854:5;7686:179;-1:-1:-1;;;7686:179:1:o;7870:1134::-;;;8063:9;8054:7;8050:23;8093:3;8089:2;8085:12;8082:2;;;8115:6;8107;8100:22;8082:2;8143:6;8169:2;8165;8161:11;8158:2;;;8190:6;8182;8175:22;8158:2;8228;8222:9;8208:23;;8270:2;8262:6;8258:15;8339:6;8327:10;8324:22;8303:18;8291:10;8288:34;8285:62;8282:2;;;8350:9;8282:2;8377;8370:22;8416:16;;8401:32;;8466:48;8510:2;8495:18;;8466:48;:::i;:::-;8461:2;8453:6;8449:15;8442:73;8569:2;8558:9;8554:18;8548:25;8543:2;8535:6;8531:15;8524:50;8628:2;8617:9;8613:18;8607:25;8602:2;8594:6;8590:15;8583:50;8688:3;8677:9;8673:19;8667:26;8661:3;8653:6;8649:16;8642:52;8749:3;8738:9;8734:19;8728:26;8722:3;8714:6;8710:16;8703:52;8810:3;8799:9;8795:19;8789:26;8783:3;8775:6;8771:16;8764:52;8871:3;8860:9;8856:19;8850:26;8844:3;8836:6;8832:16;8825:52;8896:6;8886:16;;8921:77;8990:7;8985:2;8974:9;8970:18;8921:77;:::i;:::-;8911:87;;;;8030:974;;;;;:::o;9009:194::-;;9132:2;9120:9;9111:7;9107:23;9103:32;9100:2;;;9153:6;9145;9138:22;9100:2;-1:-1:-1;9181:16:1;;9090:113;-1:-1:-1;9090:113:1:o;9208:1271::-;;;;9415:2;9403:9;9394:7;9390:23;9386:32;9383:2;;;9436:6;9428;9421:22;9383:2;9470:9;9464:16;9454:26;;9499:2;9545;9534:9;9530:18;9524:25;9568:18;9609:2;9601:6;9598:14;9595:2;;;9630:6;9622;9615:22;9595:2;9673:6;9662:9;9658:22;9648:32;;9718:7;9711:4;9707:2;9703:13;9699:27;9689:2;;9745:6;9737;9730:22;9689:2;9779;9773:9;9802:65;9817:49;9863:2;9817:49;:::i;9802:65::-;9901:15;;;9932:12;;;;9964:11;;;10002;;;9994:20;;9990:29;;9987:42;-1:-1:-1;9984:2:1;;;10047:6;10039;10032:22;9984:2;10074:6;10065:15;;10089:156;10103:2;10100:1;10097:9;10089:156;;;10160:10;;10148:23;;10121:1;10114:9;;;;;10191:12;;;;10223;;10089:156;;;-1:-1:-1;10315:2:1;10300:18;;10294:25;10264:5;;-1:-1:-1;10294:25:1;-1:-1:-1;;;10331:16:1;;;10328:2;;;10365:6;10357;10350:22;10328:2;;;10393:80;10465:7;10454:8;10443:9;10439:24;10393:80;:::i;:::-;10383:90;;;9373:1106;;;;;:::o;10484:106::-;-1:-1:-1;;;;;10552:31:1;10540:44;;10530:60::o;10595:507::-;;10700:5;10694:12;10727:6;10722:3;10715:19;10753:4;10782:2;10777:3;10773:12;10766:19;;10806:5;10801:3;10794:18;10850:2;10845:3;10835:18;10871:3;10883:194;10897:6;10894:1;10891:13;10883:194;;;10962:13;;-1:-1:-1;;;;;10958:39:1;10946:52;;11018:12;;;;10994:1;11053:14;;;;10912:9;10883:194;;;-1:-1:-1;11093:3:1;;10670:432;-1:-1:-1;;;;;10670:432:1:o;11107:481::-;;11212:5;11206:12;11239:6;11234:3;11227:19;11265:4;11294:2;11289:3;11285:12;11278:19;;11318:5;11313:3;11306:18;11362:2;11357:3;11347:18;11383:3;11395:168;11409:6;11406:1;11403:13;11395:168;;;11470:13;;11458:26;;11504:12;;;;11551:1;11539:14;;;;11424:9;11395:168;;11593:93;11665:13;11658:21;11646:34;;11636:50::o;11691:205::-;11891:3;11882:14::o;11901:211::-;-1:-1:-1;;;;;12073:32:1;;;;12055:51;;12043:2;12028:18;;12010:102::o;12117:375::-;-1:-1:-1;;;;;12375:15:1;;;12357:34;;12427:15;;;;12422:2;12407:18;;12400:43;12474:2;12459:18;;12452:34;;;;12307:2;12292:18;;12274:218::o;12497:274::-;-1:-1:-1;;;;;12689:32:1;;;;12671:51;;12753:2;12738:18;;12731:34;12659:2;12644:18;;12626:145::o;12776:2025::-;;13003:2;13043;13032:9;13028:18;13073:2;13062:9;13055:21;13096:6;13131;13125:13;13162:6;13154;13147:22;13188:2;13178:12;;13221:2;13210:9;13206:18;13199:25;;13284:2;13278;13270:6;13266:15;13255:9;13251:31;13247:40;13309:6;13303:4;13296:20;13355:2;13349:4;13339:19;13376:4;13389:1383;13403:6;13400:1;13397:13;13389:1383;;;13496:2;13492:7;13480:9;13472:6;13468:22;13464:36;13459:3;13452:49;13524:6;13543:75;13611:6;13564:45;13601:6;13595:13;13564:45;:::i;:::-;13543:75;:::i;:::-;13673:1;13665:6;13661:14;13655:21;13650:2;13642:6;13638:15;13631:46;13710:56;13759:4;13751:6;13747:17;13741:24;13710:56;:::i;:::-;13779:51;13826:2;13818:6;13814:15;13800:12;13779:51;:::i;:::-;;13869:2;13862:4;13854:6;13850:17;13843:29;13899:78;13973:2;13965:6;13961:15;13954:4;13946:6;13942:17;13899:78;:::i;:::-;13885:92;;14028:6;14020;14016:19;14009:4;14001:6;13997:17;13990:46;14063:69;14125:6;14118:4;14110:6;14106:17;14063:69;:::i;:::-;14049:83;;14180:4;14172:6;14168:17;14162:24;14209:4;14226:56;14276:4;14268:6;14264:17;14259:2;14248:9;14244:18;14226:56;:::i;:::-;14305:1;14319:65;14378:4;14370:6;14366:17;14361:2;14349:9;14345:2;14341:18;14337:27;14319:65;:::i;:::-;14435:6;14427;14423:19;14416:4;14408:6;14404:17;14397:46;14470:69;14532:6;14525:4;14517:6;14513:17;14470:69;:::i;:::-;14456:83;;14592:6;14584;14580:19;14571:6;14563;14559:19;14552:48;14623:69;14685:6;14678:4;14670:6;14666:17;14623:69;:::i;:::-;14750:12;;;;14613:79;-1:-1:-1;14715:15:1;;;;;-1:-1:-1;;;13425:1:1;13418:9;13389:1383;;;-1:-1:-1;14789:6:1;;12983:1818;-1:-1:-1;;;;;;;;12983:1818:1:o;14806:343::-;15008:2;14990:21;;;15047:2;15027:18;;;15020:30;-1:-1:-1;;;15081:2:1;15066:18;;15059:49;15140:2;15125:18;;14980:169::o;15154:339::-;15356:2;15338:21;;;15395:2;15375:18;;;15368:30;-1:-1:-1;;;15429:2:1;15414:18;;15407:45;15484:2;15469:18;;15328:165::o;15498:348::-;15700:2;15682:21;;;15739:2;15719:18;;;15712:30;15778:26;15773:2;15758:18;;15751:54;15837:2;15822:18;;15672:174::o;15851:343::-;16053:2;16035:21;;;16092:2;16072:18;;;16065:30;-1:-1:-1;;;16126:2:1;16111:18;;16104:49;16185:2;16170:18;;16025:169::o;16199:338::-;16401:2;16383:21;;;16440:2;16420:18;;;16413:30;-1:-1:-1;;;16474:2:1;16459:18;;16452:44;16528:2;16513:18;;16373:164::o;16542:343::-;16744:2;16726:21;;;16783:2;16763:18;;;16756:30;-1:-1:-1;;;16817:2:1;16802:18;;16795:49;16876:2;16861:18;;16716:169::o;16890:494::-;17133:13;;17115:32;;17203:4;17191:17;;;17185:24;17163:20;;;17156:54;17280:4;17268:17;;;17262:24;17255:32;17248:40;17226:20;;;17219:70;17349:4;17337:17;;;17331:24;-1:-1:-1;;;;;17327:50:1;17305:20;;;17298:80;;;;17102:3;17087:19;;17069:315::o;17389:177::-;17535:25;;;17523:2;17508:18;;17490:76::o;17571:242::-;17641:2;17635:9;17671:17;;;17718:18;17703:34;;17739:22;;;17700:62;17697:2;;;17765:9;17697:2;17792;17785:22;17615:198;;-1:-1:-1;17615:198:1:o;17818:183::-;;17917:18;17909:6;17906:30;17903:2;;;17939:9;17903:2;-1:-1:-1;17990:4:1;17971:17;;;17967:28;;17893:108::o;18006:120::-;-1:-1:-1;;;;;18089:31:1;;18068:58::o;18131:133::-;-1:-1:-1;;;;;18208:31:1;;18198:42;;18188:2;;18254:1;18251;18244:12;18269:120;18357:5;18350:13;18343:21;18336:5;18333:32;18323:2;;18379:1;18376;18369:12

Swarm Source

ipfs://95fd60e4db1b37b86dfa55d5236f37c57d720299101d89117965a8fcd7042dda

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.