ETH Price: $2,864.07 (-2.69%)
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Parent Transaction Hash Block From To
329013352025-07-15 15:06:57194 days ago1752592017  Contract Creation0 ETH

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
HubRegistry

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 1 runs

Other Settings:
cancun EvmVersion
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;

import {Auth} from "src/misc/Auth.sol";
import {MathLib} from "src/misc/libraries/MathLib.sol";
import {IERC6909Decimals} from "src/misc/interfaces/IERC6909.sol";

import {AssetId} from "src/common/types/AssetId.sol";
import {PoolId, newPoolId} from "src/common/types/PoolId.sol";

import {IHubRegistry} from "src/hub/interfaces/IHubRegistry.sol";

/// @title  Hub Registry
/// @notice Registry of all known pools, currencies, and assets.
contract HubRegistry is Auth, IHubRegistry {
    using MathLib for uint256;

    mapping(AssetId => uint8) internal _decimals;

    mapping(PoolId => bytes) public metadata;
    mapping(PoolId => AssetId) public currency;
    mapping(bytes32 => address) public dependency;
    mapping(PoolId => mapping(address => bool)) public manager;

    constructor(address deployer) Auth(deployer) {}

    //----------------------------------------------------------------------------------------------
    // Registration methods
    //----------------------------------------------------------------------------------------------

    /// @inheritdoc IHubRegistry
    function registerAsset(AssetId assetId, uint8 decimals_) external auth {
        require(_decimals[assetId] == 0, AssetAlreadyRegistered());

        _decimals[assetId] = decimals_;

        emit NewAsset(assetId, decimals_);
    }

    /// @inheritdoc IHubRegistry
    function registerPool(PoolId poolId_, address manager_, AssetId currency_) external auth {
        require(manager_ != address(0), EmptyAccount());
        require(!currency_.isNull(), EmptyCurrency());
        require(currency[poolId_].isNull(), PoolAlreadyRegistered());

        manager[poolId_][manager_] = true;
        currency[poolId_] = currency_;

        emit NewPool(poolId_, manager_, currency_);
    }

    //----------------------------------------------------------------------------------------------
    // Update methods
    //----------------------------------------------------------------------------------------------

    /// @inheritdoc IHubRegistry
    function updateManager(PoolId poolId_, address manager_, bool canManage) external auth {
        require(exists(poolId_), NonExistingPool(poolId_));
        require(manager_ != address(0), EmptyAccount());

        manager[poolId_][manager_] = canManage;

        emit UpdateManager(poolId_, manager_, canManage);
    }

    /// @inheritdoc IHubRegistry
    function setMetadata(PoolId poolId_, bytes calldata metadata_) external auth {
        require(exists(poolId_), NonExistingPool(poolId_));

        metadata[poolId_] = metadata_;

        emit SetMetadata(poolId_, metadata_);
    }

    /// @inheritdoc IHubRegistry
    function updateDependency(bytes32 what, address dependency_) external auth {
        dependency[what] = dependency_;

        emit UpdateDependency(what, dependency_);
    }

    /// @inheritdoc IHubRegistry
    function updateCurrency(PoolId poolId_, AssetId currency_) external auth {
        require(exists(poolId_), NonExistingPool(poolId_));
        require(!currency_.isNull(), EmptyCurrency());

        currency[poolId_] = currency_;

        emit UpdateCurrency(poolId_, currency_);
    }

    //----------------------------------------------------------------------------------------------
    // View methods
    //----------------------------------------------------------------------------------------------

    /// @inheritdoc IHubRegistry
    function poolId(uint16 centrifugeId, uint48 postfix) public pure returns (PoolId poolId_) {
        poolId_ = newPoolId(centrifugeId, postfix);
    }

    /// @inheritdoc IHubRegistry
    function decimals(AssetId assetId) public view returns (uint8 decimals_) {
        decimals_ = _decimals[assetId];
        require(decimals_ > 0, AssetNotFound());
    }

    /// @inheritdoc IHubRegistry
    function decimals(PoolId poolId_) public view returns (uint8 decimals_) {
        decimals_ = _decimals[currency[poolId_]];
        require(decimals_ > 0, AssetNotFound());
    }

    /// @inheritdoc IERC6909Decimals
    function decimals(uint256 asset_) external view returns (uint8 decimals_) {
        decimals_ = _decimals[AssetId.wrap(asset_.toUint128())];
        require(decimals_ > 0, AssetNotFound());
    }

    /// @inheritdoc IHubRegistry
    function exists(PoolId poolId_) public view returns (bool) {
        return !currency[poolId_].isNull();
    }

    /// @inheritdoc IHubRegistry
    function isRegistered(AssetId assetId) public view returns (bool) {
        return _decimals[assetId] != 0;
    }
}

// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.8.28;

import {IAuth} from "src/misc/interfaces/IAuth.sol";

/// @title  Auth
/// @notice Simple authentication pattern
/// @author Based on code from https://github.com/makerdao/dss
abstract contract Auth is IAuth {
    /// @inheritdoc IAuth
    mapping(address => uint256) public wards;

    constructor(address initialWard) {
        wards[initialWard] = 1;
        emit Rely(initialWard);
    }

    /// @dev Check if the msg.sender has permissions
    modifier auth() {
        require(wards[msg.sender] == 1, NotAuthorized());
        _;
    }

    /// @inheritdoc IAuth
    function rely(address user) public auth {
        wards[user] = 1;
        emit Rely(user);
    }

    /// @inheritdoc IAuth
    function deny(address user) public auth {
        wards[user] = 0;
        emit Deny(user);
    }
}

// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.8.28;

library MathLib {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero

    }

    error MulDiv_Overflow();
    error Uint8_Overflow();
    error Uint32_Overflow();
    error Uint64_Overflow();
    error Uint128_Overflow();
    error Int128_Overflow();

    uint256 public constant One27 = 10 ** 27;

    /// @notice Returns x^n with rounding precision of base
    ///
    /// @dev Source: https://github.com/makerdao/dss/blob/fa4f6630afb0624d04a003e920b0d71a00331d98/src/jug.sol#L62
    ///
    /// @param x The base value which should be exponentiated
    /// @param n The exponent
    /// @param base The scaling base, typically used for fix-point calculations
    function rpow(uint256 x, uint256 n, uint256 base) public pure returns (uint256 z) {
        assembly {
            switch x
            case 0 {
                switch n
                case 0 { z := base }
                default { z := 0 }
            }
            default {
                switch mod(n, 2)
                case 0 { z := base }
                default { z := x }
                let half := div(base, 2) // for rounding.
                for { n := div(n, 2) } n { n := div(n, 2) } {
                    let xx := mul(x, x)
                    if iszero(eq(div(xx, x), x)) { revert(0, 0) }
                    let xxRound := add(xx, half)
                    if lt(xxRound, xx) { revert(0, 0) }
                    x := div(xxRound, base)
                    if mod(n, 2) {
                        let zx := mul(z, x)
                        if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) { revert(0, 0) }
                        let zxRound := add(zx, half)
                        if lt(zxRound, zx) { revert(0, 0) }
                        z := div(zxRound, base)
                    }
                }
            }
        }
    }

    /// @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
    ///         denominator == 0
    /// @dev    Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
    ///         with further edits by Uniswap Labs also under MIT license.
    // slither-disable-start divide-before-multiply
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, MulDiv_Overflow());

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.
            // Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also
            // works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }
    // slither-disable-end divide-before-multiply

    /// @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /// @notice Safe type conversion from uint256 to uint8.
    function toUint8(uint256 value) internal pure returns (uint8) {
        require(value <= type(uint8).max, Uint8_Overflow());
        return uint8(value);
    }

    function toUint32(uint256 value) internal pure returns (uint32) {
        require(value <= type(uint32).max, Uint32_Overflow());
        return uint32(value);
    }

    function toUint64(uint256 value) internal pure returns (uint64) {
        require(value <= type(uint64).max, Uint64_Overflow());
        return uint64(value);
    }

    /// @notice Safe type conversion from uint256 to uint128.
    function toUint128(uint256 value) internal pure returns (uint128) {
        require(value <= type(uint128).max, Uint128_Overflow());
        return uint128(value);
    }

    /// @notice Returns the smallest of two numbers.
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? b : a;
    }

    /// @notice Returns the largest of two numbers.
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }
}

// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;

import {IERC165} from "forge-std/interfaces/IERC165.sol";

interface IERC6909 is IERC165 {
    error EmptyOwner();
    error EmptyAmount();
    error InvalidTokenId();
    error InsufficientBalance(address owner, uint256 tokenId);
    error InsufficientAllowance(address sender, uint256 tokenId);

    event OperatorSet(address indexed owner, address indexed operator, bool approved);
    event Approval(address indexed owner, address indexed spender, uint256 indexed tokenId, uint256 amount);
    event Transfer(address caller, address indexed from, address indexed to, uint256 indexed tokenId, uint256 amount);

    /// @notice           Owner balance of a tokenId.
    /// @param owner      The address of the owner.
    /// @param tokenId    The id of the token.
    /// @return amount    The balance of the token.
    function balanceOf(address owner, uint256 tokenId) external view returns (uint256 amount);

    /// @notice           Spender allowance of a tokenId.
    /// @param owner      The address of the owner.
    /// @param spender    The address of the spender.
    /// @param tokenId    The id of the token.
    /// @return amount    The allowance of the token.
    function allowance(address owner, address spender, uint256 tokenId) external view returns (uint256 amount);

    /// @notice           Checks if a spender is approved by an owner as an operator.
    /// @param owner      The address of the owner.
    /// @param spender    The address of the spender.
    /// @return approved  The approval status.
    function isOperator(address owner, address spender) external view returns (bool approved);

    /// @notice           Transfers an amount of a tokenId from the caller to a receiver.
    /// @param receiver   The address of the receiver.
    /// @param tokenId    The id of the token.
    /// @param amount     The amount of the token.
    /// @return bool      True, always, unless the function reverts.
    function transfer(address receiver, uint256 tokenId, uint256 amount) external returns (bool);

    /// @notice           Transfers an amount of a tokenId from a sender to a receiver.
    /// @param sender     The address of the sender.
    /// @param receiver   The address of the receiver.
    /// @param tokenId    The id of the token.
    /// @param amount     The amount of the token.
    /// @return bool      True, always, unless the function reverts.
    function transferFrom(address sender, address receiver, uint256 tokenId, uint256 amount) external returns (bool);

