Skip to content

Commit

Permalink
fix gas used and fee relayed v3
Browse files Browse the repository at this point in the history
  • Loading branch information
miiu96 committed Oct 17, 2024
1 parent 955a896 commit 45b593c
Show file tree
Hide file tree
Showing 20 changed files with 1,211 additions and 5 deletions.
10 changes: 10 additions & 0 deletions genesis/process/disabled/feeHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,16 @@ import (
type FeeHandler struct {
}

// ComputeRelayedTxV3GasUnits -
func (fh *FeeHandler) ComputeRelayedTxV3GasUnits(_ data.TransactionWithFeeHandler, _ uint32) uint64 {
return 0
}

// ComputeGasUnitsFromRefundValue -
func (fh *FeeHandler) ComputeGasUnitsFromRefundValue(_ data.TransactionWithFeeHandler, _ *big.Int) uint64 {
return 0
}

// GasPriceModifier returns 1.0
func (fh *FeeHandler) GasPriceModifier() float64 {
return 1.0
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ require (
github.com/klauspost/cpuid/v2 v2.2.5
github.com/mitchellh/mapstructure v1.5.0
github.com/multiversx/mx-chain-communication-go v1.1.0
github.com/multiversx/mx-chain-core-go v1.2.22
github.com/multiversx/mx-chain-core-go v1.2.23-0.20241016115557-6a55050d2ade
github.com/multiversx/mx-chain-crypto-go v1.2.12
github.com/multiversx/mx-chain-es-indexer-go v1.7.9
github.com/multiversx/mx-chain-logger-go v1.0.15
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -387,8 +387,8 @@ github.com/multiversx/concurrent-map v0.1.4 h1:hdnbM8VE4b0KYJaGY5yJS2aNIW9TFFsUY
github.com/multiversx/concurrent-map v0.1.4/go.mod h1:8cWFRJDOrWHOTNSqgYCUvwT7c7eFQ4U2vKMOp4A/9+o=
github.com/multiversx/mx-chain-communication-go v1.1.0 h1:J7bX6HoN3HiHY7cUeEjG8AJWgQDDPcY+OPDOsSUOkRE=
github.com/multiversx/mx-chain-communication-go v1.1.0/go.mod h1:WK6bP4pGEHGDDna/AYRIMtl6G9OA0NByI1Lw8PmOnRM=
github.com/multiversx/mx-chain-core-go v1.2.22 h1:yDYrvoQOBbsDerEp7L3+de5AfMy3pTF333gWPpd+FNk=
github.com/multiversx/mx-chain-core-go v1.2.22/go.mod h1:B5zU4MFyJezmEzCsAHE9YNULmGCm2zbPHvl9hazNxmE=
github.com/multiversx/mx-chain-core-go v1.2.23-0.20241016115557-6a55050d2ade h1:29XqGze9121Z4UxujgEeiBdNS9Nw9Q+VC7w62iVGk7o=
github.com/multiversx/mx-chain-core-go v1.2.23-0.20241016115557-6a55050d2ade/go.mod h1:B5zU4MFyJezmEzCsAHE9YNULmGCm2zbPHvl9hazNxmE=
github.com/multiversx/mx-chain-crypto-go v1.2.12 h1:zWip7rpUS4CGthJxfKn5MZfMfYPjVjIiCID6uX5BSOk=
github.com/multiversx/mx-chain-crypto-go v1.2.12/go.mod h1:HzcPpCm1zanNct/6h2rIh+MFrlXbjA5C8+uMyXj3LI4=
github.com/multiversx/mx-chain-es-indexer-go v1.7.9 h1:rWq9phJu8GG6TtoJ5cL+MmhyReWCEyqBE5ymXUvudCg=
Expand Down
5 changes: 5 additions & 0 deletions node/external/timemachine/fee/feeComputer.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ func (computer *feeComputer) ComputeGasLimit(tx *transaction.ApiTransactionResul
return computer.economicsInstance.ComputeGasLimitInEpoch(tx.Tx, tx.Epoch)
}

// ComputeGasUnitForRelayedV3 will compute the gas units for a relayed v3 transaction
func (computer *feeComputer) ComputeGasUnitForRelayedV3(tx *transaction.ApiTransactionResult) uint64 {
return computer.economicsInstance.ComputeRelayedTxV3GasUnits(tx.Tx, tx.Epoch)
}

// ComputeTransactionFee computes a transaction fee, at a given epoch
func (computer *feeComputer) ComputeTransactionFee(tx *transaction.ApiTransactionResult) *big.Int {
return computer.economicsInstance.ComputeTxFeeInEpoch(tx.Tx, tx.Epoch)
Expand Down
12 changes: 12 additions & 0 deletions node/external/transactionAPI/gasUsedAndFeeProcessor.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,18 @@ func (gfp *gasUsedAndFeeProcessor) computeAndAttachGasUsedAndFee(tx *transaction
return
}

isRelayedV3AndNoRefund := len(tx.InnerTransactions) > 0 && !hasRefundForSender
if isRelayedV3AndNoRefund {
txFee := gfp.feeComputer.ComputeTransactionFee(tx)
gasUsedRelayed := gfp.feeComputer.ComputeGasUnitForRelayedV3(tx)

tx.GasUsed = gasUsedRelayed
tx.Fee = txFee.String()
tx.InitiallyPaidFee = txFee.String()

return
}

gfp.prepareTxWithResultsBasedOnLogs(tx, hasRefundForSender)
}

Expand Down
114 changes: 114 additions & 0 deletions node/external/transactionAPI/gasUsedAndFeeProcessor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,20 @@ import (

"github.com/multiversx/mx-chain-core-go/core"
"github.com/multiversx/mx-chain-core-go/core/pubkeyConverter"
"github.com/multiversx/mx-chain-core-go/data"
"github.com/multiversx/mx-chain-core-go/data/transaction"
"github.com/multiversx/mx-chain-core-go/marshal"
"github.com/multiversx/mx-chain-go/common"
"github.com/multiversx/mx-chain-go/node/external/timemachine/fee"
"github.com/multiversx/mx-chain-go/process"
"github.com/multiversx/mx-chain-go/process/economics"
"github.com/multiversx/mx-chain-go/process/mock"
"github.com/multiversx/mx-chain-go/process/smartContract"
"github.com/multiversx/mx-chain-go/testscommon"
"github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock"
"github.com/multiversx/mx-chain-go/testscommon/epochNotifier"
datafield "github.com/multiversx/mx-chain-vm-common-go/parsers/dataField"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

Expand All @@ -28,6 +32,26 @@ func createEconomicsData(enableEpochsHandler common.EnableEpochsHandler) process
EpochNotifier: &epochNotifier.EpochNotifierStub{},
})

dataFieldParser, _ := datafield.NewOperationDataFieldParser(&datafield.ArgsOperationDataFieldParser{
AddressLength: 32,
Marshalizer: &mock.MarshalizerMock{},
})

_ = economicsData.SetTxTypeHandler(&testscommon.TxTypeHandlerMock{
ComputeTransactionTypeCalled: func(tx data.TransactionHandler) (process.TransactionType, process.TransactionType) {
if core.IsSmartContractAddress(tx.GetRcvAddr()) {
return process.SCInvoking, process.SCInvoking
}

res := dataFieldParser.Parse(tx.GetData(), tx.GetSndAddr(), tx.GetRcvAddr(), 3)
if len(res.Tokens) > 0 {
return process.BuiltInFunctionCall, process.BuiltInFunctionCall
}

return process.MoveBalance, process.MoveBalance
},
})

return economicsData
}

Expand Down Expand Up @@ -409,3 +433,93 @@ func TestComputeAndAttachGasUsedAndFeeFailedRelayedV1(t *testing.T) {
require.Equal(t, "1274230000000000", txWithSRefundSCR.Fee)
require.Equal(t, "1274230000000000", txWithSRefundSCR.InitiallyPaidFee)
}

func TestComputeAndAttachGasUsedAndFeeRelayedV3WithAllInnerTxFailed(t *testing.T) {
t.Parallel()

t.Run("all inner txs are failed", testComputeAndAttachGasUsedAndFeeRelayedV3WithInnerTxFailed(
"testData/relayedV3WithAllInnerTxFailed.json",
uint64(60150000),
"2226090000000000",
"2226090000000000",
))
t.Run("one inner tx is failed, other have refunds", testComputeAndAttachGasUsedAndFeeRelayedV3WithInnerTxFailed(
"testData/relayedV3WithOneInnerFailedAndTwoRefunds.json",
uint64(160766000),
"2670920000000000",
"2864760000000000",
))

}

func testComputeAndAttachGasUsedAndFeeRelayedV3WithInnerTxFailed(
inputFile string,
expectedGasUsed uint64,
expectedFee string,
expectedInitiallyPaidFee string,
) func(t *testing.T) {
return func(t *testing.T) {
t.Parallel()

enableEpochsHandler := &enableEpochsHandlerMock.EnableEpochsHandlerStub{
IsFlagEnabledInEpochCalled: func(flag core.EnableEpochFlag, epoch uint32) bool {
return flag == common.GasPriceModifierFlag ||
flag == common.PenalizedTooMuchGasFlag ||
flag == common.RelayedTransactionsV3Flag
},
}
feeComp, _ := fee.NewFeeComputer(createEconomicsData(enableEpochsHandler))
computer := fee.NewTestFeeComputer(feeComp)

gasUsedAndFeeProc := newGasUsedAndFeeProcessor(
computer,
pubKeyConverter,
smartContract.NewArgumentParser(),
&marshal.JsonMarshalizer{},
enableEpochsHandler,
)

txWithFailedInners := &transaction.ApiTransactionResult{}
err := core.LoadJsonFile(txWithFailedInners, inputFile)
require.NoError(t, err)

innerTxs := make([]*transaction.Transaction, 0, len(txWithFailedInners.InnerTransactions))
for _, innerTx := range txWithFailedInners.InnerTransactions {
snd, _ := pubKeyConverter.Decode(innerTx.Sender)
rcv, _ := pubKeyConverter.Decode(innerTx.Receiver)
val, _ := big.NewInt(0).SetString(innerTx.Value, 10)
innerTxs = append(innerTxs, &transaction.Transaction{
Nonce: innerTx.Nonce,
Value: val,
RcvAddr: rcv,
SndAddr: snd,
GasPrice: innerTx.GasPrice,
GasLimit: innerTx.GasLimit,
Data: innerTx.Data,
})
}

snd, _ := pubKeyConverter.Decode(txWithFailedInners.Sender)
rcv, _ := pubKeyConverter.Decode(txWithFailedInners.Receiver)
val, _ := big.NewInt(0).SetString(txWithFailedInners.Value, 10)
txWithFailedInners.Tx = &transaction.Transaction{
Nonce: txWithFailedInners.Nonce,
Value: val,
RcvAddr: rcv,
SndAddr: snd,
GasPrice: txWithFailedInners.GasPrice,
GasLimit: txWithFailedInners.GasLimit,
Data: txWithFailedInners.Data,
InnerTransactions: innerTxs,
}

txWithFailedInners.InitiallyPaidFee = ""
txWithFailedInners.Fee = ""
txWithFailedInners.GasUsed = 0

gasUsedAndFeeProc.computeAndAttachGasUsedAndFee(txWithFailedInners)
assert.Equal(t, expectedGasUsed, txWithFailedInners.GasUsed)
assert.Equal(t, expectedFee, txWithFailedInners.Fee)
assert.Equal(t, expectedInitiallyPaidFee, txWithFailedInners.InitiallyPaidFee)
}
}
1 change: 1 addition & 0 deletions node/external/transactionAPI/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ type feeComputer interface {
ComputeGasUsedAndFeeBasedOnRefundValue(tx *transaction.ApiTransactionResult, refundValue *big.Int) (uint64, *big.Int)
ComputeTxFeeBasedOnGasUsed(tx *transaction.ApiTransactionResult, gasUsed uint64) *big.Int
ComputeGasLimit(tx *transaction.ApiTransactionResult) uint64
ComputeGasUnitForRelayedV3(tx *transaction.ApiTransactionResult) uint64
ComputeTransactionFee(tx *transaction.ApiTransactionResult) *big.Int
IsInterfaceNil() bool
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
{
"type": "normal",
"processingTypeOnSource": "RelayedTxV3",
"processingTypeOnDestination": "RelayedTxV3",
"hash": "9034190d93ab39cf1c6e82832238777512d274c0867e6a3462950695606f10f8",
"nonce": 3,
"value": "0",
"receiver": "erd17ndrqg38lqf2zjgeqvle90rsn9ejrd9upx8evkyvh8e0m5xlph5scv9l6n",
"sender": "erd17ndrqg38lqf2zjgeqvle90rsn9ejrd9upx8evkyvh8e0m5xlph5scv9l6n",
"gasPrice": 1000000000,
"gasLimit": 500000000,
"isRelayed": true,
"innerTransactions": [
{
"type": "inner",
"hash": "f820c6cef9288bc627c42df6ac57c64429f7822fa01ba58db5d57f138f3833bf",
"nonce": 6,
"value": "0",
"receiver": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"sender": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"gasPrice": 1000000000,
"gasLimit": 20000000,
"data": "RVNEVE5GVENyZWF0ZUA0MTRjNDU1ODJkMzk2NDY1MzgzOTY2QDAxQDU0NjU3Mzc0QDAzZThANTE2ZDY2NDEzMjQ4NzQ2NTcyNmU2NzRkNjI0MjY1NTQ2NzUwNmIzMjYxMzI3YTZmNGQzNTc5NjU2MTZmMzM0NTZmNjEzNzM2Nzg1MTM3NzUzNDZkNjM2NDY5NDdANzQ2MTY3NzMzYTc0NjU3Mzc0MmM2NjcyNjU2NTJjNjY3NTZlM2I2ZDY1NzQ2MTY0NjE3NDYxM2E1NDY4Njk3MzIwNjk3MzIwNjEyMDc0NjU3Mzc0MjA2NDY1NzM2MzcyNjk3MDc0Njk2ZjZlMjA2NjZmNzIyMDYxNmUyMDYxNzc2NTczNmY2ZDY1MjA2ZTY2NzRAMDEwMQ==",
"smartContractResults": [
{
"hash": "8cee6b30bc1ed2efdc6cc1ad08d7e8ab5cda5dec54cec2f690679e8c2b672b93",
"nonce": 6,
"value": 0,
"receiver": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"sender": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"relayerAddress": "erd17ndrqg38lqf2zjgeqvle90rsn9ejrd9upx8evkyvh8e0m5xlph5scv9l6n",
"relayedValue": 0,
"data": "ESDTNFTCreate@414c45582d396465383966@01@54657374@03e8@516d664132487465726e674d6242655467506b3261327a6f4d357965616f33456f61373678513775346d63646947@746167733a746573742c667265652c66756e3b6d657461646174613a5468697320697320612074657374206465736372697074696f6e20666f7220616e20617765736f6d65206e6674@0101",
"prevTxHash": "f820c6cef9288bc627c42df6ac57c64429f7822fa01ba58db5d57f138f3833bf",
"originalTxHash": "9034190d93ab39cf1c6e82832238777512d274c0867e6a3462950695606f10f8",
"gasLimit": 19503000,
"gasPrice": 1000000000,
"callType": 0,
"logs": {
"address": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"events": [
{
"address": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"identifier": "signalError",
"topics": [
"KQclkV+pF/02MiTDTYE5sCvEqMWPbC093vxwHQBTJEM=",
"YWN0aW9uIGlzIG5vdCBhbGxvd2Vk"
],
"data": "QDYxNjM3NDY5NmY2ZTIwNjk3MzIwNmU2Zjc0MjA2MTZjNmM2Zjc3NjU2NA==",
"additionalData": [
"QDYxNjM3NDY5NmY2ZTIwNjk3MzIwNmU2Zjc0MjA2MTZjNmM2Zjc3NjU2NA=="
]
}
]
},
"tokens": [
"ALEX-9de89f"
],
"esdtValues": [
"1"
],
"operation": "ESDTNFTCreate"
}
],
"relayerAddress": "erd17ndrqg38lqf2zjgeqvle90rsn9ejrd9upx8evkyvh8e0m5xlph5scv9l6n"
},
{
"type": "inner",
"hash": "68c279534fbc7c737355463233a6d792b8fcf1d37502501da2586aee89068ceb",
"nonce": 7,
"value": "0",
"receiver": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"sender": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"gasPrice": 1000000000,
"gasLimit": 20000000,
"data": "RVNEVE5GVENyZWF0ZUA0MTRjNDU1ODJkMzk2NDY1MzgzOTY2QDAxQDU0NjU3Mzc0QDAzZThANTE2ZDY2NDEzMjQ4NzQ2NTcyNmU2NzRkNjI0MjY1NTQ2NzUwNmIzMjYxMzI3YTZmNGQzNTc5NjU2MTZmMzM0NTZmNjEzNzM2Nzg1MTM3NzUzNDZkNjM2NDY5NDdANzQ2MTY3NzMzYTc0NjU3Mzc0MmM2NjcyNjU2NTJjNjY3NTZlM2I2ZDY1NzQ2MTY0NjE3NDYxM2E1NDY4Njk3MzIwNjk3MzIwNjEyMDc0NjU3Mzc0MjA2NDY1NzM2MzcyNjk3MDc0Njk2ZjZlMjA2NjZmNzIyMDYxNmUyMDYxNzc2NTczNmY2ZDY1MjA2ZTY2NzRAMDEwMQ==",
"smartContractResults": [
{
"hash": "633a15dbd5300c49a947d264501b4068a1b9c70a86ddfb31615b346594de76f7",
"nonce": 7,
"value": 0,
"receiver": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"sender": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"relayerAddress": "erd17ndrqg38lqf2zjgeqvle90rsn9ejrd9upx8evkyvh8e0m5xlph5scv9l6n",
"relayedValue": 0,
"data": "ESDTNFTCreate@414c45582d396465383966@01@54657374@03e8@516d664132487465726e674d6242655467506b3261327a6f4d357965616f33456f61373678513775346d63646947@746167733a746573742c667265652c66756e3b6d657461646174613a5468697320697320612074657374206465736372697074696f6e20666f7220616e20617765736f6d65206e6674@0101",
"prevTxHash": "68c279534fbc7c737355463233a6d792b8fcf1d37502501da2586aee89068ceb",
"originalTxHash": "9034190d93ab39cf1c6e82832238777512d274c0867e6a3462950695606f10f8",
"gasLimit": 19503000,
"gasPrice": 1000000000,
"callType": 0,
"logs": {
"address": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"events": [
{
"address": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"identifier": "signalError",
"topics": [
"KQclkV+pF/02MiTDTYE5sCvEqMWPbC093vxwHQBTJEM=",
"YWN0aW9uIGlzIG5vdCBhbGxvd2Vk"
],
"data": "QDYxNjM3NDY5NmY2ZTIwNjk3MzIwNmU2Zjc0MjA2MTZjNmM2Zjc3NjU2NA==",
"additionalData": [
"QDYxNjM3NDY5NmY2ZTIwNjk3MzIwNmU2Zjc0MjA2MTZjNmM2Zjc3NjU2NA=="
]
}
]
},
"tokens": [
"ALEX-9de89f"
],
"esdtValues": [
"1"
],
"operation": "ESDTNFTCreate"
}
],
"relayerAddress": "erd17ndrqg38lqf2zjgeqvle90rsn9ejrd9upx8evkyvh8e0m5xlph5scv9l6n"
},
{
"type": "inner",
"hash": "098ad3df7abab3d5603438995983f81923279ee849397c56e10969f83ed7041c",
"nonce": 8,
"value": "0",
"receiver": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"sender": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"gasPrice": 1000000000,
"gasLimit": 20000000,
"data": "RVNEVE5GVENyZWF0ZUA0MTRjNDU1ODJkMzk2NDY1MzgzOTY2QDAxQDU0NjU3Mzc0QDAzZThANTE2ZDY2NDEzMjQ4NzQ2NTcyNmU2NzRkNjI0MjY1NTQ2NzUwNmIzMjYxMzI3YTZmNGQzNTc5NjU2MTZmMzM0NTZmNjEzNzM2Nzg1MTM3NzUzNDZkNjM2NDY5NDdANzQ2MTY3NzMzYTc0NjU3Mzc0MmM2NjcyNjU2NTJjNjY3NTZlM2I2ZDY1NzQ2MTY0NjE3NDYxM2E1NDY4Njk3MzIwNjk3MzIwNjEyMDc0NjU3Mzc0MjA2NDY1NzM2MzcyNjk3MDc0Njk2ZjZlMjA2NjZmNzIyMDYxNmUyMDYxNzc2NTczNmY2ZDY1MjA2ZTY2NzRAMDEwMQ==",
"smartContractResults": [
{
"hash": "19ea4142f37c3079bd511aed503ffb0bafad1b4921ef618d79c6a0a185753b78",
"nonce": 8,
"value": 0,
"receiver": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"sender": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"relayerAddress": "erd17ndrqg38lqf2zjgeqvle90rsn9ejrd9upx8evkyvh8e0m5xlph5scv9l6n",
"relayedValue": 0,
"data": "ESDTNFTCreate@414c45582d396465383966@01@54657374@03e8@516d664132487465726e674d6242655467506b3261327a6f4d357965616f33456f61373678513775346d63646947@746167733a746573742c667265652c66756e3b6d657461646174613a5468697320697320612074657374206465736372697074696f6e20666f7220616e20617765736f6d65206e6674@0101",
"prevTxHash": "098ad3df7abab3d5603438995983f81923279ee849397c56e10969f83ed7041c",
"originalTxHash": "9034190d93ab39cf1c6e82832238777512d274c0867e6a3462950695606f10f8",
"gasLimit": 19503000,
"gasPrice": 1000000000,
"callType": 0,
"logs": {
"address": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"events": [
{
"address": "erd19yrjty2l4ytl6d3jynp5mqfekq4uf2x93akz60w7l3cp6qzny3psnfyerw",
"identifier": "signalError",
"topics": [
"KQclkV+pF/02MiTDTYE5sCvEqMWPbC093vxwHQBTJEM=",
"YWN0aW9uIGlzIG5vdCBhbGxvd2Vk"
],
"data": "QDYxNjM3NDY5NmY2ZTIwNjk3MzIwNmU2Zjc0MjA2MTZjNmM2Zjc3NjU2NA==",
"additionalData": [
"QDYxNjM3NDY5NmY2ZTIwNjk3MzIwNmU2Zjc0MjA2MTZjNmM2Zjc3NjU2NA=="
]
}
]
},
"tokens": [
"ALEX-9de89f"
],
"esdtValues": [
"1"
],
"operation": "ESDTNFTCreate"
}
],
"relayerAddress": "erd17ndrqg38lqf2zjgeqvle90rsn9ejrd9upx8evkyvh8e0m5xlph5scv9l6n"
}
]
}
Loading

0 comments on commit 45b593c

Please sign in to comment.