Contract 0xdC1Dfa22824Af4e423a558bbb6C53a31c3c11DCC 1

 

Contract Overview

Balance:
0 MATIC

MATIC Value:
$0.00

Token:
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x0b38f51ead9db17cda8431d18e800657d7efe3b30f8791c1b8848e783df3315aBridge436987042023-06-09 3:34:033 hrs 18 mins ago0x6973fb6c01d32fba636be2c8a25aa7ef6baa1731 IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.043182691627 180.335891736
0xf01fb968b8feb0a5011a26fbdfd1f60037728607c78714619f2e3911c2e38d2aIssue TCO2Tokens436446042023-06-07 17:54:261 day 12 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.022509453262146.205155058
0x89599fc93a7d1cd38aa4d6c56e43d227593045227d48ddd56e973c12a6645eb8Issue TCO2Tokens436441582023-06-07 17:37:331 day 13 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.023448419854152.304004041
0xa56722673e080671c230ca4a5338bf82f67d63c9ec12e623fe58803210a26654Issue TCO2Tokens436282152023-06-07 8:02:081 day 22 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.024042595867156.380709929
0xe3240af8c732ba033bc8ade1304079607cf21ee9f174d28fcac8c31d88dfec17Issue TCO2Tokens436282092023-06-07 8:01:561 day 22 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.023426525844152.385488021
0xc9aa3b22eae7c5ccb6cfdc3c7d0bebc9b290f1217a3bad83466be68c854d4036Issue TCO2Tokens436280222023-06-07 7:54:461 day 22 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.024045212786156.397731203
0x28a92440bfc807307ad5ade66dc20d66342e6572a37188c6aa041b6e44d232eeIssue TCO2Tokens436190682023-06-07 2:21:192 days 4 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.030113809727195.597563803
0x8e259cb4d847b5925bbe22ce2dcdd4fbef4c2591afc0366fb5b63fe5a6bdc788Issue TCO2Tokens436143052023-06-06 23:22:422 days 7 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.022912342855148.82203494
0x784ae4cc9c8f673420d70a76062ff81ff9c092494d2df6fd2324c52ffc53feb4Issue TCO2Tokens436061772023-06-06 18:28:232 days 12 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.024655200791160.129900574
0x13ab3d689a1b60d4ab97964df69c066712ac511421c37401bffdea666c381278Issue TCO2Tokens436061582023-06-06 18:27:412 days 12 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.024091105271156.466228951
0x39fab9c2491cdeb521fed50013213c1ac29476a1001e18a6e95e2aeaa97820cbIssue TCO2Tokens435957882023-06-06 12:10:012 days 18 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.024244019271157.471643378
0xab3693349478ee4a9a58fe6eb272b6826b88f588652d05324ed9c1b34cbfe662Issue TCO2Tokens435953592023-06-06 11:54:082 days 18 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.024087998804156.458247085
0x6e6744f46d188f134c78a4291a01ca9c40bcf2c2021861264010964473e8c572Issue TCO2Tokens435635772023-06-05 16:16:273 days 14 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.094133038022689.851803705
0x8b7823c7ee7065f4fd25e0622ab45feda1499f7c46c5ee8ce2b02afb1f13484aIssue TCO2Tokens435628112023-06-05 15:49:153 days 15 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.024388969104158.400786548
0xdd3268339912595e8e3afec2ee7a59172f2e14f8d247af857e4c22a952ad1bb1Bridge434894052023-06-03 17:56:185 days 12 hrs ago0x6973fb6c01d32fba636be2c8a25aa7ef6baa1731 IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.034671952266 147.763439522
0x466a3d8008fdca5b3622e9ad3c07cbfe0af2c996fdee94aee03ab2c50f6fbe2eBridge434698072023-06-03 5:25:266 days 1 hr ago0x6973fb6c01d32fba636be2c8a25aa7ef6baa1731 IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.034507868458 147.064154182
0x4b3e7e48f3e8790ca19625a1d4bfd6bd7df5a03da3457acb0d8708e2357e1be2Bridge434565712023-06-02 19:57:296 days 10 hrs ago0x8cb4e81949afb93c93292cb2f689ec789c716a33 IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.06698004669 280.203173057
0xa0d9331df01b9d98a69c49fdcc24704c7c9bcf400eb108acfe0a34bc13bfc8c3Bridge434473692023-06-02 13:14:396 days 17 hrs ago0x6973fb6c01d32fba636be2c8a25aa7ef6baa1731 IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.046126925925 196.5817551
0x58edcbe253aaf94dc1c1354797e483ec211564e08173c6b8d22d855288401332Issue TCO2Tokens433928572023-06-01 3:47:298 days 3 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.023647916436153.587818641
0x914873ee47b6353bdc48e221bdcf890e31a50697d058b54cd9cb3bbaad9fd38bIssue TCO2Tokens433928422023-06-01 3:46:578 days 3 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.025874488901168.048898494
0x6f319b657acfa29ebdfc0d7de65cdbaddbc24ec7709a8b61f8b5c60403e6643eIssue TCO2Tokens433922952023-06-01 3:26:318 days 3 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.023187461913150.609009685
0x2b90a890350ead32bca8319d8a11df432f996e35a6913c49ac9a6dadd41f294cIssue TCO2Tokens433502372023-05-31 2:06:329 days 4 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.023450198674152.315557976
0xd25872334b0855825604fac403e8e311f6685aefb692c932e81fc92e78337ab2Issue TCO2Tokens433501362023-05-31 2:02:589 days 4 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.024152313847157.276440407
0xe61dff76d85f362f049fb098a568b8f6ac041305e3655e4da8b1745bf7dcbf93Issue TCO2Tokens433498792023-05-31 1:53:449 days 4 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.02339477052151.955536707
0x63f7f1dfcaf0f6f73203eb3c136ed585aa6964711d1d64539aa1ef6c83643357Issue TCO2Tokens433434532023-05-30 22:00:149 days 8 hrs ago0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a IN  0xdc1dfa22824af4e423a558bbb6c53a31c3c11dcc0 MATIC0.022328011376145.02663958
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ToucanRegenBridge

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 10 : ToucanRegenBridge.sol
// SPDX-License-Identifier:  GPL-3.0-or-later
// Copyright (C) 2023 Toucan Labs

