Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 121 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Balance | 21147201 | 10 hrs ago | IN | 0 ETH | 0.00042515 | ||||
Set Balance | 21140029 | 34 hrs ago | IN | 0 ETH | 0.00057596 | ||||
Set Balance | 21132883 | 2 days ago | IN | 0 ETH | 0.00072798 | ||||
Set Balance | 21126902 | 3 days ago | IN | 0 ETH | 0.00138779 | ||||
Set Balance | 21118579 | 4 days ago | IN | 0 ETH | 0.00027815 | ||||
Set Balance | 21111448 | 5 days ago | IN | 0 ETH | 0.00026382 | ||||
Set Balance | 21104070 | 6 days ago | IN | 0 ETH | 0.00024825 | ||||
Set Balance | 21096825 | 7 days ago | IN | 0 ETH | 0.00025616 | ||||
Set Balance | 21089803 | 8 days ago | IN | 0 ETH | 0.00043968 | ||||
Set Balance | 21082514 | 9 days ago | IN | 0 ETH | 0.00040725 | ||||
Set Balance | 21075274 | 10 days ago | IN | 0 ETH | 0.00041144 | ||||
Set Balance | 21068109 | 11 days ago | IN | 0 ETH | 0.00048488 | ||||
Set Balance | 21060952 | 12 days ago | IN | 0 ETH | 0.00028845 | ||||
Set Balance | 21053781 | 13 days ago | IN | 0 ETH | 0.00028082 | ||||
Set Balance | 21046609 | 14 days ago | IN | 0 ETH | 0.00027727 | ||||
Set Balance | 21039551 | 15 days ago | IN | 0 ETH | 0.0003006 | ||||
Set Balance | 21032368 | 16 days ago | IN | 0 ETH | 0.0004709 | ||||
Set Balance | 21025129 | 17 days ago | IN | 0 ETH | 0.00030982 | ||||
Set Balance | 21018050 | 18 days ago | IN | 0 ETH | 0.00033197 | ||||
Set Balance | 21010767 | 19 days ago | IN | 0 ETH | 0.00035431 | ||||
Set Balance | 21003608 | 20 days ago | IN | 0 ETH | 0.00033624 | ||||
Set Balance | 20996611 | 21 days ago | IN | 0 ETH | 0.00045609 | ||||
Set Balance | 20989253 | 22 days ago | IN | 0 ETH | 0.00054903 | ||||
Set Balance | 20982276 | 23 days ago | IN | 0 ETH | 0.00044874 | ||||
Set Balance | 20975164 | 24 days ago | IN | 0 ETH | 0.00059472 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BTCFeeIndex
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * _ _ _ _ _ * / \ | | | _(_)_ __ ___ (_)_ _ __ _ * / _ \ | | |/ / | '_ ` _ \| | | | |/ _` | * / ___ \| | <| | | | | | | | |_| | (_| | * /_/ \_\_|_|\_\_|_| |_| |_|_|\__, |\__,_| * ____ _____ ____ ___ |___/ * | __ )_ _/ ___| |_ _|_ __ __| | _____ __ * | _ \ | || | | || '_ \ / _` |/ _ \ \/ / * | |_) || || |___ | || | | | (_| | __/> < * |____/ |_| \____| |___|_| |_|\__,_|\___/_/\_\ */ import {Ownable} from "@openzeppelin/access/Ownable.sol"; import {ISilicaIndex} from "../interfaces/ISilicaIndex.sol"; import {ECDSA} from "@openzeppelin/utils/cryptography/ECDSA.sol"; import {Ownable2Step} from "@openzeppelin/access/Ownable2Step.sol"; import {AccessControl} from "@openzeppelin/access/AccessControl.sol"; /// @title Silica BTC Fee Index Contract /// @author Alkimiya /// @notice Methods to provide an index pertaining to BTC Transaction Fees to the Silica Pools contract contract BTCFeeIndex is ISilicaIndex, AccessControl, Ownable2Step { /*////////////////////////////////////////////////////////////// STATE VARIABLES //////////////////////////////////////////////////////////////*/ uint256 private _shares; uint256 private _balance; bytes32 private immutable _name; bytes32 private immutable _symbol; uint256 private immutable _decimals; address private immutable _balanceToken; event BTCFeeIndex__SharesUpdated(uint256 oldShares, uint256 newShares); event BTCFeeIndex__BalanceUpdated(uint256 oldBalance, uint256 newBalance); error BTCFeeIndex__InvalidShares(uint256 shares); error BTCFeeIndex__MathsError(uint256 valueChange); error BTCFeeIndex__InvalidSignature(bytes signature); error BTCFeeIndex__IncorrectHistoricalData(uint256 actualHistoricData); bytes32 public constant PUBLISHER_ROLE = keccak256("PUBLISHER_ROLE"); bytes32 public constant CALCULATOR_ROLE = keccak256("CALCULATOR_ROLE"); /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory name_, string memory symbol_, uint256 shares_, uint256 balance_, uint256 decimals_, address publisher_, address calculator_, address balanceToken_ ) Ownable(msg.sender) { require(bytes(name_).length > 0, "Name cannot be empty"); require(bytes(symbol_).length > 0, "Symbol cannot be empty"); require(bytes(name_).length <= 32, "Name cannot exceed 32 bytes"); require(bytes(symbol_).length <= 32, "Symbol cannot exceed 32 bytes"); require(shares_ > 0, "Index shares must be greater than zero"); require(publisher_ != address(0), "Publisher cannot be zero address"); require(calculator_ != address(0), "Calculator cannot be zero address"); require(balanceToken_ != address(0), "Balance Token cannot be zero address"); _name = bytes32(bytes(name_)); _symbol = bytes32(bytes(symbol_)); _shares = shares_; _balance = balance_; _decimals = decimals_; _balanceToken = balanceToken_; _grantRole(PUBLISHER_ROLE, publisher_); _grantRole(CALCULATOR_ROLE, calculator_); _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); emit BTCFeeIndex__SharesUpdated(0, shares_); emit BTCFeeIndex__BalanceUpdated(0, balance_); } /*////////////////////////////////////////////////////////////// OWNER FUNCTIONS //////////////////////////////////////////////////////////////*/ /// @dev Grants `role` to `account`. /// @notice The caller must have ``role``'s admin role. /// If `account` had not been already granted `role`, emits {RoleGranted}event. function grantRole(bytes32 role, address account) public override onlyOwner { _grantRole(role, account); } /*////////////////////////////////////////////////////////////// EXTERNAL PERMISSIONED FUNCTIONS //////////////////////////////////////////////////////////////*/ /// @notice Tracks the balance accumulated by the `shares()`. /// @param oldBalance The old balance. /// @param newBalance The new balance. /// @param balanceChange The change in balance. /// @dev This function is only callable by callers with publisher role. function setBalance( uint256 oldBalance, uint256 newBalance, uint256 balanceChange, uint256 expiry, bytes calldata signature ) external onlyRole(PUBLISHER_ROLE) { if (oldBalance != _balance) { revert BTCFeeIndex__IncorrectHistoricalData(_balance); } if (oldBalance >= newBalance) { if (balanceChange != oldBalance - newBalance) { revert BTCFeeIndex__MathsError(balanceChange); } } else if (oldBalance < newBalance) { if (balanceChange != newBalance - oldBalance) { revert BTCFeeIndex__MathsError(balanceChange); } } require(block.timestamp <= expiry, "signature expired"); bytes32 calculatorMessageHash = keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256(abi.encode(0x01, oldBalance, newBalance, balanceChange, expiry)) ) ); require(hasRole(CALCULATOR_ROLE, ECDSA.recover(calculatorMessageHash, signature)), "Invalid Signature"); _balance = newBalance; emit BTCFeeIndex__BalanceUpdated(oldBalance, newBalance); } /// @notice Sets the number of shares (Size of the position tracked by this index) /// @param oldShares The old number of shares. /// @param newShares The new number of shares. /// @param sharesChange The change in shares. /// @dev This function is only callable by callers with publisher role. function setShares(uint256 oldShares, uint256 newShares, uint256 sharesChange, bytes calldata signature) external onlyRole(PUBLISHER_ROLE) { if (newShares == 0) { revert BTCFeeIndex__InvalidShares(newShares); } if (oldShares != _shares) { revert BTCFeeIndex__IncorrectHistoricalData(_shares); } if (oldShares >= newShares) { if (sharesChange != oldShares - newShares) { revert BTCFeeIndex__MathsError(sharesChange); } } else if (oldShares < newShares) { if (sharesChange != newShares - oldShares) { revert BTCFeeIndex__MathsError(sharesChange); } } bytes32 calculatorMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(abi.encode(newShares)))); require(hasRole(CALCULATOR_ROLE, ECDSA.recover(calculatorMessageHash, signature)), "Invalid Signature"); _shares = newShares; emit BTCFeeIndex__SharesUpdated(oldShares, newShares); } /*////////////////////////////////////////////////////////////// EXTERNAL VIEW FUNCTIONS //////////////////////////////////////////////////////////////*/ /// @inheritdoc ISilicaIndex function name() external view returns (string memory) { return string(abi.encodePacked(_name)); } /// @inheritdoc ISilicaIndex function symbol() external view returns (string memory) { return string(abi.encodePacked(_symbol)); } /// @inheritdoc ISilicaIndex function decimals() external view returns (uint256) { return _decimals; } /// @inheritdoc ISilicaIndex function shares() external view returns (uint256) { return _shares; } /// @inheritdoc ISilicaIndex function balanceToken() external view returns (address) { return _balanceToken; } /// @inheritdoc ISilicaIndex function balance() external view returns (uint256) { return _balance; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * _ _ _ _ _ * / \ | | | _(_)_ __ ___ (_)_ _ __ _ * / _ \ | | |/ / | '_ ` _ \| | | | |/ _` | * / ___ \| | <| | | | | | | | |_| | (_| | * /_/_ \_\_|_|\_\_|_| |_| |_|_|\__, |\__,_| * |_ _|_ __ __| | _____ __ |___/ * | || '_ \ / _` |/ _ \ \/ / * | || | | | (_| | __/> < * |___|_| |_|\__,_|\___/_/\_\ */ /// @title Silica Index Protocol /// @author Alkimiya /// @notice Required methods for a contract to provide an index to Silica Pools interface ISilicaIndex { /// @return A name suitable for display as a page title or heading. /// @custom:example "Bitcoin Mining Yield" /// @custom:example "Lido Staked Ethereum Yield" /// @custom:example "Gas Costs" /// @custom:since 0.1.0 function name() external view returns (string memory); /// @return Short name of the display units of `shares()`. /// @custom:example "PH/s" /// @custom:example "ystETH" /// @custom:example "kgas" /// @custom:since 0.1.0 function symbol() external view returns (string memory); /// @return Decimal offset of `symbol()` vs indivisible units of `shares()`. /// @custom:example If 1 `symbol()` (e.g. "PH/s") represents /// 1e15 `shares()` (e.g. H/s) /// then `decimals()` should return 15. /// @custom:example If 1 `symbol()` (e.g. "ystETH") represents /// 1e18 `shares()` (e.g. wei) /// then `decimals()` should return 18. /// @custom:example If 1 `symbol()` (e.g. "kgas") represents /// 1e6 `shares()` (e.g. milligas per block) /// then `decimals()` should return 6. /// @custom:since 0.1.0 function decimals() external view returns (uint256); /// @notice Size of the position tracked by this index. /// Clients SHOULD NOT assume that this value is constant. /// Clients SHOULD denominate pool shares in the same denomination /// as `ISilicaIndex.shares()` (see: `symbol()`, `decimals()`). /// @custom:example 1e15 H/s. /// @custom:example `ILido.getPooledEthByShares(1 ether)` stETH wei. /// @custom:example 1e3 milligas per block /// @custom:since 0.1.0 function shares() external view returns (uint256); /// @notice Clients MAY transact in any token which is pegged to /// `balanceToken()`, as long as the `decimals()` match. /// Clients SHOULD NOT transact in a token which is not pegged to /// `balanceToken()`; the resulting financial contract will not /// make sense. /// @custom:example 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 (WBTC on mainnet) /// @custom:example 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84 (stETH on mainnet) /// @custom:example 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 (WETH on mainnet) /// @custom:since 0.1.0 function balanceToken() external view returns (address); /// @return Tracks the balance accumulated by the `shares()`. /// @notice This is not required to increase over time. /// Clients SHOULD have defensive programming against underflow /// when taking `balance() - initialBalance`. /// @custom:example WBTC earned per PH/s since Jan 1, 2023. /// @custom:example `ILido.getPooledEthByShares(1 ether)` stETH. /// @custom:example Running cost to transact 1 gas every block since Jan 1, 2023. /// @custom:since 0.1.0 function balance() external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.20; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS } /** * @dev The signature derives the `address(0)`. */ error ECDSAInvalidSignature(); /** * @dev The signature has an invalid length. */ error ECDSAInvalidSignatureLength(uint256 length); /** * @dev The signature has an S value that is in the upper half order. */ error ECDSAInvalidSignatureS(bytes32 s); /** * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not * return address(0) without also returning an error description. Errors are documented using an enum (error type) * and a bytes32 providing additional information about the error. * * If no error is returned, then the address can be used for verification purposes. * * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length)); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature); _throwError(error, errorArg); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) { unchecked { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); // We do not check for an overflow here since the shift operation results in 0 or 1. uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs); _throwError(error, errorArg); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError, bytes32) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS, s); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature, bytes32(0)); } return (signer, RecoverError.NoError, bytes32(0)); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s); _throwError(error, errorArg); return recovered; } /** * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided. */ function _throwError(RecoverError error, bytes32 errorArg) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert ECDSAInvalidSignature(); } else if (error == RecoverError.InvalidSignatureLength) { revert ECDSAInvalidSignatureLength(uint256(errorArg)); } else if (error == RecoverError.InvalidSignatureS) { revert ECDSAInvalidSignatureS(errorArg); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable2Step.sol) pragma solidity ^0.8.20; import {Ownable} from "./Ownable.sol"; /** * @dev Contract module which provides access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is specified at deployment time in the constructor for `Ownable`. This * can later be changed with {transferOwnership} and {acceptOwnership}. * * This module is used through inheritance. It will make available all functions * from parent (Ownable). */ abstract contract Ownable2Step is Ownable { address private _pendingOwner; event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the pending owner. */ function pendingOwner() public view virtual returns (address) { return _pendingOwner; } /** * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual override onlyOwner { _pendingOwner = newOwner; emit OwnershipTransferStarted(owner(), newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner. * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual override { delete _pendingOwner; super._transferOwnership(newOwner); } /** * @dev The new owner accepts the ownership transfer. */ function acceptOwnership() public virtual { address sender = _msgSender(); if (pendingOwner() != sender) { revert OwnableUnauthorizedAccount(sender); } _transferOwnership(sender); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) pragma solidity ^0.8.20; import {IAccessControl} from "./IAccessControl.sol"; import {Context} from "../utils/Context.sol"; import {ERC165} from "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "remappings": [ "@openzeppelin/=lib/openzeppelin-contracts/contracts/", "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "solady/=lib/solady/src/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "openzeppelin-contracts/=lib/openzeppelin-contracts/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "viaIR": true, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"uint256","name":"balance_","type":"uint256"},{"internalType":"uint256","name":"decimals_","type":"uint256"},{"internalType":"address","name":"publisher_","type":"address"},{"internalType":"address","name":"calculator_","type":"address"},{"internalType":"address","name":"balanceToken_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"uint256","name":"actualHistoricData","type":"uint256"}],"name":"BTCFeeIndex__IncorrectHistoricalData","type":"error"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"BTCFeeIndex__InvalidShares","type":"error"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"BTCFeeIndex__InvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"valueChange","type":"uint256"}],"name":"BTCFeeIndex__MathsError","type":"error"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"BTCFeeIndex__BalanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newShares","type":"uint256"}],"name":"BTCFeeIndex__SharesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"CALCULATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLISHER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"oldBalance","type":"uint256"},{"internalType":"uint256","name":"newBalance","type":"uint256"},{"internalType":"uint256","name":"balanceChange","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"setBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"oldShares","type":"uint256"},{"internalType":"uint256","name":"newShares","type":"uint256"},{"internalType":"uint256","name":"sharesChange","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"setShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6040610100815234620004865762001695803803806200001f816200048b565b92833981019061010081830312620004865780516001600160401b03919082811162000486578362000053918301620004c7565b9160209384830151918211620004865762000070918301620004c7565b90848101519160608201519360808301516200008f60a0850162000539565b92620000ac60e0620000a460c0880162000539565b960162000539565b9233156200046e57600280546001600160a01b0319908116909155600180543392811683179091558b516001600160a01b0392909183167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a38251156200042c5750825115620003e85789825111620003a45789835111620003605787156200030d5780861615620002cb57808716156200027d578416156200022d5794620001d07ffb1ac5b4eed2952ef73b14a9735ed73c98facf1faac45107d335910a51b15a03958b9997957fde8fd0a0fcc1113e21498c9f45f7effc814c72724f4f0fb11d026842d41d29009b9995620001b9620001d796620001b08e9a6200054e565b6080526200054e565b60a052866003558960045560c05260e05262000572565b5062000614565b50620001e333620006b1565b508151906000825285820152a182519160008352820152a151610f439081620007328239608051816107d1015260a051816102f2015260c05181610532015260e0518161028d0152f35b895162461bcd60e51b8152600481018a90526024808201527f42616c616e636520546f6b656e2063616e6e6f74206265207a65726f206164646044820152637265737360e01b6064820152608490fd5b8a5162461bcd60e51b8152600481018b9052602160248201527f43616c63756c61746f722063616e6e6f74206265207a65726f206164647265736044820152607360f81b6064820152608490fd5b60648a8c519062461bcd60e51b825280600483015260248201527f5075626c69736865722063616e6e6f74206265207a65726f20616464726573736044820152fd5b8a5162461bcd60e51b8152600481018b9052602660248201527f496e64657820736861726573206d7573742062652067726561746572207468616044820152656e207a65726f60d01b6064820152608490fd5b8a5162461bcd60e51b8152600481018b9052601d60248201527f53796d626f6c2063616e6e6f74206578636565642033322062797465730000006044820152606490fd5b8a5162461bcd60e51b8152600481018b9052601b60248201527f4e616d652063616e6e6f742065786365656420333220627974657300000000006044820152606490fd5b8a5162461bcd60e51b8152600481018b9052601660248201527f53796d626f6c2063616e6e6f7420626520656d707479000000000000000000006044820152606490fd5b62461bcd60e51b8152600481018b9052601460248201527f4e616d652063616e6e6f7420626520656d7074790000000000000000000000006044820152606490fd5b8951631e4fbdf760e01b815260006004820152602490fd5b600080fd5b6040519190601f01601f191682016001600160401b03811183821017620004b157604052565b634e487b7160e01b600052604160045260246000fd5b919080601f84011215620004865782516001600160401b038111620004b157602090620004fd601f8201601f191683016200048b565b92818452828287010111620004865760005b8181106200052557508260009394955001015290565b85810183015184820184015282016200050f565b51906001600160a01b03821682036200048657565b60208151910151906020811062000563575090565b6000199060200360031b1b1690565b6001600160a01b031660008181527f1d25d1bf9fe9bf50e1f6171a16c19ebe436b569b4a0755088949ca7700858eea60205260408120549091907f0ac90c257048ef1c3e387c26d4a99bde06894efbcbff862dc1885c3a9319308a9060ff166200060f57808352826020526040832082845260205260408320600160ff1982541617905560008051602062001675833981519152339380a4600190565b505090565b6001600160a01b031660008181527fc93db56f66cc0b7b0a99b4413c01d15b85ad8753fd1d7d081dc81f63d33624b060205260408120549091907f49e5b8548b5bb0055e7e9cb1e982f642296e438bfc6aebfb9f4e4d3dd6bb5d6d9060ff166200060f57808352826020526040832082845260205260408320600160ff1982541617905560008051602062001675833981519152339380a4600190565b6001600160a01b031660008181527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604081205490919060ff166200072d57818052816020526040822081835260205260408220600160ff198254161790553391600080516020620016758339815191528180a4600190565b509056fe60406080815260048036101561001457600080fd5b600091823560e01c9081630197c9ae1461087857816301ffc9a71461082157816303314efa1461080257816306fdde03146107b657816316c7cdb4146105ac578163248a9ca3146105815781632f2ff15d14610555578163313ce5671461051a57816336568abe146104d3578163715018a61461046957816379ba5097146103dc578163832fdca7146103a15781638da5cb5b1461037857816391d148541461033157816395d89b41146102d7578163a217fddf146102bc578163a30955af14610278578163b69ef8a814610259578163d547741f146101ea578163d8f4b6fd146101af578163e30c397814610186575063f2fde38b1461011457600080fd5b3461018257602036600319011261018257356001600160a01b038181169182900361017e57610141610d90565b600280546001600160a01b03191683179055600154167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b8280fd5b5080fd5b83903461018257816003193601126101825760025490516001600160a01b039091168152602090f35b839034610182578160031936011261018257602090517f0ac90c257048ef1c3e387c26d4a99bde06894efbcbff862dc1885c3a9319308a8152f35b8383346101825782600319360112610182578035610206610b09565b91818452836020526001858520015480855285852033865260205260ff86862054161561023c57846102388585610d1b565b5080f35b6044925085519163e2517d3f60e01b835233908301526024820152fd5b9190503461017e578260031936011261017e5760209250549051908152f35b839034610182578160031936011261018257517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b83903461018257816003193601126101825751908152602090f35b8390346101825781600319360112610182578061032d9151907f000000000000000000000000000000000000000000000000000000000000000060208301526020825261032382610b74565b5191829182610ac0565b0390f35b9190503461017e578160031936011261017e578160209360ff92610353610b09565b903582528186528282206001600160a01b039091168252855220549151911615158152f35b83903461018257816003193601126101825760015490516001600160a01b039091168152602090f35b839034610182578160031936011261018257602090517f49e5b8548b5bb0055e7e9cb1e982f642296e438bfc6aebfb9f4e4d3dd6bb5d6d8152f35b90503461017e578260031936011261017e57600254916001600160a01b039133838516036104525750506bffffffffffffffffffffffff60a01b8092166002556001549133908316176001553391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b60249250519063118cdaa760e01b82523390820152fd5b83346104d057806003193601126104d057610482610d90565b600280546001600160a01b031990811690915560018054918216905581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b80fd5b839150346101825780600319360112610182576104ee610b09565b90336001600160a01b0383160361050b5750610238919235610d1b565b5163334bd91960e11b81528390fd5b839034610182578160031936011261018257602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b90503461017e573660031901126101825761023890610572610b09565b9061057b610d90565b35610c9d565b9190503461017e57602036600319011261017e57816020936001923581528085522001549051908152f35b8391503461018257608036600319011261018257823560243560443560643567ffffffffffffffff81116107b2576105e79036908801610a8d565b9690916105f2610c23565b831561079b5760035480860361078557508385108061072a57506106168486610b1f565b81036107145750506106bc6106b37ffb1ac5b4eed2952ef73b14a9735ed73c98facf1faac45107d335910a51b15a0396975b6106ad8751946020958681019088825287815261066481610b74565b5190208951878101917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008352603c820152603c81526106a281610b42565b519020923691610b90565b90610dbc565b90929192610e88565b7f49e5b8548b5bb0055e7e9cb1e982f642296e438bfc6aebfb9f4e4d3dd6bb5d6d87528682528487206001600160a01b0390911687528152838620546107049060ff16610be3565b816003558351928352820152a180f35b8551637087116960e11b81529182015260249150fd5b61075f575b50506106bc6106b37ffb1ac5b4eed2952ef73b14a9735ed73c98facf1faac45107d335910a51b15a039697610648565b6107698585610b1f565b811461072f578551637087116960e11b81529182015260249150fd5b82602491885191637bc8c46960e11b8352820152fd5b8551634cf1a45360e11b8152808301859052602490fd5b8580fd5b8390346101825781600319360112610182578061032d9151907f000000000000000000000000000000000000000000000000000000000000000060208301526020825261032382610b74565b8390346101825781600319360112610182576020906003549051908152f35b9190503461017e57602036600319011261017e57359063ffffffff60e01b821680920361017e5760209250637965db0b60e01b8214918215610867575b50519015158152f35b6301ffc9a760e01b1491503861085e565b839150346101825760a036600319011261018257823560248035906044359060643567ffffffffffffffff608435818111610a89576108ba9036908b01610a8d565b9490936108c5610c23565b8a54808903610a74575086881080610a4b57506108e28789610b1f565b8203610a37575b834211610a0157885193602085019260018452898b870152886060870152608086015260a085015260a0845260c0840192848410908411176109f05750936106ad7fde8fd0a0fcc1113e21498c9f45f7effc814c72724f4f0fb11d026842d41d2900999a94610998948489986106b3968d528251902060fc60e08401937f19457468657265756d205369676e6564204d6573736167653a0a33320000000085520152603c81526106a281610b42565b7f49e5b8548b5bb0055e7e9cb1e982f642296e438bfc6aebfb9f4e4d3dd6bb5d6d885260208881528689206001600160a01b03909216895252848720546109e19060ff16610be3565b5582519182526020820152a180f35b634e487b7160e01b8a5260418b5289fd5b8a601160649260208c519362461bcd60e51b8552840152820152701cda59db985d1d5c9948195e1c1a5c9959607a1b6044820152fd5b8851637087116960e11b8152808c01839052fd5b156108e957610a5a8888610b1f565b82146108e9578851637087116960e11b8152808c01839052fd5b8951637bc8c46960e11b8152808d0191909152fd5b8880fd5b9181601f84011215610abb5782359167ffffffffffffffff8311610abb5760208381860195010111610abb57565b600080fd5b6020808252825181830181905290939260005b828110610af557505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501610ad3565b602435906001600160a01b0382168203610abb57565b91908203918211610b2c57565b634e487b7160e01b600052601160045260246000fd5b6060810190811067ffffffffffffffff821117610b5e57604052565b634e487b7160e01b600052604160045260246000fd5b6040810190811067ffffffffffffffff821117610b5e57604052565b92919267ffffffffffffffff91828111610b5e5760405192601f8201601f19908116603f0116840190811184821017610b5e57604052829481845281830111610abb578281602093846000960137010152565b15610bea57565b60405162461bcd60e51b8152602060048201526011602482015270496e76616c6964205369676e617475726560781b6044820152606490fd5b3360009081527f1d25d1bf9fe9bf50e1f6171a16c19ebe436b569b4a0755088949ca7700858eea60205260409020547f0ac90c257048ef1c3e387c26d4a99bde06894efbcbff862dc1885c3a9319308a9060ff1615610c7f5750565b6044906040519063e2517d3f60e01b82523360048301526024820152fd5b9060009180835282602052604083209160018060a01b03169182845260205260ff60408420541615600014610d1657808352826020526040832082845260205260408320600160ff198254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4600190565b505090565b9060009180835282602052604083209160018060a01b03169182845260205260ff604084205416600014610d165780835282602052604083208284526020526040832060ff1981541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4600190565b6001546001600160a01b03163303610da457565b60405163118cdaa760e01b8152336004820152602490fd5b8151919060418303610ded57610de692506020820151906060604084015193015160001a90610df8565b9192909190565b505060009160029190565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411610e7c57926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa15610e705780516001600160a01b03811615610e6757918190565b50809160019190565b604051903d90823e3d90fd5b50505060009160039190565b6004811015610ef75780610e9a575050565b60018103610eb45760405163f645eedf60e01b8152600490fd5b60028103610ed55760405163fce698f760e01b815260048101839052602490fd5b600314610edf5750565b602490604051906335e2f38360e21b82526004820152fd5b634e487b7160e01b600052602160045260246000fdfea2646970667358221220d7040d8506bc22aea61c1fe1d760f231ca1a8bbf69a383b6cfa8fda4aa0b44d064736f6c634300081400332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000007be26e3b128f30747fc0a01ee7981af7bb4fee85000000000000000000000000803b3b882d5711410f32ccea233373f8c9e5bbfa0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000000000000000000000000000000000000000000104254432054782046656520496e64657800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000876422f626c6f636b000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60406080815260048036101561001457600080fd5b600091823560e01c9081630197c9ae1461087857816301ffc9a71461082157816303314efa1461080257816306fdde03146107b657816316c7cdb4146105ac578163248a9ca3146105815781632f2ff15d14610555578163313ce5671461051a57816336568abe146104d3578163715018a61461046957816379ba5097146103dc578163832fdca7146103a15781638da5cb5b1461037857816391d148541461033157816395d89b41146102d7578163a217fddf146102bc578163a30955af14610278578163b69ef8a814610259578163d547741f146101ea578163d8f4b6fd146101af578163e30c397814610186575063f2fde38b1461011457600080fd5b3461018257602036600319011261018257356001600160a01b038181169182900361017e57610141610d90565b600280546001600160a01b03191683179055600154167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b8280fd5b5080fd5b83903461018257816003193601126101825760025490516001600160a01b039091168152602090f35b839034610182578160031936011261018257602090517f0ac90c257048ef1c3e387c26d4a99bde06894efbcbff862dc1885c3a9319308a8152f35b8383346101825782600319360112610182578035610206610b09565b91818452836020526001858520015480855285852033865260205260ff86862054161561023c57846102388585610d1b565b5080f35b6044925085519163e2517d3f60e01b835233908301526024820152fd5b9190503461017e578260031936011261017e5760209250549051908152f35b839034610182578160031936011261018257517f0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5996001600160a01b03168152602090f35b83903461018257816003193601126101825751908152602090f35b8390346101825781600319360112610182578061032d9151907f76422f626c6f636b00000000000000000000000000000000000000000000000060208301526020825261032382610b74565b5191829182610ac0565b0390f35b9190503461017e578160031936011261017e578160209360ff92610353610b09565b903582528186528282206001600160a01b039091168252855220549151911615158152f35b83903461018257816003193601126101825760015490516001600160a01b039091168152602090f35b839034610182578160031936011261018257602090517f49e5b8548b5bb0055e7e9cb1e982f642296e438bfc6aebfb9f4e4d3dd6bb5d6d8152f35b90503461017e578260031936011261017e57600254916001600160a01b039133838516036104525750506bffffffffffffffffffffffff60a01b8092166002556001549133908316176001553391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b60249250519063118cdaa760e01b82523390820152fd5b83346104d057806003193601126104d057610482610d90565b600280546001600160a01b031990811690915560018054918216905581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b80fd5b839150346101825780600319360112610182576104ee610b09565b90336001600160a01b0383160361050b5750610238919235610d1b565b5163334bd91960e11b81528390fd5b839034610182578160031936011261018257602090517f00000000000000000000000000000000000000000000000000000000000000038152f35b90503461017e573660031901126101825761023890610572610b09565b9061057b610d90565b35610c9d565b9190503461017e57602036600319011261017e57816020936001923581528085522001549051908152f35b8391503461018257608036600319011261018257823560243560443560643567ffffffffffffffff81116107b2576105e79036908801610a8d565b9690916105f2610c23565b831561079b5760035480860361078557508385108061072a57506106168486610b1f565b81036107145750506106bc6106b37ffb1ac5b4eed2952ef73b14a9735ed73c98facf1faac45107d335910a51b15a0396975b6106ad8751946020958681019088825287815261066481610b74565b5190208951878101917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008352603c820152603c81526106a281610b42565b519020923691610b90565b90610dbc565b90929192610e88565b7f49e5b8548b5bb0055e7e9cb1e982f642296e438bfc6aebfb9f4e4d3dd6bb5d6d87528682528487206001600160a01b0390911687528152838620546107049060ff16610be3565b816003558351928352820152a180f35b8551637087116960e11b81529182015260249150fd5b61075f575b50506106bc6106b37ffb1ac5b4eed2952ef73b14a9735ed73c98facf1faac45107d335910a51b15a039697610648565b6107698585610b1f565b811461072f578551637087116960e11b81529182015260249150fd5b82602491885191637bc8c46960e11b8352820152fd5b8551634cf1a45360e11b8152808301859052602490fd5b8580fd5b8390346101825781600319360112610182578061032d9151907f4254432054782046656520496e6465780000000000000000000000000000000060208301526020825261032382610b74565b8390346101825781600319360112610182576020906003549051908152f35b9190503461017e57602036600319011261017e57359063ffffffff60e01b821680920361017e5760209250637965db0b60e01b8214918215610867575b50519015158152f35b6301ffc9a760e01b1491503861085e565b839150346101825760a036600319011261018257823560248035906044359060643567ffffffffffffffff608435818111610a89576108ba9036908b01610a8d565b9490936108c5610c23565b8a54808903610a74575086881080610a4b57506108e28789610b1f565b8203610a37575b834211610a0157885193602085019260018452898b870152886060870152608086015260a085015260a0845260c0840192848410908411176109f05750936106ad7fde8fd0a0fcc1113e21498c9f45f7effc814c72724f4f0fb11d026842d41d2900999a94610998948489986106b3968d528251902060fc60e08401937f19457468657265756d205369676e6564204d6573736167653a0a33320000000085520152603c81526106a281610b42565b7f49e5b8548b5bb0055e7e9cb1e982f642296e438bfc6aebfb9f4e4d3dd6bb5d6d885260208881528689206001600160a01b03909216895252848720546109e19060ff16610be3565b5582519182526020820152a180f35b634e487b7160e01b8a5260418b5289fd5b8a601160649260208c519362461bcd60e51b8552840152820152701cda59db985d1d5c9948195e1c1a5c9959607a1b6044820152fd5b8851637087116960e11b8152808c01839052fd5b156108e957610a5a8888610b1f565b82146108e9578851637087116960e11b8152808c01839052fd5b8951637bc8c46960e11b8152808d0191909152fd5b8880fd5b9181601f84011215610abb5782359167ffffffffffffffff8311610abb5760208381860195010111610abb57565b600080fd5b6020808252825181830181905290939260005b828110610af557505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501610ad3565b602435906001600160a01b0382168203610abb57565b91908203918211610b2c57565b634e487b7160e01b600052601160045260246000fd5b6060810190811067ffffffffffffffff821117610b5e57604052565b634e487b7160e01b600052604160045260246000fd5b6040810190811067ffffffffffffffff821117610b5e57604052565b92919267ffffffffffffffff91828111610b5e5760405192601f8201601f19908116603f0116840190811184821017610b5e57604052829481845281830111610abb578281602093846000960137010152565b15610bea57565b60405162461bcd60e51b8152602060048201526011602482015270496e76616c6964205369676e617475726560781b6044820152606490fd5b3360009081527f1d25d1bf9fe9bf50e1f6171a16c19ebe436b569b4a0755088949ca7700858eea60205260409020547f0ac90c257048ef1c3e387c26d4a99bde06894efbcbff862dc1885c3a9319308a9060ff1615610c7f5750565b6044906040519063e2517d3f60e01b82523360048301526024820152fd5b9060009180835282602052604083209160018060a01b03169182845260205260ff60408420541615600014610d1657808352826020526040832082845260205260408320600160ff198254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4600190565b505090565b9060009180835282602052604083209160018060a01b03169182845260205260ff604084205416600014610d165780835282602052604083208284526020526040832060ff1981541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4600190565b6001546001600160a01b03163303610da457565b60405163118cdaa760e01b8152336004820152602490fd5b8151919060418303610ded57610de692506020820151906060604084015193015160001a90610df8565b9192909190565b505060009160029190565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411610e7c57926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa15610e705780516001600160a01b03811615610e6757918190565b50809160019190565b604051903d90823e3d90fd5b50505060009160039190565b6004811015610ef75780610e9a575050565b60018103610eb45760405163f645eedf60e01b8152600490fd5b60028103610ed55760405163fce698f760e01b815260048101839052602490fd5b600314610edf5750565b602490604051906335e2f38360e21b82526004820152fd5b634e487b7160e01b600052602160045260246000fdfea2646970667358221220d7040d8506bc22aea61c1fe1d760f231ca1a8bbf69a383b6cfa8fda4aa0b44d064736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000007be26e3b128f30747fc0a01ee7981af7bb4fee85000000000000000000000000803b3b882d5711410f32ccea233373f8c9e5bbfa0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000000000000000000000000000000000000000000104254432054782046656520496e64657800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000876422f626c6f636b000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): BTC Tx Fee Index
Arg [1] : symbol_ (string): vB/block
Arg [2] : shares_ (uint256): 1000
Arg [3] : balance_ (uint256): 0
Arg [4] : decimals_ (uint256): 3
Arg [5] : publisher_ (address): 0x7BE26E3b128f30747fC0a01EE7981aF7bb4Fee85
Arg [6] : calculator_ (address): 0x803b3b882D5711410f32cceA233373f8C9e5bbFA
Arg [7] : balanceToken_ (address): 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 0000000000000000000000007be26e3b128f30747fc0a01ee7981af7bb4fee85
Arg [6] : 000000000000000000000000803b3b882d5711410f32ccea233373f8c9e5bbfa
Arg [7] : 0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [9] : 4254432054782046656520496e64657800000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [11] : 76422f626c6f636b000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.