AVAX Price: $51.56 (-1.64%)
 

Overview

AVAX Balance

Avalanche C-Chain LogoAvalanche C-Chain LogoAvalanche C-Chain Logo0 AVAX

AVAX Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Auto Execute On ...540306102024-12-07 5:35:402 hrs ago1733549740IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0077197325.05
Auto Execute On ...540306062024-12-07 5:35:322 hrs ago1733549732IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0057393825.05
Auto Execute On ...540306032024-12-07 5:35:262 hrs ago1733549726IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0041632825.05
Auto Execute On ...540305992024-12-07 5:35:182 hrs ago1733549718IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0027181725.05
Auto Execute On ...540305932024-12-07 5:35:062 hrs ago1733549706IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0264294525.05
Auto Execute On ...540305912024-12-07 5:35:022 hrs ago1733549702IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0280833525.05
Auto Execute On ...540259082024-12-07 2:52:305 hrs ago1733539950IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0029604325.05
Auto Execute On ...540259062024-12-07 2:52:265 hrs ago1733539946IN
0x056c41b8...a1b5ffbAE
0 AVAX0.002307625.05
Auto Execute On ...540259042024-12-07 2:52:225 hrs ago1733539942IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0047735525.05
Auto Execute On ...540258972024-12-07 2:52:085 hrs ago1733539928IN
0x056c41b8...a1b5ffbAE
0 AVAX0.002308525.05
Do Flash Loan On...540258932024-12-07 2:52:015 hrs ago1733539921IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0707977325.05
Auto Execute On ...540206252024-12-06 23:50:428 hrs ago1733529042IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0077197325.05
Auto Execute On ...540206232024-12-06 23:50:358 hrs ago1733529035IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0057892825.05
Auto Execute On ...540206202024-12-06 23:50:298 hrs ago1733529029IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0041635825.05
Auto Execute On ...540206152024-12-06 23:50:198 hrs ago1733529019IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0027181725.05
Auto Execute On ...540206102024-12-06 23:50:098 hrs ago1733529009IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0264294525.05
Auto Execute On ...540206072024-12-06 23:50:038 hrs ago1733529003IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0280833525.05
Auto Execute On ...540130342024-12-06 19:30:4612 hrs ago1733513446IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0077194325.05
Auto Execute On ...540130302024-12-06 19:30:3812 hrs ago1733513438IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0057406325.05
Auto Execute On ...540130252024-12-06 19:30:2512 hrs ago1733513425IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0042131825.05
Auto Execute On ...540130212024-12-06 19:30:1712 hrs ago1733513417IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0027178725.05
Auto Execute On ...540130162024-12-06 19:30:0712 hrs ago1733513407IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0264291525.05
Auto Execute On ...540130142024-12-06 19:30:0212 hrs ago1733513402IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0280830525.05
Auto Execute On ...540084872024-12-06 16:56:1815 hrs ago1733504178IN
0x056c41b8...a1b5ffbAE
0 AVAX0.0029604325.05
Auto Execute On ...540084842024-12-06 16:56:1215 hrs ago1733504172IN
0x056c41b8...a1b5ffbAE
0 AVAX0.002308525.05
View all transactions

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Automation

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion
File 1 of 8 : Automation.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0 <0.9.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/interfaces/IERC3156FlashLender.sol";
import "../controller/IAccount.sol";
import "../verifier/IERC2612Verifier.sol";
import "../verifier/ITokenApprovalVerifier.sol";

