Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 20 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18728531 | 327 days ago | 4.042845 ETH | ||||
16567115 | 630 days ago | 0.0035 ETH | ||||
16226751 | 678 days ago | 0.004875 ETH | ||||
16175865 | 685 days ago | 0.02025 ETH | ||||
16143583 | 689 days ago | 0.131375 ETH | ||||
16091874 | 697 days ago | 0.002155 ETH | ||||
16055750 | 702 days ago | 0.0055 ETH | ||||
15864020 | 728 days ago | 0.009615 ETH | ||||
15771875 | 741 days ago | 0.0125 ETH | ||||
15690815 | 753 days ago | 0.00125 ETH | ||||
15690073 | 753 days ago | 1.84125 ETH | ||||
15690017 | 753 days ago | 0.005 ETH | ||||
15683377 | 754 days ago | 0.005 ETH | ||||
15186349 | 830 days ago | 0.15 ETH | ||||
14956870 | 868 days ago | 0.136 ETH | ||||
14860576 | 884 days ago | 0.0003 ETH | ||||
14860547 | 884 days ago | 0.00015 ETH | ||||
14844883 | 886 days ago | 0.008625 ETH | ||||
14673854 | 914 days ago | 1.683 ETH | ||||
14655948 | 916 days ago | 0.0225 ETH |
Loading...
Loading
Contract Name:
EaselyPayout
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-20 */ // SPDX-License-Identifier: MIT 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); } /** * @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; } } /** * @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; } } /** * @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); } } /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @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 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 {_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 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 granted `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}. * ==== */ 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); } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable { function getRoleMember(bytes32 role, uint256 index) external view returns (address); function getRoleMemberCount(bytes32 role) external view returns (uint256); } /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {grantRole} to track enumerable memberships */ function grantRole(bytes32 role, address account) public virtual override { super.grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {revokeRole} to track enumerable memberships */ function revokeRole(bytes32 role, address account) public virtual override { super.revokeRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {renounceRole} to track enumerable memberships */ function renounceRole(bytes32 role, address account) public virtual override { super.renounceRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {_setupRole} to track enumerable memberships */ function _setupRole(bytes32 role, address account) internal virtual override { super._setupRole(role, account); _roleMembers[role].add(account); } } /** * @dev External interface of the EaselyPayout contract */ interface IEaselyPayout { /** * @dev Takes in a payable amount and splits it among the given royalties. * Also takes a cut of the payable amount depending on the sender and the primaryPayout address. * Ensures that this method never splits over 100% of the payin amount. */ function splitPayable( address primaryPayout, address[] memory royalties, uint256[] memory bps ) external payable; } /** * @dev Implementation of {IEaselyPayout} that has AccessControlEnumerable enabled. * Has a primary payable method that splits the amount into the given royalties, also * has two levels of access control: ADMIN and CREATOR. * * addresses with the ADMIN role can: * - set the default BPS fee for Easely (must be 5% or under) * - withdraw the accumulated balance to any address * - grant the CREATOR role * * addresses with the CREATOR role can: * - change any addresses BPS value */ contract EaselyPayout is AccessControlEnumerable, IEaselyPayout { bytes32 public constant CREATOR_ROLE = keccak256("CREATOR_ROLE"); // Default of 5% taken for every transaction uint256 public defaultFeeBPS = 500; // Max percentage that the admin role can set as the default uint256 public constant MAX_EASELY_FEE_BPS = 500; // Number to help calculate basis point math uint256 private constant BASIS_POINT_CONVERSION = 10_000; // Mapping of addresses that have custom BPS transaction fees. // BPS of 0 results in a default fee mapping(address => uint256) private _addressToBPS; event AddressBPSUpdated(address indexed primary, uint256 updatedBPS); event DefaultBPSUpdated(uint256 updatedBPS); /** * @dev Sets up the contract initializer with both ADMIN and CREATOR roles. * */ constructor() { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(CREATOR_ROLE, _msgSender()); } /** * @dev returns the transaction fee taken if sender sends a payout with a creatorAddress. * If senderAddress has a custom fee set it will prioritize that over the creatorAddress. */ function _getEaselyBPS(address senderAddress, address creatorAddress) internal view returns (uint256) { uint256 bps = _addressToBPS[senderAddress]; // If the sender BPS is never set, default to creatorAddress fee. if (bps == 0) { bps = _addressToBPS[creatorAddress]; } // If the creatorAddress BPS is also not set, the fee is the default fee if (bps == 0) { bps = defaultFeeBPS; } // Since BPS map is initialized to 0, we will treat any BPS greater than the max // to be a bps of 0; if (bps > MAX_EASELY_FEE_BPS) { bps = 0; } return bps; } /** * @dev Updates the custom BPS of a given address. * If the BPS fee is set to 0 then the address will be charged the default fee. * If the BPS fee is set above MAX_BPS_FEE the address actually has a BPS fee of 0. * * Requirements: * - sender must have `CREATOR_ROLE` */ function updateAddressBPS(address newAddress, uint256 easelyFeeBPS) external { require(hasRole(CREATOR_ROLE, _msgSender()), "Need creator role"); _addressToBPS[newAddress] = easelyFeeBPS; emit AddressBPSUpdated(newAddress, easelyFeeBPS); } /** * @dev Updates the default BPS for all addresses without a custom BPS fee. * * Requirements: * - sender has `DEFAULT_ADMIN_ROLE`. * - fee cannot be over MAX_EASELY_FEE_BPS */ function updateDefaultBPSFee(uint256 bpsFee) external { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Need admin role"); require(bpsFee <= MAX_EASELY_FEE_BPS, "Max fee is 5% (500 BPS)"); defaultFeeBPS = bpsFee; emit DefaultBPSUpdated(bpsFee); } /** * @dev See {IEaselyPayout-splitPayable}. */ function splitPayable( address primaryPayout, address[] memory royalties, uint256[] memory bps ) external payable override { require(royalties.length == bps.length, "invalid royalties"); // Divide first to prevent overflow. uint256 payinBasis = msg.value / BASIS_POINT_CONVERSION; uint256 primaryBPS = BASIS_POINT_CONVERSION - _getEaselyBPS(_msgSender(), primaryPayout); for (uint256 i = 0; i < royalties.length; i++) { if (royalties[i] == address(0)) { continue; } require(primaryBPS >= bps[i], "Invalid BPS"); payable(royalties[i]).transfer(payinBasis * bps[i]); primaryBPS -= bps[i]; } payable(primaryPayout).transfer(payinBasis * primaryBPS); } /** * @dev See {_setupRole} above */ function getEaselyBPS(address senderAddress, address creatorAddress) external view returns (uint256) { return _getEaselyBPS(senderAddress, creatorAddress); } /** * @dev Allows the admin to withdraw an amount from this contract to any address * * Requirements: * - Only Admin Role can withdraw */ function withdrawBalance(address withdrawAddress, uint256 amount) external { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Need admin role"); payable(withdrawAddress).transfer(amount); } // Allows this collection to receive ETH receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"primary","type":"address"},{"indexed":false,"internalType":"uint256","name":"updatedBPS","type":"uint256"}],"name":"AddressBPSUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"updatedBPS","type":"uint256"}],"name":"DefaultBPSUpdated","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"},{"inputs":[],"name":"CREATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_EASELY_FEE_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultFeeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"senderAddress","type":"address"},{"internalType":"address","name":"creatorAddress","type":"address"}],"name":"getEaselyBPS","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":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"primaryPayout","type":"address"},{"internalType":"address[]","name":"royalties","type":"address[]"},{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"name":"splitPayable","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"},{"internalType":"uint256","name":"easelyFeeBPS","type":"uint256"}],"name":"updateAddressBPS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bpsFee","type":"uint256"}],"name":"updateDefaultBPSFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526101f46002553480156200001757600080fd5b506200002560003362000057565b620000517f828634d95e775031b9ff576b159a8509d3053581a8c9c4d7d86899e0afcd882f3362000057565b620001bc565b6200006e82826200009a60201b6200086a1760201c565b60008281526001602090815260409091206200009591839062000878620000aa821b17901c565b505050565b620000a68282620000ca565b5050565b6000620000c1836001600160a01b0384166200016a565b90505b92915050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620000a6576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001263390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000818152600183016020526040812054620001b357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620000c4565b506000620000c4565b61130880620001cc6000396000f3fe6080604052600436106101025760003560e01c80638b2cf07111610095578063a217fddf11610064578063a217fddf146102ce578063ca15c873146102e3578063ced1f47214610303578063d547741f14610323578063fd990a071461034357600080fd5b80638b2cf071146102435780638b52e2cb146102635780639010d07c1461027657806391d14854146102ae57600080fd5b8063315f8f69116100d1578063315f8f69146101c357806336568abe146101d957806385b77356146101f95780638aeda25a1461020f57600080fd5b806301ffc9a71461010e5780630cf20cc914610143578063248a9ca3146101655780632f2ff15d146101a357600080fd5b3661010957005b600080fd5b34801561011a57600080fd5b5061012e610129366004611081565b610363565b60405190151581526020015b60405180910390f35b34801561014f57600080fd5b5061016361015e366004610ff9565b61038e565b005b34801561017157600080fd5b50610195610180366004611023565b60009081526020819052604090206001015490565b60405190815260200161013a565b3480156101af57600080fd5b506101636101be36600461103c565b610417565b3480156101cf57600080fd5b506101956101f481565b3480156101e557600080fd5b506101636101f436600461103c565b610439565b34801561020557600080fd5b5061019560025481565b34801561021b57600080fd5b506101957f828634d95e775031b9ff576b159a8509d3053581a8c9c4d7d86899e0afcd882f81565b34801561024f57600080fd5b5061016361025e366004611023565b61045b565b610163610271366004610f20565b610531565b34801561028257600080fd5b5061029661029136600461105f565b610732565b6040516001600160a01b03909116815260200161013a565b3480156102ba57600080fd5b5061012e6102c936600461103c565b610751565b3480156102da57600080fd5b50610195600081565b3480156102ef57600080fd5b506101956102fe366004611023565b61077a565b34801561030f57600080fd5b5061019561031e366004610eed565b610791565b34801561032f57600080fd5b5061016361033e36600461103c565b61079d565b34801561034f57600080fd5b5061016361035e366004610ff9565b6107a7565b60006001600160e01b03198216635a05180f60e01b148061038857506103888261088d565b92915050565b610399600033610751565b6103dc5760405162461bcd60e51b815260206004820152600f60248201526e4e6565642061646d696e20726f6c6560881b60448201526064015b60405180910390fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610412573d6000803e3d6000fd5b505050565b61042182826108c2565b60008281526001602052604090206104129082610878565b61044382826108e8565b60008281526001602052604090206104129082610962565b610466600033610751565b6104a45760405162461bcd60e51b815260206004820152600f60248201526e4e6565642061646d696e20726f6c6560881b60448201526064016103d3565b6101f48111156104f65760405162461bcd60e51b815260206004820152601760248201527f4d6178206665652069732035252028353030204250532900000000000000000060448201526064016103d3565b60028190556040518181527fd7999f3839626b18b768bd9d3370a4fbfcf81d014ac0a8e8d024255e79ccbbc49060200160405180910390a150565b80518251146105765760405162461bcd60e51b8152602060048201526011602482015270696e76616c696420726f79616c7469657360781b60448201526064016103d3565b6000610584612710346111c0565b905060006105923386610977565b61059e90612710611201565b905060005b84518110156106ea5760006001600160a01b03168582815181106105c9576105c96112a6565b60200260200101516001600160a01b031614156105e5576106d8565b8381815181106105f7576105f76112a6565b602002602001015182101561063c5760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642042505360a81b60448201526064016103d3565b84818151811061064e5761064e6112a6565b60200260200101516001600160a01b03166108fc858381518110610674576106746112a6565b60200260200101518561068791906111e2565b6040518115909202916000818181858888f193505050501580156106af573d6000803e3d6000fd5b508381815181106106c2576106c26112a6565b6020026020010151826106d59190611201565b91505b806106e28161125f565b9150506105a3565b506001600160a01b0385166108fc61070283856111e2565b6040518115909202916000818181858888f1935050505015801561072a573d6000803e3d6000fd5b505050505050565b600082815260016020526040812061074a90836109ce565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6000818152600160205260408120610388906109da565b600061074a8383610977565b61044382826109e4565b6107d17f828634d95e775031b9ff576b159a8509d3053581a8c9c4d7d86899e0afcd882f33610751565b6108115760405162461bcd60e51b81526020600482015260116024820152704e6565642063726561746f7220726f6c6560781b60448201526064016103d3565b6001600160a01b03821660008181526003602052604090819020839055517fedc3d955c1799a45a992713ac6c384583608d149501020a6fa832ae7d3efa98b9061085e9084815260200190565b60405180910390a25050565b6108748282610a0a565b5050565b600061074a836001600160a01b038416610a8e565b60006001600160e01b03198216637965db0b60e01b148061038857506301ffc9a760e01b6001600160e01b0319831614610388565b6000828152602081905260409020600101546108de8133610add565b6104128383610a0a565b6001600160a01b03811633146109585760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016103d3565b6108748282610b41565b600061074a836001600160a01b038416610ba6565b6001600160a01b038216600090815260036020526040812054806109b057506001600160a01b0382166000908152600360205260409020545b806109ba57506002545b6101f481111561074a575060009392505050565b600061074a8383610c99565b6000610388825490565b600082815260208190526040902060010154610a008133610add565b6104128383610b41565b610a148282610751565b610874576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610a4a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000818152600183016020526040812054610ad557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610388565b506000610388565b610ae78282610751565b61087457610aff816001600160a01b03166014610cc3565b610b0a836020610cc3565b604051602001610b1b9291906110ab565b60408051601f198184030181529082905262461bcd60e51b82526103d391600401611120565b610b4b8282610751565b15610874576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60008181526001830160205260408120548015610c8f576000610bca600183611201565b8554909150600090610bde90600190611201565b9050818114610c43576000866000018281548110610bfe57610bfe6112a6565b9060005260206000200154905080876000018481548110610c2157610c216112a6565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610c5457610c54611290565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610388565b6000915050610388565b6000826000018281548110610cb057610cb06112a6565b9060005260206000200154905092915050565b60606000610cd28360026111e2565b610cdd9060026111a8565b67ffffffffffffffff811115610cf557610cf56112bc565b6040519080825280601f01601f191660200182016040528015610d1f576020820181803683370190505b509050600360fc1b81600081518110610d3a57610d3a6112a6565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d6957610d696112a6565b60200101906001600160f81b031916908160001a9053506000610d8d8460026111e2565b610d989060016111a8565b90505b6001811115610e10576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610dcc57610dcc6112a6565b1a60f81b828281518110610de257610de26112a6565b60200101906001600160f81b031916908160001a90535060049490941c93610e0981611248565b9050610d9b565b50831561074a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016103d3565b80356001600160a01b0381168114610e7657600080fd5b919050565b600082601f830112610e8c57600080fd5b81356020610ea1610e9c83611184565b611153565b80838252828201915082860187848660051b8901011115610ec157600080fd5b60005b85811015610ee057813584529284019290840190600101610ec4565b5090979650505050505050565b60008060408385031215610f0057600080fd5b610f0983610e5f565b9150610f1760208401610e5f565b90509250929050565b600080600060608486031215610f3557600080fd5b610f3e84610e5f565b925060208085013567ffffffffffffffff80821115610f5c57600080fd5b818701915087601f830112610f7057600080fd5b8135610f7e610e9c82611184565b8082825285820191508585018b878560051b8801011115610f9e57600080fd5b600095505b83861015610fc857610fb481610e5f565b835260019590950194918601918601610fa3565b50965050506040870135925080831115610fe157600080fd5b5050610fef86828701610e7b565b9150509250925092565b6000806040838503121561100c57600080fd5b61101583610e5f565b946020939093013593505050565b60006020828403121561103557600080fd5b5035919050565b6000806040838503121561104f57600080fd5b82359150610f1760208401610e5f565b6000806040838503121561107257600080fd5b50508035926020909101359150565b60006020828403121561109357600080fd5b81356001600160e01b03198116811461074a57600080fd5b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516110e3816017850160208801611218565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611114816028840160208801611218565b01602801949350505050565b602081526000825180602084015261113f816040850160208701611218565b601f01601f19169190910160400192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561117c5761117c6112bc565b604052919050565b600067ffffffffffffffff82111561119e5761119e6112bc565b5060051b60200190565b600082198211156111bb576111bb61127a565b500190565b6000826111dd57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156111fc576111fc61127a565b500290565b6000828210156112135761121361127a565b500390565b60005b8381101561123357818101518382015260200161121b565b83811115611242576000848401525b50505050565b6000816112575761125761127a565b506000190190565b60006000198214156112735761127361127a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220bb600daff1174e6518f8f19956d31a3cfbb0e01ba47a0cf17d5d7dd0eb17158764736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101025760003560e01c80638b2cf07111610095578063a217fddf11610064578063a217fddf146102ce578063ca15c873146102e3578063ced1f47214610303578063d547741f14610323578063fd990a071461034357600080fd5b80638b2cf071146102435780638b52e2cb146102635780639010d07c1461027657806391d14854146102ae57600080fd5b8063315f8f69116100d1578063315f8f69146101c357806336568abe146101d957806385b77356146101f95780638aeda25a1461020f57600080fd5b806301ffc9a71461010e5780630cf20cc914610143578063248a9ca3146101655780632f2ff15d146101a357600080fd5b3661010957005b600080fd5b34801561011a57600080fd5b5061012e610129366004611081565b610363565b60405190151581526020015b60405180910390f35b34801561014f57600080fd5b5061016361015e366004610ff9565b61038e565b005b34801561017157600080fd5b50610195610180366004611023565b60009081526020819052604090206001015490565b60405190815260200161013a565b3480156101af57600080fd5b506101636101be36600461103c565b610417565b3480156101cf57600080fd5b506101956101f481565b3480156101e557600080fd5b506101636101f436600461103c565b610439565b34801561020557600080fd5b5061019560025481565b34801561021b57600080fd5b506101957f828634d95e775031b9ff576b159a8509d3053581a8c9c4d7d86899e0afcd882f81565b34801561024f57600080fd5b5061016361025e366004611023565b61045b565b610163610271366004610f20565b610531565b34801561028257600080fd5b5061029661029136600461105f565b610732565b6040516001600160a01b03909116815260200161013a565b3480156102ba57600080fd5b5061012e6102c936600461103c565b610751565b3480156102da57600080fd5b50610195600081565b3480156102ef57600080fd5b506101956102fe366004611023565b61077a565b34801561030f57600080fd5b5061019561031e366004610eed565b610791565b34801561032f57600080fd5b5061016361033e36600461103c565b61079d565b34801561034f57600080fd5b5061016361035e366004610ff9565b6107a7565b60006001600160e01b03198216635a05180f60e01b148061038857506103888261088d565b92915050565b610399600033610751565b6103dc5760405162461bcd60e51b815260206004820152600f60248201526e4e6565642061646d696e20726f6c6560881b60448201526064015b60405180910390fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610412573d6000803e3d6000fd5b505050565b61042182826108c2565b60008281526001602052604090206104129082610878565b61044382826108e8565b60008281526001602052604090206104129082610962565b610466600033610751565b6104a45760405162461bcd60e51b815260206004820152600f60248201526e4e6565642061646d696e20726f6c6560881b60448201526064016103d3565b6101f48111156104f65760405162461bcd60e51b815260206004820152601760248201527f4d6178206665652069732035252028353030204250532900000000000000000060448201526064016103d3565b60028190556040518181527fd7999f3839626b18b768bd9d3370a4fbfcf81d014ac0a8e8d024255e79ccbbc49060200160405180910390a150565b80518251146105765760405162461bcd60e51b8152602060048201526011602482015270696e76616c696420726f79616c7469657360781b60448201526064016103d3565b6000610584612710346111c0565b905060006105923386610977565b61059e90612710611201565b905060005b84518110156106ea5760006001600160a01b03168582815181106105c9576105c96112a6565b60200260200101516001600160a01b031614156105e5576106d8565b8381815181106105f7576105f76112a6565b602002602001015182101561063c5760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642042505360a81b60448201526064016103d3565b84818151811061064e5761064e6112a6565b60200260200101516001600160a01b03166108fc858381518110610674576106746112a6565b60200260200101518561068791906111e2565b6040518115909202916000818181858888f193505050501580156106af573d6000803e3d6000fd5b508381815181106106c2576106c26112a6565b6020026020010151826106d59190611201565b91505b806106e28161125f565b9150506105a3565b506001600160a01b0385166108fc61070283856111e2565b6040518115909202916000818181858888f1935050505015801561072a573d6000803e3d6000fd5b505050505050565b600082815260016020526040812061074a90836109ce565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6000818152600160205260408120610388906109da565b600061074a8383610977565b61044382826109e4565b6107d17f828634d95e775031b9ff576b159a8509d3053581a8c9c4d7d86899e0afcd882f33610751565b6108115760405162461bcd60e51b81526020600482015260116024820152704e6565642063726561746f7220726f6c6560781b60448201526064016103d3565b6001600160a01b03821660008181526003602052604090819020839055517fedc3d955c1799a45a992713ac6c384583608d149501020a6fa832ae7d3efa98b9061085e9084815260200190565b60405180910390a25050565b6108748282610a0a565b5050565b600061074a836001600160a01b038416610a8e565b60006001600160e01b03198216637965db0b60e01b148061038857506301ffc9a760e01b6001600160e01b0319831614610388565b6000828152602081905260409020600101546108de8133610add565b6104128383610a0a565b6001600160a01b03811633146109585760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016103d3565b6108748282610b41565b600061074a836001600160a01b038416610ba6565b6001600160a01b038216600090815260036020526040812054806109b057506001600160a01b0382166000908152600360205260409020545b806109ba57506002545b6101f481111561074a575060009392505050565b600061074a8383610c99565b6000610388825490565b600082815260208190526040902060010154610a008133610add565b6104128383610b41565b610a148282610751565b610874576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610a4a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000818152600183016020526040812054610ad557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610388565b506000610388565b610ae78282610751565b61087457610aff816001600160a01b03166014610cc3565b610b0a836020610cc3565b604051602001610b1b9291906110ab565b60408051601f198184030181529082905262461bcd60e51b82526103d391600401611120565b610b4b8282610751565b15610874576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60008181526001830160205260408120548015610c8f576000610bca600183611201565b8554909150600090610bde90600190611201565b9050818114610c43576000866000018281548110610bfe57610bfe6112a6565b9060005260206000200154905080876000018481548110610c2157610c216112a6565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610c5457610c54611290565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610388565b6000915050610388565b6000826000018281548110610cb057610cb06112a6565b9060005260206000200154905092915050565b60606000610cd28360026111e2565b610cdd9060026111a8565b67ffffffffffffffff811115610cf557610cf56112bc565b6040519080825280601f01601f191660200182016040528015610d1f576020820181803683370190505b509050600360fc1b81600081518110610d3a57610d3a6112a6565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d6957610d696112a6565b60200101906001600160f81b031916908160001a9053506000610d8d8460026111e2565b610d989060016111a8565b90505b6001811115610e10576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610dcc57610dcc6112a6565b1a60f81b828281518110610de257610de26112a6565b60200101906001600160f81b031916908160001a90535060049490941c93610e0981611248565b9050610d9b565b50831561074a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016103d3565b80356001600160a01b0381168114610e7657600080fd5b919050565b600082601f830112610e8c57600080fd5b81356020610ea1610e9c83611184565b611153565b80838252828201915082860187848660051b8901011115610ec157600080fd5b60005b85811015610ee057813584529284019290840190600101610ec4565b5090979650505050505050565b60008060408385031215610f0057600080fd5b610f0983610e5f565b9150610f1760208401610e5f565b90509250929050565b600080600060608486031215610f3557600080fd5b610f3e84610e5f565b925060208085013567ffffffffffffffff80821115610f5c57600080fd5b818701915087601f830112610f7057600080fd5b8135610f7e610e9c82611184565b8082825285820191508585018b878560051b8801011115610f9e57600080fd5b600095505b83861015610fc857610fb481610e5f565b835260019590950194918601918601610fa3565b50965050506040870135925080831115610fe157600080fd5b5050610fef86828701610e7b565b9150509250925092565b6000806040838503121561100c57600080fd5b61101583610e5f565b946020939093013593505050565b60006020828403121561103557600080fd5b5035919050565b6000806040838503121561104f57600080fd5b82359150610f1760208401610e5f565b6000806040838503121561107257600080fd5b50508035926020909101359150565b60006020828403121561109357600080fd5b81356001600160e01b03198116811461074a57600080fd5b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516110e3816017850160208801611218565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611114816028840160208801611218565b01602801949350505050565b602081526000825180602084015261113f816040850160208701611218565b601f01601f19169190910160400192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561117c5761117c6112bc565b604052919050565b600067ffffffffffffffff82111561119e5761119e6112bc565b5060051b60200190565b600082198211156111bb576111bb61127a565b500190565b6000826111dd57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156111fc576111fc61127a565b500290565b6000828210156112135761121361127a565b500390565b60005b8381101561123357818101518382015260200161121b565b83811115611242576000848401525b50505050565b6000816112575761125761127a565b506000190190565b60006000198214156112735761127361127a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220bb600daff1174e6518f8f19956d31a3cfbb0e01ba47a0cf17d5d7dd0eb17158764736f6c63430008070033
Deployed Bytecode Sourcemap
30732:4747:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27148:290;;;;;;;;;;-1:-1:-1;27148:290:0;;;;;:::i;:::-;;:::i;:::-;;;4965:14:1;;4958:22;4940:41;;4928:2;4913:18;27148:290:0;;;;;;;;35178:215;;;;;;;;;;-1:-1:-1;35178:215:0;;;;;:::i;:::-;;:::i;:::-;;23045:123;;;;;;;;;;-1:-1:-1;23045:123:0;;;;;:::i;:::-;23111:7;23138:12;;;;;;;;;;:22;;;;23045:123;;;;5138:25:1;;;5126:2;5111:18;23045:123:0;4992:177:1;28664:165:0;;;;;;;;;;-1:-1:-1;28664:165:0;;;;;:::i;:::-;;:::i;31033:48::-;;;;;;;;;;;;31078:3;31033:48;;29187:206;;;;;;;;;;-1:-1:-1;29187:206:0;;;;;:::i;:::-;;:::i;30926:34::-;;;;;;;;;;;;;;;;30803:64;;;;;;;;;;;;30842:25;30803:64;;33519:291;;;;;;;;;;-1:-1:-1;33519:291:0;;;;;:::i;:::-;;:::i;33883:849::-;;;;;;:::i;:::-;;:::i;28037:186::-;;;;;;;;;;-1:-1:-1;28037:186:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4756:32:1;;;4738:51;;4726:2;4711:18;28037:186:0;4592:203:1;21889:180:0;;;;;;;;;;-1:-1:-1;21889:180:0;;;;;:::i;:::-;;:::i;19689:49::-;;;;;;;;;;-1:-1:-1;19689:49:0;19734:4;19689:49;;28397:175;;;;;;;;;;-1:-1:-1;28397:175:0;;;;;:::i;:::-;;:::i;34794:203::-;;;;;;;;;;-1:-1:-1;34794:203:0;;;;;:::i;:::-;;:::i;28922:170::-;;;;;;;;;;-1:-1:-1;28922:170:0;;;;;:::i;:::-;;:::i;33006:285::-;;;;;;;;;;-1:-1:-1;33006:285:0;;;;;:::i;:::-;;:::i;27148:290::-;27278:4;-1:-1:-1;;;;;;27320:57:0;;-1:-1:-1;;;27320:57:0;;:110;;;27394:36;27418:11;27394:23;:36::i;:::-;27300:130;27148:290;-1:-1:-1;;27148:290:0:o;35178:215::-;35272:41;19734:4;2342:10;21889:180;:::i;35272:41::-;35264:69;;;;-1:-1:-1;;;35264:69:0;;7925:2:1;35264:69:0;;;7907:21:1;7964:2;7944:18;;;7937:30;-1:-1:-1;;;7983:18:1;;;7976:45;8038:18;;35264:69:0;;;;;;;;;35344:41;;-1:-1:-1;;;;;35344:33:0;;;:41;;;;;35378:6;;35344:41;;;;35378:6;35344:33;:41;;;;;;;;;;;;;;;;;;;;;35178:215;;:::o;28664:165::-;28749:30;28765:4;28771:7;28749:15;:30::i;:::-;28790:18;;;;:12;:18;;;;;:31;;28813:7;28790:22;:31::i;29187:206::-;29307:33;29326:4;29332:7;29307:18;:33::i;:::-;29351:18;;;;:12;:18;;;;;:34;;29377:7;29351:25;:34::i;33519:291::-;33592:41;19734:4;2342:10;21889:180;:::i;33592:41::-;33584:69;;;;-1:-1:-1;;;33584:69:0;;7925:2:1;33584:69:0;;;7907:21:1;7964:2;7944:18;;;7937:30;-1:-1:-1;;;7983:18:1;;;7976:45;8038:18;;33584:69:0;7723:339:1;33584:69:0;31078:3;33672:6;:28;;33664:64;;;;-1:-1:-1;;;33664:64:0;;6817:2:1;33664:64:0;;;6799:21:1;6856:2;6836:18;;;6829:30;6895:25;6875:18;;;6868:53;6938:18;;33664:64:0;6615:347:1;33664:64:0;33739:13;:22;;;33777:25;;5138::1;;;33777::0;;5126:2:1;5111:18;33777:25:0;;;;;;;33519:291;:::o;33883:849::-;34077:3;:10;34057:9;:16;:30;34049:60;;;;-1:-1:-1;;;34049:60:0;;6125:2:1;34049:60:0;;;6107:21:1;6164:2;6144:18;;;6137:30;-1:-1:-1;;;6183:18:1;;;6176:47;6240:18;;34049:60:0;5923:341:1;34049:60:0;34166:18;34187:34;31188:6;34187:9;:34;:::i;:::-;34166:55;-1:-1:-1;34232:18:0;34291:42;2342:10;34319:13;34291;:42::i;:::-;34253:80;;31188:6;34253:80;:::i;:::-;34232:101;;34351:9;34346:310;34370:9;:16;34366:1;:20;34346:310;;;34436:1;-1:-1:-1;;;;;34412:26:0;:9;34422:1;34412:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;34412:26:0;;34408:75;;;34459:8;;34408:75;34521:3;34525:1;34521:6;;;;;;;;:::i;:::-;;;;;;;34507:10;:20;;34499:44;;;;-1:-1:-1;;;34499:44:0;;7169:2:1;34499:44:0;;;7151:21:1;7208:2;7188:18;;;7181:30;-1:-1:-1;;;7227:18:1;;;7220:41;7278:18;;34499:44:0;6967:335:1;34499:44:0;34566:9;34576:1;34566:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;34558:30:0;:51;34602:3;34606:1;34602:6;;;;;;;;:::i;:::-;;;;;;;34589:10;:19;;;;:::i;:::-;34558:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34638:3;34642:1;34638:6;;;;;;;;:::i;:::-;;;;;;;34624:20;;;;;:::i;:::-;;;34346:310;34388:3;;;;:::i;:::-;;;;34346:310;;;-1:-1:-1;;;;;;34668:31:0;;:56;34700:23;34713:10;34700;:23;:::i;:::-;34668:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34038:694;;33883:849;;;:::o;28037:186::-;28155:7;28187:18;;;:12;:18;;;;;:28;;28209:5;28187:21;:28::i;:::-;28180:35;28037:186;-1:-1:-1;;;28037:186:0:o;21889:180::-;22003:4;22032:12;;;;;;;;;;;-1:-1:-1;;;;;22032:29:0;;;;;;;;;;;;;;;21889:180::o;28397:175::-;28505:7;28537:18;;;:12;:18;;;;;:27;;:25;:27::i;34794:203::-;34913:7;34945:44;34959:13;34974:14;34945:13;:44::i;28922:170::-;29008:31;29025:4;29031:7;29008:16;:31::i;33006:285::-;33116:35;30842:25;2342:10;21889:180;:::i;33116:35::-;33108:65;;;;-1:-1:-1;;;33108:65:0;;6471:2:1;33108:65:0;;;6453:21:1;6510:2;6490:18;;;6483:30;-1:-1:-1;;;6529:18:1;;;6522:47;6586:18;;33108:65:0;6269:341:1;33108:65:0;-1:-1:-1;;;;;33184:25:0;;;;;;:13;:25;;;;;;;:40;;;33240:43;;;;;33212:12;5138:25:1;;5126:2;5111:18;;4992:177;33240:43:0;;;;;;;;33006:285;;:::o;25430:112::-;25509:25;25520:4;25526:7;25509:10;:25::i;:::-;25430:112;;:::o;12404:175::-;12492:4;12521:50;12526:3;-1:-1:-1;;;;;12546:23:0;;12521:4;:50::i;21517:280::-;21647:4;-1:-1:-1;;;;;;21689:47:0;;-1:-1:-1;;;21689:47:0;;:100;;-1:-1:-1;;;;;;;;;;1667:40:0;;;21753:36;1508:207;23430:188;23111:7;23138:12;;;;;;;;;;:22;;;21395:30;21406:4;2342:10;21395;:30::i;:::-;23585:25:::1;23596:4;23602:7;23585:10;:25::i;24560:287::-:0;-1:-1:-1;;;;;24702:23:0;;2342:10;24702:23;24680:120;;;;-1:-1:-1;;;24680:120:0;;7509:2:1;24680:120:0;;;7491:21:1;7548:2;7528:18;;;7521:30;7587:34;7567:18;;;7560:62;-1:-1:-1;;;7638:18:1;;;7631:45;7693:19;;24680:120:0;7307:411:1;24680:120:0;24813:26;24825:4;24831:7;24813:11;:26::i;12755:181::-;12846:4;12875:53;12883:3;-1:-1:-1;;;;;12903:23:0;;12875:7;:53::i;31947:731::-;-1:-1:-1;;;;;32106:28:0;;32067:7;32106:28;;;:13;:28;;;;;;32226:8;32222:76;;-1:-1:-1;;;;;;32257:29:0;;;;;;:13;:29;;;;;;32222:76;32396:8;32392:60;;-1:-1:-1;32427:13:0;;32392:60;31078:3;32588;:24;32584:64;;;-1:-1:-1;32635:1:0;32667:3;31947:731;-1:-1:-1;;;31947:731:0:o;13778:190::-;13879:7;13935:22;13939:3;13951:5;13935:3;:22::i;13307:117::-;13370:7;13397:19;13405:3;8539:18;;8456:109;23863:190;23111:7;23138:12;;;;;;;;;;:22;;;21395:30;21406:4;2342:10;21395;:30::i;:::-;24019:26:::1;24031:4;24037:7;24019:11;:26::i;25933:229::-:0;26008:22;26016:4;26022:7;26008;:22::i;:::-;26003:152;;26047:6;:12;;;;;;;;;;;-1:-1:-1;;;;;26047:29:0;;;;;;;;;:36;;-1:-1:-1;;26047:36:0;26079:4;26047:36;;;26130:12;2342:10;;2262:98;26130:12;-1:-1:-1;;;;;26103:40:0;26121:7;-1:-1:-1;;;;;26103:40:0;26115:4;26103:40;;;;;;;;;;25933:229;;:::o;6113:414::-;6176:4;8338:19;;;:12;;;:19;;;;;;6193:327;;-1:-1:-1;6236:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;6419:18;;6397:19;;;:12;;;:19;;;;;;:40;;;;6452:11;;6193:327;-1:-1:-1;6503:5:0;6496:12;;22359:497;22440:22;22448:4;22454:7;22440;:22::i;:::-;22435:414;;22628:41;22656:7;-1:-1:-1;;;;;22628:41:0;22666:2;22628:19;:41::i;:::-;22742:38;22770:4;22777:2;22742:19;:38::i;:::-;22533:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;22533:270:0;;;;;;;;;;-1:-1:-1;;;22479:358:0;;;;;;;:::i;26170:230::-;26245:22;26253:4;26259:7;26245;:22::i;:::-;26241:152;;;26316:5;26284:12;;;;;;;;;;;-1:-1:-1;;;;;26284:29:0;;;;;;;;;;:37;;-1:-1:-1;;26284:37:0;;;26341:40;2342:10;;26284:12;;26341:40;;26316:5;26341:40;26170:230;;:::o;6703:1420::-;6769:4;6908:19;;;:12;;;:19;;;;;;6944:15;;6940:1176;;7319:21;7343:14;7356:1;7343:10;:14;:::i;:::-;7392:18;;7319:38;;-1:-1:-1;7372:17:0;;7392:22;;7413:1;;7392:22;:::i;:::-;7372:42;;7448:13;7435:9;:26;7431:405;;7482:17;7502:3;:11;;7514:9;7502:22;;;;;;;;:::i;:::-;;;;;;;;;7482:42;;7656:9;7627:3;:11;;7639:13;7627:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;7741:23;;;:12;;;:23;;;;;:36;;;7431:405;7917:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;8012:3;:12;;:19;8025:5;8012:19;;;;;;;;;;;8005:26;;;8055:4;8048:11;;;;;;;6940:1176;8099:5;8092:12;;;;;8919:152;9013:7;9045:3;:11;;9057:5;9045:18;;;;;;;;:::i;:::-;;;;;;;;;9038:25;;8919:152;;;;:::o;4003:483::-;4105:13;4136:19;4168:10;4172:6;4168:1;:10;:::i;:::-;:14;;4181:1;4168:14;:::i;:::-;4158:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4158:25:0;;4136:47;;-1:-1:-1;;;4194:6:0;4201:1;4194:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4194:15:0;;;;;;;;;-1:-1:-1;;;4220:6:0;4227:1;4220:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4220:15:0;;;;;;;;-1:-1:-1;4251:9:0;4263:10;4267:6;4263:1;:10;:::i;:::-;:14;;4276:1;4263:14;:::i;:::-;4251:26;;4246:135;4283:1;4279;:5;4246:135;;;-1:-1:-1;;;4331:5:0;4339:3;4331:11;4318:25;;;;;;;:::i;:::-;;;;4306:6;4313:1;4306:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;4306:37:0;;;;;;;;-1:-1:-1;4368:1:0;4358:11;;;;;4286:3;;;:::i;:::-;;;4246:135;;;-1:-1:-1;4399:10:0;;4391:55;;;;-1:-1:-1;;;4391:55:0;;5764:2:1;4391:55:0;;;5746:21:1;;;5783:18;;;5776:30;5842:34;5822:18;;;5815:62;5894:18;;4391:55:0;5562:356:1;14:173;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:673::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;403:60;419:43;459:2;419:43;:::i;:::-;403:60;:::i;:::-;485:3;509:2;504:3;497:15;537:2;532:3;528:12;521:19;;572:2;564:6;560:15;624:3;619:2;613;610:1;606:10;598:6;594:23;590:32;587:41;584:61;;;641:1;638;631:12;584:61;663:1;673:163;687:2;684:1;681:9;673:163;;;744:17;;732:30;;782:12;;;;814;;;;705:1;698:9;673:163;;;-1:-1:-1;854:5:1;;192:673;-1:-1:-1;;;;;;;192:673:1:o;870:260::-;938:6;946;999:2;987:9;978:7;974:23;970:32;967:52;;;1015:1;1012;1005:12;967:52;1038:29;1057:9;1038:29;:::i;:::-;1028:39;;1086:38;1120:2;1109:9;1105:18;1086:38;:::i;:::-;1076:48;;870:260;;;;;:::o;1135:1229::-;1262:6;1270;1278;1331:2;1319:9;1310:7;1306:23;1302:32;1299:52;;;1347:1;1344;1337:12;1299:52;1370:29;1389:9;1370:29;:::i;:::-;1360:39;;1418:2;1471;1460:9;1456:18;1443:32;1494:18;1535:2;1527:6;1524:14;1521:34;;;1551:1;1548;1541:12;1521:34;1589:6;1578:9;1574:22;1564:32;;1634:7;1627:4;1623:2;1619:13;1615:27;1605:55;;1656:1;1653;1646:12;1605:55;1692:2;1679:16;1715:60;1731:43;1771:2;1731:43;:::i;1715:60::-;1797:3;1821:2;1816:3;1809:15;1849:2;1844:3;1840:12;1833:19;;1880:2;1876;1872:11;1928:7;1923:2;1917;1914:1;1910:10;1906:2;1902:19;1898:28;1895:41;1892:61;;;1949:1;1946;1939:12;1892:61;1971:1;1962:10;;1981:169;1995:2;1992:1;1989:9;1981:169;;;2052:23;2071:3;2052:23;:::i;:::-;2040:36;;2013:1;2006:9;;;;;2096:12;;;;2128;;1981:169;;;-1:-1:-1;2169:5:1;-1:-1:-1;;;2227:2:1;2212:18;;2199:32;;-1:-1:-1;2243:16:1;;;2240:36;;;2272:1;2269;2262:12;2240:36;;;2295:63;2350:7;2339:8;2328:9;2324:24;2295:63;:::i;:::-;2285:73;;;1135:1229;;;;;:::o;2369:254::-;2437:6;2445;2498:2;2486:9;2477:7;2473:23;2469:32;2466:52;;;2514:1;2511;2504:12;2466:52;2537:29;2556:9;2537:29;:::i;:::-;2527:39;2613:2;2598:18;;;;2585:32;;-1:-1:-1;;;2369:254:1:o;2628:180::-;2687:6;2740:2;2728:9;2719:7;2715:23;2711:32;2708:52;;;2756:1;2753;2746:12;2708:52;-1:-1:-1;2779:23:1;;2628:180;-1:-1:-1;2628:180:1:o;2813:254::-;2881:6;2889;2942:2;2930:9;2921:7;2917:23;2913:32;2910:52;;;2958:1;2955;2948:12;2910:52;2994:9;2981:23;2971:33;;3023:38;3057:2;3046:9;3042:18;3023:38;:::i;3072:248::-;3140:6;3148;3201:2;3189:9;3180:7;3176:23;3172:32;3169:52;;;3217:1;3214;3207:12;3169:52;-1:-1:-1;;3240:23:1;;;3310:2;3295:18;;;3282:32;;-1:-1:-1;3072:248:1:o;3325:286::-;3383:6;3436:2;3424:9;3415:7;3411:23;3407:32;3404:52;;;3452:1;3449;3442:12;3404:52;3478:23;;-1:-1:-1;;;;;;3530:32:1;;3520:43;;3510:71;;3577:1;3574;3567:12;3801:786;4212:25;4207:3;4200:38;4182:3;4267:6;4261:13;4283:62;4338:6;4333:2;4328:3;4324:12;4317:4;4309:6;4305:17;4283:62;:::i;:::-;-1:-1:-1;;;4404:2:1;4364:16;;;4396:11;;;4389:40;4454:13;;4476:63;4454:13;4525:2;4517:11;;4510:4;4498:17;;4476:63;:::i;:::-;4559:17;4578:2;4555:26;;3801:786;-1:-1:-1;;;;3801:786:1:o;5174:383::-;5323:2;5312:9;5305:21;5286:4;5355:6;5349:13;5398:6;5393:2;5382:9;5378:18;5371:34;5414:66;5473:6;5468:2;5457:9;5453:18;5448:2;5440:6;5436:15;5414:66;:::i;:::-;5541:2;5520:15;-1:-1:-1;;5516:29:1;5501:45;;;;5548:2;5497:54;;5174:383;-1:-1:-1;;5174:383:1:o;8249:275::-;8320:2;8314:9;8385:2;8366:13;;-1:-1:-1;;8362:27:1;8350:40;;8420:18;8405:34;;8441:22;;;8402:62;8399:88;;;8467:18;;:::i;:::-;8503:2;8496:22;8249:275;;-1:-1:-1;8249:275:1:o;8529:183::-;8589:4;8622:18;8614:6;8611:30;8608:56;;;8644:18;;:::i;:::-;-1:-1:-1;8689:1:1;8685:14;8701:4;8681:25;;8529:183::o;8717:128::-;8757:3;8788:1;8784:6;8781:1;8778:13;8775:39;;;8794:18;;:::i;:::-;-1:-1:-1;8830:9:1;;8717:128::o;8850:217::-;8890:1;8916;8906:132;;8960:10;8955:3;8951:20;8948:1;8941:31;8995:4;8992:1;8985:15;9023:4;9020:1;9013:15;8906:132;-1:-1:-1;9052:9:1;;8850:217::o;9072:168::-;9112:7;9178:1;9174;9170:6;9166:14;9163:1;9160:21;9155:1;9148:9;9141:17;9137:45;9134:71;;;9185:18;;:::i;:::-;-1:-1:-1;9225:9:1;;9072:168::o;9245:125::-;9285:4;9313:1;9310;9307:8;9304:34;;;9318:18;;:::i;:::-;-1:-1:-1;9355:9:1;;9245:125::o;9375:258::-;9447:1;9457:113;9471:6;9468:1;9465:13;9457:113;;;9547:11;;;9541:18;9528:11;;;9521:39;9493:2;9486:10;9457:113;;;9588:6;9585:1;9582:13;9579:48;;;9623:1;9614:6;9609:3;9605:16;9598:27;9579:48;;9375:258;;;:::o;9638:136::-;9677:3;9705:5;9695:39;;9714:18;;:::i;:::-;-1:-1:-1;;;9750:18:1;;9638:136::o;9779:135::-;9818:3;-1:-1:-1;;9839:17:1;;9836:43;;;9859:18;;:::i;:::-;-1:-1:-1;9906:1:1;9895:13;;9779:135::o;9919:127::-;9980:10;9975:3;9971:20;9968:1;9961:31;10011:4;10008:1;10001:15;10035:4;10032:1;10025:15;10051:127;10112:10;10107:3;10103:20;10100:1;10093:31;10143:4;10140:1;10133:15;10167:4;10164:1;10157:15;10183:127;10244:10;10239:3;10235:20;10232:1;10225:31;10275:4;10272:1;10265:15;10299:4;10296:1;10289:15;10315:127;10376:10;10371:3;10367:20;10364:1;10357:31;10407:4;10404:1;10397:15;10431:4;10428:1;10421:15
Swarm Source
ipfs://bb600daff1174e6518f8f19956d31a3cfbb0e01ba47a0cf17d5d7dd0eb171587
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.