Address Contract Verified
Address
0xcafeac0fF5dA0A2777d915531bfA6B29d282Ee62
Balance
0 ETH
Nonce
1
Code Size
863 bytes
Creator
0x01BFd826...D07e at tx 0xf5182e8f...bd3d25
Indexed Transactions
0
Contract Bytecode
863 bytes
0x6080604052600436106100435760003560e01c8063025313a21461005a5780633659cfe6146100945780635c60da1b146100b4578063f1739cae146100d657610052565b36610052576100506100f6565b005b6100506100f6565b34801561006657600080fd5b506000805160206102ea833981519152545b6040516001600160a01b03909116815260200160405180910390f35b3480156100a057600080fd5b506100506100af3660046102b9565b610148565b3480156100c057600080fd5b5060008051602061030a83398151915254610078565b3480156100e257600080fd5b506100506100f13660046102b9565b610181565b600061010e60008051602061030a8339815191525490565b90506001600160a01b03811661012357600080fd5b60405136600082376000803683855af43d806000843e818015610144578184f35b8184fd5b6000805160206102ea833981519152546001600160a01b0316336001600160a01b03161461017557600080fd5b61017e81610233565b50565b6000805160206102ea833981519152546001600160a01b0316336001600160a01b0316146101ae57600080fd5b6001600160a01b0381166101c157600080fd5b6101d7816000805160206102ea83398151915255565b7f5a3e66efaa1e445ebd894728a69d6959842ea1e97bd79b892797106e270efcd961020e6000805160206102ea8339815191525490565b604080516001600160a01b03928316815291841660208301520160405180910390a150565b600061024b60008051602061030a8339815191525490565b9050816001600160a01b0316816001600160a01b03160361026b57600080fd5b6102818260008051602061030a83398151915255565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000602082840312156102cb57600080fd5b81356001600160a01b03811681146102e257600080fd5b939250505056fe2dbc9b6b8d09ee15269835797a45b6f772b81406ec218e6fd64b114f376266ba7fb5080a7084f4c60aade0a78fc13ba4ba6555b60e554360d005f0d684cea186a26469706673582212201057513f99002041344c19a488bd48c257a905888fbb455418e934b436488f0b64736f6c63430008120033
Verified Source Code Full Match
Compiler: v0.8.18+commit.87f61d96
EVM: paris
Optimization: Yes (200 runs)
Proxy.sol 53 lines
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.18;
/**
* @title Proxy
* @dev Gives the possibility to delegate any call to a foreign implementation.
*/
abstract contract Proxy {
/**
* @dev Delegates the current call to `implementation`.
*/
function _delegate() internal {
address _impl = implementation();
require(_impl != address(0));
// solhint-disable-next-line no-inline-assembly
assembly {
let ptr := mload(0x40)
calldatacopy(ptr, 0, calldatasize())
let result := delegatecall(gas(), _impl, ptr, calldatasize(), 0, 0)
let size := returndatasize()
returndatacopy(ptr, 0, size)
switch result
case 0 {revert(ptr, size)}
default {return (ptr, size)}
}
}
/**
* @dev Fallback function allowing to perform a delegatecall to the given implementation.
* This function will return whatever the implementation call returns
*/
fallback() external payable {
_delegate();
}
/**
* @dev Receive function allowing to perform a delegatecall to the given implementation.
* This function will return whatever the implementation call returns
*/
receive() external payable {
_delegate();
}
/**
* @dev Tells the address of the implementation where every call will be delegated.
* @return address of the implementation to which it will be delegated
*/
function implementation() virtual public view returns (address);
}
UpgradeabilityProxy.sol 61 lines
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.18;
import "./Proxy.sol";
/**
* @title UpgradeabilityProxy
* @dev This contract represents a proxy where the implementation address to which it will delegate can be upgraded
*/
contract UpgradeabilityProxy is Proxy {
/**
* @dev This event will be emitted every time the implementation gets upgraded
* @param implementation representing the address of the upgraded implementation
*/
event Upgraded(address indexed implementation);
// Storage position of the address of the current implementation
bytes32 private constant IMPLEMENTATION_POSITION = keccak256("org.govblocks.proxy.implementation");
/**
* @dev Constructor function
*/
// solhint-disable-next-line no-empty-blocks
constructor() {}
/**
* @dev Tells the address of the current implementation
* @return impl - address of the current implementation
*/
function implementation() public override view returns (address impl) {
bytes32 position = IMPLEMENTATION_POSITION;
// solhint-disable-next-line no-inline-assembly
assembly {
impl := sload(position)
}
}
/**
* @dev Sets the address of the current implementation
* @param _newImplementation address representing the new implementation to be set
*/
function _setImplementation(address _newImplementation) internal {
bytes32 position = IMPLEMENTATION_POSITION;
// solhint-disable-next-line no-inline-assembly
assembly {
sstore(position, _newImplementation)
}
}
/**
* @dev Upgrades the implementation address
* @param _newImplementation representing the address of the new implementation to be set
*/
function _upgradeTo(address _newImplementation) internal {
address currentImplementation = implementation();
require(currentImplementation != _newImplementation);
_setImplementation(_newImplementation);
emit Upgraded(_newImplementation);
}
}
OwnedUpgradeabilityProxy.sol 78 lines
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.18;
import "./UpgradeabilityProxy.sol";
/**
* @title OwnedUpgradeabilityProxy
* @dev This contract combines an upgradeability proxy with basic authorization control functionalities
*/
contract OwnedUpgradeabilityProxy is UpgradeabilityProxy {
/**
* @dev Event to show ownership has been transferred
* @param previousOwner representing the address of the previous owner
* @param newOwner representing the address of the new owner
*/
event ProxyOwnershipTransferred(address previousOwner, address newOwner);
// Storage position of the owner of the contract
bytes32 private constant PROXY_OWNER_POSITION = keccak256("org.govblocks.proxy.owner");
/**
* @dev the constructor sets the original owner of the contract to the sender account.
*/
constructor(address _implementation) {
_setUpgradeabilityOwner(msg.sender);
_upgradeTo(_implementation);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyProxyOwner() {
require(msg.sender == proxyOwner());
_;
}
/**
* @dev Tells the address of the owner
* @return owner - the address of the owner
*/
function proxyOwner() public view returns (address owner) {
bytes32 position = PROXY_OWNER_POSITION;
// solhint-disable-next-line no-inline-assembly
assembly {
owner := sload(position)
}
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param _newOwner The address to transfer ownership to.
*/
function transferProxyOwnership(address _newOwner) public onlyProxyOwner {
require(_newOwner != address(0));
_setUpgradeabilityOwner(_newOwner);
emit ProxyOwnershipTransferred(proxyOwner(), _newOwner);
}
/**
* @dev Allows the proxy owner to upgrade the current version of the proxy.
* @param _implementation representing the address of the new implementation to be set.
*/
function upgradeTo(address _implementation) public onlyProxyOwner {
_upgradeTo(_implementation);
}
/**
* @dev Sets the address of the owner
*/
function _setUpgradeabilityOwner(address _newProxyOwner) internal {
bytes32 position = PROXY_OWNER_POSITION;
// solhint-disable-next-line no-inline-assembly
assembly {
sstore(position, _newProxyOwner)
}
}
}
Read Contract
implementation 0x5c60da1b → address
proxyOwner 0x025313a2 → address
Write Contract 2 functions
These functions modify contract state and require a wallet transaction to execute.
transferProxyOwnership 0xf1739cae
address _newOwner
upgradeTo 0x3659cfe6
address _implementation
Recent Transactions
No transactions found for this address