Source Code
Latest 1 from a total of 1 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Grant Role | 5711809 | 1445 days ago | IN | 0 ETH | 0.000406436701 ETH |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 72063065 | 1040 days ago | 0 ETH | ||||
| 72063065 | 1040 days ago | 0 ETH | ||||
| 72062429 | 1040 days ago | 0 ETH | ||||
| 72062429 | 1040 days ago | 0 ETH | ||||
| 72062084 | 1040 days ago | 0 ETH | ||||
| 72062084 | 1040 days ago | 0 ETH | ||||
| 72057624 | 1040 days ago | 0 ETH | ||||
| 72057624 | 1040 days ago | 0 ETH | ||||
| 72052141 | 1040 days ago | 0 ETH | ||||
| 72052141 | 1040 days ago | 0 ETH | ||||
| 72047432 | 1040 days ago | 0 ETH | ||||
| 72047432 | 1040 days ago | 0 ETH | ||||
| 72038846 | 1040 days ago | 0 ETH | ||||
| 72038846 | 1040 days ago | 0 ETH | ||||
| 72036865 | 1040 days ago | 0 ETH | ||||
| 72036865 | 1040 days ago | 0 ETH | ||||
| 72025432 | 1040 days ago | 0 ETH | ||||
| 72025432 | 1040 days ago | 0 ETH | ||||
| 72016555 | 1040 days ago | 0 ETH | ||||
| 72016555 | 1040 days ago | 0 ETH | ||||
| 71996074 | 1040 days ago | 0 ETH | ||||
| 71996074 | 1040 days ago | 0 ETH | ||||
| 71990038 | 1040 days ago | 0 ETH | ||||
| 71990038 | 1040 days ago | 0 ETH | ||||
| 71982534 | 1040 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Join
Compiler Version
v0.8.6+commit.11564f7e
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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;
}
}// 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; }
}
}// 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
}
}{
"optimizer": {
"enabled": true,
"runs": 1000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.