deployer.gno

package access

import (
	"gno.land/p/onbloc/access/manager"
	"gno.land/p/onbloc/ibc/union/types"
)

const (
	CoreRealmPath       = "gno.land/r/onbloc/ibc/union/core"
	DefaultAdminAddress = address("g1qgr7980ry7f6rqr9cs6d45y09k5u6dzhjksksn")
)

func init() {
	resetAccess(DefaultAdminAddress)
}

// resetAccess mirrors the deploy-time setup that Union performs through its
// deployer after instantiating AccessManager. Gno has no instantiate message, so
// this realm uses DefaultAdminAddress as its initial admin during init.
func resetAccess(initialAdmin address) {
	accessState = manager.NewState()

	// Mirrors initial admin bootstrap only:
	// OZ AccessManager constructor:
	// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.6.1/contracts/access/manager/AccessManager.sol#L133-L136
	// Union access-manager init:
	// https://github.com/unionlabs/union/blob/8cff0ff34f6baa4cdb1e4650a08985dd05de0c5a/cosmwasm/access-manager/src/lib.rs#L148-L154
	//
	// RELAYER membership is separate deployer policy in Union and is granted by
	// GrantRole, not by AccessManager initialization:
	// https://github.com/unionlabs/union/blob/8cff0ff34f6baa4cdb1e4650a08985dd05de0c5a/cosmwasm/deployer/src/main.rs#L1143-L1152
	accessState.GrantRole(manager.AdminRole, initialAdmin)
	access := accessState.Roles[manager.AdminRole].Members[initialAdmin]
	emitRoleGrantedEvent(manager.AdminRole, initialAdmin, access.Since, true)
	setupRoles()
}

// Union reference:
// https://github.com/unionlabs/union/blob/8cff0ff34f6baa4cdb1e4650a08985dd05de0c5a/cosmwasm/deployer/src/main.rs#L1779
func setupRoles() {
	accessState.SetTargetFunctionRoles(CoreRealmPath, types.RelayerSelectors(), RelayerRole)
	for _, selector := range types.RelayerSelectors() {
		emitTargetFunctionRoleUpdatedEvent(CoreRealmPath, selector, RelayerRole)
	}
	// Union deployer labels all production roles. We only bootstrap RELAYER for
	// now; PAUSER/UNPAUSER/RATE_LIMITER are added when their roles are adopted.
	// https://github.com/unionlabs/union/blob/8cff0ff34f6baa4cdb1e4650a08985dd05de0c5a/cosmwasm/deployer/src/main.rs#L1871-L1908
	manager.RequireUnlockedConfigRole(RelayerRole)
	emitRoleLabelEvent(RelayerRole, "RELAYER")
}