ETH Price: $2,210.07 (-9.00%)
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Set Approval For...1117577252023-11-04 16:10:27820 days ago1699114227IN
0x00CB5378...D0Be926cB
0 ETH0.000056984690.00853017
Transfer From1087777992023-08-27 16:39:35889 days ago1693154375IN
0x00CB5378...D0Be926cB
0 ETH0.0000326805960.00000005
Create Vault1072667372023-07-23 17:10:51924 days ago1690132251IN
0x00CB5378...D0Be926cB
0 ETH0.0000684947510.0000005
Create Vault1067271582023-07-11 5:24:53937 days ago1689053093IN
0x00CB5378...D0Be926cB
0 ETH0.000021075980.00000005
Create Vault1066691992023-07-09 21:12:55938 days ago1688937175IN
0x00CB5378...D0Be926cB
0 ETH0.0000245510030.0001
Create Vault1066642202023-07-09 18:26:57938 days ago1688927217IN
0x00CB5378...D0Be926cB
0 ETH0.0000363216930.00000006
Create Vault1066635312023-07-09 18:03:59938 days ago1688925839IN
0x00CB5378...D0Be926cB
0 ETH0.0000306024460.00000006
Create Vault1066570162023-07-09 14:26:49938 days ago1688912809IN
0x00CB5378...D0Be926cB
0 ETH0.0000299248490.0001
Create Vault1066482442023-07-09 9:34:25938 days ago1688895265IN
0x00CB5378...D0Be926cB
0 ETH0.0000253803390.0000001
Set Approval For...1066164712023-07-08 15:55:19939 days ago1688831719IN
0x00CB5378...D0Be926cB
0 ETH0.0000331975940.00000007
Create Vault1066100242023-07-08 12:20:25939 days ago1688818825IN
0x00CB5378...D0Be926cB
0 ETH0.0000366758220.0000001
Create Vault1065889872023-07-08 0:39:11940 days ago1688776751IN
0x00CB5378...D0Be926cB
0 ETH0.0000338172830.00000025
Create Vault1065889502023-07-08 0:37:57940 days ago1688776677IN
0x00CB5378...D0Be926cB
0 ETH0.0000340474190.00000024
Create Vault1065877172023-07-07 23:56:51940 days ago1688774211IN
0x00CB5378...D0Be926cB
0 ETH0.00003581310.00000011
Create Vault1064508002023-07-04 19:52:57943 days ago1688500377IN
0x00CB5378...D0Be926cB
0 ETH0.0000884240420.0000001
Create Vault1063461702023-07-02 9:45:17945 days ago1688291117IN
0x00CB5378...D0Be926cB
0 ETH0.000024728610.0000001
Create Vault1060154662023-06-24 18:01:49953 days ago1687629709IN
0x00CB5378...D0Be926cB
0 ETH0.0000297392170.00000011
Create Vault1060153802023-06-24 17:58:57953 days ago1687629537IN
0x00CB5378...D0Be926cB
0 ETH0.0000255107560.00000012
Create Vault1056583562023-06-16 11:38:09961 days ago1686915489IN
0x00CB5378...D0Be926cB
0 ETH0.0000285476850.00000236
Create Vault1056583312023-06-16 11:37:19961 days ago1686915439IN
0x00CB5378...D0Be926cB
0 ETH0.000028437590.00000286
Create Vault1055290322023-06-13 11:47:21964 days ago1686656841IN
0x00CB5378...D0Be926cB
0 ETH0.0000324181110.00000014
Create Vault1053430592023-06-09 4:28:15969 days ago1686284895IN
0x00CB5378...D0Be926cB
0 ETH0.0000302453510.00000007
Create Vault1052646562023-06-07 8:54:49970 days ago1686128089IN
0x00CB5378...D0Be926cB
0 ETH0.0000401720270.00000007
Create Vault1046271132023-06-04 20:53:25973 days ago1685912005IN
0x00CB5378...D0Be926cB
0 ETH0.0001662236630.001
Create Vault1046270482023-06-04 20:53:10973 days ago1685911990IN
0x00CB5378...D0Be926cB
0 ETH0.0001662407630.001
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
1074332712023-07-27 13:41:59920 days ago1690465319
0x00CB5378...D0Be926cB
0 ETH
1074332522023-07-27 13:41:21920 days ago1690465281
0x00CB5378...D0Be926cB
0 ETH
1074008432023-07-26 19:41:03921 days ago1690400463
0x00CB5378...D0Be926cB
0 ETH
1074008182023-07-26 19:40:13921 days ago1690400413
0x00CB5378...D0Be926cB
0 ETH
1074008182023-07-26 19:40:13921 days ago1690400413
0x00CB5378...D0Be926cB
0 ETH
1074007822023-07-26 19:39:01921 days ago1690400341
0x00CB5378...D0Be926cB
0 ETH
1073890812023-07-26 13:08:59921 days ago1690376939
0x00CB5378...D0Be926cB
0 ETH
1073827972023-07-26 9:39:31921 days ago1690364371
0x00CB5378...D0Be926cB
0 ETH
1073826332023-07-26 9:34:03921 days ago1690364043
0x00CB5378...D0Be926cB
0 ETH
1073826332023-07-26 9:34:03921 days ago1690364043
0x00CB5378...D0Be926cB
0 ETH
1073813362023-07-26 8:50:49921 days ago1690361449
0x00CB5378...D0Be926cB
0 ETH
1073813172023-07-26 8:50:11921 days ago1690361411
0x00CB5378...D0Be926cB
0 ETH
1073813172023-07-26 8:50:11921 days ago1690361411
0x00CB5378...D0Be926cB
0 ETH
1073812952023-07-26 8:49:27921 days ago1690361367
0x00CB5378...D0Be926cB
0 ETH
1073563172023-07-25 18:56:51922 days ago1690311411
0x00CB5378...D0Be926cB
0 ETH
1073506982023-07-25 15:49:33922 days ago1690300173
0x00CB5378...D0Be926cB
0 ETH
1073506812023-07-25 15:48:59922 days ago1690300139
0x00CB5378...D0Be926cB
0 ETH
1073506812023-07-25 15:48:59922 days ago1690300139
0x00CB5378...D0Be926cB
0 ETH
1073497062023-07-25 15:16:29922 days ago1690298189
0x00CB5378...D0Be926cB
0 ETH
1073497062023-07-25 15:16:29922 days ago1690298189
0x00CB5378...D0Be926cB
0 ETH
1073497062023-07-25 15:16:29922 days ago1690298189
0x00CB5378...D0Be926cB
0 ETH
1073496982023-07-25 15:16:13922 days ago1690298173
0x00CB5378...D0Be926cB
0 ETH
1073496982023-07-25 15:16:13922 days ago1690298173
0x00CB5378...D0Be926cB
0 ETH
1073496982023-07-25 15:16:13922 days ago1690298173
0x00CB5378...D0Be926cB
0 ETH
1073003272023-07-24 11:50:31923 days ago1690199431
0x00CB5378...D0Be926cB
0 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Factory

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: BUSL-1.1
 */
pragma solidity ^0.8.13;

import { Proxy } from "./Proxy.sol";
import { IVault } from "./interfaces/IVault.sol";
import { IMainRegistry } from "./interfaces/IMainRegistry.sol";
import { IFactory } from "./interfaces/IFactory.sol";
import { ERC721 } from "../lib/solmate/src/tokens/ERC721.sol";
import { Strings } from "./utils/Strings.sol";
import { MerkleProofLib } from "./utils/MerkleProofLib.sol";
import { FactoryGuardian } from "./security/FactoryGuardian.sol";

/**
 * @title Factory.
 * @author Pragma Labs
 * @notice The Lending pool has the logic to deploy and upgrade Arcadia Vaults.
 * @dev The Factory is an ERC721 contract that maps each id to an Arcadia Vault.
 */
