MCPcopy Create free account
hub / github.com/devaccuracy/ledgerforge / SplitTransactionPrecise

Method SplitTransactionPrecise

model/transaction.go:409–473  ·  view source on GitHub ↗

Function to integrate the new CalculateDistributionsPrecise into SplitTransaction

(ctx context.Context)

Source from the content-addressed store, hash-verified

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.
425func 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
434func (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

Callers 2

Calls 5

GenerateUUIDWithSuffixFunction · 0.85
convertPreciseToDecimalFunction · 0.85
HashTxnMethod · 0.80
StartMethod · 0.45

Tested by 1