Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add BIC to throughput and add 1 to quantum #394

Merged
merged 6 commits into from
Oct 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ require (
github.com/iotaledger/hive.go/stringify v0.0.0-20230929122509-67f34bfed40d
github.com/iotaledger/inx-app v1.0.0-rc.3.0.20231001095511-32be422a567e
github.com/iotaledger/inx/go v1.0.0-rc.2.0.20231001095356-923e8f138951
github.com/iotaledger/iota.go/v4 v4.0.0-20231003122130-2871888a9297
github.com/iotaledger/iota.go/v4 v4.0.0-20231003154311-26aa2f0fd388
github.com/labstack/echo/v4 v4.11.1
github.com/labstack/gommon v0.4.0
github.com/libp2p/go-libp2p v0.30.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -305,8 +305,8 @@ github.com/iotaledger/inx-app v1.0.0-rc.3.0.20231001095511-32be422a567e h1:Mwoe7
github.com/iotaledger/inx-app v1.0.0-rc.3.0.20231001095511-32be422a567e/go.mod h1:jhzexR5X8m6qcmrwt5OX477O/ZwT7Ak9sPT83ByPkAo=
github.com/iotaledger/inx/go v1.0.0-rc.2.0.20231001095356-923e8f138951 h1:qUf1W0fE1IyZzVy3Exv0Kj+SKECXG3S26c9m2ETb07U=
github.com/iotaledger/inx/go v1.0.0-rc.2.0.20231001095356-923e8f138951/go.mod h1:c5778OnWpLq108YE+Eb2m8Ri/t/4ydV0TvI/Sy5YivQ=
github.com/iotaledger/iota.go/v4 v4.0.0-20231003122130-2871888a9297 h1:kbpsa/gF0x6Cxu5lN9TL8u5EdaGv1P3/OKKPW0w83Og=
github.com/iotaledger/iota.go/v4 v4.0.0-20231003122130-2871888a9297/go.mod h1:+e3bsJFDr9HxmUMe+eQOLNut5wfcB/ivhJdouOJgOnE=
github.com/iotaledger/iota.go/v4 v4.0.0-20231003154311-26aa2f0fd388 h1:IGqHrJRmrzfalf1py+FGWzkWoaA5o6avBSYWznVG08s=
github.com/iotaledger/iota.go/v4 v4.0.0-20231003154311-26aa2f0fd388/go.mod h1:+e3bsJFDr9HxmUMe+eQOLNut5wfcB/ivhJdouOJgOnE=
github.com/ipfs/boxo v0.10.0 h1:tdDAxq8jrsbRkYoF+5Rcqyeb91hgWe2hp7iLu7ORZLY=
github.com/ipfs/boxo v0.10.0/go.mod h1:Fg+BnfxZ0RPzR0nOodzdIq3A7KgoWAOWsEIImrIQdBM=
github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s=
Expand Down
2 changes: 2 additions & 0 deletions pkg/protocol/engine/accounts/mana.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ func NewMana(value iotago.Mana, excessBaseTokens iotago.BaseToken, updateTime io
}
}

