Address Contract Partially Verified
Address
0x67E1047187d72e164F98BA644883bFE6F3C080Ab
Balance
0 ETH
Nonce
1
Code Size
2520 bytes
Creator
0xaE1Af0E4...f20A at tx 0x56fb6461...4f6f93
Proxy
EIP-1967 Proxy Implementation: 0x5A574642...9509
Indexed Transactions
0
Contract Bytecode
2520 bytes
0x60806040526004361061008a5760003560e01c806354fd4d501161005957806354fd4d5014610181578063c4d66de8146101ac578063cd784d1b146101df578063fd8ab48214610212578063fe575a871461024557610099565b80630900f010146100a15780630fea4e66146100d457806324d7806c1461011b5780632f54bf6e1461014e57610099565b3661009957610097610278565b005b610097610278565b3480156100ad57600080fd5b50610097600480360360208110156100c457600080fd5b50356001600160a01b0316610292565b3480156100e057600080fd5b50610107600480360360208110156100f757600080fd5b50356001600160a01b03166103eb565b604080519115158252519081900360200190f35b34801561012757600080fd5b506101076004803603602081101561013e57600080fd5b50356001600160a01b03166103fc565b34801561015a57600080fd5b506101076004803603602081101561017157600080fd5b50356001600160a01b0316610407565b34801561018d57600080fd5b50610196610412565b6040805160ff9092168252519081900360200190f35b3480156101b857600080fd5b50610097600480360360208110156101cf57600080fd5b50356001600160a01b031661041b565b3480156101eb57600080fd5b506101076004803603602081101561020257600080fd5b50356001600160a01b0316610591565b34801561021e57600080fd5b506101076004803603602081101561023557600080fd5b50356001600160a01b031661059c565b34801561025157600080fd5b506101076004803603602081101561026857600080fd5b50356001600160a01b03166105a7565b610280610290565b61029061028b6105b2565b6105d7565b565b604051806040016040528060078152602001667570677261646560c81b815250336103448260405160200180806f636f6e74726163742e6164647265737360801b81525060100182805190602001908083835b602083106103045780518252601f1990920191602091820191016102e5565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206105fb565b6001600160a01b0316816001600160a01b0316146103a9576040805162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6103b283610687565b6040516001600160a01b038416907fb296cdb105d39eaf8bea4eff54b43d98c882477623e4f2855fed4573e3199f8e90600090a2505050565b60006103f682610705565b92915050565b60006103f68261073b565b60006103f682610764565b60005460ff1681565b61042433610764565b610475576040805162461bcd60e51b815260206004820152601860248201527f4163636f756e74206973206e6f7420746865206f776e65720000000000000000604482015290519081900360640190fd5b60408051691c1c9bde1e4b9a5b9a5d60b21b6020808301919091523060601b602a8301528251601e818403018152603e90920190925280519101206104b99061078d565b1561050b576040805162461bcd60e51b815260206004820152601960248201527f50726f787920616c726561647920696e697469616c697a656400000000000000604482015290519081900360640190fd5b61051481610687565b60408051691c1c9bde1e4b9a5b9a5d60b21b6020808301919091523060601b602a8301528251601e818403018152603e909201909252805191012061055a9060016107e7565b6040516001600160a01b038216907f1729d045d5388aa7b44533f56065eaafdb6bb6e4beae5a0c8e0098037017401190600090a250565b60006103f682610857565b60006103f682610880565b60006103f6826108ad565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e8080156105f6573d6000f35b3d6000fd5b60008060019054906101000a90046001600160a01b03166001600160a01b03166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561065557600080fd5b505afa158015610669573d6000803e3d6000fd5b505050506040513d602081101561067f57600080fd5b505192915050565b610690816108f3565b6106e1576040805162461bcd60e51b815260206004820152601960248201527f61646472657373206973206e6f74206120636f6e747261637400000000000000604482015290519081900360640190fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b600061072c6040518060400160405280600381526020016266656560e81b815250836108f9565b806103f657506103f682610764565b60006103f66040518060400160405280600581526020016430b236b4b760d91b815250836108f9565b60006103f66040518060400160405280600581526020016437bbb732b960d91b815250836108f9565b60008060019054906101000a90046001600160a01b03166001600160a01b0316637ae1cfca836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561065557600080fd5b600080546040805163abfdcced60e01b815260048101869052841515602482015290516101009092046001600160a01b03169263abfdcced9260448084019382900301818387803b15801561083b57600080fd5b505af115801561084f573d6000803e3d6000fd5b505050505050565b600061072c6040518060400160405280600581526020016430b236b4b760d91b815250836108f9565b600061072c604051806040016040528060098152602001683232b632b3b0ba37b960b91b815250836108f9565b60006108dc6040518060400160405280600b81526020016a189b1858dadb1a5cdd195960aa1b815250836108f9565b80156103f657506108ec82610764565b1592915050565b3b151590565b600061099b838360405160200180806a6163636573732e726f6c6560a81b815250600b0183805190602001908083835b602083106109485780518252601f199092019160209182019101610929565b6001836020036101000a038019825116818451168082178552505050505050905001826001600160a01b031660601b8152601401925050506040516020818303038152906040528051906020012061078d565b939250505056fea2646970667358221220bd255c78add524798ec47d496773d116f4e5600ab2947dc0cc91772bddce0f9064736f6c63430007060033
Verified Source Code Partial Match
Compiler: v0.7.6+commit.7338295f
EVM: istanbul
Optimization: Yes (200 runs)
DeCashProxy.sol 810 lines
/**
*Submitted for verification at Etherscan.io on 2021-04-21
*/
pragma solidity ^0.7.6;
// SPDX-License-Identifier: MIT
// Source code: https://github.com/DeCash-Official/smart-contracts
interface DeCashProxyInterface {
function initialize(string memory _tokenName, address _tokenAddr) external;
function upgrade(address _new) external;
}
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(
address(this).balance >= amount,
"Address: insufficient balance"
);
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{value: amount}("");
require(
success,
"Address: unable to send value, recipient may have reverted"
);
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data)
internal
returns (bytes memory)
{
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return
functionCallWithValue(
target,
data,
value,
"Address: low-level call with value failed"
);
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(
address(this).balance >= value,
"Address: insufficient balance for call"
);
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) =
target.call{value: value}(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data)
internal
view
returns (bytes memory)
{
return
functionStaticCall(
target,
data,
"Address: low-level static call failed"
);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.3._
*/
function functionDelegateCall(address target, bytes memory data)
internal
returns (bytes memory)
{
return
functionDelegateCall(
target,
data,
"Address: low-level delegate call failed"
);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.3._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) private pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
interface DeCashStorageInterface {
// Getters
function getAddress(bytes32 _key) external view returns (address);
function getUint(bytes32 _key) external view returns (uint256);
function getString(bytes32 _key) external view returns (string memory);
function getBytes(bytes32 _key) external view returns (bytes memory);
function getBool(bytes32 _key) external view returns (bool);
function getInt(bytes32 _key) external view returns (int256);
function getBytes32(bytes32 _key) external view returns (bytes32);
// Setters
function setAddress(bytes32 _key, address _value) external;
function setUint(bytes32 _key, uint256 _value) external;
function setString(bytes32 _key, string calldata _value) external;
function setBytes(bytes32 _key, bytes calldata _value) external;
function setBool(bytes32 _key, bool _value) external;
function setInt(bytes32 _key, int256 _value) external;
function setBytes32(bytes32 _key, bytes32 _value) external;
// Deleters
function deleteAddress(bytes32 _key) external;
function deleteUint(bytes32 _key) external;
function deleteString(bytes32 _key) external;
function deleteBytes(bytes32 _key) external;
function deleteBool(bytes32 _key) external;
function deleteInt(bytes32 _key) external;
function deleteBytes32(bytes32 _key) external;
}
/// @title Base settings / modifiers for each contract in DeCash Token (Credits David Rugendyke/Rocket Pool)
/// @author Fabrizio Amodio (ZioFabry)
abstract contract DeCashBase {
// Version of the contract
uint8 public version;
// The main storage contract where primary persistant storage is maintained
DeCashStorageInterface internal _decashStorage = DeCashStorageInterface(0);
/**
* @dev Throws if called by any sender that doesn't match one of the supplied contract or is the latest version of that contract
*/
modifier onlyLatestContract(
string memory _contractName,
address _contractAddress
) {
require(
_contractAddress ==
_getAddress(
keccak256(
abi.encodePacked("contract.address", _contractName)
)
),
"Invalid or outdated contract"
);
_;
}
modifier onlyOwner() {
require(_isOwner(msg.sender), "Account is not the owner");
_;
}
modifier onlyAdmin() {
require(_isAdmin(msg.sender), "Account is not an admin");
_;
}
modifier onlySuperUser() {
require(_isSuperUser(msg.sender), "Account is not a super user");
_;
}
modifier onlyDelegator(address _address) {
require(_isDelegator(_address), "Account is not a delegator");
_;
}
modifier onlyFeeRecipient(address _address) {
require(_isFeeRecipient(_address), "Account is not a fee recipient");
_;
}
modifier onlyRole(string memory _role) {
require(_roleHas(_role, msg.sender), "Account does not match the role");
_;
}
/// @dev Set the main DeCash Storage address
constructor(address _decashStorageAddress) {
// Update the contract address
_decashStorage = DeCashStorageInterface(_decashStorageAddress);
}
function isOwner(address _address) external view returns (bool) {
return _isOwner(_address);
}
function isAdmin(address _address) external view returns (bool) {
return _isAdmin(_address);
}
function isSuperUser(address _address) external view returns (bool) {
return _isSuperUser(_address);
}
function isDelegator(address _address) external view returns (bool) {
return _isDelegator(_address);
}
function isFeeRecipient(address _address) external view returns (bool) {
return _isFeeRecipient(_address);
}
function isBlacklisted(address _address) external view returns (bool) {
return _isBlacklisted(_address);
}
/// @dev Get the address of a network contract by name
function _getContractAddress(string memory _contractName)
internal
view
returns (address)
{
// Get the current contract address
address contractAddress =
_getAddress(
keccak256(abi.encodePacked("contract.address", _contractName))
);
// Check it
require(contractAddress != address(0x0), "Contract not found");
// Return
return contractAddress;
}
/// @dev Get the name of a network contract by address
function _getContractName(address _contractAddress)
internal
view
returns (string memory)
{
// Get the contract name
string memory contractName =
_getString(
keccak256(abi.encodePacked("contract.name", _contractAddress))
);
// Check it
require(
keccak256(abi.encodePacked(contractName)) !=
keccak256(abi.encodePacked("")),
"Contract not found"
);
// Return
return contractName;
}
/// @dev Role Management
function _roleHas(string memory _role, address _address)
internal
view
returns (bool)
{
return
_getBool(
keccak256(abi.encodePacked("access.role", _role, _address))
);
}
function _isOwner(address _address) internal view returns (bool) {
return _roleHas("owner", _address);
}
function _isAdmin(address _address) internal view returns (bool) {
return _roleHas("admin", _address);
}
function _isSuperUser(address _address) internal view returns (bool) {
return _roleHas("admin", _address) || _isOwner(_address);
}
function _isDelegator(address _address) internal view returns (bool) {
return _roleHas("delegator", _address) || _isOwner(_address);
}
function _isFeeRecipient(address _address) internal view returns (bool) {
return _roleHas("fee", _address) || _isOwner(_address);
}
function _isBlacklisted(address _address) internal view returns (bool) {
return _roleHas("blacklisted", _address) && !_isOwner(_address);
}
/// @dev Storage get methods
function _getAddress(bytes32 _key) internal view returns (address) {
return _decashStorage.getAddress(_key);
}
function _getUint(bytes32 _key) internal view returns (uint256) {
return _decashStorage.getUint(_key);
}
function _getString(bytes32 _key) internal view returns (string memory) {
return _decashStorage.getString(_key);
}
function _getBytes(bytes32 _key) internal view returns (bytes memory) {
return _decashStorage.getBytes(_key);
}
function _getBool(bytes32 _key) internal view returns (bool) {
return _decashStorage.getBool(_key);
}
function _getInt(bytes32 _key) internal view returns (int256) {
return _decashStorage.getInt(_key);
}
function _getBytes32(bytes32 _key) internal view returns (bytes32) {
return _decashStorage.getBytes32(_key);
}
function _getAddressS(string memory _key) internal view returns (address) {
return _decashStorage.getAddress(keccak256(abi.encodePacked(_key)));
}
function _getUintS(string memory _key) internal view returns (uint256) {
return _decashStorage.getUint(keccak256(abi.encodePacked(_key)));
}
function _getStringS(string memory _key)
internal
view
returns (string memory)
{
return _decashStorage.getString(keccak256(abi.encodePacked(_key)));
}
function _getBytesS(string memory _key)
internal
view
returns (bytes memory)
{
return _decashStorage.getBytes(keccak256(abi.encodePacked(_key)));
}
function _getBoolS(string memory _key) internal view returns (bool) {
return _decashStorage.getBool(keccak256(abi.encodePacked(_key)));
}
function _getIntS(string memory _key) internal view returns (int256) {
return _decashStorage.getInt(keccak256(abi.encodePacked(_key)));
}
function _getBytes32S(string memory _key) internal view returns (bytes32) {
return _decashStorage.getBytes32(keccak256(abi.encodePacked(_key)));
}
/// @dev Storage set methods
function _setAddress(bytes32 _key, address _value) internal {
_decashStorage.setAddress(_key, _value);
}
function _setUint(bytes32 _key, uint256 _value) internal {
_decashStorage.setUint(_key, _value);
}
function _setString(bytes32 _key, string memory _value) internal {
_decashStorage.setString(_key, _value);
}
function _setBytes(bytes32 _key, bytes memory _value) internal {
_decashStorage.setBytes(_key, _value);
}
function _setBool(bytes32 _key, bool _value) internal {
_decashStorage.setBool(_key, _value);
}
function _setInt(bytes32 _key, int256 _value) internal {
_decashStorage.setInt(_key, _value);
}
function _setBytes32(bytes32 _key, bytes32 _value) internal {
_decashStorage.setBytes32(_key, _value);
}
function _setAddressS(string memory _key, address _value) internal {
_decashStorage.setAddress(keccak256(abi.encodePacked(_key)), _value);
}
function _setUintS(string memory _key, uint256 _value) internal {
_decashStorage.setUint(keccak256(abi.encodePacked(_key)), _value);
}
function _setStringS(string memory _key, string memory _value) internal {
_decashStorage.setString(keccak256(abi.encodePacked(_key)), _value);
}
function _setBytesS(string memory _key, bytes memory _value) internal {
_decashStorage.setBytes(keccak256(abi.encodePacked(_key)), _value);
}
function _setBoolS(string memory _key, bool _value) internal {
_decashStorage.setBool(keccak256(abi.encodePacked(_key)), _value);
}
function _setIntS(string memory _key, int256 _value) internal {
_decashStorage.setInt(keccak256(abi.encodePacked(_key)), _value);
}
function _setBytes32S(string memory _key, bytes32 _value) internal {
_decashStorage.setBytes32(keccak256(abi.encodePacked(_key)), _value);
}
/// @dev Storage delete methods
function _deleteAddress(bytes32 _key) internal {
_decashStorage.deleteAddress(_key);
}
function _deleteUint(bytes32 _key) internal {
_decashStorage.deleteUint(_key);
}
function _deleteString(bytes32 _key) internal {
_decashStorage.deleteString(_key);
}
function _deleteBytes(bytes32 _key) internal {
_decashStorage.deleteBytes(_key);
}
function _deleteBool(bytes32 _key) internal {
_decashStorage.deleteBool(_key);
}
function _deleteInt(bytes32 _key) internal {
_decashStorage.deleteInt(_key);
}
function _deleteBytes32(bytes32 _key) internal {
_decashStorage.deleteBytes32(_key);
}
function _deleteAddressS(string memory _key) internal {
_decashStorage.deleteAddress(keccak256(abi.encodePacked(_key)));
}
function _deleteUintS(string memory _key) internal {
_decashStorage.deleteUint(keccak256(abi.encodePacked(_key)));
}
function _deleteStringS(string memory _key) internal {
_decashStorage.deleteString(keccak256(abi.encodePacked(_key)));
}
function _deleteBytesS(string memory _key) internal {
_decashStorage.deleteBytes(keccak256(abi.encodePacked(_key)));
}
function _deleteBoolS(string memory _key) internal {
_decashStorage.deleteBool(keccak256(abi.encodePacked(_key)));
}
function _deleteIntS(string memory _key) internal {
_decashStorage.deleteInt(keccak256(abi.encodePacked(_key)));
}
function _deleteBytes32S(string memory _key) internal {
_decashStorage.deleteBytes32(keccak256(abi.encodePacked(_key)));
}
}
/**
* @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
* instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
* be specified by overriding the virtual {_implementation} function.
*
* Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
* different contract through the {_delegate} function.
*
* The success and return data of the delegated call will be returned back to the caller of the proxy.
*/
abstract contract Proxy {
/**
* @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
* is empty.
*/
receive() external payable {
_fallback();
}
/**
* @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
* function in the contract matches the call data.
*/
fallback() external payable {
_fallback();
}
/**
* @dev Delegates the current call to `implementation`.
*
* This function does not return to its internall call site, it will return directly to the external caller.
*/
function _delegate(address implementation) internal {
// solhint-disable-next-line no-inline-assembly
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.
// 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 This is a virtual function that should be overriden so it returns the address to which the fallback function
* and {_fallback} should delegate.
*/
function _implementation() internal view virtual returns (address);
/**
* @dev Delegates the current call to the address returned by `_implementation()`.
*
* This function does not return to its internall call site, it will return directly to the external caller.
*/
function _fallback() internal {
_beforeFallback();
_delegate(_implementation());
}
/**
* @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
* call, or as part of the Solidity `fallback` or `receive` functions.
*
* If overriden should call `super._beforeFallback()`.
*/
function _beforeFallback() internal virtual {}
}
/// @title DeCash Proxy Contract
/// @author Fabrizio Amodio (ZioFabry)
contract DeCashProxy is DeCashBase, Proxy {
bytes32 private constant _IMPLEMENTATION_SLOT =
0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
event ProxyInitiated(address indexed implementation);
event ProxyUpgraded(address indexed implementation);
// Construct
constructor(address _decashStorageAddress)
DeCashBase(_decashStorageAddress)
{
assert(
_IMPLEMENTATION_SLOT ==
bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1)
);
version = 1;
}
function upgrade(address _address)
public
onlyLatestContract("upgrade", msg.sender)
{
_setImplementation(_address);
emit ProxyUpgraded(_address);
}
function initialize(address _address) external onlyOwner {
require(
!_getBool(keccak256(abi.encodePacked("proxy.init", address(this)))),
"Proxy already initialized"
);
_setImplementation(_address);
_setBool(keccak256(abi.encodePacked("proxy.init", address(this))), true);
emit ProxyInitiated(_address);
}
/**
* @dev Stores a new address in the EIP1967 implementation slot.
*/
function _setImplementation(address _address) private {
require(Address.isContract(_address), "address is not a contract");
bytes32 slot = _IMPLEMENTATION_SLOT;
// solhint-disable-next-line no-inline-assembly
assembly {
sstore(slot, _address)
}
}
/**
* @dev Returns the current implementation address.
*/
function _implementation() internal view override returns (address impl) {
bytes32 slot = _IMPLEMENTATION_SLOT;
// solhint-disable-next-line no-inline-assembly
assembly {
impl := sload(slot)
}
}
}
contract USDDProxy is DeCashProxy {
constructor(address _storage) DeCashProxy(_storage) {}
}
Read Contract
isAdmin 0x24d7806c → bool
isBlacklisted 0xfe575a87 → bool
isDelegator 0xfd8ab482 → bool
isFeeRecipient 0x0fea4e66 → bool
isOwner 0x2f54bf6e → bool
isSuperUser 0xcd784d1b → bool
version 0x54fd4d50 → uint8
Write Contract 2 functions
These functions modify contract state and require a wallet transaction to execute.
initialize 0xc4d66de8
address _address
upgrade 0x0900f010
address _address
Recent Transactions
No transactions found for this address