Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ThalesBonds
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; // external import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; // internal import "../utils/proxy/solidity-0.8.0/ProxyReentrancyGuard.sol"; import "../utils/proxy/solidity-0.8.0/ProxyOwned.sol"; import "../interfaces/IExoticPositionalMarketManager.sol"; import "../interfaces/IExoticPositionalMarket.sol"; import "../interfaces/IStakingThales.sol"; import "../interfaces/ICurveSUSD.sol"; contract ThalesBonds is Initializable, ProxyOwned, PausableUpgradeable, ProxyReentrancyGuard { using SafeMathUpgradeable for uint; using SafeERC20Upgradeable for IERC20Upgradeable; IExoticPositionalMarketManager public marketManager; struct MarketBond { uint totalDepositedMarketBond; uint totalMarketBond; uint creatorBond; uint resolverBond; uint disputorsTotalBond; uint disputorsCount; mapping(address => uint) disputorBond; } mapping(address => MarketBond) public marketBond; mapping(address => uint) public marketFunds; uint private constant MAX_APPROVAL = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; uint private constant ONE = 1e18; uint private constant ONE_PERCENT = 1e16; uint private constant CREATOR_BOND = 101; uint private constant RESOLVER_BOND = 102; uint private constant DISPUTOR_BOND = 103; uint private constant CREATOR_AND_DISPUTOR = 104; uint private constant RESOLVER_AND_DISPUTOR = 105; IStakingThales public stakingThales; bool public curveOnrampEnabled; ICurveSUSD public curveSUSD; address public usdc; address public usdt; address public dai; uint public maxAllowedPegSlippagePercentage; function initialize(address _owner) public initializer { setOwner(_owner); initNonReentrant(); } function getTotalDepositedBondAmountForMarket(address _market) external view returns (uint) { return marketBond[_market].totalDepositedMarketBond; } function getClaimedBondAmountForMarket(address _market) external view returns (uint) { return marketBond[_market].totalDepositedMarketBond.sub(marketBond[_market].totalMarketBond); } function getClaimableBondAmountForMarket(address _market) external view returns (uint) { return marketBond[_market].totalMarketBond; } function getDisputorBondForMarket(address _market, address _disputorAddress) external view returns (uint) { return marketBond[_market].disputorBond[_disputorAddress]; } function getCreatorBondForMarket(address _market) external view returns (uint) { return marketBond[_market].creatorBond; } function getResolverBondForMarket(address _market) external view returns (uint) { return marketBond[_market].resolverBond; } // different deposit functions to flag the bond amount : creator function sendCreatorBondToMarket( address _market, address _creatorAddress, uint _amount ) external onlyOracleCouncilManagerAndOwner nonReentrant { require(_amount > 0, "Bond zero"); // no checks for active market, market creation not finalized marketBond[_market].creatorBond = _amount; marketBond[_market].totalMarketBond = marketBond[_market].totalMarketBond.add(_amount); marketBond[_market].totalDepositedMarketBond = marketBond[_market].totalDepositedMarketBond.add(_amount); transferToMarketBond(_creatorAddress, _amount); emit CreatorBondSent(_market, _creatorAddress, _amount); } // different deposit functions to flag the bond amount : resolver function sendResolverBondToMarket( address _market, address _resolverAddress, uint _amount ) external onlyOracleCouncilManagerAndOwner nonReentrant { require(_amount > 0, "Bond zero"); require(marketManager.isActiveMarket(_market), "Invalid address"); // in case the creator is the resolver, move the bond to the resolver marketBond[_market].resolverBond = _amount; marketBond[_market].totalMarketBond = marketBond[_market].totalMarketBond.add(_amount); marketBond[_market].totalDepositedMarketBond = marketBond[_market].totalDepositedMarketBond.add(_amount); transferToMarketBond(_resolverAddress, _amount); emit ResolverBondSent(_market, _resolverAddress, _amount); } // different deposit functions to flag the bond amount : disputor function sendDisputorBondToMarket( address _market, address _disputorAddress, uint _amount ) external onlyOracleCouncilManagerAndOwner nonReentrant { require(_amount > 0, "Bond zero"); require(marketManager.isActiveMarket(_market), "Invalid address"); // if it is first dispute for the disputor, the counter is increased if (marketBond[_market].disputorBond[_disputorAddress] == 0) { marketBond[_market].disputorsCount = marketBond[_market].disputorsCount.add(1); } marketBond[_market].disputorBond[_disputorAddress] = marketBond[_market].disputorBond[_disputorAddress].add(_amount); marketBond[_market].disputorsTotalBond = marketBond[_market].disputorsTotalBond.add(_amount); marketBond[_market].totalMarketBond = marketBond[_market].totalMarketBond.add(_amount); marketBond[_market].totalDepositedMarketBond = marketBond[_market].totalDepositedMarketBond.add(_amount); transferToMarketBond(_disputorAddress, _amount); emit DisputorBondSent(_market, _disputorAddress, _amount); } // universal claiming amount function to adapt for different scenarios, e.g. SafeBox function sendBondFromMarketToUser( address _market, address _account, uint _amount, uint _bondToReduce, address _disputorAddress ) external onlyOracleCouncilManagerAndOwner nonReentrant { require(marketManager.isActiveMarket(_market), "Invalid address"); require(_amount <= marketBond[_market].totalMarketBond, "Exceeds bond"); require(_bondToReduce >= CREATOR_BOND && _bondToReduce <= RESOLVER_AND_DISPUTOR, "Invalid bondToReduce"); if (_bondToReduce == CREATOR_BOND && _amount <= marketBond[_market].creatorBond) { marketBond[_market].creatorBond = marketBond[_market].creatorBond.sub(_amount); } else if (_bondToReduce == RESOLVER_BOND && _amount <= marketBond[_market].resolverBond) { marketBond[_market].resolverBond = marketBond[_market].resolverBond.sub(_amount); } else if ( _bondToReduce == DISPUTOR_BOND && marketBond[_market].disputorBond[_disputorAddress] >= 0 && _amount <= IExoticPositionalMarket(_market).disputePrice() ) { marketBond[_market].disputorBond[_disputorAddress] = marketBond[_market].disputorBond[_disputorAddress].sub( _amount ); marketBond[_market].disputorsTotalBond = marketBond[_market].disputorsTotalBond.sub(_amount); marketBond[_market].disputorsCount = marketBond[_market].disputorBond[_disputorAddress] > 0 ? marketBond[_market].disputorsCount : marketBond[_market].disputorsCount.sub(1); } else if ( _bondToReduce == CREATOR_AND_DISPUTOR && _amount <= marketBond[_market].creatorBond.add(IExoticPositionalMarket(_market).disputePrice()) && _amount > marketBond[_market].creatorBond ) { marketBond[_market].disputorBond[_disputorAddress] = marketBond[_market].disputorBond[_disputorAddress].sub( _amount.sub(marketBond[_market].creatorBond) ); marketBond[_market].disputorsTotalBond = marketBond[_market].disputorsTotalBond.sub( _amount.sub(marketBond[_market].creatorBond) ); marketBond[_market].creatorBond = 0; marketBond[_market].disputorsCount = marketBond[_market].disputorBond[_disputorAddress] > 0 ? marketBond[_market].disputorsCount : marketBond[_market].disputorsCount.sub(1); } else if ( _bondToReduce == RESOLVER_AND_DISPUTOR && _amount <= marketBond[_market].resolverBond.add(IExoticPositionalMarket(_market).disputePrice()) && _amount > marketBond[_market].resolverBond ) { marketBond[_market].disputorBond[_disputorAddress] = marketBond[_market].disputorBond[_disputorAddress].sub( _amount.sub(marketBond[_market].resolverBond) ); marketBond[_market].disputorsTotalBond = marketBond[_market].disputorsTotalBond.sub( _amount.sub(marketBond[_market].resolverBond) ); marketBond[_market].resolverBond = 0; marketBond[_market].disputorsCount = marketBond[_market].disputorBond[_disputorAddress] > 0 ? marketBond[_market].disputorsCount : marketBond[_market].disputorsCount.sub(1); } marketBond[_market].totalMarketBond = marketBond[_market].totalMarketBond.sub(_amount); transferBondFromMarket(_account, _amount); emit BondTransferredFromMarketBondToUser(_market, _account, _amount); } function sendOpenDisputeBondFromMarketToDisputor( address _market, address _account, uint _amount ) external onlyOracleCouncilManagerAndOwner nonReentrant { require(marketManager.isActiveMarket(_market), "Invalid address"); require( _amount <= marketBond[_market].totalMarketBond && _amount <= marketBond[_market].disputorsTotalBond, "Exceeds bond" ); require( marketBond[_market].disputorsCount > 0 && marketBond[_market].disputorBond[_account] >= _amount, "Already claimed" ); marketBond[_market].totalMarketBond = marketBond[_market].totalMarketBond.sub(_amount); marketBond[_market].disputorBond[_account] = marketBond[_market].disputorBond[_account].sub(_amount); marketBond[_market].disputorsTotalBond = marketBond[_market].disputorsTotalBond.sub(_amount); marketBond[_market].disputorsCount = marketBond[_market].disputorBond[_account] > 0 ? marketBond[_market].disputorsCount : marketBond[_market].disputorsCount.sub(1); transferBondFromMarket(_account, _amount); emit BondTransferredFromMarketBondToUser(_market, _account, _amount); } function issueBondsBackToCreatorAndResolver(address _market) external onlyOracleCouncilManagerAndOwner nonReentrant { require(marketManager.isActiveMarket(_market), "Invalid address"); uint totalIssuedBack; if (marketBond[_market].totalMarketBond >= marketBond[_market].creatorBond.add(marketBond[_market].resolverBond)) { marketBond[_market].totalMarketBond = marketBond[_market].totalMarketBond.sub( marketBond[_market].creatorBond.add(marketBond[_market].resolverBond) ); if ( marketManager.creatorAddress(_market) != marketManager.resolverAddress(_market) && marketBond[_market].creatorBond > 0 ) { totalIssuedBack = marketBond[_market].creatorBond; marketBond[_market].creatorBond = 0; transferBondFromMarket(marketManager.creatorAddress(_market), totalIssuedBack); emit BondTransferredFromMarketBondToUser(_market, marketManager.creatorAddress(_market), totalIssuedBack); } if (marketBond[_market].resolverBond > 0) { totalIssuedBack = marketBond[_market].resolverBond; marketBond[_market].resolverBond = 0; transferBondFromMarket(marketManager.resolverAddress(_market), totalIssuedBack); emit BondTransferredFromMarketBondToUser(_market, marketManager.resolverAddress(_market), totalIssuedBack); } } } function transferCreatorToResolverBonds(address _market) external onlyOracleCouncilManagerAndOwner nonReentrant { require(marketManager.isActiveMarket(_market), "Invalid address"); require(marketBond[_market].creatorBond > 0, "Creator bond 0"); marketBond[_market].resolverBond = marketBond[_market].creatorBond; marketBond[_market].creatorBond = 0; emit BondTransferredFromCreatorToResolver(_market, marketBond[_market].resolverBond); } function transferToMarket(address _account, uint _amount) external whenNotPaused { require(marketManager.isActiveMarket(msg.sender), "Not active market."); marketFunds[msg.sender] = marketFunds[msg.sender].add(_amount); if (address(stakingThales) != address(0)) { stakingThales.updateVolume(_account, _amount); } transferToMarketBond(_account, _amount); } function transferToMarket( address _account, uint _amount, address collateral, uint expectedPayout, uint additionalSlippage ) external whenNotPaused { require(marketManager.isActiveMarket(msg.sender), "Not active market."); marketFunds[msg.sender] = marketFunds[msg.sender].add(_amount); if (address(stakingThales) != address(0)) { stakingThales.updateVolume(_account, _amount); } if (collateral == marketManager.paymentToken()) { transferToMarketBond(_account, _amount); } else { int128 curveIndex = _mapCollateralToCurveIndex(collateral); require(curveIndex > 0 && curveOnrampEnabled, "unsupported collateral"); uint collateralQuote = getCurveQuoteForDifferentCollateral(_amount, collateral, true); uint transformedCollateralForPegCheck = collateral == usdc || collateral == usdt ? collateralQuote.mul(1e12) : collateralQuote; require( maxAllowedPegSlippagePercentage > 0 && transformedCollateralForPegCheck >= _amount.mul(ONE.sub(maxAllowedPegSlippagePercentage)).div(ONE), "Amount below max allowed peg slippage" ); require(collateralQuote.mul(ONE).div(expectedPayout) <= ONE.add(additionalSlippage), "Slippage too high!"); require(IERC20Upgradeable(collateral).balanceOf(_account) >= collateralQuote, "Sender balance low"); require( IERC20Upgradeable(collateral).allowance(_account, marketManager.thalesBonds()) >= collateralQuote, "No allowance." ); IERC20Upgradeable collateralToken = IERC20Upgradeable(collateral); collateralToken.safeTransferFrom(_account, address(this), collateralQuote); curveSUSD.exchange_underlying(curveIndex, 0, collateralQuote, _amount); } } function transferFromMarket(address _account, uint _amount) external whenNotPaused { require(marketManager.isActiveMarket(msg.sender), "Not active market."); require(marketFunds[msg.sender] >= _amount, "Low funds."); marketFunds[msg.sender] = marketFunds[msg.sender].sub(_amount); transferBondFromMarket(_account, _amount); } function transferToMarketBond(address _account, uint _amount) internal whenNotPaused { IERC20Upgradeable(marketManager.paymentToken()).safeTransferFrom(_account, address(this), _amount); } function transferBondFromMarket(address _account, uint _amount) internal whenNotPaused { IERC20Upgradeable(marketManager.paymentToken()).safeTransfer(_account, _amount); } function setMarketManager(address _managerAddress) external onlyOwner { require(_managerAddress != address(0), "Invalid OC"); marketManager = IExoticPositionalMarketManager(_managerAddress); emit NewManagerAddress(_managerAddress); } function setStakingThalesContract(address _stakingThales) external onlyOwner { require(_stakingThales != address(0), "Invalid address"); stakingThales = IStakingThales(_stakingThales); emit NewStakingThalesAddress(_stakingThales); } function setPaused(bool _setPausing) external onlyOwner { if (_setPausing) { _pause(); } else { _unpause(); } } modifier onlyOracleCouncilManagerAndOwner() { require( msg.sender == marketManager.oracleCouncilAddress() || msg.sender == address(marketManager) || msg.sender == owner, "Not OC/Manager/Owner" ); require(address(marketManager) != address(0), "Invalid Manager"); require(marketManager.oracleCouncilAddress() != address(0), "Invalid OC"); _; } /// @notice Updates contract parametars /// @param _curveSUSD curve sUSD pool exchanger contract /// @param _dai DAI address /// @param _usdc USDC address /// @param _usdt USDT addresss /// @param _curveOnrampEnabled whether AMM supports curve onramp /// @param _maxAllowedPegSlippagePercentage maximum discount AMM accepts for sUSD purchases function setCurveSUSD( address _curveSUSD, address _dai, address _usdc, address _usdt, bool _curveOnrampEnabled, uint _maxAllowedPegSlippagePercentage ) external onlyOwner { curveSUSD = ICurveSUSD(_curveSUSD); dai = _dai; usdc = _usdc; usdt = _usdt; IERC20Upgradeable(dai).approve(_curveSUSD, MAX_APPROVAL); IERC20Upgradeable(usdc).approve(_curveSUSD, MAX_APPROVAL); IERC20Upgradeable(usdt).approve(_curveSUSD, MAX_APPROVAL); IERC20Upgradeable(marketManager.paymentToken()).approve(_curveSUSD, MAX_APPROVAL); curveOnrampEnabled = _curveOnrampEnabled; maxAllowedPegSlippagePercentage = _maxAllowedPegSlippagePercentage; } function _mapCollateralToCurveIndex(address collateral) internal view returns (int128) { if (collateral == dai) { return 1; } if (collateral == usdc) { return 2; } if (collateral == usdt) { return 3; } return 0; } /// @notice get a quote in the collateral of choice (USDC, USDT or DAI) on how much the trader would need to pay to get sUSD /// @param amount number of positions to buy with 18 decimals /// @param collateral USDT, USDC or DAI address /// @param toSUSD flag that determines should we get a quote for swapping to sUSD or from sUSD /// @return collateralQuote quote in collateral on how much the trader would need to pay to get sUSD function getCurveQuoteForDifferentCollateral( uint amount, address collateral, bool toSUSD ) public view returns (uint collateralQuote) { int128 curveIndex = _mapCollateralToCurveIndex(collateral); if (curveIndex == 0 || !curveOnrampEnabled) { return (0); } if (toSUSD) { //cant get a quote on how much collateral is needed from curve for sUSD, //so rather get how much of collateral you get for the sUSD quote and add 0.2% to that collateralQuote = curveSUSD.get_dy_underlying(0, curveIndex, amount).mul(ONE.add(ONE_PERCENT.div(5))).div(ONE); } else { // decreasing the amount by 0.1% due to possible slippage collateralQuote = curveSUSD.get_dy_underlying(0, curveIndex, amount).mul(ONE.sub(ONE_PERCENT.div(10))).div(ONE); } } event CreatorBondSent(address market, address creator, uint amount); event ResolverBondSent(address market, address resolver, uint amount); event DisputorBondSent(address market, address disputor, uint amount); event BondTransferredFromMarketBondToUser(address market, address account, uint amount); event NewOracleCouncilAddress(address oracleCouncil); event NewManagerAddress(address managerAddress); event BondTransferredFromCreatorToResolver(address market, uint amount); event NewStakingThalesAddress(address stakingThales); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20Upgradeable.sol"; import "../../../utils/AddressUpgradeable.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20Upgradeable { using AddressUpgradeable for address; function safeTransfer( IERC20Upgradeable token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20Upgradeable token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20Upgradeable token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20Upgradeable token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20Upgradeable token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } 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 v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMathUpgradeable { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// 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 pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the `nonReentrant` modifier * available, which can be aplied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. */ contract ProxyReentrancyGuard { /// @dev counter to allow mutex lock with only one SSTORE operation uint256 private _guardCounter; bool private _initialized; function initNonReentrant() public { require(!_initialized, "Already initialized"); _initialized = true; _guardCounter = 1; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call"); } }
// 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; interface IExoticPositionalMarketManager { /* ========== VIEWS / VARIABLES ========== */ function paused() external view returns (bool); function getActiveMarketAddress(uint _index) external view returns (address); function getActiveMarketIndex(address _marketAddress) external view returns (uint); function isActiveMarket(address _marketAddress) external view returns (bool); function numberOfActiveMarkets() external view returns (uint); function getMarketBondAmount(address _market) external view returns (uint); function maximumPositionsAllowed() external view returns (uint); function paymentToken() external view returns (address); function owner() external view returns (address); function thalesBonds() external view returns (address); function oracleCouncilAddress() external view returns (address); function safeBoxAddress() external view returns (address); function creatorAddress(address _market) external view returns (address); function resolverAddress(address _market) external view returns (address); function isPauserAddress(address _pauserAddress) external view returns (bool); function safeBoxPercentage() external view returns (uint); function creatorPercentage() external view returns (uint); function resolverPercentage() external view returns (uint); function withdrawalPercentage() external view returns (uint); function pDAOResolveTimePeriod() external view returns (uint); function claimTimeoutDefaultPeriod() external view returns (uint); function maxOracleCouncilMembers() external view returns (uint); function fixedBondAmount() external view returns (uint); function disputePrice() external view returns (uint); function safeBoxLowAmount() external view returns (uint); function arbitraryRewardForDisputor() external view returns (uint); function disputeStringLengthLimit() external view returns (uint); function cancelledByCreator(address _market) external view returns (bool); function withdrawalTimePeriod() external view returns (uint); function maxAmountForOpenBidPosition() external view returns (uint); function maxFinalWithdrawPercentage() external view returns (uint); function minFixedTicketPrice() external view returns (uint); function createExoticMarket( string memory _marketQuestion, string memory _marketSource, uint _endOfPositioning, uint _fixedTicketPrice, bool _withdrawalAllowed, uint[] memory _tags, uint _positionCount, string[] memory _positionPhrases ) external; function createCLMarket( string memory _marketQuestion, string memory _marketSource, uint _endOfPositioning, uint _fixedTicketPrice, bool _withdrawalAllowed, uint[] memory _tags, uint _positionCount, uint[] memory _positionsOfCreator, string[] memory _positionPhrases ) external; function disputeMarket(address _marketAddress, address disputor) external; function resolveMarket(address _marketAddress, uint _outcomePosition) external; function resetMarket(address _marketAddress) external; function cancelMarket(address _market) external; function closeDispute(address _market) external; function setBackstopTimeout(address _market) external; function sendMarketBondAmountTo( address _market, address _recepient, uint _amount ) external; function addPauserAddress(address _pauserAddress) external; function removePauserAddress(address _pauserAddress) external; function sendRewardToDisputor( address _market, address _disputorAddress, uint amount ) external; function issueBondsBackToCreatorAndResolver(address _marketAddress) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IExoticPositionalMarket { /* ========== VIEWS / VARIABLES ========== */ function isMarketCreated() external view returns (bool); function creatorAddress() external view returns (address); function resolverAddress() external view returns (address); function totalBondAmount() external view returns (uint); function marketQuestion() external view returns (string memory); function marketSource() external view returns (string memory); function positionPhrase(uint index) external view returns (string memory); function getTicketType() external view returns (uint); function positionCount() external view returns (uint); function endOfPositioning() external view returns (uint); function resolvedTime() external view returns (uint); function fixedTicketPrice() external view returns (uint); function creationTime() external view returns (uint); function winningPosition() external view returns (uint); function getTags() external view returns (uint[] memory); function getTotalPlacedAmount() external view returns (uint); function getTotalClaimableAmount() external view returns (uint); function getPlacedAmountPerPosition(uint index) external view returns (uint); function fixedBondAmount() external view returns (uint); function disputePrice() external view returns (uint); function safeBoxLowAmount() external view returns (uint); function arbitraryRewardForDisputor() external view returns (uint); function backstopTimeout() external view returns (uint); function disputeClosedTime() external view returns (uint); function totalUsersTakenPositions() external view returns (uint); function withdrawalAllowed() external view returns (bool); function disputed() external view returns (bool); function resolved() external view returns (bool); function canUsersPlacePosition() external view returns (bool); function canMarketBeResolvedByPDAO() external view returns (bool); function canMarketBeResolved() external view returns (bool); function canUsersClaim() external view returns (bool); function isMarketCancelled() external view returns (bool); function paused() external view returns (bool); function canCreatorCancelMarket() external view returns (bool); function getAllFees() external view returns ( uint, uint, uint, uint ); function canIssueFees() external view returns (bool); function noWinners() external view returns (bool); function transferBondToMarket(address _sender, uint _amount) external; function resolveMarket(uint _outcomePosition, address _resolverAddress) external; function cancelMarket() external; function resetMarket() external; function claimWinningTicketOnBehalf(address _user) external; function openDispute() external; function closeDispute() external; function setBackstopTimeout(uint _timeoutPeriod) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.16; interface IStakingThales { function updateVolume(address account, uint amount) external; /* ========== VIEWS / VARIABLES ========== */ function totalStakedAmount() external view returns (uint); function stakedBalanceOf(address account) external view returns (uint); function currentPeriodRewards() external view returns (uint); function currentPeriodFees() external view returns (uint); function getLastPeriodOfClaimedRewards(address account) external view returns (uint); function getRewardsAvailable(address account) external view returns (uint); function getRewardFeesAvailable(address account) external view returns (uint); function getAlreadyClaimedRewards(address account) external view returns (uint); function getContractRewardFunds() external view returns (uint); function getContractFeeFunds() external view returns (uint); }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.16; interface ICurveSUSD { function exchange_underlying( int128 i, int128 j, uint256 _dx, uint256 _min_dy ) external returns (uint256); function get_dy_underlying( int128 i, int128 j, uint256 _dx ) external view returns (uint256); // @notice Perform an exchange between two underlying coins // @param i Index value for the underlying coin to send // @param j Index valie of the underlying coin to receive // @param _dx Amount of `i` being exchanged // @param _min_dy Minimum amount of `j` to receive // @param _receiver Address that receives `j` // @return Actual amount of `j` received // indexes: // 0 = sUSD 18 dec 0x8c6f28f2F1A3C87F0f938b96d27520d9751ec8d9 // 1= DAI 18 dec 0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1 // 2= USDC 6 dec 0x7F5c764cBc14f9669B88837ca1490cCa17c31607 // 3= USDT 6 dec 0x94b008aA00579c1307B0EF2c499aD98a8ce58e58 }
// 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 // 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; }
{ "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":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BondTransferredFromCreatorToResolver","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BondTransferredFromMarketBondToUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CreatorBondSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"address","name":"disputor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DisputorBondSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"managerAddress","type":"address"}],"name":"NewManagerAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oracleCouncil","type":"address"}],"name":"NewOracleCouncilAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"stakingThales","type":"address"}],"name":"NewStakingThalesAddress","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"address","name":"resolver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ResolverBondSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"curveOnrampEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curveSUSD","outputs":[{"internalType":"contract ICurveSUSD","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"getClaimableBondAmountForMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"getClaimedBondAmountForMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"getCreatorBondForMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"collateral","type":"address"},{"internalType":"bool","name":"toSUSD","type":"bool"}],"name":"getCurveQuoteForDifferentCollateral","outputs":[{"internalType":"uint256","name":"collateralQuote","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"address","name":"_disputorAddress","type":"address"}],"name":"getDisputorBondForMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"getResolverBondForMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"getTotalDepositedBondAmountForMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initNonReentrant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"issueBondsBackToCreatorAndResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketBond","outputs":[{"internalType":"uint256","name":"totalDepositedMarketBond","type":"uint256"},{"internalType":"uint256","name":"totalMarketBond","type":"uint256"},{"internalType":"uint256","name":"creatorBond","type":"uint256"},{"internalType":"uint256","name":"resolverBond","type":"uint256"},{"internalType":"uint256","name":"disputorsTotalBond","type":"uint256"},{"internalType":"uint256","name":"disputorsCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketFunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketManager","outputs":[{"internalType":"contract IExoticPositionalMarketManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAllowedPegSlippagePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_bondToReduce","type":"uint256"},{"internalType":"address","name":"_disputorAddress","type":"address"}],"name":"sendBondFromMarketToUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"address","name":"_creatorAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sendCreatorBondToMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"address","name":"_disputorAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sendDisputorBondToMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sendOpenDisputeBondFromMarketToDisputor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"address","name":"_resolverAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sendResolverBondToMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_curveSUSD","type":"address"},{"internalType":"address","name":"_dai","type":"address"},{"internalType":"address","name":"_usdc","type":"address"},{"internalType":"address","name":"_usdt","type":"address"},{"internalType":"bool","name":"_curveOnrampEnabled","type":"bool"},{"internalType":"uint256","name":"_maxAllowedPegSlippagePercentage","type":"uint256"}],"name":"setCurveSUSD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_managerAddress","type":"address"}],"name":"setMarketManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setPausing","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingThales","type":"address"}],"name":"setStakingThalesContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingThales","outputs":[{"internalType":"contract IStakingThales","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"transferCreatorToResolverBonds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFromMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"transferOwnershipAtInit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"collateral","type":"address"},{"internalType":"uint256","name":"expectedPayout","type":"uint256"},{"internalType":"uint256","name":"additionalSlippage","type":"uint256"}],"name":"transferToMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferToMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506149fa806100206000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806380af208b1161013b578063d82aff11116100b8578063ec9fc3cc1161007c578063ec9fc3cc146105e3578063f29e0d0f146105f6578063f4b9fa7514610622578063fd8a8cc614610635578063ffe0b03f1461064857600080fd5b8063d82aff1114610582578063db2d274814610595578063df999f62146105b5578063e03e2d02146105c8578063ebc79772146105db57600080fd5b8063b584159b116100ff578063b584159b146104ad578063c0f166fb1461051d578063c3b83f5f14610549578063c4d66de81461055c578063d3c4297c1461056f57600080fd5b806380af208b1461041e578063857afabd1461045b5780638da5cb5b1461046e5780639cd0d4a414610487578063a5bf660d1461049a57600080fd5b80633e413bee116101c9578063584226961161018d57806358422696146103b95780635a090b68146103e55780635c975abb146103f85780637190e8151461040357806379ba50971461041657600080fd5b80633e413bee14610355578063403b14121461036857806341ed2c121461037b57806353a47bb714610393578063579175bf146103a657600080fd5b80631fbb38e8116102105780631fbb38e8146102ae57806327b153a0146102d75780632909f51a146102ea5780632f48ab7d146103015780633009101f1461032c57600080fd5b8063105743d11461024d57806313af4035146102625780631627540c1461027557806316c38b3c1461028857806317f7a1e41461029b575b600080fd5b61026061025b36600461455f565b61065b565b005b610260610270366004614477565b61093a565b610260610283366004614477565b610a75565b610260610296366004614679565b610acb565b6102606102a93660046145fd565b610aec565b606a546102c290600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b6102606102e536600461459f565b610c2e565b6102f3606f5481565b6040519081526020016102ce565b606d54610314906001600160a01b031681565b6040516001600160a01b0390911681526020016102ce565b6102f361033a366004614477565b6001600160a01b031660009081526068602052604090205490565b606c54610314906001600160a01b031681565b61026061037636600461455f565b611691565b6067546103149061010090046001600160a01b031681565b600154610314906001600160a01b031681565b6102606103b4366004614628565b611b8b565b6102f36103c7366004614477565b6001600160a01b031660009081526068602052604090206002015490565b6102606103f336600461455f565b612239565b60345460ff166102c2565b61026061041136600461455f565b61257f565b6102606129ad565b6102f361042c3660046144af565b6001600160a01b0391821660009081526068602090815260408083209390941682526006909201909152205490565b610260610469366004614477565b612aaa565b600054610314906201000090046001600160a01b031681565b6102f3610495366004614477565b612b26565b606b54610314906001600160a01b031681565b6104f06104bb366004614477565b606860205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0016102ce565b6102f361052b366004614477565b6001600160a01b031660009081526068602052604090206001015490565b610260610557366004614477565b612b54565b61026061056a366004614477565b612c4b565b61026061057d3660046144e7565b612d15565b610260610590366004614477565b613025565b6102f36105a3366004614477565b60696020526000908152604090205481565b6102606105c3366004614477565b6130a9565b6102606105d63660046145fd565b6137b8565b610260613922565b6102606105f1366004614477565b613980565b6102f3610604366004614477565b6001600160a01b031660009081526068602052604090206003015490565b606e54610314906001600160a01b031681565b606a54610314906001600160a01b031681565b6102f36106563660046146c9565b613cd9565b606760019054906101000a90046001600160a01b03166001600160a01b03166307cf018c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a957600080fd5b505afa1580156106bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e19190614493565b6001600160a01b0316336001600160a01b0316148061070f575060675461010090046001600160a01b031633145b8061072a57506000546201000090046001600160a01b031633145b61074f5760405162461bcd60e51b8152600401610746906148a3565b60405180910390fd5b60675461010090046001600160a01b031661077c5760405162461bcd60e51b8152600401610746906147f4565b606754604080516301f3c06360e21b8152905160009261010090046001600160a01b0316916307cf018c916004808301926020929190829003018186803b1580156107c657600080fd5b505afa1580156107da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fe9190614493565b6001600160a01b031614156108255760405162461bcd60e51b81526004016107469061477d565b60016066600082825461083891906148d1565b90915550506066548161085d5760405162461bcd60e51b81526004016107469061481d565b6001600160a01b0384166000908152606860205260409020600281018390556001015461088a9083613e24565b6001600160a01b03851660009081526068602052604090206001810191909155546108b59083613e24565b6001600160a01b0385166000908152606860205260409020556108d88383613e30565b7f6a3ed0c1b8ff320f39fbf20d25cb3bc6bc231d2a05b280fc0ede537f0ae5874584848460405161090b93929190614726565b60405180910390a160665481146109345760405162461bcd60e51b81526004016107469061486c565b50505050565b6001600160a01b0381166109905760405162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f742062652030000000000000006044820152606401610746565b600154600160a01b900460ff16156109fc5760405162461bcd60e51b815260206004820152602960248201527f416c726561647920696e697469616c697a65642c20757365206e6f6d696e617460448201526832a732bba7bbb732b960b91b6064820152608401610746565b6001805460ff60a01b1916600160a01b179055600080546001600160a01b03831662010000810262010000600160b01b03199092169190911782556040805192835260208301919091527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91015b60405180910390a150565b610a7d613ef0565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290602001610a6a565b610ad3613ef0565b8015610ae457610ae1613f6a565b50565b610ae1613fdf565b60345460ff1615610b0f5760405162461bcd60e51b8152600401610746906147ca565b606754604051633761c52760e11b81523360048201526101009091046001600160a01b031690636ec38a4e9060240160206040518083038186803b158015610b5657600080fd5b505afa158015610b6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8e9190614695565b610baa5760405162461bcd60e51b815260040161074690614840565b33600090815260696020526040902054811115610bf65760405162461bcd60e51b815260206004820152600a6024820152692637bb90333ab732399760b11b6044820152606401610746565b33600090815260696020526040902054610c109082614059565b33600090815260696020526040902055610c2a8282614065565b5050565b606760019054906101000a90046001600160a01b03166001600160a01b03166307cf018c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c7c57600080fd5b505afa158015610c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb49190614493565b6001600160a01b0316336001600160a01b03161480610ce2575060675461010090046001600160a01b031633145b80610cfd57506000546201000090046001600160a01b031633145b610d195760405162461bcd60e51b8152600401610746906148a3565b60675461010090046001600160a01b0316610d465760405162461bcd60e51b8152600401610746906147f4565b606754604080516301f3c06360e21b8152905160009261010090046001600160a01b0316916307cf018c916004808301926020929190829003018186803b158015610d9057600080fd5b505afa158015610da4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc89190614493565b6001600160a01b03161415610def5760405162461bcd60e51b81526004016107469061477d565b600160666000828254610e0291906148d1565b9091555050606654606754604051633761c52760e11b81526001600160a01b03888116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b158015610e5557600080fd5b505afa158015610e69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8d9190614695565b610ea95760405162461bcd60e51b8152600401610746906147a1565b6001600160a01b038616600090815260686020526040902060010154841115610f035760405162461bcd60e51b815260206004820152600c60248201526b115e18d959591cc8189bdb9960a21b6044820152606401610746565b60658310158015610f15575060698311155b610f585760405162461bcd60e51b8152602060048201526014602482015273496e76616c696420626f6e64546f52656475636560601b6044820152606401610746565b606583148015610f8357506001600160a01b0386166000908152606860205260409020600201548411155b15610fcf576001600160a01b038616600090815260686020526040902060020154610fae9085614059565b6001600160a01b0387166000908152606860205260409020600201556115f3565b606683148015610ffa57506001600160a01b0386166000908152606860205260409020600301548411155b15611046576001600160a01b0386166000908152606860205260409020600301546110259085614059565b6001600160a01b0387166000908152606860205260409020600301556115f3565b60678314801561107c57506001600160a01b03808716600090815260686020908152604082209285169091526006909101905260015b80156110f85750856001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b1580156110bc57600080fd5b505afa1580156110d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f491906146b1565b8411155b15611214576001600160a01b03808716600090815260686020908152604080832093861683526006909301905220546111319085614059565b6001600160a01b0380881660008181526068602081815260408084209589168452600686018252832095909555919052909152600401546111729085614059565b6001600160a01b0380881660009081526068602090815260408083206004810195909555928616825260069093019092529020546111d6576001600160a01b0386166000908152606860205260409020600501546111d1906001614059565b6111f3565b6001600160a01b0386166000908152606860205260409020600501545b6001600160a01b0387166000908152606860205260409020600501556115f3565b6068831480156112b957506112b5866001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b15801561125b57600080fd5b505afa15801561126f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129391906146b1565b6001600160a01b03881660009081526068602052604090206002015490613e24565b8411155b80156112df57506001600160a01b03861660009081526068602052604090206002015484115b1561140d576001600160a01b03861660009081526068602052604090206002015461133f9061130f908690614059565b6001600160a01b038089166000908152606860209081526040808320938816835260069093019052205490614059565b6001600160a01b0380881660008181526068602081815260408084209589168452600686018252832095909555919052909152600201546113a790611385908690614059565b6001600160a01b03881660009081526068602052604090206004015490614059565b6001600160a01b038088166000908152606860209081526040808320600481019590955560028501839055928616825260069093019092529020546111d6576001600160a01b0386166000908152606860205260409020600501546111d1906001614059565b6069831480156114b257506114ae866001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b15801561145457600080fd5b505afa158015611468573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148c91906146b1565b6001600160a01b03881660009081526068602052604090206003015490613e24565b8411155b80156114d857506001600160a01b03861660009081526068602052604090206003015484115b156115f3576001600160a01b0386166000908152606860205260409020600301546115089061130f908690614059565b6001600160a01b03808816600081815260686020818152604080842095891684526006860182528320959095559190529091526003015461154e90611385908690614059565b6001600160a01b038088166000908152606860209081526040808320600481019590955560038501839055928616825260069093019092529020546115b9576001600160a01b0386166000908152606860205260409020600501546115b4906001614059565b6115d6565b6001600160a01b0386166000908152606860205260409020600501545b6001600160a01b0387166000908152606860205260409020600501555b6001600160a01b0386166000908152606860205260409020600101546116199085614059565b6001600160a01b03871660009081526068602052604090206001015561163f8585614065565b6000805160206149a583398151915286868660405161166093929190614726565b60405180910390a160665481146116895760405162461bcd60e51b81526004016107469061486c565b505050505050565b606760019054906101000a90046001600160a01b03166001600160a01b03166307cf018c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116df57600080fd5b505afa1580156116f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117179190614493565b6001600160a01b0316336001600160a01b03161480611745575060675461010090046001600160a01b031633145b8061176057506000546201000090046001600160a01b031633145b61177c5760405162461bcd60e51b8152600401610746906148a3565b60675461010090046001600160a01b03166117a95760405162461bcd60e51b8152600401610746906147f4565b606754604080516301f3c06360e21b8152905160009261010090046001600160a01b0316916307cf018c916004808301926020929190829003018186803b1580156117f357600080fd5b505afa158015611807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182b9190614493565b6001600160a01b031614156118525760405162461bcd60e51b81526004016107469061477d565b60016066600082825461186591906148d1565b9091555050606654606754604051633761c52760e11b81526001600160a01b03868116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b1580156118b857600080fd5b505afa1580156118cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f09190614695565b61190c5760405162461bcd60e51b8152600401610746906147a1565b6001600160a01b038416600090815260686020526040902060010154821180159061195257506001600160a01b0384166000908152606860205260409020600401548211155b61198d5760405162461bcd60e51b815260206004820152600c60248201526b115e18d959591cc8189bdb9960a21b6044820152606401610746565b6001600160a01b038416600090815260686020526040902060050154158015906119e057506001600160a01b03808516600090815260686020908152604080832093871683526006909301905220548211155b611a1e5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401610746565b6001600160a01b038416600090815260686020526040902060010154611a449083614059565b6001600160a01b038086166000908152606860209081526040808320600181019590955592871682526006909301909252902054611a829083614059565b6001600160a01b038086166000818152606860208181526040808420958a16845260068601825283209590955591905290915260040154611ac39083614059565b6001600160a01b038086166000908152606860209081526040808320600481019590955592871682526006909301909252902054611b27576001600160a01b038416600090815260686020526040902060050154611b22906001614059565b611b44565b6001600160a01b0384166000908152606860205260409020600501545b6001600160a01b038516600090815260686020526040902060050155611b6a8383614065565b6000805160206149a583398151915284848460405161090b93929190614726565b60345460ff1615611bae5760405162461bcd60e51b8152600401610746906147ca565b606754604051633761c52760e11b81523360048201526101009091046001600160a01b031690636ec38a4e9060240160206040518083038186803b158015611bf557600080fd5b505afa158015611c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2d9190614695565b611c495760405162461bcd60e51b815260040161074690614840565b33600090815260696020526040902054611c639085613e24565b33600090815260696020526040902055606a546001600160a01b031615611ceb57606a546040516302c7739b60e01b81526001600160a01b03878116600483015260248201879052909116906302c7739b90604401600060405180830381600087803b158015611cd257600080fd5b505af1158015611ce6573d6000803e3d6000fd5b505050505b606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3957600080fd5b505afa158015611d4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d719190614493565b6001600160a01b0316836001600160a01b03161415611d9957611d948585613e30565b612232565b6000611da484614123565b9050600081600f0b138015611dc25750606a54600160a01b900460ff165b611e075760405162461bcd60e51b81526020600482015260166024820152751d5b9cdd5c1c1bdc9d19590818dbdb1b185d195c985b60521b6044820152606401610746565b6000611e1586866001613cd9565b606c549091506000906001600160a01b0387811691161480611e445750606d546001600160a01b038781169116145b611e4e5781611e5d565b611e5d8264e8d4a51000614188565b90506000606f54118015611ea95750611ea5670de0b6b3a7640000611e9f611e98606f54670de0b6b3a764000061405990919063ffffffff16565b8a90614188565b90614194565b8110155b611f035760405162461bcd60e51b815260206004820152602560248201527f416d6f756e742062656c6f77206d617820616c6c6f7765642070656720736c69604482015264707061676560d81b6064820152608401610746565b611f15670de0b6b3a764000085613e24565b611f2b86611e9f85670de0b6b3a7640000614188565b1115611f6e5760405162461bcd60e51b8152602060048201526012602482015271536c69707061676520746f6f20686967682160701b6044820152606401610746565b6040516370a0823160e01b81526001600160a01b0389811660048301528391908816906370a082319060240160206040518083038186803b158015611fb257600080fd5b505afa158015611fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fea91906146b1565b101561202d5760405162461bcd60e51b815260206004820152601260248201527153656e6465722062616c616e6365206c6f7760701b6044820152606401610746565b81866001600160a01b031663dd62ed3e8a606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b15801561208c57600080fd5b505afa1580156120a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c49190614493565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b15801561210a57600080fd5b505afa15801561211e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214291906146b1565b10156121805760405162461bcd60e51b815260206004820152600d60248201526c27379030b63637bbb0b731b29760991b6044820152606401610746565b856121966001600160a01b0382168a30866141a0565b606b54604051635320bf6b60e11b8152600f86900b60048201526000602482015260448101859052606481018a90526001600160a01b039091169063a6417ed690608401602060405180830381600087803b1580156121f457600080fd5b505af1158015612208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222c91906146b1565b50505050505b5050505050565b606760019054906101000a90046001600160a01b03166001600160a01b03166307cf018c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561228757600080fd5b505afa15801561229b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122bf9190614493565b6001600160a01b0316336001600160a01b031614806122ed575060675461010090046001600160a01b031633145b8061230857506000546201000090046001600160a01b031633145b6123245760405162461bcd60e51b8152600401610746906148a3565b60675461010090046001600160a01b03166123515760405162461bcd60e51b8152600401610746906147f4565b606754604080516301f3c06360e21b8152905160009261010090046001600160a01b0316916307cf018c916004808301926020929190829003018186803b15801561239b57600080fd5b505afa1580156123af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d39190614493565b6001600160a01b031614156123fa5760405162461bcd60e51b81526004016107469061477d565b60016066600082825461240d91906148d1565b9091555050606654816124325760405162461bcd60e51b81526004016107469061481d565b606754604051633761c52760e11b81526001600160a01b03868116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b15801561247d57600080fd5b505afa158015612491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b59190614695565b6124d15760405162461bcd60e51b8152600401610746906147a1565b6001600160a01b038416600090815260686020526040902060038101839055600101546124fe9083613e24565b6001600160a01b03851660009081526068602052604090206001810191909155546125299083613e24565b6001600160a01b03851660009081526068602052604090205561254c8383613e30565b7fa1563e4764b03f0c6fb0ee9834943e1235597748f321123fe47fd43e46086f5c84848460405161090b93929190614726565b606760019054906101000a90046001600160a01b03166001600160a01b03166307cf018c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156125cd57600080fd5b505afa1580156125e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126059190614493565b6001600160a01b0316336001600160a01b03161480612633575060675461010090046001600160a01b031633145b8061264e57506000546201000090046001600160a01b031633145b61266a5760405162461bcd60e51b8152600401610746906148a3565b60675461010090046001600160a01b03166126975760405162461bcd60e51b8152600401610746906147f4565b606754604080516301f3c06360e21b8152905160009261010090046001600160a01b0316916307cf018c916004808301926020929190829003018186803b1580156126e157600080fd5b505afa1580156126f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127199190614493565b6001600160a01b031614156127405760405162461bcd60e51b81526004016107469061477d565b60016066600082825461275391906148d1565b9091555050606654816127785760405162461bcd60e51b81526004016107469061481d565b606754604051633761c52760e11b81526001600160a01b03868116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b1580156127c357600080fd5b505afa1580156127d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fb9190614695565b6128175760405162461bcd60e51b8152600401610746906147a1565b6001600160a01b0380851660009081526068602090815260408083209387168352600690930190522054612889576001600160a01b03841660009081526068602052604090206005015461286c906001613e24565b6001600160a01b0385166000908152606860205260409020600501555b6001600160a01b03808516600090815260686020908152604080832093871683526006909301905220546128bd9083613e24565b6001600160a01b038086166000818152606860208181526040808420958a168452600686018252832095909555919052909152600401546128fe9083613e24565b6001600160a01b038516600090815260686020526040902060048101919091556001015461292c9083613e24565b6001600160a01b03851660009081526068602052604090206001810191909155546129579083613e24565b6001600160a01b03851660009081526068602052604090205561297a8383613e30565b7f7ebc12537ecdb10642293d25ea451b4ad812314aa64e90b1f439ef169860be2e84848460405161090b93929190614726565b6001546001600160a01b03163314612a255760405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527402063616e20616363657074206f776e65727368697605c1b6064820152608401610746565b60005460015460408051620100009093046001600160a01b03908116845290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600180546000805462010000600160b01b0319166001600160a01b03831662010000021790556001600160a01b0319169055565b612ab2613ef0565b6001600160a01b038116612ad85760405162461bcd60e51b8152600401610746906147a1565b606a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f05512095eb21e363428331e28648a88bf60350d313141549929a846c6d2ddfb190602001610a6a565b6001600160a01b038116600090815260686020526040812060018101549054612b4e91614059565b92915050565b612b5c613ef0565b6001600160a01b038116612b825760405162461bcd60e51b8152600401610746906147a1565b600154600160a81b900460ff1615612bd25760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481d1c985b9cd9995c9c9959606a1b6044820152606401610746565b600080546001600160a01b038381166201000081810262010000600160b01b031990941693909317938490556001805460ff60a81b1916600160a81b1790556040805193909404909116825260208201527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9101610a6a565b600054610100900460ff16612c665760005460ff1615612c6a565b303b155b612ccd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610746565b600054610100900460ff16158015612cef576000805461ffff19166101011790555b612cf88261093a565b612d00613922565b8015610c2a576000805461ff00191690555050565b612d1d613ef0565b606b80546001600160a01b03199081166001600160a01b03898116918217909355606e80548316898516908117909155606c80548416898616179055606d80549093169387169390931790915560405163095ea7b360e01b81526004810191909152600019602482015263095ea7b390604401602060405180830381600087803b158015612daa57600080fd5b505af1158015612dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de29190614695565b50606c5460405163095ea7b360e01b81526001600160a01b03888116600483015260001960248301529091169063095ea7b390604401602060405180830381600087803b158015612e3257600080fd5b505af1158015612e46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6a9190614695565b50606d5460405163095ea7b360e01b81526001600160a01b03888116600483015260001960248301529091169063095ea7b390604401602060405180830381600087803b158015612eba57600080fd5b505af1158015612ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef29190614695565b50606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b158015612f4157600080fd5b505afa158015612f55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f799190614493565b60405163095ea7b360e01b81526001600160a01b0388811660048301526000196024830152919091169063095ea7b390604401602060405180830381600087803b158015612fc657600080fd5b505af1158015612fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffe9190614695565b50606a8054921515600160a01b0260ff60a01b1990931692909217909155606f5550505050565b61302d613ef0565b6001600160a01b0381166130535760405162461bcd60e51b81526004016107469061477d565b60678054610100600160a81b0319166101006001600160a01b038416908102919091179091556040519081527f154e089317c4af354b1797cbc6b5e25eec4bdd82fd25292b9b8ede870b7d056e90602001610a6a565b606760019054906101000a90046001600160a01b03166001600160a01b03166307cf018c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156130f757600080fd5b505afa15801561310b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061312f9190614493565b6001600160a01b0316336001600160a01b0316148061315d575060675461010090046001600160a01b031633145b8061317857506000546201000090046001600160a01b031633145b6131945760405162461bcd60e51b8152600401610746906148a3565b60675461010090046001600160a01b03166131c15760405162461bcd60e51b8152600401610746906147f4565b606754604080516301f3c06360e21b8152905160009261010090046001600160a01b0316916307cf018c916004808301926020929190829003018186803b15801561320b57600080fd5b505afa15801561321f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132439190614493565b6001600160a01b0316141561326a5760405162461bcd60e51b81526004016107469061477d565b60016066600082825461327d91906148d1565b9091555050606654606754604051633761c52760e11b81526001600160a01b03848116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b1580156132d057600080fd5b505afa1580156132e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133089190614695565b6133245760405162461bcd60e51b8152600401610746906147a1565b6001600160a01b0382166000908152606860205260408120600381015460029091015461335091613e24565b6001600160a01b03841660009081526068602052604090206001015410613796576001600160a01b038316600090815260686020526040902060038101546002909101546133c4916133a29190613e24565b6001600160a01b03851660009081526068602052604090206001015490614059565b6001600160a01b0384811660008181526068602052604090819020600101939093556067549251630187eab160e71b81526004810191909152610100909204169063c3f558809060240160206040518083038186803b15801561342657600080fd5b505afa15801561343a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061345e9190614493565b60675460405163677755bb60e01b81526001600160a01b038681166004830152928316926101009092049091169063677755bb9060240160206040518083038186803b1580156134ad57600080fd5b505afa1580156134c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134e59190614493565b6001600160a01b03161415801561351657506001600160a01b03831660009081526068602052604090206002015415155b1561367157506001600160a01b038281166000818152606860205260408082206002018054929055606754905163677755bb60e01b8152600481019390935290926135c392610100909204169063677755bb906024015b60206040518083038186803b15801561358557600080fd5b505afa158015613599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bd9190614493565b82614065565b60675460405163677755bb60e01b81526001600160a01b0380861660048301526000805160206149a58339815191529286926101009091049091169063677755bb9060240160206040518083038186803b15801561362057600080fd5b505afa158015613634573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136589190614493565b8360405161366893929190614726565b60405180910390a15b6001600160a01b0383166000908152606860205260409020600301541561379657506001600160a01b0382811660008181526068602052604080822060030180549290556067549051630187eab160e71b8152600481019390935290926136e892610100909204169063c3f558809060240161356d565b606754604051630187eab160e71b81526001600160a01b0380861660048301526000805160206149a58339815191529286926101009091049091169063c3f558809060240160206040518083038186803b15801561374557600080fd5b505afa158015613759573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061377d9190614493565b8360405161378d93929190614726565b60405180910390a15b506066548114610c2a5760405162461bcd60e51b81526004016107469061486c565b60345460ff16156137db5760405162461bcd60e51b8152600401610746906147ca565b606754604051633761c52760e11b81523360048201526101009091046001600160a01b031690636ec38a4e9060240160206040518083038186803b15801561382257600080fd5b505afa158015613836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061385a9190614695565b6138765760405162461bcd60e51b815260040161074690614840565b336000908152606960205260409020546138909082613e24565b33600090815260696020526040902055606a546001600160a01b03161561391857606a546040516302c7739b60e01b81526001600160a01b03848116600483015260248201849052909116906302c7739b90604401600060405180830381600087803b1580156138ff57600080fd5b505af1158015613913573d6000803e3d6000fd5b505050505b610c2a8282613e30565b60675460ff161561396b5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610746565b6067805460ff19166001908117909155606655565b606760019054906101000a90046001600160a01b03166001600160a01b03166307cf018c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156139ce57600080fd5b505afa1580156139e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a069190614493565b6001600160a01b0316336001600160a01b03161480613a34575060675461010090046001600160a01b031633145b80613a4f57506000546201000090046001600160a01b031633145b613a6b5760405162461bcd60e51b8152600401610746906148a3565b60675461010090046001600160a01b0316613a985760405162461bcd60e51b8152600401610746906147f4565b606754604080516301f3c06360e21b8152905160009261010090046001600160a01b0316916307cf018c916004808301926020929190829003018186803b158015613ae257600080fd5b505afa158015613af6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b1a9190614493565b6001600160a01b03161415613b415760405162461bcd60e51b81526004016107469061477d565b600160666000828254613b5491906148d1565b9091555050606654606754604051633761c52760e11b81526001600160a01b03848116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b158015613ba757600080fd5b505afa158015613bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bdf9190614695565b613bfb5760405162461bcd60e51b8152600401610746906147a1565b6001600160a01b038216600090815260686020526040902060020154613c545760405162461bcd60e51b815260206004820152600e60248201526d043726561746f7220626f6e6420360941b6044820152606401610746565b6001600160a01b03821660008181526068602090815260408083206002810180546003909201829055939093558051938452908301919091527faf46e37b31310de99d1702f74e0089413810f8072b991cb092f925ae7124d4a5910160405180910390a16066548114610c2a5760405162461bcd60e51b81526004016107469061486c565b600080613ce584614123565b905080600f0b60001480613d035750606a54600160a01b900460ff16155b15613d12576000915050613e1d565b8215613de557613dde670de0b6b3a7640000611e9f613d4b613d3c662386f26fc100006005614194565b670de0b6b3a764000090613e24565b606b546040516307211ef760e01b815260006004820152600f87900b6024820152604481018b90526001600160a01b03909116906307211ef79060640160206040518083038186803b158015613da057600080fd5b505afa158015613db4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dd891906146b1565b90614188565b9150613e1b565b613e18670de0b6b3a7640000611e9f613d4b613e09662386f26fc10000600a614194565b670de0b6b3a764000090614059565b91505b505b9392505050565b6000613e1d82846148d1565b60345460ff1615613e535760405162461bcd60e51b8152600401610746906147ca565b610c2a823083606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b158015613ea757600080fd5b505afa158015613ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613edf9190614493565b6001600160a01b03169291906141a0565b6000546201000090046001600160a01b03163314613f685760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b6064820152608401610746565b565b60345460ff1615613f8d5760405162461bcd60e51b8152600401610746906147ca565b6034805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613fc23390565b6040516001600160a01b03909116815260200160405180910390a1565b60345460ff166140285760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610746565b6034805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613fc2565b6000613e1d8284614928565b60345460ff16156140885760405162461bcd60e51b8152600401610746906147ca565b610c2a8282606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b1580156140db57600080fd5b505afa1580156140ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141139190614493565b6001600160a01b031691906141f8565b606e546000906001600160a01b038381169116141561414457506001919050565b606c546001600160a01b038381169116141561416257506002919050565b606d546001600160a01b038381169116141561418057506003919050565b506000919050565b6000613e1d8284614909565b6000613e1d82846148e9565b610934846323b872dd60e01b8585856040516024016141c193929190614726565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261422d565b6040516001600160a01b03831660248201526044810182905261422890849063a9059cbb60e01b906064016141c1565b505050565b6000614282826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166142ff9092919063ffffffff16565b80519091501561422857808060200190518101906142a09190614695565b6142285760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610746565b606061430e8484600085614316565b949350505050565b6060824710156143775760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610746565b843b6143c55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610746565b600080866001600160a01b031685876040516143e1919061470a565b60006040518083038185875af1925050503d806000811461441e576040519150601f19603f3d011682016040523d82523d6000602084013e614423565b606091505b509150915061443382828661443e565b979650505050505050565b6060831561444d575081613e1d565b82511561445d5782518084602001fd5b8160405162461bcd60e51b8152600401610746919061474a565b600060208284031215614488578081fd5b8135613e1d81614981565b6000602082840312156144a4578081fd5b8151613e1d81614981565b600080604083850312156144c1578081fd5b82356144cc81614981565b915060208301356144dc81614981565b809150509250929050565b60008060008060008060c087890312156144ff578182fd5b863561450a81614981565b9550602087013561451a81614981565b9450604087013561452a81614981565b9350606087013561453a81614981565b9250608087013561454a81614996565b8092505060a087013590509295509295509295565b600080600060608486031215614573578283fd5b833561457e81614981565b9250602084013561458e81614981565b929592945050506040919091013590565b600080600080600060a086880312156145b6578081fd5b85356145c181614981565b945060208601356145d181614981565b9350604086013592506060860135915060808601356145ef81614981565b809150509295509295909350565b6000806040838503121561460f578182fd5b823561461a81614981565b946020939093013593505050565b600080600080600060a0868803121561463f578081fd5b853561464a81614981565b945060208601359350604086013561466181614981565b94979396509394606081013594506080013592915050565b60006020828403121561468a578081fd5b8135613e1d81614996565b6000602082840312156146a6578081fd5b8151613e1d81614996565b6000602082840312156146c2578081fd5b5051919050565b6000806000606084860312156146dd578283fd5b8335925060208401356146ef81614981565b915060408401356146ff81614996565b809150509250925092565b6000825161471c81846020870161493f565b9190910192915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b602081526000825180602084015261476981604085016020870161493f565b601f01601f19169190910160400192915050565b6020808252600a9082015269496e76616c6964204f4360b01b604082015260600190565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252600f908201526e24b73b30b634b21026b0b730b3b2b960891b604082015260600190565b602080825260099082015268426f6e64207a65726f60b81b604082015260600190565b6020808252601290820152712737ba1030b1ba34bb329036b0b935b2ba1760711b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601490820152732737ba1027a197a6b0b730b3b2b917a7bbb732b960611b604082015260600190565b600082198211156148e4576148e461496b565b500190565b60008261490457634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156149235761492361496b565b500290565b60008282101561493a5761493a61496b565b500390565b60005b8381101561495a578181015183820152602001614942565b838111156109345750506000910152565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610ae157600080fd5b8015158114610ae157600080fdfe60e37aa44e6b2c1aba5879edbe0d4326eff064606eb49d2d8f5d38fe8537e7d0a2646970667358221220b478cb1525ea4a61651b5d520d6e34c0c51195bde850ad331c44ac095093a75b64736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102485760003560e01c806380af208b1161013b578063d82aff11116100b8578063ec9fc3cc1161007c578063ec9fc3cc146105e3578063f29e0d0f146105f6578063f4b9fa7514610622578063fd8a8cc614610635578063ffe0b03f1461064857600080fd5b8063d82aff1114610582578063db2d274814610595578063df999f62146105b5578063e03e2d02146105c8578063ebc79772146105db57600080fd5b8063b584159b116100ff578063b584159b146104ad578063c0f166fb1461051d578063c3b83f5f14610549578063c4d66de81461055c578063d3c4297c1461056f57600080fd5b806380af208b1461041e578063857afabd1461045b5780638da5cb5b1461046e5780639cd0d4a414610487578063a5bf660d1461049a57600080fd5b80633e413bee116101c9578063584226961161018d57806358422696146103b95780635a090b68146103e55780635c975abb146103f85780637190e8151461040357806379ba50971461041657600080fd5b80633e413bee14610355578063403b14121461036857806341ed2c121461037b57806353a47bb714610393578063579175bf146103a657600080fd5b80631fbb38e8116102105780631fbb38e8146102ae57806327b153a0146102d75780632909f51a146102ea5780632f48ab7d146103015780633009101f1461032c57600080fd5b8063105743d11461024d57806313af4035146102625780631627540c1461027557806316c38b3c1461028857806317f7a1e41461029b575b600080fd5b61026061025b36600461455f565b61065b565b005b610260610270366004614477565b61093a565b610260610283366004614477565b610a75565b610260610296366004614679565b610acb565b6102606102a93660046145fd565b610aec565b606a546102c290600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b6102606102e536600461459f565b610c2e565b6102f3606f5481565b6040519081526020016102ce565b606d54610314906001600160a01b031681565b6040516001600160a01b0390911681526020016102ce565b6102f361033a366004614477565b6001600160a01b031660009081526068602052604090205490565b606c54610314906001600160a01b031681565b61026061037636600461455f565b611691565b6067546103149061010090046001600160a01b031681565b600154610314906001600160a01b031681565b6102606103b4366004614628565b611b8b565b6102f36103c7366004614477565b6001600160a01b031660009081526068602052604090206002015490565b6102606103f336600461455f565b612239565b60345460ff166102c2565b61026061041136600461455f565b61257f565b6102606129ad565b6102f361042c3660046144af565b6001600160a01b0391821660009081526068602090815260408083209390941682526006909201909152205490565b610260610469366004614477565b612aaa565b600054610314906201000090046001600160a01b031681565b6102f3610495366004614477565b612b26565b606b54610314906001600160a01b031681565b6104f06104bb366004614477565b606860205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0016102ce565b6102f361052b366004614477565b6001600160a01b031660009081526068602052604090206001015490565b610260610557366004614477565b612b54565b61026061056a366004614477565b612c4b565b61026061057d3660046144e7565b612d15565b610260610590366004614477565b613025565b6102f36105a3366004614477565b60696020526000908152604090205481565b6102606105c3366004614477565b6130a9565b6102606105d63660046145fd565b6137b8565b610260613922565b6102606105f1366004614477565b613980565b6102f3610604366004614477565b6001600160a01b031660009081526068602052604090206003015490565b606e54610314906001600160a01b031681565b606a54610314906001600160a01b031681565b6102f36106563660046146c9565b613cd9565b606760019054906101000a90046001600160a01b03166001600160a01b03166307cf018c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a957600080fd5b505afa1580156106bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e19190614493565b6001600160a01b0316336001600160a01b0316148061070f575060675461010090046001600160a01b031633145b8061072a57506000546201000090046001600160a01b031633145b61074f5760405162461bcd60e51b8152600401610746906148a3565b60405180910390fd5b60675461010090046001600160a01b031661077c5760405162461bcd60e51b8152600401610746906147f4565b606754604080516301f3c06360e21b8152905160009261010090046001600160a01b0316916307cf018c916004808301926020929190829003018186803b1580156107c657600080fd5b505afa1580156107da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fe9190614493565b6001600160a01b031614156108255760405162461bcd60e51b81526004016107469061477d565b60016066600082825461083891906148d1565b90915550506066548161085d5760405162461bcd60e51b81526004016107469061481d565b6001600160a01b0384166000908152606860205260409020600281018390556001015461088a9083613e24565b6001600160a01b03851660009081526068602052604090206001810191909155546108b59083613e24565b6001600160a01b0385166000908152606860205260409020556108d88383613e30565b7f6a3ed0c1b8ff320f39fbf20d25cb3bc6bc231d2a05b280fc0ede537f0ae5874584848460405161090b93929190614726565b60405180910390a160665481146109345760405162461bcd60e51b81526004016107469061486c565b50505050565b6001600160a01b0381166109905760405162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f742062652030000000000000006044820152606401610746565b600154600160a01b900460ff16156109fc5760405162461bcd60e51b815260206004820152602960248201527f416c726561647920696e697469616c697a65642c20757365206e6f6d696e617460448201526832a732bba7bbb732b960b91b6064820152608401610746565b6001805460ff60a01b1916600160a01b179055600080546001600160a01b03831662010000810262010000600160b01b03199092169190911782556040805192835260208301919091527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91015b60405180910390a150565b610a7d613ef0565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290602001610a6a565b610ad3613ef0565b8015610ae457610ae1613f6a565b50565b610ae1613fdf565b60345460ff1615610b0f5760405162461bcd60e51b8152600401610746906147ca565b606754604051633761c52760e11b81523360048201526101009091046001600160a01b031690636ec38a4e9060240160206040518083038186803b158015610b5657600080fd5b505afa158015610b6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8e9190614695565b610baa5760405162461bcd60e51b815260040161074690614840565b33600090815260696020526040902054811115610bf65760405162461bcd60e51b815260206004820152600a6024820152692637bb90333ab732399760b11b6044820152606401610746565b33600090815260696020526040902054610c109082614059565b33600090815260696020526040902055610c2a8282614065565b5050565b606760019054906101000a90046001600160a01b03166001600160a01b03166307cf018c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c7c57600080fd5b505afa158015610c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb49190614493565b6001600160a01b0316336001600160a01b03161480610ce2575060675461010090046001600160a01b031633145b80610cfd57506000546201000090046001600160a01b031633145b610d195760405162461bcd60e51b8152600401610746906148a3565b60675461010090046001600160a01b0316610d465760405162461bcd60e51b8152600401610746906147f4565b606754604080516301f3c06360e21b8152905160009261010090046001600160a01b0316916307cf018c916004808301926020929190829003018186803b158015610d9057600080fd5b505afa158015610da4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc89190614493565b6001600160a01b03161415610def5760405162461bcd60e51b81526004016107469061477d565b600160666000828254610e0291906148d1565b9091555050606654606754604051633761c52760e11b81526001600160a01b03888116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b158015610e5557600080fd5b505afa158015610e69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8d9190614695565b610ea95760405162461bcd60e51b8152600401610746906147a1565b6001600160a01b038616600090815260686020526040902060010154841115610f035760405162461bcd60e51b815260206004820152600c60248201526b115e18d959591cc8189bdb9960a21b6044820152606401610746565b60658310158015610f15575060698311155b610f585760405162461bcd60e51b8152602060048201526014602482015273496e76616c696420626f6e64546f52656475636560601b6044820152606401610746565b606583148015610f8357506001600160a01b0386166000908152606860205260409020600201548411155b15610fcf576001600160a01b038616600090815260686020526040902060020154610fae9085614059565b6001600160a01b0387166000908152606860205260409020600201556115f3565b606683148015610ffa57506001600160a01b0386166000908152606860205260409020600301548411155b15611046576001600160a01b0386166000908152606860205260409020600301546110259085614059565b6001600160a01b0387166000908152606860205260409020600301556115f3565b60678314801561107c57506001600160a01b03808716600090815260686020908152604082209285169091526006909101905260015b80156110f85750856001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b1580156110bc57600080fd5b505afa1580156110d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f491906146b1565b8411155b15611214576001600160a01b03808716600090815260686020908152604080832093861683526006909301905220546111319085614059565b6001600160a01b0380881660008181526068602081815260408084209589168452600686018252832095909555919052909152600401546111729085614059565b6001600160a01b0380881660009081526068602090815260408083206004810195909555928616825260069093019092529020546111d6576001600160a01b0386166000908152606860205260409020600501546111d1906001614059565b6111f3565b6001600160a01b0386166000908152606860205260409020600501545b6001600160a01b0387166000908152606860205260409020600501556115f3565b6068831480156112b957506112b5866001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b15801561125b57600080fd5b505afa15801561126f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129391906146b1565b6001600160a01b03881660009081526068602052604090206002015490613e24565b8411155b80156112df57506001600160a01b03861660009081526068602052604090206002015484115b1561140d576001600160a01b03861660009081526068602052604090206002015461133f9061130f908690614059565b6001600160a01b038089166000908152606860209081526040808320938816835260069093019052205490614059565b6001600160a01b0380881660008181526068602081815260408084209589168452600686018252832095909555919052909152600201546113a790611385908690614059565b6001600160a01b03881660009081526068602052604090206004015490614059565b6001600160a01b038088166000908152606860209081526040808320600481019590955560028501839055928616825260069093019092529020546111d6576001600160a01b0386166000908152606860205260409020600501546111d1906001614059565b6069831480156114b257506114ae866001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b15801561145457600080fd5b505afa158015611468573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148c91906146b1565b6001600160a01b03881660009081526068602052604090206003015490613e24565b8411155b80156114d857506001600160a01b03861660009081526068602052604090206003015484115b156115f3576001600160a01b0386166000908152606860205260409020600301546115089061130f908690614059565b6001600160a01b03808816600081815260686020818152604080842095891684526006860182528320959095559190529091526003015461154e90611385908690614059565b6001600160a01b038088166000908152606860209081526040808320600481019590955560038501839055928616825260069093019092529020546115b9576001600160a01b0386166000908152606860205260409020600501546115b4906001614059565b6115d6565b6001600160a01b0386166000908152606860205260409020600501545b6001600160a01b0387166000908152606860205260409020600501555b6001600160a01b0386166000908152606860205260409020600101546116199085614059565b6001600160a01b03871660009081526068602052604090206001015561163f8585614065565b6000805160206149a583398151915286868660405161166093929190614726565b60405180910390a160665481146116895760405162461bcd60e51b81526004016107469061486c565b505050505050565b606760019054906101000a90046001600160a01b03166001600160a01b03166307cf018c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116df57600080fd5b505afa1580156116f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117179190614493565b6001600160a01b0316336001600160a01b03161480611745575060675461010090046001600160a01b031633145b8061176057506000546201000090046001600160a01b031633145b61177c5760405162461bcd60e51b8152600401610746906148a3565b60675461010090046001600160a01b03166117a95760405162461bcd60e51b8152600401610746906147f4565b606754604080516301f3c06360e21b8152905160009261010090046001600160a01b0316916307cf018c916004808301926020929190829003018186803b1580156117f357600080fd5b505afa158015611807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182b9190614493565b6001600160a01b031614156118525760405162461bcd60e51b81526004016107469061477d565b60016066600082825461186591906148d1565b9091555050606654606754604051633761c52760e11b81526001600160a01b03868116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b1580156118b857600080fd5b505afa1580156118cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f09190614695565b61190c5760405162461bcd60e51b8152600401610746906147a1565b6001600160a01b038416600090815260686020526040902060010154821180159061195257506001600160a01b0384166000908152606860205260409020600401548211155b61198d5760405162461bcd60e51b815260206004820152600c60248201526b115e18d959591cc8189bdb9960a21b6044820152606401610746565b6001600160a01b038416600090815260686020526040902060050154158015906119e057506001600160a01b03808516600090815260686020908152604080832093871683526006909301905220548211155b611a1e5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401610746565b6001600160a01b038416600090815260686020526040902060010154611a449083614059565b6001600160a01b038086166000908152606860209081526040808320600181019590955592871682526006909301909252902054611a829083614059565b6001600160a01b038086166000818152606860208181526040808420958a16845260068601825283209590955591905290915260040154611ac39083614059565b6001600160a01b038086166000908152606860209081526040808320600481019590955592871682526006909301909252902054611b27576001600160a01b038416600090815260686020526040902060050154611b22906001614059565b611b44565b6001600160a01b0384166000908152606860205260409020600501545b6001600160a01b038516600090815260686020526040902060050155611b6a8383614065565b6000805160206149a583398151915284848460405161090b93929190614726565b60345460ff1615611bae5760405162461bcd60e51b8152600401610746906147ca565b606754604051633761c52760e11b81523360048201526101009091046001600160a01b031690636ec38a4e9060240160206040518083038186803b158015611bf557600080fd5b505afa158015611c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2d9190614695565b611c495760405162461bcd60e51b815260040161074690614840565b33600090815260696020526040902054611c639085613e24565b33600090815260696020526040902055606a546001600160a01b031615611ceb57606a546040516302c7739b60e01b81526001600160a01b03878116600483015260248201879052909116906302c7739b90604401600060405180830381600087803b158015611cd257600080fd5b505af1158015611ce6573d6000803e3d6000fd5b505050505b606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3957600080fd5b505afa158015611d4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d719190614493565b6001600160a01b0316836001600160a01b03161415611d9957611d948585613e30565b612232565b6000611da484614123565b9050600081600f0b138015611dc25750606a54600160a01b900460ff165b611e075760405162461bcd60e51b81526020600482015260166024820152751d5b9cdd5c1c1bdc9d19590818dbdb1b185d195c985b60521b6044820152606401610746565b6000611e1586866001613cd9565b606c549091506000906001600160a01b0387811691161480611e445750606d546001600160a01b038781169116145b611e4e5781611e5d565b611e5d8264e8d4a51000614188565b90506000606f54118015611ea95750611ea5670de0b6b3a7640000611e9f611e98606f54670de0b6b3a764000061405990919063ffffffff16565b8a90614188565b90614194565b8110155b611f035760405162461bcd60e51b815260206004820152602560248201527f416d6f756e742062656c6f77206d617820616c6c6f7765642070656720736c69604482015264707061676560d81b6064820152608401610746565b611f15670de0b6b3a764000085613e24565b611f2b86611e9f85670de0b6b3a7640000614188565b1115611f6e5760405162461bcd60e51b8152602060048201526012602482015271536c69707061676520746f6f20686967682160701b6044820152606401610746565b6040516370a0823160e01b81526001600160a01b0389811660048301528391908816906370a082319060240160206040518083038186803b158015611fb257600080fd5b505afa158015611fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fea91906146b1565b101561202d5760405162461bcd60e51b815260206004820152601260248201527153656e6465722062616c616e6365206c6f7760701b6044820152606401610746565b81866001600160a01b031663dd62ed3e8a606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b15801561208c57600080fd5b505afa1580156120a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c49190614493565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b15801561210a57600080fd5b505afa15801561211e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214291906146b1565b10156121805760405162461bcd60e51b815260206004820152600d60248201526c27379030b63637bbb0b731b29760991b6044820152606401610746565b856121966001600160a01b0382168a30866141a0565b606b54604051635320bf6b60e11b8152600f86900b60048201526000602482015260448101859052606481018a90526001600160a01b039091169063a6417ed690608401602060405180830381600087803b1580156121f457600080fd5b505af1158015612208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222c91906146b1565b50505050505b5050505050565b606760019054906101000a90046001600160a01b03166001600160a01b03166307cf018c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561228757600080fd5b505afa15801561229b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122bf9190614493565b6001600160a01b0316336001600160a01b031614806122ed575060675461010090046001600160a01b031633145b8061230857506000546201000090046001600160a01b031633145b6123245760405162461bcd60e51b8152600401610746906148a3565b60675461010090046001600160a01b03166123515760405162461bcd60e51b8152600401610746906147f4565b606754604080516301f3c06360e21b8152905160009261010090046001600160a01b0316916307cf018c916004808301926020929190829003018186803b15801561239b57600080fd5b505afa1580156123af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d39190614493565b6001600160a01b031614156123fa5760405162461bcd60e51b81526004016107469061477d565b60016066600082825461240d91906148d1565b9091555050606654816124325760405162461bcd60e51b81526004016107469061481d565b606754604051633761c52760e11b81526001600160a01b03868116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b15801561247d57600080fd5b505afa158015612491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b59190614695565b6124d15760405162461bcd60e51b8152600401610746906147a1565b6001600160a01b038416600090815260686020526040902060038101839055600101546124fe9083613e24565b6001600160a01b03851660009081526068602052604090206001810191909155546125299083613e24565b6001600160a01b03851660009081526068602052604090205561254c8383613e30565b7fa1563e4764b03f0c6fb0ee9834943e1235597748f321123fe47fd43e46086f5c84848460405161090b93929190614726565b606760019054906101000a90046001600160a01b03166001600160a01b03166307cf018c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156125cd57600080fd5b505afa1580156125e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126059190614493565b6001600160a01b0316336001600160a01b03161480612633575060675461010090046001600160a01b031633145b8061264e57506000546201000090046001600160a01b031633145b61266a5760405162461bcd60e51b8152600401610746906148a3565b60675461010090046001600160a01b03166126975760405162461bcd60e51b8152600401610746906147f4565b606754604080516301f3c06360e21b8152905160009261010090046001600160a01b0316916307cf018c916004808301926020929190829003018186803b1580156126e157600080fd5b505afa1580156126f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127199190614493565b6001600160a01b031614156127405760405162461bcd60e51b81526004016107469061477d565b60016066600082825461275391906148d1565b9091555050606654816127785760405162461bcd60e51b81526004016107469061481d565b606754604051633761c52760e11b81526001600160a01b03868116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b1580156127c357600080fd5b505afa1580156127d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fb9190614695565b6128175760405162461bcd60e51b8152600401610746906147a1565b6001600160a01b0380851660009081526068602090815260408083209387168352600690930190522054612889576001600160a01b03841660009081526068602052604090206005015461286c906001613e24565b6001600160a01b0385166000908152606860205260409020600501555b6001600160a01b03808516600090815260686020908152604080832093871683526006909301905220546128bd9083613e24565b6001600160a01b038086166000818152606860208181526040808420958a168452600686018252832095909555919052909152600401546128fe9083613e24565b6001600160a01b038516600090815260686020526040902060048101919091556001015461292c9083613e24565b6001600160a01b03851660009081526068602052604090206001810191909155546129579083613e24565b6001600160a01b03851660009081526068602052604090205561297a8383613e30565b7f7ebc12537ecdb10642293d25ea451b4ad812314aa64e90b1f439ef169860be2e84848460405161090b93929190614726565b6001546001600160a01b03163314612a255760405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527402063616e20616363657074206f776e65727368697605c1b6064820152608401610746565b60005460015460408051620100009093046001600160a01b03908116845290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600180546000805462010000600160b01b0319166001600160a01b03831662010000021790556001600160a01b0319169055565b612ab2613ef0565b6001600160a01b038116612ad85760405162461bcd60e51b8152600401610746906147a1565b606a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f05512095eb21e363428331e28648a88bf60350d313141549929a846c6d2ddfb190602001610a6a565b6001600160a01b038116600090815260686020526040812060018101549054612b4e91614059565b92915050565b612b5c613ef0565b6001600160a01b038116612b825760405162461bcd60e51b8152600401610746906147a1565b600154600160a81b900460ff1615612bd25760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481d1c985b9cd9995c9c9959606a1b6044820152606401610746565b600080546001600160a01b038381166201000081810262010000600160b01b031990941693909317938490556001805460ff60a81b1916600160a81b1790556040805193909404909116825260208201527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9101610a6a565b600054610100900460ff16612c665760005460ff1615612c6a565b303b155b612ccd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610746565b600054610100900460ff16158015612cef576000805461ffff19166101011790555b612cf88261093a565b612d00613922565b8015610c2a576000805461ff00191690555050565b612d1d613ef0565b606b80546001600160a01b03199081166001600160a01b03898116918217909355606e80548316898516908117909155606c80548416898616179055606d80549093169387169390931790915560405163095ea7b360e01b81526004810191909152600019602482015263095ea7b390604401602060405180830381600087803b158015612daa57600080fd5b505af1158015612dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de29190614695565b50606c5460405163095ea7b360e01b81526001600160a01b03888116600483015260001960248301529091169063095ea7b390604401602060405180830381600087803b158015612e3257600080fd5b505af1158015612e46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6a9190614695565b50606d5460405163095ea7b360e01b81526001600160a01b03888116600483015260001960248301529091169063095ea7b390604401602060405180830381600087803b158015612eba57600080fd5b505af1158015612ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef29190614695565b50606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b158015612f4157600080fd5b505afa158015612f55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f799190614493565b60405163095ea7b360e01b81526001600160a01b0388811660048301526000196024830152919091169063095ea7b390604401602060405180830381600087803b158015612fc657600080fd5b505af1158015612fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffe9190614695565b50606a8054921515600160a01b0260ff60a01b1990931692909217909155606f5550505050565b61302d613ef0565b6001600160a01b0381166130535760405162461bcd60e51b81526004016107469061477d565b60678054610100600160a81b0319166101006001600160a01b038416908102919091179091556040519081527f154e089317c4af354b1797cbc6b5e25eec4bdd82fd25292b9b8ede870b7d056e90602001610a6a565b606760019054906101000a90046001600160a01b03166001600160a01b03166307cf018c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156130f757600080fd5b505afa15801561310b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061312f9190614493565b6001600160a01b0316336001600160a01b0316148061315d575060675461010090046001600160a01b031633145b8061317857506000546201000090046001600160a01b031633145b6131945760405162461bcd60e51b8152600401610746906148a3565b60675461010090046001600160a01b03166131c15760405162461bcd60e51b8152600401610746906147f4565b606754604080516301f3c06360e21b8152905160009261010090046001600160a01b0316916307cf018c916004808301926020929190829003018186803b15801561320b57600080fd5b505afa15801561321f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132439190614493565b6001600160a01b0316141561326a5760405162461bcd60e51b81526004016107469061477d565b60016066600082825461327d91906148d1565b9091555050606654606754604051633761c52760e11b81526001600160a01b03848116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b1580156132d057600080fd5b505afa1580156132e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133089190614695565b6133245760405162461bcd60e51b8152600401610746906147a1565b6001600160a01b0382166000908152606860205260408120600381015460029091015461335091613e24565b6001600160a01b03841660009081526068602052604090206001015410613796576001600160a01b038316600090815260686020526040902060038101546002909101546133c4916133a29190613e24565b6001600160a01b03851660009081526068602052604090206001015490614059565b6001600160a01b0384811660008181526068602052604090819020600101939093556067549251630187eab160e71b81526004810191909152610100909204169063c3f558809060240160206040518083038186803b15801561342657600080fd5b505afa15801561343a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061345e9190614493565b60675460405163677755bb60e01b81526001600160a01b038681166004830152928316926101009092049091169063677755bb9060240160206040518083038186803b1580156134ad57600080fd5b505afa1580156134c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134e59190614493565b6001600160a01b03161415801561351657506001600160a01b03831660009081526068602052604090206002015415155b1561367157506001600160a01b038281166000818152606860205260408082206002018054929055606754905163677755bb60e01b8152600481019390935290926135c392610100909204169063677755bb906024015b60206040518083038186803b15801561358557600080fd5b505afa158015613599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bd9190614493565b82614065565b60675460405163677755bb60e01b81526001600160a01b0380861660048301526000805160206149a58339815191529286926101009091049091169063677755bb9060240160206040518083038186803b15801561362057600080fd5b505afa158015613634573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136589190614493565b8360405161366893929190614726565b60405180910390a15b6001600160a01b0383166000908152606860205260409020600301541561379657506001600160a01b0382811660008181526068602052604080822060030180549290556067549051630187eab160e71b8152600481019390935290926136e892610100909204169063c3f558809060240161356d565b606754604051630187eab160e71b81526001600160a01b0380861660048301526000805160206149a58339815191529286926101009091049091169063c3f558809060240160206040518083038186803b15801561374557600080fd5b505afa158015613759573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061377d9190614493565b8360405161378d93929190614726565b60405180910390a15b506066548114610c2a5760405162461bcd60e51b81526004016107469061486c565b60345460ff16156137db5760405162461bcd60e51b8152600401610746906147ca565b606754604051633761c52760e11b81523360048201526101009091046001600160a01b031690636ec38a4e9060240160206040518083038186803b15801561382257600080fd5b505afa158015613836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061385a9190614695565b6138765760405162461bcd60e51b815260040161074690614840565b336000908152606960205260409020546138909082613e24565b33600090815260696020526040902055606a546001600160a01b03161561391857606a546040516302c7739b60e01b81526001600160a01b03848116600483015260248201849052909116906302c7739b90604401600060405180830381600087803b1580156138ff57600080fd5b505af1158015613913573d6000803e3d6000fd5b505050505b610c2a8282613e30565b60675460ff161561396b5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610746565b6067805460ff19166001908117909155606655565b606760019054906101000a90046001600160a01b03166001600160a01b03166307cf018c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156139ce57600080fd5b505afa1580156139e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a069190614493565b6001600160a01b0316336001600160a01b03161480613a34575060675461010090046001600160a01b031633145b80613a4f57506000546201000090046001600160a01b031633145b613a6b5760405162461bcd60e51b8152600401610746906148a3565b60675461010090046001600160a01b0316613a985760405162461bcd60e51b8152600401610746906147f4565b606754604080516301f3c06360e21b8152905160009261010090046001600160a01b0316916307cf018c916004808301926020929190829003018186803b158015613ae257600080fd5b505afa158015613af6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b1a9190614493565b6001600160a01b03161415613b415760405162461bcd60e51b81526004016107469061477d565b600160666000828254613b5491906148d1565b9091555050606654606754604051633761c52760e11b81526001600160a01b03848116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b158015613ba757600080fd5b505afa158015613bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bdf9190614695565b613bfb5760405162461bcd60e51b8152600401610746906147a1565b6001600160a01b038216600090815260686020526040902060020154613c545760405162461bcd60e51b815260206004820152600e60248201526d043726561746f7220626f6e6420360941b6044820152606401610746565b6001600160a01b03821660008181526068602090815260408083206002810180546003909201829055939093558051938452908301919091527faf46e37b31310de99d1702f74e0089413810f8072b991cb092f925ae7124d4a5910160405180910390a16066548114610c2a5760405162461bcd60e51b81526004016107469061486c565b600080613ce584614123565b905080600f0b60001480613d035750606a54600160a01b900460ff16155b15613d12576000915050613e1d565b8215613de557613dde670de0b6b3a7640000611e9f613d4b613d3c662386f26fc100006005614194565b670de0b6b3a764000090613e24565b606b546040516307211ef760e01b815260006004820152600f87900b6024820152604481018b90526001600160a01b03909116906307211ef79060640160206040518083038186803b158015613da057600080fd5b505afa158015613db4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dd891906146b1565b90614188565b9150613e1b565b613e18670de0b6b3a7640000611e9f613d4b613e09662386f26fc10000600a614194565b670de0b6b3a764000090614059565b91505b505b9392505050565b6000613e1d82846148d1565b60345460ff1615613e535760405162461bcd60e51b8152600401610746906147ca565b610c2a823083606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b158015613ea757600080fd5b505afa158015613ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613edf9190614493565b6001600160a01b03169291906141a0565b6000546201000090046001600160a01b03163314613f685760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b6064820152608401610746565b565b60345460ff1615613f8d5760405162461bcd60e51b8152600401610746906147ca565b6034805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613fc23390565b6040516001600160a01b03909116815260200160405180910390a1565b60345460ff166140285760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610746565b6034805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613fc2565b6000613e1d8284614928565b60345460ff16156140885760405162461bcd60e51b8152600401610746906147ca565b610c2a8282606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b1580156140db57600080fd5b505afa1580156140ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141139190614493565b6001600160a01b031691906141f8565b606e546000906001600160a01b038381169116141561414457506001919050565b606c546001600160a01b038381169116141561416257506002919050565b606d546001600160a01b038381169116141561418057506003919050565b506000919050565b6000613e1d8284614909565b6000613e1d82846148e9565b610934846323b872dd60e01b8585856040516024016141c193929190614726565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261422d565b6040516001600160a01b03831660248201526044810182905261422890849063a9059cbb60e01b906064016141c1565b505050565b6000614282826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166142ff9092919063ffffffff16565b80519091501561422857808060200190518101906142a09190614695565b6142285760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610746565b606061430e8484600085614316565b949350505050565b6060824710156143775760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610746565b843b6143c55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610746565b600080866001600160a01b031685876040516143e1919061470a565b60006040518083038185875af1925050503d806000811461441e576040519150601f19603f3d011682016040523d82523d6000602084013e614423565b606091505b509150915061443382828661443e565b979650505050505050565b6060831561444d575081613e1d565b82511561445d5782518084602001fd5b8160405162461bcd60e51b8152600401610746919061474a565b600060208284031215614488578081fd5b8135613e1d81614981565b6000602082840312156144a4578081fd5b8151613e1d81614981565b600080604083850312156144c1578081fd5b82356144cc81614981565b915060208301356144dc81614981565b809150509250929050565b60008060008060008060c087890312156144ff578182fd5b863561450a81614981565b9550602087013561451a81614981565b9450604087013561452a81614981565b9350606087013561453a81614981565b9250608087013561454a81614996565b8092505060a087013590509295509295509295565b600080600060608486031215614573578283fd5b833561457e81614981565b9250602084013561458e81614981565b929592945050506040919091013590565b600080600080600060a086880312156145b6578081fd5b85356145c181614981565b945060208601356145d181614981565b9350604086013592506060860135915060808601356145ef81614981565b809150509295509295909350565b6000806040838503121561460f578182fd5b823561461a81614981565b946020939093013593505050565b600080600080600060a0868803121561463f578081fd5b853561464a81614981565b945060208601359350604086013561466181614981565b94979396509394606081013594506080013592915050565b60006020828403121561468a578081fd5b8135613e1d81614996565b6000602082840312156146a6578081fd5b8151613e1d81614996565b6000602082840312156146c2578081fd5b5051919050565b6000806000606084860312156146dd578283fd5b8335925060208401356146ef81614981565b915060408401356146ff81614996565b809150509250925092565b6000825161471c81846020870161493f565b9190910192915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b602081526000825180602084015261476981604085016020870161493f565b601f01601f19169190910160400192915050565b6020808252600a9082015269496e76616c6964204f4360b01b604082015260600190565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252600f908201526e24b73b30b634b21026b0b730b3b2b960891b604082015260600190565b602080825260099082015268426f6e64207a65726f60b81b604082015260600190565b6020808252601290820152712737ba1030b1ba34bb329036b0b935b2ba1760711b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601490820152732737ba1027a197a6b0b730b3b2b917a7bbb732b960611b604082015260600190565b600082198211156148e4576148e461496b565b500190565b60008261490457634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156149235761492361496b565b500290565b60008282101561493a5761493a61496b565b500390565b60005b8381101561495a578181015183820152602001614942565b838111156109345750506000910152565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610ae157600080fd5b8015158114610ae157600080fdfe60e37aa44e6b2c1aba5879edbe0d4326eff064606eb49d2d8f5d38fe8537e7d0a2646970667358221220b478cb1525ea4a61651b5d520d6e34c0c51195bde850ad331c44ac095093a75b64736f6c63430008040033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.