ETH Price: $2,685.08 (-4.03%)
Gas: 0.94 Gwei

Contract

0x2CC8BF652401b044077803FC419E21118d545A61
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
Age
From
To
Get Reward190553492024-01-21 12:50:59399 days ago1705841459IN
0x2CC8BF65...18d545A61
0 ETH0.0003277813.79229426
Get Reward190553362024-01-21 12:48:23399 days ago1705841303IN
0x2CC8BF65...18d545A61
0 ETH0.0003157413.2856178

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CommunityRewards

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion, MIT license
File 1 of 48 : CommunityRewards.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/SafeERC20.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/utils/ReentrancyGuard.sol";
import "../external/ERC721PresetMinterPauserAutoId.sol";
import "../interfaces/IERC20withDec.sol";
import "../interfaces/ICommunityRewards.sol";
import "../protocol/core/GoldfinchConfig.sol";
import "../protocol/core/ConfigHelper.sol";
import "../library/CommunityRewardsVesting.sol";
contract CommunityRewards is ICommunityRewards, ERC721PresetMinterPauserAutoIdUpgradeSafe, ReentrancyGuardUpgradeSafe {
using SafeMath for uint256;
using SafeERC20 for IERC20withDec;
using ConfigHelper for GoldfinchConfig;
using CommunityRewardsVesting for CommunityRewardsVesting.Rewards;
/* ========== EVENTS ========== */
event GoldfinchConfigUpdated(address indexed who, address configAddress);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 2 of 48 : Context.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.0;
import "../Initializable.sol";
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN 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.
*/
contract ContextUpgradeSafe is Initializable {
// Empty internal constructor, to prevent people from mistakenly deploying
// an instance of this contract, which should be used via inheritance.
function __Context_init() internal initializer {
__Context_init_unchained();
}
function __Context_init_unchained() internal initializer {
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 3 of 48 : Initializable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity >=0.4.24 <0.7.0;
/**
* @title Initializable
*
* @dev Helper contract to support initializer functions. To use it, replace
* the constructor with a function that has the `initializer` modifier.
* WARNING: Unlike constructors, initializer functions must be manually
* invoked. This applies both to deploying an Initializable contract, as well
* as extending an Initializable contract via inheritance.
* WARNING: When used with inheritance, manual care must be taken to not invoke
* a parent initializer twice, or ensure that all initializers are idempotent,
* because this is not dealt with automatically as with constructors.
*/
contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private initializing;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 4 of 48 : AccessControl.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.0;
import "../utils/EnumerableSet.sol";
import "../utils/Address.sol";
import "../GSN/Context.sol";
import "../Initializable.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, _msgSender()));
* ...
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 5 of 48 : ERC165.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.0;
import "./IERC165.sol";
import "../Initializable.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts may inherit from this and call {_registerInterface} to declare
* their support of an interface.
*/
contract ERC165UpgradeSafe is Initializable, IERC165 {
/*
* bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
*/
bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
/**
* @dev Mapping of interface ids to whether or not it's supported.
*/
mapping(bytes4 => bool) private _supportedInterfaces;
function __ERC165_init() internal initializer {
__ERC165_init_unchained();
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 6 of 48 : IERC165.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
pragma solidity ^0.6.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 7 of 48 : Math.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow, so we distribute
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 8 of 48 : SafeMath.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 9 of 48 : IERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 10 of 48 : SafeERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.0;
import "./IERC20.sol";
import "../../math/SafeMath.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 ERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 11 of 48 : ERC721.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.0;
import "../../GSN/Context.sol";
import "./IERC721.sol";
import "./IERC721Metadata.sol";
import "./IERC721Enumerable.sol";
import "./IERC721Receiver.sol";
import "../../introspection/ERC165.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol";
import "../../utils/EnumerableSet.sol";
import "../../utils/EnumerableMap.sol";
import "../../utils/Strings.sol";
import "../../Initializable.sol";
/**
* @title ERC721 Non-Fungible Token Standard basic implementation
* @dev see https://eips.ethereum.org/EIPS/eip-721
*/
contract ERC721UpgradeSafe is Initializable, ContextUpgradeSafe, ERC165UpgradeSafe, IERC721, IERC721Metadata, IERC721Enumerable {
using SafeMath for uint256;
using Address for address;
using EnumerableSet for EnumerableSet.UintSet;
using EnumerableMap for EnumerableMap.UintToAddressMap;
using Strings for uint256;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 12 of 48 : ERC721Pausable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.0;
import "./ERC721.sol";
import "../../utils/Pausable.sol";
import "../../Initializable.sol";
/**
* @dev ERC721 token with pausable token transfers, minting and burning.
*
* Useful for scenarios such as preventing trades until the end of an evaluation
* period, or having an emergency switch for freezing all token transfers in the
* event of a large bug.
*/
abstract contract ERC721PausableUpgradeSafe is Initializable, ERC721UpgradeSafe, PausableUpgradeSafe {
function __ERC721Pausable_init() internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__Pausable_init_unchained();
__ERC721Pausable_init_unchained();
}
function __ERC721Pausable_init_unchained() internal initializer {
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 13 of 48 : IERC721.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.2;
import "../../introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of NFTs in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the NFT specified by `tokenId`.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
* another (`to`).
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 14 of 48 : IERC721Enumerable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
pragma solidity ^0.6.2;
import "./IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
function totalSupply() external view returns (uint256);
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
function tokenByIndex(uint256 index) external view returns (uint256);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 15 of 48 : IERC721Metadata.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
pragma solidity ^0.6.2;
import "./IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function tokenURI(uint256 tokenId) external view returns (string memory);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 16 of 48 : IERC721Receiver.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
pragma solidity ^0.6.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @notice Handle the receipt of an NFT
* @dev The ERC721 smart contract calls this function on the recipient
* after a {IERC721-safeTransferFrom}. This function MUST return the function selector,
* otherwise the caller will revert the transaction. The selector to be
* returned can be obtained as `this.onERC721Received.selector`. This
* function MAY throw to revert and reject the transfer.
* Note: the ERC721 contract address is always the message sender.
* @param operator The address which called `safeTransferFrom` function
* @param from The address which previously owned the token
* @param tokenId The NFT identifier which is being transferred
* @param data Additional data with no specified format
* @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
*/
function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data)
external returns (bytes4);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 17 of 48 : Address.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.2;
/**
* @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
* ====
*/
function isContract(address account) internal view returns (bool) {
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 18 of 48 : Counters.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.0;
import "../math/SafeMath.sol";
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
* Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}
* overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
* directly accessed.
*/
library Counters {
using SafeMath for uint256;
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 19 of 48 : EnumerableMap.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.0;
/**
* @dev Library for managing an enumerable variant of Solidity's
* https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
* type.
*
* Maps have the following properties:
*
* - Entries are added, removed, and checked for existence in constant time
* (O(1)).
* - Entries are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableMap for EnumerableMap.UintToAddressMap;
*
* // Declare a set state variable
* EnumerableMap.UintToAddressMap private myMap;
* }
* ```
*
* As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
* supported.
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 20 of 48 : EnumerableSet.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256`
* (`UintSet`) are supported.
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 21 of 48 : Pausable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.0;
import "../GSN/Context.sol";
import "../Initializable.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
contract PausableUpgradeSafe is Initializable, ContextUpgradeSafe {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 22 of 48 : ReentrancyGuard.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.0;
import "../Initializable.sol";
/**
* @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].
*/
contract ReentrancyGuardUpgradeSafe is Initializable {
bool private _notEntered;
function __ReentrancyGuard_init() internal initializer {
__ReentrancyGuard_init_unchained();
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 23 of 48 : Strings.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.6.0;
/**
* @dev String operations.
*/
library Strings {
/**
* @dev Converts a `uint256` to its ASCII `string` representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
uint256 index = digits - 1;
temp = value;
while (temp != 0) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 24 of 48 : ERC721PresetMinterPauserAutoId.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// SPDX-License-Identifier: MIT
// solhint-disable
/*
This is copied from OZ preset: https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/release-v3.0.0/contracts/presets
      /ERC721PresetMinterPauserAutoId.sol
Alterations:
* Make the counter public, so that we can use it in our custom mint function
* Removed ERC721Burnable parent contract, but added our own custom burn function.
* Removed original "mint" function, because we have a custom one.
* Removed default initialization functions, because they set msg.sender as the owner, which
we do not want, because we use a deployer account, which is separate from the protocol owner.
*/
pragma solidity 0.6.12;
import "@openzeppelin/contracts-ethereum-package/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/utils/Counters.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/token/ERC721/ERC721Pausable.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/Initializable.sol";
/**
* @dev {ERC721} token, including:
*
* - ability for holders to burn (destroy) their tokens
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 25 of 48 : IBackerRewards.sol
1
2
3
4
5
6
7
8
9
10
11
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
interface IBackerRewards {
function allocateRewards(uint256 _interestPaymentAmount) external;
function onTranchedPoolDrawdown(uint256 sliceIndex) external;
function setPoolTokenAccRewardsPerPrincipalDollarAtMint(address poolAddress, uint256 tokenId) external;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 26 of 48 : ICUSDCContract.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// Taken from https://github.com/compound-finance/compound-protocol/blob/master/contracts/CTokenInterfaces.sol
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "./IERC20withDec.sol";
interface ICUSDCContract is IERC20withDec {
/*** User Interface ***/
function mint(uint256 mintAmount) external returns (uint256);
function redeem(uint256 redeemTokens) external returns (uint256);
function redeemUnderlying(uint256 redeemAmount) external returns (uint256);
function borrow(uint256 borrowAmount) external returns (uint256);
function repayBorrow(uint256 repayAmount) external returns (uint256);
function repayBorrowBehalf(address borrower, uint256 repayAmount) external returns (uint256);
function liquidateBorrow(
address borrower,
uint256 repayAmount,
address cTokenCollateral
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 27 of 48 : ICommunityRewards.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts-ethereum-package/contracts/token/ERC721/IERC721.sol";
import "../interfaces/IERC20withDec.sol";
interface ICommunityRewards is IERC721 {
function rewardsToken() external view returns (IERC20withDec);
function claimableRewards(uint256 tokenId) external view returns (uint256 rewards);
function totalVestedAt(
uint256 start,
uint256 end,
uint256 granted,
uint256 cliffLength,
uint256 vestingInterval,
uint256 revokedAt,
uint256 time
) external pure returns (uint256 rewards);
function grant(
address recipient,
uint256 amount,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 28 of 48 : ICreditDesk.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
abstract contract ICreditDesk {
uint256 public totalWritedowns;
uint256 public totalLoansOutstanding;
function setUnderwriterGovernanceLimit(address underwriterAddress, uint256 limit) external virtual;
function drawdown(address creditLineAddress, uint256 amount) external virtual;
function pay(address creditLineAddress, uint256 amount) external virtual;
function assessCreditLine(address creditLineAddress) external virtual;
function applyPayment(address creditLineAddress, uint256 amount) external virtual;
function getNextPaymentAmount(address creditLineAddress, uint256 asOfBLock) external view virtual returns (uint256);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 29 of 48 : ICreditLine.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
interface ICreditLine {
function borrower() external view returns (address);
function limit() external view returns (uint256);
function maxLimit() external view returns (uint256);
function interestApr() external view returns (uint256);
function paymentPeriodInDays() external view returns (uint256);
function principalGracePeriodInDays() external view returns (uint256);
function termInDays() external view returns (uint256);
function lateFeeApr() external view returns (uint256);
function isLate() external view returns (bool);
function withinPrincipalGracePeriod() external view returns (bool);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 30 of 48 : ICurveLP.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// SPDX-License-Identifier: MIT
// Taken from https://github.com/compound-finance/compound-protocol/blob/master/contracts/CTokenInterfaces.sol
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
interface ICurveLP {
function token() external view returns (address);
function get_virtual_price() external view returns (uint256);
function calc_token_amount(uint256[2] calldata amounts) external view returns (uint256);
function add_liquidity(
uint256[2] calldata amounts,
uint256 min_mint_amount,
bool use_eth,
address receiver
) external returns (uint256);
function balances(uint256 arg0) external view returns (uint256);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 31 of 48 : IERC20withDec.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol";
/*
Only addition is the `decimals` function, which we need, and which both our Fidu and USDC use, along with most ERC20's.
*/
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20withDec is IERC20 {
/**
* @dev Returns the number of decimals used for the token
*/
function decimals() external view returns (uint8);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 32 of 48 : IFidu.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "./IERC20withDec.sol";
interface IFidu is IERC20withDec {
function mintTo(address to, uint256 amount) external;
function burnFrom(address to, uint256 amount) external;
function renounceRole(bytes32 role, address account) external;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 33 of 48 : IGo.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
abstract contract IGo {
uint256 public constant ID_TYPE_0 = 0;
uint256 public constant ID_TYPE_1 = 1;
uint256 public constant ID_TYPE_2 = 2;
uint256 public constant ID_TYPE_3 = 3;
uint256 public constant ID_TYPE_4 = 4;
uint256 public constant ID_TYPE_5 = 5;
uint256 public constant ID_TYPE_6 = 6;
uint256 public constant ID_TYPE_7 = 7;
uint256 public constant ID_TYPE_8 = 8;
uint256 public constant ID_TYPE_9 = 9;
uint256 public constant ID_TYPE_10 = 10;
/// @notice Returns the address of the UniqueIdentity contract.
function uniqueIdentity() external virtual returns (address);
function go(address account) public view virtual returns (bool);
function goOnlyIdTypes(address account, uint256[] calldata onlyIdTypes) public view virtual returns (bool);
function goSeniorPool(address account) public view virtual returns (bool);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 34 of 48 : IGoldfinchConfig.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
interface IGoldfinchConfig {
function getNumber(uint256 index) external returns (uint256);
function getAddress(uint256 index) external returns (address);
function setAddress(uint256 index, address newAddress) external returns (address);
function setNumber(uint256 index, uint256 newNumber) external returns (uint256);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 35 of 48 : IGoldfinchFactory.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
interface IGoldfinchFactory {
function createCreditLine() external returns (address);
function createBorrower(address owner) external returns (address);
function createPool(
address _borrower,
uint256 _juniorFeePercent,
uint256 _limit,
uint256 _interestApr,
uint256 _paymentPeriodInDays,
uint256 _termInDays,
uint256 _lateFeeApr,
uint256[] calldata _allowedUIDTypes
) external returns (address);
function createMigratedPool(
address _borrower,
uint256 _juniorFeePercent,
uint256 _limit,
uint256 _interestApr,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 36 of 48 : IPool.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
abstract contract IPool {
uint256 public sharePrice;
function deposit(uint256 amount) external virtual;
function withdraw(uint256 usdcAmount) external virtual;
function withdrawInFidu(uint256 fiduAmount) external virtual;
function collectInterestAndPrincipal(
address from,
uint256 interest,
uint256 principal
) public virtual;
function transferFrom(
address from,
address to,
uint256 amount
) public virtual returns (bool);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 37 of 48 : IPoolTokens.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts-ethereum-package/contracts/token/ERC721/IERC721.sol";
interface IPoolTokens is IERC721 {
event TokenMinted(
address indexed owner,
address indexed pool,
uint256 indexed tokenId,
uint256 amount,
uint256 tranche
);
event TokenRedeemed(
address indexed owner,
address indexed pool,
uint256 indexed tokenId,
uint256 principalRedeemed,
uint256 interestRedeemed,
uint256 tranche
);
event TokenBurned(address indexed owner, address indexed pool, uint256 indexed tokenId);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 38 of 48 : ISeniorPool.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "./ITranchedPool.sol";
abstract contract ISeniorPool {
uint256 public sharePrice;
uint256 public totalLoansOutstanding;
uint256 public totalWritedowns;
function deposit(uint256 amount) external virtual returns (uint256 depositShares);
function depositWithPermit(
uint256 amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external virtual returns (uint256 depositShares);
function withdraw(uint256 usdcAmount) external virtual returns (uint256 amount);
function withdrawInFidu(uint256 fiduAmount) external virtual returns (uint256 amount);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 39 of 48 : ISeniorPoolStrategy.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "./ISeniorPool.sol";
import "./ITranchedPool.sol";
abstract contract ISeniorPoolStrategy {
function getLeverageRatio(ITranchedPool pool) public view virtual returns (uint256);
function invest(ISeniorPool seniorPool, ITranchedPool pool) public view virtual returns (uint256 amount);
function estimateInvestment(ISeniorPool seniorPool, ITranchedPool pool) public view virtual returns (uint256);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 40 of 48 : IStakingRewards.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
interface IStakingRewards {
function unstake(uint256 tokenId, uint256 amount) external;
function addToStake(uint256 tokenId, uint256 amount) external;
function stakedBalanceOf(uint256 tokenId) external view returns (uint256);
function depositToCurveAndStakeFrom(
address nftRecipient,
uint256 fiduAmount,
uint256 usdcAmount
) external;
function kick(uint256 tokenId) external;
function accumulatedRewardsPerToken() external view returns (uint256);
function lastUpdateTime() external view returns (uint256);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 41 of 48 : ITranchedPool.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "./IV2CreditLine.sol";
abstract contract ITranchedPool {
IV2CreditLine public creditLine;
uint256 public createdAt;
enum Tranches {
Reserved,
Senior,
Junior
}
struct TrancheInfo {
uint256 id;
uint256 principalDeposited;
uint256 principalSharePrice;
uint256 interestSharePrice;
uint256 lockedUntil;
}
struct PoolSlice {
TrancheInfo seniorTranche;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 42 of 48 : IV2CreditLine.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "./ICreditLine.sol";
abstract contract IV2CreditLine is ICreditLine {
function principal() external view virtual returns (uint256);
function totalInterestAccrued() external view virtual returns (uint256);
function termStartTime() external view virtual returns (uint256);
function setLimit(uint256 newAmount) external virtual;
function setMaxLimit(uint256 newAmount) external virtual;
function setBalance(uint256 newBalance) external virtual;
function setPrincipal(uint256 _principal) external virtual;
function setTotalInterestAccrued(uint256 _interestAccrued) external virtual;
function drawdown(uint256 amount) external virtual;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 43 of 48 : CommunityRewardsVesting.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/math/Math.sol";
library CommunityRewardsVesting {
using SafeMath for uint256;
using CommunityRewardsVesting for Rewards;
/// @dev All time values in the Rewards struct (i.e. `startTime`, `endTime`,
/// `cliffLength`, `vestingInterval`, `revokedAt`) use the same units: seconds. All timestamp
/// values (i.e. `startTime`, `endTime`, `revokedAt`) are seconds since the unix epoch.
/// @dev `cliffLength` is the duration from the start of the grant, before which has elapsed
/// the vested amount remains 0.
/// @dev `vestingInterval` is the interval at which vesting occurs. If `vestingInterval` is not a
/// factor of `vestingLength`, rewards are fully vested at the time of the last whole `vestingInterval`.
struct Rewards {
uint256 totalGranted;
uint256 totalClaimed;
uint256 startTime;
uint256 endTime;
uint256 cliffLength;
uint256 vestingInterval;
uint256 revokedAt;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 44 of 48 : BaseUpgradeablePausable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts-ethereum-package/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/Initializable.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol";
import "./PauserPausable.sol";
/**
* @title BaseUpgradeablePausable contract
* @notice This is our Base contract that most other contracts inherit from. It includes many standard
* useful abilities like ugpradeability, pausability, access control, and re-entrancy guards.
* @author Goldfinch
*/
contract BaseUpgradeablePausable is
Initializable,
AccessControlUpgradeSafe,
PauserPausable,
ReentrancyGuardUpgradeSafe
{
bytes32 public constant OWNER_ROLE = keccak256("OWNER_ROLE");
using SafeMath for uint256;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 45 of 48 : ConfigHelper.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "./GoldfinchConfig.sol";
import "../../interfaces/IPool.sol";
import "../../interfaces/IFidu.sol";
import "../../interfaces/ISeniorPool.sol";
import "../../interfaces/ISeniorPoolStrategy.sol";
import "../../interfaces/ICreditDesk.sol";
import "../../interfaces/IERC20withDec.sol";
import "../../interfaces/ICUSDCContract.sol";
import "../../interfaces/IPoolTokens.sol";
import "../../interfaces/IBackerRewards.sol";
import "../../interfaces/IGoldfinchFactory.sol";
import "../../interfaces/IGo.sol";
import "../../interfaces/IStakingRewards.sol";
import "../../interfaces/ICurveLP.sol";
/**
* @title ConfigHelper
* @notice A convenience library for getting easy access to other contracts and constants within the
* protocol, through the use of the GoldfinchConfig contract
* @author Goldfinch
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 46 of 48 : ConfigOptions.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
/**
* @title ConfigOptions
* @notice A central place for enumerating the configurable options of our GoldfinchConfig contract
* @author Goldfinch
*/
library ConfigOptions {
// NEVER EVER CHANGE THE ORDER OF THESE!
// You can rename or append. But NEVER change the order.
enum Numbers {
TransactionLimit,
TotalFundsLimit,
MaxUnderwriterLimit,
ReserveDenominator,
WithdrawFeeDenominator,
LatenessGracePeriodInDays,
LatenessMaxDays,
DrawdownPeriodInSeconds,
TransferRestrictionPeriodInDays,
LeverageRatio
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 47 of 48 : GoldfinchConfig.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "./BaseUpgradeablePausable.sol";
import "../../interfaces/IGoldfinchConfig.sol";
import "./ConfigOptions.sol";
/**
* @title GoldfinchConfig
* @notice This contract stores mappings of useful "protocol config state", giving a central place
* for all other contracts to access it. For example, the TransactionLimit, or the PoolAddress. These config vars
* are enumerated in the `ConfigOptions` library, and can only be changed by admins of the protocol.
* Note: While this inherits from BaseUpgradeablePausable, it is not deployed as an upgradeable contract (this
* is mostly to save gas costs of having each call go through a proxy)
* @author Goldfinch
*/
contract GoldfinchConfig is BaseUpgradeablePausable {
bytes32 public constant GO_LISTER_ROLE = keccak256("GO_LISTER_ROLE");
mapping(uint256 => address) public addresses;
mapping(uint256 => uint256) public numbers;
mapping(address => bool) public goList;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 48 of 48 : PauserPausable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts-ethereum-package/contracts/utils/Pausable.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/access/AccessControl.sol";
/**
* @title PauserPausable
* @notice Inheriting from OpenZeppelin's Pausable contract, this does small
* augmentations to make it work with a PAUSER_ROLE, leveraging the AccessControl contract.
* It is meant to be inherited.
* @author Goldfinch
*/
contract PauserPausable is AccessControlUpgradeSafe, PausableUpgradeSafe {
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
// solhint-disable-next-line func-name-mixedcase
function __PauserPausable__init() public initializer {
__Pausable_init_unchained();
}
/**
* @dev Pauses all functions guarded by Pause
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Settings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 100
},
"remappings": [],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"address","name":"configAddress","type":"address"}],"name":"GoldfinchConfigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalUnvested","type":"uint256"}],"name":"GrantRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vestingLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cliffLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vestingInterval","type":"uint256"}],"name":"Granted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISTRIBUTOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OWNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"contract GoldfinchConfig","name":"_config","type":"address"},{"internalType":"uint256","name":"_tokenLaunchTimeInSeconds","type":"uint256"}],"name":"__initialize__","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_tokenIdTracker","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimableRewards","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"config","outputs":[{"internalType":"contract GoldfinchConfig","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"vestingLength","type":"uint256"},{"internalType":"uint256","name":"cliffLength","type":"uint256"},{"internalType":"uint256","name":"vestingInterval","type":"uint256"}],"name":"grant","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"grants","outputs":[{"internalType":"uint256","name":"totalGranted","type":"uint256"},{"internalType":"uint256","name":"totalClaimed","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"cliffLength","type":"uint256"},{"internalType":"uint256","name":"vestingInterval","type":"uint256"},{"internalType":"uint256","name":"revokedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDistributor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewards","type":"uint256"}],"name":"loadRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"revokeGrant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20withDec","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenLaunchTimeInSeconds","type":"uint256"}],"name":"setTokenLaunchTimeInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenLaunchTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"totalUnclaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"granted","type":"uint256"},{"internalType":"uint256","name":"cliffLength","type":"uint256"},{"internalType":"uint256","name":"vestingInterval","type":"uint256"},{"internalType":"uint256","name":"revokedAt","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"}],"name":"totalVestedAt","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unclaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateGoldfinchConfig","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50613bdf806100206000396000f3fe608060405234801561001057600080fd5b50600436106102c15760003560e01c806379502c551161017d578063b88d4fde116100d9578063d54a23d611610092578063d54a23d6146105ac578063e58378bb146105bf578063e63ab1e9146105c7578063e7a7250a146105cf578063e985e9c5146105d7578063f0bd87cc146105ea578063f62849be146105f2576102c1565b8063b88d4fde14610550578063c87b56dd14610563578063ca15c87314610576578063d1af0c7d14610589578063d539139314610591578063d547741f14610599576102c1565b806391d148541161013657806391d14854146104f757806395d89b411461050a5780639835fc7e1461051257806398bcede914610525578063a217fddf1461052d578063a22cb46514610535578063b6db75a014610548576102c1565b806379502c551461049b5780637d0781b4146104a35780638092a3b1146104b65780638456cb59146104c95780638f41ab16146104d15780639010d07c146104e4576102c1565b8063248a9ca31161022c5780634f6ccce7116101e55780634f6ccce7146104375780634f92a7281461044a5780635c975abb146104525780636352211e1461045a57806363b114721461046d5780636c0360eb1461048057806370a0823114610488576102c1565b8063248a9ca3146103d05780632f2ff15d146103e35780632f745c59146103f657806336568abe146104095780633f4ba83a1461041c57806342842e0e14610424576102c1565b806318160ddd1161027e57806318160ddd1461036757806318ce4d941461037c5780631c4b774b1461038f5780631d33267a146103a2578063205282e6146103b557806323b872dd146103bd576102c1565b806301ffc9a7146102c657806306fdde03146102ef578063081812fc14610304578063095ea7b3146103245780630997a514146103395780630c0debea14610341575b600080fd5b6102d96102d4366004612d27565b610605565b6040516102e69190612f01565b60405180910390f35b6102f7610628565b6040516102e69190612f15565b610317610312366004612cca565b6106be565b6040516102e69190612e73565b610337610332366004612c40565b61070a565b005b6102d96107a2565b61035461034f366004612cca565b6107c3565b6040516102e69796959493929190613a66565b61036f610801565b6040516102e69190612f0c565b61036f61038a366004612c6b565b61080d565b61033761039d366004612cca565b6108ab565b6103376103b0366004612cca565b6109ca565b61036f610ae5565b6103376103cb366004612af7565b610aec565b61036f6103de366004612cca565b610b24565b6103376103f1366004612ce2565b610b39565b61036f610404366004612c40565b610b81565b610337610417366004612ce2565b610bac565b610337610bee565b610337610432366004612af7565b610c2e565b61036f610445366004612cca565b610c49565b610337610c5f565b6102d9610d0d565b610317610468366004612cca565b610d16565b61036f61047b366004612d5f565b610d3e565b6102f7610d5d565b61036f610496366004612a87565b610dbe565b610317610e07565b6103376104b1366004612cca565b610e17565b61036f6104c4366004612cca565b610e41565b610337610e4c565b6103376104df366004612c2c565b610e8a565b6103176104f2366004612d06565b61108d565b6102d9610505366004612ce2565b6110a5565b6102f76110bd565b61036f610520366004612cca565b61111e565b61036f611136565b61036f61113d565b610337610543366004612bff565b611142565b6102d9611210565b61033761055e366004612b37565b61122c565b6102f7610571366004612cca565b611265565b61036f610584366004612cca565b6113af565b6103176113c6565b61036f6113df565b6103376105a7366004612ce2565b611403565b61036f6105ba366004612a87565b61143d565b61036f611485565b61036f611497565b61036f6114a9565b6102d96105e5366004612abf565b6114b0565b61036f6114de565b610337610600366004612cca565b6114f0565b6001600160e01b0319811660009081526097602052604090205460ff165b919050565b60ce8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106b45780601f10610689576101008083540402835291602001916106b4565b820191906000526020600020905b81548152906001019060200180831161069757829003601f168201915b5050505050905090565b60006106c98261159f565b6106ee5760405162461bcd60e51b81526004016106e590613563565b60405180910390fd5b50600090815260cc60205260409020546001600160a01b031690565b600061071582610d16565b9050806001600160a01b0316836001600160a01b031614156107495760405162461bcd60e51b81526004016106e5906136e6565b806001600160a01b031661075b6115ac565b6001600160a01b031614806107775750610777816105e56115ac565b6107935760405162461bcd60e51b81526004016106e5906133d2565b61079d83836115b0565b505050565b60006107be600080516020613afc8339815191526105056115ac565b905090565b6101c6602052600090815260409020805460018201546002830154600384015460048501546005860154600690960154949593949293919290919087565b60006107be60ca61161e565b6101915460009060ff166108335760405162461bcd60e51b81526004016106e59061384f565b610191805460ff1916905560fb5460ff16156108615760405162461bcd60e51b81526004016106e590613378565b6108696107a2565b6108855760405162461bcd60e51b81526004016106e590613695565b6108928686868686611629565b9050610191805460ff1916600117905595945050505050565b6101915460ff166108ce5760405162461bcd60e51b81526004016106e59061384f565b610191805460ff1916905560fb5460ff16156108fc5760405162461bcd60e51b81526004016106e590613378565b3361090682610d16565b6001600160a01b03161461092c5760405162461bcd60e51b81526004016106e590613778565b60006109378261111e565b905080156109b85760008281526101c66020526040902061095890826117d7565b61097533826109656113c6565b6001600160a01b031691906117f2565b81336001600160a01b03167fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f51836040516109af9190612f0c565b60405180910390a35b5050610191805460ff19166001179055565b60fb5460ff16156109ed5760405162461bcd60e51b81526004016106e590613378565b6109f5611210565b610a115760405162461bcd60e51b81526004016106e590613968565b60008181526101c6602052604090208054610a3e5760405162461bcd60e51b81526004016106e59061352c565b600681015415610a605760405162461bcd60e51b81526004016106e59061379f565b6000610a6c8242611848565b905060008111610a8e5760405162461bcd60e51b81526004016106e5906133a2565b6101c454610a9c908261185f565b6101c45542600683015560405183907f99b158d692e9c5440d29424d4441593c29ad41c52383617e45098ecb1fba2e0890610ad8908490612f0c565b60405180910390a2505050565b6101c55481565b610afd610af76115ac565b82611884565b610b195760405162461bcd60e51b81526004016106e590613727565b61079d838383611909565b60009081526065602052604090206002015490565b600082815260656020526040902060020154610b57906105056115ac565b610b735760405162461bcd60e51b81526004016106e590612fb5565b610b7d8282611a17565b5050565b6001600160a01b038216600090815260c960205260408120610ba39083611a80565b90505b92915050565b610bb46115ac565b6001600160a01b0316816001600160a01b031614610be45760405162461bcd60e51b81526004016106e5906139b3565b610b7d8282611a8c565b610c08600080516020613b658339815191526105056115ac565b610c245760405162461bcd60e51b81526004016106e5906138d3565b610c2c611af5565b565b61079d8383836040518060200160405280600081525061122c565b600080610c5760ca84611b61565b509392505050565b610c67611210565b610c835760405162461bcd60e51b81526004016106e590613968565b6101c354610c99906001600160a01b0316611b7d565b6101c380546001600160a01b0319166001600160a01b0392909216919091179055610cc26115ac565b6101c3546040516001600160a01b03928316927f7c76c17de59691df2ef36af3938c91f69cd18ad27f67a54a38e38686f0b40c4992610d0392911690612e73565b60405180910390a2565b60fb5460ff1690565b6000610ba682604051806060016040528060298152602001613b3c6029913960ca9190611bfd565b6000610d4f88888888888888611c14565b90505b979650505050505050565b60d18054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106b45780601f10610689576101008083540402835291602001916106b4565b60006001600160a01b038216610de65760405162461bcd60e51b81526004016106e59061342a565b6001600160a01b038216600090815260c960205260409020610ba69061161e565b6101c3546001600160a01b031681565b610e1f611210565b610e3b5760405162461bcd60e51b81526004016106e590613968565b6101c555565b6000610ba682611ca8565b610e66600080516020613b658339815191526105056115ac565b610e825760405162461bcd60e51b81526004016106e5906131d3565b610c2c611cc2565b600054610100900460ff1680610ea35750610ea3611d1b565b80610eb1575060005460ff16155b610ecd5760405162461bcd60e51b81526004016106e5906135af565b600054610100900460ff16158015610ef8576000805460ff1961ff0019909116610100171660011790555b6001600160a01b03841615801590610f1857506001600160a01b03831615155b610f345760405162461bcd60e51b81526004016106e590613032565b610f3c611d21565b610f44611da4565b610f87604051806060016040528060258152602001613b85602591396040518060400160405280600981526020016823a32496ab1916a1a960b91b815250611e22565b610f8f611d21565b610f97611d21565b610f9f611efe565b610fa7611f8a565b610fbf600080516020613b1c83398151915285610b73565b610fd7600080516020613b6583398151915285610b73565b610fef600080516020613afc83398151915285610b73565b611007600080516020613b1c8339815191528061201a565b61102d600080516020613b65833981519152600080516020613b1c83398151915261201a565b611053600080516020613afc833981519152600080516020613b1c83398151915261201a565b6101c58290556101c380546001600160a01b0319166001600160a01b0385161790558015611087576000805461ff00191690555b50505050565b6000828152606560205260408120610ba39083611a80565b6000828152606560205260408120610ba3908361202f565b60cf8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106b45780601f10610689576101008083540402835291602001916106b4565b60008181526101c660205260408120610ba690612044565b61015f5481565b600081565b61114a6115ac565b6001600160a01b0316826001600160a01b0316141561117b5760405162461bcd60e51b81526004016106e590613274565b8060cd60006111886115ac565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556111cc6115ac565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112049190612f01565b60405180910390a35050565b60006107be600080516020613b1c8339815191526105056115ac565b61123d6112376115ac565b83611884565b6112595760405162461bcd60e51b81526004016106e590613727565b61108784848484612050565b60606112708261159f565b61128c5760405162461bcd60e51b81526004016106e590613646565b600082815260d0602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156113215780601f106112f657610100808354040283529160200191611321565b820191906000526020600020905b81548152906001019060200180831161130457829003601f168201915b505060d1549394505050506002600019610100600184161502019091160461134a579050610623565b80511561137c5760d181604051602001611365929190612df2565b604051602081830303815290604052915050610623565b60d161138784612083565b604051602001611398929190612df2565b604051602081830303815290604052915050919050565b6000818152606560205260408120610ba69061161e565b6101c3546000906107be906001600160a01b031661215e565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b600082815260656020526040902060020154611421906105056115ac565b610be45760405162461bcd60e51b81526004016106e590613328565b600080805b61144b84610dbe565b81101561147e57600061145e8583610b81565b905061147361146c82611ca8565b849061185f565b925050600101611442565b5092915050565b600080516020613b1c83398151915281565b600080516020613b6583398151915281565b6101c45481565b6001600160a01b03918216600090815260cd6020908152604080832093909416825291909152205460ff1690565b600080516020613afc83398151915281565b6114f8611210565b6115145760405162461bcd60e51b81526004016106e590613968565b600081116115345760405162461bcd60e51b81526004016106e590613105565b6101c454611542908261185f565b6101c4556115653330836115546113c6565b6001600160a01b0316929190612169565b7fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d816040516115949190612f0c565b60405180910390a150565b6000610ba660ca8361218a565b3390565b600081815260cc6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906115e582610d16565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610ba682612196565b600080851161164a5760405162461bcd60e51b81526004016106e5906137d6565b8383111561166a5760405162461bcd60e51b81526004016106e590613a02565b6101c45485111561168d5760405162461bcd60e51b81526004016106e590613886565b838211156116ad5760405162461bcd60e51b81526004016106e59061316b565b816116b6578391505b6101c4546116c4908661219a565b6101c4556116d361015f6121dc565b6116de61015f612196565b90506040518060e00160405280868152602001600081526020016101c5548152602001611717866101c55461185f90919063ffffffff16565b815260208082018690526040808301869052600060609384018190528581526101c683528190208451815591840151600183015583015160028201559082015160038201556080820151600482015560a0820151600582015560c09091015160069091015561178686826121e5565b80866001600160a01b03167f13fce371c40438299d0ef0c6274292b9b9989523253a77f15706673efe5863b8878787876040516117c69493929190613a4b565b60405180910390a395945050505050565b60018201546117e6908261185f565b82600101819055505050565b61079d8363a9059cbb60e01b8484604051602401611811929190612ee8565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526122a9565b6000610ba3611857848461238e565b84549061219a565b600082820183811015610ba35760405162461bcd60e51b81526004016106e59061319c565b600061188f8261159f565b6118ab5760405162461bcd60e51b81526004016106e5906132dc565b60006118b683610d16565b9050806001600160a01b0316846001600160a01b031614806118f15750836001600160a01b03166118e6846106be565b6001600160a01b0316145b80611901575061190181856114b0565b949350505050565b826001600160a01b031661191c82610d16565b6001600160a01b0316146119425760405162461bcd60e51b81526004016106e5906135fd565b6001600160a01b0382166119685760405162461bcd60e51b81526004016106e590613230565b6119738383836123b7565b61197e6000826115b0565b6001600160a01b038316600090815260c9602052604090206119a090826123c2565b506001600160a01b038216600090815260c9602052604090206119c390826123ce565b506119d060ca82846123da565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000828152606560205260409020611a2f90826123f0565b15610b7d57611a3c6115ac565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610ba38383612405565b6000828152606560205260409020611aa4908261244a565b15610b7d57611ab16115ac565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60fb5460ff16611b175760405162461bcd60e51b81526004016106e590613004565b60fb805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611b4a6115ac565b604051611b579190612e73565b60405180910390a1565b6000808080611b70868661245f565b9097909650945050505050565b60006001600160a01b03821663b93f9b0a600b5b6040518263ffffffff1660e01b8152600401611bad9190612f0c565b60206040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba69190612aa3565b6000611c0a8484846124bb565b90505b9392505050565b6000611c20888661185f565b821015611c2f57506000610d52565b878711611c3d575084610d52565b6000808411611c4c5782611c56565b611c56848461251a565b90506000611c6e86611c68848d61219a565b90612530565b90506000611c8087611c688c8e61219a565b9050611c99611c9382611c688c86612572565b8a61251a565b9b9a5050505050505050505050565b60009081526101c660205260409020600181015490540390565b60fb5460ff1615611ce55760405162461bcd60e51b81526004016106e590613378565b60fb805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611b4a6115ac565b303b1590565b600054610100900460ff1680611d3a5750611d3a611d1b565b80611d48575060005460ff16155b611d645760405162461bcd60e51b81526004016106e5906135af565b600054610100900460ff16158015611d8f576000805460ff1961ff0019909116610100171660011790555b8015611da1576000805461ff00191690555b50565b600054610100900460ff1680611dbd5750611dbd611d1b565b80611dcb575060005460ff16155b611de75760405162461bcd60e51b81526004016106e5906135af565b600054610100900460ff16158015611e12576000805460ff1961ff0019909116610100171660011790555b611d8f6301ffc9a760e01b6125ac565b600054610100900460ff1680611e3b5750611e3b611d1b565b80611e49575060005460ff16155b611e655760405162461bcd60e51b81526004016106e5906135af565b600054610100900460ff16158015611e90576000805460ff1961ff0019909116610100171660011790555b8251611ea39060ce9060208601906129f4565b508151611eb79060cf9060208501906129f4565b50611ec86380ac58cd60e01b6125ac565b611ed8635b5e139f60e01b6125ac565b611ee863780e9d6360e01b6125ac565b801561079d576000805461ff0019169055505050565b600054610100900460ff1680611f175750611f17611d1b565b80611f25575060005460ff16155b611f415760405162461bcd60e51b81526004016106e5906135af565b600054610100900460ff16158015611f6c576000805460ff1961ff0019909116610100171660011790555b60fb805460ff191690558015611da1576000805461ff001916905550565b600054610100900460ff1680611fa35750611fa3611d1b565b80611fb1575060005460ff16155b611fcd5760405162461bcd60e51b81526004016106e5906135af565b600054610100900460ff16158015611ff8576000805460ff1961ff0019909116610100171660011790555b610191805460ff191660011790558015611da1576000805461ff001916905550565b60009182526065602052604090912060020155565b6000610ba3836001600160a01b0384166125fb565b6000610ba68242612613565b61205b848484611909565b6120678484848461262f565b6110875760405162461bcd60e51b81526004016106e59061307c565b6060816120a857506040805180820190915260018152600360fc1b6020820152610623565b8160005b81156120c057600101600a820491506120ac565b60608167ffffffffffffffff811180156120d957600080fd5b506040519080825280601f01601f191660200182016040528015612104576020820181803683370190505b50859350905060001982015b831561215557600a840660300160f81b8282806001900393508151811061213357fe5b60200101906001600160f81b031916908160001a905350600a84049350612110565b50949350505050565b6000610ba682612769565b611087846323b872dd60e01b85858560405160240161181193929190612ec4565b6000610ba383836125fb565b5490565b6000610ba383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612781565b80546001019055565b6001600160a01b03821661220b5760405162461bcd60e51b81526004016106e5906134b6565b6122148161159f565b156122315760405162461bcd60e51b81526004016106e590613134565b61223d600083836123b7565b6001600160a01b038216600090815260c96020526040902061225f90826123ce565b5061226c60ca82846123da565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6122bb826001600160a01b03166127ad565b6122d75760405162461bcd60e51b81526004016106e590613931565b60006060836001600160a01b0316836040516122f39190612dd6565b6000604051808303816000865af19150503d8060008114612330576040519150601f19603f3d011682016040523d82523d6000602084013e612335565b606091505b5091509150816123575760405162461bcd60e51b81526004016106e5906132a7565b80511561108757808060200190518101906123729190612cae565b6110875760405162461bcd60e51b81526004016106e590613805565b6000610ba383600201548460030154856000015486600401548760050154886006015488611c14565b61079d8383836127e6565b6000610ba38383612816565b6000610ba383836128dc565b6000611c0a84846001600160a01b038516612926565b6000610ba3836001600160a01b0384166128dc565b815460009082106124285760405162461bcd60e51b81526004016106e590612f28565b82600001828154811061243757fe5b9060005260206000200154905092915050565b6000610ba3836001600160a01b038416612816565b8154600090819083106124845760405162461bcd60e51b81526004016106e590613474565b600084600001848154811061249557fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816124eb5760405162461bcd60e51b81526004016106e59190612f15565b508460000160018203815481106124fe57fe5b9060005260206000209060020201600101549150509392505050565b60008183106125295781610ba3565b5090919050565b6000610ba383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506129bd565b60008261258157506000610ba6565b8282028284828161258e57fe5b0414610ba35760405162461bcd60e51b81526004016106e5906134eb565b6001600160e01b031980821614156125d65760405162461bcd60e51b81526004016106e5906130ce565b6001600160e01b0319166000908152609760205260409020805460ff19166001179055565b60009081526001919091016020526040902054151590565b6001820154600090610ba390612629858561238e565b9061219a565b6000612643846001600160a01b03166127ad565b61264f57506001611901565b600060606001600160a01b038616630a85bd0160e11b61266d6115ac565b8988886040516024016126839493929190612e87565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516126c19190612dd6565b6000604051808303816000865af19150503d80600081146126fe576040519150601f19603f3d011682016040523d82523d6000602084013e612703565b606091505b5091509150816127355780511561271d5780518082602001fd5b60405162461bcd60e51b81526004016106e59061307c565b60008180602001905181019061274b9190612d43565b6001600160e01b031916630a85bd0160e11b14935061190192505050565b60006001600160a01b03821663b93f9b0a6012611b91565b600081848411156127a55760405162461bcd60e51b81526004016106e59190612f15565b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611901575050151592915050565b6127f183838361079d565b6127f9610d0d565b1561079d5760405162461bcd60e51b81526004016106e590612f6a565b600081815260018301602052604081205480156128d2578354600019808301919081019060009087908390811061284957fe5b906000526020600020015490508087600001848154811061286657fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061289657fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610ba6565b6000915050610ba6565b60006128e883836125fb565b61291e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ba6565b506000610ba6565b60008281526001840160205260408120548061298b575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055611c0d565b8285600001600183038154811061299e57fe5b9060005260206000209060020201600101819055506000915050611c0d565b600081836129de5760405162461bcd60e51b81526004016106e59190612f15565b5060008385816129ea57fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612a3557805160ff1916838001178555612a62565b82800160010185558215612a62579182015b82811115612a62578251825591602001919060010190612a47565b50612a6e929150612a72565b5090565b5b80821115612a6e5760008155600101612a73565b600060208284031215612a98578081fd5b8135610ba381613ac2565b600060208284031215612ab4578081fd5b8151610ba381613ac2565b60008060408385031215612ad1578081fd5b8235612adc81613ac2565b91506020830135612aec81613ac2565b809150509250929050565b600080600060608486031215612b0b578081fd5b8335612b1681613ac2565b92506020840135612b2681613ac2565b929592945050506040919091013590565b60008060008060808587031215612b4c578081fd5b8435612b5781613ac2565b9350602085810135612b6881613ac2565b935060408601359250606086013567ffffffffffffffff80821115612b8b578384fd5b818801915088601f830112612b9e578384fd5b813581811115612bac578485fd5b604051601f8201601f1916810185018381118282101715612bcb578687fd5b60405281815283820185018b1015612be1578586fd5b81858501868301379081019093019390935250939692955090935050565b60008060408385031215612c11578182fd5b8235612c1c81613ac2565b91506020830135612aec81613ad7565b600080600060608486031215612b0b578283fd5b60008060408385031215612c52578182fd5b8235612c5d81613ac2565b946020939093013593505050565b600080600080600060a08688031215612c82578081fd5b8535612c8d81613ac2565b97602087013597506040870135966060810135965060800135945092505050565b600060208284031215612cbf578081fd5b8151610ba381613ad7565b600060208284031215612cdb578081fd5b5035919050565b60008060408385031215612cf4578182fd5b823591506020830135612aec81613ac2565b60008060408385031215612d18578182fd5b50508035926020909101359150565b600060208284031215612d38578081fd5b8135610ba381613ae5565b600060208284031215612d54578081fd5b8151610ba381613ae5565b600080600080600080600060e0888a031215612d79578485fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b60008151808452612dc2816020860160208601613a96565b601f01601f19169290920160200192915050565b60008251612de8818460208701613a96565b9190910192915050565b6000808454600180821660008114612e115760018114612e2857612e57565b60ff198316865260028304607f1686019350612e57565b600283048886526020808720875b83811015612e4f5781548a820152908501908201612e36565b505050860193505b5050508351612e6a818360208801613a96565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612eba90830184612daa565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b600060208252610ba36020830184612daa565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252602b908201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760408201526a1a1a5b19481c185d5cd95960aa1b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526e0818591b5a5b881d1bc819dc985b9d608a1b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252602a908201527f4f776e657220616e6420636f6e666967206164647265737365732063616e6e6f6040820152697420626520656d70747960b01b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b60208082526015908201527443616e6e6f74206c6f61642030207265776172647360581b604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b602080825260179082015276125b9d985b1a59081d995cdd1a5b99d25b9d195c9d985b604a1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252603e908201527f4552433732315072657365744d696e7465725061757365724175746f49643a2060408201527f6d75737420686176652070617573657220726f6c6520746f2070617573650000606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526030908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526f2061646d696e20746f207265766f6b6560801b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526016908201527511dc985b9d081a185cc8199d5b1b1e481d995cdd195960521b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776040820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601e908201527f4772616e74206e6f7420646566696e656420666f7220746f6b656e2069640000604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526031908201527f4d7573742068617665206469737472696275746f7220726f6c6520746f207065604082015270393337b936903a3434b99030b1ba34b7b760791b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600d908201526c1858d8d95cdcc819195b9a5959609a1b604082015260600190565b6020808252601e908201527f4772616e742068617320616c7265616479206265656e207265766f6b65640000604082015260600190565b60208082526015908201527410d85b9b9bdd0819dc985b9d080c08185b5bdd5b9d605a1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602d908201527f43616e6e6f74206772616e7420616d6f756e742064756520746f20696e73756660408201526c66696369656e742066756e647360981b606082015260800190565b602080825260409082018190527f4552433732315072657365744d696e7465725061757365724175746f49643a20908201527f6d75737420686176652070617573657220726f6c6520746f20756e7061757365606082015260800190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b6020808252602b908201527f4d75737420686176652061646d696e20726f6c6520746f20706572666f726d2060408201526a3a3434b99030b1ba34b7b760a91b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b60208082526029908201527f436c696666206c656e6774682063616e6e6f74206578636565642076657374696040820152680dcce40d8cadccee8d60bb1b606082015260800190565b93845260208401929092526040830152606082015260800190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b60005b83811015613ab1578181015183820152602001613a99565b838111156110875750506000910152565b6001600160a01b0381168114611da157600080fd5b8015158114611da157600080fd5b6001600160e01b031981168114611da157600080fdfefbd454f36a7e1a388bd6fc3ab10d434aa4578f811acbbcf33afb1c697486313cb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a476f6c6466696e636820563220436f6d6d756e697479205265776172647320546f6b656e73a2646970667358221220d618eaf2a019ef24bfc6e21f96fc8caed824e09af9878566968d73b34bfb921164736f6c634300060c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102c15760003560e01c806379502c551161017d578063b88d4fde116100d9578063d54a23d611610092578063d54a23d6146105ac578063e58378bb146105bf578063e63ab1e9146105c7578063e7a7250a146105cf578063e985e9c5146105d7578063f0bd87cc146105ea578063f62849be146105f2576102c1565b8063b88d4fde14610550578063c87b56dd14610563578063ca15c87314610576578063d1af0c7d14610589578063d539139314610591578063d547741f14610599576102c1565b806391d148541161013657806391d14854146104f757806395d89b411461050a5780639835fc7e1461051257806398bcede914610525578063a217fddf1461052d578063a22cb46514610535578063b6db75a014610548576102c1565b806379502c551461049b5780637d0781b4146104a35780638092a3b1146104b65780638456cb59146104c95780638f41ab16146104d15780639010d07c146104e4576102c1565b8063248a9ca31161022c5780634f6ccce7116101e55780634f6ccce7146104375780634f92a7281461044a5780635c975abb146104525780636352211e1461045a57806363b114721461046d5780636c0360eb1461048057806370a0823114610488576102c1565b8063248a9ca3146103d05780632f2ff15d146103e35780632f745c59146103f657806336568abe146104095780633f4ba83a1461041c57806342842e0e14610424576102c1565b806318160ddd1161027e57806318160ddd1461036757806318ce4d941461037c5780631c4b774b1461038f5780631d33267a146103a2578063205282e6146103b557806323b872dd146103bd576102c1565b806301ffc9a7146102c657806306fdde03146102ef578063081812fc14610304578063095ea7b3146103245780630997a514146103395780630c0debea14610341575b600080fd5b6102d96102d4366004612d27565b610605565b6040516102e69190612f01565b60405180910390f35b6102f7610628565b6040516102e69190612f15565b610317610312366004612cca565b6106be565b6040516102e69190612e73565b610337610332366004612c40565b61070a565b005b6102d96107a2565b61035461034f366004612cca565b6107c3565b6040516102e69796959493929190613a66565b61036f610801565b6040516102e69190612f0c565b61036f61038a366004612c6b565b61080d565b61033761039d366004612cca565b6108ab565b6103376103b0366004612cca565b6109ca565b61036f610ae5565b6103376103cb366004612af7565b610aec565b61036f6103de366004612cca565b610b24565b6103376103f1366004612ce2565b610b39565b61036f610404366004612c40565b610b81565b610337610417366004612ce2565b610bac565b610337610bee565b610337610432366004612af7565b610c2e565b61036f610445366004612cca565b610c49565b610337610c5f565b6102d9610d0d565b610317610468366004612cca565b610d16565b61036f61047b366004612d5f565b610d3e565b6102f7610d5d565b61036f610496366004612a87565b610dbe565b610317610e07565b6103376104b1366004612cca565b610e17565b61036f6104c4366004612cca565b610e41565b610337610e4c565b6103376104df366004612c2c565b610e8a565b6103176104f2366004612d06565b61108d565b6102d9610505366004612ce2565b6110a5565b6102f76110bd565b61036f610520366004612cca565b61111e565b61036f611136565b61036f61113d565b610337610543366004612bff565b611142565b6102d9611210565b61033761055e366004612b37565b61122c565b6102f7610571366004612cca565b611265565b61036f610584366004612cca565b6113af565b6103176113c6565b61036f6113df565b6103376105a7366004612ce2565b611403565b61036f6105ba366004612a87565b61143d565b61036f611485565b61036f611497565b61036f6114a9565b6102d96105e5366004612abf565b6114b0565b61036f6114de565b610337610600366004612cca565b6114f0565b6001600160e01b0319811660009081526097602052604090205460ff165b919050565b60ce8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106b45780601f10610689576101008083540402835291602001916106b4565b820191906000526020600020905b81548152906001019060200180831161069757829003601f168201915b5050505050905090565b60006106c98261159f565b6106ee5760405162461bcd60e51b81526004016106e590613563565b60405180910390fd5b50600090815260cc60205260409020546001600160a01b031690565b600061071582610d16565b9050806001600160a01b0316836001600160a01b031614156107495760405162461bcd60e51b81526004016106e5906136e6565b806001600160a01b031661075b6115ac565b6001600160a01b031614806107775750610777816105e56115ac565b6107935760405162461bcd60e51b81526004016106e5906133d2565b61079d83836115b0565b505050565b60006107be600080516020613afc8339815191526105056115ac565b905090565b6101c6602052600090815260409020805460018201546002830154600384015460048501546005860154600690960154949593949293919290919087565b60006107be60ca61161e565b6101915460009060ff166108335760405162461bcd60e51b81526004016106e59061384f565b610191805460ff1916905560fb5460ff16156108615760405162461bcd60e51b81526004016106e590613378565b6108696107a2565b6108855760405162461bcd60e51b81526004016106e590613695565b6108928686868686611629565b9050610191805460ff1916600117905595945050505050565b6101915460ff166108ce5760405162461bcd60e51b81526004016106e59061384f565b610191805460ff1916905560fb5460ff16156108fc5760405162461bcd60e51b81526004016106e590613378565b3361090682610d16565b6001600160a01b03161461092c5760405162461bcd60e51b81526004016106e590613778565b60006109378261111e565b905080156109b85760008281526101c66020526040902061095890826117d7565b61097533826109656113c6565b6001600160a01b031691906117f2565b81336001600160a01b03167fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f51836040516109af9190612f0c565b60405180910390a35b5050610191805460ff19166001179055565b60fb5460ff16156109ed5760405162461bcd60e51b81526004016106e590613378565b6109f5611210565b610a115760405162461bcd60e51b81526004016106e590613968565b60008181526101c6602052604090208054610a3e5760405162461bcd60e51b81526004016106e59061352c565b600681015415610a605760405162461bcd60e51b81526004016106e59061379f565b6000610a6c8242611848565b905060008111610a8e5760405162461bcd60e51b81526004016106e5906133a2565b6101c454610a9c908261185f565b6101c45542600683015560405183907f99b158d692e9c5440d29424d4441593c29ad41c52383617e45098ecb1fba2e0890610ad8908490612f0c565b60405180910390a2505050565b6101c55481565b610afd610af76115ac565b82611884565b610b195760405162461bcd60e51b81526004016106e590613727565b61079d838383611909565b60009081526065602052604090206002015490565b600082815260656020526040902060020154610b57906105056115ac565b610b735760405162461bcd60e51b81526004016106e590612fb5565b610b7d8282611a17565b5050565b6001600160a01b038216600090815260c960205260408120610ba39083611a80565b90505b92915050565b610bb46115ac565b6001600160a01b0316816001600160a01b031614610be45760405162461bcd60e51b81526004016106e5906139b3565b610b7d8282611a8c565b610c08600080516020613b658339815191526105056115ac565b610c245760405162461bcd60e51b81526004016106e5906138d3565b610c2c611af5565b565b61079d8383836040518060200160405280600081525061122c565b600080610c5760ca84611b61565b509392505050565b610c67611210565b610c835760405162461bcd60e51b81526004016106e590613968565b6101c354610c99906001600160a01b0316611b7d565b6101c380546001600160a01b0319166001600160a01b0392909216919091179055610cc26115ac565b6101c3546040516001600160a01b03928316927f7c76c17de59691df2ef36af3938c91f69cd18ad27f67a54a38e38686f0b40c4992610d0392911690612e73565b60405180910390a2565b60fb5460ff1690565b6000610ba682604051806060016040528060298152602001613b3c6029913960ca9190611bfd565b6000610d4f88888888888888611c14565b90505b979650505050505050565b60d18054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106b45780601f10610689576101008083540402835291602001916106b4565b60006001600160a01b038216610de65760405162461bcd60e51b81526004016106e59061342a565b6001600160a01b038216600090815260c960205260409020610ba69061161e565b6101c3546001600160a01b031681565b610e1f611210565b610e3b5760405162461bcd60e51b81526004016106e590613968565b6101c555565b6000610ba682611ca8565b610e66600080516020613b658339815191526105056115ac565b610e825760405162461bcd60e51b81526004016106e5906131d3565b610c2c611cc2565b600054610100900460ff1680610ea35750610ea3611d1b565b80610eb1575060005460ff16155b610ecd5760405162461bcd60e51b81526004016106e5906135af565b600054610100900460ff16158015610ef8576000805460ff1961ff0019909116610100171660011790555b6001600160a01b03841615801590610f1857506001600160a01b03831615155b610f345760405162461bcd60e51b81526004016106e590613032565b610f3c611d21565b610f44611da4565b610f87604051806060016040528060258152602001613b85602591396040518060400160405280600981526020016823a32496ab1916a1a960b91b815250611e22565b610f8f611d21565b610f97611d21565b610f9f611efe565b610fa7611f8a565b610fbf600080516020613b1c83398151915285610b73565b610fd7600080516020613b6583398151915285610b73565b610fef600080516020613afc83398151915285610b73565b611007600080516020613b1c8339815191528061201a565b61102d600080516020613b65833981519152600080516020613b1c83398151915261201a565b611053600080516020613afc833981519152600080516020613b1c83398151915261201a565b6101c58290556101c380546001600160a01b0319166001600160a01b0385161790558015611087576000805461ff00191690555b50505050565b6000828152606560205260408120610ba39083611a80565b6000828152606560205260408120610ba3908361202f565b60cf8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106b45780601f10610689576101008083540402835291602001916106b4565b60008181526101c660205260408120610ba690612044565b61015f5481565b600081565b61114a6115ac565b6001600160a01b0316826001600160a01b0316141561117b5760405162461bcd60e51b81526004016106e590613274565b8060cd60006111886115ac565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556111cc6115ac565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112049190612f01565b60405180910390a35050565b60006107be600080516020613b1c8339815191526105056115ac565b61123d6112376115ac565b83611884565b6112595760405162461bcd60e51b81526004016106e590613727565b61108784848484612050565b60606112708261159f565b61128c5760405162461bcd60e51b81526004016106e590613646565b600082815260d0602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156113215780601f106112f657610100808354040283529160200191611321565b820191906000526020600020905b81548152906001019060200180831161130457829003601f168201915b505060d1549394505050506002600019610100600184161502019091160461134a579050610623565b80511561137c5760d181604051602001611365929190612df2565b604051602081830303815290604052915050610623565b60d161138784612083565b604051602001611398929190612df2565b604051602081830303815290604052915050919050565b6000818152606560205260408120610ba69061161e565b6101c3546000906107be906001600160a01b031661215e565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b600082815260656020526040902060020154611421906105056115ac565b610be45760405162461bcd60e51b81526004016106e590613328565b600080805b61144b84610dbe565b81101561147e57600061145e8583610b81565b905061147361146c82611ca8565b849061185f565b925050600101611442565b5092915050565b600080516020613b1c83398151915281565b600080516020613b6583398151915281565b6101c45481565b6001600160a01b03918216600090815260cd6020908152604080832093909416825291909152205460ff1690565b600080516020613afc83398151915281565b6114f8611210565b6115145760405162461bcd60e51b81526004016106e590613968565b600081116115345760405162461bcd60e51b81526004016106e590613105565b6101c454611542908261185f565b6101c4556115653330836115546113c6565b6001600160a01b0316929190612169565b7fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d816040516115949190612f0c565b60405180910390a150565b6000610ba660ca8361218a565b3390565b600081815260cc6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906115e582610d16565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610ba682612196565b600080851161164a5760405162461bcd60e51b81526004016106e5906137d6565b8383111561166a5760405162461bcd60e51b81526004016106e590613a02565b6101c45485111561168d5760405162461bcd60e51b81526004016106e590613886565b838211156116ad5760405162461bcd60e51b81526004016106e59061316b565b816116b6578391505b6101c4546116c4908661219a565b6101c4556116d361015f6121dc565b6116de61015f612196565b90506040518060e00160405280868152602001600081526020016101c5548152602001611717866101c55461185f90919063ffffffff16565b815260208082018690526040808301869052600060609384018190528581526101c683528190208451815591840151600183015583015160028201559082015160038201556080820151600482015560a0820151600582015560c09091015160069091015561178686826121e5565b80866001600160a01b03167f13fce371c40438299d0ef0c6274292b9b9989523253a77f15706673efe5863b8878787876040516117c69493929190613a4b565b60405180910390a395945050505050565b60018201546117e6908261185f565b82600101819055505050565b61079d8363a9059cbb60e01b8484604051602401611811929190612ee8565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526122a9565b6000610ba3611857848461238e565b84549061219a565b600082820183811015610ba35760405162461bcd60e51b81526004016106e59061319c565b600061188f8261159f565b6118ab5760405162461bcd60e51b81526004016106e5906132dc565b60006118b683610d16565b9050806001600160a01b0316846001600160a01b031614806118f15750836001600160a01b03166118e6846106be565b6001600160a01b0316145b80611901575061190181856114b0565b949350505050565b826001600160a01b031661191c82610d16565b6001600160a01b0316146119425760405162461bcd60e51b81526004016106e5906135fd565b6001600160a01b0382166119685760405162461bcd60e51b81526004016106e590613230565b6119738383836123b7565b61197e6000826115b0565b6001600160a01b038316600090815260c9602052604090206119a090826123c2565b506001600160a01b038216600090815260c9602052604090206119c390826123ce565b506119d060ca82846123da565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000828152606560205260409020611a2f90826123f0565b15610b7d57611a3c6115ac565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610ba38383612405565b6000828152606560205260409020611aa4908261244a565b15610b7d57611ab16115ac565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60fb5460ff16611b175760405162461bcd60e51b81526004016106e590613004565b60fb805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611b4a6115ac565b604051611b579190612e73565b60405180910390a1565b6000808080611b70868661245f565b9097909650945050505050565b60006001600160a01b03821663b93f9b0a600b5b6040518263ffffffff1660e01b8152600401611bad9190612f0c565b60206040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba69190612aa3565b6000611c0a8484846124bb565b90505b9392505050565b6000611c20888661185f565b821015611c2f57506000610d52565b878711611c3d575084610d52565b6000808411611c4c5782611c56565b611c56848461251a565b90506000611c6e86611c68848d61219a565b90612530565b90506000611c8087611c688c8e61219a565b9050611c99611c9382611c688c86612572565b8a61251a565b9b9a5050505050505050505050565b60009081526101c660205260409020600181015490540390565b60fb5460ff1615611ce55760405162461bcd60e51b81526004016106e590613378565b60fb805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611b4a6115ac565b303b1590565b600054610100900460ff1680611d3a5750611d3a611d1b565b80611d48575060005460ff16155b611d645760405162461bcd60e51b81526004016106e5906135af565b600054610100900460ff16158015611d8f576000805460ff1961ff0019909116610100171660011790555b8015611da1576000805461ff00191690555b50565b600054610100900460ff1680611dbd5750611dbd611d1b565b80611dcb575060005460ff16155b611de75760405162461bcd60e51b81526004016106e5906135af565b600054610100900460ff16158015611e12576000805460ff1961ff0019909116610100171660011790555b611d8f6301ffc9a760e01b6125ac565b600054610100900460ff1680611e3b5750611e3b611d1b565b80611e49575060005460ff16155b611e655760405162461bcd60e51b81526004016106e5906135af565b600054610100900460ff16158015611e90576000805460ff1961ff0019909116610100171660011790555b8251611ea39060ce9060208601906129f4565b508151611eb79060cf9060208501906129f4565b50611ec86380ac58cd60e01b6125ac565b611ed8635b5e139f60e01b6125ac565b611ee863780e9d6360e01b6125ac565b801561079d576000805461ff0019169055505050565b600054610100900460ff1680611f175750611f17611d1b565b80611f25575060005460ff16155b611f415760405162461bcd60e51b81526004016106e5906135af565b600054610100900460ff16158015611f6c576000805460ff1961ff0019909116610100171660011790555b60fb805460ff191690558015611da1576000805461ff001916905550565b600054610100900460ff1680611fa35750611fa3611d1b565b80611fb1575060005460ff16155b611fcd5760405162461bcd60e51b81526004016106e5906135af565b600054610100900460ff16158015611ff8576000805460ff1961ff0019909116610100171660011790555b610191805460ff191660011790558015611da1576000805461ff001916905550565b60009182526065602052604090912060020155565b6000610ba3836001600160a01b0384166125fb565b6000610ba68242612613565b61205b848484611909565b6120678484848461262f565b6110875760405162461bcd60e51b81526004016106e59061307c565b6060816120a857506040805180820190915260018152600360fc1b6020820152610623565b8160005b81156120c057600101600a820491506120ac565b60608167ffffffffffffffff811180156120d957600080fd5b506040519080825280601f01601f191660200182016040528015612104576020820181803683370190505b50859350905060001982015b831561215557600a840660300160f81b8282806001900393508151811061213357fe5b60200101906001600160f81b031916908160001a905350600a84049350612110565b50949350505050565b6000610ba682612769565b611087846323b872dd60e01b85858560405160240161181193929190612ec4565b6000610ba383836125fb565b5490565b6000610ba383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612781565b80546001019055565b6001600160a01b03821661220b5760405162461bcd60e51b81526004016106e5906134b6565b6122148161159f565b156122315760405162461bcd60e51b81526004016106e590613134565b61223d600083836123b7565b6001600160a01b038216600090815260c96020526040902061225f90826123ce565b5061226c60ca82846123da565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6122bb826001600160a01b03166127ad565b6122d75760405162461bcd60e51b81526004016106e590613931565b60006060836001600160a01b0316836040516122f39190612dd6565b6000604051808303816000865af19150503d8060008114612330576040519150601f19603f3d011682016040523d82523d6000602084013e612335565b606091505b5091509150816123575760405162461bcd60e51b81526004016106e5906132a7565b80511561108757808060200190518101906123729190612cae565b6110875760405162461bcd60e51b81526004016106e590613805565b6000610ba383600201548460030154856000015486600401548760050154886006015488611c14565b61079d8383836127e6565b6000610ba38383612816565b6000610ba383836128dc565b6000611c0a84846001600160a01b038516612926565b6000610ba3836001600160a01b0384166128dc565b815460009082106124285760405162461bcd60e51b81526004016106e590612f28565b82600001828154811061243757fe5b9060005260206000200154905092915050565b6000610ba3836001600160a01b038416612816565b8154600090819083106124845760405162461bcd60e51b81526004016106e590613474565b600084600001848154811061249557fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816124eb5760405162461bcd60e51b81526004016106e59190612f15565b508460000160018203815481106124fe57fe5b9060005260206000209060020201600101549150509392505050565b60008183106125295781610ba3565b5090919050565b6000610ba383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506129bd565b60008261258157506000610ba6565b8282028284828161258e57fe5b0414610ba35760405162461bcd60e51b81526004016106e5906134eb565b6001600160e01b031980821614156125d65760405162461bcd60e51b81526004016106e5906130ce565b6001600160e01b0319166000908152609760205260409020805460ff19166001179055565b60009081526001919091016020526040902054151590565b6001820154600090610ba390612629858561238e565b9061219a565b6000612643846001600160a01b03166127ad565b61264f57506001611901565b600060606001600160a01b038616630a85bd0160e11b61266d6115ac565b8988886040516024016126839493929190612e87565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516126c19190612dd6565b6000604051808303816000865af19150503d80600081146126fe576040519150601f19603f3d011682016040523d82523d6000602084013e612703565b606091505b5091509150816127355780511561271d5780518082602001fd5b60405162461bcd60e51b81526004016106e59061307c565b60008180602001905181019061274b9190612d43565b6001600160e01b031916630a85bd0160e11b14935061190192505050565b60006001600160a01b03821663b93f9b0a6012611b91565b600081848411156127a55760405162461bcd60e51b81526004016106e59190612f15565b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611901575050151592915050565b6127f183838361079d565b6127f9610d0d565b1561079d5760405162461bcd60e51b81526004016106e590612f6a565b600081815260018301602052604081205480156128d2578354600019808301919081019060009087908390811061284957fe5b906000526020600020015490508087600001848154811061286657fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061289657fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610ba6565b6000915050610ba6565b60006128e883836125fb565b61291e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ba6565b506000610ba6565b60008281526001840160205260408120548061298b575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055611c0d565b8285600001600183038154811061299e57fe5b9060005260206000209060020201600101819055506000915050611c0d565b600081836129de5760405162461bcd60e51b81526004016106e59190612f15565b5060008385816129ea57fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612a3557805160ff1916838001178555612a62565b82800160010185558215612a62579182015b82811115612a62578251825591602001919060010190612a47565b50612a6e929150612a72565b5090565b5b80821115612a6e5760008155600101612a73565b600060208284031215612a98578081fd5b8135610ba381613ac2565b600060208284031215612ab4578081fd5b8151610ba381613ac2565b60008060408385031215612ad1578081fd5b8235612adc81613ac2565b91506020830135612aec81613ac2565b809150509250929050565b600080600060608486031215612b0b578081fd5b8335612b1681613ac2565b92506020840135612b2681613ac2565b929592945050506040919091013590565b60008060008060808587031215612b4c578081fd5b8435612b5781613ac2565b9350602085810135612b6881613ac2565b935060408601359250606086013567ffffffffffffffff80821115612b8b578384fd5b818801915088601f830112612b9e578384fd5b813581811115612bac578485fd5b604051601f8201601f1916810185018381118282101715612bcb578687fd5b60405281815283820185018b1015612be1578586fd5b81858501868301379081019093019390935250939692955090935050565b60008060408385031215612c11578182fd5b8235612c1c81613ac2565b91506020830135612aec81613ad7565b600080600060608486031215612b0b578283fd5b60008060408385031215612c52578182fd5b8235612c5d81613ac2565b946020939093013593505050565b600080600080600060a08688031215612c82578081fd5b8535612c8d81613ac2565b97602087013597506040870135966060810135965060800135945092505050565b600060208284031215612cbf578081fd5b8151610ba381613ad7565b600060208284031215612cdb578081fd5b5035919050565b60008060408385031215612cf4578182fd5b823591506020830135612aec81613ac2565b60008060408385031215612d18578182fd5b50508035926020909101359150565b600060208284031215612d38578081fd5b8135610ba381613ae5565b600060208284031215612d54578081fd5b8151610ba381613ae5565b600080600080600080600060e0888a031215612d79578485fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b60008151808452612dc2816020860160208601613a96565b601f01601f19169290920160200192915050565b60008251612de8818460208701613a96565b9190910192915050565b6000808454600180821660008114612e115760018114612e2857612e57565b60ff198316865260028304607f1686019350612e57565b600283048886526020808720875b83811015612e4f5781548a820152908501908201612e36565b505050860193505b5050508351612e6a818360208801613a96565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612eba90830184612daa565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b600060208252610ba36020830184612daa565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252602b908201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760408201526a1a1a5b19481c185d5cd95960aa1b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526e0818591b5a5b881d1bc819dc985b9d608a1b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252602a908201527f4f776e657220616e6420636f6e666967206164647265737365732063616e6e6f6040820152697420626520656d70747960b01b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b60208082526015908201527443616e6e6f74206c6f61642030207265776172647360581b604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b602080825260179082015276125b9d985b1a59081d995cdd1a5b99d25b9d195c9d985b604a1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252603e908201527f4552433732315072657365744d696e7465725061757365724175746f49643a2060408201527f6d75737420686176652070617573657220726f6c6520746f2070617573650000606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526030908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526f2061646d696e20746f207265766f6b6560801b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526016908201527511dc985b9d081a185cc8199d5b1b1e481d995cdd195960521b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776040820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601e908201527f4772616e74206e6f7420646566696e656420666f7220746f6b656e2069640000604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526031908201527f4d7573742068617665206469737472696275746f7220726f6c6520746f207065604082015270393337b936903a3434b99030b1ba34b7b760791b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600d908201526c1858d8d95cdcc819195b9a5959609a1b604082015260600190565b6020808252601e908201527f4772616e742068617320616c7265616479206265656e207265766f6b65640000604082015260600190565b60208082526015908201527410d85b9b9bdd0819dc985b9d080c08185b5bdd5b9d605a1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602d908201527f43616e6e6f74206772616e7420616d6f756e742064756520746f20696e73756660408201526c66696369656e742066756e647360981b606082015260800190565b602080825260409082018190527f4552433732315072657365744d696e7465725061757365724175746f49643a20908201527f6d75737420686176652070617573657220726f6c6520746f20756e7061757365606082015260800190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b6020808252602b908201527f4d75737420686176652061646d696e20726f6c6520746f20706572666f726d2060408201526a3a3434b99030b1ba34b7b760a91b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b60208082526029908201527f436c696666206c656e6774682063616e6e6f74206578636565642076657374696040820152680dcce40d8cadccee8d60bb1b606082015260800190565b93845260208401929092526040830152606082015260800190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b60005b83811015613ab1578181015183820152602001613a99565b838111156110875750506000910152565b6001600160a01b0381168114611da157600080fd5b8015158114611da157600080fd5b6001600160e01b031981168114611da157600080fdfefbd454f36a7e1a388bd6fc3ab10d434aa4578f811acbbcf33afb1c697486313cb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a476f6c6466696e636820563220436f6d6d756e697479205265776172647320546f6b656e73a2646970667358221220d618eaf2a019ef24bfc6e21f96fc8caed824e09af9878566968d73b34bfb921164736f6c634300060c0033

Block Age Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Age Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Age Amount
View All Withdrawals

Transaction Hash Block Age Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.