contract Factory is IFactory, ERC721, FactoryGuardian {
    using Strings for uint256;

    /* //////////////////////////////////////////////////////////////
                                STORAGE
    ////////////////////////////////////////////////////////////// */

    // The latest Vault version, new deployed vault use the latest version by default.
    uint16 public latestVaultVersion;
    // The baseURI of the ERC721 tokens.
    string public baseURI;
    // Array of all Arcadia Vault contract addresses.
    address[] public allVaults;

    // Map vaultVersion => flag.
    mapping(uint256 => bool) public vaultVersionBlocked;
    // Map vaultAddress => vaultIndex.
    mapping(address => uint256) public vaultIndex;
    // Map vaultVersion => versionInfo.
    mapping(uint256 => VaultVersionInfo) public vaultDetails;

    // Struct with additional information for a specific Vault version.
    struct VaultVersionInfo {
        address registry; // The contract address of the MainRegistry.
        address logic; // The contract address of the Vault logic.
        bytes32 versionRoot; // The Merkle root of the merkle tree of all the compatible vault versions.
        bytes data; // Arbitrary data, can contain instructions to execute when updating Vault to new logic.
    }

    /* //////////////////////////////////////////////////////////////
                                EVENTS
    ////////////////////////////////////////////////////////////// */

    event VaultUpgraded(address indexed vaultAddress, uint16 oldVersion, uint16 indexed newVersion);
    event VaultVersionAdded(
        uint16 indexed version, address indexed registry, address indexed logic, bytes32 versionRoot
    );
    event VaultVersionBlocked(uint16 version);

    /* //////////////////////////////////////////////////////////////
                                CONSTRUCTOR
    ////////////////////////////////////////////////////////////// */

    constructor() ERC721("Arcadia Vault", "ARCADIA") { }

    /*///////////////////////////////////////////////////////////////
                          VAULT MANAGEMENT
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Function to create a new Vault.
     * @param salt A salt to be used to generate the hash.
     * @param vaultVersion The Vault version.
     * @param baseCurrency The Base-currency in which the vault is denominated.
     * @return vault The contract address of the proxy contract of the newly deployed vault.
     * @dev Safe to cast a uint256 to a bytes32 since the space of both is 2^256.
     */
    function createVault(uint256 salt, uint16 vaultVersion, address baseCurrency)
        external
        whenCreateNotPaused
        returns (address vault)
    {
        vaultVersion = vaultVersion == 0 ? latestVaultVersion : vaultVersion;

        require(vaultVersion <= latestVaultVersion, "FTRY_CV: Unknown vault version");
        require(!vaultVersionBlocked[vaultVersion], "FTRY_CV: Vault version blocked");

        // Hash tx.origin with the user provided salt to avoid front-running vault deployment with an identical salt.
        // We use tx.origin instead of msg.sender so that deployments through a third party contract is not vulnerable to front-running.
        vault = address(new Proxy{salt: keccak256(abi.encodePacked(salt, tx.origin))}(vaultDetails[vaultVersion].logic));

        IVault(vault).initialize(msg.sender, vaultDetails[vaultVersion].registry, uint16(vaultVersion), baseCurrency);

        allVaults.push(vault);
        vaultIndex[vault] = allVaults.length;

        _mint(msg.sender, allVaults.length);

        emit VaultUpgraded(vault, 0, vaultVersion);
    }

    /**
     * @notice View function returning if an address is a vault.
     * @param vault The address to be checked.
     * @return bool Whether the address is a vault or not.
     */
    function isVault(address vault) public view returns (bool) {
        return vaultIndex[vault] > 0;
    }

    /**
     * @notice Returns the owner of a vault.
     * @param vault The Vault address.
     * @return owner_ The Vault owner.
     * @dev Function does not revert when a non-existing vault is passed, but returns zero-address as owner.
     */
    function ownerOfVault(address vault) external view returns (address owner_) {
        owner_ = _ownerOf[vaultIndex[vault]];
    }

    /**
     * @notice This function allows vault owners to upgrade the logic of the vault.
     * @param vault Vault that needs to be upgraded.
     * @param version The vaultVersion to upgrade to.
     * @param proofs The merkle proofs that prove the compatibility of the upgrade from current to new vaultVersion.
     * @dev As each vault is a proxy, the implementation of the proxy can be changed by the owner of the vault.
     * Checks are done such that only compatible versions can be upgraded to.
     * Merkle proofs and their leaves can be found on https://www.github.com/arcadia-finance.
     */
    function upgradeVaultVersion(address vault, uint16 version, bytes32[] calldata proofs) external {
        require(_ownerOf[vaultIndex[vault]] == msg.sender, "FTRY_UVV: Only Owner");
        require(!vaultVersionBlocked[version], "FTRY_UVV: Vault version blocked");
        uint256 currentVersion = IVault(vault).vaultVersion();

        bool canUpgrade = MerkleProofLib.verify(
            proofs, getVaultVersionRoot(), keccak256(abi.encodePacked(currentVersion, uint256(version)))
        );

        require(canUpgrade, "FTR_UVV: Version not allowed");

        IVault(vault).upgradeVault(
            vaultDetails[version].logic, vaultDetails[version].registry, version, vaultDetails[version].data
        );

        emit VaultUpgraded(vault, uint16(currentVersion), version);
    }

    /**
     * @notice Function to get the latest versioning root.
     * @return The latest versioning root.
     * @dev The versioning root is the root of the merkle tree of all the compatible vault versions.
     * The root is updated every time a new vault version added. The root is used to verify the
     * proofs when a vault is being upgraded.
     */
    function getVaultVersionRoot() public view returns (bytes32) {
        return vaultDetails[latestVaultVersion].versionRoot;
    }

    /**
     * @notice Function used to transfer a vault between users.
     * @param from The sender.
     * @param to The target.
     * @param vault The address of the vault that is transferred.
     * @dev This method transfers a vault not on id but on address and also transfers the vault proxy contract to the new owner.
     */
    function safeTransferFrom(address from, address to, address vault) public {
        uint256 id = vaultIndex[vault];
        IVault(allVaults[id - 1]).transferOwnership(to);
        super.safeTransferFrom(from, to, id);
    }

    /**
     * @notice Function used to transfer a vault between users.
     * @param from The sender.
     * @param to The target.
     * @param id The id of the vault that is about to be transferred.
     * @dev This method overwrites the safeTransferFrom function in ERC721.sol to also transfer the vault proxy contract to the new owner.
     */
    function safeTransferFrom(address from, address to, uint256 id) public override {
        IVault(allVaults[id - 1]).transferOwnership(to);
        super.safeTransferFrom(from, to, id);
    }

    /**
     * @notice Function used to transfer a vault between users.
     * @param from The sender.
     * @param to The target.
     * @param id The id of the vault that is about to be transferred.
     * @param data additional data, only used for onERC721Received.
     * @dev This method overwrites the safeTransferFrom function in ERC721.sol to also transfer the vault proxy contract to the new owner.
     */
    function safeTransferFrom(address from, address to, uint256 id, bytes calldata data) public override {
        IVault(allVaults[id - 1]).transferOwnership(to);
        super.safeTransferFrom(from, to, id, data);
    }

    /**
     * @notice Function used to transfer a vault between users.
     * @param from The sender.
     * @param to The target.
     * @param id The id of the vault that is about to be transferred.
     * @dev This method overwrites the safeTransferFrom function in ERC721.sol to also transfer the vault proxy contract to the new owner.
     */
    function transferFrom(address from, address to, uint256 id) public override {
        IVault(allVaults[id - 1]).transferOwnership(to);
        super.transferFrom(from, to, id);
    }

    /*///////////////////////////////////////////////////////////////
                    VAULT VERSION MANAGEMENT
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Function to set a new vault version with the contracts to be used for new deployed vaults.
     * @param registry The contract address of the Main Registry.
     * @param logic The contract address of the Vault logic.
     * @param versionRoot The Merkle root of the merkle tree of all the compatible vault versions.
     * @param data Arbitrary data, can contain instructions to execute when updating Vault to new logic.
     * @dev Changing any of the contracts does NOT change the contracts for existing deployed vaults,
     * unless the vault owner explicitly chooses to upgrade their vault to a newer version
     * If a new Main Registry contract is set, all the BaseCurrencies currently stored in the Factory
     * are checked against the new Main Registry contract. If they do not match, the function reverts.
     */
    function setNewVaultInfo(address registry, address logic, bytes32 versionRoot, bytes calldata data)
        external
        onlyOwner
    {
        require(versionRoot != bytes32(0), "FTRY_SNVI: version root is zero");
        require(logic != address(0), "FTRY_SNVI: logic address is zero");

        //If there is a new Main Registry Contract, Check that baseCurrencies in factory and main registry match.
        if (vaultDetails[latestVaultVersion].registry != registry && latestVaultVersion != 0) {
            address oldRegistry = vaultDetails[latestVaultVersion].registry;
            uint256 oldCounter = IMainRegistry(oldRegistry).baseCurrencyCounter();
            uint256 newCounter = IMainRegistry(registry).baseCurrencyCounter();
            require(oldCounter <= newCounter, "FTRY_SNVI: counter mismatch");
            for (uint256 i; i < oldCounter;) {
                require(
                    IMainRegistry(oldRegistry).baseCurrencies(i) == IMainRegistry(registry).baseCurrencies(i),
                    "FTRY_SNVI: no baseCurrency match"
                );
                unchecked {
                    ++i;
                }
            }
        }

        unchecked {
            ++latestVaultVersion;
        }

        vaultDetails[latestVaultVersion].registry = registry;
        vaultDetails[latestVaultVersion].logic = logic;
        vaultDetails[latestVaultVersion].versionRoot = versionRoot;
        vaultDetails[latestVaultVersion].data = data;

        emit VaultVersionAdded(latestVaultVersion, registry, logic, versionRoot);
    }

    /**
     * @notice Function to block a certain vault logic version from being created as a new vault.
     * @param version The vault version to be phased out.
     * @dev Should any vault logic version be phased out,
     * this function can be used to block it from being created for new vaults.
     */
    function blockVaultVersion(uint256 version) external onlyOwner {
        require(version > 0 && version <= latestVaultVersion, "FTRY_BVV: Invalid version");
        vaultVersionBlocked[version] = true;

        emit VaultVersionBlocked(uint16(version));
    }

    /*///////////////////////////////////////////////////////////////
                    VAULT LIQUIDATION LOGIC
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Function called by a Vault at the start of a liquidation to transfer ownership to the Liquidator contract.
     * @param liquidator The contract address of the liquidator.
     * @dev This transfer bypasses the standard transferFrom and safeTransferFrom from the ERC-721 standard.
     */
    function liquidate(address liquidator) external whenLiquidateNotPaused {
        require(isVault(msg.sender), "FTRY: Not a vault");

        uint256 id = vaultIndex[msg.sender];
        address from = _ownerOf[id];
        unchecked {
            _balanceOf[from]--;
            _balanceOf[liquidator]++;
        }

        _ownerOf[id] = liquidator;

        delete getApproved[id];
        emit Transfer(from, liquidator, id);
    }

    /*///////////////////////////////////////////////////////////////
                        HELPER FUNCTIONS
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Function returns the total number of vaults.
     * @return numberOfVaults The total number of vaults.
     */
    function allVaultsLength() external view returns (uint256 numberOfVaults) {
        numberOfVaults = allVaults.length;
    }

    /*///////////////////////////////////////////////////////////////
                        ERC-721 LOGIC
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Function that stores a new base URI.
     * @dev tokenURI's of Arcadia Vaults are not meant to be immutable
     * and might be updated later to allow users to
     * choose/create their own vault art,
     * as such no URI freeze is added.
     * @param newBaseURI The new base URI to store.
     */
    function setBaseURI(string calldata newBaseURI) external onlyOwner {
        baseURI = newBaseURI;
    }

    /**
     * @notice Function that returns the token URI as defined in the erc721 standard.
     * @param tokenId The id if the vault.
     * @return uri The token uri.
     */
    function tokenURI(uint256 tokenId) public view override returns (string memory uri) {
        require(_ownerOf[tokenId] != address(0), "ERC721Metadata: URI query for nonexistent token");
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

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

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;

    modifier onlyOwner() virtual {
        require(msg.sender == owner, "UNAUTHORIZED");

        _;
    }

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(address _owner) {
        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function transferOwnership(address newOwner) public virtual onlyOwner {
        owner = newOwner;

        emit OwnershipTransferred(msg.sender, newOwner);
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*//////////////////////////////////////////////////////////////
                         METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*//////////////////////////////////////////////////////////////
                      ERC721 BALANCE/OWNER STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) internal _ownerOf;

    mapping(address => uint256) internal _balanceOf;

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "ZERO_ADDRESS");

        return _balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                         ERC721 APPROVAL STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*//////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = _ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == _ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _balanceOf[from]--;

            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*//////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(_ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        emit Transfer(address(0), to, id);
    }

    function _burn(uint256 id) internal virtual {
        address owner = _ownerOf[id];

        require(owner != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            _balanceOf[owner]--;
        }

        delete _ownerOf[id];

        delete getApproved[id];

        emit Transfer(owner, address(0), id);
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}

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

/**
 * @title Proxy
 * @author Pragma Labs
 * @dev Implementation based on ERC-1967: Proxy Storage Slots
 * See https://eips.ethereum.org/EIPS/eip-1967
 */
contract Proxy {
    /**
     * @dev Storage slot with the address of the current implementation.
     * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1.
     */
    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

    struct AddressSlot {
        address value;
    }

    event Upgraded(address indexed implementation);

    constructor(address logic) payable {
        _getAddressSlot(_IMPLEMENTATION_SLOT).value = logic;
        emit Upgraded(logic);
    }

    /**
     * @dev Fallback function that delegates calls to the implementation address.
     * Will run if call data is empty.
     */
    receive() external payable virtual {
        _delegate(_getAddressSlot(_IMPLEMENTATION_SLOT).value);
    }

    /**
     * @dev Fallback function that delegates calls to the implementation address.
     * Will run if no other function in the contract matches the call data.
     */
    fallback() external payable virtual {
        _delegate(_getAddressSlot(_IMPLEMENTATION_SLOT).value);
    }

    /*///////////////////////////////////////////////////////////////
                        IMPLEMENTATION LOGIC
    ///////////////////////////////////////////////////////////////*/

    /**
     * @dev Returns an `AddressSlot` with member `value` located at `slot`.
     */
    function _getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
        assembly {
            r.slot := slot
        }
    }

    /*///////////////////////////////////////////////////////////////
                        DELEGATION LOGIC
    ///////////////////////////////////////////////////////////////*/

    /**
     * @dev Delegates the current call to `implementation`.
     * This function does not return to its internal call site, it will return directly to the external caller.
     */
    function _delegate(address implementation) internal virtual {
        assembly {
            // Copy msg.data. We take full control of memory in this inline assembly
            // block because it will not return to Solidity code. We overwrite the
            // Solidity scratch pad at memory position 0.
            calldatacopy(0, 0, calldatasize())

            // Call the implementation.
            // out and outsize are 0 because we don't know the size yet.
            let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)

            // Copy the returned data.
            returndatacopy(0, 0, returndatasize())

            switch result
            // delegatecall returns 0 on error.
            case 0 { revert(0, returndatasize()) }
            default { return(0, returndatasize()) }
        }
    }
}

