Files
smom-dbis-138/script/m00-diamond/DeployM00DiamondHub138.s.sol
defiQUG c336809676
Some checks failed
CI/CD Pipeline / Solidity Contracts (push) Failing after 1m3s
CI/CD Pipeline / Security Scanning (push) Successful in 2m18s
CI/CD Pipeline / Lint and Format (push) Failing after 34s
CI/CD Pipeline / Terraform Validation (push) Failing after 20s
CI/CD Pipeline / Kubernetes Validation (push) Successful in 22s
Deploy ChainID 138 / Deploy ChainID 138 (push) Failing after 40s
HYBX OMNL TypeScript & anchor / token-aggregation build + reconcile artifact (push) Failing after 49s
OMNL reconcile anchor / Run omnl:reconcile and upload artifacts (push) Failing after 21s
Validation / validate-genesis (push) Successful in 25s
Validation / validate-terraform (push) Failing after 21s
Validation / validate-kubernetes (push) Failing after 8s
Validation / validate-smart-contracts (push) Failing after 8s
Validation / validate-security (push) Failing after 1m11s
Validation / validate-documentation (push) Failing after 14s
Verify Deployment / Verify Deployment (push) Failing after 45s
Add mainnet checkpoint stack: ISO attestation, participant Etherscan surface, and services.
Ship AddressActivityRegistry V1/V2, ISO20022IntakeGateway, Chain138ParticipantSurface,
checkpoint hub contracts, checkpoint-core package, aggregator/indexer/sdk services,
relay profile guards, M00 diamond bridge facet, and OMNL compliance contracts.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-25 00:30:45 -07:00

