More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Loading...
Loading
Contract Name:
MultiRewardDistributor
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;import {ReentrancyGuard} from "@openzeppelin-contracts/contracts/security/ReentrancyGuard.sol";import {Initializable} from "@openzeppelin-contracts/contracts/proxy/utils/Initializable.sol";import {SafeERC20} from "@openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol";import {Pausable} from "@openzeppelin-contracts/contracts/security/Pausable.sol";import {IERC20} from "@openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";import {MToken} from "../MToken.sol";import {Comptroller} from "../Comptroller.sol";import {MTokenInterface} from "../MTokenInterfaces.sol";import {ExponentialNoError} from "../ExponentialNoError.sol";import {MultiRewardDistributorCommon} from "./MultiRewardDistributorCommon.sol";/**@title A multi-asset distributor that tracks mTokens supply/borrows@author Octavius - octavius@moonwell.fiThis contract integrates with the Moonwell Comptroller and manages all reward disbursal and indexcalculations both for the global market indices as well as individual user indices on those markets.It is largely the same logic that compound uses, just generalized (meaning that transfers will notfail if things can't be sent out, but the excess is accrued on the books to be sent later).Each market has an array of configs, each with a unique emission token owned by a specific team/user.That owner can adjust supply and borrow emissions, end times, and
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)pragma solidity ^0.8.2;import "../../utils/Address.sol";/*** @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.** The initialization functions use a version number. Once a version number is used, it is consumed and cannot be* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in* case an upgrade adds a module that needs to be initialized.** For example:** [.hljs-theme-light.nopadding]* ```solidity* contract MyToken is ERC20Upgradeable {* function initialize() initializer public {* __ERC20_init("MyToken", "MTK");* }* }
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)pragma solidity ^0.8.0;import "../utils/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);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)pragma solidity ^0.8.0;/*** @dev Contract module that helps prevent reentrant calls to a function.** Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier* available, which can be applied to functions to make sure there are no nested* (reentrant) calls to them.** Note that because there is a single `nonReentrant` guard, functions marked as* `nonReentrant` may not call one another. This can be worked around by making* those functions `private`, and then adding `external` `nonReentrant` entry* points to them.** TIP: If you would like to learn more about reentrancy and alternative ways* to protect against it, check out our blog post* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].*/abstract contract ReentrancyGuard {// Booleans are more expensive than uint256 or any type that takes up a full// word because each write operation emits an extra SLOAD to first read the// slot's contents, replace the bits taken up by the boolean, and then write// back. This is the compiler's defense against contract upgrades and
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)pragma solidity ^0.8.0;/*** @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].** Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't* need to send a transaction, and thus is not required to hold Ether at all.*/interface IERC20Permit {/*** @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,* given ``owner``'s signed approval.** IMPORTANT: The same issues {IERC20-approve} has related to transaction* ordering also apply here.** Emits an {Approval} event.** Requirements:** - `spender` cannot be the zero address.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.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.*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)pragma solidity ^0.8.0;import "../IERC20.sol";import "../extensions/IERC20Permit.sol";import "../../../utils/Address.sol";/*** @title SafeERC20* @dev Wrappers around ERC20 operations that throw on failure (when the token* contract returns false). Tokens that return no value (and instead revert or* throw on failure) are also supported, non-reverting calls are assumed to be* successful.* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.*/library SafeERC20 {using Address for address;/*** @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,* non-reverting calls are assumed to be successful.*/function safeTransfer(IERC20 token, address to, uint256 value) internal {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)pragma solidity ^0.8.1;/*** @dev Collection of functions related to the address type*/library Address {/*** @dev Returns true if `account` is a contract.** [IMPORTANT]* ====* It is unsafe to assume that an address for which this function returns* false is an externally-owned account (EOA) and not a contract.** Among others, `isContract` will return false for the following* types of addresses:** - an externally-owned account* - a contract in construction* - an address where a contract will be created* - an address where a contract lived, but was destroyed** Furthermore, `isContract` will also return true if the target contract within
123456789101112131415161718192021222324// 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;}}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;/*** @title Careful Math* @author Moonwell* @notice Derived from OpenZeppelin's SafeMath library* https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol*/contract CarefulMath {/*** @dev Possible error codes that we can return*/enum MathError {NO_ERROR,DIVISION_BY_ZERO,INTEGER_OVERFLOW,INTEGER_UNDERFLOW}/*** @dev Multiplies two numbers, returns an error on overflow.*/function mulUInt(uint a, uint b) internal pure returns (MathError, uint) {if (a == 0) {return (MathError.NO_ERROR, 0);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;import "./MToken.sol";import "./ErrorReporter.sol";import "./oracles/PriceOracle.sol";import "./ComptrollerInterface.sol";import "./ComptrollerStorage.sol";import "./Unitroller.sol";/*** @title Moonwell's Comptroller Contract* @author Moonwell*/contract Comptroller isComptrollerV2Storage,ComptrollerInterface,ComptrollerErrorReporter,ExponentialNoError{/// @notice Emitted when an admin supports a marketevent MarketListed(MToken mToken);/// @notice Emitted when an account enters a marketevent MarketEntered(MToken mToken, address account);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;abstract contract ComptrollerInterface {/// @notice Indicator that this is a Comptroller contract (for inspection)bool public constant isComptroller = true;/*** Assets You Are In ***/function enterMarkets(address[] calldata mTokens) external virtual returns (uint[] memory);function exitMarket(address mToken) external virtual returns (uint);/*** Policy Hooks ***/function mintAllowed(address mToken,address minter,uint mintAmount) external virtual returns (uint);function redeemAllowed(address mToken,address redeemer,uint redeemTokens
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;import "./MToken.sol";import "./oracles/PriceOracle.sol";import "./rewards/MultiRewardDistributor.sol";contract UnitrollerAdminStorage {/*** @notice Administrator for this contract*/address public admin;/*** @notice Pending administrator for this contract*/address public pendingAdmin;/*** @notice Active brains of Unitroller*/address public comptrollerImplementation;/*** @notice Pending brains of Unitroller*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;/*** @title ERC 20 Token Standard Interface* https://eips.ethereum.org/EIPS/eip-20*/interface EIP20Interface {function name() external view returns (string memory);function symbol() external view returns (string memory);function decimals() external view returns (uint8);/*** @notice Get the total number of tokens in circulation* @return The supply of tokens*/function totalSupply() external view returns (uint256);/*** @notice Gets the balance of the specified address* @param owner The address from which the balance will be retrieved* @return balance The balance*/function balanceOf(address owner) external view returns (uint256 balance);/**
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;/*** @title EIP20NonStandardInterface* @dev Version of ERC20 with no return values for `transfer` and `transferFrom`* See https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca*/interface EIP20NonStandardInterface {/*** @notice Get the total number of tokens in circulation* @return The supply of tokens*/function totalSupply() external view returns (uint256);/*** @notice Gets the balance of the specified address* @param owner The address from which the balance will be retrieved* @return balance The balance*/function balanceOf(address owner) external view returns (uint256 balance);////// !!!!!!!!!!!!!!/// !!! NOTICE !!! `transfer` does not return a value, in violation of the ERC-20 specification/// !!!!!!!!!!!!!!
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;contract ComptrollerErrorReporter {enum Error {NO_ERROR,UNAUTHORIZED,COMPTROLLER_MISMATCH,INSUFFICIENT_SHORTFALL,INSUFFICIENT_LIQUIDITY,INVALID_CLOSE_FACTOR,INVALID_COLLATERAL_FACTOR,INVALID_LIQUIDATION_INCENTIVE,MARKET_NOT_ENTERED, // no longer possibleMARKET_NOT_LISTED,MARKET_ALREADY_LISTED,MATH_ERROR,NONZERO_BORROW_BALANCE,PRICE_ERROR,REJECTION,SNAPSHOT_ERROR,TOO_MANY_ASSETS,TOO_MUCH_REPAY}enum FailureInfo {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;import "./CarefulMath.sol";import "./ExponentialNoError.sol";/*** @title Exponential module for storing fixed-precision decimals* @author Moonwell* @dev Legacy contract for compatibility reasons with existing contracts that still use MathError* @notice Exp is a struct which stores decimals with a fixed precision of 18 decimal places.* Thus, if we wanted to store the 5.1, mantissa would store 5.1e18. That is:* `Exp({mantissa: 5100000000000000000})`.*/contract Exponential is CarefulMath, ExponentialNoError {/*** @dev Creates an exponential from numerator and denominator values.* Note: Returns an error if (`num` * 10e18) > MAX_INT,* or if `denom` is zero.*/function getExp(uint num,uint denom) internal pure returns (MathError, Exp memory) {(MathError err0, uint scaledNumerator) = mulUInt(num, expScale);if (err0 != MathError.NO_ERROR) {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;/*** @title Exponential module for storing fixed-precision decimals* @author Moonwell* @notice Exp is a struct which stores decimals with a fixed precision of 18 decimal places.* Thus, if we wanted to store the 5.1, mantissa would store 5.1e18. That is:* `Exp({mantissa: 5100000000000000000})`.*/contract ExponentialNoError {uint constant expScale = 1e18;uint constant doubleScale = 1e36;uint constant halfExpScale = expScale / 2;uint constant mantissaOne = expScale;struct Exp {uint mantissa;}struct Double {uint mantissa;}/*** @dev Truncates the given exp to a whole number value.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;/*** @title Moonwell's InterestRateModel Interface* @author Moonwell*/abstract contract InterestRateModel {/// @notice Indicator that this is an InterestRateModel contract (for inspection)bool public constant isInterestRateModel = true;/*** @notice Calculates the current borrow interest rate per timestamp* @param cash The total amount of cash the market has* @param borrows The total amount of borrows the market has outstanding* @param reserves The total amount of reserves the market has* @return The borrow rate per timestamp (as a percentage, and scaled by 1e18)*/function getBorrowRate(uint cash,uint borrows,uint reserves) external view virtual returns (uint);/*** @notice Calculates the current supply interest rate per timestamp
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;import "./ComptrollerInterface.sol";import "./MTokenInterfaces.sol";import "./ErrorReporter.sol";import "./Exponential.sol";import "./EIP20Interface.sol";import "./InterestRateModel.sol";/*** @title Moonwell's MToken Contract* @notice Abstract base for MTokens* @author Moonwell*/abstract contract MToken is MTokenInterface, Exponential, TokenErrorReporter {/*** @notice Initialize the money market* @param comptroller_ The address of the Comptroller* @param interestRateModel_ The address of the interest rate model* @param initialExchangeRateMantissa_ The initial exchange rate, scaled by 1e18* @param name_ EIP-20 name of this token* @param symbol_ EIP-20 symbol of this token* @param decimals_ EIP-20 decimal precision of this token*/function initialize(
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;import "./ComptrollerInterface.sol";import "./InterestRateModel.sol";import "./EIP20NonStandardInterface.sol";import "./ErrorReporter.sol";contract MTokenStorage {/// @dev Guard variable for re-entrancy checksbool internal _notEntered;/// @notice EIP-20 token name for this tokenstring public name;/// @notice EIP-20 token symbol for this tokenstring public symbol;/// @notice EIP-20 token decimals for this tokenuint8 public decimals;/// @notice Maximum borrow rate that can ever be applied (.0005% / block)uint internal constant borrowRateMaxMantissa = 0.0005e16;// @notice Maximum fraction of interest that can be set aside for reservesuint internal constant reserveFactorMaxMantissa = 1e18;
12345678910111213141516171819// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;import "../MToken.sol";abstract contract PriceOracle {/// @notice Indicator that this is a PriceOracle contract (for inspection)bool public constant isPriceOracle = true;/*** @notice Get the underlying price of a mToken asset* @param mToken The mToken to get the underlying price of* @return The underlying asset price mantissa (scaled by 1e18).* Zero means the price is unavailable.*/function getUnderlyingPrice(MToken mToken) external view virtual returns (uint);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;import "../MToken.sol";// The commonly structures and events for the MultiRewardDistributorinterface MultiRewardDistributorCommon {struct MarketConfig {// The owner/admin of the emission configaddress owner;// The emission tokenaddress emissionToken;// Scheduled to end at this timeuint endTime;// Supplier global stateuint224 supplyGlobalIndex;uint32 supplyGlobalTimestamp;// Borrower global stateuint224 borrowGlobalIndex;uint32 borrowGlobalTimestamp;uint supplyEmissionsPerSec;uint borrowEmissionsPerSec;}struct MarketEmissionConfig {MarketConfig config;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BSD-3-Clausepragma solidity 0.8.19;import "./ErrorReporter.sol";import "./ComptrollerStorage.sol";/*** @title ComptrollerCore* @dev Storage for the comptroller is at this address, while execution is delegated to the `comptrollerImplementation`.* MTokens should reference this contract as their comptroller.*/contract Unitroller is UnitrollerAdminStorage, ComptrollerErrorReporter {/*** @notice Emitted when pendingComptrollerImplementation is changed*/event NewPendingImplementation(address oldPendingImplementation,address newPendingImplementation);/*** @notice Emitted when pendingComptrollerImplementation is accepted, which means comptroller implementation is updated*/event NewImplementation(address oldImplementation,address newImplementation);
123456789101112131415161718192021{"optimizer": {"enabled": true,"runs": 200},"evmVersion": "paris","viaIR": false,"outputSelection": {"*": {"*": ["evm.bytecode","evm.deployedBytecode","devdoc","userdoc","metadata","abi"]}},"libraries": {}}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract MToken","name":"mToken","type":"address"},{"indexed":true,"internalType":"address","name":"borrower","type":"address"},{"indexed":true,"internalType":"address","name":"emissionToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalAccrued","type":"uint256"}],"name":"DisbursedBorrowerRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract MToken","name":"mToken","type":"address"},{"indexed":true,"internalType":"address","name":"supplier","type":"address"},{"indexed":true,"internalType":"address","name":"emissionToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalAccrued","type":"uint256"}],"name":"DisbursedSupplierRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FundsRescued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract MToken","name":"mToken","type":"address"},{"indexed":false,"internalType":"address","name":"emissionToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"newIndex","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"newTimestamp","type":"uint32"}],"name":"GlobalBorrowIndexUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract MToken","name":"mToken","type":"address"},{"indexed":false,"internalType":"address","name":"emissionToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"newSupplyIndex","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"newSupplyGlobalTimestamp","type":"uint32"}],"name":"GlobalSupplyIndexUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"InsufficientTokensToEmit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract MToken","name":"mToken","type":"address"},{"indexed":true,"internalType":"address","name":"emissionToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldRewardSpeed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewardSpeed","type":"uint256"}],"name":"NewBorrowRewardSpeed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract MToken","name":"mToken","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"emissionToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"supplySpeed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"borrowSpeed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"NewConfigCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldEmissionCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newEmissionCap","type":"uint256"}],"name":"NewEmissionCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract MToken","name":"mToken","type":"address"},{"indexed":true,"internalType":"address","name":"emissionToken","type":"address"},{"indexed":false,"internalType":"address","name":"currentOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"NewEmissionConfigOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPauseGuardian","type":"address"},{"indexed":false,"internalType":"address","name":"newPauseGuardian","type":"address"}],"name":"NewPauseGuardian","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract MToken","name":"mToken","type":"address"},{"indexed":true,"internalType":"address","name":"emissionToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"currentEndTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newEndTime","type":"uint256"}],"name":"NewRewardEndTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract MToken","name":"mToken","type":"address"},{"indexed":true,"internalType":"address","name":"emissionToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldRewardSpeed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewardSpeed","type":"uint256"}],"name":"NewSupplyRewardSpeed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"RewardsPaused","type":"event"},{"anonymous":false,"inputs":[],"name":"RewardsUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"contract MToken","name":"_mToken","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_emissionToken","type":"address"},{"internalType":"uint256","name":"_supplyEmissionPerSec","type":"uint256"},{"internalType":"uint256","name":"_borrowEmissionsPerSec","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"_addEmissionConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_pauseRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"_rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newEmissionCap","type":"uint256"}],"name":"_setEmissionCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPauseGuardian","type":"address"}],"name":"_setPauseGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_unpauseRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract MToken","name":"_mToken","type":"address"},{"internalType":"address","name":"_emissionToken","type":"address"},{"internalType":"uint256","name":"_newBorrowSpeed","type":"uint256"}],"name":"_updateBorrowSpeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract MToken","name":"_mToken","type":"address"},{"internalType":"address","name":"_emissionToken","type":"address"},{"internalType":"uint256","name":"_newEndTime","type":"uint256"}],"name":"_updateEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract MToken","name":"_mToken","type":"address"},{"internalType":"address","name":"_emissionToken","type":"address"},{"internalType":"address","name":"_newOwner","type":"address"}],"name":"_updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract MToken","name":"_mToken","type":"address"},{"internalType":"address","name":"_emissionToken","type":"address"},{"internalType":"uint256","name":"_newSupplySpeed","type":"uint256"}],"name":"_updateSupplySpeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"comptroller","outputs":[{"internalType":"contract Comptroller","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract MToken","name":"_mToken","type":"address"},{"internalType":"address","name":"_borrower","type":"address"},{"internalType":"bool","name":"_sendTokens","type":"bool"}],"name":"disburseBorrowerRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract MToken","name":"_mToken","type":"address"},{"internalType":"address","name":"_supplier","type":"address"},{"internalType":"bool","name":"_sendTokens","type":"bool"}],"name":"disburseSupplierRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emissionCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract MToken","name":"_mToken","type":"address"}],"name":"getAllMarketConfigs","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"emissionToken","type":"address"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint224","name":"supplyGlobalIndex","type":"uint224"},{"internalType":"uint32","name":"supplyGlobalTimestamp","type":"uint32"},{"internalType":"uint224","name":"borrowGlobalIndex","type":"uint224"},{"internalType":"uint32","name":"borrowGlobalTimestamp","type":"uint32"},{"internalType":"uint256","name":"supplyEmissionsPerSec","type":"uint256"},{"internalType":"uint256","name":"borrowEmissionsPerSec","type":"uint256"}],"internalType":"struct MultiRewardDistributorCommon.MarketConfig[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract MToken","name":"_mToken","type":"address"},{"internalType":"address","name":"_emissionToken","type":"address"}],"name":"getConfigForMarket","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"emissionToken","type":"address"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint224","name":"supplyGlobalIndex","type":"uint224"},{"internalType":"uint32","name":"supplyGlobalTimestamp","type":"uint32"},{"internalType":"uint224","name":"borrowGlobalIndex","type":"uint224"},{"internalType":"uint32","name":"borrowGlobalTimestamp","type":"uint32"},{"internalType":"uint256","name":"supplyEmissionsPerSec","type":"uint256"},{"internalType":"uint256","name":"borrowEmissionsPerSec","type":"uint256"}],"internalType":"struct MultiRewardDistributorCommon.MarketConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentEmissionCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract MToken","name":"_mToken","type":"address"},{"internalType":"address","name":"_emissionToken","type":"address"}],"name":"getCurrentOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mToken","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getGlobalBorrowIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mToken","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getGlobalSupplyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract MToken","name":"_mToken","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"getOutstandingRewardsForUser","outputs":[{"components":[{"internalType":"address","name":"emissionToken","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"supplySide","type":"uint256"},{"internalType":"uint256","name":"borrowSide","type":"uint256"}],"internalType":"struct MultiRewardDistributorCommon.RewardInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getOutstandingRewardsForUser","outputs":[{"components":[{"internalType":"address","name":"mToken","type":"address"},{"components":[{"internalType":"address","name":"emissionToken","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"supplySide","type":"uint256"},{"internalType":"uint256","name":"borrowSide","type":"uint256"}],"internalType":"struct MultiRewardDistributorCommon.RewardInfo[]","name":"rewards","type":"tuple[]"}],"internalType":"struct MultiRewardDistributorCommon.RewardWithMToken[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialIndexConstant","outputs":[{"internalType":"uint224","name":"","type":"uint224"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_comptroller","type":"address"},{"internalType":"address","name":"_pauseGuardian","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketConfigs","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"emissionToken","type":"address"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint224","name":"supplyGlobalIndex","type":"uint224"},{"internalType":"uint32","name":"supplyGlobalTimestamp","type":"uint32"},{"internalType":"uint224","name":"borrowGlobalIndex","type":"uint224"},{"internalType":"uint32","name":"borrowGlobalTimestamp","type":"uint32"},{"internalType":"uint256","name":"supplyEmissionsPerSec","type":"uint256"},{"internalType":"uint256","name":"borrowEmissionsPerSec","type":"uint256"}],"internalType":"struct MultiRewardDistributorCommon.MarketConfig","name":"config","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseGuardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract MToken","name":"_mToken","type":"address"}],"name":"updateMarketBorrowIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract MToken","name":"_mToken","type":"address"},{"internalType":"address","name":"_borrower","type":"address"},{"internalType":"bool","name":"_sendTokens","type":"bool"}],"name":"updateMarketBorrowIndexAndDisburseBorrowerRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract MToken","name":"_mToken","type":"address"}],"name":"updateMarketSupplyIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract MToken","name":"_mToken","type":"address"},{"internalType":"address","name":"_supplier","type":"address"},{"internalType":"bool","name":"_sendTokens","type":"bool"}],"name":"updateMarketSupplyIndexAndDisburseSupplierRewards","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506000805460ff19169055600180556144bb8061002e6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806373a1f3d01161010f578063c11a70b3116100a2578063e66b98c911610071578063e66b98c914610433578063e88d9c1b14610446578063ea0f3dff1461044e578063ed302dfd1461046157600080fd5b8063c11a70b3146103da578063c9a06b45146103ed578063dbc7779b1461040d578063e0ed91161461042057600080fd5b80638b62a51a116100de5780638b62a51a14610381578063ad1a9280146103a1578063adc75e52146103b4578063b2fa9e10146103c757600080fd5b806373a1f3d0146103285780637e218f901461033b5780637f7336ba1461035b5780638220d7cf1461036e57600080fd5b80633616b04b116101875780635c975abb116101565780635c975abb146102d95780635f5af1aa146102ef5780635fe3b56714610302578063610393a01461031557600080fd5b80633616b04b146102a3578063375fea29146102b6578063472db55d146102be578063485cc955146102c657600080fd5b806310d47dc7116101c357806310d47dc71461023f57806314f557731461025257806324a3d62214610265578063283923801461029057600080fd5b8063019047d6146101ea57806307e8ce85146101ff5780630cd8bbc514610228575b600080fd5b6101fd6101f8366004613b42565b61048e565b005b61021261020d366004613b5f565b610553565b60405161021f9190613b98565b60405180910390f35b61023160065481565b60405190815260200161021f565b6101fd61024d366004613c15565b6109af565b6101fd610260366004613c15565b610a6f565b600554610278906001600160a01b031681565b6040516001600160a01b03909116815260200161021f565b6101fd61029e366004613c60565b610b2a565b6101fd6102b1366004613c79565b610c0b565b6101fd610e04565b6101fd610ee7565b6101fd6102d4366004613b5f565b610fb5565b60005460ff16604051901515815260200161021f565b6101fd6102fd366004613b42565b61124e565b600454610278906001600160a01b031681565b6101fd610323366004613c79565b61137e565b610231610336366004613cba565b611537565b61034e610349366004613b42565b611589565b60405161021f9190613d81565b6101fd610369366004613c79565b6116f2565b6101fd61037c366004613b42565b6118ab565b61039461038f366004613b5f565b611964565b60405161021f9190613dc4565b6102786103af366004613b5f565b611a08565b6101fd6103c2366004613c15565b611a27565b6102316103d5366004613cba565b611ae0565b6103946103e8366004613cba565b611b32565b6104006103fb366004613b42565b611bee565b60405161021f9190613dd3565b6101fd61041b366004613cba565b611d61565b6101fd61042e366004613c15565b611fc7565b6101fd610441366004613ea7565b612080565b600654610231565b6101fd61045c366004613ee7565b6121ae565b6104766a0c097ce7bc90715b34b9f160241b81565b6040516001600160e01b03909116815260200161021f565b6004546001600160a01b0316331480610522575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa1580156104e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050d9190613f4c565b6001600160a01b0316336001600160a01b0316145b6105475760405162461bcd60e51b815260040161053e90613f69565b60405180910390fd5b610550816126bc565b50565b6001600160a01b038216600090815260036020526040812080546060929067ffffffffffffffff81111561058957610589613fc7565b6040519080825280602002602001820160405280156105ee57816020015b6105db604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b8152602001906001900390816105a75790505b509050600060405180604001604052806040518060600160405280896001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066b9190613fdd565b8152602001896001600160a01b03166347bd37186040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d29190613fdd565b815260200160405180602001604052808b6001600160a01b031663aa5af0fd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610720573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107449190613fdd565b90529052815260408051808201918290526370a0823160e01b9091526001600160a01b03888116604483015260209092019181908a166370a0823160648301602060405180830381865afa1580156107a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c49190613fdd565b81526040516395dd919360e01b81526001600160a01b038a811660048301526020909201918b16906395dd919390602401602060405180830381865afa158015610812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108369190613fdd565b90529052905060005b83548110156109a257600084828154811061085c5761085c613ff6565b6000918252602082206005600b9092020190810154600382015460028301548751519395506108a39363ffffffff600160e01b840416926001600160e01b0316919061290f565b600683015460048401546002850154875160208101516040909101519495506000946108f5949363ffffffff600160e01b820416936001600160e01b039091169290916108f09190612ac3565b61290f565b905060006109118484600001518860200151600001518d612ae8565b905060006109328584600001518960000151604001518a602001518f612ba4565b604080516080810190915260018701546001600160a01b031681529091506020810161095e8484614022565b81526020018381526020018281525088878151811061097f5761097f613ff6565b60200260200101819052505050505050808061099a90614035565b91505061083f565b5090925050505b92915050565b6004546001600160a01b0316331480610a43575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015610a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2e9190613f4c565b6001600160a01b0316336001600160a01b0316145b610a5f5760405162461bcd60e51b815260040161053e90613f69565b610a6a838383612c73565b505050565b6004546001600160a01b0316331480610b03575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee9190613f4c565b6001600160a01b0316336001600160a01b0316145b610b1f5760405162461bcd60e51b815260040161053e90613f69565b610a6a838383612e35565b60048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015610b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b959190613f4c565b6001600160a01b0316336001600160a01b031614610bc55760405162461bcd60e51b815260040161053e9061404e565b600680549082905560408051828152602081018490527f8d2ad4bb95e94ce8d50ed07769a97467ba4db3f80fc0badf6c81d0907a0b410a91015b60405180910390a15050565b82826000610c1983836130ed565b80549091506001600160a01b0316331480610caf575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015610c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9a9190613f4c565b6001600160a01b0316336001600160a01b0316145b610ccb5760405162461bcd60e51b815260040161053e9061409f565b6000610cd787876130ed565b6002810154909150808611610d3a5760405162461bcd60e51b8152602060048201526024808201527f5f6e6577456e6454696d65204d555354206265203e2063757272656e74456e6460448201526354696d6560e01b606482015260840161053e565b428611610d975760405162461bcd60e51b815260206004820152602560248201527f5f6e6577456e6454696d65204d555354206265203e20626c6f636b2e74696d6560448201526407374616d760dc1b606482015260840161053e565b610da0886126bc565b610da9886131cc565b6002820186905560408051828152602081018890526001600160a01b03808a1692908b16917f10f16113484fbc6e60553a394eb2a3ae47999b610e4212fad6903486dbca7f9291015b60405180910390a35050505050505050565b6005546001600160a01b0316331480610e98575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015610e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e839190613f4c565b6001600160a01b0316336001600160a01b0316145b610eb45760405162461bcd60e51b815260040161053e90614106565b610ebc613335565b6040517fb83b93884b98604cbc549e7e4a81a9e49bd62c603026ec82f04915037258c56490600090a1565b60048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015610f2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f529190613f4c565b6001600160a01b0316336001600160a01b031614610f825760405162461bcd60e51b815260040161053e9061404e565b610f8a61338f565b6040517f24abc2b8df8d63728da8fe06c1555853a3f293f812e1ebd4303a5d6df7173e6c90600090a1565b600254610100900460ff1615808015610fd55750600254600160ff909116105b80610fef5750303b158015610fef575060025460ff166001145b6110525760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161053e565b6002805460ff191660011790558015611075576002805461ff0019166101001790555b6001600160a01b0383166110d75760405162461bcd60e51b815260206004820152602360248201527f436f6d7074726f6c6c65722063616e277420626520746865203020616464726560448201526273732160e81b606482015260840161053e565b6001600160a01b0382166110fd5760405162461bcd60e51b815260040161053e9061416f565b600480546001600160a01b0319166001600160a01b038516908117825560408051623f1ee960e11b815290519192627e3dd29282820192602092908290030181865afa158015611151573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117591906141b5565b6111db5760405162461bcd60e51b815260206004820152603160248201527f43616e27742062696e6420746f20736f6d657468696e6720746861742773206e6044820152706f74206120636f6d7074726f6c6c65722160781b606482015260840161053e565b600580546001600160a01b0319166001600160a01b03841617905568056bc75e2d631000006006558015610a6a576002805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a1505050565b6005546001600160a01b03163314806112e2575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa1580156112a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cd9190613f4c565b6001600160a01b0316336001600160a01b0316145b6112fe5760405162461bcd60e51b815260040161053e90614106565b6001600160a01b0381166113245760405162461bcd60e51b815260040161053e9061416f565b600580546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e9101610bff565b8282600061138c83836130ed565b80549091506001600160a01b0316331480611422575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa1580156113e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140d9190613f4c565b6001600160a01b0316336001600160a01b0316145b61143e5760405162461bcd60e51b815260040161053e9061409f565b600061144a87876130ed565b60058101549091508086036114c05760405162461bcd60e51b815260206004820152603660248201527f43616e277420736574206e657720737570706c7920656d697373696f6e7320746044820152756f20626520657175616c20746f2063757272656e742160501b606482015260840161053e565b60065486106114e15760405162461bcd60e51b815260040161053e906141d2565b6114ea886131cc565b6005820186905560408051828152602081018890526001600160a01b03808a1692908b16917fc4d50731808aa5d941c471c0b29364fecd810aa0565344f6cdcab2c873422baf9101610df2565b6001600160a01b038216600090815260036020526040812080548291908490811061156457611564613ff6565b60009182526020909120600b90910201600301546001600160e01b0316949350505050565b6001600160a01b038116600090815260036020526040812080546060929067ffffffffffffffff8111156115bf576115bf613fc7565b6040519080825280602002602001820160405280156115f857816020015b6115e5613ae1565b8152602001906001900390816115dd5790505b50905060005b82548110156116ea57600083828154811061161b5761161b613ff6565b60009182526020918290206040805161012081018252600b90930290910180546001600160a01b0390811684526001820154169383019390935260028301549082015260038201546001600160e01b03808216606084015263ffffffff600160e01b9283900481166080850152600485015491821660a08501529190041660c0820152600582015460e082015260068201546101008201528451919250908490849081106116cb576116cb613ff6565b60200260200101819052505080806116e290614035565b9150506115fe565b509392505050565b8282600061170083836130ed565b80549091506001600160a01b0316331480611796575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa15801561175d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117819190613f4c565b6001600160a01b0316336001600160a01b0316145b6117b25760405162461bcd60e51b815260040161053e9061409f565b60006117be87876130ed565b60068101549091508086036118345760405162461bcd60e51b815260206004820152603660248201527f43616e277420736574206e657720626f72726f7720656d697373696f6e7320746044820152756f20626520657175616c20746f2063757272656e742160501b606482015260840161053e565b60065486106118555760405162461bcd60e51b815260040161053e9061422f565b61185e886126bc565b6006820186905560408051828152602081018890526001600160a01b03808a1692908b16917f8fc43850ed5c7aaa0ce83829a1a40202c3fcf8257788d69881611dff1a0b32e99101610df2565b6004546001600160a01b031633148061193f575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015611906573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192a9190613f4c565b6001600160a01b0316336001600160a01b0316145b61195b5760405162461bcd60e51b815260040161053e90613f69565b610550816131cc565b61196c613ae1565b600061197884846130ed565b604080516101208101825282546001600160a01b039081168252600184015416602082015260028301549181019190915260038201546001600160e01b03808216606084015263ffffffff600160e01b9283900481166080850152600485015491821660a08501529190041660c0820152600582015460e082015260069091015461010082015291505092915050565b600080611a1584846130ed565b546001600160a01b0316949350505050565b6004546001600160a01b0316331480611abb575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015611a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa69190613f4c565b6001600160a01b0316336001600160a01b0316145b611ad75760405162461bcd60e51b815260040161053e90613f69565b610b1f836126bc565b6001600160a01b0382166000908152600360205260408120805482919084908110611b0d57611b0d613ff6565b60009182526020909120600b90910201600401546001600160e01b0316949350505050565b60036020528160005260406000208181548110611b4e57600080fd5b60009182526020918290206040805161012081018252600b90930290910180546001600160a01b0390811684526001820154169383019390935260028301549082015260038201546001600160e01b03808216606084015263ffffffff600160e01b9283900481166080850152600485015491821660a08501529190041660c0820152600582015460e08201526006909101546101008201529150829050565b600480546040805163b0772d0b60e01b815290516060936000936001600160a01b03169263b0772d0b928183019286928290030181865afa158015611c37573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c5f919081019061429c565b90506000815167ffffffffffffffff811115611c7d57611c7d613fc7565b604051908082528060200260200182016040528015611cc357816020015b604080518082019091526000815260606020820152815260200190600190039081611c9b5790505b50905060005b82518110156116ea576000611cf7848381518110611ce957611ce9613ff6565b602002602001015187610553565b90506040518060400160405280858481518110611d1657611d16613ff6565b60200260200101516001600160a01b0316815260200182815250838381518110611d4257611d42613ff6565b6020026020010181905250508080611d5990614035565b915050611cc9565b60048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015611da8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcc9190613f4c565b6001600160a01b0316336001600160a01b031614611dfc5760405162461bcd60e51b815260040161053e9061404e565b8160018201611efd57611ef8600460009054906101000a90046001600160a01b03166001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7f9190613f4c565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611ec3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee79190613fdd565b6001600160a01b03841691906133c8565b611f88565b611f88600460009054906101000a90046001600160a01b03166001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f779190613f4c565b6001600160a01b03831690846133c8565b604080516001600160a01b0385168152602081018490527fc4474c2790e13695f6d2b6f1d8e164290b55370f87a542fd7711abe0a1bf40ac9101611241565b6004546001600160a01b031633148061205b575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015612022573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120469190613f4c565b6001600160a01b0316336001600160a01b0316145b6120775760405162461bcd60e51b815260040161053e90613f69565b610a5f836131cc565b8282600061208e83836130ed565b80549091506001600160a01b0316331480612124575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa1580156120eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210f9190613f4c565b6001600160a01b0316336001600160a01b0316145b6121405760405162461bcd60e51b815260040161053e9061409f565b600061214c87876130ed565b80546001600160a01b038781166001600160a01b03198316811784556040805193831680855260208501929092529394509289821692918b16917f6ca67f2e3675f2b549fe77271364ebde88b3c7eb3ef84af329c373ca64fa25789101610df2565b60048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa1580156121f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122199190613f4c565b6001600160a01b0316336001600160a01b0316146122495760405162461bcd60e51b815260040161053e9061404e565b60048054604051638e8f294b60e01b81526001600160a01b038981169382019390935260009290911690638e8f294b906024016040805180830381865afa158015612298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122bc9190614361565b509050806123235760405162461bcd60e51b815260206004820152602e60248201527f546865206d61726b65742072657175657374656420746f20626520616464656460448201526d20697320756e2d6c69737465642160901b606482015260840161053e565b60065484106123445760405162461bcd60e51b815260040161053e906141d2565b60065483106123655760405162461bcd60e51b815260040161053e9061422f565b612370426001614022565b82116123d45760405162461bcd60e51b815260206004820152602d60248201527f546865205f656e6454696d6520706172616d65746572206d757374206265206960448201526c6e20746865206675747572652160981b606482015260840161053e565b6001600160a01b0387166000908152600360205260408120905b815481101561249057600082828154811061240b5761240b613ff6565b60009182526020909120600b9091020160018101549091506001600160a01b0389811691160361247d5760405162461bcd60e51b815260206004820152601e60248201527f456d697373696f6e20746f6b656e20616c7265616479206c6973746564210000604482015260640161053e565b508061248881614035565b9150506123ee565b506000604051806101200160405280896001600160a01b03168152602001886001600160a01b031681526020018581526020016a0c097ce7bc90715b34b9f160241b6001600160e01b0316815260200161251f426040518060400160405280601f81526020017f626c6f636b2074696d657374616d70206578636565647320333220626974730081525061341a565b63ffffffff1681526020016a0c097ce7bc90715b34b9f160241b6001600160e01b03168152602001612586426040518060400160405280601f81526020017f626c6f636b2074696d657374616d70206578636565647320333220626974730081525061341a565b63ffffffff168152602001878152602001868152509050866001600160a01b0316886001600160a01b03168a6001600160a01b03167fa76959d76a349a0b8fd3120607e3aea6af58897ae6531bfe60a0267c4ea0c2728989896040516125ff939291909283526020830191909152604082015260600190565b60405180910390a481546001818101845560009384526020938490208351600b9093020180546001600160a01b039384166001600160a01b03199182161782559484015191810180549290931691909416179055604081015160028301556060810151608082015163ffffffff908116600160e01b9081026001600160e01b0393841617600386015560a084015160c085015190921602911617600483015560e08101516005830155610100015160069091015550505050505050565b6001600160a01b0381166000818152600360209081526040808320815180840180845263aa5af0fd60e01b905291519094919283929163aa5af0fd91602480860192908187030181865afa158015612718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273c9190613fdd565b81525090506000836001600160a01b03166347bd37186040518163ffffffff1660e01b8152600401602060405180830381865afa158015612781573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a59190613fdd565b905060005b83548110156129085760008482815481106127c7576127c7613ff6565b6000918252602082206006600b90920201908101546004820154600283015492945061280f9263ffffffff600160e01b830416916001600160e01b0316906108f0898b612ac3565b905080600001518260000160040160006101000a8154816001600160e01b0302191690836001600160e01b03160217905550806020015182600001600401601c6101000a81548163ffffffff021916908363ffffffff1602179055507f24b735e493aede533ed6134442bad7e2ea2e72d71739de4c97f020174f5e3bcd878360000160010160009054906101000a90046001600160a01b03168460000160040160009054906101000a90046001600160e01b031685600001600401601c9054906101000a900463ffffffff166040516128eb949392919061438f565b60405180910390a15050808061290090614035565b9150506127aa565b5050505050565b60408051808201909152600080825260208201526000612964426040518060400160405280601f81526020017f626c6f636b2074696d657374616d70206578636565647320333220626974730081525061341a565b9050600061297e8263ffffffff168863ffffffff1661344a565b9050848263ffffffff1611156129b757848763ffffffff1610156129b3576129ac858863ffffffff1661344a565b90506129b7565b5060005b8015806129c2575087155b156129f4576040518060400160405280876001600160e01b031681526020018363ffffffff1681525092505050612aba565b6000612a00828a613484565b90506000808611612a205760405180602001604052806000815250612a2a565b612a2a82876134c6565b90506000612a8c612a5260405180602001604052808c6001600160e01b03168152508461350a565b5160408051808201909152601a81527f6e657720696e64657820657863656564732032323420626974730000000000006020820152613536565b90506040518060400160405280826001600160e01b031681526020018663ffffffff16815250955050505050505b95945050505050565b6000612ae1612ada84670de0b6b3a7640000613484565b835161355d565b9392505050565b6001600160a01b038116600090815260078501602052604081205480158015612b2857506a0c097ce7bc90715b34b9f160241b6001600160e01b03861610155b15612b3e57506a0c097ce7bc90715b34b9f160241b5b60006040518060200160405280612b5e886001600160e01b03168561344a565b905290506000612b6e8683613590565b6001600160a01b038616600090815260088a016020526040902054909150612b9690826135b9565b93505050505b949350505050565b6001600160a01b038116600090815260098601602052604081205480158015612be457506a0c097ce7bc90715b34b9f160241b6001600160e01b03871610155b15612bfa57506a0c097ce7bc90715b34b9f160241b5b60006040518060200160405280612c1a896001600160e01b03168561344a565b81525090506000612c2f866020015188612ac3565b90506000612c3d8284613590565b6001600160a01b0387166000908152600a8c016020526040902054909150612c6590826135b9565b9a9950505050505050505050565b6001600160a01b0383811660008181526003602052604080822090516370a0823160e01b81529386166004850152929091906370a0823190602401602060405180830381865afa158015612ccb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cef9190613fdd565b905060005b8254811015612e2d576000838281548110612d1157612d11613ff6565b6000918252602082206003600b9092020190810154909250612d3f9083906001600160e01b0316868a612ae8565b60038301546001600160a01b03808a16600081815260078701602090815260408083206001600160e01b039096169095556008880190528390208490556001860154925193945091811692908b16907f51761e1f6548bc99f2a61f299986e1b08a489f06622f689a413e02d7654a476690612dbd9086815260200190565b60405180910390a48515612e18576001600160a01b03808816600090815260088401602052604081205460018501549192612dfb928b9291166135ef565b6001600160a01b0389166000908152600885016020526040902055505b50508080612e2590614035565b915050612cf4565b505050505050565b6001600160a01b0383166000818152600360209081526040808320815180840180845263aa5af0fd60e01b905291519094919283929163aa5af0fd91602480860192908187030181865afa158015612e91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb59190613fdd565b905260408051808201918290526370a0823160e01b9091526001600160a01b038681166044830152919250600091819088166370a0823160648301602060405180830381865afa158015612f0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f319190613fdd565b81526040516395dd919360e01b81526001600160a01b0388811660048301526020909201918916906395dd919390602401602060405180830381865afa158015612f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa39190613fdd565b9052905060005b83548110156130e4576000848281548110612fc757612fc7613ff6565b6000918252602082206004600b9092020190810154909250612ff69083906001600160e01b031687878c612ba4565b60048301546001600160a01b03808b16600081815260098701602090815260408083206001600160e01b03909616909555600a880190528390208490556001860154925193945091811692908c16907f48a32d6daeb4317b45f49c3a1c0b1bd7d53a175d1f46c425138e328900cdccb4906130749086815260200190565b60405180910390a486156130cf576001600160a01b038089166000908152600a84016020526040812054600185015491926130b2928c9291166135ef565b6001600160a01b038a166000908152600a85016020526040902055505b505080806130dc90614035565b915050612faa565b50505050505050565b6001600160a01b0382166000908152600360205260408120815b815481101561316b57600082828154811061312457613124613ff6565b60009182526020909120600b9091020160018101549091506001600160a01b038681169116036131585792506109a9915050565b508061316381614035565b915050613107565b5060405162461bcd60e51b815260206004820152602f60248201527f556e61626c6520746f2066696e6420656d697373696f6e20746f6b656e20696e60448201526e206d546f6b656e20636f6e6669677360881b606482015260840161053e565b6001600160a01b038116600081815260036020908152604080832081516318160ddd60e01b815291519094926318160ddd92600480820193918290030181865afa15801561321e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132429190613fdd565b905060005b825481101561332f57600083828154811061326457613264613ff6565b6000918252602082206005600b9092020190810154600382015460028301549294506132a89263ffffffff600160e01b830416916001600160e01b0316908861290f565b8051602082015163ffffffff8116600160e01b026001600160e01b03831617600386015560018501546040519394507f79af45fe3972eecc4b95252214ad1d36529435ab4d4ae291d62a2ee5a0cc050093613312938b936001600160a01b0390931692909161438f565b60405180910390a15050808061332790614035565b915050613247565b50505050565b61333d613717565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586133723390565b6040516001600160a01b03909116815260200160405180910390a1565b61339761375f565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613372565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a6a9084906137a8565b60008164010000000084106134425760405162461bcd60e51b815260040161053e91906143ea565b509192915050565b6000612ae18383604051806040016040528060158152602001747375627472616374696f6e20756e646572666c6f7760581b81525061387d565b6000612ae183836040518060400160405280601781526020017f6d756c7469706c69636174696f6e206f766572666c6f770000000000000000008152506138ac565b60408051602081019091526000815260405180602001604052806135016134fb866a0c097ce7bc90715b34b9f160241b613484565b8561355d565b90529392505050565b6040805160208101909152600081526040518060200160405280613501856000015185600001516135b9565b600081600160e01b84106134425760405162461bcd60e51b815260040161053e91906143ea565b6000612ae183836040518060400160405280600e81526020016d646976696465206279207a65726f60901b815250613908565b60006a0c097ce7bc90715b34b9f160241b6135af848460000151613484565b612ae1919061441d565b6000612ae18383604051806040016040528060118152602001706164646974696f6e206f766572666c6f7760781b815250613934565b60006135f9613965565b8260000361360857508161370e565b60005460ff161561361a57508161370e565b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015613663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136879190613fdd565b90506000851180156136995750808511155b156136bd576136b26001600160a01b03831687876133c8565b60009250505061370e565b604080516001600160a01b038089168252861660208201529081018690527f8b079e2b0be6cc9631b7883d8478590fe708e9d360391aab49aa147901fc7a379060600160405180910390a184925050505b612ae160018055565b60005460ff161561375d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161053e565b565b60005460ff1661375d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161053e565b60006137fd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139be9092919063ffffffff16565b905080516000148061381e57508080602001905181019061381e91906141b5565b610a6a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161053e565b600081848411156138a15760405162461bcd60e51b815260040161053e91906143ea565b50612b9c838561443f565b60008315806138b9575082155b156138c657506000612ae1565b60006138d28486614452565b9050836138df868361441d565b1483906138ff5760405162461bcd60e51b815260040161053e91906143ea565b50949350505050565b600081836139295760405162461bcd60e51b815260040161053e91906143ea565b50612b9c838561441d565b6000806139418486614022565b905082858210156138ff5760405162461bcd60e51b815260040161053e91906143ea565b6002600154036139b75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161053e565b6002600155565b6060612b9c848460008585600080866001600160a01b031685876040516139e59190614469565b60006040518083038185875af1925050503d8060008114613a22576040519150601f19603f3d011682016040523d82523d6000602084013e613a27565b606091505b5091509150613a3887838387613a43565b979650505050505050565b60608315613ab2578251600003613aab576001600160a01b0385163b613aab5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161053e565b5081612b9c565b612b9c8383815115613ac75781518083602001fd5b8060405162461bcd60e51b815260040161053e91906143ea565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6001600160a01b038116811461055057600080fd5b600060208284031215613b5457600080fd5b8135612ae181613b2d565b60008060408385031215613b7257600080fd5b8235613b7d81613b2d565b91506020830135613b8d81613b2d565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015613bfb57835180516001600160a01b0316845260208082015190850152604080820151908501526060908101519084015260808301938501939250600101613bb4565b50909695505050505050565b801515811461055057600080fd5b600080600060608486031215613c2a57600080fd5b8335613c3581613b2d565b92506020840135613c4581613b2d565b91506040840135613c5581613c07565b809150509250925092565b600060208284031215613c7257600080fd5b5035919050565b600080600060608486031215613c8e57600080fd5b8335613c9981613b2d565b92506020840135613ca981613b2d565b929592945050506040919091013590565b60008060408385031215613ccd57600080fd5b8235613cd881613b2d565b946020939093013593505050565b80516001600160a01b03908116835260208083015190911690830152604080820151908301526060808201516001600160e01b03169083015260808082015190613d379084018263ffffffff169052565b5060a0810151613d5260a08401826001600160e01b03169052565b5060c0810151613d6a60c084018263ffffffff169052565b5060e0818101519083015261010090810151910152565b6020808252825182820181905260009190848201906040850190845b81811015613bfb57613db0838551613ce6565b928401926101209290920191600101613d9d565b61012081016109a98284613ce6565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b84811015613e9857898403603f19018652825180516001600160a01b03168552880151888501889052805188860181905290890190839060608701905b80831015613e8357835180516001600160a01b031683526020808201519084015260408082015190840152606090810151908301526080820191508b84019350600183019250613e38565b50978a01979550505091870191600101613dfb565b50919998505050505050505050565b600080600060608486031215613ebc57600080fd5b8335613ec781613b2d565b92506020840135613ed781613b2d565b91506040840135613c5581613b2d565b60008060008060008060c08789031215613f0057600080fd5b8635613f0b81613b2d565b95506020870135613f1b81613b2d565b94506040870135613f2b81613b2d565b959894975094956060810135955060808101359460a0909101359350915050565b600060208284031215613f5e57600080fd5b8151612ae181613b2d565b602080825260409082018190527f4f6e6c792074686520636f6d7074726f6c6c6572206f7220636f6d7074726f6c908201527f6c65722061646d696e2063616e2063616c6c20746869732066756e6374696f6e606082015260800190565b634e487b7160e01b600052604160045260246000fd5b600060208284031215613fef57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156109a9576109a961400c565b6000600182016140475761404761400c565b5060010190565b60208082526031908201527f4f6e6c792074686520636f6d7074726f6c6c657227732061646d696e6973747260408201527061746f722063616e20646f20746869732160781b606082015260800190565b60208082526041908201527f4f6e6c792074686520636f6e666967206f776e6572206f7220636f6d7074726f60408201527f6c6c65722061646d696e2063616e2063616c6c20746869732066756e6374696f6060820152603760f91b608082015260a00190565b60208082526043908201527f4f6e6c792074686520706175736520677561726469616e206f7220636f6d707460408201527f726f6c6c65722061646d696e2063616e2063616c6c20746869732066756e637460608201526234b7b760e91b608082015260a00190565b60208082526026908201527f506175736520477561726469616e2063616e277420626520746865203020616460408201526564726573732160d01b606082015260800190565b6000602082840312156141c757600080fd5b8151612ae181613c07565b6020808252603e908201527f43616e6e6f7420736574206120737570706c792072657761726420737065656460408201527f20686967686572207468616e2074686520656d697373696f6e20636170210000606082015260800190565b6020808252603e908201527f43616e6e6f7420736574206120626f72726f772072657761726420737065656460408201527f20686967686572207468616e2074686520656d697373696f6e20636170210000606082015260800190565b805161429781613b2d565b919050565b600060208083850312156142af57600080fd5b825167ffffffffffffffff808211156142c757600080fd5b818501915085601f8301126142db57600080fd5b8151818111156142ed576142ed613fc7565b8060051b604051601f19603f8301168101818110858211171561431257614312613fc7565b60405291825284820192508381018501918883111561433057600080fd5b938501935b82851015614355576143468561428c565b84529385019392850192614335565b98975050505050505050565b6000806040838503121561437457600080fd5b825161437f81613c07565b6020939093015192949293505050565b6001600160a01b0394851681529290931660208301526001600160e01b0316604082015263ffffffff909116606082015260800190565b60005b838110156143e15781810151838201526020016143c9565b50506000910152565b60208152600082518060208401526144098160408501602087016143c6565b601f01601f19169190910160400192915050565b60008261443a57634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156109a9576109a961400c565b80820281158282048414176109a9576109a961400c565b6000825161447b8184602087016143c6565b919091019291505056fea26469706673582212205a79833b52f6aeb743eb9c43a4bbff93f524799e37c886a9f8b277ad03f9557b64736f6c63430008130033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806373a1f3d01161010f578063c11a70b3116100a2578063e66b98c911610071578063e66b98c914610433578063e88d9c1b14610446578063ea0f3dff1461044e578063ed302dfd1461046157600080fd5b8063c11a70b3146103da578063c9a06b45146103ed578063dbc7779b1461040d578063e0ed91161461042057600080fd5b80638b62a51a116100de5780638b62a51a14610381578063ad1a9280146103a1578063adc75e52146103b4578063b2fa9e10146103c757600080fd5b806373a1f3d0146103285780637e218f901461033b5780637f7336ba1461035b5780638220d7cf1461036e57600080fd5b80633616b04b116101875780635c975abb116101565780635c975abb146102d95780635f5af1aa146102ef5780635fe3b56714610302578063610393a01461031557600080fd5b80633616b04b146102a3578063375fea29146102b6578063472db55d146102be578063485cc955146102c657600080fd5b806310d47dc7116101c357806310d47dc71461023f57806314f557731461025257806324a3d62214610265578063283923801461029057600080fd5b8063019047d6146101ea57806307e8ce85146101ff5780630cd8bbc514610228575b600080fd5b6101fd6101f8366004613b42565b61048e565b005b61021261020d366004613b5f565b610553565b60405161021f9190613b98565b60405180910390f35b61023160065481565b60405190815260200161021f565b6101fd61024d366004613c15565b6109af565b6101fd610260366004613c15565b610a6f565b600554610278906001600160a01b031681565b6040516001600160a01b03909116815260200161021f565b6101fd61029e366004613c60565b610b2a565b6101fd6102b1366004613c79565b610c0b565b6101fd610e04565b6101fd610ee7565b6101fd6102d4366004613b5f565b610fb5565b60005460ff16604051901515815260200161021f565b6101fd6102fd366004613b42565b61124e565b600454610278906001600160a01b031681565b6101fd610323366004613c79565b61137e565b610231610336366004613cba565b611537565b61034e610349366004613b42565b611589565b60405161021f9190613d81565b6101fd610369366004613c79565b6116f2565b6101fd61037c366004613b42565b6118ab565b61039461038f366004613b5f565b611964565b60405161021f9190613dc4565b6102786103af366004613b5f565b611a08565b6101fd6103c2366004613c15565b611a27565b6102316103d5366004613cba565b611ae0565b6103946103e8366004613cba565b611b32565b6104006103fb366004613b42565b611bee565b60405161021f9190613dd3565b6101fd61041b366004613cba565b611d61565b6101fd61042e366004613c15565b611fc7565b6101fd610441366004613ea7565b612080565b600654610231565b6101fd61045c366004613ee7565b6121ae565b6104766a0c097ce7bc90715b34b9f160241b81565b6040516001600160e01b03909116815260200161021f565b6004546001600160a01b0316331480610522575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa1580156104e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050d9190613f4c565b6001600160a01b0316336001600160a01b0316145b6105475760405162461bcd60e51b815260040161053e90613f69565b60405180910390fd5b610550816126bc565b50565b6001600160a01b038216600090815260036020526040812080546060929067ffffffffffffffff81111561058957610589613fc7565b6040519080825280602002602001820160405280156105ee57816020015b6105db604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b8152602001906001900390816105a75790505b509050600060405180604001604052806040518060600160405280896001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066b9190613fdd565b8152602001896001600160a01b03166347bd37186040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d29190613fdd565b815260200160405180602001604052808b6001600160a01b031663aa5af0fd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610720573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107449190613fdd565b90529052815260408051808201918290526370a0823160e01b9091526001600160a01b03888116604483015260209092019181908a166370a0823160648301602060405180830381865afa1580156107a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c49190613fdd565b81526040516395dd919360e01b81526001600160a01b038a811660048301526020909201918b16906395dd919390602401602060405180830381865afa158015610812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108369190613fdd565b90529052905060005b83548110156109a257600084828154811061085c5761085c613ff6565b6000918252602082206005600b9092020190810154600382015460028301548751519395506108a39363ffffffff600160e01b840416926001600160e01b0316919061290f565b600683015460048401546002850154875160208101516040909101519495506000946108f5949363ffffffff600160e01b820416936001600160e01b039091169290916108f09190612ac3565b61290f565b905060006109118484600001518860200151600001518d612ae8565b905060006109328584600001518960000151604001518a602001518f612ba4565b604080516080810190915260018701546001600160a01b031681529091506020810161095e8484614022565b81526020018381526020018281525088878151811061097f5761097f613ff6565b60200260200101819052505050505050808061099a90614035565b91505061083f565b5090925050505b92915050565b6004546001600160a01b0316331480610a43575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015610a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2e9190613f4c565b6001600160a01b0316336001600160a01b0316145b610a5f5760405162461bcd60e51b815260040161053e90613f69565b610a6a838383612c73565b505050565b6004546001600160a01b0316331480610b03575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee9190613f4c565b6001600160a01b0316336001600160a01b0316145b610b1f5760405162461bcd60e51b815260040161053e90613f69565b610a6a838383612e35565b60048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015610b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b959190613f4c565b6001600160a01b0316336001600160a01b031614610bc55760405162461bcd60e51b815260040161053e9061404e565b600680549082905560408051828152602081018490527f8d2ad4bb95e94ce8d50ed07769a97467ba4db3f80fc0badf6c81d0907a0b410a91015b60405180910390a15050565b82826000610c1983836130ed565b80549091506001600160a01b0316331480610caf575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015610c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9a9190613f4c565b6001600160a01b0316336001600160a01b0316145b610ccb5760405162461bcd60e51b815260040161053e9061409f565b6000610cd787876130ed565b6002810154909150808611610d3a5760405162461bcd60e51b8152602060048201526024808201527f5f6e6577456e6454696d65204d555354206265203e2063757272656e74456e6460448201526354696d6560e01b606482015260840161053e565b428611610d975760405162461bcd60e51b815260206004820152602560248201527f5f6e6577456e6454696d65204d555354206265203e20626c6f636b2e74696d6560448201526407374616d760dc1b606482015260840161053e565b610da0886126bc565b610da9886131cc565b6002820186905560408051828152602081018890526001600160a01b03808a1692908b16917f10f16113484fbc6e60553a394eb2a3ae47999b610e4212fad6903486dbca7f9291015b60405180910390a35050505050505050565b6005546001600160a01b0316331480610e98575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015610e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e839190613f4c565b6001600160a01b0316336001600160a01b0316145b610eb45760405162461bcd60e51b815260040161053e90614106565b610ebc613335565b6040517fb83b93884b98604cbc549e7e4a81a9e49bd62c603026ec82f04915037258c56490600090a1565b60048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015610f2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f529190613f4c565b6001600160a01b0316336001600160a01b031614610f825760405162461bcd60e51b815260040161053e9061404e565b610f8a61338f565b6040517f24abc2b8df8d63728da8fe06c1555853a3f293f812e1ebd4303a5d6df7173e6c90600090a1565b600254610100900460ff1615808015610fd55750600254600160ff909116105b80610fef5750303b158015610fef575060025460ff166001145b6110525760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161053e565b6002805460ff191660011790558015611075576002805461ff0019166101001790555b6001600160a01b0383166110d75760405162461bcd60e51b815260206004820152602360248201527f436f6d7074726f6c6c65722063616e277420626520746865203020616464726560448201526273732160e81b606482015260840161053e565b6001600160a01b0382166110fd5760405162461bcd60e51b815260040161053e9061416f565b600480546001600160a01b0319166001600160a01b038516908117825560408051623f1ee960e11b815290519192627e3dd29282820192602092908290030181865afa158015611151573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117591906141b5565b6111db5760405162461bcd60e51b815260206004820152603160248201527f43616e27742062696e6420746f20736f6d657468696e6720746861742773206e6044820152706f74206120636f6d7074726f6c6c65722160781b606482015260840161053e565b600580546001600160a01b0319166001600160a01b03841617905568056bc75e2d631000006006558015610a6a576002805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a1505050565b6005546001600160a01b03163314806112e2575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa1580156112a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cd9190613f4c565b6001600160a01b0316336001600160a01b0316145b6112fe5760405162461bcd60e51b815260040161053e90614106565b6001600160a01b0381166113245760405162461bcd60e51b815260040161053e9061416f565b600580546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e9101610bff565b8282600061138c83836130ed565b80549091506001600160a01b0316331480611422575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa1580156113e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140d9190613f4c565b6001600160a01b0316336001600160a01b0316145b61143e5760405162461bcd60e51b815260040161053e9061409f565b600061144a87876130ed565b60058101549091508086036114c05760405162461bcd60e51b815260206004820152603660248201527f43616e277420736574206e657720737570706c7920656d697373696f6e7320746044820152756f20626520657175616c20746f2063757272656e742160501b606482015260840161053e565b60065486106114e15760405162461bcd60e51b815260040161053e906141d2565b6114ea886131cc565b6005820186905560408051828152602081018890526001600160a01b03808a1692908b16917fc4d50731808aa5d941c471c0b29364fecd810aa0565344f6cdcab2c873422baf9101610df2565b6001600160a01b038216600090815260036020526040812080548291908490811061156457611564613ff6565b60009182526020909120600b90910201600301546001600160e01b0316949350505050565b6001600160a01b038116600090815260036020526040812080546060929067ffffffffffffffff8111156115bf576115bf613fc7565b6040519080825280602002602001820160405280156115f857816020015b6115e5613ae1565b8152602001906001900390816115dd5790505b50905060005b82548110156116ea57600083828154811061161b5761161b613ff6565b60009182526020918290206040805161012081018252600b90930290910180546001600160a01b0390811684526001820154169383019390935260028301549082015260038201546001600160e01b03808216606084015263ffffffff600160e01b9283900481166080850152600485015491821660a08501529190041660c0820152600582015460e082015260068201546101008201528451919250908490849081106116cb576116cb613ff6565b60200260200101819052505080806116e290614035565b9150506115fe565b509392505050565b8282600061170083836130ed565b80549091506001600160a01b0316331480611796575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa15801561175d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117819190613f4c565b6001600160a01b0316336001600160a01b0316145b6117b25760405162461bcd60e51b815260040161053e9061409f565b60006117be87876130ed565b60068101549091508086036118345760405162461bcd60e51b815260206004820152603660248201527f43616e277420736574206e657720626f72726f7720656d697373696f6e7320746044820152756f20626520657175616c20746f2063757272656e742160501b606482015260840161053e565b60065486106118555760405162461bcd60e51b815260040161053e9061422f565b61185e886126bc565b6006820186905560408051828152602081018890526001600160a01b03808a1692908b16917f8fc43850ed5c7aaa0ce83829a1a40202c3fcf8257788d69881611dff1a0b32e99101610df2565b6004546001600160a01b031633148061193f575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015611906573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192a9190613f4c565b6001600160a01b0316336001600160a01b0316145b61195b5760405162461bcd60e51b815260040161053e90613f69565b610550816131cc565b61196c613ae1565b600061197884846130ed565b604080516101208101825282546001600160a01b039081168252600184015416602082015260028301549181019190915260038201546001600160e01b03808216606084015263ffffffff600160e01b9283900481166080850152600485015491821660a08501529190041660c0820152600582015460e082015260069091015461010082015291505092915050565b600080611a1584846130ed565b546001600160a01b0316949350505050565b6004546001600160a01b0316331480611abb575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015611a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa69190613f4c565b6001600160a01b0316336001600160a01b0316145b611ad75760405162461bcd60e51b815260040161053e90613f69565b610b1f836126bc565b6001600160a01b0382166000908152600360205260408120805482919084908110611b0d57611b0d613ff6565b60009182526020909120600b90910201600401546001600160e01b0316949350505050565b60036020528160005260406000208181548110611b4e57600080fd5b60009182526020918290206040805161012081018252600b90930290910180546001600160a01b0390811684526001820154169383019390935260028301549082015260038201546001600160e01b03808216606084015263ffffffff600160e01b9283900481166080850152600485015491821660a08501529190041660c0820152600582015460e08201526006909101546101008201529150829050565b600480546040805163b0772d0b60e01b815290516060936000936001600160a01b03169263b0772d0b928183019286928290030181865afa158015611c37573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c5f919081019061429c565b90506000815167ffffffffffffffff811115611c7d57611c7d613fc7565b604051908082528060200260200182016040528015611cc357816020015b604080518082019091526000815260606020820152815260200190600190039081611c9b5790505b50905060005b82518110156116ea576000611cf7848381518110611ce957611ce9613ff6565b602002602001015187610553565b90506040518060400160405280858481518110611d1657611d16613ff6565b60200260200101516001600160a01b0316815260200182815250838381518110611d4257611d42613ff6565b6020026020010181905250508080611d5990614035565b915050611cc9565b60048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015611da8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcc9190613f4c565b6001600160a01b0316336001600160a01b031614611dfc5760405162461bcd60e51b815260040161053e9061404e565b8160018201611efd57611ef8600460009054906101000a90046001600160a01b03166001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7f9190613f4c565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611ec3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee79190613fdd565b6001600160a01b03841691906133c8565b611f88565b611f88600460009054906101000a90046001600160a01b03166001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f779190613f4c565b6001600160a01b03831690846133c8565b604080516001600160a01b0385168152602081018490527fc4474c2790e13695f6d2b6f1d8e164290b55370f87a542fd7711abe0a1bf40ac9101611241565b6004546001600160a01b031633148061205b575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa158015612022573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120469190613f4c565b6001600160a01b0316336001600160a01b0316145b6120775760405162461bcd60e51b815260040161053e90613f69565b610a5f836131cc565b8282600061208e83836130ed565b80549091506001600160a01b0316331480612124575060048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa1580156120eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210f9190613f4c565b6001600160a01b0316336001600160a01b0316145b6121405760405162461bcd60e51b815260040161053e9061409f565b600061214c87876130ed565b80546001600160a01b038781166001600160a01b03198316811784556040805193831680855260208501929092529394509289821692918b16917f6ca67f2e3675f2b549fe77271364ebde88b3c7eb3ef84af329c373ca64fa25789101610df2565b60048054604080516303e1469160e61b815290516001600160a01b039092169263f851a4409282820192602092908290030181865afa1580156121f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122199190613f4c565b6001600160a01b0316336001600160a01b0316146122495760405162461bcd60e51b815260040161053e9061404e565b60048054604051638e8f294b60e01b81526001600160a01b038981169382019390935260009290911690638e8f294b906024016040805180830381865afa158015612298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122bc9190614361565b509050806123235760405162461bcd60e51b815260206004820152602e60248201527f546865206d61726b65742072657175657374656420746f20626520616464656460448201526d20697320756e2d6c69737465642160901b606482015260840161053e565b60065484106123445760405162461bcd60e51b815260040161053e906141d2565b60065483106123655760405162461bcd60e51b815260040161053e9061422f565b612370426001614022565b82116123d45760405162461bcd60e51b815260206004820152602d60248201527f546865205f656e6454696d6520706172616d65746572206d757374206265206960448201526c6e20746865206675747572652160981b606482015260840161053e565b6001600160a01b0387166000908152600360205260408120905b815481101561249057600082828154811061240b5761240b613ff6565b60009182526020909120600b9091020160018101549091506001600160a01b0389811691160361247d5760405162461bcd60e51b815260206004820152601e60248201527f456d697373696f6e20746f6b656e20616c7265616479206c6973746564210000604482015260640161053e565b508061248881614035565b9150506123ee565b506000604051806101200160405280896001600160a01b03168152602001886001600160a01b031681526020018581526020016a0c097ce7bc90715b34b9f160241b6001600160e01b0316815260200161251f426040518060400160405280601f81526020017f626c6f636b2074696d657374616d70206578636565647320333220626974730081525061341a565b63ffffffff1681526020016a0c097ce7bc90715b34b9f160241b6001600160e01b03168152602001612586426040518060400160405280601f81526020017f626c6f636b2074696d657374616d70206578636565647320333220626974730081525061341a565b63ffffffff168152602001878152602001868152509050866001600160a01b0316886001600160a01b03168a6001600160a01b03167fa76959d76a349a0b8fd3120607e3aea6af58897ae6531bfe60a0267c4ea0c2728989896040516125ff939291909283526020830191909152604082015260600190565b60405180910390a481546001818101845560009384526020938490208351600b9093020180546001600160a01b039384166001600160a01b03199182161782559484015191810180549290931691909416179055604081015160028301556060810151608082015163ffffffff908116600160e01b9081026001600160e01b0393841617600386015560a084015160c085015190921602911617600483015560e08101516005830155610100015160069091015550505050505050565b6001600160a01b0381166000818152600360209081526040808320815180840180845263aa5af0fd60e01b905291519094919283929163aa5af0fd91602480860192908187030181865afa158015612718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273c9190613fdd565b81525090506000836001600160a01b03166347bd37186040518163ffffffff1660e01b8152600401602060405180830381865afa158015612781573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a59190613fdd565b905060005b83548110156129085760008482815481106127c7576127c7613ff6565b6000918252602082206006600b90920201908101546004820154600283015492945061280f9263ffffffff600160e01b830416916001600160e01b0316906108f0898b612ac3565b905080600001518260000160040160006101000a8154816001600160e01b0302191690836001600160e01b03160217905550806020015182600001600401601c6101000a81548163ffffffff021916908363ffffffff1602179055507f24b735e493aede533ed6134442bad7e2ea2e72d71739de4c97f020174f5e3bcd878360000160010160009054906101000a90046001600160a01b03168460000160040160009054906101000a90046001600160e01b031685600001600401601c9054906101000a900463ffffffff166040516128eb949392919061438f565b60405180910390a15050808061290090614035565b9150506127aa565b5050505050565b60408051808201909152600080825260208201526000612964426040518060400160405280601f81526020017f626c6f636b2074696d657374616d70206578636565647320333220626974730081525061341a565b9050600061297e8263ffffffff168863ffffffff1661344a565b9050848263ffffffff1611156129b757848763ffffffff1610156129b3576129ac858863ffffffff1661344a565b90506129b7565b5060005b8015806129c2575087155b156129f4576040518060400160405280876001600160e01b031681526020018363ffffffff1681525092505050612aba565b6000612a00828a613484565b90506000808611612a205760405180602001604052806000815250612a2a565b612a2a82876134c6565b90506000612a8c612a5260405180602001604052808c6001600160e01b03168152508461350a565b5160408051808201909152601a81527f6e657720696e64657820657863656564732032323420626974730000000000006020820152613536565b90506040518060400160405280826001600160e01b031681526020018663ffffffff16815250955050505050505b95945050505050565b6000612ae1612ada84670de0b6b3a7640000613484565b835161355d565b9392505050565b6001600160a01b038116600090815260078501602052604081205480158015612b2857506a0c097ce7bc90715b34b9f160241b6001600160e01b03861610155b15612b3e57506a0c097ce7bc90715b34b9f160241b5b60006040518060200160405280612b5e886001600160e01b03168561344a565b905290506000612b6e8683613590565b6001600160a01b038616600090815260088a016020526040902054909150612b9690826135b9565b93505050505b949350505050565b6001600160a01b038116600090815260098601602052604081205480158015612be457506a0c097ce7bc90715b34b9f160241b6001600160e01b03871610155b15612bfa57506a0c097ce7bc90715b34b9f160241b5b60006040518060200160405280612c1a896001600160e01b03168561344a565b81525090506000612c2f866020015188612ac3565b90506000612c3d8284613590565b6001600160a01b0387166000908152600a8c016020526040902054909150612c6590826135b9565b9a9950505050505050505050565b6001600160a01b0383811660008181526003602052604080822090516370a0823160e01b81529386166004850152929091906370a0823190602401602060405180830381865afa158015612ccb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cef9190613fdd565b905060005b8254811015612e2d576000838281548110612d1157612d11613ff6565b6000918252602082206003600b9092020190810154909250612d3f9083906001600160e01b0316868a612ae8565b60038301546001600160a01b03808a16600081815260078701602090815260408083206001600160e01b039096169095556008880190528390208490556001860154925193945091811692908b16907f51761e1f6548bc99f2a61f299986e1b08a489f06622f689a413e02d7654a476690612dbd9086815260200190565b60405180910390a48515612e18576001600160a01b03808816600090815260088401602052604081205460018501549192612dfb928b9291166135ef565b6001600160a01b0389166000908152600885016020526040902055505b50508080612e2590614035565b915050612cf4565b505050505050565b6001600160a01b0383166000818152600360209081526040808320815180840180845263aa5af0fd60e01b905291519094919283929163aa5af0fd91602480860192908187030181865afa158015612e91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb59190613fdd565b905260408051808201918290526370a0823160e01b9091526001600160a01b038681166044830152919250600091819088166370a0823160648301602060405180830381865afa158015612f0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f319190613fdd565b81526040516395dd919360e01b81526001600160a01b0388811660048301526020909201918916906395dd919390602401602060405180830381865afa158015612f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa39190613fdd565b9052905060005b83548110156130e4576000848281548110612fc757612fc7613ff6565b6000918252602082206004600b9092020190810154909250612ff69083906001600160e01b031687878c612ba4565b60048301546001600160a01b03808b16600081815260098701602090815260408083206001600160e01b03909616909555600a880190528390208490556001860154925193945091811692908c16907f48a32d6daeb4317b45f49c3a1c0b1bd7d53a175d1f46c425138e328900cdccb4906130749086815260200190565b60405180910390a486156130cf576001600160a01b038089166000908152600a84016020526040812054600185015491926130b2928c9291166135ef565b6001600160a01b038a166000908152600a85016020526040902055505b505080806130dc90614035565b915050612faa565b50505050505050565b6001600160a01b0382166000908152600360205260408120815b815481101561316b57600082828154811061312457613124613ff6565b60009182526020909120600b9091020160018101549091506001600160a01b038681169116036131585792506109a9915050565b508061316381614035565b915050613107565b5060405162461bcd60e51b815260206004820152602f60248201527f556e61626c6520746f2066696e6420656d697373696f6e20746f6b656e20696e60448201526e206d546f6b656e20636f6e6669677360881b606482015260840161053e565b6001600160a01b038116600081815260036020908152604080832081516318160ddd60e01b815291519094926318160ddd92600480820193918290030181865afa15801561321e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132429190613fdd565b905060005b825481101561332f57600083828154811061326457613264613ff6565b6000918252602082206005600b9092020190810154600382015460028301549294506132a89263ffffffff600160e01b830416916001600160e01b0316908861290f565b8051602082015163ffffffff8116600160e01b026001600160e01b03831617600386015560018501546040519394507f79af45fe3972eecc4b95252214ad1d36529435ab4d4ae291d62a2ee5a0cc050093613312938b936001600160a01b0390931692909161438f565b60405180910390a15050808061332790614035565b915050613247565b50505050565b61333d613717565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586133723390565b6040516001600160a01b03909116815260200160405180910390a1565b61339761375f565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613372565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a6a9084906137a8565b60008164010000000084106134425760405162461bcd60e51b815260040161053e91906143ea565b509192915050565b6000612ae18383604051806040016040528060158152602001747375627472616374696f6e20756e646572666c6f7760581b81525061387d565b6000612ae183836040518060400160405280601781526020017f6d756c7469706c69636174696f6e206f766572666c6f770000000000000000008152506138ac565b60408051602081019091526000815260405180602001604052806135016134fb866a0c097ce7bc90715b34b9f160241b613484565b8561355d565b90529392505050565b6040805160208101909152600081526040518060200160405280613501856000015185600001516135b9565b600081600160e01b84106134425760405162461bcd60e51b815260040161053e91906143ea565b6000612ae183836040518060400160405280600e81526020016d646976696465206279207a65726f60901b815250613908565b60006a0c097ce7bc90715b34b9f160241b6135af848460000151613484565b612ae1919061441d565b6000612ae18383604051806040016040528060118152602001706164646974696f6e206f766572666c6f7760781b815250613934565b60006135f9613965565b8260000361360857508161370e565b60005460ff161561361a57508161370e565b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015613663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136879190613fdd565b90506000851180156136995750808511155b156136bd576136b26001600160a01b03831687876133c8565b60009250505061370e565b604080516001600160a01b038089168252861660208201529081018690527f8b079e2b0be6cc9631b7883d8478590fe708e9d360391aab49aa147901fc7a379060600160405180910390a184925050505b612ae160018055565b60005460ff161561375d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161053e565b565b60005460ff1661375d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161053e565b60006137fd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139be9092919063ffffffff16565b905080516000148061381e57508080602001905181019061381e91906141b5565b610a6a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161053e565b600081848411156138a15760405162461bcd60e51b815260040161053e91906143ea565b50612b9c838561443f565b60008315806138b9575082155b156138c657506000612ae1565b60006138d28486614452565b9050836138df868361441d565b1483906138ff5760405162461bcd60e51b815260040161053e91906143ea565b50949350505050565b600081836139295760405162461bcd60e51b815260040161053e91906143ea565b50612b9c838561441d565b6000806139418486614022565b905082858210156138ff5760405162461bcd60e51b815260040161053e91906143ea565b6002600154036139b75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161053e565b6002600155565b6060612b9c848460008585600080866001600160a01b031685876040516139e59190614469565b60006040518083038185875af1925050503d8060008114613a22576040519150601f19603f3d011682016040523d82523d6000602084013e613a27565b606091505b5091509150613a3887838387613a43565b979650505050505050565b60608315613ab2578251600003613aab576001600160a01b0385163b613aab5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161053e565b5081612b9c565b612b9c8383815115613ac75781518083602001fd5b8060405162461bcd60e51b815260040161053e91906143ea565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6001600160a01b038116811461055057600080fd5b600060208284031215613b5457600080fd5b8135612ae181613b2d565b60008060408385031215613b7257600080fd5b8235613b7d81613b2d565b91506020830135613b8d81613b2d565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015613bfb57835180516001600160a01b0316845260208082015190850152604080820151908501526060908101519084015260808301938501939250600101613bb4565b50909695505050505050565b801515811461055057600080fd5b600080600060608486031215613c2a57600080fd5b8335613c3581613b2d565b92506020840135613c4581613b2d565b91506040840135613c5581613c07565b809150509250925092565b600060208284031215613c7257600080fd5b5035919050565b600080600060608486031215613c8e57600080fd5b8335613c9981613b2d565b92506020840135613ca981613b2d565b929592945050506040919091013590565b60008060408385031215613ccd57600080fd5b8235613cd881613b2d565b946020939093013593505050565b80516001600160a01b03908116835260208083015190911690830152604080820151908301526060808201516001600160e01b03169083015260808082015190613d379084018263ffffffff169052565b5060a0810151613d5260a08401826001600160e01b03169052565b5060c0810151613d6a60c084018263ffffffff169052565b5060e0818101519083015261010090810151910152565b6020808252825182820181905260009190848201906040850190845b81811015613bfb57613db0838551613ce6565b928401926101209290920191600101613d9d565b61012081016109a98284613ce6565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b84811015613e9857898403603f19018652825180516001600160a01b03168552880151888501889052805188860181905290890190839060608701905b80831015613e8357835180516001600160a01b031683526020808201519084015260408082015190840152606090810151908301526080820191508b84019350600183019250613e38565b50978a01979550505091870191600101613dfb565b50919998505050505050505050565b600080600060608486031215613ebc57600080fd5b8335613ec781613b2d565b92506020840135613ed781613b2d565b91506040840135613c5581613b2d565b60008060008060008060c08789031215613f0057600080fd5b8635613f0b81613b2d565b95506020870135613f1b81613b2d565b94506040870135613f2b81613b2d565b959894975094956060810135955060808101359460a0909101359350915050565b600060208284031215613f5e57600080fd5b8151612ae181613b2d565b602080825260409082018190527f4f6e6c792074686520636f6d7074726f6c6c6572206f7220636f6d7074726f6c908201527f6c65722061646d696e2063616e2063616c6c20746869732066756e6374696f6e606082015260800190565b634e487b7160e01b600052604160045260246000fd5b600060208284031215613fef57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156109a9576109a961400c565b6000600182016140475761404761400c565b5060010190565b60208082526031908201527f4f6e6c792074686520636f6d7074726f6c6c657227732061646d696e6973747260408201527061746f722063616e20646f20746869732160781b606082015260800190565b60208082526041908201527f4f6e6c792074686520636f6e666967206f776e6572206f7220636f6d7074726f60408201527f6c6c65722061646d696e2063616e2063616c6c20746869732066756e6374696f6060820152603760f91b608082015260a00190565b60208082526043908201527f4f6e6c792074686520706175736520677561726469616e206f7220636f6d707460408201527f726f6c6c65722061646d696e2063616e2063616c6c20746869732066756e637460608201526234b7b760e91b608082015260a00190565b60208082526026908201527f506175736520477561726469616e2063616e277420626520746865203020616460408201526564726573732160d01b606082015260800190565b6000602082840312156141c757600080fd5b8151612ae181613c07565b6020808252603e908201527f43616e6e6f7420736574206120737570706c792072657761726420737065656460408201527f20686967686572207468616e2074686520656d697373696f6e20636170210000606082015260800190565b6020808252603e908201527f43616e6e6f7420736574206120626f72726f772072657761726420737065656460408201527f20686967686572207468616e2074686520656d697373696f6e20636170210000606082015260800190565b805161429781613b2d565b919050565b600060208083850312156142af57600080fd5b825167ffffffffffffffff808211156142c757600080fd5b818501915085601f8301126142db57600080fd5b8151818111156142ed576142ed613fc7565b8060051b604051601f19603f8301168101818110858211171561431257614312613fc7565b60405291825284820192508381018501918883111561433057600080fd5b938501935b82851015614355576143468561428c565b84529385019392850192614335565b98975050505050505050565b6000806040838503121561437457600080fd5b825161437f81613c07565b6020939093015192949293505050565b6001600160a01b0394851681529290931660208301526001600160e01b0316604082015263ffffffff909116606082015260800190565b60005b838110156143e15781810151838201526020016143c9565b50506000910152565b60208152600082518060208401526144098160408501602087016143c6565b601f01601f19169190910160400192915050565b60008261443a57634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156109a9576109a961400c565b80820281158282048414176109a9576109a961400c565b6000825161447b8184602087016143c6565b919091019291505056fea26469706673582212205a79833b52f6aeb743eb9c43a4bbff93f524799e37c886a9f8b277ad03f9557b64736f6c63430008130033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.