    /// @notice           Approves an amount of a tokenId to a spender.
    /// @param spender    The address of the spender.
    /// @param tokenId    The id of the token.
    /// @param amount     The amount of the token.
    /// @return bool      True, always.
    function approve(address spender, uint256 tokenId, uint256 amount) external returns (bool);

    /// @notice           Sets or removes an operator for the caller.
    /// @param operator   The address of the operator.
    /// @param approved   The approval status.
    /// @return bool      True, always.
    function setOperator(address operator, bool approved) external returns (bool);
}

interface IERC6909URIExt {
    event TokenURISet(uint256 indexed tokenId, string uri);
    event ContractURISet(address indexed target, string uri);

    error EmptyURI();

    /// @return uri     Returns the common token URI.
    function contractURI() external view returns (string memory);

    /// @dev            Returns empty string if tokenId does not exist.
    ///                 MAY implemented to throw MissingURI(tokenId) error.
    /// @param tokenId  The token to query URI for.
    /// @return uri     A string representing the uri for the specific tokenId.
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

interface IERC6909NFT is IERC6909, IERC6909URIExt {
    error UnknownTokenId(address owner, uint256 tokenId);
    error LessThanMinimalDecimal(uint8 minimal, uint8 actual);

    /// @notice             Provide URI for a specific tokenId.
    /// @param tokenId      Token Id.
    /// @param URI          URI to a document defining the collection as a whole.
    function setTokenURI(uint256 tokenId, string memory URI) external;

    /// @dev                Optional method to set up the contract URI if needed.
    /// @param URI          URI to a document defining the collection as a whole.
    function setContractURI(string memory URI) external;

    /// @notice             Mint new tokens for a given owner and sets tokenURI.
    /// @dev                For non-fungible tokens, call with amount = 1, for fungible it could be any amount.
    ///                     TokenId is auto incremented by one.
    ///
    /// @param owner        Creates supply of a given tokenId by amount for owner.
    /// @param tokenURI     URI fortestBurningToken the newly minted token.
    /// @return tokenId     Id of the newly minted token.
    function mint(address owner, string memory tokenURI) external returns (uint256 tokenId);

    /// @notice             Destroy supply of a given tokenId by amount.
    /// @dev                The msg.sender MUST be the owner.
    ///
    /// @param tokenId      Item which have reduced supply.
    function burn(uint256 tokenId) external;
}

/// @notice Extension of ERC6909 Standard for tracking total supply
interface IERC6909TotalSupplyExt {
    /// @notice         The totalSupply for a token id.
    ///
    /// @param tokenId  Id of the token
    /// @return supply  Total supply for a given `tokenId`
    function totalSupply(uint256 tokenId) external returns (uint256 supply);
}

interface IERC6909Decimals {
    /// @notice             Used to retrieve the decimals of an asset
    /// @dev                address is used but the value corresponds to a AssetId
    function decimals(uint256 assetId) external view returns (uint8);
}

interface IERC6909MetadataExt is IERC6909Decimals {
    /// @notice             Used to retrieve the decimals of an asset
    /// @dev                address is used but the value corresponds to a AssetId
    function decimals(uint256 assetId) external view returns (uint8);

    /// @notice             Used to retrieve the name of an asset
    /// @dev                address is used but the value corresponds to a AssetId
    function name(uint256 assetId) external view returns (string memory);

    /// @notice             Used to retrieve the symbol of an asset
    /// @dev                address is used but the value corresponds to a AssetId
    function symbol(uint256 assetId) external view returns (string memory);
}

interface IERC6909Fungible is IERC6909 {
    /// @notice             Mint new tokens for a specific tokenid and assign them to an owner
    ///
    /// @param owner        Creates supply of a given `tokenId` by `amount` for owner.
    /// @param tokenId      Id of the item
    /// @param amount       Adds `amount` to the total supply of the given `tokenId`
    function mint(address owner, uint256 tokenId, uint256 amount) external;

    /// @notice             Destroy supply of a given tokenId by amount.
    /// @dev                The msg.sender MUST be the owner.
    ///
    /// @param owner        Owner of the `tokenId`
    /// @param tokenId      Id of the item.
    /// @param amount       Subtract `amount` from the total supply of the given `tokenId`
    function burn(address owner, uint256 tokenId, uint256 amount) external;

    /// @notice             Enforces a transfer from `spender` point of view.
    ///
    ///
    /// @param sender       The owner of the `tokenId`
    /// @param receiver     Address of the receiving party
    /// @param tokenId      Token Id
    /// @param amount       Amount to be transferred
    function authTransferFrom(address sender, address receiver, uint256 tokenId, uint256 amount)
        external
        returns (bool);
}

/// @dev  A factory contract to deploy new collateral contracts implementing IERC6909.
interface IERC6909Factory {
    /// Events
    event NewTokenDeployment(address indexed owner, address instance);

    /// @notice       Deploys new install of a contract that implements IERC6909.
    /// @dev          Factory should deploy deterministically if possible.
    ///
    /// @param owner  Owner of the deployed collateral contract which has initial full rights.
    /// @param salt   Used to make a deterministic deployment.
    /// @return       An address of the newly deployed contract.
    function deploy(address owner, bytes32 salt) external returns (address);

