账户
0x28...491e
0x28...491E

0x28...491E

$500
此合同的源代码已经过验证!
合同元数据
编译器
0.8.4+commit.c7e474f2
语言
Solidity
合同源代码
文件 1 的 1:ProxyEntry.sol
// SPDX-License-Identifier: BSD-3-Clause
// File: contracts/interfaces/IOwner.sol
pragma solidity 0.8.4;

/**
* @title BiFi-Bifrost-Extension IOwner Interface
* @notice Interface for Owner Contract
* @author BiFi-Bifrost-Extension(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
*/

interface IOwner {
    function transferOwnership(address _owner) external;
    function acceptOwnership() external;
    function setOwner(address _owner) external;
    function setAdmin(address _admin, uint256 auth) external;
}

// File: contracts/interfaces/IProxyEntry.sol
pragma solidity 0.8.4;


/**
* @title BiFi-Bifrost-Extension IProxyEntry Interface
* @notice Interface for Proxy Contract
* @author BiFi-Bifrost-Extension(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
*/

interface IProxyEntry is IOwner {
    function setProxyLogic(address logicAddr) external returns(bool);
    fallback() external payable;
    receive() external payable;
}

// File: contracts/libs/Owner.sol
pragma solidity 0.8.4;


abstract contract Owner is IOwner {
    address payable public owner;
    address payable public pendingOwner;
    mapping(address => uint256) public admins;

    modifier onlyOwner() {
        require(payable( msg.sender ) == owner, "only Owner");
        _;
    }

    modifier onlyAdmin() {
        address payable sender = payable( msg.sender );
        require(sender == owner || admins[sender] != 0, "only Admin");
        _;
    }

    constructor() {
        admins[owner = payable( msg.sender )] = 1;
    }

    function transferOwnership(address _nextOwner) override external onlyOwner {
        pendingOwner = payable( _nextOwner );
    }

    function acceptOwnership() override external {
        address payable sender = payable( msg.sender );
        require(sender == pendingOwner, "pendingOwner");
        owner = sender;
    }

    function setOwner(address _nextOwner) override external onlyOwner {
        owner = payable( _nextOwner );
    }

    function setAdmin(address _admin, uint256 auth) override external onlyOwner {
        admins[_admin] = auth;
    }
}

// File: contracts/libs/proxy/ProxyStorage.sol
pragma solidity 0.8.4;


/**
* @title BiFi-Bifrost-Extension ProxyStorage Contract
* @notice Contract for proxy storage layout sharing
* @author BiFi-Bifrost-Extension(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
*/

abstract contract ProxyStorage is Owner {
    address public _implement;
}

// File: contracts/libs/proxy/ProxyEntry.sol
pragma solidity 0.8.4;



/**
* @title BiFi-Bifrost-Extension ProxyEntry Contract
* @notice Contract for upgradable proxy pattern with access control
* @author BiFi-Bifrost-Extension(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
*/

contract ProxyEntry is ProxyStorage, IProxyEntry {
    constructor (address logicAddr) {
        _setProxyLogic(logicAddr);
    }

    function setProxyLogic(address logicAddr) onlyOwner override external returns(bool) {
        _setProxyLogic(logicAddr);
    }
    function _setProxyLogic(address logicAddr) internal {
        _implement = logicAddr;
    }

    fallback() override external payable {
        address addr = _implement;
        assembly {
            calldatacopy(0, 0, calldatasize())
            let result := delegatecall(gas(), addr, 0, calldatasize(), 0, 0)
            returndatacopy(0, 0, returndatasize())
            switch result
            case 0 { revert(0, returndatasize()) }
            default { return(0, returndatasize()) }
        }
    }

    receive() override external payable {}
}
设置
{
  "compilationTarget": {
    "ProxyEntry.sol": "ProxyEntry"
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "optimizer": {
    "enabled": true,
    "runs": 1
  },
  "remappings": []
}
ABI
[{"inputs":[{"internalType":"address","name":"logicAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_implement","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admins","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"uint256","name":"auth","type":"uint256"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nextOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"logicAddr","type":"address"}],"name":"setProxyLogic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nextOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]