ETH Price: $2,950.72 (-0.48%)

Contract

0xaf93a04d5D8D85F69AF65ED66A9717DB0796fB10
Transaction Hash
Block
From
To
Grant Role57118092022-02-09 9:37:581445 days ago1644399478IN
0xaf93a04d...B0796fB10
0 ETH0.000406436701 ETH0.7766994

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
720630652023-03-21 8:41:501040 days ago1679388110
0xaf93a04d...B0796fB10
0 ETH
720630652023-03-21 8:41:501040 days ago1679388110
0xaf93a04d...B0796fB10
0 ETH
720624292023-03-21 8:39:111040 days ago1679387951
0xaf93a04d...B0796fB10
0 ETH
720624292023-03-21 8:39:111040 days ago1679387951
0xaf93a04d...B0796fB10
0 ETH
720620842023-03-21 8:37:441040 days ago1679387864
0xaf93a04d...B0796fB10
0 ETH
720620842023-03-21 8:37:441040 days ago1679387864
0xaf93a04d...B0796fB10
0 ETH
720576242023-03-21 8:19:341040 days ago1679386774
0xaf93a04d...B0796fB10
0 ETH
720576242023-03-21 8:19:341040 days ago1679386774
0xaf93a04d...B0796fB10
0 ETH
720521412023-03-21 7:57:081040 days ago1679385428
0xaf93a04d...B0796fB10
0 ETH
720521412023-03-21 7:57:081040 days ago1679385428
0xaf93a04d...B0796fB10
0 ETH
720474322023-03-21 7:37:461040 days ago1679384266
0xaf93a04d...B0796fB10
0 ETH
720474322023-03-21 7:37:461040 days ago1679384266
0xaf93a04d...B0796fB10
0 ETH
720388462023-03-21 7:02:291040 days ago1679382149
0xaf93a04d...B0796fB10
0 ETH
720388462023-03-21 7:02:291040 days ago1679382149
0xaf93a04d...B0796fB10
0 ETH
720368652023-03-21 6:54:171040 days ago1679381657
0xaf93a04d...B0796fB10
0 ETH
720368652023-03-21 6:54:171040 days ago1679381657
0xaf93a04d...B0796fB10
0 ETH
720254322023-03-21 6:07:241040 days ago1679378844
0xaf93a04d...B0796fB10
0 ETH
720254322023-03-21 6:07:241040 days ago1679378844
0xaf93a04d...B0796fB10
0 ETH
720165552023-03-21 5:30:471040 days ago1679376647
0xaf93a04d...B0796fB10
0 ETH
720165552023-03-21 5:30:471040 days ago1679376647
0xaf93a04d...B0796fB10
0 ETH
719960742023-03-21 4:05:581040 days ago1679371558
0xaf93a04d...B0796fB10
0 ETH
719960742023-03-21 4:05:581040 days ago1679371558
0xaf93a04d...B0796fB10
0 ETH
719900382023-03-21 3:40:541040 days ago1679370054
0xaf93a04d...B0796fB10
0 ETH
719900382023-03-21 3:40:541040 days ago1679370054
0xaf93a04d...B0796fB10
0 ETH
719825342023-03-21 3:09:471040 days ago1679368187
0xaf93a04d...B0796fB10
0 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Join

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.6;

import "erc3156/contracts/interfaces/IERC3156FlashBorrower.sol";
import "erc3156/contracts/interfaces/IERC3156FlashLender.sol";
import "@yield-protocol/vault-interfaces/IJoin.sol";
import "@yield-protocol/vault-interfaces/IJoinFactory.sol";
import "@yield-protocol/utils-v2/contracts/token/IERC20.sol";
import "@yield-protocol/utils-v2/contracts/access/AccessControl.sol";
import "@yield-protocol/utils-v2/contracts/token/TransferHelper.sol";
import "@yield-protocol/utils-v2/contracts/math/WMul.sol";
import "@yield-protocol/utils-v2/contracts/cast/CastU256U128.sol";


