Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- VersionManager
- Optimization enabled
- false
- Compiler version
- v0.8.28+commit.7893614a
- EVM Version
- shanghai
- Verified at
- 2024-12-26T12:40:42.621953Z
Contract source code
// File: bitpost-contracts/contracts-common/interfaces/access/IOwnable.sol
pragma solidity ^0.8.20;
interface IOwnable {
error OwnableUnauthorized(address sender, address owner);
error OwnableInvalidOwner(address owner);
function getOwner() external view returns(address);
function setOwner(address owner) external;
}
// File: bitpost-contracts/contracts-common/contracts/access/Ownable.sol
pragma solidity ^0.8.20;
abstract contract Ownable is IOwnable {
/// @custom:storage-location erc7201:bitpost.common.Ownable
struct Storage_Ownable {
address owner;
}
// keccak256(abi.encode(uint256(keccak256("bitpost.common.Ownable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant STORAGE_LOCATION_OWNABLE = 0xbfdc26bbaea09886fc184fe4fcae59b15cffdf4b859be87d5955dbd541465600;
modifier onlyOwner() {
_checkOwner();
_;
}
function _init_Ownable(address owner) internal {
_setOwner(owner);
}
function getOwner() public view returns(address) {
Storage_Ownable storage $ = _getStorage_Ownable();
return $.owner;
}
function setOwner(address owner) external onlyOwner {
_setOwner(owner);
}
function _setOwner(address owner) internal {
require(owner != address(0), OwnableInvalidOwner(address(0)));
Storage_Ownable storage $ = _getStorage_Ownable();
$.owner = owner;
}
function _checkOwner() private view {
Storage_Ownable storage $ = _getStorage_Ownable();
require(msg.sender == $.owner, OwnableUnauthorized(msg.sender, $.owner));
}
function _getStorage_Ownable() private pure returns(Storage_Ownable storage $) {
assembly {
$.slot := STORAGE_LOCATION_OWNABLE
}
}
}
// File: bitpost-contracts/contracts-vm/interfaces/IVersionManager.sol
pragma solidity ^0.8.20;
interface IVersionManager is IOwnable {
error VersionManagerInvalidCid(uint16 cid);
function getImplementation(uint16 cid) external view returns(address);
function setImplementation(uint16 cid, address implementation) external;
function newContract(uint16 cid) external returns(address);
}
// File: bitpost-contracts/contracts-common/contracts/upgrade/Upgradeable.sol
pragma solidity ^0.8.20;
abstract contract Upgradeable {
/// @custom:storage-location erc7201:bitpost.common.Upgradeable
struct Storage_Upgradeable {
IVersionManager versionManager;
uint16 cid;
}
// keccak256(abi.encode(uint256(keccak256("bitpost.common.Upgradeable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant STORAGE_LOCATION_UPGRADEABLE = 0x828626e98fd64181cb42e58a50c4931f9ea11da1800ee5ae64b4a2a58285ae00;
function _init_Upgradeable(IVersionManager versionManager, uint16 cid) internal {
Storage_Upgradeable storage $ = _getStorage_Upgradeable();
$.versionManager = versionManager;
$.cid = cid;
}
function _getVersionManager() internal view returns(IVersionManager) {
Storage_Upgradeable storage $ = _getStorage_Upgradeable();
return $.versionManager;
}
function _getCid() internal view returns(uint16) {
Storage_Upgradeable storage $ = _getStorage_Upgradeable();
return $.cid;
}
function _getStorage_Upgradeable() private pure returns(Storage_Upgradeable storage $) {
assembly {
$.slot := STORAGE_LOCATION_UPGRADEABLE
}
}
}
// File: bitpost-contracts/contracts-vm/contracts/proxy/Proxy.sol
pragma solidity ^0.8.20;
contract Proxy is Upgradeable {
constructor(VersionManager versionManager, uint16 cid) {
_init_Upgradeable(versionManager, cid);
}
fallback() external payable {
address target = _getVersionManager().getImplementation(_getCid());
// The target address is stored on the stack, not in memory,
// so it won't be affected by operations using memory offset 0.
assembly {
calldatacopy(0, 0, calldatasize())
let result := delegatecall(gas(), target, 0, calldatasize(), 0, 0)
returndatacopy(0, 0, returndatasize())
switch result
case 0 { revert(0, returndatasize()) }
default { return(0, returndatasize()) }
}
}
}
// File: bitpost-contracts/contracts-vm/contracts/VersionManager.sol
pragma solidity ^0.8.20;
contract VersionManager is IVersionManager, Ownable {
/// @custom:storage-location erc7201:bitpost.vm.VersionManager
struct Storage_VersionManager {
mapping(uint16 => address) implementations;
}
// keccak256(abi.encode(uint256(keccak256("bitpost.vm.VersionManager")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant STORAGE_LOCATION_VERSIONMANAGER = 0x433f1e912c5d27d7a45609db3e669bf6cc6b4b451297228e4c27368efb8c2300;
constructor() {
_init_Ownable(msg.sender);
}
function getImplementation(uint16 cid) external view returns(address) {
Storage_VersionManager storage $ = _getStorage_VersionManager();
require($.implementations[cid] != address(0), VersionManagerInvalidCid(cid));
return $.implementations[cid];
}
function setImplementation(uint16 cid, address implementation) external onlyOwner {
Storage_VersionManager storage $ = _getStorage_VersionManager();
$.implementations[cid] = implementation;
}
function newContract(uint16 cid) external returns(address) {
Storage_VersionManager storage $ = _getStorage_VersionManager();
require($.implementations[cid] != address(0), VersionManagerInvalidCid(cid));
return address(new Proxy(this, cid));
}
function _getStorage_VersionManager() private pure returns(Storage_VersionManager storage $) {
assembly {
$.slot := STORAGE_LOCATION_VERSIONMANAGER
}
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorized","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"VersionManagerInvalidCid","inputs":[{"type":"uint16","name":"cid","internalType":"uint16"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getImplementation","inputs":[{"type":"uint16","name":"cid","internalType":"uint16"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getOwner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"newContract","inputs":[{"type":"uint16","name":"cid","internalType":"uint16"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setImplementation","inputs":[{"type":"uint16","name":"cid","internalType":"uint16"},{"type":"address","name":"implementation","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]}]
Contract Creation Code
0x608060405234801561000f575f5ffd5b5061001f3361002460201b60201c565b61017e565b6100338161003660201b60201c565b50565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155f906100a8576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161009f9190610165565b60405180910390fd5b505f6100b86100ff60201b60201c565b905081815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f7fbfdc26bbaea09886fc184fe4fcae59b15cffdf4b859be87d5955dbd541465600905090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61014f82610126565b9050919050565b61015f81610145565b82525050565b5f6020820190506101785f830184610156565b92915050565b610be88061018b5f395ff3fe608060405234801561000f575f5ffd5b5060043610610055575f3560e01c806313af40351461005957806358fb826b14610075578063893d20e8146100a55780639873400e146100c3578063d2255403146100f3575b5f5ffd5b610073600480360381019061006e91906105f9565b61010f565b005b61008f600480360381019061008a919061065b565b610123565b60405161009c9190610695565b60405180910390f35b6100ad610216565b6040516100ba9190610695565b60405180910390f35b6100dd60048036038101906100d8919061065b565b61024b565b6040516100ea9190610695565b60405180910390f35b61010d600480360381019061010891906106ae565b610345565b005b6101176103b5565b6101208161047d565b50565b5f5f61012d610540565b90505f73ffffffffffffffffffffffffffffffffffffffff16815f015f8561ffff1661ffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141583906101da576040517f6e0eba3b0000000000000000000000000000000000000000000000000000000081526004016101d191906106fb565b60405180910390fd5b5030836040516101e99061058e565b6101f492919061076f565b604051809103905ff08015801561020d573d5f5f3e3d5ffd5b50915050919050565b5f5f610220610567565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b5f5f610255610540565b90505f73ffffffffffffffffffffffffffffffffffffffff16815f015f8561ffff1661ffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158390610302576040517f6e0eba3b0000000000000000000000000000000000000000000000000000000081526004016102f991906106fb565b60405180910390fd5b50805f015f8461ffff1661ffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b61034d6103b5565b5f610356610540565b905081815f015f8561ffff1661ffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b5f6103be610567565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161433825f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169091610478576040517f0992ea8300000000000000000000000000000000000000000000000000000000815260040161046f929190610796565b60405180910390fd5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155f906104ef576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016104e69190610695565b60405180910390fd5b505f6104f9610567565b905081815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f7f433f1e912c5d27d7a45609db3e669bf6cc6b4b451297228e4c27368efb8c2300905090565b5f7fbfdc26bbaea09886fc184fe4fcae59b15cffdf4b859be87d5955dbd541465600905090565b6103f5806107be83390190565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6105c88261059f565b9050919050565b6105d8816105be565b81146105e2575f5ffd5b50565b5f813590506105f3816105cf565b92915050565b5f6020828403121561060e5761060d61059b565b5b5f61061b848285016105e5565b91505092915050565b5f61ffff82169050919050565b61063a81610624565b8114610644575f5ffd5b50565b5f8135905061065581610631565b92915050565b5f602082840312156106705761066f61059b565b5b5f61067d84828501610647565b91505092915050565b61068f816105be565b82525050565b5f6020820190506106a85f830184610686565b92915050565b5f5f604083850312156106c4576106c361059b565b5b5f6106d185828601610647565b92505060206106e2858286016105e5565b9150509250929050565b6106f581610624565b82525050565b5f60208201905061070e5f8301846106ec565b92915050565b5f819050919050565b5f61073761073261072d8461059f565b610714565b61059f565b9050919050565b5f6107488261071d565b9050919050565b5f6107598261073e565b9050919050565b6107698161074f565b82525050565b5f6040820190506107825f830185610760565b61078f60208301846106ec565b9392505050565b5f6040820190506107a95f830185610686565b6107b66020830184610686565b939250505056fe608060405234801561000f575f5ffd5b506040516103f53803806103f58339818101604052810190610031919061018a565b610041828261004860201b60201c565b50506101c8565b5f6100576100bd60201b60201c565b905082815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081815f0160146101000a81548161ffff021916908361ffff160217905550505050565b5f7f828626e98fd64181cb42e58a50c4931f9ea11da1800ee5ae64b4a2a58285ae00905090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610111826100e8565b9050919050565b5f61012282610107565b9050919050565b61013281610118565b811461013c575f5ffd5b50565b5f8151905061014d81610129565b92915050565b5f61ffff82169050919050565b61016981610153565b8114610173575f5ffd5b50565b5f8151905061018481610160565b92915050565b5f5f604083850312156101a05761019f6100e4565b5b5f6101ad8582860161013f565b92505060206101be85828601610176565b9150509250929050565b610220806101d55f395ff3fe60806040525f61000d6100ac565b73ffffffffffffffffffffffffffffffffffffffff16639873400e6100306100e1565b6040518263ffffffff1660e01b815260040161004c9190610148565b602060405180830381865afa158015610067573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061008b91906101bf565b9050365f5f375f5f365f845af43d5f5f3e805f81146100a8573d5ff35b3d5ffd5b5f5f6100b6610105565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b5f5f6100eb610105565b9050805f0160149054906101000a900461ffff1691505090565b5f7f828626e98fd64181cb42e58a50c4931f9ea11da1800ee5ae64b4a2a58285ae00905090565b5f61ffff82169050919050565b6101428161012c565b82525050565b5f60208201905061015b5f830184610139565b92915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018e82610165565b9050919050565b61019e81610184565b81146101a8575f5ffd5b50565b5f815190506101b981610195565b92915050565b5f602082840312156101d4576101d3610161565b5b5f6101e1848285016101ab565b9150509291505056fea26469706673582212205ea8572b2dc4952057aa047c7aa2c5ab28dfdae8fec0a824bf2f165add8790a764736f6c634300081c0033a26469706673582212200dfbaa80ed868e9e7551a63fcf10d02f51faca90f731fe8f24ef59eb97e0e85664736f6c634300081c0033
Deployed ByteCode
0x608060405234801561000f575f5ffd5b5060043610610055575f3560e01c806313af40351461005957806358fb826b14610075578063893d20e8146100a55780639873400e146100c3578063d2255403146100f3575b5f5ffd5b610073600480360381019061006e91906105f9565b61010f565b005b61008f600480360381019061008a919061065b565b610123565b60405161009c9190610695565b60405180910390f35b6100ad610216565b6040516100ba9190610695565b60405180910390f35b6100dd60048036038101906100d8919061065b565b61024b565b6040516100ea9190610695565b60405180910390f35b61010d600480360381019061010891906106ae565b610345565b005b6101176103b5565b6101208161047d565b50565b5f5f61012d610540565b90505f73ffffffffffffffffffffffffffffffffffffffff16815f015f8561ffff1661ffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141583906101da576040517f6e0eba3b0000000000000000000000000000000000000000000000000000000081526004016101d191906106fb565b60405180910390fd5b5030836040516101e99061058e565b6101f492919061076f565b604051809103905ff08015801561020d573d5f5f3e3d5ffd5b50915050919050565b5f5f610220610567565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b5f5f610255610540565b90505f73ffffffffffffffffffffffffffffffffffffffff16815f015f8561ffff1661ffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158390610302576040517f6e0eba3b0000000000000000000000000000000000000000000000000000000081526004016102f991906106fb565b60405180910390fd5b50805f015f8461ffff1661ffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b61034d6103b5565b5f610356610540565b905081815f015f8561ffff1661ffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b5f6103be610567565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161433825f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169091610478576040517f0992ea8300000000000000000000000000000000000000000000000000000000815260040161046f929190610796565b60405180910390fd5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155f906104ef576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016104e69190610695565b60405180910390fd5b505f6104f9610567565b905081815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f7f433f1e912c5d27d7a45609db3e669bf6cc6b4b451297228e4c27368efb8c2300905090565b5f7fbfdc26bbaea09886fc184fe4fcae59b15cffdf4b859be87d5955dbd541465600905090565b6103f5806107be83390190565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6105c88261059f565b9050919050565b6105d8816105be565b81146105e2575f5ffd5b50565b5f813590506105f3816105cf565b92915050565b5f6020828403121561060e5761060d61059b565b5b5f61061b848285016105e5565b91505092915050565b5f61ffff82169050919050565b61063a81610624565b8114610644575f5ffd5b50565b5f8135905061065581610631565b92915050565b5f602082840312156106705761066f61059b565b5b5f61067d84828501610647565b91505092915050565b61068f816105be565b82525050565b5f6020820190506106a85f830184610686565b92915050565b5f5f604083850312156106c4576106c361059b565b5b5f6106d185828601610647565b92505060206106e2858286016105e5565b9150509250929050565b6106f581610624565b82525050565b5f60208201905061070e5f8301846106ec565b92915050565b5f819050919050565b5f61073761073261072d8461059f565b610714565b61059f565b9050919050565b5f6107488261071d565b9050919050565b5f6107598261073e565b9050919050565b6107698161074f565b82525050565b5f6040820190506107825f830185610760565b61078f60208301846106ec565b9392505050565b5f6040820190506107a95f830185610686565b6107b66020830184610686565b939250505056fe608060405234801561000f575f5ffd5b506040516103f53803806103f58339818101604052810190610031919061018a565b610041828261004860201b60201c565b50506101c8565b5f6100576100bd60201b60201c565b905082815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081815f0160146101000a81548161ffff021916908361ffff160217905550505050565b5f7f828626e98fd64181cb42e58a50c4931f9ea11da1800ee5ae64b4a2a58285ae00905090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610111826100e8565b9050919050565b5f61012282610107565b9050919050565b61013281610118565b811461013c575f5ffd5b50565b5f8151905061014d81610129565b92915050565b5f61ffff82169050919050565b61016981610153565b8114610173575f5ffd5b50565b5f8151905061018481610160565b92915050565b5f5f604083850312156101a05761019f6100e4565b5b5f6101ad8582860161013f565b92505060206101be85828601610176565b9150509250929050565b610220806101d55f395ff3fe60806040525f61000d6100ac565b73ffffffffffffffffffffffffffffffffffffffff16639873400e6100306100e1565b6040518263ffffffff1660e01b815260040161004c9190610148565b602060405180830381865afa158015610067573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061008b91906101bf565b9050365f5f375f5f365f845af43d5f5f3e805f81146100a8573d5ff35b3d5ffd5b5f5f6100b6610105565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b5f5f6100eb610105565b9050805f0160149054906101000a900461ffff1691505090565b5f7f828626e98fd64181cb42e58a50c4931f9ea11da1800ee5ae64b4a2a58285ae00905090565b5f61ffff82169050919050565b6101428161012c565b82525050565b5f60208201905061015b5f830184610139565b92915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018e82610165565b9050919050565b61019e81610184565b81146101a8575f5ffd5b50565b5f815190506101b981610195565b92915050565b5f602082840312156101d4576101d3610161565b5b5f6101e1848285016101ab565b9150509291505056fea26469706673582212205ea8572b2dc4952057aa047c7aa2c5ab28dfdae8fec0a824bf2f165add8790a764736f6c634300081c0033a26469706673582212200dfbaa80ed868e9e7551a63fcf10d02f51faca90f731fe8f24ef59eb97e0e85664736f6c634300081c0033