Function to integrate the new CalculateDistributionsPrecise into SplitTransaction
(ctx context.Context)
| 407 | adjustPercentageAmounts(state) |
| 408 | combineDistributions(state) |
| 409 | if state.fixedTotalDec.IsZero() && state.totalPercentage.IsZero() && leftCount == 0 { |
| 410 | return nil, errors.New("distributions must allocate a positive amount") |
| 411 | } |
| 412 | |
| 413 | if err := processLeftDistribution(distributions, state); err != nil { |
| 414 | span.RecordError(err) |
| 415 | return nil, err |
| 416 | } |
| 417 | |
| 418 | balanceDistributions(state) |
| 419 | |
| 420 | span.AddEvent("Precise distribution calculation completed") |
| 421 | return state.result, nil |
| 422 | } |
| 423 | |
| 424 | // handleZeroAmount returns independent zero allocations for each identifier. |
| 425 | func handleZeroAmount(distributions []Distribution) map[string]*big.Int { |
| 426 | result := make(map[string]*big.Int, len(distributions)) |
| 427 | for _, dist := range distributions { |
| 428 | result[dist.Identifier] = big.NewInt(0) |
| 429 | } |
| 430 | return result |
| 431 | } |
| 432 | |
| 433 | // Function to integrate the new CalculateDistributionsPrecise into SplitTransaction |
| 434 | func (transaction *Transaction) SplitTransactionPrecise(ctx context.Context) ([]*Transaction, error) { |
| 435 | ctx, span := tracer.Start(ctx, "SplitTransactionPrecise") |
| 436 | defer span.End() |
| 437 | |
| 438 | var ds []Distribution |
| 439 | if len(transaction.Sources) > 0 { |
| 440 | ds = transaction.Sources |
| 441 | } else if len(transaction.Destinations) > 0 { |
| 442 | ds = transaction.Destinations |
| 443 | } |
| 444 | |
| 445 | span.AddEvent("Starting precise distribution calculation", trace.WithAttributes( |
| 446 | attribute.String("transaction.id", transaction.TransactionID), |
| 447 | attribute.String("transaction.precise_amount", fmt.Sprint(transaction.PreciseAmount)), |
| 448 | attribute.Int("distribution.count", len(ds)), |
| 449 | )) |
| 450 | |
| 451 | // Use PreciseAmount for distribution calculation. |
| 452 | if err := ValidatePrecision(transaction.Precision); err != nil { |
| 453 | return nil, err |
| 454 | } |
| 455 | if transaction.Precision <= 0 || transaction.Precision >= math.Exp2(63) { |
| 456 | return nil, errors.New("split precision must be a positive int64 scale") |
| 457 | } |
| 458 | precisionInt := int64(transaction.Precision) |
| 459 | distributions, err := CalculateDistributionsPrecise(ctx, transaction.PreciseAmount, ds, precisionInt) |
| 460 | if err != nil { |
| 461 | span.RecordError(err) |
| 462 | return nil, err |
| 463 | } |
| 464 | |
| 465 | // Emit legs in caller order and attribute child IDs by identifier. |
| 466 | var transactions []*Transaction |