// Update is applied when the account output is transitioned, updating the total value and excess base tokens.
func (m *Mana) Update(value iotago.Mana, excessBaseTokens iotago.BaseToken, updateTime iotago.SlotIndex) {
m.mutex.Lock()
defer m.mutex.Unlock()
Expand All @@ -31,6 +32,7 @@ func (m *Mana) Update(value iotago.Mana, excessBaseTokens iotago.BaseToken, upda
m.updateTime = updateTime
}

// UpdateValue is applied when the total decayed value is updated but the account output is not changed.
func (m *Mana) UpdateValue(value iotago.Mana, updateTime iotago.SlotIndex) {
m.mutex.Lock()
defer m.mutex.Unlock()
Expand Down
82 changes: 72 additions & 10 deletions pkg/protocol/engine/accounts/mana/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/iotaledger/hive.go/lo"
"github.com/iotaledger/hive.go/runtime/module"
"github.com/iotaledger/hive.go/runtime/syncutils"
"github.com/iotaledger/iota-core/pkg/model"
"github.com/iotaledger/iota-core/pkg/protocol/engine/accounts"
"github.com/iotaledger/iota-core/pkg/protocol/engine/utxoledger"
iotago "github.com/iotaledger/iota.go/v4"
Expand All @@ -24,15 +25,18 @@ type Manager struct {

accountOutputResolveFunc func(iotago.AccountID, iotago.SlotIndex) (*utxoledger.Output, error)

accountRetrieveFunc func(iotago.AccountID, iotago.SlotIndex) (*accounts.AccountData, bool, error)

mutex syncutils.Mutex

module.Module
}

func NewManager(apiProvider iotago.APIProvider, accountOutputResolveFunc func(iotago.AccountID, iotago.SlotIndex) (*utxoledger.Output, error)) *Manager {
func NewManager(apiProvider iotago.APIProvider, accountOutputResolveFunc func(iotago.AccountID, iotago.SlotIndex) (*utxoledger.Output, error), accountRetrieveFunc func(iotago.AccountID, iotago.SlotIndex) (*accounts.AccountData, bool, error)) *Manager {
return &Manager{
apiProvider: apiProvider,
accountOutputResolveFunc: accountOutputResolveFunc,
accountRetrieveFunc: accountRetrieveFunc,
manaVectorCache: cache.New[iotago.AccountID, *accounts.Mana](10000),
}
}
Expand All @@ -55,7 +59,17 @@ func (m *Manager) GetManaOnAccount(accountID iotago.AccountID, currentSlot iotag
if err != nil {
excessBaseTokens = 0
}
mana = accounts.NewMana(output.StoredMana(), excessBaseTokens, output.SlotCreated())

decayedBIC, err := m.getDecayedBIC(accountID, currentSlot)
if err != nil {
return 0, ierrors.Wrapf(err, "failed to get decayed BIC for %s", accountID)
}
totalMana, err := safemath.SafeAdd(output.StoredMana(), decayedBIC)
if err != nil {
return 0, ierrors.Wrapf(err, "overflow when adding stored mana and decayed BIC for account %s", accountID)
}

mana = accounts.NewMana(totalMana, excessBaseTokens, output.SlotCreated())

if !exists {
m.manaVectorCache.Put(accountID, mana)
Expand All @@ -67,7 +81,7 @@ func (m *Manager) GetManaOnAccount(accountID iotago.AccountID, currentSlot iotag
}

manaDecayProvider := m.apiProvider.CurrentAPI().ManaDecayProvider()
// apply decay to stored Mana and potential that was added on last update
// apply decay to stored, allotted and potential that was added on last update
manaStored, err := manaDecayProvider.ManaWithDecay(mana.Value(), mana.UpdateTime(), currentSlot)
if err != nil {
return 0, err
Expand All @@ -79,30 +93,78 @@ func (m *Manager) GetManaOnAccount(accountID iotago.AccountID, currentSlot iotag
if err != nil {
return 0, err
}
updatedValue += manaPotential
updatedValue, err = safemath.SafeAdd(updatedValue, manaPotential)
if err != nil {
return 0, ierrors.Wrapf(err, "overflow when adding stored and potential mana for account %s", accountID)
}

decayedBIC, err := m.getDecayedBIC(accountID, currentSlot)
if err != nil {
return 0, ierrors.Wrapf(err, "failed to get decayed BIC for %s", accountID)
}
updatedValue, err = safemath.SafeAdd(updatedValue, decayedBIC)
if err != nil {
return 0, ierrors.Wrapf(err, "overflow when adding stored, potential and decayed BIC for account %s", accountID)
}

mana.UpdateValue(updatedValue, currentSlot)

return mana.Value(), nil
}

func (m *Manager) ApplyDiff(slot iotago.SlotIndex, destroyedAccounts ds.Set[iotago.AccountID], accountOutputs map[iotago.AccountID]*utxoledger.Output) {
func (m *Manager) ApplyDiff(slot iotago.SlotIndex, destroyedAccounts ds.Set[iotago.AccountID], accountOutputs map[iotago.AccountID]*utxoledger.Output, accountDiffs map[iotago.AccountID]*model.AccountDiff) error {
m.mutex.Lock()
defer m.mutex.Unlock()

destroyedAccounts.Range(func(accountID iotago.AccountID) {
m.manaVectorCache.Remove(accountID)
})

for accountID, output := range accountOutputs {
for accountID := range accountDiffs {
mana, exists := m.manaVectorCache.Get(accountID)
if exists {
minDeposit := lo.PanicOnErr(m.apiProvider.CurrentAPI().RentStructure().MinDeposit(output.Output()))
excessBaseTokens, err := safemath.SafeSub(output.BaseTokenAmount(), minDeposit)
var excessBaseTokens iotago.BaseToken
var storedMana iotago.Mana
var err error
if output, has := accountOutputs[accountID]; has {
minDeposit := lo.PanicOnErr(m.apiProvider.CurrentAPI().RentStructure().MinDeposit(output.Output()))
excessBaseTokens, err = safemath.SafeSub(output.BaseTokenAmount(), minDeposit)
if err != nil {
excessBaseTokens = 0
}
storedMana = output.StoredMana()
}
decayedBIC, err := m.getDecayedBIC(accountID, slot)
if err != nil {
return err
}
totalMana, err := safemath.SafeAdd(decayedBIC, storedMana)
if err != nil {
excessBaseTokens = 0
return ierrors.Wrapf(err, "overflow when adding stored mana and decayed BIC for account %s", accountID)
}
mana.Update(output.StoredMana(), excessBaseTokens, slot)

mana.Update(totalMana, excessBaseTokens, slot)
}
}

return nil
}

func (m *Manager) getDecayedBIC(accountID iotago.AccountID, slot iotago.SlotIndex) (iotago.Mana, error) {
accountBIC, exists, err := m.accountRetrieveFunc(accountID, slot)
if err != nil {
return 0, ierrors.Wrapf(err, "failed to retrieve account data for %s in slot %s", accountID, slot)
}
if !exists {
return 0, ierrors.Errorf("account data for %s in slot %s does not exist", accountID, slot)
}
if accountBIC.Credits.Value <= 0 {
return 0, nil
}
decayedBIC, err := m.apiProvider.CurrentAPI().ManaDecayProvider().ManaWithDecay(iotago.Mana(accountBIC.Credits.Value), accountBIC.Credits.UpdateTime, slot)
if err != nil {
return 0, ierrors.Wrapf(err, "failed to apply mana decay for account %s", accountID)
}

return decayedBIC, nil
}
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,9 @@ func NewProvider(opts ...options.Option[Scheduler]) module.Provider[*engine.Engi
return 0, err
}

minMana := s.apiProvider.CurrentAPI().ProtocolParameters().CongestionControlParameters().MinMana
if mana < minMana {
return 0, ierrors.Errorf("account %s has insufficient Mana for block to be scheduled: account Mana %d, min Mana %d", accountID, mana, minMana)
}
mana = lo.Min(mana, iotago.Mana(s.maxDeficit()-1))

return Deficit(mana / minMana), nil
return 1 + Deficit(mana), nil
}
})
s.TriggerConstructed()
Expand Down
10 changes: 6 additions & 4 deletions pkg/protocol/engine/ledger/ledger/ledger.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ func NewProvider() module.Provider[*engine.Engine, ledger.Ledger] {
l.memPool = mempoolv1.New(NewVM(l), l.resolveState, e.Workers.CreateGroup("MemPool"), l.conflictDAG, l.errorHandler, mempoolv1.WithForkAllTransactions[ledger.BlockVoteRank](true))
e.EvictionState.Events.SlotEvicted.Hook(l.memPool.Evict)

l.manaManager = mana.NewManager(l.apiProvider, l.resolveAccountOutput)
l.manaManager = mana.NewManager(l.apiProvider, l.resolveAccountOutput, l.accountsLedger.Account)
latestCommittedSlot := e.Storage.Settings().LatestCommitment().Slot()
l.accountsLedger.SetLatestCommittedSlot(latestCommittedSlot)
l.rmcManager.SetLatestCommittedSlot(latestCommittedSlot)
Expand Down Expand Up @@ -170,9 +170,6 @@ func (l *Ledger) CommitSlot(slot iotago.SlotIndex) (stateRoot iotago.Identifier,
l.prepareAccountDiffs(accountDiffs, slot, consumedAccounts, createdAccounts)

// Commit the changes
// Update the mana manager's cache
l.manaManager.ApplyDiff(slot, destroyedAccounts, createdAccounts)

// Update the UTXO ledger
if err = l.utxoLedger.ApplyDiff(slot, outputs, spends); err != nil {
return iotago.Identifier{}, iotago.Identifier{}, iotago.Identifier{}, ierrors.Errorf("failed to apply diff to UTXO ledger for slot %d: %w", slot, err)
Expand All @@ -190,6 +187,11 @@ func (l *Ledger) CommitSlot(slot iotago.SlotIndex) (stateRoot iotago.Identifier,
return iotago.Identifier{}, iotago.Identifier{}, iotago.Identifier{}, ierrors.Errorf("failed to apply diff to Accounts ledger for slot %d: %w", slot, err)
}

// Update the mana manager's cache
if err = l.manaManager.ApplyDiff(slot, destroyedAccounts, createdAccounts, accountDiffs); err != nil {
return iotago.Identifier{}, iotago.Identifier{}, iotago.Identifier{}, ierrors.Errorf("failed to apply diff to mana manager for slot %d: %w", slot, err)
}

// Mark each transaction as committed so the mempool can evict it
stateDiff.ExecutedTransactions().ForEach(func(_ iotago.TransactionID, tx mempool.TransactionMetadata) bool {
tx.Commit()
Expand Down
14 changes: 7 additions & 7 deletions pkg/tests/upgrade_signaling_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ func Test_Upgrade_Signaling(t *testing.T) {

ts.AssertAccountData(&accounts.AccountData{
ID: ts.Node("nodeA").AccountID,
Credits: &accounts.BlockIssuanceCredits{Value: iotago.MaxBlockIssuanceCredits, UpdateTime: 0},
Credits: &accounts.BlockIssuanceCredits{Value: iotago.MaxBlockIssuanceCredits / 2, UpdateTime: 0},
ExpirySlot: iotago.MaxSlotIndex,
OutputID: iotago.OutputIDFromTransactionIDAndIndex(snapshotcreator.GenesisTransactionID, 1),
BlockIssuerKeys: iotago.NewBlockIssuerKeys(iotago.Ed25519PublicKeyBlockIssuerKeyFromPublicKey(ed25519.PublicKey(ts.Node("nodeA").PubKey))),
Expand All @@ -109,7 +109,7 @@ func Test_Upgrade_Signaling(t *testing.T) {

ts.AssertAccountData(&accounts.AccountData{
ID: ts.Node("nodeF").AccountID,
Credits: &accounts.BlockIssuanceCredits{Value: iotago.MaxBlockIssuanceCredits, UpdateTime: 0},
Credits: &accounts.BlockIssuanceCredits{Value: iotago.MaxBlockIssuanceCredits / 2, UpdateTime: 0},
ExpirySlot: iotago.MaxSlotIndex,
OutputID: iotago.OutputIDFromTransactionIDAndIndex(snapshotcreator.GenesisTransactionID, 6),
BlockIssuerKeys: iotago.NewBlockIssuerKeys(iotago.Ed25519PublicKeyBlockIssuerKeyFromPublicKey(ed25519.PublicKey(ts.Node("nodeF").PubKey))),
Expand All @@ -133,7 +133,7 @@ func Test_Upgrade_Signaling(t *testing.T) {
// check account data before all nodes set the current version
ts.AssertAccountData(&accounts.AccountData{
ID: ts.Node("nodeA").AccountID,
Credits: &accounts.BlockIssuanceCredits{Value: iotago.MaxBlockIssuanceCredits, UpdateTime: 0},
Credits: &accounts.BlockIssuanceCredits{Value: iotago.MaxBlockIssuanceCredits / 2, UpdateTime: 0},
ExpirySlot: iotago.MaxSlotIndex,
OutputID: iotago.OutputIDFromTransactionIDAndIndex(snapshotcreator.GenesisTransactionID, 1),
BlockIssuerKeys: iotago.NewBlockIssuerKeys(iotago.Ed25519PublicKeyBlockIssuerKeyFromPublicKey(ed25519.PublicKey(ts.Node("nodeA").PubKey))),
Expand All @@ -146,7 +146,7 @@ func Test_Upgrade_Signaling(t *testing.T) {

ts.AssertAccountData(&accounts.AccountData{
ID: ts.Node("nodeD").AccountID,
Credits: &accounts.BlockIssuanceCredits{Value: iotago.MaxBlockIssuanceCredits, UpdateTime: 0},
Credits: &accounts.BlockIssuanceCredits{Value: iotago.MaxBlockIssuanceCredits / 2, UpdateTime: 0},
ExpirySlot: iotago.MaxSlotIndex,
OutputID: iotago.OutputIDFromTransactionIDAndIndex(snapshotcreator.GenesisTransactionID, 4),
BlockIssuerKeys: iotago.NewBlockIssuerKeys(iotago.Ed25519PublicKeyBlockIssuerKeyFromPublicKey(ed25519.PublicKey(ts.Node("nodeD").PubKey))),
Expand All @@ -167,7 +167,7 @@ func Test_Upgrade_Signaling(t *testing.T) {

ts.AssertAccountData(&accounts.AccountData{
ID: ts.Node("nodeA").AccountID,
Credits: &accounts.BlockIssuanceCredits{Value: iotago.MaxBlockIssuanceCredits, UpdateTime: 0},
Credits: &accounts.BlockIssuanceCredits{Value: iotago.MaxBlockIssuanceCredits / 2, UpdateTime: 0},
ExpirySlot: iotago.MaxSlotIndex,
OutputID: iotago.OutputIDFromTransactionIDAndIndex(snapshotcreator.GenesisTransactionID, 1),
BlockIssuerKeys: iotago.NewBlockIssuerKeys(iotago.Ed25519PublicKeyBlockIssuerKeyFromPublicKey(ed25519.PublicKey(ts.Node("nodeA").PubKey))),
Expand Down Expand Up @@ -340,7 +340,7 @@ func Test_Upgrade_Signaling(t *testing.T) {
// check account data at the end of the test
ts.AssertAccountData(&accounts.AccountData{
ID: ts.Node("nodeA").AccountID,
Credits: &accounts.BlockIssuanceCredits{Value: iotago.MaxBlockIssuanceCredits, UpdateTime: 0},
Credits: &accounts.BlockIssuanceCredits{Value: iotago.MaxBlockIssuanceCredits / 2, UpdateTime: 0},
ExpirySlot: iotago.MaxSlotIndex,
OutputID: iotago.OutputIDFromTransactionIDAndIndex(snapshotcreator.GenesisTransactionID, 1),
BlockIssuerKeys: iotago.NewBlockIssuerKeys(iotago.Ed25519PublicKeyBlockIssuerKeyFromPublicKey(ed25519.PublicKey(ts.Node("nodeA").PubKey))),
Expand All @@ -353,7 +353,7 @@ func Test_Upgrade_Signaling(t *testing.T) {

ts.AssertAccountData(&accounts.AccountData{
ID: ts.Node("nodeD").AccountID,
Credits: &accounts.BlockIssuanceCredits{Value: iotago.MaxBlockIssuanceCredits, UpdateTime: 0},
Credits: &accounts.BlockIssuanceCredits{Value: iotago.MaxBlockIssuanceCredits / 2, UpdateTime: 0},
ExpirySlot: iotago.MaxSlotIndex,
OutputID: iotago.OutputIDFromTransactionIDAndIndex(snapshotcreator.GenesisTransactionID, 4),
BlockIssuerKeys: iotago.NewBlockIssuerKeys(iotago.Ed25519PublicKeyBlockIssuerKeyFromPublicKey(ed25519.PublicKey(ts.Node("nodeD").PubKey))),
Expand Down
5 changes: 1 addition & 4 deletions pkg/testsuite/testsuite.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ type TestSuite struct {
optsRMCIncreaseThreshold iotago.WorkScore
optsRMCDecreaseThreshold iotago.WorkScore
optsSchedulerRate iotago.WorkScore
optsMinMana iotago.Mana
optsMaxBufferSize uint32
optsAccounts []snapshotcreator.AccountDetails
optsSnapshotOptions []options.Option[snapshotcreator.Options]
Expand Down Expand Up @@ -98,7 +97,6 @@ func NewTestSuite(testingT *testing.T, opts ...options.Option[TestSuite]) *TestS
optsRMCIncreaseThreshold: 8 * schedulerRate,
optsRMCDecreaseThreshold: 5 * schedulerRate,
optsSchedulerRate: schedulerRate,
optsMinMana: 1,
optsMaxBufferSize: 100 * iotago.MaxBlockSize,
}, opts, func(t *TestSuite) {
fmt.Println("Setup TestSuite -", testingT.Name(), " @ ", time.Now())
Expand Down Expand Up @@ -136,7 +134,6 @@ func NewTestSuite(testingT *testing.T, opts ...options.Option[TestSuite]) *TestS
t.optsRMCIncreaseThreshold,
t.optsRMCDecreaseThreshold,
t.optsSchedulerRate,
t.optsMinMana,
t.optsMaxBufferSize,
t.optsMaxBufferSize,
),
Expand Down Expand Up @@ -357,7 +354,7 @@ func (t *TestSuite) addNodeToPartition(name string, partition string, validator
Mana: iotago.Mana(amount),
IssuerKey: iotago.Ed25519PublicKeyBlockIssuerKeyFromPublicKey(ed25519.PublicKey(node.PubKey)),
ExpirySlot: iotago.MaxSlotIndex,
BlockIssuanceCredits: iotago.MaxBlockIssuanceCredits,
BlockIssuanceCredits: iotago.MaxBlockIssuanceCredits / 2,
}
if validator {
accountDetails.StakedAmount = accountDetails.Amount
Expand Down
2 changes: 1 addition & 1 deletion tools/evil-spammer/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ require (
github.com/iotaledger/hive.go/runtime v0.0.0-20230929122509-67f34bfed40d
github.com/iotaledger/iota-core v0.0.0-00010101000000-000000000000
github.com/iotaledger/iota-core/tools/genesis-snapshot v0.0.0-00010101000000-000000000000
github.com/iotaledger/iota.go/v4 v4.0.0-20231003122130-2871888a9297
github.com/iotaledger/iota.go/v4 v4.0.0-20231003154311-26aa2f0fd388
github.com/mr-tron/base58 v1.2.0
go.uber.org/atomic v1.11.0
)
Expand Down
4 changes: 2 additions & 2 deletions tools/evil-spammer/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -195,8 +195,8 @@ github.com/iotaledger/hive.go/serializer/v2 v2.0.0-rc.1.0.20230929122509-67f34bf
github.com/iotaledger/hive.go/serializer/v2 v2.0.0-rc.1.0.20230929122509-67f34bfed40d/go.mod h1:IJgaaxbgKCsNat18jlJJEAxCY2oVYR3F30B+M4vJ89I=
github.com/iotaledger/hive.go/stringify v0.0.0-20230929122509-67f34bfed40d h1:ekHWRypoaiCXgrJVUQS7rCewsK3FuG1gTbPxu5jYn9c=
github.com/iotaledger/hive.go/stringify v0.0.0-20230929122509-67f34bfed40d/go.mod h1:FTo/UWzNYgnQ082GI9QVM9HFDERqf9rw9RivNpqrnTs=
github.com/iotaledger/iota.go/v4 v4.0.0-20231003122130-2871888a9297 h1:kbpsa/gF0x6Cxu5lN9TL8u5EdaGv1P3/OKKPW0w83Og=
github.com/iotaledger/iota.go/v4 v4.0.0-20231003122130-2871888a9297/go.mod h1:+e3bsJFDr9HxmUMe+eQOLNut5wfcB/ivhJdouOJgOnE=
github.com/iotaledger/iota.go/v4 v4.0.0-20231003154311-26aa2f0fd388 h1:IGqHrJRmrzfalf1py+FGWzkWoaA5o6avBSYWznVG08s=
github.com/iotaledger/iota.go/v4 v4.0.0-20231003154311-26aa2f0fd388/go.mod h1:+e3bsJFDr9HxmUMe+eQOLNut5wfcB/ivhJdouOJgOnE=
github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s=
github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
Expand Down
Loading
Loading