More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 234,701 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Pause | 8045090 | 253 days ago | IN | 0 ETH | 0.00000161 | ||||
Withdraw | 8045074 | 253 days ago | IN | 0 ETH | 0.00000181 | ||||
Attest Rubyscore | 8021390 | 254 days ago | IN | 0.0005 ETH | 0.00001899 | ||||
Attest Rubyscore | 7982502 | 255 days ago | IN | 0.0005 ETH | 0.00002024 | ||||
Attest Rubyscore | 7972349 | 255 days ago | IN | 0.0005 ETH | 0.00002015 | ||||
Attest Rubyscore | 7933284 | 256 days ago | IN | 0.0005 ETH | 0.000019 | ||||
Attest Rubyscore | 7913960 | 256 days ago | IN | 0.0005 ETH | 0.00002024 | ||||
Attest Rubyscore | 7880647 | 257 days ago | IN | 0.0005 ETH | 0.00002112 | ||||
Attest Rubyscore | 7870930 | 257 days ago | IN | 0.0005 ETH | 0.00001957 | ||||
Attest Rubyscore | 7863448 | 257 days ago | IN | 0.0005 ETH | 0.00002379 | ||||
Attest Rubyscore | 7825263 | 258 days ago | IN | 0.0005 ETH | 0.00002611 | ||||
Attest Rubyscore | 7820846 | 258 days ago | IN | 0.0005 ETH | 0.00002087 | ||||
Attest Rubyscore | 7788447 | 259 days ago | IN | 0.0005 ETH | 0.00002015 | ||||
Attest Rubyscore | 7780523 | 259 days ago | IN | 0.0005 ETH | 0.00002056 | ||||
Attest Rubyscore | 7773865 | 259 days ago | IN | 0.0005 ETH | 0.00002024 | ||||
Attest Rubyscore | 7762717 | 260 days ago | IN | 0.0005 ETH | 0.00002015 | ||||
Attest Rubyscore | 7738048 | 260 days ago | IN | 0.0005 ETH | 0.0000471 | ||||
Attest Rubyscore | 7650161 | 262 days ago | IN | 0.0005 ETH | 0.000019 | ||||
Attest Rubyscore | 7644630 | 262 days ago | IN | 0.0005 ETH | 0.000019 | ||||
Attest Rubyscore | 7643279 | 262 days ago | IN | 0.0005 ETH | 0.00002024 | ||||
Attest Rubyscore | 7630874 | 263 days ago | IN | 0.0005 ETH | 0.00001899 | ||||
Attest Rubyscore | 7614821 | 263 days ago | IN | 0.0005 ETH | 0.00001912 | ||||
Attest Rubyscore | 7608171 | 263 days ago | IN | 0.0005 ETH | 0.00002769 | ||||
Attest Rubyscore | 7606980 | 263 days ago | IN | 0.0005 ETH | 0.00002618 | ||||
Attest Rubyscore | 7583755 | 264 days ago | IN | 0.0005 ETH | 0.000019 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
8045074 | 253 days ago | 0.012 ETH | ||||
8021390 | 254 days ago | 0 ETH | ||||
8021390 | 254 days ago | 0 ETH | ||||
7982502 | 255 days ago | 0 ETH | ||||
7982502 | 255 days ago | 0 ETH | ||||
7972349 | 255 days ago | 0 ETH | ||||
7972349 | 255 days ago | 0 ETH | ||||
7933284 | 256 days ago | 0 ETH | ||||
7933284 | 256 days ago | 0 ETH | ||||
7913960 | 256 days ago | 0 ETH | ||||
7913960 | 256 days ago | 0 ETH | ||||
7880647 | 257 days ago | 0 ETH | ||||
7880647 | 257 days ago | 0 ETH | ||||
7870930 | 257 days ago | 0 ETH | ||||
7870930 | 257 days ago | 0 ETH | ||||
7863448 | 257 days ago | 0 ETH | ||||
7863448 | 257 days ago | 0 ETH | ||||
7825263 | 258 days ago | 0 ETH | ||||
7825263 | 258 days ago | 0 ETH | ||||
7820846 | 258 days ago | 0 ETH | ||||
7820846 | 258 days ago | 0 ETH | ||||
7788447 | 259 days ago | 0 ETH | ||||
7788447 | 259 days ago | 0 ETH | ||||
7780523 | 259 days ago | 0 ETH | ||||
7780523 | 259 days ago | 0 ETH |
Loading...
Loading
Contract Name:
RubyScoreVeraxPortal
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import {AbstractPortal} from "./abstracts/AbstractPortal.sol"; import {AttestationPayload} from "./interfaces/Structs.sol"; import {Pausable} from "@openzeppelin/contracts/security/Pausable.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {IRubyscore_Certificates} from "./interfaces/IRubyscore_Certificates.sol"; /** * @title RubyScoreVeraxPortal * @dev RubyScoreVeraxPortal is a smart contract that handles the attestation process for RubyScore certificates. * It manages fees, signatures based on specific schemas. */ contract RubyScoreVeraxPortal is AbstractPortal, Ownable, Pausable { // State variables bool public bulkStatus = false; bool public feeStatus = true; // Storage mapping(bytes32 => bool) public certificates; // schemaId => certificateStatus mapping(bytes32 => uint256) public attestationFees; // schemaId => attestationFee // Errors error InvalidCertificateId(); error ArrayLengthMismatch(); error InvalidAttestationFee(); error ZeroAddressCheck(); error WithdrawFail(); // Events event FeesSet(bytes32[] schemaIds, uint256[] attestationFees); /** * @dev Contract constructor. * @param modules List of modules to use for the portal. * @param router The Router's address. */ constructor(address[] memory modules, address router) AbstractPortal(modules, router) { if (router == address(0)) revert ZeroAddressCheck(); _transferOwnership(msg.sender); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } /** * @dev Check if the provided value meets the attestation fee requirement. * @param schemaId The schemaId for which to check the fee. * @param _value The value sent for the attestation. */ function checkFee(bytes32 schemaId, uint256 _value) public view { if (_value < attestationFees[schemaId]) revert InvalidAttestationFee(); } /** * @dev Set the fee, signature, and issuance statuses. * @param fee Fee status. */ function setCheckStatuses(bool fee, bool bulk) external onlyOwner { feeStatus = fee; bulkStatus = bulk; } /** * @dev Add a new module to the list of modules. * @param module The address of the new module. */ function addModule(address module) external onlyOwner { modules.push(module); } /** * @dev Remove all modules from the list of modules. */ function removeModules() external onlyOwner whenPaused { delete modules; } /** * @dev Set the fees for specific schemaIds. * @param schemaIds The schemaIds to set the fee for. * @param _attestationFees The fees required to attest. */ function setFees(bytes32[] memory schemaIds, uint256[] memory _attestationFees) public onlyOwner { if (schemaIds.length != _attestationFees.length) revert ArrayLengthMismatch(); for (uint256 i = 0; i < schemaIds.length; i++) { attestationFees[schemaIds[i]] = _attestationFees[i]; } emit FeesSet(schemaIds, _attestationFees); } /** * @dev Set up certificate mappings for schemaIds. * @param schemaIds The schemaIds for which to set up certificates. * @param certificateStatuses The corresponding certificate statuses. */ function setUpCertificates(bytes32[] calldata schemaIds, bool[] calldata certificateStatuses) public onlyOwner { if (schemaIds.length != certificateStatuses.length) revert ArrayLengthMismatch(); for (uint256 i = 0; i < schemaIds.length; i++) { certificates[schemaIds[i]] = certificateStatuses[i]; } } /** * @dev Attest a score with a given attestation payload and validation payloads. * @param attestationPayload The payload of the attestation. * @param validationPayload The validation payload required for the module. */ function attestRubyscore( AttestationPayload memory attestationPayload, bytes[] memory validationPayload ) external payable { super.attest(attestationPayload, validationPayload); } /** * @dev Withdraw ETH from the contract. * @param to The address to which the ETH will be withdrawn. * @param amount The amount of ETH to withdraw. */ function withdraw(address payable to, uint256 amount) external override onlyOwner { (bool status, ) = to.call{value: amount}(""); if (!status) revert WithdrawFail(); } /** * @notice Optional method run before a payload is attested * @param attestationPayload the attestation payload supposed to be attested * @param attester the address of the attester * @param value the value sent with the attestation */ function _onAttest( AttestationPayload memory attestationPayload, address attester, uint256 value ) internal override whenNotPaused { if (!certificates[attestationPayload.schemaId]) revert InvalidCertificateId(); if (feeStatus) checkFee(attestationPayload.schemaId, value); super._onAttest(attestationPayload, attester, value); } /** * @notice Optional method run when attesting a batch of payloads */ function _onBulkAttest( AttestationPayload[] memory attestationsPayloads, bytes[][] memory validationPayloads ) internal override whenNotPaused { if (!bulkStatus) revert("Only single attest"); for (uint256 i = 0; i < attestationsPayloads.length; i++) { if (!certificates[attestationsPayloads[i].schemaId]) revert InvalidCertificateId(); } super._onBulkAttest(attestationsPayloads, validationPayloads); } /** * @notice Optional method run when an attestation is replaced * @param attestationId the ID of the attestation being replaced * @param attestationPayload the attestation payload to create attestation and register it * @param attester the address of the attester * @param value the value sent with the attestation */ function _onReplace( bytes32 attestationId, AttestationPayload memory attestationPayload, address attester, uint256 value ) internal override whenNotPaused { if (!certificates[attestationPayload.schemaId]) revert InvalidCertificateId(); if (feeStatus) checkFee(attestationPayload.schemaId, value); super._onReplace(attestationId, attestationPayload, attester, value); } function _onBulkReplace( bytes32[] memory attestationIds, AttestationPayload[] memory attestationsPayloads, bytes[][] memory validationPayloads ) internal override whenNotPaused { if (!bulkStatus) revert("Only single replace"); for (uint256 i = 0; i < attestationsPayloads.length; i++) { if (!certificates[attestationsPayloads[i].schemaId]) revert InvalidCertificateId(); } super._onBulkReplace(attestationIds, attestationsPayloads, validationPayloads); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] calldata accounts, uint256[] calldata ids ) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import {IAttestationRegistry} from "../interfaces/IAttestationRegistry.sol"; import {IModuleRegistry} from "../interfaces/IModuleRegistry.sol"; import {IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import {IPortalRegistry} from "../interfaces/IPortalRegistry.sol"; import {IRouter} from "../interfaces/IRouter.sol"; import {IPortal} from "../interfaces/IPortal.sol"; import {AttestationPayload} from "../interfaces/Structs.sol"; /** * @title Abstract Portal * @author Consensys * @notice This contract is an abstract contract with basic Portal logic * to be inherited. We strongly encourage all Portals to implement * this contract. */ abstract contract AbstractPortal is IPortal { IRouter public router; address[] public modules; IModuleRegistry public moduleRegistry; IAttestationRegistry public attestationRegistry; IPortalRegistry public portalRegistry; /// @notice Error thrown when someone else than the portal's owner is trying to revoke error OnlyPortalOwner(); /** * @notice Contract constructor * @param _modules list of modules to use for the portal (can be empty) * @param _router Router's address * @dev This sets the addresses for the IAttestationRegistry, IModuleRegistry and IPortalRegistry */ constructor(address[] memory _modules, address _router) { modules = _modules; router = IRouter(_router); attestationRegistry = IAttestationRegistry(router.getAttestationRegistry()); moduleRegistry = IModuleRegistry(router.getModuleRegistry()); portalRegistry = IPortalRegistry(router.getPortalRegistry()); } /** * @notice Optional method to withdraw funds from the Portal * @param to the address to send the funds to * @param amount the amount to withdraw */ function withdraw(address payable to, uint256 amount) external virtual; /** * @notice Attest the schema with given attestationPayload and validationPayload * @param attestationPayload the payload to attest * @param validationPayloads the payloads to validate via the modules to issue the attestations * @dev Runs all modules for the portal and registers the attestation using IAttestationRegistry */ function attest(AttestationPayload memory attestationPayload, bytes[] memory validationPayloads) public payable { moduleRegistry.runModules(modules, attestationPayload, validationPayloads, msg.value); _onAttest(attestationPayload, getAttester(), msg.value); attestationRegistry.attest(attestationPayload, getAttester()); } /** * @notice Bulk attest the schema with payloads to attest and validation payloads * @param attestationsPayloads the payloads to attest * @param validationPayloads the payloads to validate via the modules to issue the attestations */ function bulkAttest(AttestationPayload[] memory attestationsPayloads, bytes[][] memory validationPayloads) public { moduleRegistry.bulkRunModules(modules, attestationsPayloads, validationPayloads); _onBulkAttest(attestationsPayloads, validationPayloads); attestationRegistry.bulkAttest(attestationsPayloads, getAttester()); } /** * @notice Replaces the attestation for the given identifier and replaces it with a new attestation * @param attestationId the ID of the attestation to replace * @param attestationPayload the attestation payload to create the new attestation and register it * @param validationPayloads the payloads to validate via the modules to issue the attestation * @dev Runs all modules for the portal and registers the attestation using IAttestationRegistry */ function replace( bytes32 attestationId, AttestationPayload memory attestationPayload, bytes[] memory validationPayloads ) public payable { moduleRegistry.runModules(modules, attestationPayload, validationPayloads, msg.value); _onReplace(attestationId, attestationPayload, getAttester(), msg.value); attestationRegistry.replace(attestationId, attestationPayload, getAttester()); } /** * @notice Bulk replaces the attestation for the given identifiers and replaces them with new attestations * @param attestationIds the list of IDs of the attestations to replace * @param attestationsPayloads the list of attestation payloads to create the new attestations and register them * @param validationPayloads the payloads to validate via the modules to issue the attestations */ function bulkReplace( bytes32[] memory attestationIds, AttestationPayload[] memory attestationsPayloads, bytes[][] memory validationPayloads ) public { moduleRegistry.bulkRunModules(modules, attestationsPayloads, validationPayloads); _onBulkReplace(attestationIds, attestationsPayloads, validationPayloads); attestationRegistry.bulkReplace(attestationIds, attestationsPayloads, getAttester()); } /** * @notice Revokes an attestation for the given identifier * @param attestationId the ID of the attestation to revoke * @dev By default, revocation is only possible by the portal owner * We strongly encourage implementing such a rule in your Portal if you intend on overriding this method */ function revoke(bytes32 attestationId) public { _onRevoke(attestationId); attestationRegistry.revoke(attestationId); } /** * @notice Bulk revokes a list of attestations for the given identifiers * @param attestationIds the IDs of the attestations to revoke */ function bulkRevoke(bytes32[] memory attestationIds) public { _onBulkRevoke(attestationIds); attestationRegistry.bulkRevoke(attestationIds); } /** * @notice Get all the modules addresses used by the Portal * @return The list of modules addresses linked to the Portal */ function getModules() external view returns (address[] memory) { return modules; } /** * @notice Verifies that a specific interface is implemented by the Portal, following ERC-165 specification * @param interfaceID the interface identifier checked in this call * @return The list of modules addresses linked to the Portal */ function supportsInterface(bytes4 interfaceID) public pure virtual override returns (bool) { return interfaceID == type(AbstractPortal).interfaceId || interfaceID == type(IPortal).interfaceId || interfaceID == type(IERC165).interfaceId; } /** * @notice Defines the address of the entity issuing attestations to the subject * @dev We strongly encourage a reflection when overriding this rule: who should be set as the attester? */ function getAttester() public view virtual returns (address) { return msg.sender; } /** * @notice Optional method run before a payload is attested * @param attestationPayload the attestation payload supposed to be attested * @param attester the address of the attester * @param value the value sent with the attestation */ function _onAttest( AttestationPayload memory attestationPayload, address attester, uint256 value ) internal virtual {} /** * @notice Optional method run when an attestation is replaced * @param attestationId the ID of the attestation being replaced * @param attestationPayload the attestation payload to create attestation and register it * @param attester the address of the attester * @param value the value sent with the attestation */ function _onReplace( bytes32 attestationId, AttestationPayload memory attestationPayload, address attester, uint256 value ) internal virtual {} /** * @notice Optional method run when attesting a batch of payloads * @param attestationsPayloads the payloads to attest * @param validationPayloads the payloads to validate in order to issue the attestations */ function _onBulkAttest( AttestationPayload[] memory attestationsPayloads, bytes[][] memory validationPayloads ) internal virtual {} function _onBulkReplace( bytes32[] memory attestationIds, AttestationPayload[] memory attestationsPayloads, bytes[][] memory validationPayloads ) internal virtual {} /** * @notice Optional method run when an attestation is revoked or replaced * @dev IMPORTANT NOTE: By default, revocation is only possible by the portal owner */ function _onRevoke(bytes32 /*attestationId*/) internal virtual { if (msg.sender != portalRegistry.getPortalByAddress(address(this)).ownerAddress) revert OnlyPortalOwner(); } /** * @notice Optional method run when a batch of attestations are revoked or replaced * @dev IMPORTANT NOTE: By default, revocation is only possible by the portal owner */ function _onBulkRevoke(bytes32[] memory /*attestationIds*/) internal virtual { if (msg.sender != portalRegistry.getPortalByAddress(address(this)).ownerAddress) revert OnlyPortalOwner(); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import {Attestation, AttestationPayload} from "./Structs.sol"; import {IRouter} from "./IRouter.sol"; interface IAttestationRegistry { /// @notice Event emitted when an attestation is registered event AttestationRegistered(bytes32 indexed attestationId); function router() external view returns (IRouter); function attestations(bytes32 attestationId) external view returns (Attestation memory); function initialize() external; function updateRouter(address _router) external; function updateChainPrefix(uint256 _chainPrefix) external; function onlyPortals(address portal) external view; function attest(AttestationPayload calldata attestationPayload, address attester) external; function bulkAttest(AttestationPayload[] calldata attestationsPayloads, address attester) external; function massImport(AttestationPayload[] calldata attestationsPayloads, address portal) external; function replace(bytes32 attestationId, AttestationPayload calldata attestationPayload, address attester) external; function bulkReplace( bytes32[] calldata attestationIds, AttestationPayload[] calldata attestationPayloads, address attester ) external; function revoke(bytes32 attestationId) external; function bulkRevoke(bytes32[] memory attestationIds) external; function isRegistered(bytes32 attestationId) external view returns (bool); function isRevocable(address portalId) external view returns (bool); function getAttestation(bytes32 attestationId) external view returns (Attestation memory); function incrementVersionNumber() external returns (uint16); function getVersionNumber() external view returns (uint16); function getAttestationIdCounter() external view returns (uint32); function getChainPrefix() external view returns (uint256); function balanceOf(address account, uint256 id) external view returns (uint256); function balanceOfBatch(address[] memory accounts, uint256[] memory ids) external view returns (uint256[] memory); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import {Module, AttestationPayload} from "./Structs.sol"; import {IRouter} from "./IRouter.sol"; interface IModuleRegistry { function router() external view returns (IRouter); function modules(address moduleAddress) external view returns (Module memory); function moduleAddresses(uint256 index) external view returns (address); function initialize() external; function updateRouter(address _router) external; function isContractAddress(address contractAddress) external view returns (bool); function onlyIssuers(address issuer) external view; function register(string memory name, string memory description, address moduleAddress) external; function runModules( address[] memory modulesAddresses, AttestationPayload memory attestationPayload, bytes[] memory validationPayloads, uint256 value ) external; function bulkRunModules( address[] memory modulesAddresses, AttestationPayload[] memory attestationsPayloads, bytes[][] memory validationPayloads ) external; function getModulesNumber() external view returns (uint256); function isRegistered(address moduleAddress) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import {IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; /** * @title IPortal * @author Consensys * @notice This contract is the interface to be implemented by any Portal. * NOTE: A portal must implement this interface to registered on * the PortalRegistry contract. */ interface IPortal is IERC165 { /** * @notice Get all the modules addresses used by the Portal * @return The list of modules addresses linked to the Portal */ function getModules() external view returns (address[] memory); /** * @notice Defines the address of the entity issuing attestations to the subject * @dev We strongly encourage a reflection when implementing this method */ function getAttester() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import {Portal} from "./Structs.sol"; import {IRouter} from "./IRouter.sol"; interface IPortalRegistry { function router() external view returns (IRouter); function portals(address id) external view returns (Portal memory); function issuers(address issuerAddress) external view returns (bool); function portalAddresses(uint256 index) external view returns (address); function initialize() external; function updateRouter(address _router) external; function setIssuer(address issuer) external; function removeIssuer(address issuer) external; function isIssuer(address issuer) external view returns (bool); function register( address id, string memory name, string memory description, bool isRevocable, string memory ownerName ) external; function revoke(address id) external; function deployDefaultPortal( address[] calldata modules, string memory name, string memory description, bool isRevocable, string memory ownerName ) external; function getPortalByAddress(address id) external view returns (Portal memory); function isRegistered(address id) external view returns (bool); function getPortalsCount() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; /** * @title Router * @author Consensys * @notice This contract aims to provides a single entrypoint for the Verax registries */ interface IRouter { /** * @notice Gives the address for the AttestationRegistry contract * @return The current address of the AttestationRegistry contract */ function getAttestationRegistry() external view returns (address); /** * @notice Gives the address for the ModuleRegistry contract * @return The current address of the ModuleRegistry contract */ function getModuleRegistry() external view returns (address); /** * @notice Gives the address for the PortalRegistry contract * @return The current address of the PortalRegistry contract */ function getPortalRegistry() external view returns (address); /** * @notice Gives the address for the SchemaRegistry contract * @return The current address of the SchemaRegistry contract */ function getSchemaRegistry() external view returns (address); }
// SPDX-License-Identifier: SEE LICENSE IN LICENSE pragma solidity 0.8.19; import {IERC1155} from "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; /** * @title IRubyscore_Certificates * @dev IRubyscore_Certificates is an interface for Rubyscore_Certificates contract */ interface IRubyscore_Certificates is IERC1155 { /** * @notice Emitted when the base URI for token metadata is updated. * @param newBaseURI The new base URI that will be used to construct token metadata URIs. * @dev This event is triggered when the contract operator updates the base URI * for retrieving metadata associated with tokens. The 'newBaseURI' parameter represents * the updated base URI. */ event BaseURISet(string indexed newBaseURI); /** * @notice Emitted when NFTs are minted for a user. * @param userAddress The address of the user receiving the NFTs. * @param nftId NFT IDs that were minted. * @dev This event is emitted when new NFTs are created and assigned to a user. * @dev It includes the user's address, and the ID of the minted NFT for transparency. */ event Minted(address indexed userAddress, uint256 nftId); /** * @notice Emitted when NFTs are minted for a user. * @param userAddress The address of the user receiving the NFTs. * @param nftIds NFT IDs that were minted. * @dev This event is emitted when new NFTs are created and assigned to a user. * @dev It includes the user's address and the IDs of the minted NFTs for transparency. */ event BatchMinted(address indexed userAddress, uint256[] nftIds); /** * @notice Emitted when the URI for a specific token is updated. * @param tokenId The ID of the token for which the URI is updated. * @param newTokenURI The new URI assigned to the token. * @dev This event is emitted when the URI for a token is modified, providing transparency * when metadata URIs are changed for specific tokens. */ event TokenURISet(uint256 indexed tokenId, string indexed newTokenURI); /** * @notice Get token name. * @return Token name. */ function name() external view returns (string memory); /** * @notice Get token symbol. * @return Token symbol. */ function symbol() external view returns (string memory); /** * @notice Get the URI of a token. * @param tokenId The ID of the token. * @return The URI of the token. */ function uri(uint256 tokenId) external view returns (string memory); /** * @notice Get the token URI for a given tokenId. * @param tokenId The ID of the token. * @return The URI of the token. * @dev Diblicate for uri() method */ function tokenURI(uint256 tokenId) external view returns (string memory); /** * @notice Set the URI for a token. * @param tokenId The ID of the token. * @param newTokenURI The new URI to set for the token. * @dev Requires the MINTER_ROLE. */ function setTokenURI(uint256 tokenId, string memory newTokenURI) external; /** * @notice Set the URIs for multiple tokens in a batch. * @param tokenIds An array of token IDs to set URIs for. * @param newTokenURIs An array of new URIs to set for the tokens. * @dev Requires the MINTER_ROLE. * @dev Requires that the tokenIds and newTokenURIs arrays have the same length. */ function setBatchTokenURI(uint256[] calldata tokenIds, string[] calldata newTokenURIs) external; /** * @notice Set the base URI for all tokens. * @param newBaseURI The new base URI to set. * @dev Requires the OPERATOR_ROLE. */ function setBaseURI(string memory newBaseURI) external; /** * @notice Safely mints NFT for a user. * @param to The NFT recipient. * @param id The NFT id. */ function safeMint(address to, uint256 id) external payable; /** * @notice Check if a given interface is supported by this contract. * @param interfaceId The interface identifier to check for support. * @return Whether the contract supports the specified interface. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; struct AttestationPayload { bytes32 schemaId; // The identifier of the schema this attestation adheres to. uint64 expirationDate; // The expiration date of the attestation. bytes subject; // The ID of the attestee, EVM address, DID, URL etc. bytes attestationData; // The attestation data. } struct Attestation { bytes32 attestationId; // The unique identifier of the attestation. bytes32 schemaId; // The identifier of the schema this attestation adheres to. bytes32 replacedBy; // Whether the attestation was replaced by a new one. address attester; // The address issuing the attestation to the subject. address portal; // The id of the portal that created the attestation. uint64 attestedDate; // The date the attestation is issued. uint64 expirationDate; // The expiration date of the attestation. uint64 revocationDate; // The date when the attestation was revoked. uint16 version; // Version of the registry when the attestation was created. bool revoked; // Whether the attestation is revoked or not. bytes subject; // The ID of the attestee, EVM address, DID, URL etc. bytes attestationData; // The attestation data. } struct Schema { string name; // The name of the schema. string description; // A description of the schema. string context; // The context of the schema. string schema; // The schema definition. } struct Portal { address id; // The unique identifier of the portal. address ownerAddress; // The address of the owner of this portal. address[] modules; // Addresses of modules implemented by the portal. bool isRevocable; // Whether attestations issued can be revoked. string name; // The name of the portal. string description; // A description of the portal. string ownerName; // The name of the owner of this portal. } struct Module { address moduleAddress; // The address of the module. string name; // The name of the module. string description; // A description of the module. }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address[]","name":"modules","type":"address[]"},{"internalType":"address","name":"router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"InvalidAttestationFee","type":"error"},{"inputs":[],"name":"InvalidCertificateId","type":"error"},{"inputs":[],"name":"OnlyPortalOwner","type":"error"},{"inputs":[],"name":"WithdrawFail","type":"error"},{"inputs":[],"name":"ZeroAddressCheck","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32[]","name":"schemaIds","type":"bytes32[]"},{"indexed":false,"internalType":"uint256[]","name":"attestationFees","type":"uint256[]"}],"name":"FeesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"addModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"schemaId","type":"bytes32"},{"internalType":"uint64","name":"expirationDate","type":"uint64"},{"internalType":"bytes","name":"subject","type":"bytes"},{"internalType":"bytes","name":"attestationData","type":"bytes"}],"internalType":"struct AttestationPayload","name":"attestationPayload","type":"tuple"},{"internalType":"bytes[]","name":"validationPayloads","type":"bytes[]"}],"name":"attest","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"schemaId","type":"bytes32"},{"internalType":"uint64","name":"expirationDate","type":"uint64"},{"internalType":"bytes","name":"subject","type":"bytes"},{"internalType":"bytes","name":"attestationData","type":"bytes"}],"internalType":"struct AttestationPayload","name":"attestationPayload","type":"tuple"},{"internalType":"bytes[]","name":"validationPayload","type":"bytes[]"}],"name":"attestRubyscore","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"attestationFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"attestationRegistry","outputs":[{"internalType":"contract IAttestationRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"schemaId","type":"bytes32"},{"internalType":"uint64","name":"expirationDate","type":"uint64"},{"internalType":"bytes","name":"subject","type":"bytes"},{"internalType":"bytes","name":"attestationData","type":"bytes"}],"internalType":"struct AttestationPayload[]","name":"attestationsPayloads","type":"tuple[]"},{"internalType":"bytes[][]","name":"validationPayloads","type":"bytes[][]"}],"name":"bulkAttest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"attestationIds","type":"bytes32[]"},{"components":[{"internalType":"bytes32","name":"schemaId","type":"bytes32"},{"internalType":"uint64","name":"expirationDate","type":"uint64"},{"internalType":"bytes","name":"subject","type":"bytes"},{"internalType":"bytes","name":"attestationData","type":"bytes"}],"internalType":"struct AttestationPayload[]","name":"attestationsPayloads","type":"tuple[]"},{"internalType":"bytes[][]","name":"validationPayloads","type":"bytes[][]"}],"name":"bulkReplace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"attestationIds","type":"bytes32[]"}],"name":"bulkRevoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bulkStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"certificates","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"schemaId","type":"bytes32"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"checkFee","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAttester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getModules","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"moduleRegistry","outputs":[{"internalType":"contract IModuleRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"modules","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"portalRegistry","outputs":[{"internalType":"contract IPortalRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeModules","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"attestationId","type":"bytes32"},{"components":[{"internalType":"bytes32","name":"schemaId","type":"bytes32"},{"internalType":"uint64","name":"expirationDate","type":"uint64"},{"internalType":"bytes","name":"subject","type":"bytes"},{"internalType":"bytes","name":"attestationData","type":"bytes"}],"internalType":"struct AttestationPayload","name":"attestationPayload","type":"tuple"},{"internalType":"bytes[]","name":"validationPayloads","type":"bytes[]"}],"name":"replace","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"attestationId","type":"bytes32"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"fee","type":"bool"},{"internalType":"bool","name":"bulk","type":"bool"}],"name":"setCheckStatuses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"schemaIds","type":"bytes32[]"},{"internalType":"uint256[]","name":"_attestationFees","type":"uint256[]"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"schemaIds","type":"bytes32[]"},{"internalType":"bool[]","name":"certificateStatuses","type":"bool[]"}],"name":"setUpCertificates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526005805461ffff60a81b1916600160b01b1790553480156200002557600080fd5b50604051620025e5380380620025e583398101604081905262000048916200036f565b81518290829062000061906001906020850190620002bb565b50600080546001600160a01b0319166001600160a01b0383169081179091556040805163bfa6658560e01b8152905163bfa66585916004808201926020929091908290030181865afa158015620000bc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000e2919062000455565b600380546001600160a01b0319166001600160a01b03928316179055600054604080516376f63ca960e11b81529051919092169163edec79529160048083019260209291908290030181865afa15801562000141573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000167919062000455565b600280546001600160a01b0319166001600160a01b0392831617905560005460408051635bed64bb60e11b81529051919092169163b7dac9769160048083019260209291908290030181865afa158015620001c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ec919062000455565b600480546001600160a01b0319166001600160a01b0392909216919091179055506200022190506200021b3390565b62000269565b6005805460ff60a01b191690556001600160a01b03811662000256576040516399676b1160e01b815260040160405180910390fd5b620002613362000269565b50506200047a565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562000313579160200282015b828111156200031357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620002dc565b506200032192915062000325565b5090565b5b8082111562000321576000815560010162000326565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200036a57600080fd5b919050565b600080604083850312156200038357600080fd5b82516001600160401b03808211156200039b57600080fd5b818501915085601f830112620003b057600080fd5b8151602082821115620003c757620003c76200033c565b8160051b604051601f19603f83011681018181108682111715620003ef57620003ef6200033c565b6040529283528183019350848101820192898411156200040e57600080fd5b948201945b838610156200043757620004278662000352565b8552948201949382019362000413565b965062000448905087820162000352565b9450505050509250929050565b6000602082840312156200046857600080fd5b620004738262000352565b9392505050565b61215b806200048a6000396000f3fe6080604052600436106101e35760003560e01c80638456cb5911610102578063b666493411610095578063ed6d73f911610064578063ed6d73f914610563578063f2fde38b14610583578063f3fef3a3146105a3578063f887ea40146105c357600080fd5b8063b6664934146104f0578063b75c7dc614610510578063b95459e414610530578063ecdbb4fd1461055057600080fd5b80639e69bee9116100d15780639e69bee914610479578063acdfb1bb14610499578063b2494df3146104ae578063b2c8ea79146104d057600080fd5b80638456cb59146104055780638da5cb5b1461041a578063958f9735146104385780639c1584dc1461045957600080fd5b80633f4ba83a1161017a578063715018a611610149578063715018a614610375578063742f06881461038a57806381b2248a146103ba5780638388e226146103f257600080fd5b80633f4ba83a146103015780634ada807614610316578063523ba7ca146103365780635c975abb1461035657600080fd5b80631ed86f19116101b65780631ed86f191461028057806320d8d2a4146102a057806339f08d1c146102c15780633cc30e2a146102e157600080fd5b806301ffc9a7146101e857806303e25c491461021d57806305e67f6314610258578063074321961461026d575b600080fd5b3480156101f457600080fd5b5061020861020336600461130c565b6105e3565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b5061024a61023836600461133d565b60076020526000908152604090205481565b604051908152602001610214565b61026b61026636600461159c565b610635565b005b61026b61027b36600461159c565b610643565b34801561028c57600080fd5b5061026b61029b366004611614565b610723565b3480156102ac57600080fd5b5060055461020890600160a81b900460ff1681565b3480156102cd57600080fd5b5061026b6102dc366004611631565b61077c565b3480156102ed57600080fd5b5061026b6102fc3660046117ac565b6107ab565b34801561030d57600080fd5b5061026b610886565b34801561032257600080fd5b5061026b610331366004611833565b610898565b34801561034257600080fd5b5061026b61035136600461186f565b610906565b34801561036257600080fd5b50600554600160a01b900460ff16610208565b34801561038157600080fd5b5061026b6109a7565b34801561039657600080fd5b506102086103a536600461133d565b60066020526000908152604090205460ff1681565b3480156103c657600080fd5b506103da6103d536600461133d565b6109b9565b6040516001600160a01b039091168152602001610214565b3480156103fe57600080fd5b50336103da565b34801561041157600080fd5b5061026b6109e3565b34801561042657600080fd5b506005546001600160a01b03166103da565b34801561044457600080fd5b5060055461020890600160b01b900460ff1681565b34801561046557600080fd5b5061026b6104743660046118d6565b6109f3565b34801561048557600080fd5b5061026b61049436600461190f565b610a2f565b3480156104a557600080fd5b5061026b610b00565b3480156104ba57600080fd5b506104c3610b1c565b60405161021491906119c9565b3480156104dc57600080fd5b5061026b6104eb366004611a61565b610b7e565b3480156104fc57600080fd5b506004546103da906001600160a01b031681565b34801561051c57600080fd5b5061026b61052b36600461133d565b610c2d565b34801561053c57600080fd5b506002546103da906001600160a01b031681565b61026b61055e366004611acc565b610c67565b34801561056f57600080fd5b506003546103da906001600160a01b031681565b34801561058f57600080fd5b5061026b61059e366004611614565b610d14565b3480156105af57600080fd5b5061026b6105be366004611b2e565b610d92565b3480156105cf57600080fd5b506000546103da906001600160a01b031681565b60006001600160e01b0319821663204cf90960e01b148061061457506001600160e01b031982166331c1afd560e01b145b8061062f57506001600160e01b031982166301ffc9a760e01b145b92915050565b61063f8282610643565b5050565b60025460405163747129e560e11b81526001600160a01b039091169063e8e253ca9061067a90600190869086903490600401611c9c565b600060405180830381600087803b15801561069457600080fd5b505af11580156106a8573d6000803e3d6000fd5b505050506106bd826106b73390565b34610e12565b6003546001600160a01b03166362fa3d4583336040518363ffffffff1660e01b81526004016106ed929190611ce7565b600060405180830381600087803b15801561070757600080fd5b505af115801561071b573d6000803e3d6000fd5b505050505050565b61072b610e69565b6001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0392909216919091179055565b60008281526007602052604090205481101561063f576040516330c00ff760e01b815260040160405180910390fd5b60025460405163715d762560e11b81526001600160a01b039091169063e2baec4a906107e09060019086908690600401611d59565b600060405180830381600087803b1580156107fa57600080fd5b505af115801561080e573d6000803e3d6000fd5b5050505061081d838383610ec3565b6003546001600160a01b0316636ec4d4cb8484336040518463ffffffff1660e01b815260040161084f93929190611e10565b600060405180830381600087803b15801561086957600080fd5b505af115801561087d573d6000803e3d6000fd5b50505050505050565b61088e610e69565b610896610f90565b565b6108a181610fe5565b60035460405163256d403b60e11b81526001600160a01b0390911690634ada8076906108d1908490600401611e4e565b600060405180830381600087803b1580156108eb57600080fd5b505af11580156108ff573d6000803e3d6000fd5b5050505050565b60025460405163715d762560e11b81526001600160a01b039091169063e2baec4a9061093b9060019086908690600401611d59565b600060405180830381600087803b15801561095557600080fd5b505af1158015610969573d6000803e3d6000fd5b50505050610977828261108b565b6003546001600160a01b031663a8e2812d83336040518363ffffffff1660e01b81526004016106ed929190611e61565b6109af610e69565b6108966000611151565b600181815481106109c957600080fd5b6000918252602090912001546001600160a01b0316905081565b6109eb610e69565b6108966111a3565b6109fb610e69565b6005805461ffff60a81b1916600160b01b9315159390930260ff60a81b191692909217600160a81b91151591909102179055565b610a37610e69565b8051825114610a595760405163512509d360e11b815260040160405180910390fd5b60005b8251811015610ac257818181518110610a7757610a77611e74565b602002602001015160076000858481518110610a9557610a95611e74565b60200260200101518152602001908152602001600020819055508080610aba90611e8a565b915050610a5c565b507fe6819e2393072526980433f94718a65624dac839c064a79991c3d8d06cba0c1a8282604051610af4929190611eb1565b60405180910390a15050565b610b08610e69565b610b106111e6565b610896600160006112da565b60606001805480602002602001604051908101604052809291908181526020018280548015610b7457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b56575b5050505050905090565b610b86610e69565b828114610ba65760405163512509d360e11b815260040160405180910390fd5b60005b838110156108ff57828282818110610bc357610bc3611e74565b9050602002016020810190610bd89190611f08565b60066000878785818110610bee57610bee611e74565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610c2590611e8a565b915050610ba9565b610c3681610fe5565b600354604051635bae3ee360e11b8152600481018390526001600160a01b039091169063b75c7dc6906024016108d1565b60025460405163747129e560e11b81526001600160a01b039091169063e8e253ca90610c9e90600190869086903490600401611c9c565b600060405180830381600087803b158015610cb857600080fd5b505af1158015610ccc573d6000803e3d6000fd5b50505050610ce28383610cdc3390565b34611236565b6003546001600160a01b0316638ffa736b8484336040518463ffffffff1660e01b815260040161084f93929190611f25565b610d1c610e69565b6001600160a01b038116610d865760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b610d8f81611151565b50565b610d9a610e69565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610de7576040519150601f19603f3d011682016040523d82523d6000602084013e610dec565b606091505b5050905080610e0d5760405162c0f29960e01b815260040160405180910390fd5b505050565b610e1a61128d565b825160009081526006602052604090205460ff16610e4b576040516304a057b360e21b815260040160405180910390fd5b600554600160b01b900460ff1615610e0d578251610e0d908261077c565b6005546001600160a01b031633146108965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d7d565b610ecb61128d565b600554600160a81b900460ff16610f1a5760405162461bcd60e51b81526020600482015260136024820152724f6e6c792073696e676c65207265706c61636560681b6044820152606401610d7d565b60005b8251811015610f8a5760066000848381518110610f3c57610f3c611e74565b6020908102919091018101515182528101919091526040016000205460ff16610f78576040516304a057b360e21b815260040160405180910390fd5b80610f8281611e8a565b915050610f1d565b50505050565b610f986111e6565b6005805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6004805460405163181f78e960e31b815230928101929092526001600160a01b03169063c0fbc74890602401600060405180830381865afa15801561102e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611056919081019061201a565b602001516001600160a01b0316336001600160a01b031614610d8f576040516371f63e3160e01b815260040160405180910390fd5b61109361128d565b600554600160a81b900460ff166110e15760405162461bcd60e51b815260206004820152601260248201527113db9b1e481cda5b99db1948185d1d195cdd60721b6044820152606401610d7d565b60005b8251811015610e0d576006600084838151811061110357611103611e74565b6020908102919091018101515182528101919091526040016000205460ff1661113f576040516304a057b360e21b815260040160405180910390fd5b8061114981611e8a565b9150506110e4565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6111ab61128d565b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610fc83390565b600554600160a01b900460ff166108965760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610d7d565b61123e61128d565b825160009081526006602052604090205460ff1661126f576040516304a057b360e21b815260040160405180910390fd5b600554600160b01b900460ff1615610f8a578251610f8a908261077c565b600554600160a01b900460ff16156108965760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d7d565b5080546000825590600052602060002090810190610d8f91905b8082111561130857600081556001016112f4565b5090565b60006020828403121561131e57600080fd5b81356001600160e01b03198116811461133657600080fd5b9392505050565b60006020828403121561134f57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b038111828210171561138e5761138e611356565b60405290565b604051601f8201601f191681016001600160401b03811182821017156113bc576113bc611356565b604052919050565b60006001600160401b038211156113dd576113dd611356565b50601f01601f191660200190565b600082601f8301126113fc57600080fd5b813561140f61140a826113c4565b611394565b81815284602083860101111561142457600080fd5b816020850160208301376000918101602001919091529392505050565b60006080828403121561145357600080fd5b604051608081016001600160401b03828210818311171561147657611476611356565b816040528293508435835260208501359150808216821461149657600080fd5b81602084015260408501359150808211156114b057600080fd5b6114bc868387016113eb565b604084015260608501359150808211156114d557600080fd5b506114e2858286016113eb565b6060830152505092915050565b60006001600160401b0382111561150857611508611356565b5060051b60200190565b600082601f83011261152357600080fd5b8135602061153361140a836114ef565b82815260059290921b8401810191818101908684111561155257600080fd5b8286015b848110156115915780356001600160401b038111156115755760008081fd5b6115838986838b01016113eb565b845250918301918301611556565b509695505050505050565b600080604083850312156115af57600080fd5b82356001600160401b03808211156115c657600080fd5b6115d286838701611441565b935060208501359150808211156115e857600080fd5b506115f585828601611512565b9150509250929050565b6001600160a01b0381168114610d8f57600080fd5b60006020828403121561162657600080fd5b8135611336816115ff565b6000806040838503121561164457600080fd5b50508035926020909101359150565b600082601f83011261166457600080fd5b8135602061167461140a836114ef565b82815260059290921b8401810191818101908684111561169357600080fd5b8286015b848110156115915780358352918301918301611697565b600082601f8301126116bf57600080fd5b813560206116cf61140a836114ef565b82815260059290921b840181019181810190868411156116ee57600080fd5b8286015b848110156115915780356001600160401b038111156117115760008081fd5b61171f8986838b0101611441565b8452509183019183016116f2565b600082601f83011261173e57600080fd5b8135602061174e61140a836114ef565b82815260059290921b8401810191818101908684111561176d57600080fd5b8286015b848110156115915780356001600160401b038111156117905760008081fd5b61179e8986838b0101611512565b845250918301918301611771565b6000806000606084860312156117c157600080fd5b83356001600160401b03808211156117d857600080fd5b6117e487838801611653565b945060208601359150808211156117fa57600080fd5b611806878388016116ae565b9350604086013591508082111561181c57600080fd5b506118298682870161172d565b9150509250925092565b60006020828403121561184557600080fd5b81356001600160401b0381111561185b57600080fd5b61186784828501611653565b949350505050565b6000806040838503121561188257600080fd5b82356001600160401b038082111561189957600080fd5b6118a5868387016116ae565b935060208501359150808211156118bb57600080fd5b506115f58582860161172d565b8015158114610d8f57600080fd5b600080604083850312156118e957600080fd5b82356118f4816118c8565b91506020830135611904816118c8565b809150509250929050565b6000806040838503121561192257600080fd5b82356001600160401b038082111561193957600080fd5b61194586838701611653565b935060209150818501358181111561195c57600080fd5b85019050601f8101861361196f57600080fd5b803561197d61140a826114ef565b81815260059190911b8201830190838101908883111561199c57600080fd5b928401925b828410156119ba578335825292840192908401906119a1565b80955050505050509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611a0a5783516001600160a01b0316835292840192918401916001016119e5565b50909695505050505050565b60008083601f840112611a2857600080fd5b5081356001600160401b03811115611a3f57600080fd5b6020830191508360208260051b8501011115611a5a57600080fd5b9250929050565b60008060008060408587031215611a7757600080fd5b84356001600160401b0380821115611a8e57600080fd5b611a9a88838901611a16565b90965094506020870135915080821115611ab357600080fd5b50611ac087828801611a16565b95989497509550505050565b600080600060608486031215611ae157600080fd5b8335925060208401356001600160401b0380821115611aff57600080fd5b611b0b87838801611441565b93506040860135915080821115611b2157600080fd5b5061182986828701611512565b60008060408385031215611b4157600080fd5b8235611b4c816115ff565b946020939093013593505050565b6000815480845260208085019450836000528060002060005b83811015611b985781546001600160a01b031687529582019560019182019101611b73565b509495945050505050565b60005b83811015611bbe578181015183820152602001611ba6565b50506000910152565b60008151808452611bdf816020860160208601611ba3565b601f01601f19169290920160200192915050565b805182526001600160401b0360208201511660208301526000604082015160806040850152611c256080850182611bc7565b905060608301518482036060860152611c3e8282611bc7565b95945050505050565b600081518084526020808501808196508360051b8101915082860160005b85811015611c8f578284038952611c7d848351611bc7565b98850198935090840190600101611c65565b5091979650505050505050565b608081526000611caf6080830187611b5a565b8281036020840152611cc18187611bf3565b90508281036040840152611cd58186611c47565b91505082606083015295945050505050565b604081526000611cfa6040830185611bf3565b905060018060a01b03831660208301529392505050565b600081518084526020808501808196508360051b8101915082860160005b85811015611c8f578284038952611d47848351611bf3565b98850198935090840190600101611d2f565b606081526000611d6c6060830186611b5a565b602083820381850152611d7f8287611d11565b915083820360408501528185518084528284019150828160051b85010183880160005b83811015611dd057601f19878403018552611dbe838351611c47565b94860194925090850190600101611da2565b50909a9950505050505050505050565b600081518084526020808501945080840160005b83811015611b9857815187529582019590820190600101611df4565b606081526000611e236060830186611de0565b8281036020840152611e358186611d11565b91505060018060a01b0383166040830152949350505050565b6020815260006113366020830184611de0565b604081526000611cfa6040830185611d11565b634e487b7160e01b600052603260045260246000fd5b600060018201611eaa57634e487b7160e01b600052601160045260246000fd5b5060010190565b604081526000611ec46040830185611de0565b82810360208481019190915284518083528582019282019060005b81811015611efb57845183529383019391830191600101611edf565b5090979650505050505050565b600060208284031215611f1a57600080fd5b8135611336816118c8565b838152606060208201526000611f3e6060830185611bf3565b905060018060a01b0383166040830152949350505050565b8051611f61816115ff565b919050565b600082601f830112611f7757600080fd5b81516020611f8761140a836114ef565b82815260059290921b84018101918181019086841115611fa657600080fd5b8286015b84811015611591578051611fbd816115ff565b8352918301918301611faa565b8051611f61816118c8565b600082601f830112611fe657600080fd5b8151611ff461140a826113c4565b81815284602083860101111561200957600080fd5b611867826020830160208701611ba3565b60006020828403121561202c57600080fd5b81516001600160401b038082111561204357600080fd5b9083019060e0828603121561205757600080fd5b61205f61136c565b61206883611f56565b815261207660208401611f56565b602082015260408301518281111561208d57600080fd5b61209987828601611f66565b6040830152506120ab60608401611fca565b60608201526080830151828111156120c257600080fd5b6120ce87828601611fd5565b60808301525060a0830151828111156120e657600080fd5b6120f287828601611fd5565b60a08301525060c08301518281111561210a57600080fd5b61211687828601611fd5565b60c0830152509594505050505056fea26469706673582212209da4e1de8a0ca697a046be2ae942188b8b7992a0d2513c23100c47200d844cd964736f6c6343000813003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000004d3a380a03f3a18a5dc44b01119839d8674a552e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000eacf8b19e104803cfcd2557d893d6a407e4994f0
Deployed Bytecode
0x6080604052600436106101e35760003560e01c80638456cb5911610102578063b666493411610095578063ed6d73f911610064578063ed6d73f914610563578063f2fde38b14610583578063f3fef3a3146105a3578063f887ea40146105c357600080fd5b8063b6664934146104f0578063b75c7dc614610510578063b95459e414610530578063ecdbb4fd1461055057600080fd5b80639e69bee9116100d15780639e69bee914610479578063acdfb1bb14610499578063b2494df3146104ae578063b2c8ea79146104d057600080fd5b80638456cb59146104055780638da5cb5b1461041a578063958f9735146104385780639c1584dc1461045957600080fd5b80633f4ba83a1161017a578063715018a611610149578063715018a614610375578063742f06881461038a57806381b2248a146103ba5780638388e226146103f257600080fd5b80633f4ba83a146103015780634ada807614610316578063523ba7ca146103365780635c975abb1461035657600080fd5b80631ed86f19116101b65780631ed86f191461028057806320d8d2a4146102a057806339f08d1c146102c15780633cc30e2a146102e157600080fd5b806301ffc9a7146101e857806303e25c491461021d57806305e67f6314610258578063074321961461026d575b600080fd5b3480156101f457600080fd5b5061020861020336600461130c565b6105e3565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b5061024a61023836600461133d565b60076020526000908152604090205481565b604051908152602001610214565b61026b61026636600461159c565b610635565b005b61026b61027b36600461159c565b610643565b34801561028c57600080fd5b5061026b61029b366004611614565b610723565b3480156102ac57600080fd5b5060055461020890600160a81b900460ff1681565b3480156102cd57600080fd5b5061026b6102dc366004611631565b61077c565b3480156102ed57600080fd5b5061026b6102fc3660046117ac565b6107ab565b34801561030d57600080fd5b5061026b610886565b34801561032257600080fd5b5061026b610331366004611833565b610898565b34801561034257600080fd5b5061026b61035136600461186f565b610906565b34801561036257600080fd5b50600554600160a01b900460ff16610208565b34801561038157600080fd5b5061026b6109a7565b34801561039657600080fd5b506102086103a536600461133d565b60066020526000908152604090205460ff1681565b3480156103c657600080fd5b506103da6103d536600461133d565b6109b9565b6040516001600160a01b039091168152602001610214565b3480156103fe57600080fd5b50336103da565b34801561041157600080fd5b5061026b6109e3565b34801561042657600080fd5b506005546001600160a01b03166103da565b34801561044457600080fd5b5060055461020890600160b01b900460ff1681565b34801561046557600080fd5b5061026b6104743660046118d6565b6109f3565b34801561048557600080fd5b5061026b61049436600461190f565b610a2f565b3480156104a557600080fd5b5061026b610b00565b3480156104ba57600080fd5b506104c3610b1c565b60405161021491906119c9565b3480156104dc57600080fd5b5061026b6104eb366004611a61565b610b7e565b3480156104fc57600080fd5b506004546103da906001600160a01b031681565b34801561051c57600080fd5b5061026b61052b36600461133d565b610c2d565b34801561053c57600080fd5b506002546103da906001600160a01b031681565b61026b61055e366004611acc565b610c67565b34801561056f57600080fd5b506003546103da906001600160a01b031681565b34801561058f57600080fd5b5061026b61059e366004611614565b610d14565b3480156105af57600080fd5b5061026b6105be366004611b2e565b610d92565b3480156105cf57600080fd5b506000546103da906001600160a01b031681565b60006001600160e01b0319821663204cf90960e01b148061061457506001600160e01b031982166331c1afd560e01b145b8061062f57506001600160e01b031982166301ffc9a760e01b145b92915050565b61063f8282610643565b5050565b60025460405163747129e560e11b81526001600160a01b039091169063e8e253ca9061067a90600190869086903490600401611c9c565b600060405180830381600087803b15801561069457600080fd5b505af11580156106a8573d6000803e3d6000fd5b505050506106bd826106b73390565b34610e12565b6003546001600160a01b03166362fa3d4583336040518363ffffffff1660e01b81526004016106ed929190611ce7565b600060405180830381600087803b15801561070757600080fd5b505af115801561071b573d6000803e3d6000fd5b505050505050565b61072b610e69565b6001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0392909216919091179055565b60008281526007602052604090205481101561063f576040516330c00ff760e01b815260040160405180910390fd5b60025460405163715d762560e11b81526001600160a01b039091169063e2baec4a906107e09060019086908690600401611d59565b600060405180830381600087803b1580156107fa57600080fd5b505af115801561080e573d6000803e3d6000fd5b5050505061081d838383610ec3565b6003546001600160a01b0316636ec4d4cb8484336040518463ffffffff1660e01b815260040161084f93929190611e10565b600060405180830381600087803b15801561086957600080fd5b505af115801561087d573d6000803e3d6000fd5b50505050505050565b61088e610e69565b610896610f90565b565b6108a181610fe5565b60035460405163256d403b60e11b81526001600160a01b0390911690634ada8076906108d1908490600401611e4e565b600060405180830381600087803b1580156108eb57600080fd5b505af11580156108ff573d6000803e3d6000fd5b5050505050565b60025460405163715d762560e11b81526001600160a01b039091169063e2baec4a9061093b9060019086908690600401611d59565b600060405180830381600087803b15801561095557600080fd5b505af1158015610969573d6000803e3d6000fd5b50505050610977828261108b565b6003546001600160a01b031663a8e2812d83336040518363ffffffff1660e01b81526004016106ed929190611e61565b6109af610e69565b6108966000611151565b600181815481106109c957600080fd5b6000918252602090912001546001600160a01b0316905081565b6109eb610e69565b6108966111a3565b6109fb610e69565b6005805461ffff60a81b1916600160b01b9315159390930260ff60a81b191692909217600160a81b91151591909102179055565b610a37610e69565b8051825114610a595760405163512509d360e11b815260040160405180910390fd5b60005b8251811015610ac257818181518110610a7757610a77611e74565b602002602001015160076000858481518110610a9557610a95611e74565b60200260200101518152602001908152602001600020819055508080610aba90611e8a565b915050610a5c565b507fe6819e2393072526980433f94718a65624dac839c064a79991c3d8d06cba0c1a8282604051610af4929190611eb1565b60405180910390a15050565b610b08610e69565b610b106111e6565b610896600160006112da565b60606001805480602002602001604051908101604052809291908181526020018280548015610b7457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b56575b5050505050905090565b610b86610e69565b828114610ba65760405163512509d360e11b815260040160405180910390fd5b60005b838110156108ff57828282818110610bc357610bc3611e74565b9050602002016020810190610bd89190611f08565b60066000878785818110610bee57610bee611e74565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610c2590611e8a565b915050610ba9565b610c3681610fe5565b600354604051635bae3ee360e11b8152600481018390526001600160a01b039091169063b75c7dc6906024016108d1565b60025460405163747129e560e11b81526001600160a01b039091169063e8e253ca90610c9e90600190869086903490600401611c9c565b600060405180830381600087803b158015610cb857600080fd5b505af1158015610ccc573d6000803e3d6000fd5b50505050610ce28383610cdc3390565b34611236565b6003546001600160a01b0316638ffa736b8484336040518463ffffffff1660e01b815260040161084f93929190611f25565b610d1c610e69565b6001600160a01b038116610d865760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b610d8f81611151565b50565b610d9a610e69565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610de7576040519150601f19603f3d011682016040523d82523d6000602084013e610dec565b606091505b5050905080610e0d5760405162c0f29960e01b815260040160405180910390fd5b505050565b610e1a61128d565b825160009081526006602052604090205460ff16610e4b576040516304a057b360e21b815260040160405180910390fd5b600554600160b01b900460ff1615610e0d578251610e0d908261077c565b6005546001600160a01b031633146108965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d7d565b610ecb61128d565b600554600160a81b900460ff16610f1a5760405162461bcd60e51b81526020600482015260136024820152724f6e6c792073696e676c65207265706c61636560681b6044820152606401610d7d565b60005b8251811015610f8a5760066000848381518110610f3c57610f3c611e74565b6020908102919091018101515182528101919091526040016000205460ff16610f78576040516304a057b360e21b815260040160405180910390fd5b80610f8281611e8a565b915050610f1d565b50505050565b610f986111e6565b6005805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6004805460405163181f78e960e31b815230928101929092526001600160a01b03169063c0fbc74890602401600060405180830381865afa15801561102e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611056919081019061201a565b602001516001600160a01b0316336001600160a01b031614610d8f576040516371f63e3160e01b815260040160405180910390fd5b61109361128d565b600554600160a81b900460ff166110e15760405162461bcd60e51b815260206004820152601260248201527113db9b1e481cda5b99db1948185d1d195cdd60721b6044820152606401610d7d565b60005b8251811015610e0d576006600084838151811061110357611103611e74565b6020908102919091018101515182528101919091526040016000205460ff1661113f576040516304a057b360e21b815260040160405180910390fd5b8061114981611e8a565b9150506110e4565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6111ab61128d565b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610fc83390565b600554600160a01b900460ff166108965760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610d7d565b61123e61128d565b825160009081526006602052604090205460ff1661126f576040516304a057b360e21b815260040160405180910390fd5b600554600160b01b900460ff1615610f8a578251610f8a908261077c565b600554600160a01b900460ff16156108965760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d7d565b5080546000825590600052602060002090810190610d8f91905b8082111561130857600081556001016112f4565b5090565b60006020828403121561131e57600080fd5b81356001600160e01b03198116811461133657600080fd5b9392505050565b60006020828403121561134f57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b038111828210171561138e5761138e611356565b60405290565b604051601f8201601f191681016001600160401b03811182821017156113bc576113bc611356565b604052919050565b60006001600160401b038211156113dd576113dd611356565b50601f01601f191660200190565b600082601f8301126113fc57600080fd5b813561140f61140a826113c4565b611394565b81815284602083860101111561142457600080fd5b816020850160208301376000918101602001919091529392505050565b60006080828403121561145357600080fd5b604051608081016001600160401b03828210818311171561147657611476611356565b816040528293508435835260208501359150808216821461149657600080fd5b81602084015260408501359150808211156114b057600080fd5b6114bc868387016113eb565b604084015260608501359150808211156114d557600080fd5b506114e2858286016113eb565b6060830152505092915050565b60006001600160401b0382111561150857611508611356565b5060051b60200190565b600082601f83011261152357600080fd5b8135602061153361140a836114ef565b82815260059290921b8401810191818101908684111561155257600080fd5b8286015b848110156115915780356001600160401b038111156115755760008081fd5b6115838986838b01016113eb565b845250918301918301611556565b509695505050505050565b600080604083850312156115af57600080fd5b82356001600160401b03808211156115c657600080fd5b6115d286838701611441565b935060208501359150808211156115e857600080fd5b506115f585828601611512565b9150509250929050565b6001600160a01b0381168114610d8f57600080fd5b60006020828403121561162657600080fd5b8135611336816115ff565b6000806040838503121561164457600080fd5b50508035926020909101359150565b600082601f83011261166457600080fd5b8135602061167461140a836114ef565b82815260059290921b8401810191818101908684111561169357600080fd5b8286015b848110156115915780358352918301918301611697565b600082601f8301126116bf57600080fd5b813560206116cf61140a836114ef565b82815260059290921b840181019181810190868411156116ee57600080fd5b8286015b848110156115915780356001600160401b038111156117115760008081fd5b61171f8986838b0101611441565b8452509183019183016116f2565b600082601f83011261173e57600080fd5b8135602061174e61140a836114ef565b82815260059290921b8401810191818101908684111561176d57600080fd5b8286015b848110156115915780356001600160401b038111156117905760008081fd5b61179e8986838b0101611512565b845250918301918301611771565b6000806000606084860312156117c157600080fd5b83356001600160401b03808211156117d857600080fd5b6117e487838801611653565b945060208601359150808211156117fa57600080fd5b611806878388016116ae565b9350604086013591508082111561181c57600080fd5b506118298682870161172d565b9150509250925092565b60006020828403121561184557600080fd5b81356001600160401b0381111561185b57600080fd5b61186784828501611653565b949350505050565b6000806040838503121561188257600080fd5b82356001600160401b038082111561189957600080fd5b6118a5868387016116ae565b935060208501359150808211156118bb57600080fd5b506115f58582860161172d565b8015158114610d8f57600080fd5b600080604083850312156118e957600080fd5b82356118f4816118c8565b91506020830135611904816118c8565b809150509250929050565b6000806040838503121561192257600080fd5b82356001600160401b038082111561193957600080fd5b61194586838701611653565b935060209150818501358181111561195c57600080fd5b85019050601f8101861361196f57600080fd5b803561197d61140a826114ef565b81815260059190911b8201830190838101908883111561199c57600080fd5b928401925b828410156119ba578335825292840192908401906119a1565b80955050505050509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611a0a5783516001600160a01b0316835292840192918401916001016119e5565b50909695505050505050565b60008083601f840112611a2857600080fd5b5081356001600160401b03811115611a3f57600080fd5b6020830191508360208260051b8501011115611a5a57600080fd5b9250929050565b60008060008060408587031215611a7757600080fd5b84356001600160401b0380821115611a8e57600080fd5b611a9a88838901611a16565b90965094506020870135915080821115611ab357600080fd5b50611ac087828801611a16565b95989497509550505050565b600080600060608486031215611ae157600080fd5b8335925060208401356001600160401b0380821115611aff57600080fd5b611b0b87838801611441565b93506040860135915080821115611b2157600080fd5b5061182986828701611512565b60008060408385031215611b4157600080fd5b8235611b4c816115ff565b946020939093013593505050565b6000815480845260208085019450836000528060002060005b83811015611b985781546001600160a01b031687529582019560019182019101611b73565b509495945050505050565b60005b83811015611bbe578181015183820152602001611ba6565b50506000910152565b60008151808452611bdf816020860160208601611ba3565b601f01601f19169290920160200192915050565b805182526001600160401b0360208201511660208301526000604082015160806040850152611c256080850182611bc7565b905060608301518482036060860152611c3e8282611bc7565b95945050505050565b600081518084526020808501808196508360051b8101915082860160005b85811015611c8f578284038952611c7d848351611bc7565b98850198935090840190600101611c65565b5091979650505050505050565b608081526000611caf6080830187611b5a565b8281036020840152611cc18187611bf3565b90508281036040840152611cd58186611c47565b91505082606083015295945050505050565b604081526000611cfa6040830185611bf3565b905060018060a01b03831660208301529392505050565b600081518084526020808501808196508360051b8101915082860160005b85811015611c8f578284038952611d47848351611bf3565b98850198935090840190600101611d2f565b606081526000611d6c6060830186611b5a565b602083820381850152611d7f8287611d11565b915083820360408501528185518084528284019150828160051b85010183880160005b83811015611dd057601f19878403018552611dbe838351611c47565b94860194925090850190600101611da2565b50909a9950505050505050505050565b600081518084526020808501945080840160005b83811015611b9857815187529582019590820190600101611df4565b606081526000611e236060830186611de0565b8281036020840152611e358186611d11565b91505060018060a01b0383166040830152949350505050565b6020815260006113366020830184611de0565b604081526000611cfa6040830185611d11565b634e487b7160e01b600052603260045260246000fd5b600060018201611eaa57634e487b7160e01b600052601160045260246000fd5b5060010190565b604081526000611ec46040830185611de0565b82810360208481019190915284518083528582019282019060005b81811015611efb57845183529383019391830191600101611edf565b5090979650505050505050565b600060208284031215611f1a57600080fd5b8135611336816118c8565b838152606060208201526000611f3e6060830185611bf3565b905060018060a01b0383166040830152949350505050565b8051611f61816115ff565b919050565b600082601f830112611f7757600080fd5b81516020611f8761140a836114ef565b82815260059290921b84018101918181019086841115611fa657600080fd5b8286015b84811015611591578051611fbd816115ff565b8352918301918301611faa565b8051611f61816118c8565b600082601f830112611fe657600080fd5b8151611ff461140a826113c4565b81815284602083860101111561200957600080fd5b611867826020830160208701611ba3565b60006020828403121561202c57600080fd5b81516001600160401b038082111561204357600080fd5b9083019060e0828603121561205757600080fd5b61205f61136c565b61206883611f56565b815261207660208401611f56565b602082015260408301518281111561208d57600080fd5b61209987828601611f66565b6040830152506120ab60608401611fca565b60608201526080830151828111156120c257600080fd5b6120ce87828601611fd5565b60808301525060a0830151828111156120e657600080fd5b6120f287828601611fd5565b60a08301525060c08301518281111561210a57600080fd5b61211687828601611fd5565b60c0830152509594505050505056fea26469706673582212209da4e1de8a0ca697a046be2ae942188b8b7992a0d2513c23100c47200d844cd964736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000004d3a380a03f3a18a5dc44b01119839d8674a552e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000eacf8b19e104803cfcd2557d893d6a407e4994f0
-----Decoded View---------------
Arg [0] : modules (address[]): 0xEAcf8B19E104803cfCD2557D893D6a407E4994F0
Arg [1] : router (address): 0x4d3a380A03f3a18A5dC44b01119839D8674a552E
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000004d3a380a03f3a18a5dc44b01119839d8674a552e
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 000000000000000000000000eacf8b19e104803cfcd2557d893d6a407e4994f0
Loading...
Loading
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.