pragma solidity 0.8.14;

import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";

import "./interfaces/ITCO2.sol";
import "./interfaces/INCTPool.sol";

/**
 * @dev Implementation of the smart contract for Regen Ledger self custody bridge.
 *
 * See README file for more information about the functionality
 */
contract ToucanRegenBridge is Pausable, AccessControl {
    // ----------------------------------------
    //      Roles
    // ----------------------------------------

    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
    bytes32 public constant TOKEN_ISSUER_ROLE = keccak256("TOKEN_ISSUER_ROLE");

    modifier onlyPauser() {
        require(hasRole(PAUSER_ROLE, msg.sender), "caller does not have pauser role");
        _;
    }

    // ----------------------------------------
    //      State
    // ----------------------------------------

    /// @notice total amount of tokens burned and signalled for transfer
    uint256 public totalTransferred;

    /// @notice mapping TCO2s to burnt tokens; acts as a limiting
    /// mechanism during the minting process
    mapping(address => uint256) public tco2Limits;

    /// @notice address of the NCT pool to be able to check TCO2 eligibility
    INCTPool public immutable nctPool;

    /// @dev map of requests to ensure uniqueness
    mapping(string => bool) public origins;

    // ----------------------------------------
    //      Events
    // ----------------------------------------

    /// @notice emited when we bridge tokens from TCO2 to Regen Ledger
    event Bridge(address sender, string recipient, address tco2, uint256 amount);
    /// @notice emited when we bridge tokens back from Regen Ledger and issue on TCO2 contract
    event Issue(string sender, address recipient, address tco2, uint256 amount, string origin);

    // ----------------------------------------
    //      Modifiers
    // ----------------------------------------

    modifier isRegenAddress(bytes calldata account) {
        // verification: address length is 44 (standard) or 64 (derived)
        uint256 accountLen = account.length;
        require(accountLen == 44 || accountLen == 64, "regen address must be 44 or 64 chars");

        unchecked {
            // verification: check address starts with "regen1" prefix
            bytes memory prefix = "regen1";
            for (uint8 i = 0; i < 6; ++i)
                require(prefix[i] == account[i], "regen address must start with 'regen1'");

            // verification: check address contains only alphanumeric characters
            for (uint8 i = 6; i < accountLen; ++i) {
                bytes1 char = account[i];
                require(
                    (char >= 0x30 && char <= 0x39) || //9-0
                        (char >= 0x41 && char <= 0x5A) || //A-Z
                        (char >= 0x61 && char <= 0x7A), //a-z
                    "regen address must contain only alphanumeric characters"
                );
            }
        }
        _;
    }

    // ----------------------------------------
    //      Constructor
    // ----------------------------------------

    constructor(
        INCTPool nctPool_,
        bytes32[] memory roles,
        address[] memory accounts
    ) {
        require(address(nctPool_) != address(0), "should set nctPool to a non zero address");
        require(accounts.length == roles.length, "accounts and roles must have same length");
        nctPool = nctPool_;
        bool hasAdmin = false;
        for (uint256 i = 0; i < accounts.length; ++i) {
            _grantRole(roles[i], accounts[i]);
            if (roles[i] == DEFAULT_ADMIN_ROLE) hasAdmin = true;
        }
        require(hasAdmin, "should have at least one admin role");
    }

    // ----------------------------------------
    //      Functions
    // ----------------------------------------

    function pause() external onlyPauser {
        _pause();
    }

    function unpause() external onlyPauser {
        _unpause();
    }

    /**
     * @dev bridge tokens to Regen Network.
     * Burns Toucan TCO2 compatible tokens and signals a bridge event.
     * @param recipient Regen address to receive the TCO2
     * @param tco2 TCO2 address to burn
     * @param amount TCO2 amount to burn
     */
    function bridge(
        string calldata recipient,
        address tco2,
        uint256 amount
    ) external whenNotPaused isRegenAddress(bytes(recipient)) {
        require(amount > 0, "amount must be positive");
        require(nctPool.checkEligible(tco2), "TCO2 not eligible for NCT pool");

        //slither-disable-next-line divide-before-multiply
        uint256 precisionTest = (amount / 1e12) * 1e12;
        require(amount == precisionTest, "Only precision up to 6 decimals allowed");

        totalTransferred += amount;
        unchecked {
            // not possible to overflow if totalTransferred above
            // does not overflow
            tco2Limits[tco2] += amount;
        }

        emit Bridge(msg.sender, recipient, tco2, amount);
        ITCO2(tco2).bridgeBurn(msg.sender, amount);
    }

    /**
     * @notice issues TCO2 tokens back from Regen Network.
     * This functions must be called by a bridge account.
     * @param sender Regen address to send the TCO2
     * @param recipient Polygon address to receive the TCO2
     * @param tco2 TCO2 address to mint
     * @param amount TCO2 amount to mint
     * @param origin Random string provided to ensure uniqueness for this request
     */
    function issueTCO2Tokens(
        string calldata sender,
        address recipient,
        address tco2,
        uint256 amount,
        string calldata origin
    ) external whenNotPaused isRegenAddress(bytes(sender)) {
        require(
            hasRole(TOKEN_ISSUER_ROLE, msg.sender),
            "AccessControl: caller is missing TOKEN_ISSUER_ROLE"
        );
        require(amount > 0, "amount must be positive");
        require(!origins[origin], "duplicate origin");
        origins[origin] = true;

        // Limit how many tokens can be minted per TCO2; this is going to underflow
        // in case we try to mint more for a TCO2 than what has been burnt so it will
        // result in reverting the transaction.
        tco2Limits[tco2] -= amount;
        unchecked {
            // not possible to underflow if tco2Limits[tco2] above
            // does not underflow
            totalTransferred -= amount;
        }

        emit Issue(sender, recipient, tco2, amount, origin);
        ITCO2(tco2).bridgeMint(recipient, amount);
    }
}

