Latest 25 from a total of 234,701 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Pause | 8045090 | 529 days ago | IN | 0 ETH | 0.00000161 | ||||
| Withdraw | 8045074 | 529 days ago | IN | 0 ETH | 0.00000181 | ||||
| Attest Rubyscore | 8021390 | 530 days ago | IN | 0.0005 ETH | 0.00001899 | ||||
| Attest Rubyscore | 7982502 | 531 days ago | IN | 0.0005 ETH | 0.00002024 | ||||
| Attest Rubyscore | 7972349 | 531 days ago | IN | 0.0005 ETH | 0.00002015 | ||||
| Attest Rubyscore | 7933284 | 532 days ago | IN | 0.0005 ETH | 0.000019 | ||||
| Attest Rubyscore | 7913960 | 532 days ago | IN | 0.0005 ETH | 0.00002024 | ||||
| Attest Rubyscore | 7880647 | 533 days ago | IN | 0.0005 ETH | 0.00002112 | ||||
| Attest Rubyscore | 7870930 | 533 days ago | IN | 0.0005 ETH | 0.00001957 | ||||
| Attest Rubyscore | 7863448 | 534 days ago | IN | 0.0005 ETH | 0.00002379 | ||||
| Attest Rubyscore | 7825263 | 534 days ago | IN | 0.0005 ETH | 0.00002611 | ||||
| Attest Rubyscore | 7820846 | 534 days ago | IN | 0.0005 ETH | 0.00002087 | ||||
| Attest Rubyscore | 7788447 | 535 days ago | IN | 0.0005 ETH | 0.00002015 | ||||
| Attest Rubyscore | 7780523 | 535 days ago | IN | 0.0005 ETH | 0.00002056 | ||||
| Attest Rubyscore | 7773865 | 536 days ago | IN | 0.0005 ETH | 0.00002024 | ||||
| Attest Rubyscore | 7762717 | 536 days ago | IN | 0.0005 ETH | 0.00002015 | ||||
| Attest Rubyscore | 7738048 | 536 days ago | IN | 0.0005 ETH | 0.0000471 | ||||
| Attest Rubyscore | 7650161 | 538 days ago | IN | 0.0005 ETH | 0.000019 | ||||
| Attest Rubyscore | 7644630 | 539 days ago | IN | 0.0005 ETH | 0.000019 | ||||
| Attest Rubyscore | 7643279 | 539 days ago | IN | 0.0005 ETH | 0.00002024 | ||||
| Attest Rubyscore | 7630874 | 539 days ago | IN | 0.0005 ETH | 0.00001899 | ||||
| Attest Rubyscore | 7614821 | 539 days ago | IN | 0.0005 ETH | 0.00001912 | ||||
| Attest Rubyscore | 7608171 | 539 days ago | IN | 0.0005 ETH | 0.00002769 | ||||
| Attest Rubyscore | 7606980 | 539 days ago | IN | 0.0005 ETH | 0.00002618 | ||||
| Attest Rubyscore | 7583755 | 540 days ago | IN | 0.0005 ETH | 0.000019 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 8045074 | 529 days ago | 0.012 ETH | ||||
| 8021390 | 530 days ago | 0 ETH | ||||
| 8021390 | 530 days ago | 0 ETH | ||||
| 7982502 | 531 days ago | 0 ETH | ||||
| 7982502 | 531 days ago | 0 ETH | ||||
| 7972349 | 531 days ago | 0 ETH | ||||
| 7972349 | 531 days ago | 0 ETH | ||||
| 7933284 | 532 days ago | 0 ETH | ||||
| 7933284 | 532 days ago | 0 ETH | ||||
| 7913960 | 532 days ago | 0 ETH | ||||
| 7913960 | 532 days ago | 0 ETH | ||||
| 7880647 | 533 days ago | 0 ETH | ||||
| 7880647 | 533 days ago | 0 ETH | ||||
| 7870930 | 533 days ago | 0 ETH | ||||
| 7870930 | 533 days ago | 0 ETH | ||||
| 7863448 | 534 days ago | 0 ETH | ||||
| 7863448 | 534 days ago | 0 ETH | ||||
| 7825263 | 534 days ago | 0 ETH | ||||
| 7825263 | 534 days ago | 0 ETH | ||||
| 7820846 | 534 days ago | 0 ETH | ||||
| 7820846 | 534 days ago | 0 ETH | ||||
| 7788447 | 535 days ago | 0 ETH | ||||
| 7788447 | 535 days ago | 0 ETH | ||||
| 7780523 | 535 days ago | 0 ETH | ||||
| 7780523 | 535 days ago | 0 ETH |
Cross-Chain Transactions
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
Loading...
Loading
Net Worth in USD
$151.32
Net Worth in ETH
Token Allocations
ETH
99.06%
BNB
0.94%
Multichain Portfolio | 35 Chains
Loading...
Loading
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.