Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FolioVersionRegistry
Compiler Version
v0.8.28+commit.7893614a
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.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);
}// 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;
}
}{
"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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
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
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.