XDC Price: $0.033405 (-3.56%)

Contract Diff Checker

Contract Name:
UUPSProxy

Contract Source Code:

// Sources flattened with hardhat v2.12.4 https://hardhat.org

// File contracts/upgradability/UUPSUtils.sol

// SPDX-License-Identifier: AGPLv3
pragma solidity >=0.8;

/**
 * @title UUPS (Universal Upgradeable Proxy Standard) Shared Library
 */
library UUPSUtils {
	/**
	 * @dev Implementation slot constant.
	 * Using https://eips.ethereum.org/EIPS/eip-1967 standard
	 * Storage slot 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc
	 * (obtained as bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)).
	 */
	bytes32 internal constant _IMPLEMENTATION_SLOT =
		0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

	/// @dev Get implementation address.
	function implementation() internal view returns (address impl) {
		assembly {
			// solium-disable-line
			impl := sload(_IMPLEMENTATION_SLOT)
		}
	}

	/// @dev Set new implementation address.
	function setImplementation(address codeAddress) internal {
		assembly {
			// solium-disable-line
			sstore(_IMPLEMENTATION_SLOT, codeAddress)
		}
	}
}

// File @openzeppelin/contracts/proxy/[email protected]

/**
 * @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 Delegates the current call to `implementation`.
	 *
	 * This function does not return to its internal call site, it will return directly to the external caller.
	 */
	function _delegate(address implementation) internal virtual {
		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 overridden 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 internal call site, it will return directly to the external caller.
	 */
	function _fallback() internal virtual {
		_beforeFallback();
		_delegate(_implementation());
	}

	/**
	 * @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 virtual {
		_fallback();
	}

	/**
	 * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
	 * is empty.
	 */
	receive() external payable virtual {
		_fallback();
	}

	/**
	 * @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 overridden should call `super._beforeFallback()`.
	 */
	function _beforeFallback() internal virtual {}
}

// File contracts/upgradability/UUPSProxy.sol

/**
 * @title UUPS (Universal Upgradeable Proxy Standard) Proxy
 *
 * NOTE:
 * - Compliant with [Universal Upgradeable Proxy Standard](https://eips.ethereum.org/EIPS/eip-1822)
 * - Compiiant with [Standard Proxy Storage Slots](https://eips.ethereum.org/EIPS/eip-1967)
 * - 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 implementation.
 */
contract UUPSProxy is Proxy {
	/**
	 * @dev Proxy initialization function.
	 *      This should only be called once and it is permission-less.
	 * @param initialAddress Initial logic contract code address to be used.
	 */
	function initializeProxy(address initialAddress) external {
		require(initialAddress != address(0), "UUPSProxy: zero address");
		require(
			UUPSUtils.implementation() == address(0),
			"UUPSProxy: already initialized"
		);
		UUPSUtils.setImplementation(initialAddress);
	}

	/// @dev Proxy._implementation implementation
	function _implementation() internal view virtual override returns (address) {
		return UUPSUtils.implementation();
	}
}

Please enter a contract address above to load the contract details and source code.

Context size (optional):