ETH Price: $2,405.83 (-0.51%)

Contract

0xbDBa11D5A89ED8CA542F801F785270c1d773B3F0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040168852612023-03-22 19:39:11542 days ago1679513951IN
 Create: ConnectV2AaveV2Import
0 ETH0.0976592130

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ConnectV2AaveV2Import

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : main.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import { TokenInterface } from "../common/interfaces.sol";
import { AaveInterface, ATokenInterface } from "./interfaces.sol";
import { Helpers } from "./helpers.sol";
import { Events } from "./events.sol";

abstract contract AaveResolver is Helpers, Events {
    function _TransferAtokens(
        uint _length,
        AaveInterface aave,
        ATokenInterface[] memory atokenContracts,
        uint[] memory amts,
        address[] memory tokens,
        address userAccount
    ) internal {
        for (uint i = 0; i < _length; i++) {
            if (amts[i] > 0) {
                uint256 _amt = amts[i];
                require(atokenContracts[i].transferFrom(userAccount, address(this), _amt), "allowance?");
                
                if (!getIsColl(tokens[i], address(this))) {
                    aave.setUserUseReserveAsCollateral(tokens[i], true);
                }
            }
        }
    }

    function _borrowOne(AaveInterface aave, address token, uint amt, uint rateMode) private {
        aave.borrow(token, amt, rateMode, referalCode, address(this));
    }

    function _paybackBehalfOne(AaveInterface aave, address token, uint amt, uint rateMode, address user) private {
        aave.repay(token, amt, rateMode, user);
    }

    function _BorrowStable(
        uint _length,
        AaveInterface aave,
        address[] memory tokens,
        uint256[] memory amts
    ) internal {
        for (uint i = 0; i < _length; i++) {
            if (amts[i] > 0) {
                _borrowOne(aave, tokens[i], amts[i], 1);
            }
        }
    }

    function _BorrowVariable(
        uint _length,
        AaveInterface aave,
        address[] memory tokens,
        uint256[] memory amts
    ) internal {
        for (uint i = 0; i < _length; i++) {
            if (amts[i] > 0) {
                _borrowOne(aave, tokens[i], amts[i], 2);
            }
        }
    }

    function _PaybackStable(
        uint _length,
        AaveInterface aave,
        address[] memory tokens,
        uint256[] memory amts,
        address user
    ) internal {
        for (uint i = 0; i < _length; i++) {
            if (amts[i] > 0) {
                _paybackBehalfOne(aave, tokens[i], amts[i], 1, user);
            }
        }
    }

    function _PaybackVariable(
        uint _length,
        AaveInterface aave,
        address[] memory tokens,
        uint256[] memory amts,
        address user
    ) internal {
        for (uint i = 0; i < _length; i++) {
            if (amts[i] > 0) {
                _paybackBehalfOne(aave, tokens[i], amts[i], 2, user);
            }
        }
    }

    function getBorrowAmount(address _token, address userAccount) 
        internal
        view
        returns
    (
        uint256 stableBorrow,
        uint256 variableBorrow
    ) {
        (
            ,
            address stableDebtTokenAddress,
            address variableDebtTokenAddress
        ) = aaveData.getReserveTokensAddresses(_token);

        stableBorrow = ATokenInterface(stableDebtTokenAddress).balanceOf(userAccount);
        variableBorrow = ATokenInterface(variableDebtTokenAddress).balanceOf(userAccount);
    }
}

contract AaveImportHelpers is AaveResolver {
    struct ImportData {
        address[] _supplyTokens;
        address[] _borrowTokens;
        ATokenInterface[] aTokens;

        uint[] supplyAmts;
        uint[] supplySplitAmts;
        uint[] supplyFinalAmts;

        uint[] variableBorrowAmts;
        uint[] variableBorrowFinalAmts;
        uint[] variableBorrowSplitAmts;
        uint[] variableBorrowAmtsWithFee;
        uint[] variableBorrowFinalAmtsWithFee;
        uint[] variableBorrowSplitAmtsWithFee;

        uint[] totalBorrowAmts;
        uint[] totalBorrowAmtsFinalAmts;
        uint[] totalBorrowAmtsSplitAmts;
        uint[] totalBorrowAmtsWithFee;
        uint[] totalBorrowAmtsFinalAmtsWithFee;
        uint[] totalBorrowAmtsSplitAmtsWithFee;

        uint[] stableBorrowAmts;
        uint[] stableBorrowSplitAmts;
        uint[] stableBorrowFinalAmts;
        uint[] stableBorrowAmtsWithFee;
        uint[] stableBorrowSplitAmtsWithFee;
        uint[] stableBorrowFinalAmtsWithFee;
    }

    struct ImportInputData {
        address[] supplyTokens;
        address[] borrowTokens;
        bool convertStable;
        uint256 times;
        bool isFlash;
        uint[] flashFees;
    }

    function getBorrowAmounts (
        address userAccount,
        AaveInterface aave,
        ImportInputData memory inputData,
        ImportData memory data
    ) internal returns(ImportData memory) {
        if (inputData.borrowTokens.length > 0) {
            data._borrowTokens = new address[](inputData.borrowTokens.length);

            data.variableBorrowAmts = new uint[](inputData.borrowTokens.length);
            data.variableBorrowSplitAmts = new uint256[](inputData.borrowTokens.length);
            data.variableBorrowFinalAmts = new uint256[](inputData.borrowTokens.length);
            data.variableBorrowAmtsWithFee = new uint[](inputData.borrowTokens.length);
            data.variableBorrowFinalAmtsWithFee = new uint256[](inputData.borrowTokens.length);
            data.variableBorrowSplitAmtsWithFee = new uint256[](inputData.borrowTokens.length);
    
            data.stableBorrowAmts = new uint[](inputData.borrowTokens.length);
            data.stableBorrowSplitAmts = new uint256[](inputData.borrowTokens.length);
            data.stableBorrowFinalAmts = new uint256[](inputData.borrowTokens.length);
            data.stableBorrowAmtsWithFee = new uint[](inputData.borrowTokens.length);
            data.stableBorrowSplitAmtsWithFee = new uint256[](inputData.borrowTokens.length);
            data.stableBorrowFinalAmtsWithFee = new uint256[](inputData.borrowTokens.length);

            data.totalBorrowAmts = new uint[](inputData.borrowTokens.length);
            data.totalBorrowAmtsWithFee = new uint[](inputData.borrowTokens.length);
            data.totalBorrowAmtsSplitAmts = new uint256[](inputData.borrowTokens.length);
            data.totalBorrowAmtsFinalAmts = new uint256[](inputData.borrowTokens.length);
            data.totalBorrowAmtsFinalAmtsWithFee = new uint256[](inputData.borrowTokens.length);
            data.totalBorrowAmtsSplitAmtsWithFee = new uint256[](inputData.borrowTokens.length);

            if (inputData.times > 0) {
                for (uint i = 0; i < inputData.borrowTokens.length; i++) {
                    for (uint j = i; j < inputData.borrowTokens.length; j++) {
                        if (j != i) {
                            require(inputData.borrowTokens[i] != inputData.borrowTokens[j], "token-repeated");
                        }
                    }
                }


                for (uint256 i = 0; i < inputData.borrowTokens.length; i++) {
                    address _token = inputData.borrowTokens[i] == ethAddr ? wethAddr : inputData.borrowTokens[i];
                    data._borrowTokens[i] = _token;

                    (
                        data.stableBorrowAmts[i],
                        data.variableBorrowAmts[i]
                    ) = getBorrowAmount(_token, userAccount);

                    if (data.variableBorrowAmts[i] != 0) {
                        data.variableBorrowAmtsWithFee[i] = data.variableBorrowAmts[i] + inputData.flashFees[i];
                    } else {
                        data.stableBorrowAmtsWithFee[i] = data.stableBorrowAmts[i] + inputData.flashFees[i];
                    }

                    data.totalBorrowAmts[i] = data.stableBorrowAmts[i] + data.variableBorrowAmts[i];
                    data.totalBorrowAmtsWithFee[i] = data.stableBorrowAmtsWithFee[i] + data.variableBorrowAmtsWithFee[i];

                    if (data.totalBorrowAmts[i] > 0) {
                        uint256 _amt = inputData.times == 1 ? data.totalBorrowAmts[i] : type(uint256).max;
                        TokenInterface(_token).approve(address(aave), _amt);
                    }
                }

                if (inputData.times == 1) {
                    data.variableBorrowFinalAmts = data.variableBorrowAmts;
                    data.stableBorrowFinalAmts = data.stableBorrowAmts;
                    data.totalBorrowAmtsFinalAmts = data.totalBorrowAmts;

                    data.variableBorrowFinalAmtsWithFee = data.variableBorrowAmtsWithFee;
                    data.stableBorrowFinalAmtsWithFee = data.stableBorrowAmtsWithFee;
                    data.totalBorrowAmtsFinalAmtsWithFee = data.totalBorrowAmtsWithFee;
                } else {
                    for (uint i = 0; i < data.totalBorrowAmts.length; i++) {
                        data.variableBorrowSplitAmts[i] = data.variableBorrowAmts[i] / inputData.times;
                        data.variableBorrowFinalAmts[i] = data.variableBorrowAmts[i] - (data.variableBorrowSplitAmts[i] * (inputData.times - 1));
                        data.stableBorrowSplitAmts[i] = data.stableBorrowAmts[i] / inputData.times;
                        data.stableBorrowFinalAmts[i] = data.stableBorrowAmts[i] - (data.stableBorrowSplitAmts[i] * (inputData.times - 1));
                        data.totalBorrowAmtsSplitAmts[i] = data.totalBorrowAmts[i] / inputData.times;
                        data.totalBorrowAmtsFinalAmts[i] = data.totalBorrowAmts[i] - (data.totalBorrowAmtsSplitAmts[i] * (inputData.times - 1));

                        data.variableBorrowSplitAmtsWithFee[i] = data.variableBorrowAmtsWithFee[i] / inputData.times;
                        data.variableBorrowFinalAmtsWithFee[i] = data.variableBorrowAmtsWithFee[i] - (data.variableBorrowSplitAmtsWithFee[i] * (inputData.times - 1));
                        data.stableBorrowSplitAmtsWithFee[i] = data.stableBorrowAmtsWithFee[i] / inputData.times;
                        data.stableBorrowFinalAmtsWithFee[i] = data.stableBorrowAmtsWithFee[i] - (data.stableBorrowSplitAmtsWithFee[i] * (inputData.times - 1));
                        data.totalBorrowAmtsSplitAmtsWithFee[i] = data.totalBorrowAmtsWithFee[i] / inputData.times;
                        data.totalBorrowAmtsFinalAmtsWithFee[i] = data.totalBorrowAmtsWithFee[i] - (data.totalBorrowAmtsSplitAmtsWithFee[i] * (inputData.times - 1));
                    }
                }
            }
        }
        return data;
    }

    function getBorrowFinalAmounts (
        address userAccount,
        ImportInputData memory inputData,
        ImportData memory data
    ) internal view returns(
        uint[] memory variableBorrowFinalAmts,
        uint[] memory variableBorrowFinalAmtsWithFee,
        uint[] memory stableBorrowFinalAmts,
        uint[] memory stableBorrowFinalAmtsWithFee,
        uint[] memory totalBorrowAmtsFinalAmts,
        uint[] memory totalBorrowAmtsFinalAmtsWithFee
    ) {    
        if (inputData.borrowTokens.length > 0) {
            variableBorrowFinalAmts = new uint256[](inputData.borrowTokens.length);
            variableBorrowFinalAmtsWithFee = new uint256[](inputData.borrowTokens.length);
            stableBorrowFinalAmts = new uint256[](inputData.borrowTokens.length);
            stableBorrowFinalAmtsWithFee = new uint256[](inputData.borrowTokens.length);
            totalBorrowAmtsFinalAmts = new uint[](inputData.borrowTokens.length);
            totalBorrowAmtsFinalAmtsWithFee = new uint[](inputData.borrowTokens.length);

            if (inputData.times > 0) {
                for (uint i = 0; i < data._borrowTokens.length; i++) {
                    address _token = data._borrowTokens[i];
                    (
                        stableBorrowFinalAmts[i],
                        variableBorrowFinalAmts[i]
                    ) = getBorrowAmount(_token, userAccount);

                    if (variableBorrowFinalAmts[i] != 0) {
                        variableBorrowFinalAmtsWithFee[i] = variableBorrowFinalAmts[i] + inputData.flashFees[i];
                    } else {
                        stableBorrowFinalAmtsWithFee[i] = stableBorrowFinalAmts[i] + inputData.flashFees[i];
                    }

                    totalBorrowAmtsFinalAmtsWithFee[i] = stableBorrowFinalAmts[i] + variableBorrowFinalAmts[i];
                }
            }
        }
    }

    function getSupplyAmounts (
        address userAccount,
        ImportInputData memory inputData,
        ImportData memory data
    ) internal view returns(ImportData memory) {
        data.supplyAmts = new uint[](inputData.supplyTokens.length);
        data._supplyTokens = new address[](inputData.supplyTokens.length);
        data.aTokens = new ATokenInterface[](inputData.supplyTokens.length);
        data.supplySplitAmts = new uint[](inputData.supplyTokens.length);
        data.supplyFinalAmts = new uint[](inputData.supplyTokens.length);

        for (uint i = 0; i < inputData.supplyTokens.length; i++) {
            for (uint j = i; j < inputData.supplyTokens.length; j++) {
                if (j != i) {
                    require(inputData.supplyTokens[i] != inputData.supplyTokens[j], "token-repeated");
                }
            }
        }

        for (uint i = 0; i < inputData.supplyTokens.length; i++) {
            address _token = inputData.supplyTokens[i] == ethAddr ? wethAddr : inputData.supplyTokens[i];
            (address _aToken, ,) = aaveData.getReserveTokensAddresses(_token);
            data._supplyTokens[i] = _token;
            data.aTokens[i] = ATokenInterface(_aToken);
            data.supplyAmts[i] = data.aTokens[i].balanceOf(userAccount);
        }

        if ((inputData.times == 1 && inputData.isFlash) || inputData.times == 0) {
            data.supplyFinalAmts = data.supplyAmts;
        } else {
            for (uint i = 0; i < data.supplyAmts.length; i++) {
                uint _times = inputData.isFlash ? inputData.times : inputData.times + 1;
                data.supplySplitAmts[i] = data.supplyAmts[i] / _times;
                data.supplyFinalAmts[i] = data.supplyAmts[i] - (data.supplySplitAmts[i] * (_times - 1));
            }
        }

        return data;
    }

    function getSupplyFinalAmounts(
        address userAccount,
        ImportInputData memory inputData,
        ImportData memory data
    ) internal view returns(uint[] memory supplyFinalAmts) {
        supplyFinalAmts = new uint[](inputData.supplyTokens.length);

        for (uint i = 0; i < data.aTokens.length; i++) {
            supplyFinalAmts[i] = data.aTokens[i].balanceOf(userAccount);
        }
    }
}

