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
408// Function to integrate the new CalculateDistributionsPrecise into SplitTransaction
409func (transaction *Transaction) SplitTransactionPrecise(ctx context.Context) ([]*Transaction, error) {
410 ctx, span := tracer.Start(ctx, "SplitTransactionPrecise")
411 defer span.End()
412
413 var ds []Distribution
414 if len(transaction.Sources) > 0 {
415 ds = transaction.Sources
416 } else if len(transaction.Destinations) > 0 {
417 ds = transaction.Destinations
418 }
419
420 span.AddEvent("Starting precise distribution calculation", trace.WithAttributes(
421 attribute.String("transaction.id", transaction.TransactionID),
422 attribute.String("transaction.precise_amount", transaction.PreciseAmount.String()),
423 attribute.Int("distribution.count", len(ds)),
424 ))
425
426 // Use PreciseAmount for distribution calculation
427 precisionInt := int64(transaction.Precision)
428 distributions, err := CalculateDistributionsPrecise(ctx, transaction.PreciseAmount, ds, precisionInt)
429 if err != nil {
430 span.RecordError(err)
431 return nil, err
432 }
433
434 var transactions []*Transaction
435 counter := 1
436 for direction, preciseAmount := range distributions {
437 newTransaction := *transaction // Create a copy of the original transaction
438 newTransaction.TransactionID = GenerateUUIDWithSuffix("txn") // Set the transaction ID
439 newTransaction.PreciseAmount = preciseAmount // Set the precise amount based on the distribution
440
441 // Convert PreciseAmount to Amount for backward compatibility
442 convertPreciseToDecimal(&newTransaction)
443
444 newTransaction.Hash = newTransaction.HashTxn() // Set the transaction hash
445 newTransaction.Sources = nil // Clear the Sources slice
446 newTransaction.Destinations = nil // Clear the Destinations slice
447 newTransaction.ParentTransaction = transaction.TransactionID // Set the parent transaction ID
448
449 if len(transaction.Sources) > 0 {
450 newTransaction.Source = direction // Set the source
451 transaction.Sources[counter-1].TransactionID = newTransaction.TransactionID
452 } else if len(transaction.Destinations) > 0 {
453 newTransaction.Destination = direction // Set the destination
454 transaction.Destinations[counter-1].TransactionID = newTransaction.TransactionID
455 }
456
457 newTransaction.Reference = fmt.Sprintf("%s-%d", transaction.Reference, counter)
458 counter++
459 transactions = append(transactions, &newTransaction)
460
461 span.AddEvent("Created new transaction", trace.WithAttributes(
462 attribute.String("transaction.id", newTransaction.TransactionID),
463 attribute.String("transaction.precise_amount", newTransaction.PreciseAmount.String()),
464 attribute.String("transaction.source", newTransaction.Source),
465 attribute.String("transaction.destination", newTransaction.Destination),
466 ))

Callers 2

Calls 5

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

Tested by 1