/**
*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": []
}
[{"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"}]