contract Join is IJoin, IERC3156FlashLender, AccessControl() {
    using TransferHelper for IERC20;
    using WMul for uint256;
    using CastU256U128 for uint256;

    event FlashFeeFactorSet(uint256 indexed fee);

    bytes32 constant internal FLASH_LOAN_RETURN = keccak256("ERC3156FlashBorrower.onFlashLoan");
    uint256 constant FLASH_LOANS_DISABLED = type(uint256).max;

    address public immutable override asset;
    uint256 public storedBalance;
    uint256 public flashFeeFactor = FLASH_LOANS_DISABLED; // Fee on flash loans, as a percentage in fixed point with 18 decimals. Flash loans disabled by default.

    constructor(address asset_) {
        asset = asset_;
    }

    /// @dev Set the flash loan fee factor
    function setFlashFeeFactor(uint256 flashFeeFactor_)
        external
        auth
    {
        flashFeeFactor = flashFeeFactor_;
        emit FlashFeeFactorSet(flashFeeFactor_);
    }

    /// @dev Take `amount` `asset` from `user` using `transferFrom`, minus any unaccounted `asset` in this contract.
    function join(address user, uint128 amount)
        external override
        auth
        returns (uint128)
    {
        return _join(user, amount);
    }

    /// @dev Take `amount` `asset` from `user` using `transferFrom`, minus any unaccounted `asset` in this contract.
    function _join(address user, uint128 amount)
        internal
        returns (uint128)
    {
        IERC20 token = IERC20(asset);
        uint256 _storedBalance = storedBalance;
        uint256 available = token.balanceOf(address(this)) - _storedBalance; // Fine to panic if this underflows
        storedBalance = _storedBalance + amount;
        unchecked { if (available < amount) token.safeTransferFrom(user, address(this), amount - available); }
        return amount;        
    }

    /// @dev Transfer `amount` `asset` to `user`
    function exit(address user, uint128 amount)
        external override
        auth
        returns (uint128)
    {
        return _exit(user, amount);
    }

    /// @dev Transfer `amount` `asset` to `user`
    function _exit(address user, uint128 amount)
        internal
        returns (uint128)
    {
        IERC20 token = IERC20(asset);
        storedBalance -= amount;
        token.safeTransfer(user, amount);
        return amount;
    }

    /// @dev Retrieve any tokens other than the `asset`. Useful for airdropped tokens.
    function retrieve(IERC20 token, address to)
        external
        auth
    {
        require(address(token) != address(asset), "Use exit for asset");
        token.safeTransfer(to, token.balanceOf(address(this)));
    }

    /**
     * @dev From ERC-3156. The amount of currency available to be lended.
     * @param token The loan currency. It must be a FYDai contract.
     * @return The amount of `token` that can be borrowed.
     */
    function maxFlashLoan(address token)
        external view override
        returns (uint256)
    {
        return token == asset ? storedBalance : 0;
    }

    /**
     * @dev From ERC-3156. The fee to be charged for a given loan.
     * @param token The loan currency. It must be the asset.
     * @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 override
        returns (uint256)
    {
        require(token == asset, "Unsupported currency");
        return _flashFee(amount);
    }

    /**
     * @dev The fee to be charged for a given loan.
     * @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(uint256 amount) internal view returns (uint256) {
        return amount.wmul(flashFeeFactor);
    }

    /**
     * @dev From ERC-3156. Loan `amount` `asset` to `receiver`, which needs to return them plus fee to this contract within the same transaction.
     * If the principal + fee are transferred to this contract, they won't be pulled from the receiver.
     * @param receiver The contract receiving the tokens, needs to implement the `onFlashLoan(address user, uint256 amount, uint256 fee, bytes calldata)` interface.
     * @param token The loan currency. Must be a fyDai contract.
     * @param amount The amount of tokens lent.
     * @param data A data parameter to be passed on to the `receiver` for any custom use.
     */
    function flashLoan(IERC3156FlashBorrower receiver, address token, uint256 amount, bytes memory data)
        external override
        returns(bool)
    {
        require(token == asset, "Unsupported currency");
        uint128 _amount = amount.u128();
        uint128 _fee = _flashFee(amount).u128();
        _exit(address(receiver), _amount);

        require(receiver.onFlashLoan(msg.sender, token, _amount, _fee, data) == FLASH_LOAN_RETURN, "Non-compliant borrower");

        _join(address(receiver), _amount + _fee);
        return true;
    }
}

File 2 of 11 : IERC3156FlashBorrower.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;


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);
}

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;
import "./IERC3156FlashBorrower.sol";


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);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@yield-protocol/utils-v2/contracts/token/IERC20.sol";


interface IJoin {
    /// @dev asset managed by this contract
    function asset() external view returns (address);

    /// @dev Add tokens to this contract.
    function join(address user, uint128 wad) external returns (uint128);

    /// @dev Remove tokens to this contract.
    function exit(address user, uint128 wad) external returns (uint128);
}

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


interface IJoinFactory {
  event JoinCreated(address indexed asset, address pool);

