Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 14,105 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Relay Rebase | 21942907 | 255 days ago | IN | 0 ETH | 0.00006983 | ||||
| Relay Rebase | 21942604 | 255 days ago | IN | 0 ETH | 0.00009059 | ||||
| Relay Rebase | 21942305 | 255 days ago | IN | 0 ETH | 0.00008431 | ||||
| Relay Rebase | 21942006 | 255 days ago | IN | 0 ETH | 0.00059383 | ||||
| Relay Rebase | 21941713 | 255 days ago | IN | 0 ETH | 0.00015244 | ||||
| Relay Rebase | 21941409 | 255 days ago | IN | 0 ETH | 0.00003449 | ||||
| Relay Rebase | 21941113 | 255 days ago | IN | 0 ETH | 0.00003269 | ||||
| Relay Rebase | 21940812 | 255 days ago | IN | 0 ETH | 0.00003429 | ||||
| Relay Rebase | 21940515 | 255 days ago | IN | 0 ETH | 0.00003355 | ||||
| Relay Rebase | 21940216 | 255 days ago | IN | 0 ETH | 0.0000438 | ||||
| Relay Rebase | 21939915 | 255 days ago | IN | 0 ETH | 0.00003752 | ||||
| Relay Rebase | 21939616 | 255 days ago | IN | 0 ETH | 0.0000345 | ||||
| Relay Rebase | 21939319 | 255 days ago | IN | 0 ETH | 0.00003496 | ||||
| Relay Rebase | 21939017 | 255 days ago | IN | 0 ETH | 0.00004869 | ||||
| Relay Rebase | 21938718 | 255 days ago | IN | 0 ETH | 0.00004317 | ||||
| Relay Rebase | 21938425 | 255 days ago | IN | 0 ETH | 0.00006189 | ||||
| Relay Rebase | 21938123 | 255 days ago | IN | 0 ETH | 0.00004256 | ||||
| Relay Rebase | 21937824 | 255 days ago | IN | 0 ETH | 0.00003472 | ||||
| Relay Rebase | 21937524 | 255 days ago | IN | 0 ETH | 0.00003671 | ||||
| Relay Rebase | 21937224 | 255 days ago | IN | 0 ETH | 0.00005412 | ||||
| Relay Rebase | 21936924 | 256 days ago | IN | 0 ETH | 0.00002942 | ||||
| Relay Rebase | 21936625 | 256 days ago | IN | 0 ETH | 0.00003297 | ||||
| Relay Rebase | 21936328 | 256 days ago | IN | 0 ETH | 0.00003105 | ||||
| Relay Rebase | 21936030 | 256 days ago | IN | 0 ETH | 0.00003376 | ||||
| Relay Rebase | 21935733 | 256 days ago | IN | 0 ETH | 0.00003126 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
StdReferenceTick
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.13;
import {StdReferenceBase} from "StdReferenceBase.sol";
import {AccessControl} from "AccessControl.sol";
contract StdReferenceTick is AccessControl, StdReferenceBase {
bytes32 public constant RELAYER_ROLE = keccak256("RELAYER_ROLE");
bytes32 public constant LISTER_ROLE = keccak256("LISTER_ROLE");
bytes32 public constant DELISTER_ROLE = keccak256("DELISTER_ROLE");
bytes32 private constant USD = keccak256(bytes("USD"));
uint256 public constant MID_TICK = 262144;
struct Price {
uint256 tick;
string symbol;
}
uint256 public totalSymbolsCount = 0;
// storage
// 31|3|(timeOffset(18)+tick(19))*6|
mapping(uint256 => uint256) public refs;
mapping(string => uint256) public symbolsToIDs;
mapping(uint256 => string) public idsToSymbols;
constructor(address admin) {
_grantRole(DEFAULT_ADMIN_ROLE, admin);
_grantRole(RELAYER_ROLE, admin);
_grantRole(LISTER_ROLE, admin);
_grantRole(DELISTER_ROLE, admin);
}
function _extractSlotTime(uint256 val) private pure returns (uint256 t) {
unchecked {
t = (val >> 225) & ((1 << 31) - 1);
}
}
function _extractSize(uint256 val) private pure returns (uint256 s) {
unchecked {
s = (val >> 222) & ((1 << 3) - 1);
}
}
function _extractTick(uint256 val, uint256 shiftLen) private pure returns (uint256 tick) {
unchecked {
tick = (val >> shiftLen) & ((1 << 19) - 1);
}
}
function _extractTimeOffset(uint256 val, uint256 shiftLen) private pure returns (uint256 offset) {
unchecked {
offset = (val >> shiftLen) & ((1 << 18) - 1);
}
}
function _setTime(uint256 val, uint256 time) private pure returns (uint256 newVal) {
unchecked {
newVal = (val & (type(uint256).max >> 31)) | (time << 225);
}
}
function _setSize(uint256 val, uint256 size) private pure returns (uint256 newVal) {
unchecked {
newVal = (val & ((type(uint256).max << (37 * (6 - size))) - ((((1 << 3) - 1)) << 222))) | (size << 222);
}
}
function _setTimeOffset(uint256 val, uint256 timeOffset, uint256 shiftLen) private pure returns (uint256 newVal) {
unchecked {
newVal = ((val & ~(uint256((1 << 18) - 1) << (shiftLen + 19))) | (timeOffset << (shiftLen + 19)));
}
}
function _setTicksAndTimeOffset(uint256 val, uint256 timeOffset, uint256 tick, uint256 shiftLen) private pure returns (uint256 newVal) {
unchecked {
newVal = (val & (~(uint256((1 << 37) - 1) << shiftLen))) | (((timeOffset << 19) | (tick & ((1 << 19) - 1))) << shiftLen);
}
}
function _getTickAndTime(uint256 slot, uint8 idx) private view returns (uint256 tick, uint256 lastUpdated) {
unchecked {
uint256 sVal = refs[slot];
uint256 idx_x_37 = idx * 37;
return (_extractTick(sVal, 185 - idx_x_37), _extractTimeOffset(sVal, 204 - idx_x_37) + _extractSlotTime(sVal));
}
}
function getSlotAndIndex(string memory symbol) public view returns (uint256 slot, uint8 idx) {
unchecked {
uint256 id = symbolsToIDs[symbol];
require(id != 0, "getSlotAndIndex: FAIL_SYMBOL_NOT_AVAILABLE");
return ((id - 1) / 6, uint8((id - 1) % 6));
}
}
function getTickAndTime(string memory symbol) public view returns (uint256 tick, uint256 lastUpdated) {
unchecked {
if (keccak256(bytes(symbol)) == USD) {
(tick, lastUpdated) = (MID_TICK, block.timestamp);
} else {
(uint256 slot, uint8 idx) = getSlotAndIndex(symbol);
(tick, lastUpdated) = _getTickAndTime(slot, idx);
require(tick != 0, "getTickAndTime: FAIL_TICK_0_IS_AN_EMPTY_PRICE");
}
}
}
function getReferenceData(string memory _base, string memory _quote) public view override returns (ReferenceData memory r) {
uint256 baseTick;
uint256 quoteTick;
(baseTick, r.lastUpdatedBase) = getTickAndTime(_base);
(quoteTick, r.lastUpdatedQuote) = getTickAndTime(_quote);
require(baseTick + MID_TICK > quoteTick, "getReferenceData: FAIL_PRICE_RATIO_TOO_LOW");
require(baseTick < MID_TICK + quoteTick, "getReferenceData: FAIL_PRICE_RATIO_TOO_HIGH");
r.rate = _getPriceFromTick((baseTick + MID_TICK) - quoteTick);
}
function _getPriceFromTick(uint256 x) private pure returns (uint256 y) {
unchecked {
require(x != 0, "_getPriceFromTick: FAIL_TICK_0_IS_AN_EMPTY_PRICE");
require(x < (1 << 19), "_getPriceFromTick: FAIL_TICK_OUT_OF_RANGE");
y = 649037107316853453566312041152512;
if (x < MID_TICK) {
x = MID_TICK - x;
if (x & 0x01 != 0) y = (y * 649102011027585138911668672356627) >> 109;
if (x & 0x02 != 0) y = (y * 649166921228687897425559839223862) >> 109;
if (x & 0x04 != 0) y = (y * 649296761104602847291923925447306) >> 109;
if (x & 0x08 != 0) y = (y * 649556518769447606681106054382372) >> 109;
if (x & 0x10 != 0) y = (y * 650076345896668132522271100656030) >> 109;
if (x & 0x20 != 0) y = (y * 651117248505878973533694452870408) >> 109;
if (x & 0x40 != 0) y = (y * 653204056474534657407624669811404) >> 109;
if (x & 0x80 != 0) y = (y * 657397758286396885483233885325217) >> 109;
if (x & 0x0100 != 0) y = (y * 665866108005128170549362417755489) >> 109;
if (x & 0x0200 != 0) y = (y * 683131470899774684431604377857106) >> 109;
if (x & 0x0400 != 0) y = (y * 719016834742958293196733842540130) >> 109;
if (x & 0x0800 != 0) y = (y * 796541835305874991615834691778664) >> 109;
if (x & 0x1000 != 0) y = (y * 977569522974447437629335387266319) >> 109;
if (x & 0x2000 != 0) y = (y * 1472399900522103311842374358851872) >> 109;
if (x & 0x4000 != 0) y = (y * 3340273526146976564083509455290620) >> 109;
if (x & 0x8000 != 0) y = (y * 17190738562859105750521122099339319) >> 109;
if (x & 0x010000 != 0) y = (y * 455322953040804340936374685561109626) >> 109;
if (x & 0x020000 != 0) y = (y * 319425483117388922324853186559947171877) >> 109;
y = 649037107316853453566312041152512000000000000000000 / y;
} else {
x = x - MID_TICK;
if (x & 0x01 != 0) y = (y * 649102011027585138911668672356627) >> 109;
if (x & 0x02 != 0) y = (y * 649166921228687897425559839223862) >> 109;
if (x & 0x04 != 0) y = (y * 649296761104602847291923925447306) >> 109;
if (x & 0x08 != 0) y = (y * 649556518769447606681106054382372) >> 109;
if (x & 0x10 != 0) y = (y * 650076345896668132522271100656030) >> 109;
if (x & 0x20 != 0) y = (y * 651117248505878973533694452870408) >> 109;
if (x & 0x40 != 0) y = (y * 653204056474534657407624669811404) >> 109;
if (x & 0x80 != 0) y = (y * 657397758286396885483233885325217) >> 109;
if (x & 0x0100 != 0) y = (y * 665866108005128170549362417755489) >> 109;
if (x & 0x0200 != 0) y = (y * 683131470899774684431604377857106) >> 109;
if (x & 0x0400 != 0) y = (y * 719016834742958293196733842540130) >> 109;
if (x & 0x0800 != 0) y = (y * 796541835305874991615834691778664) >> 109;
if (x & 0x1000 != 0) y = (y * 977569522974447437629335387266319) >> 109;
if (x & 0x2000 != 0) y = (y * 1472399900522103311842374358851872) >> 109;
if (x & 0x4000 != 0) y = (y * 3340273526146976564083509455290620) >> 109;
if (x & 0x8000 != 0) y = (y * 17190738562859105750521122099339319) >> 109;
if (x & 0x010000 != 0) y = (y * 455322953040804340936374685561109626) >> 109;
if (x & 0x020000 != 0) y = (y * 319425483117388922324853186559947171877) >> 109;
y = (y * 1e18) / 649037107316853453566312041152512;
}
}
}
function getPriceFromTick(uint256 x) public pure returns (uint256 y) {
y = _getPriceFromTick(x);
}
/**
* @dev Grants `RELAYER_ROLE` to `accounts`.
*
* If each `account` had not been already granted `RELAYER_ROLE`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``RELAYER_ROLE``'s admin role.
*/
function grantRelayers(address[] calldata accounts) external onlyRole(getRoleAdmin(RELAYER_ROLE)) {
for (uint256 idx = 0; idx < accounts.length; idx++) {
_grantRole(RELAYER_ROLE, accounts[idx]);
}
}
/**
* @dev Revokes `RELAYER_ROLE` from `accounts`.
*
* If each `account` had already granted `RELAYER_ROLE`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must have ``RELAYER_ROLE``'s admin role.
*/
function revokeRelayers(address[] calldata accounts) external onlyRole(getRoleAdmin(RELAYER_ROLE)) {
for (uint256 idx = 0; idx < accounts.length; idx++) {
_revokeRole(RELAYER_ROLE, accounts[idx]);
}
}
function listing(string[] calldata symbols) public onlyRole(LISTER_ROLE) {
require(symbols.length != 0, "listing: FAIL_SYMBOLS_IS_EMPTY");
uint256 _totalSymbolsCount = totalSymbolsCount;
uint256 sid = _totalSymbolsCount / 6;
uint256 sVal = refs[sid];
uint256 sSize = _extractSize(sVal);
for (uint256 i = 0; i < symbols.length; i++) {
require(keccak256(bytes(symbols[i])) != USD, "listing: FAIL_USD_CANT_BE_SET");
require(symbolsToIDs[symbols[i]] == 0, "listing: FAIL_SYMBOL_IS_ALREADY_SET");
uint256 slotID = _totalSymbolsCount / 6;
_totalSymbolsCount++;
symbolsToIDs[symbols[i]] = _totalSymbolsCount;
idsToSymbols[_totalSymbolsCount] = symbols[i];
if (sid != slotID) {
refs[sid] = sVal;
sid = slotID;
sVal = refs[sid];
sSize = _extractSize(sVal);
}
sSize++;
sVal = _setSize(sVal, sSize);
}
refs[sid] = sVal;
totalSymbolsCount = _totalSymbolsCount;
}
function delisting(string[] calldata symbols) public onlyRole(DELISTER_ROLE) {
uint256 _totalSymbolsCount = totalSymbolsCount;
uint256 slotID1;
uint256 slotID2;
uint256 sVal1;
uint256 sVal2;
uint256 sSize;
uint256 shiftLen;
uint256 lastSegment;
uint256 time;
string memory lastSymbol;
for (uint256 i = 0; i < symbols.length; i++) {
uint256 id = symbolsToIDs[symbols[i]];
require(id != 0, "delisting: FAIL_SYMBOL_NOT_AVAILABLE");
lastSymbol = idsToSymbols[_totalSymbolsCount];
symbolsToIDs[lastSymbol] = id;
idsToSymbols[id] = lastSymbol;
slotID1 = (_totalSymbolsCount - 1) / 6;
slotID2 = (id - 1) / 6;
sVal1 = refs[slotID1];
sSize = _extractSize(sVal1);
lastSegment = (sVal1 >> (37 * (6 - sSize))) & ((1 << 37) - 1);
shiftLen = 37 * (5 - ((id - 1) % 6));
if (slotID1 == slotID2) {
sVal1 = (sVal1 & (type(uint256).max - (((1 << 37) - 1) << shiftLen))) | (lastSegment << shiftLen);
} else {
sVal2 = refs[slotID2];
time = _extractSlotTime(sVal1) + (lastSegment >> 19);
require(time >= _extractSlotTime(sVal2), "delisting: FAIL_LAST_TIMESTAMP_IS_LESS_THAN_TARGET_TIMESTAMP");
time -= _extractSlotTime(sVal2);
require(time < 1 << 18, "delisting: FAIL_DELTA_TIME_EXCEED_3_DAYS");
lastSegment = (time << 19) | (lastSegment & ((1 << 19) - 1));
refs[slotID2] = (sVal2 & (type(uint256).max - (((1 << 37) - 1) << shiftLen))) | (lastSegment << shiftLen);
}
refs[slotID1] = _setSize(sVal1, sSize - 1);
delete symbolsToIDs[symbols[i]];
delete idsToSymbols[_totalSymbolsCount];
_totalSymbolsCount--;
}
totalSymbolsCount = _totalSymbolsCount;
}
function relay(uint256 time, uint256 requestID, Price[] calldata ps) external onlyRole(RELAYER_ROLE) {
unchecked {
uint256 id;
uint256 sid = type(uint256).max;
uint256 nextSID;
uint256 sTime;
uint256 sVal;
uint256 shiftLen;
for (uint256 i = 0; i < ps.length; i++) {
id = symbolsToIDs[ps[i].symbol];
require(id != 0, "relay: FAIL_SYMBOL_NOT_AVAILABLE");
nextSID = (id - 1) / 6;
if (sid != nextSID) {
if (sVal != 0) refs[sid] = sVal;
sVal = refs[nextSID];
sid = nextSID;
sTime = _extractSlotTime(sVal);
}
shiftLen = 204 - (37 * ((id - 1) % 6));
if (sTime + _extractTimeOffset(sVal, shiftLen) < time) {
require(time < sTime + (1 << 18), "relay: FAIL_DELTA_TIME_EXCEED_3_DAYS");
sVal = _setTicksAndTimeOffset(sVal, time - sTime, ps[i].tick, shiftLen - 19);
}
}
if (sVal != 0) refs[sid] = sVal;
}
}
function relayRebase(uint256 time, uint256 requestID, Price[] calldata ps) external onlyRole(RELAYER_ROLE) {
unchecked {
uint256 id;
uint256 nextID;
uint256 sVal;
uint256 sTime;
uint256 sSize;
uint256 shiftLen;
uint256 timeOffset;
uint256 i;
while (i < ps.length) {
id = symbolsToIDs[ps[i].symbol];
require(id != 0, "relayRebase: FAIL_SYMBOL_NOT_AVAILABLE");
require((id - 1) % 6 == 0, "relayRebase: FAIL_INVALID_FIRST_IDX");
sVal = refs[(id - 1) / 6];
(sTime, sSize) = (_extractSlotTime(sVal), _extractSize(sVal));
require(sTime < time, "relayRebase: FAIL_NEW_TIME_<=_CURRENT");
shiftLen = 204;
timeOffset = _extractTimeOffset(sVal, shiftLen);
shiftLen = shiftLen - 19;
sVal = sTime + timeOffset <= time
? _setTicksAndTimeOffset(sVal, 0, ps[i].tick, shiftLen)
: _setTimeOffset(sVal, (sTime + timeOffset) - time, shiftLen);
require(i + sSize <= ps.length, "relayRebase: FAIL_INCONSISTENT_SIZES");
for (uint256 j = i + 1; j < i + sSize; j++) {
nextID = symbolsToIDs[ps[j].symbol];
require(nextID != 0, "relayRebase: FAIL_SYMBOL_NOT_AVAILABLE");
require(nextID + i == id + j, "relayRebase: FAIL_INVALID_IDX_ORDER");
shiftLen = shiftLen - 18;
timeOffset = _extractTimeOffset(sVal, shiftLen);
shiftLen = shiftLen - 19;
sVal = sTime + timeOffset <= time
? _setTicksAndTimeOffset(sVal, 0, ps[j].tick, shiftLen)
: _setTimeOffset(sVal, (sTime + timeOffset) - time, shiftLen);
}
refs[(id - 1) / 6] = _setTime(sVal, time);
i += sSize;
}
}
}
}// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.13;
import {IStdReference} from "IStdReference.sol";
abstract contract StdReferenceBase is IStdReference {
function getReferenceData(string memory _base, string memory _quote) public view virtual override returns (ReferenceData memory);
function getReferenceDataBulk(string[] memory _bases, string[] memory _quotes) public view override returns (ReferenceData[] memory) {
require(_bases.length == _quotes.length, "BAD_INPUT_LENGTH");
uint256 len = _bases.length;
ReferenceData[] memory results = new ReferenceData[](len);
for (uint256 idx = 0; idx < len; idx++) {
results[idx] = getReferenceData(_bases[idx], _quotes[idx]);
}
return results;
}
}// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.13;
interface IStdReference {
/// A structure returned whenever someone requests for standard reference data.
struct ReferenceData {
uint256 rate; // base/quote exchange rate, multiplied by 1e18.
uint256 lastUpdatedBase; // UNIX epoch of the last time when base price gets updated.
uint256 lastUpdatedQuote; // UNIX epoch of the last time when quote price gets updated.
}
/// Returns the price data for the given base/quote pair. Revert if not available.
function getReferenceData(string memory _base, string memory _quote) external view returns (ReferenceData memory);
/// Similar to getReferenceData, but with multiple base/quote pairs at once.
function getReferenceDataBulk(string[] memory _bases, string[] memory _quotes) external view returns (ReferenceData[] memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
import "IAccessControl.sol";
import "Context.sol";
import "Strings.sol";
import "ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role, _msgSender());
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(uint160(account), 20),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*
* NOTE: This function is deprecated in favor of {_grantRole}.
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Grants `role` to `account`.
*
* Internal function without access restriction.
*/
function _grantRole(bytes32 role, address account) internal virtual {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
/**
* @dev Revokes `role` from `account`.
*
* Internal function without access restriction.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"evmVersion": "istanbul",
"optimizer": {
"enabled": true,
"runs": 200
},
"libraries": {
"StdReferenceTick.sol": {}
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELISTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LISTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MID_TICK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RELAYER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"symbols","type":"string[]"}],"name":"delisting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"getPriceFromTick","outputs":[{"internalType":"uint256","name":"y","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"_base","type":"string"},{"internalType":"string","name":"_quote","type":"string"}],"name":"getReferenceData","outputs":[{"components":[{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"lastUpdatedBase","type":"uint256"},{"internalType":"uint256","name":"lastUpdatedQuote","type":"uint256"}],"internalType":"struct IStdReference.ReferenceData","name":"r","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"_bases","type":"string[]"},{"internalType":"string[]","name":"_quotes","type":"string[]"}],"name":"getReferenceDataBulk","outputs":[{"components":[{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"lastUpdatedBase","type":"uint256"},{"internalType":"uint256","name":"lastUpdatedQuote","type":"uint256"}],"internalType":"struct IStdReference.ReferenceData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"getSlotAndIndex","outputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"uint8","name":"idx","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"getTickAndTime","outputs":[{"internalType":"uint256","name":"tick","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"grantRelayers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idsToSymbols","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"symbols","type":"string[]"}],"name":"listing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"refs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"requestID","type":"uint256"},{"components":[{"internalType":"uint256","name":"tick","type":"uint256"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct StdReferenceTick.Price[]","name":"ps","type":"tuple[]"}],"name":"relay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"requestID","type":"uint256"},{"components":[{"internalType":"uint256","name":"tick","type":"uint256"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct StdReferenceTick.Price[]","name":"ps","type":"tuple[]"}],"name":"relayRebase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"revokeRelayers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"symbolsToIDs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSymbolsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405260006001553480156200001657600080fd5b5060405162002c9838038062002c98833981016040819052620000399162000172565b62000046600082620000d1565b620000727fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc482620000d1565b6200009e7ff94103142c1baabe9ac2b5d1487bf783de9e69cfeea9a72f5c9c94afd7877b8c82620000d1565b620000ca7f8218c93854a03dca6c0506af642cbb15627b87c15730d807528eb1c9a017b44282620000d1565b50620001a4565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166200016e576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556200012d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000602082840312156200018557600080fd5b81516001600160a01b03811681146200019d57600080fd5b9392505050565b612ae480620001b46000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063926d7d7f116100de578063deb26b9411610097578063e42a071b11610071578063e42a071b146103cc578063eb9f1002146103ec578063eca6ac9e14610414578063efbf21601461042757600080fd5b8063deb26b941461037f578063dee6d283146103a6578063df12c00d146103b957600080fd5b8063926d7d7f14610308578063a217fddf1461031d578063aa631cc814610325578063c3022e731461034f578063d547741f14610359578063d7e7178a1461036c57600080fd5b806338f984441161014b5780637b89dbe4116101255780637b89dbe4146102b95780637ef0bd46146102cc578063845af085146102d557806391d14854146102f557600080fd5b806338f98444146102665780634dcd99221461027957806365555bcc1461029957600080fd5b806301ffc9a71461019357806308146aee146101bb578063248a9ca3146101f45780632b464c57146102175780632f2ff15d1461023e57806336568abe14610253575b600080fd5b6101a66101a136600461237a565b61043a565b60405190151581526020015b60405180910390f35b6101e66101c936600461245b565b805160208183018101805160038252928201919093012091525481565b6040519081526020016101b2565b6101e6610202366004612498565b60009081526020819052604090206001015490565b6101e67f8218c93854a03dca6c0506af642cbb15627b87c15730d807528eb1c9a017b44281565b61025161024c3660046124c8565b610471565b005b6102516102613660046124c8565b61049c565b610251610274366004612539565b61051f565b61028c610287366004612498565b6109c5565b6040516101b291906125a7565b6102ac6102a73660046125da565b610a5f565b6040516101b2919061263e565b6102516102c736600461265f565b610bae565b6101e660015481565b6101e66102e3366004612498565b60026020526000908152604090205481565b6101a66103033660046124c8565b610fcb565b6101e6600080516020612a8f83398151915281565b6101e6600081565b61033861033336600461245b565b610ff4565b6040805192835260ff9091166020830152016101b2565b6101e66204000081565b6102516103673660046124c8565b611097565b61025161037a36600461265f565b6110bd565b6101e67ff94103142c1baabe9ac2b5d1487bf783de9e69cfeea9a72f5c9c94afd7877b8c81565b6102516103b4366004612539565b6112dd565b6101e66103c7366004612498565b611604565b6103df6103da366004612751565b61160f565b6040516101b291906127ab565b6103ff6103fa36600461245b565b61174a565b604080519283526020830191909152016101b2565b610251610422366004612539565b611830565b610251610435366004612539565b6118d4565b60006001600160e01b03198216637965db0b60e01b148061046b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008281526020819052604090206001015461048d8133611972565b61049783836119d6565b505050565b6001600160a01b03811633146105115760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61051b8282611a5a565b5050565b7f8218c93854a03dca6c0506af642cbb15627b87c15730d807528eb1c9a017b44261054a8133611972565b6001546000808080808080806060815b8c8110156109b057600060038f8f848181106105785761057861280d565b905060200281019061058a9190612823565b60405161059892919061286a565b9081526020016040518091039020549050806000036106055760405162461bcd60e51b8152602060048201526024808201527f64656c697374696e673a204641494c5f53594d424f4c5f4e4f545f415641494c60448201526341424c4560e01b6064820152608401610508565b60008c8152600460205260409020805461061e9061287a565b80601f016020809104026020016040519081016040528092919081815260200182805461064a9061287a565b80156106975780601f1061066c57610100808354040283529160200191610697565b820191906000526020600020905b81548152906001019060200180831161067a57829003601f168201915b50505050509250806003846040516106af91906128b4565b9081526040805160209281900383019020929092556000838152600482529190912084516106df92860190612230565b5060066106ed60018e6128e6565b6106f79190612913565b9a5060066107066001836128e6565b6107109190612913565b60008c815260026020526040902054909a50985060de89901c60071696506107398760066128e6565b610744906025612927565b89901c641fffffffff169450600661075d6001836128e6565b6107679190612946565b6107729060056128e6565b61077d906025612927565b9550898b036107a65784861b61079c641fffffffff881b6000196128e6565b8a16179850610907565b60008a8152600260205260409020549750601385901c6107c68a60e11c90565b6107d0919061295a565b93506107dc8860e11c90565b8410156108515760405162461bcd60e51b815260206004820152603c60248201527f64656c697374696e673a204641494c5f4c4153545f54494d455354414d505f4960448201527f535f4c4553535f5448414e5f5441524745545f54494d455354414d50000000006064820152608401610508565b61085b8860e11c90565b61086590856128e6565b93506204000084106108ca5760405162461bcd60e51b815260206004820152602860248201527f64656c697374696e673a204641494c5f44454c54415f54494d455f4558434545604482015267445f335f4441595360c01b6064820152608401610508565b6207ffff94909416601384901b179384861b6108ef641fffffffff881b6000196128e6565b60008c8152600260205260409020908a169190911790555b61091b8961091660018a6128e6565b611abf565b60008c81526002602052604090205560038f8f8481811061093e5761093e61280d565b90506020028101906109509190612823565b60405161095e92919061286a565b908152602001604051809103902060009055600460008d8152602001908152602001600020600061098f91906122b4565b8b61099981612972565b9c50505080806109a890612989565b91505061055a565b50505060019790975550505050505050505050565b600460205260009081526040902080546109de9061287a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0a9061287a565b8015610a575780601f10610a2c57610100808354040283529160200191610a57565b820191906000526020600020905b815481529060010190602001808311610a3a57829003601f168201915b505050505081565b610a8360405180606001604052806000815260200160008152602001600081525090565b600080610a8f8561174a565b60208501529150610a9f8461174a565b6040850152905080610ab4620400008461295a565b11610b145760405162461bcd60e51b815260206004820152602a60248201527f6765745265666572656e6365446174613a204641494c5f50524943455f524154604482015269494f5f544f4f5f4c4f5760b01b6064820152608401610508565b610b21816204000061295a565b8210610b835760405162461bcd60e51b815260206004820152602b60248201527f6765745265666572656e6365446174613a204641494c5f50524943455f52415460448201526a0929ebea89e9ebe90928e960ab1b6064820152608401610508565b610ba381610b94620400008561295a565b610b9e91906128e6565b611ae3565b835250909392505050565b600080516020612a8f833981519152610bc78133611972565b6000806000806000806000805b89811015610fbc5760038b8b83818110610bf057610bf061280d565b9050602002810190610c0291906129a2565b610c10906020810190612823565b604051610c1e92919061286a565b908152602001604051809103902054975087600003610c4f5760405162461bcd60e51b8152600401610508906129b8565b600660001989010615610cb05760405162461bcd60e51b815260206004820152602360248201527f72656c61795265626173653a204641494c5f494e56414c49445f46495253545f60448201526209288b60eb1b6064820152608401610508565b6006600019890104600090815260026020526040902054955060e186901c9450600760de87901c1693508c8510610d375760405162461bcd60e51b815260206004820152602560248201527f72656c61795265626173653a204641494c5f4e45575f54494d455f3c3d5f4355604482015264149491539560da1b6064820152608401610508565b60b992506203ffff60cc87901c1691508482018d1015610d6e578482018d90036013840190811b6203ffff90911b19871617610db9565b610db98660008d8d85818110610d8657610d8661280d565b9050602002810190610d9891906129a2565b6207ffff90351660139190911b17851b641fffffffff861b19919091161790565b95508084018a1015610e195760405162461bcd60e51b8152602060048201526024808201527f72656c61795265626173653a204641494c5f494e434f4e53495354454e545f53604482015263495a455360e01b6064820152608401610508565b600181015b848201811015610f8d5760038c8c83818110610e3c57610e3c61280d565b9050602002810190610e4e91906129a2565b610e5c906020810190612823565b604051610e6a92919061286a565b908152602001604051809103902054975087600003610e9b5760405162461bcd60e51b8152600401610508906129b8565b80890182890114610efa5760405162461bcd60e51b815260206004820152602360248201527f72656c61795265626173653a204641494c5f494e56414c49445f4944585f4f526044820152622222a960e91b6064820152608401610508565b6011199093019286841c6203ffff1692506013840393508d8387011115610f38578583018e90036013850190811b6203ffff90911b19881617610f83565b610f838760008e8e85818110610f5057610f5061280d565b9050602002810190610f6291906129a2565b6207ffff90351660139190911b17861b641fffffffff871b19919091161790565b9650600101610e1e565b5060e18d901b6001600160e11b0387161760066000198a01046000908152600260205260409020558301610bd4565b50505050505050505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600080600060038460405161100991906128b4565b90815260200160405180910390205490508060000361107d5760405162461bcd60e51b815260206004820152602a60248201527f676574536c6f74416e64496e6465783a204641494c5f53594d424f4c5f4e4f546044820152695f415641494c41424c4560b01b6064820152608401610508565b600660001982010460066000198301069250925050915091565b6000828152602081905260409020600101546110b38133611972565b6104978383611a5a565b600080516020612a8f8339815191526110d68133611972565b600060001981808080805b888110156112b75760038a8a838181106110fd576110fd61280d565b905060200281019061110f91906129a2565b61111d906020810190612823565b60405161112b92919061286a565b90815260200160405180910390205496508660000361118c5760405162461bcd60e51b815260206004820181905260248201527f72656c61793a204641494c5f53594d424f4c5f4e4f545f415641494c41424c456044820152606401610508565b600660001988010494508486146111d85782156111b55760008681526002602052604090208390555b600085815260026020526040902054949550859492506111d58360e11c90565b93505b600660001988010660250260cc0391508b6203ffff84841c16850110156112af578362040000018c106112595760405162461bcd60e51b8152602060048201526024808201527f72656c61793a204641494c5f44454c54415f54494d455f4558434545445f335f6044820152634441595360e01b6064820152608401610508565b6112ac83858e038c8c858181106112725761127261280d565b905060200281019061128491906129a2565b356012198601641fffffffff811b199390931660139290921b6207ffff9091161790911b1790565b92505b6001016110e1565b5081156112d05760008581526002602052604090208290555b5050505050505050505050565b7ff94103142c1baabe9ac2b5d1487bf783de9e69cfeea9a72f5c9c94afd7877b8c6113088133611972565b60008290036113595760405162461bcd60e51b815260206004820152601e60248201527f6c697374696e673a204641494c5f53594d424f4c535f49535f454d50545900006044820152606401610508565b6001546000611369600683612913565b600081815260026020526040812054919250600760de83901c16905b868110156115ea576040805180820190915260038152621554d160ea1b6020909101527fc4ae21aac0c6549d71dd96035b7e0bdb6c79ebdba8891b666115bc976d16a29e8888838181106113db576113db61280d565b90506020028101906113ed9190612823565b6040516113fb92919061286a565b6040518091039020036114505760405162461bcd60e51b815260206004820152601d60248201527f6c697374696e673a204641494c5f5553445f43414e545f42455f5345540000006044820152606401610508565b60038888838181106114645761146461280d565b90506020028101906114769190612823565b60405161148492919061286a565b9081526020016040518091039020546000146114ee5760405162461bcd60e51b815260206004820152602360248201527f6c697374696e673a204641494c5f53594d424f4c5f49535f414c52454144595f60448201526214d15560ea1b6064820152608401610508565b60006114fb600687612913565b90508561150781612989565b9650508560038a8a8581811061151f5761151f61280d565b90506020028101906115319190612823565b60405161153f92919061286a565b908152604051908190036020019020558888838181106115615761156161280d565b90506020028101906115739190612823565b600088815260046020526040902061158c9290916122f1565b508085146115bd5760009485526002602052604080862094909455808552929093205491928360de84901c60071692505b826115c781612989565b9350506115d48484611abf565b93505080806115e290612989565b915050611385565b505060009182526002602052604090912055600155505050565b600061046b82611ae3565b606081518351146116555760405162461bcd60e51b815260206004820152601060248201526f0848288be929ca0aaa8be988a9c8ea8960831b6044820152606401610508565b825160008167ffffffffffffffff811115611672576116726123a4565b6040519080825280602002602001820160405280156116c757816020015b6116b460405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816116905790505b50905060005b82811015611741576117118682815181106116ea576116ea61280d565b60200260200101518683815181106117045761170461280d565b6020026020010151610a5f565b8282815181106117235761172361280d565b6020026020010181905250808061173990612989565b9150506116cd565b50949350505050565b6040805180820190915260038152621554d160ea1b60209182015281519082012060009081907f3b51de553f39ab628e2269fca481f424938614245776e4999eea436892e95d62016117a3575062040000905042915091565b6000806117af85610ff4565b915091506117bd8282612042565b909450925060008490036118295760405162461bcd60e51b815260206004820152602d60248201527f6765745469636b416e6454696d653a204641494c5f5449434b5f305f49535f4160448201526c4e5f454d5054595f505249434560981b6064820152608401610508565b5050915091565b600080516020612a8f83398151915260009081526020527ffaf93c3d007e112089dc8351e013e6685ef67703975d0224b26fc45941d4f1f6546118738133611972565b60005b828110156118ce576118bc600080516020612a8f8339815191528585848181106118a2576118a261280d565b90506020020160208101906118b791906129fe565b611a5a565b806118c681612989565b915050611876565b50505050565b600080516020612a8f83398151915260009081526020527ffaf93c3d007e112089dc8351e013e6685ef67703975d0224b26fc45941d4f1f6546119178133611972565b60005b828110156118ce57611960600080516020612a8f8339815191528585848181106119465761194661280d565b905060200201602081019061195b91906129fe565b6119d6565b8061196a81612989565b91505061191a565b61197c8282610fcb565b61051b57611994816001600160a01b0316601461208d565b61199f83602061208d565b6040516020016119b0929190612a19565b60408051601f198184030181529082905262461bcd60e51b8252610508916004016125a7565b6119e08282610fcb565b61051b576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055611a163390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611a648282610fcb565b1561051b576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600760de1b031960001960256006849003021b019190911660de9190911b1790565b600081600003611b4e5760405162461bcd60e51b815260206004820152603060248201527f5f676574507269636546726f6d5469636b3a204641494c5f5449434b5f305f4960448201526f535f414e5f454d5054595f505249434560801b6064820152608401610508565b620800008210611bb25760405162461bcd60e51b815260206004820152602960248201527f5f676574507269636546726f6d5469636b3a204641494c5f5449434b5f4f55546044820152685f4f465f52414e474560b81b6064820152608401610508565b506001606d1b62040000821015611e0657816204000003915081600116600014611bea576d2000d1b71758e219652bd3c3611302606d1c5b6002821615611c07576d2001a3738d157cbeed661f6eb03602606d1c5b6004821615611c24576d200346fc94469961060a2dca328a02606d1c5b6008821615611c41576d20068e4f1561d255b44b568c032402606d1c5b6010821615611c5e576d200d1df6014a4a9014baffb8599e02606d1c5b6020821615611c7b576d201a414c7682e7073bf3b554ad0802606d1c5b6040821615611c98576d203498238e85baee52e71bebd2cc02606d1c5b6080821615611cb5576d206986b863ec99f4db81adbc87a102606d1c5b610100821615611cd3576d20d4696f19155ff7f037dab4656102606d1c5b610200821615611cf1576d21ae54d48d99b179d35cee362c5202606d1c5b610400821615611d0f576d237344b1cc7250b2db8eaff5466202606d1c5b610800821615611d2d576d2745c57b409f06f3e79a2f7cb86802606d1c5b611000821615611d4b576d3032a97cd3c1b51fcefe55685d0f02606d1c5b612000821615611d69576d48984caba30b40521004a50ee12002606d1c5b614000821615611d87576da4b02ddd73f26b638c2cef3d00fc02606d1c5b618000821615611da6576e034f91a016aa2d09fe9a635c0ca03702606d1c5b62010000821615611dc6576e57b127a165bef92f108b218cd9bc7a02606d1c5b62020000821615611de7576ff04f1c3c33c8919f172ba42a5b99e82502606d1c5b806503782dace9d9607f1b81611dff57611dff6128fd565b0492915050565b6203ffff19909101906001821615611e2c576d2000d1b71758e219652bd3c3611302606d1c5b6002821615611e49576d2001a3738d157cbeed661f6eb03602606d1c5b6004821615611e66576d200346fc94469961060a2dca328a02606d1c5b6008821615611e83576d20068e4f1561d255b44b568c032402606d1c5b6010821615611ea0576d200d1df6014a4a9014baffb8599e02606d1c5b6020821615611ebd576d201a414c7682e7073bf3b554ad0802606d1c5b6040821615611eda576d203498238e85baee52e71bebd2cc02606d1c5b6080821615611ef7576d206986b863ec99f4db81adbc87a102606d1c5b610100821615611f15576d20d4696f19155ff7f037dab4656102606d1c5b610200821615611f33576d21ae54d48d99b179d35cee362c5202606d1c5b610400821615611f51576d237344b1cc7250b2db8eaff5466202606d1c5b610800821615611f6f576d2745c57b409f06f3e79a2f7cb86802606d1c5b611000821615611f8d576d3032a97cd3c1b51fcefe55685d0f02606d1c5b612000821615611fab576d48984caba30b40521004a50ee12002606d1c5b614000821615611fc9576da4b02ddd73f26b638c2cef3d00fc02606d1c5b618000821615611fe8576e034f91a016aa2d09fe9a635c0ca03702606d1c5b62010000821615612008576e57b127a165bef92f108b218cd9bc7a02606d1c5b62020000821615612029576ff04f1c3c33c8919f172ba42a5b99e82502606d1c5b6001606d1b670de0b6b3a764000082020490505b919050565b60008281526002602052604081205481906025840260ff1660b981900382901c6207ffff166120718360e11c90565b60cc83900384901c6203ffff16019350935050505b9250929050565b6060600061209c836002612927565b6120a790600261295a565b67ffffffffffffffff8111156120bf576120bf6123a4565b6040519080825280601f01601f1916602001820160405280156120e9576020820181803683370190505b509050600360fc1b816000815181106121045761210461280d565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106121335761213361280d565b60200101906001600160f81b031916908160001a9053506000612157846002612927565b61216290600161295a565b90505b60018111156121da576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106121965761219661280d565b1a60f81b8282815181106121ac576121ac61280d565b60200101906001600160f81b031916908160001a90535060049490941c936121d381612972565b9050612165565b5083156122295760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610508565b9392505050565b82805461223c9061287a565b90600052602060002090601f01602090048101928261225e57600085556122a4565b82601f1061227757805160ff19168380011785556122a4565b828001600101855582156122a4579182015b828111156122a4578251825591602001919060010190612289565b506122b0929150612365565b5090565b5080546122c09061287a565b6000825580601f106122d0575050565b601f0160209004906000526020600020908101906122ee9190612365565b50565b8280546122fd9061287a565b90600052602060002090601f01602090048101928261231f57600085556122a4565b82601f106123385782800160ff198235161785556122a4565b828001600101855582156122a4579182015b828111156122a457823582559160200191906001019061234a565b5b808211156122b05760008155600101612366565b60006020828403121561238c57600080fd5b81356001600160e01b03198116811461222957600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156123e3576123e36123a4565b604052919050565b600082601f8301126123fc57600080fd5b813567ffffffffffffffff811115612416576124166123a4565b612429601f8201601f19166020016123ba565b81815284602083860101111561243e57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561246d57600080fd5b813567ffffffffffffffff81111561248457600080fd5b612490848285016123eb565b949350505050565b6000602082840312156124aa57600080fd5b5035919050565b80356001600160a01b038116811461203d57600080fd5b600080604083850312156124db57600080fd5b823591506124eb602084016124b1565b90509250929050565b60008083601f84011261250657600080fd5b50813567ffffffffffffffff81111561251e57600080fd5b6020830191508360208260051b850101111561208657600080fd5b6000806020838503121561254c57600080fd5b823567ffffffffffffffff81111561256357600080fd5b61256f858286016124f4565b90969095509350505050565b60005b8381101561259657818101518382015260200161257e565b838111156118ce5750506000910152565b60208152600082518060208401526125c681604085016020870161257b565b601f01601f19169190910160400192915050565b600080604083850312156125ed57600080fd5b823567ffffffffffffffff8082111561260557600080fd5b612611868387016123eb565b9350602085013591508082111561262757600080fd5b50612634858286016123eb565b9150509250929050565b8151815260208083015190820152604080830151908201526060810161046b565b6000806000806060858703121561267557600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561269a57600080fd5b6126a6878288016124f4565b95989497509550505050565b600082601f8301126126c357600080fd5b8135602067ffffffffffffffff808311156126e0576126e06123a4565b8260051b6126ef8382016123ba565b938452858101830193838101908886111561270957600080fd5b84880192505b85831015612745578235848111156127275760008081fd5b6127358a87838c01016123eb565b835250918401919084019061270f565b98975050505050505050565b6000806040838503121561276457600080fd5b823567ffffffffffffffff8082111561277c57600080fd5b612788868387016126b2565b9350602085013591508082111561279e57600080fd5b50612634858286016126b2565b6020808252825182820181905260009190848201906040850190845b81811015612801576127ee8385518051825260208082015190830152604090810151910152565b92840192606092909201916001016127c7565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261283a57600080fd5b83018035915067ffffffffffffffff82111561285557600080fd5b60200191503681900382131561208657600080fd5b8183823760009101908152919050565b600181811c9082168061288e57607f821691505b6020821081036128ae57634e487b7160e01b600052602260045260246000fd5b50919050565b600082516128c681846020870161257b565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b6000828210156128f8576128f86128d0565b500390565b634e487b7160e01b600052601260045260246000fd5b600082612922576129226128fd565b500490565b6000816000190483118215151615612941576129416128d0565b500290565b600082612955576129556128fd565b500690565b6000821982111561296d5761296d6128d0565b500190565b600081612981576129816128d0565b506000190190565b60006001820161299b5761299b6128d0565b5060010190565b60008235603e198336030181126128c657600080fd5b60208082526026908201527f72656c61795265626173653a204641494c5f53594d424f4c5f4e4f545f415641604082015265494c41424c4560d01b606082015260800190565b600060208284031215612a1057600080fd5b612229826124b1565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612a5181601785016020880161257b565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612a8281602884016020880161257b565b0160280194935050505056fee2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc4a26469706673582212202b92459c65398fbf771381f0efabb6e6ca0018d3dc578e8654445f2ca410a77664736f6c634300080d0033000000000000000000000000b181d27f809a6ff4d1860d0bc193ec38c9c97c15
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063926d7d7f116100de578063deb26b9411610097578063e42a071b11610071578063e42a071b146103cc578063eb9f1002146103ec578063eca6ac9e14610414578063efbf21601461042757600080fd5b8063deb26b941461037f578063dee6d283146103a6578063df12c00d146103b957600080fd5b8063926d7d7f14610308578063a217fddf1461031d578063aa631cc814610325578063c3022e731461034f578063d547741f14610359578063d7e7178a1461036c57600080fd5b806338f984441161014b5780637b89dbe4116101255780637b89dbe4146102b95780637ef0bd46146102cc578063845af085146102d557806391d14854146102f557600080fd5b806338f98444146102665780634dcd99221461027957806365555bcc1461029957600080fd5b806301ffc9a71461019357806308146aee146101bb578063248a9ca3146101f45780632b464c57146102175780632f2ff15d1461023e57806336568abe14610253575b600080fd5b6101a66101a136600461237a565b61043a565b60405190151581526020015b60405180910390f35b6101e66101c936600461245b565b805160208183018101805160038252928201919093012091525481565b6040519081526020016101b2565b6101e6610202366004612498565b60009081526020819052604090206001015490565b6101e67f8218c93854a03dca6c0506af642cbb15627b87c15730d807528eb1c9a017b44281565b61025161024c3660046124c8565b610471565b005b6102516102613660046124c8565b61049c565b610251610274366004612539565b61051f565b61028c610287366004612498565b6109c5565b6040516101b291906125a7565b6102ac6102a73660046125da565b610a5f565b6040516101b2919061263e565b6102516102c736600461265f565b610bae565b6101e660015481565b6101e66102e3366004612498565b60026020526000908152604090205481565b6101a66103033660046124c8565b610fcb565b6101e6600080516020612a8f83398151915281565b6101e6600081565b61033861033336600461245b565b610ff4565b6040805192835260ff9091166020830152016101b2565b6101e66204000081565b6102516103673660046124c8565b611097565b61025161037a36600461265f565b6110bd565b6101e67ff94103142c1baabe9ac2b5d1487bf783de9e69cfeea9a72f5c9c94afd7877b8c81565b6102516103b4366004612539565b6112dd565b6101e66103c7366004612498565b611604565b6103df6103da366004612751565b61160f565b6040516101b291906127ab565b6103ff6103fa36600461245b565b61174a565b604080519283526020830191909152016101b2565b610251610422366004612539565b611830565b610251610435366004612539565b6118d4565b60006001600160e01b03198216637965db0b60e01b148061046b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008281526020819052604090206001015461048d8133611972565b61049783836119d6565b505050565b6001600160a01b03811633146105115760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61051b8282611a5a565b5050565b7f8218c93854a03dca6c0506af642cbb15627b87c15730d807528eb1c9a017b44261054a8133611972565b6001546000808080808080806060815b8c8110156109b057600060038f8f848181106105785761057861280d565b905060200281019061058a9190612823565b60405161059892919061286a565b9081526020016040518091039020549050806000036106055760405162461bcd60e51b8152602060048201526024808201527f64656c697374696e673a204641494c5f53594d424f4c5f4e4f545f415641494c60448201526341424c4560e01b6064820152608401610508565b60008c8152600460205260409020805461061e9061287a565b80601f016020809104026020016040519081016040528092919081815260200182805461064a9061287a565b80156106975780601f1061066c57610100808354040283529160200191610697565b820191906000526020600020905b81548152906001019060200180831161067a57829003601f168201915b50505050509250806003846040516106af91906128b4565b9081526040805160209281900383019020929092556000838152600482529190912084516106df92860190612230565b5060066106ed60018e6128e6565b6106f79190612913565b9a5060066107066001836128e6565b6107109190612913565b60008c815260026020526040902054909a50985060de89901c60071696506107398760066128e6565b610744906025612927565b89901c641fffffffff169450600661075d6001836128e6565b6107679190612946565b6107729060056128e6565b61077d906025612927565b9550898b036107a65784861b61079c641fffffffff881b6000196128e6565b8a16179850610907565b60008a8152600260205260409020549750601385901c6107c68a60e11c90565b6107d0919061295a565b93506107dc8860e11c90565b8410156108515760405162461bcd60e51b815260206004820152603c60248201527f64656c697374696e673a204641494c5f4c4153545f54494d455354414d505f4960448201527f535f4c4553535f5448414e5f5441524745545f54494d455354414d50000000006064820152608401610508565b61085b8860e11c90565b61086590856128e6565b93506204000084106108ca5760405162461bcd60e51b815260206004820152602860248201527f64656c697374696e673a204641494c5f44454c54415f54494d455f4558434545604482015267445f335f4441595360c01b6064820152608401610508565b6207ffff94909416601384901b179384861b6108ef641fffffffff881b6000196128e6565b60008c8152600260205260409020908a169190911790555b61091b8961091660018a6128e6565b611abf565b60008c81526002602052604090205560038f8f8481811061093e5761093e61280d565b90506020028101906109509190612823565b60405161095e92919061286a565b908152602001604051809103902060009055600460008d8152602001908152602001600020600061098f91906122b4565b8b61099981612972565b9c50505080806109a890612989565b91505061055a565b50505060019790975550505050505050505050565b600460205260009081526040902080546109de9061287a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0a9061287a565b8015610a575780601f10610a2c57610100808354040283529160200191610a57565b820191906000526020600020905b815481529060010190602001808311610a3a57829003601f168201915b505050505081565b610a8360405180606001604052806000815260200160008152602001600081525090565b600080610a8f8561174a565b60208501529150610a9f8461174a565b6040850152905080610ab4620400008461295a565b11610b145760405162461bcd60e51b815260206004820152602a60248201527f6765745265666572656e6365446174613a204641494c5f50524943455f524154604482015269494f5f544f4f5f4c4f5760b01b6064820152608401610508565b610b21816204000061295a565b8210610b835760405162461bcd60e51b815260206004820152602b60248201527f6765745265666572656e6365446174613a204641494c5f50524943455f52415460448201526a0929ebea89e9ebe90928e960ab1b6064820152608401610508565b610ba381610b94620400008561295a565b610b9e91906128e6565b611ae3565b835250909392505050565b600080516020612a8f833981519152610bc78133611972565b6000806000806000806000805b89811015610fbc5760038b8b83818110610bf057610bf061280d565b9050602002810190610c0291906129a2565b610c10906020810190612823565b604051610c1e92919061286a565b908152602001604051809103902054975087600003610c4f5760405162461bcd60e51b8152600401610508906129b8565b600660001989010615610cb05760405162461bcd60e51b815260206004820152602360248201527f72656c61795265626173653a204641494c5f494e56414c49445f46495253545f60448201526209288b60eb1b6064820152608401610508565b6006600019890104600090815260026020526040902054955060e186901c9450600760de87901c1693508c8510610d375760405162461bcd60e51b815260206004820152602560248201527f72656c61795265626173653a204641494c5f4e45575f54494d455f3c3d5f4355604482015264149491539560da1b6064820152608401610508565b60b992506203ffff60cc87901c1691508482018d1015610d6e578482018d90036013840190811b6203ffff90911b19871617610db9565b610db98660008d8d85818110610d8657610d8661280d565b9050602002810190610d9891906129a2565b6207ffff90351660139190911b17851b641fffffffff861b19919091161790565b95508084018a1015610e195760405162461bcd60e51b8152602060048201526024808201527f72656c61795265626173653a204641494c5f494e434f4e53495354454e545f53604482015263495a455360e01b6064820152608401610508565b600181015b848201811015610f8d5760038c8c83818110610e3c57610e3c61280d565b9050602002810190610e4e91906129a2565b610e5c906020810190612823565b604051610e6a92919061286a565b908152602001604051809103902054975087600003610e9b5760405162461bcd60e51b8152600401610508906129b8565b80890182890114610efa5760405162461bcd60e51b815260206004820152602360248201527f72656c61795265626173653a204641494c5f494e56414c49445f4944585f4f526044820152622222a960e91b6064820152608401610508565b6011199093019286841c6203ffff1692506013840393508d8387011115610f38578583018e90036013850190811b6203ffff90911b19881617610f83565b610f838760008e8e85818110610f5057610f5061280d565b9050602002810190610f6291906129a2565b6207ffff90351660139190911b17861b641fffffffff871b19919091161790565b9650600101610e1e565b5060e18d901b6001600160e11b0387161760066000198a01046000908152600260205260409020558301610bd4565b50505050505050505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600080600060038460405161100991906128b4565b90815260200160405180910390205490508060000361107d5760405162461bcd60e51b815260206004820152602a60248201527f676574536c6f74416e64496e6465783a204641494c5f53594d424f4c5f4e4f546044820152695f415641494c41424c4560b01b6064820152608401610508565b600660001982010460066000198301069250925050915091565b6000828152602081905260409020600101546110b38133611972565b6104978383611a5a565b600080516020612a8f8339815191526110d68133611972565b600060001981808080805b888110156112b75760038a8a838181106110fd576110fd61280d565b905060200281019061110f91906129a2565b61111d906020810190612823565b60405161112b92919061286a565b90815260200160405180910390205496508660000361118c5760405162461bcd60e51b815260206004820181905260248201527f72656c61793a204641494c5f53594d424f4c5f4e4f545f415641494c41424c456044820152606401610508565b600660001988010494508486146111d85782156111b55760008681526002602052604090208390555b600085815260026020526040902054949550859492506111d58360e11c90565b93505b600660001988010660250260cc0391508b6203ffff84841c16850110156112af578362040000018c106112595760405162461bcd60e51b8152602060048201526024808201527f72656c61793a204641494c5f44454c54415f54494d455f4558434545445f335f6044820152634441595360e01b6064820152608401610508565b6112ac83858e038c8c858181106112725761127261280d565b905060200281019061128491906129a2565b356012198601641fffffffff811b199390931660139290921b6207ffff9091161790911b1790565b92505b6001016110e1565b5081156112d05760008581526002602052604090208290555b5050505050505050505050565b7ff94103142c1baabe9ac2b5d1487bf783de9e69cfeea9a72f5c9c94afd7877b8c6113088133611972565b60008290036113595760405162461bcd60e51b815260206004820152601e60248201527f6c697374696e673a204641494c5f53594d424f4c535f49535f454d50545900006044820152606401610508565b6001546000611369600683612913565b600081815260026020526040812054919250600760de83901c16905b868110156115ea576040805180820190915260038152621554d160ea1b6020909101527fc4ae21aac0c6549d71dd96035b7e0bdb6c79ebdba8891b666115bc976d16a29e8888838181106113db576113db61280d565b90506020028101906113ed9190612823565b6040516113fb92919061286a565b6040518091039020036114505760405162461bcd60e51b815260206004820152601d60248201527f6c697374696e673a204641494c5f5553445f43414e545f42455f5345540000006044820152606401610508565b60038888838181106114645761146461280d565b90506020028101906114769190612823565b60405161148492919061286a565b9081526020016040518091039020546000146114ee5760405162461bcd60e51b815260206004820152602360248201527f6c697374696e673a204641494c5f53594d424f4c5f49535f414c52454144595f60448201526214d15560ea1b6064820152608401610508565b60006114fb600687612913565b90508561150781612989565b9650508560038a8a8581811061151f5761151f61280d565b90506020028101906115319190612823565b60405161153f92919061286a565b908152604051908190036020019020558888838181106115615761156161280d565b90506020028101906115739190612823565b600088815260046020526040902061158c9290916122f1565b508085146115bd5760009485526002602052604080862094909455808552929093205491928360de84901c60071692505b826115c781612989565b9350506115d48484611abf565b93505080806115e290612989565b915050611385565b505060009182526002602052604090912055600155505050565b600061046b82611ae3565b606081518351146116555760405162461bcd60e51b815260206004820152601060248201526f0848288be929ca0aaa8be988a9c8ea8960831b6044820152606401610508565b825160008167ffffffffffffffff811115611672576116726123a4565b6040519080825280602002602001820160405280156116c757816020015b6116b460405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816116905790505b50905060005b82811015611741576117118682815181106116ea576116ea61280d565b60200260200101518683815181106117045761170461280d565b6020026020010151610a5f565b8282815181106117235761172361280d565b6020026020010181905250808061173990612989565b9150506116cd565b50949350505050565b6040805180820190915260038152621554d160ea1b60209182015281519082012060009081907f3b51de553f39ab628e2269fca481f424938614245776e4999eea436892e95d62016117a3575062040000905042915091565b6000806117af85610ff4565b915091506117bd8282612042565b909450925060008490036118295760405162461bcd60e51b815260206004820152602d60248201527f6765745469636b416e6454696d653a204641494c5f5449434b5f305f49535f4160448201526c4e5f454d5054595f505249434560981b6064820152608401610508565b5050915091565b600080516020612a8f83398151915260009081526020527ffaf93c3d007e112089dc8351e013e6685ef67703975d0224b26fc45941d4f1f6546118738133611972565b60005b828110156118ce576118bc600080516020612a8f8339815191528585848181106118a2576118a261280d565b90506020020160208101906118b791906129fe565b611a5a565b806118c681612989565b915050611876565b50505050565b600080516020612a8f83398151915260009081526020527ffaf93c3d007e112089dc8351e013e6685ef67703975d0224b26fc45941d4f1f6546119178133611972565b60005b828110156118ce57611960600080516020612a8f8339815191528585848181106119465761194661280d565b905060200201602081019061195b91906129fe565b6119d6565b8061196a81612989565b91505061191a565b61197c8282610fcb565b61051b57611994816001600160a01b0316601461208d565b61199f83602061208d565b6040516020016119b0929190612a19565b60408051601f198184030181529082905262461bcd60e51b8252610508916004016125a7565b6119e08282610fcb565b61051b576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055611a163390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611a648282610fcb565b1561051b576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600760de1b031960001960256006849003021b019190911660de9190911b1790565b600081600003611b4e5760405162461bcd60e51b815260206004820152603060248201527f5f676574507269636546726f6d5469636b3a204641494c5f5449434b5f305f4960448201526f535f414e5f454d5054595f505249434560801b6064820152608401610508565b620800008210611bb25760405162461bcd60e51b815260206004820152602960248201527f5f676574507269636546726f6d5469636b3a204641494c5f5449434b5f4f55546044820152685f4f465f52414e474560b81b6064820152608401610508565b506001606d1b62040000821015611e0657816204000003915081600116600014611bea576d2000d1b71758e219652bd3c3611302606d1c5b6002821615611c07576d2001a3738d157cbeed661f6eb03602606d1c5b6004821615611c24576d200346fc94469961060a2dca328a02606d1c5b6008821615611c41576d20068e4f1561d255b44b568c032402606d1c5b6010821615611c5e576d200d1df6014a4a9014baffb8599e02606d1c5b6020821615611c7b576d201a414c7682e7073bf3b554ad0802606d1c5b6040821615611c98576d203498238e85baee52e71bebd2cc02606d1c5b6080821615611cb5576d206986b863ec99f4db81adbc87a102606d1c5b610100821615611cd3576d20d4696f19155ff7f037dab4656102606d1c5b610200821615611cf1576d21ae54d48d99b179d35cee362c5202606d1c5b610400821615611d0f576d237344b1cc7250b2db8eaff5466202606d1c5b610800821615611d2d576d2745c57b409f06f3e79a2f7cb86802606d1c5b611000821615611d4b576d3032a97cd3c1b51fcefe55685d0f02606d1c5b612000821615611d69576d48984caba30b40521004a50ee12002606d1c5b614000821615611d87576da4b02ddd73f26b638c2cef3d00fc02606d1c5b618000821615611da6576e034f91a016aa2d09fe9a635c0ca03702606d1c5b62010000821615611dc6576e57b127a165bef92f108b218cd9bc7a02606d1c5b62020000821615611de7576ff04f1c3c33c8919f172ba42a5b99e82502606d1c5b806503782dace9d9607f1b81611dff57611dff6128fd565b0492915050565b6203ffff19909101906001821615611e2c576d2000d1b71758e219652bd3c3611302606d1c5b6002821615611e49576d2001a3738d157cbeed661f6eb03602606d1c5b6004821615611e66576d200346fc94469961060a2dca328a02606d1c5b6008821615611e83576d20068e4f1561d255b44b568c032402606d1c5b6010821615611ea0576d200d1df6014a4a9014baffb8599e02606d1c5b6020821615611ebd576d201a414c7682e7073bf3b554ad0802606d1c5b6040821615611eda576d203498238e85baee52e71bebd2cc02606d1c5b6080821615611ef7576d206986b863ec99f4db81adbc87a102606d1c5b610100821615611f15576d20d4696f19155ff7f037dab4656102606d1c5b610200821615611f33576d21ae54d48d99b179d35cee362c5202606d1c5b610400821615611f51576d237344b1cc7250b2db8eaff5466202606d1c5b610800821615611f6f576d2745c57b409f06f3e79a2f7cb86802606d1c5b611000821615611f8d576d3032a97cd3c1b51fcefe55685d0f02606d1c5b612000821615611fab576d48984caba30b40521004a50ee12002606d1c5b614000821615611fc9576da4b02ddd73f26b638c2cef3d00fc02606d1c5b618000821615611fe8576e034f91a016aa2d09fe9a635c0ca03702606d1c5b62010000821615612008576e57b127a165bef92f108b218cd9bc7a02606d1c5b62020000821615612029576ff04f1c3c33c8919f172ba42a5b99e82502606d1c5b6001606d1b670de0b6b3a764000082020490505b919050565b60008281526002602052604081205481906025840260ff1660b981900382901c6207ffff166120718360e11c90565b60cc83900384901c6203ffff16019350935050505b9250929050565b6060600061209c836002612927565b6120a790600261295a565b67ffffffffffffffff8111156120bf576120bf6123a4565b6040519080825280601f01601f1916602001820160405280156120e9576020820181803683370190505b509050600360fc1b816000815181106121045761210461280d565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106121335761213361280d565b60200101906001600160f81b031916908160001a9053506000612157846002612927565b61216290600161295a565b90505b60018111156121da576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106121965761219661280d565b1a60f81b8282815181106121ac576121ac61280d565b60200101906001600160f81b031916908160001a90535060049490941c936121d381612972565b9050612165565b5083156122295760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610508565b9392505050565b82805461223c9061287a565b90600052602060002090601f01602090048101928261225e57600085556122a4565b82601f1061227757805160ff19168380011785556122a4565b828001600101855582156122a4579182015b828111156122a4578251825591602001919060010190612289565b506122b0929150612365565b5090565b5080546122c09061287a565b6000825580601f106122d0575050565b601f0160209004906000526020600020908101906122ee9190612365565b50565b8280546122fd9061287a565b90600052602060002090601f01602090048101928261231f57600085556122a4565b82601f106123385782800160ff198235161785556122a4565b828001600101855582156122a4579182015b828111156122a457823582559160200191906001019061234a565b5b808211156122b05760008155600101612366565b60006020828403121561238c57600080fd5b81356001600160e01b03198116811461222957600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156123e3576123e36123a4565b604052919050565b600082601f8301126123fc57600080fd5b813567ffffffffffffffff811115612416576124166123a4565b612429601f8201601f19166020016123ba565b81815284602083860101111561243e57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561246d57600080fd5b813567ffffffffffffffff81111561248457600080fd5b612490848285016123eb565b949350505050565b6000602082840312156124aa57600080fd5b5035919050565b80356001600160a01b038116811461203d57600080fd5b600080604083850312156124db57600080fd5b823591506124eb602084016124b1565b90509250929050565b60008083601f84011261250657600080fd5b50813567ffffffffffffffff81111561251e57600080fd5b6020830191508360208260051b850101111561208657600080fd5b6000806020838503121561254c57600080fd5b823567ffffffffffffffff81111561256357600080fd5b61256f858286016124f4565b90969095509350505050565b60005b8381101561259657818101518382015260200161257e565b838111156118ce5750506000910152565b60208152600082518060208401526125c681604085016020870161257b565b601f01601f19169190910160400192915050565b600080604083850312156125ed57600080fd5b823567ffffffffffffffff8082111561260557600080fd5b612611868387016123eb565b9350602085013591508082111561262757600080fd5b50612634858286016123eb565b9150509250929050565b8151815260208083015190820152604080830151908201526060810161046b565b6000806000806060858703121561267557600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561269a57600080fd5b6126a6878288016124f4565b95989497509550505050565b600082601f8301126126c357600080fd5b8135602067ffffffffffffffff808311156126e0576126e06123a4565b8260051b6126ef8382016123ba565b938452858101830193838101908886111561270957600080fd5b84880192505b85831015612745578235848111156127275760008081fd5b6127358a87838c01016123eb565b835250918401919084019061270f565b98975050505050505050565b6000806040838503121561276457600080fd5b823567ffffffffffffffff8082111561277c57600080fd5b612788868387016126b2565b9350602085013591508082111561279e57600080fd5b50612634858286016126b2565b6020808252825182820181905260009190848201906040850190845b81811015612801576127ee8385518051825260208082015190830152604090810151910152565b92840192606092909201916001016127c7565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261283a57600080fd5b83018035915067ffffffffffffffff82111561285557600080fd5b60200191503681900382131561208657600080fd5b8183823760009101908152919050565b600181811c9082168061288e57607f821691505b6020821081036128ae57634e487b7160e01b600052602260045260246000fd5b50919050565b600082516128c681846020870161257b565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b6000828210156128f8576128f86128d0565b500390565b634e487b7160e01b600052601260045260246000fd5b600082612922576129226128fd565b500490565b6000816000190483118215151615612941576129416128d0565b500290565b600082612955576129556128fd565b500690565b6000821982111561296d5761296d6128d0565b500190565b600081612981576129816128d0565b506000190190565b60006001820161299b5761299b6128d0565b5060010190565b60008235603e198336030181126128c657600080fd5b60208082526026908201527f72656c61795265626173653a204641494c5f53594d424f4c5f4e4f545f415641604082015265494c41424c4560d01b606082015260800190565b600060208284031215612a1057600080fd5b612229826124b1565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612a5181601785016020880161257b565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612a8281602884016020880161257b565b0160280194935050505056fee2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc4a26469706673582212202b92459c65398fbf771381f0efabb6e6ca0018d3dc578e8654445f2ca410a77664736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b181d27f809a6ff4d1860d0bc193ec38c9c97c15
-----Decoded View---------------
Arg [0] : admin (address): 0xB181d27F809a6Ff4D1860D0BC193eC38c9C97c15
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b181d27f809a6ff4d1860d0bc193ec38c9c97c15
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.