// Package giftlimits defines the owner-enforced ceiling for one gift command. // Runtime rate limits may be stricter, but no transport or service is allowed to raise these values // independently because gift_count fan-out reaches wallet, lucky draw, Room Cell and outbox storage. package giftlimits import "strings" const ( MaxCommandIDBytes = 128 MaxGiftCount = int64(999) MaxTotalGiftUnits = int64(5_000) ) // ValidCommandID bounds the financial idempotency key before it reaches Redis/MySQL key material. func ValidCommandID(commandID string) bool { commandID = strings.TrimSpace(commandID) return commandID != "" && len(commandID) <= MaxCommandIDBytes } // WorkUnits calculates gift_count*unique_target_count without overflow and applies the cross-service // hard ceiling. Callers must pass a deduplicated target count; wallet additionally rejects duplicates. func WorkUnits(giftCount int64, uniqueTargetCount int) (int64, bool) { if giftCount <= 0 || giftCount > MaxGiftCount || uniqueTargetCount <= 0 { return 0, false } targetCount := int64(uniqueTargetCount) if targetCount > MaxTotalGiftUnits/giftCount { return 0, false } units := giftCount * targetCount return units, units <= MaxTotalGiftUnits }