    /// @notice       Generates a new deterministic address based on the owner and the salt.
    ///
    /// @param owner  Owner of the deployed collateral contract which has initial full rights.
    /// @param salt   Used to make a deterministic deployment.
    /// @return       An address of the newly deployed contract.
    function previewAddress(address owner, bytes32 salt) external returns (address);
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;

/// @dev Composite Id of the centrifugeId (uint16) where the asset resides
///      and a local counter (uint64) that is part of the contract that registers the asset.
type AssetId is uint128;

function isNull(AssetId assetId) pure returns (bool) {
    return AssetId.unwrap(assetId) == 0;
}

function raw(AssetId assetId) pure returns (uint128) {
    return AssetId.unwrap(assetId);
}

function centrifugeId(AssetId assetId) pure returns (uint16) {
    return uint16(AssetId.unwrap(assetId) >> 112);
}

function newAssetId(uint16 centrifugeId_, uint64 counter) pure returns (AssetId) {
    return AssetId.wrap((uint128(centrifugeId_) << 112) + counter);
}

function newAssetId(uint32 isoCode) pure returns (AssetId) {
    return AssetId.wrap(isoCode);
}

function eq(AssetId a, AssetId b) pure returns (bool) {
    return a.raw() == b.raw();
}

using {isNull, raw, centrifugeId, eq} for AssetId global;

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;

import {MathLib} from "src/misc/libraries/MathLib.sol";

using MathLib for uint256;

type PoolId is uint64;

function centrifugeId(PoolId poolId) pure returns (uint16) {
    return uint16(PoolId.unwrap(poolId) >> 48);
}

function newPoolId(uint16 centrifugeId_, uint48 localPoolId) pure returns (PoolId) {
    return PoolId.wrap((uint64(centrifugeId_) << 48) | uint64(localPoolId));
}

function isNull(PoolId poolId) pure returns (bool) {
    return PoolId.unwrap(poolId) == 0;
}

function isEqual(PoolId a, PoolId b) pure returns (bool) {
    return PoolId.unwrap(a) == PoolId.unwrap(b);
}

function raw(PoolId poolId) pure returns (uint64) {
    return PoolId.unwrap(poolId);
}

using {centrifugeId, isNull, raw, isEqual as ==} for PoolId global;

// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;

import {IERC6909Decimals} from "src/misc/interfaces/IERC6909.sol";

import {PoolId} from "src/common/types/PoolId.sol";
import {AssetId} from "src/common/types/AssetId.sol";

interface IHubRegistry is IERC6909Decimals {
    event NewAsset(AssetId indexed assetId, uint8 decimals);
    event NewPool(PoolId poolId, address indexed manager, AssetId indexed currency);
    event UpdateManager(PoolId indexed poolId, address indexed manager, bool canManage);
    event SetMetadata(PoolId indexed poolId, bytes metadata);
    event UpdateDependency(bytes32 indexed what, address dependency);
    event UpdateCurrency(PoolId indexed poolId, AssetId currency);

    error NonExistingPool(PoolId id);
    error AssetAlreadyRegistered();
    error PoolAlreadyRegistered();
    error EmptyAccount();
    error EmptyCurrency();
    error EmptyShareClassManager();
    error AssetNotFound();

    /// @notice Register a new asset.
    function registerAsset(AssetId assetId, uint8 decimals_) external;

    /// @notice Register a new pool.
    function registerPool(PoolId poolId, address manager, AssetId currency) external;

    /// @notice allow/disallow an address as a manager for the pool
    function updateManager(PoolId poolId, address newManager, bool canManage) external;

    /// @notice sets metadata for this pool
    function setMetadata(PoolId poolId, bytes calldata metadata) external;

    /// @notice updates a dependency of the system
    function updateDependency(bytes32 what, address dependency) external;

    /// @notice updates the currency of the pool
    function updateCurrency(PoolId poolId, AssetId currency) external;

    /// @notice returns the metadata attached to the pool, if any.
    function metadata(PoolId poolId) external view returns (bytes memory);

    /// @notice returns the currency of the pool
    function currency(PoolId poolId) external view returns (AssetId);

    /// @notice returns the dependency used in the system
    function dependency(bytes32 what) external view returns (address);

    /// @notice returns whether the account is a manager
    function manager(PoolId poolId, address who) external view returns (bool);

    /// @notice compute a pool ID given an ID postfix
    function poolId(uint16 centrifugeId, uint48 postfix) external view returns (PoolId poolId);

    /// @notice returns the decimals for an asset
    function decimals(AssetId assetId) external view returns (uint8);

    /// @notice returns the decimals for a pool
    function decimals(PoolId poolId) external view returns (uint8);

    /// @notice checks the existence of a pool
    function exists(PoolId poolId) external view returns (bool);

    /// @notice checks the existence of an asset
    function isRegistered(AssetId assetId) external view returns (bool);
}

// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;

interface IAuth {
    event Rely(address indexed user);
    event Deny(address indexed user);

    error NotAuthorized();

    /// @notice Returns whether the target is a ward (has admin access)
    function wards(address target) external view returns (uint256);

    /// @notice Make user a ward (give them admin access)
    function rely(address user) external;

