ownership.gno

package rbac

import (
	ufmt "gno.land/p/nt/ufmt/v0"

	prbac "gno.land/p/gnoswap/rbac"
	"gno.land/r/gnoswap/access"
)

// IsOwner returns true if addr is the current owner.
func IsOwner(addr address) bool {
	return manager.Owner() == addr
}

// IsPendingOwner returns true if addr is the pending owner.
func IsPendingOwner(addr address) bool {
	return manager.PendingOwner() == addr
}

// GetOwner returns the current owner address.
func GetOwner() address {
	return manager.Owner()
}

// GetPendingOwner returns the pending owner address.
func GetPendingOwner() address {
	return manager.PendingOwner()
}

// AcceptOwnership completes the ownership transfer process.
// Only callable by pending owner.
func AcceptOwnership(cur realm) {
	caller := cur.Previous().Address()
	assertIsPendingOwner(caller)

	err := manager.AcceptOwnershipBy(caller)
	if err != nil {
		panic(err)
	}

	newOwner := manager.Owner()
	err = manager.UpdateRoleAddress(prbac.ROLE_ADMIN.String(), newOwner)
	if err != nil {
		panic(makeErrorWithDetails(
			err.Error(),
			ufmt.Sprintf(
				"role name: %s, address: %s",
				prbac.ROLE_ADMIN.String(), newOwner.String()),
		))
	}
	access.SetRoleAddress(cross(cur), prbac.ROLE_ADMIN.String(), newOwner)
}

// TransferOwnership initiates the ownership transfer process.
//
// Parameters:
//   - addr: address to transfer ownership to
//
// Only callable by current owner.
func TransferOwnership(cur realm, addr address) {
	caller := cur.Previous().Address()
	assertIsOwner(caller)
	assertIsValidAddress(addr)

	err := manager.TransferOwnershipBy(addr, caller)
	if err != nil {
		panic(err)
	}
}