Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00Multichain Info
N/A
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 2 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
13096629 | 34 hrs ago | Contract Creation | 0 ETH | |||
13096629 | 34 hrs ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MorphoVaultV1AdapterFactory
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 100000 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-2.0-or-later // Copyright (c) 2025 Morpho Association pragma solidity 0.8.28; import {MorphoVaultV1Adapter} from "./MorphoVaultV1Adapter.sol"; import {IMorphoVaultV1AdapterFactory} from "./interfaces/IMorphoVaultV1AdapterFactory.sol"; contract MorphoVaultV1AdapterFactory is IMorphoVaultV1AdapterFactory { /* STORAGE */ mapping(address parentVault => mapping(address morphoVaultV1 => address)) public morphoVaultV1Adapter; mapping(address account => bool) public isMorphoVaultV1Adapter; /* FUNCTIONS */ /// @dev Returns the address of the deployed MorphoVaultV1Adapter. function createMorphoVaultV1Adapter(address parentVault, address morphoVaultV1) external returns (address) { address _morphoVaultV1Adapter = address(new MorphoVaultV1Adapter{salt: bytes32(0)}(parentVault, morphoVaultV1)); morphoVaultV1Adapter[parentVault][morphoVaultV1] = _morphoVaultV1Adapter; isMorphoVaultV1Adapter[_morphoVaultV1Adapter] = true; emit CreateMorphoVaultV1Adapter(parentVault, morphoVaultV1, _morphoVaultV1Adapter); return _morphoVaultV1Adapter; } }
// SPDX-License-Identifier: GPL-2.0-or-later // Copyright (c) 2025 Morpho Association pragma solidity 0.8.28; import {IVaultV2} from "../interfaces/IVaultV2.sol"; import {IERC4626} from "../interfaces/IERC4626.sol"; import {IERC20} from "../interfaces/IERC20.sol"; import {IMorphoVaultV1Adapter} from "./interfaces/IMorphoVaultV1Adapter.sol"; import {SafeERC20Lib} from "../libraries/SafeERC20Lib.sol"; /// @dev Designed, developed and audited for Morpho Vaults v1 (v1.0 and v1.1) (also known as MetaMorpho). Integration /// with other vaults must be carefully assessed from a security standpoint. /// @dev This adapter must be used with Morpho Vaults v1 that are protected against inflation attacks with an initial /// deposit. See https://docs.openzeppelin.com/contracts/5.x/erc4626#inflation-attack. /// @dev Must not be used with a Morpho Vault v1 which has a market with an Irm that can re-enter the parent vault or /// the adapter. /// @dev Morpho Vaults v1.1 do not realize bad debt, so Morpho Vaults v2 supplying in them will not realize the /// corresponding bad debt. /// @dev Losses that correspond to rounding errors are realizable. /// @dev Shares of the Morpho Vault v1 cannot be skimmed (unlike any other token). /// @dev If expectedSupplyAssets reverts for a market of the morphoVaultV1, realAssets will revert and the vault will /// not be able to accrueInterest. /// @dev Shouldn't be used alongside another adapter that re-uses the id (abi.encode("this", address(this)). contract MorphoVaultV1Adapter is IMorphoVaultV1Adapter { /* IMMUTABLES */ address public immutable factory; address public immutable parentVault; address public immutable morphoVaultV1; bytes32 public immutable adapterId; /* STORAGE */ address public skimRecipient; /* FUNCTIONS */ constructor(address _parentVault, address _morphoVaultV1) { factory = msg.sender; parentVault = _parentVault; morphoVaultV1 = _morphoVaultV1; adapterId = keccak256(abi.encode("this", address(this))); address asset = IVaultV2(_parentVault).asset(); require(asset == IERC4626(_morphoVaultV1).asset(), AssetMismatch()); SafeERC20Lib.safeApprove(asset, _parentVault, type(uint256).max); SafeERC20Lib.safeApprove(asset, _morphoVaultV1, type(uint256).max); } function setSkimRecipient(address newSkimRecipient) external { require(msg.sender == IVaultV2(parentVault).owner(), NotAuthorized()); skimRecipient = newSkimRecipient; emit SetSkimRecipient(newSkimRecipient); } /// @dev Skims the adapter's balance of `token` and sends it to `skimRecipient`. /// @dev This is useful to handle rewards that the adapter has earned. function skim(address token) external { require(msg.sender == skimRecipient, NotAuthorized()); require(token != morphoVaultV1, CannotSkimMorphoVaultV1Shares()); uint256 balance = IERC20(token).balanceOf(address(this)); SafeERC20Lib.safeTransfer(token, skimRecipient, balance); emit Skim(token, balance); } /// @dev Does not log anything because the ids (logged in the parent vault) are enough. /// @dev Returns the ids of the allocation and the change in allocation. function allocate(bytes memory data, uint256 assets, bytes4, address) external returns (bytes32[] memory, int256) { require(data.length == 0, InvalidData()); require(msg.sender == parentVault, NotAuthorized()); if (assets > 0) IERC4626(morphoVaultV1).deposit(assets, address(this)); uint256 oldAllocation = allocation(); uint256 newAllocation = IERC4626(morphoVaultV1).previewRedeem(IERC4626(morphoVaultV1).balanceOf(address(this))); // Safe casts because Market v1 bounds the total supply of the underlying token, and allocation is less than the // max total assets of the vault. return (ids(), int256(newAllocation) - int256(oldAllocation)); } /// @dev Does not log anything because the ids (logged in the parent vault) are enough. /// @dev Returns the ids of the deallocation and the change in allocation. function deallocate(bytes memory data, uint256 assets, bytes4, address) external returns (bytes32[] memory, int256) { require(data.length == 0, InvalidData()); require(msg.sender == parentVault, NotAuthorized()); if (assets > 0) IERC4626(morphoVaultV1).withdraw(assets, address(this), address(this)); uint256 oldAllocation = allocation(); uint256 newAllocation = IERC4626(morphoVaultV1).previewRedeem(IERC4626(morphoVaultV1).balanceOf(address(this))); // Safe casts because Market v1 bounds the total supply of the underlying token, and allocation is less than the // max total assets of the vault. return (ids(), int256(newAllocation) - int256(oldAllocation)); } /// @dev Returns adapter's ids. function ids() public view returns (bytes32[] memory) { bytes32[] memory ids_ = new bytes32[](1); ids_[0] = adapterId; return ids_; } function allocation() public view returns (uint256) { return IVaultV2(parentVault).allocation(adapterId); } function realAssets() external view returns (uint256) { return allocation() != 0 ? IERC4626(morphoVaultV1).previewRedeem(IERC4626(morphoVaultV1).balanceOf(address(this))) : 0; } }
// SPDX-License-Identifier: GPL-2.0-or-later // Copyright (c) 2025 Morpho Association pragma solidity >=0.5.0; interface IMorphoVaultV1AdapterFactory { /* EVENTS */ event CreateMorphoVaultV1Adapter( address indexed parentVault, address indexed morphoVaultV1, address indexed morphoVaultV1Adapter ); /* FUNCTIONS */ function morphoVaultV1Adapter(address parentVault, address morphoVaultV1) external view returns (address); function isMorphoVaultV1Adapter(address account) external view returns (bool); function createMorphoVaultV1Adapter(address parentVault, address morphoVaultV1) external returns (address morphoVaultV1Adapter); }
// SPDX-License-Identifier: GPL-2.0-or-later // Copyright (c) 2025 Morpho Association pragma solidity >=0.5.0; import {IERC20} from "./IERC20.sol"; import {IERC4626} from "./IERC4626.sol"; import {IERC2612} from "./IERC2612.sol"; struct Caps { uint256 allocation; uint128 absoluteCap; uint128 relativeCap; } interface IVaultV2 is IERC4626, IERC2612 { // State variables function virtualShares() external view returns (uint256); function owner() external view returns (address); function curator() external view returns (address); function receiveSharesGate() external view returns (address); function sendSharesGate() external view returns (address); function receiveAssetsGate() external view returns (address); function sendAssetsGate() external view returns (address); function adapterRegistry() external view returns (address); function isSentinel(address account) external view returns (bool); function isAllocator(address account) external view returns (bool); function firstTotalAssets() external view returns (uint256); function _totalAssets() external view returns (uint128); function lastUpdate() external view returns (uint64); function maxRate() external view returns (uint64); function adapters(uint256 index) external view returns (address); function adaptersLength() external view returns (uint256); function isAdapter(address account) external view returns (bool); function allocation(bytes32 id) external view returns (uint256); function absoluteCap(bytes32 id) external view returns (uint256); function relativeCap(bytes32 id) external view returns (uint256); function forceDeallocatePenalty(address adapter) external view returns (uint256); function liquidityAdapter() external view returns (address); function liquidityData() external view returns (bytes memory); function timelock(bytes4 selector) external view returns (uint256); function abdicated(bytes4 selector) external view returns (bool); function executableAt(bytes memory data) external view returns (uint256); function performanceFee() external view returns (uint96); function performanceFeeRecipient() external view returns (address); function managementFee() external view returns (uint96); function managementFeeRecipient() external view returns (address); // Gating function canSendShares(address account) external view returns (bool); function canReceiveShares(address account) external view returns (bool); function canSendAssets(address account) external view returns (bool); function canReceiveAssets(address account) external view returns (bool); // Multicall function multicall(bytes[] memory data) external; // Owner functions function setOwner(address newOwner) external; function setCurator(address newCurator) external; function setIsSentinel(address account, bool isSentinel) external; function setName(string memory newName) external; function setSymbol(string memory newSymbol) external; // Timelocks for curator functions function submit(bytes memory data) external; function revoke(bytes memory data) external; // Curator functions function setIsAllocator(address account, bool newIsAllocator) external; function setReceiveSharesGate(address newReceiveSharesGate) external; function setSendSharesGate(address newSendSharesGate) external; function setReceiveAssetsGate(address newReceiveAssetsGate) external; function setSendAssetsGate(address newSendAssetsGate) external; function setAdapterRegistry(address newAdapterRegistry) external; function addAdapter(address account) external; function removeAdapter(address account) external; function increaseTimelock(bytes4 selector, uint256 newDuration) external; function decreaseTimelock(bytes4 selector, uint256 newDuration) external; function abdicate(bytes4 selector) external; function setPerformanceFee(uint256 newPerformanceFee) external; function setManagementFee(uint256 newManagementFee) external; function setPerformanceFeeRecipient(address newPerformanceFeeRecipient) external; function setManagementFeeRecipient(address newManagementFeeRecipient) external; function increaseAbsoluteCap(bytes memory idData, uint256 newAbsoluteCap) external; function decreaseAbsoluteCap(bytes memory idData, uint256 newAbsoluteCap) external; function increaseRelativeCap(bytes memory idData, uint256 newRelativeCap) external; function decreaseRelativeCap(bytes memory idData, uint256 newRelativeCap) external; function setMaxRate(uint256 newMaxRate) external; function setForceDeallocatePenalty(address adapter, uint256 newForceDeallocatePenalty) external; // Allocator functions function allocate(address adapter, bytes memory data, uint256 assets) external; function deallocate(address adapter, bytes memory data, uint256 assets) external; function setLiquidityAdapterAndData(address newLiquidityAdapter, bytes memory newLiquidityData) external; // Exchange rate function accrueInterest() external; function accrueInterestView() external view returns (uint256 newTotalAssets, uint256 performanceFeeShares, uint256 managementFeeShares); // Force deallocate function forceDeallocate(address adapter, bytes memory data, uint256 assets, address onBehalf) external returns (uint256 penaltyShares); }
// SPDX-License-Identifier: GPL-2.0-or-later // Copyright (c) 2025 Morpho Association pragma solidity >=0.5.0; import {IERC20} from "./IERC20.sol"; interface IERC4626 is IERC20 { function asset() external view returns (address); function totalAssets() external view returns (uint256); function convertToAssets(uint256 shares) external view returns (uint256 assets); function convertToShares(uint256 assets) external view returns (uint256 shares); function deposit(uint256 assets, address onBehalf) external returns (uint256 shares); function mint(uint256 shares, address onBehalf) external returns (uint256 assets); function withdraw(uint256 assets, address onBehalf, address receiver) external returns (uint256 shares); function redeem(uint256 shares, address onBehalf, address receiver) external returns (uint256 assets); function previewDeposit(uint256 assets) external view returns (uint256 shares); function previewMint(uint256 shares) external view returns (uint256 assets); function previewWithdraw(uint256 assets) external view returns (uint256 shares); function previewRedeem(uint256 shares) external view returns (uint256 assets); function maxDeposit(address onBehalf) external view returns (uint256 assets); function maxMint(address onBehalf) external view returns (uint256 shares); function maxWithdraw(address onBehalf) external view returns (uint256 assets); function maxRedeem(address onBehalf) external view returns (uint256 shares); }
// SPDX-License-Identifier: GPL-2.0-or-later // Copyright (c) 2025 Morpho Association pragma solidity >=0.5.0; interface IERC20 { function decimals() external view returns (uint8); function name() external view returns (string memory); function symbol() external view returns (string memory); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 shares) external returns (bool success); function transferFrom(address from, address to, uint256 shares) external returns (bool success); function approve(address spender, uint256 shares) external returns (bool success); function allowance(address owner, address spender) external view returns (uint256); }
// SPDX-License-Identifier: GPL-2.0-or-later // Copyright (c) 2025 Morpho Association pragma solidity >= 0.5.0; import {IAdapter} from "../../interfaces/IAdapter.sol"; interface IMorphoVaultV1Adapter is IAdapter { /* EVENTS */ event SetSkimRecipient(address indexed newSkimRecipient); event Skim(address indexed token, uint256 assets); /* ERRORS */ error AssetMismatch(); error CannotSkimMorphoVaultV1Shares(); error InvalidData(); error NotAuthorized(); /* FUNCTIONS */ function factory() external view returns (address); function parentVault() external view returns (address); function morphoVaultV1() external view returns (address); function adapterId() external view returns (bytes32); function skimRecipient() external view returns (address); function allocation() external view returns (uint256); function ids() external view returns (bytes32[] memory); function setSkimRecipient(address newSkimRecipient) external; function skim(address token) external; }
// SPDX-License-Identifier: GPL-2.0-or-later // Copyright (c) 2025 Morpho Association pragma solidity ^0.8.0; import {IERC20} from "../interfaces/IERC20.sol"; import {ErrorsLib} from "./ErrorsLib.sol"; library SafeERC20Lib { function safeTransfer(address token, address to, uint256 value) internal { require(token.code.length > 0, ErrorsLib.NoCode()); (bool success, bytes memory returndata) = token.call(abi.encodeCall(IERC20.transfer, (to, value))); require(success, ErrorsLib.TransferReverted()); require(returndata.length == 0 || abi.decode(returndata, (bool)), ErrorsLib.TransferReturnedFalse()); } function safeTransferFrom(address token, address from, address to, uint256 value) internal { require(token.code.length > 0, ErrorsLib.NoCode()); (bool success, bytes memory returndata) = token.call(abi.encodeCall(IERC20.transferFrom, (from, to, value))); require(success, ErrorsLib.TransferFromReverted()); require(returndata.length == 0 || abi.decode(returndata, (bool)), ErrorsLib.TransferFromReturnedFalse()); } function safeApprove(address token, address spender, uint256 value) internal { require(token.code.length > 0, ErrorsLib.NoCode()); (bool success, bytes memory returndata) = token.call(abi.encodeCall(IERC20.approve, (spender, value))); require(success, ErrorsLib.ApproveReverted()); require(returndata.length == 0 || abi.decode(returndata, (bool)), ErrorsLib.ApproveReturnedFalse()); } }
// SPDX-License-Identifier: GPL-2.0-or-later // Copyright (c) 2025 Morpho Association pragma solidity >=0.5.0; interface IERC2612 { function permit(address owner, address spender, uint256 shares, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; function nonces(address owner) external view returns (uint256); function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: GPL-2.0-or-later // Copyright (c) 2025 Morpho Association pragma solidity >=0.5.0; /// @dev See VaultV2 NatSpec comments for more details on adapter's spec. interface IAdapter { /// @dev Returns the market' ids and the change in assets on this market. function allocate(bytes memory data, uint256 assets, bytes4 selector, address sender) external returns (bytes32[] memory ids, int256 change); /// @dev Returns the market' ids and the change in assets on this market. function deallocate(bytes memory data, uint256 assets, bytes4 selector, address sender) external returns (bytes32[] memory ids, int256 change); /// @dev Returns the current value of the investments of the adapter (in underlying asset). function realAssets() external view returns (uint256 assets); }
// SPDX-License-Identifier: GPL-2.0-or-later // Copyright (c) 2025 Morpho Association pragma solidity ^0.8.0; library ErrorsLib { error Abdicated(); error AbsoluteCapExceeded(); error AbsoluteCapNotDecreasing(); error AbsoluteCapNotIncreasing(); error ApproveReturnedFalse(); error ApproveReverted(); error CannotReceiveShares(); error CannotReceiveAssets(); error CannotSendShares(); error CannotSendAssets(); error CapExceeded(); error CastOverflow(); error DataAlreadyPending(); error DataNotTimelocked(); error FeeInvariantBroken(); error FeeTooHigh(); error InvalidSigner(); error MaxRateTooHigh(); error NoCode(); error NotAdapter(); error NotInAdapterRegistry(); error PenaltyTooHigh(); error PermitDeadlineExpired(); error RelativeCapAboveOne(); error RelativeCapExceeded(); error RelativeCapNotDecreasing(); error RelativeCapNotIncreasing(); error AutomaticallyTimelocked(); error TimelockNotDecreasing(); error TimelockNotExpired(); error TimelockNotIncreasing(); error TransferFromReturnedFalse(); error TransferFromReverted(); error TransferReturnedFalse(); error TransferReverted(); error Unauthorized(); error ZeroAbsoluteCap(); error ZeroAddress(); error ZeroAllocation(); }
{ "remappings": [ "solmate/=lib/bundler3/lib/permit2/lib/solmate/", "@openzeppelin/contracts/=lib/metamorpho-1.1/lib/openzeppelin-contracts/contracts/", "bundler3/=lib/bundler3/", "ds-test/=lib/metamorpho-1.1/lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/metamorpho-1.1/lib/erc4626-tests/", "forge-gas-snapshot/=lib/bundler3/lib/permit2/lib/forge-gas-snapshot/src/", "forge-std/=lib/forge-std/src/", "halmos-cheatcodes/=lib/morpho-blue/lib/halmos-cheatcodes/src/", "metamorpho-1.1/=lib/metamorpho-1.1/", "metamorpho-v1.1/=lib/vault-v2/lib/metamorpho-v1.1/", "metamorpho/=lib/vault-v2/lib/metamorpho/", "morpho-blue-irm/=lib/morpho-blue-irm/src/", "morpho-blue-oracles/=lib/morpho-blue-oracles/src/", "morpho-blue/=lib/morpho-blue/", "murky/=lib/universal-rewards-distributor/lib/murky/src/", "openzeppelin-contracts/=lib/metamorpho-1.1/lib/openzeppelin-contracts/", "openzeppelin/=lib/universal-rewards-distributor/lib/openzeppelin-contracts/contracts/", "permit2/=lib/bundler3/lib/permit2/", "pre-liquidation/=lib/pre-liquidation/src/", "public-allocator/=lib/public-allocator/src/", "safe-smart-account/=lib/safe-smart-account/", "universal-rewards-distributor/=lib/universal-rewards-distributor/src/", "vault-v2-adapter-registries/=lib/vault-v2-adapter-registries/src/", "vault-v2/=lib/vault-v2/" ], "optimizer": { "enabled": true, "runs": 100000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "none", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "cancun", "viaIR": true }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"parentVault","type":"address"},{"indexed":true,"internalType":"address","name":"morphoVaultV1","type":"address"},{"indexed":true,"internalType":"address","name":"morphoVaultV1Adapter","type":"address"}],"name":"CreateMorphoVaultV1Adapter","type":"event"},{"inputs":[{"internalType":"address","name":"parentVault","type":"address"},{"internalType":"address","name":"morphoVaultV1","type":"address"}],"name":"createMorphoVaultV1Adapter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMorphoVaultV1Adapter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"parentVault","type":"address"},{"internalType":"address","name":"morphoVaultV1","type":"address"}],"name":"morphoVaultV1Adapter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080806040523460155761168f908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081632c7756651461026757508063760c79d2146101c65763e9752c691461003d575f80fd5b346101c25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c2576100746102cb565b61007c6102ee565b604051611371908181019381851067ffffffffffffffff861117610195578173ffffffffffffffffffffffffffffffffffffffff806040935f9661031285391695868852169586602082015203019082f591821561018a5773ffffffffffffffffffffffffffffffffffffffff602093168091835f525f855260405f20815f52855260405f20827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055815f526001855260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055604051937f2621b71f5d8a3bc363b4162b5e19dcabcba43cfefb95daeda63ba18a54572bc65f80a48152f35b6040513d5f823e3d90fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80fd5b346101c25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c2576101fd6102cb565b73ffffffffffffffffffffffffffffffffffffffff61021a6102ee565b91165f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b346101c25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c25760209073ffffffffffffffffffffffffffffffffffffffff6102b66102cb565b165f526001825260ff60405f20541615158152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101c257565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101c25756fe61010080604052346101c85760408161137180380380916100208285610219565b8339810103126101c85761003f602061003883610250565b9201610250565b336080528160a0528060c05260405160208101906040825260046060820152637468697360e01b60808201523060408201526080815261008060a082610219565b51902060e0526040516338d52e0f60e01b81526020816004816001600160a01b0387165afa9081156101d4575f916101df575b506040516338d52e0f60e01b81526020816004816001600160a01b0387165afa9081156101d4575f91610196575b506001600160a01b0390811690821603610187576101026101079382610264565b610264565b60405161101b90816103568239608051816101ad015260a0518181816106ee01528181610a1201528181610b5301528181610c640152610f37015260c05181818161013f01528181610256015281816105a10152818161073a015281816108c40152610bd7015260e05181818161052c01528181610ef60152610fbd0152f35b6341e0808560e11b5f5260045ffd5b90506020813d6020116101cc575b816101b160209383610219565b810103126101c8576101c290610250565b5f6100e1565b5f80fd5b3d91506101a4565b6040513d5f823e3d90fd5b90506020813d602011610211575b816101fa60209383610219565b810103126101c85761020b90610250565b5f6100b3565b3d91506101ed565b601f909101601f19168101906001600160401b0382119082101761023c57604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101c857565b90813b15610346575f91829182604051602081019263095ea7b360e01b845260018060a01b0316602482015281196044820152604481526102a6606482610219565b51925af13d1561033e573d906001600160401b03821161023c57604051916102d8601f8201601f191660200184610219565b82523d5f602084013e5b1561032f57805190811591821561030c575b5050156102fd57565b631f55ddd960e21b5f5260045ffd5b81925090602091810103126101c8576020015180151581036101c8575f806102f4565b637cceae2560e01b5f5260045ffd5b6060906102e2565b633c11a9c560e21b5f5260045ffdfe6080806040526004361015610012575f80fd5b5f3560e01c9081630fe3653614610c1c575080631eadd77814610b265780632b30997b14610998578063388af5b5146109485780634e45f1ff146106c157806356c075731461054f5780635fb86b01146104f757806388a17bde146104b7578063bc25cf77146101d1578063c45a015514610163578063e4baaddf146100f55763e7657e15146100a0575f80fd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f1576100ed6100d9610f99565b604051918291602083526020830190610e2b565b0390f35b5f80fd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157610208610d30565b73ffffffffffffffffffffffffffffffffffffffff5f541680330361048f5773ffffffffffffffffffffffffffffffffffffffff82169173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016831461046757604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481875afa92831561045c575f93610428575b50813b15610400575f9182918260405160208101927fa9059cbb000000000000000000000000000000000000000000000000000000008452602482015286604482015260448152610312606482610c88565b51925af13d156103f8573d9061032782610cf6565b916103356040519384610c88565b82523d5f602084013e5b156103d05780519081159182156103ad575b5050156103855760207f5e99aaf6d3588fb2497fde044168e8c046704a3223559cfe107f8f94b42cefdd91604051908152a2005b7f2f0470fc000000000000000000000000000000000000000000000000000000005f5260045ffd5b81925090602091810103126100f1576020015180151581036100f1578380610351565b7face2a47e000000000000000000000000000000000000000000000000000000005f5260045ffd5b60609061033f565b7ff046a714000000000000000000000000000000000000000000000000000000005f5260045ffd5b9092506020813d602011610454575b8161044460209383610c88565b810103126100f1575191846102c0565b3d9150610437565b6040513d5f823e3d90fd5b7fd60904b7000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fea8e4eb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f15760206104ef610ece565b604051908152f35b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157610585610ece565b156106b95773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481855afa801561045c575f90610686575b602091506024604051809481937f4cdad50600000000000000000000000000000000000000000000000000000000835260048301525afa801561045c575f90610653575b60209150604051908152f35b506020813d60201161067e575b8161066d60209383610c88565b810103126100f15760209051610647565b3d9150610660565b506020813d6020116106b1575b816106a060209383610c88565b810103126100f15760209051610603565b3d9150610693565b60205f6104ef565b346100f1576106cf36610d53565b505090516109205773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361048f578061086e575b50610723610ece565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481865afa801561045c575f9061083b575b602091506024604051809581937f4cdad50600000000000000000000000000000000000000000000000000000000835260048301525afa91821561045c575f92610805575b506107f5906107ef610f99565b92610e89565b906100ed60405192839283610e5e565b9091506020813d602011610833575b8161082160209383610c88565b810103126100f15751906107f56107e2565b3d9150610814565b506020813d602011610866575b8161085560209383610c88565b810103126100f1576020905161079d565b3d9150610848565b604051907fb460af9400000000000000000000000000000000000000000000000000000000825260048201523060248201523060448201526020816064815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1801561045c571561071a576109129060203d602011610919575b61090a8183610c88565b810190610e7a565b508061071a565b503d610900565b7f5cb045db000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157602073ffffffffffffffffffffffffffffffffffffffff5f5416604051908152f35b346100f15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f1576109cf610d30565b6040517f8da5cb5b00000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa801561045c575f90610ac3575b73ffffffffffffffffffffffffffffffffffffffff915016330361048f5773ffffffffffffffffffffffffffffffffffffffff16807fffffffffffffffffffffffff00000000000000000000000000000000000000005f5416175f557f2e7908865670e21b9779422cadf5f1cba271a62bb95c71eaaf615c0a1c48ebee5f80a2005b506020813d602011610b1e575b81610add60209383610c88565b810103126100f1575173ffffffffffffffffffffffffffffffffffffffff811681036100f15773ffffffffffffffffffffffffffffffffffffffff90610a41565b3d9150610ad0565b346100f157610b3436610d53565b505090516109205773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361048f5780610b875750610723610ece565b604051907f6e553f6500000000000000000000000000000000000000000000000000000000825260048201523060248201526020816044815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1801561045c571561071a576109129060203d6020116109195761090a8183610c88565b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f15760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610cc957604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff8111610cc957601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100f157565b60807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126100f15760043567ffffffffffffffff81116100f157816023820112156100f157806004013590610da982610cf6565b92610db76040519485610c88565b828452602483830101116100f157815f92602460209301838601378301015290602435906044357fffffffff00000000000000000000000000000000000000000000000000000000811681036100f1579060643573ffffffffffffffffffffffffffffffffffffffff811681036100f15790565b90602080835192838152019201905f5b818110610e485750505090565b8251845260209384019390920191600101610e3b565b929190610e75602091604086526040860190610e2b565b930152565b908160209103126100f1575190565b81810392915f138015828513169184121617610ea157565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6040517fc69507dd0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561045c575f91610f6a575090565b90506020813d602011610f91575b81610f8560209383610c88565b810103126100f1575190565b3d9150610f78565b604051610fa7604082610c88565b60018152602080820190368237815115610fe1577f0000000000000000000000000000000000000000000000000000000000000000905290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c634300081c000aa164736f6c634300081c000a
Deployed Bytecode
0x6080806040526004361015610012575f80fd5b5f3560e01c9081632c7756651461026757508063760c79d2146101c65763e9752c691461003d575f80fd5b346101c25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c2576100746102cb565b61007c6102ee565b604051611371908181019381851067ffffffffffffffff861117610195578173ffffffffffffffffffffffffffffffffffffffff806040935f9661031285391695868852169586602082015203019082f591821561018a5773ffffffffffffffffffffffffffffffffffffffff602093168091835f525f855260405f20815f52855260405f20827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055815f526001855260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055604051937f2621b71f5d8a3bc363b4162b5e19dcabcba43cfefb95daeda63ba18a54572bc65f80a48152f35b6040513d5f823e3d90fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80fd5b346101c25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c2576101fd6102cb565b73ffffffffffffffffffffffffffffffffffffffff61021a6102ee565b91165f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b346101c25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c25760209073ffffffffffffffffffffffffffffffffffffffff6102b66102cb565b165f526001825260ff60405f20541615158152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101c257565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101c25756fe61010080604052346101c85760408161137180380380916100208285610219565b8339810103126101c85761003f602061003883610250565b9201610250565b336080528160a0528060c05260405160208101906040825260046060820152637468697360e01b60808201523060408201526080815261008060a082610219565b51902060e0526040516338d52e0f60e01b81526020816004816001600160a01b0387165afa9081156101d4575f916101df575b506040516338d52e0f60e01b81526020816004816001600160a01b0387165afa9081156101d4575f91610196575b506001600160a01b0390811690821603610187576101026101079382610264565b610264565b60405161101b90816103568239608051816101ad015260a0518181816106ee01528181610a1201528181610b5301528181610c640152610f37015260c05181818161013f01528181610256015281816105a10152818161073a015281816108c40152610bd7015260e05181818161052c01528181610ef60152610fbd0152f35b6341e0808560e11b5f5260045ffd5b90506020813d6020116101cc575b816101b160209383610219565b810103126101c8576101c290610250565b5f6100e1565b5f80fd5b3d91506101a4565b6040513d5f823e3d90fd5b90506020813d602011610211575b816101fa60209383610219565b810103126101c85761020b90610250565b5f6100b3565b3d91506101ed565b601f909101601f19168101906001600160401b0382119082101761023c57604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101c857565b90813b15610346575f91829182604051602081019263095ea7b360e01b845260018060a01b0316602482015281196044820152604481526102a6606482610219565b51925af13d1561033e573d906001600160401b03821161023c57604051916102d8601f8201601f191660200184610219565b82523d5f602084013e5b1561032f57805190811591821561030c575b5050156102fd57565b631f55ddd960e21b5f5260045ffd5b81925090602091810103126101c8576020015180151581036101c8575f806102f4565b637cceae2560e01b5f5260045ffd5b6060906102e2565b633c11a9c560e21b5f5260045ffdfe6080806040526004361015610012575f80fd5b5f3560e01c9081630fe3653614610c1c575080631eadd77814610b265780632b30997b14610998578063388af5b5146109485780634e45f1ff146106c157806356c075731461054f5780635fb86b01146104f757806388a17bde146104b7578063bc25cf77146101d1578063c45a015514610163578063e4baaddf146100f55763e7657e15146100a0575f80fd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f1576100ed6100d9610f99565b604051918291602083526020830190610e2b565b0390f35b5f80fd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157610208610d30565b73ffffffffffffffffffffffffffffffffffffffff5f541680330361048f5773ffffffffffffffffffffffffffffffffffffffff82169173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016831461046757604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481875afa92831561045c575f93610428575b50813b15610400575f9182918260405160208101927fa9059cbb000000000000000000000000000000000000000000000000000000008452602482015286604482015260448152610312606482610c88565b51925af13d156103f8573d9061032782610cf6565b916103356040519384610c88565b82523d5f602084013e5b156103d05780519081159182156103ad575b5050156103855760207f5e99aaf6d3588fb2497fde044168e8c046704a3223559cfe107f8f94b42cefdd91604051908152a2005b7f2f0470fc000000000000000000000000000000000000000000000000000000005f5260045ffd5b81925090602091810103126100f1576020015180151581036100f1578380610351565b7face2a47e000000000000000000000000000000000000000000000000000000005f5260045ffd5b60609061033f565b7ff046a714000000000000000000000000000000000000000000000000000000005f5260045ffd5b9092506020813d602011610454575b8161044460209383610c88565b810103126100f1575191846102c0565b3d9150610437565b6040513d5f823e3d90fd5b7fd60904b7000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fea8e4eb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f15760206104ef610ece565b604051908152f35b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157610585610ece565b156106b95773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481855afa801561045c575f90610686575b602091506024604051809481937f4cdad50600000000000000000000000000000000000000000000000000000000835260048301525afa801561045c575f90610653575b60209150604051908152f35b506020813d60201161067e575b8161066d60209383610c88565b810103126100f15760209051610647565b3d9150610660565b506020813d6020116106b1575b816106a060209383610c88565b810103126100f15760209051610603565b3d9150610693565b60205f6104ef565b346100f1576106cf36610d53565b505090516109205773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361048f578061086e575b50610723610ece565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481865afa801561045c575f9061083b575b602091506024604051809581937f4cdad50600000000000000000000000000000000000000000000000000000000835260048301525afa91821561045c575f92610805575b506107f5906107ef610f99565b92610e89565b906100ed60405192839283610e5e565b9091506020813d602011610833575b8161082160209383610c88565b810103126100f15751906107f56107e2565b3d9150610814565b506020813d602011610866575b8161085560209383610c88565b810103126100f1576020905161079d565b3d9150610848565b604051907fb460af9400000000000000000000000000000000000000000000000000000000825260048201523060248201523060448201526020816064815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1801561045c571561071a576109129060203d602011610919575b61090a8183610c88565b810190610e7a565b508061071a565b503d610900565b7f5cb045db000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157602073ffffffffffffffffffffffffffffffffffffffff5f5416604051908152f35b346100f15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f1576109cf610d30565b6040517f8da5cb5b00000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa801561045c575f90610ac3575b73ffffffffffffffffffffffffffffffffffffffff915016330361048f5773ffffffffffffffffffffffffffffffffffffffff16807fffffffffffffffffffffffff00000000000000000000000000000000000000005f5416175f557f2e7908865670e21b9779422cadf5f1cba271a62bb95c71eaaf615c0a1c48ebee5f80a2005b506020813d602011610b1e575b81610add60209383610c88565b810103126100f1575173ffffffffffffffffffffffffffffffffffffffff811681036100f15773ffffffffffffffffffffffffffffffffffffffff90610a41565b3d9150610ad0565b346100f157610b3436610d53565b505090516109205773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361048f5780610b875750610723610ece565b604051907f6e553f6500000000000000000000000000000000000000000000000000000000825260048201523060248201526020816044815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1801561045c571561071a576109129060203d6020116109195761090a8183610c88565b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f15760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610cc957604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff8111610cc957601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100f157565b60807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126100f15760043567ffffffffffffffff81116100f157816023820112156100f157806004013590610da982610cf6565b92610db76040519485610c88565b828452602483830101116100f157815f92602460209301838601378301015290602435906044357fffffffff00000000000000000000000000000000000000000000000000000000811681036100f1579060643573ffffffffffffffffffffffffffffffffffffffff811681036100f15790565b90602080835192838152019201905f5b818110610e485750505090565b8251845260209384019390920191600101610e3b565b929190610e75602091604086526040860190610e2b565b930152565b908160209103126100f1575190565b81810392915f138015828513169184121617610ea157565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6040517fc69507dd0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561045c575f91610f6a575090565b90506020813d602011610f91575b81610f8560209383610c88565b810103126100f1575190565b3d9150610f78565b604051610fa7604082610c88565b60018152602080820190368237815115610fe1577f0000000000000000000000000000000000000000000000000000000000000000905290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c634300081c000aa164736f6c634300081c000a
Loading...
Loading
Loading...
Loading

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