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;
}
}