Using a map REQUIRES that all TLM functions are commutative. While it is probably a great requirement or goal, it doesn’t mean that we need to make a design choice which makes it a hard constraint, thereby introducing a chain halt pathway.

type TLMMintBurn struct {
	TLMName string
	Destination string
}

type TLMTransfer struct {
	TLMName string
	Source: string
	Destination: string	
}

type TLMProcessingResult { // Supersedes PendingClaimResult
	Claims: []*sharedtypes.Claim
	Mints: []TLMMintBurn
	Burns: []TLMMintBurn
	Transfers: []TLMTransfer
}

func (tlmPR) GetNumComputeUnits() int64
func (tlmPR) GetNumRelays() int64
func (tlmPR) GetNumClaims() int64
func (tlmPR) GetApplicationAddrs() []string
func (tlmPR) GetSupplierAddrs() []string
func (tlmPR) GetSessionEndHeight() int64
func (tlmPR) GetServices() []string // use for determinstic loops
func (tlmPR) RelaysPerServiceMap() map[string]uint64

func (tlmPR) Append(TLMProcessingResult) TLMProcessingResult
var tokenLogicModuleProcessors = []TokenLogicModule{...}

type TokenLogicModule struct {
	Name string
	Process func(
		context.Context,
		*sharedtypes.Service,
		*sessiontypes.SessionHeader,
		*apptypes.Application,
		*sharedtypes.Supplier,
		cosmostypes.Coin, // This is the "actualSettlementCoin" rather than just the "claimCoin" because of how settlement functions; see ensureClaimAmountLimits for details.
		*servicetypes.RelayMiningDifficulty,
	) (TLMProcessingResult, error)
}