Robinhood MainnetChain ID: 4663
Contract detail

InitDiamond

InitDiamond is a verified Robinhood Chain smart contract at 0x3342e86d…78e84aff with 0 indexed transactions.

Address type
Smart contract
Transactions
0
History coverage
No indexed activity found
Verification
Verified
Compiler
v0.8.24+commit.e11b9ed9
Verification match
partial
Creation transaction
0x55670ad0…e8088dc3
Created at block
#28615326
Language
solidity
EVM version
cancun
License
none
Compiler optimization
Enabled · 200 runs
Verified contract

Contract source code

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import {
    AppStorage,
    DEFAULT_ADMIN_ROLE,
    ADMIN_ROLE,
    GUARD_ROLE,
    PAUSER_ROLE,
    OPERATOR_ROLE
} from "../libs/LibAppStorage.sol";
import {LibAccessControl} from "../libs/LibAccessControl.sol";

// ═══════════════════════════════════════════════════════════════════════════════
// ERRORS
// ═══════════════════════════════════════════════════════════════════════════════

error AlreadyInitialized();
error ZeroAdmin();
error ZeroEscrow();

// ═══════════════════════════════════════════════════════════════════════════════
// EIP-712 CONSTANTS
// ═══════════════════════════════════════════════════════════════════════════════

/// @dev EIP-712 domain typehash
bytes32 constant EIP712_DOMAIN_TYPEHASH =
    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");

/// @dev Bridge name for EIP-712 domain
bytes32 constant DOMAIN_NAME = keccak256("GalaChainBridge");

/// @dev Bridge version for EIP-712 domain
bytes32 constant DOMAIN_VERSION = keccak256("1");

// ═══════════════════════════════════════════════════════════════════════════════
// INIT CONTRACT
// ═══════════════════════════════════════════════════════════════════════════════

/// @title InitDiamond
/// @notice Initialization contract for the bridge diamond
/// @dev Called once during initial deployment via diamondCut
contract InitDiamond {
    /// @dev AppStorage at slot 0 - MUST be the only state variable
    AppStorage internal s;

    /// @dev Storage slot for initialization flag (separate from AppStorage to avoid layout issues)
    bytes32 private constant INITIALIZED_SLOT = keccak256("InitDiamond.initialized");

    /// @notice Initialize the bridge diamond
    /// @param admin The initial admin address (receives all roles)
    /// @param escrow The escrow address for vetoed messages
    function init(address admin, address escrow) external {
        // Check not already initialized
        bool initialized;
        bytes32 slot = INITIALIZED_SLOT;
        assembly {
            initialized := sload(slot)
        }
        if (initialized) revert AlreadyInitialized();

        // Validate inputs
        if (admin == address(0)) revert ZeroAdmin();
        if (escrow == address(0)) revert ZeroEscrow();

        // Mark as initialized
        assembly {
            sstore(slot, 1)
        }

        // Setup role hierarchy:
        // DEFAULT_ADMIN_ROLE is admin of ADMIN_ROLE (default, adminRole = 0x00)
        // ADMIN_ROLE manages all other roles
        LibAccessControl._setRoleAdmin(GUARD_ROLE, ADMIN_ROLE);
        LibAccessControl._setRoleAdmin(PAUSER_ROLE, ADMIN_ROLE);
        LibAccessControl._setRoleAdmin(OPERATOR_ROLE, ADMIN_ROLE);

        // Grant all roles to initial admin
        LibAccessControl._grantRole(DEFAULT_ADMIN_ROLE, admin);
        LibAccessControl._grantRole(ADMIN_ROLE, admin);
        LibAccessControl._grantRole(GUARD_ROLE, admin);
        LibAccessControl._grantRole(PAUSER_ROLE, admin);
        LibAccessControl._grantRole(OPERATOR_ROLE, admin);

        // Set escrow address for vetoed messages
        s.escrowAddress = escrow;

        // Compute and store EIP-712 domain separator
        s.domainSeparator =
            keccak256(abi.encode(EIP712_DOMAIN_TYPEHASH, DOMAIN_NAME, DOMAIN_VERSION, block.chainid, address(this)));
        s.domainChainId = block.chainid;
    }
}