/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: MIT
 */
pragma solidity ^0.8.13;

interface IFactory {
    /**
     * @notice View function returning if an address is a vault.
     * @param vault The address to be checked.
     * @return bool Whether the address is a vault or not.
     */
    function isVault(address vault) external view returns (bool);

    /**
     * @notice Function used to transfer a vault between users.
     * @dev This method transfers a vault not on id but on address and also transfers the vault proxy contract to the new owner.
     * @param from sender.
     * @param to target.
     * @param vault The address of the vault that is about to be transferred.
     */
    function safeTransferFrom(address from, address to, address vault) external;

    /**
     * @notice Function called by a Vault at the start of a liquidation to transfer ownership.
     * @param liquidator The contract address of the liquidator.
     */
    function liquidate(address liquidator) external;
}

/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: MIT
 */
pragma solidity ^0.8.13;

interface IMainRegistry {
    /**
     * @notice Returns number of baseCurrencies.
     * @return counter the number of baseCurrencies.
     */
    function baseCurrencyCounter() external view returns (uint256);

    /**
     * @notice Returns the Factory address.
     * @return factory The Factory address.
     */
    function factory() external view returns (address);

    /**
     * @notice Returns the contract of a baseCurrency.
     * @param index The index of the baseCurrency in the array baseCurrencies.
     * @return baseCurrency The baseCurrency address.
     */
    function baseCurrencies(uint256 index) external view returns (address);

    /**
     * @notice Checks if a contract is a baseCurrency.
     * @param baseCurrency The baseCurrency address.
     * @return boolean.
     */
    function isBaseCurrency(address baseCurrency) external view returns (bool);

    /**
     * @notice Checks if an action is allowed.
     * @param action The action address.
     * @return boolean.
     */
    function isActionAllowed(address action) external view returns (bool);

    /**
     * @notice Batch deposit multiple assets.
     * @param assetAddresses An array of addresses of the assets.
     * @param assetIds An array of asset ids.
     * @param amounts An array of amounts to be deposited.
     * @return assetTypes The identifiers of the types of the assets deposited.
     * 0 = ERC20
     * 1 = ERC721
     * 2 = ERC1155
     */
    function batchProcessDeposit(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata amounts
    ) external returns (uint256[] memory);

    /**
     * @notice Batch withdrawal multiple assets.
     * @param assetAddresses An array of addresses of the assets.
     * @param amounts An array of amounts to be withdrawn.
     * @return assetTypes The identifiers of the types of the assets withdrawn.
     * 0 = ERC20
     * 1 = ERC721
     * 2 = ERC1155
     */
    function batchProcessWithdrawal(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata amounts
    ) external returns (uint256[] memory);

    /**
     * @notice Calculate the total value of a list of assets denominated in a given BaseCurrency.
     * @param assetAddresses The List of token addresses of the assets.
     * @param assetIds The list of corresponding token Ids that needs to be checked.
     * @param assetAmounts The list of corresponding amounts of each Token-Id combination.
     * @param baseCurrency The contract address of the BaseCurrency.
     * @return valueInBaseCurrency The total value of the list of assets denominated in BaseCurrency.
     */
    function getTotalValue(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata assetAmounts,
        address baseCurrency
    ) external view returns (uint256);

    /**
     * @notice Calculate the collateralValue given the asset details in given baseCurrency.
     * @param assetAddresses The List of token addresses of the assets.
     * @param assetIds The list of corresponding token Ids that needs to be checked.
     * @param assetAmounts The list of corresponding amounts of each Token-Id combination.
     * @param baseCurrency An address of the BaseCurrency contract.
     * @return collateralValue Collateral value of the given assets denominated in BaseCurrency.
     */
    function getCollateralValue(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata assetAmounts,
        address baseCurrency
    ) external view returns (uint256);

    /**
     * @notice Calculate the getLiquidationValue given the asset details in given baseCurrency.
     * @param assetAddresses The List of token addresses of the assets.
     * @param assetIds The list of corresponding token Ids that needs to be checked.
     * @param assetAmounts The list of corresponding amounts of each Token-Id combination.
     * @param baseCurrency An address of the BaseCurrency contract.
     * @return liquidationValue Liquidation value of the given assets denominated in BaseCurrency.
     */
    function getLiquidationValue(
        address[] calldata assetAddresses,
        uint256[] calldata assetIds,
        uint256[] calldata assetAmounts,
        address baseCurrency
    ) external view returns (uint256);
}

/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: MIT
 */
pragma solidity ^0.8.13;

interface IVault {
    /**
     * @notice Returns the Vault version.
     * @return version The Vault version.
     */
    function vaultVersion() external view returns (uint16);

    /**
     * @notice Initiates the variables of the vault.
     * @param owner The tx.origin: the sender of the 'createVault' on the factory.
     * @param registry The 'beacon' contract to which should be looked at for external logic.
     * @param vaultVersion The version of the vault logic.
     * @param baseCurrency The Base-currency in which the vault is denominated.
     */
    function initialize(address owner, address registry, uint16 vaultVersion, address baseCurrency) external;

    /**
     * @notice Stores a new address in the EIP1967 implementation slot & updates the vault version.
     * @param newImplementation The contract with the new vault logic.
     * @param newRegistry The MainRegistry for this specific implementation (might be identical as the old registry)
     * @param data Arbitrary data, can contain instructions to execute when updating Vault to new logic
     * @param newVersion The new version of the vault logic.
     */
    function upgradeVault(address newImplementation, address newRegistry, uint16 newVersion, bytes calldata data)
        external;

    /**
     * @notice Transfers ownership of the contract to a new account.
     * @param newOwner The new owner of the Vault.
     */
    function transferOwnership(address newOwner) external;

    /**
     * @notice Function called by Liquidator to start liquidation of the Vault.
     * @param openDebt The open debt taken by `originalOwner` at moment of liquidation at trustedCreditor.
     * @return originalOwner The original owner of this vault.
     * @return baseCurrency The baseCurrency in which the vault is denominated.
     * @return trustedCreditor The account or contract that is owed the debt.
     */
    function liquidateVault(uint256 openDebt) external returns (address, address, address);
}

/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: BUSL-1.1
 */

pragma solidity ^0.8.13;

import { Owned } from "lib/solmate/src/auth/Owned.sol";

/**
 * @title Guardian
 * @author Pragma Labs
 * @notice This module provides the base logic that allows authorized accounts to trigger an emergency stop.
 */
abstract contract BaseGuardian is Owned {
    /* //////////////////////////////////////////////////////////////
                                STORAGE
    ////////////////////////////////////////////////////////////// */

    // Address of the Guardian.
    address public guardian;
    // Last timestamp an emergency stop was triggered.
    uint256 public pauseTimestamp;

    /* //////////////////////////////////////////////////////////////
                                EVENTS
    ////////////////////////////////////////////////////////////// */

    event GuardianChanged(address indexed oldGuardian, address indexed newGuardian);

    /* //////////////////////////////////////////////////////////////
                                MODIFIERS
    ////////////////////////////////////////////////////////////// */

    /**
     * @dev Throws if called by any account other than the guardian.
     */
    modifier onlyGuardian() {
        require(msg.sender == guardian, "Guardian: Only guardian");
        _;
    }

    /* //////////////////////////////////////////////////////////////
                                CONSTRUCTOR
    ////////////////////////////////////////////////////////////// */

    constructor() Owned(msg.sender) { }

    /* //////////////////////////////////////////////////////////////
                            GUARDIAN LOGIC
    ////////////////////////////////////////////////////////////// */

    /**
     * @notice This function is used to set the guardian address
     * @param guardian_ The address of the new guardian.
     * @dev Allows onlyOwner to change the guardian address.
     */
    function changeGuardian(address guardian_) external onlyOwner {
        emit GuardianChanged(guardian, guardian_);
        guardian = guardian_;
    }

    /* //////////////////////////////////////////////////////////////
                            PAUSING LOGIC
    ////////////////////////////////////////////////////////////// */

    /**
     * @notice This function is used to pause all the flags of the contract.
     * @dev This function can be called by the guardian to pause all functionality in the event of an emergency.
     * This function pauses repay, withdraw, borrow, deposit and liquidation.
     * This function can only be called by the guardian.
     * The guardian can only pause the protocol again after 32 days have past since the last pause.
     * This is to prevent that a malicious guardian can take user-funds hostage for an indefinite time.
     * @dev After the guardian has paused the protocol, the owner has 30 days to find potential problems,
     * find a solution and unpause the protocol. If the protocol is not unpaused after 30 days,
     * an emergency procedure can be started by any user to unpause the protocol.
     * All users have now at least a two-day window to withdraw assets and close positions before
     * the protocol can again be paused (after 32 days).
     */
    function pause() external virtual onlyGuardian { }

    /**
     * @notice This function is used to unPause all flags.
     * @dev If the protocol is not unpaused after 30 days, any user can unpause the protocol.
     * This ensures that no rogue owner or guardian can lock user funds for an indefinite amount of time.
     * All users have now at least a two-day window to withdraw assets and close positions before
     * the protocol can again be paused (after 32 days).
     */
    function unPause() external virtual { }
}

/**
 * Created by Pragma Labs
 * SPDX-License-Identifier: BUSL-1.1
 */

pragma solidity ^0.8.13;

import { BaseGuardian } from "./BaseGuardian.sol";

/**
 * @title Factory Guardian
 * @author Pragma Labs
 * @notice This module provides the logic for the Factory that allows authorized accounts to trigger an emergency stop.
 */
abstract contract FactoryGuardian is BaseGuardian {
    /* //////////////////////////////////////////////////////////////
                                STORAGE
    ////////////////////////////////////////////////////////////// */

    // Flag indicating if the create() function is paused.
    bool public createPaused;
    // Flag indicating if the liquidate() function is paused.
    bool public liquidatePaused;

    /* //////////////////////////////////////////////////////////////
                                EVENTS
    ////////////////////////////////////////////////////////////// */

    event PauseUpdate(bool createPauseUpdate, bool liquidatePauseUpdate);

    /*
    //////////////////////////////////////////////////////////////
                            ERRORS
    //////////////////////////////////////////////////////////////
    */

    error FunctionIsPaused();

    /*
    //////////////////////////////////////////////////////////////
                            MODIFIERS
    //////////////////////////////////////////////////////////////
    */

    /**
     * @dev This modifier is used to restrict access to certain functions when the contract is paused for create vault.
     * It throws if create vault is paused.
     */
    modifier whenCreateNotPaused() {
        if (createPaused) revert FunctionIsPaused();
        _;
    }

    /**
     * @dev This modifier is used to restrict access to certain functions when the contract is paused for liquidate vaultq.
     * It throws if liquidate vault is paused.
     */
    modifier whenLiquidateNotPaused() {
        if (liquidatePaused) revert FunctionIsPaused();
        _;
    }

    /* //////////////////////////////////////////////////////////////
                                CONSTRUCTOR
    ////////////////////////////////////////////////////////////// */

    constructor() { }

    /* //////////////////////////////////////////////////////////////
                            PAUSING LOGIC
    ////////////////////////////////////////////////////////////// */

    /**
     * @inheritdoc BaseGuardian
     */
    function pause() external override onlyGuardian {
        require(block.timestamp > pauseTimestamp + 32 days, "G_P: Cannot pause");
        createPaused = true;
        liquidatePaused = true;
        pauseTimestamp = block.timestamp;
        emit PauseUpdate(true, true);
    }

    /**
     * @notice This function is used to unpause one or more flags.
     * @param createPaused_ false when create functionality should be unPaused.
     * @param liquidatePaused_ false when liquidate functionality should be unPaused.
     * @dev This function can unPause repay, withdraw, borrow, and deposit individually.
     * @dev Can only update flags from paused (true) to unPaused (false), cannot be used the other way around
     * (to set unPaused flags to paused).
     */
    function unPause(bool createPaused_, bool liquidatePaused_) external onlyOwner {
        createPaused = createPaused && createPaused_;
        liquidatePaused = liquidatePaused && liquidatePaused_;
        emit PauseUpdate(createPaused, liquidatePaused);
    }

    /**
     * @inheritdoc BaseGuardian
     */
    function unPause() external override {
        require(block.timestamp > pauseTimestamp + 30 days, "G_UP: Cannot unPause");
        if (createPaused || liquidatePaused) {
            createPaused = false;
            liquidatePaused = false;
            emit PauseUpdate(false, false);
        }
    }
}

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

