Address Contract Partially Verified
Address
0xAFFCDd96531bCd66faED95FC61e443D08F79eFEf
Balance
0 ETH
Nonce
1
Code Size
1753 bytes
Creator
0x6Fbf5368...9562 at tx 0x44dd3fcc...6b0e3e
Last Active
Indexed Transactions
29 (10,702,504 → 10,733,363)
Gas Used (indexed)
611,026
Contract Bytecode
1753 bytes
0x60806040526004361061006c5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633659cfe681146100765780634f1ef286146100a45780635c60da1b146100d15780638f2839701461010f578063f851a4401461013d575b610074610152565b005b34801561008257600080fd5b5061007473ffffffffffffffffffffffffffffffffffffffff6004351661016c565b6100746004803573ffffffffffffffffffffffffffffffffffffffff1690602480359081019101356101c0565b3480156100dd57600080fd5b506100e661025f565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561011b57600080fd5b5061007473ffffffffffffffffffffffffffffffffffffffff600435166102b6565b34801561014957600080fd5b506100e66103fc565b61015a610441565b61016a6101656104fb565b610520565b565b610174610544565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156101b5576101b081610569565b6101bd565b6101bd610152565b50565b6101c8610544565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102525761020483610569565b3073ffffffffffffffffffffffffffffffffffffffff163483836040518083838082843782019150509250505060006040518083038185875af192505050151561024d57600080fd5b61025a565b61025a610152565b505050565b6000610269610544565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ab576102a46104fb565b90506102b3565b6102b3610152565b90565b6102be610544565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156101b55773ffffffffffffffffffffffffffffffffffffffff8116151561039b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f60448201527f787920746f20746865207a65726f206164647265737300000000000000000000606482015290519081900360840190fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103c4610544565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301528051918290030190a16101b0816105be565b6000610406610544565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ab576102a4610544565b610449610544565b73ffffffffffffffffffffffffffffffffffffffff163314156104f357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e20667260448201527f6f6d207468652070726f78792061646d696e0000000000000000000000000000606482015290519081900360840190fd5b61016a61016a565b7f17a1a1520654e435f06928e17f36680bf83a0dd9ed240ed37d78f8289a559c705490565b3660008037600080366000845af43d6000803e80801561053f573d6000f35b3d6000fd5b7f0d28943014d3bfed6af9cab5e6024c23fa2da10f7a6373bcd56c37313c24d93a5490565b610572816105e2565b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9181900360200190a150565b7f0d28943014d3bfed6af9cab5e6024c23fa2da10f7a6373bcd56c37313c24d93a55565b60006105ed826106a5565b151561068057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f60448201527f6e20746f2061206e6f6e2d636f6e747261637420616464726573730000000000606482015290519081900360840190fd5b507f17a1a1520654e435f06928e17f36680bf83a0dd9ed240ed37d78f8289a559c7055565b6000903b11905600a165627a7a723058200a1254f5499f71df0d106c57a820b5f02ac2470f6f5aeeff0bcc06cb68730a390029
Verified Source Code Partial Match
Compiler: v0.4.24+commit.e67f0147
EVM: byzantium
Optimization: Yes (2000 runs)
Proxy.sol 69 lines
pragma solidity ^0.4.24;
/**
* @title Proxy
*
* @dev Implements delegation of calls to other contracts, with proper forwarding of return values and bubbling of
* failures.
* It defines a fallback function that delegates all calls to the address returned by the abstract `_implementation()`
* internal function.
*/
contract Proxy {
/**
* @dev Fallback function.
* Implemented entirely in `_fallback`.
*/
function () payable external {
_fallback();
}
/**
* @return The Address of the implementation.
*/
function _implementation() internal view returns (address);
/**
* @dev Delegates execution to an implementation contract.
* This is a low level function that doesn't return to its internal call site.
* It will return to the external caller whatever the implementation returns.
*
* @param implementation Address to delegate.
*/
function _delegate(address implementation) internal {
assembly {
// Copy msg.data.
// We take full control of memory in this inline assembly block because it will not return to Solidity code.
// We overwrite the Solidity scratch pad at memory position 0.
calldatacopy(0, 0, calldatasize)
// Call the implementation.
// The out and outsize are 0 because we don't know the size yet.
let result := delegatecall(gas, implementation, 0, calldatasize, 0, 0)
// Copy the returned data.
returndatacopy(0, 0, returndatasize)
switch result
// delegatecall returns 0 on error.
case 0 { revert(0, returndatasize) }
default { return(0, returndatasize) }
}
}
/**
* @dev Function that is run as the first thing in the fallback function.
* Can be redefined in derived contracts to add functionality.
* Redefinitions must call super._willFallback().
*/
function _willFallback() internal {
}
/**
* @dev fallback implementation.
* Extracted to enable manual triggering.
*/
function _fallback() internal {
_willFallback();
_delegate(_implementation());
}
}
Address.sol 29 lines
pragma solidity ^0.4.24;
/**
* @title Address
*
* @dev Utility library of inline functions on addresses.
*/
library Address {
/**
* @dev Returns whether the target address is a contract.
* This function will return false if invoked during the constructor of a contract, as the code is not actually
* created until after the constructor finishes.
*
* @param account The address of the account to check
* @return True if the target address is a contract, otherwise false
*/
function isContract(address account) internal view returns (bool) {
uint256 size;
// XXX Currently there is no better way to check if there is a contract in an address
// than to check the size of the code at that address.
// See https://ethereum.stackexchange.com/a/14016/36603
// for more details about how this works.
// TODO Check this again before the Serenity release, because all addresses will be
// contracts then.
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
}
UpgradeabilityProxy.sol 73 lines
pragma solidity ^0.4.24;
import './Proxy.sol';
import './Address.sol';
/**
* @title UpgradeabilityProxy
*
* @dev This contract implements a proxy that allows to change the implementation address to which it will delegate.
* Such a change is called an implementation upgrade.
*/
contract UpgradeabilityProxy is Proxy {
/**
* @dev Emitted when the implementation is upgraded.
*
* @param implementation Address of the new implementation.
*/
event Upgraded(address implementation);
/**
* @dev Storage slot with the address of the current implementation.
* This is the keccak-256 hash of "infinigold.proxy.implementation", and is validated in the constructor.
*/
bytes32 private constant IMPLEMENTATION_SLOT = 0x17a1a1520654e435f06928e17f36680bf83a0dd9ed240ed37d78f8289a559c70;
/**
* @dev Contract constructor.
*
* @param _implementation Address of the initial implementation.
*/
constructor(address _implementation) public {
assert(IMPLEMENTATION_SLOT == keccak256("infinigold.proxy.implementation"));
_setImplementation(_implementation);
}
/**
* @dev Returns the current implementation.
*
* @return Address of the current implementation
*/
function _implementation() internal view returns (address impl) {
bytes32 slot = IMPLEMENTATION_SLOT;
assembly {
impl := sload(slot)
}
}
/**
* @dev Upgrades the proxy to a new implementation.
*
* @param newImplementation Address of the new implementation.
*/
function _upgradeTo(address newImplementation) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
/**
* @dev Sets the implementation address of the proxy.
*
* @param newImplementation Address of the new implementation.
*/
function _setImplementation(address newImplementation) private {
require(Address.isContract(newImplementation), "Cannot set a proxy implementation to a non-contract address");
bytes32 slot = IMPLEMENTATION_SLOT;
assembly {
sstore(slot, newImplementation)
}
}
}
AdminUpgradeabilityProxy.sol 133 lines
pragma solidity ^0.4.24;
import './UpgradeabilityProxy.sol';
/**
* @title AdminUpgradeabilityProxy
*
* @dev This contract combines an upgradeability proxy with an authorization mechanism for administrative tasks.
* All external functions in this contract must be guarded by the `ifAdmin` modifier.
* See ethereum/solidity#3864 for a Solidity feature proposal that would enable this to be done automatically.
*/
contract AdminUpgradeabilityProxy is UpgradeabilityProxy {
/**
* @dev Event emitted whenever the administration has been transferred.
*
* @param previousAdmin Address of the previous admin.
* @param newAdmin Address of the new admin.
*
*/
event AdminChanged(address previousAdmin, address newAdmin);
/**
* @dev Storage slot with the admin of the contract.
* This is the keccak-256 hash of "infinigold.proxy.admin", and is validated in the constructor.
*/
bytes32 private constant ADMIN_SLOT = 0x0d28943014d3bfed6af9cab5e6024c23fa2da10f7a6373bcd56c37313c24d93a;
/**
* @dev Modifier to check whether the `msg.sender` is the admin.
* If it is, it will run the function. Otherwise, it will delegate the call to the implementation.
*/
modifier ifAdmin() {
if (msg.sender == _admin()) {
_;
} else {
_fallback();
}
}
/**
* @dev Contract constructor.
* @dev It sets the `msg.sender` as the proxy administrator.
*
* @param _implementation address of the initial implementation.
*/
constructor(address _implementation) UpgradeabilityProxy(_implementation) public {
assert(ADMIN_SLOT == keccak256("infinigold.proxy.admin"));
_setAdmin(msg.sender);
}
/**
* @return The address of the proxy admin.
*/
function admin() external view ifAdmin returns (address) {
return _admin();
}
/**
* @return The address of the implementation.
*/
function implementation() external view ifAdmin returns (address) {
return _implementation();
}
/**
* @dev Changes the admin of the proxy.
* Only the current admin can call this function.
*
* @param newAdmin Address to transfer proxy administration to.
*/
function changeAdmin(address newAdmin) external ifAdmin {
require(newAdmin != address(0), "Cannot change the admin of a proxy to the zero address");
emit AdminChanged(_admin(), newAdmin);
_setAdmin(newAdmin);
}
/**
* @dev Upgrade the backing implementation of the proxy.
* Only the admin can call this function.
*
* @param newImplementation Address of the new implementation.
*/
function upgradeTo(address newImplementation) external ifAdmin {
_upgradeTo(newImplementation);
}
/**
* @dev Upgrade the backing implementation of the proxy and call a function on the new implementation.
* This is useful to initialize the proxied contract.
*
* The given `data` should include the signature and parameters of the function to be called.
* See https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding
*
* @param newImplementation Address of the new implementation.
* @param data Data to send as msg.data in the low level call.
*/
function upgradeToAndCall(address newImplementation, bytes data) payable external ifAdmin {
_upgradeTo(newImplementation);
require(address(this).call.value(msg.value)(data));
}
/**
* @return The admin slot.
*/
function _admin() internal view returns (address adm) {
bytes32 slot = ADMIN_SLOT;
assembly {
adm := sload(slot)
}
}
/**
* @dev Sets the address of the proxy admin.
*
* @param newAdmin Address of the new proxy admin.
*/
function _setAdmin(address newAdmin) internal {
bytes32 slot = ADMIN_SLOT;
assembly {
sstore(slot, newAdmin)
}
}
/**
* @dev Only fall back when the sender is not the admin.
*/
function _willFallback() internal {
require(msg.sender != _admin(), "Cannot call fallback function from the proxy admin");
super._willFallback();
}
}
Read Contract
admin 0xf851a440 → address
implementation 0x5c60da1b → address
Write Contract 3 functions
These functions modify contract state and require a wallet transaction to execute.
changeAdmin 0x8f283970
address newAdmin
upgradeTo 0x3659cfe6
address newImplementation
upgradeToAndCall 0x4f1ef286
address newImplementation
bytes data
Top Interactions
| Address | Txns | Sent | Received |
|---|---|---|---|
| 0x2B5634C4...8258 | 2 | 2 | |
| 0x124Fcba2...660c | 2 | 2 | |
| 0xE408114a...b66C | 2 | 2 | |
| 0x7b39D8cd...7b43 | 1 | 1 | |
| 0x2504F740...9652 | 1 | 1 | |
| 0xe81dD19E...2406 | 1 | 1 | |
| 0x2C7f2a6C...3041 | 1 | 1 |
Recent Transactions
|
| Hash | Block | Age | From/To | Value | |
|---|---|---|---|---|---|
| 0x2f31347b...74ba59 | 10,733,363 | IN | 0xE408114a...b66C | 0 ETH | |
| 0x3a90e307...b189f3 | 10,733,110 | IN | 0x2C7f2a6C...3041 | 0 ETH | |
| 0x76e49b03...e3fcb6 | 10,732,884 | IN | 0x2B5634C4...8258 | 0 ETH | |
| 0x6bf36ff8...63a9d0 | 10,732,810 | IN | 0xE408114a...b66C | 0 ETH | |
| 0xf28fe05c...3d7557 | 10,732,748 | IN | 0xe81dD19E...2406 | 0 ETH | |
| 0xd49fef79...1c1cb1 | 10,731,894 | IN | 0x7b39D8cd...7b43 | 0 ETH | |
| 0x5a2e467b...1dc96c | 10,731,378 | IN | 0x2B5634C4...8258 | 0 ETH | |
| 0xdbc55caa...ab1282 | 10,730,014 | IN | 0x2504F740...9652 | 0 ETH | |
| 0x9d9967f0...11b19c | 10,730,009 | IN | 0x124Fcba2...660c | 0 ETH | |
| 0xf4844b3c...04f68e | 10,702,504 | IN | 0x124Fcba2...660c | 0 ETH |