diff --git a/services/wallet-service/internal/storage/mysql/coin_seller_ledger.go b/services/wallet-service/internal/storage/mysql/coin_seller_ledger.go index 1d880009..afb3b358 100644 --- a/services/wallet-service/internal/storage/mysql/coin_seller_ledger.go +++ b/services/wallet-service/internal/storage/mysql/coin_seller_ledger.go @@ -57,7 +57,7 @@ func (r *Repository) AdminCreditCoinSellerStock(ctx context.Context, command led if availableDelta < 0 && account.AvailableAmount < command.CoinAmount { return ledger.CoinSellerStockCreditReceipt{}, xerr.New(xerr.InsufficientBalance, "insufficient balance") } - balanceAfter, err := checkedAdd(account.AvailableAmount, availableDelta) + balanceAfter, err := checkedAddDelta(account.AvailableAmount, availableDelta) if err != nil { return ledger.CoinSellerStockCreditReceipt{}, err } diff --git a/services/wallet-service/internal/storage/mysql/utils.go b/services/wallet-service/internal/storage/mysql/utils.go index 9ea354e0..e69cf32b 100644 --- a/services/wallet-service/internal/storage/mysql/utils.go +++ b/services/wallet-service/internal/storage/mysql/utils.go @@ -49,6 +49,13 @@ func checkedAdd(left int64, right int64) (int64, error) { return left + right, nil } +func checkedAddDelta(left int64, right int64) (int64, error) { + if (right > 0 && left > math.MaxInt64-right) || (right < 0 && left < math.MinInt64-right) { + return 0, xerr.New(xerr.CoinSellerStockAmountInvalid, "coin amount overflow") + } + return left + right, nil +} + func stableHash(value string) string { sum := sha256.Sum256([]byte(value)) return hex.EncodeToString(sum[:])