ETH Price: $1,809.17 (+10.92%)
Gas: 0.1 GWei

Contract

0xB9cC0Bb020cF55197C4C3d826AC87CAdba51f272
Transaction Hash
Method
Block
From
To
Pause80450902024-08-12 20:28:12253 days ago1723494492IN
RubyScore : Verax Portal
0 ETH0.000001610.0582
Withdraw80450742024-08-12 20:27:40253 days ago1723494460IN
RubyScore : Verax Portal
0 ETH0.000001810.0582
Attest Rubyscore80213902024-08-12 7:18:07254 days ago1723447087IN
RubyScore : Verax Portal
0.0005 ETH0.000018990.0582
Attest Rubyscore79825022024-08-11 9:40:04255 days ago1723369204IN
RubyScore : Verax Portal
0.0005 ETH0.000020240.062
Attest Rubyscore79723492024-08-11 4:01:36255 days ago1723348896IN
RubyScore : Verax Portal
0.0005 ETH0.000020150.0582
Attest Rubyscore79332842024-08-10 6:15:57256 days ago1723270557IN
RubyScore : Verax Portal
0.0005 ETH0.0000190.0582
Attest Rubyscore79139602024-08-09 19:31:03256 days ago1723231863IN
RubyScore : Verax Portal
0.0005 ETH0.000020240.062
Attest Rubyscore78806472024-08-09 1:00:09257 days ago1723165209IN
RubyScore : Verax Portal
0.0005 ETH0.000021120.061
Attest Rubyscore78709302024-08-08 19:35:39257 days ago1723145739IN
RubyScore : Verax Portal
0.0005 ETH0.000019570.0599726
Attest Rubyscore78634482024-08-08 15:25:42257 days ago1723130742IN
RubyScore : Verax Portal
0.0005 ETH0.000023790.07289242
Attest Rubyscore78252632024-08-07 18:10:47258 days ago1723054247IN
RubyScore : Verax Portal
0.0005 ETH0.000026110.08
Attest Rubyscore78208462024-08-07 15:43:16258 days ago1723045396IN
RubyScore : Verax Portal
0.0005 ETH0.000020870.063931
Attest Rubyscore77884472024-08-06 21:41:53259 days ago1722980513IN
RubyScore : Verax Portal
0.0005 ETH0.000020150.0582
Attest Rubyscore77805232024-08-06 17:17:39259 days ago1722964659IN
RubyScore : Verax Portal
0.0005 ETH0.000020560.063
Attest Rubyscore77738652024-08-06 13:35:42259 days ago1722951342IN
RubyScore : Verax Portal
0.0005 ETH0.000020240.062
Attest Rubyscore77627172024-08-06 7:24:02260 days ago1722929042IN
RubyScore : Verax Portal
0.0005 ETH0.000020150.0582
Attest Rubyscore77380482024-08-05 17:41:18260 days ago1722879678IN
RubyScore : Verax Portal
0.0005 ETH0.00004710.136
Attest Rubyscore76501612024-08-03 16:49:23262 days ago1722703763IN
RubyScore : Verax Portal
0.0005 ETH0.0000190.0582
Attest Rubyscore76446302024-08-03 13:45:01262 days ago1722692701IN
RubyScore : Verax Portal
0.0005 ETH0.0000190.0582
Attest Rubyscore76432792024-08-03 12:59:59262 days ago1722689999IN
RubyScore : Verax Portal
0.0005 ETH0.000020240.062
Attest Rubyscore76308742024-08-03 6:06:27263 days ago1722665187IN
RubyScore : Verax Portal
0.0005 ETH0.000018990.0582
Attest Rubyscore76148212024-08-02 21:11:18263 days ago1722633078IN
RubyScore : Verax Portal
0.0005 ETH0.000019120.05857757
Attest Rubyscore76081712024-08-02 17:29:38263 days ago1722619778IN
RubyScore : Verax Portal
0.0005 ETH0.000027690.07994657
Attest Rubyscore76069802024-08-02 16:49:56263 days ago1722617396IN
RubyScore : Verax Portal
0.0005 ETH0.000026180.08021624
Attest Rubyscore75837552024-08-02 3:55:42264 days ago1722570942IN
RubyScore : Verax Portal
0.0005 ETH0.0000190.0582
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
80450742024-08-12 20:27:40253 days ago1723494460
RubyScore : Verax Portal
0.012 ETH
80213902024-08-12 7:18:07254 days ago1723447087
RubyScore : Verax Portal
0 ETH
80213902024-08-12 7:18:07254 days ago1723447087
RubyScore : Verax Portal
0 ETH
79825022024-08-11 9:40:04255 days ago1723369204
RubyScore : Verax Portal
0 ETH
79825022024-08-11 9:40:04255 days ago1723369204
RubyScore : Verax Portal
0 ETH
79723492024-08-11 4:01:36255 days ago1723348896
RubyScore : Verax Portal
0 ETH
79723492024-08-11 4:01:36255 days ago1723348896
RubyScore : Verax Portal
0 ETH
79332842024-08-10 6:15:57256 days ago1723270557
RubyScore : Verax Portal
0 ETH
79332842024-08-10 6:15:57256 days ago1723270557
RubyScore : Verax Portal
0 ETH
79139602024-08-09 19:31:03256 days ago1723231863
RubyScore : Verax Portal
0 ETH
79139602024-08-09 19:31:03256 days ago1723231863
RubyScore : Verax Portal
0 ETH
78806472024-08-09 1:00:09257 days ago1723165209
RubyScore : Verax Portal
0 ETH
78806472024-08-09 1:00:09257 days ago1723165209
RubyScore : Verax Portal
0 ETH
78709302024-08-08 19:35:39257 days ago1723145739
RubyScore : Verax Portal
0 ETH
78709302024-08-08 19:35:39257 days ago1723145739
RubyScore : Verax Portal
0 ETH
78634482024-08-08 15:25:42257 days ago1723130742
RubyScore : Verax Portal
0 ETH
78634482024-08-08 15:25:42257 days ago1723130742
RubyScore : Verax Portal
0 ETH
78252632024-08-07 18:10:47258 days ago1723054247
RubyScore : Verax Portal
0 ETH
78252632024-08-07 18:10:47258 days ago1723054247
RubyScore : Verax Portal
0 ETH
78208462024-08-07 15:43:16258 days ago1723045396
RubyScore : Verax Portal
0 ETH
78208462024-08-07 15:43:16258 days ago1723045396
RubyScore : Verax Portal
0 ETH
77884472024-08-06 21:41:53259 days ago1722980513
RubyScore : Verax Portal
0 ETH
77884472024-08-06 21:41:53259 days ago1722980513
RubyScore : Verax Portal
0 ETH
77805232024-08-06 17:17:39259 days ago1722964659
RubyScore : Verax Portal
0 ETH
77805232024-08-06 17:17:39259 days ago1722964659
RubyScore : Verax Portal
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RubyScoreVeraxPortal

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 15 : RubyScoreVeraxPortal.sol
// 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);
    }
}

File 2 of 15 : Ownable.sol
// 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);
    }
}

File 3 of 15 : Pausable.sol
// 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());
    }
}

File 4 of 15 : IERC1155.sol
// 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;
}

File 5 of 15 : Context.sol
// 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;
    }
}

File 6 of 15 : ERC165.sol
// 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;
    }
}

File 7 of 15 : IERC165.sol
// 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);
}

File 8 of 15 : AbstractPortal.sol
// 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();
    }
}

File 9 of 15 : IAttestationRegistry.sol
// 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);
}

File 10 of 15 : IModuleRegistry.sol
// 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);
}

File 11 of 15 : IPortal.sol
// 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);
}

File 12 of 15 : IPortalRegistry.sol
// 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);
}

File 13 of 15 : IRouter.sol
// 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);
}

File 14 of 15 : IRubyscore_Certificates.sol
// 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);
}

File 15 of 15 : Structs.sol
// 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.
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

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"}]

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


Block Transaction Gas Used Reward
view all blocks sequenced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.