EthereumEthereum
0x5f...f23c
FLASH

FLASH

FLASH

代币
市值
$1.00
 
价格
2%
此合同的源代码已经过验证!
合同元数据
编译器
0.8.9+commit.e5eed63a
语言
Solidity
合同源代码
文件 1 的 1:Proxy.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma experimental ABIEncoderV2;

contract Admin {
    address public admin;

    modifier onlyAdmin() {
        require(msg.sender == admin, "Admin: Not admin");
        _;
    }

    constructor() {
        setAdmin(msg.sender);
    }

    function setAdmin(address _newAdmin) private {
        admin = _newAdmin;
    }

    function tranfserAdminRights(address _newAdmin) external onlyAdmin {
        _transferAdminRights(_newAdmin);
    }

    function _transferAdminRights(address _newAdmin) private {
        require(_newAdmin != address(0), "Admin: Zero Address");
        setAdmin(_newAdmin);
    }
}

contract Upgradeable is Admin {
    bytes32 private constant implementationPosition =
        keccak256("implementation");

    function getImplementation() public view returns (address implementation) {
        bytes32 position = implementationPosition;
        assembly {
            implementation := sload(position)
        }
    }

    function setImplementation(address _newImplementation) external onlyAdmin {
        require(_newImplementation != address(0), "Upgradeable: Zero Address");
        require(
            isContract(_newImplementation),
            "Upgradeable: Implemenentation address must be a contract"
        );
        address currentImplementation = getImplementation();
        require(
            currentImplementation != _newImplementation,
            "Upgradeable: Old and New implementation addresses are same"
        );
        bytes32 position = implementationPosition;
        assembly {
            sstore(position, _newImplementation)
        }
    }

    function isContract(address _target) private view returns (bool) {
        if (_target == address(0)) {
            return false;
        }

        uint256 size;
        assembly {
            size := extcodesize(_target)
        }
        return size > 0;
    }
}

contract Proxy is Upgradeable {
    fallback() external {
        require(msg.data.length > 0, "Upgradeable: Invalid data sent");
        address _impl = getImplementation();
        assembly {
            let ptr := mload(0x40)
            calldatacopy(ptr, 0x0, calldatasize())
            let result := delegatecall(
                gas(),
                _impl,
                ptr,
                calldatasize(),
                0x0,
                0
            )
            let size := returndatasize()
            returndatacopy(ptr, 0x0, size)
            switch result
            case 0 {
                revert(ptr, size)
            }
            default {
                return(ptr, size)
            }
        }
    }
}
设置
{
  "compilationTarget": {
    "Proxy.sol": "Proxy"
  },
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "remappings": []
}
ABI
[{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getImplementation","outputs":[{"internalType":"address","name":"implementation","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newImplementation","type":"address"}],"name":"setImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAdmin","type":"address"}],"name":"tranfserAdminRights","outputs":[],"stateMutability":"nonpayable","type":"function"}]