Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 128 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 20506769 | 37 days ago | IN | 0 ETH | 0.00014256 | ||||
Transfer | 20506756 | 37 days ago | IN | 0 ETH | 0.00020482 | ||||
Transfer | 19890367 | 123 days ago | IN | 0 ETH | 0.00062062 | ||||
Transfer | 19880286 | 124 days ago | IN | 0 ETH | 0.00023871 | ||||
Transfer | 19848410 | 129 days ago | IN | 0 ETH | 0.00025483 | ||||
Approve | 19616423 | 161 days ago | IN | 0 ETH | 0.00091657 | ||||
Approve | 19616325 | 161 days ago | IN | 0 ETH | 0.00101734 | ||||
Transfer | 19572108 | 167 days ago | IN | 0 ETH | 0.0013138 | ||||
Transfer | 19555408 | 170 days ago | IN | 0 ETH | 0.00149736 | ||||
Transfer | 19519247 | 175 days ago | IN | 0 ETH | 0.00400905 | ||||
Transfer | 19514709 | 176 days ago | IN | 0 ETH | 0.00138604 | ||||
Transfer | 19514660 | 176 days ago | IN | 0 ETH | 0.00151367 | ||||
Transfer | 19514295 | 176 days ago | IN | 0 ETH | 0.00200513 | ||||
Transfer | 19514214 | 176 days ago | IN | 0 ETH | 0.00193978 | ||||
Transfer From | 19494238 | 178 days ago | IN | 0 ETH | 0.00149859 | ||||
Approve | 19494213 | 178 days ago | IN | 0 ETH | 0.00102055 | ||||
Transfer | 19491307 | 179 days ago | IN | 0 ETH | 0.00160325 | ||||
Transfer | 19477465 | 181 days ago | IN | 0 ETH | 0.00248323 | ||||
Transfer | 19471037 | 182 days ago | IN | 0 ETH | 0.00237096 | ||||
Set Exit Fee | 19470951 | 182 days ago | IN | 0 ETH | 0.00095567 | ||||
Set Entry Fee | 19470950 | 182 days ago | IN | 0 ETH | 0.00098858 | ||||
Transfer | 19470017 | 182 days ago | IN | 0 ETH | 0.00274182 | ||||
Transfer | 19434547 | 187 days ago | IN | 0 ETH | 0.00326398 | ||||
Approve | 19011829 | 246 days ago | IN | 0 ETH | 0.00085171 | ||||
Approve | 16138443 | 649 days ago | IN | 0 ETH | 0.00063505 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BPC
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-06 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/utils/introspection/IERC1820Registry.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC1820Registry.sol) pragma solidity ^0.8.0; /** * @dev Interface of the global ERC1820 Registry, as defined in the * https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register * implementers for interfaces in this registry, as well as query support. * * Implementers may be shared by multiple accounts, and can also implement more * than a single interface for each account. Contracts can implement interfaces * for themselves, but externally-owned accounts (EOA) must delegate this to a * contract. * * {IERC165} interfaces can also be queried via the registry. * * For an in-depth explanation and source code analysis, see the EIP text. */ interface IERC1820Registry { /** * @dev Sets `newManager` as the manager for `account`. A manager of an * account is able to set interface implementers for it. * * By default, each account is its own manager. Passing a value of `0x0` in * `newManager` will reset the manager to this initial state. * * Emits a {ManagerChanged} event. * * Requirements: * * - the caller must be the current manager for `account`. */ function setManager(address account, address newManager) external; /** * @dev Returns the manager for `account`. * * See {setManager}. */ function getManager(address account) external view returns (address); /** * @dev Sets the `implementer` contract as ``account``'s implementer for * `interfaceHash`. * * `account` being the zero address is an alias for the caller's address. * The zero address can also be used in `implementer` to remove an old one. * * See {interfaceHash} to learn how these are created. * * Emits an {InterfaceImplementerSet} event. * * Requirements: * * - the caller must be the current manager for `account`. * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not * end in 28 zeroes). * - `implementer` must implement {IERC1820Implementer} and return true when * queried for support, unless `implementer` is the caller. See * {IERC1820Implementer-canImplementInterfaceForAddress}. */ function setInterfaceImplementer( address account, bytes32 _interfaceHash, address implementer ) external; /** * @dev Returns the implementer of `interfaceHash` for `account`. If no such * implementer is registered, returns the zero address. * * If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28 * zeroes), `account` will be queried for support of it. * * `account` being the zero address is an alias for the caller's address. */ function getInterfaceImplementer(address account, bytes32 _interfaceHash) external view returns (address); /** * @dev Returns the interface hash for an `interfaceName`, as defined in the * corresponding * https://eips.ethereum.org/EIPS/eip-1820#interface-name[section of the EIP]. */ function interfaceHash(string calldata interfaceName) external pure returns (bytes32); /** * @notice Updates the cache with whether the contract implements an ERC165 interface or not. * @param account Address of the contract for which to update the cache. * @param interfaceId ERC165 interface for which to update the cache. */ function updateERC165Cache(address account, bytes4 interfaceId) external; /** * @notice Checks whether a contract implements an ERC165 interface or not. * If the result is not cached a direct lookup on the contract address is performed. * If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling * {updateERC165Cache} with the contract address. * @param account Address of the contract to check. * @param interfaceId ERC165 interface to check. * @return True if `account` implements `interfaceId`, false otherwise. */ function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool); /** * @notice Checks whether a contract implements an ERC165 interface or not without using nor updating the cache. * @param account Address of the contract to check. * @param interfaceId ERC165 interface to check. * @return True if `account` implements `interfaceId`, false otherwise. */ function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool); event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer); event ManagerChanged(address indexed account, address indexed newManager); } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @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) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface 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); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC777/IERC777Sender.sol // OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Sender.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC777TokensSender standard as defined in the EIP. * * {IERC777} Token holders can be notified of operations performed on their * tokens by having a contract implement this interface (contract holders can be * their own implementer) and registering it on the * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry]. * * See {IERC1820Registry} and {ERC1820Implementer}. */ interface IERC777Sender { /** * @dev Called by an {IERC777} token contract whenever a registered holder's * (`from`) tokens are about to be moved or destroyed. The type of operation * is conveyed by `to` being the zero address or not. * * This call occurs _before_ the token contract's state is updated, so * {IERC777-balanceOf}, etc., can be used to query the pre-operation state. * * This function may revert to prevent the operation from being executed. */ function tokensToSend( address operator, address from, address to, uint256 amount, bytes calldata userData, bytes calldata operatorData ) external; } // File: @openzeppelin/contracts/token/ERC777/IERC777Recipient.sol // OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP. * * Accounts can be notified of {IERC777} tokens being sent to them by having a * contract implement this interface (contract holders can be their own * implementer) and registering it on the * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry]. * * See {IERC1820Registry} and {ERC1820Implementer}. */ interface IERC777Recipient { /** * @dev Called by an {IERC777} token contract whenever tokens are being * moved or created into a registered account (`to`). The type of operation * is conveyed by `from` being the zero address or not. * * This call occurs _after_ the token contract's state is updated, so * {IERC777-balanceOf}, etc., can be used to query the post-operation state. * * This function may revert to prevent the operation from being executed. */ function tokensReceived( address operator, address from, address to, uint256 amount, bytes calldata userData, bytes calldata operatorData ) external; } // File: @openzeppelin/contracts/token/ERC777/IERC777.sol // OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC777Token standard as defined in the EIP. * * This contract uses the * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 registry standard] to let * token holders and recipients react to token movements by using setting implementers * for the associated interfaces in said registry. See {IERC1820Registry} and * {ERC1820Implementer}. */ interface IERC777 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() external view returns (string memory); /** * @dev Returns the smallest part of the token that is not divisible. This * means all token operations (creation, movement and destruction) must have * amounts that are a multiple of this number. * * For most token contracts, this value will equal 1. */ function granularity() external view returns (uint256); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by an account (`owner`). */ function balanceOf(address owner) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * If send or receive hooks are registered for the caller and `recipient`, * the corresponding functions will be called with `data` and empty * `operatorData`. See {IERC777Sender} and {IERC777Recipient}. * * Emits a {Sent} event. * * Requirements * * - the caller must have at least `amount` tokens. * - `recipient` cannot be the zero address. * - if `recipient` is a contract, it must implement the {IERC777Recipient} * interface. */ function send( address recipient, uint256 amount, bytes calldata data ) external; /** * @dev Destroys `amount` tokens from the caller's account, reducing the * total supply. * * If a send hook is registered for the caller, the corresponding function * will be called with `data` and empty `operatorData`. See {IERC777Sender}. * * Emits a {Burned} event. * * Requirements * * - the caller must have at least `amount` tokens. */ function burn(uint256 amount, bytes calldata data) external; /** * @dev Returns true if an account is an operator of `tokenHolder`. * Operators can send and burn tokens on behalf of their owners. All * accounts are their own operator. * * See {operatorSend} and {operatorBurn}. */ function isOperatorFor(address operator, address tokenHolder) external view returns (bool); /** * @dev Make an account an operator of the caller. * * See {isOperatorFor}. * * Emits an {AuthorizedOperator} event. * * Requirements * * - `operator` cannot be calling address. */ function authorizeOperator(address operator) external; /** * @dev Revoke an account's operator status for the caller. * * See {isOperatorFor} and {defaultOperators}. * * Emits a {RevokedOperator} event. * * Requirements * * - `operator` cannot be calling address. */ function revokeOperator(address operator) external; /** * @dev Returns the list of default operators. These accounts are operators * for all token holders, even if {authorizeOperator} was never called on * them. * * This list is immutable, but individual holders may revoke these via * {revokeOperator}, in which case {isOperatorFor} will return false. */ function defaultOperators() external view returns (address[] memory); /** * @dev Moves `amount` tokens from `sender` to `recipient`. The caller must * be an operator of `sender`. * * If send or receive hooks are registered for `sender` and `recipient`, * the corresponding functions will be called with `data` and * `operatorData`. See {IERC777Sender} and {IERC777Recipient}. * * Emits a {Sent} event. * * Requirements * * - `sender` cannot be the zero address. * - `sender` must have at least `amount` tokens. * - the caller must be an operator for `sender`. * - `recipient` cannot be the zero address. * - if `recipient` is a contract, it must implement the {IERC777Recipient} * interface. */ function operatorSend( address sender, address recipient, uint256 amount, bytes calldata data, bytes calldata operatorData ) external; /** * @dev Destroys `amount` tokens from `account`, reducing the total supply. * The caller must be an operator of `account`. * * If a send hook is registered for `account`, the corresponding function * will be called with `data` and `operatorData`. See {IERC777Sender}. * * Emits a {Burned} event. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. * - the caller must be an operator for `account`. */ function operatorBurn( address account, uint256 amount, bytes calldata data, bytes calldata operatorData ) external; event Sent( address indexed operator, address indexed from, address indexed to, uint256 amount, bytes data, bytes operatorData ); event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData); event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData); event AuthorizedOperator(address indexed operator, address indexed tokenHolder); event RevokedOperator(address indexed operator, address indexed tokenHolder); } // File: @openzeppelin/contracts/token/ERC777/ERC777.sol // OpenZeppelin Contracts v4.4.1 (token/ERC777/ERC777.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC777} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * * Support for ERC20 is included in this contract, as specified by the EIP: both * the ERC777 and ERC20 interfaces can be safely used when interacting with it. * Both {IERC777-Sent} and {IERC20-Transfer} events are emitted on token * movements. * * Additionally, the {IERC777-granularity} value is hard-coded to `1`, meaning that there * are no special restrictions in the amount of tokens that created, moved, or * destroyed. This makes integration with ERC20 applications seamless. */ contract ERC777 is Context, IERC777, IERC20 { using Address for address; IERC1820Registry internal constant _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24); mapping(address => uint256) private _balances; uint256 private _totalSupply; string private _name; string private _symbol; bytes32 private constant _TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender"); bytes32 private constant _TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient"); // This isn't ever read from - it's only used to respond to the defaultOperators query. address[] private _defaultOperatorsArray; // Immutable, but accounts may revoke them (tracked in __revokedDefaultOperators). mapping(address => bool) private _defaultOperators; // For each account, a mapping of its operators and revoked default operators. mapping(address => mapping(address => bool)) private _operators; mapping(address => mapping(address => bool)) private _revokedDefaultOperators; // ERC20-allowances mapping(address => mapping(address => uint256)) private _allowances; /** * @dev `defaultOperators` may be an empty array. */ constructor( string memory name_, string memory symbol_, address[] memory defaultOperators_ ) { _name = name_; _symbol = symbol_; _defaultOperatorsArray = defaultOperators_; for (uint256 i = 0; i < defaultOperators_.length; i++) { _defaultOperators[defaultOperators_[i]] = true; } // register interfaces _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC777Token"), address(this)); _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC20Token"), address(this)); } /** * @dev See {IERC777-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC777-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {ERC20-decimals}. * * Always returns 18, as per the * [ERC777 EIP](https://eips.ethereum.org/EIPS/eip-777#backward-compatibility). */ function decimals() public pure virtual returns (uint8) { return 18; } /** * @dev See {IERC777-granularity}. * * This implementation always returns `1`. */ function granularity() public view virtual override returns (uint256) { return 1; } /** * @dev See {IERC777-totalSupply}. */ function totalSupply() public view virtual override(IERC20, IERC777) returns (uint256) { return _totalSupply; } /** * @dev Returns the amount of tokens owned by an account (`tokenHolder`). */ function balanceOf(address tokenHolder) public view virtual override(IERC20, IERC777) returns (uint256) { return _balances[tokenHolder]; } /** * @dev See {IERC777-send}. * * Also emits a {IERC20-Transfer} event for ERC20 compatibility. */ function send( address recipient, uint256 amount, bytes memory data ) public virtual override { _send(_msgSender(), recipient, amount, data, "", true); } /** * @dev See {IERC20-transfer}. * * Unlike `send`, `recipient` is _not_ required to implement the {IERC777Recipient} * interface if it is a contract. * * Also emits a {Sent} event. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { require(recipient != address(0), "ERC777: transfer to the zero address"); address from = _msgSender(); _callTokensToSend(from, from, recipient, amount, "", ""); _move(from, from, recipient, amount, "", ""); _callTokensReceived(from, from, recipient, amount, "", "", false); return true; } /** * @dev See {IERC777-burn}. * * Also emits a {IERC20-Transfer} event for ERC20 compatibility. */ function burn(uint256 amount, bytes memory data) public virtual override { _burn(_msgSender(), amount, data, ""); } /** * @dev See {IERC777-isOperatorFor}. */ function isOperatorFor(address operator, address tokenHolder) public view virtual override returns (bool) { return operator == tokenHolder || (_defaultOperators[operator] && !_revokedDefaultOperators[tokenHolder][operator]) || _operators[tokenHolder][operator]; } /** * @dev See {IERC777-authorizeOperator}. */ function authorizeOperator(address operator) public virtual override { require(_msgSender() != operator, "ERC777: authorizing self as operator"); if (_defaultOperators[operator]) { delete _revokedDefaultOperators[_msgSender()][operator]; } else { _operators[_msgSender()][operator] = true; } emit AuthorizedOperator(operator, _msgSender()); } /** * @dev See {IERC777-revokeOperator}. */ function revokeOperator(address operator) public virtual override { require(operator != _msgSender(), "ERC777: revoking self as operator"); if (_defaultOperators[operator]) { _revokedDefaultOperators[_msgSender()][operator] = true; } else { delete _operators[_msgSender()][operator]; } emit RevokedOperator(operator, _msgSender()); } /** * @dev See {IERC777-defaultOperators}. */ function defaultOperators() public view virtual override returns (address[] memory) { return _defaultOperatorsArray; } /** * @dev See {IERC777-operatorSend}. * * Emits {Sent} and {IERC20-Transfer} events. */ function operatorSend( address sender, address recipient, uint256 amount, bytes memory data, bytes memory operatorData ) public virtual override { require(isOperatorFor(_msgSender(), sender), "ERC777: caller is not an operator for holder"); _send(sender, recipient, amount, data, operatorData, true); } /** * @dev See {IERC777-operatorBurn}. * * Emits {Burned} and {IERC20-Transfer} events. */ function operatorBurn( address account, uint256 amount, bytes memory data, bytes memory operatorData ) public virtual override { require(isOperatorFor(_msgSender(), account), "ERC777: caller is not an operator for holder"); _burn(account, amount, data, operatorData); } /** * @dev See {IERC20-allowance}. * * Note that operator and allowance concepts are orthogonal: operators may * not have allowance, and accounts with allowance may not be operators * themselves. */ function allowance(address holder, address spender) public view virtual override returns (uint256) { return _allowances[holder][spender]; } /** * @dev See {IERC20-approve}. * * Note that accounts cannot have allowance issued by their operators. */ function approve(address spender, uint256 value) public virtual override returns (bool) { address holder = _msgSender(); _approve(holder, spender, value); return true; } /** * @dev See {IERC20-transferFrom}. * * Note that operator and allowance concepts are orthogonal: operators cannot * call `transferFrom` (unless they have allowance), and accounts with * allowance cannot call `operatorSend` (unless they are operators). * * Emits {Sent}, {IERC20-Transfer} and {IERC20-Approval} events. */ function transferFrom( address holder, address recipient, uint256 amount ) public virtual override returns (bool) { require(recipient != address(0), "ERC777: transfer to the zero address"); require(holder != address(0), "ERC777: transfer from the zero address"); address spender = _msgSender(); _callTokensToSend(spender, holder, recipient, amount, "", ""); _move(spender, holder, recipient, amount, "", ""); uint256 currentAllowance = _allowances[holder][spender]; require(currentAllowance >= amount, "ERC777: transfer amount exceeds allowance"); _approve(holder, spender, currentAllowance - amount); _callTokensReceived(spender, holder, recipient, amount, "", "", false); return true; } /** * @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * If a send hook is registered for `account`, the corresponding function * will be called with `operator`, `data` and `operatorData`. * * See {IERC777Sender} and {IERC777Recipient}. * * Emits {Minted} and {IERC20-Transfer} events. * * Requirements * * - `account` cannot be the zero address. * - if `account` is a contract, it must implement the {IERC777Recipient} * interface. */ function _mint( address account, uint256 amount, bytes memory userData, bytes memory operatorData ) internal virtual { _mint(account, amount, userData, operatorData, true); } /** * @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * If `requireReceptionAck` is set to true, and if a send hook is * registered for `account`, the corresponding function will be called with * `operator`, `data` and `operatorData`. * * See {IERC777Sender} and {IERC777Recipient}. * * Emits {Minted} and {IERC20-Transfer} events. * * Requirements * * - `account` cannot be the zero address. * - if `account` is a contract, it must implement the {IERC777Recipient} * interface. */ function _mint( address account, uint256 amount, bytes memory userData, bytes memory operatorData, bool requireReceptionAck ) internal virtual { require(account != address(0), "ERC777: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, amount); // Update state variables _totalSupply += amount; _balances[account] += amount; _callTokensReceived(operator, address(0), account, amount, userData, operatorData, requireReceptionAck); emit Minted(operator, account, amount, userData, operatorData); emit Transfer(address(0), account, amount); } /** * @dev Send tokens * @param from address token holder address * @param to address recipient address * @param amount uint256 amount of tokens to transfer * @param userData bytes extra information provided by the token holder (if any) * @param operatorData bytes extra information provided by the operator (if any) * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient */ function _send( address from, address to, uint256 amount, bytes memory userData, bytes memory operatorData, bool requireReceptionAck ) internal virtual { require(from != address(0), "ERC777: send from the zero address"); require(to != address(0), "ERC777: send to the zero address"); address operator = _msgSender(); _callTokensToSend(operator, from, to, amount, userData, operatorData); _move(operator, from, to, amount, userData, operatorData); _callTokensReceived(operator, from, to, amount, userData, operatorData, requireReceptionAck); } /** * @dev Burn tokens * @param from address token holder address * @param amount uint256 amount of tokens to burn * @param data bytes extra information provided by the token holder * @param operatorData bytes extra information provided by the operator (if any) */ function _burn( address from, uint256 amount, bytes memory data, bytes memory operatorData ) internal virtual { require(from != address(0), "ERC777: burn from the zero address"); address operator = _msgSender(); _callTokensToSend(operator, from, address(0), amount, data, operatorData); _beforeTokenTransfer(operator, from, address(0), amount); // Update state variables uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC777: burn amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _totalSupply -= amount; emit Burned(operator, from, amount, data, operatorData); emit Transfer(from, address(0), amount); } function _move( address operator, address from, address to, uint256 amount, bytes memory userData, bytes memory operatorData ) private { _beforeTokenTransfer(operator, from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC777: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Sent(operator, from, to, amount, userData, operatorData); emit Transfer(from, to, amount); } /** * @dev See {ERC20-_approve}. * * Note that accounts cannot have allowance issued by their operators. */ function _approve( address holder, address spender, uint256 value ) internal { require(holder != address(0), "ERC777: approve from the zero address"); require(spender != address(0), "ERC777: approve to the zero address"); _allowances[holder][spender] = value; emit Approval(holder, spender, value); } /** * @dev Call from.tokensToSend() if the interface is registered * @param operator address operator requesting the transfer * @param from address token holder address * @param to address recipient address * @param amount uint256 amount of tokens to transfer * @param userData bytes extra information provided by the token holder (if any) * @param operatorData bytes extra information provided by the operator (if any) */ function _callTokensToSend( address operator, address from, address to, uint256 amount, bytes memory userData, bytes memory operatorData ) private { address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(from, _TOKENS_SENDER_INTERFACE_HASH); if (implementer != address(0)) { IERC777Sender(implementer).tokensToSend(operator, from, to, amount, userData, operatorData); } } /** * @dev Call to.tokensReceived() if the interface is registered. Reverts if the recipient is a contract but * tokensReceived() was not registered for the recipient * @param operator address operator requesting the transfer * @param from address token holder address * @param to address recipient address * @param amount uint256 amount of tokens to transfer * @param userData bytes extra information provided by the token holder (if any) * @param operatorData bytes extra information provided by the operator (if any) * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient */ function _callTokensReceived( address operator, address from, address to, uint256 amount, bytes memory userData, bytes memory operatorData, bool requireReceptionAck ) private { address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(to, _TOKENS_RECIPIENT_INTERFACE_HASH); if (implementer != address(0)) { IERC777Recipient(implementer).tokensReceived(operator, from, to, amount, userData, operatorData); } else if (requireReceptionAck) { require(!to.isContract(), "ERC777: token recipient contract has no implementer for ERC777TokensRecipient"); } } /** * @dev Hook that is called before any token transfer. This includes * calls to {send}, {transfer}, {operatorSend}, minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256 amount ) internal virtual {} } // File: contracts/BPC-TOKEN/BPC/BPC.sol pragma solidity 0.8.10; contract BPC is ERC777, AccessControl, ReentrancyGuard { using SafeMath for uint256; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); uint256 private constant m_tokens_per_eth = 100; address private m_company_account; uint256 private m_entry_fee; uint256 private m_exit_fee; uint256 private m_max_supply; constructor( string memory _name, string memory _symbol, address[] memory _default_operators, uint256 _max_supply, uint256 _initial_supply, uint256 _entry_fee, uint256 _exit_fee, address _managing_account, address _company_account ) ERC777(_name, _symbol, _default_operators) { _grantRole(DEFAULT_ADMIN_ROLE, _managing_account); _grantRole(MINTER_ROLE, _company_account); m_max_supply = _max_supply; _mint(_company_account, _initial_supply, "", "", false); m_company_account = _company_account; m_entry_fee = _entry_fee; m_exit_fee = _exit_fee; } function mint(uint256 amount) public onlyRole(MINTER_ROLE) { require( totalSupply().add(amount) <= m_max_supply, "Amount that is about to be minted reaches the Max Supply" ); _mint(msg.sender, amount, bytes(""), bytes(""), false); } //burn and operatorBurn of ERC777 make all required checks and update _totalSupply that holds current Tokens qty //no need to override those funcs function fromEtherToTokens() public payable { uint256 tokens_to_buy = msg.value * m_tokens_per_eth; uint256 company_token_balance = this.balanceOf(m_company_account); require( tokens_to_buy > 0, "You need to send some more ether, what you provide is not enough for transaction" ); require( tokens_to_buy <= company_token_balance, "Not enough tokens in the reserve" ); uint256 updated_value = getEntryFeeValue(tokens_to_buy); _send( m_company_account, msg.sender, updated_value, bytes(""), bytes(""), false ); } function fromTokensToEther(uint256 tokens_to_sell) public nonReentrant { require(tokens_to_sell > 0, "You need to sell at least some tokens"); // Check that the user's token balance is enough to do the swap uint256 user_token_balance = this.balanceOf(msg.sender); require( user_token_balance >= tokens_to_sell, "Your balance is lower than the amount of tokens you want to sell" ); uint256 updated_value = getExitFeeValue(tokens_to_sell); uint256 eth_to_transfer = updated_value / m_tokens_per_eth; uint256 company_eth_balance = address(this).balance; require( company_eth_balance >= eth_to_transfer, "BPC Owner doesn't have enough funds to accept this sell request" ); _send( msg.sender, m_company_account, tokens_to_sell, bytes(""), bytes(""), false ); payable(msg.sender).transfer(eth_to_transfer); } function getTokenPrice() public view returns (uint256) { return m_tokens_per_eth; } function getEntryFee() public view returns (uint256) { return m_entry_fee; } function getExitFee() public view returns (uint256) { return m_exit_fee; } function setEntryFee(uint256 fee) public onlyRole(DEFAULT_ADMIN_ROLE) { require( fee >= 0 && fee <= 100, "Fee must be an integer percentage, ie 42" ); m_entry_fee = fee; } function setExitFee(uint256 fee) public onlyRole(DEFAULT_ADMIN_ROLE) { require( fee >= 0 && fee <= 100, "Fee must be an integer percentage, ie 42" ); m_exit_fee = fee; } function getEntryFeeValue(uint256 value) private view returns (uint256) { if (m_entry_fee != 0) { uint256 fee_value = (m_entry_fee * value) / 100; uint256 updated_value = value - fee_value; return updated_value; } else { return value; } } function getExitFeeValue(uint256 value) private view returns (uint256) { if (m_exit_fee != 0) { uint256 fee_value = (m_exit_fee * value) / 100; uint256 updated_value = value - fee_value; return updated_value; } else { return value; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address[]","name":"_default_operators","type":"address[]"},{"internalType":"uint256","name":"_max_supply","type":"uint256"},{"internalType":"uint256","name":"_initial_supply","type":"uint256"},{"internalType":"uint256","name":"_entry_fee","type":"uint256"},{"internalType":"uint256","name":"_exit_fee","type":"uint256"},{"internalType":"address","name":"_managing_account","type":"address"},{"internalType":"address","name":"_company_account","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"AuthorizedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"RevokedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_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":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"authorizeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"defaultOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fromEtherToTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens_to_sell","type":"uint256"}],"name":"fromTokensToEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getEntryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExitFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"granularity","outputs":[{"internalType":"uint256","name":"","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"isOperatorFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"revokeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setEntryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setExitFee","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620034323803806200343283398101604081905262000034916200094b565b88888882600290805190602001906200004f929190620006b3565b50815162000065906003906020850190620006b3565b5080516200007b90600490602084019062000742565b5060005b8151811015620000eb57600160056000848481518110620000a457620000a462000a29565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580620000e28162000a55565b9150506200007f565b506040516329965a1d60e01b815230600482018190527fac7fbab5f54a3ca8194167523c6753bfeb96a445279294b6125b68cce217705460248301526044820152731820a4b7618bde71dce8cdc73aab6c95905fad24906329965a1d90606401600060405180830381600087803b1580156200016657600080fd5b505af11580156200017b573d6000803e3d6000fd5b50506040516329965a1d60e01b815230600482018190527faea199e31a596269b42cdafd93407f14436db6e4cad65417994c2eb37381e05a60248301526044820152731820a4b7618bde71dce8cdc73aab6c95905fad2492506329965a1d9150606401600060405180830381600087803b158015620001f957600080fd5b505af11580156200020e573d6000803e3d6000fd5b50506001600a55506200022a93506000925085915050620002c7565b620002567f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a682620002c7565b85600e81905550620002918186604051806020016040528060008152506040518060200160405280600081525060006200036c60201b60201c565b600b80546001600160a01b0319166001600160a01b039290921691909117905550600c91909155600d555062000bb59350505050565b60008281526009602090815260408083206001600160a01b038516845290915290205460ff16620003685760008281526009602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620003273390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6001600160a01b038516620003c85760405162461bcd60e51b815260206004820181905260248201527f4552433737373a206d696e7420746f20746865207a65726f206164647265737360448201526064015b60405180910390fd5b60003390508460016000828254620003e1919062000a73565b90915550506001600160a01b038616600090815260208190526040812080548792906200041090849062000a73565b909155506200042890508160008888888888620004c8565b856001600160a01b0316816001600160a01b03167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d878787604051620004719392919062000abc565b60405180910390a36040518581526001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050565b50505050565b60405163555ddc6560e11b81526001600160a01b03861660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6024820152600090731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca90604401602060405180830381865afa1580156200054a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000570919062000af5565b90506001600160a01b03811615620005f2576040516223de2960e01b81526001600160a01b038216906223de2990620005b8908b908b908b908b908b908b9060040162000b1a565b600060405180830381600087803b158015620005d357600080fd5b505af1158015620005e8573d6000803e3d6000fd5b50505050620006a3565b8115620006a35762000618866001600160a01b0316620006ad60201b620014301760201c565b15620006a35760405162461bcd60e51b815260206004820152604d60248201527f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460448201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60648201526c1ad95b9cd49958da5c1a595b9d609a1b608482015260a401620003bf565b5050505050505050565b3b151590565b828054620006c19062000b78565b90600052602060002090601f016020900481019282620006e5576000855562000730565b82601f106200070057805160ff191683800117855562000730565b8280016001018555821562000730579182015b828111156200073057825182559160200191906001019062000713565b506200073e9291506200079a565b5090565b82805482825590600052602060002090810192821562000730579160200282015b828111156200073057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000763565b5b808211156200073e57600081556001016200079b565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620007f257620007f2620007b1565b604052919050565b60005b8381101562000817578181015183820152602001620007fd565b83811115620004c25750506000910152565b600082601f8301126200083b57600080fd5b81516001600160401b03811115620008575762000857620007b1565b6200086c601f8201601f1916602001620007c7565b8181528460208386010111156200088257600080fd5b62000895826020830160208701620007fa565b949350505050565b80516001600160a01b0381168114620008b557600080fd5b919050565b600082601f830112620008cc57600080fd5b815160206001600160401b03821115620008ea57620008ea620007b1565b8160051b620008fb828201620007c7565b92835284810182019282810190878511156200091657600080fd5b83870192505b84831015620009405762000930836200089d565b825291830191908301906200091c565b979650505050505050565b60008060008060008060008060006101208a8c0312156200096b57600080fd5b89516001600160401b03808211156200098357600080fd5b620009918d838e0162000829565b9a5060208c0151915080821115620009a857600080fd5b620009b68d838e0162000829565b995060408c0151915080821115620009cd57600080fd5b50620009dc8c828d01620008ba565b97505060608a0151955060808a0151945060a08a0151935060c08a0151925062000a0960e08b016200089d565b915062000a1a6101008b016200089d565b90509295985092959850929598565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141562000a6c5762000a6c62000a3f565b5060010190565b6000821982111562000a895762000a8962000a3f565b500190565b6000815180845262000aa8816020860160208601620007fa565b601f01601f19169290920160200192915050565b83815260606020820152600062000ad7606083018562000a8e565b828103604084015262000aeb818562000a8e565b9695505050505050565b60006020828403121562000b0857600080fd5b62000b13826200089d565b9392505050565b6001600160a01b0387811682528681166020830152851660408201526060810184905260c06080820181905260009062000b579083018562000a8e565b82810360a084015262000b6b818562000a8e565b9998505050505050505050565b600181811c9082168062000b8d57607f821691505b6020821081141562000baf57634e487b7160e01b600052602260045260246000fd5b50919050565b61286d8062000bc56000396000f3fe6080604052600436106101f95760003560e01c8063959b8c3f1161010d578063d95b6371116100a0578063eb770d0c1161006f578063eb770d0c146105c3578063ecb0116a146105e3578063fad8b32a146105f8578063fc673c4f14610618578063fe9d93031461063857600080fd5b8063d95b637114610528578063dd62ed3e14610548578063e586a4f01461058e578063e5a583a9146105a357600080fd5b8063a217fddf116100dc578063a217fddf1461049f578063a9059cbb146104b4578063d5391393146104d4578063d547741f1461050857600080fd5b8063959b8c3f1461042a57806395d89b411461044a5780639bd9bbc61461045f578063a0712d681461047f57600080fd5b80632f2ff15d11610190578063556f0dc71161015f578063556f0dc71461039857806362ad1b83146103ac57806370a08231146103cc5780637d5369971461040257806391d148541461040a57600080fd5b80632f2ff15d14610328578063313ce5671461034857806336568abe146103645780634b94f50e1461038457600080fd5b806318160ddd116101cc57806318160ddd146102975780632103ca95146102b657806323b872dd146102d8578063248a9ca3146102f857600080fd5b806301ffc9a7146101fe57806306e485381461023357806306fdde0314610255578063095ea7b314610277575b600080fd5b34801561020a57600080fd5b5061021e6102193660046120e6565b610658565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b5061024861068f565b60405161022a9190612110565b34801561026157600080fd5b5061026a6106f1565b60405161022a91906121b5565b34801561028357600080fd5b5061021e6102923660046121e0565b61077a565b3480156102a357600080fd5b506001545b60405190815260200161022a565b3480156102c257600080fd5b506102d66102d136600461220c565b610792565b005b3480156102e457600080fd5b5061021e6102f3366004612225565b610a35565b34801561030457600080fd5b506102a861031336600461220c565b60009081526009602052604090206001015490565b34801561033457600080fd5b506102d6610343366004612266565b610bf5565b34801561035457600080fd5b506040516012815260200161022a565b34801561037057600080fd5b506102d661037f366004612266565b610c20565b34801561039057600080fd5b5060646102a8565b3480156103a457600080fd5b5060016102a8565b3480156103b857600080fd5b506102d66103c7366004612339565b610c9e565b3480156103d857600080fd5b506102a86103e73660046123cc565b6001600160a01b031660009081526020819052604090205490565b6102d6610cda565b34801561041657600080fd5b5061021e610425366004612266565b610e89565b34801561043657600080fd5b506102d66104453660046123cc565b610eb4565b34801561045657600080fd5b5061026a610fd2565b34801561046b57600080fd5b506102d661047a3660046123e9565b610fe1565b34801561048b57600080fd5b506102d661049a36600461220c565b610fff565b3480156104ab57600080fd5b506102a8600081565b3480156104c057600080fd5b5061021e6104cf3660046121e0565b6110e0565b3480156104e057600080fd5b506102a87f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b34801561051457600080fd5b506102d6610523366004612266565b611193565b34801561053457600080fd5b5061021e610543366004612442565b6111b9565b34801561055457600080fd5b506102a8610563366004612442565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b34801561059a57600080fd5b50600c546102a8565b3480156105af57600080fd5b506102d66105be36600461220c565b61125b565b3480156105cf57600080fd5b506102d66105de36600461220c565b61128e565b3480156105ef57600080fd5b50600d546102a8565b34801561060457600080fd5b506102d66106133660046123cc565b6112c1565b34801561062457600080fd5b506102d6610633366004612470565b6113dd565b34801561064457600080fd5b506102d66106533660046124f0565b611415565b60006001600160e01b03198216637965db0b60e01b148061068957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054806020026020016040519081016040528092919081815260200182805480156106e757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106c9575b5050505050905090565b60606002805461070090612537565b80601f016020809104026020016040519081016040528092919081815260200182805461072c90612537565b80156106e75780601f1061074e576101008083540402835291602001916106e7565b820191906000526020600020905b81548152906001019060200180831161075c57509395945050505050565b600033610788818585611436565b5060019392505050565b6002600a5414156107ea5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600a558061084a5760405162461bcd60e51b815260206004820152602560248201527f596f75206e65656420746f2073656c6c206174206c6561737420736f6d6520746044820152646f6b656e7360d81b60648201526084016107e1565b6040516370a0823160e01b815233600482015260009030906370a0823190602401602060405180830381865afa158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac9190612572565b905081811015610926576040805162461bcd60e51b81526020600482015260248101919091527f596f75722062616c616e6365206973206c6f776572207468616e20746865206160448201527f6d6f756e74206f6620746f6b656e7320796f752077616e7420746f2073656c6c60648201526084016107e1565b60006109318361155d565b905060006109406064836125a1565b905047818110156109b95760405162461bcd60e51b815260206004820152603f60248201527f425043204f776e657220646f65736e2774206861766520656e6f75676820667560448201527f6e647320746f2061636365707420746869732073656c6c20726571756573740060648201526084016107e1565b6109fb33600b60009054906101000a90046001600160a01b0316876040518060200160405280600081525060405180602001604052806000815250600061159f565b604051339083156108fc029084906000818181858888f19350505050158015610a28573d6000803e3d6000fd5b50506001600a5550505050565b60006001600160a01b038316610a5d5760405162461bcd60e51b81526004016107e1906125c3565b6001600160a01b038416610ac25760405162461bcd60e51b815260206004820152602660248201527f4552433737373a207472616e736665722066726f6d20746865207a65726f206160448201526564647265737360d01b60648201526084016107e1565b6000339050610af381868686604051806020016040528060008152506040518060200160405280600081525061168b565b610b1f8186868660405180602001604052806000815250604051806020016040528060008152506117b2565b6001600160a01b0380861660009081526008602090815260408083209385168352929052205483811015610ba75760405162461bcd60e51b815260206004820152602960248201527f4552433737373a207472616e7366657220616d6f756e74206578636565647320604482015268616c6c6f77616e636560b81b60648201526084016107e1565b610bbb8683610bb68785612607565b611436565b610be98287878760405180602001604052806000815250604051806020016040528060008152506000611918565b50600195945050505050565b600082815260096020526040902060010154610c118133611add565b610c1b8383611b41565b505050565b6001600160a01b0381163314610c905760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016107e1565b610c9a8282611bc7565b5050565b610ca833866111b9565b610cc45760405162461bcd60e51b81526004016107e19061261e565b610cd38585858585600161159f565b5050505050565b6000610ce760643461266a565b600b546040516370a0823160e01b81526001600160a01b03909116600482015290915060009030906370a0823190602401602060405180830381865afa158015610d35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d599190612572565b905060008211610dea5760405162461bcd60e51b815260206004820152605060248201527f596f75206e65656420746f2073656e6420736f6d65206d6f726520657468657260448201527f2c207768617420796f752070726f76696465206973206e6f7420656e6f75676860648201526f103337b9103a3930b739b0b1ba34b7b760811b608482015260a4016107e1565b80821115610e3a5760405162461bcd60e51b815260206004820181905260248201527f4e6f7420656e6f75676820746f6b656e7320696e20746865207265736572766560448201526064016107e1565b6000610e4583611c2e565b9050610c1b600b60009054906101000a90046001600160a01b031633836040518060200160405280600081525060405180602001604052806000815250600061159f565b60009182526009602090815260408084206001600160a01b0393909316845291905290205460ff1690565b336001600160a01b0382161415610f195760405162461bcd60e51b8152602060048201526024808201527f4552433737373a20617574686f72697a696e672073656c66206173206f70657260448201526330ba37b960e11b60648201526084016107e1565b6001600160a01b03811660009081526005602052604090205460ff1615610f6a573360009081526007602090815260408083206001600160a01b03851684529091529020805460ff19169055610f99565b3360009081526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790555b60405133906001600160a01b038316907ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f990600090a350565b60606003805461070090612537565b610c1b3384848460405180602001604052806000815250600161159f565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661102a8133611add565b600e546110408361103a60015490565b90611c4c565b11156110b45760405162461bcd60e51b815260206004820152603860248201527f416d6f756e7420746861742069732061626f757420746f206265206d696e746560448201527f64207265616368657320746865204d617820537570706c79000000000000000060648201526084016107e1565b610c9a338360405180602001604052806000815250604051806020016040528060008152506000611c58565b60006001600160a01b0383166111085760405162461bcd60e51b81526004016107e1906125c3565b600033905061113981828686604051806020016040528060008152506040518060200160405280600081525061168b565b6111658182868660405180602001604052806000815250604051806020016040528060008152506117b2565b6107888182868660405180602001604052806000815250604051806020016040528060008152506000611918565b6000828152600960205260409020600101546111af8133611add565b610c1b8383611bc7565b6000816001600160a01b0316836001600160a01b0316148061122457506001600160a01b03831660009081526005602052604090205460ff16801561122457506001600160a01b0380831660009081526007602090815260408083209387168352929052205460ff16155b8061125457506001600160a01b0380831660009081526006602090815260408083209387168352929052205460ff165b9392505050565b60006112678133611add565b60648211156112885760405162461bcd60e51b81526004016107e190612689565b50600d55565b600061129a8133611add565b60648211156112bb5760405162461bcd60e51b81526004016107e190612689565b50600c55565b6001600160a01b0381163314156113245760405162461bcd60e51b815260206004820152602160248201527f4552433737373a207265766f6b696e672073656c66206173206f70657261746f6044820152603960f91b60648201526084016107e1565b6001600160a01b03811660009081526005602052604090205460ff1615611378573360009081526007602090815260408083206001600160a01b03851684529091529020805460ff191660011790556113a4565b3360009081526006602090815260408083206001600160a01b03851684529091529020805460ff191690555b60405133906001600160a01b038316907f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa190600090a350565b6113e733856111b9565b6114035760405162461bcd60e51b81526004016107e19061261e565b61140f84848484611da1565b50505050565b610c9a33838360405180602001604052806000815250611da1565b3b151590565b6001600160a01b03831661149a5760405162461bcd60e51b815260206004820152602560248201527f4552433737373a20617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016107e1565b6001600160a01b0382166114fc5760405162461bcd60e51b815260206004820152602360248201527f4552433737373a20617070726f766520746f20746865207a65726f206164647260448201526265737360e81b60648201526084016107e1565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000600d5460001461159b576000606483600d5461157b919061266a565b61158591906125a1565b905060006115938285612607565b949350505050565b5090565b6001600160a01b0386166116005760405162461bcd60e51b815260206004820152602260248201527f4552433737373a2073656e642066726f6d20746865207a65726f206164647265604482015261737360f01b60648201526084016107e1565b6001600160a01b0385166116565760405162461bcd60e51b815260206004820181905260248201527f4552433737373a2073656e6420746f20746865207a65726f206164647265737360448201526064016107e1565b3361166581888888888861168b565b6116738188888888886117b2565b61168281888888888888611918565b50505050505050565b60405163555ddc6560e11b81526001600160a01b03861660048201527f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956024820152600090731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca90604401602060405180830381865afa15801561170c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173091906126d1565b90506001600160a01b0381161561168257604051633ad5cbc160e11b81526001600160a01b038216906375ab978290611777908a908a908a908a908a908a906004016126ee565b600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b5050505050505050505050565b6001600160a01b0385166000908152602081905260409020548381101561182b5760405162461bcd60e51b815260206004820152602760248201527f4552433737373a207472616e7366657220616d6f756e7420657863656564732060448201526662616c616e636560c81b60648201526084016107e1565b6001600160a01b03808716600090815260208190526040808220878503905591871681529081208054869290611862908490612748565b92505081905550846001600160a01b0316866001600160a01b0316886001600160a01b03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc826146779878787876040516118ba93929190612760565b60405180910390a4846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161190791815260200190565b60405180910390a350505050505050565b60405163555ddc6560e11b81526001600160a01b03861660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6024820152600090731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca90604401602060405180830381865afa158015611999573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bd91906126d1565b90506001600160a01b03811615611a39576040516223de2960e01b81526001600160a01b038216906223de2990611a02908b908b908b908b908b908b906004016126ee565b600060405180830381600087803b158015611a1c57600080fd5b505af1158015611a30573d6000803e3d6000fd5b50505050611ad3565b8115611ad3576001600160a01b0386163b15611ad35760405162461bcd60e51b815260206004820152604d60248201527f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460448201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60648201526c1ad95b9cd49958da5c1a595b9d609a1b608482015260a4016107e1565b5050505050505050565b611ae78282610e89565b610c9a57611aff816001600160a01b03166014611f4a565b611b0a836020611f4a565b604051602001611b1b929190612795565b60408051601f198184030181529082905262461bcd60e51b82526107e1916004016121b5565b611b4b8282610e89565b610c9a5760008281526009602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611b833390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611bd18282610e89565b15610c9a5760008281526009602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000600c5460001461159b576000606483600c5461157b919061266a565b60006112548284612748565b6001600160a01b038516611cae5760405162461bcd60e51b815260206004820181905260248201527f4552433737373a206d696e7420746f20746865207a65726f206164647265737360448201526064016107e1565b60003390508460016000828254611cc59190612748565b90915550506001600160a01b03861660009081526020819052604081208054879290611cf2908490612748565b90915550611d0890508160008888888888611918565b856001600160a01b0316816001600160a01b03167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d878787604051611d4f93929190612760565b60405180910390a36040518581526001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050505050565b6001600160a01b038416611e025760405162461bcd60e51b815260206004820152602260248201527f4552433737373a206275726e2066726f6d20746865207a65726f206164647265604482015261737360f01b60648201526084016107e1565b33611e128186600087878761168b565b6001600160a01b03851660009081526020819052604090205484811015611e875760405162461bcd60e51b815260206004820152602360248201527f4552433737373a206275726e20616d6f756e7420657863656564732062616c616044820152626e636560e81b60648201526084016107e1565b6001600160a01b0386166000908152602081905260408120868303905560018054879290611eb6908490612607565b92505081905550856001600160a01b0316826001600160a01b03167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098878787604051611f0493929190612760565b60405180910390a36040518581526000906001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611d91565b60606000611f5983600261266a565b611f64906002612748565b67ffffffffffffffff811115611f7c57611f7c612296565b6040519080825280601f01601f191660200182016040528015611fa6576020820181803683370190505b509050600360fc1b81600081518110611fc157611fc161280a565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611ff057611ff061280a565b60200101906001600160f81b031916908160001a905350600061201484600261266a565b61201f906001612748565b90505b6001811115612097576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106120535761205361280a565b1a60f81b8282815181106120695761206961280a565b60200101906001600160f81b031916908160001a90535060049490941c9361209081612820565b9050612022565b5083156112545760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016107e1565b6000602082840312156120f857600080fd5b81356001600160e01b03198116811461125457600080fd5b6020808252825182820181905260009190848201906040850190845b818110156121515783516001600160a01b03168352928401929184019160010161212c565b50909695505050505050565b60005b83811015612178578181015183820152602001612160565b8381111561140f5750506000910152565b600081518084526121a181602086016020860161215d565b601f01601f19169290920160200192915050565b6020815260006112546020830184612189565b6001600160a01b03811681146121dd57600080fd5b50565b600080604083850312156121f357600080fd5b82356121fe816121c8565b946020939093013593505050565b60006020828403121561221e57600080fd5b5035919050565b60008060006060848603121561223a57600080fd5b8335612245816121c8565b92506020840135612255816121c8565b929592945050506040919091013590565b6000806040838503121561227957600080fd5b82359150602083013561228b816121c8565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126122bd57600080fd5b813567ffffffffffffffff808211156122d8576122d8612296565b604051601f8301601f19908116603f0116810190828211818310171561230057612300612296565b8160405283815286602085880101111561231957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a0868803121561235157600080fd5b853561235c816121c8565b9450602086013561236c816121c8565b935060408601359250606086013567ffffffffffffffff8082111561239057600080fd5b61239c89838a016122ac565b935060808801359150808211156123b257600080fd5b506123bf888289016122ac565b9150509295509295909350565b6000602082840312156123de57600080fd5b8135611254816121c8565b6000806000606084860312156123fe57600080fd5b8335612409816121c8565b925060208401359150604084013567ffffffffffffffff81111561242c57600080fd5b612438868287016122ac565b9150509250925092565b6000806040838503121561245557600080fd5b8235612460816121c8565b9150602083013561228b816121c8565b6000806000806080858703121561248657600080fd5b8435612491816121c8565b935060208501359250604085013567ffffffffffffffff808211156124b557600080fd5b6124c1888389016122ac565b935060608701359150808211156124d757600080fd5b506124e4878288016122ac565b91505092959194509250565b6000806040838503121561250357600080fd5b82359150602083013567ffffffffffffffff81111561252157600080fd5b61252d858286016122ac565b9150509250929050565b600181811c9082168061254b57607f821691505b6020821081141561256c57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561258457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000826125be57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526024908201527f4552433737373a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6000828210156126195761261961258b565b500390565b6020808252602c908201527f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60408201526b39103337b9103437b63232b960a11b606082015260800190565b60008160001904831182151516156126845761268461258b565b500290565b60208082526028908201527f466565206d75737420626520616e20696e74656765722070657263656e74616760408201526732961034b2901a1960c11b606082015260800190565b6000602082840312156126e357600080fd5b8151611254816121c8565b6001600160a01b0387811682528681166020830152851660408201526060810184905260c06080820181905260009061272990830185612189565b82810360a084015261273b8185612189565b9998505050505050505050565b6000821982111561275b5761275b61258b565b500190565b8381526060602082015260006127796060830185612189565b828103604084015261278b8185612189565b9695505050505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516127cd81601785016020880161215d565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516127fe81602884016020880161215d565b01602801949350505050565b634e487b7160e01b600052603260045260246000fd5b60008161282f5761282f61258b565b50600019019056fea264697066735822122038058f9684da493246c949a30a33126c32eb3e2f0cc5a5141effadd260503a7c64736f6c634300080a00330000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000001573b584108c72a7c570000000000000000000000000000000000000000000000ab9dac208463953e2b8000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ddc52f04224c0e91cef889cf4c717e2a406c6f66000000000000000000000000534e8b140ebe3c78866b4efe4f195a75dac4e5aa000000000000000000000000000000000000000000000000000000000000000e42696750696374757265436f696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003425043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000003b5587810ca83612fcb75b10c6c5d7c54f61a362000000000000000000000000ad0a7e99deb22d59a724f620a5273e914fbacb84
Deployed Bytecode
0x6080604052600436106101f95760003560e01c8063959b8c3f1161010d578063d95b6371116100a0578063eb770d0c1161006f578063eb770d0c146105c3578063ecb0116a146105e3578063fad8b32a146105f8578063fc673c4f14610618578063fe9d93031461063857600080fd5b8063d95b637114610528578063dd62ed3e14610548578063e586a4f01461058e578063e5a583a9146105a357600080fd5b8063a217fddf116100dc578063a217fddf1461049f578063a9059cbb146104b4578063d5391393146104d4578063d547741f1461050857600080fd5b8063959b8c3f1461042a57806395d89b411461044a5780639bd9bbc61461045f578063a0712d681461047f57600080fd5b80632f2ff15d11610190578063556f0dc71161015f578063556f0dc71461039857806362ad1b83146103ac57806370a08231146103cc5780637d5369971461040257806391d148541461040a57600080fd5b80632f2ff15d14610328578063313ce5671461034857806336568abe146103645780634b94f50e1461038457600080fd5b806318160ddd116101cc57806318160ddd146102975780632103ca95146102b657806323b872dd146102d8578063248a9ca3146102f857600080fd5b806301ffc9a7146101fe57806306e485381461023357806306fdde0314610255578063095ea7b314610277575b600080fd5b34801561020a57600080fd5b5061021e6102193660046120e6565b610658565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b5061024861068f565b60405161022a9190612110565b34801561026157600080fd5b5061026a6106f1565b60405161022a91906121b5565b34801561028357600080fd5b5061021e6102923660046121e0565b61077a565b3480156102a357600080fd5b506001545b60405190815260200161022a565b3480156102c257600080fd5b506102d66102d136600461220c565b610792565b005b3480156102e457600080fd5b5061021e6102f3366004612225565b610a35565b34801561030457600080fd5b506102a861031336600461220c565b60009081526009602052604090206001015490565b34801561033457600080fd5b506102d6610343366004612266565b610bf5565b34801561035457600080fd5b506040516012815260200161022a565b34801561037057600080fd5b506102d661037f366004612266565b610c20565b34801561039057600080fd5b5060646102a8565b3480156103a457600080fd5b5060016102a8565b3480156103b857600080fd5b506102d66103c7366004612339565b610c9e565b3480156103d857600080fd5b506102a86103e73660046123cc565b6001600160a01b031660009081526020819052604090205490565b6102d6610cda565b34801561041657600080fd5b5061021e610425366004612266565b610e89565b34801561043657600080fd5b506102d66104453660046123cc565b610eb4565b34801561045657600080fd5b5061026a610fd2565b34801561046b57600080fd5b506102d661047a3660046123e9565b610fe1565b34801561048b57600080fd5b506102d661049a36600461220c565b610fff565b3480156104ab57600080fd5b506102a8600081565b3480156104c057600080fd5b5061021e6104cf3660046121e0565b6110e0565b3480156104e057600080fd5b506102a87f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b34801561051457600080fd5b506102d6610523366004612266565b611193565b34801561053457600080fd5b5061021e610543366004612442565b6111b9565b34801561055457600080fd5b506102a8610563366004612442565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b34801561059a57600080fd5b50600c546102a8565b3480156105af57600080fd5b506102d66105be36600461220c565b61125b565b3480156105cf57600080fd5b506102d66105de36600461220c565b61128e565b3480156105ef57600080fd5b50600d546102a8565b34801561060457600080fd5b506102d66106133660046123cc565b6112c1565b34801561062457600080fd5b506102d6610633366004612470565b6113dd565b34801561064457600080fd5b506102d66106533660046124f0565b611415565b60006001600160e01b03198216637965db0b60e01b148061068957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054806020026020016040519081016040528092919081815260200182805480156106e757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106c9575b5050505050905090565b60606002805461070090612537565b80601f016020809104026020016040519081016040528092919081815260200182805461072c90612537565b80156106e75780601f1061074e576101008083540402835291602001916106e7565b820191906000526020600020905b81548152906001019060200180831161075c57509395945050505050565b600033610788818585611436565b5060019392505050565b6002600a5414156107ea5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600a558061084a5760405162461bcd60e51b815260206004820152602560248201527f596f75206e65656420746f2073656c6c206174206c6561737420736f6d6520746044820152646f6b656e7360d81b60648201526084016107e1565b6040516370a0823160e01b815233600482015260009030906370a0823190602401602060405180830381865afa158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac9190612572565b905081811015610926576040805162461bcd60e51b81526020600482015260248101919091527f596f75722062616c616e6365206973206c6f776572207468616e20746865206160448201527f6d6f756e74206f6620746f6b656e7320796f752077616e7420746f2073656c6c60648201526084016107e1565b60006109318361155d565b905060006109406064836125a1565b905047818110156109b95760405162461bcd60e51b815260206004820152603f60248201527f425043204f776e657220646f65736e2774206861766520656e6f75676820667560448201527f6e647320746f2061636365707420746869732073656c6c20726571756573740060648201526084016107e1565b6109fb33600b60009054906101000a90046001600160a01b0316876040518060200160405280600081525060405180602001604052806000815250600061159f565b604051339083156108fc029084906000818181858888f19350505050158015610a28573d6000803e3d6000fd5b50506001600a5550505050565b60006001600160a01b038316610a5d5760405162461bcd60e51b81526004016107e1906125c3565b6001600160a01b038416610ac25760405162461bcd60e51b815260206004820152602660248201527f4552433737373a207472616e736665722066726f6d20746865207a65726f206160448201526564647265737360d01b60648201526084016107e1565b6000339050610af381868686604051806020016040528060008152506040518060200160405280600081525061168b565b610b1f8186868660405180602001604052806000815250604051806020016040528060008152506117b2565b6001600160a01b0380861660009081526008602090815260408083209385168352929052205483811015610ba75760405162461bcd60e51b815260206004820152602960248201527f4552433737373a207472616e7366657220616d6f756e74206578636565647320604482015268616c6c6f77616e636560b81b60648201526084016107e1565b610bbb8683610bb68785612607565b611436565b610be98287878760405180602001604052806000815250604051806020016040528060008152506000611918565b50600195945050505050565b600082815260096020526040902060010154610c118133611add565b610c1b8383611b41565b505050565b6001600160a01b0381163314610c905760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016107e1565b610c9a8282611bc7565b5050565b610ca833866111b9565b610cc45760405162461bcd60e51b81526004016107e19061261e565b610cd38585858585600161159f565b5050505050565b6000610ce760643461266a565b600b546040516370a0823160e01b81526001600160a01b03909116600482015290915060009030906370a0823190602401602060405180830381865afa158015610d35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d599190612572565b905060008211610dea5760405162461bcd60e51b815260206004820152605060248201527f596f75206e65656420746f2073656e6420736f6d65206d6f726520657468657260448201527f2c207768617420796f752070726f76696465206973206e6f7420656e6f75676860648201526f103337b9103a3930b739b0b1ba34b7b760811b608482015260a4016107e1565b80821115610e3a5760405162461bcd60e51b815260206004820181905260248201527f4e6f7420656e6f75676820746f6b656e7320696e20746865207265736572766560448201526064016107e1565b6000610e4583611c2e565b9050610c1b600b60009054906101000a90046001600160a01b031633836040518060200160405280600081525060405180602001604052806000815250600061159f565b60009182526009602090815260408084206001600160a01b0393909316845291905290205460ff1690565b336001600160a01b0382161415610f195760405162461bcd60e51b8152602060048201526024808201527f4552433737373a20617574686f72697a696e672073656c66206173206f70657260448201526330ba37b960e11b60648201526084016107e1565b6001600160a01b03811660009081526005602052604090205460ff1615610f6a573360009081526007602090815260408083206001600160a01b03851684529091529020805460ff19169055610f99565b3360009081526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790555b60405133906001600160a01b038316907ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f990600090a350565b60606003805461070090612537565b610c1b3384848460405180602001604052806000815250600161159f565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661102a8133611add565b600e546110408361103a60015490565b90611c4c565b11156110b45760405162461bcd60e51b815260206004820152603860248201527f416d6f756e7420746861742069732061626f757420746f206265206d696e746560448201527f64207265616368657320746865204d617820537570706c79000000000000000060648201526084016107e1565b610c9a338360405180602001604052806000815250604051806020016040528060008152506000611c58565b60006001600160a01b0383166111085760405162461bcd60e51b81526004016107e1906125c3565b600033905061113981828686604051806020016040528060008152506040518060200160405280600081525061168b565b6111658182868660405180602001604052806000815250604051806020016040528060008152506117b2565b6107888182868660405180602001604052806000815250604051806020016040528060008152506000611918565b6000828152600960205260409020600101546111af8133611add565b610c1b8383611bc7565b6000816001600160a01b0316836001600160a01b0316148061122457506001600160a01b03831660009081526005602052604090205460ff16801561122457506001600160a01b0380831660009081526007602090815260408083209387168352929052205460ff16155b8061125457506001600160a01b0380831660009081526006602090815260408083209387168352929052205460ff165b9392505050565b60006112678133611add565b60648211156112885760405162461bcd60e51b81526004016107e190612689565b50600d55565b600061129a8133611add565b60648211156112bb5760405162461bcd60e51b81526004016107e190612689565b50600c55565b6001600160a01b0381163314156113245760405162461bcd60e51b815260206004820152602160248201527f4552433737373a207265766f6b696e672073656c66206173206f70657261746f6044820152603960f91b60648201526084016107e1565b6001600160a01b03811660009081526005602052604090205460ff1615611378573360009081526007602090815260408083206001600160a01b03851684529091529020805460ff191660011790556113a4565b3360009081526006602090815260408083206001600160a01b03851684529091529020805460ff191690555b60405133906001600160a01b038316907f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa190600090a350565b6113e733856111b9565b6114035760405162461bcd60e51b81526004016107e19061261e565b61140f84848484611da1565b50505050565b610c9a33838360405180602001604052806000815250611da1565b3b151590565b6001600160a01b03831661149a5760405162461bcd60e51b815260206004820152602560248201527f4552433737373a20617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016107e1565b6001600160a01b0382166114fc5760405162461bcd60e51b815260206004820152602360248201527f4552433737373a20617070726f766520746f20746865207a65726f206164647260448201526265737360e81b60648201526084016107e1565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000600d5460001461159b576000606483600d5461157b919061266a565b61158591906125a1565b905060006115938285612607565b949350505050565b5090565b6001600160a01b0386166116005760405162461bcd60e51b815260206004820152602260248201527f4552433737373a2073656e642066726f6d20746865207a65726f206164647265604482015261737360f01b60648201526084016107e1565b6001600160a01b0385166116565760405162461bcd60e51b815260206004820181905260248201527f4552433737373a2073656e6420746f20746865207a65726f206164647265737360448201526064016107e1565b3361166581888888888861168b565b6116738188888888886117b2565b61168281888888888888611918565b50505050505050565b60405163555ddc6560e11b81526001600160a01b03861660048201527f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956024820152600090731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca90604401602060405180830381865afa15801561170c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173091906126d1565b90506001600160a01b0381161561168257604051633ad5cbc160e11b81526001600160a01b038216906375ab978290611777908a908a908a908a908a908a906004016126ee565b600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b5050505050505050505050565b6001600160a01b0385166000908152602081905260409020548381101561182b5760405162461bcd60e51b815260206004820152602760248201527f4552433737373a207472616e7366657220616d6f756e7420657863656564732060448201526662616c616e636560c81b60648201526084016107e1565b6001600160a01b03808716600090815260208190526040808220878503905591871681529081208054869290611862908490612748565b92505081905550846001600160a01b0316866001600160a01b0316886001600160a01b03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc826146779878787876040516118ba93929190612760565b60405180910390a4846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161190791815260200190565b60405180910390a350505050505050565b60405163555ddc6560e11b81526001600160a01b03861660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6024820152600090731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca90604401602060405180830381865afa158015611999573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bd91906126d1565b90506001600160a01b03811615611a39576040516223de2960e01b81526001600160a01b038216906223de2990611a02908b908b908b908b908b908b906004016126ee565b600060405180830381600087803b158015611a1c57600080fd5b505af1158015611a30573d6000803e3d6000fd5b50505050611ad3565b8115611ad3576001600160a01b0386163b15611ad35760405162461bcd60e51b815260206004820152604d60248201527f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460448201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60648201526c1ad95b9cd49958da5c1a595b9d609a1b608482015260a4016107e1565b5050505050505050565b611ae78282610e89565b610c9a57611aff816001600160a01b03166014611f4a565b611b0a836020611f4a565b604051602001611b1b929190612795565b60408051601f198184030181529082905262461bcd60e51b82526107e1916004016121b5565b611b4b8282610e89565b610c9a5760008281526009602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611b833390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611bd18282610e89565b15610c9a5760008281526009602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000600c5460001461159b576000606483600c5461157b919061266a565b60006112548284612748565b6001600160a01b038516611cae5760405162461bcd60e51b815260206004820181905260248201527f4552433737373a206d696e7420746f20746865207a65726f206164647265737360448201526064016107e1565b60003390508460016000828254611cc59190612748565b90915550506001600160a01b03861660009081526020819052604081208054879290611cf2908490612748565b90915550611d0890508160008888888888611918565b856001600160a01b0316816001600160a01b03167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d878787604051611d4f93929190612760565b60405180910390a36040518581526001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050505050565b6001600160a01b038416611e025760405162461bcd60e51b815260206004820152602260248201527f4552433737373a206275726e2066726f6d20746865207a65726f206164647265604482015261737360f01b60648201526084016107e1565b33611e128186600087878761168b565b6001600160a01b03851660009081526020819052604090205484811015611e875760405162461bcd60e51b815260206004820152602360248201527f4552433737373a206275726e20616d6f756e7420657863656564732062616c616044820152626e636560e81b60648201526084016107e1565b6001600160a01b0386166000908152602081905260408120868303905560018054879290611eb6908490612607565b92505081905550856001600160a01b0316826001600160a01b03167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098878787604051611f0493929190612760565b60405180910390a36040518581526000906001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611d91565b60606000611f5983600261266a565b611f64906002612748565b67ffffffffffffffff811115611f7c57611f7c612296565b6040519080825280601f01601f191660200182016040528015611fa6576020820181803683370190505b509050600360fc1b81600081518110611fc157611fc161280a565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611ff057611ff061280a565b60200101906001600160f81b031916908160001a905350600061201484600261266a565b61201f906001612748565b90505b6001811115612097576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106120535761205361280a565b1a60f81b8282815181106120695761206961280a565b60200101906001600160f81b031916908160001a90535060049490941c9361209081612820565b9050612022565b5083156112545760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016107e1565b6000602082840312156120f857600080fd5b81356001600160e01b03198116811461125457600080fd5b6020808252825182820181905260009190848201906040850190845b818110156121515783516001600160a01b03168352928401929184019160010161212c565b50909695505050505050565b60005b83811015612178578181015183820152602001612160565b8381111561140f5750506000910152565b600081518084526121a181602086016020860161215d565b601f01601f19169290920160200192915050565b6020815260006112546020830184612189565b6001600160a01b03811681146121dd57600080fd5b50565b600080604083850312156121f357600080fd5b82356121fe816121c8565b946020939093013593505050565b60006020828403121561221e57600080fd5b5035919050565b60008060006060848603121561223a57600080fd5b8335612245816121c8565b92506020840135612255816121c8565b929592945050506040919091013590565b6000806040838503121561227957600080fd5b82359150602083013561228b816121c8565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126122bd57600080fd5b813567ffffffffffffffff808211156122d8576122d8612296565b604051601f8301601f19908116603f0116810190828211818310171561230057612300612296565b8160405283815286602085880101111561231957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a0868803121561235157600080fd5b853561235c816121c8565b9450602086013561236c816121c8565b935060408601359250606086013567ffffffffffffffff8082111561239057600080fd5b61239c89838a016122ac565b935060808801359150808211156123b257600080fd5b506123bf888289016122ac565b9150509295509295909350565b6000602082840312156123de57600080fd5b8135611254816121c8565b6000806000606084860312156123fe57600080fd5b8335612409816121c8565b925060208401359150604084013567ffffffffffffffff81111561242c57600080fd5b612438868287016122ac565b9150509250925092565b6000806040838503121561245557600080fd5b8235612460816121c8565b9150602083013561228b816121c8565b6000806000806080858703121561248657600080fd5b8435612491816121c8565b935060208501359250604085013567ffffffffffffffff808211156124b557600080fd5b6124c1888389016122ac565b935060608701359150808211156124d757600080fd5b506124e4878288016122ac565b91505092959194509250565b6000806040838503121561250357600080fd5b82359150602083013567ffffffffffffffff81111561252157600080fd5b61252d858286016122ac565b9150509250929050565b600181811c9082168061254b57607f821691505b6020821081141561256c57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561258457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000826125be57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526024908201527f4552433737373a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6000828210156126195761261961258b565b500390565b6020808252602c908201527f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60408201526b39103337b9103437b63232b960a11b606082015260800190565b60008160001904831182151516156126845761268461258b565b500290565b60208082526028908201527f466565206d75737420626520616e20696e74656765722070657263656e74616760408201526732961034b2901a1960c11b606082015260800190565b6000602082840312156126e357600080fd5b8151611254816121c8565b6001600160a01b0387811682528681166020830152851660408201526060810184905260c06080820181905260009061272990830185612189565b82810360a084015261273b8185612189565b9998505050505050505050565b6000821982111561275b5761275b61258b565b500190565b8381526060602082015260006127796060830185612189565b828103604084015261278b8185612189565b9695505050505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516127cd81601785016020880161215d565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516127fe81602884016020880161215d565b01602801949350505050565b634e487b7160e01b600052603260045260246000fd5b60008161282f5761282f61258b565b50600019019056fea264697066735822122038058f9684da493246c949a30a33126c32eb3e2f0cc5a5141effadd260503a7c64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000001573b584108c72a7c570000000000000000000000000000000000000000000000ab9dac208463953e2b8000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ddc52f04224c0e91cef889cf4c717e2a406c6f66000000000000000000000000534e8b140ebe3c78866b4efe4f195a75dac4e5aa000000000000000000000000000000000000000000000000000000000000000e42696750696374757265436f696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003425043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000003b5587810ca83612fcb75b10c6c5d7c54f61a362000000000000000000000000ad0a7e99deb22d59a724f620a5273e914fbacb84
-----Decoded View---------------
Arg [0] : _name (string): BigPictureCoin
Arg [1] : _symbol (string): BPC
Arg [2] : _default_operators (address[]): 0x3b5587810CA83612Fcb75B10C6c5d7c54F61a362,0xAd0A7E99Deb22d59A724f620a5273e914fBacB84
Arg [3] : _max_supply (uint256): 6639068860000000000000000000
Arg [4] : _initial_supply (uint256): 3319534430000000000000000000
Arg [5] : _entry_fee (uint256): 1
Arg [6] : _exit_fee (uint256): 1
Arg [7] : _managing_account (address): 0xDdc52f04224C0e91CEF889cf4c717e2a406c6F66
Arg [8] : _company_account (address): 0x534E8B140ebE3C78866B4Efe4f195a75Dac4e5aa
-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [3] : 00000000000000000000000000000000000000001573b584108c72a7c5700000
Arg [4] : 00000000000000000000000000000000000000000ab9dac208463953e2b80000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 000000000000000000000000ddc52f04224c0e91cef889cf4c717e2a406c6f66
Arg [8] : 000000000000000000000000534e8b140ebe3c78866b4efe4f195a75dac4e5aa
Arg [9] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [10] : 42696750696374757265436f696e000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [12] : 4250430000000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [14] : 0000000000000000000000003b5587810ca83612fcb75b10c6c5d7c54f61a362
Arg [15] : 000000000000000000000000ad0a7e99deb22d59a724f620a5273e914fbacb84
Deployed Bytecode Sourcemap
68843:4772:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25070:204;;;;;;;;;;-1:-1:-1;25070:204:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;25070:204:0;;;;;;;;56876:132;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;52943:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;58516:201::-;;;;;;;;;;-1:-1:-1;58516:201:0;;;;;:::i;:::-;;:::i;53769:125::-;;;;;;;;;;-1:-1:-1;53874:12:0;;53769:125;;;2513:25:1;;;2501:2;2486:18;53769:125:0;2367:177:1;71122:1062:0;;;;;;;;;;-1:-1:-1;71122:1062:0;;;;;:::i;:::-;;:::i;:::-;;59102:827;;;;;;;;;;-1:-1:-1;59102:827:0;;;;;:::i;:::-;;:::i;26481:123::-;;;;;;;;;;-1:-1:-1;26481:123:0;;;;;:::i;:::-;26547:7;26574:12;;;:6;:12;;;;;:22;;;;26481:123;26866:147;;;;;;;;;;-1:-1:-1;26866:147:0;;;;;:::i;:::-;;:::i;53400:84::-;;;;;;;;;;-1:-1:-1;53400:84:0;;53474:2;4024:36:1;;4012:2;3997:18;53400:84:0;3882:184:1;27914:218:0;;;;;;;;;;-1:-1:-1;27914:218:0;;;;;:::i;:::-;;:::i;72192:97::-;;;;;;;;;;-1:-1:-1;69055:3:0;72192:97;;53606;;;;;;;;;;-1:-1:-1;53694:1:0;53606:97;;57134:375;;;;;;;;;;-1:-1:-1;57134:375:0;;;;;:::i;:::-;;:::i;53999:152::-;;;;;;;;;;-1:-1:-1;53999:152:0;;;;;:::i;:::-;-1:-1:-1;;;;;54121:22:0;54094:7;54121:22;;;;;;;;;;;;53999:152;70384:730;;;:::i;25366:139::-;;;;;;;;;;-1:-1:-1;25366:139:0;;;;;:::i;:::-;;:::i;55901:422::-;;;;;;;;;;-1:-1:-1;55901:422:0;;;;;:::i;:::-;;:::i;53104:104::-;;;;;;;;;;;;;:::i;54288:199::-;;;;;;;;;;-1:-1:-1;54288:199:0;;;;;:::i;:::-;;:::i;69927:290::-;;;;;;;;;;-1:-1:-1;69927:290:0;;;;;:::i;:::-;;:::i;24457:49::-;;;;;;;;;;-1:-1:-1;24457:49:0;24502:4;24457:49;;54728:451;;;;;;;;;;-1:-1:-1;54728:451:0;;;;;:::i;:::-;;:::i;68940:62::-;;;;;;;;;;;;68978:24;68940:62;;27258:149;;;;;;;;;;-1:-1:-1;27258:149:0;;;;;:::i;:::-;;:::i;55513:316::-;;;;;;;;;;-1:-1:-1;55513:316:0;;;;;:::i;:::-;;:::i;58218:153::-;;;;;;;;;;-1:-1:-1;58218:153:0;;;;;:::i;:::-;-1:-1:-1;;;;;58335:19:0;;;58308:7;58335:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;58218:153;72297:90;;;;;;;;;;-1:-1:-1;72368:11:0;;72297:90;;72728:227;;;;;;;;;;-1:-1:-1;72728:227:0;;;;;:::i;:::-;;:::i;72491:229::-;;;;;;;;;;-1:-1:-1;72491:229:0;;;;;:::i;:::-;;:::i;72395:88::-;;;;;;;;;;-1:-1:-1;72465:10:0;;72395:88;;56392:413;;;;;;;;;;-1:-1:-1;56392:413:0;;;;;:::i;:::-;;:::i;57637:333::-;;;;;;;;;;-1:-1:-1;57637:333:0;;;;;:::i;:::-;;:::i;55316:129::-;;;;;;;;;;-1:-1:-1;55316:129:0;;;;;:::i;:::-;;:::i;25070:204::-;25155:4;-1:-1:-1;;;;;;25179:47:0;;-1:-1:-1;;;25179:47:0;;:87;;-1:-1:-1;;;;;;;;;;11472:40:0;;;25230:36;25172:94;25070:204;-1:-1:-1;;25070:204:0:o;56876:132::-;56942:16;56978:22;56971:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56971:29:0;;;;;;;;;;;;;;;;;;;;;;;56876:132;:::o;52943:100::-;52997:13;53030:5;53023:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53023:12:0;;52943:100;-1:-1:-1;;;;;52943:100:0:o;58516:201::-;58598:4;22360:10;58655:32;22360:10;58672:7;58681:5;58655:8;:32::i;:::-;-1:-1:-1;58705:4:0;;58516:201;-1:-1:-1;;;58516:201:0:o;71122:1062::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;8717:2:1;2402:63:0;;;8699:21:1;8756:2;8736:18;;;8729:30;8795:33;8775:18;;;8768:61;8846:18;;2402:63:0;;;;;;;;;1812:1;2543:7;:18;71212;71204:68:::1;;;::::0;-1:-1:-1;;;71204:68:0;;9077:2:1;71204:68:0::1;::::0;::::1;9059:21:1::0;9116:2;9096:18;;;9089:30;9155:34;9135:18;;;9128:62;-1:-1:-1;;;9206:18:1;;;9199:35;9251:19;;71204:68:0::1;8875:401:1::0;71204:68:0::1;71387:26;::::0;-1:-1:-1;;;71387:26:0;;71402:10:::1;71387:26;::::0;::::1;9427:51:1::0;71358:26:0::1;::::0;71387:4:::1;::::0;:14:::1;::::0;9400:18:1;;71387:26:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71358:55;;71468:14;71446:18;:36;;71424:150;;;::::0;;-1:-1:-1;;;71424:150:0;;9880:2:1;71424:150:0::1;::::0;::::1;9862:21:1::0;9899:18;;;9892:30;;;;9958:34;9938:18;;;9931:62;10029:34;10009:18;;;10002:62;10081:19;;71424:150:0::1;9678:428:1::0;71424:150:0::1;71587:21;71611:31;71627:14;71611:15;:31::i;:::-;71587:55:::0;-1:-1:-1;71655:23:0::1;71681:32;69055:3;71587:55:::0;71681:32:::1;:::i;:::-;71655:58:::0;-1:-1:-1;71754:21:0::1;71808:38:::0;;::::1;;71786:151;;;::::0;-1:-1:-1;;;71786:151:0;;10667:2:1;71786:151:0::1;::::0;::::1;10649:21:1::0;10706:2;10686:18;;;10679:30;10745:34;10725:18;;;10718:62;10816:33;10796:18;;;10789:61;10867:19;;71786:151:0::1;10465:427:1::0;71786:151:0::1;71950:170;71970:10;71995:17;;;;;;;;;-1:-1:-1::0;;;;;71995:17:0::1;72027:14;72056:9;;;;;;;;;;;::::0;72080::::1;;;;;;;;;;;::::0;72104:5:::1;71950;:170::i;:::-;72131:45;::::0;72139:10:::1;::::0;72131:45;::::1;;;::::0;72160:15;;72131:45:::1;::::0;;;72160:15;72139:10;72131:45;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;;;;71122:1062:0:o;59102:827::-;59242:4;-1:-1:-1;;;;;59267:23:0;;59259:72;;;;-1:-1:-1;;;59259:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;59350:20:0;;59342:71;;;;-1:-1:-1;;;59342:71:0;;11504:2:1;59342:71:0;;;11486:21:1;11543:2;11523:18;;;11516:30;11582:34;11562:18;;;11555:62;-1:-1:-1;;;11633:18:1;;;11626:36;11679:19;;59342:71:0;11302:402:1;59342:71:0;59426:15;22360:10;59426:30;;59469:61;59487:7;59496:6;59504:9;59515:6;59469:61;;;;;;;;;;;;;;;;;;;;;;;;:17;:61::i;:::-;59543:49;59549:7;59558:6;59566:9;59577:6;59543:49;;;;;;;;;;;;;;;;;;;;;;;;:5;:49::i;:::-;-1:-1:-1;;;;;59632:19:0;;;59605:24;59632:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;59679:26;;;;59671:80;;;;-1:-1:-1;;;59671:80:0;;11911:2:1;59671:80:0;;;11893:21:1;11950:2;11930:18;;;11923:30;11989:34;11969:18;;;11962:62;-1:-1:-1;;;12040:18:1;;;12033:39;12089:19;;59671:80:0;11709:405:1;59671:80:0;59762:52;59771:6;59779:7;59788:25;59807:6;59788:16;:25;:::i;:::-;59762:8;:52::i;:::-;59827:70;59847:7;59856:6;59864:9;59875:6;59827:70;;;;;;;;;;;;;;;;;;;;;;;;59891:5;59827:19;:70::i;:::-;-1:-1:-1;59917:4:0;;59102:827;-1:-1:-1;;;;;59102:827:0:o;26866:147::-;26547:7;26574:12;;;:6;:12;;;;;:22;;;24948:30;24959:4;22360:10;24948;:30::i;:::-;26980:25:::1;26991:4;26997:7;26980:10;:25::i;:::-;26866:147:::0;;;:::o;27914:218::-;-1:-1:-1;;;;;28010:23:0;;22360:10;28010:23;28002:83;;;;-1:-1:-1;;;28002:83:0;;12451:2:1;28002:83:0;;;12433:21:1;12490:2;12470:18;;;12463:30;12529:34;12509:18;;;12502:62;-1:-1:-1;;;12580:18:1;;;12573:45;12635:19;;28002:83:0;12249:411:1;28002:83:0;28098:26;28110:4;28116:7;28098:11;:26::i;:::-;27914:218;;:::o;57134:375::-;57348:35;22360:10;57376:6;57348:13;:35::i;:::-;57340:92;;;;-1:-1:-1;;;57340:92:0;;;;;;;:::i;:::-;57443:58;57449:6;57457:9;57468:6;57476:4;57482:12;57496:4;57443:5;:58::i;:::-;57134:375;;;;;:::o;70384:730::-;70439:21;70463:28;69055:3;70463:9;:28;:::i;:::-;70549:17;;70534:33;;-1:-1:-1;;;70534:33:0;;-1:-1:-1;;;;;70549:17:0;;;70534:33;;;9427:51:1;70439:52:0;;-1:-1:-1;70502:29:0;;70534:4;;:14;;9400:18:1;;70534:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70502:65;;70618:1;70602:13;:17;70580:147;;;;-1:-1:-1;;;70580:147:0;;13453:2:1;70580:147:0;;;13435:21:1;13492:2;13472:18;;;13465:30;13531:34;13511:18;;;13504:62;13602:34;13582:18;;;13575:62;-1:-1:-1;;;13653:19:1;;;13646:47;13710:19;;70580:147:0;13251:484:1;70580:147:0;70777:21;70760:13;:38;;70738:120;;;;-1:-1:-1;;;70738:120:0;;13942:2:1;70738:120:0;;;13924:21:1;;;13961:18;;;13954:30;14020:34;14000:18;;;13993:62;14072:18;;70738:120:0;13740:356:1;70738:120:0;70871:21;70895:31;70912:13;70895:16;:31::i;:::-;70871:55;;70937:169;70957:17;;;;;;;;;-1:-1:-1;;;;;70957:17:0;70989:10;71014:13;71042:9;;;;;;;;;;;;71066;;;;;;;;;;;;71090:5;70937;:169::i;25366:139::-;25444:4;25468:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;25468:29:0;;;;;;;;;;;;;;;25366:139::o;55901:422::-;22360:10;-1:-1:-1;;;;;55989:24:0;;;;55981:73;;;;-1:-1:-1;;;55981:73:0;;14303:2:1;55981:73:0;;;14285:21:1;14342:2;14322:18;;;14315:30;14381:34;14361:18;;;14354:62;-1:-1:-1;;;14432:18:1;;;14425:34;14476:19;;55981:73:0;14101:400:1;55981:73:0;-1:-1:-1;;;;;56071:27:0;;;;;;:17;:27;;;;;;;;56067:189;;;22360:10;56122:38;;;;:24;:38;;;;;;;;-1:-1:-1;;;;;56122:48:0;;;;;;;;;56115:55;;-1:-1:-1;;56115:55:0;;;56067:189;;;22360:10;56203:24;;;;:10;:24;;;;;;;;-1:-1:-1;;;;;56203:34:0;;;;;;;;;:41;;-1:-1:-1;;56203:41:0;56240:4;56203:41;;;56067:189;56273:42;;22360:10;;-1:-1:-1;;;;;56273:42:0;;;;;;;;55901:422;:::o;53104:104::-;53160:13;53193:7;53186:14;;;;;:::i;54288:199::-;54425:54;22360:10;54445:9;54456:6;54464:4;54425:54;;;;;;;;;;;;54474:4;54425:5;:54::i;69927:290::-;68978:24;24948:30;68978:24;22360:10;24948;:30::i;:::-;70048:12:::1;;70019:25;70037:6;70019:13;53874:12:::0;;;53769:125;70019:13:::1;:17:::0;::::1;:25::i;:::-;:41;;69997:147;;;::::0;-1:-1:-1;;;69997:147:0;;14708:2:1;69997:147:0::1;::::0;::::1;14690:21:1::0;14747:2;14727:18;;;14720:30;14786:34;14766:18;;;14759:62;14857:26;14837:18;;;14830:54;14901:19;;69997:147:0::1;14506:420:1::0;69997:147:0::1;70155:54;70161:10;70173:6;70181:9;;;;;;;;;;;::::0;70192::::1;;;;;;;;;;;::::0;70203:5:::1;70155;:54::i;54728:451::-:0;54814:4;-1:-1:-1;;;;;54839:23:0;;54831:72;;;;-1:-1:-1;;;54831:72:0;;;;;;;:::i;:::-;54916:12;22360:10;54916:27;;54956:56;54974:4;54980;54986:9;54997:6;54956:56;;;;;;;;;;;;;;;;;;;;;;;;:17;:56::i;:::-;55025:44;55031:4;55037;55043:9;55054:6;55025:44;;;;;;;;;;;;;;;;;;;;;;;;:5;:44::i;:::-;55082:65;55102:4;55108;55114:9;55125:6;55082:65;;;;;;;;;;;;;;;;;;;;;;;;55141:5;55082:19;:65::i;27258:149::-;26547:7;26574:12;;;:6;:12;;;;;:22;;;24948:30;24959:4;22360:10;24948;:30::i;:::-;27373:26:::1;27385:4;27391:7;27373:11;:26::i;55513:316::-:0;55613:4;55662:11;-1:-1:-1;;;;;55650:23:0;:8;-1:-1:-1;;;;;55650:23:0;;:121;;;-1:-1:-1;;;;;;55691:27:0;;;;;;:17;:27;;;;;;;;:79;;;;-1:-1:-1;;;;;;55723:37:0;;;;;;;:24;:37;;;;;;;;:47;;;;;;;;;;;;55722:48;55691:79;55650:171;;;-1:-1:-1;;;;;;55788:23:0;;;;;;;:10;:23;;;;;;;;:33;;;;;;;;;;;;55650:171;55630:191;55513:316;-1:-1:-1;;;55513:316:0:o;72728:227::-;24502:4;24948:30;24502:4;22360:10;24948;:30::i;:::-;72849:3:::1;72842;:10;;72808:112;;;;-1:-1:-1::0;;;72808:112:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;72931:10:0::1;:16:::0;72728:227::o;72491:229::-;24502:4;24948:30;24502:4;22360:10;24948;:30::i;:::-;72613:3:::1;72606;:10;;72572:112;;;;-1:-1:-1::0;;;72572:112:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;72695:11:0::1;:17:::0;72491:229::o;56392:413::-;-1:-1:-1;;;;;56477:24:0;;22360:10;56477:24;;56469:70;;;;-1:-1:-1;;;56469:70:0;;15542:2:1;56469:70:0;;;15524:21:1;15581:2;15561:18;;;15554:30;15620:34;15600:18;;;15593:62;-1:-1:-1;;;15671:18:1;;;15664:31;15712:19;;56469:70:0;15340:397:1;56469:70:0;-1:-1:-1;;;;;56556:27:0;;;;;;:17;:27;;;;;;;;56552:189;;;22360:10;56600:38;;;;:24;:38;;;;;;;;-1:-1:-1;;;;;56600:48:0;;;;;;;;;:55;;-1:-1:-1;;56600:55:0;56651:4;56600:55;;;56552:189;;;22360:10;56695:24;;;;:10;:24;;;;;;;;-1:-1:-1;;;;;56695:34:0;;;;;;;;;56688:41;;-1:-1:-1;;56688:41:0;;;56552:189;56758:39;;22360:10;;-1:-1:-1;;;;;56758:39:0;;;;;;;;56392:413;:::o;57637:333::-;57824:36;22360:10;57852:7;57824:13;:36::i;:::-;57816:93;;;;-1:-1:-1;;;57816:93:0;;;;;;;:::i;:::-;57920:42;57926:7;57935:6;57943:4;57949:12;57920:5;:42::i;:::-;57637:333;;;;:::o;55316:129::-;55400:37;22360:10;55420:6;55428:4;55400:37;;;;;;;;;;;;:5;:37::i;30797:387::-;31120:20;31168:8;;;30797:387::o;65223:375::-;-1:-1:-1;;;;;65351:20:0;;65343:70;;;;-1:-1:-1;;;65343:70:0;;15944:2:1;65343:70:0;;;15926:21:1;15983:2;15963:18;;;15956:30;16022:34;16002:18;;;15995:62;-1:-1:-1;;;16073:18:1;;;16066:35;16118:19;;65343:70:0;15742:401:1;65343:70:0;-1:-1:-1;;;;;65432:21:0;;65424:69;;;;-1:-1:-1;;;65424:69:0;;16350:2:1;65424:69:0;;;16332:21:1;16389:2;16369:18;;;16362:30;16428:34;16408:18;;;16401:62;-1:-1:-1;;;16479:18:1;;;16472:33;16522:19;;65424:69:0;16148:399:1;65424:69:0;-1:-1:-1;;;;;65506:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:36;;;65558:32;;2513:25:1;;;65558:32:0;;2486:18:1;65558:32:0;;;;;;;65223:375;;;:::o;73293:319::-;73355:7;73379:10;;73393:1;73379:15;73375:230;;73411:17;73454:3;73445:5;73432:10;;:18;;;;:::i;:::-;73431:26;;;;:::i;:::-;73411:46;-1:-1:-1;73472:21:0;73496:17;73411:46;73496:5;:17;:::i;:::-;73472:41;73293:319;-1:-1:-1;;;;73293:319:0:o;73375:230::-;-1:-1:-1;73588:5:0;73293:319::o;62623:668::-;-1:-1:-1;;;;;62853:18:0;;62845:65;;;;-1:-1:-1;;;62845:65:0;;16754:2:1;62845:65:0;;;16736:21:1;16793:2;16773:18;;;16766:30;16832:34;16812:18;;;16805:62;-1:-1:-1;;;16883:18:1;;;16876:32;16925:19;;62845:65:0;16552:398:1;62845:65:0;-1:-1:-1;;;;;62929:16:0;;62921:61;;;;-1:-1:-1;;;62921:61:0;;17157:2:1;62921:61:0;;;17139:21:1;;;17176:18;;;17169:30;17235:34;17215:18;;;17208:62;17287:18;;62921:61:0;16955:356:1;62921:61:0;22360:10;63039:69;22360:10;63067:4;63073:2;63077:6;63085:8;63095:12;63039:17;:69::i;:::-;63121:57;63127:8;63137:4;63143:2;63147:6;63155:8;63165:12;63121:5;:57::i;:::-;63191:92;63211:8;63221:4;63227:2;63231:6;63239:8;63249:12;63263:19;63191;:92::i;:::-;62834:457;62623:668;;;;;;:::o;66082:484::-;66321:78;;-1:-1:-1;;;66321:78:0;;-1:-1:-1;;;;;17508:32:1;;66321:78:0;;;17490:51:1;51412:31:0;17557:18:1;;;17550:34;66299:19:0;;51154:42;;66321:41;;17463:18:1;;66321:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66299:100;-1:-1:-1;;;;;;66414:25:0;;;66410:149;;66456:91;;-1:-1:-1;;;66456:91:0;;-1:-1:-1;;;;;66456:39:0;;;;;:91;;66496:8;;66506:4;;66512:2;;66516:6;;66524:8;;66534:12;;66456:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66288:278;66082:484;;;;;;:::o;64448:630::-;-1:-1:-1;;;;;64736:15:0;;64714:19;64736:15;;;;;;;;;;;64770:21;;;;64762:73;;;;-1:-1:-1;;;64762:73:0;;18790:2:1;64762:73:0;;;18772:21:1;18829:2;18809:18;;;18802:30;18868:34;18848:18;;;18841:62;-1:-1:-1;;;18919:18:1;;;18912:37;18966:19;;64762:73:0;18588:403:1;64762:73:0;-1:-1:-1;;;;;64871:15:0;;;:9;:15;;;;;;;;;;;64889:20;;;64871:38;;64931:13;;;;;;;;:23;;64903:6;;64871:9;64931:23;;64903:6;;64931:23;:::i;:::-;;;;;;;;64993:2;-1:-1:-1;;;;;64972:56:0;64987:4;-1:-1:-1;;;;;64972:56:0;64977:8;-1:-1:-1;;;;;64972:56:0;;64997:6;65005:8;65015:12;64972:56;;;;;;;;:::i;:::-;;;;;;;;65059:2;-1:-1:-1;;;;;65044:26:0;65053:4;-1:-1:-1;;;;;65044:26:0;;65063:6;65044:26;;;;2513:25:1;;2501:2;2486:18;;2367:177;65044:26:0;;;;;;;;64642:436;64448:630;;;;;;:::o;67268:691::-;67544:79;;-1:-1:-1;;;67544:79:0;;-1:-1:-1;;;;;17508:32:1;;67544:79:0;;;17490:51:1;51510:34:0;17557:18:1;;;17550:34;67522:19:0;;51154:42;;67544:41;;17463:18:1;;67544:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67522:101;-1:-1:-1;;;;;;67638:25:0;;;67634:318;;67680:96;;-1:-1:-1;;;67680:96:0;;-1:-1:-1;;;;;67680:44:0;;;;;:96;;67725:8;;67735:4;;67741:2;;67745:6;;67753:8;;67763:12;;67680:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67634:318;;;67798:19;67794:158;;;-1:-1:-1;;;;;67843:13:0;;31120:20;31168:8;67834:106;;;;-1:-1:-1;;;67834:106:0;;19786:2:1;67834:106:0;;;19768:21:1;19825:2;19805:18;;;19798:30;19864:34;19844:18;;;19837:62;19935:34;19915:18;;;19908:62;-1:-1:-1;;;19986:19:1;;;19979:44;20040:19;;67834:106:0;19584:481:1;67834:106:0;67511:448;67268:691;;;;;;;:::o;25795:497::-;25876:22;25884:4;25890:7;25876;:22::i;:::-;25871:414;;26064:41;26092:7;-1:-1:-1;;;;;26064:41:0;26102:2;26064:19;:41::i;:::-;26178:38;26206:4;26213:2;26178:19;:38::i;:::-;25969:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;25969:270:0;;;;;;;;;;-1:-1:-1;;;25915:358:0;;;;;;;:::i;29415:238::-;29499:22;29507:4;29513:7;29499;:22::i;:::-;29494:152;;29538:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;29538:29:0;;;;;;;;;:36;;-1:-1:-1;;29538:36:0;29570:4;29538:36;;;29621:12;22360:10;;22280:98;29621:12;-1:-1:-1;;;;;29594:40:0;29612:7;-1:-1:-1;;;;;29594:40:0;29606:4;29594:40;;;;;;;;;;29415:238;;:::o;29785:239::-;29869:22;29877:4;29883:7;29869;:22::i;:::-;29865:152;;;29940:5;29908:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;29908:29:0;;;;;;;;;;:37;;-1:-1:-1;;29908:37:0;;;29965:40;22360:10;;29908:12;;29965:40;;29940:5;29965:40;29785:239;;:::o;72963:322::-;73026:7;73050:11;;73065:1;73050:16;73046:232;;73083:17;73127:3;73118:5;73104:11;;:19;;;;:::i;5551:98::-;5609:7;5636:5;5640:1;5636;:5;:::i;61389:747::-;-1:-1:-1;;;;;61601:21:0;;61593:66;;;;-1:-1:-1;;;61593:66:0;;21063:2:1;61593:66:0;;;21045:21:1;;;21082:18;;;21075:30;21141:34;21121:18;;;21114:62;21193:18;;61593:66:0;20861:356:1;61593:66:0;61672:16;22360:10;61672:31;;61839:6;61823:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;61856:18:0;;:9;:18;;;;;;;;;;:28;;61878:6;;61856:9;:28;;61878:6;;61856:28;:::i;:::-;;;;-1:-1:-1;61897:103:0;;-1:-1:-1;61917:8:0;61935:1;61939:7;61948:6;61956:8;61966:12;61980:19;61897;:103::i;:::-;62035:7;-1:-1:-1;;;;;62018:57:0;62025:8;-1:-1:-1;;;;;62018:57:0;;62044:6;62052:8;62062:12;62018:57;;;;;;;;:::i;:::-;;;;;;;;62091:37;;2513:25:1;;;-1:-1:-1;;;;;62091:37:0;;;62108:1;;62091:37;;2501:2:1;2486:18;62091:37:0;;;;;;;;61582:554;61389:747;;;;;:::o;63605:835::-;-1:-1:-1;;;;;63775:18:0;;63767:65;;;;-1:-1:-1;;;63767:65:0;;21424:2:1;63767:65:0;;;21406:21:1;21463:2;21443:18;;;21436:30;21502:34;21482:18;;;21475:62;-1:-1:-1;;;21553:18:1;;;21546:32;21595:19;;63767:65:0;21222:398:1;63767:65:0;22360:10;63889:73;22360:10;63917:4;63845:16;63935:6;63943:4;63949:12;63889:17;:73::i;:::-;-1:-1:-1;;;;;64101:15:0;;64079:19;64101:15;;;;;;;;;;;64135:21;;;;64127:69;;;;-1:-1:-1;;;64127:69:0;;21827:2:1;64127:69:0;;;21809:21:1;21866:2;21846:18;;;21839:30;21905:34;21885:18;;;21878:62;-1:-1:-1;;;21956:18:1;;;21949:33;21999:19;;64127:69:0;21625:399:1;64127:69:0;-1:-1:-1;;;;;64232:15:0;;:9;:15;;;;;;;;;;64250:20;;;64232:38;;64292:12;:22;;64264:6;;64232:9;64292:22;;64264:6;;64292:22;:::i;:::-;;;;;;;;64349:4;-1:-1:-1;;;;;64332:50:0;64339:8;-1:-1:-1;;;;;64332:50:0;;64355:6;64363:4;64369:12;64332:50;;;;;;;;:::i;:::-;;;;;;;;64398:34;;2513:25:1;;;64421:1:0;;-1:-1:-1;;;;;64398:34:0;;;;;2501:2:1;2486:18;64398:34:0;2367:177:1;13139:451:0;13214:13;13240:19;13272:10;13276:6;13272:1;:10;:::i;:::-;:14;;13285:1;13272:14;:::i;:::-;13262:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13262:25:0;;13240:47;;-1:-1:-1;;;13298:6:0;13305:1;13298:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;13298:15:0;;;;;;;;;-1:-1:-1;;;13324:6:0;13331:1;13324:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;13324:15:0;;;;;;;;-1:-1:-1;13355:9:0;13367:10;13371:6;13367:1;:10;:::i;:::-;:14;;13380:1;13367:14;:::i;:::-;13355:26;;13350:135;13387:1;13383;:5;13350:135;;;-1:-1:-1;;;13435:5:0;13443:3;13435:11;13422:25;;;;;;;:::i;:::-;;;;13410:6;13417:1;13410:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;13410:37:0;;;;;;;;-1:-1:-1;13472:1:0;13462:11;;;;;13390:3;;;:::i;:::-;;;13350:135;;;-1:-1:-1;13503:10:0;;13495:55;;;;-1:-1:-1;;;13495:55:0;;22504:2:1;13495:55:0;;;22486:21:1;;;22523:18;;;22516:30;22582:34;22562:18;;;22555:62;22634:18;;13495:55:0;22302:356:1;14:286;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;497:658;668:2;720:21;;;790:13;;693:18;;;812:22;;;639:4;;668:2;891:15;;;;865:2;850:18;;;639:4;934:195;948:6;945:1;942:13;934:195;;;1013:13;;-1:-1:-1;;;;;1009:39:1;997:52;;1104:15;;;;1069:12;;;;1045:1;963:9;934:195;;;-1:-1:-1;1146:3:1;;497:658;-1:-1:-1;;;;;;497:658:1:o;1160:258::-;1232:1;1242:113;1256:6;1253:1;1250:13;1242:113;;;1332:11;;;1326:18;1313:11;;;1306:39;1278:2;1271:10;1242:113;;;1373:6;1370:1;1367:13;1364:48;;;-1:-1:-1;;1408:1:1;1390:16;;1383:27;1160:258::o;1423:::-;1465:3;1503:5;1497:12;1530:6;1525:3;1518:19;1546:63;1602:6;1595:4;1590:3;1586:14;1579:4;1572:5;1568:16;1546:63;:::i;:::-;1663:2;1642:15;-1:-1:-1;;1638:29:1;1629:39;;;;1670:4;1625:50;;1423:258;-1:-1:-1;;1423:258:1:o;1686:220::-;1835:2;1824:9;1817:21;1798:4;1855:45;1896:2;1885:9;1881:18;1873:6;1855:45;:::i;1911:131::-;-1:-1:-1;;;;;1986:31:1;;1976:42;;1966:70;;2032:1;2029;2022:12;1966:70;1911:131;:::o;2047:315::-;2115:6;2123;2176:2;2164:9;2155:7;2151:23;2147:32;2144:52;;;2192:1;2189;2182:12;2144:52;2231:9;2218:23;2250:31;2275:5;2250:31;:::i;:::-;2300:5;2352:2;2337:18;;;;2324:32;;-1:-1:-1;;;2047:315:1:o;2549:180::-;2608:6;2661:2;2649:9;2640:7;2636:23;2632:32;2629:52;;;2677:1;2674;2667:12;2629:52;-1:-1:-1;2700:23:1;;2549:180;-1:-1:-1;2549:180:1:o;2734:456::-;2811:6;2819;2827;2880:2;2868:9;2859:7;2855:23;2851:32;2848:52;;;2896:1;2893;2886:12;2848:52;2935:9;2922:23;2954:31;2979:5;2954:31;:::i;:::-;3004:5;-1:-1:-1;3061:2:1;3046:18;;3033:32;3074:33;3033:32;3074:33;:::i;:::-;2734:456;;3126:7;;-1:-1:-1;;;3180:2:1;3165:18;;;;3152:32;;2734:456::o;3562:315::-;3630:6;3638;3691:2;3679:9;3670:7;3666:23;3662:32;3659:52;;;3707:1;3704;3697:12;3659:52;3743:9;3730:23;3720:33;;3803:2;3792:9;3788:18;3775:32;3816:31;3841:5;3816:31;:::i;:::-;3866:5;3856:15;;;3562:315;;;;;:::o;4071:127::-;4132:10;4127:3;4123:20;4120:1;4113:31;4163:4;4160:1;4153:15;4187:4;4184:1;4177:15;4203:718;4245:5;4298:3;4291:4;4283:6;4279:17;4275:27;4265:55;;4316:1;4313;4306:12;4265:55;4352:6;4339:20;4378:18;4415:2;4411;4408:10;4405:36;;;4421:18;;:::i;:::-;4496:2;4490:9;4464:2;4550:13;;-1:-1:-1;;4546:22:1;;;4570:2;4542:31;4538:40;4526:53;;;4594:18;;;4614:22;;;4591:46;4588:72;;;4640:18;;:::i;:::-;4680:10;4676:2;4669:22;4715:2;4707:6;4700:18;4761:3;4754:4;4749:2;4741:6;4737:15;4733:26;4730:35;4727:55;;;4778:1;4775;4768:12;4727:55;4842:2;4835:4;4827:6;4823:17;4816:4;4808:6;4804:17;4791:54;4889:1;4882:4;4877:2;4869:6;4865:15;4861:26;4854:37;4909:6;4900:15;;;;;;4203:718;;;;:::o;4926:885::-;5039:6;5047;5055;5063;5071;5124:3;5112:9;5103:7;5099:23;5095:33;5092:53;;;5141:1;5138;5131:12;5092:53;5180:9;5167:23;5199:31;5224:5;5199:31;:::i;:::-;5249:5;-1:-1:-1;5306:2:1;5291:18;;5278:32;5319:33;5278:32;5319:33;:::i;:::-;5371:7;-1:-1:-1;5425:2:1;5410:18;;5397:32;;-1:-1:-1;5480:2:1;5465:18;;5452:32;5503:18;5533:14;;;5530:34;;;5560:1;5557;5550:12;5530:34;5583:49;5624:7;5615:6;5604:9;5600:22;5583:49;:::i;:::-;5573:59;;5685:3;5674:9;5670:19;5657:33;5641:49;;5715:2;5705:8;5702:16;5699:36;;;5731:1;5728;5721:12;5699:36;;5754:51;5797:7;5786:8;5775:9;5771:24;5754:51;:::i;:::-;5744:61;;;4926:885;;;;;;;;:::o;5816:247::-;5875:6;5928:2;5916:9;5907:7;5903:23;5899:32;5896:52;;;5944:1;5941;5934:12;5896:52;5983:9;5970:23;6002:31;6027:5;6002:31;:::i;6068:523::-;6154:6;6162;6170;6223:2;6211:9;6202:7;6198:23;6194:32;6191:52;;;6239:1;6236;6229:12;6191:52;6278:9;6265:23;6297:31;6322:5;6297:31;:::i;:::-;6347:5;-1:-1:-1;6399:2:1;6384:18;;6371:32;;-1:-1:-1;6454:2:1;6439:18;;6426:32;6481:18;6470:30;;6467:50;;;6513:1;6510;6503:12;6467:50;6536:49;6577:7;6568:6;6557:9;6553:22;6536:49;:::i;:::-;6526:59;;;6068:523;;;;;:::o;6596:388::-;6664:6;6672;6725:2;6713:9;6704:7;6700:23;6696:32;6693:52;;;6741:1;6738;6731:12;6693:52;6780:9;6767:23;6799:31;6824:5;6799:31;:::i;:::-;6849:5;-1:-1:-1;6906:2:1;6891:18;;6878:32;6919:33;6878:32;6919:33;:::i;6989:743::-;7093:6;7101;7109;7117;7170:3;7158:9;7149:7;7145:23;7141:33;7138:53;;;7187:1;7184;7177:12;7138:53;7226:9;7213:23;7245:31;7270:5;7245:31;:::i;:::-;7295:5;-1:-1:-1;7347:2:1;7332:18;;7319:32;;-1:-1:-1;7402:2:1;7387:18;;7374:32;7425:18;7455:14;;;7452:34;;;7482:1;7479;7472:12;7452:34;7505:49;7546:7;7537:6;7526:9;7522:22;7505:49;:::i;:::-;7495:59;;7607:2;7596:9;7592:18;7579:32;7563:48;;7636:2;7626:8;7623:16;7620:36;;;7652:1;7649;7642:12;7620:36;;7675:51;7718:7;7707:8;7696:9;7692:24;7675:51;:::i;:::-;7665:61;;;6989:743;;;;;;;:::o;7737:388::-;7814:6;7822;7875:2;7863:9;7854:7;7850:23;7846:32;7843:52;;;7891:1;7888;7881:12;7843:52;7927:9;7914:23;7904:33;;7988:2;7977:9;7973:18;7960:32;8015:18;8007:6;8004:30;8001:50;;;8047:1;8044;8037:12;8001:50;8070:49;8111:7;8102:6;8091:9;8087:22;8070:49;:::i;:::-;8060:59;;;7737:388;;;;;:::o;8130:380::-;8209:1;8205:12;;;;8252;;;8273:61;;8327:4;8319:6;8315:17;8305:27;;8273:61;8380:2;8372:6;8369:14;8349:18;8346:38;8343:161;;;8426:10;8421:3;8417:20;8414:1;8407:31;8461:4;8458:1;8451:15;8489:4;8486:1;8479:15;8343:161;;8130:380;;;:::o;9489:184::-;9559:6;9612:2;9600:9;9591:7;9587:23;9583:32;9580:52;;;9628:1;9625;9618:12;9580:52;-1:-1:-1;9651:16:1;;9489:184;-1:-1:-1;9489:184:1:o;10111:127::-;10172:10;10167:3;10163:20;10160:1;10153:31;10203:4;10200:1;10193:15;10227:4;10224:1;10217:15;10243:217;10283:1;10309;10299:132;;10353:10;10348:3;10344:20;10341:1;10334:31;10388:4;10385:1;10378:15;10416:4;10413:1;10406:15;10299:132;-1:-1:-1;10445:9:1;;10243:217::o;10897:400::-;11099:2;11081:21;;;11138:2;11118:18;;;11111:30;11177:34;11172:2;11157:18;;11150:62;-1:-1:-1;;;11243:2:1;11228:18;;11221:34;11287:3;11272:19;;10897:400::o;12119:125::-;12159:4;12187:1;12184;12181:8;12178:34;;;12192:18;;:::i;:::-;-1:-1:-1;12229:9:1;;12119:125::o;12665:408::-;12867:2;12849:21;;;12906:2;12886:18;;;12879:30;12945:34;12940:2;12925:18;;12918:62;-1:-1:-1;;;13011:2:1;12996:18;;12989:42;13063:3;13048:19;;12665:408::o;13078:168::-;13118:7;13184:1;13180;13176:6;13172:14;13169:1;13166:21;13161:1;13154:9;13147:17;13143:45;13140:71;;;13191:18;;:::i;:::-;-1:-1:-1;13231:9:1;;13078:168::o;14931:404::-;15133:2;15115:21;;;15172:2;15152:18;;;15145:30;15211:34;15206:2;15191:18;;15184:62;-1:-1:-1;;;15277:2:1;15262:18;;15255:38;15325:3;15310:19;;14931:404::o;17595:251::-;17665:6;17718:2;17706:9;17697:7;17693:23;17689:32;17686:52;;;17734:1;17731;17724:12;17686:52;17766:9;17760:16;17785:31;17810:5;17785:31;:::i;17851:732::-;-1:-1:-1;;;;;18194:15:1;;;18176:34;;18246:15;;;18241:2;18226:18;;18219:43;18298:15;;18293:2;18278:18;;18271:43;18345:2;18330:18;;18323:34;;;18394:3;18388;18373:19;;18366:32;;;18119:4;;18421:46;;18447:19;;18439:6;18421:46;:::i;:::-;18516:9;18508:6;18504:22;18498:3;18487:9;18483:19;18476:51;18544:33;18570:6;18562;18544:33;:::i;:::-;18536:41;17851:732;-1:-1:-1;;;;;;;;;17851:732:1:o;18996:128::-;19036:3;19067:1;19063:6;19060:1;19057:13;19054:39;;;19073:18;;:::i;:::-;-1:-1:-1;19109:9:1;;18996:128::o;19129:450::-;19350:6;19339:9;19332:25;19393:2;19388;19377:9;19373:18;19366:30;19313:4;19419:45;19460:2;19449:9;19445:18;19437:6;19419:45;:::i;:::-;19512:9;19504:6;19500:22;19495:2;19484:9;19480:18;19473:50;19540:33;19566:6;19558;19540:33;:::i;:::-;19532:41;19129:450;-1:-1:-1;;;;;;19129:450:1:o;20070:786::-;20481:25;20476:3;20469:38;20451:3;20536:6;20530:13;20552:62;20607:6;20602:2;20597:3;20593:12;20586:4;20578:6;20574:17;20552:62;:::i;:::-;-1:-1:-1;;;20673:2:1;20633:16;;;20665:11;;;20658:40;20723:13;;20745:63;20723:13;20794:2;20786:11;;20779:4;20767:17;;20745:63;:::i;:::-;20828:17;20847:2;20824:26;;20070:786;-1:-1:-1;;;;20070:786:1:o;22029:127::-;22090:10;22085:3;22081:20;22078:1;22071:31;22121:4;22118:1;22111:15;22145:4;22142:1;22135:15;22161:136;22200:3;22228:5;22218:39;;22237:18;;:::i;:::-;-1:-1:-1;;;22273:18:1;;22161:136::o
Swarm Source
ipfs://38058f9684da493246c949a30a33126c32eb3e2f0cc5a5141effadd260503a7c
Loading...
Loading
Loading...
Loading
OVERVIEW
“BIG PICTURE COIN” is the first Hollywood using crypto to revolutionize how films are financed and by creating fan-content. Purchasing BPC Tokens will give you real-life perks to actually participate in the Film production process. Features staking at 3% APY yields, and a weekly BPC Token lottery.Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.