File 2 of 10 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        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 3 of 10 : AccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;

import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

File 4 of 10 : ITCO2.sol
// SPDX-License-Identifier:  GPL-3.0-or-later
// Copyright (C) 2023 Toucan Labs

pragma solidity 0.8.14;

interface ITCO2 {
    function bridgeBurn(address account, uint256 amount) external;

    function bridgeMint(address account, uint256 amount) external;
}

File 5 of 10 : INCTPool.sol
// SPDX-License-Identifier:  GPL-3.0-or-later
// Copyright (C) 2023 Toucan Labs

pragma solidity 0.8.14;

interface INCTPool {
    function checkEligible(address erc20Addr) external view returns (bool);
}

File 6 of 10 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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;
    }
}

File 7 of 10 : IAccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

File 8 of 10 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 9 of 10 : 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 10 of 10 : 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);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract INCTPool","name":"nctPool_","type":"address"},{"internalType":"bytes32[]","name":"roles","type":"bytes32[]"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"recipient","type":"string"},{"indexed":false,"internalType":"address","name":"tco2","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Bridge","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"sender","type":"string"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"tco2","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"origin","type":"string"}],"name":"Issue","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_ISSUER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"recipient","type":"string"},{"internalType":"address","name":"tco2","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"sender","type":"string"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"tco2","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"origin","type":"string"}],"name":"issueTCO2Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nctPool","outputs":[{"internalType":"contract INCTPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"origins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tco2Limits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTransferred","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b5060405162001cc338038062001cc38339810160408190526200003491620003a8565b6000805460ff191690556001600160a01b038316620000ab5760405162461bcd60e51b815260206004820152602860248201527f73686f756c6420736574206e6374506f6f6c20746f2061206e6f6e207a65726f604482015267206164647265737360c01b60648201526084015b60405180910390fd5b81518151146200010f5760405162461bcd60e51b815260206004820152602860248201527f6163636f756e747320616e6420726f6c6573206d75737420686176652073616d6044820152670ca40d8cadccee8d60c31b6064820152608401620000a2565b6001600160a01b0383166080526000805b8251811015620001b3576200017484828151811062000143576200014362000485565b602002602001015184838151811062000160576200016062000485565b60200260200101516200021960201b60201c565b6000801b8482815181106200018d576200018d62000485565b602002602001015103620001a057600191505b620001ab816200049b565b905062000120565b50806200020f5760405162461bcd60e51b815260206004820152602360248201527f73686f756c642068617665206174206c65617374206f6e652061646d696e20726044820152626f6c6560e81b6064820152608401620000a2565b50505050620004c3565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff166200029e5760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45b5050565b6001600160a01b0381168114620002b857600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620002fc57620002fc620002bb565b604052919050565b60006001600160401b03821115620003205762000320620002bb565b5060051b60200190565b600082601f8301126200033c57600080fd5b81516020620003556200034f8362000304565b620002d1565b82815260059290921b840181019181810190868411156200037557600080fd5b8286015b848110156200039d5780516200038f81620002a2565b835291830191830162000379565b509695505050505050565b600080600060608486031215620003be57600080fd5b8351620003cb81620002a2565b602085810151919450906001600160401b0380821115620003eb57600080fd5b818701915087601f8301126200040057600080fd5b8151620004116200034f8262000304565b81815260059190911b8301840190848101908a8311156200043157600080fd5b938501935b82851015620004515784518252938501939085019062000436565b60408a015190975094505050808311156200046b57600080fd5b50506200047b868287016200032a565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600060018201620004bc57634e487b7160e01b600052601160045260246000fd5b5060010190565b6080516117dd620004e660003960008181610217015261069101526117dd6000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c80638456cb59116100a25780639b087b2d116100715780639b087b2d14610292578063a217fddf1461029b578063d547741f146102a3578063e63ab1e9146102b6578063ebaa198d146102dd57600080fd5b80638456cb591461020a578063906bb53f1461021257806391d148541461025157806398c61c5d1461026457600080fd5b80633e7d2df1116100e95780633e7d2df11461019d5780633f4ba83a146101c45780634635c0c0146101cc5780635c975abb146101ec5780636adb2a1a146101f757600080fd5b806301ffc9a71461011b578063248a9ca3146101435780632f2ff15d1461017557806336568abe1461018a575b600080fd5b61012e610129366004611177565b6102f0565b60405190151581526020015b60405180910390f35b6101676101513660046111a1565b6000908152600160208190526040909120015490565b60405190815260200161013a565b6101886101833660046111d6565b610327565b005b6101886101983660046111d6565b610352565b6101677fcac94cc97926b467b27e8ef2be28223f53520310d15d3903d606348ece1fa88681565b6101886103d5565b6101676101da366004611202565b60036020526000908152604090205481565b60005460ff1661012e565b610188610205366004611266565b610455565b6101886108a8565b6102397f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161013a565b61012e61025f3660046111d6565b610926565b61012e6102723660046112d8565b805160208183018101805160048252928201919093012091525460ff1681565b61016760025481565b610167600081565b6101886102b13660046111d6565b610951565b6101677f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6101886102eb366004611389565b610977565b60006001600160e01b03198216637965db0b60e01b148061032157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000828152600160208190526040909120015461034381610da6565b61034d8383610db3565b505050565b6001600160a01b03811633146103c75760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6103d18282610e1e565b5050565b6103ff7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610926565b61044b5760405162461bcd60e51b815260206004820181905260248201527f63616c6c657220646f6573206e6f7420686176652070617573657220726f6c6560448201526064016103be565b610453610e85565b565b60005460ff16156104785760405162461bcd60e51b81526004016103be90611427565b838380602c81148061048a5750806040145b6104a65760405162461bcd60e51b81526004016103be90611451565b604080518082019091526006815265726567656e3160d01b602082015260005b60068160ff1610156105445784848260ff168181106104e7576104e7611495565b9050013560f81c60f81b6001600160f81b031916828260ff168151811061051057610510611495565b01602001516001600160f81b0319161461053c5760405162461bcd60e51b81526004016103be906114ab565b6001016104c6565b5060065b828160ff16101561062657600085858360ff1681811061056a5761056a611495565b909101356001600160f81b031916915050600360fc1b811080159061059d5750603960f81b6001600160f81b0319821611155b806105cf5750604160f81b6001600160f81b03198216108015906105cf5750602d60f91b6001600160f81b0319821611155b806106015750606160f81b6001600160f81b03198216108015906106015750603d60f91b6001600160f81b0319821611155b61061d5760405162461bcd60e51b81526004016103be906114f1565b50600101610548565b5050600084116106725760405162461bcd60e51b8152602060048201526017602482015276616d6f756e74206d75737420626520706f73697469766560481b60448201526064016103be565b604051636e2fab0760e11b81526001600160a01b0386811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063dc5f560e90602401602060405180830381865afa1580156106d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fc919061154e565b6107485760405162461bcd60e51b815260206004820152601e60248201527f54434f32206e6f7420656c696769626c6520666f72204e435420706f6f6c000060448201526064016103be565b600061075964e8d4a5100086611586565b6107689064e8d4a510006115a8565b90508085146107c95760405162461bcd60e51b815260206004820152602760248201527f4f6e6c7920707265636973696f6e20757020746f203620646563696d616c7320604482015266185b1b1bddd95960ca1b60648201526084016103be565b84600260008282546107db91906115c7565b90915550506001600160a01b03861660009081526003602052604090819020805487019055517f0eb3eb789fc2804b74f29e01b28f308ef8dadfa839c6e3de2d80ec21fd4df98d906108369033908b908b908b908b90611608565b60405180910390a16040516374f4f54760e01b8152336004820152602481018690526001600160a01b038716906374f4f54790604401600060405180830381600087803b15801561088657600080fd5b505af115801561089a573d6000803e3d6000fd5b505050505050505050505050565b6108d27f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610926565b61091e5760405162461bcd60e51b815260206004820181905260248201527f63616c6c657220646f6573206e6f7420686176652070617573657220726f6c6560448201526064016103be565b610453610f18565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000828152600160208190526040909120015461096d81610da6565b61034d8383610e1e565b60005460ff161561099a5760405162461bcd60e51b81526004016103be90611427565b868680602c8114806109ac5750806040145b6109c85760405162461bcd60e51b81526004016103be90611451565b604080518082019091526006815265726567656e3160d01b602082015260005b60068160ff161015610a665784848260ff16818110610a0957610a09611495565b9050013560f81c60f81b6001600160f81b031916828260ff1681518110610a3257610a32611495565b01602001516001600160f81b03191614610a5e5760405162461bcd60e51b81526004016103be906114ab565b6001016109e8565b5060065b828160ff161015610b4857600085858360ff16818110610a8c57610a8c611495565b909101356001600160f81b031916915050600360fc1b8110801590610abf5750603960f81b6001600160f81b0319821611155b80610af15750604160f81b6001600160f81b0319821610801590610af15750602d60f91b6001600160f81b0319821611155b80610b235750606160f81b6001600160f81b0319821610801590610b235750603d60f91b6001600160f81b0319821611155b610b3f5760405162461bcd60e51b81526004016103be906114f1565b50600101610a6a565b5050610b747fcac94cc97926b467b27e8ef2be28223f53520310d15d3903d606348ece1fa88633610926565b610bdb5760405162461bcd60e51b815260206004820152603260248201527f416363657373436f6e74726f6c3a2063616c6c6572206973206d697373696e6760448201527120544f4b454e5f4953535545525f524f4c4560701b60648201526084016103be565b60008611610c255760405162461bcd60e51b8152602060048201526017602482015276616d6f756e74206d75737420626520706f73697469766560481b60448201526064016103be565b60048585604051610c3792919061163e565b9081526040519081900360200190205460ff1615610c8a5760405162461bcd60e51b815260206004820152601060248201526f323ab83634b1b0ba329037b934b3b4b760811b60448201526064016103be565b600160048686604051610c9e92919061163e565b9081526040805160209281900383019020805460ff1916931515939093179092556001600160a01b038916600090815260039091529081208054889290610ce690849061164e565b90915550506002805487900390556040517f72a9d7f31c46ed9c46ea010b0c497043458c8b51878a5290b72cb425aa4f8f4890610d30908c908c908c908c908c908c908c90611665565b60405180910390a16040516346154c9f60e11b81526001600160a01b03898116600483015260248201889052881690638c2a993e90604401600060405180830381600087803b158015610d8257600080fd5b505af1158015610d96573d6000803e3d6000fd5b5050505050505050505050505050565b610db08133610f70565b50565b610dbd8282610926565b6103d15760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b610e288282610926565b156103d15760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60005460ff16610ece5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016103be565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60005460ff1615610f3b5760405162461bcd60e51b81526004016103be90611427565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610efb3390565b610f7a8282610926565b6103d157610f92816001600160a01b03166014610fd4565b610f9d836020610fd4565b604051602001610fae9291906116e8565b60408051601f198184030181529082905262461bcd60e51b82526103be9160040161175d565b60606000610fe38360026115a8565b610fee9060026115c7565b67ffffffffffffffff811115611006576110066112c2565b6040519080825280601f01601f191660200182016040528015611030576020820181803683370190505b509050600360fc1b8160008151811061104b5761104b611495565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061107a5761107a611495565b60200101906001600160f81b031916908160001a905350600061109e8460026115a8565b6110a99060016115c7565b90505b6001811115611121576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106110dd576110dd611495565b1a60f81b8282815181106110f3576110f3611495565b60200101906001600160f81b031916908160001a90535060049490941c9361111a81611790565b90506110ac565b5083156111705760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016103be565b9392505050565b60006020828403121561118957600080fd5b81356001600160e01b03198116811461117057600080fd5b6000602082840312156111b357600080fd5b5035919050565b80356001600160a01b03811681146111d157600080fd5b919050565b600080604083850312156111e957600080fd5b823591506111f9602084016111ba565b90509250929050565b60006020828403121561121457600080fd5b611170826111ba565b60008083601f84011261122f57600080fd5b50813567ffffffffffffffff81111561124757600080fd5b60208301915083602082850101111561125f57600080fd5b9250929050565b6000806000806060858703121561127c57600080fd5b843567ffffffffffffffff81111561129357600080fd5b61129f8782880161121d565b90955093506112b29050602086016111ba565b9396929550929360400135925050565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156112ea57600080fd5b813567ffffffffffffffff8082111561130257600080fd5b818401915084601f83011261131657600080fd5b813581811115611328576113286112c2565b604051601f8201601f19908116603f01168101908382118183101715611350576113506112c2565b8160405282815287602084870101111561136957600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080600080600080600060a0888a0312156113a457600080fd5b873567ffffffffffffffff808211156113bc57600080fd5b6113c88b838c0161121d565b90995097508791506113dc60208b016111ba565b96506113ea60408b016111ba565b955060608a0135945060808a013591508082111561140757600080fd5b506114148a828b0161121d565b989b979a50959850939692959293505050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526024908201527f726567656e2061646472657373206d757374206265203434206f7220363420636040820152636861727360e01b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60208082526026908201527f726567656e2061646472657373206d75737420737461727420776974682027726040820152656567656e312760d01b606082015260800190565b60208082526037908201527f726567656e2061646472657373206d75737420636f6e7461696e206f6e6c792060408201527f616c7068616e756d657269632063686172616374657273000000000000000000606082015260800190565b60006020828403121561156057600080fd5b8151801515811461117057600080fd5b634e487b7160e01b600052601160045260246000fd5b6000826115a357634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156115c2576115c2611570565b500290565b600082198211156115da576115da611570565b500190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600060018060a01b0380881683526080602084015261162b6080840187896115df565b9416604083015250606001529392505050565b8183823760009101908152919050565b60008282101561166057611660611570565b500390565b60a08152600061167960a08301898b6115df565b6001600160a01b038881166020850152871660408401526060830186905282810360808401526116aa8185876115df565b9a9950505050505050505050565b60005b838110156116d35781810151838201526020016116bb565b838111156116e2576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516117208160178501602088016116b8565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516117518160288401602088016116b8565b01602801949350505050565b602081526000825180602084015261177c8160408501602087016116b8565b601f01601f19169190910160400192915050565b60008161179f5761179f611570565b50600019019056fea264697066735822122027fc73dd04824b20b1b86d2520ed2504facdcdb509ecbd925adb46656313e43464736f6c634300080e0033000000000000000000000000d838290e877e0188a4a44700463419ed96c16107000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000065d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862acac94cc97926b467b27e8ef2be28223f53520310d15d3903d606348ece1fa8860000000000000000000000000000000000000000000000000000000000000003000000000000000000000000cde1e9f9c7dcad2242bd85d158a00181aa89b36b000000000000000000000000d4b3e6b915c5f5ba93eebbae0939b130e15c65b900000000000000000000000087a13b0a5ce9e621f266b9c68b7014efcfddde0a

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d838290e877e0188a4a44700463419ed96c16107000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000065d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862acac94cc97926b467b27e8ef2be28223f53520310d15d3903d606348ece1fa8860000000000000000000000000000000000000000000000000000000000000003000000000000000000000000cde1e9f9c7dcad2242bd85d158a00181aa89b36b000000000000000000000000d4b3e6b915c5f5ba93eebbae0939b130e15c65b900000000000000000000000087a13b0a5ce9e621f266b9c68b7014efcfddde0a

-----Decoded View---------------
Arg [0] : nctPool_ (address): 0xd838290e877e0188a4a44700463419ed96c16107
Arg [1] : roles (bytes32[]): System.Byte[],System.Byte[],System.Byte[]
Arg [2] : accounts (address[]): 0xcde1e9f9c7dcad2242bd85d158a00181aa89b36b,0xd4b3e6b915c5f5ba93eebbae0939b130e15c65b9,0x87a13b0a5ce9e621f266b9c68b7014efcfddde0a

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 000000000000000000000000d838290e877e0188a4a44700463419ed96c16107
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a
Arg [6] : cac94cc97926b467b27e8ef2be28223f53520310d15d3903d606348ece1fa886
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 000000000000000000000000cde1e9f9c7dcad2242bd85d158a00181aa89b36b
Arg [9] : 000000000000000000000000d4b3e6b915c5f5ba93eebbae0939b130e15c65b9
Arg [10] : 00000000000000000000000087a13b0a5ce9e621f266b9c68b7014efcfddde0a


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.