contract AaveImportResolver is AaveImportHelpers {

    function _importAave(
        address userAccount,
        ImportInputData memory inputData
    ) internal returns (string memory _eventName, bytes memory _eventParam) {
        require(inputData.supplyTokens.length > 0, "0-length-not-allowed");

        ImportData memory data;

        AaveInterface aave = AaveInterface(aaveProvider.getLendingPool());

        data = getBorrowAmounts(userAccount, aave, inputData, data);
        data = getSupplyAmounts(userAccount, inputData, data);

        if (!inputData.isFlash && inputData.times > 0) {
            _TransferAtokens(
                inputData.supplyTokens.length,
                aave,
                data.aTokens,
                data.supplySplitAmts,
                data._supplyTokens,
                userAccount
            );
        } else if (inputData.times == 0) {
            _TransferAtokens(
                inputData.supplyTokens.length,
                aave,
                data.aTokens,
                data.supplyFinalAmts,
                data._supplyTokens,
                userAccount
            );
        }

        for (uint i = 0; i < inputData.times; i++) {
            if (i == (inputData.times - 1)) {

                if (!inputData.isFlash && inputData.times == 1) {
                    data.supplyFinalAmts = getSupplyFinalAmounts(userAccount, inputData, data);
                }

                if (inputData.times > 1) {
                    (
                        ,
                        data.variableBorrowFinalAmtsWithFee,
                        ,
                        data.stableBorrowFinalAmtsWithFee,
                        ,
                        data.totalBorrowAmtsFinalAmtsWithFee
                    ) = getBorrowFinalAmounts(userAccount, inputData, data);
                    
                    data.supplyFinalAmts = getSupplyFinalAmounts(userAccount, inputData, data);
                }

                _PaybackStable(inputData.borrowTokens.length, aave, data._borrowTokens, data.stableBorrowFinalAmts, userAccount);
                _PaybackVariable(inputData.borrowTokens.length, aave, data._borrowTokens, data.variableBorrowFinalAmts, userAccount);
                _TransferAtokens(inputData.supplyTokens.length, aave, data.aTokens, data.supplyFinalAmts, data._supplyTokens, userAccount);

                if (inputData.convertStable) {
                    _BorrowVariable(inputData.borrowTokens.length, aave, data._borrowTokens, data.totalBorrowAmtsFinalAmtsWithFee);
                } else {
                    _BorrowStable(inputData.borrowTokens.length, aave, data._borrowTokens, data.stableBorrowFinalAmtsWithFee);
                    _BorrowVariable(inputData.borrowTokens.length, aave, data._borrowTokens, data.variableBorrowFinalAmtsWithFee);
                }

            } else {

                _PaybackStable(inputData.borrowTokens.length, aave, data._borrowTokens, data.stableBorrowSplitAmts, userAccount);
                _PaybackVariable(inputData.borrowTokens.length, aave, data._borrowTokens, data.variableBorrowSplitAmts, userAccount);
                _TransferAtokens(inputData.supplyTokens.length, aave, data.aTokens, data.supplySplitAmts, data._supplyTokens, userAccount);

                if (inputData.convertStable) {
                    _BorrowVariable(inputData.borrowTokens.length, aave, data._borrowTokens, data.totalBorrowAmtsSplitAmtsWithFee);
                } else {
                    _BorrowStable(inputData.borrowTokens.length, aave, data._borrowTokens, data.stableBorrowSplitAmtsWithFee);
                    _BorrowVariable(inputData.borrowTokens.length, aave, data._borrowTokens, data.variableBorrowSplitAmtsWithFee);
                }

            }
        }

        _eventName = "LogAaveV2Import(address,bool,address[],address[],uint256[],uint256[],uint256[])";
        _eventParam = abi.encode(
            userAccount,
            inputData.convertStable,
            inputData.supplyTokens,
            inputData.borrowTokens,
            data.supplyAmts,
            data.stableBorrowAmts,
            data.variableBorrowAmts
        );
    }

    function importAave(
        address userAccount,
        ImportInputData memory inputData
    ) external payable returns (string memory _eventName, bytes memory _eventParam) {

        (_eventName, _eventParam) = _importAave(userAccount, inputData);
    }


    function migrateAave(
        ImportInputData memory inputData
    ) external payable returns (string memory _eventName, bytes memory _eventParam) {
        (_eventName, _eventParam) = _importAave(msg.sender, inputData);
    }
}

contract ConnectV2AaveV2Import is AaveImportResolver {

    string public constant name = "AaveV2-Import-v2";
}

File 2 of 6 : events.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Events {
    event LogAaveV2Import(
        address indexed user,
        bool convertStable,
        address[] supplyTokens,
        address[] borrowTokens,
        uint[] supplyAmts,
        uint[] stableBorrowAmts,
        uint[] variableBorrowAmts
    );
}

File 3 of 6 : helpers.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import { Stores } from "../common/stores.sol";
import { AaveLendingPoolProviderInterface, AaveDataProviderInterface } from "./interfaces.sol";

