Skip to content
Snippets Groups Projects
Commit 743ca97d authored by Hans Moog's avatar Hans Moog
Browse files

Feat: added balance checks to booking

parent 93d9ead9
Branches
No related tags found
No related merge requests found
......@@ -40,7 +40,9 @@ func Test(t *testing.T) {
addressHash4, NewColoredBalance(eth, 1000),
)
reality.BookTransfer(transfer)
if err := reality.BookTransfer(transfer); err != nil {
t.Error(err)
}
ledgerState.ForEachTransferOutput(func(object *objectstorage.CachedObject) bool {
object.Consume(func(object objectstorage.StorableObject) {
......
......@@ -2,6 +2,9 @@ package ledgerstate
import (
"encoding/binary"
"fmt"
"github.com/iotaledger/goshimmer/packages/errors"
"github.com/iotaledger/goshimmer/packages/stringify"
......@@ -28,13 +31,64 @@ func newReality(id RealityId, parentRealities ...RealityId) *Reality {
return result
}
func (reality *Reality) BookTransfer(transfer *Transfer) {
func (reality *Reality) checkTransferBalances(inputs []*objectstorage.CachedObject, outputs map[AddressHash][]*ColoredBalance) error {
totalColoredBalances := make(map[Color]uint64)
for _, cachedInput := range inputs {
if !cachedInput.Exists() {
return errors.New("missing input in transfer")
}
for _, balance := range cachedInput.Get().(*TransferOutput).GetBalances() {
totalColoredBalances[balance.GetColor()] += balance.GetValue()
}
}
for _, transferOutput := range outputs {
for _, balance := range transferOutput {
color := balance.GetColor()
totalColoredBalances[color] -= balance.GetValue()
if totalColoredBalances[color] == 0 {
delete(totalColoredBalances, color)
}
}
}
// transfer is valid if sum of funds is 0
if len(totalColoredBalances) != 0 {
return errors.New("the sum of the balance changes is not 0")
}
return nil
}
func (reality *Reality) BookTransfer(transfer *Transfer) error {
transferHash := transfer.GetHash()
transferOutputs := transfer.GetOutputs()
inputs := reality.getTransferInputs(transfer)
outputs := transfer.GetOutputs()
if err := reality.checkTransferBalances(inputs, outputs); err != nil {
return err
}
fmt.Println(inputs[0].Get())
// process outputs
reality.bookTransferOutputs(transferHash, transferOutputs)
reality.bookTransferOutputs(transferHash, outputs)
return nil
}
func (reality *Reality) getTransferInputs(transfer *Transfer) []*objectstorage.CachedObject {
inputs := transfer.GetInputs()
result := make([]*objectstorage.CachedObject, len(inputs))
for i, transferOutputReference := range inputs {
result[i] = reality.ledgerState.GetTransferOutput(transferOutputReference)
}
return result
}
func (reality *Reality) bookTransferOutputs(transferHash TransferHash, transferOutputs map[AddressHash][]*ColoredBalance) {
......
......@@ -18,6 +18,10 @@ func (transfer *Transfer) GetHash() TransferHash {
return transfer.hash
}
func (transfer *Transfer) GetInputs() []*TransferOutputReference {
return transfer.inputs
}
func (transfer *Transfer) AddInput(input *TransferOutputReference) *Transfer {
transfer.inputs = append(transfer.inputs, input)
......
......@@ -29,6 +29,10 @@ func NewTransferOutput(ledgerState *LedgerState, realityId RealityId, transferHa
}
}
func (transferOutput *TransferOutput) GetBalances() []*ColoredBalance {
return transferOutput.balances
}
func (transferOutput *TransferOutput) String() string {
return stringify.Struct("TransferOutput",
stringify.StructField("transferHash", transferOutput.transferHash.String()),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment