账户
0x53...91a6
0x53...91a6

0x53...91a6

$500
此合同的源代码已经过验证!
合同元数据
编译器
0.6.0+commit.26b70077
语言
Solidity
合同源代码
文件 1 的 1:Oracle.sol
/**
 *Submitted for verification at Etherscan.io on 2020-06-02
*/

pragma experimental ABIEncoderV2;
pragma solidity ^0.6.0;


interface IACL {
    function accessible(address sender, address to, bytes4 sig)
        external
        view
        returns (bool);
}

contract Oracle {
    address public ACL;

    constructor (address _ACL) public {
        ACL = _ACL;
    }

    modifier auth {
        require(IACL(ACL).accessible(msg.sender, address(this), msg.sig), "access unauthorized");
        _;
    }

    function setACL(
        address _ACL) external {
        require(msg.sender == ACL, "require ACL");
        ACL = _ACL;
    }

    struct Price {
        uint price;
        uint  expiration;
    }

    mapping (address => Price) public prices;

    function getExpiration(address token) external view returns (uint) {
        return prices[token].expiration;
    }

    function getPrice(address token) external view returns (uint) {
        return prices[token].price;
    }

    function get(address token) external view returns (uint, bool) {
        return (prices[token].price, valid(token));
    }

    function valid(address token) public view returns (bool) {
        return now < prices[token].expiration;
    }

    // 设置价格为 @val, 保持有效时间为 @exp second.
    function set(address token, uint val, uint exp) external auth {
        prices[token].price = val;
        prices[token].expiration = now + exp;
    }

    //批量设置,减少gas使用
    function batchSet(address[] calldata tokens, uint[] calldata vals, uint[] calldata exps) external auth {
        uint nToken = tokens.length;
        require(nToken == vals.length && vals.length == exps.length, "invalid array length");
        for (uint i = 0; i < nToken; ++i) {
            prices[tokens[i]].price = vals[i];
            prices[tokens[i]].expiration = now + exps[i];
        }
    }
}
设置
{
  "compilationTarget": {
    "Oracle.sol": "Oracle"
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "remappings": []
}
ABI
[{"inputs":[{"internalType":"address","name":"_ACL","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ACL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"vals","type":"uint256[]"},{"internalType":"uint256[]","name":"exps","type":"uint256[]"}],"name":"batchSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"get","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getExpiration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"prices","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"val","type":"uint256"},{"internalType":"uint256","name":"exp","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ACL","type":"address"}],"name":"setACL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"valid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]