abstract contract Helpers is Stores {
    /**
     * @dev Aave referal code
     */
    uint16 constant internal referalCode = 3228;

    /**
     * @dev Aave Provider
     */
    AaveLendingPoolProviderInterface constant internal aaveProvider = AaveLendingPoolProviderInterface(0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5);

    /**
     * @dev Aave Data Provider
     */
    AaveDataProviderInterface constant internal aaveData = AaveDataProviderInterface(0x057835Ad21a177dbdd3090bB1CAE03EaCF78Fc6d);

    function getIsColl(address token, address user) internal view returns (bool isCol) {
        (, , , , , , , , isCol) = aaveData.getUserReserveData(token, user);
    }
}

File 4 of 6 : interfaces.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface AaveInterface {
    function deposit(address _asset, uint256 _amount, address _onBehalfOf, uint16 _referralCode) external;
    function withdraw(address _asset, uint256 _amount, address _to) external;
    function borrow(
        address _asset,
        uint256 _amount,
        uint256 _interestRateMode,
        uint16 _referralCode,
        address _onBehalfOf
    ) external;
    function repay(address _asset, uint256 _amount, uint256 _rateMode, address _onBehalfOf) external;
    function setUserUseReserveAsCollateral(address _asset, bool _useAsCollateral) external;
    function getUserAccountData(address user) external view returns (
        uint256 totalCollateralETH,
        uint256 totalDebtETH,
        uint256 availableBorrowsETH,
        uint256 currentLiquidationThreshold,
        uint256 ltv,
        uint256 healthFactor
    );
}

interface AaveLendingPoolProviderInterface {
    function getLendingPool() external view returns (address);
}

// Aave Protocol Data Provider
interface AaveDataProviderInterface {
    function getUserReserveData(address _asset, address _user) external view returns (
        uint256 currentATokenBalance,
        uint256 currentStableDebt,
        uint256 currentVariableDebt,
        uint256 principalStableDebt,
        uint256 scaledVariableDebt,
        uint256 stableBorrowRate,
        uint256 liquidityRate,
        uint40 stableRateLastUpdated,
        bool usageAsCollateralEnabled
    );
    function getReserveConfigurationData(address asset) external view returns (
        uint256 decimals,
        uint256 ltv,
        uint256 liquidationThreshold,
        uint256 liquidationBonus,
        uint256 reserveFactor,
        bool usageAsCollateralEnabled,
        bool borrowingEnabled,
        bool stableBorrowRateEnabled,
        bool isActive,
        bool isFrozen
    );

    function getReserveTokensAddresses(address asset) external view returns (
        address aTokenAddress,
        address stableDebtTokenAddress,
        address variableDebtTokenAddress
    );
}

interface AaveAddressProviderRegistryInterface {
    function getAddressesProvidersList() external view returns (address[] memory);
}

interface ATokenInterface {
    function scaledBalanceOf(address _user) external view returns (uint256);
    function isTransferAllowed(address _user, uint256 _amount) external view returns (bool);
    function balanceOf(address _user) external view returns(uint256);
    function transferFrom(address, address, uint) external returns (bool);
    function allowance(address, address) external returns (uint256);
}

File 5 of 6 : interfaces.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface TokenInterface {
    function approve(address, uint256) external;
    function transfer(address, uint) external;
    function transferFrom(address, address, uint) external;
    function deposit() external payable;
    function withdraw(uint) external;
    function balanceOf(address) external view returns (uint);
    function decimals() external view returns (uint);
    function totalSupply() external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint256);
}

interface MemoryInterface {
    function getUint(uint id) external returns (uint num);
    function setUint(uint id, uint val) external;
}

interface InstaMapping {
    function cTokenMapping(address) external view returns (address);
    function gemJoinMapping(bytes32) external view returns (address);
}

File 6 of 6 : stores.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import { MemoryInterface, InstaMapping } from "./interfaces.sol";


