ETH Price: $2,842.66 (-3.27%)
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

Please try again later

Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FolioVersionRegistry

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

import { IRoleRegistry } from "@interfaces/IRoleRegistry.sol";
import { IFolioDeployer } from "@interfaces/IFolioDeployer.sol";
import { IFolioVersionRegistry } from "@interfaces/IFolioVersionRegistry.sol";

import { Versioned } from "@utils/Versioned.sol";

/**
 * @title FolioVersionRegistry
 * @author akshatmittal, julianmrodri, pmckelvy1, tbrent
 * @notice FolioVersionRegistry tracks Folio deployments by their version string
 */
contract FolioVersionRegistry is IFolioVersionRegistry {
    IRoleRegistry public immutable roleRegistry;

    mapping(bytes32 => IFolioDeployer) public deployments;
    mapping(bytes32 => bool) public isDeprecated;
    bytes32 private latestVersion;

    constructor(IRoleRegistry _roleRegistry) {
        require(address(_roleRegistry) != address(0), VersionRegistry__ZeroAddress());

        roleRegistry = _roleRegistry;
    }

    function registerVersion(IFolioDeployer folioDeployer) external {
        require(roleRegistry.isOwner(msg.sender), VersionRegistry__InvalidCaller());

        require(address(folioDeployer) != address(0), VersionRegistry__ZeroAddress());

        string memory version = Versioned(address(folioDeployer)).version();
        bytes32 versionHash = keccak256(abi.encodePacked(version));

        require(address(deployments[versionHash]) == address(0), VersionRegistry__InvalidRegistration());

        deployments[versionHash] = folioDeployer;
        latestVersion = versionHash;

        emit VersionRegistered(versionHash, folioDeployer);
    }

    function deprecateVersion(bytes32 versionHash) external {
        require(roleRegistry.isOwnerOrEmergencyCouncil(msg.sender), VersionRegistry__InvalidCaller());

        require(!isDeprecated[versionHash], VersionRegistry__AlreadyDeprecated());

        isDeprecated[versionHash] = true;

        emit VersionDeprecated(versionHash);
    }

    function getLatestVersion()
        external
        view
        returns (bytes32 versionHash, string memory version, IFolioDeployer folioDeployer, bool deprecated)
    {
        versionHash = latestVersion;
        folioDeployer = deployments[versionHash];

        require(address(folioDeployer) != address(0), VersionRegistry__Unconfigured());

        version = Versioned(address(folioDeployer)).version();
        deprecated = isDeprecated[versionHash];
    }

    function getImplementationForVersion(bytes32 versionHash) external view returns (address folio) {
        return deployments[versionHash].folioImplementation();
    }
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

interface IRoleRegistry {
    function isOwner(address account) external view returns (bool);

    function isOwnerOrEmergencyCouncil(address account) external view returns (bool);
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

interface IFolioDeployer {
    error FolioDeployer__LengthMismatch();

    event FolioDeployed(address indexed folioOwner, address indexed folio, address folioAdmin);
    event GovernedFolioDeployed(
        address indexed stToken,
        address indexed folio,
        address ownerGovernor,
        address ownerTimelock,
        address tradingGovernor,
        address tradingTimelock
    );

    function folioImplementation() external view returns (address);
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

import { IFolioDeployer } from "@interfaces/IFolioDeployer.sol";

interface IFolioVersionRegistry {
    error VersionRegistry__ZeroAddress();
    error VersionRegistry__InvalidRegistration();
    error VersionRegistry__AlreadyDeprecated();
    error VersionRegistry__InvalidCaller();
    error VersionRegistry__Unconfigured();

    event VersionRegistered(bytes32 versionHash, IFolioDeployer folioDeployer);
    event VersionDeprecated(bytes32 versionHash);

    function getImplementationForVersion(bytes32 versionHash) external view returns (address folio);

    function isDeprecated(bytes32 versionHash) external view returns (bool);

    function deployments(bytes32 versionHash) external view returns (IFolioDeployer);
}

File 5 of 5 : Versioned.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

// This value should be updated on each release
string constant VERSION = "1.0.0";

/**
 * @title Versioned
 * @notice A mix-in to track semantic versioning uniformly across contracts.
 */
abstract contract Versioned {
    function version() public pure virtual returns (string memory) {
        return VERSION;
    }
}

Settings
{
  "remappings": [
    "forge-std/=node_modules/forge-std/src/",
    "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",
    "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/",
    "@prb/math/=node_modules/@prb/math/",
    "utils/=test/utils/",
    "@src/=contracts/",
    "@utils/=contracts/utils/",
    "@interfaces/=contracts/interfaces/",
    "@folio/=contracts/folio/",
    "@gov/=contracts/governance/",
    "@staking/=contracts/staking/",
    "@deployer/=contracts/deployer/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract IRoleRegistry","name":"_roleRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"VersionRegistry__AlreadyDeprecated","type":"error"},{"inputs":[],"name":"VersionRegistry__InvalidCaller","type":"error"},{"inputs":[],"name":"VersionRegistry__InvalidRegistration","type":"error"},{"inputs":[],"name":"VersionRegistry__Unconfigured","type":"error"},{"inputs":[],"name":"VersionRegistry__ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"versionHash","type":"bytes32"}],"name":"VersionDeprecated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"versionHash","type":"bytes32"},{"indexed":false,"internalType":"contract IFolioDeployer","name":"folioDeployer","type":"address"}],"name":"VersionRegistered","type":"event"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"deployments","outputs":[{"internalType":"contract IFolioDeployer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"versionHash","type":"bytes32"}],"name":"deprecateVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"versionHash","type":"bytes32"}],"name":"getImplementationForVersion","outputs":[{"internalType":"address","name":"folio","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestVersion","outputs":[{"internalType":"bytes32","name":"versionHash","type":"bytes32"},{"internalType":"string","name":"version","type":"string"},{"internalType":"contract IFolioDeployer","name":"folioDeployer","type":"address"},{"internalType":"bool","name":"deprecated","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"isDeprecated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IFolioDeployer","name":"folioDeployer","type":"address"}],"name":"registerVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"roleRegistry","outputs":[{"internalType":"contract IRoleRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a060405234801561001057600080fd5b5060405161089838038061089883398101604081905261002f91610067565b6001600160a01b03811661005657604051630693ac6760e21b815260040160405180910390fd5b6001600160a01b0316608052610097565b60006020828403121561007957600080fd5b81516001600160a01b038116811461009057600080fd5b9392505050565b6080516107d96100bf6000396000818160870152818161024f01526103ef01526107d96000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806313c649f71161005b57806313c649f71461011157806337404017146101265780634eee404a1461014f578063978eb5d81461016257600080fd5b806308c73259146100825780630de4d5c0146100c65780630e6d1de9146100f9575b600080fd5b6100a97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6100e96100d43660046105db565b60016020526000908152604090205460ff1681565b60405190151581526020016100bd565b610101610175565b6040516100bd9493929190610618565b61012461011f3660046105db565b61023a565b005b6100a96101343660046105db565b6000602081905290815260409020546001600160a01b031681565b6100a961015d3660046105db565b610360565b610124610170366004610682565b6103da565b6002546000818152602081905260408120546060916001600160a01b0390911690816101b45760405163a5c5ab0160e01b815260040160405180910390fd5b816001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101f2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261021a91908101906106bc565b6000858152600160205260409020549495909492935060ff909216919050565b60405163064628a760e21b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631918a29c90602401602060405180830381865afa15801561029e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102c29190610771565b6102df5760405163189d432960e11b815260040160405180910390fd5b60008181526001602052604090205460ff161561030f576040516360e1eb8360e01b815260040160405180910390fd5b600081815260016020818152604092839020805460ff191690921790915590518281527f95971f6081072e4091e4e629764140dd819ce76e4077b43b16e1074bcf0c9191910160405180910390a150565b60008181526020818152604080832054815163c42f3d1b60e01b815291516001600160a01b039091169263c42f3d1b92600480820193918290030181865afa1580156103b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d49190610793565b92915050565b6040516317aa5fb760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632f54bf6e90602401602060405180830381865afa15801561043e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104629190610771565b61047f5760405163189d432960e11b815260040160405180910390fd5b6001600160a01b0381166104a657604051630693ac6760e21b815260040160405180910390fd5b6000816001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156104e6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261050e91908101906106bc565b905060008160405160200161052391906107b0565b60408051601f1981840301815291815281516020928301206000818152928390529120549091506001600160a01b03161561057157604051636ec60de760e11b815260040160405180910390fd5b6000818152602081815260409182902080546001600160a01b0319166001600160a01b03871690811790915560028490558251848152918201527f59bae85bf937c19399576ca9568b91725715f04204093a97e75106292b852946910160405180910390a1505050565b6000602082840312156105ed57600080fd5b5035919050565b60005b8381101561060f5781810151838201526020016105f7565b50506000910152565b848152608060208201526000845180608084015261063d8160a08501602089016105f4565b6001600160a01b0394909416604083015250901515606082015260a0601f909201601f1916010192915050565b6001600160a01b038116811461067f57600080fd5b50565b60006020828403121561069457600080fd5b813561069f8161066a565b9392505050565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156106ce57600080fd5b815167ffffffffffffffff8111156106e557600080fd5b8201601f810184136106f657600080fd5b805167ffffffffffffffff811115610710576107106106a6565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561073f5761073f6106a6565b60405281815282820160200186101561075757600080fd5b6107688260208301602086016105f4565b95945050505050565b60006020828403121561078357600080fd5b8151801515811461069f57600080fd5b6000602082840312156107a557600080fd5b815161069f8161066a565b600082516107c28184602087016105f4565b919091019291505056fea164736f6c634300081c000a000000000000000000000000e1ec57c8ee970280f237863910b606059e9641c9

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806313c649f71161005b57806313c649f71461011157806337404017146101265780634eee404a1461014f578063978eb5d81461016257600080fd5b806308c73259146100825780630de4d5c0146100c65780630e6d1de9146100f9575b600080fd5b6100a97f000000000000000000000000e1ec57c8ee970280f237863910b606059e9641c981565b6040516001600160a01b0390911681526020015b60405180910390f35b6100e96100d43660046105db565b60016020526000908152604090205460ff1681565b60405190151581526020016100bd565b610101610175565b6040516100bd9493929190610618565b61012461011f3660046105db565b61023a565b005b6100a96101343660046105db565b6000602081905290815260409020546001600160a01b031681565b6100a961015d3660046105db565b610360565b610124610170366004610682565b6103da565b6002546000818152602081905260408120546060916001600160a01b0390911690816101b45760405163a5c5ab0160e01b815260040160405180910390fd5b816001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101f2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261021a91908101906106bc565b6000858152600160205260409020549495909492935060ff909216919050565b60405163064628a760e21b81523360048201527f000000000000000000000000e1ec57c8ee970280f237863910b606059e9641c96001600160a01b031690631918a29c90602401602060405180830381865afa15801561029e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102c29190610771565b6102df5760405163189d432960e11b815260040160405180910390fd5b60008181526001602052604090205460ff161561030f576040516360e1eb8360e01b815260040160405180910390fd5b600081815260016020818152604092839020805460ff191690921790915590518281527f95971f6081072e4091e4e629764140dd819ce76e4077b43b16e1074bcf0c9191910160405180910390a150565b60008181526020818152604080832054815163c42f3d1b60e01b815291516001600160a01b039091169263c42f3d1b92600480820193918290030181865afa1580156103b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d49190610793565b92915050565b6040516317aa5fb760e11b81523360048201527f000000000000000000000000e1ec57c8ee970280f237863910b606059e9641c96001600160a01b031690632f54bf6e90602401602060405180830381865afa15801561043e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104629190610771565b61047f5760405163189d432960e11b815260040160405180910390fd5b6001600160a01b0381166104a657604051630693ac6760e21b815260040160405180910390fd5b6000816001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa1580156104e6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261050e91908101906106bc565b905060008160405160200161052391906107b0565b60408051601f1981840301815291815281516020928301206000818152928390529120549091506001600160a01b03161561057157604051636ec60de760e11b815260040160405180910390fd5b6000818152602081815260409182902080546001600160a01b0319166001600160a01b03871690811790915560028490558251848152918201527f59bae85bf937c19399576ca9568b91725715f04204093a97e75106292b852946910160405180910390a1505050565b6000602082840312156105ed57600080fd5b5035919050565b60005b8381101561060f5781810151838201526020016105f7565b50506000910152565b848152608060208201526000845180608084015261063d8160a08501602089016105f4565b6001600160a01b0394909416604083015250901515606082015260a0601f909201601f1916010192915050565b6001600160a01b038116811461067f57600080fd5b50565b60006020828403121561069457600080fd5b813561069f8161066a565b9392505050565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156106ce57600080fd5b815167ffffffffffffffff8111156106e557600080fd5b8201601f810184136106f657600080fd5b805167ffffffffffffffff811115610710576107106106a6565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561073f5761073f6106a6565b60405281815282820160200186101561075757600080fd5b6107688260208301602086016105f4565b95945050505050565b60006020828403121561078357600080fd5b8151801515811461069f57600080fd5b6000602082840312156107a557600080fd5b815161069f8161066a565b600082516107c28184602087016105f4565b919091019291505056fea164736f6c634300081c000a

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

000000000000000000000000e1ec57c8ee970280f237863910b606059e9641c9

-----Decoded View---------------
Arg [0] : _roleRegistry (address): 0xE1eC57C8EE970280f237863910B606059e9641C9

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e1ec57c8ee970280f237863910b606059e9641c9


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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.