Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 32901335 | 194 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
HubRegistry
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 1 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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);
}{
"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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.