abstract contract Stores {

  /**
   * @dev Return ethereum address
   */
  address constant internal ethAddr = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

  /**
   * @dev Return Wrapped ETH address
   */
  address constant internal wethAddr = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

  /**
   * @dev Return memory variable address
   */
  MemoryInterface constant internal instaMemory = MemoryInterface(0x8a5419CfC711B2343c17a6ABf4B2bAFaBb06957F);

  /**
   * @dev Return InstaDApp Mapping Addresses
   */
  InstaMapping constant internal instaMapping = InstaMapping(0xe81F70Cc7C0D46e12d70efc60607F16bbD617E88);

  /**
   * @dev Get Uint value from InstaMemory Contract.
   */
  function getUint(uint getId, uint val) internal returns (uint returnVal) {
    returnVal = getId == 0 ? val : instaMemory.getUint(getId);
  }

  /**
  * @dev Set Uint value in InstaMemory Contract.
  */
  function setUint(uint setId, uint val) virtual internal {
    if (setId != 0) instaMemory.setUint(setId, val);
  }

}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"convertStable","type":"bool"},{"indexed":false,"internalType":"address[]","name":"supplyTokens","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"borrowTokens","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"supplyAmts","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"stableBorrowAmts","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"variableBorrowAmts","type":"uint256[]"}],"name":"LogAaveV2Import","type":"event"},{"inputs":[{"internalType":"address","name":"userAccount","type":"address"},{"components":[{"internalType":"address[]","name":"supplyTokens","type":"address[]"},{"internalType":"address[]","name":"borrowTokens","type":"address[]"},{"internalType":"bool","name":"convertStable","type":"bool"},{"internalType":"uint256","name":"times","type":"uint256"},{"internalType":"bool","name":"isFlash","type":"bool"},{"internalType":"uint256[]","name":"flashFees","type":"uint256[]"}],"internalType":"struct AaveImportHelpers.ImportInputData","name":"inputData","type":"tuple"}],"name":"importAave","outputs":[{"internalType":"string","name":"_eventName","type":"string"},{"internalType":"bytes","name":"_eventParam","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"supplyTokens","type":"address[]"},{"internalType":"address[]","name":"borrowTokens","type":"address[]"},{"internalType":"bool","name":"convertStable","type":"bool"},{"internalType":"uint256","name":"times","type":"uint256"},{"internalType":"bool","name":"isFlash","type":"bool"},{"internalType":"uint256[]","name":"flashFees","type":"uint256[]"}],"internalType":"struct AaveImportHelpers.ImportInputData","name":"inputData","type":"tuple"}],"name":"migrateAave","outputs":[{"internalType":"string","name":"_eventName","type":"string"},{"internalType":"bytes","name":"_eventParam","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b506139f7806100206000396000f3fe6080604052600436106100345760003560e01c806306fdde0314610039578063271d1e7b1461006457806375983f1d14610095575b600080fd5b34801561004557600080fd5b5061004e6100c6565b60405161005b9190612b65565b60405180910390f35b61007e60048036038101906100799190612f70565b6100ff565b60405161008c929190613021565b60405180910390f35b6100af60048036038101906100aa9190613058565b61011b565b6040516100bd929190613021565b60405180910390f35b6040518060400160405280601081526020017f4161766556322d496d706f72742d76320000000000000000000000000000000081525081565b60608061010c8484610135565b80925081935050509250929050565b6060806101283384610135565b8092508193505050915091565b606080600083600001515111610180576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610177906130ed565b60405180910390fd5b610188612a20565b600073b53c1a33016b2dc2ff3653530bff1848a515c8c573ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020d9190613122565b905061021b86828785610528565b91506102288686846116b4565b91508460800151158015610240575060008560600151115b1561026957610264856000015151828460400151856080015186600001518b611d86565b610296565b6000856060015103610295576102948560000151518284604001518560a0015186600001518b611d86565b5b5b60005b85606001518110156104bc57600186606001516102b6919061317e565b81036103f55785608001511580156102d2575060018660600151145b156102eb576102e2878785611f7b565b8360a001819052505b60018660600151111561033e576103038787856120af565b9091929394509091925090508561014001866102e0018761020001839052839052839052505050610335878785611f7b565b8360a001819052505b6103598660200151518385602001518661028001518b61249e565b6103738660200151518385602001518660e001518b61252a565b6103928660000151518385604001518660a0015187600001518c611d86565b8560400151156103bb576103b68660200151518385602001518661020001516125b6565b6103f0565b6103d5866020015151838560200151866102e00151612640565b6103ef8660200151518385602001518661014001516125b6565b5b6104a9565b6104108660200151518385602001518661026001518b61249e565b61042b8660200151518385602001518661010001518b61252a565b61044a866000015151838560400151866080015187600001518c611d86565b8560400151156104735761046e8660200151518385602001518661022001516125b6565b6104a8565b61048d866020015151838560200151866102c00151612640565b6104a78660200151518385602001518661016001516125b6565b5b5b80806104b4906131b2565b915050610299565b506040518060800160405280604f8152602001613973604f913993508585604001518660000151876020015185606001518661024001518760c0015160405160200161050e9796959493929190613394565b604051602081830303815290604052925050509250929050565b610530612a20565b600083602001515111156116a95782602001515167ffffffffffffffff81111561055d5761055c612bfe565b5b60405190808252806020026020018201604052801561058b5781602001602082028036833780820191505090505b50826020018190525082602001515167ffffffffffffffff8111156105b3576105b2612bfe565b5b6040519080825280602002602001820160405280156105e15781602001602082028036833780820191505090505b508260c0018190525082602001515167ffffffffffffffff81111561060957610608612bfe565b5b6040519080825280602002602001820160405280156106375781602001602082028036833780820191505090505b5082610100018190525082602001515167ffffffffffffffff8111156106605761065f612bfe565b5b60405190808252806020026020018201604052801561068e5781602001602082028036833780820191505090505b508260e0018190525082602001515167ffffffffffffffff8111156106b6576106b5612bfe565b5b6040519080825280602002602001820160405280156106e45781602001602082028036833780820191505090505b5082610120018190525082602001515167ffffffffffffffff81111561070d5761070c612bfe565b5b60405190808252806020026020018201604052801561073b5781602001602082028036833780820191505090505b5082610140018190525082602001515167ffffffffffffffff81111561076457610763612bfe565b5b6040519080825280602002602001820160405280156107925781602001602082028036833780820191505090505b5082610160018190525082602001515167ffffffffffffffff8111156107bb576107ba612bfe565b5b6040519080825280602002602001820160405280156107e95781602001602082028036833780820191505090505b5082610240018190525082602001515167ffffffffffffffff81111561081257610811612bfe565b5b6040519080825280602002602001820160405280156108405781602001602082028036833780820191505090505b5082610260018190525082602001515167ffffffffffffffff81111561086957610868612bfe565b5b6040519080825280602002602001820160405280156108975781602001602082028036833780820191505090505b5082610280018190525082602001515167ffffffffffffffff8111156108c0576108bf612bfe565b5b6040519080825280602002602001820160405280156108ee5781602001602082028036833780820191505090505b50826102a0018190525082602001515167ffffffffffffffff81111561091757610916612bfe565b5b6040519080825280602002602001820160405280156109455781602001602082028036833780820191505090505b50826102c0018190525082602001515167ffffffffffffffff81111561096e5761096d612bfe565b5b60405190808252806020026020018201604052801561099c5781602001602082028036833780820191505090505b50826102e0018190525082602001515167ffffffffffffffff8111156109c5576109c4612bfe565b5b6040519080825280602002602001820160405280156109f35781602001602082028036833780820191505090505b5082610180018190525082602001515167ffffffffffffffff811115610a1c57610a1b612bfe565b5b604051908082528060200260200182016040528015610a4a5781602001602082028036833780820191505090505b50826101e0018190525082602001515167ffffffffffffffff811115610a7357610a72612bfe565b5b604051908082528060200260200182016040528015610aa15781602001602082028036833780820191505090505b50826101c0018190525082602001515167ffffffffffffffff811115610aca57610ac9612bfe565b5b604051908082528060200260200182016040528015610af85781602001602082028036833780820191505090505b50826101a0018190525082602001515167ffffffffffffffff811115610b2157610b20612bfe565b5b604051908082528060200260200182016040528015610b4f5781602001602082028036833780820191505090505b5082610200018190525082602001515167ffffffffffffffff811115610b7857610b77612bfe565b5b604051908082528060200260200182016040528015610ba65781602001602082028036833780820191505090505b508261022001819052506000836060015111156116a85760005b836020015151811015610cb95760008190505b846020015151811015610ca557818114610c925784602001518181518110610bfe57610bfd613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1685602001518381518110610c3357610c32613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c88906134a1565b60405180910390fd5b5b8080610c9d906131b2565b915050610bd3565b508080610cb1906131b2565b915050610bc0565b5060005b8360200151518110156110f257600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff1685602001518381518110610d0e57610d0d613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614610d555784602001518281518110610d4857610d47613426565b5b6020026020010151610d6b565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b90508084602001518381518110610d8557610d84613426565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610dc981886126ca565b8561024001518481518110610de157610de0613426565b5b602002602001018660c001518581518110610dff57610dfe613426565b5b602002602001018281525082815250505060008460c001518381518110610e2957610e28613426565b5b602002602001015114610ea7578460a001518281518110610e4d57610e4c613426565b5b60200260200101518460c001518381518110610e6c57610e6b613426565b5b6020026020010151610e7e91906134c1565b8461012001518381518110610e9657610e95613426565b5b602002602001018181525050610f15565b8460a001518281518110610ebe57610ebd613426565b5b60200260200101518461024001518381518110610ede57610edd613426565b5b6020026020010151610ef091906134c1565b846102a001518381518110610f0857610f07613426565b5b6020026020010181815250505b8360c001518281518110610f2c57610f2b613426565b5b60200260200101518461024001518381518110610f4c57610f4b613426565b5b6020026020010151610f5e91906134c1565b8461018001518381518110610f7657610f75613426565b5b6020026020010181815250508361012001518281518110610f9a57610f99613426565b5b6020026020010151846102a001518381518110610fba57610fb9613426565b5b6020026020010151610fcc91906134c1565b846101e001518381518110610fe457610fe3613426565b5b6020026020010181815250506000846101800151838151811061100a57611009613426565b5b602002602001015111156110de576000600186606001511461104c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61106d565b846101800151838151811061106457611063613426565b5b60200260200101515b90508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b388836040518363ffffffff1660e01b81526004016110aa929190613504565b600060405180830381600087803b1580156110c457600080fd5b505af11580156110d8573d6000803e3d6000fd5b50505050505b5080806110ea906131b2565b915050610cbd565b50600183606001510361115c578160c001518260e00181905250816102400151826102800181905250816101800151826101a00181905250816101200151826101400181905250816102a00151826102e00181905250816101e001518261020001819052506116a7565b60005b826101800151518110156116a55783606001518360c00151828151811061118957611188613426565b5b602002602001015161119b919061355c565b83610100015182815181106111b3576111b2613426565b5b602002602001018181525050600184606001516111d0919061317e565b83610100015182815181106111e8576111e7613426565b5b60200260200101516111fa919061358d565b8360c00151828151811061121157611210613426565b5b6020026020010151611223919061317e565b8360e00151828151811061123a57611239613426565b5b6020026020010181815250508360600151836102400151828151811061126357611262613426565b5b6020026020010151611275919061355c565b836102600151828151811061128d5761128c613426565b5b602002602001018181525050600184606001516112aa919061317e565b83610260015182815181106112c2576112c1613426565b5b60200260200101516112d4919061358d565b83610240015182815181106112ec576112eb613426565b5b60200260200101516112fe919061317e565b836102800151828151811061131657611315613426565b5b6020026020010181815250508360600151836101800151828151811061133f5761133e613426565b5b6020026020010151611351919061355c565b836101c00151828151811061136957611368613426565b5b60200260200101818152505060018460600151611386919061317e565b836101c00151828151811061139e5761139d613426565b5b60200260200101516113b0919061358d565b83610180015182815181106113c8576113c7613426565b5b60200260200101516113da919061317e565b836101a0015182815181106113f2576113f1613426565b5b6020026020010181815250508360600151836101200151828151811061141b5761141a613426565b5b602002602001015161142d919061355c565b836101600151828151811061144557611444613426565b5b60200260200101818152505060018460600151611462919061317e565b836101600151828151811061147a57611479613426565b5b602002602001015161148c919061358d565b83610120015182815181106114a4576114a3613426565b5b60200260200101516114b6919061317e565b83610140015182815181106114ce576114cd613426565b5b6020026020010181815250508360600151836102a0015182815181106114f7576114f6613426565b5b6020026020010151611509919061355c565b836102c00151828151811061152157611520613426565b5b6020026020010181815250506001846060015161153e919061317e565b836102c00151828151811061155657611555613426565b5b6020026020010151611568919061358d565b836102a0015182815181106115805761157f613426565b5b6020026020010151611592919061317e565b836102e0015182815181106115aa576115a9613426565b5b6020026020010181815250508360600151836101e0015182815181106115d3576115d2613426565b5b60200260200101516115e5919061355c565b83610220015182815181106115fd576115fc613426565b5b6020026020010181815250506001846060015161161a919061317e565b836102200151828151811061163257611631613426565b5b6020026020010151611644919061358d565b836101e00151828151811061165c5761165b613426565b5b602002602001015161166e919061317e565b836102000151828151811061168657611685613426565b5b602002602001018181525050808061169d906131b2565b91505061115f565b505b5b5b819050949350505050565b6116bc612a20565b82600001515167ffffffffffffffff8111156116db576116da612bfe565b5b6040519080825280602002602001820160405280156117095781602001602082028036833780820191505090505b50826060018190525082600001515167ffffffffffffffff81111561173157611730612bfe565b5b60405190808252806020026020018201604052801561175f5781602001602082028036833780820191505090505b50826000018190525082600001515167ffffffffffffffff81111561178757611786612bfe565b5b6040519080825280602002602001820160405280156117b55781602001602082028036833780820191505090505b50826040018190525082600001515167ffffffffffffffff8111156117dd576117dc612bfe565b5b60405190808252806020026020018201604052801561180b5781602001602082028036833780820191505090505b50826080018190525082600001515167ffffffffffffffff81111561183357611832612bfe565b5b6040519080825280602002602001820160405280156118615781602001602082028036833780820191505090505b508260a0018190525060005b8360000151518110156119665760008190505b8460000151518110156119525781811461193f57846000015181815181106118ab576118aa613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16856000015183815181106118e0576118df613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361193e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611935906134a1565b60405180910390fd5b5b808061194a906131b2565b915050611880565b50808061195e906131b2565b91505061186d565b5060005b836000015151811015611c2257600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff16856000015183815181106119bb576119ba613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614611a0257846000015182815181106119f5576119f4613426565b5b6020026020010151611a18565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b9050600073057835ad21a177dbdd3090bb1cae03eacf78fc6d73ffffffffffffffffffffffffffffffffffffffff1663d2493b6c836040518263ffffffff1660e01b8152600401611a6991906135cf565b606060405180830381865afa158015611a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaa91906135ea565b505090508185600001518481518110611ac657611ac5613426565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508085604001518481518110611b1857611b17613426565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084604001518381518110611b6957611b68613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401611ba991906135cf565b602060405180830381865afa158015611bc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bea9190613652565b85606001518481518110611c0157611c00613426565b5b60200260200101818152505050508080611c1a906131b2565b91505061196a565b5060018360600151148015611c38575082608001515b80611c47575060008360600151145b15611c5e5781606001518260a00181905250611d7c565b60005b826060015151811015611d7a5760008460800151611c8f5760018560600151611c8a91906134c1565b611c95565b84606001515b90508084606001518381518110611caf57611cae613426565b5b6020026020010151611cc1919061355c565b84608001518381518110611cd857611cd7613426565b5b602002602001018181525050600181611cf1919061317e565b84608001518381518110611d0857611d07613426565b5b6020026020010151611d1a919061358d565b84606001518381518110611d3157611d30613426565b5b6020026020010151611d43919061317e565b8460a001518381518110611d5a57611d59613426565b5b602002602001018181525050508080611d72906131b2565b915050611c61565b505b8190509392505050565b60005b86811015611f72576000848281518110611da657611da5613426565b5b60200260200101511115611f5f576000848281518110611dc957611dc8613426565b5b60200260200101519050858281518110611de657611de5613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166323b872dd8430846040518463ffffffff1660e01b8152600401611e2a9392919061367f565b6020604051808303816000875af1158015611e49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6d91906136cb565b611eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea390613744565b60405180910390fd5b611ed0848381518110611ec257611ec1613426565b5b602002602001015130612864565b611f5d578673ffffffffffffffffffffffffffffffffffffffff16635a3b74b9858481518110611f0357611f02613426565b5b602002602001015160016040518363ffffffff1660e01b8152600401611f2a929190613764565b600060405180830381600087803b158015611f4457600080fd5b505af1158015611f58573d6000803e3d6000fd5b505050505b505b8080611f6a906131b2565b915050611d89565b50505050505050565b606082600001515167ffffffffffffffff811115611f9c57611f9b612bfe565b5b604051908082528060200260200182016040528015611fca5781602001602082028036833780820191505090505b50905060005b8260400151518110156120a75782604001518181518110611ff457611ff3613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b815260040161203491906135cf565b602060405180830381865afa158015612051573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120759190613652565b82828151811061208857612087613426565b5b602002602001018181525050808061209f906131b2565b915050611fd0565b509392505050565b606080606080606080600088602001515111156124925787602001515167ffffffffffffffff8111156120e5576120e4612bfe565b5b6040519080825280602002602001820160405280156121135781602001602082028036833780820191505090505b50955087602001515167ffffffffffffffff81111561213557612134612bfe565b5b6040519080825280602002602001820160405280156121635781602001602082028036833780820191505090505b50945087602001515167ffffffffffffffff81111561218557612184612bfe565b5b6040519080825280602002602001820160405280156121b35781602001602082028036833780820191505090505b50935087602001515167ffffffffffffffff8111156121d5576121d4612bfe565b5b6040519080825280602002602001820160405280156122035781602001602082028036833780820191505090505b50925087602001515167ffffffffffffffff81111561222557612224612bfe565b5b6040519080825280602002602001820160405280156122535781602001602082028036833780820191505090505b50915087602001515167ffffffffffffffff81111561227557612274612bfe565b5b6040519080825280602002602001820160405280156122a35781602001602082028036833780820191505090505b5090506000886060015111156124915760005b87602001515181101561248f576000886020015182815181106122dc576122db613426565b5b602002602001015190506122f0818c6126ca565b87848151811061230357612302613426565b5b602002602001018a858151811061231d5761231c613426565b5b6020026020010182815250828152505050600088838151811061234357612342613426565b5b6020026020010151146123b8578960a00151828151811061236757612366613426565b5b602002602001015188838151811061238257612381613426565b5b602002602001015161239491906134c1565b8783815181106123a7576123a6613426565b5b60200260200101818152505061241c565b8960a0015182815181106123cf576123ce613426565b5b60200260200101518683815181106123ea576123e9613426565b5b60200260200101516123fc91906134c1565b85838151811061240f5761240e613426565b5b6020026020010181815250505b87828151811061242f5761242e613426565b5b602002602001015186838151811061244a57612449613426565b5b602002602001015161245c91906134c1565b83838151811061246f5761246e613426565b5b602002602001018181525050508080612487906131b2565b9150506122b6565b505b5b93975093979195509350565b60005b858110156125225760008382815181106124be576124bd613426565b5b6020026020010151111561250f5761250e858583815181106124e3576124e2613426565b5b60200260200101518584815181106124fe576124fd613426565b5b602002602001015160018661292d565b5b808061251a906131b2565b9150506124a1565b505050505050565b60005b858110156125ae57600083828151811061254a57612549613426565b5b6020026020010151111561259b5761259a8585838151811061256f5761256e613426565b5b602002602001015185848151811061258a57612589613426565b5b602002602001015160028661292d565b5b80806125a6906131b2565b91505061252d565b505050505050565b60005b848110156126395760008282815181106125d6576125d5613426565b5b6020026020010151111561262657612625848483815181106125fb576125fa613426565b5b602002602001015184848151811061261657612615613426565b5b602002602001015160026129a5565b5b8080612631906131b2565b9150506125b9565b5050505050565b60005b848110156126c35760008282815181106126605761265f613426565b5b602002602001015111156126b0576126af8484838151811061268557612684613426565b5b60200260200101518484815181106126a05761269f613426565b5b602002602001015160016129a5565b5b80806126bb906131b2565b915050612643565b5050505050565b60008060008073057835ad21a177dbdd3090bb1cae03eacf78fc6d73ffffffffffffffffffffffffffffffffffffffff1663d2493b6c876040518263ffffffff1660e01b815260040161271d91906135cf565b606060405180830381865afa15801561273a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275e91906135ea565b92509250508173ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b815260040161279c91906135cf565b602060405180830381865afa1580156127b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127dd9190613652565b93508073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b815260040161281891906135cf565b602060405180830381865afa158015612835573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128599190613652565b925050509250929050565b600073057835ad21a177dbdd3090bb1cae03eacf78fc6d73ffffffffffffffffffffffffffffffffffffffff166328dd2d0184846040518363ffffffff1660e01b81526004016128b592919061378d565b61012060405180830381865afa1580156128d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f791906137f3565b90919293949596975090919293949596509091929394955090919293945090919293509091925090915090508091505092915050565b8473ffffffffffffffffffffffffffffffffffffffff1663573ade81858585856040518563ffffffff1660e01b815260040161296c94939291906138bd565b600060405180830381600087803b15801561298657600080fd5b505af115801561299a573d6000803e3d6000fd5b505050505050505050565b8373ffffffffffffffffffffffffffffffffffffffff1663a415bcad848484610c9c306040518663ffffffff1660e01b81526004016129e895949392919061391f565b600060405180830381600087803b158015612a0257600080fd5b505af1158015612a16573d6000803e3d6000fd5b5050505050505050565b6040518061030001604052806060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b0f578082015181840152602081019050612af4565b60008484015250505050565b6000601f19601f8301169050919050565b6000612b3782612ad5565b612b418185612ae0565b9350612b51818560208601612af1565b612b5a81612b1b565b840191505092915050565b60006020820190508181036000830152612b7f8184612b2c565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bc682612b9b565b9050919050565b612bd681612bbb565b8114612be157600080fd5b50565b600081359050612bf381612bcd565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c3682612b1b565b810181811067ffffffffffffffff82111715612c5557612c54612bfe565b5b80604052505050565b6000612c68612b87565b9050612c748282612c2d565b919050565b600080fd5b600080fd5b600067ffffffffffffffff821115612c9e57612c9d612bfe565b5b602082029050602081019050919050565b600080fd5b6000612cc7612cc284612c83565b612c5e565b90508083825260208201905060208402830185811115612cea57612ce9612caf565b5b835b81811015612d135780612cff8882612be4565b845260208401935050602081019050612cec565b5050509392505050565b600082601f830112612d3257612d31612c7e565b5b8135612d42848260208601612cb4565b91505092915050565b60008115159050919050565b612d6081612d4b565b8114612d6b57600080fd5b50565b600081359050612d7d81612d57565b92915050565b6000819050919050565b612d9681612d83565b8114612da157600080fd5b50565b600081359050612db381612d8d565b92915050565b600067ffffffffffffffff821115612dd457612dd3612bfe565b5b602082029050602081019050919050565b6000612df8612df384612db9565b612c5e565b90508083825260208201905060208402830185811115612e1b57612e1a612caf565b5b835b81811015612e445780612e308882612da4565b845260208401935050602081019050612e1d565b5050509392505050565b600082601f830112612e6357612e62612c7e565b5b8135612e73848260208601612de5565b91505092915050565b600060c08284031215612e9257612e91612bf9565b5b612e9c60c0612c5e565b9050600082013567ffffffffffffffff811115612ebc57612ebb612c79565b5b612ec884828501612d1d565b600083015250602082013567ffffffffffffffff811115612eec57612eeb612c79565b5b612ef884828501612d1d565b6020830152506040612f0c84828501612d6e565b6040830152506060612f2084828501612da4565b6060830152506080612f3484828501612d6e565b60808301525060a082013567ffffffffffffffff811115612f5857612f57612c79565b5b612f6484828501612e4e565b60a08301525092915050565b60008060408385031215612f8757612f86612b91565b5b6000612f9585828601612be4565b925050602083013567ffffffffffffffff811115612fb657612fb5612b96565b5b612fc285828601612e7c565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000612ff382612fcc565b612ffd8185612fd7565b935061300d818560208601612af1565b61301681612b1b565b840191505092915050565b6000604082019050818103600083015261303b8185612b2c565b9050818103602083015261304f8184612fe8565b90509392505050565b60006020828403121561306e5761306d612b91565b5b600082013567ffffffffffffffff81111561308c5761308b612b96565b5b61309884828501612e7c565b91505092915050565b7f302d6c656e6774682d6e6f742d616c6c6f776564000000000000000000000000600082015250565b60006130d7601483612ae0565b91506130e2826130a1565b602082019050919050565b60006020820190508181036000830152613106816130ca565b9050919050565b60008151905061311c81612bcd565b92915050565b60006020828403121561313857613137612b91565b5b60006131468482850161310d565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061318982612d83565b915061319483612d83565b92508282039050818111156131ac576131ab61314f565b5b92915050565b60006131bd82612d83565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131ef576131ee61314f565b5b600182019050919050565b61320381612bbb565b82525050565b61321281612d4b565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61324d81612bbb565b82525050565b600061325f8383613244565b60208301905092915050565b6000602082019050919050565b600061328382613218565b61328d8185613223565b935061329883613234565b8060005b838110156132c95781516132b08882613253565b97506132bb8361326b565b92505060018101905061329c565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61330b81612d83565b82525050565b600061331d8383613302565b60208301905092915050565b6000602082019050919050565b6000613341826132d6565b61334b81856132e1565b9350613356836132f2565b8060005b8381101561338757815161336e8882613311565b975061337983613329565b92505060018101905061335a565b5085935050505092915050565b600060e0820190506133a9600083018a6131fa565b6133b66020830189613209565b81810360408301526133c88188613278565b905081810360608301526133dc8187613278565b905081810360808301526133f08186613336565b905081810360a08301526134048185613336565b905081810360c08301526134188184613336565b905098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f746f6b656e2d7265706561746564000000000000000000000000000000000000600082015250565b600061348b600e83612ae0565b915061349682613455565b602082019050919050565b600060208201905081810360008301526134ba8161347e565b9050919050565b60006134cc82612d83565b91506134d783612d83565b92508282019050808211156134ef576134ee61314f565b5b92915050565b6134fe81612d83565b82525050565b600060408201905061351960008301856131fa565b61352660208301846134f5565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061356782612d83565b915061357283612d83565b9250826135825761358161352d565b5b828204905092915050565b600061359882612d83565b91506135a383612d83565b92508282026135b181612d83565b915082820484148315176135c8576135c761314f565b5b5092915050565b60006020820190506135e460008301846131fa565b92915050565b60008060006060848603121561360357613602612b91565b5b60006136118682870161310d565b93505060206136228682870161310d565b92505060406136338682870161310d565b9150509250925092565b60008151905061364c81612d8d565b92915050565b60006020828403121561366857613667612b91565b5b60006136768482850161363d565b91505092915050565b600060608201905061369460008301866131fa565b6136a160208301856131fa565b6136ae60408301846134f5565b949350505050565b6000815190506136c581612d57565b92915050565b6000602082840312156136e1576136e0612b91565b5b60006136ef848285016136b6565b91505092915050565b7f616c6c6f77616e63653f00000000000000000000000000000000000000000000600082015250565b600061372e600a83612ae0565b9150613739826136f8565b602082019050919050565b6000602082019050818103600083015261375d81613721565b9050919050565b600060408201905061377960008301856131fa565b6137866020830184613209565b9392505050565b60006040820190506137a260008301856131fa565b6137af60208301846131fa565b9392505050565b600064ffffffffff82169050919050565b6137d0816137b6565b81146137db57600080fd5b50565b6000815190506137ed816137c7565b92915050565b60008060008060008060008060006101208a8c03121561381657613815612b91565b5b60006138248c828d0161363d565b99505060206138358c828d0161363d565b98505060406138468c828d0161363d565b97505060606138578c828d0161363d565b96505060806138688c828d0161363d565b95505060a06138798c828d0161363d565b94505060c061388a8c828d0161363d565b93505060e061389b8c828d016137de565b9250506101006138ad8c828d016136b6565b9150509295985092959850929598565b60006080820190506138d260008301876131fa565b6138df60208301866134f5565b6138ec60408301856134f5565b6138f960608301846131fa565b95945050505050565b600061ffff82169050919050565b61391981613902565b82525050565b600060a08201905061393460008301886131fa565b61394160208301876134f5565b61394e60408301866134f5565b61395b6060830185613910565b61396860808301846131fa565b969550505050505056fe4c6f67416176655632496d706f727428616464726573732c626f6f6c2c616464726573735b5d2c616464726573735b5d2c75696e743235365b5d2c75696e743235365b5d2c75696e743235365b5d29a26469706673582212201bead4e4bdd491d791a96849f16bdddf0476ded2127a722766910d70cb4bc75164736f6c63430008120033

Deployed Bytecode

0x6080604052600436106100345760003560e01c806306fdde0314610039578063271d1e7b1461006457806375983f1d14610095575b600080fd5b34801561004557600080fd5b5061004e6100c6565b60405161005b9190612b65565b60405180910390f35b61007e60048036038101906100799190612f70565b6100ff565b60405161008c929190613021565b60405180910390f35b6100af60048036038101906100aa9190613058565b61011b565b6040516100bd929190613021565b60405180910390f35b6040518060400160405280601081526020017f4161766556322d496d706f72742d76320000000000000000000000000000000081525081565b60608061010c8484610135565b80925081935050509250929050565b6060806101283384610135565b8092508193505050915091565b606080600083600001515111610180576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610177906130ed565b60405180910390fd5b610188612a20565b600073b53c1a33016b2dc2ff3653530bff1848a515c8c573ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020d9190613122565b905061021b86828785610528565b91506102288686846116b4565b91508460800151158015610240575060008560600151115b1561026957610264856000015151828460400151856080015186600001518b611d86565b610296565b6000856060015103610295576102948560000151518284604001518560a0015186600001518b611d86565b5b5b60005b85606001518110156104bc57600186606001516102b6919061317e565b81036103f55785608001511580156102d2575060018660600151145b156102eb576102e2878785611f7b565b8360a001819052505b60018660600151111561033e576103038787856120af565b9091929394509091925090508561014001866102e0018761020001839052839052839052505050610335878785611f7b565b8360a001819052505b6103598660200151518385602001518661028001518b61249e565b6103738660200151518385602001518660e001518b61252a565b6103928660000151518385604001518660a0015187600001518c611d86565b8560400151156103bb576103b68660200151518385602001518661020001516125b6565b6103f0565b6103d5866020015151838560200151866102e00151612640565b6103ef8660200151518385602001518661014001516125b6565b5b6104a9565b6104108660200151518385602001518661026001518b61249e565b61042b8660200151518385602001518661010001518b61252a565b61044a866000015151838560400151866080015187600001518c611d86565b8560400151156104735761046e8660200151518385602001518661022001516125b6565b6104a8565b61048d866020015151838560200151866102c00151612640565b6104a78660200151518385602001518661016001516125b6565b5b5b80806104b4906131b2565b915050610299565b506040518060800160405280604f8152602001613973604f913993508585604001518660000151876020015185606001518661024001518760c0015160405160200161050e9796959493929190613394565b604051602081830303815290604052925050509250929050565b610530612a20565b600083602001515111156116a95782602001515167ffffffffffffffff81111561055d5761055c612bfe565b5b60405190808252806020026020018201604052801561058b5781602001602082028036833780820191505090505b50826020018190525082602001515167ffffffffffffffff8111156105b3576105b2612bfe565b5b6040519080825280602002602001820160405280156105e15781602001602082028036833780820191505090505b508260c0018190525082602001515167ffffffffffffffff81111561060957610608612bfe565b5b6040519080825280602002602001820160405280156106375781602001602082028036833780820191505090505b5082610100018190525082602001515167ffffffffffffffff8111156106605761065f612bfe565b5b60405190808252806020026020018201604052801561068e5781602001602082028036833780820191505090505b508260e0018190525082602001515167ffffffffffffffff8111156106b6576106b5612bfe565b5b6040519080825280602002602001820160405280156106e45781602001602082028036833780820191505090505b5082610120018190525082602001515167ffffffffffffffff81111561070d5761070c612bfe565b5b60405190808252806020026020018201604052801561073b5781602001602082028036833780820191505090505b5082610140018190525082602001515167ffffffffffffffff81111561076457610763612bfe565b5b6040519080825280602002602001820160405280156107925781602001602082028036833780820191505090505b5082610160018190525082602001515167ffffffffffffffff8111156107bb576107ba612bfe565b5b6040519080825280602002602001820160405280156107e95781602001602082028036833780820191505090505b5082610240018190525082602001515167ffffffffffffffff81111561081257610811612bfe565b5b6040519080825280602002602001820160405280156108405781602001602082028036833780820191505090505b5082610260018190525082602001515167ffffffffffffffff81111561086957610868612bfe565b5b6040519080825280602002602001820160405280156108975781602001602082028036833780820191505090505b5082610280018190525082602001515167ffffffffffffffff8111156108c0576108bf612bfe565b5b6040519080825280602002602001820160405280156108ee5781602001602082028036833780820191505090505b50826102a0018190525082602001515167ffffffffffffffff81111561091757610916612bfe565b5b6040519080825280602002602001820160405280156109455781602001602082028036833780820191505090505b50826102c0018190525082602001515167ffffffffffffffff81111561096e5761096d612bfe565b5b60405190808252806020026020018201604052801561099c5781602001602082028036833780820191505090505b50826102e0018190525082602001515167ffffffffffffffff8111156109c5576109c4612bfe565b5b6040519080825280602002602001820160405280156109f35781602001602082028036833780820191505090505b5082610180018190525082602001515167ffffffffffffffff811115610a1c57610a1b612bfe565b5b604051908082528060200260200182016040528015610a4a5781602001602082028036833780820191505090505b50826101e0018190525082602001515167ffffffffffffffff811115610a7357610a72612bfe565b5b604051908082528060200260200182016040528015610aa15781602001602082028036833780820191505090505b50826101c0018190525082602001515167ffffffffffffffff811115610aca57610ac9612bfe565b5b604051908082528060200260200182016040528015610af85781602001602082028036833780820191505090505b50826101a0018190525082602001515167ffffffffffffffff811115610b2157610b20612bfe565b5b604051908082528060200260200182016040528015610b4f5781602001602082028036833780820191505090505b5082610200018190525082602001515167ffffffffffffffff811115610b7857610b77612bfe565b5b604051908082528060200260200182016040528015610ba65781602001602082028036833780820191505090505b508261022001819052506000836060015111156116a85760005b836020015151811015610cb95760008190505b846020015151811015610ca557818114610c925784602001518181518110610bfe57610bfd613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1685602001518381518110610c3357610c32613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c88906134a1565b60405180910390fd5b5b8080610c9d906131b2565b915050610bd3565b508080610cb1906131b2565b915050610bc0565b5060005b8360200151518110156110f257600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff1685602001518381518110610d0e57610d0d613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614610d555784602001518281518110610d4857610d47613426565b5b6020026020010151610d6b565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b90508084602001518381518110610d8557610d84613426565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610dc981886126ca565b8561024001518481518110610de157610de0613426565b5b602002602001018660c001518581518110610dff57610dfe613426565b5b602002602001018281525082815250505060008460c001518381518110610e2957610e28613426565b5b602002602001015114610ea7578460a001518281518110610e4d57610e4c613426565b5b60200260200101518460c001518381518110610e6c57610e6b613426565b5b6020026020010151610e7e91906134c1565b8461012001518381518110610e9657610e95613426565b5b602002602001018181525050610f15565b8460a001518281518110610ebe57610ebd613426565b5b60200260200101518461024001518381518110610ede57610edd613426565b5b6020026020010151610ef091906134c1565b846102a001518381518110610f0857610f07613426565b5b6020026020010181815250505b8360c001518281518110610f2c57610f2b613426565b5b60200260200101518461024001518381518110610f4c57610f4b613426565b5b6020026020010151610f5e91906134c1565b8461018001518381518110610f7657610f75613426565b5b6020026020010181815250508361012001518281518110610f9a57610f99613426565b5b6020026020010151846102a001518381518110610fba57610fb9613426565b5b6020026020010151610fcc91906134c1565b846101e001518381518110610fe457610fe3613426565b5b6020026020010181815250506000846101800151838151811061100a57611009613426565b5b602002602001015111156110de576000600186606001511461104c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61106d565b846101800151838151811061106457611063613426565b5b60200260200101515b90508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b388836040518363ffffffff1660e01b81526004016110aa929190613504565b600060405180830381600087803b1580156110c457600080fd5b505af11580156110d8573d6000803e3d6000fd5b50505050505b5080806110ea906131b2565b915050610cbd565b50600183606001510361115c578160c001518260e00181905250816102400151826102800181905250816101800151826101a00181905250816101200151826101400181905250816102a00151826102e00181905250816101e001518261020001819052506116a7565b60005b826101800151518110156116a55783606001518360c00151828151811061118957611188613426565b5b602002602001015161119b919061355c565b83610100015182815181106111b3576111b2613426565b5b602002602001018181525050600184606001516111d0919061317e565b83610100015182815181106111e8576111e7613426565b5b60200260200101516111fa919061358d565b8360c00151828151811061121157611210613426565b5b6020026020010151611223919061317e565b8360e00151828151811061123a57611239613426565b5b6020026020010181815250508360600151836102400151828151811061126357611262613426565b5b6020026020010151611275919061355c565b836102600151828151811061128d5761128c613426565b5b602002602001018181525050600184606001516112aa919061317e565b83610260015182815181106112c2576112c1613426565b5b60200260200101516112d4919061358d565b83610240015182815181106112ec576112eb613426565b5b60200260200101516112fe919061317e565b836102800151828151811061131657611315613426565b5b6020026020010181815250508360600151836101800151828151811061133f5761133e613426565b5b6020026020010151611351919061355c565b836101c00151828151811061136957611368613426565b5b60200260200101818152505060018460600151611386919061317e565b836101c00151828151811061139e5761139d613426565b5b60200260200101516113b0919061358d565b83610180015182815181106113c8576113c7613426565b5b60200260200101516113da919061317e565b836101a0015182815181106113f2576113f1613426565b5b6020026020010181815250508360600151836101200151828151811061141b5761141a613426565b5b602002602001015161142d919061355c565b836101600151828151811061144557611444613426565b5b60200260200101818152505060018460600151611462919061317e565b836101600151828151811061147a57611479613426565b5b602002602001015161148c919061358d565b83610120015182815181106114a4576114a3613426565b5b60200260200101516114b6919061317e565b83610140015182815181106114ce576114cd613426565b5b6020026020010181815250508360600151836102a0015182815181106114f7576114f6613426565b5b6020026020010151611509919061355c565b836102c00151828151811061152157611520613426565b5b6020026020010181815250506001846060015161153e919061317e565b836102c00151828151811061155657611555613426565b5b6020026020010151611568919061358d565b836102a0015182815181106115805761157f613426565b5b6020026020010151611592919061317e565b836102e0015182815181106115aa576115a9613426565b5b6020026020010181815250508360600151836101e0015182815181106115d3576115d2613426565b5b60200260200101516115e5919061355c565b83610220015182815181106115fd576115fc613426565b5b6020026020010181815250506001846060015161161a919061317e565b836102200151828151811061163257611631613426565b5b6020026020010151611644919061358d565b836101e00151828151811061165c5761165b613426565b5b602002602001015161166e919061317e565b836102000151828151811061168657611685613426565b5b602002602001018181525050808061169d906131b2565b91505061115f565b505b5b5b819050949350505050565b6116bc612a20565b82600001515167ffffffffffffffff8111156116db576116da612bfe565b5b6040519080825280602002602001820160405280156117095781602001602082028036833780820191505090505b50826060018190525082600001515167ffffffffffffffff81111561173157611730612bfe565b5b60405190808252806020026020018201604052801561175f5781602001602082028036833780820191505090505b50826000018190525082600001515167ffffffffffffffff81111561178757611786612bfe565b5b6040519080825280602002602001820160405280156117b55781602001602082028036833780820191505090505b50826040018190525082600001515167ffffffffffffffff8111156117dd576117dc612bfe565b5b60405190808252806020026020018201604052801561180b5781602001602082028036833780820191505090505b50826080018190525082600001515167ffffffffffffffff81111561183357611832612bfe565b5b6040519080825280602002602001820160405280156118615781602001602082028036833780820191505090505b508260a0018190525060005b8360000151518110156119665760008190505b8460000151518110156119525781811461193f57846000015181815181106118ab576118aa613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16856000015183815181106118e0576118df613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361193e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611935906134a1565b60405180910390fd5b5b808061194a906131b2565b915050611880565b50808061195e906131b2565b91505061186d565b5060005b836000015151811015611c2257600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff16856000015183815181106119bb576119ba613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614611a0257846000015182815181106119f5576119f4613426565b5b6020026020010151611a18565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b9050600073057835ad21a177dbdd3090bb1cae03eacf78fc6d73ffffffffffffffffffffffffffffffffffffffff1663d2493b6c836040518263ffffffff1660e01b8152600401611a6991906135cf565b606060405180830381865afa158015611a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaa91906135ea565b505090508185600001518481518110611ac657611ac5613426565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508085604001518481518110611b1857611b17613426565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084604001518381518110611b6957611b68613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401611ba991906135cf565b602060405180830381865afa158015611bc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bea9190613652565b85606001518481518110611c0157611c00613426565b5b60200260200101818152505050508080611c1a906131b2565b91505061196a565b5060018360600151148015611c38575082608001515b80611c47575060008360600151145b15611c5e5781606001518260a00181905250611d7c565b60005b826060015151811015611d7a5760008460800151611c8f5760018560600151611c8a91906134c1565b611c95565b84606001515b90508084606001518381518110611caf57611cae613426565b5b6020026020010151611cc1919061355c565b84608001518381518110611cd857611cd7613426565b5b602002602001018181525050600181611cf1919061317e565b84608001518381518110611d0857611d07613426565b5b6020026020010151611d1a919061358d565b84606001518381518110611d3157611d30613426565b5b6020026020010151611d43919061317e565b8460a001518381518110611d5a57611d59613426565b5b602002602001018181525050508080611d72906131b2565b915050611c61565b505b8190509392505050565b60005b86811015611f72576000848281518110611da657611da5613426565b5b60200260200101511115611f5f576000848281518110611dc957611dc8613426565b5b60200260200101519050858281518110611de657611de5613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166323b872dd8430846040518463ffffffff1660e01b8152600401611e2a9392919061367f565b6020604051808303816000875af1158015611e49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6d91906136cb565b611eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea390613744565b60405180910390fd5b611ed0848381518110611ec257611ec1613426565b5b602002602001015130612864565b611f5d578673ffffffffffffffffffffffffffffffffffffffff16635a3b74b9858481518110611f0357611f02613426565b5b602002602001015160016040518363ffffffff1660e01b8152600401611f2a929190613764565b600060405180830381600087803b158015611f4457600080fd5b505af1158015611f58573d6000803e3d6000fd5b505050505b505b8080611f6a906131b2565b915050611d89565b50505050505050565b606082600001515167ffffffffffffffff811115611f9c57611f9b612bfe565b5b604051908082528060200260200182016040528015611fca5781602001602082028036833780820191505090505b50905060005b8260400151518110156120a75782604001518181518110611ff457611ff3613426565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b815260040161203491906135cf565b602060405180830381865afa158015612051573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120759190613652565b82828151811061208857612087613426565b5b602002602001018181525050808061209f906131b2565b915050611fd0565b509392505050565b606080606080606080600088602001515111156124925787602001515167ffffffffffffffff8111156120e5576120e4612bfe565b5b6040519080825280602002602001820160405280156121135781602001602082028036833780820191505090505b50955087602001515167ffffffffffffffff81111561213557612134612bfe565b5b6040519080825280602002602001820160405280156121635781602001602082028036833780820191505090505b50945087602001515167ffffffffffffffff81111561218557612184612bfe565b5b6040519080825280602002602001820160405280156121b35781602001602082028036833780820191505090505b50935087602001515167ffffffffffffffff8111156121d5576121d4612bfe565b5b6040519080825280602002602001820160405280156122035781602001602082028036833780820191505090505b50925087602001515167ffffffffffffffff81111561222557612224612bfe565b5b6040519080825280602002602001820160405280156122535781602001602082028036833780820191505090505b50915087602001515167ffffffffffffffff81111561227557612274612bfe565b5b6040519080825280602002602001820160405280156122a35781602001602082028036833780820191505090505b5090506000886060015111156124915760005b87602001515181101561248f576000886020015182815181106122dc576122db613426565b5b602002602001015190506122f0818c6126ca565b87848151811061230357612302613426565b5b602002602001018a858151811061231d5761231c613426565b5b6020026020010182815250828152505050600088838151811061234357612342613426565b5b6020026020010151146123b8578960a00151828151811061236757612366613426565b5b602002602001015188838151811061238257612381613426565b5b602002602001015161239491906134c1565b8783815181106123a7576123a6613426565b5b60200260200101818152505061241c565b8960a0015182815181106123cf576123ce613426565b5b60200260200101518683815181106123ea576123e9613426565b5b60200260200101516123fc91906134c1565b85838151811061240f5761240e613426565b5b6020026020010181815250505b87828151811061242f5761242e613426565b5b602002602001015186838151811061244a57612449613426565b5b602002602001015161245c91906134c1565b83838151811061246f5761246e613426565b5b602002602001018181525050508080612487906131b2565b9150506122b6565b505b5b93975093979195509350565b60005b858110156125225760008382815181106124be576124bd613426565b5b6020026020010151111561250f5761250e858583815181106124e3576124e2613426565b5b60200260200101518584815181106124fe576124fd613426565b5b602002602001015160018661292d565b5b808061251a906131b2565b9150506124a1565b505050505050565b60005b858110156125ae57600083828151811061254a57612549613426565b5b6020026020010151111561259b5761259a8585838151811061256f5761256e613426565b5b602002602001015185848151811061258a57612589613426565b5b602002602001015160028661292d565b5b80806125a6906131b2565b91505061252d565b505050505050565b60005b848110156126395760008282815181106125d6576125d5613426565b5b6020026020010151111561262657612625848483815181106125fb576125fa613426565b5b602002602001015184848151811061261657612615613426565b5b602002602001015160026129a5565b5b8080612631906131b2565b9150506125b9565b5050505050565b60005b848110156126c35760008282815181106126605761265f613426565b5b602002602001015111156126b0576126af8484838151811061268557612684613426565b5b60200260200101518484815181106126a05761269f613426565b5b602002602001015160016129a5565b5b80806126bb906131b2565b915050612643565b5050505050565b60008060008073057835ad21a177dbdd3090bb1cae03eacf78fc6d73ffffffffffffffffffffffffffffffffffffffff1663d2493b6c876040518263ffffffff1660e01b815260040161271d91906135cf565b606060405180830381865afa15801561273a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275e91906135ea565b92509250508173ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b815260040161279c91906135cf565b602060405180830381865afa1580156127b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127dd9190613652565b93508073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b815260040161281891906135cf565b602060405180830381865afa158015612835573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128599190613652565b925050509250929050565b600073057835ad21a177dbdd3090bb1cae03eacf78fc6d73ffffffffffffffffffffffffffffffffffffffff166328dd2d0184846040518363ffffffff1660e01b81526004016128b592919061378d565b61012060405180830381865afa1580156128d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f791906137f3565b90919293949596975090919293949596509091929394955090919293945090919293509091925090915090508091505092915050565b8473ffffffffffffffffffffffffffffffffffffffff1663573ade81858585856040518563ffffffff1660e01b815260040161296c94939291906138bd565b600060405180830381600087803b15801561298657600080fd5b505af115801561299a573d6000803e3d6000fd5b505050505050505050565b8373ffffffffffffffffffffffffffffffffffffffff1663a415bcad848484610c9c306040518663ffffffff1660e01b81526004016129e895949392919061391f565b600060405180830381600087803b158015612a0257600080fd5b505af1158015612a16573d6000803e3d6000fd5b5050505050505050565b6040518061030001604052806060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b0f578082015181840152602081019050612af4565b60008484015250505050565b6000601f19601f8301169050919050565b6000612b3782612ad5565b612b418185612ae0565b9350612b51818560208601612af1565b612b5a81612b1b565b840191505092915050565b60006020820190508181036000830152612b7f8184612b2c565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bc682612b9b565b9050919050565b612bd681612bbb565b8114612be157600080fd5b50565b600081359050612bf381612bcd565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c3682612b1b565b810181811067ffffffffffffffff82111715612c5557612c54612bfe565b5b80604052505050565b6000612c68612b87565b9050612c748282612c2d565b919050565b600080fd5b600080fd5b600067ffffffffffffffff821115612c9e57612c9d612bfe565b5b602082029050602081019050919050565b600080fd5b6000612cc7612cc284612c83565b612c5e565b90508083825260208201905060208402830185811115612cea57612ce9612caf565b5b835b81811015612d135780612cff8882612be4565b845260208401935050602081019050612cec565b5050509392505050565b600082601f830112612d3257612d31612c7e565b5b8135612d42848260208601612cb4565b91505092915050565b60008115159050919050565b612d6081612d4b565b8114612d6b57600080fd5b50565b600081359050612d7d81612d57565b92915050565b6000819050919050565b612d9681612d83565b8114612da157600080fd5b50565b600081359050612db381612d8d565b92915050565b600067ffffffffffffffff821115612dd457612dd3612bfe565b5b602082029050602081019050919050565b6000612df8612df384612db9565b612c5e565b90508083825260208201905060208402830185811115612e1b57612e1a612caf565b5b835b81811015612e445780612e308882612da4565b845260208401935050602081019050612e1d565b5050509392505050565b600082601f830112612e6357612e62612c7e565b5b8135612e73848260208601612de5565b91505092915050565b600060c08284031215612e9257612e91612bf9565b5b612e9c60c0612c5e565b9050600082013567ffffffffffffffff811115612ebc57612ebb612c79565b5b612ec884828501612d1d565b600083015250602082013567ffffffffffffffff811115612eec57612eeb612c79565b5b612ef884828501612d1d565b6020830152506040612f0c84828501612d6e565b6040830152506060612f2084828501612da4565b6060830152506080612f3484828501612d6e565b60808301525060a082013567ffffffffffffffff811115612f5857612f57612c79565b5b612f6484828501612e4e565b60a08301525092915050565b60008060408385031215612f8757612f86612b91565b5b6000612f9585828601612be4565b925050602083013567ffffffffffffffff811115612fb657612fb5612b96565b5b612fc285828601612e7c565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000612ff382612fcc565b612ffd8185612fd7565b935061300d818560208601612af1565b61301681612b1b565b840191505092915050565b6000604082019050818103600083015261303b8185612b2c565b9050818103602083015261304f8184612fe8565b90509392505050565b60006020828403121561306e5761306d612b91565b5b600082013567ffffffffffffffff81111561308c5761308b612b96565b5b61309884828501612e7c565b91505092915050565b7f302d6c656e6774682d6e6f742d616c6c6f776564000000000000000000000000600082015250565b60006130d7601483612ae0565b91506130e2826130a1565b602082019050919050565b60006020820190508181036000830152613106816130ca565b9050919050565b60008151905061311c81612bcd565b92915050565b60006020828403121561313857613137612b91565b5b60006131468482850161310d565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061318982612d83565b915061319483612d83565b92508282039050818111156131ac576131ab61314f565b5b92915050565b60006131bd82612d83565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131ef576131ee61314f565b5b600182019050919050565b61320381612bbb565b82525050565b61321281612d4b565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61324d81612bbb565b82525050565b600061325f8383613244565b60208301905092915050565b6000602082019050919050565b600061328382613218565b61328d8185613223565b935061329883613234565b8060005b838110156132c95781516132b08882613253565b97506132bb8361326b565b92505060018101905061329c565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61330b81612d83565b82525050565b600061331d8383613302565b60208301905092915050565b6000602082019050919050565b6000613341826132d6565b61334b81856132e1565b9350613356836132f2565b8060005b8381101561338757815161336e8882613311565b975061337983613329565b92505060018101905061335a565b5085935050505092915050565b600060e0820190506133a9600083018a6131fa565b6133b66020830189613209565b81810360408301526133c88188613278565b905081810360608301526133dc8187613278565b905081810360808301526133f08186613336565b905081810360a08301526134048185613336565b905081810360c08301526134188184613336565b905098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f746f6b656e2d7265706561746564000000000000000000000000000000000000600082015250565b600061348b600e83612ae0565b915061349682613455565b602082019050919050565b600060208201905081810360008301526134ba8161347e565b9050919050565b60006134cc82612d83565b91506134d783612d83565b92508282019050808211156134ef576134ee61314f565b5b92915050565b6134fe81612d83565b82525050565b600060408201905061351960008301856131fa565b61352660208301846134f5565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061356782612d83565b915061357283612d83565b9250826135825761358161352d565b5b828204905092915050565b600061359882612d83565b91506135a383612d83565b92508282026135b181612d83565b915082820484148315176135c8576135c761314f565b5b5092915050565b60006020820190506135e460008301846131fa565b92915050565b60008060006060848603121561360357613602612b91565b5b60006136118682870161310d565b93505060206136228682870161310d565b92505060406136338682870161310d565b9150509250925092565b60008151905061364c81612d8d565b92915050565b60006020828403121561366857613667612b91565b5b60006136768482850161363d565b91505092915050565b600060608201905061369460008301866131fa565b6136a160208301856131fa565b6136ae60408301846134f5565b949350505050565b6000815190506136c581612d57565b92915050565b6000602082840312156136e1576136e0612b91565b5b60006136ef848285016136b6565b91505092915050565b7f616c6c6f77616e63653f00000000000000000000000000000000000000000000600082015250565b600061372e600a83612ae0565b9150613739826136f8565b602082019050919050565b6000602082019050818103600083015261375d81613721565b9050919050565b600060408201905061377960008301856131fa565b6137866020830184613209565b9392505050565b60006040820190506137a260008301856131fa565b6137af60208301846131fa565b9392505050565b600064ffffffffff82169050919050565b6137d0816137b6565b81146137db57600080fd5b50565b6000815190506137ed816137c7565b92915050565b60008060008060008060008060006101208a8c03121561381657613815612b91565b5b60006138248c828d0161363d565b99505060206138358c828d0161363d565b98505060406138468c828d0161363d565b97505060606138578c828d0161363d565b96505060806138688c828d0161363d565b95505060a06138798c828d0161363d565b94505060c061388a8c828d0161363d565b93505060e061389b8c828d016137de565b9250506101006138ad8c828d016136b6565b9150509295985092959850929598565b60006080820190506138d260008301876131fa565b6138df60208301866134f5565b6138ec60408301856134f5565b6138f960608301846131fa565b95945050505050565b600061ffff82169050919050565b61391981613902565b82525050565b600060a08201905061393460008301886131fa565b61394160208301876134f5565b61394e60408301866134f5565b61395b6060830185613910565b61396860808301846131fa565b969550505050505056fe4c6f67416176655632496d706f727428616464726573732c626f6f6c2c616464726573735b5d2c616464726573735b5d2c75696e743235365b5d2c75696e743235365b5d2c75696e743235365b5d29a26469706673582212201bead4e4bdd491d791a96849f16bdddf0476ded2127a722766910d70cb4bc75164736f6c63430008120033

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  ]

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.