contract Automation {
    address public immutable verifier;
    address public immutable tokenApprovalVerifier;
    address public immutable loanProvider;
    mapping(address => address) public customizedLoanProviders;

    event SetLoanProvider(address account, address loanProvider);

    constructor(
        address _verifier,
        address _tokenApprovalVerifier,
        address _loanProvider
    ) {
        verifier = _verifier;
        tokenApprovalVerifier = _tokenApprovalVerifier;
        loanProvider = _loanProvider;
    }

    function setLoanProvider(address account, address customizedLoanProvider)
        external
    {
        require(IAccount(account).owner() == msg.sender, "Owner check failed.");
        customizedLoanProviders[account] = customizedLoanProvider;
        emit SetLoanProvider(account, customizedLoanProvider);
    }

    function getLoanProvider(address account) public view returns (address) {
        return
            customizedLoanProviders[account] == address(0)
                ? loanProvider
                : customizedLoanProviders[account];
    }

    function _executeVerifyBasic(address account, uint256 operation)
        internal
        view
    {
        require(
            IERC2612Verifier(verifier).isTxPermitted(
                account,
                msg.sender,
                operation
            ),
            "denied"
        );
    }

    function _executeVerifyAdapter(address account, bytes memory callBytes)
        internal
        view
    {
        address adapter;
        assembly {
            adapter := mload(add(callBytes, 32))
        }
        require(
            IERC2612Verifier(verifier).isTxPermitted(
                account,
                msg.sender,
                adapter
            ),
            "denied"
        );
    }

    function _executeVerifyApproval(address account, address spender)
        internal
        view
    {
        require(
            ITokenApprovalVerifier(tokenApprovalVerifier).isWhitelisted(
                account,
                spender
            ),
            "denied"
        );
    }

    function _autoExecute(
        address account,
        bytes calldata callBytes,
        bool callType
    ) internal returns (bytes memory returnData) {
        _executeVerifyAdapter(account, callBytes);
        returnData = IAccount(account).executeOnAdapter(callBytes, callType);
    }

    function autoExecute(
        address account,
        bytes calldata callBytes,
        bool callType
    ) external returns (bytes memory) {
        return _autoExecute(account, callBytes, callType);
    }

    function autoExecuteWithPermit(
        address account,
        bytes calldata callBytes,
        bool callType,
        bytes32 approvalType,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (bytes memory) {
        IERC2612Verifier(verifier).permit(
            account,
            msg.sender,
            approvalType,
            deadline,
            v,
            r,
            s
        );
        return _autoExecute(account, callBytes, callType);
    }

    function autoExecuteMultiCall(
        address account,
        bool[] memory callType,
        bytes[] memory callBytes,
        bool[] memory isNeedCallback
    ) external {
        require(
            callType.length == callBytes.length &&
                callBytes.length == isNeedCallback.length
        );
        for (uint256 i = 0; i < callType.length; i++) {
            _executeVerifyAdapter(account, callBytes[i]);
        }
        IAccount(payable(account)).multiCall(
            callType,
            callBytes,
            isNeedCallback
        );
    }

    function autoApprove(
        address account,
        address token,
        address spender,
        uint256 amount
    ) external {
        _executeVerifyBasic(account, 0);
        _executeVerifyApproval(account, spender);
        IAccount(payable(account)).approve(token, spender, amount);
    }

    function autoApproveWithPermit(
        address account,
        address[] memory tokens,
        address[] memory spenders,
        uint256[] memory amounts,
        address[] memory permitSpenders,
        bool enable,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        require(
            tokens.length == spenders.length &&
                spenders.length == amounts.length,
            "approve length error."
        );
        _executeVerifyBasic(account, 0);
        ITokenApprovalVerifier(tokenApprovalVerifier).permit(
            account,
            permitSpenders,
            enable,
            deadline,
            v,
            r,
            s
        );
        for (uint256 i = 0; i < spenders.length; i++) {
            _executeVerifyApproval(account, spenders[i]);
        }
        IAccount(payable(account)).approveTokens(tokens, spenders, amounts);
    }

    function doFlashLoan(
        address account,
        address token,
        uint256 amount,
        bytes calldata payload
    ) external {
        _executeVerifyBasic(account, 1);
        (
            bool[] memory _callType,
            bytes[] memory _callBytes,
            bool[] memory _isNeedCallback
        ) = abi.decode(payload, (bool[], bytes[], bool[]));
        require(
            _callType.length == _callBytes.length &&
                _callBytes.length == _isNeedCallback.length
        );
        for (uint256 i = 0; i < _callBytes.length; i++) {
            _executeVerifyAdapter(account, _callBytes[i]);
        }
        IERC3156FlashLender(getLoanProvider(account)).flashLoan(
            IERC3156FlashBorrower(account),
            token,
            amount,
            payload
        );
    }

    function autoExecuteOnSubAccount(
        address account,
        address subAccount,
        bytes calldata callArgs,
        uint256 amountETH
    ) external {
        _executeVerifyBasic(account, 2);
        require(Ownable(subAccount).owner() == account, "invalid account!");
        IAccount(payable(account)).callOnSubAccount(
            subAccount,
            callArgs,
            amountETH
        );
    }

    function doFlashLoanOnSubAccount(
        address account,
        address subAccount,
        address token,
        uint256 amount,
        bytes calldata payload
    ) external {
        _executeVerifyBasic(account, 3);
        require(Ownable(subAccount).owner() == account, "invalid account!");
        IERC3156FlashLender(getLoanProvider(account)).flashLoan(
            IERC3156FlashBorrower(subAccount),
            token,
            amount,
            payload
        );
    }
}

File 2 of 8 : IERC2612Verifier.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0 <0.9.0;

interface IERC2612Verifier {
    event OperatorUpdate(
        address account,
        address operator,
        bytes32 approvalType
    );

    function approve(
        address account,
        address operator,
        bytes32 approvalType,
        uint256 deadline
    ) external;

    function permit(
        address account,
        address operator,
        bytes32 approvalType,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

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

    function isTxPermitted(
        address account,
        address operator,
        uint256 operation
    ) external view returns (bool);
}

File 3 of 8 : IAccount.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0 <0.9.0;

interface IAccount {
    function owner() external view returns (address);

    function createSubAccount(bytes memory _data, uint256 _costETH)
        external
        payable
        returns (address newSubAccount);

    function executeOnAdapter(bytes calldata _callBytes, bool _callType)
        external
        payable
        returns (bytes memory);

    function multiCall(
        bool[] calldata _callType,
        bytes[] calldata _callArgs,
        bool[] calldata _isNeedCallback
    ) external;

    function setAdvancedOption(bool val) external;

    function callOnSubAccount(
        address _target,
        bytes calldata _callArgs,
        uint256 amountETH
    ) external;

    function withdrawAssets(
        address[] calldata _tokens,
        address _receiver,
        uint256[] calldata _amounts
    ) external;

    function approve(
        address tokenAddr,
        address to,
        uint256 amount
    ) external;

    function approveTokens(
        address[] calldata _tokens,
        address[] calldata _spenders,
        uint256[] calldata _amounts
    ) external;

    function isSubAccount(address subAccount) external view returns (bool);
}

File 4 of 8 : ITokenApprovalVerifier.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0 <0.9.0;

interface ITokenApprovalVerifier {
    event ApprovalUpdate(address account, address[] spenders, bool isAllowed);

    function approve(
        address account,
        address[] memory spenders,
        bool enable,
        uint256 deadline
    ) external;

    function permit(
        address account,
        address[] memory spenders,
        bool enable,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

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

File 5 of 8 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 6 of 8 : IERC3156FlashLender.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC3156FlashLender.sol)

pragma solidity ^0.8.0;

import "./IERC3156FlashBorrower.sol";

/**
 * @dev Interface of the ERC3156 FlashLender, as defined in
 * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156].
 *
 * _Available since v4.1._
 */
interface IERC3156FlashLender {
    /**
     * @dev The amount of currency available to be lended.
     * @param token The loan currency.
     * @return The amount of `token` that can be borrowed.
     */
    function maxFlashLoan(address token) external view returns (uint256);

    /**
     * @dev The fee to be charged for a given loan.
     * @param token The loan currency.
     * @param amount The amount of tokens lent.
     * @return The amount of `token` to be charged for the loan, on top of the returned principal.
     */
    function flashFee(address token, uint256 amount) external view returns (uint256);

    /**
     * @dev Initiate a flash loan.
     * @param receiver The receiver of the tokens in the loan, and the receiver of the callback.
     * @param token The loan currency.
     * @param amount The amount of tokens lent.
     * @param data Arbitrary data structure, intended to contain user-defined parameters.
     */
    function flashLoan(
        IERC3156FlashBorrower receiver,
        address token,
        uint256 amount,
        bytes calldata data
    ) external returns (bool);
}

File 7 of 8 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 8 of 8 : IERC3156FlashBorrower.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC3156FlashBorrower.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC3156 FlashBorrower, as defined in
 * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156].
 *
 * _Available since v4.1._
 */
interface IERC3156FlashBorrower {
    /**
     * @dev Receive a flash loan.
     * @param initiator The initiator of the loan.
     * @param token The loan currency.
     * @param amount The amount of tokens lent.
     * @param fee The additional amount of tokens to repay.
     * @param data Arbitrary data structure, intended to contain user-defined parameters.
     * @return The keccak256 hash of "ERC3156FlashBorrower.onFlashLoan"
     */
    function onFlashLoan(
        address initiator,
        address token,
        uint256 amount,
        uint256 fee,
        bytes calldata data
    ) external returns (bytes32);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_verifier","type":"address"},{"internalType":"address","name":"_tokenApprovalVerifier","type":"address"},{"internalType":"address","name":"_loanProvider","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"loanProvider","type":"address"}],"name":"SetLoanProvider","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"autoApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address[]","name":"spenders","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address[]","name":"permitSpenders","type":"address[]"},{"internalType":"bool","name":"enable","type":"bool"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"autoApproveWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes","name":"callBytes","type":"bytes"},{"internalType":"bool","name":"callType","type":"bool"}],"name":"autoExecute","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool[]","name":"callType","type":"bool[]"},{"internalType":"bytes[]","name":"callBytes","type":"bytes[]"},{"internalType":"bool[]","name":"isNeedCallback","type":"bool[]"}],"name":"autoExecuteMultiCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"subAccount","type":"address"},{"internalType":"bytes","name":"callArgs","type":"bytes"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"name":"autoExecuteOnSubAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes","name":"callBytes","type":"bytes"},{"internalType":"bool","name":"callType","type":"bool"},{"internalType":"bytes32","name":"approvalType","type":"bytes32"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"autoExecuteWithPermit","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"customizedLoanProviders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"doFlashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"subAccount","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"doFlashLoanOnSubAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLoanProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"loanProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"customizedLoanProvider","type":"address"}],"name":"setLoanProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenApprovalVerifier","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"verifier","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60e06040523480156200001157600080fd5b5060405162001f0c38038062001f0c83398101604081905262000034916200006f565b6001600160a01b0392831660805290821660a0521660c052620000b9565b80516001600160a01b03811681146200006a57600080fd5b919050565b6000806000606084860312156200008557600080fd5b620000908462000052565b9250620000a06020850162000052565b9150620000b06040850162000052565b90509250925092565b60805160a05160c051611df962000113600039600081816101b701526105d10152600081816101f101528181610c1301526110de0152600081816101320152818161041d01528181610dae0152610edc0152611df96000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80639c7a4b8a1161008c578063b9793cb711610066578063b9793cb714610226578063c930f63414610239578063d50f6d5e1461026f578063f811bcdb1461028257600080fd5b80639c7a4b8a146101d9578063a2ce2634146101ec578063afdeedc41461021357600080fd5b806368e1f512116100c857806368e1f512146101795780637b67a87a1461018c5780638d1708241461019f57806393ff268d146101b257600080fd5b806306d025f5146100ef5780630b952b5a146101045780632b7ac3f31461012d575b600080fd5b6101026100fd36600461118b565b610295565b005b610117610112366004611228565b6103aa565b6040516101249190611317565b60405180910390f35b6101547f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b610102610187366004611510565b610495565b61015461019a3660046115ab565b610573565b6101026101ad3660046115c8565b6105f7565b6101547f000000000000000000000000000000000000000000000000000000000000000081565b6101176101e7366004611619565b61066f565b6101547f000000000000000000000000000000000000000000000000000000000000000081565b610102610221366004611681565b610686565b6101026102343660046116ee565b61081f565b6101546102473660046115ab565b60006020819052908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b61010261027d366004611773565b6109c2565b61010261029036600461186b565b610b53565b6102a0856001610d5c565b600080806102b084860186611969565b925092509250815183511480156102c8575080518251145b6102d157600080fd5b60005b825181101561031257610300898483815181106102f3576102f36119f1565b6020026020010151610e84565b8061030a81611a20565b9150506102d4565b5061031c88610573565b73ffffffffffffffffffffffffffffffffffffffff16635cffe9de89898989896040518663ffffffff1660e01b815260040161035c959493929190611aaa565b6020604051808303816000875af115801561037b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039f9190611af5565b505050505050505050565b6040517f3dba5ba800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152336024830152604482018790526064820186905260ff8516608483015260a4820184905260c482018390526060917f000000000000000000000000000000000000000000000000000000000000000090911690633dba5ba89060e401600060405180830381600087803b15801561046357600080fd5b505af1158015610477573d6000803e3d6000fd5b505050506104878a8a8a8a610fb2565b9a9950505050505050505050565b815183511480156104a7575080518251145b6104b057600080fd5b60005b83518110156104e4576104d2858483815181106102f3576102f36119f1565b806104dc81611a20565b9150506104b3565b506040517f405f301d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063405f301d9061053b90869086908690600401611b4f565b600060405180830381600087803b15801561055557600080fd5b505af1158015610569573d6000803e3d6000fd5b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260208190526040812054909116156105cf5773ffffffffffffffffffffffffffffffffffffffff808316600090815260208190526040902054166105f1565b7f00000000000000000000000000000000000000000000000000000000000000005b92915050565b610602846000610d5c565b61060c8483611091565b6040517fe1f21c6700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015283811660248301526044820183905285169063e1f21c679060640161053b565b606061067d85858585610fb2565b95945050505050565b610691856002610d5c565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107179190611bc6565b73ffffffffffffffffffffffffffffffffffffffff1614610799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f696e76616c6964206163636f756e74210000000000000000000000000000000060448201526064015b60405180910390fd5b6040517fb1ad373400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063b1ad3734906107f1908790879087908790600401611be3565b600060405180830381600087803b15801561080b57600080fd5b505af115801561039f573d6000803e3d6000fd5b61082a866003610d5c565b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561088c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b09190611bc6565b73ffffffffffffffffffffffffffffffffffffffff161461092d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f696e76616c6964206163636f756e7421000000000000000000000000000000006044820152606401610790565b61093686610573565b73ffffffffffffffffffffffffffffffffffffffff16635cffe9de86868686866040518663ffffffff1660e01b8152600401610976959493929190611aaa565b6020604051808303816000875af1158015610995573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b99190611af5565b50505050505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a489190611bc6565b73ffffffffffffffffffffffffffffffffffffffff1614610ac5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f776e657220636865636b206661696c65642e000000000000000000000000006044820152606401610790565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152602081815260409182902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016948616948517905581519283528201929092527f76f59fb098883bf4a9377fa57ff4eeccbfa0210ff0dd009b0c9c2b52ff682858910160405180910390a15050565b87518951148015610b65575086518851145b610bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f617070726f7665206c656e677468206572726f722e00000000000000000000006044820152606401610790565b610bd68a6000610d5c565b6040517fb065048300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b065048390610c54908d908a908a908a908a908a908a90600401611c6a565b600060405180830381600087803b158015610c6e57600080fd5b505af1158015610c82573d6000803e3d6000fd5b5050505060005b8851811015610cc757610cb58b8a8381518110610ca857610ca86119f1565b6020026020010151611091565b80610cbf81611a20565b915050610c89565b506040517f887d379700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b169063887d379790610d1e908c908c908c90600401611cc6565b600060405180830381600087803b158015610d3857600080fd5b505af1158015610d4c573d6000803e3d6000fd5b5050505050505050505050505050565b6040517ff32cb1e700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152336024830152604482018390527f0000000000000000000000000000000000000000000000000000000000000000169063f32cb1e7906064015b602060405180830381865afa158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1a9190611af5565b610e80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f64656e69656400000000000000000000000000000000000000000000000000006044820152606401610790565b5050565b60208101516040517fa58666d300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015233602483015280831660448301527f0000000000000000000000000000000000000000000000000000000000000000169063a58666d390606401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f479190611af5565b610fad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f64656e69656400000000000000000000000000000000000000000000000000006044820152606401610790565b505050565b6060610ff48585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e8492505050565b6040517f95bb2d8600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616906395bb2d869061104a90879087908790600401611d2f565b6000604051808303816000875af1158015611069573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261067d9190810190611d55565b6040517fb6b3527200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063b6b3527290604401610dd9565b73ffffffffffffffffffffffffffffffffffffffff8116811461112f57600080fd5b50565b803561113d8161110d565b919050565b60008083601f84011261115457600080fd5b50813567ffffffffffffffff81111561116c57600080fd5b60208301915083602082850101111561118457600080fd5b9250929050565b6000806000806000608086880312156111a357600080fd5b85356111ae8161110d565b945060208601356111be8161110d565b935060408601359250606086013567ffffffffffffffff8111156111e157600080fd5b6111ed88828901611142565b969995985093965092949392505050565b801515811461112f57600080fd5b803561113d816111fe565b803560ff8116811461113d57600080fd5b60008060008060008060008060006101008a8c03121561124757600080fd5b89356112528161110d565b985060208a013567ffffffffffffffff81111561126e57600080fd5b61127a8c828d01611142565b90995097505060408a013561128e816111fe565b955060608a0135945060808a013593506112aa60a08b01611217565b925060c08a0135915060e08a013590509295985092959850929598565b60005b838110156112e25781810151838201526020016112ca565b50506000910152565b600081518084526113038160208601602086016112c7565b601f01601f19169290920160200192915050565b60208152600061132a60208301846112eb565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561138957611389611331565b604052919050565b600067ffffffffffffffff8211156113ab576113ab611331565b5060051b60200190565b600082601f8301126113c657600080fd5b813560206113db6113d683611391565b611360565b82815260059290921b840181019181810190868411156113fa57600080fd5b8286015b8481101561141e578035611411816111fe565b83529183019183016113fe565b509695505050505050565b600067ffffffffffffffff82111561144357611443611331565b50601f01601f191660200190565b600082601f83011261146257600080fd5b813560206114726113d683611391565b82815260059290921b8401810191818101908684111561149157600080fd5b8286015b8481101561141e57803567ffffffffffffffff8111156114b55760008081fd5b8701603f810189136114c75760008081fd5b8481013560406114d96113d683611429565b8281528b828486010111156114ee5760008081fd5b8282850189830137600092810188019290925250845250918301918301611495565b6000806000806080858703121561152657600080fd5b84356115318161110d565b9350602085013567ffffffffffffffff8082111561154e57600080fd5b61155a888389016113b5565b9450604087013591508082111561157057600080fd5b61157c88838901611451565b9350606087013591508082111561159257600080fd5b5061159f878288016113b5565b91505092959194509250565b6000602082840312156115bd57600080fd5b813561132a8161110d565b600080600080608085870312156115de57600080fd5b84356115e98161110d565b935060208501356115f98161110d565b925060408501356116098161110d565b9396929550929360600135925050565b6000806000806060858703121561162f57600080fd5b843561163a8161110d565b9350602085013567ffffffffffffffff81111561165657600080fd5b61166287828801611142565b9094509250506040850135611676816111fe565b939692955090935050565b60008060008060006080868803121561169957600080fd5b85356116a48161110d565b945060208601356116b48161110d565b9350604086013567ffffffffffffffff8111156116d057600080fd5b6116dc88828901611142565b96999598509660600135949350505050565b60008060008060008060a0878903121561170757600080fd5b86356117128161110d565b955060208701356117228161110d565b945060408701356117328161110d565b935060608701359250608087013567ffffffffffffffff81111561175557600080fd5b61176189828a01611142565b979a9699509497509295939492505050565b6000806040838503121561178657600080fd5b82356117918161110d565b915060208301356117a18161110d565b809150509250929050565b600082601f8301126117bd57600080fd5b813560206117cd6113d683611391565b82815260059290921b840181019181810190868411156117ec57600080fd5b8286015b8481101561141e5780356118038161110d565b83529183019183016117f0565b600082601f83011261182157600080fd5b813560206118316113d683611391565b82815260059290921b8401810191818101908684111561185057600080fd5b8286015b8481101561141e5780358352918301918301611854565b6000806000806000806000806000806101408b8d03121561188b57600080fd5b6118948b611132565b995060208b013567ffffffffffffffff808211156118b157600080fd5b6118bd8e838f016117ac565b9a5060408d01359150808211156118d357600080fd5b6118df8e838f016117ac565b995060608d01359150808211156118f557600080fd5b6119018e838f01611810565b985060808d013591508082111561191757600080fd5b506119248d828e016117ac565b96505061193360a08c0161120c565b945060c08b0135935061194860e08c01611217565b92506101008b013591506101208b013590509295989b9194979a5092959850565b60008060006060848603121561197e57600080fd5b833567ffffffffffffffff8082111561199657600080fd5b6119a2878388016113b5565b945060208601359150808211156119b857600080fd5b6119c487838801611451565b935060408601359150808211156119da57600080fd5b506119e7868287016113b5565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611a78577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152611aea608083018486611a7f565b979650505050505050565b600060208284031215611b0757600080fd5b815161132a816111fe565b600081518084526020808501945080840160005b83811015611b44578151151587529582019590820190600101611b26565b509495945050505050565b606081526000611b626060830186611b12565b6020838203818501528186518084528284019150828160051b85010183890160005b83811015611bb257601f19878403018552611ba08383516112eb565b94860194925090850190600101611b84565b505086810360408801526104878189611b12565b600060208284031215611bd857600080fd5b815161132a8161110d565b73ffffffffffffffffffffffffffffffffffffffff85168152606060208201526000611c13606083018587611a7f565b905082604083015295945050505050565b600081518084526020808501945080840160005b83811015611b4457815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101611c38565b73ffffffffffffffffffffffffffffffffffffffff8816815260e060208201526000611c9960e0830189611c24565b961515604083015250606081019490945260ff92909216608084015260a083015260c09091015292915050565b606081526000611cd96060830186611c24565b602083820381850152611cec8287611c24565b8481036040860152855180825282870193509082019060005b81811015611d2157845183529383019391830191600101611d05565b509098975050505050505050565b604081526000611d43604083018587611a7f565b90508215156020830152949350505050565b600060208284031215611d6757600080fd5b815167ffffffffffffffff811115611d7e57600080fd5b8201601f81018413611d8f57600080fd5b8051611d9d6113d682611429565b818152856020838501011115611db257600080fd5b61067d8260208301602086016112c756fea264697066735822122018fe81e72b0f0fd95b1c090332c931c6640ced4cf64297291cc5f3c1cf24625564736f6c6343000811003300000000000000000000000025440d9e199974e705a07df6f2464291d0ba1e2f000000000000000000000000b5ff7d0cdd29bfa19ca16cd955e7385be7e52ccf000000000000000000000000f1a5787c21a090d400eb6a78aecdadac07c3533e

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c80639c7a4b8a1161008c578063b9793cb711610066578063b9793cb714610226578063c930f63414610239578063d50f6d5e1461026f578063f811bcdb1461028257600080fd5b80639c7a4b8a146101d9578063a2ce2634146101ec578063afdeedc41461021357600080fd5b806368e1f512116100c857806368e1f512146101795780637b67a87a1461018c5780638d1708241461019f57806393ff268d146101b257600080fd5b806306d025f5146100ef5780630b952b5a146101045780632b7ac3f31461012d575b600080fd5b6101026100fd36600461118b565b610295565b005b610117610112366004611228565b6103aa565b6040516101249190611317565b60405180910390f35b6101547f00000000000000000000000025440d9e199974e705a07df6f2464291d0ba1e2f81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b610102610187366004611510565b610495565b61015461019a3660046115ab565b610573565b6101026101ad3660046115c8565b6105f7565b6101547f000000000000000000000000f1a5787c21a090d400eb6a78aecdadac07c3533e81565b6101176101e7366004611619565b61066f565b6101547f000000000000000000000000b5ff7d0cdd29bfa19ca16cd955e7385be7e52ccf81565b610102610221366004611681565b610686565b6101026102343660046116ee565b61081f565b6101546102473660046115ab565b60006020819052908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b61010261027d366004611773565b6109c2565b61010261029036600461186b565b610b53565b6102a0856001610d5c565b600080806102b084860186611969565b925092509250815183511480156102c8575080518251145b6102d157600080fd5b60005b825181101561031257610300898483815181106102f3576102f36119f1565b6020026020010151610e84565b8061030a81611a20565b9150506102d4565b5061031c88610573565b73ffffffffffffffffffffffffffffffffffffffff16635cffe9de89898989896040518663ffffffff1660e01b815260040161035c959493929190611aaa565b6020604051808303816000875af115801561037b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039f9190611af5565b505050505050505050565b6040517f3dba5ba800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152336024830152604482018790526064820186905260ff8516608483015260a4820184905260c482018390526060917f00000000000000000000000025440d9e199974e705a07df6f2464291d0ba1e2f90911690633dba5ba89060e401600060405180830381600087803b15801561046357600080fd5b505af1158015610477573d6000803e3d6000fd5b505050506104878a8a8a8a610fb2565b9a9950505050505050505050565b815183511480156104a7575080518251145b6104b057600080fd5b60005b83518110156104e4576104d2858483815181106102f3576102f36119f1565b806104dc81611a20565b9150506104b3565b506040517f405f301d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063405f301d9061053b90869086908690600401611b4f565b600060405180830381600087803b15801561055557600080fd5b505af1158015610569573d6000803e3d6000fd5b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260208190526040812054909116156105cf5773ffffffffffffffffffffffffffffffffffffffff808316600090815260208190526040902054166105f1565b7f000000000000000000000000f1a5787c21a090d400eb6a78aecdadac07c3533e5b92915050565b610602846000610d5c565b61060c8483611091565b6040517fe1f21c6700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015283811660248301526044820183905285169063e1f21c679060640161053b565b606061067d85858585610fb2565b95945050505050565b610691856002610d5c565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107179190611bc6565b73ffffffffffffffffffffffffffffffffffffffff1614610799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f696e76616c6964206163636f756e74210000000000000000000000000000000060448201526064015b60405180910390fd5b6040517fb1ad373400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063b1ad3734906107f1908790879087908790600401611be3565b600060405180830381600087803b15801561080b57600080fd5b505af115801561039f573d6000803e3d6000fd5b61082a866003610d5c565b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561088c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b09190611bc6565b73ffffffffffffffffffffffffffffffffffffffff161461092d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f696e76616c6964206163636f756e7421000000000000000000000000000000006044820152606401610790565b61093686610573565b73ffffffffffffffffffffffffffffffffffffffff16635cffe9de86868686866040518663ffffffff1660e01b8152600401610976959493929190611aaa565b6020604051808303816000875af1158015610995573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b99190611af5565b50505050505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a489190611bc6565b73ffffffffffffffffffffffffffffffffffffffff1614610ac5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f776e657220636865636b206661696c65642e000000000000000000000000006044820152606401610790565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152602081815260409182902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016948616948517905581519283528201929092527f76f59fb098883bf4a9377fa57ff4eeccbfa0210ff0dd009b0c9c2b52ff682858910160405180910390a15050565b87518951148015610b65575086518851145b610bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f617070726f7665206c656e677468206572726f722e00000000000000000000006044820152606401610790565b610bd68a6000610d5c565b6040517fb065048300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b5ff7d0cdd29bfa19ca16cd955e7385be7e52ccf169063b065048390610c54908d908a908a908a908a908a908a90600401611c6a565b600060405180830381600087803b158015610c6e57600080fd5b505af1158015610c82573d6000803e3d6000fd5b5050505060005b8851811015610cc757610cb58b8a8381518110610ca857610ca86119f1565b6020026020010151611091565b80610cbf81611a20565b915050610c89565b506040517f887d379700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b169063887d379790610d1e908c908c908c90600401611cc6565b600060405180830381600087803b158015610d3857600080fd5b505af1158015610d4c573d6000803e3d6000fd5b5050505050505050505050505050565b6040517ff32cb1e700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152336024830152604482018390527f00000000000000000000000025440d9e199974e705a07df6f2464291d0ba1e2f169063f32cb1e7906064015b602060405180830381865afa158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1a9190611af5565b610e80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f64656e69656400000000000000000000000000000000000000000000000000006044820152606401610790565b5050565b60208101516040517fa58666d300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015233602483015280831660448301527f00000000000000000000000025440d9e199974e705a07df6f2464291d0ba1e2f169063a58666d390606401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f479190611af5565b610fad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f64656e69656400000000000000000000000000000000000000000000000000006044820152606401610790565b505050565b6060610ff48585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e8492505050565b6040517f95bb2d8600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616906395bb2d869061104a90879087908790600401611d2f565b6000604051808303816000875af1158015611069573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261067d9190810190611d55565b6040517fb6b3527200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301527f000000000000000000000000b5ff7d0cdd29bfa19ca16cd955e7385be7e52ccf169063b6b3527290604401610dd9565b73ffffffffffffffffffffffffffffffffffffffff8116811461112f57600080fd5b50565b803561113d8161110d565b919050565b60008083601f84011261115457600080fd5b50813567ffffffffffffffff81111561116c57600080fd5b60208301915083602082850101111561118457600080fd5b9250929050565b6000806000806000608086880312156111a357600080fd5b85356111ae8161110d565b945060208601356111be8161110d565b935060408601359250606086013567ffffffffffffffff8111156111e157600080fd5b6111ed88828901611142565b969995985093965092949392505050565b801515811461112f57600080fd5b803561113d816111fe565b803560ff8116811461113d57600080fd5b60008060008060008060008060006101008a8c03121561124757600080fd5b89356112528161110d565b985060208a013567ffffffffffffffff81111561126e57600080fd5b61127a8c828d01611142565b90995097505060408a013561128e816111fe565b955060608a0135945060808a013593506112aa60a08b01611217565b925060c08a0135915060e08a013590509295985092959850929598565b60005b838110156112e25781810151838201526020016112ca565b50506000910152565b600081518084526113038160208601602086016112c7565b601f01601f19169290920160200192915050565b60208152600061132a60208301846112eb565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561138957611389611331565b604052919050565b600067ffffffffffffffff8211156113ab576113ab611331565b5060051b60200190565b600082601f8301126113c657600080fd5b813560206113db6113d683611391565b611360565b82815260059290921b840181019181810190868411156113fa57600080fd5b8286015b8481101561141e578035611411816111fe565b83529183019183016113fe565b509695505050505050565b600067ffffffffffffffff82111561144357611443611331565b50601f01601f191660200190565b600082601f83011261146257600080fd5b813560206114726113d683611391565b82815260059290921b8401810191818101908684111561149157600080fd5b8286015b8481101561141e57803567ffffffffffffffff8111156114b55760008081fd5b8701603f810189136114c75760008081fd5b8481013560406114d96113d683611429565b8281528b828486010111156114ee5760008081fd5b8282850189830137600092810188019290925250845250918301918301611495565b6000806000806080858703121561152657600080fd5b84356115318161110d565b9350602085013567ffffffffffffffff8082111561154e57600080fd5b61155a888389016113b5565b9450604087013591508082111561157057600080fd5b61157c88838901611451565b9350606087013591508082111561159257600080fd5b5061159f878288016113b5565b91505092959194509250565b6000602082840312156115bd57600080fd5b813561132a8161110d565b600080600080608085870312156115de57600080fd5b84356115e98161110d565b935060208501356115f98161110d565b925060408501356116098161110d565b9396929550929360600135925050565b6000806000806060858703121561162f57600080fd5b843561163a8161110d565b9350602085013567ffffffffffffffff81111561165657600080fd5b61166287828801611142565b9094509250506040850135611676816111fe565b939692955090935050565b60008060008060006080868803121561169957600080fd5b85356116a48161110d565b945060208601356116b48161110d565b9350604086013567ffffffffffffffff8111156116d057600080fd5b6116dc88828901611142565b96999598509660600135949350505050565b60008060008060008060a0878903121561170757600080fd5b86356117128161110d565b955060208701356117228161110d565b945060408701356117328161110d565b935060608701359250608087013567ffffffffffffffff81111561175557600080fd5b61176189828a01611142565b979a9699509497509295939492505050565b6000806040838503121561178657600080fd5b82356117918161110d565b915060208301356117a18161110d565b809150509250929050565b600082601f8301126117bd57600080fd5b813560206117cd6113d683611391565b82815260059290921b840181019181810190868411156117ec57600080fd5b8286015b8481101561141e5780356118038161110d565b83529183019183016117f0565b600082601f83011261182157600080fd5b813560206118316113d683611391565b82815260059290921b8401810191818101908684111561185057600080fd5b8286015b8481101561141e5780358352918301918301611854565b6000806000806000806000806000806101408b8d03121561188b57600080fd5b6118948b611132565b995060208b013567ffffffffffffffff808211156118b157600080fd5b6118bd8e838f016117ac565b9a5060408d01359150808211156118d357600080fd5b6118df8e838f016117ac565b995060608d01359150808211156118f557600080fd5b6119018e838f01611810565b985060808d013591508082111561191757600080fd5b506119248d828e016117ac565b96505061193360a08c0161120c565b945060c08b0135935061194860e08c01611217565b92506101008b013591506101208b013590509295989b9194979a5092959850565b60008060006060848603121561197e57600080fd5b833567ffffffffffffffff8082111561199657600080fd5b6119a2878388016113b5565b945060208601359150808211156119b857600080fd5b6119c487838801611451565b935060408601359150808211156119da57600080fd5b506119e7868287016113b5565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611a78577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152611aea608083018486611a7f565b979650505050505050565b600060208284031215611b0757600080fd5b815161132a816111fe565b600081518084526020808501945080840160005b83811015611b44578151151587529582019590820190600101611b26565b509495945050505050565b606081526000611b626060830186611b12565b6020838203818501528186518084528284019150828160051b85010183890160005b83811015611bb257601f19878403018552611ba08383516112eb565b94860194925090850190600101611b84565b505086810360408801526104878189611b12565b600060208284031215611bd857600080fd5b815161132a8161110d565b73ffffffffffffffffffffffffffffffffffffffff85168152606060208201526000611c13606083018587611a7f565b905082604083015295945050505050565b600081518084526020808501945080840160005b83811015611b4457815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101611c38565b73ffffffffffffffffffffffffffffffffffffffff8816815260e060208201526000611c9960e0830189611c24565b961515604083015250606081019490945260ff92909216608084015260a083015260c09091015292915050565b606081526000611cd96060830186611c24565b602083820381850152611cec8287611c24565b8481036040860152855180825282870193509082019060005b81811015611d2157845183529383019391830191600101611d05565b509098975050505050505050565b604081526000611d43604083018587611a7f565b90508215156020830152949350505050565b600060208284031215611d6757600080fd5b815167ffffffffffffffff811115611d7e57600080fd5b8201601f81018413611d8f57600080fd5b8051611d9d6113d682611429565b818152856020838501011115611db257600080fd5b61067d8260208301602086016112c756fea264697066735822122018fe81e72b0f0fd95b1c090332c931c6640ced4cf64297291cc5f3c1cf24625564736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000025440d9e199974e705a07df6f2464291d0ba1e2f000000000000000000000000b5ff7d0cdd29bfa19ca16cd955e7385be7e52ccf000000000000000000000000f1a5787c21a090d400eb6a78aecdadac07c3533e

-----Decoded View---------------
Arg [0] : _verifier (address): 0x25440d9E199974e705a07DF6F2464291D0ba1e2f
Arg [1] : _tokenApprovalVerifier (address): 0xB5fF7d0Cdd29BFa19CA16cd955E7385BE7E52CCf
Arg [2] : _loanProvider (address): 0xF1A5787c21A090D400eb6A78AEcdadaC07C3533e

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000025440d9e199974e705a07df6f2464291d0ba1e2f
Arg [1] : 000000000000000000000000b5ff7d0cdd29bfa19ca16cd955e7385be7e52ccf
Arg [2] : 000000000000000000000000f1a5787c21a090d400eb6a78aecdadac07c3533e


Block Transaction 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
[ 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.