Source Code
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FraxlendLever
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.8.23;
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ======================== Fraxlend Lever ============================
// ====================================================================
import { AccessControl } from "@openzeppelin/contracts/access/AccessControl.sol";
import { IFraxlend } from "src/interfaces/IFraxlend.sol";
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract FraxlendLever is AccessControl {
bytes32 constant PATH_MANAGER = keccak256("PATH_MANAGER");
bytes32 constant PATH_SENTINAL = keccak256("PATH_SENTINAL");
constructor(address _owner, address _pathSetter, address sentinal) {
_grantRole(DEFAULT_ADMIN_ROLE, _owner);
_grantRole(PATH_MANAGER, _owner);
_grantRole(PATH_MANAGER, _pathSetter);
_grantRole(PATH_SENTINAL, sentinal);
}
mapping(address => mapping(address => Call[])) route;
struct Call {
address target;
bytes32[] datas;
uint8 amountsIndex;
int8 amountOutType;
address tokenOut;
int8 deadlineIndex;
}
// ============================= Core =================================
/// @notice Entry point for the fraxlend pair to call into this contract
/// @param amountIn The amount of token to swap
/// @param amountOutMin The expected amount out,
/// @param path The Path of tokens to swap
/// @param to Unused: address to send toknes to, overwritten
/// by msg.sender
/// @param deadline Unused: The deadline for the swap to occur,
/// overwritten to block.timestamp
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts) {
uint256 limit = IFraxlend(msg.sender).borrowLimit();
if (limit < type(uint256).max) {
if (path[0] == IFraxlend(msg.sender).asset()) {
(uint256 amount, ) = IFraxlend(msg.sender).totalBorrow();
if (amount + amountIn > limit) revert BorrowLimit();
}
}
IERC20(path[0]).transferFrom(msg.sender, address(this), amountIn);
Call[] memory calls = route[msg.sender][path[0]];
IERC20(path[0]).approve(calls[0].target, amountIn);
uint256 len = calls.length;
for (uint i; i < len; ++i) {
uint256 out = createAndCall(
calls[i].target,
calls[i].amountsIndex,
calls[i].amountOutType,
amountIn,
calls[i].deadlineIndex,
calls[i].datas
);
if (out < type(uint256).max) {
amountIn = out;
} else {
amountIn = IERC20(path[i]).balanceOf(address(this));
}
if (i == len - 1) {
break;
} else {
IERC20(calls[i].tokenOut).approve(calls[i + 1].target, amountIn);
}
}
IERC20(path[path.length - 1]).transfer(msg.sender, amountIn);
if (amountIn < amountOutMin) revert TooLittleOut();
amounts = new uint256[](1);
amounts[0] = amountIn;
}
// ========================== Internal Helpers =============================
/// @notice Helper function to dynamically create a low level swap call.
/// @param target The contract to call to perform the swap
/// @param amountsIndex The bytes32 call array index to overwrite with the value
/// @param amountOutType Whether to take the amount out returned from the swap,
/// And which decoding schema to use to derive the value
/// @param amount The amount we wish to swap
/// @param deadlineIndex The deadline index to overwrite with block.timstamp, if applicable
/// @param args The constant args to pass into the call
function createAndCall(
address target,
uint8 amountsIndex,
int8 amountOutType,
uint256 amount,
int8 deadlineIndex,
bytes32[] memory args
) internal returns (uint256) {
bytes memory data;
for (uint256 i; i < args.length; ++i) {
if (i == 0) {
data = abi.encodePacked(data, bytes4(args[i]));
} else if (i == amountsIndex) {
data = abi.encodePacked(data, amount);
} else if (i == uint8(deadlineIndex)) {
data = abi.encodePacked(data, uint256(block.timestamp));
} else {
data = abi.encodePacked(data, args[i]);
}
}
(bool success, bytes memory ret) = target.call(data);
if (!success) revert SwapFailed();
if (amountOutType == 1) {
return abi.decode(ret, (uint256));
} else if (amountOutType == 2) {
uint256[] memory arr = abi.decode(ret, (uint256[]));
return arr[arr.length - 1];
} else {
return type(uint256).max;
}
}
// ============================= AdminGated ===============================
/// @notice Admin gated function to remove calls for a given fraxlend pair and input token
/// @param fraxlendPair The fraxlend pair to remove the approved path from
/// @param tokenIn The first token in the path
function removeCalls(address fraxlendPair, address tokenIn) external {
if (!(hasRole(PATH_MANAGER, msg.sender) || hasRole(PATH_SENTINAL, msg.sender))) revert UnAuthorized();
delete route[fraxlendPair][tokenIn];
}
/// @notice Admin gated function to set the approved swap path for a given fraxlend pair and input token
/// @param fraxlendPair The fraxlend pair to set the approved call for
/// @param tokenIn The input token used to derive a specified path for a given pair
/// @param calls The calls to used to effect the swap
/// @dev Calls ought to be simulated prior to whitelisting, ensuring the pair receives the correct tokens
function setCalls(address fraxlendPair, address tokenIn, Call[] memory calls) external onlyRole(PATH_MANAGER) {
for (uint i; i < calls.length; ++i) {
route[fraxlendPair][tokenIn].push(calls[i]);
}
}
error UnAuthorized();
error TooLittleOut();
error SwapFailed();
error BorrowLimit();
error UnknownCaller();
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)
pragma solidity ^0.8.20;
import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {ERC165} from "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* 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 `DEFAULT_ADMIN_ROLE`, 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 `DEFAULT_ADMIN_ROLE` 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. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with an {AccessControlUnauthorizedAccount} error including the required role.
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
return _roles[role].hasRole[account];
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
* is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
* is missing `role`.
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
return _roles[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.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, 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 revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
/**
* @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}pragma solidity ^0.8.23;
interface IFraxlend {
function borrowLimit() external view returns (uint256);
function totalBorrow() external view returns (uint256 amount, uint256 shares);
function asset() external view returns (address);
function setSwapper(address, bool) external;
function leveragedPosition(address, uint256, uint256, uint256, address[] memory) external;
function userCollateralBalance(address) external view returns (uint256);
function userBorrowShares(address) external view returns (uint256);
function toBorrowAmount(uint256, bool, bool) external view returns (uint256);
function repayAssetWithCollateral(address, uint256, uint256, address[] memory) external;
function exchangeRateInfo() external view returns (address, uint32, uint184, uint256, uint256);
}
interface ICurveNg {
function exchange(uint128 i, uint128 j, uint256 dx, uint256 _minDy, address receiver) external returns (uint256);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
* ```
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)
pragma solidity ^0.8.20;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev The `account` is missing a role.
*/
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
/**
* @dev The caller of a function is not the expected one.
*
* NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
*/
error AccessControlBadConfirmation();
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 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(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @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(bytes32 role, address account) external;
/**
* @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(bytes32 role, address account) external;
/**
* @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 `callerConfirmation`.
*/
function renounceRole(bytes32 role, address callerConfirmation) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"remappings": [
"frax-std/=node_modules/frax-standard-solidity/src/",
"frax-tmp/=node_modules/frax-template/src/",
"@prb/test/=node_modules/@prb/test/",
"forge-std/=node_modules/forge-std/src/",
"ds-test/=node_modules/ds-test/src/",
"@openzeppelin/=node_modules/@openzeppelin/",
"solidity-bytes-utils/=node_modules/solidity-bytes-utils/"
],
"optimizer": {
"enabled": true,
"runs": 999999
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"evmVersion": "shanghai",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_pathSetter","type":"address"},{"internalType":"address","name":"sentinal","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"BorrowLimit","type":"error"},{"inputs":[],"name":"SwapFailed","type":"error"},{"inputs":[],"name":"TooLittleOut","type":"error"},{"inputs":[],"name":"UnAuthorized","type":"error"},{"inputs":[],"name":"UnknownCaller","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fraxlendPair","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"}],"name":"removeCalls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fraxlendPair","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes32[]","name":"datas","type":"bytes32[]"},{"internalType":"uint8","name":"amountsIndex","type":"uint8"},{"internalType":"int8","name":"amountOutType","type":"int8"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"int8","name":"deadlineIndex","type":"int8"}],"internalType":"struct FraxlendLever.Call[]","name":"calls","type":"tuple[]"}],"name":"setCalls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801562000010575f80fd5b5060405162001da138038062001da1833981016040819052620000339162000174565b6200003f5f84620000ac565b506200005a5f8051602062001d8183398151915284620000ac565b50620000755f8051602062001d8183398151915283620000ac565b50620000a27fa19312f2f505214fc3e7b80fdff71f526d95c02fb2399b9601b0854eb4645f6a82620000ac565b50505050620001bb565b5f828152602081815260408083206001600160a01b038516845290915281205460ff166200014f575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055620001063390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000152565b505f5b92915050565b80516001600160a01b03811681146200016f575f80fd5b919050565b5f805f6060848603121562000187575f80fd5b620001928462000158565b9250620001a26020850162000158565b9150620001b26040850162000158565b90509250925092565b611bb880620001c95f395ff3fe608060405234801561000f575f80fd5b50600436106100b9575f3560e01c806338ed17391161007257806391d148541161005857806391d1485414610183578063a217fddf146101c6578063d547741f146101cd575f80fd5b806338ed1739146101505780638b6e808f14610170575f80fd5b8063248a9ca3116100a2578063248a9ca3146100fa5780632f2ff15d1461012a57806336568abe1461013d575f80fd5b806301ffc9a7146100bd5780630520181c146100e5575b5f80fd5b6100d06100cb3660046114bf565b6101e0565b60405190151581526020015b60405180910390f35b6100f86100f336600461161e565b610278565b005b61011c61010836600461180e565b5f9081526020819052604090206001015490565b6040519081526020016100dc565b6100f8610138366004611825565b61045f565b6100f861014b366004611825565b610489565b61016361015e366004611853565b6104e7565b6040516100dc91906118ed565b6100f861017e366004611930565b610e4a565b6100d0610191366004611825565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61011c5f81565b6100f86101db366004611825565b610f29565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061027257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b7f3bb71b0afa95c8877986380e3e4e344b97a8f7af968baa8c1687bd6b674fe3416102a281610f4d565b5f5b82518110156104585773ffffffffffffffffffffffffffffffffffffffff8086165f90815260016020908152604080832093881683529290522083518490839081106102f2576102f261195c565b6020908102919091018101518254600180820185555f94855293839020825160039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911781558183015180519294919361037393928501929101906113ba565b506040820151600290910180546060840151608085015160a09095015160ff908116760100000000000000000000000000000000000000000000027fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9097166201000002969096167fffffffffffffffffff000000000000000000000000000000000000000000ffff928216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090941691909516179190911716919091179190911790556001016102a4565b5050505050565b5f8281526020819052604090206001015461047981610f4d565b6104838383610f5a565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146104d8576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104e28282611053565b505050565b60605f3373ffffffffffffffffffffffffffffffffffffffff1663e551d11d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610533573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105579190611989565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156106fb573373ffffffffffffffffffffffffffffffffffffffff166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105ee91906119a0565b73ffffffffffffffffffffffffffffffffffffffff1686865f8181106106165761061661195c565b905060200201602081019061062b91906119bb565b73ffffffffffffffffffffffffffffffffffffffff16036106fb575f3373ffffffffffffffffffffffffffffffffffffffff16638285ef406040518163ffffffff1660e01b81526004016040805180830381865afa15801561068f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b391906119d6565b509050816106c18a83611a25565b11156106f9576040517f8b03bdd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b85855f81811061070d5761070d61195c565b905060200201602081019061072291906119bb565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018a905273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303815f875af115801561079a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107be9190611a38565b50335f90815260016020526040812081888882816107de576107de61195c565b90506020020160208101906107f391906119bb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b82821015610955575f8481526020908190206040805160c08101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff1683526001810180548351818702810187019094528084529394919385830193928301828280156108d357602002820191905f5260205f20905b8154815260200190600101908083116108bf575b50505091835250506002919091015460ff811660208084019190915261010082045f90810b604085015273ffffffffffffffffffffffffffffffffffffffff62010000840416606085015276010000000000000000000000000000000000000000000090920490910b608090920191909152908252600192909201910161084b565b50505050905086865f81811061096d5761096d61195c565b905060200201602081019061098291906119bb565b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3825f815181106109af576109af61195c565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018c90526044016020604051808303815f875af1158015610a2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4e9190611a38565b5080515f5b81811015610cfb575f610afa848381518110610a7157610a7161195c565b60200260200101515f0151858481518110610a8e57610a8e61195c565b602002602001015160400151868581518110610aac57610aac61195c565b6020026020010151606001518f888781518110610acb57610acb61195c565b602002602001015160a00151898881518110610ae957610ae961195c565b60200260200101516020015161110c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610b2c57809b50610be4565b898983818110610b3e57610b3e61195c565b9050602002016020810190610b5391906119bb565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610bbd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be19190611989565b9b505b610bef600184611a57565b8203610bfb5750610cfb565b838281518110610c0d57610c0d61195c565b60200260200101516080015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b385846001610c429190611a25565b81518110610c5257610c5261195c565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018f90526044016020604051808303815f875af1158015610ccd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf19190611a38565b5050600101610a53565b508787610d09600182611a57565b818110610d1857610d1861195c565b9050602002016020810190610d2d91906119bb565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018c905273ffffffffffffffffffffffffffffffffffffffff919091169063a9059cbb906044016020604051808303815f875af1158015610d9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dc39190611a38565b50888a1015610dfe576040517f0be7504800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001808252818301909252906020808301908036833701905050935089845f81518110610e3157610e3161195c565b6020026020010181815250505050509695505050505050565b335f9081527f0ef3aa7015d00787220ca0fd9c5950587f99dfb7e726e5a35ad8d906435c6c35602052604090205460ff1680610eb35750335f9081527fc2f2bf99e0a2a4db3b53524dbcfb34e6da1fe818965844226e00ecc2648ae7f9602052604090205460ff165b610ee9576040517fbe24598300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8083165f9081526001602090815260408083209385168352929052908120610f2591611403565b5050565b5f82815260208190526040902060010154610f4381610f4d565b6104838383611053565b610f578133611331565b50565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1661104c575f8381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610fea3390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610272565b505f610272565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff161561104c575f8381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610272565b5f60605f5b83518110156111e357805f0361116357818482815181106111345761113461195c565b602002602001015160405160200161114d929190611a97565b60405160208183030381529060405291506111db565b8760ff16810361118057818660405160200161114d929190611ad3565b8460ff16810361119d57814260405160200161114d929190611ad3565b818482815181106111b0576111b061195c565b60200260200101516040516020016111c9929190611ad3565b60405160208183030381529060405291505b600101611111565b505f808973ffffffffffffffffffffffffffffffffffffffff168360405161120b9190611aeb565b5f604051808303815f865af19150503d805f8114611244576040519150601f19603f3d011682016040523d82523d5f602084013e611249565b606091505b509150915081611285576040517f81ceff3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b875f0b6001036112ad57808060200190518101906112a39190611989565b9350505050611327565b875f0b600203611300575f818060200190518101906112cc9190611af6565b905080600182516112dd9190611a57565b815181106112ed576112ed61195c565b6020026020010151945050505050611327565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff93505050505b9695505050505050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f25576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b828054828255905f5260205f209081019282156113f3579160200282015b828111156113f35782518255916020019190600101906113d8565b506113ff929150611421565b5090565b5080545f8255600302905f5260205f2090810190610f579190611435565b5b808211156113ff575f8155600101611422565b808211156113ff5780547fffffffffffffffffffffffff00000000000000000000000000000000000000001681555f61147160018301826114a4565b506002810180547fffffffffffffffffff0000000000000000000000000000000000000000000000169055600301611435565b5080545f8255905f5260205f2090810190610f579190611421565b5f602082840312156114cf575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146114fe575f80fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f57575f80fd5b803561153181611505565b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160c0810167ffffffffffffffff8111828210171561158657611586611536565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156115d3576115d3611536565b604052919050565b5f67ffffffffffffffff8211156115f4576115f4611536565b5060051b60200190565b803560ff81168114611531575f80fd5b80355f81900b8114611531575f80fd5b5f805f60608486031215611630575f80fd5b61163a8435611505565b8335925061164b6020850135611505565b6020840135915067ffffffffffffffff6040850135111561166a575f80fd5b6040840135840185601f82011261167f575f80fd5b61169161168c82356115db565b61158c565b81358082526020808301929160051b840101888111156116af575f80fd5b602084015b818110156117ff5767ffffffffffffffff813511156116d1575f80fd5b8035850160c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828d03011215611706575f80fd5b61170e611563565b61171b6020830135611505565b6020820135815267ffffffffffffffff6040830135111561173a575f80fd5b604082013582018c603f82011261174f575f80fd5b61175f61168c60208301356115db565b602082810135808352908201919060051b83016040018f811115611781575f80fd5b6040840193505b808410156117a3578335835260209384019390920191611788565b506020840152506117b89050606083016115fe565b60408201526117c96080830161160e565b60608201526117da60a08301611526565b60808201526117eb60c0830161160e565b60a0820152855250602093840193016116b4565b50508093505050509250925092565b5f6020828403121561181e575f80fd5b5035919050565b5f8060408385031215611836575f80fd5b82359150602083013561184881611505565b809150509250929050565b5f805f805f8060a08789031215611868575f80fd5b8635955060208701359450604087013567ffffffffffffffff8082111561188d575f80fd5b818901915089601f8301126118a0575f80fd5b8135818111156118ae575f80fd5b8a60208260051b85010111156118c2575f80fd5b6020830196508095505050506118da60608801611526565b9150608087013590509295509295509295565b602080825282518282018190525f9190848201906040850190845b8181101561192457835183529284019291840191600101611908565b50909695505050505050565b5f8060408385031215611941575f80fd5b823561194c81611505565b9150602083013561184881611505565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215611999575f80fd5b5051919050565b5f602082840312156119b0575f80fd5b81516114fe81611505565b5f602082840312156119cb575f80fd5b81356114fe81611505565b5f80604083850312156119e7575f80fd5b505080516020909101519092909150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610272576102726119f8565b5f60208284031215611a48575f80fd5b815180151581146114fe575f80fd5b81810381811115610272576102726119f8565b5f81515f5b81811015611a895760208185018101518683015201611a6f565b505f93019283525090919050565b5f611aa28285611a6a565b7fffffffff000000000000000000000000000000000000000000000000000000009390931683525050600401919050565b5f611ade8285611a6a565b9283525050602001919050565b5f6114fe8284611a6a565b5f6020808385031215611b07575f80fd5b825167ffffffffffffffff811115611b1d575f80fd5b8301601f81018513611b2d575f80fd5b8051611b3b61168c826115db565b81815260059190911b82018301908381019087831115611b59575f80fd5b928401925b82841015611b7757835182529284019290840190611b5e565b97965050505050505056fea26469706673582212200728cc42a108e00212b7e12709f487f7a68ede79a8db017f0492a34aea3a4a5664736f6c634300081700333bb71b0afa95c8877986380e3e4e344b97a8f7af968baa8c1687bd6b674fe341000000000000000000000000c4eb45d80dc1f079045e75d5d55de8ed1c1090e600000000000000000000000031562ae726afebe25417df01bedc72ef489f45b30000000000000000000000009032cce69ac1cf277e4587e60d3cd710e0babc6f
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106100b9575f3560e01c806338ed17391161007257806391d148541161005857806391d1485414610183578063a217fddf146101c6578063d547741f146101cd575f80fd5b806338ed1739146101505780638b6e808f14610170575f80fd5b8063248a9ca3116100a2578063248a9ca3146100fa5780632f2ff15d1461012a57806336568abe1461013d575f80fd5b806301ffc9a7146100bd5780630520181c146100e5575b5f80fd5b6100d06100cb3660046114bf565b6101e0565b60405190151581526020015b60405180910390f35b6100f86100f336600461161e565b610278565b005b61011c61010836600461180e565b5f9081526020819052604090206001015490565b6040519081526020016100dc565b6100f8610138366004611825565b61045f565b6100f861014b366004611825565b610489565b61016361015e366004611853565b6104e7565b6040516100dc91906118ed565b6100f861017e366004611930565b610e4a565b6100d0610191366004611825565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61011c5f81565b6100f86101db366004611825565b610f29565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061027257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b7f3bb71b0afa95c8877986380e3e4e344b97a8f7af968baa8c1687bd6b674fe3416102a281610f4d565b5f5b82518110156104585773ffffffffffffffffffffffffffffffffffffffff8086165f90815260016020908152604080832093881683529290522083518490839081106102f2576102f261195c565b6020908102919091018101518254600180820185555f94855293839020825160039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911781558183015180519294919361037393928501929101906113ba565b506040820151600290910180546060840151608085015160a09095015160ff908116760100000000000000000000000000000000000000000000027fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9097166201000002969096167fffffffffffffffffff000000000000000000000000000000000000000000ffff928216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090941691909516179190911716919091179190911790556001016102a4565b5050505050565b5f8281526020819052604090206001015461047981610f4d565b6104838383610f5a565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146104d8576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104e28282611053565b505050565b60605f3373ffffffffffffffffffffffffffffffffffffffff1663e551d11d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610533573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105579190611989565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156106fb573373ffffffffffffffffffffffffffffffffffffffff166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105ee91906119a0565b73ffffffffffffffffffffffffffffffffffffffff1686865f8181106106165761061661195c565b905060200201602081019061062b91906119bb565b73ffffffffffffffffffffffffffffffffffffffff16036106fb575f3373ffffffffffffffffffffffffffffffffffffffff16638285ef406040518163ffffffff1660e01b81526004016040805180830381865afa15801561068f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b391906119d6565b509050816106c18a83611a25565b11156106f9576040517f8b03bdd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b85855f81811061070d5761070d61195c565b905060200201602081019061072291906119bb565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018a905273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303815f875af115801561079a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107be9190611a38565b50335f90815260016020526040812081888882816107de576107de61195c565b90506020020160208101906107f391906119bb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b82821015610955575f8481526020908190206040805160c08101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff1683526001810180548351818702810187019094528084529394919385830193928301828280156108d357602002820191905f5260205f20905b8154815260200190600101908083116108bf575b50505091835250506002919091015460ff811660208084019190915261010082045f90810b604085015273ffffffffffffffffffffffffffffffffffffffff62010000840416606085015276010000000000000000000000000000000000000000000090920490910b608090920191909152908252600192909201910161084b565b50505050905086865f81811061096d5761096d61195c565b905060200201602081019061098291906119bb565b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3825f815181106109af576109af61195c565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018c90526044016020604051808303815f875af1158015610a2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4e9190611a38565b5080515f5b81811015610cfb575f610afa848381518110610a7157610a7161195c565b60200260200101515f0151858481518110610a8e57610a8e61195c565b602002602001015160400151868581518110610aac57610aac61195c565b6020026020010151606001518f888781518110610acb57610acb61195c565b602002602001015160a00151898881518110610ae957610ae961195c565b60200260200101516020015161110c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610b2c57809b50610be4565b898983818110610b3e57610b3e61195c565b9050602002016020810190610b5391906119bb565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610bbd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be19190611989565b9b505b610bef600184611a57565b8203610bfb5750610cfb565b838281518110610c0d57610c0d61195c565b60200260200101516080015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b385846001610c429190611a25565b81518110610c5257610c5261195c565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018f90526044016020604051808303815f875af1158015610ccd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf19190611a38565b5050600101610a53565b508787610d09600182611a57565b818110610d1857610d1861195c565b9050602002016020810190610d2d91906119bb565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018c905273ffffffffffffffffffffffffffffffffffffffff919091169063a9059cbb906044016020604051808303815f875af1158015610d9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dc39190611a38565b50888a1015610dfe576040517f0be7504800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001808252818301909252906020808301908036833701905050935089845f81518110610e3157610e3161195c565b6020026020010181815250505050509695505050505050565b335f9081527f0ef3aa7015d00787220ca0fd9c5950587f99dfb7e726e5a35ad8d906435c6c35602052604090205460ff1680610eb35750335f9081527fc2f2bf99e0a2a4db3b53524dbcfb34e6da1fe818965844226e00ecc2648ae7f9602052604090205460ff165b610ee9576040517fbe24598300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8083165f9081526001602090815260408083209385168352929052908120610f2591611403565b5050565b5f82815260208190526040902060010154610f4381610f4d565b6104838383611053565b610f578133611331565b50565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1661104c575f8381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610fea3390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610272565b505f610272565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff161561104c575f8381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610272565b5f60605f5b83518110156111e357805f0361116357818482815181106111345761113461195c565b602002602001015160405160200161114d929190611a97565b60405160208183030381529060405291506111db565b8760ff16810361118057818660405160200161114d929190611ad3565b8460ff16810361119d57814260405160200161114d929190611ad3565b818482815181106111b0576111b061195c565b60200260200101516040516020016111c9929190611ad3565b60405160208183030381529060405291505b600101611111565b505f808973ffffffffffffffffffffffffffffffffffffffff168360405161120b9190611aeb565b5f604051808303815f865af19150503d805f8114611244576040519150601f19603f3d011682016040523d82523d5f602084013e611249565b606091505b509150915081611285576040517f81ceff3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b875f0b6001036112ad57808060200190518101906112a39190611989565b9350505050611327565b875f0b600203611300575f818060200190518101906112cc9190611af6565b905080600182516112dd9190611a57565b815181106112ed576112ed61195c565b6020026020010151945050505050611327565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff93505050505b9695505050505050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f25576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b828054828255905f5260205f209081019282156113f3579160200282015b828111156113f35782518255916020019190600101906113d8565b506113ff929150611421565b5090565b5080545f8255600302905f5260205f2090810190610f579190611435565b5b808211156113ff575f8155600101611422565b808211156113ff5780547fffffffffffffffffffffffff00000000000000000000000000000000000000001681555f61147160018301826114a4565b506002810180547fffffffffffffffffff0000000000000000000000000000000000000000000000169055600301611435565b5080545f8255905f5260205f2090810190610f579190611421565b5f602082840312156114cf575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146114fe575f80fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f57575f80fd5b803561153181611505565b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160c0810167ffffffffffffffff8111828210171561158657611586611536565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156115d3576115d3611536565b604052919050565b5f67ffffffffffffffff8211156115f4576115f4611536565b5060051b60200190565b803560ff81168114611531575f80fd5b80355f81900b8114611531575f80fd5b5f805f60608486031215611630575f80fd5b61163a8435611505565b8335925061164b6020850135611505565b6020840135915067ffffffffffffffff6040850135111561166a575f80fd5b6040840135840185601f82011261167f575f80fd5b61169161168c82356115db565b61158c565b81358082526020808301929160051b840101888111156116af575f80fd5b602084015b818110156117ff5767ffffffffffffffff813511156116d1575f80fd5b8035850160c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828d03011215611706575f80fd5b61170e611563565b61171b6020830135611505565b6020820135815267ffffffffffffffff6040830135111561173a575f80fd5b604082013582018c603f82011261174f575f80fd5b61175f61168c60208301356115db565b602082810135808352908201919060051b83016040018f811115611781575f80fd5b6040840193505b808410156117a3578335835260209384019390920191611788565b506020840152506117b89050606083016115fe565b60408201526117c96080830161160e565b60608201526117da60a08301611526565b60808201526117eb60c0830161160e565b60a0820152855250602093840193016116b4565b50508093505050509250925092565b5f6020828403121561181e575f80fd5b5035919050565b5f8060408385031215611836575f80fd5b82359150602083013561184881611505565b809150509250929050565b5f805f805f8060a08789031215611868575f80fd5b8635955060208701359450604087013567ffffffffffffffff8082111561188d575f80fd5b818901915089601f8301126118a0575f80fd5b8135818111156118ae575f80fd5b8a60208260051b85010111156118c2575f80fd5b6020830196508095505050506118da60608801611526565b9150608087013590509295509295509295565b602080825282518282018190525f9190848201906040850190845b8181101561192457835183529284019291840191600101611908565b50909695505050505050565b5f8060408385031215611941575f80fd5b823561194c81611505565b9150602083013561184881611505565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215611999575f80fd5b5051919050565b5f602082840312156119b0575f80fd5b81516114fe81611505565b5f602082840312156119cb575f80fd5b81356114fe81611505565b5f80604083850312156119e7575f80fd5b505080516020909101519092909150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610272576102726119f8565b5f60208284031215611a48575f80fd5b815180151581146114fe575f80fd5b81810381811115610272576102726119f8565b5f81515f5b81811015611a895760208185018101518683015201611a6f565b505f93019283525090919050565b5f611aa28285611a6a565b7fffffffff000000000000000000000000000000000000000000000000000000009390931683525050600401919050565b5f611ade8285611a6a565b9283525050602001919050565b5f6114fe8284611a6a565b5f6020808385031215611b07575f80fd5b825167ffffffffffffffff811115611b1d575f80fd5b8301601f81018513611b2d575f80fd5b8051611b3b61168c826115db565b81815260059190911b82018301908381019087831115611b59575f80fd5b928401925b82841015611b7757835182529284019290840190611b5e565b97965050505050505056fea26469706673582212200728cc42a108e00212b7e12709f487f7a68ede79a8db017f0492a34aea3a4a5664736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c4eb45d80dc1f079045e75d5d55de8ed1c1090e600000000000000000000000031562ae726afebe25417df01bedc72ef489f45b30000000000000000000000009032cce69ac1cf277e4587e60d3cd710e0babc6f
-----Decoded View---------------
Arg [0] : _owner (address): 0xC4EB45d80DC1F079045E75D5d55de8eD1c1090E6
Arg [1] : _pathSetter (address): 0x31562ae726AFEBe25417df01bEdC72EF489F45b3
Arg [2] : sentinal (address): 0x9032Cce69AC1CF277e4587e60d3cD710E0BAbc6F
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000c4eb45d80dc1f079045e75d5d55de8ed1c1090e6
Arg [1] : 00000000000000000000000031562ae726afebe25417df01bedc72ef489f45b3
Arg [2] : 0000000000000000000000009032cce69ac1cf277e4587e60d3cd710e0babc6f
Deployed Bytecode Sourcemap
960:6088:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2565:202:0;;;;;;:::i;:::-;;:::i;:::-;;;516:14:11;;509:22;491:41;;479:2;464:18;2565:202:0;;;;;;;;6687:230:9;;;;;;:::i;:::-;;:::i;:::-;;3810:120:0;;;;;;:::i;:::-;3875:7;3901:12;;;;;;;;;;:22;;;;3810:120;;;;5158:25:11;;;5146:2;5131:18;3810:120:0;5012:177:11;4226:136:0;;;;;;:::i;:::-;;:::i;5328:245::-;;;;;;:::i;:::-;;:::i;2213:1645:9:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5997:232::-;;;;;;:::i;:::-;;:::i;2854:136:0:-;;;;;;:::i;:::-;2931:4;2954:12;;;;;;;;;;;:29;;;;;;;;;;;;;;;;2854:136;2187:49;;2232:4;2187:49;;4642:138;;;;;;:::i;:::-;;:::i;2565:202::-;2650:4;2673:47;;;2688:32;2673:47;;:87;;-1:-1:-1;876:25:7;861:40;;;;2724:36:0;2666:94;2565:202;-1:-1:-1;;2565:202:0:o;6687:230:9:-;1038:25;2464:16:0;2475:4;2464:10;:16::i;:::-;6812:6:9::1;6807:104;6824:5;:12;6820:1;:16;6807:104;;;6857:19;::::0;;::::1;;::::0;;;:5:::1;:19;::::0;;;;;;;:28;;::::1;::::0;;;;;;6891:8;;:5;;6897:1;;6891:8;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;6857:43;;::::1;::::0;;::::1;::::0;;-1:-1:-1;6857:43:9;;;;;;;;;::::1;::::0;;::::1;;::::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;6891:8;;6857:43;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;6857:43:9::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;::::1;;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;6838:3:::1;6807:104;;;;6687:230:::0;;;;:::o;4226:136:0:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4330:25:::1;4341:4;4347:7;4330:10;:25::i;:::-;;4226:136:::0;;;:::o;5328:245::-;5421:34;;;735:10:6;5421:34:0;5417:102;;5478:30;;;;;;;;;;;;;;5417:102;5529:37;5541:4;5547:18;5529:11;:37::i;:::-;;5328:245;;:::o;2213:1645:9:-;2406:24;2442:13;2468:10;2458:33;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2442:51;;2515:17;2507:5;:25;2503:259;;;2573:10;2563:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2552:40;;:4;;2557:1;2552:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:40;;;2548:204;;2613:14;2643:10;2633:33;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;2612:56:9;-1:-1:-1;2710:5:9;2690:17;2699:8;2612:56;2690:17;:::i;:::-;:25;2686:51;;;2724:13;;;;;;;;;;;;;;2686:51;2594:158;2548:204;2778:4;;2783:1;2778:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2771:65;;;;;2800:10;2771:65;;;9162:34:11;2820:4:9;9212:18:11;;;9205:43;9264:18;;;9257:34;;;2771:28:9;;;;;;;;9074:18:11;;2771:65:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;2874:10:9;2846:19;2868:17;;;:5;:17;;;;;2846:19;2886:4;;2846:19;2886:7;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2868:26;;;;;;;;;;;;;;;2846:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2846:48:9;;;-1:-1:-1;;2846:48:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2911:4;;2916:1;2911:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2904:23;;;2928:5;2934:1;2928:8;;;;;;;;:::i;:::-;;;;;;;;;;;:15;2904:50;;;;;;;;;;9788:42:11;9776:55;;;2904:50:9;;;9758:74:11;9848:18;;;9841:34;;;9731:18;;2904:50:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;2978:12:9;;2964:11;3000:654;3017:3;3013:1;:7;3000:654;;;3041:11;3055:237;3086:5;3092:1;3086:8;;;;;;;;:::i;:::-;;;;;;;:15;;;3119:5;3125:1;3119:8;;;;;;;;:::i;:::-;;;;;;;:21;;;3158:5;3164:1;3158:8;;;;;;;;:::i;:::-;;;;;;;:22;;;3198:8;3224:5;3230:1;3224:8;;;;;;;;:::i;:::-;;;;;;;:22;;;3264:5;3270:1;3264:8;;;;;;;;:::i;:::-;;;;;;;:14;;;3055:13;:237::i;:::-;3041:251;;3316:17;3310:3;:23;3306:166;;;3364:3;3353:14;;3306:166;;;3424:4;;3429:1;3424:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;3417:40;;;;;3451:4;3417:40;;;10032:74:11;3417:25:9;;;;;;;;10005:18:11;;3417:40:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3406:51;;3306:166;3494:7;3500:1;3494:3;:7;:::i;:::-;3489:1;:12;3485:159;;3521:5;;;3485:159;3572:5;3578:1;3572:8;;;;;;;;:::i;:::-;;;;;;;:17;;;3565:33;;;3599:5;3605:1;3609;3605:5;;;;:::i;:::-;3599:12;;;;;;;;:::i;:::-;;;;;;;;;;;:19;3565:64;;;;;;;;;;9788:42:11;9776:55;;;3565:64:9;;;9758:74:11;9848:18;;;9841:34;;;9731:18;;3565:64:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;-1:-1:-1;3022:3:9;;3000:654;;;-1:-1:-1;3671:4:9;;3676:15;3690:1;3671:4;3676:15;:::i;:::-;3671:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;3664:60;;;;;3703:10;3664:60;;;9758:74:11;9848:18;;;9841:34;;;3664:38:9;;;;;;;;9731:18:11;;3664:60:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3749:12;3738:8;:23;3734:50;;;3770:14;;;;;;;;;;;;;;3734:50;3804:16;;;3818:1;3804:16;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3804:16:9;3794:26;;3843:8;3830:7;3838:1;3830:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;2432:1426;;;2213:1645;;;;;;;;:::o;5997:232::-;6104:10;2931:4:0;2954:29;;;:12;;:29;:12;:29;;;;;6082:71:9;;;-1:-1:-1;6142:10:9;2931:4:0;2954:29;;;:12;;:29;:12;:29;;;;;6119:34:9;6076:101;;6163:14;;;;;;;;;;;;;;6076:101;6194:19;;;;;;;;:5;:19;;;;;;;;:28;;;;;;;;;;;6187:35;;;:::i;:::-;5997:232;;:::o;4642:138:0:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4747:26:::1;4759:4;4765:7;4747:11;:26::i;3199:103::-:0;3265:30;3276:4;735:10:6;3265::0;:30::i;:::-;3199:103;:::o;6179:316::-;6256:4;2954:12;;;;;;;;;;;:29;;;;;;;;;;;;;6272:217;;6315:6;:12;;;;;;;;;;;:29;;;;;;;;;;:36;;;;6347:4;6315:36;;;6397:12;735:10:6;;656:96;6397:12:0;6370:40;;6388:7;6370:40;;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:0;6424:11;;6272:217;-1:-1:-1;6473:5:0;6466:12;;6730:317;6808:4;2954:12;;;;;;;;;;;:29;;;;;;;;;;;;;6824:217;;;6898:5;6866:12;;;;;;;;;;;:29;;;;;;;;;;;:37;;;;;;6922:40;735:10:6;;6866:12:0;;6922:40;;6898:5;6922:40;-1:-1:-1;6983:4:0;6976:11;;4567:1113:9;4777:7;4796:17;4828:9;4823:454;4843:4;:11;4839:1;:15;4823:454;;;4879:1;4884;4879:6;4875:392;;4929:4;4942;4947:1;4942:7;;;;;;;;:::i;:::-;;;;;;;4912:39;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4905:46;;4875:392;;;4981:12;4976:17;;:1;:17;4972:295;;5037:4;5043:6;5020:30;;;;;;;;;:::i;4972:295::-;5086:13;5075:25;;:1;:25;5071:196;;5144:4;5158:15;5127:48;;;;;;;;;:::i;5071:196::-;5238:4;5244;5249:1;5244:7;;;;;;;;:::i;:::-;;;;;;;5221:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5214:38;;5071:196;4856:3;;4823:454;;;;5287:12;5301:16;5321:6;:11;;5333:4;5321:17;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5286:52;;;;5353:7;5348:33;;5369:12;;;;;;;;;;;;;;5348:33;5395:13;:18;;5412:1;5395:18;5391:283;;5447:3;5436:26;;;;;;;;;;;;:::i;:::-;5429:33;;;;;;;5391:283;5483:13;:18;;5500:1;5483:18;5479:195;;5517:20;5551:3;5540:28;;;;;;;;;;;;:::i;:::-;5517:51;;5589:3;5606:1;5593:3;:10;:14;;;;:::i;:::-;5589:19;;;;;;;;:::i;:::-;;;;;;;5582:26;;;;;;;;5479:195;5646:17;5639:24;;;;;4567:1113;;;;;;;;;:::o;3432:197:0:-;2931:4;2954:12;;;;;;;;;;;:29;;;;;;;;;;;;;3515:108;;3565:47;;;;;9788:42:11;9776:55;;3565:47:0;;;9758:74:11;9848:18;;;9841:34;;;9731:18;;3565:47:0;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:332:11:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:66;223:5;219:78;212:5;209:89;199:117;;312:1;309;302:12;199:117;335:5;14:332;-1:-1:-1;;;14:332:11:o;543:154::-;629:42;622:5;618:54;611:5;608:65;598:93;;687:1;684;677:12;702:134;770:20;;799:31;770:20;799:31;:::i;:::-;702:134;;;:::o;841:184::-;893:77;890:1;883:88;990:4;987:1;980:15;1014:4;1011:1;1004:15;1030:253;1102:2;1096:9;1144:4;1132:17;;1179:18;1164:34;;1200:22;;;1161:62;1158:88;;;1226:18;;:::i;:::-;1262:2;1255:22;1030:253;:::o;1288:334::-;1359:2;1353:9;1415:2;1405:13;;1420:66;1401:86;1389:99;;1518:18;1503:34;;1539:22;;;1500:62;1497:88;;;1565:18;;:::i;:::-;1601:2;1594:22;1288:334;;-1:-1:-1;1288:334:11:o;1627:187::-;1691:4;1724:18;1716:6;1713:30;1710:56;;;1746:18;;:::i;:::-;-1:-1:-1;1791:1:11;1787:14;1803:4;1783:25;;1627:187::o;1819:156::-;1885:20;;1945:4;1934:16;;1924:27;;1914:55;;1965:1;1962;1955:12;1980:159;2045:20;;2016:5;2094:20;;;2084:31;;2074:59;;2129:1;2126;2119:12;2144:2678;2268:6;2276;2284;2337:2;2325:9;2316:7;2312:23;2308:32;2305:52;;;2353:1;2350;2343:12;2305:52;2366:49;2404:9;2391:23;2366:49;:::i;:::-;2447:9;2434:23;2424:33;;2466:58;2519:2;2508:9;2504:18;2491:32;2466:58;:::i;:::-;2571:2;2560:9;2556:18;2543:32;2533:42;;2624:18;2618:2;2607:9;2603:18;2590:32;2587:56;2584:76;;;2656:1;2653;2646:12;2584:76;2722:2;2711:9;2707:18;2694:32;2683:9;2679:48;2765:7;2758:4;2754:2;2750:13;2746:27;2736:55;;2787:1;2784;2777:12;2736:55;2811:78;2827:61;2884:2;2871:16;2827:61;:::i;:::-;2811:78;:::i;:::-;2935:16;;2923:29;;;2977:2;2968:12;;;;2911:3;3019:1;3015:24;3007:33;;3003:42;3057:19;;;3054:39;;;3089:1;3086;3079:12;3054:39;3121:2;3117;3113:11;3133:1659;3149:6;3144:3;3141:15;3133:1659;;;3228:18;3222:3;3209:17;3206:41;3203:61;;;3260:1;3257;3250:12;3203:61;3308:3;3295:17;3291:2;3287:26;3424:4;3355:66;3350:2;3341:7;3337:16;3333:89;3329:100;3326:120;;;3442:1;3439;3432:12;3326:120;3472:22;;:::i;:::-;3507:51;3553:2;3549;3545:11;3532:25;3507:51;:::i;:::-;3606:2;3602;3598:11;3585:25;3578:5;3571:40;3657:18;3651:2;3647;3643:11;3630:25;3627:49;3624:69;;;3689:1;3686;3679:12;3624:69;3745:2;3741;3737:11;3724:25;3720:2;3716:34;3790:7;3785:2;3781;3777:11;3773:25;3763:53;;3812:1;3809;3802:12;3763:53;3842:87;3858:70;3923:2;3919;3915:11;3902:25;3858:70;:::i;3842:87::-;4008:2;4000:11;;;3987:25;3973:40;;;4035:14;;;;3955:5;4094:1;4090:33;4082:42;;4126:2;4078:51;4145:21;;;4142:41;;;4179:1;4176;4169:12;4142:41;4217:2;4213;4209:11;4196:24;;4233:174;4251:8;4244:5;4241:19;4233:174;;;4333:19;;4319:34;;4390:2;4272:14;;;;4379;;;;4233:174;;;-1:-1:-1;4438:2:11;4427:14;;4420:29;-1:-1:-1;4485:29:11;;-1:-1:-1;4510:2:11;4502:11;;4485:29;:::i;:::-;4480:2;4473:5;4469:14;4462:53;4551:29;4575:3;4571:2;4567:12;4551:29;:::i;:::-;4546:2;4539:5;4535:14;4528:53;4618:32;4645:3;4641:2;4637:12;4618:32;:::i;:::-;4612:3;4605:5;4601:15;4594:57;4688:30;4712:4;4708:2;4704:13;4688:30;:::i;:::-;4682:3;4671:15;;4664:55;4732:18;;-1:-1:-1;4779:2:11;4770:12;;;;3166;3133:1659;;;3137:3;;4811:5;4801:15;;;;;2144:2678;;;;;:::o;4827:180::-;4886:6;4939:2;4927:9;4918:7;4914:23;4910:32;4907:52;;;4955:1;4952;4945:12;4907:52;-1:-1:-1;4978:23:11;;4827:180;-1:-1:-1;4827:180:11:o;5194:315::-;5262:6;5270;5323:2;5311:9;5302:7;5298:23;5294:32;5291:52;;;5339:1;5336;5329:12;5291:52;5375:9;5362:23;5352:33;;5435:2;5424:9;5420:18;5407:32;5448:31;5473:5;5448:31;:::i;:::-;5498:5;5488:15;;;5194:315;;;;;:::o;5514:895::-;5636:6;5644;5652;5660;5668;5676;5729:3;5717:9;5708:7;5704:23;5700:33;5697:53;;;5746:1;5743;5736:12;5697:53;5782:9;5769:23;5759:33;;5839:2;5828:9;5824:18;5811:32;5801:42;;5894:2;5883:9;5879:18;5866:32;5917:18;5958:2;5950:6;5947:14;5944:34;;;5974:1;5971;5964:12;5944:34;6012:6;6001:9;5997:22;5987:32;;6057:7;6050:4;6046:2;6042:13;6038:27;6028:55;;6079:1;6076;6069:12;6028:55;6119:2;6106:16;6145:2;6137:6;6134:14;6131:34;;;6161:1;6158;6151:12;6131:34;6214:7;6209:2;6199:6;6196:1;6192:14;6188:2;6184:23;6180:32;6177:45;6174:65;;;6235:1;6232;6225:12;6174:65;6266:2;6262;6258:11;6248:21;;6288:6;6278:16;;;;;6313:38;6347:2;6336:9;6332:18;6313:38;:::i;:::-;6303:48;;6398:3;6387:9;6383:19;6370:33;6360:43;;5514:895;;;;;;;;:::o;6414:632::-;6585:2;6637:21;;;6707:13;;6610:18;;;6729:22;;;6556:4;;6585:2;6808:15;;;;6782:2;6767:18;;;6556:4;6851:169;6865:6;6862:1;6859:13;6851:169;;;6926:13;;6914:26;;6995:15;;;;6960:12;;;;6887:1;6880:9;6851:169;;;-1:-1:-1;7037:3:11;;6414:632;-1:-1:-1;;;;;;6414:632:11:o;7051:388::-;7119:6;7127;7180:2;7168:9;7159:7;7155:23;7151:32;7148:52;;;7196:1;7193;7186:12;7148:52;7235:9;7222:23;7254:31;7279:5;7254:31;:::i;:::-;7304:5;-1:-1:-1;7361:2:11;7346:18;;7333:32;7374:33;7333:32;7374:33;:::i;7444:184::-;7496:77;7493:1;7486:88;7593:4;7590:1;7583:15;7617:4;7614:1;7607:15;7633:184;7703:6;7756:2;7744:9;7735:7;7731:23;7727:32;7724:52;;;7772:1;7769;7762:12;7724:52;-1:-1:-1;7795:16:11;;7633:184;-1:-1:-1;7633:184:11:o;7822:251::-;7892:6;7945:2;7933:9;7924:7;7920:23;7916:32;7913:52;;;7961:1;7958;7951:12;7913:52;7993:9;7987:16;8012:31;8037:5;8012:31;:::i;8078:247::-;8137:6;8190:2;8178:9;8169:7;8165:23;8161:32;8158:52;;;8206:1;8203;8196:12;8158:52;8245:9;8232:23;8264:31;8289:5;8264:31;:::i;8330:245::-;8409:6;8417;8470:2;8458:9;8449:7;8445:23;8441:32;8438:52;;;8486:1;8483;8476:12;8438:52;-1:-1:-1;;8509:16:11;;8565:2;8550:18;;;8544:25;8509:16;;8544:25;;-1:-1:-1;8330:245:11:o;8580:184::-;8632:77;8629:1;8622:88;8729:4;8726:1;8719:15;8753:4;8750:1;8743:15;8769:125;8834:9;;;8855:10;;;8852:36;;;8868:18;;:::i;9302:277::-;9369:6;9422:2;9410:9;9401:7;9397:23;9393:32;9390:52;;;9438:1;9435;9428:12;9390:52;9470:9;9464:16;9523:5;9516:13;9509:21;9502:5;9499:32;9489:60;;9545:1;9542;9535:12;10117:128;10184:9;;;10205:11;;;10202:37;;;10219:18;;:::i;10250:322::-;10291:3;10329:5;10323:12;10353:1;10363:128;10377:6;10374:1;10371:13;10363:128;;;10474:4;10459:13;;;10455:24;;10449:31;10436:11;;;10429:52;10392:12;10363:128;;;-1:-1:-1;10546:1:11;10510:16;;10535:13;;;-1:-1:-1;10510:16:11;;10250:322;-1:-1:-1;10250:322:11:o;10577:353::-;10732:3;10763:29;10788:3;10780:6;10763:29;:::i;:::-;10827:66;10815:79;;;;10801:94;;-1:-1:-1;;10922:1:11;10911:13;;10577:353;-1:-1:-1;10577:353:11:o;10935:283::-;11092:3;11123:29;11148:3;11140:6;11123:29;:::i;:::-;11161:21;;;-1:-1:-1;;11209:2:11;11198:14;;10935:283;-1:-1:-1;10935:283:11:o;11511:189::-;11640:3;11665:29;11690:3;11682:6;11665:29;:::i;11705:885::-;11800:6;11831:2;11874;11862:9;11853:7;11849:23;11845:32;11842:52;;;11890:1;11887;11880:12;11842:52;11923:9;11917:16;11956:18;11948:6;11945:30;11942:50;;;11988:1;11985;11978:12;11942:50;12011:22;;12064:4;12056:13;;12052:27;-1:-1:-1;12042:55:11;;12093:1;12090;12083:12;12042:55;12122:2;12116:9;12145:64;12161:47;12205:2;12161:47;:::i;12145:64::-;12243:15;;;12325:1;12321:10;;;;12313:19;;12309:28;;;12274:12;;;;12349:19;;;12346:39;;;12381:1;12378;12371:12;12346:39;12405:11;;;;12425:135;12441:6;12436:3;12433:15;12425:135;;;12507:10;;12495:23;;12458:12;;;;12538;;;;12425:135;;;12579:5;11705:885;-1:-1:-1;;;;;;;11705:885:11:o
Swarm Source
ipfs://0728cc42a108e00212b7e12709f487f7a68ede79a8db017f0492a34aea3a4a56
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.