More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 47 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint Prize Bond | 40467050 | 462 days ago | IN | 1 AVAX | 0.01195447 | ||||
Mint Prize Bond | 34291654 | 608 days ago | IN | 1 AVAX | 0.01274594 | ||||
Mint Prize Bond | 34290708 | 608 days ago | IN | 1 AVAX | 0.01267174 | ||||
Mint Prize Bond | 34083536 | 613 days ago | IN | 1 AVAX | 0.01267174 | ||||
Mint Prize Bond | 33956446 | 616 days ago | IN | 1 AVAX | 0.01274594 | ||||
Mint Prize Bond | 33945965 | 617 days ago | IN | 1 AVAX | 0.01274594 | ||||
Mint Prize Bond | 33920854 | 617 days ago | IN | 1 AVAX | 0.01202447 | ||||
Mint Prize Bond | 33788339 | 620 days ago | IN | 1 AVAX | 0.01202447 | ||||
Mint Prize Bond | 33788303 | 620 days ago | IN | 1 AVAX | 0.01202447 | ||||
Mint Prize Bond | 33788209 | 620 days ago | IN | 1 AVAX | 0.01195447 | ||||
Mint Prize Bond | 33585867 | 625 days ago | IN | 1 AVAX | 0.01255219 | ||||
Mint Prize Bond | 28998451 | 733 days ago | IN | 1 AVAX | 0.01475858 | ||||
Mint Prize Bond | 28998434 | 733 days ago | IN | 1 AVAX | 0.01644399 | ||||
Mint Prize Bond | 28998423 | 733 days ago | IN | 1 AVAX | 0.01531159 | ||||
Mint Prize Bond | 28998401 | 733 days ago | IN | 1 AVAX | 0.01505723 | ||||
Mint Prize Bond | 28998387 | 733 days ago | IN | 1 AVAX | 0.01547321 | ||||
Mint Prize Bond | 28998372 | 733 days ago | IN | 1 AVAX | 0.0149051 | ||||
Mint Prize Bond | 28998360 | 733 days ago | IN | 1 AVAX | 0.01535945 | ||||
Mint Prize Bond | 28998345 | 733 days ago | IN | 1 AVAX | 0.01486385 | ||||
Mint Prize Bond | 28998333 | 733 days ago | IN | 1 AVAX | 0.01657199 | ||||
Mint Prize Bond | 28998313 | 733 days ago | IN | 1 AVAX | 0.01526106 | ||||
Mint Prize Bond | 28998300 | 733 days ago | IN | 1 AVAX | 0.01569423 | ||||
Mint Prize Bond | 28998282 | 733 days ago | IN | 1 AVAX | 0.01763861 | ||||
Mint Prize Bond | 28998268 | 733 days ago | IN | 1 AVAX | 0.01706507 | ||||
Mint Prize Bond | 28998183 | 733 days ago | IN | 1 AVAX | 0.01585941 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
40824442 | 453 days ago | 0.01595702 AVAX | ||||
40824442 | 453 days ago | 0.02439406 AVAX | ||||
40824442 | 453 days ago | 0.04035108 AVAX | ||||
40467050 | 462 days ago | 1 AVAX | ||||
40025614 | 472 days ago | 0.03614774 AVAX | ||||
40025614 | 472 days ago | 0.05526034 AVAX | ||||
40025614 | 472 days ago | 0.09140808 AVAX | ||||
37238077 | 538 days ago | 0.0074371 AVAX | ||||
37238077 | 538 days ago | 0.01136935 AVAX | ||||
37238077 | 538 days ago | 0.01880645 AVAX | ||||
34291654 | 608 days ago | 1 AVAX | ||||
34290708 | 608 days ago | 1 AVAX | ||||
34272056 | 609 days ago | 0.12251111 AVAX | ||||
34272056 | 609 days ago | 0.1872871 AVAX | ||||
34272056 | 609 days ago | 0.30979822 AVAX | ||||
34083536 | 613 days ago | 1 AVAX | ||||
33956446 | 616 days ago | 1 AVAX | ||||
33945965 | 617 days ago | 1 AVAX | ||||
33920854 | 617 days ago | 1 AVAX | ||||
33788339 | 620 days ago | 1 AVAX | ||||
33788303 | 620 days ago | 1 AVAX | ||||
33788209 | 620 days ago | 1 AVAX | ||||
33585867 | 625 days ago | 1 AVAX | ||||
32418182 | 653 days ago | 0.5 AVAX | ||||
32415547 | 653 days ago | 0.00278144 AVAX |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
MyChanceAVAX
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "./Pausable.sol"; import "./AccessControl.sol"; import "./IERC20.sol"; import "./AutomationCompatible.sol"; import "./LibMyChanceAvax.sol"; import "./LibLendingPool.sol"; import "./LibConstants.sol"; import "./RandomRequester.sol"; import "./Charities.sol"; interface IMigration { function migrate( uint256 tokenId, uint256 weight ) external returns(bool); } abstract contract Lottery is Charities, RandomRequester, Pausable, AutomationCompatibleInterface { mapping(uint256=>LMyChance.SpecialLottery) specialLotteries; //Dates for Special Lotteries mapping(uint256=>uint256) reqToSpecialLottery; //ReqID to Date (for Special Lottery) mapping(uint256 => uint256) public mintingDate; uint256 public platformStakes; mapping(uint256 =>uint256) public claimable; uint256 totalFeesAVAX; mapping(address=>uint256) public increasedStakes; // It keeps track of the staking of each user uint256[] prizeBonds; mapping(uint256 => LMyChance.PrizeBondPosition) prizeBondPositions; uint256 pendingAVAX; uint256 totalAVAXBonds; uint256 sumWeights; uint256 public minimumWeight = 100; bool claimNotRequired; bool waitNotRequired; uint256 lastDrawn; //Date for the last normal drawn; struct ClaimVariables { uint256 totalFeesAVAX; uint256 totalToCharityAVAX; uint256 withdrawalAmountAVAX; } //Events event NewSpecialDraw(uint256 _drawDate); event SpecialDrawExecuted(uint256 indexed _tokenIdWinner, uint256 indexed _drawDate); event DrawExecuted(uint256 indexed _tokenIdWinner); event AssetsClaimed(address indexed _beneficiary, uint256 indexed _tokenId, uint256 _totalWinnerAVAX, uint256 _totalToCharityAVAX, uint256 _totalFeesLINK); event PrizeBondBurnt(uint256 indexed _tokenId); event StakeIncreased(uint256 _total); event StakeReduced(uint256 _total); event FeesClaimed(uint256 _total); constructor() { lastDrawn = block.timestamp - LibConstants.TIME_FOR_NEXT_DRAW; claimNotRequired = true; waitNotRequired = true; } //Public functions function draw() public whenNotPaused { require(canDraw(), "Not yet"); lastDrawn = block.timestamp; _randomnessRequest(); } function drawSpecialLottery(uint256 _drawDate) external whenNotPaused { LMyChance.SpecialLottery storage specialLottery = specialLotteries[_drawDate]; require(specialLottery.valid, "Invalid"); require(block.timestamp > _drawDate, "Not yet"); require(specialLottery.drawn == false, "Already drawn"); require(prizeBonds.length > 0, "Not enough bonds"); specialLottery.drawn = true; uint256 reqId = _randomnessRequest(); reqToSpecialLottery[reqId] = _drawDate; } function claim(uint256 _tokenId, uint256 _percentage, address payable _charity) external { require(LibConstants.prizeBond.ownerOf(_tokenId) == msg.sender, "Invalid owner"); require(claimable[_tokenId] > 0, "Nothing to claim"); require((block.timestamp > mintingDate[_tokenId] + LibConstants.TIME_FOR_NEXT_DRAW) || waitNotRequired, "Winner has to wait a week"); require(_percentage >= 5, "Minimum is 5%"); require(charities[_charity], "Invalid charity"); if (_percentage > 100) { _percentage = 100; } uint256 totalAVAX = claimable[_tokenId]; claimable[_tokenId] = 0; ClaimVariables memory claimVariables; if (totalAVAX > 0) { (claimVariables.withdrawalAmountAVAX, claimVariables.totalFeesAVAX, claimVariables.totalToCharityAVAX) = LMyChance.claimInternal(totalAVAX, _percentage); totalFeesAVAX += claimVariables.totalFeesAVAX; pendingAVAX -= claimVariables.withdrawalAmountAVAX; LibLendingPool.withdraw(claimVariables.withdrawalAmountAVAX, address(this)); payable (msg.sender).transfer((claimVariables.withdrawalAmountAVAX - claimVariables.totalToCharityAVAX)); (bool sent,) = _charity.call{value: claimVariables.totalToCharityAVAX}(""); require(sent, "Failed to send Ether"); emit AssetsClaimed(msg.sender, _tokenId, (claimVariables.withdrawalAmountAVAX - claimVariables.totalToCharityAVAX), claimVariables.totalToCharityAVAX, claimVariables.totalFeesAVAX); } } function mintPrizeBond(uint weight) payable external whenNotPaused { require(weight >= minimumWeight, "Invalid weight"); uint256 cost = weight * 1e16; //We set the minimum unit to 0.01 require(msg.value == cost, "Invalid value"); LibLendingPool.supply(cost); totalAVAXBonds += weight; LMyChance.mint(LibConstants.prizeBond, weight, mintingDate, prizeBonds, prizeBondPositions); sumWeights += weight; } function burnPrizeBond(uint256 _tokenId) external { require(claimable[_tokenId] == 0 || claimNotRequired, "Please claim first"); require(LibConstants.prizeBond.ownerOf(_tokenId) == msg.sender, "Invalid owner"); LibConstants.prizeBond.safeBurn(_tokenId); uint256 weight = prizeBondPositions[_tokenId].weight; LibLendingPool.withdraw(weight * 1e16, msg.sender); totalAVAXBonds -= weight; // Updates the list of prize bonds uint256 deletedWeght = LMyChance.removeTicket(prizeBondPositions,prizeBonds,_tokenId); sumWeights -= deletedWeght; emit PrizeBondBurnt(_tokenId); } function increaseStake() payable external whenNotPaused { LibLendingPool.supply(msg.value); platformStakes += msg.value; increasedStakes[msg.sender] += msg.value; emit StakeIncreased(msg.value); } function reduceStake(uint256 _total) external { require(increasedStakes[msg.sender] >= _total, "Invalid amount"); platformStakes -= _total; increasedStakes[msg.sender]-= _total; LibLendingPool.withdraw(_total, msg.sender); emit StakeReduced(_total); } //Public getters function canDraw() internal view returns (bool) { return block.timestamp >= getNextDrawDate() && prizeBonds.length > 0; } function accumulatedAVAX() public view returns (uint256) { return IERC20(LibConstants.avWAVAXToken).balanceOf(address(this)) - totalAVAXBonds * 1e16 - pendingAVAX - platformStakes; } function getNextDrawDate() public view returns(uint256) { return lastDrawn + LibConstants.TIME_FOR_NEXT_DRAW; } //Internal functions function _executeDraw(uint256 _random) internal { uint256 winnerIndex = LMyChance.winner_index(_random, prizeBonds, prizeBondPositions, sumWeights); uint256 tokenId = prizeBonds[winnerIndex]; uint256 totalAVAX = accumulatedAVAX(); pendingAVAX += totalAVAX; claimable[tokenId] += totalAVAX; emit DrawExecuted(tokenId); } function _executeSpecialDraw(uint256 _random, uint256 _specialLotDate) internal { uint256 winnerIndex = LMyChance.winner_index(_random, prizeBonds, prizeBondPositions, sumWeights); uint256 tokenId = prizeBonds[winnerIndex]; LMyChance.SpecialLottery storage lottery = specialLotteries[_specialLotDate]; lottery.winner = tokenId; claimable[tokenId] += lottery.total; emit SpecialDrawExecuted(tokenId, _specialLotDate); } function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal override { if (reqToSpecialLottery[requestId] > 0) { _executeSpecialDraw(randomWords[0], reqToSpecialLottery[requestId]); } else { _executeDraw(randomWords[0]); } } //ADMIN functions function setClaimNotRequired(bool set) onlyRole(DEFAULT_ADMIN_ROLE) public { claimNotRequired = set; } function setWaitNotRequired(bool set) onlyRole(DEFAULT_ADMIN_ROLE) public { waitNotRequired = set; } function _claimFees() onlyRole(FEES_ROLE) public { uint256 AVAXFees = totalFeesAVAX; totalFeesAVAX = 0; if (AVAXFees > 0) { LibLendingPool.withdraw(AVAXFees, msg.sender); pendingAVAX -= AVAXFees; emit FeesClaimed(AVAXFees); } } function _addSpecialLottery(uint256 _drawDate, uint256 _total, string memory _description) payable public onlyRole(DEFAULT_ADMIN_ROLE) { require(msg.value == _total); pendingAVAX += _total; LMyChance.addSpecialLottery(_total, specialLotteries, _drawDate, _description); LibLendingPool.supply(_total); emit NewSpecialDraw(_drawDate); } receive() external payable {} } abstract contract Recovery is Lottery { function _recoverTokens(uint256 _amount, address _asset) public onlyRole(DEFAULT_ADMIN_ROLE) { require(prizeBonds.length == 0, "Contract in use"); require(IERC20(_asset).transfer(msg.sender, _amount), 'Transfer failed'); } function _recoverAVAX(uint256 _amount) public onlyRole(DEFAULT_ADMIN_ROLE) { payable(msg.sender).transfer(_amount); } function _withdrawAndRecover(uint256 _amount) public onlyRole(DEFAULT_ADMIN_ROLE) { require(prizeBonds.length == 0, "Contract in use"); LibLendingPool.withdraw(_amount, msg.sender); } } abstract contract Migratable is Recovery { address newInstance; mapping(uint256=>bool) migrated; function startMigration(address _newInstance) public onlyRole(MIGRATOR_ROLE) { require (newInstance == address(0), "Already set"); newInstance = _newInstance; } function migrateMyself(uint256 _tokenId) external { require(claimable[_tokenId] == 0 || claimNotRequired, "Please claim first"); require(LibConstants.prizeBond.ownerOf(_tokenId) == msg.sender, "Invalid owner"); require (newInstance != address(0), "Cannot migrate yet"); require(!migrated[_tokenId], "Already migrated"); migrated[_tokenId] = true; uint256 weight = prizeBondPositions[_tokenId].weight; uint256 total; total = weight * 1e16; totalAVAXBonds -= weight; require(IERC20(LibConstants.avWAVAXToken).transfer(newInstance, total), 'Transfer failed'); require(IMigration(newInstance).migrate(_tokenId, weight), "Migration failed"); // Updates the list of prize bonds uint256 deletedWeght = LMyChance.removeTicket(prizeBondPositions, prizeBonds, _tokenId); sumWeights -= deletedWeght; } } contract MyChanceAVAX is Migratable { constructor() { _approveLP(LibConstants.avWAVAXToken, LibConstants.MAX_INT); } function migrate(uint256 tokenId, uint256 weight) public returns(bool) { require(msg.sender == 0x04f2559e75cf00a0eA163fC67e62E47C6743D02c, "Invalid caller"); totalAVAXBonds += weight; sumWeights += weight; mintingDate[tokenId] = block.timestamp; prizeBonds.push(tokenId); prizeBondPositions[tokenId].weight = weight; prizeBondPositions[tokenId].index = prizeBonds.length - 1; return true; } //Keepers Functions function checkUpkeep(bytes calldata) external view override returns (bool upkeepNeeded, bytes memory) { upkeepNeeded = canDraw(); } function performUpkeep(bytes calldata) external override { draw(); } //Pausable function pause() public onlyRole(PAUSER_ROLE) { _pause(); } function unpause() public onlyRole(PAUSER_ROLE) { _unpause(); } //Minimum function _updateMinimumWeight(uint32 _minimumWeight) public onlyRole(DEFAULT_ADMIN_ROLE) { require(_minimumWeight >= 1, "Minimum allowed is 1"); minimumWeight = _minimumWeight; } //ChainLink function _updateCallbackGasLimit(uint32 _callbackGasLimit) public onlyRole(DEFAULT_ADMIN_ROLE) { callbackGasLimit = _callbackGasLimit; } //Lending Pool Gateway function _approveLP(address _token, uint256 _amount) public onlyRole(DEFAULT_ADMIN_ROLE) { LibLendingPool.approve(_token, _amount); } //WETH Gateway function _approveGateway(address _token, uint256 _amount) public onlyRole(DEFAULT_ADMIN_ROLE) { LibLendingPool._approveGateway(_token, _amount); } //Public function getTotalPrizeBonds() public view returns(uint256) { return prizeBonds.length; } function getStakedAmount() public view returns (uint256){ return increasedStakes[msg.sender]; } function getListOfTickets() public view returns (uint256[] memory){ return prizeBonds; } function getTicketData(uint256 tokenId) public view returns (LMyChance.PrizeBondPosition memory ) { return prizeBondPositions[tokenId]; } function getState() public view returns(uint256, uint256, uint256, bool, bool) { return (pendingAVAX, totalAVAXBonds, sumWeights, claimNotRequired, waitNotRequired); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract AutomationBase { error OnlySimulatedBackend(); /** * @notice method that allows it to be simulated via eth_call by checking that * the sender is the zero address. */ function preventExecution() internal view { if (tx.origin != address(0)) { revert OnlySimulatedBackend(); } } /** * @notice modifier that allows it to be simulated via eth_call by checking * that the sender is the zero address. */ modifier cannotExecute() { preventExecution(); _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./AutomationBase.sol"; import "./AutomationCompatibleInterface.sol"; abstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface AutomationCompatibleInterface { /** * @notice method that is simulated by the keepers to see if any work actually * needs to be performed. This method does does not actually need to be * executable, and since it is only ever simulated it can consume lots of gas. * @dev To ensure that it is never called, you may want to add the * cannotExecute modifier from KeeperBase to your implementation of this * method. * @param checkData specified in the upkeep registration so it is always the * same for a registered upkeep. This can easily be broken down into specific * arguments using `abi.decode`, so multiple upkeeps can be registered on the * same contract and easily differentiated by the contract. * @return upkeepNeeded boolean to indicate whether the keeper should call * performUpkeep or not. * @return performData bytes that the keeper should call performUpkeep with, if * upkeep is needed. If you would like to encode data to decode later, try * `abi.encode`. */ function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData); /** * @notice method that is actually executed by the keepers, via the registry. * The data returned by the checkUpkeep simulation will be passed into * this method to actually be executed. * @dev The input to this method should not be trusted, and the caller of the * method should not even be restricted to any single registry. Anyone should * be able call it, and the input should be validated, there is no guarantee * that the data passed in is the performData returned from checkUpkeep. This * could happen due to malicious keepers, racing keepers, or simply a state * change while the performUpkeep transaction is waiting for confirmation. * Always validate the data passed in. * @param performData is the data which was passed back from the checkData * simulation. If it is encoded, it can easily be decoded into other types by * calling `abi.decode`. This data should not be trusted, and should be * validated against the contract's current state. */ function performUpkeep(bytes calldata performData) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "./Roles.sol"; contract Charities is Roles { mapping(address => bool) public charities; address[] public aCharities; function _enableCharity(address _charity, bool _enabled) public onlyRole(DEFAULT_ADMIN_ROLE) { require(charities[_charity] != _enabled, "Already done"); charities[_charity] = _enabled; if (_enabled) { aCharities.push(_charity); } else { bool doNow = false; for (uint i = 0; i<aCharities.length-1; i++){ if (aCharities[i] == _charity) { doNow = true; } if (doNow) { aCharities[i] = aCharities[i+1]; } } aCharities.pop(); } } constructor() { _enableCharity(0x0B98d3b5ad68992559F9684A70310e48aE892A48, true); _enableCharity(0x0DdcAE532E4b1B31500Cd29d7AC110F052e30645, true); _enableCharity(0x74CE447d787313E4555C0D3E03C3934E0C0bDB6A, true); _enableCharity(0xE9bFF54D628DBe3C8C59f74ccb1aB4560a1713C0, true); _enableCharity(0xF8fF6e693b9B8C6A25891cC0bAB53960aac95453, true); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ConfirmedOwnerWithProposal.sol"; /** * @title The ConfirmedOwner contract * @notice A contract with helpers for basic contract ownership. */ contract ConfirmedOwner is ConfirmedOwnerWithProposal { constructor(address newOwner) ConfirmedOwnerWithProposal(newOwner, address(0)) {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./OwnableInterface.sol"; /** * @title The ConfirmedOwner contract * @notice A contract with helpers for basic contract ownership. */ contract ConfirmedOwnerWithProposal is OwnableInterface { address private s_owner; address private s_pendingOwner; event OwnershipTransferRequested(address indexed from, address indexed to); event OwnershipTransferred(address indexed from, address indexed to); constructor(address newOwner, address pendingOwner) { require(newOwner != address(0), "Cannot set owner to zero"); s_owner = newOwner; if (pendingOwner != address(0)) { _transferOwnership(pendingOwner); } } /** * @notice Allows an owner to begin transferring ownership to a new address, * pending. */ function transferOwnership(address to) public override onlyOwner { _transferOwnership(to); } /** * @notice Allows an ownership transfer to be completed by the recipient. */ function acceptOwnership() external override { require(msg.sender == s_pendingOwner, "Must be proposed owner"); address oldOwner = s_owner; s_owner = msg.sender; s_pendingOwner = address(0); emit OwnershipTransferred(oldOwner, msg.sender); } /** * @notice Get the current owner */ function owner() public view override returns (address) { return s_owner; } /** * @notice validate, transfer ownership, and emit relevant events */ function _transferOwnership(address to) private { require(to != msg.sender, "Cannot transfer to self"); s_pendingOwner = to; emit OwnershipTransferRequested(s_owner, to); } /** * @notice validate access */ function _validateOwnership() internal view { require(msg.sender == s_owner, "Only callable by owner"); } /** * @notice Reverts if called by anyone other than the contract owner. */ modifier onlyOwner() { _validateOwnership(); _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; interface IPrizeBondAVAX is IERC721 { function safeMint(address to) external returns(uint256); function safeBurn(uint256 tokenId) external; function setMyChance(address _myChanceAdd, address _myChanceMigration) external; }
// SPDX-License-Identifier: agpl-3.0 pragma solidity 0.8.17; interface IWETHGateway { function depositETH( address lendingPool, address onBehalfOf, uint16 referralCode ) external payable; function withdrawETH( address lendingPool, uint256 amount, address onBehalfOf ) external; function repayETH( address lendingPool, uint256 amount, uint256 rateMode, address onBehalfOf ) external payable; function borrowETH( address lendingPool, uint256 amount, uint256 interesRateMode, uint16 referralCode ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import './IPrizeBondAVAX.sol'; library LibConstants { IPrizeBondAVAX constant prizeBond = IPrizeBondAVAX(0x8AC77DF72e938EeB7B3A1d8cdF6d586e0C61AF04); uint256 constant TIME_FOR_NEXT_DRAW = 7 * 1 days; uint256 constant MAX_INT = 2**256 - 1; //AAVE & Token addresses in Avalanche address constant linkToken = 0x5947BB275c521040051D82396192181b413227A3; address constant avWAVAXToken = 0xDFE521292EcE2A4f44242efBcD66Bc594CA9714B; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "./IERC20.sol"; import "./IWETHGateway.sol"; library LibLendingPool { address constant lendingPool = 0x4F01AeD16D97E3aB5ab2B501154DC9bb0F1A5A2C; IWETHGateway constant wethGateway = IWETHGateway(0x8a47F74d1eE0e2edEB4F3A7e64EF3bD8e11D27C8); function supply(uint256 supplyAmount) external { wethGateway.depositETH{value: supplyAmount }(lendingPool, address(this), 0); } function withdraw(uint256 withdrawalAmount, address to) external { wethGateway.withdrawETH(lendingPool, withdrawalAmount, to); } function approve(address _token, uint256 amount) external { IERC20(_token).approve(address(lendingPool), amount); } function _approveGateway(address _token, uint256 _amount) external { IERC20(_token).approve(address(wethGateway), _amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "./IERC20.sol"; import "./IPrizeBondAVAX.sol"; library LMyChance { struct SpecialLottery { bool valid; bool drawn; uint256 total; string description; uint256 winner; } struct PrizeBondPosition { uint index; uint weight; } function claimInternal(uint256 total, uint256 _percentage) external pure returns(uint256 withdrawalAmount, uint256 _totalFees, uint256 totalToCharity) { totalToCharity = total * 20 / 100; _totalFees = total * 45 / 100; uint256 totalWinner = total * 35 / 100; uint256 extraToCharity = totalWinner * _percentage / 100; totalToCharity += extraToCharity; // Platform's fees remain in the AAVE pool withdrawalAmount = total - _totalFees; return (withdrawalAmount, _totalFees, totalToCharity); } function removeTicket(mapping(uint256 => PrizeBondPosition) storage prizeBondPositions, uint256[] storage prizeBonds, uint256 _tokenId) external returns (uint256) { PrizeBondPosition memory deletedTicket = prizeBondPositions[_tokenId]; if (deletedTicket.index != prizeBonds.length-1) { uint256 lastTokenId = prizeBonds[prizeBonds.length-1]; prizeBonds[deletedTicket.index] = lastTokenId; prizeBondPositions[lastTokenId].index = deletedTicket.index; } delete prizeBondPositions[_tokenId]; prizeBonds.pop(); return deletedTicket.weight; } function mint(IPrizeBondAVAX prizeBond, uint weight, mapping(uint256 => uint256) storage mintingDate, uint256[] storage prizeBonds, mapping(uint256 => PrizeBondPosition) storage prizeBondPositions) external { uint256 tokenId = prizeBond.safeMint(msg.sender); mintingDate[tokenId] = block.timestamp; prizeBonds.push(tokenId); prizeBondPositions[tokenId].weight = weight; prizeBondPositions[tokenId].index = prizeBonds.length - 1; } function addSpecialLottery(uint256 _total, mapping(uint256=>LMyChance.SpecialLottery) storage specialLotteries, uint256 _drawDate, string memory _description) external { SpecialLottery memory specialLottery; specialLottery.valid = true; specialLottery.total = _total; specialLottery.description = _description; specialLotteries[_drawDate] = specialLottery; } function winner_index(uint256 _random, uint256[] memory prizeBonds, mapping(uint256 => PrizeBondPosition) storage prizeBondPositions, uint256 sumWeights) external view returns (uint256) { uint256 count= _random % sumWeights; uint256 i=0; while(count>0){ if(count<prizeBondPositions[prizeBonds[i]].weight) break; count-=prizeBondPositions[prizeBonds[i]].weight; i++; } return i; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface LinkTokenInterface { function allowance(address owner, address spender) external view returns (uint256 remaining); function approve(address spender, uint256 value) external returns (bool success); function balanceOf(address owner) external view returns (uint256 balance); function decimals() external view returns (uint8 decimalPlaces); function decreaseApproval(address spender, uint256 addedValue) external returns (bool success); function increaseApproval(address spender, uint256 subtractedValue) external; function name() external view returns (string memory tokenName); function symbol() external view returns (string memory tokenSymbol); function totalSupply() external view returns (uint256 totalTokensIssued); function transfer(address to, uint256 value) external returns (bool success); function transferAndCall( address to, uint256 value, bytes calldata data ) external returns (bool success); function transferFrom( address from, address to, uint256 value ) external returns (bool success); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @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 == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface OwnableInterface { function owner() external returns (address); function transferOwnership(address recipient) external; function acceptOwnership() external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "./Context.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 Pausable is Context { /** * @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. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { 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()); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "./VRFCoordinatorV2Interface.sol"; import "./VRFConsumerBaseV2.sol"; import "./LinkTokenInterface.sol"; import "./ConfirmedOwner.sol"; abstract contract RandomRequester is VRFConsumerBaseV2, ConfirmedOwner { VRFCoordinatorV2Interface coordinator; LinkTokenInterface linkToken; address constant vrfCoordinator = 0xd5D517aBE5cF79B7e95eC98dB0f0277788aFF634; address constant link = 0x5947BB275c521040051D82396192181b413227A3; uint32 callbackGasLimit = 800000; constructor() VRFConsumerBaseV2(vrfCoordinator) ConfirmedOwner(msg.sender) { coordinator = VRFCoordinatorV2Interface(vrfCoordinator); } function _randomnessRequest() internal returns(uint256) { return coordinator.requestRandomWords( 0x06eb0e2ea7cca202fc7c8258397a36f33d88568d2522b37aaa3b14ff6ee1b696, //keyHash 38, //s_subscriptionId 3, //requestConfirmations callbackGasLimit, 1 ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "./AccessControl.sol"; contract Roles is AccessControl { bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant MIGRATOR_ROLE = keccak256("MIGRATOR_ROLE"); bytes32 public constant FEES_ROLE = keccak256("FEES_ROLE"); constructor() { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(PAUSER_ROLE, msg.sender); _grantRole(MIGRATOR_ROLE, msg.sender); _grantRole(FEES_ROLE, msg.sender); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. It ensures 2 things: * @dev 1. The fulfillment came from the VRFCoordinator * @dev 2. The consumer contract implements fulfillRandomWords. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constructor(<other arguments>, address _vrfCoordinator, address _link) * @dev VRFConsumerBase(_vrfCoordinator) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash). Create subscription, fund it * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface * @dev subscription management functions). * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations, * @dev callbackGasLimit, numWords), * @dev see (VRFCoordinatorInterface for a description of the arguments). * * @dev Once the VRFCoordinator has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomWords method. * * @dev The randomness argument to fulfillRandomWords is a set of random words * @dev generated from your requestId and the blockHash of the request. * * @dev If your contract could have concurrent requests open, you can use the * @dev requestId returned from requestRandomWords to track which response is associated * @dev with which randomness request. * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously. * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. It is for this reason that * @dev that you can signal to an oracle you'd like them to wait longer before * @dev responding to the request (however this is not enforced in the contract * @dev and so remains effective only in the case of unmodified oracle software). */ abstract contract VRFConsumerBaseV2 { error OnlyCoordinatorCanFulfill(address have, address want); address private immutable vrfCoordinator; /** * @param _vrfCoordinator address of VRFCoordinator contract */ constructor(address _vrfCoordinator) { vrfCoordinator = _vrfCoordinator; } /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomWords the VRF output expanded to the requested number of words */ function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual; // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external { if (msg.sender != vrfCoordinator) { revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator); } fulfillRandomWords(requestId, randomWords); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface VRFCoordinatorV2Interface { /** * @notice Get configuration relevant for making requests * @return minimumRequestConfirmations global min for request confirmations * @return maxGasLimit global max for request gas limit * @return s_provingKeyHashes list of registered key hashes */ function getRequestConfig() external view returns ( uint16, uint32, bytes32[] memory ); /** * @notice Request a set of random words. * @param keyHash - Corresponds to a particular oracle job which uses * that key for generating the VRF proof. Different keyHash's have different gas price * ceilings, so you can select a specific one to bound your maximum per request cost. * @param subId - The ID of the VRF subscription. Must be funded * with the minimum subscription balance required for the selected keyHash. * @param minimumRequestConfirmations - How many blocks you'd like the * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS * for why you may want to request more. The acceptable range is * [minimumRequestBlockConfirmations, 200]. * @param callbackGasLimit - How much gas you'd like to receive in your * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords * may be slightly less than this amount because of gas used calling the function * (argument decoding etc.), so you may need to request slightly more than you expect * to have inside fulfillRandomWords. The acceptable range is * [0, maxGasLimit] * @param numWords - The number of uint256 random values you'd like to receive * in your fulfillRandomWords callback. Note these numbers are expanded in a * secure way by the VRFCoordinator from a single random value supplied by the oracle. * @return requestId - A unique identifier of the request. Can be used to match * a request to a response in fulfillRandomWords. */ function requestRandomWords( bytes32 keyHash, uint64 subId, uint16 minimumRequestConfirmations, uint32 callbackGasLimit, uint32 numWords ) external returns (uint256 requestId); /** * @notice Create a VRF subscription. * @return subId - A unique subscription id. * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer. * @dev Note to fund the subscription, use transferAndCall. For example * @dev LINKTOKEN.transferAndCall( * @dev address(COORDINATOR), * @dev amount, * @dev abi.encode(subId)); */ function createSubscription() external returns (uint64 subId); /** * @notice Get a VRF subscription. * @param subId - ID of the subscription * @return balance - LINK balance of the subscription in juels. * @return reqCount - number of requests for this subscription, determines fee tier. * @return owner - owner of the subscription. * @return consumers - list of consumer address which are able to use this subscription. */ function getSubscription(uint64 subId) external view returns ( uint96 balance, uint64 reqCount, address owner, address[] memory consumers ); /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @param newOwner - proposed new owner of the subscription */ function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external; /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @dev will revert if original owner of subId has * not requested that msg.sender become the new owner. */ function acceptSubscriptionOwnerTransfer(uint64 subId) external; /** * @notice Add a consumer to a VRF subscription. * @param subId - ID of the subscription * @param consumer - New consumer which can use the subscription */ function addConsumer(uint64 subId, address consumer) external; /** * @notice Remove a consumer from a VRF subscription. * @param subId - ID of the subscription * @param consumer - Consumer to remove from the subscription */ function removeConsumer(uint64 subId, address consumer) external; /** * @notice Cancel a subscription * @param subId - ID of the subscription * @param to - Where to send the remaining LINK to */ function cancelSubscription(uint64 subId, address to) external; /* * @notice Check to see if there exists a request commitment consumers * for all consumers and keyhashes for a given sub. * @param subId - ID of the subscription * @return true if there exists at least one unfulfilled request for the subscription, false * otherwise. */ function pendingRequestExists(uint64 subId) external view returns (bool); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_totalWinnerAVAX","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_totalToCharityAVAX","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_totalFeesLINK","type":"uint256"}],"name":"AssetsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenIdWinner","type":"uint256"}],"name":"DrawExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_total","type":"uint256"}],"name":"FeesClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_drawDate","type":"uint256"}],"name":"NewSpecialDraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"PrizeBondBurnt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenIdWinner","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_drawDate","type":"uint256"}],"name":"SpecialDrawExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_total","type":"uint256"}],"name":"StakeIncreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_total","type":"uint256"}],"name":"StakeReduced","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEES_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIGRATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_drawDate","type":"uint256"},{"internalType":"uint256","name":"_total","type":"uint256"},{"internalType":"string","name":"_description","type":"string"}],"name":"_addSpecialLottery","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"_approveGateway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"_approveLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_claimFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_charity","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"_enableCharity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"_recoverAVAX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_asset","type":"address"}],"name":"_recoverTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_callbackGasLimit","type":"uint32"}],"name":"_updateCallbackGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_minimumWeight","type":"uint32"}],"name":"_updateMinimumWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"_withdrawAndRecover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"aCharities","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accumulatedAVAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burnPrizeBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"charities","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"checkUpkeep","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_percentage","type":"uint256"},{"internalType":"address payable","name":"_charity","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"draw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_drawDate","type":"uint256"}],"name":"drawSpecialLottery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getListOfTickets","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextDrawDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getState","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTicketData","outputs":[{"components":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"weight","type":"uint256"}],"internalType":"struct LMyChance.PrizeBondPosition","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalPrizeBonds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"increaseStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"increasedStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"migrate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"migrateMyself","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minimumWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"mintPrizeBond","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintingDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"performUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"platformStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_total","type":"uint256"}],"name":"reduceStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"set","type":"bool"}],"name":"setClaimNotRequired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"set","type":"bool"}],"name":"setWaitNotRequired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newInstance","type":"address"}],"name":"startMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040526006805463ffffffff60a01b1916610c3560a81b17905560646013553480156200002d57600080fd5b503380600073d5d517abe5cf79b7e95ec98db0f0277788aff63462000053828462000290565b6200007f7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a3362000290565b620000ab7f600e5f1c60beb469a3fa6dd3814a4ae211cc6259a6d033bae218a742f2af01d33362000290565b620000d77fe2b0d6eac44bd89c98f9198715d9545150fc431fdbb7bf3aee5d285561121d0a3362000290565b620000f8730b98d3b5ad68992559f9684a70310e48ae892a48600162000319565b62000119730ddcae532e4b1b31500cd29d7ac110f052e30645600162000319565b6200013a7374ce447d787313e4555c0d3e03c3934e0c0bdb6a600162000319565b6200015b73e9bff54d628dbe3c8c59f74ccb1ab4560a1713c0600162000319565b6200017c73f8ff6e693b9b8c6a25891cc0bab53960aac95453600162000319565b6001600160a01b039081166080528216620001de5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600380546001600160a01b0319166001600160a01b0384811691909117909155811615620002115762000211816200053d565b5050600580546001600160a01b03191673d5d517abe5cf79b7e95ec98db0f0277788aff634179055506006805460ff60c01b191690556200025662093a80426200090a565b6015556014805461ffff19166101011790556200028a73dfe521292ece2a4f44242efbcd66bc594ca9714b600019620005e9565b62000a9c565b6200029c82826200066f565b62000315576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002d43390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000326816200069a565b6001600160a01b03831660009081526001602052604090205482151560ff909116151503620003875760405162461bcd60e51b815260206004820152600c60248201526b416c726561647920646f6e6560a01b6044820152606401620001d5565b6001600160a01b0383166000908152600160205260409020805460ff191683158015919091179091556200040757600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0385166001600160a01b0319909116179055505050565b6000805b6002546200041c906001906200090a565b8110156200050057846001600160a01b03166002828154811062000444576200044462000920565b6000918252602090912001546001600160a01b0316036200046457600191505b8115620004eb5760026200047a82600162000936565b815481106200048d576200048d62000920565b600091825260209091200154600280546001600160a01b039092169183908110620004bc57620004bc62000920565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b80620004f7816200094c565b9150506200040b565b50600280548062000515576200051562000968565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b336001600160a01b03821603620005975760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620001d5565b600480546001600160a01b0319166001600160a01b03838116918217909255600354604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b6000620005f6816200069a565b60405163095ea7b360e01b81526001600160a01b03841660048201526024810183905273cf5c7131a0bb9cf5cd6ac6a91e187710115718c19063095ea7b39060440160006040518083038186803b1580156200065157600080fd5b505af415801562000666573d6000803e3d6000fd5b50505050505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff165b92915050565b620006a68133620006a9565b50565b620006b582826200066f565b6200031557620006d0816200072160201b620029801760201c565b620006e68360206200299262000734821b17811c565b604051602001620006f9929190620009a4565b60408051601f198184030181529082905262461bcd60e51b8252620001d59160040162000a1d565b6060620006946001600160a01b03831660145b606060006200074583600262000a52565b6200075290600262000936565b6001600160401b038111156200076c576200076c62000a6c565b6040519080825280601f01601f19166020018201604052801562000797576020820181803683370190505b509050600360fc1b81600081518110620007b557620007b562000920565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110620007e757620007e762000920565b60200101906001600160f81b031916908160001a90535060006200080d84600262000a52565b6200081a90600162000936565b90505b60018111156200089c576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811062000852576200085262000920565b1a60f81b8282815181106200086b576200086b62000920565b60200101906001600160f81b031916908160001a90535060049490941c93620008948162000a82565b90506200081d565b508315620008ed5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620001d5565b9392505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115620006945762000694620008f4565b634e487b7160e01b600052603260045260246000fd5b80820180821115620006945762000694620008f4565b600060018201620009615762000961620008f4565b5060010190565b634e487b7160e01b600052603160045260246000fd5b60005b838110156200099b57818101518382015260200162000981565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351620009de8160178501602088016200097e565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835162000a118160288401602088016200097e565b01602801949350505050565b602081526000825180602084015262000a3e8160408501602087016200097e565b601f01601f19169190910160400192915050565b8082028115828204841417620006945762000694620008f4565b634e487b7160e01b600052604160045260246000fd5b60008162000a945762000a94620008f4565b506000190190565b60805161394562000abf60003960008181611007015261104901526139456000f3fe6080604052600436106103535760003560e01c80637708da48116101c6578063bb1228e5116100f7578063dbb1008511610095578063e63ab1e91161006f578063e63ab1e914610a5a578063ef24822f14610a8e578063f2fde38b14610aa3578063fbe14ce914610ac357600080fd5b8063dbb10085146109e6578063e048038714610a06578063e17f464a14610a3a57600080fd5b8063d1d58b25116100d1578063d1d58b251461091d578063d547741f1461094a578063d9895e6a1461096a578063d9e257ef146109de57600080fd5b8063bb1228e5146108bd578063c3830618146108dd578063c620f02c146108fd57600080fd5b806399ba957811610164578063a4e15db91161013e578063a4e15db914610848578063a56bdd191461086a578063ac44ff311461087d578063ba857fcd1461089d57600080fd5b806399ba9578146107f3578063a0f52da014610813578063a217fddf1461083357600080fd5b80638456cb59116101a05780638456cb591461076c57806385dd2fa9146107815780638da5cb5b146107a157806391d14854146107d357600080fd5b80637708da481461072257806379ba5097146107425780637fae06061461075757600080fd5b8063303b5bf2116102a05780634585e33b1161023e578063653e3b2011610218578063653e3b201461067d578063660efedd146106aa5780636e04ff0d146106c05780636fae2e15146106ee57600080fd5b80634585e33b1461061e5780635c975abb1461063e578063618ef5d41461065d57600080fd5b80633a9c705c1161027a5780633a9c705c146105b15780633e54bacb146105d35780633f4ba83a146105f357806340bf2fb71461060857600080fd5b8063303b5bf21461056757806332b7e3811461057c57806336568abe1461059157600080fd5b80631fe543e31161030d57806325d4cf0b116102e757806325d4cf0b146104da57806326787cd7146104fa578063267f69121461051a5780632f2ff15d1461054757600080fd5b80631fe543e31461044c5780632478239a1461046c578063248a9ca31461049c57600080fd5b80628592491461035f57806301ffc9a714610381578063077e5df4146103b65780630eecae21146103d65780631865c57d146103eb5780631fddd0881461043957600080fd5b3661035a57005b600080fd5b34801561036b57600080fd5b5061037f61037a366004613252565b610ae3565b005b34801561038d57600080fd5b506103a161039c36600461328b565b610cf2565b60405190151581526020015b60405180910390f35b3480156103c257600080fd5b5061037f6103d13660046132b5565b610d29565b3480156103e257600080fd5b5061037f610de1565b3480156103f757600080fd5b506010546011546012546014546040805194855260208501939093529183015260ff80821615156060840152610100909104161515608082015260a0016103ad565b61037f6104473660046132b5565b610e36565b34801561045857600080fd5b5061037f610467366004613315565b610ffc565b34801561047857600080fd5b506103a16104873660046133c7565b60016020526000908152604090205460ff1681565b3480156104a857600080fd5b506104cc6104b73660046132b5565b60009081526020819052604090206001015490565b6040519081526020016103ad565b3480156104e657600080fd5b5061037f6104f53660046133e4565b611084565b34801561050657600080fd5b5061037f610515366004613401565b6110a3565b34801561052657600080fd5b506104cc6105353660046133c7565b600d6020526000908152604090205481565b34801561055357600080fd5b5061037f610562366004613401565b61119f565b34801561057357600080fd5b5061037f6111c4565b34801561058857600080fd5b506104cc6112b2565b34801561059d57600080fd5b5061037f6105ac366004613401565b6112ca565b3480156105bd57600080fd5b506105c6611344565b6040516103ad9190613426565b3480156105df57600080fd5b506103a16105ee36600461346a565b61139c565b3480156105ff57600080fd5b5061037f611498565b34801561061457600080fd5b506104cc60135481565b34801561062a57600080fd5b5061037f61063936600461348c565b6114ca565b34801561064a57600080fd5b50600654600160c01b900460ff166103a1565b34801561066957600080fd5b5061037f6106783660046133e4565b6114d2565b34801561068957600080fd5b506104cc6106983660046132b5565b60096020526000908152604090205481565b3480156106b657600080fd5b506104cc600a5481565b3480156106cc57600080fd5b506106e06106db36600461348c565b6114f8565b6040516103ad92919061354e565b3480156106fa57600080fd5b506104cc7f600e5f1c60beb469a3fa6dd3814a4ae211cc6259a6d033bae218a742f2af01d381565b34801561072e57600080fd5b5061037f61073d3660046132b5565b61150d565b34801561074e57600080fd5b5061037f61164d565b34801561076357600080fd5b506104cc6116fb565b34801561077857600080fd5b5061037f6117a9565b34801561078d57600080fd5b5061037f61079c366004613571565b6117db565b3480156107ad57600080fd5b506003546001600160a01b03165b6040516001600160a01b0390911681526020016103ad565b3480156107df57600080fd5b506103a16107ee366004613401565b61185e565b3480156107ff57600080fd5b5061037f61080e3660046132b5565b611887565b34801561081f57600080fd5b5061037f61082e3660046133c7565b6118bf565b34801561083f57600080fd5b506104cc600081565b34801561085457600080fd5b50336000908152600d60205260409020546104cc565b61037f61087836600461359d565b611953565b34801561088957600080fd5b5061037f610898366004613645565b611a91565b3480156108a957600080fd5b5061037f6108b83660046132b5565b611f4c565b3480156108c957600080fd5b5061037f6108d836600461367e565b612358565b3480156108e957600080fd5b5061037f6108f83660046132b5565b6123bd565b34801561090957600080fd5b5061037f61091836600461367e565b6124eb565b34801561092957600080fd5b506104cc6109383660046132b5565b600b6020526000908152604090205481565b34801561095657600080fd5b5061037f610965366004613401565b61251d565b34801561097657600080fd5b506109c36109853660046132b5565b6040805180820190915260008082526020820152506000908152600f6020908152604091829020825180840190935280548352600101549082015290565b604080518251815260209283015192810192909252016103ad565b61037f612542565b3480156109f257600080fd5b5061037f610a01366004613571565b61261d565b348015610a1257600080fd5b506104cc7fe2b0d6eac44bd89c98f9198715d9545150fc431fdbb7bf3aee5d285561121d0a81565b348015610a4657600080fd5b506107bb610a553660046132b5565b61266f565b348015610a6657600080fd5b506104cc7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b348015610a9a57600080fd5b50600e546104cc565b348015610aaf57600080fd5b5061037f610abe3660046133c7565b612699565b348015610acf57600080fd5b5061037f610ade3660046132b5565b6126aa565b6000610aee81612b35565b6001600160a01b03831660009081526001602052604090205482151560ff909116151503610b525760405162461bcd60e51b815260206004820152600c60248201526b416c726561647920646f6e6560a01b60448201526064015b60405180910390fd5b6001600160a01b0383166000908152600160205260409020805460ff19168315801591909117909155610bd157600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0385166001600160a01b0319909116179055505050565b6000805b600254610be4906001906136ba565b811015610cb757846001600160a01b031660028281548110610c0857610c086136cd565b6000918252602090912001546001600160a01b031603610c2757600191505b8115610ca5576002610c3a8260016136e3565b81548110610c4a57610c4a6136cd565b600091825260209091200154600280546001600160a01b039092169183908110610c7657610c766136cd565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b80610caf816136f6565b915050610bd5565b506002805480610cc957610cc961370f565b600082815260209020810160001990810180546001600160a01b0319169055019055505b505050565b60006001600160e01b03198216637965db0b60e01b1480610d2357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000610d3481612b35565b600e5415610d765760405162461bcd60e51b815260206004820152600f60248201526e436f6e747261637420696e2075736560881b6044820152606401610b49565b604051627b8a6760e11b81526004810183905233602482015273cf5c7131a0bb9cf5cd6ac6a91e187710115718c19062f714ce9060440160006040518083038186803b158015610dc557600080fd5b505af4158015610dd9573d6000803e3d6000fd5b505050505050565b610de9612b3f565b610df1612b8e565b610e275760405162461bcd60e51b8152602060048201526007602482015266139bdd081e595d60ca1b6044820152606401610b49565b42601555610e33612bab565b50565b610e3e612b3f565b601354811015610e815760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a59081dd95a59da1d60921b6044820152606401610b49565b6000610e9482662386f26fc10000613725565b9050803414610ed55760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b6044820152606401610b49565b604051633540302360e01b81526004810182905273cf5c7131a0bb9cf5cd6ac6a91e187710115718c19063354030239060240160006040518083038186803b158015610f2057600080fd5b505af4158015610f34573d6000803e3d6000fd5b505050508160116000828254610f4a91906136e3565b9091555050604051630463bf8760e11b8152738ac77df72e938eeb7b3a1d8cdf6d586e0c61af0460048201526024810183905260096044820152600e6064820152600f608482015273f2ffe32179d9426d81b2c97c239fb4f90281e90e906308c77f0e9060a40160006040518083038186803b158015610fc957600080fd5b505af4158015610fdd573d6000803e3d6000fd5b505050508160126000828254610ff391906136e3565b90915550505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110765760405163073e64fd60e21b81523360048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610b49565b6110808282612c65565b5050565b600061108f81612b35565b506014805460ff1916911515919091179055565b60006110ae81612b35565b600e54156110f05760405162461bcd60e51b815260206004820152600f60248201526e436f6e747261637420696e2075736560881b6044820152606401610b49565b60405163a9059cbb60e01b8152336004820152602481018490526001600160a01b0383169063a9059cbb906044016020604051808303816000875af115801561113d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611161919061373c565b610ced5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610b49565b6000828152602081905260409020600101546111ba81612b35565b610ced8383612cd3565b7fe2b0d6eac44bd89c98f9198715d9545150fc431fdbb7bf3aee5d285561121d0a6111ee81612b35565b600c80546000909155801561108057604051627b8a6760e11b81526004810182905233602482015273cf5c7131a0bb9cf5cd6ac6a91e187710115718c19062f714ce9060440160006040518083038186803b15801561124c57600080fd5b505af4158015611260573d6000803e3d6000fd5b50505050806010600082825461127691906136ba565b90915550506040518181527f83db9dc084973306ecd0b0f10cb495b81dd9ddcc135eb7934d2723bcabc8f4c39060200160405180910390a15050565b600062093a806015546112c591906136e3565b905090565b6001600160a01b038116331461133a5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610b49565b6110808282612d57565b6060600e80548060200260200160405190810160405280929190818152602001828054801561139257602002820191906000526020600020905b81548152602001906001019080831161137e575b5050505050905090565b60007304f2559e75cf00a0ea163fc67e62e47c6743d02c33146113f25760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21031b0b63632b960911b6044820152606401610b49565b816011600082825461140491906136e3565b92505081905550816012600082825461141d91906136e3565b90915550506000838152600960209081526040808320429055600e8054600180820183557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd909101889055600f90935292208101849055905461148091906136ba565b6000848152600f602052604090205550600192915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6114c281612b35565b610e33612dbc565b611080610de1565b60006114dd81612b35565b50601480549115156101000261ff0019909216919091179055565b60006060611504612b8e565b91509250929050565b611515612b3f565b6000818152600760205260409020805460ff1661155e5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610b49565b8142116115975760405162461bcd60e51b8152602060048201526007602482015266139bdd081e595d60ca1b6044820152606401610b49565b8054610100900460ff16156115de5760405162461bcd60e51b815260206004820152600d60248201526c20b63932b0b23c90323930bbb760991b6044820152606401610b49565b600e546116205760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820626f6e647360801b6044820152606401610b49565b805461ff0019166101001781556000611637612bab565b6000908152600860205260409020929092555050565b6004546001600160a01b031633146116a05760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610b49565b600380546001600160a01b0319808216339081179093556004805490911690556040516001600160a01b03909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6000600a54601054601154662386f26fc100006117189190613725565b6040516370a0823160e01b815230600482015273dfe521292ece2a4f44242efbcd66bc594ca9714b906370a0823190602401602060405180830381865afa158015611767573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178b9190613759565b61179591906136ba565b61179f91906136ba565b6112c591906136ba565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6117d381612b35565b610e33612e0c565b60006117e681612b35565b6040516385dd2fa960e01b81526001600160a01b03841660048201526024810183905273cf5c7131a0bb9cf5cd6ac6a91e187710115718c1906385dd2fa9906044015b60006040518083038186803b15801561184157600080fd5b505af4158015611855573d6000803e3d6000fd5b50505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600061189281612b35565b604051339083156108fc029084906000818181858888f19350505050158015610ced573d6000803e3d6000fd5b7f600e5f1c60beb469a3fa6dd3814a4ae211cc6259a6d033bae218a742f2af01d36118e981612b35565b6016546001600160a01b0316156119305760405162461bcd60e51b815260206004820152600b60248201526a105b1c9958591e481cd95d60aa1b6044820152606401610b49565b50601680546001600160a01b0319166001600160a01b0392909216919091179055565b600061195e81612b35565b82341461196a57600080fd5b826010600082825461197c91906136e3565b9091555050604051637ebecb3760e01b815273f2ffe32179d9426d81b2c97c239fb4f90281e90e90637ebecb37906119bf90869060079089908890600401613772565b60006040518083038186803b1580156119d757600080fd5b505af41580156119eb573d6000803e3d6000fd5b5050604051633540302360e01b81526004810186905273cf5c7131a0bb9cf5cd6ac6a91e187710115718c192506335403023915060240160006040518083038186803b158015611a3a57600080fd5b505af4158015611a4e573d6000803e3d6000fd5b505050507fcf778afb6d0e1b36e6cd3338801f07c396e45a1ed7e7224c431188ef50f7d99984604051611a8391815260200190565b60405180910390a150505050565b6040516331a9108f60e11b8152600481018490523390738ac77df72e938eeb7b3a1d8cdf6d586e0c61af0490636352211e90602401602060405180830381865afa158015611ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0791906137a1565b6001600160a01b031614611b2d5760405162461bcd60e51b8152600401610b49906137be565b6000838152600b6020526040902054611b7b5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401610b49565b600083815260096020526040902054611b989062093a80906136e3565b421180611bac5750601454610100900460ff165b611bf85760405162461bcd60e51b815260206004820152601960248201527f57696e6e65722068617320746f20776169742061207765656b000000000000006044820152606401610b49565b6005821015611c395760405162461bcd60e51b815260206004820152600d60248201526c4d696e696d756d20697320352560981b6044820152606401610b49565b6001600160a01b03811660009081526001602052604090205460ff16611c935760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206368617269747960881b6044820152606401610b49565b6064821115611ca157606491505b6000838152600b602090815260408083208054908490558151606081018352848152928301849052908201929092528115611f455760405163632c9f7360e01b8152600481018390526024810185905273f2ffe32179d9426d81b2c97c239fb4f90281e90e9063632c9f7390604401606060405180830381865af4158015611d2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5191906137e5565b60208401528083526040830191909152600c8054600090611d739084906136e3565b9091555050604081015160108054600090611d8f9084906136ba565b90915550506040818101519051627b8a6760e11b8152600481019190915230602482015273cf5c7131a0bb9cf5cd6ac6a91e187710115718c19062f714ce9060440160006040518083038186803b158015611de957600080fd5b505af4158015611dfd573d6000803e3d6000fd5b505050602082015160408301513392506108fc91611e1a916136ba565b6040518115909202916000818181858888f19350505050158015611e42573d6000803e3d6000fd5b5060208101516040516000916001600160a01b038616918381818185875af1925050503d8060008114611e91576040519150601f19603f3d011682016040523d82523d6000602084013e611e96565b606091505b5050905080611ede5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610b49565b85336001600160a01b03167fbaee8f74cc5788729140904e3ff38194341a6f22eb631ae4343c86348ff9ff3484602001518560400151611f1e91906136ba565b602086810151875160408051948552928401919091529082015260600160405180910390a3505b5050505050565b6000818152600b60205260409020541580611f69575060145460ff165b611faa5760405162461bcd60e51b8152602060048201526012602482015271141b19585cd94818db185a5b48199a5c9cdd60721b6044820152606401610b49565b6040516331a9108f60e11b8152600481018290523390738ac77df72e938eeb7b3a1d8cdf6d586e0c61af0490636352211e90602401602060405180830381865afa158015611ffc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202091906137a1565b6001600160a01b0316146120465760405162461bcd60e51b8152600401610b49906137be565b6016546001600160a01b03166120935760405162461bcd60e51b815260206004820152601260248201527110d85b9b9bdd081b5a59dc985d19481e595d60721b6044820152606401610b49565b60008181526017602052604090205460ff16156120e55760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481b5a59dc985d195960821b6044820152606401610b49565b6000818152601760209081526040808320805460ff19166001908117909155600f909252822001549061211f82662386f26fc10000613725565b9050816011600082825461213391906136ba565b909155505060165460405163a9059cbb60e01b81526001600160a01b0390911660048201526024810182905273dfe521292ece2a4f44242efbcd66bc594ca9714b9063a9059cbb906044016020604051808303816000875af115801561219d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c1919061373c565b6121ff5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610b49565b601654604051633e54bacb60e01b815260048101859052602481018490526001600160a01b0390911690633e54bacb906044016020604051808303816000875af1158015612251573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612275919061373c565b6122b45760405162461bcd60e51b815260206004820152601060248201526f135a59dc985d1a5bdb8819985a5b195960821b6044820152606401610b49565b60405163453ccbb760e11b8152600f6004820152600e60248201526044810184905260009073f2ffe32179d9426d81b2c97c239fb4f90281e90e90638a79976e90606401602060405180830381865af4158015612315573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123399190613759565b9050806012600082825461234d91906136ba565b909155505050505050565b600061236381612b35565b60018263ffffffff1610156123b15760405162461bcd60e51b81526020600482015260146024820152734d696e696d756d20616c6c6f776564206973203160601b6044820152606401610b49565b5063ffffffff16601355565b336000908152600d602052604090205481111561240d5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606401610b49565b80600a600082825461241f91906136ba565b9091555050336000908152600d6020526040812080548392906124439084906136ba565b9091555050604051627b8a6760e11b81526004810182905233602482015273cf5c7131a0bb9cf5cd6ac6a91e187710115718c19062f714ce9060440160006040518083038186803b15801561249757600080fd5b505af41580156124ab573d6000803e3d6000fd5b505050507fbba99cc971d3fb4d9d1825c36fcb7600b6f0e4761261584f6e87ba611e1bce25816040516124e091815260200190565b60405180910390a150565b60006124f681612b35565b506006805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b60008281526020819052604090206001015461253881612b35565b610ced8383612d57565b61254a612b3f565b604051633540302360e01b815234600482015273cf5c7131a0bb9cf5cd6ac6a91e187710115718c19063354030239060240160006040518083038186803b15801561259457600080fd5b505af41580156125a8573d6000803e3d6000fd5b5050505034600a60008282546125be91906136e3565b9091555050336000908152600d6020526040812080543492906125e29084906136e3565b90915550506040513481527fcab58c159950a06ff0588c5b07a29621e64d9f97f6e97b3ea2ae73f29f2b1460906020015b60405180910390a1565b600061262881612b35565b60405163095ea7b360e01b81526001600160a01b03841660048201526024810183905273cf5c7131a0bb9cf5cd6ac6a91e187710115718c19063095ea7b390604401611829565b6002818154811061267f57600080fd5b6000918252602090912001546001600160a01b0316905081565b6126a1612e4f565b610e3381612ea2565b6000818152600b602052604090205415806126c7575060145460ff165b6127085760405162461bcd60e51b8152602060048201526012602482015271141b19585cd94818db185a5b48199a5c9cdd60721b6044820152606401610b49565b6040516331a9108f60e11b8152600481018290523390738ac77df72e938eeb7b3a1d8cdf6d586e0c61af0490636352211e90602401602060405180830381865afa15801561275a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277e91906137a1565b6001600160a01b0316146127a45760405162461bcd60e51b8152600401610b49906137be565b60405163dbf5132560e01b815260048101829052738ac77df72e938eeb7b3a1d8cdf6d586e0c61af049063dbf5132590602401600060405180830381600087803b1580156127f157600080fd5b505af1158015612805573d6000803e3d6000fd5b5050506000828152600f6020526040902060010154905073cf5c7131a0bb9cf5cd6ac6a91e187710115718c162f714ce61284683662386f26fc10000613725565b6040516001600160e01b031960e084901b168152600481019190915233602482015260440160006040518083038186803b15801561288357600080fd5b505af4158015612897573d6000803e3d6000fd5b5050505080601160008282546128ad91906136ba565b909155505060405163453ccbb760e11b8152600f6004820152600e60248201526044810183905260009073f2ffe32179d9426d81b2c97c239fb4f90281e90e90638a79976e90606401602060405180830381865af4158015612913573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129379190613759565b9050806012600082825461294b91906136ba565b909155505060405183907f22c65edeb753eb7dc55a4c3e9520964b5650efa336e604342561ce9728a782ae90600090a2505050565b6060610d236001600160a01b03831660145b606060006129a1836002613725565b6129ac9060026136e3565b67ffffffffffffffff8111156129c4576129c46132ce565b6040519080825280601f01601f1916602001820160405280156129ee576020820181803683370190505b509050600360fc1b81600081518110612a0957612a096136cd565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612a3857612a386136cd565b60200101906001600160f81b031916908160001a9053506000612a5c846002613725565b612a679060016136e3565b90505b6001811115612adf576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612a9b57612a9b6136cd565b1a60f81b828281518110612ab157612ab16136cd565b60200101906001600160f81b031916908160001a90535060049490941c93612ad881613813565b9050612a6a565b508315612b2e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b49565b9392505050565b610e338133612f4c565b600654600160c01b900460ff1615612b8c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b49565b565b6000612b986112b2565b42101580156112c5575050600e54151590565b6005546006546040516305d3b1d360e41b81527f06eb0e2ea7cca202fc7c8258397a36f33d88568d2522b37aaa3b14ff6ee1b69660048201526026602482015260036044820152600160a01b90910463ffffffff166064820152600160848201526000916001600160a01b031690635d3b1d309060a4016020604051808303816000875af1158015612c41573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c59190613759565b60008281526008602052604090205415612cb05761108081600081518110612c8f57612c8f6136cd565b60200260200101516008600085815260200190815260200160002054612fa5565b61108081600081518110612cc657612cc66136cd565b60200260200101516130bf565b612cdd828261185e565b611080576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055612d133390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b612d61828261185e565b15611080576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b612dc46131df565b6006805460ff60c01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b039091168152602001612613565b612e14612b3f565b6006805460ff60c01b1916600160c01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612df43390565b6003546001600160a01b03163314612b8c5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610b49565b336001600160a01b03821603612efa5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b49565b600480546001600160a01b0319166001600160a01b03838116918217909255600354604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b612f56828261185e565b61108057612f6381612980565b612f6e836020612992565b604051602001612f7f92919061382a565b60408051601f198184030181529082905262461bcd60e51b8252610b499160040161389f565b60125460405163801fb7db60e01b815260009173f2ffe32179d9426d81b2c97c239fb4f90281e90e9163801fb7db91612fe9918791600e91600f91906004016138b2565b602060405180830381865af4158015613006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061302a9190613759565b90506000600e8281548110613041576130416136cd565b6000918252602080832090910154858352600782526040808420600381018390556001810154838652600b9094529084208054929550909390916130869084906136e3565b9091555050604051849083907f4318f75752af5c2d4a851e21967ea02867513cfd11055731101d33a48b2dbbc990600090a35050505050565b60125460405163801fb7db60e01b815260009173f2ffe32179d9426d81b2c97c239fb4f90281e90e9163801fb7db91613103918691600e91600f91906004016138b2565b602060405180830381865af4158015613120573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131449190613759565b90506000600e828154811061315b5761315b6136cd565b9060005260206000200154905060006131726116fb565b9050806010600082825461318691906136e3565b90915550506000828152600b6020526040812080548392906131a99084906136e3565b909155505060405182907f819a4b8438a461a5172465f073ea78df0c35a4420134cf0a932ec6e42fedff9090600090a250505050565b600654600160c01b900460ff16612b8c5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b49565b6001600160a01b0381168114610e3357600080fd5b8015158114610e3357600080fd5b6000806040838503121561326557600080fd5b82356132708161322f565b9150602083013561328081613244565b809150509250929050565b60006020828403121561329d57600080fd5b81356001600160e01b031981168114612b2e57600080fd5b6000602082840312156132c757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561330d5761330d6132ce565b604052919050565b6000806040838503121561332857600080fd5b8235915060208084013567ffffffffffffffff8082111561334857600080fd5b818601915086601f83011261335c57600080fd5b81358181111561336e5761336e6132ce565b8060051b915061337f8483016132e4565b818152918301840191848101908984111561339957600080fd5b938501935b838510156133b75784358252938501939085019061339e565b8096505050505050509250929050565b6000602082840312156133d957600080fd5b8135612b2e8161322f565b6000602082840312156133f657600080fd5b8135612b2e81613244565b6000806040838503121561341457600080fd5b8235915060208301356132808161322f565b6020808252825182820181905260009190848201906040850190845b8181101561345e57835183529284019291840191600101613442565b50909695505050505050565b6000806040838503121561347d57600080fd5b50508035926020909101359150565b6000806020838503121561349f57600080fd5b823567ffffffffffffffff808211156134b757600080fd5b818501915085601f8301126134cb57600080fd5b8135818111156134da57600080fd5b8660208285010111156134ec57600080fd5b60209290920196919550909350505050565b60005b83811015613519578181015183820152602001613501565b50506000910152565b6000815180845261353a8160208601602086016134fe565b601f01601f19169290920160200192915050565b82151581526040602082015260006135696040830184613522565b949350505050565b6000806040838503121561358457600080fd5b823561358f8161322f565b946020939093013593505050565b6000806000606084860312156135b257600080fd5b833592506020808501359250604085013567ffffffffffffffff808211156135d957600080fd5b818701915087601f8301126135ed57600080fd5b8135818111156135ff576135ff6132ce565b613611601f8201601f191685016132e4565b9150808252888482850101111561362757600080fd5b80848401858401376000848284010152508093505050509250925092565b60008060006060848603121561365a57600080fd5b833592506020840135915060408401356136738161322f565b809150509250925092565b60006020828403121561369057600080fd5b813563ffffffff81168114612b2e57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610d2357610d236136a4565b634e487b7160e01b600052603260045260246000fd5b80820180821115610d2357610d236136a4565b600060018201613708576137086136a4565b5060010190565b634e487b7160e01b600052603160045260246000fd5b8082028115828204841417610d2357610d236136a4565b60006020828403121561374e57600080fd5b8151612b2e81613244565b60006020828403121561376b57600080fd5b5051919050565b8481528360208201528260408201526080606082015260006137976080830184613522565b9695505050505050565b6000602082840312156137b357600080fd5b8151612b2e8161322f565b6020808252600d908201526c24b73b30b634b21037bbb732b960991b604082015260600190565b6000806000606084860312156137fa57600080fd5b8351925060208401519150604084015190509250925092565b600081613822576138226136a4565b506000190190565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516138628160178501602088016134fe565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516138938160288401602088016134fe565b01602801949350505050565b602081526000612b2e6020830184613522565b600060808201868352602060808185015281875480845260a0860191508860005282600020935060005b818110156138f8578454835260019485019492840192016138dc565b50506040850196909652505050606001529291505056fea26469706673582212203c1e5e364d752dd782327c9dc56522bb63471f9afdf7eeb539b27bbca211496464736f6c63430008110033
Deployed Bytecode
0x6080604052600436106103535760003560e01c80637708da48116101c6578063bb1228e5116100f7578063dbb1008511610095578063e63ab1e91161006f578063e63ab1e914610a5a578063ef24822f14610a8e578063f2fde38b14610aa3578063fbe14ce914610ac357600080fd5b8063dbb10085146109e6578063e048038714610a06578063e17f464a14610a3a57600080fd5b8063d1d58b25116100d1578063d1d58b251461091d578063d547741f1461094a578063d9895e6a1461096a578063d9e257ef146109de57600080fd5b8063bb1228e5146108bd578063c3830618146108dd578063c620f02c146108fd57600080fd5b806399ba957811610164578063a4e15db91161013e578063a4e15db914610848578063a56bdd191461086a578063ac44ff311461087d578063ba857fcd1461089d57600080fd5b806399ba9578146107f3578063a0f52da014610813578063a217fddf1461083357600080fd5b80638456cb59116101a05780638456cb591461076c57806385dd2fa9146107815780638da5cb5b146107a157806391d14854146107d357600080fd5b80637708da481461072257806379ba5097146107425780637fae06061461075757600080fd5b8063303b5bf2116102a05780634585e33b1161023e578063653e3b2011610218578063653e3b201461067d578063660efedd146106aa5780636e04ff0d146106c05780636fae2e15146106ee57600080fd5b80634585e33b1461061e5780635c975abb1461063e578063618ef5d41461065d57600080fd5b80633a9c705c1161027a5780633a9c705c146105b15780633e54bacb146105d35780633f4ba83a146105f357806340bf2fb71461060857600080fd5b8063303b5bf21461056757806332b7e3811461057c57806336568abe1461059157600080fd5b80631fe543e31161030d57806325d4cf0b116102e757806325d4cf0b146104da57806326787cd7146104fa578063267f69121461051a5780632f2ff15d1461054757600080fd5b80631fe543e31461044c5780632478239a1461046c578063248a9ca31461049c57600080fd5b80628592491461035f57806301ffc9a714610381578063077e5df4146103b65780630eecae21146103d65780631865c57d146103eb5780631fddd0881461043957600080fd5b3661035a57005b600080fd5b34801561036b57600080fd5b5061037f61037a366004613252565b610ae3565b005b34801561038d57600080fd5b506103a161039c36600461328b565b610cf2565b60405190151581526020015b60405180910390f35b3480156103c257600080fd5b5061037f6103d13660046132b5565b610d29565b3480156103e257600080fd5b5061037f610de1565b3480156103f757600080fd5b506010546011546012546014546040805194855260208501939093529183015260ff80821615156060840152610100909104161515608082015260a0016103ad565b61037f6104473660046132b5565b610e36565b34801561045857600080fd5b5061037f610467366004613315565b610ffc565b34801561047857600080fd5b506103a16104873660046133c7565b60016020526000908152604090205460ff1681565b3480156104a857600080fd5b506104cc6104b73660046132b5565b60009081526020819052604090206001015490565b6040519081526020016103ad565b3480156104e657600080fd5b5061037f6104f53660046133e4565b611084565b34801561050657600080fd5b5061037f610515366004613401565b6110a3565b34801561052657600080fd5b506104cc6105353660046133c7565b600d6020526000908152604090205481565b34801561055357600080fd5b5061037f610562366004613401565b61119f565b34801561057357600080fd5b5061037f6111c4565b34801561058857600080fd5b506104cc6112b2565b34801561059d57600080fd5b5061037f6105ac366004613401565b6112ca565b3480156105bd57600080fd5b506105c6611344565b6040516103ad9190613426565b3480156105df57600080fd5b506103a16105ee36600461346a565b61139c565b3480156105ff57600080fd5b5061037f611498565b34801561061457600080fd5b506104cc60135481565b34801561062a57600080fd5b5061037f61063936600461348c565b6114ca565b34801561064a57600080fd5b50600654600160c01b900460ff166103a1565b34801561066957600080fd5b5061037f6106783660046133e4565b6114d2565b34801561068957600080fd5b506104cc6106983660046132b5565b60096020526000908152604090205481565b3480156106b657600080fd5b506104cc600a5481565b3480156106cc57600080fd5b506106e06106db36600461348c565b6114f8565b6040516103ad92919061354e565b3480156106fa57600080fd5b506104cc7f600e5f1c60beb469a3fa6dd3814a4ae211cc6259a6d033bae218a742f2af01d381565b34801561072e57600080fd5b5061037f61073d3660046132b5565b61150d565b34801561074e57600080fd5b5061037f61164d565b34801561076357600080fd5b506104cc6116fb565b34801561077857600080fd5b5061037f6117a9565b34801561078d57600080fd5b5061037f61079c366004613571565b6117db565b3480156107ad57600080fd5b506003546001600160a01b03165b6040516001600160a01b0390911681526020016103ad565b3480156107df57600080fd5b506103a16107ee366004613401565b61185e565b3480156107ff57600080fd5b5061037f61080e3660046132b5565b611887565b34801561081f57600080fd5b5061037f61082e3660046133c7565b6118bf565b34801561083f57600080fd5b506104cc600081565b34801561085457600080fd5b50336000908152600d60205260409020546104cc565b61037f61087836600461359d565b611953565b34801561088957600080fd5b5061037f610898366004613645565b611a91565b3480156108a957600080fd5b5061037f6108b83660046132b5565b611f4c565b3480156108c957600080fd5b5061037f6108d836600461367e565b612358565b3480156108e957600080fd5b5061037f6108f83660046132b5565b6123bd565b34801561090957600080fd5b5061037f61091836600461367e565b6124eb565b34801561092957600080fd5b506104cc6109383660046132b5565b600b6020526000908152604090205481565b34801561095657600080fd5b5061037f610965366004613401565b61251d565b34801561097657600080fd5b506109c36109853660046132b5565b6040805180820190915260008082526020820152506000908152600f6020908152604091829020825180840190935280548352600101549082015290565b604080518251815260209283015192810192909252016103ad565b61037f612542565b3480156109f257600080fd5b5061037f610a01366004613571565b61261d565b348015610a1257600080fd5b506104cc7fe2b0d6eac44bd89c98f9198715d9545150fc431fdbb7bf3aee5d285561121d0a81565b348015610a4657600080fd5b506107bb610a553660046132b5565b61266f565b348015610a6657600080fd5b506104cc7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b348015610a9a57600080fd5b50600e546104cc565b348015610aaf57600080fd5b5061037f610abe3660046133c7565b612699565b348015610acf57600080fd5b5061037f610ade3660046132b5565b6126aa565b6000610aee81612b35565b6001600160a01b03831660009081526001602052604090205482151560ff909116151503610b525760405162461bcd60e51b815260206004820152600c60248201526b416c726561647920646f6e6560a01b60448201526064015b60405180910390fd5b6001600160a01b0383166000908152600160205260409020805460ff19168315801591909117909155610bd157600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0385166001600160a01b0319909116179055505050565b6000805b600254610be4906001906136ba565b811015610cb757846001600160a01b031660028281548110610c0857610c086136cd565b6000918252602090912001546001600160a01b031603610c2757600191505b8115610ca5576002610c3a8260016136e3565b81548110610c4a57610c4a6136cd565b600091825260209091200154600280546001600160a01b039092169183908110610c7657610c766136cd565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b80610caf816136f6565b915050610bd5565b506002805480610cc957610cc961370f565b600082815260209020810160001990810180546001600160a01b0319169055019055505b505050565b60006001600160e01b03198216637965db0b60e01b1480610d2357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000610d3481612b35565b600e5415610d765760405162461bcd60e51b815260206004820152600f60248201526e436f6e747261637420696e2075736560881b6044820152606401610b49565b604051627b8a6760e11b81526004810183905233602482015273cf5c7131a0bb9cf5cd6ac6a91e187710115718c19062f714ce9060440160006040518083038186803b158015610dc557600080fd5b505af4158015610dd9573d6000803e3d6000fd5b505050505050565b610de9612b3f565b610df1612b8e565b610e275760405162461bcd60e51b8152602060048201526007602482015266139bdd081e595d60ca1b6044820152606401610b49565b42601555610e33612bab565b50565b610e3e612b3f565b601354811015610e815760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a59081dd95a59da1d60921b6044820152606401610b49565b6000610e9482662386f26fc10000613725565b9050803414610ed55760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b6044820152606401610b49565b604051633540302360e01b81526004810182905273cf5c7131a0bb9cf5cd6ac6a91e187710115718c19063354030239060240160006040518083038186803b158015610f2057600080fd5b505af4158015610f34573d6000803e3d6000fd5b505050508160116000828254610f4a91906136e3565b9091555050604051630463bf8760e11b8152738ac77df72e938eeb7b3a1d8cdf6d586e0c61af0460048201526024810183905260096044820152600e6064820152600f608482015273f2ffe32179d9426d81b2c97c239fb4f90281e90e906308c77f0e9060a40160006040518083038186803b158015610fc957600080fd5b505af4158015610fdd573d6000803e3d6000fd5b505050508160126000828254610ff391906136e3565b90915550505050565b336001600160a01b037f000000000000000000000000d5d517abe5cf79b7e95ec98db0f0277788aff63416146110765760405163073e64fd60e21b81523360048201526001600160a01b037f000000000000000000000000d5d517abe5cf79b7e95ec98db0f0277788aff634166024820152604401610b49565b6110808282612c65565b5050565b600061108f81612b35565b506014805460ff1916911515919091179055565b60006110ae81612b35565b600e54156110f05760405162461bcd60e51b815260206004820152600f60248201526e436f6e747261637420696e2075736560881b6044820152606401610b49565b60405163a9059cbb60e01b8152336004820152602481018490526001600160a01b0383169063a9059cbb906044016020604051808303816000875af115801561113d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611161919061373c565b610ced5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610b49565b6000828152602081905260409020600101546111ba81612b35565b610ced8383612cd3565b7fe2b0d6eac44bd89c98f9198715d9545150fc431fdbb7bf3aee5d285561121d0a6111ee81612b35565b600c80546000909155801561108057604051627b8a6760e11b81526004810182905233602482015273cf5c7131a0bb9cf5cd6ac6a91e187710115718c19062f714ce9060440160006040518083038186803b15801561124c57600080fd5b505af4158015611260573d6000803e3d6000fd5b50505050806010600082825461127691906136ba565b90915550506040518181527f83db9dc084973306ecd0b0f10cb495b81dd9ddcc135eb7934d2723bcabc8f4c39060200160405180910390a15050565b600062093a806015546112c591906136e3565b905090565b6001600160a01b038116331461133a5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610b49565b6110808282612d57565b6060600e80548060200260200160405190810160405280929190818152602001828054801561139257602002820191906000526020600020905b81548152602001906001019080831161137e575b5050505050905090565b60007304f2559e75cf00a0ea163fc67e62e47c6743d02c33146113f25760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21031b0b63632b960911b6044820152606401610b49565b816011600082825461140491906136e3565b92505081905550816012600082825461141d91906136e3565b90915550506000838152600960209081526040808320429055600e8054600180820183557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd909101889055600f90935292208101849055905461148091906136ba565b6000848152600f602052604090205550600192915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6114c281612b35565b610e33612dbc565b611080610de1565b60006114dd81612b35565b50601480549115156101000261ff0019909216919091179055565b60006060611504612b8e565b91509250929050565b611515612b3f565b6000818152600760205260409020805460ff1661155e5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610b49565b8142116115975760405162461bcd60e51b8152602060048201526007602482015266139bdd081e595d60ca1b6044820152606401610b49565b8054610100900460ff16156115de5760405162461bcd60e51b815260206004820152600d60248201526c20b63932b0b23c90323930bbb760991b6044820152606401610b49565b600e546116205760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820626f6e647360801b6044820152606401610b49565b805461ff0019166101001781556000611637612bab565b6000908152600860205260409020929092555050565b6004546001600160a01b031633146116a05760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610b49565b600380546001600160a01b0319808216339081179093556004805490911690556040516001600160a01b03909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6000600a54601054601154662386f26fc100006117189190613725565b6040516370a0823160e01b815230600482015273dfe521292ece2a4f44242efbcd66bc594ca9714b906370a0823190602401602060405180830381865afa158015611767573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178b9190613759565b61179591906136ba565b61179f91906136ba565b6112c591906136ba565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6117d381612b35565b610e33612e0c565b60006117e681612b35565b6040516385dd2fa960e01b81526001600160a01b03841660048201526024810183905273cf5c7131a0bb9cf5cd6ac6a91e187710115718c1906385dd2fa9906044015b60006040518083038186803b15801561184157600080fd5b505af4158015611855573d6000803e3d6000fd5b50505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600061189281612b35565b604051339083156108fc029084906000818181858888f19350505050158015610ced573d6000803e3d6000fd5b7f600e5f1c60beb469a3fa6dd3814a4ae211cc6259a6d033bae218a742f2af01d36118e981612b35565b6016546001600160a01b0316156119305760405162461bcd60e51b815260206004820152600b60248201526a105b1c9958591e481cd95d60aa1b6044820152606401610b49565b50601680546001600160a01b0319166001600160a01b0392909216919091179055565b600061195e81612b35565b82341461196a57600080fd5b826010600082825461197c91906136e3565b9091555050604051637ebecb3760e01b815273f2ffe32179d9426d81b2c97c239fb4f90281e90e90637ebecb37906119bf90869060079089908890600401613772565b60006040518083038186803b1580156119d757600080fd5b505af41580156119eb573d6000803e3d6000fd5b5050604051633540302360e01b81526004810186905273cf5c7131a0bb9cf5cd6ac6a91e187710115718c192506335403023915060240160006040518083038186803b158015611a3a57600080fd5b505af4158015611a4e573d6000803e3d6000fd5b505050507fcf778afb6d0e1b36e6cd3338801f07c396e45a1ed7e7224c431188ef50f7d99984604051611a8391815260200190565b60405180910390a150505050565b6040516331a9108f60e11b8152600481018490523390738ac77df72e938eeb7b3a1d8cdf6d586e0c61af0490636352211e90602401602060405180830381865afa158015611ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0791906137a1565b6001600160a01b031614611b2d5760405162461bcd60e51b8152600401610b49906137be565b6000838152600b6020526040902054611b7b5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401610b49565b600083815260096020526040902054611b989062093a80906136e3565b421180611bac5750601454610100900460ff165b611bf85760405162461bcd60e51b815260206004820152601960248201527f57696e6e65722068617320746f20776169742061207765656b000000000000006044820152606401610b49565b6005821015611c395760405162461bcd60e51b815260206004820152600d60248201526c4d696e696d756d20697320352560981b6044820152606401610b49565b6001600160a01b03811660009081526001602052604090205460ff16611c935760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206368617269747960881b6044820152606401610b49565b6064821115611ca157606491505b6000838152600b602090815260408083208054908490558151606081018352848152928301849052908201929092528115611f455760405163632c9f7360e01b8152600481018390526024810185905273f2ffe32179d9426d81b2c97c239fb4f90281e90e9063632c9f7390604401606060405180830381865af4158015611d2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5191906137e5565b60208401528083526040830191909152600c8054600090611d739084906136e3565b9091555050604081015160108054600090611d8f9084906136ba565b90915550506040818101519051627b8a6760e11b8152600481019190915230602482015273cf5c7131a0bb9cf5cd6ac6a91e187710115718c19062f714ce9060440160006040518083038186803b158015611de957600080fd5b505af4158015611dfd573d6000803e3d6000fd5b505050602082015160408301513392506108fc91611e1a916136ba565b6040518115909202916000818181858888f19350505050158015611e42573d6000803e3d6000fd5b5060208101516040516000916001600160a01b038616918381818185875af1925050503d8060008114611e91576040519150601f19603f3d011682016040523d82523d6000602084013e611e96565b606091505b5050905080611ede5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610b49565b85336001600160a01b03167fbaee8f74cc5788729140904e3ff38194341a6f22eb631ae4343c86348ff9ff3484602001518560400151611f1e91906136ba565b602086810151875160408051948552928401919091529082015260600160405180910390a3505b5050505050565b6000818152600b60205260409020541580611f69575060145460ff165b611faa5760405162461bcd60e51b8152602060048201526012602482015271141b19585cd94818db185a5b48199a5c9cdd60721b6044820152606401610b49565b6040516331a9108f60e11b8152600481018290523390738ac77df72e938eeb7b3a1d8cdf6d586e0c61af0490636352211e90602401602060405180830381865afa158015611ffc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202091906137a1565b6001600160a01b0316146120465760405162461bcd60e51b8152600401610b49906137be565b6016546001600160a01b03166120935760405162461bcd60e51b815260206004820152601260248201527110d85b9b9bdd081b5a59dc985d19481e595d60721b6044820152606401610b49565b60008181526017602052604090205460ff16156120e55760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481b5a59dc985d195960821b6044820152606401610b49565b6000818152601760209081526040808320805460ff19166001908117909155600f909252822001549061211f82662386f26fc10000613725565b9050816011600082825461213391906136ba565b909155505060165460405163a9059cbb60e01b81526001600160a01b0390911660048201526024810182905273dfe521292ece2a4f44242efbcd66bc594ca9714b9063a9059cbb906044016020604051808303816000875af115801561219d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c1919061373c565b6121ff5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610b49565b601654604051633e54bacb60e01b815260048101859052602481018490526001600160a01b0390911690633e54bacb906044016020604051808303816000875af1158015612251573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612275919061373c565b6122b45760405162461bcd60e51b815260206004820152601060248201526f135a59dc985d1a5bdb8819985a5b195960821b6044820152606401610b49565b60405163453ccbb760e11b8152600f6004820152600e60248201526044810184905260009073f2ffe32179d9426d81b2c97c239fb4f90281e90e90638a79976e90606401602060405180830381865af4158015612315573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123399190613759565b9050806012600082825461234d91906136ba565b909155505050505050565b600061236381612b35565b60018263ffffffff1610156123b15760405162461bcd60e51b81526020600482015260146024820152734d696e696d756d20616c6c6f776564206973203160601b6044820152606401610b49565b5063ffffffff16601355565b336000908152600d602052604090205481111561240d5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606401610b49565b80600a600082825461241f91906136ba565b9091555050336000908152600d6020526040812080548392906124439084906136ba565b9091555050604051627b8a6760e11b81526004810182905233602482015273cf5c7131a0bb9cf5cd6ac6a91e187710115718c19062f714ce9060440160006040518083038186803b15801561249757600080fd5b505af41580156124ab573d6000803e3d6000fd5b505050507fbba99cc971d3fb4d9d1825c36fcb7600b6f0e4761261584f6e87ba611e1bce25816040516124e091815260200190565b60405180910390a150565b60006124f681612b35565b506006805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b60008281526020819052604090206001015461253881612b35565b610ced8383612d57565b61254a612b3f565b604051633540302360e01b815234600482015273cf5c7131a0bb9cf5cd6ac6a91e187710115718c19063354030239060240160006040518083038186803b15801561259457600080fd5b505af41580156125a8573d6000803e3d6000fd5b5050505034600a60008282546125be91906136e3565b9091555050336000908152600d6020526040812080543492906125e29084906136e3565b90915550506040513481527fcab58c159950a06ff0588c5b07a29621e64d9f97f6e97b3ea2ae73f29f2b1460906020015b60405180910390a1565b600061262881612b35565b60405163095ea7b360e01b81526001600160a01b03841660048201526024810183905273cf5c7131a0bb9cf5cd6ac6a91e187710115718c19063095ea7b390604401611829565b6002818154811061267f57600080fd5b6000918252602090912001546001600160a01b0316905081565b6126a1612e4f565b610e3381612ea2565b6000818152600b602052604090205415806126c7575060145460ff165b6127085760405162461bcd60e51b8152602060048201526012602482015271141b19585cd94818db185a5b48199a5c9cdd60721b6044820152606401610b49565b6040516331a9108f60e11b8152600481018290523390738ac77df72e938eeb7b3a1d8cdf6d586e0c61af0490636352211e90602401602060405180830381865afa15801561275a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277e91906137a1565b6001600160a01b0316146127a45760405162461bcd60e51b8152600401610b49906137be565b60405163dbf5132560e01b815260048101829052738ac77df72e938eeb7b3a1d8cdf6d586e0c61af049063dbf5132590602401600060405180830381600087803b1580156127f157600080fd5b505af1158015612805573d6000803e3d6000fd5b5050506000828152600f6020526040902060010154905073cf5c7131a0bb9cf5cd6ac6a91e187710115718c162f714ce61284683662386f26fc10000613725565b6040516001600160e01b031960e084901b168152600481019190915233602482015260440160006040518083038186803b15801561288357600080fd5b505af4158015612897573d6000803e3d6000fd5b5050505080601160008282546128ad91906136ba565b909155505060405163453ccbb760e11b8152600f6004820152600e60248201526044810183905260009073f2ffe32179d9426d81b2c97c239fb4f90281e90e90638a79976e90606401602060405180830381865af4158015612913573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129379190613759565b9050806012600082825461294b91906136ba565b909155505060405183907f22c65edeb753eb7dc55a4c3e9520964b5650efa336e604342561ce9728a782ae90600090a2505050565b6060610d236001600160a01b03831660145b606060006129a1836002613725565b6129ac9060026136e3565b67ffffffffffffffff8111156129c4576129c46132ce565b6040519080825280601f01601f1916602001820160405280156129ee576020820181803683370190505b509050600360fc1b81600081518110612a0957612a096136cd565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612a3857612a386136cd565b60200101906001600160f81b031916908160001a9053506000612a5c846002613725565b612a679060016136e3565b90505b6001811115612adf576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612a9b57612a9b6136cd565b1a60f81b828281518110612ab157612ab16136cd565b60200101906001600160f81b031916908160001a90535060049490941c93612ad881613813565b9050612a6a565b508315612b2e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b49565b9392505050565b610e338133612f4c565b600654600160c01b900460ff1615612b8c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b49565b565b6000612b986112b2565b42101580156112c5575050600e54151590565b6005546006546040516305d3b1d360e41b81527f06eb0e2ea7cca202fc7c8258397a36f33d88568d2522b37aaa3b14ff6ee1b69660048201526026602482015260036044820152600160a01b90910463ffffffff166064820152600160848201526000916001600160a01b031690635d3b1d309060a4016020604051808303816000875af1158015612c41573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c59190613759565b60008281526008602052604090205415612cb05761108081600081518110612c8f57612c8f6136cd565b60200260200101516008600085815260200190815260200160002054612fa5565b61108081600081518110612cc657612cc66136cd565b60200260200101516130bf565b612cdd828261185e565b611080576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055612d133390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b612d61828261185e565b15611080576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b612dc46131df565b6006805460ff60c01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b039091168152602001612613565b612e14612b3f565b6006805460ff60c01b1916600160c01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612df43390565b6003546001600160a01b03163314612b8c5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610b49565b336001600160a01b03821603612efa5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b49565b600480546001600160a01b0319166001600160a01b03838116918217909255600354604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b612f56828261185e565b61108057612f6381612980565b612f6e836020612992565b604051602001612f7f92919061382a565b60408051601f198184030181529082905262461bcd60e51b8252610b499160040161389f565b60125460405163801fb7db60e01b815260009173f2ffe32179d9426d81b2c97c239fb4f90281e90e9163801fb7db91612fe9918791600e91600f91906004016138b2565b602060405180830381865af4158015613006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061302a9190613759565b90506000600e8281548110613041576130416136cd565b6000918252602080832090910154858352600782526040808420600381018390556001810154838652600b9094529084208054929550909390916130869084906136e3565b9091555050604051849083907f4318f75752af5c2d4a851e21967ea02867513cfd11055731101d33a48b2dbbc990600090a35050505050565b60125460405163801fb7db60e01b815260009173f2ffe32179d9426d81b2c97c239fb4f90281e90e9163801fb7db91613103918691600e91600f91906004016138b2565b602060405180830381865af4158015613120573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131449190613759565b90506000600e828154811061315b5761315b6136cd565b9060005260206000200154905060006131726116fb565b9050806010600082825461318691906136e3565b90915550506000828152600b6020526040812080548392906131a99084906136e3565b909155505060405182907f819a4b8438a461a5172465f073ea78df0c35a4420134cf0a932ec6e42fedff9090600090a250505050565b600654600160c01b900460ff16612b8c5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b49565b6001600160a01b0381168114610e3357600080fd5b8015158114610e3357600080fd5b6000806040838503121561326557600080fd5b82356132708161322f565b9150602083013561328081613244565b809150509250929050565b60006020828403121561329d57600080fd5b81356001600160e01b031981168114612b2e57600080fd5b6000602082840312156132c757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561330d5761330d6132ce565b604052919050565b6000806040838503121561332857600080fd5b8235915060208084013567ffffffffffffffff8082111561334857600080fd5b818601915086601f83011261335c57600080fd5b81358181111561336e5761336e6132ce565b8060051b915061337f8483016132e4565b818152918301840191848101908984111561339957600080fd5b938501935b838510156133b75784358252938501939085019061339e565b8096505050505050509250929050565b6000602082840312156133d957600080fd5b8135612b2e8161322f565b6000602082840312156133f657600080fd5b8135612b2e81613244565b6000806040838503121561341457600080fd5b8235915060208301356132808161322f565b6020808252825182820181905260009190848201906040850190845b8181101561345e57835183529284019291840191600101613442565b50909695505050505050565b6000806040838503121561347d57600080fd5b50508035926020909101359150565b6000806020838503121561349f57600080fd5b823567ffffffffffffffff808211156134b757600080fd5b818501915085601f8301126134cb57600080fd5b8135818111156134da57600080fd5b8660208285010111156134ec57600080fd5b60209290920196919550909350505050565b60005b83811015613519578181015183820152602001613501565b50506000910152565b6000815180845261353a8160208601602086016134fe565b601f01601f19169290920160200192915050565b82151581526040602082015260006135696040830184613522565b949350505050565b6000806040838503121561358457600080fd5b823561358f8161322f565b946020939093013593505050565b6000806000606084860312156135b257600080fd5b833592506020808501359250604085013567ffffffffffffffff808211156135d957600080fd5b818701915087601f8301126135ed57600080fd5b8135818111156135ff576135ff6132ce565b613611601f8201601f191685016132e4565b9150808252888482850101111561362757600080fd5b80848401858401376000848284010152508093505050509250925092565b60008060006060848603121561365a57600080fd5b833592506020840135915060408401356136738161322f565b809150509250925092565b60006020828403121561369057600080fd5b813563ffffffff81168114612b2e57600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610d2357610d236136a4565b634e487b7160e01b600052603260045260246000fd5b80820180821115610d2357610d236136a4565b600060018201613708576137086136a4565b5060010190565b634e487b7160e01b600052603160045260246000fd5b8082028115828204841417610d2357610d236136a4565b60006020828403121561374e57600080fd5b8151612b2e81613244565b60006020828403121561376b57600080fd5b5051919050565b8481528360208201528260408201526080606082015260006137976080830184613522565b9695505050505050565b6000602082840312156137b357600080fd5b8151612b2e8161322f565b6020808252600d908201526c24b73b30b634b21037bbb732b960991b604082015260600190565b6000806000606084860312156137fa57600080fd5b8351925060208401519150604084015190509250925092565b600081613822576138226136a4565b506000190190565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516138628160178501602088016134fe565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516138938160288401602088016134fe565b01602801949350505050565b602081526000612b2e6020830184613522565b600060808201868352602060808185015281875480845260a0860191508860005282600020935060005b818110156138f8578454835260019485019492840192016138dc565b50506040850196909652505050606001529291505056fea26469706673582212203c1e5e364d752dd782327c9dc56522bb63471f9afdf7eeb539b27bbca211496464736f6c63430008110033
Library Used
LibLendingPool : 0xcf5c7131a0bb9cf5cd6ac6a91e187710115718c1LMyChance : 0xf2ffe32179d9426d81b2c97c239fb4f90281e90e
Deployed Bytecode Sourcemap
10825:2472:20:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;199:653:4;;;;;;;;;;-1:-1:-1;199:653:4;;;;;:::i;:::-;;:::i;:::-;;2571:202:0;;;;;;;;;;-1:-1:-1;2571:202:0;;;;;:::i;:::-;;:::i;:::-;;;1116:14:28;;1109:22;1091:41;;1079:2;1064:18;2571:202:0;;;;;;;;9396:203:20;;;;;;;;;;-1:-1:-1;9396:203:20;;;;;:::i;:::-;;:::i;2213:151::-;;;;;;;;;;;;;:::i;13116:179::-;;;;;;;;;;-1:-1:-1;13213:11:20;;13226:14;;13242:10;;13254:16;;13116:179;;;1575:25:28;;;1631:2;1616:18;;1609:34;;;;1659:18;;;1652:34;13254:16:20;;;;1729:14:28;1722:22;1717:2;1702:18;;1695:50;13254:16:20;13272:15;;;;1789:14:28;1782:22;1776:3;1761:19;;1754:51;1562:3;1547:19;13116:179:20;1328:483:28;4606:475:20;;;;;;:::i;:::-;;:::i;6618:256:26:-;;;;;;;;;;-1:-1:-1;6618:256:26;;;;;:::i;:::-;;:::i;118:41:4:-;;;;;;;;;;-1:-1:-1;118:41:4;;;;;:::i;:::-;;;;;;;;;;;;;;;;4343:129:0;;;;;;;;;;-1:-1:-1;4343:129:0;;;;;:::i;:::-;4417:7;4443:12;;;;;;;;;;:22;;;;4343:129;;;;3830:25:28;;;3818:2;3803:18;4343:129:0;3684:177:28;8004:114:20;;;;;;;;;;-1:-1:-1;8004:114:20;;;;;:::i;:::-;;:::i;9013:242::-;;;;;;;;;;-1:-1:-1;9013:242:20;;;;;:::i;:::-;;:::i;907:48::-;;;;;;;;;;-1:-1:-1;907:48:20;;;;;:::i;:::-;;;;;;;;;;;;;;4768:145:0;;;;;;;;;;-1:-1:-1;4768:145:0;;;;;:::i;:::-;;:::i;8242:300:20:-;;;;;;;;;;;;;:::i;6661:123::-;;;;;;;;;;;;;:::i;5877:214:0:-;;;;;;;;;;-1:-1:-1;5877:214:0;;;;;:::i;:::-;;:::i;12855:100:20:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10963:458::-;;;;;;;;;;-1:-1:-1;10963:458:20;;;;;:::i;:::-;;:::i;11778:75::-;;;;;;;;;;;;;:::i;1196:34::-;;;;;;;;;;;;;;;;11600:80;;;;;;;;;;-1:-1:-1;11600:80:20;;;;;:::i;:::-;;:::i;1608:84:22:-;;;;;;;;;;-1:-1:-1;1678:7:22;;-1:-1:-1;;;1678:7:22;;;;1608:84;;8124:112:20;;;;;;;;;;-1:-1:-1;8124:112:20;;;;;:::i;:::-;;:::i;741:46::-;;;;;;;;;;-1:-1:-1;741:46:20;;;;;:::i;:::-;;;;;;;;;;;;;;793:29;;;;;;;;;;;;;;;;11451:143;;;;;;;;;;-1:-1:-1;11451:143:20;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;202:66:24:-;;;;;;;;;;;;242:26;202:66;;2370:528:20;;;;;;;;;;-1:-1:-1;2370:528:20;;;;;:::i;:::-;;:::i;1005:265:6:-;;;;;;;;;;;;;:::i;6461:194:20:-;;;;;;;;;;;;;:::i;11701:71::-;;;;;;;;;;;;;:::i;12452:160::-;;;;;;;;;;-1:-1:-1;12452:160:20;;;;;:::i;:::-;;:::i;1321:81:6:-;;;;;;;;;;-1:-1:-1;1390:7:6;;-1:-1:-1;;;;;1390:7:6;1321:81;;;-1:-1:-1;;;;;7737:32:28;;;7719:51;;7707:2;7692:18;1321:81:6;7573:203:28;2860:145:0;;;;;;;;;;-1:-1:-1;2860:145:0;;;;;:::i;:::-;;:::i;9261:129:20:-;;;;;;;;;;-1:-1:-1;9261:129:20;;;;;:::i;:::-;;:::i;9713:180::-;;;;;;;;;;-1:-1:-1;9713:180:20;;;;;:::i;:::-;;:::i;1992:49:0:-;;;;;;;;;;-1:-1:-1;1992:49:0;2037:4;1992:49;;12738:107:20;;;;;;;;;;-1:-1:-1;12827:10:20;12786:7;12811:27;;;:15;:27;;;;;;12738:107;;8548:378;;;;;;:::i;:::-;;:::i;2908:1692::-;;;;;;;;;;-1:-1:-1;2908:1692:20;;;;;:::i;:::-;;:::i;9899:922::-;;;;;;;;;;-1:-1:-1;9899:922:20;;;;;:::i;:::-;;:::i;11873:198::-;;;;;;;;;;-1:-1:-1;11873:198:20;;;;;:::i;:::-;;:::i;5998:296::-;;;;;;;;;;-1:-1:-1;5998:296:20;;;;;:::i;:::-;;:::i;12093:148::-;;;;;;;;;;-1:-1:-1;12093:148:20;;;;;:::i;:::-;;:::i;829:43::-;;;;;;;;;;-1:-1:-1;829:43:20;;;;;:::i;:::-;;;;;;;;;;;;;;5193:147:0;;;;;;;;;;-1:-1:-1;5193:147:0;;;;;:::i;:::-;;:::i;12961:149:20:-;;;;;;;;;;-1:-1:-1;12961:149:20;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;13076:27:20;;;;:18;:27;;;;;;;;;13069:34;;;;;;;;;;;;;;;;;;;;12961:149;;;;;9597:13:28;;9579:32;;9667:4;9655:17;;;9649:24;9627:20;;;9620:54;;;;9552:18;12961:149:20;9363:317:28;5750:242:20;;;:::i;12274:153::-;;;;;;;;;;-1:-1:-1;12274:153:20;;;;;:::i;:::-;;:::i;274:58:24:-;;;;;;;;;;;;310:22;274:58;;165:27:4;;;;;;;;;;-1:-1:-1;165:27:4;;;;;:::i;:::-;;:::i;134:62:24:-;;;;;;;;;;;;172:24;134:62;;12631:100:20;;;;;;;;;;-1:-1:-1;12707:10:20;:17;12631:100;;815:98:6;;;;;;;;;;-1:-1:-1;815:98:6;;;;;:::i;:::-;;:::i;5087:657:20:-;;;;;;;;;;-1:-1:-1;5087:657:20;;;;;:::i;:::-;;:::i;199:653:4:-;2037:4:0;2470:16;2037:4;2470:10;:16::i;:::-;-1:-1:-1;;;;;310:19:4;::::1;;::::0;;;:9:::1;:19;::::0;;;;;:31;::::1;;:19;::::0;;::::1;:31;;::::0;302:56:::1;;;::::0;-1:-1:-1;;;302:56:4;;9887:2:28;302:56:4::1;::::0;::::1;9869:21:28::0;9926:2;9906:18;;;9899:30;-1:-1:-1;;;9945:18:28;;;9938:42;9997:18;;302:56:4::1;;;;;;;;;-1:-1:-1::0;;;;;369:19:4;::::1;;::::0;;;:9:::1;:19;::::0;;;;:30;;-1:-1:-1;;369:30:4::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;410:436:::1;;438:10;:25:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;438:25:4;;;;;::::1;::::0;;-1:-1:-1;;;;;438:25:4;::::1;-1:-1:-1::0;;;;;;438:25:4;;::::1;;::::0;;199:653;;;:::o;410:436::-:1;494:10;531:6:::0;526:280:::1;545:10;:17:::0;:19:::1;::::0;563:1:::1;::::0;545:19:::1;:::i;:::-;543:1;:21;526:280;;;609:8;-1:-1:-1::0;;;;;592:25:4::1;:10;603:1;592:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;592:13:4::1;:25:::0;588:104:::1;;649:4;641:12;;588:104;713:5;709:83;;;758:10;769:3;:1:::0;771::::1;769:3;:::i;:::-;758:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;742:10:::1;:13:::0;;-1:-1:-1;;;;;758:15:4;;::::1;::::0;753:1;;742:13;::::1;;;;;:::i;:::-;;;;;;;;;:31;;;;;-1:-1:-1::0;;;;;742:31:4::1;;;;;-1:-1:-1::0;;;;;742:31:4::1;;;;;;709:83;566:3:::0;::::1;::::0;::::1;:::i;:::-;;;;526:280;;;;819:10;:16;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;819:16:4;;;;;-1:-1:-1;;;;;;819:16:4::1;::::0;;;;;-1:-1:-1;410:436:4::1;199:653:::0;;;:::o;2571:202:0:-;2656:4;-1:-1:-1;;;;;;2679:47:0;;-1:-1:-1;;;2679:47:0;;:87;;-1:-1:-1;;;;;;;;;;937:40:8;;;2730:36:0;2672:94;2571:202;-1:-1:-1;;2571:202:0:o;9396:203:20:-;2037:4:0;2470:16;2037:4;2470:10;:16::i;:::-;9496:10:20::1;:17:::0;:22;9488:50:::1;;;::::0;-1:-1:-1;;;9488:50:20;;11027:2:28;9488:50:20::1;::::0;::::1;11009:21:28::0;11066:2;11046:18;;;11039:30;-1:-1:-1;;;11085:18:28;;;11078:45;11140:18;;9488:50:20::1;10825:339:28::0;9488:50:20::1;9548:44;::::0;-1:-1:-1;;;9548:44:20;;::::1;::::0;::::1;11351:25:28::0;;;9581:10:20::1;11392:18:28::0;;;11385:60;9548:14:20::1;::::0;:23:::1;::::0;11324:18:28;;9548:44:20::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;9396:203:::0;;:::o;2213:151::-;1232:19:22;:17;:19::i;:::-;2268:9:20::1;:7;:9::i;:::-;2260:29;;;::::0;-1:-1:-1;;;2260:29:20;;11658:2:28;2260:29:20::1;::::0;::::1;11640:21:28::0;11697:1;11677:18;;;11670:29;-1:-1:-1;;;11715:18:28;;;11708:37;11762:18;;2260:29:20::1;11456:330:28::0;2260:29:20::1;2312:15;2300:9;:27:::0;2337:20:::1;:18;:20::i;:::-;;2213:151::o:0;4606:475::-;1232:19:22;:17;:19::i;:::-;4701:13:20::1;;4691:6;:23;;4683:50;;;::::0;-1:-1:-1;;;4683:50:20;;11993:2:28;4683:50:20::1;::::0;::::1;11975:21:28::0;12032:2;12012:18;;;12005:30;-1:-1:-1;;;12051:18:28;;;12044:44;12105:18;;4683:50:20::1;11791:338:28::0;4683:50:20::1;4744:12;4759:13;:6:::0;4768:4:::1;4759:13;:::i;:::-;4744:28;;4837:4;4824:9;:17;4816:43;;;::::0;-1:-1:-1;;;4816:43:20;;12509:2:28;4816:43:20::1;::::0;::::1;12491:21:28::0;12548:2;12528:18;;;12521:30;-1:-1:-1;;;12567:18:28;;;12560:43;12620:18;;4816:43:20::1;12307:337:28::0;4816:43:20::1;4869:27;::::0;-1:-1:-1;;;4869:27:20;;::::1;::::0;::::1;3830:25:28::0;;;4869:14:20::1;::::0;:21:::1;::::0;3803:18:28;;4869:27:20::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4936:6;4918:14;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;4953:91:20::1;::::0;-1:-1:-1;;;4953:91:20;;171:42:15::1;4953:91:20;::::0;::::1;13233:51:28::0;13300:18;;;13293:34;;;5000:11:20::1;13343:18:28::0;;;13336:34;5013:10:20::1;13386:18:28::0;;;13379:34;5025:18:20::1;13429:19:28::0;;;13422:35;4953:9:20::1;::::0;:14:::1;::::0;13205:19:28;;4953:91:20::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;5068:6;5054:10;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;4606:475:20:o;6618:256:26:-;6717:10;-1:-1:-1;;;;;6731:14:26;6717:28;;6713:109;;6762:53;;-1:-1:-1;;;6762:53:26;;6788:10;6762:53;;;13680:34:28;-1:-1:-1;;;;;6800:14:26;13750:15:28;13730:18;;;13723:43;13615:18;;6762:53:26;13468:304:28;6713:109:26;6827:42;6846:9;6857:11;6827:18;:42::i;:::-;6618:256;;:::o;8004:114:20:-;2037:4:0;2470:16;2037:4;2470:10;:16::i;:::-;-1:-1:-1;8089:16:20::1;:22:::0;;-1:-1:-1;;8089:22:20::1;::::0;::::1;;::::0;;;::::1;::::0;;8004:114::o;9013:242::-;2037:4:0;2470:16;2037:4;2470:10;:16::i;:::-;9124:10:20::1;:17:::0;:22;9116:50:::1;;;::::0;-1:-1:-1;;;9116:50:20;;11027:2:28;9116:50:20::1;::::0;::::1;11009:21:28::0;11066:2;11046:18;;;11039:30;-1:-1:-1;;;11085:18:28;;;11078:45;11140:18;;9116:50:20::1;10825:339:28::0;9116:50:20::1;9184:44;::::0;-1:-1:-1;;;9184:44:20;;9208:10:::1;9184:44;::::0;::::1;13951:51:28::0;14018:18;;;14011:34;;;-1:-1:-1;;;;;9184:23:20;::::1;::::0;::::1;::::0;13924:18:28;;9184:44:20::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9176:72;;;::::0;-1:-1:-1;;;9176:72:20;;14508:2:28;9176:72:20::1;::::0;::::1;14490:21:28::0;14547:2;14527:18;;;14520:30;-1:-1:-1;;;14566:18:28;;;14559:45;14621:18;;9176:72:20::1;14306:339:28::0;4768:145:0;4417:7;4443:12;;;;;;;;;;:22;;;2470:16;2481:4;2470:10;:16::i;:::-;4881:25:::1;4892:4;4898:7;4881:10;:25::i;8242:300:20:-:0;310:22:24;2470:16:0;2481:4;2470:10;:16::i;:::-;8320:13:20::1;::::0;;8301:16:::1;8343:17:::0;;;8375:12;;8371:165:::1;;8403:45;::::0;-1:-1:-1;;;8403:45:20;;::::1;::::0;::::1;11351:25:28::0;;;8437:10:20::1;11392:18:28::0;;;11385:60;8403:14:20::1;::::0;:23:::1;::::0;11324:18:28;;8403:45:20::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8477:8;8462:11;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;8504:21:20::1;::::0;3830:25:28;;;8504:21:20::1;::::0;3818:2:28;3803:18;8504:21:20::1;;;;;;;8291:251;8242:300:::0;:::o;6661:123::-;6708:7;263:10:15;6734:9:20;;:43;;;;:::i;:::-;6727:50;;6661:123;:::o;5877:214:0:-;-1:-1:-1;;;;;5972:23:0;;719:10:7;5972:23:0;5964:83;;;;-1:-1:-1;;;5964:83:0;;14852:2:28;5964:83:0;;;14834:21:28;14891:2;14871:18;;;14864:30;14930:34;14910:18;;;14903:62;-1:-1:-1;;;14981:18:28;;;14974:45;15036:19;;5964:83:0;14650:411:28;5964:83:0;6058:26;6070:4;6076:7;6058:11;:26::i;12855:100:20:-;12904:16;12938:10;12931:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12855:100;:::o;10963:458::-;11028:4;11066:42;11052:10;:56;11044:83;;;;-1:-1:-1;;;11044:83:20;;15268:2:28;11044:83:20;;;15250:21:28;15307:2;15287:18;;;15280:30;-1:-1:-1;;;15326:18:28;;;15319:44;15380:18;;11044:83:20;15066:338:28;11044:83:20;11155:6;11137:14;;:24;;;;;;;:::i;:::-;;;;;;;;11185:6;11171:10;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;11201:20:20;;;;:11;:20;;;;;;;;11224:15;11201:38;;11249:10;:24;;;;;;;;;;;;;;;11283:18;:27;;;;;:34;;:43;;;11372:17;;:21;;11249:24;11372:21;:::i;:::-;11336:27;;;;:18;:27;;;;;:57;-1:-1:-1;11410:4:20;10963:458;;;;:::o;11778:75::-;172:24:24;2470:16:0;2481:4;2470:10;:16::i;:::-;11836:10:20::1;:8;:10::i;11600:80::-:0;11667:6;:4;:6::i;8124:112::-;2037:4:0;2470:16;2037:4;2470:10;:16::i;:::-;-1:-1:-1;8208:15:20::1;:21:::0;;;::::1;;;;-1:-1:-1::0;;8208:21:20;;::::1;::::0;;;::::1;::::0;;8124:112::o;11451:143::-;11520:17;11539:12;11578:9;:7;:9::i;:::-;11563:24;;11451:143;;;;;:::o;2370:528::-;1232:19:22;:17;:19::i;:::-;2450:47:20::1;2500:27:::0;;;:16:::1;:27;::::0;;;;2545:20;;::::1;;2537:40;;;::::0;-1:-1:-1;;;2537:40:20;;15611:2:28;2537:40:20::1;::::0;::::1;15593:21:28::0;15650:1;15630:18;;;15623:29;-1:-1:-1;;;15668:18:28;;;15661:37;15715:18;;2537:40:20::1;15409:330:28::0;2537:40:20::1;2613:9;2595:15;:27;2587:47;;;::::0;-1:-1:-1;;;2587:47:20;;11658:2:28;2587:47:20::1;::::0;::::1;11640:21:28::0;11697:1;11677:18;;;11670:29;-1:-1:-1;;;11715:18:28;;;11708:37;11762:18;;2587:47:20::1;11456:330:28::0;2587:47:20::1;2652:20:::0;;::::1;::::0;::::1;;;:29;2644:55;;;::::0;-1:-1:-1;;;2644:55:20;;15946:2:28;2644:55:20::1;::::0;::::1;15928:21:28::0;15985:2;15965:18;;;15958:30;-1:-1:-1;;;16004:18:28;;;15997:43;16057:18;;2644:55:20::1;15744:337:28::0;2644:55:20::1;2717:10;:17:::0;2709:50:::1;;;::::0;-1:-1:-1;;;2709:50:20;;16288:2:28;2709:50:20::1;::::0;::::1;16270:21:28::0;16327:2;16307:18;;;16300:30;-1:-1:-1;;;16346:18:28;;;16339:46;16402:18;;2709:50:20::1;16086:340:28::0;2709:50:20::1;2770:27:::0;;-1:-1:-1;;2770:27:20::1;;;::::0;;:20:::1;2823;:18;:20::i;:::-;2853:26;::::0;;;:19:::1;:26;::::0;;;;:38;;;;-1:-1:-1;;2370:528:20:o;1005:265:6:-;1078:14;;-1:-1:-1;;;;;1078:14:6;1064:10;:28;1056:63;;;;-1:-1:-1;;;1056:63:6;;16633:2:28;1056:63:6;;;16615:21:28;16672:2;16652:18;;;16645:30;-1:-1:-1;;;16691:18:28;;;16684:52;16753:18;;1056:63:6;16431:346:28;1056:63:6;1145:7;;;-1:-1:-1;;;;;;1158:20:6;;;1168:10;1158:20;;;;;;1184:14;:27;;;;;;;1223:42;;-1:-1:-1;;;;;1145:7:6;;;;1168:10;1145:7;;1223:42;;1126:16;;1223:42;1050:220;1005:265::o;6461:194:20:-;6509:7;6634:14;;6620:11;;6596:14;;6613:4;6596:21;;;;:::i;:::-;6535:58;;-1:-1:-1;;;6535:58:20;;6587:4;6535:58;;;7719:51:28;477:42:15;;6535:43:20;;7692:18:28;;6535:58:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:82;;;;:::i;:::-;:96;;;;:::i;:::-;:113;;;;:::i;11701:71::-;172:24:24;2470:16:0;2481:4;2470:10;:16::i;:::-;11757:8:20::1;:6;:8::i;12452:160::-:0;2037:4:0;2470:16;2037:4;2470:10;:16::i;:::-;12557:47:20::1;::::0;-1:-1:-1;;;12557:47:20;;-1:-1:-1;;;;;13969:32:28;;12557:47:20::1;::::0;::::1;13951:51:28::0;14018:18;;;14011:34;;;12557:14:20::1;::::0;:30:::1;::::0;13924:18:28;;12557:47:20::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;12452:160:::0;;;:::o;2860:145:0:-;2946:4;2969:12;;;;;;;;;;;-1:-1:-1;;;;;2969:29:0;;;;;;;;;;;;;;;2860:145::o;9261:129:20:-;2037:4:0;2470:16;2037:4;2470:10;:16::i;:::-;9346:37:20::1;::::0;9354:10:::1;::::0;9346:37;::::1;;;::::0;9375:7;;9346:37:::1;::::0;;;9375:7;9354:10;9346:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;9713:180:::0;242:26:24;2470:16:0;2481:4;2470:10;:16::i;:::-;9809:11:20::1;::::0;-1:-1:-1;;;;;9809:11:20::1;:25:::0;9800:50:::1;;;::::0;-1:-1:-1;;;9800:50:20;;17460:2:28;9800:50:20::1;::::0;::::1;17442:21:28::0;17499:2;17479:18;;;17472:30;-1:-1:-1;;;17518:18:28;;;17511:41;17569:18;;9800:50:20::1;17258:335:28::0;9800:50:20::1;-1:-1:-1::0;9860:11:20::1;:26:::0;;-1:-1:-1;;;;;;9860:26:20::1;-1:-1:-1::0;;;;;9860:26:20;;;::::1;::::0;;;::::1;::::0;;9713:180::o;8548:378::-;2037:4:0;2470:16;2037:4;2470:10;:16::i;:::-;8714:6:20::1;8701:9;:19;8693:28;;;::::0;::::1;;8746:6;8731:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;8762:78:20::1;::::0;-1:-1:-1;;;8762:78:20;;:9:::1;::::0;:27:::1;::::0;:78:::1;::::0;8790:6;;8798:16:::1;::::0;8816:9;;8827:12;;8762:78:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;8850:29:20::1;::::0;-1:-1:-1;;;8850:29:20;;::::1;::::0;::::1;3830:25:28::0;;;8850:14:20::1;::::0;-1:-1:-1;8850:21:20::1;::::0;-1:-1:-1;3803:18:28;;8850:29:20::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8894:25;8909:9;8894:25;;;;3830::28::0;;3818:2;3803:18;;3684:177;8894:25:20::1;;;;;;;;8548:378:::0;;;;:::o;2908:1692::-;3015:40;;-1:-1:-1;;;3015:40:20;;;;;3830:25:28;;;3059:10:20;;171:42:15;;3015:30:20;;3803:18:28;;3015:40:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;3015:54:20;;3007:80;;;;-1:-1:-1;;;3007:80:20;;;;;;;:::i;:::-;3127:1;3105:19;;;:9;:19;;;;;;3097:52;;;;-1:-1:-1;;;3097:52:20;;18899:2:28;3097:52:20;;;18881:21:28;18938:2;18918:18;;;18911:30;-1:-1:-1;;;18957:18:28;;;18950:46;19013:18;;3097:52:20;18697:340:28;3097:52:20;3186:21;;;;:11;:21;;;;;;:55;;263:10:15;;3186:55:20;:::i;:::-;3168:15;:73;3167:94;;;-1:-1:-1;3246:15:20;;;;;;;3167:94;3159:132;;;;-1:-1:-1;;;3159:132:20;;19244:2:28;3159:132:20;;;19226:21:28;19283:2;19263:18;;;19256:30;19322:27;19302:18;;;19295:55;19367:18;;3159:132:20;19042:349:28;3159:132:20;3324:1;3309:11;:16;;3301:42;;;;-1:-1:-1;;;3301:42:20;;19598:2:28;3301:42:20;;;19580:21:28;19637:2;19617:18;;;19610:30;-1:-1:-1;;;19656:18:28;;;19649:43;19709:18;;3301:42:20;19396:337:28;3301:42:20;-1:-1:-1;;;;;3361:19:20;;;;;;:9;:19;;;;;;;;3353:47;;;;-1:-1:-1;;;3353:47:20;;19940:2:28;3353:47:20;;;19922:21:28;19979:2;19959:18;;;19952:30;-1:-1:-1;;;19998:18:28;;;19991:45;20053:18;;3353:47:20;19738:339:28;3353:47:20;3429:3;3415:11;:17;3411:65;;;3462:3;3448:17;;3411:65;3486:17;3506:19;;;:9;:19;;;;;;;;;;3535:23;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;3620:13:20;;3616:978;;3756:47;;-1:-1:-1;;;3756:47:20;;;;;20264:25:28;;;20305:18;;;20298:34;;;3756:9:20;;:23;;20237:18:28;;3756:47:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3719:33;;;3651:152;;;;3652:35;;;3651:152;;;;3817:13;:45;;3689:28;;3817:45;;3651:152;;3817:45;:::i;:::-;;;;-1:-1:-1;;3891:35:20;;;;3876:11;:50;;:11;;:50;;3891:35;;3876:50;:::i;:::-;;;;-1:-1:-1;;3964:35:20;;;;;3940:75;;-1:-1:-1;;;3940:75:20;;;;;11351:25:28;;;;4009:4:20;11392:18:28;;;11385:60;3940:14:20;;:23;;11324:18:28;;3940:75:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4098:33:20;;;;4060:35;;;;4038:10;;-1:-1:-1;4029:104:20;;4060:71;;;:::i;:::-;4029:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4183:33:20;;;;4162:59;;4148:9;;-1:-1:-1;;;;;4162:13:20;;;4148:9;4162:59;4148:9;4162:59;4183:33;4162:13;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4147:74;;;4243:4;4235:37;;;;-1:-1:-1;;;4235:37:20;;21066:2:28;4235:37:20;;;21048:21:28;21105:2;21085:18;;;21078:30;-1:-1:-1;;;21124:18:28;;;21117:50;21184:18;;4235:37:20;20864:344:28;4235:37:20;4346:8;4305:10;-1:-1:-1;;;;;4291:292:20;;4425:14;:33;;;4387:14;:35;;;:71;;;;:::i;:::-;4490:33;;;;;4554:28;;4291:292;;;21415:25:28;;;21456:18;;;21449:34;;;;21499:18;;;21492:34;21403:2;21388:18;4291:292:20;;;;;;;3635:959;3616:978;2997:1603;;2908:1692;;;:::o;9899:922::-;9967:19;;;;:9;:19;;;;;;:24;;:44;;-1:-1:-1;9995:16:20;;;;9967:44;9959:75;;;;-1:-1:-1;;;9959:75:20;;21739:2:28;9959:75:20;;;21721:21:28;21778:2;21758:18;;;21751:30;-1:-1:-1;;;21797:18:28;;;21790:48;21855:18;;9959:75:20;21537:342:28;9959:75:20;10052:40;;-1:-1:-1;;;10052:40:20;;;;;3830:25:28;;;10096:10:20;;171:42:15;;10052:30:20;;3803:18:28;;10052:40:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10052:54:20;;10044:80;;;;-1:-1:-1;;;10044:80:20;;;;;;;:::i;:::-;10143:11;;-1:-1:-1;;;;;10143:11:20;10134:57;;;;-1:-1:-1;;;10134:57:20;;22086:2:28;10134:57:20;;;22068:21:28;22125:2;22105:18;;;22098:30;-1:-1:-1;;;22144:18:28;;;22137:48;22202:18;;10134:57:20;21884:342:28;10134:57:20;10210:18;;;;:8;:18;;;;;;;;10209:19;10201:48;;;;-1:-1:-1;;;10201:48:20;;22433:2:28;10201:48:20;;;22415:21:28;22472:2;22452:18;;;22445:30;-1:-1:-1;;;22491:18:28;;;22484:46;22547:18;;10201:48:20;22231:340:28;10201:48:20;10260:18;;;;:8;:18;;;;;;;;:25;;-1:-1:-1;;10260:25:20;10281:4;10260:25;;;;;;10313:18;:28;;;;;:35;;;10399:13;10313:35;10408:4;10399:13;:::i;:::-;10391:21;;10440:6;10422:14;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;10508:11:20;;10465:62;;-1:-1:-1;;;10465:62:20;;-1:-1:-1;;;;;10508:11:20;;;10465:62;;;13951:51:28;14018:18;;;14011:34;;;477:42:15;;10465::20;;13924:18:28;;10465:62:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10457:90;;;;-1:-1:-1;;;10457:90:20;;14508:2:28;10457:90:20;;;14490:21:28;14547:2;14527:18;;;14520:30;-1:-1:-1;;;14566:18:28;;;14559:45;14621:18;;10457:90:20;14306:339:28;10457:90:20;10577:11;;10566:49;;-1:-1:-1;;;10566:49:20;;;;;20264:25:28;;;20305:18;;;20298:34;;;-1:-1:-1;;;;;10577:11:20;;;;10566:31;;20237:18:28;;10566:49:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10558:78;;;;-1:-1:-1;;;10558:78:20;;23031:2:28;10558:78:20;;;23013:21:28;23070:2;23050:18;;;23043:30;-1:-1:-1;;;23089:18:28;;;23082:46;23145:18;;10558:78:20;22829:340:28;10558:78:20;10714:64;;-1:-1:-1;;;10714:64:20;;10737:18;10714:64;;;21415:25:28;10757:10:20;21456:18:28;;;21449:34;21499:18;;;21492:34;;;10691:20:20;;10714:9;;:22;;21388:18:28;;10714:64:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10691:87;;10802:12;10788:10;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;9899:922:20:o;11873:198::-;2037:4:0;2470:16;2037:4;2470:10;:16::i;:::-;11998:1:20::1;11980:14;:19;;;;11972:52;;;::::0;-1:-1:-1;;;11972:52:20;;23787:2:28;11972:52:20::1;::::0;::::1;23769:21:28::0;23826:2;23806:18;;;23799:30;-1:-1:-1;;;23845:18:28;;;23838:50;23905:18;;11972:52:20::1;23585:344:28::0;11972:52:20::1;-1:-1:-1::0;12034:30:20::1;;:13;:30:::0;11873:198::o;5998:296::-;6078:10;6062:27;;;;:15;:27;;;;;;:37;-1:-1:-1;6062:37:20;6054:64;;;;-1:-1:-1;;;6054:64:20;;24136:2:28;6054:64:20;;;24118:21:28;24175:2;24155:18;;;24148:30;-1:-1:-1;;;24194:18:28;;;24187:44;24248:18;;6054:64:20;23934:338:28;6054:64:20;6146:6;6128:14;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;6178:10:20;6162:27;;;;:15;:27;;;;;:36;;6192:6;;6162:27;:36;;6192:6;;6162:36;:::i;:::-;;;;-1:-1:-1;;6208:43:20;;-1:-1:-1;;;6208:43:20;;;;;11351:25:28;;;6240:10:20;11392:18:28;;;11385:60;6208:14:20;;:23;;11324:18:28;;6208:43:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6267:20;6280:6;6267:20;;;;3830:25:28;;3818:2;3803:18;;3684:177;6267:20:20;;;;;;;;5998:296;:::o;12093:148::-;2037:4:0;2470:16;2037:4;2470:10;:16::i;:::-;-1:-1:-1;12198:16:20::1;:36:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;12198:36:20::1;-1:-1:-1::0;;;;12198:36:20;;::::1;::::0;;;::::1;::::0;;12093:148::o;5193:147:0:-;4417:7;4443:12;;;;;;;;;;:22;;;2470:16;2481:4;2470:10;:16::i;:::-;5307:26:::1;5319:4;5325:7;5307:11;:26::i;5750:242:20:-:0;1232:19:22;:17;:19::i;:::-;5816:32:20::1;::::0;-1:-1:-1;;;5816:32:20;;5838:9:::1;5816:32;::::0;::::1;3830:25:28::0;5816:14:20::1;::::0;:21:::1;::::0;3803:18:28;;5816:32:20::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;5885:9;5867:14;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;5920:10:20::1;5904:27;::::0;;;:15:::1;:27;::::0;;;;:40;;5935:9:::1;::::0;5904:27;:40:::1;::::0;5935:9;;5904:40:::1;:::i;:::-;::::0;;;-1:-1:-1;;5960:25:20::1;::::0;5975:9:::1;3830:25:28::0;;5960::20::1;::::0;3818:2:28;3803:18;5960:25:20::1;;;;;;;;5750:242::o:0;12274:153::-;2037:4:0;2470:16;2037:4;2470:10;:16::i;:::-;12373:39:20::1;::::0;-1:-1:-1;;;12373:39:20;;-1:-1:-1;;;;;13969:32:28;;12373:39:20::1;::::0;::::1;13951:51:28::0;14018:18;;;14011:34;;;12373:14:20::1;::::0;:22:::1;::::0;13924:18:28;;12373:39:20::1;13777:274:28::0;165:27:4;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;165:27:4;;-1:-1:-1;165:27:4;:::o;815:98:6:-;1945:20;:18;:20::i;:::-;886:22:::1;905:2;886:18;:22::i;5087:657:20:-:0;5155:19;;;;:9;:19;;;;;;:24;;:44;;-1:-1:-1;5183:16:20;;;;5155:44;5147:75;;;;-1:-1:-1;;;5147:75:20;;21739:2:28;5147:75:20;;;21721:21:28;21778:2;21758:18;;;21751:30;-1:-1:-1;;;21797:18:28;;;21790:48;21855:18;;5147:75:20;21537:342:28;5147:75:20;5240:40;;-1:-1:-1;;;5240:40:20;;;;;3830:25:28;;;5284:10:20;;171:42:15;;5240:30:20;;3803:18:28;;5240:40:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5240:54:20;;5232:80;;;;-1:-1:-1;;;5232:80:20;;;;;;;:::i;:::-;5323:41;;-1:-1:-1;;;5323:41:20;;;;;3830:25:28;;;171:42:15;;5323:31:20;;3803:18:28;;5323:41:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5375:14:20;5392:28;;;:18;:28;;;;;:35;;;;-1:-1:-1;5438:14:20;:23;5462:13;5392:35;5471:4;5462:13;:::i;:::-;5438:50;;-1:-1:-1;;;;;;5438:50:20;;;;;;;;;;11351:25:28;;;;5477:10:20;11392:18:28;;;11385:60;11324:18;;5438:50:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5516:6;5498:14;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;5599:62:20;;-1:-1:-1;;;5599:62:20;;5622:18;5599:62;;;21415:25:28;5641:10:20;21456:18:28;;;21449:34;21499:18;;;21492:34;;;5576:20:20;;5599:9;;:22;;21388:18:28;;5599:62:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5576:85;;5685:12;5671:10;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;5713:24:20;;5728:8;;5713:24;;;;;5137:607;;5087:657;:::o;2097:149:25:-;2155:13;2187:52;-1:-1:-1;;;;;2199:22:25;;306:2;1508:437;1583:13;1608:19;1640:10;1644:6;1640:1;:10;:::i;:::-;:14;;1653:1;1640:14;:::i;:::-;1630:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1630:25:25;;1608:47;;-1:-1:-1;;;1665:6:25;1672:1;1665:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1665:15:25;;;;;;;;;-1:-1:-1;;;1690:6:25;1697:1;1690:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1690:15:25;;;;;;;;-1:-1:-1;1720:9:25;1732:10;1736:6;1732:1;:10;:::i;:::-;:14;;1745:1;1732:14;:::i;:::-;1720:26;;1715:128;1752:1;1748;:5;1715:128;;;-1:-1:-1;;;1795:5:25;1803:3;1795:11;1786:21;;;;;;;:::i;:::-;;;;1774:6;1781:1;1774:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;1774:33:25;;;;;;;;-1:-1:-1;1831:1:25;1821:11;;;;;1755:3;;;:::i;:::-;;;1715:128;;;-1:-1:-1;1860:10:25;;1852:55;;;;-1:-1:-1;;;1852:55:25;;24620:2:28;1852:55:25;;;24602:21:28;;;24639:18;;;24632:30;24698:34;24678:18;;;24671:62;24750:18;;1852:55:25;24418:356:28;1852:55:25;1931:6;1508:437;-1:-1:-1;;;1508:437:25:o;3299:103:0:-;3365:30;3376:4;719:10:7;3365::0;:30::i;1760:106:22:-;1678:7;;-1:-1:-1;;;1678:7:22;;;;1829:9;1821:38;;;;-1:-1:-1;;;1821:38:22;;24981:2:28;1821:38:22;;;24963:21:28;25020:2;25000:18;;;24993:30;-1:-1:-1;;;25039:18:28;;;25032:46;25095:18;;1821:38:22;24779:340:28;1821:38:22;1760:106::o;6322:133:20:-;6364:4;6406:17;:15;:17::i;:::-;6387:15;:36;;:61;;;;-1:-1:-1;;6427:10:20;:17;:21;;;6322:133::o;724:331:23:-;800:11;;1007:16;;800:248;;-1:-1:-1;;;800:248:23;;844:66;800:248;;;25486:25:28;934:2:23;25527:18:28;;;25520:59;969:1:23;25595:18:28;;;25588:47;-1:-1:-1;;;1007:16:23;;;;;25680:18:28;;;25673:43;800:11:23;25732:19:28;;;25725:44;771:7:23;;-1:-1:-1;;;;;800:11:23;;:30;;25458:19:28;;800:248:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7673:302:20:-;7815:1;7782:30;;;:19;:30;;;;;;:34;7778:191;;7832:67;7852:11;7864:1;7852:14;;;;;;;;:::i;:::-;;;;;;;7868:19;:30;7888:9;7868:30;;;;;;;;;;;;7832:19;:67::i;7778:191::-;7930:28;7943:11;7955:1;7943:14;;;;;;;;:::i;:::-;;;;;;;7930:12;:28::i;7426:233:0:-;7509:22;7517:4;7523:7;7509;:22::i;:::-;7504:149;;7547:6;:12;;;;;;;;;;;-1:-1:-1;;;;;7547:29:0;;;;;;;;;:36;;-1:-1:-1;;7547:36:0;7579:4;7547:36;;;7629:12;719:10:7;;640:96;7629:12:0;-1:-1:-1;;;;;7602:40:0;7620:7;-1:-1:-1;;;;;7602:40:0;7614:4;7602:40;;;;;;;;;;7426:233;;:::o;7830:234::-;7913:22;7921:4;7927:7;7913;:22::i;:::-;7909:149;;;7983:5;7951:12;;;;;;;;;;;-1:-1:-1;;;;;7951:29:0;;;;;;;;;;:37;;-1:-1:-1;;7951:37:0;;;8007:40;719:10:7;;7951:12:0;;8007:40;;7983:5;8007:40;7830:234;;:::o;2426:117:22:-;1479:16;:14;:16::i;:::-;2484:7:::1;:15:::0;;-1:-1:-1;;;;2484:15:22::1;::::0;;2514:22:::1;719:10:7::0;2523:12:22::1;2514:22;::::0;-1:-1:-1;;;;;7737:32:28;;;7719:51;;7707:2;7692:18;2514:22:22::1;7573:203:28::0;2179:115:22;1232:19;:17;:19::i;:::-;2238:7:::1;:14:::0;;-1:-1:-1;;;;2238:14:22::1;-1:-1:-1::0;;;2238:14:22::1;::::0;;2267:20:::1;2274:12;719:10:7::0;;640:96;1719:111:6;1791:7;;-1:-1:-1;;;;;1791:7:6;1777:10;:21;1769:56;;;;-1:-1:-1;;;1769:56:6;;25982:2:28;1769:56:6;;;25964:21:28;26021:2;26001:18;;;25994:30;-1:-1:-1;;;26040:18:28;;;26033:52;26102:18;;1769:56:6;25780:346:28;1486:188:6;1554:10;-1:-1:-1;;;;;1548:16:6;;;1540:52;;;;-1:-1:-1;;;1540:52:6;;26333:2:28;1540:52:6;;;26315:21:28;26372:2;26352:18;;;26345:30;26411:25;26391:18;;;26384:53;26454:18;;1540:52:6;26131:347:28;1540:52:6;1599:14;:19;;-1:-1:-1;;;;;;1599:19:6;-1:-1:-1;;;;;1599:19:6;;;;;;;;;1657:7;;1630:39;;1599:19;;1657:7;;1630:39;;-1:-1:-1;;1630:39:6;1486:188;:::o;3683:479:0:-;3771:22;3779:4;3785:7;3771;:22::i;:::-;3766:390;;3954:28;3974:7;3954:19;:28::i;:::-;4053:38;4081:4;4088:2;4053:19;:38::i;:::-;3861:252;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;3861:252:0;;;;;;;;;;-1:-1:-1;;;3809:336:0;;;;;;;:::i;7195:472:20:-;7371:10;;7307:75;;-1:-1:-1;;;7307:75:20;;7285:19;;7307:9;;:22;;:75;;7330:7;;7339:10;;7351:18;;7371:10;7307:75;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7285:97;;7392:15;7410:10;7421:11;7410:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;7487:33;;;:16;:33;;;;;;7530:14;;;:24;;;7586:13;;;;7564:18;;;:9;:18;;;;;;:35;;7410:23;;-1:-1:-1;7487:33:20;;7564:18;;:35;;7586:13;;7564:35;:::i;:::-;;;;-1:-1:-1;;7615:45:20;;7644:15;;7635:7;;7615:45;;;;;7275:392;;;7195:472;;:::o;6815:374::-;6960:10;;6896:75;;-1:-1:-1;;;6896:75:20;;6874:19;;6896:9;;:22;;:75;;6919:7;;6928:10;;6940:18;;6960:10;6896:75;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6874:97;;6981:15;6999:10;7010:11;6999:23;;;;;;;;:::i;:::-;;;;;;;;;6981:41;;7032:17;7052;:15;:17::i;:::-;7032:37;;7095:9;7080:11;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;7114:18:20;;;;:9;:18;;;;;:31;;7136:9;;7114:18;:31;;7136:9;;7114:31;:::i;:::-;;;;-1:-1:-1;;7161:21:20;;7174:7;;7161:21;;;;;6863:326;;;6815:374;:::o;1938:106:22:-;1678:7;;-1:-1:-1;;;1678:7:22;;;;1996:41;;;;-1:-1:-1;;;1996:41:22;;28667:2:28;1996:41:22;;;28649:21:28;28706:2;28686:18;;;28679:30;-1:-1:-1;;;28725:18:28;;;28718:50;28785:18;;1996:41:22;28465:344:28;14:131;-1:-1:-1;;;;;89:31:28;;79:42;;69:70;;135:1;132;125:12;150:118;236:5;229:13;222:21;215:5;212:32;202:60;;258:1;255;248:12;273:382;338:6;346;399:2;387:9;378:7;374:23;370:32;367:52;;;415:1;412;405:12;367:52;454:9;441:23;473:31;498:5;473:31;:::i;:::-;523:5;-1:-1:-1;580:2:28;565:18;;552:32;593:30;552:32;593:30;:::i;:::-;642:7;632:17;;;273:382;;;;;:::o;660:286::-;718:6;771:2;759:9;750:7;746:23;742:32;739:52;;;787:1;784;777:12;739:52;813:23;;-1:-1:-1;;;;;;865:32:28;;855:43;;845:71;;912:1;909;902:12;1143:180;1202:6;1255:2;1243:9;1234:7;1230:23;1226:32;1223:52;;;1271:1;1268;1261:12;1223:52;-1:-1:-1;1294:23:28;;1143:180;-1:-1:-1;1143:180:28:o;1816:127::-;1877:10;1872:3;1868:20;1865:1;1858:31;1908:4;1905:1;1898:15;1932:4;1929:1;1922:15;1948:275;2019:2;2013:9;2084:2;2065:13;;-1:-1:-1;;2061:27:28;2049:40;;2119:18;2104:34;;2140:22;;;2101:62;2098:88;;;2166:18;;:::i;:::-;2202:2;2195:22;1948:275;;-1:-1:-1;1948:275:28:o;2228:1014::-;2321:6;2329;2382:2;2370:9;2361:7;2357:23;2353:32;2350:52;;;2398:1;2395;2388:12;2350:52;2434:9;2421:23;2411:33;;2463:2;2516;2505:9;2501:18;2488:32;2539:18;2580:2;2572:6;2569:14;2566:34;;;2596:1;2593;2586:12;2566:34;2634:6;2623:9;2619:22;2609:32;;2679:7;2672:4;2668:2;2664:13;2660:27;2650:55;;2701:1;2698;2691:12;2650:55;2737:2;2724:16;2759:2;2755;2752:10;2749:36;;;2765:18;;:::i;:::-;2811:2;2808:1;2804:10;2794:20;;2834:28;2858:2;2854;2850:11;2834:28;:::i;:::-;2896:15;;;2966:11;;;2962:20;;;2927:12;;;;2994:19;;;2991:39;;;3026:1;3023;3016:12;2991:39;3050:11;;;;3070:142;3086:6;3081:3;3078:15;3070:142;;;3152:17;;3140:30;;3103:12;;;;3190;;;;3070:142;;;3231:5;3221:15;;;;;;;;2228:1014;;;;;:::o;3247:247::-;3306:6;3359:2;3347:9;3338:7;3334:23;3330:32;3327:52;;;3375:1;3372;3365:12;3327:52;3414:9;3401:23;3433:31;3458:5;3433:31;:::i;3866:241::-;3922:6;3975:2;3963:9;3954:7;3950:23;3946:32;3943:52;;;3991:1;3988;3981:12;3943:52;4030:9;4017:23;4049:28;4071:5;4049:28;:::i;4112:315::-;4180:6;4188;4241:2;4229:9;4220:7;4216:23;4212:32;4209:52;;;4257:1;4254;4247:12;4209:52;4293:9;4280:23;4270:33;;4353:2;4342:9;4338:18;4325:32;4366:31;4391:5;4366:31;:::i;4934:632::-;5105:2;5157:21;;;5227:13;;5130:18;;;5249:22;;;5076:4;;5105:2;5328:15;;;;5302:2;5287:18;;;5076:4;5371:169;5385:6;5382:1;5379:13;5371:169;;;5446:13;;5434:26;;5515:15;;;;5480:12;;;;5407:1;5400:9;5371:169;;;-1:-1:-1;5557:3:28;;4934:632;-1:-1:-1;;;;;;4934:632:28:o;5571:248::-;5639:6;5647;5700:2;5688:9;5679:7;5675:23;5671:32;5668:52;;;5716:1;5713;5706:12;5668:52;-1:-1:-1;;5739:23:28;;;5809:2;5794:18;;;5781:32;;-1:-1:-1;5571:248:28:o;5824:591::-;5894:6;5902;5955:2;5943:9;5934:7;5930:23;5926:32;5923:52;;;5971:1;5968;5961:12;5923:52;6011:9;5998:23;6040:18;6081:2;6073:6;6070:14;6067:34;;;6097:1;6094;6087:12;6067:34;6135:6;6124:9;6120:22;6110:32;;6180:7;6173:4;6169:2;6165:13;6161:27;6151:55;;6202:1;6199;6192:12;6151:55;6242:2;6229:16;6268:2;6260:6;6257:14;6254:34;;;6284:1;6281;6274:12;6254:34;6329:7;6324:2;6315:6;6311:2;6307:15;6303:24;6300:37;6297:57;;;6350:1;6347;6340:12;6297:57;6381:2;6373:11;;;;;6403:6;;-1:-1:-1;5824:591:28;;-1:-1:-1;;;;5824:591:28:o;6420:250::-;6505:1;6515:113;6529:6;6526:1;6523:13;6515:113;;;6605:11;;;6599:18;6586:11;;;6579:39;6551:2;6544:10;6515:113;;;-1:-1:-1;;6662:1:28;6644:16;;6637:27;6420:250::o;6675:270::-;6716:3;6754:5;6748:12;6781:6;6776:3;6769:19;6797:76;6866:6;6859:4;6854:3;6850:14;6843:4;6836:5;6832:16;6797:76;:::i;:::-;6927:2;6906:15;-1:-1:-1;;6902:29:28;6893:39;;;;6934:4;6889:50;;6675:270;-1:-1:-1;;6675:270:28:o;6950:298::-;7133:6;7126:14;7119:22;7108:9;7101:41;7178:2;7173;7162:9;7158:18;7151:30;7082:4;7198:44;7238:2;7227:9;7223:18;7215:6;7198:44;:::i;:::-;7190:52;6950:298;-1:-1:-1;;;;6950:298:28:o;7253:315::-;7321:6;7329;7382:2;7370:9;7361:7;7357:23;7353:32;7350:52;;;7398:1;7395;7388:12;7350:52;7437:9;7424:23;7456:31;7481:5;7456:31;:::i;:::-;7506:5;7558:2;7543:18;;;;7530:32;;-1:-1:-1;;;7253:315:28:o;7781:900::-;7868:6;7876;7884;7937:2;7925:9;7916:7;7912:23;7908:32;7905:52;;;7953:1;7950;7943:12;7905:52;7989:9;7976:23;7966:33;;8018:2;8067;8056:9;8052:18;8039:32;8029:42;;8122:2;8111:9;8107:18;8094:32;8145:18;8186:2;8178:6;8175:14;8172:34;;;8202:1;8199;8192:12;8172:34;8240:6;8229:9;8225:22;8215:32;;8285:7;8278:4;8274:2;8270:13;8266:27;8256:55;;8307:1;8304;8297:12;8256:55;8343:2;8330:16;8365:2;8361;8358:10;8355:36;;;8371:18;;:::i;:::-;8413:53;8456:2;8437:13;;-1:-1:-1;;8433:27:28;8429:36;;8413:53;:::i;:::-;8400:66;;8489:2;8482:5;8475:17;8529:7;8524:2;8519;8515;8511:11;8507:20;8504:33;8501:53;;;8550:1;8547;8540:12;8501:53;8605:2;8600;8596;8592:11;8587:2;8580:5;8576:14;8563:45;8649:1;8644:2;8639;8632:5;8628:14;8624:23;8617:34;;8670:5;8660:15;;;;;7781:900;;;;;:::o;8686:391::-;8771:6;8779;8787;8840:2;8828:9;8819:7;8815:23;8811:32;8808:52;;;8856:1;8853;8846:12;8808:52;8892:9;8879:23;8869:33;;8949:2;8938:9;8934:18;8921:32;8911:42;;9003:2;8992:9;8988:18;8975:32;9016:31;9041:5;9016:31;:::i;:::-;9066:5;9056:15;;;8686:391;;;;;:::o;9082:276::-;9140:6;9193:2;9181:9;9172:7;9168:23;9164:32;9161:52;;;9209:1;9206;9199:12;9161:52;9248:9;9235:23;9298:10;9291:5;9287:22;9280:5;9277:33;9267:61;;9324:1;9321;9314:12;10026:127;10087:10;10082:3;10078:20;10075:1;10068:31;10118:4;10115:1;10108:15;10142:4;10139:1;10132:15;10158:128;10225:9;;;10246:11;;;10243:37;;;10260:18;;:::i;10291:127::-;10352:10;10347:3;10343:20;10340:1;10333:31;10383:4;10380:1;10373:15;10407:4;10404:1;10397:15;10423:125;10488:9;;;10509:10;;;10506:36;;;10522:18;;:::i;10553:135::-;10592:3;10613:17;;;10610:43;;10633:18;;:::i;:::-;-1:-1:-1;10680:1:28;10669:13;;10553:135::o;10693:127::-;10754:10;10749:3;10745:20;10742:1;10735:31;10785:4;10782:1;10775:15;10809:4;10806:1;10799:15;12134:168;12207:9;;;12238;;12255:15;;;12249:22;;12235:37;12225:71;;12276:18;;:::i;14056:245::-;14123:6;14176:2;14164:9;14155:7;14151:23;14147:32;14144:52;;;14192:1;14189;14182:12;14144:52;14224:9;14218:16;14243:28;14265:5;14243:28;:::i;16782:184::-;16852:6;16905:2;16893:9;16884:7;16880:23;16876:32;16873:52;;;16921:1;16918;16911:12;16873:52;-1:-1:-1;16944:16:28;;16782:184;-1:-1:-1;16782:184:28:o;17598:496::-;17893:6;17882:9;17875:25;17936:6;17931:2;17920:9;17916:18;17909:34;17979:6;17974:2;17963:9;17959:18;17952:34;18022:3;18017:2;18006:9;18002:18;17995:31;17856:4;18043:45;18083:3;18072:9;18068:19;18060:6;18043:45;:::i;:::-;18035:53;17598:496;-1:-1:-1;;;;;;17598:496:28:o;18099:251::-;18169:6;18222:2;18210:9;18201:7;18197:23;18193:32;18190:52;;;18238:1;18235;18228:12;18190:52;18270:9;18264:16;18289:31;18314:5;18289:31;:::i;18355:337::-;18557:2;18539:21;;;18596:2;18576:18;;;18569:30;-1:-1:-1;;;18630:2:28;18615:18;;18608:43;18683:2;18668:18;;18355:337::o;20343:306::-;20431:6;20439;20447;20500:2;20488:9;20479:7;20475:23;20471:32;20468:52;;;20516:1;20513;20506:12;20468:52;20545:9;20539:16;20529:26;;20595:2;20584:9;20580:18;20574:25;20564:35;;20639:2;20628:9;20624:18;20618:25;20608:35;;20343:306;;;;;:::o;24277:136::-;24316:3;24344:5;24334:39;;24353:18;;:::i;:::-;-1:-1:-1;;;24389:18:28;;24277:136::o;26483:812::-;26894:25;26889:3;26882:38;26864:3;26949:6;26943:13;26965:75;27033:6;27028:2;27023:3;27019:12;27012:4;27004:6;27000:17;26965:75;:::i;:::-;-1:-1:-1;;;27099:2:28;27059:16;;;27091:11;;;27084:40;27149:13;;27171:76;27149:13;27233:2;27225:11;;27218:4;27206:17;;27171:76;:::i;:::-;27267:17;27286:2;27263:26;;26483:812;-1:-1:-1;;;;26483:812:28:o;27300:219::-;27449:2;27438:9;27431:21;27412:4;27469:44;27509:2;27498:9;27494:18;27486:6;27469:44;:::i;27524:936::-;27812:4;27860:3;27849:9;27845:19;27891:6;27880:9;27873:25;27917:2;27955:3;27950:2;27939:9;27935:18;27928:31;27979:6;28014;28008:13;28045:6;28037;28030:22;28083:3;28072:9;28068:19;28061:26;;28106:6;28103:1;28096:17;28149:2;28146:1;28136:16;28122:30;;28170:1;28180:168;28194:6;28191:1;28188:13;28180:168;;;28255:13;;28243:26;;28336:1;28324:14;;;;28289:12;;;;28209:9;28180:168;;;-1:-1:-1;;28399:2:28;28384:18;;28377:34;;;;-1:-1:-1;;;28442:2:28;28427:18;28420:34;28365:3;27524:936;-1:-1:-1;;27524:936:28:o
Swarm Source
ipfs://3c1e5e364d752dd782327c9dc56522bb63471f9afdf7eeb539b27bbca2114964
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
AVAX | 100.00% | $14.98 | 0.4673 | $7 |
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.