/// @notice Gas optimized verification of proof of inclusion for a leaf in a Merkle tree.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/MerkleProofLib.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/MerkleProofLib.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol)
library MerkleProofLib {
    function verify(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool isValid) {
        assembly {
            if proof.length {
                // Left shift by 5 is equivalent to multiplying by 0x20.
                let end := add(proof.offset, shl(5, proof.length))
                // Initialize `offset` to the offset of `proof` in the calldata.
                let offset := proof.offset
                // Iterate over proof elements to compute root hash.
                // prettier-ignore
                for { } 1 { } {
                    // Slot of `leaf` in scratch space.
                    // If the condition is true: 0x20, otherwise: 0x00.
                    let scratch := shl(5, gt(leaf, calldataload(offset)))
                    // Store elements to hash contiguously in scratch space.
                    // Scratch space is 64 bytes (0x00 - 0x3f) and both elements are 32 bytes.
                    mstore(scratch, leaf)
                    mstore(xor(scratch, 0x20), calldataload(offset))
                    // Reuse `leaf` to store the hash to reduce stack operations.
                    leaf := keccak256(0x00, 0x40)
                    offset := add(offset, 0x20)
                    // prettier-ignore
                    if iszero(lt(offset, end)) { break }
                }
            }
            isValid := eq(leaf, root)
        }
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.13;

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
}

Settings
{
  "remappings": [
    "arcadia-lending/=lib/arcadia-lending/",
    "ds-test/=lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "solmate/=lib/solmate/src/",
    "v2-periphery/=lib/v2-periphery/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FunctionIsPaused","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldGuardian","type":"address"},{"indexed":true,"internalType":"address","name":"newGuardian","type":"address"}],"name":"GuardianChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"createPauseUpdate","type":"bool"},{"indexed":false,"internalType":"bool","name":"liquidatePauseUpdate","type":"bool"}],"name":"PauseUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vaultAddress","type":"address"},{"indexed":false,"internalType":"uint16","name":"oldVersion","type":"uint16"},{"indexed":true,"internalType":"uint16","name":"newVersion","type":"uint16"}],"name":"VaultUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"version","type":"uint16"},{"indexed":true,"internalType":"address","name":"registry","type":"address"},{"indexed":true,"internalType":"address","name":"logic","type":"address"},{"indexed":false,"internalType":"bytes32","name":"versionRoot","type":"bytes32"}],"name":"VaultVersionAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"version","type":"uint16"}],"name":"VaultVersionBlocked","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allVaults","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allVaultsLength","outputs":[{"internalType":"uint256","name":"numberOfVaults","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"}],"name":"blockVaultVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"guardian_","type":"address"}],"name":"changeGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"uint16","name":"vaultVersion","type":"uint16"},{"internalType":"address","name":"baseCurrency","type":"address"}],"name":"createVault","outputs":[{"internalType":"address","name":"vault","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaultVersionRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"isVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestVaultVersion","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"liquidator","type":"address"}],"name":"liquidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidatePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"ownerOfVault","outputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"vault","type":"address"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registry","type":"address"},{"internalType":"address","name":"logic","type":"address"},{"internalType":"bytes32","name":"versionRoot","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setNewVaultInfo","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"createPaused_","type":"bool"},{"internalType":"bool","name":"liquidatePaused_","type":"bool"}],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"uint16","name":"version","type":"uint16"},{"internalType":"bytes32[]","name":"proofs","type":"bytes32[]"}],"name":"upgradeVaultVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaultDetails","outputs":[{"internalType":"address","name":"registry","type":"address"},{"internalType":"address","name":"logic","type":"address"},{"internalType":"bytes32","name":"versionRoot","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vaultIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaultVersionBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50336040518060400160405280600d81526020016c105c98d8591a584815985d5b1d609a1b815250604051806040016040528060078152602001664152434144494160c81b81525081600090816200006a919062000173565b50600162000079828262000173565b5050600680546001600160a01b0319166001600160a01b0384169081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200023f565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000f957607f821691505b6020821081036200011a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200016e57600081815260208120601f850160051c81016020861015620001495750805b601f850160051c820191505b818110156200016a5782815560010162000155565b5050505b505050565b81516001600160401b038111156200018f576200018f620000ce565b620001a781620001a08454620000e4565b8462000120565b602080601f831160018114620001df5760008415620001c65750858301515b600019600386901b1c1916600185901b1785556200016a565b600085815260208120601f198616915b828110156200021057888601518255948401946001909101908401620001ef565b50858210156200022f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612f77806200024f6000396000f3fe60806040523480156200001157600080fd5b5060043610620002795760003560e01c80638456cb591162000155578063bac7b49711620000c7578063f7ac64901162000086578063f7ac64901462000628578063f7b188a5146200063f578063fcfa4c071462000649578063fdd6858c146200066c578063fed69bb1146200068357600080fd5b8063bac7b49714620005a4578063c87b56dd14620005b2578063cf963aeb14620005c9578063e985e9c514620005e0578063f2fde38b146200061157600080fd5b80639b48a45911620001145780639b48a459146200053e578063a22cb4651462000555578063ac22f704146200056c578063ad84f3411462000583578063b88d4fde146200058d57600080fd5b80638456cb5914620004d65780638da5cb5b14620004e05780639094a91e14620004f457806395d89b41146200050b57806398fb7061146200051557600080fd5b806342842e0e11620001ef5780636352211e11620001ae5780636352211e1462000459578063652b9b4114620004705780636c0360eb146200049e57806370a0823114620004a857806372b5868b14620004bf57600080fd5b806342842e0e14620003db578063452a932014620003f25780634cd18577146200040657806355f804b3146200041957806357d39061146200043057600080fd5b806323b872dd116200023c57806323b872dd14620003475780632724fe09146200035e5780632d24280e146200039a5780632f86556814620003ad5780632fcb4f0414620003c457600080fd5b806301ffc9a7146200027e57806306fdde0314620002aa578063081812fc14620002c3578063095ea7b31462000308578063121369181462000321575b600080fd5b620002956200028f366004620024db565b620006a8565b60405190151581526020015b60405180910390f35b620002b4620006fc565b604051620002a1919062002556565b620002ef620002d43660046200256b565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001620002a1565b6200031f620003193660046200259b565b62000792565b005b62000295620003323660046200256b565b600c6020526000908152604090205460ff1681565b6200031f62000358366004620025ca565b6200087b565b620002ef6200036f36600462002610565b6001600160a01b039081166000908152600d6020908152604080832054835260029091529020541690565b6009546200029590610100900460ff1681565b6200031f620003be36600462002610565b62000919565b6200031f620003d536600462002610565b62000a3b565b6200031f620003ec366004620025ca565b62000ac4565b600754620002ef906001600160a01b031681565b600b545b604051908152602001620002a1565b6200031f6200042a3660046200267c565b62000b5d565b600954620004459062010000900461ffff1681565b60405161ffff9091168152602001620002a1565b620002ef6200046a3660046200256b565b62000b99565b620002956200048136600462002610565b6001600160a01b03166000908152600d6020526040902054151590565b620002b462000bf2565b6200040a620004b936600462002610565b62000c01565b6200031f620004d0366004620026d3565b62000c66565b6200031f62000f3d565b600654620002ef906001600160a01b031681565b620002ef620005053660046200256b565b6200103e565b620002b462001069565b6200052c620005263660046200256b565b62001078565b604051620002a1949392919062002771565b6200031f6200054f3660046200256b565b6200113f565b6200031f62000566366004620027c1565b6200122b565b6200031f6200057d366004620027fb565b62001297565b6200040a60085481565b6200031f6200059e3660046200281a565b62001362565b600954620002959060ff1681565b620002b4620005c33660046200256b565b62001404565b6200031f620005da3660046200281a565b620014e9565b62000295620005f136600462002895565b600560209081526000928352604080842090915290825290205460ff1681565b6200031f6200062236600462002610565b620019a9565b6200031f62000639366004620028d3565b62001a22565b6200031f62001ada565b6200040a6200065a36600462002610565b600d6020526000908152604090205481565b620002ef6200067d36600462002925565b62001b96565b60095462010000900461ffff166000908152600e60205260409020600201546200040a565b60006301ffc9a760e01b6001600160e01b031983161480620006da57506380ac58cd60e01b6001600160e01b03198316145b80620006f65750635b5e139f60e01b6001600160e01b03198316145b92915050565b600080546200070b906200294f565b80601f016020809104026020016040519081016040528092919081815260200182805462000739906200294f565b80156200078a5780601f106200075e576101008083540402835291602001916200078a565b820191906000526020600020905b8154815290600101906020018083116200076c57829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b031633811480620007dc57506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6200081f5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600b6200088a600183620029a1565b815481106200089d576200089d620029b7565b60009182526020909120015460405163f2fde38b60e01b81526001600160a01b0384811660048301529091169063f2fde38b90602401600060405180830381600087803b158015620008ee57600080fd5b505af115801562000903573d6000803e3d6000fd5b505050506200091483838362001e92565b505050565b600954610100900460ff1615620009435760405163bbc5234f60e01b815260040160405180910390fd5b336000908152600d6020526040902054620009955760405162461bcd60e51b8152602060048201526011602482015270119514964e88139bdd0818481d985d5b1d607a1b604482015260640162000816565b336000908152600d60209081526040808320548084526002835281842080546001600160a01b039081168087526003865284872080546000190190559087168087528487208054600101905583875282546001600160a01b03199081168217909355600490955283862080549092169091559151909391928492909184917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6006546001600160a01b0316331462000a685760405162461bcd60e51b81526004016200081690620029cd565b6007546040516001600160a01b038084169216907fa14fc14d8620a708a896fd11392a235647d99385500a295f0d7da2a258b2e96790600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b600b62000ad3600183620029a1565b8154811062000ae65762000ae6620029b7565b60009182526020909120015460405163f2fde38b60e01b81526001600160a01b0384811660048301529091169063f2fde38b90602401600060405180830381600087803b15801562000b3757600080fd5b505af115801562000b4c573d6000803e3d6000fd5b505050506200091483838362002061565b6006546001600160a01b0316331462000b8a5760405162461bcd60e51b81526004016200081690620029cd565b600a6200091482848362002a5b565b6000818152600260205260409020546001600160a01b03168062000bed5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640162000816565b919050565b600a80546200070b906200294f565b60006001600160a01b03821662000c4a5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640162000816565b506001600160a01b031660009081526003602052604090205490565b6001600160a01b038481166000908152600d60209081526040808320548352600290915290205416331462000cd55760405162461bcd60e51b8152602060048201526014602482015273232a292cafaaab2b1d1027b7363c9027bbb732b960611b604482015260640162000816565b61ffff83166000908152600c602052604090205460ff161562000d3b5760405162461bcd60e51b815260206004820152601f60248201527f465452595f5556563a205661756c742076657273696f6e20626c6f636b656400604482015260640162000816565b6000846001600160a01b0316634e7adf2c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d7c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000da2919062002b28565b61ffff169050600062000e14848462000dd760095461ffff62010000909104166000908152600e602052604090206002015490565b858961ffff1660405160200162000df8929190918252602082015260400190565b604051602081830303815290604052805190602001206200215c565b90508062000e655760405162461bcd60e51b815260206004820152601c60248201527f4654525f5556563a2056657273696f6e206e6f7420616c6c6f77656400000000604482015260640162000816565b61ffff85166000908152600e602052604090819020600181015481549251630c20c01960e31b81526001600160a01b038a81169463610600c89462000ebb9483169392909116918b916003019060040162002b48565b600060405180830381600087803b15801562000ed657600080fd5b505af115801562000eeb573d6000803e3d6000fd5b505060405161ffff8581168252881692506001600160a01b03891691507f79497534f1fa272e9eaf8885a14fa32626c4a80975746df4d28828abb941fc5a9060200160405180910390a3505050505050565b6007546001600160a01b0316331462000f995760405162461bcd60e51b815260206004820152601760248201527f477561726469616e3a204f6e6c7920677561726469616e000000000000000000604482015260640162000816565b60085462000fab90622a300062002c04565b421162000fef5760405162461bcd60e51b8152602060048201526011602482015270475f503a2043616e6e6f7420706175736560781b604482015260640162000816565b6009805461ffff19166101011790554260085560408051600180825260208201527fc8a7c9852a25d1b9f9102472f35fc9320c0faa559b66dfa8027a1f3fa28eee2f91015b60405180910390a1565b600b81815481106200104f57600080fd5b6000918252602090912001546001600160a01b0316905081565b600180546200070b906200294f565b600e6020526000908152604090208054600182015460028301546003840180546001600160a01b039485169594909316939192620010b6906200294f565b80601f0160208091040260200160405190810160405280929190818152602001828054620010e4906200294f565b8015620011355780601f10620011095761010080835404028352916020019162001135565b820191906000526020600020905b8154815290600101906020018083116200111757829003601f168201915b5050505050905084565b6006546001600160a01b031633146200116c5760405162461bcd60e51b81526004016200081690620029cd565b60008111801562001189575060095462010000900461ffff168111155b620011d75760405162461bcd60e51b815260206004820152601960248201527f465452595f4256563a20496e76616c69642076657273696f6e00000000000000604482015260640162000816565b6000818152600c6020908152604091829020805460ff19166001179055905161ffff831681527f0c07cb17a9e3e6e74ad42ca4f0bcd6176bdc7300387ed768905fb8512a09a547910160405180910390a150565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b03163314620012c45760405162461bcd60e51b81526004016200081690620029cd565b60095460ff168015620012d45750815b6009805460ff1916911515919091179081905560ff610100909104168015620012fa5750805b6009805461ff001981166101009315158402908117928390556040805160ff93841692841692909217151582529390920416151560208201527fc8a7c9852a25d1b9f9102472f35fc9320c0faa559b66dfa8027a1f3fa28eee2f910160405180910390a15050565b600b62001371600185620029a1565b81548110620013845762001384620029b7565b60009182526020909120015460405163f2fde38b60e01b81526001600160a01b0386811660048301529091169063f2fde38b90602401600060405180830381600087803b158015620013d557600080fd5b505af1158015620013ea573d6000803e3d6000fd5b50505050620013fd858585858562002198565b5050505050565b6000818152600260205260409020546060906001600160a01b0316620014855760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840162000816565b6000600a805462001496906200294f565b905011620014b45760405180602001604052806000815250620006f6565b600a620014c18362002283565b604051602001620014d492919062002c1a565b60405160208183030381529060405292915050565b6006546001600160a01b03163314620015165760405162461bcd60e51b81526004016200081690620029cd565b82620015655760405162461bcd60e51b815260206004820152601f60248201527f465452595f534e56493a2076657273696f6e20726f6f74206973207a65726f00604482015260640162000816565b6001600160a01b038416620015bd5760405162461bcd60e51b815260206004820181905260248201527f465452595f534e56493a206c6f6769632061646472657373206973207a65726f604482015260640162000816565b60095462010000900461ffff166000908152600e60205260409020546001600160a01b0386811691161480159062001600575060095462010000900461ffff1615155b156200189a5760095462010000900461ffff166000908152600e60209081526040808320548151635aea529960e01b815291516001600160a01b0390911693928492635aea529992600480830193928290030181865afa15801562001669573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200168f919062002cab565b90506000876001600160a01b0316635aea52996040518163ffffffff1660e01b8152600401602060405180830381865afa158015620016d2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620016f8919062002cab565b9050808211156200174c5760405162461bcd60e51b815260206004820152601b60248201527f465452595f534e56493a20636f756e746572206d69736d617463680000000000604482015260640162000816565b60005b82811015620018955760405163095092e560e41b8152600481018290526001600160a01b038a16906395092e5090602401602060405180830381865afa1580156200179e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620017c4919062002cc5565b60405163095092e560e41b8152600481018390526001600160a01b03918216918616906395092e5090602401602060405180830381865afa1580156200180e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001834919062002cc5565b6001600160a01b0316146200188c5760405162461bcd60e51b815260206004820181905260248201527f465452595f534e56493a206e6f206261736543757272656e6379206d61746368604482015260640162000816565b6001016200174f565b505050505b60098054600161ffff62010000808404821683018216810263ffff0000199094169390931780855583900481166000908152600e602052604080822080546001600160a01b03808e166001600160a01b0319928316179092558754879004851684528284209095018054918c169190951617909355845484900482168152828120600201889055935492909204909116825290206003016200193e82848362002a5b565b50836001600160a01b0316856001600160a01b0316600960029054906101000a900461ffff1661ffff167f5b12482e46639e79eef5f3c9ff795d230742f08b42322eaa0ee8e597eafead95866040516200199a91815260200190565b60405180910390a45050505050565b6006546001600160a01b03163314620019d65760405162461bcd60e51b81526004016200081690620029cd565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6001600160a01b0381166000908152600d6020526040902054600b62001a4a600183620029a1565b8154811062001a5d5762001a5d620029b7565b60009182526020909120015460405163f2fde38b60e01b81526001600160a01b0385811660048301529091169063f2fde38b90602401600060405180830381600087803b15801562001aae57600080fd5b505af115801562001ac3573d6000803e3d6000fd5b5050505062001ad484848362002061565b50505050565b60085462001aec9062278d0062002c04565b421162001b335760405162461bcd60e51b8152602060048201526014602482015273475f55503a2043616e6e6f7420756e506175736560601b604482015260640162000816565b60095460ff168062001b4c5750600954610100900460ff165b1562001b94576009805461ffff1916905560408051600080825260208201527fc8a7c9852a25d1b9f9102472f35fc9320c0faa559b66dfa8027a1f3fa28eee2f910162001034565b565b60095460009060ff161562001bbe5760405163bbc5234f60e01b815260040160405180910390fd5b61ffff83161562001bd0578262001bde565b60095462010000900461ffff165b60095490935061ffff620100009091048116908416111562001c435760405162461bcd60e51b815260206004820152601e60248201527f465452595f43563a20556e6b6e6f776e207661756c742076657273696f6e0000604482015260640162000816565b61ffff83166000908152600c602052604090205460ff161562001ca95760405162461bcd60e51b815260206004820152601e60248201527f465452595f43563a205661756c742076657273696f6e20626c6f636b65640000604482015260640162000816565b833260405160200162001cd892919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b60408051601f19818403018152828252805160209182012061ffff87166000908152600e9092529190206001015490916001600160a01b039091169062001d1f90620024b3565b6001600160a01b0390911681526020018190604051809103906000f590508015801562001d50573d6000803e3d6000fd5b5061ffff84166000818152600e6020526040908190205490516358ffd2c160e11b81523360048201526001600160a01b039182166024820152604481019290925284811660648301529192509082169063b1ffa58290608401600060405180830381600087803b15801562001dc457600080fd5b505af115801562001dd9573d6000803e3d6000fd5b5050600b80546001810182557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b03861690811790915590546000918252600d602052604090912081905562001e469250339150620023a4565b6040516000815261ffff8416906001600160a01b038316907f79497534f1fa272e9eaf8885a14fa32626c4a80975746df4d28828abb941fc5a9060200160405180910390a39392505050565b6000818152600260205260409020546001600160a01b0384811691161462001eea5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640162000816565b6001600160a01b03821662001f365760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640162000816565b336001600160a01b038416148062001f7157506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8062001f9357506000818152600460205260409020546001600160a01b031633145b62001fd25760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640162000816565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6200206e8383836200087b565b6001600160a01b0382163b15806200211b5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015620020e9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200210f919062002ce5565b6001600160e01b031916145b620009145760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640162000816565b6000831562002190578360051b8501855b803580851160051b948552602094851852604060002093018181106200216d5750505b501492915050565b620021a58585856200087b565b6001600160a01b0384163b1580620022425750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290620021f09033908a9089908990899060040162002d05565b6020604051808303816000875af115801562002210573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002236919062002ce5565b6001600160e01b031916145b620013fd5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640162000816565b606081600003620022ab5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115620022db5780620022c28162002d59565b9150620022d39050600a8362002d8b565b9150620022af565b60008167ffffffffffffffff811115620022f957620022f9620029f3565b6040519080825280601f01601f19166020018201604052801562002324576020820181803683370190505b5090505b84156200239c576200233c600183620029a1565b91506200234b600a8662002da2565b6200235890603062002c04565b60f81b818381518110620023705762002370620029b7565b60200101906001600160f81b031916908160001a90535062002394600a8662002d8b565b945062002328565b949350505050565b6001600160a01b038216620023f05760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640162000816565b6000818152600260205260409020546001600160a01b031615620024485760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640162000816565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6101888062002dba83390190565b6001600160e01b031981168114620024d857600080fd5b50565b600060208284031215620024ee57600080fd5b8135620024fb81620024c1565b9392505050565b60005b838110156200251f57818101518382015260200162002505565b50506000910152565b600081518084526200254281602086016020860162002502565b601f01601f19169290920160200192915050565b602081526000620024fb602083018462002528565b6000602082840312156200257e57600080fd5b5035919050565b6001600160a01b0381168114620024d857600080fd5b60008060408385031215620025af57600080fd5b8235620025bc8162002585565b946020939093013593505050565b600080600060608486031215620025e057600080fd5b8335620025ed8162002585565b92506020840135620025ff8162002585565b929592945050506040919091013590565b6000602082840312156200262357600080fd5b8135620024fb8162002585565b60008083601f8401126200264357600080fd5b50813567ffffffffffffffff8111156200265c57600080fd5b6020830191508360208285010111156200267557600080fd5b9250929050565b600080602083850312156200269057600080fd5b823567ffffffffffffffff811115620026a857600080fd5b620026b68582860162002630565b90969095509350505050565b61ffff81168114620024d857600080fd5b60008060008060608587031215620026ea57600080fd5b8435620026f78162002585565b935060208501356200270981620026c2565b9250604085013567ffffffffffffffff808211156200272757600080fd5b818701915087601f8301126200273c57600080fd5b8135818111156200274c57600080fd5b8860208260051b85010111156200276257600080fd5b95989497505060200194505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090620027a69083018462002528565b9695505050505050565b8035801515811462000bed57600080fd5b60008060408385031215620027d557600080fd5b8235620027e28162002585565b9150620027f260208401620027b0565b90509250929050565b600080604083850312156200280f57600080fd5b620027e283620027b0565b6000806000806000608086880312156200283357600080fd5b8535620028408162002585565b94506020860135620028528162002585565b935060408601359250606086013567ffffffffffffffff8111156200287657600080fd5b620028848882890162002630565b969995985093965092949392505050565b60008060408385031215620028a957600080fd5b8235620028b68162002585565b91506020830135620028c88162002585565b809150509250929050565b600080600060608486031215620028e957600080fd5b8335620028f68162002585565b92506020840135620029088162002585565b915060408401356200291a8162002585565b809150509250925092565b6000806000606084860312156200293b57600080fd5b8335925060208401356200290881620026c2565b600181811c908216806200296457607f821691505b6020821081036200298557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115620006f657620006f66200298b565b634e487b7160e01b600052603260045260246000fd5b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b601f8211156200091457600081815260208120601f850160051c8101602086101562002a325750805b601f850160051c820191505b8181101562002a535782815560010162002a3e565b505050505050565b67ffffffffffffffff83111562002a765762002a76620029f3565b62002a8e8362002a8783546200294f565b8362002a09565b6000601f84116001811462002ac5576000851562002aac5750838201355b600019600387901b1c1916600186901b178355620013fd565b600083815260209020601f19861690835b8281101562002af8578685013582556020948501946001909201910162002ad6565b508682101562002b165760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60006020828403121562002b3b57600080fd5b8151620024fb81620026c2565b6001600160a01b038581168252841660208083019190915261ffff84166040830152608060608301528254600091829162002b83816200294f565b80608087015260a060018084166000811462002ba8576001811462002bc35762002bf3565b60ff1985168984015283151560051b89018301965062002bf3565b896000528560002060005b8581101562002beb5781548b820186015290830190870162002bce565b8a0184019750505b50949b9a5050505050505050505050565b80820180821115620006f657620006f66200298b565b600080845462002c2a816200294f565b6001828116801562002c45576001811462002c5b5762002c8c565b60ff198416875282151583028701945062002c8c565b8860005260208060002060005b8581101562002c835781548a82015290840190820162002c68565b50505082870194505b50505050835162002ca281836020880162002502565b01949350505050565b60006020828403121562002cbe57600080fd5b5051919050565b60006020828403121562002cd857600080fd5b8151620024fb8162002585565b60006020828403121562002cf857600080fd5b8151620024fb81620024c1565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b60006001820162002d6e5762002d6e6200298b565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008262002d9d5762002d9d62002d75565b500490565b60008262002db45762002db462002d75565b50069056fe60806040526040516101883803806101888339810160408190526100229161008e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2506100be565b6000602082840312156100a057600080fd5b81516001600160a01b03811681146100b757600080fd5b9392505050565b60bc806100cc6000396000f3fe608060405236603c57603a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b546001600160a01b03166063565b005b603a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc602c565b3660008037600080366000845af43d6000803e8080156081573d6000f35b3d6000fdfea264697066735822122011e75c3e8e5b67430835b3661d964c0ef5e567b0ac09360b6d2fed0c1c3bd79e64736f6c63430008110033a26469706673582212200050f124c5f62819c6773541b46ca357d15c405ca50df013b682225dd81ecd0764736f6c63430008110033

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620002795760003560e01c80638456cb591162000155578063bac7b49711620000c7578063f7ac64901162000086578063f7ac64901462000628578063f7b188a5146200063f578063fcfa4c071462000649578063fdd6858c146200066c578063fed69bb1146200068357600080fd5b8063bac7b49714620005a4578063c87b56dd14620005b2578063cf963aeb14620005c9578063e985e9c514620005e0578063f2fde38b146200061157600080fd5b80639b48a45911620001145780639b48a459146200053e578063a22cb4651462000555578063ac22f704146200056c578063ad84f3411462000583578063b88d4fde146200058d57600080fd5b80638456cb5914620004d65780638da5cb5b14620004e05780639094a91e14620004f457806395d89b41146200050b57806398fb7061146200051557600080fd5b806342842e0e11620001ef5780636352211e11620001ae5780636352211e1462000459578063652b9b4114620004705780636c0360eb146200049e57806370a0823114620004a857806372b5868b14620004bf57600080fd5b806342842e0e14620003db578063452a932014620003f25780634cd18577146200040657806355f804b3146200041957806357d39061146200043057600080fd5b806323b872dd116200023c57806323b872dd14620003475780632724fe09146200035e5780632d24280e146200039a5780632f86556814620003ad5780632fcb4f0414620003c457600080fd5b806301ffc9a7146200027e57806306fdde0314620002aa578063081812fc14620002c3578063095ea7b31462000308578063121369181462000321575b600080fd5b620002956200028f366004620024db565b620006a8565b60405190151581526020015b60405180910390f35b620002b4620006fc565b604051620002a1919062002556565b620002ef620002d43660046200256b565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001620002a1565b6200031f620003193660046200259b565b62000792565b005b62000295620003323660046200256b565b600c6020526000908152604090205460ff1681565b6200031f62000358366004620025ca565b6200087b565b620002ef6200036f36600462002610565b6001600160a01b039081166000908152600d6020908152604080832054835260029091529020541690565b6009546200029590610100900460ff1681565b6200031f620003be36600462002610565b62000919565b6200031f620003d536600462002610565b62000a3b565b6200031f620003ec366004620025ca565b62000ac4565b600754620002ef906001600160a01b031681565b600b545b604051908152602001620002a1565b6200031f6200042a3660046200267c565b62000b5d565b600954620004459062010000900461ffff1681565b60405161ffff9091168152602001620002a1565b620002ef6200046a3660046200256b565b62000b99565b620002956200048136600462002610565b6001600160a01b03166000908152600d6020526040902054151590565b620002b462000bf2565b6200040a620004b936600462002610565b62000c01565b6200031f620004d0366004620026d3565b62000c66565b6200031f62000f3d565b600654620002ef906001600160a01b031681565b620002ef620005053660046200256b565b6200103e565b620002b462001069565b6200052c620005263660046200256b565b62001078565b604051620002a1949392919062002771565b6200031f6200054f3660046200256b565b6200113f565b6200031f62000566366004620027c1565b6200122b565b6200031f6200057d366004620027fb565b62001297565b6200040a60085481565b6200031f6200059e3660046200281a565b62001362565b600954620002959060ff1681565b620002b4620005c33660046200256b565b62001404565b6200031f620005da3660046200281a565b620014e9565b62000295620005f136600462002895565b600560209081526000928352604080842090915290825290205460ff1681565b6200031f6200062236600462002610565b620019a9565b6200031f62000639366004620028d3565b62001a22565b6200031f62001ada565b6200040a6200065a36600462002610565b600d6020526000908152604090205481565b620002ef6200067d36600462002925565b62001b96565b60095462010000900461ffff166000908152600e60205260409020600201546200040a565b60006301ffc9a760e01b6001600160e01b031983161480620006da57506380ac58cd60e01b6001600160e01b03198316145b80620006f65750635b5e139f60e01b6001600160e01b03198316145b92915050565b600080546200070b906200294f565b80601f016020809104026020016040519081016040528092919081815260200182805462000739906200294f565b80156200078a5780601f106200075e576101008083540402835291602001916200078a565b820191906000526020600020905b8154815290600101906020018083116200076c57829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b031633811480620007dc57506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6200081f5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600b6200088a600183620029a1565b815481106200089d576200089d620029b7565b60009182526020909120015460405163f2fde38b60e01b81526001600160a01b0384811660048301529091169063f2fde38b90602401600060405180830381600087803b158015620008ee57600080fd5b505af115801562000903573d6000803e3d6000fd5b505050506200091483838362001e92565b505050565b600954610100900460ff1615620009435760405163bbc5234f60e01b815260040160405180910390fd5b336000908152600d6020526040902054620009955760405162461bcd60e51b8152602060048201526011602482015270119514964e88139bdd0818481d985d5b1d607a1b604482015260640162000816565b336000908152600d60209081526040808320548084526002835281842080546001600160a01b039081168087526003865284872080546000190190559087168087528487208054600101905583875282546001600160a01b03199081168217909355600490955283862080549092169091559151909391928492909184917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6006546001600160a01b0316331462000a685760405162461bcd60e51b81526004016200081690620029cd565b6007546040516001600160a01b038084169216907fa14fc14d8620a708a896fd11392a235647d99385500a295f0d7da2a258b2e96790600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b600b62000ad3600183620029a1565b8154811062000ae65762000ae6620029b7565b60009182526020909120015460405163f2fde38b60e01b81526001600160a01b0384811660048301529091169063f2fde38b90602401600060405180830381600087803b15801562000b3757600080fd5b505af115801562000b4c573d6000803e3d6000fd5b505050506200091483838362002061565b6006546001600160a01b0316331462000b8a5760405162461bcd60e51b81526004016200081690620029cd565b600a6200091482848362002a5b565b6000818152600260205260409020546001600160a01b03168062000bed5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640162000816565b919050565b600a80546200070b906200294f565b60006001600160a01b03821662000c4a5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640162000816565b506001600160a01b031660009081526003602052604090205490565b6001600160a01b038481166000908152600d60209081526040808320548352600290915290205416331462000cd55760405162461bcd60e51b8152602060048201526014602482015273232a292cafaaab2b1d1027b7363c9027bbb732b960611b604482015260640162000816565b61ffff83166000908152600c602052604090205460ff161562000d3b5760405162461bcd60e51b815260206004820152601f60248201527f465452595f5556563a205661756c742076657273696f6e20626c6f636b656400604482015260640162000816565b6000846001600160a01b0316634e7adf2c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d7c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000da2919062002b28565b61ffff169050600062000e14848462000dd760095461ffff62010000909104166000908152600e602052604090206002015490565b858961ffff1660405160200162000df8929190918252602082015260400190565b604051602081830303815290604052805190602001206200215c565b90508062000e655760405162461bcd60e51b815260206004820152601c60248201527f4654525f5556563a2056657273696f6e206e6f7420616c6c6f77656400000000604482015260640162000816565b61ffff85166000908152600e602052604090819020600181015481549251630c20c01960e31b81526001600160a01b038a81169463610600c89462000ebb9483169392909116918b916003019060040162002b48565b600060405180830381600087803b15801562000ed657600080fd5b505af115801562000eeb573d6000803e3d6000fd5b505060405161ffff8581168252881692506001600160a01b03891691507f79497534f1fa272e9eaf8885a14fa32626c4a80975746df4d28828abb941fc5a9060200160405180910390a3505050505050565b6007546001600160a01b0316331462000f995760405162461bcd60e51b815260206004820152601760248201527f477561726469616e3a204f6e6c7920677561726469616e000000000000000000604482015260640162000816565b60085462000fab90622a300062002c04565b421162000fef5760405162461bcd60e51b8152602060048201526011602482015270475f503a2043616e6e6f7420706175736560781b604482015260640162000816565b6009805461ffff19166101011790554260085560408051600180825260208201527fc8a7c9852a25d1b9f9102472f35fc9320c0faa559b66dfa8027a1f3fa28eee2f91015b60405180910390a1565b600b81815481106200104f57600080fd5b6000918252602090912001546001600160a01b0316905081565b600180546200070b906200294f565b600e6020526000908152604090208054600182015460028301546003840180546001600160a01b039485169594909316939192620010b6906200294f565b80601f0160208091040260200160405190810160405280929190818152602001828054620010e4906200294f565b8015620011355780601f10620011095761010080835404028352916020019162001135565b820191906000526020600020905b8154815290600101906020018083116200111757829003601f168201915b5050505050905084565b6006546001600160a01b031633146200116c5760405162461bcd60e51b81526004016200081690620029cd565b60008111801562001189575060095462010000900461ffff168111155b620011d75760405162461bcd60e51b815260206004820152601960248201527f465452595f4256563a20496e76616c69642076657273696f6e00000000000000604482015260640162000816565b6000818152600c6020908152604091829020805460ff19166001179055905161ffff831681527f0c07cb17a9e3e6e74ad42ca4f0bcd6176bdc7300387ed768905fb8512a09a547910160405180910390a150565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b03163314620012c45760405162461bcd60e51b81526004016200081690620029cd565b60095460ff168015620012d45750815b6009805460ff1916911515919091179081905560ff610100909104168015620012fa5750805b6009805461ff001981166101009315158402908117928390556040805160ff93841692841692909217151582529390920416151560208201527fc8a7c9852a25d1b9f9102472f35fc9320c0faa559b66dfa8027a1f3fa28eee2f910160405180910390a15050565b600b62001371600185620029a1565b81548110620013845762001384620029b7565b60009182526020909120015460405163f2fde38b60e01b81526001600160a01b0386811660048301529091169063f2fde38b90602401600060405180830381600087803b158015620013d557600080fd5b505af1158015620013ea573d6000803e3d6000fd5b50505050620013fd858585858562002198565b5050505050565b6000818152600260205260409020546060906001600160a01b0316620014855760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840162000816565b6000600a805462001496906200294f565b905011620014b45760405180602001604052806000815250620006f6565b600a620014c18362002283565b604051602001620014d492919062002c1a565b60405160208183030381529060405292915050565b6006546001600160a01b03163314620015165760405162461bcd60e51b81526004016200081690620029cd565b82620015655760405162461bcd60e51b815260206004820152601f60248201527f465452595f534e56493a2076657273696f6e20726f6f74206973207a65726f00604482015260640162000816565b6001600160a01b038416620015bd5760405162461bcd60e51b815260206004820181905260248201527f465452595f534e56493a206c6f6769632061646472657373206973207a65726f604482015260640162000816565b60095462010000900461ffff166000908152600e60205260409020546001600160a01b0386811691161480159062001600575060095462010000900461ffff1615155b156200189a5760095462010000900461ffff166000908152600e60209081526040808320548151635aea529960e01b815291516001600160a01b0390911693928492635aea529992600480830193928290030181865afa15801562001669573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200168f919062002cab565b90506000876001600160a01b0316635aea52996040518163ffffffff1660e01b8152600401602060405180830381865afa158015620016d2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620016f8919062002cab565b9050808211156200174c5760405162461bcd60e51b815260206004820152601b60248201527f465452595f534e56493a20636f756e746572206d69736d617463680000000000604482015260640162000816565b60005b82811015620018955760405163095092e560e41b8152600481018290526001600160a01b038a16906395092e5090602401602060405180830381865afa1580156200179e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620017c4919062002cc5565b60405163095092e560e41b8152600481018390526001600160a01b03918216918616906395092e5090602401602060405180830381865afa1580156200180e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001834919062002cc5565b6001600160a01b0316146200188c5760405162461bcd60e51b815260206004820181905260248201527f465452595f534e56493a206e6f206261736543757272656e6379206d61746368604482015260640162000816565b6001016200174f565b505050505b60098054600161ffff62010000808404821683018216810263ffff0000199094169390931780855583900481166000908152600e602052604080822080546001600160a01b03808e166001600160a01b0319928316179092558754879004851684528284209095018054918c169190951617909355845484900482168152828120600201889055935492909204909116825290206003016200193e82848362002a5b565b50836001600160a01b0316856001600160a01b0316600960029054906101000a900461ffff1661ffff167f5b12482e46639e79eef5f3c9ff795d230742f08b42322eaa0ee8e597eafead95866040516200199a91815260200190565b60405180910390a45050505050565b6006546001600160a01b03163314620019d65760405162461bcd60e51b81526004016200081690620029cd565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6001600160a01b0381166000908152600d6020526040902054600b62001a4a600183620029a1565b8154811062001a5d5762001a5d620029b7565b60009182526020909120015460405163f2fde38b60e01b81526001600160a01b0385811660048301529091169063f2fde38b90602401600060405180830381600087803b15801562001aae57600080fd5b505af115801562001ac3573d6000803e3d6000fd5b5050505062001ad484848362002061565b50505050565b60085462001aec9062278d0062002c04565b421162001b335760405162461bcd60e51b8152602060048201526014602482015273475f55503a2043616e6e6f7420756e506175736560601b604482015260640162000816565b60095460ff168062001b4c5750600954610100900460ff165b1562001b94576009805461ffff1916905560408051600080825260208201527fc8a7c9852a25d1b9f9102472f35fc9320c0faa559b66dfa8027a1f3fa28eee2f910162001034565b565b60095460009060ff161562001bbe5760405163bbc5234f60e01b815260040160405180910390fd5b61ffff83161562001bd0578262001bde565b60095462010000900461ffff165b60095490935061ffff620100009091048116908416111562001c435760405162461bcd60e51b815260206004820152601e60248201527f465452595f43563a20556e6b6e6f776e207661756c742076657273696f6e0000604482015260640162000816565b61ffff83166000908152600c602052604090205460ff161562001ca95760405162461bcd60e51b815260206004820152601e60248201527f465452595f43563a205661756c742076657273696f6e20626c6f636b65640000604482015260640162000816565b833260405160200162001cd892919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b60408051601f19818403018152828252805160209182012061ffff87166000908152600e9092529190206001015490916001600160a01b039091169062001d1f90620024b3565b6001600160a01b0390911681526020018190604051809103906000f590508015801562001d50573d6000803e3d6000fd5b5061ffff84166000818152600e6020526040908190205490516358ffd2c160e11b81523360048201526001600160a01b039182166024820152604481019290925284811660648301529192509082169063b1ffa58290608401600060405180830381600087803b15801562001dc457600080fd5b505af115801562001dd9573d6000803e3d6000fd5b5050600b80546001810182557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b03861690811790915590546000918252600d602052604090912081905562001e469250339150620023a4565b6040516000815261ffff8416906001600160a01b038316907f79497534f1fa272e9eaf8885a14fa32626c4a80975746df4d28828abb941fc5a9060200160405180910390a39392505050565b6000818152600260205260409020546001600160a01b0384811691161462001eea5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640162000816565b6001600160a01b03821662001f365760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640162000816565b336001600160a01b038416148062001f7157506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8062001f9357506000818152600460205260409020546001600160a01b031633145b62001fd25760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640162000816565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6200206e8383836200087b565b6001600160a01b0382163b15806200211b5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015620020e9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200210f919062002ce5565b6001600160e01b031916145b620009145760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640162000816565b6000831562002190578360051b8501855b803580851160051b948552602094851852604060002093018181106200216d5750505b501492915050565b620021a58585856200087b565b6001600160a01b0384163b1580620022425750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290620021f09033908a9089908990899060040162002d05565b6020604051808303816000875af115801562002210573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002236919062002ce5565b6001600160e01b031916145b620013fd5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640162000816565b606081600003620022ab5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115620022db5780620022c28162002d59565b9150620022d39050600a8362002d8b565b9150620022af565b60008167ffffffffffffffff811115620022f957620022f9620029f3565b6040519080825280601f01601f19166020018201604052801562002324576020820181803683370190505b5090505b84156200239c576200233c600183620029a1565b91506200234b600a8662002da2565b6200235890603062002c04565b60f81b818381518110620023705762002370620029b7565b60200101906001600160f81b031916908160001a90535062002394600a8662002d8b565b945062002328565b949350505050565b6001600160a01b038216620023f05760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640162000816565b6000818152600260205260409020546001600160a01b031615620024485760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640162000816565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6101888062002dba83390190565b6001600160e01b031981168114620024d857600080fd5b50565b600060208284031215620024ee57600080fd5b8135620024fb81620024c1565b9392505050565b60005b838110156200251f57818101518382015260200162002505565b50506000910152565b600081518084526200254281602086016020860162002502565b601f01601f19169290920160200192915050565b602081526000620024fb602083018462002528565b6000602082840312156200257e57600080fd5b5035919050565b6001600160a01b0381168114620024d857600080fd5b60008060408385031215620025af57600080fd5b8235620025bc8162002585565b946020939093013593505050565b600080600060608486031215620025e057600080fd5b8335620025ed8162002585565b92506020840135620025ff8162002585565b929592945050506040919091013590565b6000602082840312156200262357600080fd5b8135620024fb8162002585565b60008083601f8401126200264357600080fd5b50813567ffffffffffffffff8111156200265c57600080fd5b6020830191508360208285010111156200267557600080fd5b9250929050565b600080602083850312156200269057600080fd5b823567ffffffffffffffff811115620026a857600080fd5b620026b68582860162002630565b90969095509350505050565b61ffff81168114620024d857600080fd5b60008060008060608587031215620026ea57600080fd5b8435620026f78162002585565b935060208501356200270981620026c2565b9250604085013567ffffffffffffffff808211156200272757600080fd5b818701915087601f8301126200273c57600080fd5b8135818111156200274c57600080fd5b8860208260051b85010111156200276257600080fd5b95989497505060200194505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090620027a69083018462002528565b9695505050505050565b8035801515811462000bed57600080fd5b60008060408385031215620027d557600080fd5b8235620027e28162002585565b9150620027f260208401620027b0565b90509250929050565b600080604083850312156200280f57600080fd5b620027e283620027b0565b6000806000806000608086880312156200283357600080fd5b8535620028408162002585565b94506020860135620028528162002585565b935060408601359250606086013567ffffffffffffffff8111156200287657600080fd5b620028848882890162002630565b969995985093965092949392505050565b60008060408385031215620028a957600080fd5b8235620028b68162002585565b91506020830135620028c88162002585565b809150509250929050565b600080600060608486031215620028e957600080fd5b8335620028f68162002585565b92506020840135620029088162002585565b915060408401356200291a8162002585565b809150509250925092565b6000806000606084860312156200293b57600080fd5b8335925060208401356200290881620026c2565b600181811c908216806200296457607f821691505b6020821081036200298557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115620006f657620006f66200298b565b634e487b7160e01b600052603260045260246000fd5b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b601f8211156200091457600081815260208120601f850160051c8101602086101562002a325750805b601f850160051c820191505b8181101562002a535782815560010162002a3e565b505050505050565b67ffffffffffffffff83111562002a765762002a76620029f3565b62002a8e8362002a8783546200294f565b8362002a09565b6000601f84116001811462002ac5576000851562002aac5750838201355b600019600387901b1c1916600186901b178355620013fd565b600083815260209020601f19861690835b8281101562002af8578685013582556020948501946001909201910162002ad6565b508682101562002b165760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60006020828403121562002b3b57600080fd5b8151620024fb81620026c2565b6001600160a01b038581168252841660208083019190915261ffff84166040830152608060608301528254600091829162002b83816200294f565b80608087015260a060018084166000811462002ba8576001811462002bc35762002bf3565b60ff1985168984015283151560051b89018301965062002bf3565b896000528560002060005b8581101562002beb5781548b820186015290830190870162002bce565b8a0184019750505b50949b9a5050505050505050505050565b80820180821115620006f657620006f66200298b565b600080845462002c2a816200294f565b6001828116801562002c45576001811462002c5b5762002c8c565b60ff198416875282151583028701945062002c8c565b8860005260208060002060005b8581101562002c835781548a82015290840190820162002c68565b50505082870194505b50505050835162002ca281836020880162002502565b01949350505050565b60006020828403121562002cbe57600080fd5b5051919050565b60006020828403121562002cd857600080fd5b8151620024fb8162002585565b60006020828403121562002cf857600080fd5b8151620024fb81620024c1565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b60006001820162002d6e5762002d6e6200298b565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008262002d9d5762002d9d62002d75565b500490565b60008262002db45762002db462002d75565b50069056fe60806040526040516101883803806101888339810160408190526100229161008e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2506100be565b6000602082840312156100a057600080fd5b81516001600160a01b03811681146100b757600080fd5b9392505050565b60bc806100cc6000396000f3fe608060405236603c57603a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b546001600160a01b03166063565b005b603a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc602c565b3660008037600080366000845af43d6000803e8080156081573d6000f35b3d6000fdfea264697066735822122011e75c3e8e5b67430835b3661d964c0ef5e567b0ac09360b6d2fed0c1c3bd79e64736f6c63430008110033a26469706673582212200050f124c5f62819c6773541b46ca357d15c405ca50df013b682225dd81ecd0764736f6c63430008110033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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