  function createJoin(address asset) external returns (address);
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms.
 *
 * Roles are referred to by their `bytes4` identifier. These are expected to be the 
 * signatures for all the functions in the contract. Special roles should be exposed
 * in the external API and be unique:
 *
 * ```
 * bytes4 public constant ROOT = 0x00000000;
 * ```
 *
 * Roles represent restricted access to a function call. For that purpose, use {auth}:
 *
 * ```
 * function foo() public auth {
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `ROOT`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {setRoleAdmin}.
 *
 * WARNING: The `ROOT` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
contract AccessControl {
    struct RoleData {
        mapping (address => bool) members;
        bytes4 adminRole;
    }

    mapping (bytes4 => RoleData) private _roles;

    bytes4 public constant ROOT = 0x00000000;
    bytes4 public constant ROOT4146650865 = 0x00000000; // Collision protection for ROOT, test with ROOT12007226833()
    bytes4 public constant LOCK = 0xFFFFFFFF;           // Used to disable further permissioning of a function
    bytes4 public constant LOCK8605463013 = 0xFFFFFFFF; // Collision protection for LOCK, test with LOCK10462387368()

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role
     *
     * `ROOT` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes4 indexed role, bytes4 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call.
     */
    event RoleGranted(bytes4 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes4 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Give msg.sender the ROOT role and create a LOCK role with itself as the admin role and no members. 
     * Calling setRoleAdmin(msg.sig, LOCK) means no one can grant that msg.sig role anymore.
     */
    constructor () {
        _grantRole(ROOT, msg.sender);   // Grant ROOT to msg.sender
        _setRoleAdmin(LOCK, LOCK);      // Create the LOCK role by setting itself as its own admin, creating an independent role tree
    }

    /**
     * @dev Each function in the contract has its own role, identified by their msg.sig signature.
     * ROOT can give and remove access to each function, lock any further access being granted to
     * a specific action, or even create other roles to delegate admin control over a function.
     */
    modifier auth() {
        require (_hasRole(msg.sig, msg.sender), "Access denied");
        _;
    }

    /**
     * @dev Allow only if the caller has been granted the admin role of `role`.
     */
    modifier admin(bytes4 role) {
        require (_hasRole(_getRoleAdmin(role), msg.sender), "Only admin");
        _;
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes4 role, address account) external view returns (bool) {
        return _hasRole(role, account);
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes4 role) external view returns (bytes4) {
        return _getRoleAdmin(role);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.

     * If ``role``'s admin role is not `adminRole` emits a {RoleAdminChanged} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function setRoleAdmin(bytes4 role, bytes4 adminRole) external virtual admin(role) {
        _setRoleAdmin(role, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes4 role, address account) external virtual admin(role) {
        _grantRole(role, account);
    }

    
    /**
     * @dev Grants all of `role` in `roles` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - For each `role` in `roles`, the caller must have ``role``'s admin role.
     */
    function grantRoles(bytes4[] memory roles, address account) external virtual {
        for (uint256 i = 0; i < roles.length; i++) {
            require (_hasRole(_getRoleAdmin(roles[i]), msg.sender), "Only admin");
            _grantRole(roles[i], account);
        }
    }

    /**
     * @dev Sets LOCK as ``role``'s admin role. LOCK has no members, so this disables admin management of ``role``.

     * Emits a {RoleAdminChanged} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function lockRole(bytes4 role) external virtual admin(role) {
        _setRoleAdmin(role, LOCK);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes4 role, address account) external virtual admin(role) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes all of `role` in `roles` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - For each `role` in `roles`, the caller must have ``role``'s admin role.
     */
    function revokeRoles(bytes4[] memory roles, address account) external virtual {
        for (uint256 i = 0; i < roles.length; i++) {
            require (_hasRole(_getRoleAdmin(roles[i]), msg.sender), "Only admin");
            _revokeRole(roles[i], account);
        }
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes4 role, address account) external virtual {
        require(account == msg.sender, "Renounce only for self");

        _revokeRole(role, account);
    }

    function _hasRole(bytes4 role, address account) internal view returns (bool) {
        return _roles[role].members[account];
    }

    function _getRoleAdmin(bytes4 role) internal view returns (bytes4) {
        return _roles[role].adminRole;
    }

    function _setRoleAdmin(bytes4 role, bytes4 adminRole) internal virtual {
        if (_getRoleAdmin(role) != adminRole) {
            _roles[role].adminRole = adminRole;
            emit RoleAdminChanged(role, adminRole);
        }
    }

    function _grantRole(bytes4 role, address account) internal {
        if (!_hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, msg.sender);
        }
    }

    function _revokeRole(bytes4 role, address account) internal {
        if (_hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, msg.sender);
        }
    }
}

// SPDX-License-Identifier: MIT
// Taken from https://github.com/Uniswap/uniswap-lib/blob/master/contracts/libraries/TransferHelper.sol

pragma solidity >=0.6.0;

import "./IERC20.sol";
import "../utils/RevertMsgExtractor.sol";


// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    /// @notice Transfers tokens from msg.sender to a recipient
    /// @dev Errors with the underlying revert message if transfer fails
    /// @param token The contract address of the token which will be transferred
    /// @param to The recipient of the transfer
    /// @param value The value of the transfer
    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
        if (!(success && (data.length == 0 || abi.decode(data, (bool))))) revert(RevertMsgExtractor.getRevertMsg(data));
    }

    /// @notice Transfers tokens from the targeted address to the given destination
    /// @dev Errors with the underlying revert message if transfer fails
    /// @param token The contract address of the token to be transferred
    /// @param from The originating address from which the tokens will be transferred
    /// @param to The destination address of the transfer
    /// @param value The amount to be transferred
    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
        if (!(success && (data.length == 0 || abi.decode(data, (bool))))) revert(RevertMsgExtractor.getRevertMsg(data));
    }

    /// @notice Transfers ETH to the recipient address
    /// @dev Errors with the underlying revert message if transfer fails
    /// @param to The destination of the transfer
    /// @param value The value to be transferred
    function safeTransferETH(address payable to, uint256 value) internal {
        (bool success, bytes memory data) = to.call{value: value}(new bytes(0));
        if (!success) revert(RevertMsgExtractor.getRevertMsg(data));
    }
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;


library WMul {
    // Taken from https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol
    /// @dev Multiply an amount by a fixed point factor with 18 decimals, rounds down.
    function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x * y;
        unchecked { z /= 1e18; }
    }
}

File 10 of 11 : CastU256U128.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;


library CastU256U128 {
    /// @dev Safely cast an uint256 to an uint128
    function u128(uint256 x) internal pure returns (uint128 y) {
        require (x <= type(uint128).max, "Cast overflow");
        y = uint128(x);
    }
}

// SPDX-License-Identifier: MIT
// Taken from https://github.com/sushiswap/BoringSolidity/blob/441e51c0544cf2451e6116fe00515e71d7c42e2c/contracts/BoringBatchable.sol

pragma solidity >=0.6.0;


library RevertMsgExtractor {
    /// @dev Helper function to extract a useful revert message from a failed call.
    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.
    function getRevertMsg(bytes memory returnData)
        internal pure
        returns (string memory)
    {
        // If the _res length is less than 68, then the transaction failed silently (without a revert message)
        if (returnData.length < 68) return "Transaction reverted silently";

        assembly {
            // Slice the sighash.
            returnData := add(returnData, 0x04)
        }
        return abi.decode(returnData, (string)); // All that remains is the revert string
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"asset_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"FlashFeeFactorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes4","name":"role","type":"bytes4"},{"indexed":true,"internalType":"bytes4","name":"newAdminRole","type":"bytes4"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes4","name":"role","type":"bytes4"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes4","name":"role","type":"bytes4"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"LOCK","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCK8605463013","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOT","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOT4146650865","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"exit","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"flashFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flashFeeFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC3156FlashBorrower","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flashLoan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"role","type":"bytes4"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"role","type":"bytes4"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4[]","name":"roles","type":"bytes4[]"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRoles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"role","type":"bytes4"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"join","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"role","type":"bytes4"}],"name":"lockRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"maxFlashLoan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"role","type":"bytes4"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"retrieve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"role","type":"bytes4"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4[]","name":"roles","type":"bytes4[]"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRoles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"flashFeeFactor_","type":"uint256"}],"name":"setFlashFeeFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"role","type":"bytes4"},{"internalType":"bytes4","name":"adminRole","type":"bytes4"}],"name":"setRoleAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"storedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60a06040526000196002553480156200001757600080fd5b5060405162001b6f38038062001b6f8339810160408190526200003a91620001a7565b6200004760003362000071565b6200005b6001600160e01b03198062000109565b60601b6001600160601b031916608052620001d9565b6001600160e01b031982166000908152602081815260408083206001600160a01b038516845290915290205460ff1662000105576001600160e01b031982166000818152602081815260408083206001600160a01b0386168085529252808320805460ff1916600117905551339391927fe6231789d19137da31d0550f4ba9ee379020a8cfb64cb79bf1790c996d2e616591a45b5050565b6001600160e01b031981166200013b836001600160e01b03191660009081526020819052604090206001015460e01b90565b6001600160e01b0319161462000105576001600160e01b0319828116600081815260208190526040808220600101805463ffffffff191660e087901c17905551928416927fd348e2220a50b4500ec353f6e802d2f14dd1b5d6786148fd1bbcc570bf92d4739190a35050565b600060208284031215620001ba57600080fd5b81516001600160a01b0381168114620001d257600080fd5b9392505050565b60805160601c61194d620002226000396000818161021b015281816105f6015281816107d501528181610a1601528181610c0101528181610d140152610f3a015261194d6000f3fe608060405234801561001057600080fd5b50600436106101885760003560e01c8063687f0e4c116100e3578063d9d98ce41161008c578063effae35311610066578063effae35314610355578063f06c2dfc14610368578063ffffffff146102d557600080fd5b8063d9d98ce414610326578063de02cde714610339578063e9eca9941461034c57600080fd5b8063ae93c1b5116100bd578063ae93c1b5146102f7578063bac7340c1461030a578063ceae3abd1461031357600080fd5b8063687f0e4c146102c2578063a4f0d7d0146102d5578063ad82110f146102e457600080fd5b806344faded0116101455780635ba5e9f01161011f5780635ba5e9f01461027b5780635cffe9de1461028e578063613255ab146102a157600080fd5b806344faded014610255578063559742d9146102685780635909c12f1461018d57600080fd5b806312e5ff771161017657806312e5ff77146101d6578063159c03dd1461020157806338d52e0f1461021657600080fd5b801561018d57806310ab9432146101b3575b600080fd5b610195600081565b6040516001600160e01b031990911681526020015b60405180910390f35b6101c66101c136600461153b565b61037b565b60405190151581526020016101aa565b6101e96101e43660046113ae565b6103b2565b6040516001600160801b0390911681526020016101aa565b61021461020f3660046116de565b610423565b005b61023d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101aa565b61021461026336600461153b565b6104b8565b610214610276366004611520565b610552565b610195610289366004611520565b6105cb565b6101c661029c3660046115b8565b6105f2565b6102b46102af366004611391565b6107d1565b6040519081526020016101aa565b6102146102d036600461153b565b61081b565b6101956001600160e01b031981565b6102146102f236600461141f565b61087d565b610214610305366004611567565b610939565b6102b460025481565b6101e96103213660046113ae565b6109a6565b6102b46103343660046113f3565b610a12565b61021461034736600461153b565b610a9e565b6102b460015481565b61021461036336600461141f565b610b0b565b61021461037636600461159a565b610b9d565b6001600160e01b031982166000908152602081815260408083206001600160a01b038516845290915281205460ff165b9392505050565b600080356001600160e01b03191681526020818152604080832033845290915281205460ff166104195760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc819195b9a5959609a1b60448201526064015b60405180910390fd5b6103ab8383610d0f565b600080356001600160e01b03191681526020818152604080832033845290915290205460ff166104855760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc819195b9a5959609a1b6044820152606401610410565b600281905560405181907ff68737d5e8496ca5e19cbdd129d7c94946f794b55f680f7df5a9893eb689044990600090a250565b8161050a6104e2826001600160e01b03191660009081526020819052604090206001015460e01b90565b6001600160e01b03191660009081526020818152604080832033845290915290205460ff1690565b6105435760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610410565b61054d8383610d7b565b505050565b8061057c6104e2826001600160e01b03191660009081526020819052604090206001015460e01b90565b6105b55760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610410565b6105c7826001600160e01b0319610e0f565b5050565b6001600160e01b0319811660009081526020819052604081206001015460e01b5b92915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316146106755760405162461bcd60e51b815260206004820152601460248201527f556e737570706f727465642063757272656e63790000000000000000000000006044820152606401610410565b600061068084610eab565b9050600061069561069086610f08565b610eab565b90506106a18783610d0f565b506040517f23e30c8b0000000000000000000000000000000000000000000000000000000081527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9906001600160a01b038916906323e30c8b906107119033908b90889088908c9060040161173f565b602060405180830381600087803b15801561072b57600080fd5b505af115801561073f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107639190611507565b146107b05760405162461bcd60e51b815260206004820152601660248201527f4e6f6e2d636f6d706c69616e7420626f72726f776572000000000000000000006044820152606401610410565b6107c3876107be83856117f9565b610f1f565b506001979650505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316146108135760006105ec565b505060015490565b6001600160a01b03811633146108735760405162461bcd60e51b815260206004820152601660248201527f52656e6f756e6365206f6e6c7920666f722073656c66000000000000000000006044820152606401610410565b6105c78282610d7b565b60005b825181101561054d576108cb6104e28483815181106108a1576108a16118d3565b60200260200101516001600160e01b03191660009081526020819052604090206001015460e01b90565b6109045760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610410565b610927838281518110610919576109196118d3565b602002602001015183610d7b565b80610931816118a2565b915050610880565b816109636104e2826001600160e01b03191660009081526020819052604090206001015460e01b90565b61099c5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610410565b61054d8383610e0f565b600080356001600160e01b03191681526020818152604080832033845290915281205460ff16610a085760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc819195b9a5959609a1b6044820152606401610410565b6103ab8383610f1f565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614610a955760405162461bcd60e51b815260206004820152601460248201527f556e737570706f727465642063757272656e63790000000000000000000000006044820152606401610410565b6103ab82610f08565b81610ac86104e2826001600160e01b03191660009081526020819052604090206001015460e01b90565b610b015760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610410565b61054d8383611020565b60005b825181101561054d57610b2f6104e28483815181106108a1576108a16118d3565b610b685760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610410565b610b8b838281518110610b7d57610b7d6118d3565b602002602001015183611020565b80610b95816118a2565b915050610b0e565b600080356001600160e01b03191681526020818152604080832033845290915290205460ff16610bff5760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc819195b9a5959609a1b6044820152606401610410565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415610c815760405162461bcd60e51b815260206004820152601260248201527f557365206578697420666f7220617373657400000000000000000000000000006044820152606401610410565b6040516370a0823160e01b81523060048201526105c79082906001600160a01b038516906370a082319060240160206040518083038186803b158015610cc657600080fd5b505afa158015610cda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfe9190611507565b6001600160a01b03851691906110b6565b6000807f00000000000000000000000000000000000000000000000000000000000000009050826001600160801b031660016000828254610d50919061185b565b90915550610d7390506001600160a01b038216856001600160801b0386166110b6565b509092915050565b6001600160e01b031982166000908152602081815260408083206001600160a01b038516845290915290205460ff16156105c7576001600160e01b031982166000818152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339391927f4ddc7b757e7bdd7254a9cd39452d307a52761bc824625c6a33104a075d8099e691a45050565b6001600160e01b03198116610e40836001600160e01b03191660009081526020819052604090206001015460e01b90565b6001600160e01b031916146105c7576001600160e01b0319828116600081815260208190526040808220600101805463ffffffff191660e087901c17905551928416927fd348e2220a50b4500ec353f6e802d2f14dd1b5d6786148fd1bbcc570bf92d4739190a35050565b60006001600160801b03821115610f045760405162461bcd60e51b815260206004820152600d60248201527f43617374206f766572666c6f77000000000000000000000000000000000000006044820152606401610410565b5090565b60006105ec600254836111d990919063ffffffff16565b6001546040516370a0823160e01b81523060048201526000917f000000000000000000000000000000000000000000000000000000000000000091839082906001600160a01b038516906370a082319060240160206040518083038186803b158015610f8a57600080fd5b505afa158015610f9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc29190611507565b610fcc919061185b565b9050610fe16001600160801b03861683611824565b6001556001600160801b038516811015611016576110166001600160a01b03841687306001600160801b0389168590036111f7565b5092949350505050565b6001600160e01b031982166000908152602081815260408083206001600160a01b038516845290915290205460ff166105c7576001600160e01b031982166000818152602081815260408083206001600160a01b0386168085529252808320805460ff1916600117905551339391927fe6231789d19137da31d0550f4ba9ee379020a8cfb64cb79bf1790c996d2e616591a45050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916111409190611723565b6000604051808303816000865af19150503d806000811461117d576040519150601f19603f3d011682016040523d82523d6000602084013e611182565b606091505b50915091508180156111ac5750805115806111ac5750808060200190518101906111ac91906114e5565b6111d2576111b98161130a565b60405162461bcd60e51b8152600401610410919061178d565b5050505050565b60006111e5828461183c565b670de0b6b3a764000090049392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916112899190611723565b6000604051808303816000865af19150503d80600081146112c6576040519150601f19603f3d011682016040523d82523d6000602084013e6112cb565b606091505b50915091508180156112f55750805115806112f55750808060200190518101906112f591906114e5565b611302576111b98161130a565b505050505050565b606060448251101561134f57505060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015290565b600482019150818060200190518101906105ec9190611667565b8035611374816118ff565b919050565b80356001600160e01b03198116811461137457600080fd5b6000602082840312156113a357600080fd5b81356103ab816118ff565b600080604083850312156113c157600080fd5b82356113cc816118ff565b915060208301356001600160801b03811681146113e857600080fd5b809150509250929050565b6000806040838503121561140657600080fd5b8235611411816118ff565b946020939093013593505050565b6000806040838503121561143257600080fd5b823567ffffffffffffffff8082111561144a57600080fd5b818501915085601f83011261145e57600080fd5b8135602082821115611472576114726118e9565b8160051b92506114838184016117a0565b8281528181019085830185870184018b101561149e57600080fd5b600096505b848710156114c8576114b481611379565b8352600196909601959183019183016114a3565b5096506114d89050878201611369565b9450505050509250929050565b6000602082840312156114f757600080fd5b815180151581146103ab57600080fd5b60006020828403121561151957600080fd5b5051919050565b60006020828403121561153257600080fd5b6103ab82611379565b6000806040838503121561154e57600080fd5b61155783611379565b915060208301356113e8816118ff565b6000806040838503121561157a57600080fd5b61158383611379565b915061159160208401611379565b90509250929050565b600080604083850312156115ad57600080fd5b8235611557816118ff565b600080600080608085870312156115ce57600080fd5b84356115d9816118ff565b935060208501356115e9816118ff565b925060408501359150606085013567ffffffffffffffff81111561160c57600080fd5b8501601f8101871361161d57600080fd5b803561163061162b826117d1565b6117a0565b81815288602083850101111561164557600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60006020828403121561167957600080fd5b815167ffffffffffffffff81111561169057600080fd5b8201601f810184136116a157600080fd5b80516116af61162b826117d1565b8181528560208385010111156116c457600080fd5b6116d5826020830160208601611872565b95945050505050565b6000602082840312156116f057600080fd5b5035919050565b6000815180845261170f816020860160208601611872565b601f01601f19169290920160200192915050565b60008251611735818460208701611872565b9190910192915050565b6001600160a01b038681168252851660208201526001600160801b0384811660408301528316606082015260a060808201819052600090611782908301846116f7565b979650505050505050565b6020815260006103ab60208301846116f7565b604051601f8201601f1916810167ffffffffffffffff811182821017156117c9576117c96118e9565b604052919050565b600067ffffffffffffffff8211156117eb576117eb6118e9565b50601f01601f191660200190565b60006001600160801b0380831681851680830382111561181b5761181b6118bd565b01949350505050565b60008219821115611837576118376118bd565b500190565b6000816000190483118215151615611856576118566118bd565b500290565b60008282101561186d5761186d6118bd565b500390565b60005b8381101561188d578181015183820152602001611875565b8381111561189c576000848401525b50505050565b60006000198214156118b6576118b66118bd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461191457600080fd5b5056fea26469706673582212204790fcd9b0263691c5fa33b095f02cdd8d835a68f08089e0184aa7b7e7bf8f0e64736f6c6343000806003300000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101885760003560e01c8063687f0e4c116100e3578063d9d98ce41161008c578063effae35311610066578063effae35314610355578063f06c2dfc14610368578063ffffffff146102d557600080fd5b8063d9d98ce414610326578063de02cde714610339578063e9eca9941461034c57600080fd5b8063ae93c1b5116100bd578063ae93c1b5146102f7578063bac7340c1461030a578063ceae3abd1461031357600080fd5b8063687f0e4c146102c2578063a4f0d7d0146102d5578063ad82110f146102e457600080fd5b806344faded0116101455780635ba5e9f01161011f5780635ba5e9f01461027b5780635cffe9de1461028e578063613255ab146102a157600080fd5b806344faded014610255578063559742d9146102685780635909c12f1461018d57600080fd5b806312e5ff771161017657806312e5ff77146101d6578063159c03dd1461020157806338d52e0f1461021657600080fd5b801561018d57806310ab9432146101b3575b600080fd5b610195600081565b6040516001600160e01b031990911681526020015b60405180910390f35b6101c66101c136600461153b565b61037b565b60405190151581526020016101aa565b6101e96101e43660046113ae565b6103b2565b6040516001600160801b0390911681526020016101aa565b61021461020f3660046116de565b610423565b005b61023d7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab181565b6040516001600160a01b0390911681526020016101aa565b61021461026336600461153b565b6104b8565b610214610276366004611520565b610552565b610195610289366004611520565b6105cb565b6101c661029c3660046115b8565b6105f2565b6102b46102af366004611391565b6107d1565b6040519081526020016101aa565b6102146102d036600461153b565b61081b565b6101956001600160e01b031981565b6102146102f236600461141f565b61087d565b610214610305366004611567565b610939565b6102b460025481565b6101e96103213660046113ae565b6109a6565b6102b46103343660046113f3565b610a12565b61021461034736600461153b565b610a9e565b6102b460015481565b61021461036336600461141f565b610b0b565b61021461037636600461159a565b610b9d565b6001600160e01b031982166000908152602081815260408083206001600160a01b038516845290915281205460ff165b9392505050565b600080356001600160e01b03191681526020818152604080832033845290915281205460ff166104195760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc819195b9a5959609a1b60448201526064015b60405180910390fd5b6103ab8383610d0f565b600080356001600160e01b03191681526020818152604080832033845290915290205460ff166104855760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc819195b9a5959609a1b6044820152606401610410565b600281905560405181907ff68737d5e8496ca5e19cbdd129d7c94946f794b55f680f7df5a9893eb689044990600090a250565b8161050a6104e2826001600160e01b03191660009081526020819052604090206001015460e01b90565b6001600160e01b03191660009081526020818152604080832033845290915290205460ff1690565b6105435760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610410565b61054d8383610d7b565b505050565b8061057c6104e2826001600160e01b03191660009081526020819052604090206001015460e01b90565b6105b55760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610410565b6105c7826001600160e01b0319610e0f565b5050565b6001600160e01b0319811660009081526020819052604081206001015460e01b5b92915050565b60007f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b0316846001600160a01b0316146106755760405162461bcd60e51b815260206004820152601460248201527f556e737570706f727465642063757272656e63790000000000000000000000006044820152606401610410565b600061068084610eab565b9050600061069561069086610f08565b610eab565b90506106a18783610d0f565b506040517f23e30c8b0000000000000000000000000000000000000000000000000000000081527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9906001600160a01b038916906323e30c8b906107119033908b90889088908c9060040161173f565b602060405180830381600087803b15801561072b57600080fd5b505af115801561073f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107639190611507565b146107b05760405162461bcd60e51b815260206004820152601660248201527f4e6f6e2d636f6d706c69616e7420626f72726f776572000000000000000000006044820152606401610410565b6107c3876107be83856117f9565b610f1f565b506001979650505050505050565b60007f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b0316826001600160a01b0316146108135760006105ec565b505060015490565b6001600160a01b03811633146108735760405162461bcd60e51b815260206004820152601660248201527f52656e6f756e6365206f6e6c7920666f722073656c66000000000000000000006044820152606401610410565b6105c78282610d7b565b60005b825181101561054d576108cb6104e28483815181106108a1576108a16118d3565b60200260200101516001600160e01b03191660009081526020819052604090206001015460e01b90565b6109045760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610410565b610927838281518110610919576109196118d3565b602002602001015183610d7b565b80610931816118a2565b915050610880565b816109636104e2826001600160e01b03191660009081526020819052604090206001015460e01b90565b61099c5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610410565b61054d8383610e0f565b600080356001600160e01b03191681526020818152604080832033845290915281205460ff16610a085760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc819195b9a5959609a1b6044820152606401610410565b6103ab8383610f1f565b60007f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b0316836001600160a01b031614610a955760405162461bcd60e51b815260206004820152601460248201527f556e737570706f727465642063757272656e63790000000000000000000000006044820152606401610410565b6103ab82610f08565b81610ac86104e2826001600160e01b03191660009081526020819052604090206001015460e01b90565b610b015760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610410565b61054d8383611020565b60005b825181101561054d57610b2f6104e28483815181106108a1576108a16118d3565b610b685760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610410565b610b8b838281518110610b7d57610b7d6118d3565b602002602001015183611020565b80610b95816118a2565b915050610b0e565b600080356001600160e01b03191681526020818152604080832033845290915290205460ff16610bff5760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc819195b9a5959609a1b6044820152606401610410565b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b0316826001600160a01b03161415610c815760405162461bcd60e51b815260206004820152601260248201527f557365206578697420666f7220617373657400000000000000000000000000006044820152606401610410565b6040516370a0823160e01b81523060048201526105c79082906001600160a01b038516906370a082319060240160206040518083038186803b158015610cc657600080fd5b505afa158015610cda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfe9190611507565b6001600160a01b03851691906110b6565b6000807f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab19050826001600160801b031660016000828254610d50919061185b565b90915550610d7390506001600160a01b038216856001600160801b0386166110b6565b509092915050565b6001600160e01b031982166000908152602081815260408083206001600160a01b038516845290915290205460ff16156105c7576001600160e01b031982166000818152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339391927f4ddc7b757e7bdd7254a9cd39452d307a52761bc824625c6a33104a075d8099e691a45050565b6001600160e01b03198116610e40836001600160e01b03191660009081526020819052604090206001015460e01b90565b6001600160e01b031916146105c7576001600160e01b0319828116600081815260208190526040808220600101805463ffffffff191660e087901c17905551928416927fd348e2220a50b4500ec353f6e802d2f14dd1b5d6786148fd1bbcc570bf92d4739190a35050565b60006001600160801b03821115610f045760405162461bcd60e51b815260206004820152600d60248201527f43617374206f766572666c6f77000000000000000000000000000000000000006044820152606401610410565b5090565b60006105ec600254836111d990919063ffffffff16565b6001546040516370a0823160e01b81523060048201526000917f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab191839082906001600160a01b038516906370a082319060240160206040518083038186803b158015610f8a57600080fd5b505afa158015610f9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc29190611507565b610fcc919061185b565b9050610fe16001600160801b03861683611824565b6001556001600160801b038516811015611016576110166001600160a01b03841687306001600160801b0389168590036111f7565b5092949350505050565b6001600160e01b031982166000908152602081815260408083206001600160a01b038516845290915290205460ff166105c7576001600160e01b031982166000818152602081815260408083206001600160a01b0386168085529252808320805460ff1916600117905551339391927fe6231789d19137da31d0550f4ba9ee379020a8cfb64cb79bf1790c996d2e616591a45050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916111409190611723565b6000604051808303816000865af19150503d806000811461117d576040519150601f19603f3d011682016040523d82523d6000602084013e611182565b606091505b50915091508180156111ac5750805115806111ac5750808060200190518101906111ac91906114e5565b6111d2576111b98161130a565b60405162461bcd60e51b8152600401610410919061178d565b5050505050565b60006111e5828461183c565b670de0b6b3a764000090049392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916112899190611723565b6000604051808303816000865af19150503d80600081146112c6576040519150601f19603f3d011682016040523d82523d6000602084013e6112cb565b606091505b50915091508180156112f55750805115806112f55750808060200190518101906112f591906114e5565b611302576111b98161130a565b505050505050565b606060448251101561134f57505060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015290565b600482019150818060200190518101906105ec9190611667565b8035611374816118ff565b919050565b80356001600160e01b03198116811461137457600080fd5b6000602082840312156113a357600080fd5b81356103ab816118ff565b600080604083850312156113c157600080fd5b82356113cc816118ff565b915060208301356001600160801b03811681146113e857600080fd5b809150509250929050565b6000806040838503121561140657600080fd5b8235611411816118ff565b946020939093013593505050565b6000806040838503121561143257600080fd5b823567ffffffffffffffff8082111561144a57600080fd5b818501915085601f83011261145e57600080fd5b8135602082821115611472576114726118e9565b8160051b92506114838184016117a0565b8281528181019085830185870184018b101561149e57600080fd5b600096505b848710156114c8576114b481611379565b8352600196909601959183019183016114a3565b5096506114d89050878201611369565b9450505050509250929050565b6000602082840312156114f757600080fd5b815180151581146103ab57600080fd5b60006020828403121561151957600080fd5b5051919050565b60006020828403121561153257600080fd5b6103ab82611379565b6000806040838503121561154e57600080fd5b61155783611379565b915060208301356113e8816118ff565b6000806040838503121561157a57600080fd5b61158383611379565b915061159160208401611379565b90509250929050565b600080604083850312156115ad57600080fd5b8235611557816118ff565b600080600080608085870312156115ce57600080fd5b84356115d9816118ff565b935060208501356115e9816118ff565b925060408501359150606085013567ffffffffffffffff81111561160c57600080fd5b8501601f8101871361161d57600080fd5b803561163061162b826117d1565b6117a0565b81815288602083850101111561164557600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60006020828403121561167957600080fd5b815167ffffffffffffffff81111561169057600080fd5b8201601f810184136116a157600080fd5b80516116af61162b826117d1565b8181528560208385010111156116c457600080fd5b6116d5826020830160208601611872565b95945050505050565b6000602082840312156116f057600080fd5b5035919050565b6000815180845261170f816020860160208601611872565b601f01601f19169290920160200192915050565b60008251611735818460208701611872565b9190910192915050565b6001600160a01b038681168252851660208201526001600160801b0384811660408301528316606082015260a060808201819052600090611782908301846116f7565b979650505050505050565b6020815260006103ab60208301846116f7565b604051601f8201601f1916810167ffffffffffffffff811182821017156117c9576117c96118e9565b604052919050565b600067ffffffffffffffff8211156117eb576117eb6118e9565b50601f01601f191660200190565b60006001600160801b0380831681851680830382111561181b5761181b6118bd565b01949350505050565b60008219821115611837576118376118bd565b500190565b6000816000190483118215151615611856576118566118bd565b500290565b60008282101561186d5761186d6118bd565b500390565b60005b8381101561188d578181015183820152602001611875565b8381111561189c576000848401525b50505050565b60006000198214156118b6576118b66118bd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461191457600080fd5b5056fea26469706673582212204790fcd9b0263691c5fa33b095f02cdd8d835a68f08089e0184aa7b7e7bf8f0e64736f6c63430008060033

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

00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

-----Decoded View---------------
Arg [0] : asset_ (address): 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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