Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00
Cross-Chain Transactions
Loading...
Loading
Contract Name:
GamesPlayerProps
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-4.4.1/utils/Strings.sol";
// internal
import "../../utils/proxy/solidity-0.8.0/ProxyOwned.sol";
import "../../utils/proxy/solidity-0.8.0/ProxyPausable.sol";
// interface
import "../../interfaces/ISportPositionalMarketManager.sol";
import "../../interfaces/ITherundownConsumerVerifier.sol";
import "../../interfaces/ITherundownConsumer.sol";
import "../../interfaces/IGamesPlayerProps.sol";
import "../../interfaces/ISportPositionalMarket.sol";
/// @title Contract, which works on player props
/// @author gruja
contract GamesPlayerProps is Initializable, ProxyOwned, ProxyPausable {
/* ========== CONSTANTS =========== */
uint public constant MIN_TAG_NUMBER = 9000;
uint public constant TAG_NUMBER_PLAYERS = 10010;
uint public constant TAG_NUMBER_PLAYER_PROPS = 11000;
uint public constant CANCELLED = 0;
uint public constant HOME_WIN = 1;
uint public constant AWAY_WIN = 2;
uint public constant CANCELLED_STATUS = 255;
/* ========== CONSUMER STATE VARIABLES ========== */
ITherundownConsumer public consumer;
ITherundownConsumerVerifier public verifier;
ISportPositionalMarketManager public sportsManager;
address public playerPropsReceiver;
// game properties
mapping(bytes32 => mapping(bytes32 => mapping(uint8 => IGamesPlayerProps.PlayerProps))) public playerProp;
mapping(uint => bool) public doesSportSupportPlayerProps;
mapping(address => bytes32) public gameIdPerChildMarket;
mapping(address => bytes32) public playerIdPerChildMarket;
mapping(address => uint8) public optionIdPerChildMarket;
// market props
mapping(address => mapping(uint => address)) public mainMarketChildMarketIndex;
mapping(address => bool) public mainMarketPausedPlayerProps;
mapping(address => uint) public numberOfChildMarkets;
mapping(address => mapping(bytes32 => mapping(uint8 => mapping(uint => address))))
public mainMarketChildMarketPerPlayerAndOptionIndex;
mapping(address => mapping(bytes32 => mapping(uint8 => uint))) public numberOfChildMarketsPerPlayerAndOption;
mapping(address => mapping(bytes32 => mapping(uint8 => mapping(uint16 => address))))
public mainMarketPlayerOptionLineChildMarket;
mapping(address => address) public childMarketMainMarket;
mapping(address => mapping(bytes32 => mapping(uint8 => address))) public currentActiveChildMarketPerPlayerAndOption;
mapping(address => uint[]) public normalizedOddsForMarket;
mapping(address => bool) public normalizedOddsForMarketFulfilled;
mapping(address => bool) public childMarketCreated;
mapping(address => uint16) public childMarketLine;
mapping(bytes32 => mapping(bytes32 => mapping(uint8 => bool))) public invalidOddsForPlayerProps;
mapping(bytes32 => mapping(bytes32 => mapping(uint8 => bool))) public createFulfilledForPlayerProps;
mapping(bytes32 => mapping(bytes32 => mapping(uint8 => bool))) public resolveFulfilledForPlayerProps;
mapping(address => bool) public pausedByInvalidOddsOnMain;
mapping(address => bool) public pausedByCircuitBreakerOnMain;
mapping(address => bool) public playerPropsAddedForMain;
mapping(bytes32 => bytes32[]) public playersInAGame;
mapping(bytes32 => mapping(bytes32 => bool)) public playersInAGameFulfilled;
mapping(bytes32 => mapping(bytes32 => uint8[])) public allOptionsPerPlayer;
mapping(bytes32 => mapping(bytes32 => mapping(uint8 => IGamesPlayerProps.PlayerPropsResolver)))
public resolvedPlayerProps;
mapping(address => bool) public childMarketResolved;
mapping(bytes32 => address) public currentMainMarketForPlayer;
/* ========== CONSTRUCTOR ========== */
function initialize(
address _owner,
address _consumer,
address _verifier,
address _sportsManager,
address _playerPropsReceiver,
uint[] memory _supportedSportIds
) external initializer {
setOwner(_owner);
consumer = ITherundownConsumer(_consumer);
verifier = ITherundownConsumerVerifier(_verifier);
sportsManager = ISportPositionalMarketManager(_sportsManager);
playerPropsReceiver = _playerPropsReceiver;
for (uint i; i < _supportedSportIds.length; i++) {
doesSportSupportPlayerProps[_supportedSportIds[i]] = true;
}
}
/* ========== PLAYER PROPS MAIN FUNCTIONS ========== */
/// @notice main function for player props
/// @param _player player props struct see @ IGamesPlayerProps.PlayerProps
/// @param _sportId sport id
function obtainPlayerProps(IGamesPlayerProps.PlayerProps memory _player, uint _sportId) external canExecute {
address _main = consumer.marketPerGameId(_player.gameId);
// if main is created and not paused and also sport support player props
if (_main != address(0) && doesSportSupportPlayerProps[_sportId]) {
if (_areOddsAndLinesValidForPlayer(_player)) {
if (
invalidOddsForPlayerProps[_player.gameId][_player.playerId][_player.option] ||
pausedByInvalidOddsOnMain[_main] ||
pausedByCircuitBreakerOnMain[_main]
) {
invalidOddsForPlayerProps[_player.gameId][_player.playerId][_player.option] = false;
pausedByInvalidOddsOnMain[_main] = false;
pausedByCircuitBreakerOnMain[_main] = false;
}
playerProp[_player.gameId][_player.playerId][_player.option] = _player;
address playerPropsMarket = _obtainPlayerProps(_player, _main);
mainMarketPausedPlayerProps[_main] = false;
playerPropsAddedForMain[_main] = true;
if (!playersInAGameFulfilled[_player.gameId][_player.playerId]) {
playersInAGameFulfilled[_player.gameId][_player.playerId] = true;
playersInAGame[_player.gameId].push(_player.playerId);
}
if (!createFulfilledForPlayerProps[_player.gameId][_player.playerId][_player.option]) {
createFulfilledForPlayerProps[_player.gameId][_player.playerId][_player.option] = true;
allOptionsPerPlayer[_player.gameId][_player.playerId].push(_player.option);
}
emit PlayerPropsAdded(
_player.gameId,
_player.playerId,
_player.option,
normalizedOddsForMarket[playerPropsMarket]
);
} else {
invalidOddsForPlayerProps[_player.gameId][_player.playerId][_player.option] = true;
_pauseMarketsForPlayerPropsForOption(_player, true);
emit InvalidOddsForMarket(_main, _player.gameId, _player.playerId, _player.option);
}
}
}
/// @notice resolve playerProp
/// @param _result object for resolve
function resolvePlayerProps(IGamesPlayerProps.PlayerPropsResolver memory _result) external canExecute {
// get main market
address _main = consumer.marketPerGameId(_result.gameId);
//number of childs per option
uint numberOfChildsPerOptions = numberOfChildMarketsPerPlayerAndOption[_main][_result.playerId][_result.option];
// if it is resolved skip it
if (!resolveFulfilledForPlayerProps[_result.gameId][_result.playerId][_result.option]) {
// resolve
for (uint j = 0; j < numberOfChildsPerOptions; j++) {
address child = mainMarketChildMarketPerPlayerAndOptionIndex[_main][_result.playerId][_result.option][j];
if (!childMarketResolved[child]) {
if (invalidOddsForPlayerProps[_result.gameId][_result.playerId][_result.option]) {
consumer.pauseOrUnpauseMarket(child, false);
}
if (_result.statusId == CANCELLED_STATUS) {
_resolveMarket(child, uint16(CANCELLED), CANCELLED);
} else {
_resolveMarketForPlayer(child, _result.score);
}
childMarketResolved[child] = true;
}
}
resolvedPlayerProps[_result.gameId][_result.playerId][_result.option] = _result;
resolveFulfilledForPlayerProps[_result.gameId][_result.playerId][_result.option] = true;
}
}
/// @notice cancel playerProp
/// @param _market market for cancelation
function cancelMarketFromManager(address _market) external onlyManager {
address parent = childMarketMainMarket[_market];
bytes32 gameId = gameIdPerChildMarket[_market];
bytes32 playerId = playerIdPerChildMarket[_market];
uint8 option = optionIdPerChildMarket[_market];
uint numberOfChildsPerOptions = numberOfChildMarketsPerPlayerAndOption[parent][playerId][option];
if (!childMarketResolved[_market]) {
_resolveMarket(_market, uint16(CANCELLED), CANCELLED);
if (numberOfChildsPerOptions < 2) {
resolveFulfilledForPlayerProps[gameId][playerId][option] = true;
} else {
bool flagResolved = true;
for (uint j = 0; j < numberOfChildsPerOptions; j++) {
address child = mainMarketChildMarketPerPlayerAndOptionIndex[parent][playerId][option][j];
if (!childMarketResolved[child] && child != _market) {
flagResolved = false;
break;
}
}
if (flagResolved) {
resolveFulfilledForPlayerProps[gameId][playerId][option] = true;
}
}
childMarketResolved[_market] = true;
}
}
/// @notice pause/unpause all markets for game
/// @param _main parent market for which we are pause/unpause child markets
/// @param _flag pause -> true, unpause -> false
/// @param _invalidOddsMain are paused by invalid odds on main
/// @param _circuitBreakerOnMain are paused by circuit breaker on main
function pauseAllPlayerPropsMarketForMain(
address _main,
bool _flag,
bool _invalidOddsMain,
bool _circuitBreakerOnMain
) external onlyConsumer {
if (playerPropsAddedForMain[_main]) {
mainMarketPausedPlayerProps[_main] = _flag;
pausedByInvalidOddsOnMain[_main] = _invalidOddsMain;
pausedByCircuitBreakerOnMain[_main] = _circuitBreakerOnMain;
_pauseAllPlayerPropsMarket(_main, _flag);
}
}
/// @notice pause/unpause current active child markets
/// @param _main parent market for which we are pause/unpause child markets
function cancelPlayerPropsMarketForMain(address _main) external onlyConsumer {
_cancelPlayerPropsMarket(_main);
}
/* ========== INTERNALS ========== */
function _areOddsAndLinesValidForPlayer(IGamesPlayerProps.PlayerProps memory _player) internal view returns (bool) {
return verifier.areOddsAndLinesValidForPlayer(_player.line, _player.overOdds, _player.underOdds);
}
function _obtainPlayerProps(IGamesPlayerProps.PlayerProps memory _player, address _main) internal returns (address) {
bool isNewMarket = numberOfChildMarkets[_main] == 0;
address currentActiveChildMarket = currentActiveChildMarketPerPlayerAndOption[_main][_player.playerId][
_player.option
];
address currentMarket = mainMarketPlayerOptionLineChildMarket[_main][_player.playerId][_player.option][_player.line];
if (isNewMarket || currentMarket == address(0)) {
address newMarket = _createMarketForPlayerProps(_player, _main);
currentActiveChildMarketPerPlayerAndOption[_main][_player.playerId][_player.option] = newMarket;
if (currentActiveChildMarket != address(0)) {
consumer.pauseOrUnpauseMarket(currentActiveChildMarket, true);
}
_setNormalizedOdds(newMarket, _player.gameId, _player.playerId, _player.option);
return newMarket;
} else if (currentMarket != currentActiveChildMarket) {
consumer.pauseOrUnpauseMarket(currentMarket, false);
consumer.pauseOrUnpauseMarket(currentActiveChildMarket, true);
currentActiveChildMarketPerPlayerAndOption[_main][_player.playerId][_player.option] = currentMarket;
_setNormalizedOdds(currentMarket, _player.gameId, _player.playerId, _player.option);
return currentMarket;
} else {
consumer.pauseOrUnpauseMarket(currentActiveChildMarket, false);
_setNormalizedOdds(currentActiveChildMarket, _player.gameId, _player.playerId, _player.option);
return currentActiveChildMarket;
}
}
function _pauseMarketsForPlayerPropsForOption(IGamesPlayerProps.PlayerProps memory _player, bool _flag)
internal
returns (bool)
{
// get main market
address _main = consumer.marketPerGameId(_player.gameId);
//number of childs per option
uint numberOfChildsPerOptions = numberOfChildMarketsPerPlayerAndOption[_main][_player.playerId][_player.option];
// pause all per option
for (uint j = 0; j < numberOfChildsPerOptions; j++) {
address child = mainMarketChildMarketPerPlayerAndOptionIndex[_main][_player.playerId][_player.option][j];
_pauseOrUnpauseMarket(child, _flag);
}
}
function _pauseAllPlayerPropsMarket(address _main, bool _flag) internal {
for (uint i = 0; i < numberOfChildMarkets[_main]; i++) {
consumer.pauseOrUnpauseMarket(mainMarketChildMarketIndex[_main][i], _flag);
}
}
function _cancelPlayerPropsMarket(address _main) internal {
for (uint i = 0; i < numberOfChildMarkets[_main]; i++) {
if (!childMarketResolved[mainMarketChildMarketIndex[_main][i]]) {
sportsManager.resolveMarket(mainMarketChildMarketIndex[_main][i], CANCELLED);
}
}
}
function _pauseOrUnpauseMarket(address _market, bool _pause) internal {
consumer.pauseOrUnpauseMarket(_market, _pause);
}
function _setNormalizedOdds(
address _market,
bytes32 _gameId,
bytes32 _playerId,
uint8 _option
) internal {
normalizedOddsForMarket[_market] = _getNormalizedOddsForPlayerProps(_gameId, _playerId, _option);
normalizedOddsForMarketFulfilled[_market] = true;
}
function _createMarketForPlayerProps(IGamesPlayerProps.PlayerProps memory _player, address _mainMarket)
internal
returns (address _playerMarket)
{
// create
uint[] memory tags = _calculateTags(consumer.sportsIdPerGame(_player.gameId), _player.option);
sportsManager.createMarket(
_player.gameId,
_append(_player), // gameLabel
consumer.getGameCreatedById(_player.gameId).startTime, //maturity
0, //initialMint
2, // always two positions for player props
tags, //tags
true, // is child
_mainMarket
);
_playerMarket = sportsManager.getActiveMarketAddress(sportsManager.numActiveMarkets() - 1);
// adding child markets
_setChildMarkets(
_player.gameId,
_mainMarket,
_playerMarket,
_player.line,
_player.playerId,
_player.playerName,
_player.option,
tags[2]
);
}
function _append(IGamesPlayerProps.PlayerProps memory _player) internal pure returns (string memory) {
return
string(
abi.encodePacked(
_player.playerName,
" - ",
Strings.toString(_player.option),
" - ",
Strings.toString(_player.line)
)
);
}
function _calculateTags(uint _sportsId, uint8 _option) internal pure returns (uint[] memory) {
uint[] memory result = new uint[](3);
result[0] = MIN_TAG_NUMBER + _sportsId;
result[1] = TAG_NUMBER_PLAYERS;
result[2] = TAG_NUMBER_PLAYER_PROPS + _option;
return result;
}
function _setChildMarkets(
bytes32 _gameId,
address _main,
address _child,
uint16 _line,
bytes32 _playerId,
string memory _playerName,
uint8 _option,
uint _type
) internal {
consumer.setGameIdPerChildMarket(_gameId, _child);
gameIdPerChildMarket[_child] = _gameId;
playerIdPerChildMarket[_child] = _playerId;
currentMainMarketForPlayer[_playerId] = _main;
optionIdPerChildMarket[_child] = _option;
childMarketCreated[_child] = true;
childMarketMainMarket[_child] = _main;
mainMarketChildMarketIndex[_main][numberOfChildMarkets[_main]] = _child;
numberOfChildMarkets[_main] += 1;
mainMarketPlayerOptionLineChildMarket[_main][_playerId][_option][_line] = _child;
childMarketLine[_child] = _line;
currentActiveChildMarketPerPlayerAndOption[_main][_playerId][_option] = _child;
mainMarketChildMarketPerPlayerAndOptionIndex[_main][_playerId][_option][
numberOfChildMarketsPerPlayerAndOption[_main][_playerId][_option]
] = _child;
numberOfChildMarketsPerPlayerAndOption[_main][_playerId][_option] += 1;
emit CreatePlayerPropsMarket(
_main,
_child,
_gameId,
_playerId,
_playerName,
_line,
_option,
_getNormalizedChildOdds(_child),
_type
);
}
function _resolveMarketForPlayer(address _child, uint16 _score) internal {
uint16 line = childMarketLine[_child];
uint outcome = _score * 100 > line ? HOME_WIN : _score * 100 < line ? AWAY_WIN : CANCELLED;
_resolveMarket(_child, _score, outcome);
}
function _resolveMarket(
address _child,
uint16 _score,
uint _outcome
) internal {
sportsManager.resolveMarket(_child, _outcome);
emit ResolveChildMarket(_child, _outcome, childMarketMainMarket[_child], _score);
}
function _getNormalizedOddsForPlayerProps(
bytes32 _gameId,
bytes32 _playerId,
uint8 _option
) internal view returns (uint[] memory) {
int[] memory odds = new int[](2);
odds[0] = playerProp[_gameId][_playerId][_option].overOdds;
odds[1] = playerProp[_gameId][_playerId][_option].underOdds;
return verifier.calculateAndNormalizeOdds(odds);
}
function _getNormalizedChildOddsFromGameOddsStruct(address _market) internal view returns (uint[] memory) {
return
_getNormalizedOddsForPlayerProps(
gameIdPerChildMarket[_market],
playerIdPerChildMarket[_market],
optionIdPerChildMarket[_market]
);
}
function _getNormalizedChildOdds(address _market) internal view returns (uint[] memory) {
return
normalizedOddsForMarketFulfilled[_market]
? normalizedOddsForMarket[_market]
: _getNormalizedChildOddsFromGameOddsStruct(_market);
}
function _getAllChildMarketsForParentPlayerOption(
address _parent,
bytes32 _player,
uint8 _option
) internal view returns (address[] memory _children) {
uint num = numberOfChildMarketsPerPlayerAndOption[_parent][_player][_option];
_children = new address[](num);
for (uint j = 0; j < num; j++) {
address child = mainMarketChildMarketPerPlayerAndOptionIndex[_parent][_player][_option][j];
_children[j] = child;
}
}
function _getValidMainMarket(address mainMarket) internal view returns (address toReturn) {
if (mainMarket != address(0)) {
(uint maturity, ) = ISportPositionalMarket(mainMarket).times();
if (maturity >= block.timestamp && !ISportPositionalMarket(mainMarket).resolved()) {
toReturn = mainMarket;
}
}
}
/* ========== VIEW FUNCTIONS ========== */
/// @notice view function which returns props data for given child market
/// @param _market market
function getPlayerPropsDataForMarket(address _market)
external
view
returns (
address,
bytes32,
bytes32,
uint8
)
{
return (
childMarketMainMarket[_market],
gameIdPerChildMarket[_market],
playerIdPerChildMarket[_market],
optionIdPerChildMarket[_market]
);
}
/// @notice view function which returns normalized odds up to 100 (Example: 50-50)
/// @param _market market
/// @return uint[] odds array normalized
function getNormalizedOddsForMarket(address _market) external view returns (uint[] memory) {
return _getNormalizedChildOdds(_market);
}
function getPlayerPropForOption(
bytes32 _gameId,
bytes32 _playerId,
uint8 _option
)
external
view
returns (
uint16,
int24,
int24,
bool
)
{
IGamesPlayerProps.PlayerProps memory currentProp = playerProp[_gameId][_playerId][_option];
return (
currentProp.line,
currentProp.overOdds,
currentProp.underOdds,
invalidOddsForPlayerProps[_gameId][_playerId][_option]
);
}
function getAllOptionsWithPlayersForGameId(bytes32 _gameId)
external
view
returns (
bytes32[] memory _playerIds,
uint8[] memory _options,
bool[] memory _isResolved,
bool[] memory _hasMintsOnChildren
)
{
// get main market
address _main = consumer.marketPerGameId(_gameId);
uint256 totalCombinations = 0;
for (uint256 i = 0; i < playersInAGame[_gameId].length; i++) {
bytes32 playerId = playersInAGame[_gameId][i];
totalCombinations += allOptionsPerPlayer[_gameId][playerId].length;
}
_playerIds = new bytes32[](totalCombinations);
_options = new uint8[](totalCombinations);
_isResolved = new bool[](totalCombinations);
_hasMintsOnChildren = new bool[](totalCombinations);
uint256 index = 0;
for (uint256 i = 0; i < playersInAGame[_gameId].length; i++) {
bytes32 playerId = playersInAGame[_gameId][i];
uint8[] memory playerOptions = allOptionsPerPlayer[_gameId][playerId];
for (uint256 j = 0; j < playerOptions.length; j++) {
uint8 optionId = playerOptions[j];
if (createFulfilledForPlayerProps[_gameId][playerId][optionId]) {
_playerIds[index] = playerId;
_options[index] = optionId;
_isResolved[index] = resolveFulfilledForPlayerProps[_gameId][playerId][optionId];
address[] memory _childArraysPerOption = _getAllChildMarketsForParentPlayerOption(
_main,
playerId,
optionId
);
(bool[] memory _hasAnyMintsArray, , , ) = sportsManager.queryMintsAndMaturityStatusForPlayerProps(
_childArraysPerOption
);
_hasMintsOnChildren[index] = false;
for (uint256 m = 0; m < _childArraysPerOption.length; m++) {
if (_hasAnyMintsArray[m]) {
_hasMintsOnChildren[index] = true;
break;
}
}
index++;
}
}
}
}
function getAllChildMarketsForParents(address[] memory _parents) external view returns (address[] memory _children) {
uint totalChildren = 0;
for (uint i = 0; i < _parents.length; i++) {
totalChildren += numberOfChildMarkets[_parents[i]];
}
_children = new address[](totalChildren);
uint index = 0;
for (uint i = 0; i < _parents.length; i++) {
uint num = numberOfChildMarkets[_parents[i]];
for (uint j = 0; j < num; j++) {
address child = mainMarketChildMarketIndex[_parents[i]][j];
_children[index] = child;
index++;
}
}
}
function getAllMainMarketsBasedOnPlayer(bytes32[] memory _playerIds, string[] memory _teamNames)
external
view
returns (address[] memory _mainMarkets)
{
_mainMarkets = new address[](_playerIds.length);
for (uint i = 0; i < _playerIds.length; i++) {
address mainMarket = currentMainMarketForPlayer[_playerIds[i]];
_mainMarkets[i] = _getValidMainMarket(mainMarket);
if (_mainMarkets[i] == address(0)) {
mainMarket = consumer.marketForTeamName(_teamNames[i]);
_mainMarkets[i] = _getValidMainMarket(mainMarket);
}
}
}
function getAllChildMarketsForParentPlayerOption(
address _parent,
bytes32 _player,
uint8 _option
) external view returns (address[] memory _children) {
return _getAllChildMarketsForParentPlayerOption(_parent, _player, _option);
}
/* ========== CONTRACT MANAGEMENT ========== */
/// @notice sets consumer, verifier, manager address
/// @param _consumer consumer address
/// @param _verifier verifier address
/// @param _sportsManager sport manager address
/// @param _playerPropsReceiver receiver
function setContracts(
address _consumer,
address _verifier,
address _sportsManager,
address _playerPropsReceiver
) external onlyOwner {
consumer = ITherundownConsumer(_consumer);
verifier = ITherundownConsumerVerifier(_verifier);
sportsManager = ISportPositionalMarketManager(_sportsManager);
playerPropsReceiver = _playerPropsReceiver;
emit NewContractAddresses(_consumer, _verifier, _sportsManager, _playerPropsReceiver);
}
/// @notice sets if sport is suported or not (delete from supported sport)
/// @param _sportId sport id which needs to be supported or not
/// @param _isSupported true/false (supported or not)
function setSupportedSportForPlayerPropsAdded(uint _sportId, bool _isSupported) external onlyOwner {
doesSportSupportPlayerProps[_sportId] = _isSupported;
emit SupportedSportForPlayerPropsAdded(_sportId, _isSupported);
}
/* ========== MODIFIERS ========== */
modifier canExecute() {
require(msg.sender == playerPropsReceiver, "Invalid sender");
_;
}
modifier onlyManager() {
require(msg.sender == address(sportsManager), "Only manager");
_;
}
modifier onlyConsumer() {
require(msg.sender == address(consumer), "Only consumer");
_;
}
/* ========== EVENTS ========== */
event PlayerPropsAdded(bytes32 _gameId, bytes32 _playerId, uint8 _option, uint[] _normalizedOdds);
event NewContractAddresses(address _consumer, address _verifier, address _sportsManager, address _receiver);
event SupportedSportForPlayerPropsAdded(uint _sportId, bool _isSupported);
event CreatePlayerPropsMarket(
address _main,
address _child,
bytes32 _gameId,
bytes32 _playerId,
string _playerName,
uint16 _line,
uint8 _option,
uint[] _normalizedOdds,
uint _type
);
event ResolveChildMarket(address _child, uint _outcome, address _main, uint16 _score);
event InvalidOddsForMarket(address _main, bytes32 _gameId, bytes32 _playerId, uint8 option);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract PausableUpgradeable is Initializable, ContextUpgradeable {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
function __Pausable_init() internal onlyInitializing {
__Context_init_unchained();
__Pausable_init_unchained();
}
function __Pausable_init_unchained() internal onlyInitializing {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol)
pragma solidity ^0.8.0;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the
* initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() initializer {}
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Modifier to protect an initializer function from being invoked twice.
*/
modifier initializer() {
// If the contract is initializing we ignore whether _initialized is set in order to support multiple
// inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
// contract may have been reentered.
require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} modifier, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
function _isConstructor() private view returns (bool) {
return !AddressUpgradeable.isContract(address(this));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// Clone of syntetix contract without constructor
contract ProxyOwned {
address public owner;
address public nominatedOwner;
bool private _initialized;
bool private _transferredAtInit;
function setOwner(address _owner) public {
require(_owner != address(0), "Owner address cannot be 0");
require(!_initialized, "Already initialized, use nominateNewOwner");
_initialized = true;
owner = _owner;
emit OwnerChanged(address(0), _owner);
}
function nominateNewOwner(address _owner) external onlyOwner {
nominatedOwner = _owner;
emit OwnerNominated(_owner);
}
function acceptOwnership() external {
require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
emit OwnerChanged(owner, nominatedOwner);
owner = nominatedOwner;
nominatedOwner = address(0);
}
function transferOwnershipAtInit(address proxyAddress) external onlyOwner {
require(proxyAddress != address(0), "Invalid address");
require(!_transferredAtInit, "Already transferred");
owner = proxyAddress;
_transferredAtInit = true;
emit OwnerChanged(owner, proxyAddress);
}
modifier onlyOwner {
_onlyOwner();
_;
}
function _onlyOwner() private view {
require(msg.sender == owner, "Only the contract owner may perform this action");
}
event OwnerNominated(address newOwner);
event OwnerChanged(address oldOwner, address newOwner);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// Inheritance
import "./ProxyOwned.sol";
// Clone of syntetix contract without constructor
contract ProxyPausable is ProxyOwned {
uint public lastPauseTime;
bool public paused;
/**
* @notice Change the paused state of the contract
* @dev Only the contract owner may call this.
*/
function setPaused(bool _paused) external onlyOwner {
// Ensure we're actually changing the state before we do anything
if (_paused == paused) {
return;
}
// Set our paused state.
paused = _paused;
// If applicable, set the last pause time.
if (paused) {
lastPauseTime = block.timestamp;
}
// Let everyone know that our pause state has changed.
emit PauseChanged(paused);
}
event PauseChanged(bool isPaused);
modifier notPaused {
require(!paused, "This action cannot be performed while the contract is paused");
_;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../interfaces/ISportPositionalMarket.sol";
interface ISportPositionalMarketManager {
/* ========== VIEWS / VARIABLES ========== */
function marketCreationEnabled() external view returns (bool);
function totalDeposited() external view returns (uint);
function numActiveMarkets() external view returns (uint);
function activeMarkets(uint index, uint pageSize) external view returns (address[] memory);
function numMaturedMarkets() external view returns (uint);
function maturedMarkets(uint index, uint pageSize) external view returns (address[] memory);
function isActiveMarket(address candidate) external view returns (bool);
function isDoubleChanceMarket(address candidate) external view returns (bool);
function doesSportSupportDoubleChance(uint _sport) external view returns (bool);
function isDoubleChanceSupported() external view returns (bool);
function isKnownMarket(address candidate) external view returns (bool);
function getActiveMarketAddress(uint _index) external view returns (address);
function transformCollateral(uint value) external view returns (uint);
function reverseTransformCollateral(uint value) external view returns (uint);
function isMarketPaused(address _market) external view returns (bool);
function expiryDuration() external view returns (uint);
function isWhitelistedAddress(address _address) external view returns (bool);
function getOddsObtainer() external view returns (address obtainer);
/* ========== MUTATIVE FUNCTIONS ========== */
function createMarket(
bytes32 gameId,
string memory gameLabel,
uint maturity,
uint initialMint, // initial sUSD to mint options for,
uint positionCount,
uint[] memory tags,
bool isChild,
address parentMarket
) external returns (ISportPositionalMarket);
function setMarketPaused(address _market, bool _paused) external;
function updateDatesForMarket(address _market, uint256 _newStartTime) external;
function resolveMarket(address market, uint outcome) external;
function expireMarkets(address[] calldata market) external;
function transferSusdTo(
address sender,
address receiver,
uint amount
) external;
function queryMintsAndMaturityStatusForPlayerProps(address[] memory _playerPropsMarkets)
external
view
returns (
bool[] memory _hasAnyMintsArray,
bool[] memory _isMaturedArray,
bool[] memory _isResolvedArray,
uint[] memory _maturities
);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface ITherundownConsumerVerifier {
// view functions
function isInvalidNames(string memory _teamA, string memory _teamB) external view returns (bool);
function areTeamsEqual(string memory _teamA, string memory _teamB) external view returns (bool);
function isSupportedMarketType(string memory _market) external view returns (bool);
function areOddsArrayInThreshold(
uint _sportId,
uint[] memory _currentOddsArray,
uint[] memory _newOddsArray,
bool _isTwoPositionalSport
) external view returns (bool);
function areOddsValid(
bool _isTwoPositionalSport,
int24 _homeOdds,
int24 _awayOdds,
int24 _drawOdds
) external view returns (bool);
function areSpreadOddsValid(
int16 spreadHome,
int24 spreadHomeOdds,
int16 spreadAway,
int24 spreadAwayOdds
) external view returns (bool);
function areTotalOddsValid(
uint24 totalOver,
int24 totalOverOdds,
uint24 totalUnder,
int24 totalUnderOdds
) external view returns (bool);
function areOddsAndLinesValidForPlayer(
uint16 _line,
int24 _overOdds,
int24 _underOdds
) external pure returns (bool);
function isValidOutcomeForGame(bool _isTwoPositionalSport, uint _outcome) external view returns (bool);
function isValidOutcomeWithResult(
uint _outcome,
uint _homeScore,
uint _awayScore
) external view returns (bool);
function calculateAndNormalizeOdds(int[] memory _americanOdds) external view returns (uint[] memory);
function getBookmakerIdsBySportId(uint256 _sportId) external view returns (uint256[] memory);
function getBookmakerIdsBySportIdForPlayerProps(uint256 _sportId) external view returns (uint256[] memory);
function getStringIDsFromBytesArrayIDs(bytes32[] memory _ids) external view returns (string[] memory);
function convertUintToString(uint8[] memory _options) external view returns (string[] memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface ITherundownConsumer {
struct GameCreate {
bytes32 gameId;
uint256 startTime;
int24 homeOdds;
int24 awayOdds;
int24 drawOdds;
string homeTeam;
string awayTeam;
}
// view functions
function supportedSport(uint _sportId) external view returns (bool);
function gameOnADate(bytes32 _gameId) external view returns (uint);
function isGameResolvedOrCanceled(bytes32 _gameId) external view returns (bool);
function getNormalizedOddsForMarket(address _market) external view returns (uint[] memory);
function getGamesPerDatePerSport(uint _sportId, uint _date) external view returns (bytes32[] memory);
function getGamePropsForOdds(address _market)
external
view
returns (
uint,
uint,
bytes32
);
function gameIdPerMarket(address _market) external view returns (bytes32);
function getGameCreatedById(bytes32 _gameId) external view returns (GameCreate memory);
function isChildMarket(address _market) external view returns (bool);
function gameFulfilledCreated(bytes32 _gameId) external view returns (bool);
function playerProps() external view returns (address);
function oddsObtainer() external view returns (address);
// write functions
function fulfillGamesCreated(
bytes32 _requestId,
bytes[] memory _games,
uint _sportsId,
uint _date
) external;
function fulfillGamesResolved(
bytes32 _requestId,
bytes[] memory _games,
uint _sportsId
) external;
function fulfillGamesOdds(bytes32 _requestId, bytes[] memory _games) external;
function setPausedByCanceledStatus(address _market, bool _flag) external;
function setGameIdPerChildMarket(bytes32 _gameId, address _child) external;
function pauseOrUnpauseMarket(address _market, bool _pause) external;
function pauseOrUnpauseMarketForPlayerProps(
address _market,
bool _pause,
bool _invalidOdds,
bool _circuitBreakerMain
) external;
function setChildMarkets(
bytes32 _gameId,
address _main,
address _child,
bool _isSpread,
int16 _spreadHome,
uint24 _totalOver
) external;
function resolveMarketManually(
address _market,
uint _outcome,
uint8 _homeScore,
uint8 _awayScore,
bool _usebackupOdds
) external;
function getOddsForGame(bytes32 _gameId)
external
view
returns (
int24,
int24,
int24
);
function sportsIdPerGame(bytes32 _gameId) external view returns (uint);
function getGameStartTime(bytes32 _gameId) external view returns (uint256);
function getLastUpdatedFromGameResolve(bytes32 _gameId) external view returns (uint40);
function marketPerGameId(bytes32 _gameId) external view returns (address);
function marketResolved(address _market) external view returns (bool);
function marketCanceled(address _market) external view returns (bool);
function invalidOdds(address _market) external view returns (bool);
function isPausedByCanceledStatus(address _market) external view returns (bool);
function isSportOnADate(uint _date, uint _sportId) external view returns (bool);
function isSportTwoPositionsSport(uint _sportsId) external view returns (bool);
function marketForTeamName(string memory _teamName) external view returns (address);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IGamesPlayerProps {
struct PlayerProps {
bytes32 gameId;
bytes32 playerId;
uint8 option;
string playerName;
uint16 line;
int24 overOdds;
int24 underOdds;
}
struct PlayerPropsResolver {
bytes32 gameId;
bytes32 playerId;
uint8 option;
uint16 score;
uint8 statusId;
}
function obtainPlayerProps(PlayerProps memory _player, uint _sportId) external;
function resolvePlayerProps(PlayerPropsResolver memory _result) external;
function cancelMarketFromManager(address _market) external;
function pauseAllPlayerPropsMarketForMain(
address _main,
bool _flag,
bool _invalidOddsOnMain,
bool _circuitBreakerMain
) external;
function createFulfilledForPlayerProps(
bytes32 gameId,
bytes32 playerId,
uint8 option
) external view returns (bool);
function cancelPlayerPropsMarketForMain(address _main) external;
function getNormalizedOddsForMarket(address _market) external view returns (uint[] memory);
function mainMarketChildMarketIndex(address _main, uint _index) external view returns (address);
function numberOfChildMarkets(address _main) external view returns (uint);
function doesSportSupportPlayerProps(uint _sportId) external view returns (bool);
function pausedByInvalidOddsOnMain(address _main) external view returns (bool);
function pausedByCircuitBreakerOnMain(address _main) external view returns (bool);
function playerIdPerChildMarket(address _market) external view returns (bytes32);
function optionIdPerChildMarket(address _market) external view returns (uint8);
function getAllOptionsWithPlayersForGameId(bytes32 _gameId)
external
view
returns (
bytes32[] memory _playerIds,
uint8[] memory _options,
bool[] memory _isResolved,
address[][] memory _childMarketsPerOption
);
function getPlayerPropsDataForMarket(address _market)
external
view
returns (
address,
bytes32,
bytes32,
uint8
);
function getPlayerPropForOption(
bytes32 gameId,
bytes32 playerId,
uint8 option
)
external
view
returns (
uint16,
int24,
int24,
bool
);
function fulfillPlayerPropsCLResolved(bytes[] memory _playerProps) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.16;
import "../interfaces/IPositionalMarketManager.sol";
import "../interfaces/IPosition.sol";
import "../interfaces/IPriceFeed.sol";
interface ISportPositionalMarket {
/* ========== TYPES ========== */
enum Phase {
Trading,
Maturity,
Expiry
}
enum Side {
Cancelled,
Home,
Away,
Draw
}
/* ========== VIEWS / VARIABLES ========== */
function getOptions()
external
view
returns (
IPosition home,
IPosition away,
IPosition draw
);
function times() external view returns (uint maturity, uint destruction);
function getGameDetails() external view returns (bytes32 gameId, string memory gameLabel);
function getGameId() external view returns (bytes32);
function deposited() external view returns (uint);
function optionsCount() external view returns (uint);
function creator() external view returns (address);
function resolved() external view returns (bool);
function cancelled() external view returns (bool);
function paused() external view returns (bool);
function phase() external view returns (Phase);
function canResolve() external view returns (bool);
function result() external view returns (Side);
function isChild() external view returns (bool);
function optionsInitialized() external view returns (bool);
function tags(uint idx) external view returns (uint);
function getTags() external view returns (uint tag1, uint tag2);
function getTagsLength() external view returns (uint tagsLength);
function getParentMarketPositions() external view returns (IPosition position1, IPosition position2);
function getParentMarketPositionsUint() external view returns (uint position1, uint position2);
function getStampedOdds()
external
view
returns (
uint,
uint,
uint
);
function balancesOf(address account)
external
view
returns (
uint home,
uint away,
uint draw
);
function totalSupplies()
external
view
returns (
uint home,
uint away,
uint draw
);
function isDoubleChance() external view returns (bool);
function parentMarket() external view returns (ISportPositionalMarket);
/* ========== MUTATIVE FUNCTIONS ========== */
function setPaused(bool _paused) external;
function updateDates(uint256 _maturity, uint256 _expiry) external;
function mint(uint value) external;
function exerciseOptions() external;
function restoreInvalidOdds(
uint _homeOdds,
uint _awayOdds,
uint _drawOdds
) external;
function initializeOptions() external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";
/**
* @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 ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
__Context_init_unchained();
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.16;
import "../interfaces/IPositionalMarket.sol";
interface IPositionalMarketManager {
/* ========== VIEWS / VARIABLES ========== */
function durations() external view returns (uint expiryDuration, uint maxTimeToMaturity);
function capitalRequirement() external view returns (uint);
function marketCreationEnabled() external view returns (bool);
function onlyAMMMintingAndBurning() external view returns (bool);
function transformCollateral(uint value) external view returns (uint);
function reverseTransformCollateral(uint value) external view returns (uint);
function totalDeposited() external view returns (uint);
function numActiveMarkets() external view returns (uint);
function activeMarkets(uint index, uint pageSize) external view returns (address[] memory);
function numMaturedMarkets() external view returns (uint);
function maturedMarkets(uint index, uint pageSize) external view returns (address[] memory);
function isActiveMarket(address candidate) external view returns (bool);
function isKnownMarket(address candidate) external view returns (bool);
function getThalesAMM() external view returns (address);
/* ========== MUTATIVE FUNCTIONS ========== */
function createMarket(
bytes32 oracleKey,
uint strikePrice,
uint maturity,
uint initialMint // initial sUSD to mint options for,
) external returns (IPositionalMarket);
function resolveMarket(address market) external;
function expireMarkets(address[] calldata market) external;
function transferSusdTo(
address sender,
address receiver,
uint amount
) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.16;
import "./IPositionalMarket.sol";
interface IPosition {
/* ========== VIEWS / VARIABLES ========== */
function getBalanceOf(address account) external view returns (uint);
function getTotalSupply() external view returns (uint);
function exerciseWithAmount(address claimant, uint amount) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.16;
interface IPriceFeed {
// Structs
struct RateAndUpdatedTime {
uint216 rate;
uint40 time;
}
// Mutative functions
function addAggregator(bytes32 currencyKey, address aggregatorAddress) external;
function removeAggregator(bytes32 currencyKey) external;
// Views
function rateForCurrency(bytes32 currencyKey) external view returns (uint);
function rateAndUpdatedTime(bytes32 currencyKey) external view returns (uint rate, uint time);
function getRates() external view returns (uint[] memory);
function getCurrencies() external view returns (bytes32[] memory);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.16;
import "../interfaces/IPositionalMarketManager.sol";
import "../interfaces/IPosition.sol";
import "../interfaces/IPriceFeed.sol";
interface IPositionalMarket {
/* ========== TYPES ========== */
enum Phase {
Trading,
Maturity,
Expiry
}
enum Side {
Up,
Down
}
/* ========== VIEWS / VARIABLES ========== */
function getOptions() external view returns (IPosition up, IPosition down);
function times() external view returns (uint maturity, uint destructino);
function getOracleDetails()
external
view
returns (
bytes32 key,
uint strikePrice,
uint finalPrice
);
function fees() external view returns (uint poolFee, uint creatorFee);
function deposited() external view returns (uint);
function creator() external view returns (address);
function resolved() external view returns (bool);
function phase() external view returns (Phase);
function oraclePrice() external view returns (uint);
function oraclePriceAndTimestamp() external view returns (uint price, uint updatedAt);
function canResolve() external view returns (bool);
function result() external view returns (Side);
function balancesOf(address account) external view returns (uint up, uint down);
function totalSupplies() external view returns (uint up, uint down);
function getMaximumBurnable(address account) external view returns (uint amount);
/* ========== MUTATIVE FUNCTIONS ========== */
function mint(uint value) external;
function exerciseOptions() external returns (uint);
function burnOptions(uint amount) external;
function burnOptionsMaximum() external;
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_main","type":"address"},{"indexed":false,"internalType":"address","name":"_child","type":"address"},{"indexed":false,"internalType":"bytes32","name":"_gameId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"_playerId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"_playerName","type":"string"},{"indexed":false,"internalType":"uint16","name":"_line","type":"uint16"},{"indexed":false,"internalType":"uint8","name":"_option","type":"uint8"},{"indexed":false,"internalType":"uint256[]","name":"_normalizedOdds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"_type","type":"uint256"}],"name":"CreatePlayerPropsMarket","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_main","type":"address"},{"indexed":false,"internalType":"bytes32","name":"_gameId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"_playerId","type":"bytes32"},{"indexed":false,"internalType":"uint8","name":"option","type":"uint8"}],"name":"InvalidOddsForMarket","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_consumer","type":"address"},{"indexed":false,"internalType":"address","name":"_verifier","type":"address"},{"indexed":false,"internalType":"address","name":"_sportsManager","type":"address"},{"indexed":false,"internalType":"address","name":"_receiver","type":"address"}],"name":"NewContractAddresses","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isPaused","type":"bool"}],"name":"PauseChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_gameId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"_playerId","type":"bytes32"},{"indexed":false,"internalType":"uint8","name":"_option","type":"uint8"},{"indexed":false,"internalType":"uint256[]","name":"_normalizedOdds","type":"uint256[]"}],"name":"PlayerPropsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_child","type":"address"},{"indexed":false,"internalType":"uint256","name":"_outcome","type":"uint256"},{"indexed":false,"internalType":"address","name":"_main","type":"address"},{"indexed":false,"internalType":"uint16","name":"_score","type":"uint16"}],"name":"ResolveChildMarket","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_sportId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_isSupported","type":"bool"}],"name":"SupportedSportForPlayerPropsAdded","type":"event"},{"inputs":[],"name":"AWAY_WIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CANCELLED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CANCELLED_STATUS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOME_WIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_TAG_NUMBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAG_NUMBER_PLAYERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAG_NUMBER_PLAYER_PROPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"allOptionsPerPlayer","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"cancelMarketFromManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_main","type":"address"}],"name":"cancelPlayerPropsMarketForMain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"childMarketCreated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"childMarketLine","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"childMarketMainMarket","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"childMarketResolved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"consumer","outputs":[{"internalType":"contract ITherundownConsumer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"createFulfilledForPlayerProps","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"currentActiveChildMarketPerPlayerAndOption","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"currentMainMarketForPlayer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"doesSportSupportPlayerProps","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"gameIdPerChildMarket","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_parent","type":"address"},{"internalType":"bytes32","name":"_player","type":"bytes32"},{"internalType":"uint8","name":"_option","type":"uint8"}],"name":"getAllChildMarketsForParentPlayerOption","outputs":[{"internalType":"address[]","name":"_children","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_parents","type":"address[]"}],"name":"getAllChildMarketsForParents","outputs":[{"internalType":"address[]","name":"_children","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_playerIds","type":"bytes32[]"},{"internalType":"string[]","name":"_teamNames","type":"string[]"}],"name":"getAllMainMarketsBasedOnPlayer","outputs":[{"internalType":"address[]","name":"_mainMarkets","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_gameId","type":"bytes32"}],"name":"getAllOptionsWithPlayersForGameId","outputs":[{"internalType":"bytes32[]","name":"_playerIds","type":"bytes32[]"},{"internalType":"uint8[]","name":"_options","type":"uint8[]"},{"internalType":"bool[]","name":"_isResolved","type":"bool[]"},{"internalType":"bool[]","name":"_hasMintsOnChildren","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"getNormalizedOddsForMarket","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_gameId","type":"bytes32"},{"internalType":"bytes32","name":"_playerId","type":"bytes32"},{"internalType":"uint8","name":"_option","type":"uint8"}],"name":"getPlayerPropForOption","outputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"int24","name":"","type":"int24"},{"internalType":"int24","name":"","type":"int24"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"getPlayerPropsDataForMarket","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_consumer","type":"address"},{"internalType":"address","name":"_verifier","type":"address"},{"internalType":"address","name":"_sportsManager","type":"address"},{"internalType":"address","name":"_playerPropsReceiver","type":"address"},{"internalType":"uint256[]","name":"_supportedSportIds","type":"uint256[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"invalidOddsForPlayerProps","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPauseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mainMarketChildMarketIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mainMarketChildMarketPerPlayerAndOptionIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mainMarketPausedPlayerProps","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"mainMarketPlayerOptionLineChildMarket","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"normalizedOddsForMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"normalizedOddsForMarketFulfilled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numberOfChildMarkets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"numberOfChildMarketsPerPlayerAndOption","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"gameId","type":"bytes32"},{"internalType":"bytes32","name":"playerId","type":"bytes32"},{"internalType":"uint8","name":"option","type":"uint8"},{"internalType":"string","name":"playerName","type":"string"},{"internalType":"uint16","name":"line","type":"uint16"},{"internalType":"int24","name":"overOdds","type":"int24"},{"internalType":"int24","name":"underOdds","type":"int24"}],"internalType":"struct IGamesPlayerProps.PlayerProps","name":"_player","type":"tuple"},{"internalType":"uint256","name":"_sportId","type":"uint256"}],"name":"obtainPlayerProps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"optionIdPerChildMarket","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_main","type":"address"},{"internalType":"bool","name":"_flag","type":"bool"},{"internalType":"bool","name":"_invalidOddsMain","type":"bool"},{"internalType":"bool","name":"_circuitBreakerOnMain","type":"bool"}],"name":"pauseAllPlayerPropsMarketForMain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pausedByCircuitBreakerOnMain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pausedByInvalidOddsOnMain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerIdPerChildMarket","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"playerProp","outputs":[{"internalType":"bytes32","name":"gameId","type":"bytes32"},{"internalType":"bytes32","name":"playerId","type":"bytes32"},{"internalType":"uint8","name":"option","type":"uint8"},{"internalType":"string","name":"playerName","type":"string"},{"internalType":"uint16","name":"line","type":"uint16"},{"internalType":"int24","name":"overOdds","type":"int24"},{"internalType":"int24","name":"underOdds","type":"int24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerPropsAddedForMain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"playerPropsReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"playersInAGame","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"playersInAGameFulfilled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"resolveFulfilledForPlayerProps","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"gameId","type":"bytes32"},{"internalType":"bytes32","name":"playerId","type":"bytes32"},{"internalType":"uint8","name":"option","type":"uint8"},{"internalType":"uint16","name":"score","type":"uint16"},{"internalType":"uint8","name":"statusId","type":"uint8"}],"internalType":"struct IGamesPlayerProps.PlayerPropsResolver","name":"_result","type":"tuple"}],"name":"resolvePlayerProps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"resolvedPlayerProps","outputs":[{"internalType":"bytes32","name":"gameId","type":"bytes32"},{"internalType":"bytes32","name":"playerId","type":"bytes32"},{"internalType":"uint8","name":"option","type":"uint8"},{"internalType":"uint16","name":"score","type":"uint16"},{"internalType":"uint8","name":"statusId","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_consumer","type":"address"},{"internalType":"address","name":"_verifier","type":"address"},{"internalType":"address","name":"_sportsManager","type":"address"},{"internalType":"address","name":"_playerPropsReceiver","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sportId","type":"uint256"},{"internalType":"bool","name":"_isSupported","type":"bool"}],"name":"setSupportedSportForPlayerPropsAdded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sportsManager","outputs":[{"internalType":"contract ISportPositionalMarketManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"transferOwnershipAtInit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verifier","outputs":[{"internalType":"contract ITherundownConsumerVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50615325806100206000396000f3fe608060405234801561001057600080fd5b50600436106103d05760003560e01c806379ba5097116101ff578063b4fd72961161011a578063dc8ad5cb116100ad578063faecc97a1161007c578063faecc97a14610b99578063fbf1c75514610ba2578063fd86b32d14610bb5578063ffe1681414610bef57600080fd5b8063dc8ad5cb14610b48578063e4631f8614610b6b578063f05d098214610b7e578063f1d56d9714610b9157600080fd5b8063ceda8e90116100e9578063ceda8e9014610ab7578063d28231bd14610ad7578063d93dbbcb14610afa578063db0d457914610b2857600080fd5b8063b4fd729614610a56578063b811e28014610a6e578063bf989b6e14610a91578063c3b83f5f14610aa457600080fd5b80638bf502a8116101925780639740a60c116101615780639740a60c146109f8578063a73a39d814610a1b578063ae71dcdf14610a3b578063b103feb014610a4357600080fd5b80638bf502a8146109315780638d37d0b2146109575780638da5cb5b146109d657806391b4ded9146109ef57600080fd5b80637e17027f116101ce5780637e17027f146108675780637e6e97ab146108aa578063879cf437146108bd5780638a42af3f146108ee57600080fd5b806379ba5097146108105780637b17f797146108185780637d018f0f1461082b5780637dec0dac1461085457600080fd5b8063343d372f116102ef578063509e2f33116102825780635bac88b0116102515780635bac88b0146107a75780635c975abb146107ba5780635c9ef4a5146107c75780636c35b775146107e757600080fd5b8063509e2f331461073a57806351aa86ed1461074d57806353a47bb7146107815780635938541f1461079457600080fd5b8063420209c2116102be578063420209c21461069f578063447b1d58146106d35780634adf7219146107075780634dbbf3fe1461072757600080fd5b8063343d372f1461063d57806336b74f62146106465780633baff8f1146106595780633cbf9a731461067c57600080fd5b8063186b39f7116103675780632978b568116103365780632978b568146105f75780632b7ac3f31461061a5780632fff70201461062d578063300a02981461063557600080fd5b8063186b39f7146105615780631999b9dc146105865780631afed5cc146105a95780631c8db097146105c057600080fd5b806314bdaa89116103a357806314bdaa89146104e557806314cb6a71146105185780631627540c1461053b57806316c38b3c1461054e57600080fd5b806305c84a54146103d55780630fd59f561461041a57806310063fdc146104a557806313af4035146104d0575b600080fd5b6103e86103e3366004614a3f565b610c23565b6040805161ffff9095168552600293840b60208601529190920b90830152151560608201526080015b60405180910390f35b610473610428366004614a3f565b602160209081526000938452604080852082529284528284209052825290208054600182015460029092015490919060ff8082169161ffff6101008204169163010000009091041685565b60408051958652602086019490945260ff9283169385019390935261ffff16606084015216608082015260a001610411565b6005546104b8906001600160a01b031681565b6040516001600160a01b039091168152602001610411565b6104e36104de3660046144a1565b610d95565b005b6105086104f33660046144a1565b60156020526000908152604090205460ff1681565b6040519015158152602001610411565b6105086105263660046149db565b60086020526000908152604090205460ff1681565b6104e36105493660046144a1565b610ed5565b6104e361055c3660046149a3565b610f2b565b61057461056f366004614a14565b610fa1565b60405160ff9091168152602001610411565b6105996105943660046149db565b610ff0565b6040516104119493929190614ec3565b6105b261232881565b604051908152602001610411565b6105e46105ce3660046144a1565b60176020526000908152604090205461ffff1681565b60405161ffff9091168152602001610411565b6105086106053660046144a1565b601c6020526000908152604090205460ff1681565b6004546104b8906001600160a01b031681565b6105b2600181565b6105b2600281565b6105b261271a81565b6006546104b8906001600160a01b031681565b6105086106673660046144a1565b600d6020526000908152604090205460ff1681565b61050861068a3660046144a1565b60226020526000908152604090205460ff1681565b6105086106ad366004614a3f565b601960209081526000938452604080852082529284528284209052825290205460ff1681565b6104b86106e136600461474b565b600c6020908152600092835260408084209091529082529020546001600160a01b031681565b6105b26107153660046144a1565b60096020526000908152604090205481565b6104e36107353660046144a1565b6115da565b6104e361074836600461462b565b611632565b61050861075b366004614a3f565b601860209081526000938452604080852082529284528284209052825290205460ff1681565b6001546104b8906001600160a01b031681565b6104e36107a23660046144a1565b611700565b6104e36107b5366004614bbc565b611902565b6003546105089060ff1681565b6107da6107d5366004614776565b611e2a565b6040516104119190614e76565b6104b86107f53660046144a1565b6012602052600090815260409020546001600160a01b031681565b6104e361204d565b6104e3610826366004614c9c565b61214a565b6104b86108393660046149db565b6023602052600090815260409020546001600160a01b031681565b6105b26108623660046149f3565b6121ab565b6104b86108753660046146b8565b60116020908152600094855260408086208252938552838520815291845282842090915282529020546001600160a01b031681565b6107da6108b83660046148b8565b6121dc565b6105b26108cb36600461467b565b601060209081526000938452604080852082529284528284209052825290205481565b6104b86108fc366004614706565b600f6020908152600094855260408086208252938552838520815291845282842090915282529020546001600160a01b031681565b61094461093f366004614a3f565b612432565b6040516104119796959493929190615014565b6109a96109653660046144a1565b6001600160a01b039081166000908152601260209081526040808320546009835281842054600a845282852054600b90945291909320549290931693909160ff1690565b604080516001600160a01b03909516855260208501939093529183015260ff166060820152608001610411565b6000546104b8906201000090046001600160a01b031681565b6105b260025481565b610508610a063660046144a1565b601d6020526000908152604090205460ff1681565b6105b2610a293660046144a1565b600a6020526000908152604090205481565b6105b2600081565b6105b2610a5136600461474b565b61251b565b6003546104b89061010090046001600160a01b031681565b610508610a7c3660046144a1565b601b6020526000908152604090205460ff1681565b6104e3610a9f3660046144e0565b612537565b6104e3610ab23660046144a1565b6125e9565b6105b2610ac53660046144a1565b600e6020526000908152604090205481565b610508610ae53660046144a1565b60166020526000908152604090205460ff1681565b610508610b083660046149f3565b601f60209081526000928352604080842090915290825290205460ff1681565b610b3b610b363660046144a1565b612702565b6040516104119190614fa0565b610574610b563660046144a1565b600b6020526000908152604090205460ff1681565b6107da610b7936600461467b565b612713565b6104e3610b8c36600461453b565b612728565b6105b260ff81565b6105b2612af881565b6104e3610bb0366004614b3c565b6128be565b6104b8610bc336600461467b565b60136020908152600093845260408085208252928452828420905282529020546001600160a01b031681565b610508610bfd366004614a3f565b601a60209081526000938452604080852082529284528284209052825290205460ff1681565b6000838152600760209081526040808320858452825280832060ff8086168552908352818420825160e081018452815481526001820154948101949094526002810154909116918301919091526003810180548493849384938493606084019190610c8d90615217565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb990615217565b8015610d065780601f10610cdb57610100808354040283529160200191610d06565b820191906000526020600020905b815481529060010190602001808311610ce957829003601f168201915b50505091835250506004919091015461ffff8116602080840191909152620100008204600290810b810b810b604080860191909152600160281b909304810b810b900b606090930192909252608083015160a084015160c09094015160009c8d5260188452828d209b8d529a8352818c2060ff9a8b168d52909252909920549899909890961695945050505050565b6001600160a01b038116610df05760405162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f7420626520300000000000000060448201526064015b60405180910390fd5b600154600160a01b900460ff1615610e5c5760405162461bcd60e51b815260206004820152602960248201527f416c726561647920696e697469616c697a65642c20757365206e6f6d696e617460448201526832a732bba7bbb732b960b91b6064820152608401610de7565b6001805460ff60a01b1916600160a01b179055600080546001600160a01b03831662010000810262010000600160b01b03199092169190911782556040805192835260208301919091527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91015b60405180910390a150565b610edd612c14565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290602001610eca565b610f33612c14565b60035460ff1615158115151415610f475750565b6003805460ff191682151590811790915560ff1615610f6557426002555b60035460405160ff909116151581527f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec590602001610eca565b50565b602080528260005260406000206020528160005260406000208181548110610fc857600080fd5b906000526020600020906020918282040191900692509250509054906101000a900460ff1681565b600354604051631f138de360e31b81526004810183905260609182918291829160009161010090046001600160a01b03169063f89c6f189060240160206040518083038186803b15801561104357600080fd5b505afa158015611057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107b91906144c4565b90506000805b6000888152601e602052604090205481101561110a576000888152601e602052604081208054839081106110c557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101548b835281805260408084208285529092529120549091506110f4908461517e565b92505080806111029061524c565b915050611081565b50806001600160401b0381111561113157634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561115a578160200160208202803683370190505b509550806001600160401b0381111561118357634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156111ac578160200160208202803683370190505b509450806001600160401b038111156111d557634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156111fe578160200160208202803683370190505b509350806001600160401b0381111561122757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611250578160200160208202803683370190505b5092506000805b6000898152601e60205260409020548110156115cf576000898152601e6020526040812080548390811061129b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101548c8352818052604080842082855283528084208054825181860281018601909352808352929550909290919083018282801561132257602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116112f35790505b5050505050905060005b81518110156115b957600082828151811061135757634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160008f8152601983526040808220888352845280822060ff8085168452945290205490925016156115a657838c87815181106113af57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050808b87815181106113dc57634e487b7160e01b600052603260045260246000fd5b60ff92831660209182029290920181019190915260008f8152601a825260408082208883528352808220858516835290925220548b519116908b908890811061143557634e487b7160e01b600052603260045260246000fd5b911515602092830291909101909101526000611452898684612c8e565b600554604051638d924e7360e01b81529192506000916001600160a01b0390911690638d924e7390611488908590600401614e76565b60006040518083038186803b1580156114a057600080fd5b505afa1580156114b4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114dc9190810190614811565b505050905060008b898151811061150357634e487b7160e01b600052603260045260246000fd5b9115156020928302919091019091015260005b82518110156115955781818151811061153f57634e487b7160e01b600052603260045260246000fd5b6020026020010151156115835760018c8a8151811061156e57634e487b7160e01b600052603260045260246000fd5b91151560209283029190910190910152611595565b8061158d8161524c565b915050611516565b50876115a08161524c565b98505050505b50806115b18161524c565b91505061132c565b50505080806115c79061524c565b915050611257565b505050509193509193565b60035461010090046001600160a01b031633146116295760405162461bcd60e51b815260206004820152600d60248201526c27b7363c9031b7b739bab6b2b960991b6044820152606401610de7565b610f9e81612db0565b60035461010090046001600160a01b031633146116815760405162461bcd60e51b815260206004820152600d60248201526c27b7363c9031b7b739bab6b2b960991b6044820152606401610de7565b6001600160a01b0384166000908152601d602052604090205460ff16156116fa576001600160a01b0384166000908152600d60209081526040808320805460ff1990811688151517909155601b835281842080548216871515179055601c90925290912080549091168215151790556116fa8484612ea4565b50505050565b6005546001600160a01b031633146117495760405162461bcd60e51b815260206004820152600c60248201526b27b7363c9036b0b730b3b2b960a11b6044820152606401610de7565b6001600160a01b038082166000818152601260209081526040808320546009835281842054600a845282852054600b8552838620549290971680865260108552838620888752855283862060ff93841680885290865284872054978752602290955292909420549195939491166118fa576117c686600080612f61565b6002811015611803576000848152601a60209081526040808320868452825280832060ff861684529091529020805460ff191660011790556118d6565b600160005b8281101561189d576001600160a01b038088166000908152600f60209081526040808320898452825280832060ff808a16855290835281842086855283528184205490941680845260229092529091205490911615801561187b5750886001600160a01b0316816001600160a01b031614155b1561188a57600092505061189d565b50806118958161524c565b915050611808565b5080156118d4576000858152601a60209081526040808320878452825280832060ff871684529091529020805460ff191660011790555b505b6001600160a01b0386166000908152602260205260409020805460ff191660011790555b505050505050565b6006546001600160a01b0316331461194d5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b6044820152606401610de7565b6003548251604051631f138de360e31b8152600481019190915260009161010090046001600160a01b03169063f89c6f189060240160206040518083038186803b15801561199a57600080fd5b505afa1580156119ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d291906144c4565b90506001600160a01b038116158015906119fa575060008281526008602052604090205460ff165b15611e2557611a088361302e565b15611d80578251600090815260186020908152604080832082870151845282528083208187015160ff90811685529252909120541680611a6057506001600160a01b0381166000908152601b602052604090205460ff165b80611a8357506001600160a01b0381166000908152601c602052604090205460ff165b15611ae8578251600090815260186020908152604080832082870151845282528083208187015160ff1684528252808320805460ff199081169091556001600160a01b0385168452601b8352818420805482169055601c909252909120805490911690555b8251600090815260076020908152604080832082870180518552908352818420828801805160ff9081168752918552929094208751815590516001820155905160028201805460ff1916919094161790925560608501518051869392611b559260038501929101906141b2565b5060808201516004909101805460a084015160c090940151600290810b62ffffff908116600160281b0267ffffff0000000000199690920b16620100000264ffffffffff1990921661ffff9094169390931717929092161790556000611bbb84836130d6565b6001600160a01b0383166000908152600d60209081526040808320805460ff19908116909155601d83528184208054909116600117905587518352601f825280832088830151845290915290205490915060ff16611c615783516000908152601f6020908152604080832082880180518552908352818420805460ff1916600190811790915588518552601e845291842090518154928301825590845291909220909101555b8351600090815260196020908152604080832082880151845282528083208188015160ff908116855292529091205416611d1a578351600090815260196020908152604080832082880180518552908352818420828901805160ff9081168752918552838620805460ff191660019081179091558a51875285805284872093518752928552928520925183549283018455928552938390209281049092018054918416601f9093166101000a9283029290930219161790555b83516020808601516040808801516001600160a01b038616600090815260149094529281902090517fc61be96f161d85045cec8df9adaf89ad271f38b3ad65ffd65003c4af0eb1278494611d72949093929091614fb3565b60405180910390a150505050565b8251600090815260186020908152604080832082870151845282528083208187015160ff1684529091529020805460ff19166001908117909155611dc590849061343c565b50825160208085015160408087015181516001600160a01b03871681529384019490945282015260ff90911660608201527fb01bde7f1f22703d0c6d3f5cd2c574f64158d9ed6dd21cb3d83f08174898b978906080015b60405180910390a15b505050565b60606000805b8351811015611ea557600e6000858381518110611e5d57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205482611e91919061517e565b915080611e9d8161524c565b915050611e30565b50806001600160401b03811115611ecc57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611ef5578160200160208202803683370190505b5091506000805b8451811015612045576000600e6000878481518110611f2b57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054905060005b81811015612030576000600c6000898681518110611f8757634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600083815260200190815260200160002060009054906101000a90046001600160a01b0316905080878681518110611ff757634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152846120198161524c565b9550505080806120289061524c565b915050611f59565b5050808061203d9061524c565b915050611efc565b505050919050565b6001546001600160a01b031633146120c55760405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527402063616e20616363657074206f776e65727368697605c1b6064820152608401610de7565b60005460015460408051620100009093046001600160a01b03908116845290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600180546000805462010000600160b01b0319166001600160a01b03831662010000021790556001600160a01b0319169055565b612152612c14565b600082815260086020908152604091829020805460ff19168415159081179091558251858152918201527f929eaf016075fe0cd58ebe9e1c169deb9e2591960438ff5a324740440a150db1910160405180910390a15050565b601e60205281600052604060002081815481106121c757600080fd5b90600052602060002001600091509150505481565b606082516001600160401b0381111561220557634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561222e578160200160208202803683370190505b50905060005b835181101561242b5760006023600086848151811061226357634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518252810191909152604001600020546001600160a01b0316905061229281613561565b8383815181106122b257634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505060006001600160a01b03168383815181106122fd57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316141561241857600360019054906101000a90046001600160a01b03166001600160a01b031663e48ef05c85848151811061235857634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b815260040161237c91906150c9565b60206040518083038186803b15801561239457600080fd5b505afa1580156123a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cc91906144c4565b90506123d781613561565b8383815181106123f757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b50806124238161524c565b915050612234565b5092915050565b600760209081526000938452604080852082529284528284209052825290208054600182015460028301546003840180549394929360ff909216929161247790615217565b80601f01602080910402602001604051908101604052809291908181526020018280546124a390615217565b80156124f05780601f106124c5576101008083540402835291602001916124f0565b820191906000526020600020905b8154815290600101906020018083116124d357829003601f168201915b5050506004909301549192505061ffff811690620100008104600290810b91600160281b9004900b87565b601460205281600052604060002081815481106121c757600080fd5b61253f612c14565b60038054610100600160a81b0319166101006001600160a01b0387811691820292909217909255600480546001600160a01b0319908116878416908117909255600580548216878516908117909155600680549092169386169384179091556040805194855260208501929092529083015260608201527fa2cad6ae2699ea86ba233a96ca0e57d895983eeed04f6bd0a770187c58b820dd9060800160405180910390a150505050565b6125f1612c14565b6001600160a01b0381166126395760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610de7565b600154600160a81b900460ff16156126895760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481d1c985b9cd9995c9c9959606a1b6044820152606401610de7565b600080546001600160a01b038381166201000081810262010000600160b01b031990941693909317938490556001805460ff60a81b1916600160a81b1790556040805193909404909116825260208201527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9101610eca565b606061270d82613675565b92915050565b6060612720848484612c8e565b949350505050565b600054610100900460ff166127435760005460ff1615612747565b303b155b6127aa5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610de7565b600054610100900460ff161580156127cc576000805461ffff19166101011790555b6127d587610d95565b60038054610100600160a81b0319166101006001600160a01b038981169190910291909117909155600480546001600160a01b0319908116888416179091556005805482168784161790556006805490911691851691909117905560005b82518110156128a25760016008600085848151811061286257634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550808061289a9061524c565b915050612833565b5080156128b5576000805461ff00191690555b50505050505050565b6006546001600160a01b031633146129095760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b6044820152606401610de7565b6003548151604051631f138de360e31b8152600481019190915260009161010090046001600160a01b03169063f89c6f189060240160206040518083038186803b15801561295657600080fd5b505afa15801561296a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298e91906144c4565b6001600160a01b038116600090815260106020908152604080832086830180518552908352818420878301805160ff90811687529185528386205489518752601a865284872093518752928552838620905182168652909352922054929350909116611e255760005b81811015612b5b576001600160a01b038084166000908152600f6020908152604080832088830151845282528083208882015160ff9081168552908352818420868552835281842054909416808452602290925290912054909116612b48578451600090815260186020908152604080832082890151845282528083208189015160ff90811685529252909120541615612af55760035460405163ed5e00eb60e01b81526101009091046001600160a01b03169063ed5e00eb90612ac2908490600090600401614e5b565b600060405180830381600087803b158015612adc57600080fd5b505af1158015612af0573d6000803e3d6000fd5b505050505b60ff856080015160ff161415612b1657612b1181600080612f61565b612b24565b612b2481866060015161370f565b6001600160a01b0381166000908152602260205260409020805460ff191660011790555b5080612b538161524c565b9150506129f7565b508251600090815260216020908152604080832082870180518552908352818420828801805160ff90811687529185528386208951808255845160018084019190915583516002909301805460608e015160808f0151881663010000000263ff0000001961ffff9092166101000262ffffff19909316968916969096179190911716939093179092558752601a86528487209351875292855283862090519091168552909252909120805460ff19169091179055505050565b6000546201000090046001600160a01b03163314612c8c5760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b6064820152608401610de7565b565b6001600160a01b0383166000908152601060209081526040808320858452825280832060ff85168452909152902054606090806001600160401b03811115612ce657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612d0f578160200160208202803683370190505b50915060005b81811015612da7576001600160a01b038087166000908152600f60209081526040808320898452825280832060ff89168452825280832085845290915290205484519116908190859084908110612d7c57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101525080612d9f8161524c565b915050612d15565b50509392505050565b60005b6001600160a01b0382166000908152600e6020526040902054811015612ea0576001600160a01b038083166000908152600c60209081526040808320858452825280832054909316825260229052205460ff16612e8e576005546001600160a01b038381166000908152600c6020908152604080832086845290915280822054905163b91f5e3560e01b81529083166004820152602481019190915291169063b91f5e3590604401600060405180830381600087803b158015612e7557600080fd5b505af1158015612e89573d6000803e3d6000fd5b505050505b80612e988161524c565b915050612db3565b5050565b60005b6001600160a01b0383166000908152600e6020526040902054811015611e25576003546001600160a01b038481166000908152600c602090815260408083208684529091529081902054905163ed5e00eb60e01b815261010090930482169263ed5e00eb92612f1c9216908690600401614e5b565b600060405180830381600087803b158015612f3657600080fd5b505af1158015612f4a573d6000803e3d6000fd5b505050508080612f599061524c565b915050612ea7565b60055460405163b91f5e3560e01b81526001600160a01b038581166004830152602482018490529091169063b91f5e3590604401600060405180830381600087803b158015612faf57600080fd5b505af1158015612fc3573d6000803e3d6000fd5b505050506001600160a01b038381166000818152601260209081526040918290205482519384529083018590529092169181019190915261ffff831660608201527f7b72264d363f766973a07f09021df5169917b274b948b57fb5028ecc3cc9b5cd90608001611e1c565b60048054608083015160a084015160c0850151604051631743f79b60e21b815261ffff90931694830194909452600290810b60248301529290920b60448301526000916001600160a01b0390911690635d0fde6c9060640160206040518083038186803b15801561309e57600080fd5b505afa1580156130b2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270d91906149bf565b6001600160a01b038082166000818152600e60209081526040808320546013835281842088840180518652908452828520898401805160ff908116885291865284872054978752601186528487209251875291855283862091511685528352818420608089015161ffff168552909252822054919390159281169116828061316557506001600160a01b038116155b156132545760006131768787613779565b6001600160a01b0387811660009081526013602090815260408083208c830151845282528083208c82015160ff168452909152902080546001600160a01b0319168383161790559091508316156132315760035460405163ed5e00eb60e01b81526101009091046001600160a01b03169063ed5e00eb906131fe908690600190600401614e5b565b600060405180830381600087803b15801561321857600080fd5b505af115801561322c573d6000803e3d6000fd5b505050505b61324981886000015189602001518a60400151613a84565b935061270d92505050565b816001600160a01b0316816001600160a01b0316146133a85760035460405163ed5e00eb60e01b81526101009091046001600160a01b03169063ed5e00eb906132a4908490600090600401614e5b565b600060405180830381600087803b1580156132be57600080fd5b505af11580156132d2573d6000803e3d6000fd5b505060035460405163ed5e00eb60e01b81526101009091046001600160a01b0316925063ed5e00eb915061330d908590600190600401614e5b565b600060405180830381600087803b15801561332757600080fd5b505af115801561333b573d6000803e3d6000fd5b505050506001600160a01b0385811660009081526013602090815260408083208a8301805185529083528184208b8301805160ff1686529352922080546001600160a01b0319169385169390931790925587519051915161339e92849291613a84565b925061270d915050565b60035460405163ed5e00eb60e01b81526101009091046001600160a01b03169063ed5e00eb906133df908590600090600401614e5b565b600060405180830381600087803b1580156133f957600080fd5b505af115801561340d573d6000803e3d6000fd5b5050505061342982876000015188602001518960400151613a84565b50915061270d9050565b50505092915050565b6003548251604051631f138de360e31b8152600481019190915260009182916101009091046001600160a01b03169063f89c6f189060240160206040518083038186803b15801561348c57600080fd5b505afa1580156134a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c491906144c4565b6001600160a01b038116600090815260106020908152604080832088830151845282528083208882015160ff1684529091528120549192505b81811015613433576001600160a01b038084166000908152600f602090815260408083208a830151845282528083208a82015160ff16845282528083208584529091529020541661354e8187613ae6565b50806135598161524c565b9150506134fd565b60006001600160a01b03821615613670576000826001600160a01b0316639e3b34bf6040518163ffffffff1660e01b8152600401604080518083038186803b1580156135ac57600080fd5b505afa1580156135c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135e49190614ccb565b5090504281101580156136655750826001600160a01b0316633f6fa6556040518163ffffffff1660e01b815260040160206040518083038186803b15801561362b57600080fd5b505afa15801561363f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366391906149bf565b155b1561366e578291505b505b919050565b6001600160a01b03811660009081526015602052604090205460609060ff166136a6576136a182613b4a565b61270d565b6001600160a01b0382166000908152601460209081526040918290208054835181840281018401909452808452909183018282801561370457602002820191906000526020600020905b8154815260200190600101908083116136f0575b505050505092915050565b6001600160a01b03821660009081526017602052604081205461ffff1690816137398460646151aa565b61ffff16116137695761ffff82166137528460646151aa565b61ffff161061376257600061376c565b600261376c565b60015b90506116fa848483612f61565b6003548251604051631c2ab73160e21b81526004810191909152600091829161380e9161010090046001600160a01b0316906370aadcc49060240160206040518083038186803b1580156137cc57600080fd5b505afa1580156137e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138049190614c84565b8560400151613b87565b60055485519192506001600160a01b031690634cde32ce9061382f87613c57565b600354885160405163c48e62f160e01b815260048101919091526101009091046001600160a01b03169063c48e62f19060240160006040518083038186803b15801561387a57600080fd5b505afa15801561388e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138b69190810190614a6a565b60200151600060028760018b6040518963ffffffff1660e01b81526004016138e5989796959493929190615063565b602060405180830381600087803b1580156138ff57600080fd5b505af1158015613913573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061393791906144c4565b5060055460408051622610c560e41b815290516001600160a01b039092169163dd5adfa39160019184916302610c50916004808301926020929190829003018186803b15801561398657600080fd5b505afa15801561399a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139be9190614c84565b6139c891906151d4565b6040518263ffffffff1660e01b81526004016139e691815260200190565b60206040518083038186803b1580156139fe57600080fd5b505afa158015613a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3691906144c4565b915061242b846000015184848760800151886020015189606001518a6040015188600281518110613a7757634e487b7160e01b600052603260045260246000fd5b6020026020010151613ca7565b613a8f838383613f22565b6001600160a01b03851660009081526014602090815260409091208251613abc9391929190910190614236565b5050506001600160a01b039091166000908152601560205260409020805460ff1916600117905550565b60035460405163ed5e00eb60e01b81526101009091046001600160a01b03169063ed5e00eb90613b1c9085908590600401614e5b565b600060405180830381600087803b158015613b3657600080fd5b505af11580156118fa573d6000803e3d6000fd5b6001600160a01b038116600090815260096020908152604080832054600a835281842054600b90935292205460609261270d92909160ff16613f22565b6040805160038082526080820190925260609160009190602082018480368337019050509050613bb98461232861517e565b81600081518110613bda57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505061271a81600181518110613c0a57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152613c2460ff8416612af861517e565b81600281518110613c4557634e487b7160e01b600052603260045260246000fd5b60209081029190910101529392505050565b60608160600151613c6e836040015160ff16614099565b613c7f846080015161ffff16614099565b604051602001613c9193929190614d85565b6040516020818303038152906040529050919050565b600354604051624dc46d60e41b8152600481018a90526001600160a01b038881166024830152610100909204909116906304dc46d090604401600060405180830381600087803b158015613cfa57600080fd5b505af1158015613d0e573d6000803e3d6000fd5b505050506001600160a01b0386811660008181526009602090815260408083208d9055600a8252808320899055888352602382528083208054958d166001600160a01b03199687168117909155848452600b8352818420805460ff8a1660ff19918216179091556016845282852080549091166001908117909155601284528285208054881683179055818552600c8452828520600e808652848720805488529186529386208054909816909617909655835290528154613dd090849061517e565b90915550506001600160a01b038088166000818152601160209081526040808320898452825280832060ff881680855290835281842061ffff8c168086529084528285208054978e166001600160a01b0319988916811790915580865260178552838620805461ffff1916909217909155858552601384528285208b8652845282852082865284528285208054881682179055858552600f84528285208b865284528285208286528452828520958552601084528285208b865284528285208286528085528386208054875296855292852080549097161790955593825292909252805460019290613ec390849061517e565b909155507fad561eb279f0551643e940bd69a05112c9f5e19962eae3312d6490409e19410e905087878a87878a88613efa86613675565b89604051613f1099989796959493929190614de1565b60405180910390a15050505050505050565b604080516002808252606080830184529260009291906020830190803683375050506000868152600760209081526040808320888452825280832060ff881684529091528120600401548251929350620100009004600290810b900b91839190613f9c57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101919091526000868152600782526040808220878352835280822060ff8716835290925220600401548151600160281b909104600290810b900b908290600190811061400257634e487b7160e01b600052603260045260246000fd5b602090810291909101015260048054604051632c85b65d60e21b81526001600160a01b039091169163b216d9749161403c91859101614f68565b60006040518083038186803b15801561405457600080fd5b505afa158015614068573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526140909190810190614971565b95945050505050565b6060816140bd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156140e757806140d18161524c565b91506140e09050600a83615196565b91506140c1565b6000816001600160401b0381111561410f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614139576020820181803683370190505b5090505b84156127205761414e6001836151d4565b915061415b600a86615267565b61416690603061517e565b60f81b81838151811061418957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506141ab600a86615196565b945061413d565b8280546141be90615217565b90600052602060002090601f0160209004810192826141e05760008555614226565b82601f106141f957805160ff1916838001178555614226565b82800160010185558215614226579182015b8281111561422657825182559160200191906001019061420b565b50614232929150614270565b5090565b828054828255906000526020600020908101928215614226579160200282018281111561422657825182559160200191906001019061420b565b5b808211156142325760008155600101614271565b600082601f830112614295578081fd5b815160206142aa6142a583615134565b615104565b80838252828201915082860187848660051b89010111156142c9578586fd5b855b858110156142f05781516142de816152d2565b845292840192908401906001016142cb565b5090979650505050505050565b600082601f83011261430d578081fd5b8135602061431d6142a583615134565b80838252828201915082860187848660051b890101111561433c578586fd5b855b858110156142f05781356001600160401b0381111561435b578788fd5b6143698a87838c01016143ef565b855250928401929084019060010161433e565b600082601f83011261438c578081fd5b8151602061439c6142a583615134565b80838252828201915082860187848660051b89010111156143bb578586fd5b855b858110156142f0578151845292840192908401906001016143bd565b8035613670816152e0565b8051613670816152e0565b600082601f8301126143ff578081fd5b813561440d6142a582615157565b818152846020838601011115614421578283fd5b816020850160208301379081016020019190915292915050565b600082601f83011261444b578081fd5b81516144596142a582615157565b81815284602083860101111561446d578283fd5b6127208260208301602087016151eb565b803561ffff8116811461367057600080fd5b803560ff8116811461367057600080fd5b6000602082840312156144b2578081fd5b81356144bd816152bd565b9392505050565b6000602082840312156144d5578081fd5b81516144bd816152bd565b600080600080608085870312156144f5578283fd5b8435614500816152bd565b93506020850135614510816152bd565b92506040850135614520816152bd565b91506060850135614530816152bd565b939692955090935050565b60008060008060008060c08789031215614553578384fd5b863561455e816152bd565b955060208781013561456f816152bd565b9550604088013561457f816152bd565b9450606088013561458f816152bd565b9350608088013561459f816152bd565b925060a08801356001600160401b038111156145b9578283fd5b8801601f81018a136145c9578283fd5b80356145d76142a582615134565b8082825284820191508484018d868560051b87010111156145f6578687fd5b8694505b838510156146185780358352600194909401939185019185016145fa565b5080955050505050509295509295509295565b60008060008060808587031215614640578182fd5b843561464b816152bd565b9350602085013561465b816152d2565b9250604085013561466b816152d2565b91506060850135614530816152d2565b60008060006060848603121561468f578081fd5b833561469a816152bd565b9250602084013591506146af60408501614490565b90509250925092565b600080600080608085870312156146cd578182fd5b84356146d8816152bd565b9350602085013592506146ed60408601614490565b91506146fb6060860161447e565b905092959194509250565b6000806000806080858703121561471b578182fd5b8435614726816152bd565b93506020850135925061473b60408601614490565b9396929550929360600135925050565b6000806040838503121561475d578182fd5b8235614768816152bd565b946020939093013593505050565b60006020808385031215614788578182fd5b82356001600160401b0381111561479d578283fd5b8301601f810185136147ad578283fd5b80356147bb6142a582615134565b80828252848201915084840188868560051b87010111156147da578687fd5b8694505b838510156148055780356147f1816152bd565b8352600194909401939185019185016147de565b50979650505050505050565b60008060008060808587031215614826578182fd5b84516001600160401b038082111561483c578384fd5b61484888838901614285565b9550602087015191508082111561485d578384fd5b61486988838901614285565b9450604087015191508082111561487e578384fd5b61488a88838901614285565b9350606087015191508082111561489f578283fd5b506148ac8782880161437c565b91505092959194509250565b600080604083850312156148ca578182fd5b82356001600160401b03808211156148e0578384fd5b818501915085601f8301126148f3578384fd5b813560206149036142a583615134565b8083825282820191508286018a848660051b8901011115614922578889fd5b8896505b84871015614944578035835260019690960195918301918301614926565b509650508601359250508082111561495a578283fd5b50614967858286016142fd565b9150509250929050565b600060208284031215614982578081fd5b81516001600160401b03811115614997578182fd5b6127208482850161437c565b6000602082840312156149b4578081fd5b81356144bd816152d2565b6000602082840312156149d0578081fd5b81516144bd816152d2565b6000602082840312156149ec578081fd5b5035919050565b60008060408385031215614a05578182fd5b50508035926020909101359150565b600080600060608486031215614a28578081fd5b505081359360208301359350604090920135919050565b600080600060608486031215614a53578081fd5b83359250602084013591506146af60408501614490565b600060208284031215614a7b578081fd5b81516001600160401b0380821115614a91578283fd5b9083019060e08286031215614aa4578283fd5b614aac6150dc565b8251815260208301516020820152614ac6604084016143e4565b6040820152614ad7606084016143e4565b6060820152614ae8608084016143e4565b608082015260a083015182811115614afe578485fd5b614b0a8782860161443b565b60a08301525060c083015182811115614b21578485fd5b614b2d8782860161443b565b60c08301525095945050505050565b600060a08284031215614b4d578081fd5b60405160a081018181106001600160401b0382111715614b6f57614b6f6152a7565b80604052508235815260208301356020820152614b8e60408401614490565b6040820152614b9f6060840161447e565b6060820152614bb060808401614490565b60808201529392505050565b60008060408385031215614bce578182fd5b82356001600160401b0380821115614be4578384fd5b9084019060e08287031215614bf7578384fd5b614bff6150dc565b8235815260208301356020820152614c1960408401614490565b6040820152606083013582811115614c2f578586fd5b614c3b888286016143ef565b606083015250614c4d6080840161447e565b6080820152614c5e60a084016143d9565b60a0820152614c6f60c084016143d9565b60c08201529660209590950135955050505050565b600060208284031215614c95578081fd5b5051919050565b60008060408385031215614cae578182fd5b823591506020830135614cc0816152d2565b809150509250929050565b60008060408385031215614cdd578182fd5b505080516020909101519092909150565b6000815180845260208085019450808401835b83811015614d1f578151151587529582019590820190600101614d01565b509495945050505050565b6000815180845260208085019450808401835b83811015614d1f57815187529582019590820190600101614d3d565b60008151808452614d718160208601602086016151eb565b601f01601f19169290920160200192915050565b60008451614d978184602089016151eb565b80830190506201016960ed1b8082528551614db9816003850160208a016151eb565b60039201918201528351614dd48160068401602088016151eb565b0160060195945050505050565b6001600160a01b038a8116825289166020820152604081018890526060810187905261012060808201819052600090614e1c83820189614d59565b905061ffff871660a084015260ff861660c084015282810360e0840152614e438186614d2a565b915050826101008301529a9950505050505050505050565b6001600160a01b039290921682521515602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015614eb75783516001600160a01b031683529284019291840191600101614e92565b50909695505050505050565b6080808252855190820181905260009060209060a0840190828901845b82811015614efc57815184529284019290840190600101614ee0565b50505083810382850152865180825287830191830190845b81811015614f3357835160ff1683529284019291840191600101614f14565b50508481036040860152614f478188614cee565b925050508281036060840152614f5d8185614cee565b979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614eb757835183529284019291840191600101614f84565b6020815260006144bd6020830184614d2a565b6000608082018683526020868185015260ff861660408501526080606085015281855480845260a0860191508685528285209350845b8181101561500557845483526001948501949284019201614fe9565b50909998505050505050505050565b87815286602082015260ff8616604082015260e06060820152600061503c60e0830187614d59565b61ffff95909516608083015250600292830b60a0820152910b60c090910152949350505050565b60006101008a835280602084015261507d8184018b614d59565b905088604084015287606084015286608084015282810360a08401526150a38187614d2a565b94151560c084015250506001600160a01b039190911660e0909101529695505050505050565b6020815260006144bd6020830184614d59565b60405160e081016001600160401b03811182821017156150fe576150fe6152a7565b60405290565b604051601f8201601f191681016001600160401b038111828210171561512c5761512c6152a7565b604052919050565b60006001600160401b0382111561514d5761514d6152a7565b5060051b60200190565b60006001600160401b03821115615170576151706152a7565b50601f01601f191660200190565b600082198211156151915761519161527b565b500190565b6000826151a5576151a5615291565b500490565b600061ffff808316818516818304811182151516156151cb576151cb61527b565b02949350505050565b6000828210156151e6576151e661527b565b500390565b60005b838110156152065781810151838201526020016151ee565b838111156116fa5750506000910152565b600181811c9082168061522b57607f821691505b6020821081141561366e57634e487b7160e01b600052602260045260246000fd5b60006000198214156152605761526061527b565b5060010190565b60008261527657615276615291565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f9e57600080fd5b8015158114610f9e57600080fd5b8060020b8114610f9e57600080fdfea264697066735822122068e095793283b44955aa3b1ec39595050b872218c82041903f08e01a82c974a264736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103d05760003560e01c806379ba5097116101ff578063b4fd72961161011a578063dc8ad5cb116100ad578063faecc97a1161007c578063faecc97a14610b99578063fbf1c75514610ba2578063fd86b32d14610bb5578063ffe1681414610bef57600080fd5b8063dc8ad5cb14610b48578063e4631f8614610b6b578063f05d098214610b7e578063f1d56d9714610b9157600080fd5b8063ceda8e90116100e9578063ceda8e9014610ab7578063d28231bd14610ad7578063d93dbbcb14610afa578063db0d457914610b2857600080fd5b8063b4fd729614610a56578063b811e28014610a6e578063bf989b6e14610a91578063c3b83f5f14610aa457600080fd5b80638bf502a8116101925780639740a60c116101615780639740a60c146109f8578063a73a39d814610a1b578063ae71dcdf14610a3b578063b103feb014610a4357600080fd5b80638bf502a8146109315780638d37d0b2146109575780638da5cb5b146109d657806391b4ded9146109ef57600080fd5b80637e17027f116101ce5780637e17027f146108675780637e6e97ab146108aa578063879cf437146108bd5780638a42af3f146108ee57600080fd5b806379ba5097146108105780637b17f797146108185780637d018f0f1461082b5780637dec0dac1461085457600080fd5b8063343d372f116102ef578063509e2f33116102825780635bac88b0116102515780635bac88b0146107a75780635c975abb146107ba5780635c9ef4a5146107c75780636c35b775146107e757600080fd5b8063509e2f331461073a57806351aa86ed1461074d57806353a47bb7146107815780635938541f1461079457600080fd5b8063420209c2116102be578063420209c21461069f578063447b1d58146106d35780634adf7219146107075780634dbbf3fe1461072757600080fd5b8063343d372f1461063d57806336b74f62146106465780633baff8f1146106595780633cbf9a731461067c57600080fd5b8063186b39f7116103675780632978b568116103365780632978b568146105f75780632b7ac3f31461061a5780632fff70201461062d578063300a02981461063557600080fd5b8063186b39f7146105615780631999b9dc146105865780631afed5cc146105a95780631c8db097146105c057600080fd5b806314bdaa89116103a357806314bdaa89146104e557806314cb6a71146105185780631627540c1461053b57806316c38b3c1461054e57600080fd5b806305c84a54146103d55780630fd59f561461041a57806310063fdc146104a557806313af4035146104d0575b600080fd5b6103e86103e3366004614a3f565b610c23565b6040805161ffff9095168552600293840b60208601529190920b90830152151560608201526080015b60405180910390f35b610473610428366004614a3f565b602160209081526000938452604080852082529284528284209052825290208054600182015460029092015490919060ff8082169161ffff6101008204169163010000009091041685565b60408051958652602086019490945260ff9283169385019390935261ffff16606084015216608082015260a001610411565b6005546104b8906001600160a01b031681565b6040516001600160a01b039091168152602001610411565b6104e36104de3660046144a1565b610d95565b005b6105086104f33660046144a1565b60156020526000908152604090205460ff1681565b6040519015158152602001610411565b6105086105263660046149db565b60086020526000908152604090205460ff1681565b6104e36105493660046144a1565b610ed5565b6104e361055c3660046149a3565b610f2b565b61057461056f366004614a14565b610fa1565b60405160ff9091168152602001610411565b6105996105943660046149db565b610ff0565b6040516104119493929190614ec3565b6105b261232881565b604051908152602001610411565b6105e46105ce3660046144a1565b60176020526000908152604090205461ffff1681565b60405161ffff9091168152602001610411565b6105086106053660046144a1565b601c6020526000908152604090205460ff1681565b6004546104b8906001600160a01b031681565b6105b2600181565b6105b2600281565b6105b261271a81565b6006546104b8906001600160a01b031681565b6105086106673660046144a1565b600d6020526000908152604090205460ff1681565b61050861068a3660046144a1565b60226020526000908152604090205460ff1681565b6105086106ad366004614a3f565b601960209081526000938452604080852082529284528284209052825290205460ff1681565b6104b86106e136600461474b565b600c6020908152600092835260408084209091529082529020546001600160a01b031681565b6105b26107153660046144a1565b60096020526000908152604090205481565b6104e36107353660046144a1565b6115da565b6104e361074836600461462b565b611632565b61050861075b366004614a3f565b601860209081526000938452604080852082529284528284209052825290205460ff1681565b6001546104b8906001600160a01b031681565b6104e36107a23660046144a1565b611700565b6104e36107b5366004614bbc565b611902565b6003546105089060ff1681565b6107da6107d5366004614776565b611e2a565b6040516104119190614e76565b6104b86107f53660046144a1565b6012602052600090815260409020546001600160a01b031681565b6104e361204d565b6104e3610826366004614c9c565b61214a565b6104b86108393660046149db565b6023602052600090815260409020546001600160a01b031681565b6105b26108623660046149f3565b6121ab565b6104b86108753660046146b8565b60116020908152600094855260408086208252938552838520815291845282842090915282529020546001600160a01b031681565b6107da6108b83660046148b8565b6121dc565b6105b26108cb36600461467b565b601060209081526000938452604080852082529284528284209052825290205481565b6104b86108fc366004614706565b600f6020908152600094855260408086208252938552838520815291845282842090915282529020546001600160a01b031681565b61094461093f366004614a3f565b612432565b6040516104119796959493929190615014565b6109a96109653660046144a1565b6001600160a01b039081166000908152601260209081526040808320546009835281842054600a845282852054600b90945291909320549290931693909160ff1690565b604080516001600160a01b03909516855260208501939093529183015260ff166060820152608001610411565b6000546104b8906201000090046001600160a01b031681565b6105b260025481565b610508610a063660046144a1565b601d6020526000908152604090205460ff1681565b6105b2610a293660046144a1565b600a6020526000908152604090205481565b6105b2600081565b6105b2610a5136600461474b565b61251b565b6003546104b89061010090046001600160a01b031681565b610508610a7c3660046144a1565b601b6020526000908152604090205460ff1681565b6104e3610a9f3660046144e0565b612537565b6104e3610ab23660046144a1565b6125e9565b6105b2610ac53660046144a1565b600e6020526000908152604090205481565b610508610ae53660046144a1565b60166020526000908152604090205460ff1681565b610508610b083660046149f3565b601f60209081526000928352604080842090915290825290205460ff1681565b610b3b610b363660046144a1565b612702565b6040516104119190614fa0565b610574610b563660046144a1565b600b6020526000908152604090205460ff1681565b6107da610b7936600461467b565b612713565b6104e3610b8c36600461453b565b612728565b6105b260ff81565b6105b2612af881565b6104e3610bb0366004614b3c565b6128be565b6104b8610bc336600461467b565b60136020908152600093845260408085208252928452828420905282529020546001600160a01b031681565b610508610bfd366004614a3f565b601a60209081526000938452604080852082529284528284209052825290205460ff1681565b6000838152600760209081526040808320858452825280832060ff8086168552908352818420825160e081018452815481526001820154948101949094526002810154909116918301919091526003810180548493849384938493606084019190610c8d90615217565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb990615217565b8015610d065780601f10610cdb57610100808354040283529160200191610d06565b820191906000526020600020905b815481529060010190602001808311610ce957829003601f168201915b50505091835250506004919091015461ffff8116602080840191909152620100008204600290810b810b810b604080860191909152600160281b909304810b810b900b606090930192909252608083015160a084015160c09094015160009c8d5260188452828d209b8d529a8352818c2060ff9a8b168d52909252909920549899909890961695945050505050565b6001600160a01b038116610df05760405162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f7420626520300000000000000060448201526064015b60405180910390fd5b600154600160a01b900460ff1615610e5c5760405162461bcd60e51b815260206004820152602960248201527f416c726561647920696e697469616c697a65642c20757365206e6f6d696e617460448201526832a732bba7bbb732b960b91b6064820152608401610de7565b6001805460ff60a01b1916600160a01b179055600080546001600160a01b03831662010000810262010000600160b01b03199092169190911782556040805192835260208301919091527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91015b60405180910390a150565b610edd612c14565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290602001610eca565b610f33612c14565b60035460ff1615158115151415610f475750565b6003805460ff191682151590811790915560ff1615610f6557426002555b60035460405160ff909116151581527f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec590602001610eca565b50565b602080528260005260406000206020528160005260406000208181548110610fc857600080fd5b906000526020600020906020918282040191900692509250509054906101000a900460ff1681565b600354604051631f138de360e31b81526004810183905260609182918291829160009161010090046001600160a01b03169063f89c6f189060240160206040518083038186803b15801561104357600080fd5b505afa158015611057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107b91906144c4565b90506000805b6000888152601e602052604090205481101561110a576000888152601e602052604081208054839081106110c557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101548b835281805260408084208285529092529120549091506110f4908461517e565b92505080806111029061524c565b915050611081565b50806001600160401b0381111561113157634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561115a578160200160208202803683370190505b509550806001600160401b0381111561118357634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156111ac578160200160208202803683370190505b509450806001600160401b038111156111d557634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156111fe578160200160208202803683370190505b509350806001600160401b0381111561122757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611250578160200160208202803683370190505b5092506000805b6000898152601e60205260409020548110156115cf576000898152601e6020526040812080548390811061129b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101548c8352818052604080842082855283528084208054825181860281018601909352808352929550909290919083018282801561132257602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116112f35790505b5050505050905060005b81518110156115b957600082828151811061135757634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160008f8152601983526040808220888352845280822060ff8085168452945290205490925016156115a657838c87815181106113af57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050808b87815181106113dc57634e487b7160e01b600052603260045260246000fd5b60ff92831660209182029290920181019190915260008f8152601a825260408082208883528352808220858516835290925220548b519116908b908890811061143557634e487b7160e01b600052603260045260246000fd5b911515602092830291909101909101526000611452898684612c8e565b600554604051638d924e7360e01b81529192506000916001600160a01b0390911690638d924e7390611488908590600401614e76565b60006040518083038186803b1580156114a057600080fd5b505afa1580156114b4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114dc9190810190614811565b505050905060008b898151811061150357634e487b7160e01b600052603260045260246000fd5b9115156020928302919091019091015260005b82518110156115955781818151811061153f57634e487b7160e01b600052603260045260246000fd5b6020026020010151156115835760018c8a8151811061156e57634e487b7160e01b600052603260045260246000fd5b91151560209283029190910190910152611595565b8061158d8161524c565b915050611516565b50876115a08161524c565b98505050505b50806115b18161524c565b91505061132c565b50505080806115c79061524c565b915050611257565b505050509193509193565b60035461010090046001600160a01b031633146116295760405162461bcd60e51b815260206004820152600d60248201526c27b7363c9031b7b739bab6b2b960991b6044820152606401610de7565b610f9e81612db0565b60035461010090046001600160a01b031633146116815760405162461bcd60e51b815260206004820152600d60248201526c27b7363c9031b7b739bab6b2b960991b6044820152606401610de7565b6001600160a01b0384166000908152601d602052604090205460ff16156116fa576001600160a01b0384166000908152600d60209081526040808320805460ff1990811688151517909155601b835281842080548216871515179055601c90925290912080549091168215151790556116fa8484612ea4565b50505050565b6005546001600160a01b031633146117495760405162461bcd60e51b815260206004820152600c60248201526b27b7363c9036b0b730b3b2b960a11b6044820152606401610de7565b6001600160a01b038082166000818152601260209081526040808320546009835281842054600a845282852054600b8552838620549290971680865260108552838620888752855283862060ff93841680885290865284872054978752602290955292909420549195939491166118fa576117c686600080612f61565b6002811015611803576000848152601a60209081526040808320868452825280832060ff861684529091529020805460ff191660011790556118d6565b600160005b8281101561189d576001600160a01b038088166000908152600f60209081526040808320898452825280832060ff808a16855290835281842086855283528184205490941680845260229092529091205490911615801561187b5750886001600160a01b0316816001600160a01b031614155b1561188a57600092505061189d565b50806118958161524c565b915050611808565b5080156118d4576000858152601a60209081526040808320878452825280832060ff871684529091529020805460ff191660011790555b505b6001600160a01b0386166000908152602260205260409020805460ff191660011790555b505050505050565b6006546001600160a01b0316331461194d5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b6044820152606401610de7565b6003548251604051631f138de360e31b8152600481019190915260009161010090046001600160a01b03169063f89c6f189060240160206040518083038186803b15801561199a57600080fd5b505afa1580156119ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d291906144c4565b90506001600160a01b038116158015906119fa575060008281526008602052604090205460ff165b15611e2557611a088361302e565b15611d80578251600090815260186020908152604080832082870151845282528083208187015160ff90811685529252909120541680611a6057506001600160a01b0381166000908152601b602052604090205460ff165b80611a8357506001600160a01b0381166000908152601c602052604090205460ff165b15611ae8578251600090815260186020908152604080832082870151845282528083208187015160ff1684528252808320805460ff199081169091556001600160a01b0385168452601b8352818420805482169055601c909252909120805490911690555b8251600090815260076020908152604080832082870180518552908352818420828801805160ff9081168752918552929094208751815590516001820155905160028201805460ff1916919094161790925560608501518051869392611b559260038501929101906141b2565b5060808201516004909101805460a084015160c090940151600290810b62ffffff908116600160281b0267ffffff0000000000199690920b16620100000264ffffffffff1990921661ffff9094169390931717929092161790556000611bbb84836130d6565b6001600160a01b0383166000908152600d60209081526040808320805460ff19908116909155601d83528184208054909116600117905587518352601f825280832088830151845290915290205490915060ff16611c615783516000908152601f6020908152604080832082880180518552908352818420805460ff1916600190811790915588518552601e845291842090518154928301825590845291909220909101555b8351600090815260196020908152604080832082880151845282528083208188015160ff908116855292529091205416611d1a578351600090815260196020908152604080832082880180518552908352818420828901805160ff9081168752918552838620805460ff191660019081179091558a51875285805284872093518752928552928520925183549283018455928552938390209281049092018054918416601f9093166101000a9283029290930219161790555b83516020808601516040808801516001600160a01b038616600090815260149094529281902090517fc61be96f161d85045cec8df9adaf89ad271f38b3ad65ffd65003c4af0eb1278494611d72949093929091614fb3565b60405180910390a150505050565b8251600090815260186020908152604080832082870151845282528083208187015160ff1684529091529020805460ff19166001908117909155611dc590849061343c565b50825160208085015160408087015181516001600160a01b03871681529384019490945282015260ff90911660608201527fb01bde7f1f22703d0c6d3f5cd2c574f64158d9ed6dd21cb3d83f08174898b978906080015b60405180910390a15b505050565b60606000805b8351811015611ea557600e6000858381518110611e5d57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205482611e91919061517e565b915080611e9d8161524c565b915050611e30565b50806001600160401b03811115611ecc57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611ef5578160200160208202803683370190505b5091506000805b8451811015612045576000600e6000878481518110611f2b57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054905060005b81811015612030576000600c6000898681518110611f8757634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600083815260200190815260200160002060009054906101000a90046001600160a01b0316905080878681518110611ff757634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152846120198161524c565b9550505080806120289061524c565b915050611f59565b5050808061203d9061524c565b915050611efc565b505050919050565b6001546001600160a01b031633146120c55760405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527402063616e20616363657074206f776e65727368697605c1b6064820152608401610de7565b60005460015460408051620100009093046001600160a01b03908116845290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600180546000805462010000600160b01b0319166001600160a01b03831662010000021790556001600160a01b0319169055565b612152612c14565b600082815260086020908152604091829020805460ff19168415159081179091558251858152918201527f929eaf016075fe0cd58ebe9e1c169deb9e2591960438ff5a324740440a150db1910160405180910390a15050565b601e60205281600052604060002081815481106121c757600080fd5b90600052602060002001600091509150505481565b606082516001600160401b0381111561220557634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561222e578160200160208202803683370190505b50905060005b835181101561242b5760006023600086848151811061226357634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518252810191909152604001600020546001600160a01b0316905061229281613561565b8383815181106122b257634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505060006001600160a01b03168383815181106122fd57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316141561241857600360019054906101000a90046001600160a01b03166001600160a01b031663e48ef05c85848151811061235857634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b815260040161237c91906150c9565b60206040518083038186803b15801561239457600080fd5b505afa1580156123a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cc91906144c4565b90506123d781613561565b8383815181106123f757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b50806124238161524c565b915050612234565b5092915050565b600760209081526000938452604080852082529284528284209052825290208054600182015460028301546003840180549394929360ff909216929161247790615217565b80601f01602080910402602001604051908101604052809291908181526020018280546124a390615217565b80156124f05780601f106124c5576101008083540402835291602001916124f0565b820191906000526020600020905b8154815290600101906020018083116124d357829003601f168201915b5050506004909301549192505061ffff811690620100008104600290810b91600160281b9004900b87565b601460205281600052604060002081815481106121c757600080fd5b61253f612c14565b60038054610100600160a81b0319166101006001600160a01b0387811691820292909217909255600480546001600160a01b0319908116878416908117909255600580548216878516908117909155600680549092169386169384179091556040805194855260208501929092529083015260608201527fa2cad6ae2699ea86ba233a96ca0e57d895983eeed04f6bd0a770187c58b820dd9060800160405180910390a150505050565b6125f1612c14565b6001600160a01b0381166126395760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610de7565b600154600160a81b900460ff16156126895760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481d1c985b9cd9995c9c9959606a1b6044820152606401610de7565b600080546001600160a01b038381166201000081810262010000600160b01b031990941693909317938490556001805460ff60a81b1916600160a81b1790556040805193909404909116825260208201527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9101610eca565b606061270d82613675565b92915050565b6060612720848484612c8e565b949350505050565b600054610100900460ff166127435760005460ff1615612747565b303b155b6127aa5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610de7565b600054610100900460ff161580156127cc576000805461ffff19166101011790555b6127d587610d95565b60038054610100600160a81b0319166101006001600160a01b038981169190910291909117909155600480546001600160a01b0319908116888416179091556005805482168784161790556006805490911691851691909117905560005b82518110156128a25760016008600085848151811061286257634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550808061289a9061524c565b915050612833565b5080156128b5576000805461ff00191690555b50505050505050565b6006546001600160a01b031633146129095760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b6044820152606401610de7565b6003548151604051631f138de360e31b8152600481019190915260009161010090046001600160a01b03169063f89c6f189060240160206040518083038186803b15801561295657600080fd5b505afa15801561296a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298e91906144c4565b6001600160a01b038116600090815260106020908152604080832086830180518552908352818420878301805160ff90811687529185528386205489518752601a865284872093518752928552838620905182168652909352922054929350909116611e255760005b81811015612b5b576001600160a01b038084166000908152600f6020908152604080832088830151845282528083208882015160ff9081168552908352818420868552835281842054909416808452602290925290912054909116612b48578451600090815260186020908152604080832082890151845282528083208189015160ff90811685529252909120541615612af55760035460405163ed5e00eb60e01b81526101009091046001600160a01b03169063ed5e00eb90612ac2908490600090600401614e5b565b600060405180830381600087803b158015612adc57600080fd5b505af1158015612af0573d6000803e3d6000fd5b505050505b60ff856080015160ff161415612b1657612b1181600080612f61565b612b24565b612b2481866060015161370f565b6001600160a01b0381166000908152602260205260409020805460ff191660011790555b5080612b538161524c565b9150506129f7565b508251600090815260216020908152604080832082870180518552908352818420828801805160ff90811687529185528386208951808255845160018084019190915583516002909301805460608e015160808f0151881663010000000263ff0000001961ffff9092166101000262ffffff19909316968916969096179190911716939093179092558752601a86528487209351875292855283862090519091168552909252909120805460ff19169091179055505050565b6000546201000090046001600160a01b03163314612c8c5760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b6064820152608401610de7565b565b6001600160a01b0383166000908152601060209081526040808320858452825280832060ff85168452909152902054606090806001600160401b03811115612ce657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612d0f578160200160208202803683370190505b50915060005b81811015612da7576001600160a01b038087166000908152600f60209081526040808320898452825280832060ff89168452825280832085845290915290205484519116908190859084908110612d7c57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101525080612d9f8161524c565b915050612d15565b50509392505050565b60005b6001600160a01b0382166000908152600e6020526040902054811015612ea0576001600160a01b038083166000908152600c60209081526040808320858452825280832054909316825260229052205460ff16612e8e576005546001600160a01b038381166000908152600c6020908152604080832086845290915280822054905163b91f5e3560e01b81529083166004820152602481019190915291169063b91f5e3590604401600060405180830381600087803b158015612e7557600080fd5b505af1158015612e89573d6000803e3d6000fd5b505050505b80612e988161524c565b915050612db3565b5050565b60005b6001600160a01b0383166000908152600e6020526040902054811015611e25576003546001600160a01b038481166000908152600c602090815260408083208684529091529081902054905163ed5e00eb60e01b815261010090930482169263ed5e00eb92612f1c9216908690600401614e5b565b600060405180830381600087803b158015612f3657600080fd5b505af1158015612f4a573d6000803e3d6000fd5b505050508080612f599061524c565b915050612ea7565b60055460405163b91f5e3560e01b81526001600160a01b038581166004830152602482018490529091169063b91f5e3590604401600060405180830381600087803b158015612faf57600080fd5b505af1158015612fc3573d6000803e3d6000fd5b505050506001600160a01b038381166000818152601260209081526040918290205482519384529083018590529092169181019190915261ffff831660608201527f7b72264d363f766973a07f09021df5169917b274b948b57fb5028ecc3cc9b5cd90608001611e1c565b60048054608083015160a084015160c0850151604051631743f79b60e21b815261ffff90931694830194909452600290810b60248301529290920b60448301526000916001600160a01b0390911690635d0fde6c9060640160206040518083038186803b15801561309e57600080fd5b505afa1580156130b2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270d91906149bf565b6001600160a01b038082166000818152600e60209081526040808320546013835281842088840180518652908452828520898401805160ff908116885291865284872054978752601186528487209251875291855283862091511685528352818420608089015161ffff168552909252822054919390159281169116828061316557506001600160a01b038116155b156132545760006131768787613779565b6001600160a01b0387811660009081526013602090815260408083208c830151845282528083208c82015160ff168452909152902080546001600160a01b0319168383161790559091508316156132315760035460405163ed5e00eb60e01b81526101009091046001600160a01b03169063ed5e00eb906131fe908690600190600401614e5b565b600060405180830381600087803b15801561321857600080fd5b505af115801561322c573d6000803e3d6000fd5b505050505b61324981886000015189602001518a60400151613a84565b935061270d92505050565b816001600160a01b0316816001600160a01b0316146133a85760035460405163ed5e00eb60e01b81526101009091046001600160a01b03169063ed5e00eb906132a4908490600090600401614e5b565b600060405180830381600087803b1580156132be57600080fd5b505af11580156132d2573d6000803e3d6000fd5b505060035460405163ed5e00eb60e01b81526101009091046001600160a01b0316925063ed5e00eb915061330d908590600190600401614e5b565b600060405180830381600087803b15801561332757600080fd5b505af115801561333b573d6000803e3d6000fd5b505050506001600160a01b0385811660009081526013602090815260408083208a8301805185529083528184208b8301805160ff1686529352922080546001600160a01b0319169385169390931790925587519051915161339e92849291613a84565b925061270d915050565b60035460405163ed5e00eb60e01b81526101009091046001600160a01b03169063ed5e00eb906133df908590600090600401614e5b565b600060405180830381600087803b1580156133f957600080fd5b505af115801561340d573d6000803e3d6000fd5b5050505061342982876000015188602001518960400151613a84565b50915061270d9050565b50505092915050565b6003548251604051631f138de360e31b8152600481019190915260009182916101009091046001600160a01b03169063f89c6f189060240160206040518083038186803b15801561348c57600080fd5b505afa1580156134a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c491906144c4565b6001600160a01b038116600090815260106020908152604080832088830151845282528083208882015160ff1684529091528120549192505b81811015613433576001600160a01b038084166000908152600f602090815260408083208a830151845282528083208a82015160ff16845282528083208584529091529020541661354e8187613ae6565b50806135598161524c565b9150506134fd565b60006001600160a01b03821615613670576000826001600160a01b0316639e3b34bf6040518163ffffffff1660e01b8152600401604080518083038186803b1580156135ac57600080fd5b505afa1580156135c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135e49190614ccb565b5090504281101580156136655750826001600160a01b0316633f6fa6556040518163ffffffff1660e01b815260040160206040518083038186803b15801561362b57600080fd5b505afa15801561363f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366391906149bf565b155b1561366e578291505b505b919050565b6001600160a01b03811660009081526015602052604090205460609060ff166136a6576136a182613b4a565b61270d565b6001600160a01b0382166000908152601460209081526040918290208054835181840281018401909452808452909183018282801561370457602002820191906000526020600020905b8154815260200190600101908083116136f0575b505050505092915050565b6001600160a01b03821660009081526017602052604081205461ffff1690816137398460646151aa565b61ffff16116137695761ffff82166137528460646151aa565b61ffff161061376257600061376c565b600261376c565b60015b90506116fa848483612f61565b6003548251604051631c2ab73160e21b81526004810191909152600091829161380e9161010090046001600160a01b0316906370aadcc49060240160206040518083038186803b1580156137cc57600080fd5b505afa1580156137e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138049190614c84565b8560400151613b87565b60055485519192506001600160a01b031690634cde32ce9061382f87613c57565b600354885160405163c48e62f160e01b815260048101919091526101009091046001600160a01b03169063c48e62f19060240160006040518083038186803b15801561387a57600080fd5b505afa15801561388e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138b69190810190614a6a565b60200151600060028760018b6040518963ffffffff1660e01b81526004016138e5989796959493929190615063565b602060405180830381600087803b1580156138ff57600080fd5b505af1158015613913573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061393791906144c4565b5060055460408051622610c560e41b815290516001600160a01b039092169163dd5adfa39160019184916302610c50916004808301926020929190829003018186803b15801561398657600080fd5b505afa15801561399a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139be9190614c84565b6139c891906151d4565b6040518263ffffffff1660e01b81526004016139e691815260200190565b60206040518083038186803b1580156139fe57600080fd5b505afa158015613a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3691906144c4565b915061242b846000015184848760800151886020015189606001518a6040015188600281518110613a7757634e487b7160e01b600052603260045260246000fd5b6020026020010151613ca7565b613a8f838383613f22565b6001600160a01b03851660009081526014602090815260409091208251613abc9391929190910190614236565b5050506001600160a01b039091166000908152601560205260409020805460ff1916600117905550565b60035460405163ed5e00eb60e01b81526101009091046001600160a01b03169063ed5e00eb90613b1c9085908590600401614e5b565b600060405180830381600087803b158015613b3657600080fd5b505af11580156118fa573d6000803e3d6000fd5b6001600160a01b038116600090815260096020908152604080832054600a835281842054600b90935292205460609261270d92909160ff16613f22565b6040805160038082526080820190925260609160009190602082018480368337019050509050613bb98461232861517e565b81600081518110613bda57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505061271a81600181518110613c0a57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152613c2460ff8416612af861517e565b81600281518110613c4557634e487b7160e01b600052603260045260246000fd5b60209081029190910101529392505050565b60608160600151613c6e836040015160ff16614099565b613c7f846080015161ffff16614099565b604051602001613c9193929190614d85565b6040516020818303038152906040529050919050565b600354604051624dc46d60e41b8152600481018a90526001600160a01b038881166024830152610100909204909116906304dc46d090604401600060405180830381600087803b158015613cfa57600080fd5b505af1158015613d0e573d6000803e3d6000fd5b505050506001600160a01b0386811660008181526009602090815260408083208d9055600a8252808320899055888352602382528083208054958d166001600160a01b03199687168117909155848452600b8352818420805460ff8a1660ff19918216179091556016845282852080549091166001908117909155601284528285208054881683179055818552600c8452828520600e808652848720805488529186529386208054909816909617909655835290528154613dd090849061517e565b90915550506001600160a01b038088166000818152601160209081526040808320898452825280832060ff881680855290835281842061ffff8c168086529084528285208054978e166001600160a01b0319988916811790915580865260178552838620805461ffff1916909217909155858552601384528285208b8652845282852082865284528285208054881682179055858552600f84528285208b865284528285208286528452828520958552601084528285208b865284528285208286528085528386208054875296855292852080549097161790955593825292909252805460019290613ec390849061517e565b909155507fad561eb279f0551643e940bd69a05112c9f5e19962eae3312d6490409e19410e905087878a87878a88613efa86613675565b89604051613f1099989796959493929190614de1565b60405180910390a15050505050505050565b604080516002808252606080830184529260009291906020830190803683375050506000868152600760209081526040808320888452825280832060ff881684529091528120600401548251929350620100009004600290810b900b91839190613f9c57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101919091526000868152600782526040808220878352835280822060ff8716835290925220600401548151600160281b909104600290810b900b908290600190811061400257634e487b7160e01b600052603260045260246000fd5b602090810291909101015260048054604051632c85b65d60e21b81526001600160a01b039091169163b216d9749161403c91859101614f68565b60006040518083038186803b15801561405457600080fd5b505afa158015614068573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526140909190810190614971565b95945050505050565b6060816140bd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156140e757806140d18161524c565b91506140e09050600a83615196565b91506140c1565b6000816001600160401b0381111561410f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614139576020820181803683370190505b5090505b84156127205761414e6001836151d4565b915061415b600a86615267565b61416690603061517e565b60f81b81838151811061418957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506141ab600a86615196565b945061413d565b8280546141be90615217565b90600052602060002090601f0160209004810192826141e05760008555614226565b82601f106141f957805160ff1916838001178555614226565b82800160010185558215614226579182015b8281111561422657825182559160200191906001019061420b565b50614232929150614270565b5090565b828054828255906000526020600020908101928215614226579160200282018281111561422657825182559160200191906001019061420b565b5b808211156142325760008155600101614271565b600082601f830112614295578081fd5b815160206142aa6142a583615134565b615104565b80838252828201915082860187848660051b89010111156142c9578586fd5b855b858110156142f05781516142de816152d2565b845292840192908401906001016142cb565b5090979650505050505050565b600082601f83011261430d578081fd5b8135602061431d6142a583615134565b80838252828201915082860187848660051b890101111561433c578586fd5b855b858110156142f05781356001600160401b0381111561435b578788fd5b6143698a87838c01016143ef565b855250928401929084019060010161433e565b600082601f83011261438c578081fd5b8151602061439c6142a583615134565b80838252828201915082860187848660051b89010111156143bb578586fd5b855b858110156142f0578151845292840192908401906001016143bd565b8035613670816152e0565b8051613670816152e0565b600082601f8301126143ff578081fd5b813561440d6142a582615157565b818152846020838601011115614421578283fd5b816020850160208301379081016020019190915292915050565b600082601f83011261444b578081fd5b81516144596142a582615157565b81815284602083860101111561446d578283fd5b6127208260208301602087016151eb565b803561ffff8116811461367057600080fd5b803560ff8116811461367057600080fd5b6000602082840312156144b2578081fd5b81356144bd816152bd565b9392505050565b6000602082840312156144d5578081fd5b81516144bd816152bd565b600080600080608085870312156144f5578283fd5b8435614500816152bd565b93506020850135614510816152bd565b92506040850135614520816152bd565b91506060850135614530816152bd565b939692955090935050565b60008060008060008060c08789031215614553578384fd5b863561455e816152bd565b955060208781013561456f816152bd565b9550604088013561457f816152bd565b9450606088013561458f816152bd565b9350608088013561459f816152bd565b925060a08801356001600160401b038111156145b9578283fd5b8801601f81018a136145c9578283fd5b80356145d76142a582615134565b8082825284820191508484018d868560051b87010111156145f6578687fd5b8694505b838510156146185780358352600194909401939185019185016145fa565b5080955050505050509295509295509295565b60008060008060808587031215614640578182fd5b843561464b816152bd565b9350602085013561465b816152d2565b9250604085013561466b816152d2565b91506060850135614530816152d2565b60008060006060848603121561468f578081fd5b833561469a816152bd565b9250602084013591506146af60408501614490565b90509250925092565b600080600080608085870312156146cd578182fd5b84356146d8816152bd565b9350602085013592506146ed60408601614490565b91506146fb6060860161447e565b905092959194509250565b6000806000806080858703121561471b578182fd5b8435614726816152bd565b93506020850135925061473b60408601614490565b9396929550929360600135925050565b6000806040838503121561475d578182fd5b8235614768816152bd565b946020939093013593505050565b60006020808385031215614788578182fd5b82356001600160401b0381111561479d578283fd5b8301601f810185136147ad578283fd5b80356147bb6142a582615134565b80828252848201915084840188868560051b87010111156147da578687fd5b8694505b838510156148055780356147f1816152bd565b8352600194909401939185019185016147de565b50979650505050505050565b60008060008060808587031215614826578182fd5b84516001600160401b038082111561483c578384fd5b61484888838901614285565b9550602087015191508082111561485d578384fd5b61486988838901614285565b9450604087015191508082111561487e578384fd5b61488a88838901614285565b9350606087015191508082111561489f578283fd5b506148ac8782880161437c565b91505092959194509250565b600080604083850312156148ca578182fd5b82356001600160401b03808211156148e0578384fd5b818501915085601f8301126148f3578384fd5b813560206149036142a583615134565b8083825282820191508286018a848660051b8901011115614922578889fd5b8896505b84871015614944578035835260019690960195918301918301614926565b509650508601359250508082111561495a578283fd5b50614967858286016142fd565b9150509250929050565b600060208284031215614982578081fd5b81516001600160401b03811115614997578182fd5b6127208482850161437c565b6000602082840312156149b4578081fd5b81356144bd816152d2565b6000602082840312156149d0578081fd5b81516144bd816152d2565b6000602082840312156149ec578081fd5b5035919050565b60008060408385031215614a05578182fd5b50508035926020909101359150565b600080600060608486031215614a28578081fd5b505081359360208301359350604090920135919050565b600080600060608486031215614a53578081fd5b83359250602084013591506146af60408501614490565b600060208284031215614a7b578081fd5b81516001600160401b0380821115614a91578283fd5b9083019060e08286031215614aa4578283fd5b614aac6150dc565b8251815260208301516020820152614ac6604084016143e4565b6040820152614ad7606084016143e4565b6060820152614ae8608084016143e4565b608082015260a083015182811115614afe578485fd5b614b0a8782860161443b565b60a08301525060c083015182811115614b21578485fd5b614b2d8782860161443b565b60c08301525095945050505050565b600060a08284031215614b4d578081fd5b60405160a081018181106001600160401b0382111715614b6f57614b6f6152a7565b80604052508235815260208301356020820152614b8e60408401614490565b6040820152614b9f6060840161447e565b6060820152614bb060808401614490565b60808201529392505050565b60008060408385031215614bce578182fd5b82356001600160401b0380821115614be4578384fd5b9084019060e08287031215614bf7578384fd5b614bff6150dc565b8235815260208301356020820152614c1960408401614490565b6040820152606083013582811115614c2f578586fd5b614c3b888286016143ef565b606083015250614c4d6080840161447e565b6080820152614c5e60a084016143d9565b60a0820152614c6f60c084016143d9565b60c08201529660209590950135955050505050565b600060208284031215614c95578081fd5b5051919050565b60008060408385031215614cae578182fd5b823591506020830135614cc0816152d2565b809150509250929050565b60008060408385031215614cdd578182fd5b505080516020909101519092909150565b6000815180845260208085019450808401835b83811015614d1f578151151587529582019590820190600101614d01565b509495945050505050565b6000815180845260208085019450808401835b83811015614d1f57815187529582019590820190600101614d3d565b60008151808452614d718160208601602086016151eb565b601f01601f19169290920160200192915050565b60008451614d978184602089016151eb565b80830190506201016960ed1b8082528551614db9816003850160208a016151eb565b60039201918201528351614dd48160068401602088016151eb565b0160060195945050505050565b6001600160a01b038a8116825289166020820152604081018890526060810187905261012060808201819052600090614e1c83820189614d59565b905061ffff871660a084015260ff861660c084015282810360e0840152614e438186614d2a565b915050826101008301529a9950505050505050505050565b6001600160a01b039290921682521515602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015614eb75783516001600160a01b031683529284019291840191600101614e92565b50909695505050505050565b6080808252855190820181905260009060209060a0840190828901845b82811015614efc57815184529284019290840190600101614ee0565b50505083810382850152865180825287830191830190845b81811015614f3357835160ff1683529284019291840191600101614f14565b50508481036040860152614f478188614cee565b925050508281036060840152614f5d8185614cee565b979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614eb757835183529284019291840191600101614f84565b6020815260006144bd6020830184614d2a565b6000608082018683526020868185015260ff861660408501526080606085015281855480845260a0860191508685528285209350845b8181101561500557845483526001948501949284019201614fe9565b50909998505050505050505050565b87815286602082015260ff8616604082015260e06060820152600061503c60e0830187614d59565b61ffff95909516608083015250600292830b60a0820152910b60c090910152949350505050565b60006101008a835280602084015261507d8184018b614d59565b905088604084015287606084015286608084015282810360a08401526150a38187614d2a565b94151560c084015250506001600160a01b039190911660e0909101529695505050505050565b6020815260006144bd6020830184614d59565b60405160e081016001600160401b03811182821017156150fe576150fe6152a7565b60405290565b604051601f8201601f191681016001600160401b038111828210171561512c5761512c6152a7565b604052919050565b60006001600160401b0382111561514d5761514d6152a7565b5060051b60200190565b60006001600160401b03821115615170576151706152a7565b50601f01601f191660200190565b600082198211156151915761519161527b565b500190565b6000826151a5576151a5615291565b500490565b600061ffff808316818516818304811182151516156151cb576151cb61527b565b02949350505050565b6000828210156151e6576151e661527b565b500390565b60005b838110156152065781810151838201526020016151ee565b838111156116fa5750506000910152565b600181811c9082168061522b57607f821691505b6020821081141561366e57634e487b7160e01b600052602260045260246000fd5b60006000198214156152605761526061527b565b5060010190565b60008261527657615276615291565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f9e57600080fd5b8015158114610f9e57600080fd5b8060020b8114610f9e57600080fdfea264697066735822122068e095793283b44955aa3b1ec39595050b872218c82041903f08e01a82c974a264736f6c63430008040033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.