    /// @notice Remove user as a ward (remove admin access)
    function deny(address user) external;
}

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2;

interface IERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    /// uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    /// `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

Settings
{
  "remappings": [
    "forge-std/=lib/forge-std/src/",
    "@chimera/=lib/chimera/src/",
    "createx-forge/=lib/createx-forge/",
    "chimera/=lib/chimera/src/",
    "ds-test/=lib/chimera/lib/forge-std/lib/ds-test/src/",
    "setup-helpers/=lib/setup-helpers/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"deployer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AssetAlreadyRegistered","type":"error"},{"inputs":[],"name":"AssetNotFound","type":"error"},{"inputs":[],"name":"EmptyAccount","type":"error"},{"inputs":[],"name":"EmptyCurrency","type":"error"},{"inputs":[],"name":"EmptyShareClassManager","type":"error"},{"inputs":[{"internalType":"PoolId","name":"id","type":"uint64"}],"name":"NonExistingPool","type":"error"},{"inputs":[],"name":"NotAuthorized","type":"error"},{"inputs":[],"name":"PoolAlreadyRegistered","type":"error"},{"inputs":[],"name":"Uint128_Overflow","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Deny","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"AssetId","name":"assetId","type":"uint128"},{"indexed":false,"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"NewAsset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"PoolId","name":"poolId","type":"uint64"},{"indexed":true,"internalType":"address","name":"manager","type":"address"},{"indexed":true,"internalType":"AssetId","name":"currency","type":"uint128"}],"name":"NewPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Rely","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"PoolId","name":"poolId","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"SetMetadata","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"PoolId","name":"poolId","type":"uint64"},{"indexed":false,"internalType":"AssetId","name":"currency","type":"uint128"}],"name":"UpdateCurrency","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"what","type":"bytes32"},{"indexed":false,"internalType":"address","name":"dependency","type":"address"}],"name":"UpdateDependency","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"PoolId","name":"poolId","type":"uint64"},{"indexed":true,"internalType":"address","name":"manager","type":"address"},{"indexed":false,"internalType":"bool","name":"canManage","type":"bool"}],"name":"UpdateManager","type":"event"},{"inputs":[{"internalType":"PoolId","name":"","type":"uint64"}],"name":"currency","outputs":[{"internalType":"AssetId","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"AssetId","name":"assetId","type":"uint128"}],"name":"decimals","outputs":[{"internalType":"uint8","name":"decimals_","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"asset_","type":"uint256"}],"name":"decimals","outputs":[{"internalType":"uint8","name":"decimals_","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId_","type":"uint64"}],"name":"decimals","outputs":[{"internalType":"uint8","name":"decimals_","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"deny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"dependency","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId_","type":"uint64"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"AssetId","name":"assetId","type":"uint128"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"","type":"uint64"},{"internalType":"address","name":"","type":"address"}],"name":"manager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"","type":"uint64"}],"name":"metadata","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"centrifugeId","type":"uint16"},{"internalType":"uint48","name":"postfix","type":"uint48"}],"name":"poolId","outputs":[{"internalType":"PoolId","name":"poolId_","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"AssetId","name":"assetId","type":"uint128"},{"internalType":"uint8","name":"decimals_","type":"uint8"}],"name":"registerAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId_","type":"uint64"},{"internalType":"address","name":"manager_","type":"address"},{"internalType":"AssetId","name":"currency_","type":"uint128"}],"name":"registerPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"rely","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId_","type":"uint64"},{"internalType":"bytes","name":"metadata_","type":"bytes"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId_","type":"uint64"},{"internalType":"AssetId","name":"currency_","type":"uint128"}],"name":"updateCurrency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"what","type":"bytes32"},{"internalType":"address","name":"dependency_","type":"address"}],"name":"updateDependency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId_","type":"uint64"},{"internalType":"address","name":"manager_","type":"address"},{"internalType":"bool","name":"canManage","type":"bool"}],"name":"updateManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052348015600e575f5ffd5b506040516110d23803806110d2833981016040819052602b916074565b6001600160a01b0381165f8181526020819052604080822060019055518392917fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6091a25050609f565b5f602082840312156083575f5ffd5b81516001600160a01b03811681146098575f5ffd5b9392505050565b611026806100ac5f395ff3fe608060405234801561000f575f5ffd5b50600436106100ef575f3560e01c806309d2f9b4146100f35780633207adab1461011d5780633625342b14610132578063394847801461016f5780633f47e6621461019c57806341496296146101af5780635fb87f38146101c257806365fae35e146101d5578063747064d6146101e85780637ea8291f146101fb5780639090b6941461020e5780639c52a7f11461022e578063a6fd509b14610241578063b329dfda14610254578063bf353dbb14610267578063c014743014610294578063cb1c3dfb146102c9578063f039f72c146102e9578063ff01a6f71461031e575b5f5ffd5b610106610101366004610b7e565b610331565b60405160ff90911681526020015b60405180910390f35b61013061012b366004610b97565b61036f565b005b61015f610140366004610bfd565b600560209081525f928352604080842090915290825290205460ff1681565b6040519015158152602001610114565b61015f61017d366004610b7e565b6001600160801b03165f9081526001602052604090205460ff16151590565b6101066101aa366004610c2e565b610437565b61015f6101bd366004610c45565b610480565b6101306101d0366004610c5e565b6104b1565b6101306101e3366004610cda565b61057e565b6101306101f6366004610cf3565b6105f1565b610130610209366004610d14565b610678565b61022161021c366004610c45565b610761565b6040516101149190610d3c565b61013061023c366004610cda565b6107f8565b61013061024f366004610d71565b61086a565b610130610262366004610db9565b610960565b610286610275366004610cda565b5f6020819052908152604090205481565b604051908152602001610114565b6102bc6102a2366004610c2e565b60046020525f90815260409020546001600160a01b031681565b6040516101149190610df9565b6102dc6102d7366004610e0d565b610ac0565b6040516101149190610e49565b6103116102f7366004610c45565b60036020525f90815260409020546001600160801b031681565b6040516101149190610e5d565b61010661032c366004610c45565b610adf565b6001600160801b0381165f9081526001602052604090205460ff168061036a5760405163470cbf4760e01b815260040160405180910390fd5b919050565b335f9081526020819052604090205460011461039e5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160801b0382165f9081526001602052604090205460ff16156103d75760405163136d457160e21b815260040160405180910390fd5b6001600160801b0382165f81815260016020908152604091829020805460ff191660ff861690811790915591519182527f5aaa9bec45c8e2b5122562dc01afea55aa64db31706a761872fcecbc578e1a7191015b60405180910390a25050565b5f60015f61044484610b2e565b6001600160801b0316815260208101919091526040015f205460ff1690508061036a5760405163470cbf4760e01b815260040160405180910390fd5b6001600160401b0381165f908152600360205260408120546104aa906001600160801b0316610b5b565b1592915050565b335f908152602081905260409020546001146104e05760405163ea8e4eb560e01b815260040160405180910390fd5b6104e983610480565b8390610512576040516354110fdb60e01b81526004016105099190610e49565b60405180910390fd5b506001600160401b0383165f908152600260205260409020610535828483610f09565b50826001600160401b03167f90165bb7b56b76d7a65c821631b8eff1ecd002d67c1b03bf328e89d33a701e068383604051610571929190610fc2565b60405180910390a2505050565b335f908152602081905260409020546001146105ad5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381165f8181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b335f908152602081905260409020546001146106205760405163ea8e4eb560e01b815260040160405180910390fd5b5f828152600460205260409081902080546001600160a01b0319166001600160a01b0384161790555182907f4c0664b1004e3c8545899c63ea575f0de74640c09dd6ea7cc419c01e9bf77bcb9061042b908490610df9565b335f908152602081905260409020546001146106a75760405163ea8e4eb560e01b815260040160405180910390fd5b6106b082610480565b82906106d0576040516354110fdb60e01b81526004016105099190610e49565b506106e3816001600160801b0316610b5b565b1561070157604051630560d24960e11b815260040160405180910390fd5b6001600160401b0382165f818152600360205260409081902080546001600160801b0319166001600160801b038516179055517fa6d5df8fd30439056963fadd92b98f1c0175253469f894bd7a84ea410019bba59061042b908490610e5d565b60026020525f90815260409020805461077990610e85565b80601f01602080910402602001604051908101604052809291908181526020018280546107a590610e85565b80156107f05780601f106107c7576101008083540402835291602001916107f0565b820191905f5260205f20905b8154815290600101906020018083116107d357829003601f168201915b505050505081565b335f908152602081905260409020546001146108275760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381165f81815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b335f908152602081905260409020546001146108995760405163ea8e4eb560e01b815260040160405180910390fd5b6108a283610480565b83906108c2576040516354110fdb60e01b81526004016105099190610e49565b506001600160a01b0382166108ea57604051636eb80b5160e11b815260040160405180910390fd5b6001600160401b0383165f8181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f34d7bc620a98c7bbfc3e91245b8fd8cb1812543d39dffb55d1aafc6a44e3cdab91015b60405180910390a3505050565b335f9081526020819052604090205460011461098f5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0382166109b657604051636eb80b5160e11b815260040160405180910390fd5b6109c8816001600160801b0316610b5b565b156109e657604051630560d24960e11b815260040160405180910390fd5b6001600160401b0383165f90815260036020526040902054610a10906001600160801b0316610b5b565b610a2d576040516359f4180f60e11b815260040160405180910390fd5b6001600160401b0383165f8181526005602090815260408083206001600160a01b038716808552908352818420805460ff1916600117905593835260039091529081902080546001600160801b0385166001600160801b0319909116811790915590519091907f81f643865c0866521d6d17071e4ec2358fb0b285a9623d6706f42281ad28c45d90610953908790610e49565b5f61ffff60301b603084901b1665ffffffffffff8316175b9392505050565b6001600160401b0381165f908152600360209081526040808320546001600160801b03168352600190915290205460ff168061036a5760405163470cbf4760e01b815260040160405180910390fd5b5f6001600160801b03821115610b575760405163e999826d60e01b815260040160405180910390fd5b5090565b6001600160801b03161590565b80356001600160801b038116811461036a575f5ffd5b5f60208284031215610b8e575f5ffd5b610ad882610b68565b5f5f60408385031215610ba8575f5ffd5b610bb183610b68565b9150602083013560ff81168114610bc6575f5ffd5b809150509250929050565b80356001600160401b038116811461036a575f5ffd5b80356001600160a01b038116811461036a575f5ffd5b5f5f60408385031215610c0e575f5ffd5b610c1783610bd1565b9150610c2560208401610be7565b90509250929050565b5f60208284031215610c3e575f5ffd5b5035919050565b5f60208284031215610c55575f5ffd5b610ad882610bd1565b5f5f5f60408486031215610c70575f5ffd5b610c7984610bd1565b925060208401356001600160401b03811115610c93575f5ffd5b8401601f81018613610ca3575f5ffd5b80356001600160401b03811115610cb8575f5ffd5b866020828401011115610cc9575f5ffd5b939660209190910195509293505050565b5f60208284031215610cea575f5ffd5b610ad882610be7565b5f5f60408385031215610d04575f5ffd5b82359150610c2560208401610be7565b5f5f60408385031215610d25575f5ffd5b610d2e83610bd1565b9150610c2560208401610b68565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215610d83575f5ffd5b610d8c84610bd1565b9250610d9a60208501610be7565b915060408401358015158114610dae575f5ffd5b809150509250925092565b5f5f5f60608486031215610dcb575f5ffd5b610dd484610bd1565b9250610de260208501610be7565b9150610df060408501610b68565b90509250925092565b6001600160a01b0391909116815260200190565b5f5f60408385031215610e1e575f5ffd5b823561ffff81168114610e2f575f5ffd5b9150602083013565ffffffffffff81168114610bc6575f5ffd5b6001600160401b0391909116815260200190565b6001600160801b0391909116815260200190565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680610e9957607f821691505b602082108103610eb757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610f0457805f5260205f20601f840160051c81016020851015610ee25750805b601f840160051c820191505b81811015610f01575f8155600101610eee565b50505b505050565b6001600160401b03831115610f2057610f20610e71565b610f3483610f2e8354610e85565b83610ebd565b5f601f841160018114610f65575f8515610f4e5750838201355b5f19600387901b1c1916600186901b178355610f01565b5f83815260208120601f198716915b82811015610f945786850135825560209485019460019092019101610f74565b5086821015610fb0575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f1916010191905056fea264697066735822122008194eb9e3cf9d754d240d8d448d1a341dabc3cbb3a6f6caa6f2c85e09facfd864736f6c634300081c00330000000000000000000000005f3f8ea3b54bff7795de7754866e0eac52e0881d

