Skip to content

Commit

Permalink
Merge pull request #866 from iotaledger/feat/add-tx-endpoint
Browse files Browse the repository at this point in the history
Add transaction endpoint
  • Loading branch information
muXxer authored Mar 22, 2024
2 parents 6adca9b + b259203 commit dc5b73c
Show file tree
Hide file tree
Showing 21 changed files with 144 additions and 65 deletions.
2 changes: 1 addition & 1 deletion components/debugapi/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
// ParametersDebugAPI contains the definition of configuration parameters used by the debug API.
type ParametersDebugAPI struct {
// Enabled whether the DebugAPI component is enabled.
Enabled bool `default:"true" usage:"whether the DebugAPI component is enabled"`
Enabled bool `default:"false" usage:"whether the DebugAPI component is enabled"`

Database struct {
Path string `default:"testnet/debug" usage:"the path to the database folder"`
Expand Down
4 changes: 2 additions & 2 deletions components/inx/server_commitments.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func (s *Server) ListenToCommitments(req *inx.SlotRangeRequest, srv inx.INX_List
return status.Errorf(codes.NotFound, "commitment slot %d not found", slot)
}

return err
return status.Errorf(codes.Internal, "failed to load commitment for slot %d: %s", slot, err.Error())
}

if err := srv.Send(inxCommitment(commitment)); err != nil {
Expand Down Expand Up @@ -178,7 +178,7 @@ func (s *Server) ReadCommitment(_ context.Context, req *inx.CommitmentRequest) (
return nil, status.Errorf(codes.NotFound, "commitment slot %d not found", req.GetCommitmentSlot())
}

return nil, err
return nil, status.Errorf(codes.Internal, "failed to load commitment for slot %d: %s", commitmentSlot, err.Error())
}

if req.GetCommitmentId() != nil {
Expand Down
39 changes: 26 additions & 13 deletions components/inx/server_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,41 @@ import (
"context"
"time"

"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"

"github.com/iotaledger/hive.go/ierrors"
"github.com/iotaledger/hive.go/kvstore"
"github.com/iotaledger/hive.go/runtime/event"
"github.com/iotaledger/hive.go/runtime/workerpool"
inx "github.com/iotaledger/inx/go"
"github.com/iotaledger/iota-core/pkg/protocol/engine/syncmanager"
)

func inxNodeStatus(status *syncmanager.SyncStatus) *inx.NodeStatus {
finalizedCommitment, err := deps.Protocol.Engines.Main.Get().Storage.Commitments().Load(status.LatestFinalizedSlot)
func inxNodeStatus(syncStatus *syncmanager.SyncStatus) (*inx.NodeStatus, error) {
finalizedCommitment, err := deps.Protocol.Engines.Main.Get().Storage.Commitments().Load(syncStatus.LatestFinalizedSlot)
if err != nil {
return nil
if ierrors.Is(err, kvstore.ErrKeyNotFound) {
return nil, status.Errorf(codes.NotFound, "finalized commitment (slot %d) not found", syncStatus.LatestFinalizedSlot)
}

return nil, status.Errorf(codes.Internal, "failed to load finalized commitment (slot %d): %s", syncStatus.LatestFinalizedSlot, err.Error())
}

return &inx.NodeStatus{
IsHealthy: status.NodeSynced,
IsBootstrapped: status.NodeBootstrapped,
LastAcceptedBlockSlot: uint32(status.LastAcceptedBlockSlot),
LastConfirmedBlockSlot: uint32(status.LastConfirmedBlockSlot),
LatestCommitment: inxCommitment(status.LatestCommitment),
IsHealthy: syncStatus.NodeSynced,
IsBootstrapped: syncStatus.NodeBootstrapped,
LastAcceptedBlockSlot: uint32(syncStatus.LastAcceptedBlockSlot),
LastConfirmedBlockSlot: uint32(syncStatus.LastConfirmedBlockSlot),
LatestCommitment: inxCommitment(syncStatus.LatestCommitment),
LatestFinalizedCommitment: inxCommitment(finalizedCommitment),
PruningEpoch: uint32(status.LastPrunedEpoch),
HasPruned: status.HasPruned,
}
PruningEpoch: uint32(syncStatus.LastPrunedEpoch),
HasPruned: syncStatus.HasPruned,
}, nil
}

func (s *Server) ReadNodeStatus(context.Context, *inx.NoParams) (*inx.NodeStatus, error) {
return inxNodeStatus(deps.Protocol.Engines.Main.Get().SyncManager.SyncStatus()), nil
return inxNodeStatus(deps.Protocol.Engines.Main.Get().SyncManager.SyncStatus())
}

func (s *Server) ListenToNodeStatus(req *inx.NodeStatusRequest, srv inx.INX_ListenToNodeStatusServer) error {
Expand All @@ -56,7 +65,11 @@ func (s *Server) ListenToNodeStatus(req *inx.NodeStatusRequest, srv inx.INX_List
lastUpdateTimer = nil
}

nodeStatus := inxNodeStatus(status)
nodeStatus, err := inxNodeStatus(status)
if err != nil {
Component.LogErrorf("failed to convert sync status to inx node status: %s", err.Error())
return
}

// Use cool-down if the node is syncing
if coolDownDuration > 0 && !nodeStatus.GetIsHealthy() {
Expand Down
13 changes: 11 additions & 2 deletions components/inx/server_utxo.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"google.golang.org/grpc/status"

"github.com/iotaledger/hive.go/ierrors"
"github.com/iotaledger/hive.go/kvstore"
"github.com/iotaledger/hive.go/runtime/event"
"github.com/iotaledger/hive.go/runtime/workerpool"
inx "github.com/iotaledger/inx/go"
Expand Down Expand Up @@ -204,7 +205,11 @@ func (s *Server) ListenToLedgerUpdates(req *inx.SlotRangeRequest, srv inx.INX_Li
createLedgerUpdatePayloadAndSend := func(slot iotago.SlotIndex, outputs utxoledger.Outputs, spents utxoledger.Spents) error {
commitment, err := deps.Protocol.Engines.Main.Get().Storage.Commitments().Load(slot)
if err != nil {
return status.Errorf(codes.NotFound, "commitment for slot %d not found", slot)
if ierrors.Is(err, kvstore.ErrKeyNotFound) {
return status.Errorf(codes.NotFound, "commitment for slot %d not found", slot)
}

return status.Errorf(codes.Internal, "failed to get commitment for slot %d: %s", slot, err.Error())
}

// Send Begin
Expand Down Expand Up @@ -248,7 +253,11 @@ func (s *Server) ListenToLedgerUpdates(req *inx.SlotRangeRequest, srv inx.INX_Li
for currentSlot := startSlot; currentSlot <= endSlot; currentSlot++ {
stateDiff, err := deps.Protocol.Engines.Main.Get().Ledger.SlotDiffs(currentSlot)
if err != nil {
return status.Errorf(codes.NotFound, "ledger update for slot %d not found", currentSlot)
if ierrors.Is(err, kvstore.ErrKeyNotFound) {
return status.Errorf(codes.NotFound, "ledger update for slot %d not found", currentSlot)
}

return status.Errorf(codes.Internal, "failed to get ledger update for slot %d: %s", currentSlot, err.Error())
}

if err := createLedgerUpdatePayloadAndSend(stateDiff.Slot, stateDiff.Outputs, stateDiff.Spents); err != nil {
Expand Down
13 changes: 11 additions & 2 deletions components/restapi/core/component.go
Original file line number Diff line number Diff line change
Expand Up @@ -223,13 +223,22 @@ func configure() error {
return responseByHeader(c, resp)
}, checkNodeSynced())

routeGroup.GET(api.EndpointWithEchoParameters(api.CoreEndpointTransaction), func(c echo.Context) error {
resp, err := transactionFromTransactionID(c)
if err != nil {
return err
}

return responseByHeader(c, resp)
})

routeGroup.GET(api.EndpointWithEchoParameters(api.CoreEndpointTransactionsIncludedBlock), func(c echo.Context) error {
block, err := blockFromTransactionID(c)
resp, err := blockFromTransactionID(c)
if err != nil {
return err
}

return responseByHeader(c, block)
return responseByHeader(c, resp)
})

routeGroup.GET(api.EndpointWithEchoParameters(api.CoreEndpointTransactionsIncludedBlockMetadata), func(c echo.Context) error {
Expand Down
30 changes: 27 additions & 3 deletions components/restapi/core/transaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func blockIDFromTransactionID(c echo.Context) (iotago.BlockID, error) {
func blockFromTransactionID(c echo.Context) (*iotago.Block, error) {
blockID, err := blockIDFromTransactionID(c)
if err != nil {
return nil, ierrors.WithMessagef(echo.ErrBadRequest, "failed to get block ID by transaction ID: %w", err)
return nil, ierrors.Wrap(err, "failed to get block ID by transaction ID")
}

return deps.RequestHandler.BlockFromBlockID(blockID)
Expand All @@ -30,16 +30,40 @@ func blockFromTransactionID(c echo.Context) (*iotago.Block, error) {
func blockMetadataFromTransactionID(c echo.Context) (*api.BlockMetadataResponse, error) {
blockID, err := blockIDFromTransactionID(c)
if err != nil {
return nil, ierrors.WithMessagef(echo.ErrBadRequest, "failed to get block ID by transaction ID: %w", err)
return nil, ierrors.Wrap(err, "failed to get block ID by transaction ID")
}

return deps.RequestHandler.BlockMetadataFromBlockID(blockID)
}

func transactionFromTransactionID(c echo.Context) (*iotago.Transaction, error) {
txID, err := httpserver.ParseTransactionIDParam(c, api.ParameterTransactionID)
if err != nil {
return nil, ierrors.Wrap(err, "failed to parse transaction ID")
}

blockID, err := deps.RequestHandler.BlockIDFromTransactionID(txID)
if err != nil {
return nil, ierrors.Wrap(err, "failed to get block ID by transaction ID")
}

block, err := deps.RequestHandler.ModelBlockFromBlockID(blockID)
if err != nil {
return nil, ierrors.Wrap(err, "failed to get block by block ID")
}

tx, isTransaction := block.SignedTransaction()
if !isTransaction {
return nil, ierrors.WithMessagef(echo.ErrInternalServerError, "block %s does not contain a transaction", blockID)
}

return tx.Transaction, nil
}

func transactionMetadataFromTransactionID(c echo.Context) (*api.TransactionMetadataResponse, error) {
txID, err := httpserver.ParseTransactionIDParam(c, api.ParameterTransactionID)
if err != nil {
return nil, ierrors.Wrapf(err, "failed to parse transaction ID %s", c.Param(api.ParameterTransactionID))
return nil, ierrors.Wrap(err, "failed to parse transaction ID")
}

return deps.RequestHandler.TransactionMetadataFromTransactionID(txID)
Expand Down
2 changes: 1 addition & 1 deletion config_defaults.json
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
}
},
"debugAPI": {
"enabled": true,
"enabled": false,
"db": {
"path": "testnet/debug",
"maxOpenDBs": 2,
Expand Down
4 changes: 2 additions & 2 deletions documentation/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ Example:

| Name | Description | Type | Default value |
| ------------------ | ----------------------------------------- | ------- | ------------- |
| enabled | Whether the DebugAPI component is enabled | boolean | true |
| enabled | Whether the DebugAPI component is enabled | boolean | false |
| [db](#debugapi_db) | Configuration for db | object | |

### <a id="debugapi_db"></a> Db
Expand All @@ -258,7 +258,7 @@ Example:
```json
{
"debugAPI": {
"enabled": true,
"enabled": false,
"db": {
"path": "testnet/debug",
"maxOpenDBs": 2,
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ require (
github.com/iotaledger/hive.go/stringify v0.0.0-20240320122938-13a946cf3c7a
github.com/iotaledger/inx-app v1.0.0-rc.3.0.20240307101848-db58eb9353ec
github.com/iotaledger/inx/go v1.0.0-rc.2.0.20240307100839-48553e1d2022
github.com/iotaledger/iota.go/v4 v4.0.0-20240322111205-845f859ca28c
github.com/iotaledger/iota.go/v4 v4.0.0-20240322114706-82a1f8a8b70c
github.com/labstack/echo/v4 v4.11.4
github.com/labstack/gommon v0.4.2
github.com/libp2p/go-libp2p v0.33.1
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -325,8 +325,8 @@ github.com/iotaledger/inx/go v1.0.0-rc.2.0.20240307100839-48553e1d2022 h1:I178Sa
github.com/iotaledger/inx/go v1.0.0-rc.2.0.20240307100839-48553e1d2022/go.mod h1:jTFxIWiMUdAwO263jlJCSWcNLqEkgYEVOFXfjp5aNJM=
github.com/iotaledger/iota-crypto-demo v0.0.0-20240320124000-d02f37a4fdff h1:Do8fakxvFaj7dLckoo/z+mRyBdZo8QvT8HcgnQlG2Sg=
github.com/iotaledger/iota-crypto-demo v0.0.0-20240320124000-d02f37a4fdff/go.mod h1:aVEutEWFnhDNJBxtVuzy2BeTN+8FAlnR83k7hKV0CFE=
github.com/iotaledger/iota.go/v4 v4.0.0-20240322111205-845f859ca28c h1:xnaAczQXgcm4FL/z6q/r5WqUsyxqsUcs/hEdikQjjQ0=
github.com/iotaledger/iota.go/v4 v4.0.0-20240322111205-845f859ca28c/go.mod h1:qn/63CB0/jE1em6ewqDSiz+ovS+E/os7K5b7g2pmJFg=
github.com/iotaledger/iota.go/v4 v4.0.0-20240322114706-82a1f8a8b70c h1:0uqpCv2txjbVi1E5AFvXkUGmTMiEX1nPzmTFH1Bfk6c=
github.com/iotaledger/iota.go/v4 v4.0.0-20240322114706-82a1f8a8b70c/go.mod h1:qn/63CB0/jE1em6ewqDSiz+ovS+E/os7K5b7g2pmJFg=
github.com/ipfs/boxo v0.18.0 h1:MOL9/AgoV3e7jlVMInicaSdbgralfqSsbkc31dZ9tmw=
github.com/ipfs/boxo v0.18.0/go.mod h1:pIZgTWdm3k3pLF9Uq6MB8JEcW07UDwNJjlXW1HELW80=
github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s=
Expand Down
12 changes: 11 additions & 1 deletion pkg/requesthandler/blocks.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,26 @@ import (

"github.com/iotaledger/hive.go/ierrors"
"github.com/iotaledger/hive.go/kvstore"
"github.com/iotaledger/iota-core/pkg/model"
iotago "github.com/iotaledger/iota.go/v4"
"github.com/iotaledger/iota.go/v4/api"
)

func (r *RequestHandler) BlockFromBlockID(blockID iotago.BlockID) (*iotago.Block, error) {
func (r *RequestHandler) ModelBlockFromBlockID(blockID iotago.BlockID) (*model.Block, error) {
block, exists := r.protocol.Engines.Main.Get().Block(blockID)
if !exists {
return nil, ierrors.WithMessagef(echo.ErrNotFound, "block %s not found", blockID)
}

return block, nil
}

func (r *RequestHandler) BlockFromBlockID(blockID iotago.BlockID) (*iotago.Block, error) {
block, err := r.ModelBlockFromBlockID(blockID)
if err != nil {
return nil, err
}

return block.ProtocolBlock(), nil
}

Expand Down
31 changes: 14 additions & 17 deletions pkg/requesthandler/commitments.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func (r *RequestHandler) GetCommitmentBySlot(slot iotago.SlotIndex) (*model.Comm
latest := r.protocol.Engines.Main.Get().SyncManager.LatestCommitment()

if slot > latest.Slot() {
return nil, ierrors.WithMessagef(echo.ErrBadRequest, "commitment is from a future slot (%d > %d)", slot, latest.Slot())
return nil, ierrors.WithMessagef(echo.ErrNotFound, "commitment is from a future slot (%d > %d)", slot, latest.Slot())
}

commitment, err := r.protocol.Engines.Main.Get().Storage.Commitments().Load(slot)
Expand All @@ -37,29 +37,18 @@ func (r *RequestHandler) GetCommitmentBySlot(slot iotago.SlotIndex) (*model.Comm

// GetCommitmentByID returns the commitment for the given commitmentID. If commitmentID is empty, the latest commitment is returned.
func (r *RequestHandler) GetCommitmentByID(commitmentID iotago.CommitmentID) (*model.Commitment, error) {
latest := r.protocol.Engines.Main.Get().SyncManager.LatestCommitment()
if commitmentID == iotago.EmptyCommitmentID {
return latest, nil
}

if commitmentID.Slot() > latest.Slot() {
return nil, ierrors.WithMessagef(echo.ErrBadRequest, "commitment ID (%s) is from a future slot (%d > %d)", commitmentID, commitmentID.Slot(), latest.Slot())
// this returns the latest commitment in the case that the commitmentID is empty
return r.protocol.Engines.Main.Get().SyncManager.LatestCommitment(), nil
}

commitment, err := r.protocol.Engines.Main.Get().Storage.Commitments().Load(commitmentID.Slot())
commitment, err := r.GetCommitmentBySlot(commitmentID.Slot())
if err != nil {
if ierrors.Is(err, permanent.ErrCommitmentBeforeGenesis) {
return nil, ierrors.Chain(httpserver.ErrInvalidParameter, err)
}
if ierrors.Is(err, kvstore.ErrKeyNotFound) {
return nil, ierrors.WithMessagef(echo.ErrNotFound, "commitment not found, commitmentID: %s, slot: %d", commitmentID, commitmentID.Slot())
}

return nil, ierrors.WithMessagef(echo.ErrInternalServerError, "failed to load commitment, commitmentID: %s, slot: %d, error: %w", commitmentID, commitmentID.Slot(), err)
return nil, err
}

if commitment.ID() != commitmentID {
return nil, ierrors.WithMessagef(echo.ErrBadRequest, "commitment in the store for slot %d does not match the given commitmentID (%s != %s)", commitmentID.Slot(), commitment.ID(), commitmentID)
return nil, ierrors.WithMessagef(echo.ErrInternalServerError, "commitment in the store for slot %d does not match the given commitmentID (%s != %s)", commitmentID.Slot(), commitment.ID(), commitmentID)
}

return commitment, nil
Expand Down Expand Up @@ -120,6 +109,10 @@ func (r *RequestHandler) GetUTXOChangesFullBySlot(slot iotago.SlotIndex) (*api.U
func (r *RequestHandler) getUTXOChanges(commitmentID iotago.CommitmentID) (*api.UTXOChangesResponse, error) {
diffs, err := r.protocol.Engines.Main.Get().Ledger.SlotDiffs(commitmentID.Slot())
if err != nil {
if ierrors.Is(err, kvstore.ErrKeyNotFound) {
return nil, ierrors.WithMessagef(echo.ErrNotFound, "slot diffs not found, commitmentID: %s, slot: %d", commitmentID, commitmentID.Slot())
}

return nil, ierrors.WithMessagef(echo.ErrInternalServerError, "failed to get slot diffs, commitmentID: %s, slot: %d, error: %w", commitmentID, commitmentID.Slot(), err)
}

Expand All @@ -144,6 +137,10 @@ func (r *RequestHandler) getUTXOChanges(commitmentID iotago.CommitmentID) (*api.
func (r *RequestHandler) getUTXOChangesFull(commitmentID iotago.CommitmentID) (*api.UTXOChangesFullResponse, error) {
diffs, err := r.protocol.Engines.Main.Get().Ledger.SlotDiffs(commitmentID.Slot())
if err != nil {
if ierrors.Is(err, kvstore.ErrKeyNotFound) {
return nil, ierrors.WithMessagef(echo.ErrNotFound, "slot diffs not found, commitmentID: %s, slot: %d", commitmentID, commitmentID.Slot())
}

return nil, ierrors.WithMessagef(echo.ErrInternalServerError, "failed to get slot diffs, commitmentID: %s, slot: %d, error: %w", commitmentID, commitmentID.Slot(), err)
}

Expand Down
5 changes: 5 additions & 0 deletions pkg/requesthandler/transaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"github.com/labstack/echo/v4"

"github.com/iotaledger/hive.go/ierrors"
"github.com/iotaledger/hive.go/kvstore"

"github.com/iotaledger/iota-core/pkg/retainer/txretainer"
iotago "github.com/iotaledger/iota.go/v4"
Expand All @@ -16,6 +17,10 @@ func (r *RequestHandler) BlockIDFromTransactionID(transactionID iotago.Transacti

output, spent, err := r.protocol.Engines.Main.Get().Ledger.OutputOrSpent(outputID)
if err != nil {
if ierrors.Is(err, kvstore.ErrKeyNotFound) {
return iotago.EmptyBlockID, ierrors.WithMessagef(echo.ErrNotFound, "output %s not found", outputID.ToHex())
}

return iotago.EmptyBlockID, ierrors.WithMessagef(echo.ErrInternalServerError, "failed to get output %s: %w", outputID.ToHex(), err)
}

Expand Down
2 changes: 1 addition & 1 deletion pkg/tests/booker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -871,7 +871,7 @@ func Test_BlockWithInvalidTransactionGetsBooked(t *testing.T) {
ts.AssertBlocksInCacheConfirmed(ts.Blocks("block1"), true, ts.Nodes()...)

ts.AssertTransactionsExist([]*iotago.Transaction{tx1.Transaction}, true, ts.Nodes()...)
ts.AssertTransactionFailure(lo.PanicOnErr(tx1.ID()), iotago.ErrIssuerFeatureNotUnlocked, ts.Nodes()...)
ts.AssertTransactionFailure(tx1.MustID(), iotago.ErrIssuerFeatureNotUnlocked, ts.Nodes()...)
ts.AssertTransactionsInCacheAccepted([]*iotago.Transaction{tx1.Transaction}, false, ts.Nodes()...)

ts.CommitUntilSlot(block1Slot, vblock3.ID())
Expand Down
2 changes: 1 addition & 1 deletion pkg/tests/reward_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ func Test_RewardInputCannotPointToNFTOutput(t *testing.T) {
ts.Wait(node1, node2)

ts.AssertTransactionsExist([]*iotago.Transaction{tx2.Transaction}, true, node1, node2)
signedTx2ID := lo.PanicOnErr(tx2.ID())
signedTx2ID := tx2.MustID()
ts.AssertTransactionFailure(signedTx2ID, iotago.ErrRewardInputReferenceInvalid, node1, node2)
}

Expand Down
1 change: 1 addition & 0 deletions tools/docker-network/.env
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ COMMON_CONFIG="
--db.path=/app/data/database
--protocol.snapshot.path=/app/data/snapshot.bin
--restAPI.publicRoutes=/health,/api/routes,/api/core/v3/info,/api/core/v3/network*,/api/core/v3/blocks*,/api/core/v3/transactions*,/api/core/v3/commitments*,/api/core/v3/outputs*,/api/core/v3/accounts*,/api/core/v3/validators*,/api/core/v3/rewards*,/api/core/v3/committee*,/api/debug/v2/*,/api/indexer/v2/*,/api/mqtt/v2,/api/blockissuer/v1/*,/api/management/v1/*
--debugAPI.enabled=true
"

AUTOPEERING_CONFIG="
Expand Down
2 changes: 1 addition & 1 deletion tools/docker-network/tests/api_core.go
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ func (d *DockerTestFramework) prepareAssets(totalAssetsNum int) (coreAPIAssets,
latestSlot = lo.Max[iotago.SlotIndex](latestSlot, blockSlot, valueBlockSlot, delegationOutputID.CreationSlot(), secondAttachment.Slot())

fmt.Printf("Assets for slot %d\n: dataBlock: %s block: %s\ntx: %s\nbasic output: %s, faucet output: %s\n delegation output: %s\n",
valueBlockSlot, block.MustID().String(), valueBlock.MustID().String(), lo.PanicOnErr(signedTx.ID()).String(),
valueBlockSlot, block.MustID().String(), valueBlock.MustID().String(), signedTx.MustID().String(),
basicOutputID.String(), faucetOutput.ID.String(), delegationOutputID.String())
}

Expand Down
Loading

0 comments on commit dc5b73c

Please sign in to comment.