152 lines
6.8 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "forge-std/Script.sol";
import {GrcDiamond} from "@gru/GrcDiamond.sol";
import {IDiamondCut} from "@gru/interfaces/IDiamondCut.sol";
import {PauseFacet} from "@gru/facets/PauseFacet.sol";
import {AccessFacet} from "@gru/facets/AccessFacet.sol";
import {M00MainnetBridgeFacet} from "../../contracts/m00-diamond/facets/M00MainnetBridgeFacet.sol";
import {M00DiamondInit} from "../../contracts/m00-diamond/M00DiamondInit.sol";
import {RWAInstrumentFacet} from "../../contracts/rwa/diamond/facets/RWAInstrumentFacet.sol";
import {RWADocumentFacet} from "../../contracts/rwa/diamond/facets/RWADocumentFacet.sol";
import {RWAStandardsRegistryFacet} from "../../contracts/rwa/diamond/facets/RWAStandardsRegistryFacet.sol";
import {IM00MainnetBridgeFacet} from "../../contracts/m00-diamond/interfaces/IM00MainnetBridgeFacet.sol";
import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol";
/**
* @title DeployM00DiamondHub138
* @notice Deploy GRC-2535 M00 Diamond hub on Chain 138 with RWA + mainnet mirror/tether/checkpoint bridge facet.
* @dev Paris profile mandatory. Wire env from project .env (load-project-env before forge).
*
* Env: PRIVATE_KEY, GOVERNANCE_CONTROLLER or OWNER
* CHAIN138_BATCH_EMITTER, TRANSACTION_MIRROR_ADDRESS (138 local), CHAIN138_MAINNET_CHECKPOINT_PROXY (mainnet)
* TRANSACTION_MIRROR_MAINNET, MAINNET_TETHER_ADDRESS
* RWA_TOKEN_FACTORY, RWA_TOKEN_REGISTRY
*/
contract DeployM00DiamondHub138 is Script {
function run() external {
uint256 pk = vm.envUint("PRIVATE_KEY");
address deployer = vm.addr(pk);
address governance = vm.envOr("GOVERNANCE_CONTROLLER", vm.envOr("OWNER", deployer));
vm.startBroadcast(pk);
// Diamond owner must be broadcaster for initial diamondCut (ErrUpgradeRole otherwise).
GrcDiamond diamond = new GrcDiamond(deployer, "M00.1.0");
PauseFacet pause = new PauseFacet();
AccessFacet access = new AccessFacet();
M00MainnetBridgeFacet bridge = new M00MainnetBridgeFacet(governance);
RWAInstrumentFacet rwaInst = new RWAInstrumentFacet(governance);
RWADocumentFacet rwaDoc = new RWADocumentFacet(governance);
RWAStandardsRegistryFacet rwaStd = new RWAStandardsRegistryFacet(governance);
M00DiamondInit init = new M00DiamondInit();
IDiamondCut.FacetCut[] memory cut = _buildCuts(
address(pause), address(access), address(bridge), address(rwaInst), address(rwaDoc), address(rwaStd)
);
IM00MainnetBridgeFacet.BridgeConfig memory cfg = IM00MainnetBridgeFacet.BridgeConfig({
chain138BatchEmitter: vm.envOr("CHAIN138_BATCH_EMITTER", address(0)),
chain138Mirror: vm.envOr("TRANSACTION_MIRROR_ADDRESS", address(0)),
mainnetCheckpoint: vm.envOr("CHAIN138_MAINNET_CHECKPOINT_PROXY", address(0)),
mainnetMirror: vm.envOr("TRANSACTION_MIRROR_MAINNET", address(0)),
mainnetTether: vm.envOr("MAINNET_TETHER_ADDRESS", address(0)),
rwaTokenFactory: vm.envOr("RWA_TOKEN_FACTORY", address(0)),
rwaTokenRegistry: vm.envOr("RWA_TOKEN_REGISTRY", address(0))
});
diamond.diamondCut(cut, address(init), abi.encodeCall(M00DiamondInit.init, (cfg, governance)));
console.log("M00Diamond", address(diamond));
console.log("M00MainnetBridgeFacet", address(bridge));
console.log("RWAInstrumentFacet", address(rwaInst));
vm.stopBroadcast();
}
function _buildCuts(
address pause,
address access,
address bridge,
address rwaInst,
address rwaDoc,
address rwaStd
) internal pure returns (IDiamondCut.FacetCut[] memory cut) {
cut = new IDiamondCut.FacetCut[](6);
cut[0] = _add(pause, _pauseSelectors());
cut[1] = _add(access, _accessSelectors());
cut[2] = _add(bridge, _bridgeSelectors());
cut[3] = _add(rwaInst, _rwaInstSelectors());
cut[4] = _add(rwaDoc, _rwaDocSelectors());
cut[5] = _add(rwaStd, _rwaStdSelectors());
}
function _add(address facet, bytes4[] memory sels)
internal
pure
returns (IDiamondCut.FacetCut memory)
{
return IDiamondCut.FacetCut({
facetAddress: facet,
action: IDiamondCut.FacetCutAction.Add,
functionSelectors: sels
});
}
function _pauseSelectors() internal pure returns (bytes4[] memory s) {
s = new bytes4[](4);
s[0] = PauseFacet.setGlobalPause.selector;
s[1] = PauseFacet.setFunctionPause.selector;
s[2] = PauseFacet.isPaused.selector;
s[3] = PauseFacet.isGlobalPaused.selector;
}
function _accessSelectors() internal pure returns (bytes4[] memory s) {
s = new bytes4[](6);
s[0] = AccessFacet.grantRoles.selector;
s[1] = AccessFacet.revokeRoles.selector;
s[2] = AccessFacet.ROLE_UPGRADE_BIT.selector;
s[3] = AccessFacet.ROLE_GOVERNANCE_BIT.selector;
s[4] = AccessFacet.ROLE_INDEX_BIT.selector;
s[5] = AccessFacet.ROLE_MONETARY_BIT.selector;
}
function _bridgeSelectors() internal pure returns (bytes4[] memory s) {
s = new bytes4[](11);
s[0] = M00MainnetBridgeFacet.wireMainnetBridge.selector;
s[1] = M00MainnetBridgeFacet.getMainnetBridgeConfig.selector;
s[2] = M00MainnetBridgeFacet.commitBatchOn138.selector;
s[3] = M00MainnetBridgeFacet.sendBatchToMainnet.selector;
s[4] = M00MainnetBridgeFacet.scheduleMirrorToMainnet.selector;
s[5] = M00MainnetBridgeFacet.mirrorOnMainnet.selector;
s[6] = M00MainnetBridgeFacet.anchorStateProofOnMainnet.selector;
s[7] = M00MainnetBridgeFacet.ackInboundCheckpoint.selector;
s[8] = IAccessControl.grantRole.selector;
s[9] = IAccessControl.revokeRole.selector;
s[10] = IAccessControl.hasRole.selector;
}
function _rwaInstSelectors() internal pure returns (bytes4[] memory s) {
s = new bytes4[](5);
s[0] = RWAInstrumentFacet.setIssuanceMode.selector;
s[1] = RWAInstrumentFacet.setInstrumentIdentity.selector;
s[2] = RWAInstrumentFacet.setTokenPointer.selector;
s[3] = RWAInstrumentFacet.getIssuanceMode.selector;
s[4] = RWAInstrumentFacet.getTokenPointer.selector;
}
function _rwaDocSelectors() internal pure returns (bytes4[] memory s) {
s = new bytes4[](2);
s[0] = RWADocumentFacet.anchorDocument.selector;
s[1] = RWADocumentFacet.setPrimaryContentHash.selector;
}
function _rwaStdSelectors() internal pure returns (bytes4[] memory s) {
s = new bytes4[](3);
s[0] = RWAStandardsRegistryFacet.enableStandard.selector;
s[1] = RWAStandardsRegistryFacet.disableStandard.selector;
s[2] = RWAStandardsRegistryFacet.bindAssetStandardFacet.selector;
}
}