Deployed Bytecode

0x608060405234801561000f575f5ffd5b50600436106100ef575f3560e01c806309d2f9b4146100f35780633207adab1461011d5780633625342b14610132578063394847801461016f5780633f47e6621461019c57806341496296146101af5780635fb87f38146101c257806365fae35e146101d5578063747064d6146101e85780637ea8291f146101fb5780639090b6941461020e5780639c52a7f11461022e578063a6fd509b14610241578063b329dfda14610254578063bf353dbb14610267578063c014743014610294578063cb1c3dfb146102c9578063f039f72c146102e9578063ff01a6f71461031e575b5f5ffd5b610106610101366004610b7e565b610331565b60405160ff90911681526020015b60405180910390f35b61013061012b366004610b97565b61036f565b005b61015f610140366004610bfd565b600560209081525f928352604080842090915290825290205460ff1681565b6040519015158152602001610114565b61015f61017d366004610b7e565b6001600160801b03165f9081526001602052604090205460ff16151590565b6101066101aa366004610c2e565b610437565b61015f6101bd366004610c45565b610480565b6101306101d0366004610c5e565b6104b1565b6101306101e3366004610cda565b61057e565b6101306101f6366004610cf3565b6105f1565b610130610209366004610d14565b610678565b61022161021c366004610c45565b610761565b6040516101149190610d3c565b61013061023c366004610cda565b6107f8565b61013061024f366004610d71565b61086a565b610130610262366004610db9565b610960565b610286610275366004610cda565b5f6020819052908152604090205481565b604051908152602001610114565b6102bc6102a2366004610c2e565b60046020525f90815260409020546001600160a01b031681565b6040516101149190610df9565b6102dc6102d7366004610e0d565b610ac0565b6040516101149190610e49565b6103116102f7366004610c45565b60036020525f90815260409020546001600160801b031681565b6040516101149190610e5d565b61010661032c366004610c45565b610adf565b6001600160801b0381165f9081526001602052604090205460ff168061036a5760405163470cbf4760e01b815260040160405180910390fd5b919050565b335f9081526020819052604090205460011461039e5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160801b0382165f9081526001602052604090205460ff16156103d75760405163136d457160e21b815260040160405180910390fd5b6001600160801b0382165f81815260016020908152604091829020805460ff191660ff861690811790915591519182527f5aaa9bec45c8e2b5122562dc01afea55aa64db31706a761872fcecbc578e1a7191015b60405180910390a25050565b5f60015f61044484610b2e565b6001600160801b0316815260208101919091526040015f205460ff1690508061036a5760405163470cbf4760e01b815260040160405180910390fd5b6001600160401b0381165f908152600360205260408120546104aa906001600160801b0316610b5b565b1592915050565b335f908152602081905260409020546001146104e05760405163ea8e4eb560e01b815260040160405180910390fd5b6104e983610480565b8390610512576040516354110fdb60e01b81526004016105099190610e49565b60405180910390fd5b506001600160401b0383165f908152600260205260409020610535828483610f09565b50826001600160401b03167f90165bb7b56b76d7a65c821631b8eff1ecd002d67c1b03bf328e89d33a701e068383604051610571929190610fc2565b60405180910390a2505050565b335f908152602081905260409020546001146105ad5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381165f8181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b335f908152602081905260409020546001146106205760405163ea8e4eb560e01b815260040160405180910390fd5b5f828152600460205260409081902080546001600160a01b0319166001600160a01b0384161790555182907f4c0664b1004e3c8545899c63ea575f0de74640c09dd6ea7cc419c01e9bf77bcb9061042b908490610df9565b335f908152602081905260409020546001146106a75760405163ea8e4eb560e01b815260040160405180910390fd5b6106b082610480565b82906106d0576040516354110fdb60e01b81526004016105099190610e49565b506106e3816001600160801b0316610b5b565b1561070157604051630560d24960e11b815260040160405180910390fd5b6001600160401b0382165f818152600360205260409081902080546001600160801b0319166001600160801b038516179055517fa6d5df8fd30439056963fadd92b98f1c0175253469f894bd7a84ea410019bba59061042b908490610e5d565b60026020525f90815260409020805461077990610e85565b80601f01602080910402602001604051908101604052809291908181526020018280546107a590610e85565b80156107f05780601f106107c7576101008083540402835291602001916107f0565b820191905f5260205f20905b8154815290600101906020018083116107d357829003601f168201915b505050505081565b335f908152602081905260409020546001146108275760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381165f81815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b335f908152602081905260409020546001146108995760405163ea8e4eb560e01b815260040160405180910390fd5b6108a283610480565b83906108c2576040516354110fdb60e01b81526004016105099190610e49565b506001600160a01b0382166108ea57604051636eb80b5160e11b815260040160405180910390fd5b6001600160401b0383165f8181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f34d7bc620a98c7bbfc3e91245b8fd8cb1812543d39dffb55d1aafc6a44e3cdab91015b60405180910390a3505050565b335f9081526020819052604090205460011461098f5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0382166109b657604051636eb80b5160e11b815260040160405180910390fd5b6109c8816001600160801b0316610b5b565b156109e657604051630560d24960e11b815260040160405180910390fd5b6001600160401b0383165f90815260036020526040902054610a10906001600160801b0316610b5b565b610a2d576040516359f4180f60e11b815260040160405180910390fd5b6001600160401b0383165f8181526005602090815260408083206001600160a01b038716808552908352818420805460ff1916600117905593835260039091529081902080546001600160801b0385166001600160801b0319909116811790915590519091907f81f643865c0866521d6d17071e4ec2358fb0b285a9623d6706f42281ad28c45d90610953908790610e49565b5f61ffff60301b603084901b1665ffffffffffff8316175b9392505050565b6001600160401b0381165f908152600360209081526040808320546001600160801b03168352600190915290205460ff168061036a5760405163470cbf4760e01b815260040160405180910390fd5b5f6001600160801b03821115610b575760405163e999826d60e01b815260040160405180910390fd5b5090565b6001600160801b03161590565b80356001600160801b038116811461036a575f5ffd5b5f60208284031215610b8e575f5ffd5b610ad882610b68565b5f5f60408385031215610ba8575f5ffd5b610bb183610b68565b9150602083013560ff81168114610bc6575f5ffd5b809150509250929050565b80356001600160401b038116811461036a575f5ffd5b80356001600160a01b038116811461036a575f5ffd5b5f5f60408385031215610c0e575f5ffd5b610c1783610bd1565b9150610c2560208401610be7565b90509250929050565b5f60208284031215610c3e575f5ffd5b5035919050565b5f60208284031215610c55575f5ffd5b610ad882610bd1565b5f5f5f60408486031215610c70575f5ffd5b610c7984610bd1565b925060208401356001600160401b03811115610c93575f5ffd5b8401601f81018613610ca3575f5ffd5b80356001600160401b03811115610cb8575f5ffd5b866020828401011115610cc9575f5ffd5b939660209190910195509293505050565b5f60208284031215610cea575f5ffd5b610ad882610be7565b5f5f60408385031215610d04575f5ffd5b82359150610c2560208401610be7565b5f5f60408385031215610d25575f5ffd5b610d2e83610bd1565b9150610c2560208401610b68565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f60608486031215610d83575f5ffd5b610d8c84610bd1565b9250610d9a60208501610be7565b915060408401358015158114610dae575f5ffd5b809150509250925092565b5f5f5f60608486031215610dcb575f5ffd5b610dd484610bd1565b9250610de260208501610be7565b9150610df060408501610b68565b90509250925092565b6001600160a01b0391909116815260200190565b5f5f60408385031215610e1e575f5ffd5b823561ffff81168114610e2f575f5ffd5b9150602083013565ffffffffffff81168114610bc6575f5ffd5b6001600160401b0391909116815260200190565b6001600160801b0391909116815260200190565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680610e9957607f821691505b602082108103610eb757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610f0457805f5260205f20601f840160051c81016020851015610ee25750805b601f840160051c820191505b81811015610f01575f8155600101610eee565b50505b505050565b6001600160401b03831115610f2057610f20610e71565b610f3483610f2e8354610e85565b83610ebd565b5f601f841160018114610f65575f8515610f4e5750838201355b5f19600387901b1c1916600186901b178355610f01565b5f83815260208120601f198716915b82811015610f945786850135825560209485019460019092019101610f74565b5086821015610fb0575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f1916010191905056fea264697066735822122008194eb9e3cf9d754d240d8d448d1a341dabc3cbb3a6f6caa6f2c85e09facfd864736f6c634300081c0033

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

0000000000000000000000005f3f8ea3b54bff7795de7754866e0eac52e0881d

-----Decoded View---------------
Arg [0] : deployer (address): 0x5f3f8ea3b54BFF7795dE7754866e0Eac52e0881d

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005f3f8ea3b54bff7795de7754866e0eac52e0881d


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  ]

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.