More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 257 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 54070458 | 288 days ago | IN | 1 POL | 0.001703 | ||||
Set Trusted Forw... | 37477238 | 713 days ago | IN | 0 POL | 0.00165389 | ||||
Set Trusted Forw... | 36799704 | 730 days ago | IN | 0 POL | 0.00087581 | ||||
Set Trusted Forw... | 36799564 | 730 days ago | IN | 0 POL | 0.00087584 | ||||
Remove Account M... | 27733084 | 958 days ago | IN | 0 POL | 0.00143076 | ||||
Create Account | 27733081 | 958 days ago | IN | 0 POL | 0.01592788 | ||||
Remove Account M... | 27733077 | 958 days ago | IN | 0 POL | 0.00216025 | ||||
Create Project | 27733074 | 958 days ago | IN | 0 POL | 0.01392739 | ||||
Create Account | 27733070 | 958 days ago | IN | 0 POL | 0.01580123 | ||||
Remove Account M... | 27733066 | 958 days ago | IN | 0 POL | 0.00222138 | ||||
Create Account | 27733063 | 958 days ago | IN | 0 POL | 0.01589779 | ||||
Remove Account M... | 27733059 | 958 days ago | IN | 0 POL | 0.00147856 | ||||
Create Account | 27733056 | 958 days ago | IN | 0 POL | 0.01580066 | ||||
Remove Account M... | 27733054 | 958 days ago | IN | 0 POL | 0.00220444 | ||||
Create Project | 27733051 | 958 days ago | IN | 0 POL | 0.00787129 | ||||
Create Account | 27733047 | 958 days ago | IN | 0 POL | 0.01580077 | ||||
Remove Account M... | 27733043 | 958 days ago | IN | 0 POL | 0.00122869 | ||||
Create Release | 27733040 | 958 days ago | IN | 0 POL | 0.01142029 | ||||
Create Project | 27733036 | 958 days ago | IN | 0 POL | 0.01701217 | ||||
Create Account | 27733032 | 958 days ago | IN | 0 POL | 0.01577715 | ||||
Remove Account M... | 27733028 | 958 days ago | IN | 0 POL | 0.00222118 | ||||
Create Account | 27733025 | 958 days ago | IN | 0 POL | 0.01579748 | ||||
Remove Account M... | 27733021 | 958 days ago | IN | 0 POL | 0.00182152 | ||||
Create Account | 27733018 | 958 days ago | IN | 0 POL | 0.01580501 | ||||
Remove Account M... | 27733014 | 958 days ago | IN | 0 POL | 0.0012513 |
Loading...
Loading
Contract Name:
Registry
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MPL-2.0 pragma solidity >=0.8.4; /// @@@ @@@ @@@@@@ @@@ @@@ @@@@@@ @@@@@@@ /// @@@ @@@ @@@@@@@@ @@@ @@@ @@@@@@@ @@@@@@@ /// @@! @@@ @@! @@@ @@! @@! !@@ @@! /// !@! @!@ !@! @!@ !@! !@! !@! !@! /// @!@ !@! @!@!@!@! @!! !!@ !!@@!! @!! /// !@! !!! !!!@!!!! !!! !!! !!@!!! !!! /// :!: !!: !!: !!! !!: !!: !:! !!: /// ::!!:! :!: !:! :!: :!: !:! :!: /// :::: :: ::: :: :::: :: :::: :: :: /// : : : : : :: : : : :: : : : import "@opengsn/contracts/src/BaseRelayRecipient.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; /// @title Valist registry contract /// /// @custom:err-empty-meta metadata URI is required /// @custom:err-empty-members atleast one member is required /// @custom:err-empty-name name is required /// @custom:err-name-claimed name has already been claimed /// @custom:err-not-member sender is not a member /// @custom:err-member-exist member already exists /// @custom:err-member-not-exist member does not exist /// @custom:err-not-exist account, project, or release does not exist contract Registry is BaseRelayRecipient { using EnumerableSet for EnumerableSet.AddressSet; /// @dev emitted when an account is created event AccountCreated( uint _accountID, string _name, string _metaURI, address _sender ); /// @dev emitted when an account is updated event AccountUpdated( uint _accountID, string _metaURI, address _sender ); /// @dev emitted when an account member is added event AccountMemberAdded( uint _accountID, address _member, address _sender ); /// @dev emitted when an account member is removed event AccountMemberRemoved( uint _accountID, address _member, address _sender ); /// @dev emitted when a new project is created event ProjectCreated( uint _accountID, uint _projectID, string _name, string _metaURI, address _sender ); /// @dev emitted when an existing project is updated event ProjectUpdated( uint _projectID, string _metaURI, address _sender ); /// @dev emitted when a new project member is added event ProjectMemberAdded( uint _projectID, address _member, address _sender ); /// @dev emitted when an existing project member is removed event ProjectMemberRemoved( uint _projectID, address _member, address _sender ); /// @dev emitted when a new release is created event ReleaseCreated( uint _projectID, uint _releaseID, string _name, string _metaURI, address _sender ); /// @dev emitted when a release is approved by a signer event ReleaseApproved( uint _releaseID, address _sender ); /// @dev emitted when a release approval is revoked by a signer. event ReleaseRevoked( uint _releaseID, address _sender ); struct Account { /// @dev set of member addresses. EnumerableSet.AddressSet members; } struct Project { /// @dev ID of the parent account. uint accountID; /// @dev ID of the latest release. uint releaseID; /// @dev set of member addresses. EnumerableSet.AddressSet members; } struct Release { /// @dev ID of the parent project. uint projectID; /// @dev ID of the previous release. uint releaseID; /// @dev set of signer addresses. EnumerableSet.AddressSet signers; } /// @dev mapping of account ID to account mapping(uint => Account) private accountByID; /// @dev mapping of project ID to project mapping(uint => Project) private projectByID; /// @dev mapping of release ID to release mapping(uint => Release) private releaseByID; /// @dev mapping of account, project, and release ID to meta URI mapping(uint => string) public metaByID; /// @dev version of BaseRelayRecipient this contract implements string public override versionRecipient = "2.2.3"; /// @dev address of contract owner address payable public owner; /// @dev account name claim fee uint public claimFee; /// Creates a Valist Registry contract. /// /// @param _forwarder Address of meta transaction forwarder. constructor(address _forwarder) { owner = payable(msg.sender); _setTrustedForwarder(_forwarder); } /// Creates an account with the given members. /// /// @param _name Unique name used to identify the account. /// @param _metaURI URI of the account metadata. /// @param _members List of members to add to the account. function createAccount( string calldata _name, string calldata _metaURI, address[] calldata _members ) public payable { require(msg.value >= claimFee, "err-value"); require(bytes(_metaURI).length > 0, "err-empty-meta"); require(bytes(_name).length > 0, "err-empty-name"); require(_members.length > 0, "err-empty-members"); uint accountID = generateID(block.chainid, _name); require(bytes(metaByID[accountID]).length == 0, "err-name-claimed"); metaByID[accountID] = _metaURI; emit AccountCreated(accountID, _name, _metaURI, _msgSender()); for (uint i = 0; i < _members.length; ++i) { accountByID[accountID].members.add(_members[i]); emit AccountMemberAdded(accountID, _members[i], _msgSender()); } Address.sendValue(owner, msg.value); } /// Creates a new project. Requires the sender to be a member of the account. /// /// @param _accountID ID of the account to create the project under. /// @param _name Unique name used to identify the project. /// @param _metaURI URI of the project metadata. /// @param _members Optional list of members to add to the project. function createProject( uint _accountID, string calldata _name, string calldata _metaURI, address[] calldata _members ) public { require(bytes(_metaURI).length > 0, "err-empty-meta"); require(bytes(_name).length > 0, "err-empty-name"); uint projectID = generateID(_accountID, _name); require(isAccountMember(_accountID, _msgSender()), "err-not-member"); require(bytes(metaByID[projectID]).length == 0, "err-name-claimed"); metaByID[projectID] = _metaURI; projectByID[projectID].accountID = _accountID; emit ProjectCreated(_accountID, projectID, _name, _metaURI, _msgSender()); for (uint i = 0; i < _members.length; ++i) { projectByID[projectID].members.add(_members[i]); emit ProjectMemberAdded(projectID, _members[i], _msgSender()); } } /// Creates a new release. Requires the sender to be a member of the project. /// /// @param _projectID ID of the project create the release under. /// @param _name Unique name used to identify the release. /// @param _metaURI URI of the project metadata. function createRelease( uint _projectID, string calldata _name, string calldata _metaURI ) public { require(bytes(_name).length > 0, "err-empty-name"); require(bytes(_metaURI).length > 0, "err-empty-meta"); require(bytes(metaByID[_projectID]).length > 0, "err-not-exist"); uint releaseID = generateID(_projectID, _name); require(bytes(metaByID[releaseID]).length == 0, "err-name-claimed"); uint accountID = getProjectAccountID(_projectID); require( isProjectMember(_projectID, _msgSender()) || isAccountMember(accountID, _msgSender()), "err-not-member" ); uint previousID = projectByID[_projectID].releaseID; projectByID[_projectID].releaseID = releaseID; metaByID[releaseID] = _metaURI; releaseByID[releaseID].releaseID = previousID; releaseByID[releaseID].projectID = _projectID; emit ReleaseCreated(_projectID, releaseID, _name, _metaURI, _msgSender()); } /// Approve the release by adding the sender's address to the approvers list. /// /// @param _releaseID ID of the release. function approveRelease(uint _releaseID) public { require(bytes(metaByID[_releaseID]).length > 0, "err-not-exist"); require(!releaseByID[_releaseID].signers.contains(_msgSender()), "err-member-exist"); releaseByID[_releaseID].signers.add(_msgSender()); emit ReleaseApproved(_releaseID, _msgSender()); } /// Revoke a release signature by removing the sender's address from the approvers list. /// /// @param _releaseID ID of the release. function revokeRelease(uint _releaseID) public { require(bytes(metaByID[_releaseID]).length > 0, "err-not-exist"); require(releaseByID[_releaseID].signers.contains(_msgSender()), "err-member-exist"); releaseByID[_releaseID].signers.remove(_msgSender()); emit ReleaseRevoked(_releaseID, _msgSender()); } /// Add a member to the account. Requires the sender to be a member of the account. /// /// @param _accountID ID of the account. /// @param _address Address of member. function addAccountMember(uint _accountID, address _address) public { require(isAccountMember(_accountID, _msgSender()), "err-not-member"); require(!isAccountMember(_accountID, _address), "err-member-exist"); accountByID[_accountID].members.add(_address); emit AccountMemberAdded(_accountID, _address, _msgSender()); } /// Remove a member from the account. Requires the sender to be a member of the account. /// /// @param _accountID ID of the account. /// @param _address Address of member. function removeAccountMember(uint _accountID, address _address) public { require(isAccountMember(_accountID, _msgSender()), "err-not-member"); require(isAccountMember(_accountID, _address), "err-member-not-exist"); accountByID[_accountID].members.remove(_address); emit AccountMemberRemoved(_accountID, _address, _msgSender()); } /// Add a member to the project. Requires the sender to be a member of the parent account. /// /// @param _projectID ID of the project. /// @param _address Address of member. function addProjectMember(uint _projectID, address _address) public { require(bytes(metaByID[_projectID]).length > 0, "err-not-exist"); require(!isProjectMember(_projectID, _address), "err-member-exist"); uint accountID = getProjectAccountID(_projectID); require(isAccountMember(accountID, _msgSender()), "err-not-member"); projectByID[_projectID].members.add(_address); emit ProjectMemberAdded(_projectID, _address, _msgSender()); } /// Remove a member from the project. Requires the sender to be a member of the parent account. /// /// @param _projectID ID of the project. /// @param _address Address of member. function removeProjectMember(uint _projectID, address _address) public { require(bytes(metaByID[_projectID]).length > 0, "err-not-exist"); require(isProjectMember(_projectID, _address), "err-member-not-exist"); uint accountID = getProjectAccountID(_projectID); require(isAccountMember(accountID, _msgSender()), "err-not-member"); projectByID[_projectID].members.remove(_address); emit ProjectMemberRemoved(_projectID, _address, _msgSender()); } /// Sets the account metadata URI. Requires the sender to be a member of the account. /// /// @param _accountID ID of the account. /// @param _metaURI Metadata URI. function setAccountMetaURI(uint _accountID, string calldata _metaURI) public { require(bytes(_metaURI).length > 0, "err-empty-meta"); require(isAccountMember(_accountID, _msgSender()), "err-not-member"); require(bytes(metaByID[_accountID]).length > 0, "err-not-exist"); metaByID[_accountID] = _metaURI; emit AccountUpdated(_accountID, _metaURI, _msgSender()); } /// Sets the project metadata URI. Requires the sender to be a member of the parent account. /// /// @param _projectID ID of the project. /// @param _metaURI Metadata URI. function setProjectMetaURI(uint _projectID, string calldata _metaURI) public { require(bytes(_metaURI).length > 0, "err-empty-meta"); require(bytes(metaByID[_projectID]).length > 0, "err-not-exist"); uint accountID = getProjectAccountID(_projectID); require(isAccountMember(accountID, _msgSender()), "err-not-member"); metaByID[_projectID] = _metaURI; emit ProjectUpdated(_projectID, _metaURI, _msgSender()); } /// Generates account, project, or release ID. /// /// @param _parentID ID of the parent account or project. Use `block.chainid` for accounts. /// @param _name Name of the account, project, or release. function generateID(uint _parentID, string calldata _name) public pure returns (uint) { return uint(keccak256(abi.encodePacked(_parentID, keccak256(bytes(_name))))); } /// Returns true if the address is a member of the team. /// /// @param _accountID ID of the account. /// @param _member Address of member. function isAccountMember(uint _accountID, address _member) public view returns (bool) { return accountByID[_accountID].members.contains(_member); } /// Returns true if the address is a member of the project. /// /// @param _projectID ID of the project. /// @param _member Address of member. function isProjectMember(uint _projectID, address _member) public view returns (bool) { return projectByID[_projectID].members.contains(_member); } /// Returns true if the address is a signer of the release. /// /// @param _releaseID ID of the release. /// @param _signer Address of the signer. function isReleaseSigner(uint _releaseID, address _signer) public view returns (bool) { return releaseByID[_releaseID].signers.contains(_signer); } /// Returns a list of account members. /// /// @param _accountID ID of the account. function getAccountMembers(uint _accountID) public view returns (address[] memory) { return accountByID[_accountID].members.values(); } /// Returns a list of project members. /// /// @param _projectID ID of the project. function getProjectMembers(uint _projectID) public view returns (address[] memory) { return projectByID[_projectID].members.values(); } /// Returns a list of release signers. /// /// @param _releaseID ID of the release. function getReleaseSigners(uint _releaseID) public view returns (address[] memory) { return releaseByID[_releaseID].signers.values(); } /// Returns the parent account ID for the project. /// /// @param _projectID ID of the project. function getProjectAccountID(uint _projectID) public view returns (uint) { return projectByID[_projectID].accountID; } /// Returns the parent project ID for the release. /// /// @param _releaseID ID of the release. function getReleaseProjectID(uint _releaseID) public view returns (uint) { return releaseByID[_releaseID].projectID; } /// Returns the latest release ID for the project. /// /// @param _projectID ID of the project. function getLatestReleaseID(uint _projectID) public view returns (uint) { return projectByID[_projectID].releaseID; } /// Returns the previous release ID for the release. /// /// @param _releaseID ID of the release. function getPreviousReleaseID(uint _releaseID) public view returns (uint) { return releaseByID[_releaseID].releaseID; } /// Sets the owner address. Owner only. /// /// @param _owner Address of the new owner. function setOwner(address payable _owner) public onlyOwner { owner = _owner; } /// Sets the account claim fee. Owner only. /// /// @param _claimFee Claim fee amount in wei. function setClaimFee(uint _claimFee) public onlyOwner { claimFee = _claimFee; } /// Sets the trusted forward address. Owner only. /// /// @param _forwarder Address of meta transaction forwarder. function setTrustedForwarder(address _forwarder) public onlyOwner { _setTrustedForwarder(_forwarder); } /// Modifier that ensures only the owner can call a function. modifier onlyOwner() { require(owner == _msgSender(), "caller is not the owner"); _; } }
// SPDX-License-Identifier: MIT // solhint-disable no-inline-assembly pragma solidity >=0.6.9; import "./interfaces/IRelayRecipient.sol"; /** * A base contract to be inherited by any contract that want to receive relayed transactions * A subclass must use "_msgSender()" instead of "msg.sender" */ abstract contract BaseRelayRecipient is IRelayRecipient { /* * Forwarder singleton we accept calls from */ address private _trustedForwarder; function trustedForwarder() public virtual view returns (address){ return _trustedForwarder; } function _setTrustedForwarder(address _forwarder) internal { _trustedForwarder = _forwarder; } function isTrustedForwarder(address forwarder) public virtual override view returns(bool) { return forwarder == _trustedForwarder; } /** * return the sender of this call. * if the call came through our trusted forwarder, return the original sender. * otherwise, return `msg.sender`. * should be used in the contract anywhere instead of msg.sender */ function _msgSender() internal override virtual view returns (address ret) { if (msg.data.length >= 20 && isTrustedForwarder(msg.sender)) { // At this point we know that the sender is a trusted forwarder, // so we trust that the last bytes of msg.data are the verified sender address. // extract sender address from the end of msg.data assembly { ret := shr(96,calldataload(sub(calldatasize(),20))) } } else { ret = msg.sender; } } /** * return the msg.data of this call. * if the call came through our trusted forwarder, then the real sender was appended as the last 20 bytes * of the msg.data - so this method will strip those 20 bytes off. * otherwise (if the call was made directly and not through the forwarder), return `msg.data` * should be used in the contract instead of msg.data, where this difference matters. */ function _msgData() internal override virtual view returns (bytes calldata ret) { if (msg.data.length >= 20 && isTrustedForwarder(msg.sender)) { return msg.data[0:msg.data.length-20]; } else { return msg.data; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.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; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; /** * a contract must implement this interface in order to support relayed transaction. * It is better to inherit the BaseRelayRecipient as its implementation. */ abstract contract IRelayRecipient { /** * return if the forwarder is trusted to forward relayed transactions to us. * the forwarder is required to verify the sender's signature, and verify * the call is not a replay. */ function isTrustedForwarder(address forwarder) public virtual view returns(bool); /** * return the sender of this call. * if the call came through our trusted forwarder, then the real sender is appended as the last 20 bytes * of the msg.data. * otherwise, return `msg.sender` * should be used in the contract anywhere instead of msg.sender */ function _msgSender() internal virtual view returns (address); /** * return the msg.data of this call. * if the call came through our trusted forwarder, then the real sender was appended as the last 20 bytes * of the msg.data - so this method will strip those 20 bytes off. * otherwise (if the call was made directly and not through the forwarder), return `msg.data` * should be used in the contract instead of msg.data, where this difference matters. */ function _msgData() internal virtual view returns (bytes calldata); function versionRecipient() external virtual view returns (string memory); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_forwarder","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_accountID","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"},{"indexed":false,"internalType":"string","name":"_metaURI","type":"string"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"AccountCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_accountID","type":"uint256"},{"indexed":false,"internalType":"address","name":"_member","type":"address"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"AccountMemberAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_accountID","type":"uint256"},{"indexed":false,"internalType":"address","name":"_member","type":"address"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"AccountMemberRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_accountID","type":"uint256"},{"indexed":false,"internalType":"string","name":"_metaURI","type":"string"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"AccountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_accountID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_projectID","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"},{"indexed":false,"internalType":"string","name":"_metaURI","type":"string"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"ProjectCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_projectID","type":"uint256"},{"indexed":false,"internalType":"address","name":"_member","type":"address"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"ProjectMemberAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_projectID","type":"uint256"},{"indexed":false,"internalType":"address","name":"_member","type":"address"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"ProjectMemberRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_projectID","type":"uint256"},{"indexed":false,"internalType":"string","name":"_metaURI","type":"string"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"ProjectUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_releaseID","type":"uint256"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"ReleaseApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_projectID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_releaseID","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"},{"indexed":false,"internalType":"string","name":"_metaURI","type":"string"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"ReleaseCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_releaseID","type":"uint256"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"ReleaseRevoked","type":"event"},{"inputs":[{"internalType":"uint256","name":"_accountID","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"addAccountMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectID","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"addProjectMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_releaseID","type":"uint256"}],"name":"approveRelease","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_metaURI","type":"string"},{"internalType":"address[]","name":"_members","type":"address[]"}],"name":"createAccount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_accountID","type":"uint256"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_metaURI","type":"string"},{"internalType":"address[]","name":"_members","type":"address[]"}],"name":"createProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectID","type":"uint256"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_metaURI","type":"string"}],"name":"createRelease","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_parentID","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"generateID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_accountID","type":"uint256"}],"name":"getAccountMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectID","type":"uint256"}],"name":"getLatestReleaseID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_releaseID","type":"uint256"}],"name":"getPreviousReleaseID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectID","type":"uint256"}],"name":"getProjectAccountID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectID","type":"uint256"}],"name":"getProjectMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_releaseID","type":"uint256"}],"name":"getReleaseProjectID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_releaseID","type":"uint256"}],"name":"getReleaseSigners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_accountID","type":"uint256"},{"internalType":"address","name":"_member","type":"address"}],"name":"isAccountMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectID","type":"uint256"},{"internalType":"address","name":"_member","type":"address"}],"name":"isProjectMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_releaseID","type":"uint256"},{"internalType":"address","name":"_signer","type":"address"}],"name":"isReleaseSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"metaByID","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_accountID","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"removeAccountMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectID","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"removeProjectMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_releaseID","type":"uint256"}],"name":"revokeRelease","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_accountID","type":"uint256"},{"internalType":"string","name":"_metaURI","type":"string"}],"name":"setAccountMetaURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimFee","type":"uint256"}],"name":"setClaimFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectID","type":"uint256"},{"internalType":"string","name":"_metaURI","type":"string"}],"name":"setProjectMetaURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_forwarder","type":"address"}],"name":"setTrustedForwarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trustedForwarder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"versionRecipient","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040526005608081905264322e322e3360d81b60a09081526200002691908162000097565b503480156200003457600080fd5b50604051620022283803806200222883398101604081905262000057916200013d565b600680546001600160a01b031916331790556200009081600080546001600160a01b0319166001600160a01b0392909216919091179055565b50620001aa565b828054620000a5906200016d565b90600052602060002090601f016020900481019282620000c9576000855562000114565b82601f10620000e457805160ff191683800117855562000114565b8280016001018555821562000114579182015b8281111562000114578251825591602001919060010190620000f7565b506200012292915062000126565b5090565b5b8082111562000122576000815560010162000127565b6000602082840312156200014f578081fd5b81516001600160a01b038116811462000166578182fd5b9392505050565b600181811c908216806200018257607f821691505b60208210811415620001a457634e487b7160e01b600052602260045260246000fd5b50919050565b61206e80620001ba6000396000f3fe6080604052600436106101d85760003560e01c80637da0a87711610102578063bb11d22a11610095578063da74222811610064578063da742228146105b5578063db5954f4146105d5578063ec95ecb6146105f5578063ef83d3ab1461061557600080fd5b8063bb11d22a14610532578063c25cf2d514610545578063d515d9d914610565578063d77302571461058557600080fd5b806399d32fc4116100d157806399d32fc4146104af5780639f4cfef9146104c5578063a2f6ce9b146104e5578063aef28ac31461050557600080fd5b80637da0a87714610410578063806553f31461044257806383b1fc41146104625780638da5cb5b1461048f57600080fd5b8063416cab0c1161017a578063600c391111610149578063600c39111461038057806368704f02146103a05780636ad0a5ee146103d05780637c869665146103f057600080fd5b8063416cab0c146102d257806343417c06146102ff578063486ff0cd1461032c578063572b6c051461034157600080fd5b80631bd2cea1116101b65780631bd2cea114610252578063250b72de1461027257806328a10ec6146102925780632e75ab50146102b257600080fd5b80630859bbcd146101dd57806313af403514610210578063176037f514610232575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004611b70565b610635565b6040519081526020015b60405180910390f35b34801561021c57600080fd5b5061023061022b366004611a77565b610687565b005b34801561023e57600080fd5b5061023061024d366004611b41565b6106e7565b34801561025e57600080fd5b5061023061026d366004611b29565b6107a6565b34801561027e57600080fd5b5061023061028d366004611c31565b61088d565b34801561029e57600080fd5b506102306102ad366004611bba565b610aa9565b3480156102be57600080fd5b506102306102cd366004611b29565b610c4a565b3480156102de57600080fd5b506101fd6102ed366004611b29565b60009081526002602052604090205490565b34801561030b57600080fd5b5061031f61031a366004611b29565b610c84565b6040516102079190611d57565b34801561033857600080fd5b5061031f610d1e565b34801561034d57600080fd5b5061037061035c366004611a77565b6000546001600160a01b0391821691161490565b6040519015158152602001610207565b34801561038c57600080fd5b5061037061039b366004611b41565b610d2b565b3480156103ac57600080fd5b506101fd6103bb366004611b29565b60009081526003602052604090206001015490565b3480156103dc57600080fd5b506103706103eb366004611b41565b610d4f565b3480156103fc57600080fd5b5061037061040b366004611b41565b610d67565b34801561041c57600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610207565b34801561044e57600080fd5b5061023061045d366004611b29565b610d82565b34801561046e57600080fd5b5061048261047d366004611b29565b610e2e565b6040516102079190611d0a565b34801561049b57600080fd5b5060065461042a906001600160a01b031681565b3480156104bb57600080fd5b506101fd60075481565b3480156104d157600080fd5b506102306104e0366004611b70565b610e4b565b3480156104f157600080fd5b50610482610500366004611b29565b610f2b565b34801561051157600080fd5b506101fd610520366004611b29565b60009081526003602052604090205490565b610230610540366004611a93565b610f45565b34801561055157600080fd5b50610230610560366004611b41565b6111b8565b34801561057157600080fd5b50610482610580366004611b29565b6112bb565b34801561059157600080fd5b506101fd6105a0366004611b29565b60009081526002602052604090206001015490565b3480156105c157600080fd5b506102306105d0366004611a77565b6112db565b3480156105e157600080fd5b506102306105f0366004611b70565b611331565b34801561060157600080fd5b50610230610610366004611b41565b611421565b34801561062157600080fd5b50610230610630366004611b41565b611525565b6000838383604051610648929190611cfa565b6040519081900381206106679291602001918252602082015260400190565b60408051601f198184030181529190528051602090910120949350505050565b61068f6115da565b6006546001600160a01b039081169116146106c55760405162461bcd60e51b81526004016106bc90611dfe565b60405180910390fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6106f3826103eb6115da565b61070f5760405162461bcd60e51b81526004016106bc90611e85565b6107198282610d4f565b156107365760405162461bcd60e51b81526004016106bc90611daa565b600082815260016020526040902061074e908261160e565b507fda06031a12c2b6322a6a2a29b8e7ec92a209562f0995acbf9e5fe8cce89617b3828261077a6115da565b604080519384526001600160a01b03928316602085015291169082015260600160405180910390a15050565b600081815260046020526040812080546107bf90611fb7565b9050116107de5760405162461bcd60e51b81526004016106bc90611ead565b6108006107e96115da565b600083815260036020526040902060020190611623565b1561081d5760405162461bcd60e51b81526004016106bc90611daa565b61083f6108286115da565b60008381526003602052604090206002019061160e565b507f492f404869834bbfb3dfd354d8ebd27ca988aa59eda4724d2e604400e1635df08161086a6115da565b604080519283526001600160a01b0390911660208301520160405180910390a150565b826108aa5760405162461bcd60e51b81526004016106bc90611e35565b846108c75760405162461bcd60e51b81526004016106bc90611e5d565b60006108d4888888610635565b90506108e2886103eb6115da565b6108fe5760405162461bcd60e51b81526004016106bc90611e85565b6000818152600460205260409020805461091790611fb7565b1590506109365760405162461bcd60e51b81526004016106bc90611dd4565b600081815260046020526040902061094f908686611954565b5060008181526002602052604090208890557fdce0cbd02a04a917caf7c163eeb153eee961368abd158a17a8d17298afc2a62f8882898989896109906115da565b6040516109a39796959493929190611f50565b60405180910390a160005b82811015610a9e57610a068484838181106109d957634e487b7160e01b600052603260045260246000fd5b90506020020160208101906109ee9190611a77565b6000848152600260208190526040909120019061160e565b507fa641673cc2c2925ec554d696d7ecb92ad62fd37a878bb62194e01d15af4ecbfe82858584818110610a4957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610a5e9190611a77565b610a666115da565b604080519384526001600160a01b03928316602085015291169082015260600160405180910390a1610a9781611ff2565b90506109ae565b505050505050505050565b82610ac65760405162461bcd60e51b81526004016106bc90611e5d565b80610ae35760405162461bcd60e51b81526004016106bc90611e35565b60008581526004602052604081208054610afc90611fb7565b905011610b1b5760405162461bcd60e51b81526004016106bc90611ead565b6000610b28868686610635565b6000818152600460205260409020805491925090610b4590611fb7565b159050610b645760405162461bcd60e51b81526004016106bc90611dd4565b600086815260026020526040902054610b7f8761039b6115da565b80610b915750610b91816103eb6115da565b610bad5760405162461bcd60e51b81526004016106bc90611e85565b60008781526002602090815260408083206001018054908690558584526004909252909120610bdd908686611954565b506000838152600360205260409020600181018290558890557f28f16f2c48f7434e8ee65a00bca94583249ae3dc79ebd4c8fac3ce1cc41227a9888489898989610c256115da565b604051610c389796959493929190611f50565b60405180910390a15050505050505050565b610c526115da565b6006546001600160a01b03908116911614610c7f5760405162461bcd60e51b81526004016106bc90611dfe565b600755565b60046020526000908152604090208054610c9d90611fb7565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc990611fb7565b8015610d165780601f10610ceb57610100808354040283529160200191610d16565b820191906000526020600020905b815481529060010190602001808311610cf957829003601f168201915b505050505081565b60058054610c9d90611fb7565b60008281526002602081905260408220610d46910183611623565b90505b92915050565b6000828152600160205260408120610d469083611623565b6000828152600360205260408120610d469060020183611623565b60008181526004602052604081208054610d9b90611fb7565b905011610dba5760405162461bcd60e51b81526004016106bc90611ead565b610dc56107e96115da565b610de15760405162461bcd60e51b81526004016106bc90611daa565b610e03610dec6115da565b600083815260036020526040902060020190611645565b507f6709c97fa27e5e2954e292620faa1a587d1f25adb1bef740c229b7d947b41a998161086a6115da565b6000818152600360205260409020606090610d499060020161165a565b80610e685760405162461bcd60e51b81526004016106bc90611e35565b610e74836103eb6115da565b610e905760405162461bcd60e51b81526004016106bc90611e85565b60008381526004602052604081208054610ea990611fb7565b905011610ec85760405162461bcd60e51b81526004016106bc90611ead565b6000838152600460205260409020610ee1908383611954565b507fdc2b36fe3e9f9129790c8dc1fefe27a260e2ab12bbd7d2503bf3c701b7a6b107838383610f0e6115da565b604051610f1e9493929190611ed4565b60405180910390a1505050565b6000818152600160205260409020606090610d499061165a565b600754341015610f835760405162461bcd60e51b81526020600482015260096024820152686572722d76616c756560b81b60448201526064016106bc565b82610fa05760405162461bcd60e51b81526004016106bc90611e35565b84610fbd5760405162461bcd60e51b81526004016106bc90611e5d565b80610ffe5760405162461bcd60e51b81526020600482015260116024820152706572722d656d7074792d6d656d6265727360781b60448201526064016106bc565b600061100b468888610635565b600081815260046020526040902080549192509061102890611fb7565b1590506110475760405162461bcd60e51b81526004016106bc90611dd4565b6000818152600460205260409020611060908686611954565b507f7bab27b7daa748e5bd855a000a2445c6e1d22fc5b2a6c4df5c96f63508afc7b9818888888861108f6115da565b6040516110a196959493929190611f07565b60405180910390a160005b82811015611198576111008484838181106110d757634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110ec9190611a77565b60008481526001602052604090209061160e565b507fda06031a12c2b6322a6a2a29b8e7ec92a209562f0995acbf9e5fe8cce89617b38285858481811061114357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111589190611a77565b6111606115da565b604080519384526001600160a01b03928316602085015291169082015260600160405180910390a161119181611ff2565b90506110ac565b506006546111af906001600160a01b03163461166e565b50505050505050565b600082815260046020526040812080546111d190611fb7565b9050116111f05760405162461bcd60e51b81526004016106bc90611ead565b6111fa8282610d2b565b156112175760405162461bcd60e51b81526004016106bc90611daa565b600082815260026020526040902054611232816103eb6115da565b61124e5760405162461bcd60e51b81526004016106bc90611e85565b600083815260026020819052604090912061126a91018361160e565b507fa641673cc2c2925ec554d696d7ecb92ad62fd37a878bb62194e01d15af4ecbfe83836112966115da565b604080519384526001600160a01b039283166020850152911690820152606001610f1e565b6060610d496002600084815260200190815260200160002060020161165a565b6112e36115da565b6006546001600160a01b039081169116146113105760405162461bcd60e51b81526004016106bc90611dfe565b600080546001600160a01b0319166001600160a01b03831617905550565b50565b8061134e5760405162461bcd60e51b81526004016106bc90611e35565b6000838152600460205260408120805461136790611fb7565b9050116113865760405162461bcd60e51b81526004016106bc90611ead565b6000838152600260205260409020546113a1816103eb6115da565b6113bd5760405162461bcd60e51b81526004016106bc90611e85565b60008481526004602052604090206113d6908484611954565b507fb1c971f708cf6cac0bf1b55c79db4b7e06ed48aa4e24618f1e40cbebecc5b0638484846114036115da565b6040516114139493929190611ed4565b60405180910390a150505050565b6000828152600460205260408120805461143a90611fb7565b9050116114595760405162461bcd60e51b81526004016106bc90611ead565b6114638282610d2b565b6114a65760405162461bcd60e51b8152602060048201526014602482015273195c9c8b5b595b58995c8b5b9bdd0b595e1a5cdd60621b60448201526064016106bc565b6000828152600260205260409020546114c1816103eb6115da565b6114dd5760405162461bcd60e51b81526004016106bc90611e85565b60008381526002602081905260409091206114f9910183611645565b507f3c2f57383ed351452c76a1869a6abf17e5521b3de241aa8d31d1769d4e193c2483836112966115da565b611531826103eb6115da565b61154d5760405162461bcd60e51b81526004016106bc90611e85565b6115578282610d4f565b61159a5760405162461bcd60e51b8152602060048201526014602482015273195c9c8b5b595b58995c8b5b9bdd0b595e1a5cdd60621b60448201526064016106bc565b60008281526001602052604090206115b29082611645565b507febdaf29c191f35cacd52dad5ad5e63fe0a2806c921f5f362dfcc9ded63874550828261077a5b6000601436108015906115f757506000546001600160a01b031633145b15611609575060131936013560601c90565b503390565b6000610d46836001600160a01b03841661178c565b6001600160a01b03811660009081526001830160205260408120541515610d46565b6000610d46836001600160a01b0384166117db565b60606000611667836118f8565b9392505050565b804710156116be5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106bc565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461170b576040519150601f19603f3d011682016040523d82523d6000602084013e611710565b606091505b50509050806117875760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106bc565b505050565b60008181526001830160205260408120546117d357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610d49565b506000610d49565b600081815260018301602052604081205480156118ee5760006117ff600183611fa0565b855490915060009061181390600190611fa0565b905081811461189457600086600001828154811061184157634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061187257634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118b357634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610d49565b6000915050610d49565b60608160000180548060200260200160405190810160405280929190818152602001828054801561194857602002820191906000526020600020905b815481526020019060010190808311611934575b50505050509050919050565b82805461196090611fb7565b90600052602060002090601f01602090048101928261198257600085556119c8565b82601f1061199b5782800160ff198235161785556119c8565b828001600101855582156119c8579182015b828111156119c85782358255916020019190600101906119ad565b506119d49291506119d8565b5090565b5b808211156119d457600081556001016119d9565b60008083601f8401126119fe578182fd5b50813567ffffffffffffffff811115611a15578182fd5b6020830191508360208260051b8501011115611a3057600080fd5b9250929050565b60008083601f840112611a48578182fd5b50813567ffffffffffffffff811115611a5f578182fd5b602083019150836020828501011115611a3057600080fd5b600060208284031215611a88578081fd5b813561166781612023565b60008060008060008060608789031215611aab578182fd5b863567ffffffffffffffff80821115611ac2578384fd5b611ace8a838b01611a37565b90985096506020890135915080821115611ae6578384fd5b611af28a838b01611a37565b90965094506040890135915080821115611b0a578384fd5b50611b1789828a016119ed565b979a9699509497509295939492505050565b600060208284031215611b3a578081fd5b5035919050565b60008060408385031215611b53578182fd5b823591506020830135611b6581612023565b809150509250929050565b600080600060408486031215611b84578283fd5b83359250602084013567ffffffffffffffff811115611ba1578283fd5b611bad86828701611a37565b9497909650939450505050565b600080600080600060608688031215611bd1578081fd5b85359450602086013567ffffffffffffffff80821115611bef578283fd5b611bfb89838a01611a37565b90965094506040880135915080821115611c13578283fd5b50611c2088828901611a37565b969995985093965092949392505050565b60008060008060008060006080888a031215611c4b578081fd5b87359650602088013567ffffffffffffffff80821115611c69578283fd5b611c758b838c01611a37565b909850965060408a0135915080821115611c8d578283fd5b611c998b838c01611a37565b909650945060608a0135915080821115611cb1578283fd5b50611cbe8a828b016119ed565b989b979a50959850939692959293505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8183823760009101908152919050565b6020808252825182820181905260009190848201906040850190845b81811015611d4b5783516001600160a01b031683529284019291840191600101611d26565b50909695505050505050565b6000602080835283518082850152825b81811015611d8357858101830151858201604001528201611d67565b81811115611d945783604083870101525b50601f01601f1916929092016040019392505050565b60208082526010908201526f195c9c8b5b595b58995c8b595e1a5cdd60821b604082015260600190565b60208082526010908201526f195c9c8b5b985b594b58db185a5b595960821b604082015260600190565b60208082526017908201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b6020808252600e908201526d6572722d656d7074792d6d65746160901b604082015260600190565b6020808252600e908201526d6572722d656d7074792d6e616d6560901b604082015260600190565b6020808252600e908201526d32b93916b737ba16b6b2b6b132b960911b604082015260600190565b6020808252600d908201526c195c9c8b5b9bdd0b595e1a5cdd609a1b604082015260600190565b848152606060208201526000611eee606083018587611cd1565b905060018060a01b038316604083015295945050505050565b868152608060208201526000611f21608083018789611cd1565b8281036040840152611f34818688611cd1565b91505060018060a01b0383166060830152979650505050505050565b87815286602082015260a060408201526000611f7060a083018789611cd1565b8281036060840152611f83818688611cd1565b91505060018060a01b038316608083015298975050505050505050565b600082821015611fb257611fb261200d565b500390565b600181811c90821680611fcb57607f821691505b60208210811415611fec57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156120065761200661200d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461132e57600080fdfea26469706673582212208377471f48619ef29a33d7b2287c8026ef9ca8f9022d55743404cc3c358c53b864736f6c63430008040033000000000000000000000000da78a11fd57af7be2edd804840ea7f4c2a38801d
Deployed Bytecode
0x6080604052600436106101d85760003560e01c80637da0a87711610102578063bb11d22a11610095578063da74222811610064578063da742228146105b5578063db5954f4146105d5578063ec95ecb6146105f5578063ef83d3ab1461061557600080fd5b8063bb11d22a14610532578063c25cf2d514610545578063d515d9d914610565578063d77302571461058557600080fd5b806399d32fc4116100d157806399d32fc4146104af5780639f4cfef9146104c5578063a2f6ce9b146104e5578063aef28ac31461050557600080fd5b80637da0a87714610410578063806553f31461044257806383b1fc41146104625780638da5cb5b1461048f57600080fd5b8063416cab0c1161017a578063600c391111610149578063600c39111461038057806368704f02146103a05780636ad0a5ee146103d05780637c869665146103f057600080fd5b8063416cab0c146102d257806343417c06146102ff578063486ff0cd1461032c578063572b6c051461034157600080fd5b80631bd2cea1116101b65780631bd2cea114610252578063250b72de1461027257806328a10ec6146102925780632e75ab50146102b257600080fd5b80630859bbcd146101dd57806313af403514610210578063176037f514610232575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004611b70565b610635565b6040519081526020015b60405180910390f35b34801561021c57600080fd5b5061023061022b366004611a77565b610687565b005b34801561023e57600080fd5b5061023061024d366004611b41565b6106e7565b34801561025e57600080fd5b5061023061026d366004611b29565b6107a6565b34801561027e57600080fd5b5061023061028d366004611c31565b61088d565b34801561029e57600080fd5b506102306102ad366004611bba565b610aa9565b3480156102be57600080fd5b506102306102cd366004611b29565b610c4a565b3480156102de57600080fd5b506101fd6102ed366004611b29565b60009081526002602052604090205490565b34801561030b57600080fd5b5061031f61031a366004611b29565b610c84565b6040516102079190611d57565b34801561033857600080fd5b5061031f610d1e565b34801561034d57600080fd5b5061037061035c366004611a77565b6000546001600160a01b0391821691161490565b6040519015158152602001610207565b34801561038c57600080fd5b5061037061039b366004611b41565b610d2b565b3480156103ac57600080fd5b506101fd6103bb366004611b29565b60009081526003602052604090206001015490565b3480156103dc57600080fd5b506103706103eb366004611b41565b610d4f565b3480156103fc57600080fd5b5061037061040b366004611b41565b610d67565b34801561041c57600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610207565b34801561044e57600080fd5b5061023061045d366004611b29565b610d82565b34801561046e57600080fd5b5061048261047d366004611b29565b610e2e565b6040516102079190611d0a565b34801561049b57600080fd5b5060065461042a906001600160a01b031681565b3480156104bb57600080fd5b506101fd60075481565b3480156104d157600080fd5b506102306104e0366004611b70565b610e4b565b3480156104f157600080fd5b50610482610500366004611b29565b610f2b565b34801561051157600080fd5b506101fd610520366004611b29565b60009081526003602052604090205490565b610230610540366004611a93565b610f45565b34801561055157600080fd5b50610230610560366004611b41565b6111b8565b34801561057157600080fd5b50610482610580366004611b29565b6112bb565b34801561059157600080fd5b506101fd6105a0366004611b29565b60009081526002602052604090206001015490565b3480156105c157600080fd5b506102306105d0366004611a77565b6112db565b3480156105e157600080fd5b506102306105f0366004611b70565b611331565b34801561060157600080fd5b50610230610610366004611b41565b611421565b34801561062157600080fd5b50610230610630366004611b41565b611525565b6000838383604051610648929190611cfa565b6040519081900381206106679291602001918252602082015260400190565b60408051601f198184030181529190528051602090910120949350505050565b61068f6115da565b6006546001600160a01b039081169116146106c55760405162461bcd60e51b81526004016106bc90611dfe565b60405180910390fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6106f3826103eb6115da565b61070f5760405162461bcd60e51b81526004016106bc90611e85565b6107198282610d4f565b156107365760405162461bcd60e51b81526004016106bc90611daa565b600082815260016020526040902061074e908261160e565b507fda06031a12c2b6322a6a2a29b8e7ec92a209562f0995acbf9e5fe8cce89617b3828261077a6115da565b604080519384526001600160a01b03928316602085015291169082015260600160405180910390a15050565b600081815260046020526040812080546107bf90611fb7565b9050116107de5760405162461bcd60e51b81526004016106bc90611ead565b6108006107e96115da565b600083815260036020526040902060020190611623565b1561081d5760405162461bcd60e51b81526004016106bc90611daa565b61083f6108286115da565b60008381526003602052604090206002019061160e565b507f492f404869834bbfb3dfd354d8ebd27ca988aa59eda4724d2e604400e1635df08161086a6115da565b604080519283526001600160a01b0390911660208301520160405180910390a150565b826108aa5760405162461bcd60e51b81526004016106bc90611e35565b846108c75760405162461bcd60e51b81526004016106bc90611e5d565b60006108d4888888610635565b90506108e2886103eb6115da565b6108fe5760405162461bcd60e51b81526004016106bc90611e85565b6000818152600460205260409020805461091790611fb7565b1590506109365760405162461bcd60e51b81526004016106bc90611dd4565b600081815260046020526040902061094f908686611954565b5060008181526002602052604090208890557fdce0cbd02a04a917caf7c163eeb153eee961368abd158a17a8d17298afc2a62f8882898989896109906115da565b6040516109a39796959493929190611f50565b60405180910390a160005b82811015610a9e57610a068484838181106109d957634e487b7160e01b600052603260045260246000fd5b90506020020160208101906109ee9190611a77565b6000848152600260208190526040909120019061160e565b507fa641673cc2c2925ec554d696d7ecb92ad62fd37a878bb62194e01d15af4ecbfe82858584818110610a4957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610a5e9190611a77565b610a666115da565b604080519384526001600160a01b03928316602085015291169082015260600160405180910390a1610a9781611ff2565b90506109ae565b505050505050505050565b82610ac65760405162461bcd60e51b81526004016106bc90611e5d565b80610ae35760405162461bcd60e51b81526004016106bc90611e35565b60008581526004602052604081208054610afc90611fb7565b905011610b1b5760405162461bcd60e51b81526004016106bc90611ead565b6000610b28868686610635565b6000818152600460205260409020805491925090610b4590611fb7565b159050610b645760405162461bcd60e51b81526004016106bc90611dd4565b600086815260026020526040902054610b7f8761039b6115da565b80610b915750610b91816103eb6115da565b610bad5760405162461bcd60e51b81526004016106bc90611e85565b60008781526002602090815260408083206001018054908690558584526004909252909120610bdd908686611954565b506000838152600360205260409020600181018290558890557f28f16f2c48f7434e8ee65a00bca94583249ae3dc79ebd4c8fac3ce1cc41227a9888489898989610c256115da565b604051610c389796959493929190611f50565b60405180910390a15050505050505050565b610c526115da565b6006546001600160a01b03908116911614610c7f5760405162461bcd60e51b81526004016106bc90611dfe565b600755565b60046020526000908152604090208054610c9d90611fb7565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc990611fb7565b8015610d165780601f10610ceb57610100808354040283529160200191610d16565b820191906000526020600020905b815481529060010190602001808311610cf957829003601f168201915b505050505081565b60058054610c9d90611fb7565b60008281526002602081905260408220610d46910183611623565b90505b92915050565b6000828152600160205260408120610d469083611623565b6000828152600360205260408120610d469060020183611623565b60008181526004602052604081208054610d9b90611fb7565b905011610dba5760405162461bcd60e51b81526004016106bc90611ead565b610dc56107e96115da565b610de15760405162461bcd60e51b81526004016106bc90611daa565b610e03610dec6115da565b600083815260036020526040902060020190611645565b507f6709c97fa27e5e2954e292620faa1a587d1f25adb1bef740c229b7d947b41a998161086a6115da565b6000818152600360205260409020606090610d499060020161165a565b80610e685760405162461bcd60e51b81526004016106bc90611e35565b610e74836103eb6115da565b610e905760405162461bcd60e51b81526004016106bc90611e85565b60008381526004602052604081208054610ea990611fb7565b905011610ec85760405162461bcd60e51b81526004016106bc90611ead565b6000838152600460205260409020610ee1908383611954565b507fdc2b36fe3e9f9129790c8dc1fefe27a260e2ab12bbd7d2503bf3c701b7a6b107838383610f0e6115da565b604051610f1e9493929190611ed4565b60405180910390a1505050565b6000818152600160205260409020606090610d499061165a565b600754341015610f835760405162461bcd60e51b81526020600482015260096024820152686572722d76616c756560b81b60448201526064016106bc565b82610fa05760405162461bcd60e51b81526004016106bc90611e35565b84610fbd5760405162461bcd60e51b81526004016106bc90611e5d565b80610ffe5760405162461bcd60e51b81526020600482015260116024820152706572722d656d7074792d6d656d6265727360781b60448201526064016106bc565b600061100b468888610635565b600081815260046020526040902080549192509061102890611fb7565b1590506110475760405162461bcd60e51b81526004016106bc90611dd4565b6000818152600460205260409020611060908686611954565b507f7bab27b7daa748e5bd855a000a2445c6e1d22fc5b2a6c4df5c96f63508afc7b9818888888861108f6115da565b6040516110a196959493929190611f07565b60405180910390a160005b82811015611198576111008484838181106110d757634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110ec9190611a77565b60008481526001602052604090209061160e565b507fda06031a12c2b6322a6a2a29b8e7ec92a209562f0995acbf9e5fe8cce89617b38285858481811061114357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111589190611a77565b6111606115da565b604080519384526001600160a01b03928316602085015291169082015260600160405180910390a161119181611ff2565b90506110ac565b506006546111af906001600160a01b03163461166e565b50505050505050565b600082815260046020526040812080546111d190611fb7565b9050116111f05760405162461bcd60e51b81526004016106bc90611ead565b6111fa8282610d2b565b156112175760405162461bcd60e51b81526004016106bc90611daa565b600082815260026020526040902054611232816103eb6115da565b61124e5760405162461bcd60e51b81526004016106bc90611e85565b600083815260026020819052604090912061126a91018361160e565b507fa641673cc2c2925ec554d696d7ecb92ad62fd37a878bb62194e01d15af4ecbfe83836112966115da565b604080519384526001600160a01b039283166020850152911690820152606001610f1e565b6060610d496002600084815260200190815260200160002060020161165a565b6112e36115da565b6006546001600160a01b039081169116146113105760405162461bcd60e51b81526004016106bc90611dfe565b600080546001600160a01b0319166001600160a01b03831617905550565b50565b8061134e5760405162461bcd60e51b81526004016106bc90611e35565b6000838152600460205260408120805461136790611fb7565b9050116113865760405162461bcd60e51b81526004016106bc90611ead565b6000838152600260205260409020546113a1816103eb6115da565b6113bd5760405162461bcd60e51b81526004016106bc90611e85565b60008481526004602052604090206113d6908484611954565b507fb1c971f708cf6cac0bf1b55c79db4b7e06ed48aa4e24618f1e40cbebecc5b0638484846114036115da565b6040516114139493929190611ed4565b60405180910390a150505050565b6000828152600460205260408120805461143a90611fb7565b9050116114595760405162461bcd60e51b81526004016106bc90611ead565b6114638282610d2b565b6114a65760405162461bcd60e51b8152602060048201526014602482015273195c9c8b5b595b58995c8b5b9bdd0b595e1a5cdd60621b60448201526064016106bc565b6000828152600260205260409020546114c1816103eb6115da565b6114dd5760405162461bcd60e51b81526004016106bc90611e85565b60008381526002602081905260409091206114f9910183611645565b507f3c2f57383ed351452c76a1869a6abf17e5521b3de241aa8d31d1769d4e193c2483836112966115da565b611531826103eb6115da565b61154d5760405162461bcd60e51b81526004016106bc90611e85565b6115578282610d4f565b61159a5760405162461bcd60e51b8152602060048201526014602482015273195c9c8b5b595b58995c8b5b9bdd0b595e1a5cdd60621b60448201526064016106bc565b60008281526001602052604090206115b29082611645565b507febdaf29c191f35cacd52dad5ad5e63fe0a2806c921f5f362dfcc9ded63874550828261077a5b6000601436108015906115f757506000546001600160a01b031633145b15611609575060131936013560601c90565b503390565b6000610d46836001600160a01b03841661178c565b6001600160a01b03811660009081526001830160205260408120541515610d46565b6000610d46836001600160a01b0384166117db565b60606000611667836118f8565b9392505050565b804710156116be5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106bc565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461170b576040519150601f19603f3d011682016040523d82523d6000602084013e611710565b606091505b50509050806117875760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106bc565b505050565b60008181526001830160205260408120546117d357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610d49565b506000610d49565b600081815260018301602052604081205480156118ee5760006117ff600183611fa0565b855490915060009061181390600190611fa0565b905081811461189457600086600001828154811061184157634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061187257634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118b357634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610d49565b6000915050610d49565b60608160000180548060200260200160405190810160405280929190818152602001828054801561194857602002820191906000526020600020905b815481526020019060010190808311611934575b50505050509050919050565b82805461196090611fb7565b90600052602060002090601f01602090048101928261198257600085556119c8565b82601f1061199b5782800160ff198235161785556119c8565b828001600101855582156119c8579182015b828111156119c85782358255916020019190600101906119ad565b506119d49291506119d8565b5090565b5b808211156119d457600081556001016119d9565b60008083601f8401126119fe578182fd5b50813567ffffffffffffffff811115611a15578182fd5b6020830191508360208260051b8501011115611a3057600080fd5b9250929050565b60008083601f840112611a48578182fd5b50813567ffffffffffffffff811115611a5f578182fd5b602083019150836020828501011115611a3057600080fd5b600060208284031215611a88578081fd5b813561166781612023565b60008060008060008060608789031215611aab578182fd5b863567ffffffffffffffff80821115611ac2578384fd5b611ace8a838b01611a37565b90985096506020890135915080821115611ae6578384fd5b611af28a838b01611a37565b90965094506040890135915080821115611b0a578384fd5b50611b1789828a016119ed565b979a9699509497509295939492505050565b600060208284031215611b3a578081fd5b5035919050565b60008060408385031215611b53578182fd5b823591506020830135611b6581612023565b809150509250929050565b600080600060408486031215611b84578283fd5b83359250602084013567ffffffffffffffff811115611ba1578283fd5b611bad86828701611a37565b9497909650939450505050565b600080600080600060608688031215611bd1578081fd5b85359450602086013567ffffffffffffffff80821115611bef578283fd5b611bfb89838a01611a37565b90965094506040880135915080821115611c13578283fd5b50611c2088828901611a37565b969995985093965092949392505050565b60008060008060008060006080888a031215611c4b578081fd5b87359650602088013567ffffffffffffffff80821115611c69578283fd5b611c758b838c01611a37565b909850965060408a0135915080821115611c8d578283fd5b611c998b838c01611a37565b909650945060608a0135915080821115611cb1578283fd5b50611cbe8a828b016119ed565b989b979a50959850939692959293505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8183823760009101908152919050565b6020808252825182820181905260009190848201906040850190845b81811015611d4b5783516001600160a01b031683529284019291840191600101611d26565b50909695505050505050565b6000602080835283518082850152825b81811015611d8357858101830151858201604001528201611d67565b81811115611d945783604083870101525b50601f01601f1916929092016040019392505050565b60208082526010908201526f195c9c8b5b595b58995c8b595e1a5cdd60821b604082015260600190565b60208082526010908201526f195c9c8b5b985b594b58db185a5b595960821b604082015260600190565b60208082526017908201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b6020808252600e908201526d6572722d656d7074792d6d65746160901b604082015260600190565b6020808252600e908201526d6572722d656d7074792d6e616d6560901b604082015260600190565b6020808252600e908201526d32b93916b737ba16b6b2b6b132b960911b604082015260600190565b6020808252600d908201526c195c9c8b5b9bdd0b595e1a5cdd609a1b604082015260600190565b848152606060208201526000611eee606083018587611cd1565b905060018060a01b038316604083015295945050505050565b868152608060208201526000611f21608083018789611cd1565b8281036040840152611f34818688611cd1565b91505060018060a01b0383166060830152979650505050505050565b87815286602082015260a060408201526000611f7060a083018789611cd1565b8281036060840152611f83818688611cd1565b91505060018060a01b038316608083015298975050505050505050565b600082821015611fb257611fb261200d565b500390565b600181811c90821680611fcb57607f821691505b60208210811415611fec57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156120065761200661200d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461132e57600080fdfea26469706673582212208377471f48619ef29a33d7b2287c8026ef9ca8f9022d55743404cc3c358c53b864736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000da78a11fd57af7be2edd804840ea7f4c2a38801d
-----Decoded View---------------
Arg [0] : _forwarder (address): 0xdA78a11FD57aF7be2eDD804840eA7f4c2A38801d
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000da78a11fd57af7be2edd804840ea7f4c2a38801d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.