Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00Latest 25 from a total of 68,357 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Close Game | 383413639 | 120 days ago | IN | 0 ETH | 0.00000152 | ||||
| Create Game With... | 383413574 | 120 days ago | IN | 0 ETH | 0.00000537 | ||||
| Liquidate Game | 321105649 | 301 days ago | IN | 0 ETH | 0.00000091 | ||||
| Liquidate Game | 321042600 | 301 days ago | IN | 0 ETH | 0.00000073 | ||||
| Liquidate Game | 320994367 | 301 days ago | IN | 0 ETH | 0.00000074 | ||||
| Close Game | 320903571 | 301 days ago | IN | 0 ETH | 0.00000028 | ||||
| Close Game | 320903554 | 301 days ago | IN | 0 ETH | 0.00000062 | ||||
| Close Game | 320903435 | 301 days ago | IN | 0 ETH | 0.00000028 | ||||
| Close Game | 320903417 | 301 days ago | IN | 0 ETH | 0.00000028 | ||||
| Close Game | 320903389 | 301 days ago | IN | 0 ETH | 0.00000062 | ||||
| Liquidate Game | 320900412 | 301 days ago | IN | 0 ETH | 0.00000074 | ||||
| Close Game | 320807807 | 302 days ago | IN | 0 ETH | 0.00000063 | ||||
| Create Game With... | 320807778 | 302 days ago | IN | 0 ETH | 0.00000206 | ||||
| Close Game | 320807167 | 302 days ago | IN | 0 ETH | 0.00000063 | ||||
| Create Game With... | 320807139 | 302 days ago | IN | 0 ETH | 0.00000206 | ||||
| Close Game | 320564712 | 302 days ago | IN | 0 ETH | 0.00000028 | ||||
| Close Game | 320564693 | 302 days ago | IN | 0 ETH | 0.00000062 | ||||
| Close Game | 320564265 | 302 days ago | IN | 0 ETH | 0.00000028 | ||||
| Close Game | 320564246 | 302 days ago | IN | 0 ETH | 0.00000062 | ||||
| Close Game | 320562439 | 302 days ago | IN | 0 ETH | 0.00000029 | ||||
| Close Game | 320562406 | 302 days ago | IN | 0 ETH | 0.00000062 | ||||
| Finalize Game | 320484830 | 303 days ago | IN | 0 ETH | 0.00000524 | ||||
| Finalize Game | 320356824 | 303 days ago | IN | 0 ETH | 0.00000368 | ||||
| Finalize Game | 320302825 | 303 days ago | IN | 0 ETH | 0.00000307 | ||||
| Finalize Game | 320287252 | 303 days ago | IN | 0 ETH | 0.00000284 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
OneVsOneExactPrice
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;
import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";
import {ITreasury} from "./interfaces/ITreasury.sol";
import {IDataStreamsVerifier} from "./interfaces/IDataStreamsVerifier.sol";
contract OneVsOneExactPrice is AccessControl {
event OneVsOneToggle(bool isActive);
event NewRefundFee(uint256 newRefundFee);
event NewGameDuration(uint256 newMaxDuration, uint256 newMinDuration);
event NewFee(uint256 newFee);
event NewTreasury(address newTreasury);
event ExactPriceCreated(
bytes32 gameId,
uint8 feedNumber,
address opponent,
uint32 startTime,
uint32 endTime,
address initiator,
uint256 initiatorPrice,
uint256 depositAmount,
address gameToken
);
event ExactPriceAccepted(
bytes32 gameId,
address opponent,
uint256 opponentPrice
);
event ExactPriceCancelled(bytes32 gameId);
event ExactPriceFinalized(
bytes32 gameId,
uint256 winnerGuessPrice,
uint256 loserGuessPrice,
int192 finalPrice,
Status gameStatus
);
enum Status {
Default,
Created,
Cancelled,
Started,
Finished
}
struct GameInfo {
uint8 feedNumber;
address initiator;
uint256 startTime;
uint256 endTime;
address opponent;
Status gameStatus;
}
struct GameInfoPacked {
uint256 packedData;
uint256 packedData2;
uint256 depositAmount;
uint256 initiatorPrice;
uint256 opponentPrice;
int192 finalPrice;
}
bytes32 public constant GAME_MASTER_ROLE = keccak256("GAME_MASTER_ROLE");
mapping(bytes32 => GameInfoPacked) public games;
address public treasury;
uint256 public fee = 500;
uint256 public refundFee = 1000;
uint256 public minDuration = 280;
uint256 public maxDuration = 4 weeks;
bool public isActive = true;
constructor() {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
}
/**
* Creates 1vs1 exact price mode game and deposit funds
* @param feedNumber token position in array of Chainlink DataStreams feed IDs
* @param opponent address of the opponent
* @param endTime when the game will end
* @param initiatorPrice game initiator picked asset price
* @param depositAmount amount to enter the game
* @param token token for game deposits
*/
function createGame(
uint8 feedNumber,
address opponent,
uint32 endTime,
uint256 initiatorPrice,
uint256 depositAmount,
address token
) public {
require(isActive, "Game is disabled");
require(
IDataStreamsVerifier(ITreasury(treasury).upkeep()).assetId(
feedNumber
) != bytes32(0),
"Wrong feed number"
);
require(opponent != msg.sender, "Wrong opponent");
require(
endTime - block.timestamp >= minDuration,
"Min game duration must be higher"
);
require(
endTime - block.timestamp <= maxDuration,
"Max game duration must be lower"
);
bytes32 gameId = keccak256(
abi.encodePacked(
endTime,
block.timestamp,
msg.sender,
opponent,
address(this)
)
);
ITreasury(treasury).setGameToken(gameId, token);
ITreasury(treasury).depositAndLock(
depositAmount,
msg.sender,
gameId,
false
);
require(games[gameId].packedData == 0, "Game exists");
uint256 packedData = uint(uint160(opponent));
uint256 packedData2 = uint(uint160(msg.sender));
packedData |= uint256(endTime) << 160;
packedData2 |= block.timestamp << 160;
packedData2 |= uint256(Status.Created) << 208;
packedData2 |= uint256(feedNumber) << 216;
games[gameId].initiatorPrice = initiatorPrice;
games[gameId].depositAmount = depositAmount;
games[gameId].packedData = packedData;
games[gameId].packedData2 = packedData2;
emit ExactPriceCreated(
gameId,
feedNumber,
opponent,
uint32(block.timestamp),
endTime,
msg.sender,
initiatorPrice,
depositAmount,
token
);
}
/**
* Creates 1vs1 exact price mode game with deposited funds
* @param feedNumber token position in array of Chainlink DataStreams feed IDs
* @param opponent address of the opponent
* @param endTime when the game will end
* @param initiatorPrice game initiator picked asset price
* @param depositAmount amount to enter the game
* @param token token for game deposits
*/
function createGameWithDeposit(
uint8 feedNumber,
address opponent,
uint32 endTime,
uint256 initiatorPrice,
uint256 depositAmount,
address token
) public {
require(isActive, "Game is disabled");
require(
IDataStreamsVerifier(ITreasury(treasury).upkeep()).assetId(
feedNumber
) != bytes32(0),
"Wrong feed number"
);
require(opponent != msg.sender, "Wrong opponent");
require(
endTime - block.timestamp >= minDuration,
"Min game duration must be higher"
);
require(
endTime - block.timestamp <= maxDuration,
"Max game duration must be lower"
);
bytes32 gameId = keccak256(
abi.encodePacked(
endTime,
block.timestamp,
msg.sender,
opponent,
address(this)
)
);
ITreasury(treasury).setGameToken(gameId, token);
ITreasury(treasury).lock(depositAmount, msg.sender, gameId, false);
require(games[gameId].packedData == 0, "Game exists");
uint256 packedData = uint(uint160(opponent));
uint256 packedData2 = uint(uint160(msg.sender));
packedData |= uint256(endTime) << 160;
packedData2 |= block.timestamp << 160;
packedData2 |= uint256(Status.Created) << 208;
packedData2 |= uint256(feedNumber) << 216;
games[gameId].initiatorPrice = initiatorPrice;
games[gameId].depositAmount = depositAmount;
games[gameId].packedData = packedData;
games[gameId].packedData2 = packedData2;
emit ExactPriceCreated(
gameId,
feedNumber,
opponent,
uint32(block.timestamp),
endTime,
msg.sender,
initiatorPrice,
depositAmount,
token
);
}
/**
* Creates 1vs1 exact price mode game and deposit funds
* @param feedNumber token position in array of Chainlink DataStreams feed IDs
* @param opponent address of the opponent
* @param endTime when the game will end
* @param initiatorPrice game initiator picked asset price
* @param depositAmount amount to enter the game
* @param token token for game deposits
*/
function createGameWithPermit(
uint8 feedNumber,
address opponent,
uint32 endTime,
uint256 initiatorPrice,
uint256 depositAmount,
address token,
ITreasury.PermitData calldata permitData
) public {
require(isActive, "Game is disabled");
require(
IDataStreamsVerifier(ITreasury(treasury).upkeep()).assetId(
feedNumber
) != bytes32(0),
"Wrong feed number"
);
require(opponent != msg.sender, "Wrong opponent");
require(
endTime - block.timestamp >= minDuration,
"Min game duration must be higher"
);
require(
endTime - block.timestamp <= maxDuration,
"Max game duration must be lower"
);
bytes32 gameId = keccak256(
abi.encodePacked(
endTime,
block.timestamp,
msg.sender,
opponent,
address(this)
)
);
ITreasury(treasury).setGameToken(gameId, token);
ITreasury(treasury).depositAndLockWithPermit(
depositAmount,
msg.sender,
gameId,
false,
permitData.deadline,
permitData.v,
permitData.r,
permitData.s
);
require(games[gameId].packedData == 0, "Game exists");
uint256 packedData = uint(uint160(opponent));
uint256 packedData2 = uint(uint160(msg.sender));
packedData |= uint256(endTime) << 160;
packedData2 |= block.timestamp << 160;
packedData2 |= uint256(Status.Created) << 208;
packedData2 |= uint256(feedNumber) << 216;
games[gameId].initiatorPrice = initiatorPrice;
games[gameId].depositAmount = depositAmount;
games[gameId].packedData = packedData;
games[gameId].packedData2 = packedData2;
emit ExactPriceCreated(
gameId,
feedNumber,
opponent,
uint32(block.timestamp),
endTime,
msg.sender,
initiatorPrice,
depositAmount,
token
);
}
/**
* Accepts 1vs1 exact price mode game and deposit funds
* @param gameId game id
* @param opponentPrice picked asset price
*/
function acceptGame(bytes32 gameId, uint256 opponentPrice) public {
GameInfo memory game = decodeData(gameId);
require(game.gameStatus == Status.Created, "Wrong status!");
require(
game.startTime + (game.endTime - game.startTime) / 3 >=
block.timestamp,
"Game is closed for new players"
);
require(
games[gameId].initiatorPrice != opponentPrice,
"Same asset prices"
);
// If game is not private address should be 0
if (game.opponent != address(0)) {
require(
msg.sender == game.opponent,
"Only certain account can accept"
);
} else {
require(msg.sender != game.initiator, "Wrong opponent");
games[gameId].packedData |= uint256(uint160(msg.sender));
}
games[gameId].opponentPrice = opponentPrice;
ITreasury(treasury).depositAndLock(
games[gameId].depositAmount,
msg.sender,
gameId,
false
);
//rewrites status
games[gameId].packedData2 =
(games[gameId].packedData2 & ~(uint256(0xFF) << 208)) |
(uint256(uint8(Status.Started)) << 208);
emit ExactPriceAccepted(gameId, msg.sender, opponentPrice);
}
/**
* Accepts 1vs1 exact price mode game with deposited funds
* @param gameId game id
* @param opponentPrice picked asset price
*/
function acceptGameWithDeposit(
bytes32 gameId,
uint256 opponentPrice
) public {
GameInfo memory game = decodeData(gameId);
require(game.gameStatus == Status.Created, "Wrong status!");
require(
game.startTime + (game.endTime - game.startTime) / 3 >=
block.timestamp,
"Game is closed for new players"
);
require(
games[gameId].initiatorPrice != opponentPrice,
"Same asset prices"
);
// If game is not private address should be 0
if (game.opponent != address(0)) {
require(
msg.sender == game.opponent,
"Only certain account can accept"
);
} else {
require(msg.sender != game.initiator, "Wrong opponent");
games[gameId].packedData |= uint256(uint160(msg.sender));
}
games[gameId].opponentPrice = opponentPrice;
ITreasury(treasury).lock(
games[gameId].depositAmount,
msg.sender,
gameId,
false
);
//rewrites status
games[gameId].packedData2 =
(games[gameId].packedData2 & ~(uint256(0xFF) << 208)) |
(uint256(uint8(Status.Started)) << 208);
emit ExactPriceAccepted(gameId, msg.sender, opponentPrice);
}
/**
* Accepts 1vs1 exact price mode game and deposit funds
* @param gameId game id
* @param opponentPrice picked asset price
*/
function acceptGameWithPermit(
bytes32 gameId,
uint256 opponentPrice,
ITreasury.PermitData calldata permitData
) public {
GameInfo memory game = decodeData(gameId);
require(game.gameStatus == Status.Created, "Wrong status!");
require(
game.startTime + (game.endTime - game.startTime) / 3 >=
block.timestamp,
"Game is closed for new players"
);
require(
games[gameId].initiatorPrice != opponentPrice,
"Same asset prices"
);
// If game is not private address should be 0
if (game.opponent != address(0)) {
require(
msg.sender == game.opponent,
"Only certain account can accept"
);
} else {
require(msg.sender != game.initiator, "Wrong opponent");
games[gameId].packedData |= uint256(uint160(msg.sender));
}
games[gameId].opponentPrice = opponentPrice;
ITreasury(treasury).depositAndLockWithPermit(
games[gameId].depositAmount,
msg.sender,
gameId,
false,
permitData.deadline,
permitData.v,
permitData.r,
permitData.s
);
//rewrites status
games[gameId].packedData2 =
(games[gameId].packedData2 & ~(uint256(0xFF) << 208)) |
(uint256(uint8(Status.Started)) << 208);
emit ExactPriceAccepted(gameId, msg.sender, opponentPrice);
}
/**
* Closes game and refunds tokens
* @param gameId game id
*/
function closeGame(bytes32 gameId) public {
GameInfo memory game = decodeData(gameId);
require(game.initiator == msg.sender, "Wrong sender");
require(
game.gameStatus == Status.Created ||
(
(game.gameStatus == Status.Created ||
game.gameStatus == Status.Started) &&
block.timestamp > game.endTime
? block.timestamp - game.endTime >= 3 days
: false
),
"Wrong status!"
);
if (game.gameStatus == Status.Started) {
ITreasury(treasury).refund(
games[gameId].depositAmount,
game.opponent,
gameId
);
}
ITreasury(treasury).refund(
games[gameId].depositAmount,
game.initiator,
gameId
);
//rewrites status
games[gameId].packedData2 =
(games[gameId].packedData2 & ~(uint256(0xFF) << 208)) |
(uint256(uint8(Status.Cancelled)) << 208);
emit ExactPriceCancelled(gameId);
}
/**
* Allows admin to close old\outdated games
* @param gameId game id
*/
function liquidateGame(bytes32 gameId) public onlyRole(GAME_MASTER_ROLE) {
GameInfo memory game = decodeData(gameId);
require(block.timestamp - game.endTime >= 3 days, "Too early");
require(game.gameStatus == Status.Created, "Wrong status!");
ITreasury(treasury).refundWithFees(
games[gameId].depositAmount,
game.initiator,
refundFee,
gameId
);
//rewrites status
games[gameId].packedData2 =
(games[gameId].packedData2 & ~(uint256(0xFF) << 208)) |
(uint256(uint8(Status.Cancelled)) << 208);
emit ExactPriceCancelled(gameId);
}
/**
* Finalizes 1vs1 exact price mode game and distributes rewards to players
* @param gameId game id
* @param unverifiedReport Chainlink DataStreams report
*/
function finalizeGame(
bytes32 gameId,
bytes memory unverifiedReport
) public onlyRole(GAME_MASTER_ROLE) {
GameInfo memory game = decodeData(gameId);
(int192 finalPrice, uint32 priceTimestamp) = IDataStreamsVerifier(
ITreasury(treasury).upkeep()
).verifyReportWithTimestamp(unverifiedReport, game.feedNumber);
require(game.gameStatus == Status.Started, "Wrong status!");
require(block.timestamp >= game.endTime, "Too early to finish");
require(
priceTimestamp - game.endTime <= 1 minutes,
"Old chainlink report"
);
uint256 diff1 = games[gameId].initiatorPrice > uint192(finalPrice)
? games[gameId].initiatorPrice - uint192(finalPrice)
: uint192(finalPrice) - games[gameId].initiatorPrice;
uint256 diff2 = games[gameId].opponentPrice > uint192(finalPrice)
? games[gameId].opponentPrice - uint192(finalPrice)
: uint192(finalPrice) - games[gameId].opponentPrice;
uint256 finalRate;
if (diff1 != diff2) {
ITreasury(treasury).withdrawGameFee(
games[gameId].depositAmount,
fee,
gameId
);
finalRate = ITreasury(treasury).calculateRate(
games[gameId].depositAmount,
0,
gameId
);
}
if (diff1 < diff2) {
ITreasury(treasury).universalDistribute(
game.initiator,
games[gameId].depositAmount,
gameId,
finalRate
);
ITreasury(treasury).setGameFinished(gameId);
emit ExactPriceFinalized(
gameId,
games[gameId].initiatorPrice,
games[gameId].opponentPrice,
finalPrice,
Status.Finished
);
} else if (diff1 > diff2) {
ITreasury(treasury).universalDistribute(
game.opponent,
games[gameId].depositAmount,
gameId,
finalRate
);
ITreasury(treasury).setGameFinished(gameId);
emit ExactPriceFinalized(
gameId,
games[gameId].opponentPrice,
games[gameId].initiatorPrice,
finalPrice,
Status.Finished
);
} else {
ITreasury(treasury).refund(
games[gameId].depositAmount,
game.initiator,
gameId
);
ITreasury(treasury).refund(
games[gameId].depositAmount,
game.opponent,
gameId
);
emit ExactPriceCancelled(gameId);
}
//rewrites status
games[gameId].packedData2 =
(games[gameId].packedData2 & ~(uint256(0xFF) << 208)) |
(uint256(uint8(Status.Finished)) << 208);
games[gameId].finalPrice = finalPrice;
}
/**
* Returns decoded game data
* @param gameId game id
*/
function decodeData(
bytes32 gameId
) public view returns (GameInfo memory gameData) {
uint256 packedData = games[gameId].packedData;
uint256 packedData2 = games[gameId].packedData2;
gameData.opponent = address(uint160(packedData));
gameData.endTime = uint256(uint32(packedData >> 160));
gameData.initiator = address(uint160(packedData2));
gameData.startTime = uint256(uint32(packedData2 >> 160));
gameData.gameStatus = Status(uint8(packedData2 >> 208));
gameData.feedNumber = uint8(packedData2 >> 216);
}
/**
* Changes min and max game limits
* @param newMaxDuration new max game duration
* @param newMinDuration new min game duration
*/
function changeGameDuration(
uint256 newMaxDuration,
uint256 newMinDuration
) public onlyRole(DEFAULT_ADMIN_ROLE) {
minDuration = newMinDuration;
maxDuration = newMaxDuration;
emit NewGameDuration(newMaxDuration, newMinDuration);
}
/**
* Change treasury address
* @param newTreasury new treasury address
*/
function setTreasury(
address newTreasury
) public onlyRole(DEFAULT_ADMIN_ROLE) {
require(newTreasury != address(0), "Zero address");
treasury = newTreasury;
emit NewTreasury(newTreasury);
}
/**
* Change fee
* @param newFee new fee in bp
*/
function setFee(uint256 newFee) public onlyRole(DEFAULT_ADMIN_ROLE) {
require(newFee <= 3000, "Fee exceeds the cap");
fee = newFee;
emit NewFee(newFee);
}
/**
* Change refund fee
* @param newRefundFee new fee in bp
*/
function setRefundFee(
uint256 newRefundFee
) public onlyRole(DEFAULT_ADMIN_ROLE) {
require(newRefundFee <= 3000, "Fee exceeds the cap");
refundFee = newRefundFee;
emit NewRefundFee(newRefundFee);
}
/**
* Turns game on/off
*/
function toggleActive() public onlyRole(DEFAULT_ADMIN_ROLE) {
isActive = !isActive;
emit OneVsOneToggle(isActive);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)
pragma solidity ^0.8.20;
import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {ERC165} from "../utils/introspection/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:
*
* ```solidity
* 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}:
*
* ```solidity
* 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. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with an {AccessControlUnauthorizedAccount} error including the required role.
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @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 returns (bool) {
return _roles[role].hasRole[account];
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
* is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
* is missing `role`.
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
/**
* @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 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.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual 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.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual 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 `callerConfirmation`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
/**
* @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 Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
/**
* @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)
pragma solidity ^0.8.20;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev The `account` is missing a role.
*/
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
/**
* @dev The caller of a function is not the expected one.
*
* NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
*/
error AccessControlBadConfirmation();
/**
* @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.
*/
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 `callerConfirmation`.
*/
function renounceRole(bytes32 role, address callerConfirmation) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./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);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @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);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
interface IDataStreamsVerifier {
function lastRetrievedPrice() external view returns (int192);
function getPrice() external view returns (int192);
function verifyReportWithTimestamp(
bytes memory unverifiedReport,
uint8 feedNumber
) external returns (int192, uint32);
function assetId(uint8 index) external view returns (bytes32);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
interface ITreasury {
struct PermitData {
uint256 deadline;
uint8 v;
bytes32 r;
bytes32 s;
}
function DISTRIBUTOR_ROLE() external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function lockedRakeback(
bytes32 gameId,
address player,
uint256 depositId
) external returns (uint256);
function depositAndLock(
uint256 amount,
address from,
bytes32 gameId,
uint256 depositId
) external returns (uint256);
function depositAndLock(
uint256 amount,
address from,
bytes32 gameId,
bool isRakeback
) external returns (uint256 rakeback);
function depositAndLockWithPermit(
uint256 amount,
address from,
bytes32 gameId,
uint256 depositId,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 rakeback);
function depositAndLockWithPermit(
uint256 amount,
address from,
bytes32 gameId,
bool isRakeback,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 rakeback);
function lock(
uint256 amount,
address from,
uint256 depositId,
bytes32 gameId
) external returns (uint256 rakeback);
function lock(
uint256 amount,
address from,
bytes32 gameId,
bool isRakeback
) external returns (uint256 rakeback);
function upkeep() external view returns (address);
function bullseyeResetLockedAmount(bytes32 gameId) external;
function distributeBullseye(
uint256 rate,
uint256 lostTeamRakeback,
address to,
bytes32 gameId,
uint256 depositId
) external;
function approvedTokens(address token) external returns (bool);
function refund(uint256 amount, address to, bytes32 gameId) external;
function refund(
uint256 amount,
address to,
bytes32 gameId,
uint256 depositId
) external;
function refundWithFees(
uint256 amount,
address to,
uint256 refundFee,
bytes32 gameId
) external;
function refundWithFees(
uint256 amount,
address to,
uint256 refundFee,
bytes32 gameId,
uint256 depositId
) external;
function universalDistribute(
address to,
uint256 initialDeposit,
bytes32 gameId,
uint256 rate
) external;
function withdrawGameFee(
uint256 lostTeamDeposits,
uint256 gameFee,
bytes32 gameId
) external returns (uint256 withdrawnFees);
function calculateRate(
uint256 wonTeamTotal,
uint256 lostTeamRakeback,
bytes32 gameId
) external returns (uint256);
function withdrawInitiatorFee(
uint256 lostTeamDeposits,
uint256 wonTeamDeposits,
uint256 initiatorFee,
address initiator,
bytes32 gameId
) external returns (uint256 withdrawnFees);
function calculateRakebackAmount(
address target,
uint256 initialDeposit
) external;
function setGameFinished(bytes32 gameId) external;
function withdrawRakebackSetup(bytes32 gameId, address target) external;
function setGameToken(bytes32 gameId, address token) external;
function minDepositAmount(address token) external returns (uint256 amount);
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"gameId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"opponent","type":"address"},{"indexed":false,"internalType":"uint256","name":"opponentPrice","type":"uint256"}],"name":"ExactPriceAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"gameId","type":"bytes32"}],"name":"ExactPriceCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"gameId","type":"bytes32"},{"indexed":false,"internalType":"uint8","name":"feedNumber","type":"uint8"},{"indexed":false,"internalType":"address","name":"opponent","type":"address"},{"indexed":false,"internalType":"uint32","name":"startTime","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"endTime","type":"uint32"},{"indexed":false,"internalType":"address","name":"initiator","type":"address"},{"indexed":false,"internalType":"uint256","name":"initiatorPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"gameToken","type":"address"}],"name":"ExactPriceCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"gameId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"winnerGuessPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loserGuessPrice","type":"uint256"},{"indexed":false,"internalType":"int192","name":"finalPrice","type":"int192"},{"indexed":false,"internalType":"enum OneVsOneExactPrice.Status","name":"gameStatus","type":"uint8"}],"name":"ExactPriceFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"NewFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMinDuration","type":"uint256"}],"name":"NewGameDuration","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRefundFee","type":"uint256"}],"name":"NewRefundFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newTreasury","type":"address"}],"name":"NewTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"OneVsOneToggle","type":"event"},{"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":"GAME_MASTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"gameId","type":"bytes32"},{"internalType":"uint256","name":"opponentPrice","type":"uint256"}],"name":"acceptGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"gameId","type":"bytes32"},{"internalType":"uint256","name":"opponentPrice","type":"uint256"}],"name":"acceptGameWithDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"gameId","type":"bytes32"},{"internalType":"uint256","name":"opponentPrice","type":"uint256"},{"components":[{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ITreasury.PermitData","name":"permitData","type":"tuple"}],"name":"acceptGameWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxDuration","type":"uint256"},{"internalType":"uint256","name":"newMinDuration","type":"uint256"}],"name":"changeGameDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"gameId","type":"bytes32"}],"name":"closeGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"feedNumber","type":"uint8"},{"internalType":"address","name":"opponent","type":"address"},{"internalType":"uint32","name":"endTime","type":"uint32"},{"internalType":"uint256","name":"initiatorPrice","type":"uint256"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"createGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"feedNumber","type":"uint8"},{"internalType":"address","name":"opponent","type":"address"},{"internalType":"uint32","name":"endTime","type":"uint32"},{"internalType":"uint256","name":"initiatorPrice","type":"uint256"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"createGameWithDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"feedNumber","type":"uint8"},{"internalType":"address","name":"opponent","type":"address"},{"internalType":"uint32","name":"endTime","type":"uint32"},{"internalType":"uint256","name":"initiatorPrice","type":"uint256"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ITreasury.PermitData","name":"permitData","type":"tuple"}],"name":"createGameWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"gameId","type":"bytes32"}],"name":"decodeData","outputs":[{"components":[{"internalType":"uint8","name":"feedNumber","type":"uint8"},{"internalType":"address","name":"initiator","type":"address"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"address","name":"opponent","type":"address"},{"internalType":"enum OneVsOneExactPrice.Status","name":"gameStatus","type":"uint8"}],"internalType":"struct OneVsOneExactPrice.GameInfo","name":"gameData","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"gameId","type":"bytes32"},{"internalType":"bytes","name":"unverifiedReport","type":"bytes"}],"name":"finalizeGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"games","outputs":[{"internalType":"uint256","name":"packedData","type":"uint256"},{"internalType":"uint256","name":"packedData2","type":"uint256"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"initiatorPrice","type":"uint256"},{"internalType":"uint256","name":"opponentPrice","type":"uint256"},{"internalType":"int192","name":"finalPrice","type":"int192"}],"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":"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":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"gameId","type":"bytes32"}],"name":"liquidateGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","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":"uint256","name":"newFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRefundFee","type":"uint256"}],"name":"setRefundFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasury","type":"address"}],"name":"setTreasury","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":[],"name":"toggleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040526101f46003556103e86004556101186005556224ea006006556007805460ff191660011790553480156200003757600080fd5b50620000456000336200004c565b50620000fb565b6000828152602081815260408083206001600160a01b038516845290915281205460ff16620000f1576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055620000a83390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001620000f5565b5060005b92915050565b612ed6806200010b6000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80637ffc32a311610104578063cadbe9ff116100a2578063ea8d53ef11610071578063ea8d53ef146103f7578063f0f442601461040a578063f579f8821461041d578063f6ccb8261461049457600080fd5b8063cadbe9ff146103b5578063d547741f146103c8578063ddca3f43146103db578063e1c44400146103e457600080fd5b8063a217fddf116100de578063a217fddf14610360578063ad1def1e14610368578063b5f8d63c1461038f578063c53535e5146103a257600080fd5b80637ffc32a31461032457806390fe6ddb1461034457806391d148541461034d57600080fd5b8063567157611161017c5780636db5c8fd1161014b5780636db5c8fd146102e25780637381a465146102eb57806378127040146102fe57806379debe591461031157600080fd5b8063567157611461028857806357a489f91461029157806361d027b3146102a457806369fe0e2d146102cf57600080fd5b806329c68dc1116101b857806329c68dc1146102455780632f2ff15d1461024f57806336568abe1461026257806336fd711e1461027557600080fd5b806301ffc9a7146101df57806322f3e2d414610207578063248a9ca314610214575b600080fd5b6101f26101ed3660046126c0565b6104a7565b60405190151581526020015b60405180910390f35b6007546101f29060ff1681565b6102376102223660046126f1565b60009081526020819052604090206001015490565b6040519081526020016101fe565b61024d6104de565b005b61024d61025d36600461271f565b610537565b61024d61027036600461271f565b610562565b61024d6102833660046126f1565b61059a565b61023760055481565b61024d61029f36600461274f565b61062f565b6002546102b7906001600160a01b031681565b6040516001600160a01b0390911681526020016101fe565b61024d6102dd3660046126f1565b610873565b61023760065481565b61024d6102f9366004612789565b6108fb565b61024d61030c36600461274f565b610b68565b61024d61031f3660046127e7565b610d05565b6103376103323660046126f1565b6110ba565b6040516101fe919061288d565b61023760045481565b6101f261035b36600461271f565b611193565b610237600081565b6102377f1d93c87416ca7b54f0fb8323167b72760e8e2ec93d48660953897a150f97a8b481565b61024d61039d3660046127e7565b6111bc565b61024d6103b03660046126f1565b61142f565b61024d6103c3366004612901565b6115e2565b61024d6103d636600461271f565b611e17565b61023760035481565b61024d6103f23660046129bc565b611e3c565b61024d61040536600461274f565b612212565b61024d610418366004612a3c565b61225d565b61046461042b3660046126f1565b60016020819052600091825260409091208054918101546002820154600383015460048401546005909401549293919290919060170b86565b604080519687526020870195909552938501929092526060840152608083015260170b60a082015260c0016101fe565b61024d6104a23660046126f1565b6122fb565b60006001600160e01b03198216637965db0b60e01b14806104d857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006104e981612579565b6007805460ff8082161560ff1990921682179092556040519116151581527fb5e7f4f761942052db060859ee0965bbd1fd209fb73b7b201b11506b28bd2cd09060200160405180910390a150565b60008281526020819052604090206001015461055281612579565b61055c8383612586565b50505050565b6001600160a01b038116331461058b5760405163334bd91960e11b815260040160405180910390fd5b6105958282612618565b505050565b60006105a581612579565b610bb88211156105f25760405162461bcd60e51b815260206004820152601360248201527204665652065786365656473207468652063617606c1b60448201526064015b60405180910390fd5b60048290556040518281527ff355ec35fd925c464b65f29060888d79e9e9599fa614c0bb209e8b6fc812bfa7906020015b60405180910390a15050565b600061063a836110ba565b905060018160a00151600481111561065457610654612855565b146106715760405162461bcd60e51b81526004016105e990612a59565b426003826040015183606001516106889190612a96565b6106929190612aa9565b82604001516106a19190612acb565b10156106bf5760405162461bcd60e51b81526004016105e990612ade565b6000838152600160205260409020600301548290036106f05760405162461bcd60e51b81526004016105e990612b15565b60808101516001600160a01b03161561073d5780608001516001600160a01b0316336001600160a01b0316146107385760405162461bcd60e51b81526004016105e990612b40565b61077e565b60208101516001600160a01b031633036107695760405162461bcd60e51b81526004016105e990612b77565b60008381526001602052604090208054331790555b600083815260016020526040808220600480820186905560028054920154925163c4e2f86560e01b81526001600160a01b039092169363c4e2f865936107cc93909233928a92909101612b9f565b6020604051808303816000875af11580156107eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080f9190612bc5565b5060008381526001602081905260409182902001805460ff60d01b1916600360d01b179055517f1a94cf8518791e755fc1acdb85a1fe1ddf6178fed2ab170714fc05d2eef7f1ec9061086690859033908690612bde565b60405180910390a1505050565b600061087e81612579565b610bb88211156108c65760405162461bcd60e51b815260206004820152601360248201527204665652065786365656473207468652063617606c1b60448201526064016105e9565b60038290556040518281527f63fe946ed58429ac3c5e64d4356ff92c26d7fa1e73586515df8ba9f059ab54a590602001610623565b6000610906846110ba565b905060018160a00151600481111561092057610920612855565b1461093d5760405162461bcd60e51b81526004016105e990612a59565b426003826040015183606001516109549190612a96565b61095e9190612aa9565b826040015161096d9190612acb565b101561098b5760405162461bcd60e51b81526004016105e990612ade565b6000848152600160205260409020600301548390036109bc5760405162461bcd60e51b81526004016105e990612b15565b60808101516001600160a01b031615610a095780608001516001600160a01b0316336001600160a01b031614610a045760405162461bcd60e51b81526004016105e990612b40565b610a4a565b60208101516001600160a01b03163303610a355760405162461bcd60e51b81526004016105e990612b77565b60008481526001602052604090208054331790555b600084815260016020908152604080832060048101879055600280549101546001600160a01b0390911693636affb29a93919233928a9291893591610a93918b01908b01612bfd565b89604001358a606001356040518963ffffffff1660e01b8152600401610ac0989796959493929190612c18565b6020604051808303816000875af1158015610adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b039190612bc5565b5060008481526001602081905260409182902001805460ff60d01b1916600360d01b179055517f1a94cf8518791e755fc1acdb85a1fe1ddf6178fed2ab170714fc05d2eef7f1ec90610b5a90869033908790612bde565b60405180910390a150505050565b6000610b73836110ba565b905060018160a001516004811115610b8d57610b8d612855565b14610baa5760405162461bcd60e51b81526004016105e990612a59565b42600382604001518360600151610bc19190612a96565b610bcb9190612aa9565b8260400151610bda9190612acb565b1015610bf85760405162461bcd60e51b81526004016105e990612ade565b600083815260016020526040902060030154829003610c295760405162461bcd60e51b81526004016105e990612b15565b60808101516001600160a01b031615610c765780608001516001600160a01b0316336001600160a01b031614610c715760405162461bcd60e51b81526004016105e990612b40565b610cb7565b60208101516001600160a01b03163303610ca25760405162461bcd60e51b81526004016105e990612b77565b60008381526001602052604090208054331790555b6000838152600160205260408082206004808201869055600280549201549251632407471360e11b81526001600160a01b039092169363480e8e26936107cc93909233928a92909101612b9f565b60075460ff16610d275760405162461bcd60e51b81526004016105e990612c5a565b6002546040805163167a382560e11b815290516000926001600160a01b031691632cf4704a9160048083019260209291908290030181865afa158015610d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d959190612c84565b60405163ae82b5c960e01b815260ff891660048201526001600160a01b03919091169063ae82b5c990602401602060405180830381865afa158015610dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e029190612bc5565b03610e1f5760405162461bcd60e51b81526004016105e990612ca1565b336001600160a01b03861603610e475760405162461bcd60e51b81526004016105e990612b77565b600554610e5a4263ffffffff8716612a96565b1015610e785760405162461bcd60e51b81526004016105e990612ccc565b600654610e8b4263ffffffff8716612a96565b1115610ea95760405162461bcd60e51b81526004016105e990612d01565b60008442338830604051602001610ec4959493929190612d38565b60408051808303601f1901815290829052805160209091012060025463039279d760e61b8352600483018290526001600160a01b038581166024850152919350169063e49e75c090604401600060405180830381600087803b158015610f2957600080fd5b505af1158015610f3d573d6000803e3d6000fd5b5050600254604051632407471360e11b81526001600160a01b03909116925063480e8e269150610f7890869033908690600090600401612b9f565b6020604051808303816000875af1158015610f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbb9190612bc5565b50600081815260016020526040902054156110065760405162461bcd60e51b815260206004820152600b60248201526a47616d652065786973747360a81b60448201526064016105e9565b60008181526001602081905260409182902060038101879055600281018690556001600160a01b03891660a089811b63ffffffff60a01b169190911780835560ff60d81b60d88d901b1633429384901b811791909117600160d01b1793909401839055935191927fc43ac96bd8c2538554ad97ca56225ef030913f833f06564d7cdb86032cd4cd6c926110a79287928e928e92918e918e908e908e90612d86565b60405180910390a1505050505050505050565b6110f06040805160c08101825260008082526020820181905291810182905260608101829052608081018290529060a082015290565b60008281526001602081815260409283902080549201546001600160a01b03808416608087015263ffffffff60a085811c821660608901529183169387019390935281901c909116928401929092529060ff60d082901c16600481111561115957611159612855565b8360a00190600481111561116f5761116f612855565b9081600481111561118257611182612855565b90525060d81c60ff16825250919050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60075460ff166111de5760405162461bcd60e51b81526004016105e990612c5a565b6002546040805163167a382560e11b815290516000926001600160a01b031691632cf4704a9160048083019260209291908290030181865afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190612c84565b60405163ae82b5c960e01b815260ff891660048201526001600160a01b03919091169063ae82b5c990602401602060405180830381865afa158015611295573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b99190612bc5565b036112d65760405162461bcd60e51b81526004016105e990612ca1565b336001600160a01b038616036112fe5760405162461bcd60e51b81526004016105e990612b77565b6005546113114263ffffffff8716612a96565b101561132f5760405162461bcd60e51b81526004016105e990612ccc565b6006546113424263ffffffff8716612a96565b11156113605760405162461bcd60e51b81526004016105e990612d01565b6000844233883060405160200161137b959493929190612d38565b60408051808303601f1901815290829052805160209091012060025463039279d760e61b8352600483018290526001600160a01b038581166024850152919350169063e49e75c090604401600060405180830381600087803b1580156113e057600080fd5b505af11580156113f4573d6000803e3d6000fd5b505060025460405163c4e2f86560e01b81526001600160a01b03909116925063c4e2f8659150610f7890869033908690600090600401612b9f565b7f1d93c87416ca7b54f0fb8323167b72760e8e2ec93d48660953897a150f97a8b461145981612579565b6000611464836110ba565b90506203f48081606001514261147a9190612a96565b10156114b45760405162461bcd60e51b8152602060048201526009602482015268546f6f206561726c7960b81b60448201526064016105e9565b60018160a0015160048111156114cc576114cc612855565b146114e95760405162461bcd60e51b81526004016105e990612a59565b600280546000858152600160209081526040918290209093015492840151600480549251637a879fa960e11b8152908101949094526001600160a01b039081166024850152604484019190915260648301869052169063f50f3f5290608401600060405180830381600087803b15801561156257600080fd5b505af1158015611576573d6000803e3d6000fd5b5060d09250600291506115869050565b60008581526001602081905260409182902001805460ff60d01b191660ff9390931690931b91909117909155517f4508d504920b09c87708d104ad40433e6e7f6104005b44c0ebf4231f9c19ce33906108669085815260200190565b7f1d93c87416ca7b54f0fb8323167b72760e8e2ec93d48660953897a150f97a8b461160c81612579565b6000611617846110ba565b9050600080600260009054906101000a90046001600160a01b03166001600160a01b0316632cf4704a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561166f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116939190612c84565b835160405163d369dc6160e01b81526001600160a01b03929092169163d369dc61916116c491899190600401612ddc565b60408051808303816000875af11580156116e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117069190612e34565b909250905060038360a00151600481111561172357611723612855565b146117405760405162461bcd60e51b81526004016105e990612a59565b826060015142101561178a5760405162461bcd60e51b81526020600482015260136024820152720a8dede40cac2e4d8f240e8de40ccd2dcd2e6d606b1b60448201526064016105e9565b603c83606001518263ffffffff166117a29190612a96565b11156117e75760405162461bcd60e51b815260206004820152601460248201527313db190818da185a5b9b1a5b9ac81c995c1bdc9d60621b60448201526064016105e9565b6000868152600160205260408120600301546001600160c01b038416106118325760008781526001602052604090206003015461182d906001600160c01b038516612a96565b611858565b600087815260016020526040902060030154611858906001600160c01b03851690612a96565b600088815260016020526040812060040154919250906001600160c01b038516106118a7576000888152600160205260409020600401546118a2906001600160c01b038616612a96565b6118cd565b6000888152600160205260409020600401546118cd906001600160c01b03861690612a96565b905060008183146119fd576002805460008b81526001602052604090819020909201546003549251637b85343760e11b815260048101919091526024810192909252604482018b90526001600160a01b03169063f70a686e906064016020604051808303816000875af1158015611948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196c9190612bc5565b506002805460008b8152600160205260408082209093015492516328ac5cf760e21b815260048101939093526024830152604482018b90526001600160a01b03169063a2b173dc906064016020604051808303816000875af11580156119d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fa9190612bc5565b90505b81831015611b4d576002805460208881015160008d815260019092526040918290209093015490516388cc22ff60e01b81526001600160a01b0393841660048201526024810191909152604481018c9052606481018490529116906388cc22ff90608401600060405180830381600087803b158015611a7b57600080fd5b505af1158015611a8f573d6000803e3d6000fd5b5050600254604051634f0644ef60e01b8152600481018d90526001600160a01b039091169250634f0644ef9150602401600060405180830381600087803b158015611ad957600080fd5b505af1158015611aed573d6000803e3d6000fd5b50505060008a81526001602052604090819020600381015460049182015492517f5458161d50452bd42d3465eca8bb2dbe3fe9d9f4a54c99ec2f3e063029f2a52e9450611b40938e9390918b9190612e69565b60405180910390a1611dc4565b81831115611c905760028054608088015160008c815260016020526040908190209093015492516388cc22ff60e01b81526001600160a01b0391821660048201526024810193909352604483018c90526064830184905216906388cc22ff90608401600060405180830381600087803b158015611bc957600080fd5b505af1158015611bdd573d6000803e3d6000fd5b5050600254604051634f0644ef60e01b8152600481018d90526001600160a01b039091169250634f0644ef9150602401600060405180830381600087803b158015611c2757600080fd5b505af1158015611c3b573d6000803e3d6000fd5b50505060008a8152600160205260409081902060048082015460039092015492517f5458161d50452bd42d3465eca8bb2dbe3fe9d9f4a54c99ec2f3e063029f2a52e9450611b40938e939290918b9190612e69565b6002805460008b81526001602090815260409182902090930154928901519051630506a2ab60e11b81526001600160a01b0390921692630a0d455692611cdb92908e90600401612bde565b600060405180830381600087803b158015611cf557600080fd5b505af1158015611d09573d6000803e3d6000fd5b50506002805460008d815260016020526040908190209092015460808b01519251630506a2ab60e11b81526001600160a01b039092169450630a0d45569350611d589290918e90600401612bde565b600060405180830381600087803b158015611d7257600080fd5b505af1158015611d86573d6000803e3d6000fd5b505050507f4508d504920b09c87708d104ad40433e6e7f6104005b44c0ebf4231f9c19ce3389604051611dbb91815260200190565b60405180910390a15b505050600095865250600160208190526040909520948501805460ff60d01b1916600160d21b179055600590940180546001600160c01b039095166001600160c01b031990951694909417909355505050565b600082815260208190526040902060010154611e3281612579565b61055c8383612618565b60075460ff16611e5e5760405162461bcd60e51b81526004016105e990612c5a565b6002546040805163167a382560e11b815290516000926001600160a01b031691632cf4704a9160048083019260209291908290030181865afa158015611ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecc9190612c84565b60405163ae82b5c960e01b815260ff8a1660048201526001600160a01b03919091169063ae82b5c990602401602060405180830381865afa158015611f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f399190612bc5565b03611f565760405162461bcd60e51b81526004016105e990612ca1565b336001600160a01b03871603611f7e5760405162461bcd60e51b81526004016105e990612b77565b600554611f914263ffffffff8816612a96565b1015611faf5760405162461bcd60e51b81526004016105e990612ccc565b600654611fc24263ffffffff8816612a96565b1115611fe05760405162461bcd60e51b81526004016105e990612d01565b60008542338930604051602001611ffb959493929190612d38565b60408051808303601f1901815290829052805160209091012060025463039279d760e61b8352600483018290526001600160a01b038681166024850152919350169063e49e75c090604401600060405180830381600087803b15801561206057600080fd5b505af1158015612074573d6000803e3d6000fd5b50506002546001600160a01b03169150636affb29a9050853384600087356120a260408a0160208b01612bfd565b89604001358a606001356040518963ffffffff1660e01b81526004016120cf989796959493929190612c18565b6020604051808303816000875af11580156120ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121129190612bc5565b506000818152600160205260409020541561215d5760405162461bcd60e51b815260206004820152600b60248201526a47616d652065786973747360a81b60448201526064016105e9565b60008181526001602081905260409182902060038101889055600281018790556001600160a01b038a1660a08a811b63ffffffff60a01b169190911780835560ff60d81b60d88e901b1633429384901b811791909117600160d01b1793909401839055935191927fc43ac96bd8c2538554ad97ca56225ef030913f833f06564d7cdb86032cd4cd6c926121fe9287928f928f92918f918f908f908f90612d86565b60405180910390a150505050505050505050565b600061221d81612579565b6005829055600683905560408051848152602081018490527f6364394a13bc49d5861844b147dd49cd6ccc577f67a1990102d62796b29dc7c99101610866565b600061226881612579565b6001600160a01b0382166122ad5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b60448201526064016105e9565b600280546001600160a01b0319166001600160a01b0384169081179091556040519081527fafa147634b29e2c7bd53ce194256b9f41cfb9ba3036f2b822fdd1d965beea08690602001610623565b6000612306826110ba565b60208101519091506001600160a01b031633146123545760405162461bcd60e51b815260206004820152600c60248201526b2bb937b7339039b2b73232b960a11b60448201526064016105e9565b60018160a00151600481111561236c5761236c612855565b14806123dd575060018160a00151600481111561238b5761238b612855565b14806123ac575060038160a0015160048111156123aa576123aa612855565b145b80156123bb5750806060015142115b6123c65760006123dd565b6203f4808160600151426123da9190612a96565b10155b6123f95760405162461bcd60e51b81526004016105e990612a59565b60038160a00151600481111561241157612411612855565b036124945760028054600084815260016020526040908190209092015460808401519251630506a2ab60e11b81526001600160a01b0390921692630a0d4556926124619291908790600401612bde565b600060405180830381600087803b15801561247b57600080fd5b505af115801561248f573d6000803e3d6000fd5b505050505b6002805460008481526001602090815260409182902090930154928401519051630506a2ab60e11b81526001600160a01b0390921692630a0d4556926124df92908790600401612bde565b600060405180830381600087803b1580156124f957600080fd5b505af115801561250d573d6000803e3d6000fd5b5060d092506002915061251d9050565b60008481526001602081905260409182902001805460ff60d01b191660ff9390931690931b91909117909155517f4508d504920b09c87708d104ad40433e6e7f6104005b44c0ebf4231f9c19ce33906106239084815260200190565b6125838133612683565b50565b60006125928383611193565b612610576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556125c83390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016104d8565b5060006104d8565b60006126248383611193565b15612610576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016104d8565b61268d8282611193565b6126bc5760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016105e9565b5050565b6000602082840312156126d257600080fd5b81356001600160e01b0319811681146126ea57600080fd5b9392505050565b60006020828403121561270357600080fd5b5035919050565b6001600160a01b038116811461258357600080fd5b6000806040838503121561273257600080fd5b8235915060208301356127448161270a565b809150509250929050565b6000806040838503121561276257600080fd5b50508035926020909101359150565b60006080828403121561278357600080fd5b50919050565b600080600060c0848603121561279e57600080fd5b83359250602084013591506127b68560408601612771565b90509250925092565b803560ff811681146127d057600080fd5b919050565b63ffffffff8116811461258357600080fd5b60008060008060008060c0878903121561280057600080fd5b612809876127bf565b955060208701356128198161270a565b94506040870135612829816127d5565b9350606087013592506080870135915060a08701356128478161270a565b809150509295509295509295565b634e487b7160e01b600052602160045260246000fd5b6005811061288957634e487b7160e01b600052602160045260246000fd5b9052565b600060c08201905060ff8351168252602083015160018060a01b0380821660208501526040850151604085015260608501516060850152806080860151166080850152505060a08301516128e460a084018261286b565b5092915050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561291457600080fd5b82359150602083013567ffffffffffffffff8082111561293357600080fd5b818501915085601f83011261294757600080fd5b813581811115612959576129596128eb565b604051601f8201601f19908116603f01168101908382118183101715612981576129816128eb565b8160405282815288602084870101111561299a57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000806000806000806000610140888a0312156129d857600080fd5b6129e1886127bf565b965060208801356129f18161270a565b95506040880135612a01816127d5565b9450606088013593506080880135925060a0880135612a1f8161270a565b9150612a2e8960c08a01612771565b905092959891949750929550565b600060208284031215612a4e57600080fd5b81356126ea8161270a565b6020808252600d908201526c57726f6e67207374617475732160981b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156104d8576104d8612a80565b600082612ac657634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156104d8576104d8612a80565b6020808252601e908201527f47616d6520697320636c6f73656420666f72206e657720706c61796572730000604082015260600190565b60208082526011908201527053616d652061737365742070726963657360781b604082015260600190565b6020808252601f908201527f4f6e6c79206365727461696e206163636f756e742063616e2061636365707400604082015260600190565b6020808252600e908201526d15dc9bdb99c81bdc1c1bdb995b9d60921b604082015260600190565b9384526001600160a01b0392909216602084015260408301521515606082015260800190565b600060208284031215612bd757600080fd5b5051919050565b9283526001600160a01b03919091166020830152604082015260600190565b600060208284031215612c0f57600080fd5b6126ea826127bf565b9788526001600160a01b0396909616602088015260408701949094529115156060860152608085015260ff1660a084015260c083015260e08201526101000190565b60208082526010908201526f11d85b59481a5cc8191a5cd8589b195960821b604082015260600190565b600060208284031215612c9657600080fd5b81516126ea8161270a565b6020808252601190820152702bb937b733903332b2b210373ab6b132b960791b604082015260600190565b6020808252818101527f4d696e2067616d65206475726174696f6e206d75737420626520686967686572604082015260600190565b6020808252601f908201527f4d61782067616d65206475726174696f6e206d757374206265206c6f77657200604082015260600190565b60e09590951b6001600160e01b03191685526004850193909352606091821b6bffffffffffffffffffffffff19908116602486015290821b8116603885015291811b909116604c8301520190565b98895260ff9790971660208901526001600160a01b03958616604089015263ffffffff9485166060890152929093166080870152831660a086015260c085019190915260e0840152166101008201526101200190565b604081526000835180604084015260005b81811015612e0a5760208187018101516060868401015201612ded565b506000606082850101526060601f19601f83011684010191505060ff831660208301529392505050565b60008060408385031215612e4757600080fd5b82518060170b8114612e5857600080fd5b6020840151909250612744816127d5565b600060a0820190508682528560208301528460408301528360170b6060830152612e96608083018461286b565b969550505050505056fea26469706673582212205c3ab46f3395fb0c3616d898d8101a94fcb40f45de355cc9eb48302a0059c23564736f6c63430008180033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80637ffc32a311610104578063cadbe9ff116100a2578063ea8d53ef11610071578063ea8d53ef146103f7578063f0f442601461040a578063f579f8821461041d578063f6ccb8261461049457600080fd5b8063cadbe9ff146103b5578063d547741f146103c8578063ddca3f43146103db578063e1c44400146103e457600080fd5b8063a217fddf116100de578063a217fddf14610360578063ad1def1e14610368578063b5f8d63c1461038f578063c53535e5146103a257600080fd5b80637ffc32a31461032457806390fe6ddb1461034457806391d148541461034d57600080fd5b8063567157611161017c5780636db5c8fd1161014b5780636db5c8fd146102e25780637381a465146102eb57806378127040146102fe57806379debe591461031157600080fd5b8063567157611461028857806357a489f91461029157806361d027b3146102a457806369fe0e2d146102cf57600080fd5b806329c68dc1116101b857806329c68dc1146102455780632f2ff15d1461024f57806336568abe1461026257806336fd711e1461027557600080fd5b806301ffc9a7146101df57806322f3e2d414610207578063248a9ca314610214575b600080fd5b6101f26101ed3660046126c0565b6104a7565b60405190151581526020015b60405180910390f35b6007546101f29060ff1681565b6102376102223660046126f1565b60009081526020819052604090206001015490565b6040519081526020016101fe565b61024d6104de565b005b61024d61025d36600461271f565b610537565b61024d61027036600461271f565b610562565b61024d6102833660046126f1565b61059a565b61023760055481565b61024d61029f36600461274f565b61062f565b6002546102b7906001600160a01b031681565b6040516001600160a01b0390911681526020016101fe565b61024d6102dd3660046126f1565b610873565b61023760065481565b61024d6102f9366004612789565b6108fb565b61024d61030c36600461274f565b610b68565b61024d61031f3660046127e7565b610d05565b6103376103323660046126f1565b6110ba565b6040516101fe919061288d565b61023760045481565b6101f261035b36600461271f565b611193565b610237600081565b6102377f1d93c87416ca7b54f0fb8323167b72760e8e2ec93d48660953897a150f97a8b481565b61024d61039d3660046127e7565b6111bc565b61024d6103b03660046126f1565b61142f565b61024d6103c3366004612901565b6115e2565b61024d6103d636600461271f565b611e17565b61023760035481565b61024d6103f23660046129bc565b611e3c565b61024d61040536600461274f565b612212565b61024d610418366004612a3c565b61225d565b61046461042b3660046126f1565b60016020819052600091825260409091208054918101546002820154600383015460048401546005909401549293919290919060170b86565b604080519687526020870195909552938501929092526060840152608083015260170b60a082015260c0016101fe565b61024d6104a23660046126f1565b6122fb565b60006001600160e01b03198216637965db0b60e01b14806104d857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006104e981612579565b6007805460ff8082161560ff1990921682179092556040519116151581527fb5e7f4f761942052db060859ee0965bbd1fd209fb73b7b201b11506b28bd2cd09060200160405180910390a150565b60008281526020819052604090206001015461055281612579565b61055c8383612586565b50505050565b6001600160a01b038116331461058b5760405163334bd91960e11b815260040160405180910390fd5b6105958282612618565b505050565b60006105a581612579565b610bb88211156105f25760405162461bcd60e51b815260206004820152601360248201527204665652065786365656473207468652063617606c1b60448201526064015b60405180910390fd5b60048290556040518281527ff355ec35fd925c464b65f29060888d79e9e9599fa614c0bb209e8b6fc812bfa7906020015b60405180910390a15050565b600061063a836110ba565b905060018160a00151600481111561065457610654612855565b146106715760405162461bcd60e51b81526004016105e990612a59565b426003826040015183606001516106889190612a96565b6106929190612aa9565b82604001516106a19190612acb565b10156106bf5760405162461bcd60e51b81526004016105e990612ade565b6000838152600160205260409020600301548290036106f05760405162461bcd60e51b81526004016105e990612b15565b60808101516001600160a01b03161561073d5780608001516001600160a01b0316336001600160a01b0316146107385760405162461bcd60e51b81526004016105e990612b40565b61077e565b60208101516001600160a01b031633036107695760405162461bcd60e51b81526004016105e990612b77565b60008381526001602052604090208054331790555b600083815260016020526040808220600480820186905560028054920154925163c4e2f86560e01b81526001600160a01b039092169363c4e2f865936107cc93909233928a92909101612b9f565b6020604051808303816000875af11580156107eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080f9190612bc5565b5060008381526001602081905260409182902001805460ff60d01b1916600360d01b179055517f1a94cf8518791e755fc1acdb85a1fe1ddf6178fed2ab170714fc05d2eef7f1ec9061086690859033908690612bde565b60405180910390a1505050565b600061087e81612579565b610bb88211156108c65760405162461bcd60e51b815260206004820152601360248201527204665652065786365656473207468652063617606c1b60448201526064016105e9565b60038290556040518281527f63fe946ed58429ac3c5e64d4356ff92c26d7fa1e73586515df8ba9f059ab54a590602001610623565b6000610906846110ba565b905060018160a00151600481111561092057610920612855565b1461093d5760405162461bcd60e51b81526004016105e990612a59565b426003826040015183606001516109549190612a96565b61095e9190612aa9565b826040015161096d9190612acb565b101561098b5760405162461bcd60e51b81526004016105e990612ade565b6000848152600160205260409020600301548390036109bc5760405162461bcd60e51b81526004016105e990612b15565b60808101516001600160a01b031615610a095780608001516001600160a01b0316336001600160a01b031614610a045760405162461bcd60e51b81526004016105e990612b40565b610a4a565b60208101516001600160a01b03163303610a355760405162461bcd60e51b81526004016105e990612b77565b60008481526001602052604090208054331790555b600084815260016020908152604080832060048101879055600280549101546001600160a01b0390911693636affb29a93919233928a9291893591610a93918b01908b01612bfd565b89604001358a606001356040518963ffffffff1660e01b8152600401610ac0989796959493929190612c18565b6020604051808303816000875af1158015610adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b039190612bc5565b5060008481526001602081905260409182902001805460ff60d01b1916600360d01b179055517f1a94cf8518791e755fc1acdb85a1fe1ddf6178fed2ab170714fc05d2eef7f1ec90610b5a90869033908790612bde565b60405180910390a150505050565b6000610b73836110ba565b905060018160a001516004811115610b8d57610b8d612855565b14610baa5760405162461bcd60e51b81526004016105e990612a59565b42600382604001518360600151610bc19190612a96565b610bcb9190612aa9565b8260400151610bda9190612acb565b1015610bf85760405162461bcd60e51b81526004016105e990612ade565b600083815260016020526040902060030154829003610c295760405162461bcd60e51b81526004016105e990612b15565b60808101516001600160a01b031615610c765780608001516001600160a01b0316336001600160a01b031614610c715760405162461bcd60e51b81526004016105e990612b40565b610cb7565b60208101516001600160a01b03163303610ca25760405162461bcd60e51b81526004016105e990612b77565b60008381526001602052604090208054331790555b6000838152600160205260408082206004808201869055600280549201549251632407471360e11b81526001600160a01b039092169363480e8e26936107cc93909233928a92909101612b9f565b60075460ff16610d275760405162461bcd60e51b81526004016105e990612c5a565b6002546040805163167a382560e11b815290516000926001600160a01b031691632cf4704a9160048083019260209291908290030181865afa158015610d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d959190612c84565b60405163ae82b5c960e01b815260ff891660048201526001600160a01b03919091169063ae82b5c990602401602060405180830381865afa158015610dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e029190612bc5565b03610e1f5760405162461bcd60e51b81526004016105e990612ca1565b336001600160a01b03861603610e475760405162461bcd60e51b81526004016105e990612b77565b600554610e5a4263ffffffff8716612a96565b1015610e785760405162461bcd60e51b81526004016105e990612ccc565b600654610e8b4263ffffffff8716612a96565b1115610ea95760405162461bcd60e51b81526004016105e990612d01565b60008442338830604051602001610ec4959493929190612d38565b60408051808303601f1901815290829052805160209091012060025463039279d760e61b8352600483018290526001600160a01b038581166024850152919350169063e49e75c090604401600060405180830381600087803b158015610f2957600080fd5b505af1158015610f3d573d6000803e3d6000fd5b5050600254604051632407471360e11b81526001600160a01b03909116925063480e8e269150610f7890869033908690600090600401612b9f565b6020604051808303816000875af1158015610f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbb9190612bc5565b50600081815260016020526040902054156110065760405162461bcd60e51b815260206004820152600b60248201526a47616d652065786973747360a81b60448201526064016105e9565b60008181526001602081905260409182902060038101879055600281018690556001600160a01b03891660a089811b63ffffffff60a01b169190911780835560ff60d81b60d88d901b1633429384901b811791909117600160d01b1793909401839055935191927fc43ac96bd8c2538554ad97ca56225ef030913f833f06564d7cdb86032cd4cd6c926110a79287928e928e92918e918e908e908e90612d86565b60405180910390a1505050505050505050565b6110f06040805160c08101825260008082526020820181905291810182905260608101829052608081018290529060a082015290565b60008281526001602081815260409283902080549201546001600160a01b03808416608087015263ffffffff60a085811c821660608901529183169387019390935281901c909116928401929092529060ff60d082901c16600481111561115957611159612855565b8360a00190600481111561116f5761116f612855565b9081600481111561118257611182612855565b90525060d81c60ff16825250919050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60075460ff166111de5760405162461bcd60e51b81526004016105e990612c5a565b6002546040805163167a382560e11b815290516000926001600160a01b031691632cf4704a9160048083019260209291908290030181865afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190612c84565b60405163ae82b5c960e01b815260ff891660048201526001600160a01b03919091169063ae82b5c990602401602060405180830381865afa158015611295573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b99190612bc5565b036112d65760405162461bcd60e51b81526004016105e990612ca1565b336001600160a01b038616036112fe5760405162461bcd60e51b81526004016105e990612b77565b6005546113114263ffffffff8716612a96565b101561132f5760405162461bcd60e51b81526004016105e990612ccc565b6006546113424263ffffffff8716612a96565b11156113605760405162461bcd60e51b81526004016105e990612d01565b6000844233883060405160200161137b959493929190612d38565b60408051808303601f1901815290829052805160209091012060025463039279d760e61b8352600483018290526001600160a01b038581166024850152919350169063e49e75c090604401600060405180830381600087803b1580156113e057600080fd5b505af11580156113f4573d6000803e3d6000fd5b505060025460405163c4e2f86560e01b81526001600160a01b03909116925063c4e2f8659150610f7890869033908690600090600401612b9f565b7f1d93c87416ca7b54f0fb8323167b72760e8e2ec93d48660953897a150f97a8b461145981612579565b6000611464836110ba565b90506203f48081606001514261147a9190612a96565b10156114b45760405162461bcd60e51b8152602060048201526009602482015268546f6f206561726c7960b81b60448201526064016105e9565b60018160a0015160048111156114cc576114cc612855565b146114e95760405162461bcd60e51b81526004016105e990612a59565b600280546000858152600160209081526040918290209093015492840151600480549251637a879fa960e11b8152908101949094526001600160a01b039081166024850152604484019190915260648301869052169063f50f3f5290608401600060405180830381600087803b15801561156257600080fd5b505af1158015611576573d6000803e3d6000fd5b5060d09250600291506115869050565b60008581526001602081905260409182902001805460ff60d01b191660ff9390931690931b91909117909155517f4508d504920b09c87708d104ad40433e6e7f6104005b44c0ebf4231f9c19ce33906108669085815260200190565b7f1d93c87416ca7b54f0fb8323167b72760e8e2ec93d48660953897a150f97a8b461160c81612579565b6000611617846110ba565b9050600080600260009054906101000a90046001600160a01b03166001600160a01b0316632cf4704a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561166f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116939190612c84565b835160405163d369dc6160e01b81526001600160a01b03929092169163d369dc61916116c491899190600401612ddc565b60408051808303816000875af11580156116e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117069190612e34565b909250905060038360a00151600481111561172357611723612855565b146117405760405162461bcd60e51b81526004016105e990612a59565b826060015142101561178a5760405162461bcd60e51b81526020600482015260136024820152720a8dede40cac2e4d8f240e8de40ccd2dcd2e6d606b1b60448201526064016105e9565b603c83606001518263ffffffff166117a29190612a96565b11156117e75760405162461bcd60e51b815260206004820152601460248201527313db190818da185a5b9b1a5b9ac81c995c1bdc9d60621b60448201526064016105e9565b6000868152600160205260408120600301546001600160c01b038416106118325760008781526001602052604090206003015461182d906001600160c01b038516612a96565b611858565b600087815260016020526040902060030154611858906001600160c01b03851690612a96565b600088815260016020526040812060040154919250906001600160c01b038516106118a7576000888152600160205260409020600401546118a2906001600160c01b038616612a96565b6118cd565b6000888152600160205260409020600401546118cd906001600160c01b03861690612a96565b905060008183146119fd576002805460008b81526001602052604090819020909201546003549251637b85343760e11b815260048101919091526024810192909252604482018b90526001600160a01b03169063f70a686e906064016020604051808303816000875af1158015611948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196c9190612bc5565b506002805460008b8152600160205260408082209093015492516328ac5cf760e21b815260048101939093526024830152604482018b90526001600160a01b03169063a2b173dc906064016020604051808303816000875af11580156119d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fa9190612bc5565b90505b81831015611b4d576002805460208881015160008d815260019092526040918290209093015490516388cc22ff60e01b81526001600160a01b0393841660048201526024810191909152604481018c9052606481018490529116906388cc22ff90608401600060405180830381600087803b158015611a7b57600080fd5b505af1158015611a8f573d6000803e3d6000fd5b5050600254604051634f0644ef60e01b8152600481018d90526001600160a01b039091169250634f0644ef9150602401600060405180830381600087803b158015611ad957600080fd5b505af1158015611aed573d6000803e3d6000fd5b50505060008a81526001602052604090819020600381015460049182015492517f5458161d50452bd42d3465eca8bb2dbe3fe9d9f4a54c99ec2f3e063029f2a52e9450611b40938e9390918b9190612e69565b60405180910390a1611dc4565b81831115611c905760028054608088015160008c815260016020526040908190209093015492516388cc22ff60e01b81526001600160a01b0391821660048201526024810193909352604483018c90526064830184905216906388cc22ff90608401600060405180830381600087803b158015611bc957600080fd5b505af1158015611bdd573d6000803e3d6000fd5b5050600254604051634f0644ef60e01b8152600481018d90526001600160a01b039091169250634f0644ef9150602401600060405180830381600087803b158015611c2757600080fd5b505af1158015611c3b573d6000803e3d6000fd5b50505060008a8152600160205260409081902060048082015460039092015492517f5458161d50452bd42d3465eca8bb2dbe3fe9d9f4a54c99ec2f3e063029f2a52e9450611b40938e939290918b9190612e69565b6002805460008b81526001602090815260409182902090930154928901519051630506a2ab60e11b81526001600160a01b0390921692630a0d455692611cdb92908e90600401612bde565b600060405180830381600087803b158015611cf557600080fd5b505af1158015611d09573d6000803e3d6000fd5b50506002805460008d815260016020526040908190209092015460808b01519251630506a2ab60e11b81526001600160a01b039092169450630a0d45569350611d589290918e90600401612bde565b600060405180830381600087803b158015611d7257600080fd5b505af1158015611d86573d6000803e3d6000fd5b505050507f4508d504920b09c87708d104ad40433e6e7f6104005b44c0ebf4231f9c19ce3389604051611dbb91815260200190565b60405180910390a15b505050600095865250600160208190526040909520948501805460ff60d01b1916600160d21b179055600590940180546001600160c01b039095166001600160c01b031990951694909417909355505050565b600082815260208190526040902060010154611e3281612579565b61055c8383612618565b60075460ff16611e5e5760405162461bcd60e51b81526004016105e990612c5a565b6002546040805163167a382560e11b815290516000926001600160a01b031691632cf4704a9160048083019260209291908290030181865afa158015611ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecc9190612c84565b60405163ae82b5c960e01b815260ff8a1660048201526001600160a01b03919091169063ae82b5c990602401602060405180830381865afa158015611f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f399190612bc5565b03611f565760405162461bcd60e51b81526004016105e990612ca1565b336001600160a01b03871603611f7e5760405162461bcd60e51b81526004016105e990612b77565b600554611f914263ffffffff8816612a96565b1015611faf5760405162461bcd60e51b81526004016105e990612ccc565b600654611fc24263ffffffff8816612a96565b1115611fe05760405162461bcd60e51b81526004016105e990612d01565b60008542338930604051602001611ffb959493929190612d38565b60408051808303601f1901815290829052805160209091012060025463039279d760e61b8352600483018290526001600160a01b038681166024850152919350169063e49e75c090604401600060405180830381600087803b15801561206057600080fd5b505af1158015612074573d6000803e3d6000fd5b50506002546001600160a01b03169150636affb29a9050853384600087356120a260408a0160208b01612bfd565b89604001358a606001356040518963ffffffff1660e01b81526004016120cf989796959493929190612c18565b6020604051808303816000875af11580156120ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121129190612bc5565b506000818152600160205260409020541561215d5760405162461bcd60e51b815260206004820152600b60248201526a47616d652065786973747360a81b60448201526064016105e9565b60008181526001602081905260409182902060038101889055600281018790556001600160a01b038a1660a08a811b63ffffffff60a01b169190911780835560ff60d81b60d88e901b1633429384901b811791909117600160d01b1793909401839055935191927fc43ac96bd8c2538554ad97ca56225ef030913f833f06564d7cdb86032cd4cd6c926121fe9287928f928f92918f918f908f908f90612d86565b60405180910390a150505050505050505050565b600061221d81612579565b6005829055600683905560408051848152602081018490527f6364394a13bc49d5861844b147dd49cd6ccc577f67a1990102d62796b29dc7c99101610866565b600061226881612579565b6001600160a01b0382166122ad5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b60448201526064016105e9565b600280546001600160a01b0319166001600160a01b0384169081179091556040519081527fafa147634b29e2c7bd53ce194256b9f41cfb9ba3036f2b822fdd1d965beea08690602001610623565b6000612306826110ba565b60208101519091506001600160a01b031633146123545760405162461bcd60e51b815260206004820152600c60248201526b2bb937b7339039b2b73232b960a11b60448201526064016105e9565b60018160a00151600481111561236c5761236c612855565b14806123dd575060018160a00151600481111561238b5761238b612855565b14806123ac575060038160a0015160048111156123aa576123aa612855565b145b80156123bb5750806060015142115b6123c65760006123dd565b6203f4808160600151426123da9190612a96565b10155b6123f95760405162461bcd60e51b81526004016105e990612a59565b60038160a00151600481111561241157612411612855565b036124945760028054600084815260016020526040908190209092015460808401519251630506a2ab60e11b81526001600160a01b0390921692630a0d4556926124619291908790600401612bde565b600060405180830381600087803b15801561247b57600080fd5b505af115801561248f573d6000803e3d6000fd5b505050505b6002805460008481526001602090815260409182902090930154928401519051630506a2ab60e11b81526001600160a01b0390921692630a0d4556926124df92908790600401612bde565b600060405180830381600087803b1580156124f957600080fd5b505af115801561250d573d6000803e3d6000fd5b5060d092506002915061251d9050565b60008481526001602081905260409182902001805460ff60d01b191660ff9390931690931b91909117909155517f4508d504920b09c87708d104ad40433e6e7f6104005b44c0ebf4231f9c19ce33906106239084815260200190565b6125838133612683565b50565b60006125928383611193565b612610576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556125c83390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016104d8565b5060006104d8565b60006126248383611193565b15612610576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016104d8565b61268d8282611193565b6126bc5760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016105e9565b5050565b6000602082840312156126d257600080fd5b81356001600160e01b0319811681146126ea57600080fd5b9392505050565b60006020828403121561270357600080fd5b5035919050565b6001600160a01b038116811461258357600080fd5b6000806040838503121561273257600080fd5b8235915060208301356127448161270a565b809150509250929050565b6000806040838503121561276257600080fd5b50508035926020909101359150565b60006080828403121561278357600080fd5b50919050565b600080600060c0848603121561279e57600080fd5b83359250602084013591506127b68560408601612771565b90509250925092565b803560ff811681146127d057600080fd5b919050565b63ffffffff8116811461258357600080fd5b60008060008060008060c0878903121561280057600080fd5b612809876127bf565b955060208701356128198161270a565b94506040870135612829816127d5565b9350606087013592506080870135915060a08701356128478161270a565b809150509295509295509295565b634e487b7160e01b600052602160045260246000fd5b6005811061288957634e487b7160e01b600052602160045260246000fd5b9052565b600060c08201905060ff8351168252602083015160018060a01b0380821660208501526040850151604085015260608501516060850152806080860151166080850152505060a08301516128e460a084018261286b565b5092915050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561291457600080fd5b82359150602083013567ffffffffffffffff8082111561293357600080fd5b818501915085601f83011261294757600080fd5b813581811115612959576129596128eb565b604051601f8201601f19908116603f01168101908382118183101715612981576129816128eb565b8160405282815288602084870101111561299a57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000806000806000806000610140888a0312156129d857600080fd5b6129e1886127bf565b965060208801356129f18161270a565b95506040880135612a01816127d5565b9450606088013593506080880135925060a0880135612a1f8161270a565b9150612a2e8960c08a01612771565b905092959891949750929550565b600060208284031215612a4e57600080fd5b81356126ea8161270a565b6020808252600d908201526c57726f6e67207374617475732160981b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156104d8576104d8612a80565b600082612ac657634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156104d8576104d8612a80565b6020808252601e908201527f47616d6520697320636c6f73656420666f72206e657720706c61796572730000604082015260600190565b60208082526011908201527053616d652061737365742070726963657360781b604082015260600190565b6020808252601f908201527f4f6e6c79206365727461696e206163636f756e742063616e2061636365707400604082015260600190565b6020808252600e908201526d15dc9bdb99c81bdc1c1bdb995b9d60921b604082015260600190565b9384526001600160a01b0392909216602084015260408301521515606082015260800190565b600060208284031215612bd757600080fd5b5051919050565b9283526001600160a01b03919091166020830152604082015260600190565b600060208284031215612c0f57600080fd5b6126ea826127bf565b9788526001600160a01b0396909616602088015260408701949094529115156060860152608085015260ff1660a084015260c083015260e08201526101000190565b60208082526010908201526f11d85b59481a5cc8191a5cd8589b195960821b604082015260600190565b600060208284031215612c9657600080fd5b81516126ea8161270a565b6020808252601190820152702bb937b733903332b2b210373ab6b132b960791b604082015260600190565b6020808252818101527f4d696e2067616d65206475726174696f6e206d75737420626520686967686572604082015260600190565b6020808252601f908201527f4d61782067616d65206475726174696f6e206d757374206265206c6f77657200604082015260600190565b60e09590951b6001600160e01b03191685526004850193909352606091821b6bffffffffffffffffffffffff19908116602486015290821b8116603885015291811b909116604c8301520190565b98895260ff9790971660208901526001600160a01b03958616604089015263ffffffff9485166060890152929093166080870152831660a086015260c085019190915260e0840152166101008201526101200190565b604081526000835180604084015260005b81811015612e0a5760208187018101516060868401015201612ded565b506000606082850101526060601f19601f83011684010191505060ff831660208301529392505050565b60008060408385031215612e4757600080fd5b82518060170b8114612e5857600080fd5b6020840151909250612744816127d5565b600060a0820190508682528560208301528460408301528360170b6060830152612e96608083018461286b565b969550505050505056fea26469706673582212205c3ab46f3395fb0c3616d898d8101a94fcb40f45de355cc9eb48302a0059c23564736f6c63430008180033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 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.