Skip to content
This repository has been archived by the owner on Jan 24, 2025. It is now read-only.

Commit

Permalink
Fix unit tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
piotrm50 committed Mar 28, 2024
1 parent 7aa74c6 commit d095c0b
Show file tree
Hide file tree
Showing 7 changed files with 93 additions and 40 deletions.
6 changes: 3 additions & 3 deletions pkg/protocol/engine/mempool/spenddag/spenddagv1/spender.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,13 +113,13 @@ func NewSpender[SpenderID, ResourceID spenddag.IDType, VoteRank spenddag.VoteRan
c.preferredInstead = c

c.unhookAcceptanceMonitoring = c.Weight.OnUpdate.Hook(func(value weight.Value) {
if value.AcceptanceState().IsPending() && value.ValidatorsWeight() >= c.acceptanceThreshold() && value.AttestorsWeight() >= c.acceptanceThreshold() {
if threshold := c.acceptanceThreshold(); value.AcceptanceState().IsPending() && value.ValidatorsWeight() >= threshold && value.AttestorsWeight() >= threshold {
c.setAcceptanceState(acceptance.Accepted)
}
}).Unhook

// in case the initial weight is enough to accept the spend, accept it immediately
if threshold := c.acceptanceThreshold(); initialWeight.Value().ValidatorsWeight() >= threshold {
if threshold := c.acceptanceThreshold(); initialWeight.AcceptanceState().IsPending() && initialWeight.Value().ValidatorsWeight() >= threshold && initialWeight.Value().AttestorsWeight() >= threshold {
c.setAcceptanceState(acceptance.Accepted)
}

Expand Down Expand Up @@ -220,7 +220,7 @@ func (c *Spender[SpenderID, ResourceID, VoteRank]) ApplyVote(vote *vote.Vote[Vot
c.LatestVotes.Set(vote.Voter, vote)

// track attestors when we reach the acceptance threshold
if c.Weight.Value().ValidatorsWeight() > c.acceptanceThreshold() {
if c.Weight.Value().ValidatorsWeight() >= c.acceptanceThreshold() {
if vote.IsLiked() {
c.Weight.AddAttestor(vote.Voter)
} else {
Expand Down
20 changes: 19 additions & 1 deletion pkg/protocol/engine/mempool/spenddag/tests/tests.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,9 @@ func CreateSpendWithoutMembers(t *testing.T, tf *Framework) {
require.NoError(t, tf.CastVotes("nodeID1", 1, "spender1"))
require.NoError(t, tf.CastVotes("nodeID2", 1, "spender1"))
require.NoError(t, tf.CastVotes("nodeID3", 1, "spender1"))

require.NoError(t, tf.CastVotes("nodeID1", 2, "spender1"))
require.NoError(t, tf.CastVotes("nodeID2", 2, "spender1"))
require.NoError(t, tf.CastVotes("nodeID3", 2, "spender1"))
tf.Assert.LikedInstead([]string{"spender1"})
tf.Assert.Accepted("spender1")
}
Expand Down Expand Up @@ -188,6 +190,9 @@ func SpendAcceptance(t *testing.T, tf *Framework) {
require.NoError(t, tf.CastVotes("nodeID2", 1, "spender4"))
require.NoError(t, tf.CastVotes("nodeID3", 1, "spender4"))

require.NoError(t, tf.CastVotes("nodeID1", 2, "spender4"))
require.NoError(t, tf.CastVotes("nodeID2", 2, "spender4"))
require.NoError(t, tf.CastVotes("nodeID3", 2, "spender4"))
tf.Assert.LikedInstead([]string{"spender1"})
tf.Assert.LikedInstead([]string{"spender2"}, "spender1")
tf.Assert.LikedInstead([]string{"spender3"}, "spender4")
Expand Down Expand Up @@ -224,6 +229,10 @@ func CastVotes(t *testing.T, tf *Framework) {
require.NoError(t, tf.CastVotes("nodeID1", 1, "spender2"))
require.NoError(t, tf.CastVotes("nodeID2", 1, "spender2"))
require.NoError(t, tf.CastVotes("nodeID3", 1, "spender2"))
require.NoError(t, tf.CastVotes("nodeID4", 2, "spender2"))
require.NoError(t, tf.CastVotes("nodeID2", 2, "spender2"))
require.NoError(t, tf.CastVotes("nodeID3", 2, "spender2"))

tf.Assert.LikedInstead([]string{"spender1"}, "spender2")

tf.Assert.Accepted("spender2")
Expand Down Expand Up @@ -317,6 +326,9 @@ func CastVotesAcceptance(t *testing.T, tf *Framework) {
require.NoError(t, tf.CastVotes("nodeID1", 1, "spender3"))
require.NoError(t, tf.CastVotes("nodeID2", 1, "spender3"))
require.NoError(t, tf.CastVotes("nodeID3", 1, "spender3"))
require.NoError(t, tf.CastVotes("nodeID4", 2, "spender3"))
require.NoError(t, tf.CastVotes("nodeID2", 2, "spender3"))
require.NoError(t, tf.CastVotes("nodeID3", 2, "spender3"))
tf.Assert.LikedInstead([]string{"spender1"})
tf.Assert.Accepted("spender1")
tf.Assert.Rejected("spender2")
Expand Down Expand Up @@ -410,6 +422,9 @@ func EvictAcceptedSpender(t *testing.T, tf *Framework) {
require.NoError(t, tf.CastVotes("nodeID1", 1, "spender2"))
require.NoError(t, tf.CastVotes("nodeID2", 1, "spender2"))
require.NoError(t, tf.CastVotes("nodeID3", 1, "spender2"))
require.NoError(t, tf.CastVotes("nodeID1", 2, "spender2"))
require.NoError(t, tf.CastVotes("nodeID2", 2, "spender2"))
require.NoError(t, tf.CastVotes("nodeID3", 2, "spender2"))
tf.Assert.LikedInstead([]string{"spender1"}, "spender2")

tf.Assert.Accepted("spender2")
Expand Down Expand Up @@ -478,6 +493,9 @@ func EvictRejectedSpender(t *testing.T, tf *Framework) {
require.NoError(t, tf.CastVotes("nodeID1", 1, "spender2"))
require.NoError(t, tf.CastVotes("nodeID2", 1, "spender2"))
require.NoError(t, tf.CastVotes("nodeID3", 1, "spender2"))
require.NoError(t, tf.CastVotes("nodeID1", 2, "spender2"))
require.NoError(t, tf.CastVotes("nodeID2", 2, "spender2"))
require.NoError(t, tf.CastVotes("nodeID3", 2, "spender2"))
tf.Assert.LikedInstead([]string{"spender1"}, "spender2")

tf.Assert.Rejected("spender1")
Expand Down
8 changes: 7 additions & 1 deletion pkg/protocol/engine/mempool/v1/mempool.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package mempoolv1

import (
"context"
"fmt"

"github.com/iotaledger/hive.go/core/memstorage"
"github.com/iotaledger/hive.go/ds"
Expand Down Expand Up @@ -121,7 +122,7 @@ func (m *MemPool[VoteRank]) AttachSignedTransaction(signedTransaction mempool.Si

if isNewTransaction {
m.transactionAttached.Trigger(storedSignedTransaction.transactionMetadata)

fmt.Println("solidify inputs of", storedSignedTransaction.transactionMetadata.ID())
m.solidifyInputs(storedSignedTransaction.transactionMetadata)
}
}
Expand Down Expand Up @@ -376,6 +377,7 @@ func (m *MemPool[VoteRank]) storeTransaction(signedTransaction mempool.SignedTra

func (m *MemPool[VoteRank]) solidifyInputs(transaction *TransactionMetadata) {
for index, inputReference := range transaction.inputReferences {
fmt.Println("solidify", inputReference.ReferencedStateID(), "<-", transaction.ID())
request, created := m.cachedStateRequests.GetOrCreate(inputReference.ReferencedStateID(), func() *promise.Promise[*StateMetadata] {
return m.requestState(inputReference, true)
})
Expand All @@ -388,7 +390,10 @@ func (m *MemPool[VoteRank]) solidifyInputs(transaction *TransactionMetadata) {
}

if transaction.markInputSolid() {
fmt.Println("inputs solid of", transaction.ID())
transaction.executionContext.OnUpdate(func(_ context.Context, executionContext context.Context) {
fmt.Println("executing", transaction.ID())

m.executeTransaction(executionContext, transaction)
})
}
Expand All @@ -406,6 +411,7 @@ func (m *MemPool[VoteRank]) executeTransaction(executionContext context.Context,
transaction.setInvalid(err)
} else {
transaction.setExecuted(outputStates)
fmt.Println("booking", transaction.ID())

m.bookTransaction(transaction)
}
Expand Down
52 changes: 36 additions & 16 deletions pkg/tests/booker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,8 @@ func Test_DoubleSpend(t *testing.T) {
{
ts.IssueValidationBlockWithHeaderOptions("block6", node2, mock.WithStrongParents(ts.BlockIDs("block3", "block4")...), mock.WithShallowLikeParents(ts.BlockID("block2")))
ts.IssueValidationBlockWithHeaderOptions("block7", node1, mock.WithStrongParents(ts.BlockIDs("block6")...))
ts.IssueValidationBlockWithHeaderOptions("block8", node2, mock.WithStrongParents(ts.BlockIDs("block7")...))
ts.IssueValidationBlockWithHeaderOptions("block9", node1, mock.WithStrongParents(ts.BlockIDs("block8")...))

ts.AssertBlocksInCacheConflicts(map[*blocks.Block][]string{
ts.Block("block6"): {"tx2"},
Expand All @@ -223,7 +225,7 @@ func Test_MultipleAttachments(t *testing.T) {

blocksConflicts := make(map[*blocks.Block][]string)

// Create a transaction and issue it from both nodes, so that the conflict is accepted, but no attachment is included yet.
// Create a transaction and issue it from both nodes, so that the spend is accepted, but no attachment is included yet.
{
tx1 := wallet.CreateBasicOutputsEquallyFromInput("tx1", 2, "Genesis:0")

Expand All @@ -234,17 +236,23 @@ func Test_MultipleAttachments(t *testing.T) {
ts.IssueValidationBlockWithHeaderOptions("B.1.1", nodeB, mock.WithStrongParents(ts.BlockID("B.1")))

nodeA.Wait()
ts.IssueValidationBlockWithHeaderOptions("A.2", nodeA, mock.WithStrongParents(ts.BlockID("B.1.1")))
ts.IssueValidationBlockWithHeaderOptions("B.2", nodeB, mock.WithStrongParents(ts.BlockID("A.1.1")))
ts.IssueValidationBlockWithHeaderOptions("A.2.1", nodeA, mock.WithStrongParents(ts.BlockID("B.1.1")))
ts.IssueValidationBlockWithHeaderOptions("B.2.1", nodeB, mock.WithStrongParents(ts.BlockID("A.1.1")))

// Cast more votes to accept the transaction.
ts.IssueValidationBlockWithHeaderOptions("A.2.2", nodeA, mock.WithStrongParents(ts.BlockID("A.1")))
ts.IssueValidationBlockWithHeaderOptions("B.2.2", nodeB, mock.WithStrongParents(ts.BlockID("B.1")))
ts.IssueValidationBlockWithHeaderOptions("A.3.2", nodeA, mock.WithStrongParents(ts.BlockID("B.2.2")))
ts.IssueValidationBlockWithHeaderOptions("B.3.2", nodeB, mock.WithStrongParents(ts.BlockID("A.2.2")))

ts.AssertBlocksInCachePreAccepted(ts.Blocks("A.1", "B.1"), true, ts.Nodes()...)
ts.AssertBlocksInCacheAccepted(ts.Blocks("A.1", "B.1"), false, ts.Nodes()...)

ts.AssertBlocksInCacheConflicts(lo.MergeMaps(blocksConflicts, map[*blocks.Block][]string{
ts.Block("A.1"): {"tx1"},
ts.Block("B.1"): {"tx1"},
ts.Block("A.2"): {"tx1"},
ts.Block("B.2"): {"tx1"},
ts.Block("A.1"): {"tx1"},
ts.Block("B.1"): {"tx1"},
ts.Block("A.2.1"): {"tx1"},
ts.Block("B.2.1"): {"tx1"},
}), ts.Nodes()...)
ts.AssertTransactionInCacheConflicts(map[*iotago.Transaction][]string{
wallet.Transaction("tx1"): {"tx1"},
Expand All @@ -262,13 +270,19 @@ func Test_MultipleAttachments(t *testing.T) {
ts.IssueValidationBlockWithHeaderOptions("B.3", nodeB, mock.WithStrongParents(ts.BlockID("A.3.1")))
ts.IssueValidationBlockWithHeaderOptions("A.4", nodeA, mock.WithStrongParents(ts.BlockID("B.3")))

// Issue attestor votes.
ts.IssueValidationBlockWithHeaderOptions("B.4", nodeB, mock.WithStrongParents(ts.BlockID("A.3")))
ts.IssueValidationBlockWithHeaderOptions("A.5", nodeA, mock.WithStrongParents(ts.BlockID("B.4")))

ts.AssertBlocksInCachePreAccepted(ts.Blocks("A.3"), true, ts.Nodes()...)

ts.IssueValidationBlockWithHeaderOptions("B.4", nodeB, mock.WithStrongParents(ts.BlockIDs("B.3", "A.4")...))
ts.IssueValidationBlockWithHeaderOptions("A.5", nodeA, mock.WithStrongParents(ts.BlockIDs("B.3", "A.4")...))
ts.IssueValidationBlockWithHeaderOptions("B.5", nodeB, mock.WithStrongParents(ts.BlockIDs("B.3", "A.4")...))
ts.IssueValidationBlockWithHeaderOptions("A.6", nodeA, mock.WithStrongParents(ts.BlockIDs("B.3", "A.4")...))
ts.IssueValidationBlockWithHeaderOptions("B.6", nodeB, mock.WithStrongParents(ts.BlockIDs("B.3", "A.4")...))
ts.IssueValidationBlockWithHeaderOptions("A.7", nodeA, mock.WithStrongParents(ts.BlockIDs("B.3", "A.4")...))

ts.AssertBlocksInCachePreAccepted(ts.Blocks("B.3", "A.4"), true, ts.Nodes()...)
ts.AssertBlocksInCachePreAccepted(ts.Blocks("B.4", "A.5"), false, ts.Nodes()...)
ts.AssertBlocksInCachePreAccepted(ts.Blocks("B.3", "A.4", "B.4"), true, ts.Nodes()...)
ts.AssertBlocksInCachePreAccepted(ts.Blocks("A.5", "B.5", "A.6", "B.6", "A.7"), false, ts.Nodes()...)
ts.AssertBlocksInCacheAccepted(ts.Blocks("A.3"), true, ts.Nodes()...)

ts.AssertTransactionsInCacheBooked(wallet.Transactions("tx1", "tx2"), true, ts.Nodes()...)
Expand All @@ -278,8 +292,12 @@ func Test_MultipleAttachments(t *testing.T) {
ts.Block("A.3"): {"tx2"},
ts.Block("B.3"): {"tx2"},
ts.Block("A.4"): {"tx2"},
ts.Block("A.5"): {},
ts.Block("B.4"): {},
ts.Block("A.5"): {"tx2"},
ts.Block("A.6"): {},
ts.Block("B.4"): {"tx2"},
ts.Block("B.5"): {"tx2"},
ts.Block("A.7"): {},
ts.Block("B.6"): {},
}), ts.Nodes()...)
ts.AssertTransactionInCacheConflicts(map[*iotago.Transaction][]string{
wallet.Transaction("tx1"): {"tx1"},
Expand All @@ -290,13 +308,13 @@ func Test_MultipleAttachments(t *testing.T) {

// Issue a block that includes tx1, and make sure that tx2 is accepted as well as a consequence.
{
ts.IssueValidationBlockWithHeaderOptions("A.6", nodeA, mock.WithStrongParents(ts.BlockIDs("A.2", "B.2")...))
ts.IssueValidationBlockWithHeaderOptions("B.5", nodeB, mock.WithStrongParents(ts.BlockIDs("A.2", "B.2")...))
ts.IssueValidationBlockWithHeaderOptions("A.6", nodeA, mock.WithStrongParents(ts.BlockIDs("A.2.1", "B.2.1")...))
ts.IssueValidationBlockWithHeaderOptions("B.5", nodeB, mock.WithStrongParents(ts.BlockIDs("A.2.1", "B.2.1")...))

ts.IssueValidationBlockWithHeaderOptions("A.7", nodeA, mock.WithStrongParents(ts.BlockIDs("A.6", "B.5")...))
ts.IssueValidationBlockWithHeaderOptions("B.6", nodeB, mock.WithStrongParents(ts.BlockIDs("A.6", "B.5")...))

ts.AssertBlocksInCachePreAccepted(ts.Blocks("A.2", "B.2", "A.6", "B.5"), true, ts.Nodes()...)
ts.AssertBlocksInCachePreAccepted(ts.Blocks("A.2.1", "B.2.1", "A.6", "B.5"), true, ts.Nodes()...)
ts.AssertBlocksInCacheAccepted(ts.Blocks("A.1", "B.1"), true, ts.Nodes()...)

ts.AssertBlocksInCachePreAccepted(ts.Blocks("A.7", "B.6"), false, ts.Nodes()...)
Expand Down Expand Up @@ -396,6 +414,8 @@ func Test_SpendRejectedCommittedRace(t *testing.T) {
{
ts.IssueValidationBlockWithHeaderOptions("block2.3", node2, mock.WithSlotCommitment(genesisCommitment), mock.WithStrongParents(ts.BlockIDs("block2.2")...))
ts.IssueValidationBlockWithHeaderOptions("block2.4", node1, mock.WithSlotCommitment(genesisCommitment), mock.WithStrongParents(ts.BlockIDs("block2.3")...))
ts.IssueValidationBlockWithHeaderOptions("block2.5", node2, mock.WithSlotCommitment(genesisCommitment), mock.WithStrongParents(ts.BlockIDs("block2.4")...))
ts.IssueValidationBlockWithHeaderOptions("block2.6", node1, mock.WithSlotCommitment(genesisCommitment), mock.WithStrongParents(ts.BlockIDs("block2.5")...))

ts.AssertBlocksInCacheConflicts(map[*blocks.Block][]string{
ts.Block("block2.3"): {"tx2"},
Expand Down
32 changes: 20 additions & 12 deletions pkg/tests/combined_account_transition_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ func Test_AccountStateTransition(t *testing.T) {
ts.IssueValidationBlockWithHeaderOptions("vblock0", node2, mock.WithStrongParents(ts.BlockID("block0")))
ts.IssueValidationBlockWithHeaderOptions("vblock1", node1, mock.WithStrongParents(ts.BlockID("vblock0")))
ts.IssueValidationBlockWithHeaderOptions("vblock2", node2, mock.WithStrongParents(ts.BlockID("vblock1")))
ts.IssueValidationBlockWithHeaderOptions("vblock3", node1, mock.WithStrongParents(ts.BlockID("vblock2")))
ts.IssueValidationBlockWithHeaderOptions("vblock4", node2, mock.WithStrongParents(ts.BlockID("vblock3")))

ts.AssertTransactionsInCacheAccepted(wallet.Transactions("TX1"), true, node1, node2)
}
Expand Down Expand Up @@ -200,16 +202,18 @@ func sendFunds(ts *testsuite.TestSuite) {

// send funds from defaultWallet to secondWallet
tx := wallet.SendFundsToWallet("TX5", secondWallet, "TX1:2")
ts.IssueBasicBlockWithOptions("block4", wallet, tx)
ts.IssueBasicBlockWithOptions("block5", wallet, tx)

ts.AssertTransactionsExist(wallet.Transactions("TX5"), true, node1)
ts.AssertTransactionsInCacheBooked(wallet.Transactions("TX5"), true, node1)

// Issue some more blocks to make transaction accepted
{
ts.IssueValidationBlockWithHeaderOptions("vblock9", node2, mock.WithStrongParents(ts.BlockID("block4")))
ts.IssueValidationBlockWithHeaderOptions("vblock10", node1, mock.WithStrongParents(ts.BlockID("vblock9")))
ts.IssueValidationBlockWithHeaderOptions("vblock11", node2, mock.WithStrongParents(ts.BlockID("vblock10")))
ts.IssueValidationBlockWithHeaderOptions("vblock12", node2, mock.WithStrongParents(ts.BlockID("block5")))
ts.IssueValidationBlockWithHeaderOptions("vblock13", node1, mock.WithStrongParents(ts.BlockID("vblock12")))
ts.IssueValidationBlockWithHeaderOptions("vblock14", node2, mock.WithStrongParents(ts.BlockID("vblock13")))
ts.IssueValidationBlockWithHeaderOptions("vblock15", node1, mock.WithStrongParents(ts.BlockID("vblock14")))
ts.IssueValidationBlockWithHeaderOptions("vblock16", node2, mock.WithStrongParents(ts.BlockID("vblock15")))

ts.AssertTransactionsInCacheAccepted(wallet.Transactions("TX5"), true, node1, node2)
}
Expand All @@ -226,13 +230,15 @@ func allotManaTo(ts *testsuite.TestSuite, to iotago.AccountID) {
Mana: iotago.Mana(1000),
}}, "TX1:3")
commitment := node1.Protocol.Engines.Main.Get().Storage.Settings().LatestCommitment().Commitment()
ts.IssueBasicBlockWithOptions("block5", wallet, tx6, mock.WithSlotCommitment(commitment))
ts.IssueBasicBlockWithOptions("block6", wallet, tx6, mock.WithSlotCommitment(commitment))

// Issue some more blocks to make transaction accepted
{
ts.IssueValidationBlockWithHeaderOptions("vblock6", node2, mock.WithStrongParents(ts.BlockID("block5")))
ts.IssueValidationBlockWithHeaderOptions("vblock7", node1, mock.WithStrongParents(ts.BlockID("vblock6")))
ts.IssueValidationBlockWithHeaderOptions("vblock8", node2, mock.WithStrongParents(ts.BlockID("vblock7")))
ts.IssueValidationBlockWithHeaderOptions("vblock7", node2, mock.WithStrongParents(ts.BlockID("block6")))
ts.IssueValidationBlockWithHeaderOptions("vblock8", node1, mock.WithStrongParents(ts.BlockID("vblock7")))
ts.IssueValidationBlockWithHeaderOptions("vblock9", node2, mock.WithStrongParents(ts.BlockID("vblock8")))
ts.IssueValidationBlockWithHeaderOptions("vblock10", node1, mock.WithStrongParents(ts.BlockID("vblock9")))
ts.IssueValidationBlockWithHeaderOptions("vblock11", node2, mock.WithStrongParents(ts.BlockID("vblock10")))

ts.AssertTransactionsInCacheAccepted(wallet.Transactions("TX6"), true, node1, node2)
}
Expand All @@ -245,16 +251,18 @@ func createNativetoken(ts *testsuite.TestSuite) {
node2 := ts.Node("node2")

tx := wallet.CreateNativeTokenFromInput("TX7", "TX5:0", "TX4:0", 5_000_000, 10_000_000_000)
ts.IssueBasicBlockWithOptions("block6", wallet, tx)
ts.IssueBasicBlockWithOptions("block17", wallet, tx)

ts.AssertTransactionsExist(wallet.Transactions("TX7"), true, node1)
ts.AssertTransactionsInCacheBooked(wallet.Transactions("TX7"), true, node1)

// Issue some more blocks to make transaction accepted
{
ts.IssueValidationBlockWithHeaderOptions("vblock12", node2, mock.WithStrongParents(ts.BlockID("block6")))
ts.IssueValidationBlockWithHeaderOptions("vblock13", node1, mock.WithStrongParents(ts.BlockID("vblock12")))
ts.IssueValidationBlockWithHeaderOptions("vblock14", node2, mock.WithStrongParents(ts.BlockID("vblock13")))
ts.IssueValidationBlockWithHeaderOptions("vblock18", node2, mock.WithStrongParents(ts.BlockID("block17")))
ts.IssueValidationBlockWithHeaderOptions("vblock19", node1, mock.WithStrongParents(ts.BlockID("vblock18")))
ts.IssueValidationBlockWithHeaderOptions("vblock20", node2, mock.WithStrongParents(ts.BlockID("vblock19")))
ts.IssueValidationBlockWithHeaderOptions("vblock21", node1, mock.WithStrongParents(ts.BlockID("vblock20")))
ts.IssueValidationBlockWithHeaderOptions("vblock22", node2, mock.WithStrongParents(ts.BlockID("vblock21")))

ts.AssertTransactionsInCacheAccepted(wallet.Transactions("TX7"), true, node1, node2)
}
Expand Down
Loading

0 comments on commit d095c0b

Please sign in to comment.