From cdefbfffdd1e04dfc52155475f1d86dae335e14c Mon Sep 17 00:00:00 2001 From: miiu Date: Wed, 5 Jun 2024 12:36:08 +0300 Subject: [PATCH 01/29] change indexing mechanism for cross shard transfer --- integrationtests/esdtTransfer_test.go | 101 ++++++++++++++++++ ...t-transfer-cross-shard-on-destination.json | 34 ++++++ .../esdt-transfer-cross-shard-on-source.json | 34 ++++++ process/elasticproc/transactions/serialize.go | 26 +++++ 4 files changed, 195 insertions(+) create mode 100644 integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-destination.json create mode 100644 integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-source.json diff --git a/integrationtests/esdtTransfer_test.go b/integrationtests/esdtTransfer_test.go index 285802d8..45d7439e 100644 --- a/integrationtests/esdtTransfer_test.go +++ b/integrationtests/esdtTransfer_test.go @@ -113,3 +113,104 @@ func TestESDTTransferTooMuchGasProvided(t *testing.T) { require.JSONEq(t, readExpectedResult("./testdata/esdtTransfer/esdt-transfer.json"), string(genericResponse.Docs[0].Source)) } + +func TestESDTTransferCrossShardWithRefundOnSourceShard(t *testing.T) { + esClient, err := createESClient(esURL) + require.Nil(t, err) + + esProc, err := CreateElasticProcessor(esClient) + require.Nil(t, err) + + txHash := []byte("esdtTransfer") + header := &dataBlock.Header{ + Round: 50, + TimeStamp: 10101, + ShardID: 2, + } + + scrHash1 := []byte("scrHash1ESDTTransfer") + body := &dataBlock.Body{ + MiniBlocks: dataBlock.MiniBlockSlice{ + { + Type: dataBlock.TxBlock, + SenderShardID: 2, + ReceiverShardID: 1, + TxHashes: [][]byte{txHash}, + }, + { + Type: dataBlock.SmartContractResultBlock, + SenderShardID: 2, + ReceiverShardID: 2, + TxHashes: [][]byte{scrHash1}, + }, + }, + } + + address1 := "erd1ef6470tjdtlgpa9f6g3ae4nsedmjg0gv6w73v32xtvhkfff993hq750xl9" + address2 := "erd13u7zyekzvdvzek8768r5gau9p6677ufppsjuklu9e6t7yx7rhg4s68e2ze" + + txESDT := outport.TxInfo{ + Transaction: &transaction.Transaction{ + Nonce: 1, + SndAddr: decodeAddress(address1), + RcvAddr: decodeAddress(address2), + GasLimit: 500_000, + GasPrice: 1000000000, + Data: []byte("ESDTTransfer@54474e2d383862383366@0a"), + Value: big.NewInt(0), + }, + FeeInfo: &outport.FeeInfo{ + GasUsed: 334_000, + Fee: big.NewInt(136000000000000), + InitialPaidFee: big.NewInt(137660000000000), + }, + } + + refundValueBig, _ := big.NewInt(0).SetString("1660000000000", 10) + scrRefund := &smartContractResult.SmartContractResult{ + Nonce: 20, + SndAddr: decodeAddress(address2), + RcvAddr: decodeAddress(address1), + PrevTxHash: txHash, + OriginalTxHash: txHash, + Value: refundValueBig, + Data: []byte("@6f6b"), + } + + pool := &outport.TransactionPool{ + Transactions: map[string]*outport.TxInfo{ + hex.EncodeToString(txHash): &txESDT, + }, + SmartContractResults: map[string]*outport.SCRInfo{ + hex.EncodeToString(scrHash1): {SmartContractResult: scrRefund, FeeInfo: &outport.FeeInfo{}}, + }, + } + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + + ids := []string{hex.EncodeToString(txHash)} + genericResponse := &GenericResponse{} + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.OperationsIndex, true, genericResponse) + require.Nil(t, err) + + require.JSONEq(t, readExpectedResult("./testdata/esdtTransfer/esdt-transfer-cross-shard-on-source.json"), string(genericResponse.Docs[0].Source)) + + header = &dataBlock.Header{ + Round: 55, + TimeStamp: 10102, + ShardID: 1, + } + txESDT.FeeInfo = &outport.FeeInfo{ + GasUsed: 500_000, + Fee: big.NewInt(137660000000000), + InitialPaidFee: big.NewInt(137660000000000), + } + + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.OperationsIndex, true, genericResponse) + require.Nil(t, err) + + require.JSONEq(t, readExpectedResult("./testdata/esdtTransfer/esdt-transfer-cross-shard-on-destination.json"), string(genericResponse.Docs[0].Source)) +} diff --git a/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-destination.json b/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-destination.json new file mode 100644 index 00000000..68b85aa5 --- /dev/null +++ b/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-destination.json @@ -0,0 +1,34 @@ +{ + "miniBlockHash": "feb67ce20eb042980ca101852104348c7a36dcf9247c87d0aa6872ea177d61e9", + "nonce": 1, + "round": 55, + "value": "0", + "valueNum": 0, + "receiver": "erd13u7zyekzvdvzek8768r5gau9p6677ufppsjuklu9e6t7yx7rhg4s68e2ze", + "sender": "erd1ef6470tjdtlgpa9f6g3ae4nsedmjg0gv6w73v32xtvhkfff993hq750xl9", + "receiverShard": 1, + "senderShard": 2, + "gasPrice": 1000000000, + "gasLimit": 500000, + "gasUsed": 334000, + "fee": "136000000000000", + "feeNum": 0.000136, + "initialPaidFee": "137660000000000", + "data": "RVNEVFRyYW5zZmVyQDU0NDc0ZTJkMzgzODYyMzgzMzY2QDBh", + "signature": "", + "timestamp": 10102, + "status": "success", + "searchOrder": 0, + "hasScResults": true, + "tokens": [ + "TGN-88b83f" + ], + "esdtValues": [ + "10" + ], + "esdtValuesNum": [ + 1e-17 + ], + "type": "normal", + "operation": "ESDTTransfer" +} \ No newline at end of file diff --git a/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-source.json b/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-source.json new file mode 100644 index 00000000..fea75b4f --- /dev/null +++ b/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-source.json @@ -0,0 +1,34 @@ +{ + "miniBlockHash": "feb67ce20eb042980ca101852104348c7a36dcf9247c87d0aa6872ea177d61e9", + "nonce": 1, + "round": 50, + "value": "0", + "valueNum": 0, + "receiver": "erd13u7zyekzvdvzek8768r5gau9p6677ufppsjuklu9e6t7yx7rhg4s68e2ze", + "sender": "erd1ef6470tjdtlgpa9f6g3ae4nsedmjg0gv6w73v32xtvhkfff993hq750xl9", + "receiverShard": 1, + "senderShard": 2, + "gasPrice": 1000000000, + "gasLimit": 500000, + "gasUsed": 334000, + "fee": "136000000000000", + "feeNum": 0.000136, + "initialPaidFee": "137660000000000", + "data": "RVNEVFRyYW5zZmVyQDU0NDc0ZTJkMzgzODYyMzgzMzY2QDBh", + "signature": "", + "timestamp": 10101, + "status": "pending", + "searchOrder": 0, + "hasScResults": true, + "tokens": [ + "TGN-88b83f" + ], + "esdtValues": [ + "10" + ], + "esdtValuesNum": [ + 1e-17 + ], + "type": "normal", + "operation": "ESDTTransfer" +} \ No newline at end of file diff --git a/process/elasticproc/transactions/serialize.go b/process/elasticproc/transactions/serialize.go index bb5db537..90df7c84 100644 --- a/process/elasticproc/transactions/serialize.go +++ b/process/elasticproc/transactions/serialize.go @@ -176,6 +176,25 @@ func prepareSerializedDataForATransaction( return metaData, serializedData, nil } + if isSimpleESDTTransferCrossShardOnDestination(tx, selfShardID) { + codeToExecute := ` + if ('create' == ctx.op) { + ctx._source = params.tx; + } else { + def gasUsed = ctx._source.gasUsed; + def fee = ctx._source.fee; + def feeNum = ctx._source.feeNum; + ctx._source = params.tx; + ctx._source.gasUsed = gasUsed; + ctx._source.fee = fee; + ctx._source.feeNum = feeNum; + } +` + serializedData := []byte(fmt.Sprintf(`{"scripted_upsert": true, "script":{"source":"%s","lang": "painless","params":{"tx": %s}},"upsert":{}}`, + converters.FormatPainlessSource(codeToExecute), string(marshaledTx))) + return metaData, serializedData, nil + } + // transaction is intra-shard, invalid or cross-shard destination me meta := []byte(fmt.Sprintf(`{ "index" : { "_index":"%s", "_id" : "%s" } }%s`, index, converters.JsonEscape(tx.Hash), "\n")) @@ -221,3 +240,10 @@ func isNFTTransferOrMultiTransfer(tx *data.Transaction) bool { return splitData[0] == core.BuiltInFunctionESDTNFTTransfer || splitData[0] == core.BuiltInFunctionMultiESDTNFTTransfer } + +func isSimpleESDTTransferCrossShardOnDestination(tx *data.Transaction, selfShard uint32) bool { + isSimpleESDT := tx.Operation == core.BuiltInFunctionESDTTransfer && tx.Function == "" + isCrossOnDestination := tx.SenderShard != tx.ReceiverShard && tx.ReceiverShard == selfShard + + return isSimpleESDT && isCrossOnDestination +} From fe9e1c8dc0fde803787a094c90064ac0a03ce7a3 Mon Sep 17 00:00:00 2001 From: miiu Date: Wed, 5 Jun 2024 12:37:31 +0300 Subject: [PATCH 02/29] empty line --- .../esdtTransfer/esdt-transfer-cross-shard-on-destination.json | 2 +- .../esdtTransfer/esdt-transfer-cross-shard-on-source.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-destination.json b/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-destination.json index 68b85aa5..d0552eec 100644 --- a/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-destination.json +++ b/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-destination.json @@ -31,4 +31,4 @@ ], "type": "normal", "operation": "ESDTTransfer" -} \ No newline at end of file +} diff --git a/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-source.json b/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-source.json index fea75b4f..a169607e 100644 --- a/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-source.json +++ b/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-source.json @@ -31,4 +31,4 @@ ], "type": "normal", "operation": "ESDTTransfer" -} \ No newline at end of file +} From d7c8bb2f61aaa5f54beae7dde9f5e5f5b9974b87 Mon Sep 17 00:00:00 2001 From: miiu Date: Wed, 5 Jun 2024 12:41:39 +0300 Subject: [PATCH 03/29] fix integration tests --- integrationtests/esdtTransfer_test.go | 4 ++-- .../esdt-transfer-cross-shard-on-destination.json | 2 +- .../esdtTransfer/esdt-transfer-cross-shard-on-source.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/integrationtests/esdtTransfer_test.go b/integrationtests/esdtTransfer_test.go index 45d7439e..3d3bb539 100644 --- a/integrationtests/esdtTransfer_test.go +++ b/integrationtests/esdtTransfer_test.go @@ -121,14 +121,14 @@ func TestESDTTransferCrossShardWithRefundOnSourceShard(t *testing.T) { esProc, err := CreateElasticProcessor(esClient) require.Nil(t, err) - txHash := []byte("esdtTransfer") + txHash := []byte("esdtTransferCross") header := &dataBlock.Header{ Round: 50, TimeStamp: 10101, ShardID: 2, } - scrHash1 := []byte("scrHash1ESDTTransfer") + scrHash1 := []byte("scrHash1ESDTTransferOnSourceShard") body := &dataBlock.Body{ MiniBlocks: dataBlock.MiniBlockSlice{ { diff --git a/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-destination.json b/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-destination.json index d0552eec..2e1bc23b 100644 --- a/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-destination.json +++ b/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-destination.json @@ -1,5 +1,5 @@ { - "miniBlockHash": "feb67ce20eb042980ca101852104348c7a36dcf9247c87d0aa6872ea177d61e9", + "miniBlockHash": "579fe2f60e8fa9c396254b2173282c6ecb6e736b42e015c3b744c86001be3981", "nonce": 1, "round": 55, "value": "0", diff --git a/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-source.json b/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-source.json index a169607e..df53964e 100644 --- a/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-source.json +++ b/integrationtests/testdata/esdtTransfer/esdt-transfer-cross-shard-on-source.json @@ -1,5 +1,5 @@ { - "miniBlockHash": "feb67ce20eb042980ca101852104348c7a36dcf9247c87d0aa6872ea177d61e9", + "miniBlockHash": "579fe2f60e8fa9c396254b2173282c6ecb6e736b42e015c3b744c86001be3981", "nonce": 1, "round": 50, "value": "0", From 6c5d2db020e52002eaf30eeeb40924aae4731797 Mon Sep 17 00:00:00 2001 From: miiu Date: Wed, 5 Jun 2024 14:40:08 +0300 Subject: [PATCH 04/29] extra integration test --- integrationtests/esdtTransfer_test.go | 99 +++++++++++++++++++ .../esdt-transfer-first-on-destination.json | 34 +++++++ .../esdt-transfer-second-on-source.json | 34 +++++++ process/elasticproc/transactions/serialize.go | 51 +++++++--- 4 files changed, 202 insertions(+), 16 deletions(-) create mode 100644 integrationtests/testdata/esdtTransfer/esdt-transfer-first-on-destination.json create mode 100644 integrationtests/testdata/esdtTransfer/esdt-transfer-second-on-source.json diff --git a/integrationtests/esdtTransfer_test.go b/integrationtests/esdtTransfer_test.go index 3d3bb539..584a0604 100644 --- a/integrationtests/esdtTransfer_test.go +++ b/integrationtests/esdtTransfer_test.go @@ -214,3 +214,102 @@ func TestESDTTransferCrossShardWithRefundOnSourceShard(t *testing.T) { require.JSONEq(t, readExpectedResult("./testdata/esdtTransfer/esdt-transfer-cross-shard-on-destination.json"), string(genericResponse.Docs[0].Source)) } + +func TestESDTTransferCrossShardIndexFirstOnDestinationAndAfterSource(t *testing.T) { + esClient, err := createESClient(esURL) + require.Nil(t, err) + + esProc, err := CreateElasticProcessor(esClient) + require.Nil(t, err) + + txHash := []byte("esdtTransferCross2") + header := &dataBlock.Header{ + Round: 55, + TimeStamp: 10102, + ShardID: 1, + } + + scrHash1 := []byte("scrHash1ESDTTransferOnSourceShard2") + body := &dataBlock.Body{ + MiniBlocks: dataBlock.MiniBlockSlice{ + { + Type: dataBlock.TxBlock, + SenderShardID: 2, + ReceiverShardID: 1, + TxHashes: [][]byte{txHash}, + }, + }, + } + + address1 := "erd1ef6470tjdtlgpa9f6g3ae4nsedmjg0gv6w73v32xtvhkfff993hq750xl9" + address2 := "erd13u7zyekzvdvzek8768r5gau9p6677ufppsjuklu9e6t7yx7rhg4s68e2ze" + + txESDT := outport.TxInfo{ + Transaction: &transaction.Transaction{ + Nonce: 1, + SndAddr: decodeAddress(address1), + RcvAddr: decodeAddress(address2), + GasLimit: 500_000, + GasPrice: 1000000000, + Data: []byte("ESDTTransfer@54474e2d383862383366@0a"), + Value: big.NewInt(0), + }, + FeeInfo: &outport.FeeInfo{ + GasUsed: 500_000, + Fee: big.NewInt(137660000000000), + InitialPaidFee: big.NewInt(137660000000000), + }, + } + + refundValueBig, _ := big.NewInt(0).SetString("1660000000000", 10) + scrRefund := &smartContractResult.SmartContractResult{ + Nonce: 20, + SndAddr: decodeAddress(address2), + RcvAddr: decodeAddress(address1), + PrevTxHash: txHash, + OriginalTxHash: txHash, + Value: refundValueBig, + Data: []byte("@6f6b"), + } + + pool := &outport.TransactionPool{ + Transactions: map[string]*outport.TxInfo{ + hex.EncodeToString(txHash): &txESDT, + }, + SmartContractResults: map[string]*outport.SCRInfo{ + hex.EncodeToString(scrHash1): {SmartContractResult: scrRefund, FeeInfo: &outport.FeeInfo{}}, + }, + } + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + + ids := []string{hex.EncodeToString(txHash)} + genericResponse := &GenericResponse{} + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.OperationsIndex, true, genericResponse) + require.Nil(t, err) + require.JSONEq(t, readExpectedResult("./testdata/esdtTransfer/esdt-transfer-first-on-destination.json"), string(genericResponse.Docs[0].Source)) + + txESDT.FeeInfo = &outport.FeeInfo{ + GasUsed: 334_000, + Fee: big.NewInt(136000000000000), + InitialPaidFee: big.NewInt(137660000000000), + } + header = &dataBlock.Header{ + Round: 50, + TimeStamp: 10101, + ShardID: 2, + } + body.MiniBlocks = append(body.MiniBlocks, &dataBlock.MiniBlock{ + Type: dataBlock.SmartContractResultBlock, + SenderShardID: 2, + ReceiverShardID: 2, + TxHashes: [][]byte{scrHash1}, + }) + + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.OperationsIndex, true, genericResponse) + require.Nil(t, err) + require.JSONEq(t, readExpectedResult("./testdata/esdtTransfer/esdt-transfer-second-on-source.json"), string(genericResponse.Docs[0].Source)) +} diff --git a/integrationtests/testdata/esdtTransfer/esdt-transfer-first-on-destination.json b/integrationtests/testdata/esdtTransfer/esdt-transfer-first-on-destination.json new file mode 100644 index 00000000..1b0f46b7 --- /dev/null +++ b/integrationtests/testdata/esdtTransfer/esdt-transfer-first-on-destination.json @@ -0,0 +1,34 @@ +{ + "data": "RVNEVFRyYW5zZmVyQDU0NDc0ZTJkMzgzODYyMzgzMzY2QDBh", + "signature": "", + "fee": "137660000000000", + "esdtValues": [ + "10" + ], + "initialPaidFee": "137660000000000", + "type": "normal", + "gasLimit": 500000, + "esdtValuesNum": [ + 1e-17 + ], + "gasUsed": 500000, + "miniBlockHash": "d0f273198e773465908be139872605d93e86115b6320f9b34edb6a5e38668989", + "senderShard": 2, + "tokens": [ + "TGN-88b83f" + ], + "value": "0", + "gasPrice": 1000000000, + "timestamp": 10102, + "receiver": "erd13u7zyekzvdvzek8768r5gau9p6677ufppsjuklu9e6t7yx7rhg4s68e2ze", + "valueNum": 0, + "feeNum": 0.00013766, + "nonce": 1, + "round": 55, + "hasScResults": true, + "sender": "erd1ef6470tjdtlgpa9f6g3ae4nsedmjg0gv6w73v32xtvhkfff993hq750xl9", + "receiverShard": 1, + "operation": "ESDTTransfer", + "status": "success", + "searchOrder": 0 +} diff --git a/integrationtests/testdata/esdtTransfer/esdt-transfer-second-on-source.json b/integrationtests/testdata/esdtTransfer/esdt-transfer-second-on-source.json new file mode 100644 index 00000000..eccaa6ba --- /dev/null +++ b/integrationtests/testdata/esdtTransfer/esdt-transfer-second-on-source.json @@ -0,0 +1,34 @@ +{ + "data": "RVNEVFRyYW5zZmVyQDU0NDc0ZTJkMzgzODYyMzgzMzY2QDBh", + "signature": "", + "fee": "136000000000000", + "esdtValues": [ + "10" + ], + "initialPaidFee": "137660000000000", + "type": "normal", + "gasLimit": 500000, + "esdtValuesNum": [ + 1e-17 + ], + "gasUsed": 334000, + "miniBlockHash": "d0f273198e773465908be139872605d93e86115b6320f9b34edb6a5e38668989", + "senderShard": 2, + "tokens": [ + "TGN-88b83f" + ], + "value": "0", + "gasPrice": 1000000000, + "timestamp": 10102, + "receiver": "erd13u7zyekzvdvzek8768r5gau9p6677ufppsjuklu9e6t7yx7rhg4s68e2ze", + "valueNum": 0, + "feeNum": 0.000136, + "nonce": 1, + "round": 55, + "hasScResults": true, + "sender": "erd1ef6470tjdtlgpa9f6g3ae4nsedmjg0gv6w73v32xtvhkfff993hq750xl9", + "receiverShard": 1, + "operation": "ESDTTransfer", + "status": "success", + "searchOrder": 0 +} diff --git a/process/elasticproc/transactions/serialize.go b/process/elasticproc/transactions/serialize.go index 90df7c84..0c3a8803 100644 --- a/process/elasticproc/transactions/serialize.go +++ b/process/elasticproc/transactions/serialize.go @@ -159,10 +159,23 @@ func prepareSerializedDataForATransaction( } if isCrossShardOnSourceShard(tx, selfShardID) { - // if transaction is cross-shard and current shard ID is source, use upsert without updating anything - serializedData := - []byte(fmt.Sprintf(`{"script":{"source":"return"},"upsert":%s}`, - string(marshaledTx))) + if isSimpleESDTTransfer(tx) { + codeToExecute := ` + if ('create' == ctx.op) { + ctx._source = params.tx; + } else { + ctx._source.gasUsed = params.tx.gasUsed; + ctx._source.fee = params.tx.fee; + ctx._source.feeNum = params.tx.feeNum; + } + ` + serializedData := []byte(fmt.Sprintf(`{"scripted_upsert": true, "script":{"source":"%s","lang": "painless","params":{"tx": %s}},"upsert":{}}`, + converters.FormatPainlessSource(codeToExecute), string(marshaledTx))) + + return metaData, serializedData, nil + } + + serializedData := []byte(fmt.Sprintf(`{"script":{"source":"return"},"upsert":%s}`, string(marshaledTx))) return metaData, serializedData, nil } @@ -177,7 +190,17 @@ func prepareSerializedDataForATransaction( } if isSimpleESDTTransferCrossShardOnDestination(tx, selfShardID) { - codeToExecute := ` + return metaData, prepareSerializedDataForESDTTransferOnDestination(marshaledTx), nil + } + + // transaction is intra-shard, invalid or cross-shard destination me + meta := []byte(fmt.Sprintf(`{ "index" : { "_index":"%s", "_id" : "%s" } }%s`, index, converters.JsonEscape(tx.Hash), "\n")) + + return meta, marshaledTx, nil +} + +func prepareSerializedDataForESDTTransferOnDestination(marshaledTx []byte) []byte { + codeToExecute := ` if ('create' == ctx.op) { ctx._source = params.tx; } else { @@ -190,15 +213,8 @@ func prepareSerializedDataForATransaction( ctx._source.feeNum = feeNum; } ` - serializedData := []byte(fmt.Sprintf(`{"scripted_upsert": true, "script":{"source":"%s","lang": "painless","params":{"tx": %s}},"upsert":{}}`, - converters.FormatPainlessSource(codeToExecute), string(marshaledTx))) - return metaData, serializedData, nil - } - - // transaction is intra-shard, invalid or cross-shard destination me - meta := []byte(fmt.Sprintf(`{ "index" : { "_index":"%s", "_id" : "%s" } }%s`, index, converters.JsonEscape(tx.Hash), "\n")) - - return meta, marshaledTx, nil + return []byte(fmt.Sprintf(`{"scripted_upsert": true, "script":{"source":"%s","lang": "painless","params":{"tx": %s}},"upsert":{}}`, + converters.FormatPainlessSource(codeToExecute), string(marshaledTx))) } func prepareNFTESDTTransferOrMultiESDTTransfer(marshaledTx []byte) ([]byte, error) { @@ -242,8 +258,11 @@ func isNFTTransferOrMultiTransfer(tx *data.Transaction) bool { } func isSimpleESDTTransferCrossShardOnDestination(tx *data.Transaction, selfShard uint32) bool { - isSimpleESDT := tx.Operation == core.BuiltInFunctionESDTTransfer && tx.Function == "" isCrossOnDestination := tx.SenderShard != tx.ReceiverShard && tx.ReceiverShard == selfShard - return isSimpleESDT && isCrossOnDestination + return isSimpleESDTTransfer(tx) && isCrossOnDestination +} + +func isSimpleESDTTransfer(tx *data.Transaction) bool { + return tx.Operation == core.BuiltInFunctionESDTTransfer && tx.Function == "" } From eeeeebfb5346b32b3e7d1d0e30a18a7b673d90a1 Mon Sep 17 00:00:00 2001 From: miiu Date: Thu, 13 Jun 2024 13:10:14 +0300 Subject: [PATCH 05/29] esdt improvements integration --- data/tokens.go | 1 + .../issueTokenAndChangeType_test.go | 96 +++++++++++++++++++ .../token-with-new-type.json | 29 ++++++ .../issueTokenAndChangeType/token.json | 28 ++++++ .../logsevents/esdtIssueProcessor.go | 38 +++++--- process/elasticproc/logsevents/serialize.go | 20 ++++ 6 files changed, 198 insertions(+), 14 deletions(-) create mode 100644 integrationtests/issueTokenAndChangeType_test.go create mode 100644 integrationtests/testdata/issueTokenAndChangeType/token-with-new-type.json create mode 100644 integrationtests/testdata/issueTokenAndChangeType/token.json diff --git a/data/tokens.go b/data/tokens.go index 4018c6ea..93d8071c 100644 --- a/data/tokens.go +++ b/data/tokens.go @@ -51,6 +51,7 @@ type TokenInfo struct { Data *TokenMetaData `json:"data,omitempty"` OwnersHistory []*OwnerData `json:"ownersHistory,omitempty"` TransferOwnership bool `json:"-"` + ChangeToDynamic bool `json:"-"` Properties *TokenProperties `json:"properties,omitempty"` } diff --git a/integrationtests/issueTokenAndChangeType_test.go b/integrationtests/issueTokenAndChangeType_test.go new file mode 100644 index 00000000..85314a83 --- /dev/null +++ b/integrationtests/issueTokenAndChangeType_test.go @@ -0,0 +1,96 @@ +//go:build integrationtests + +package integrationtests + +import ( + "context" + "encoding/hex" + "math/big" + "testing" + + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/data/alteredAccount" + dataBlock "github.com/multiversx/mx-chain-core-go/data/block" + "github.com/multiversx/mx-chain-core-go/data/outport" + "github.com/multiversx/mx-chain-core-go/data/transaction" + indexerdata "github.com/multiversx/mx-chain-es-indexer-go/process/dataindexer" + "github.com/stretchr/testify/require" +) + +func TestIssueTokenAndChangeToDynamic(t *testing.T) { + setLogLevelDebug() + + esClient, err := createESClient(esURL) + require.Nil(t, err) + + esProc, err := CreateElasticProcessor(esClient) + require.Nil(t, err) + + body := &dataBlock.Body{} + header := &dataBlock.Header{ + Round: 50, + TimeStamp: 5040, + ShardID: core.MetachainShardId, + } + + address1 := "erd1k04pxr6c0gvlcx4rd5fje0a4uy33axqxwz0fpcrgtfdy3nrqauqqgvxprv" + pool := &outport.TransactionPool{ + Logs: []*outport.LogData{ + { + TxHash: hex.EncodeToString([]byte("h1")), + Log: &transaction.Log{ + Address: decodeAddress(address1), + Events: []*transaction.Event{ + { + Address: decodeAddress(address1), + Identifier: []byte("issueSemiFungible"), + Topics: [][]byte{[]byte("NON-abcd"), []byte("semi-token"), []byte("SEMI"), []byte(core.SemiFungibleESDT)}, + }, + { + Address: decodeAddress(address1), + Identifier: []byte("upgradeProperties"), + Topics: [][]byte{[]byte("NON-abcd"), big.NewInt(0).Bytes(), []byte("canUpgrade"), []byte("true")}, + }, + nil, + }, + }, + }, + }, + } + + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, map[string]*alteredAccount.AlteredAccount{}, testNumOfShards)) + require.Nil(t, err) + + ids := []string{"NON-abcd"} + genericResponse := &GenericResponse{} + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TokensIndex, true, genericResponse) + require.Nil(t, err) + require.JSONEq(t, readExpectedResult("./testdata/issueTokenAndChangeType/token.json"), string(genericResponse.Docs[0].Source)) + + header.TimeStamp = 10_000 + pool = &outport.TransactionPool{ + Logs: []*outport.LogData{ + { + TxHash: hex.EncodeToString([]byte("h1")), + Log: &transaction.Log{ + Address: decodeAddress(address1), + Events: []*transaction.Event{ + { + Address: decodeAddress(address1), + Identifier: []byte("changeToDynamic"), + Topics: [][]byte{[]byte("NON-abcd"), []byte("semi-token"), []byte("SEMI"), []byte(core.DynamicSFTESDT)}, + }, + nil, + }, + }, + }, + }, + } + + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, map[string]*alteredAccount.AlteredAccount{}, testNumOfShards)) + require.Nil(t, err) + + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TokensIndex, true, genericResponse) + require.Nil(t, err) + require.JSONEq(t, readExpectedResult("./testdata/issueTokenAndChangeType/token-with-new-type.json"), string(genericResponse.Docs[0].Source)) +} diff --git a/integrationtests/testdata/issueTokenAndChangeType/token-with-new-type.json b/integrationtests/testdata/issueTokenAndChangeType/token-with-new-type.json new file mode 100644 index 00000000..bd25ec8e --- /dev/null +++ b/integrationtests/testdata/issueTokenAndChangeType/token-with-new-type.json @@ -0,0 +1,29 @@ +{ + "name": "semi-token", + "ticker": "SEMI", + "token": "NON-abcd", + "issuer": "erd1k04pxr6c0gvlcx4rd5fje0a4uy33axqxwz0fpcrgtfdy3nrqauqqgvxprv", + "currentOwner": "erd1k04pxr6c0gvlcx4rd5fje0a4uy33axqxwz0fpcrgtfdy3nrqauqqgvxprv", + "numDecimals": 0, + "type": "DynamicSemiFungibleESDT", + "timestamp": 5040, + "ownersHistory": [ + { + "address": "erd1k04pxr6c0gvlcx4rd5fje0a4uy33axqxwz0fpcrgtfdy3nrqauqqgvxprv", + "timestamp": 5040 + } + ], + "properties": { + "canMint": false, + "canBurn": false, + "canUpgrade": true, + "canTransferNFTCreateRole": false, + "canAddSpecialRoles": false, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canChangeOwner": false, + "canCreateMultiShard": false + }, + "changedToDynamicTimestamp": 10000 +} diff --git a/integrationtests/testdata/issueTokenAndChangeType/token.json b/integrationtests/testdata/issueTokenAndChangeType/token.json new file mode 100644 index 00000000..912b53bf --- /dev/null +++ b/integrationtests/testdata/issueTokenAndChangeType/token.json @@ -0,0 +1,28 @@ +{ + "name": "semi-token", + "ticker": "SEMI", + "token": "NON-abcd", + "issuer": "erd1k04pxr6c0gvlcx4rd5fje0a4uy33axqxwz0fpcrgtfdy3nrqauqqgvxprv", + "currentOwner": "erd1k04pxr6c0gvlcx4rd5fje0a4uy33axqxwz0fpcrgtfdy3nrqauqqgvxprv", + "numDecimals": 0, + "type": "SemiFungibleESDT", + "timestamp": 5040, + "ownersHistory": [ + { + "address": "erd1k04pxr6c0gvlcx4rd5fje0a4uy33axqxwz0fpcrgtfdy3nrqauqqgvxprv", + "timestamp": 5040 + } + ], + "properties": { + "canMint": false, + "canBurn": false, + "canUpgrade": true, + "canTransferNFTCreateRole": false, + "canAddSpecialRoles": false, + "canPause": false, + "canFreeze": false, + "canWipe": false, + "canChangeOwner": false, + "canCreateMultiShard": false + } +} diff --git a/process/elasticproc/logsevents/esdtIssueProcessor.go b/process/elasticproc/logsevents/esdtIssueProcessor.go index 2af66180..6f5c9fa3 100644 --- a/process/elasticproc/logsevents/esdtIssueProcessor.go +++ b/process/elasticproc/logsevents/esdtIssueProcessor.go @@ -11,13 +11,16 @@ import ( const ( numIssueLogTopics = 4 - issueFungibleESDTFunc = "issue" - issueSemiFungibleESDTFunc = "issueSemiFungible" - issueNonFungibleESDTFunc = "issueNonFungible" - registerMetaESDTFunc = "registerMetaESDT" - changeSFTToMetaESDTFunc = "changeSFTToMetaESDT" - transferOwnershipFunc = "transferOwnership" - registerAndSetRolesFunc = "registerAndSetAllRoles" + issueFungibleESDTFunc = "issue" + issueSemiFungibleESDTFunc = "issueSemiFungible" + issueNonFungibleESDTFunc = "issueNonFungible" + registerMetaESDTFunc = "registerMetaESDT" + changeSFTToMetaESDTFunc = "changeSFTToMetaESDT" + changeToDynamicESDTFunc = "changeToDynamic" + transferOwnershipFunc = "transferOwnership" + registerAndSetRolesFunc = "registerAndSetAllRoles" + registerDynamicFunc = "registerDynamic" + registerAndSetRolesDynamicFunc = "registerAndSetAllRolesDynamic" ) type esdtIssueProcessor struct { @@ -29,13 +32,16 @@ func newESDTIssueProcessor(pubkeyConverter core.PubkeyConverter) *esdtIssueProce return &esdtIssueProcessor{ pubkeyConverter: pubkeyConverter, issueOperationsIdentifiers: map[string]struct{}{ - issueFungibleESDTFunc: {}, - issueSemiFungibleESDTFunc: {}, - issueNonFungibleESDTFunc: {}, - registerMetaESDTFunc: {}, - changeSFTToMetaESDTFunc: {}, - transferOwnershipFunc: {}, - registerAndSetRolesFunc: {}, + issueFungibleESDTFunc: {}, + issueSemiFungibleESDTFunc: {}, + issueNonFungibleESDTFunc: {}, + registerMetaESDTFunc: {}, + changeSFTToMetaESDTFunc: {}, + transferOwnershipFunc: {}, + registerAndSetRolesFunc: {}, + registerDynamicFunc: {}, + registerAndSetRolesDynamicFunc: {}, + changeToDynamicESDTFunc: {}, }, } } @@ -95,6 +101,10 @@ func (eip *esdtIssueProcessor) processEvent(args *argsProcessEvent) argOutputPro Properties: &data.TokenProperties{}, } + if identifierStr == changeToDynamicESDTFunc { + tokenInfo.ChangeToDynamic = true + } + if identifierStr == transferOwnershipFunc && len(topics) >= numIssueLogTopics+1 { newOwner := eip.pubkeyConverter.SilentEncode(topics[4], log) tokenInfo.TransferOwnership = true diff --git a/process/elasticproc/logsevents/serialize.go b/process/elasticproc/logsevents/serialize.go index a96a125a..22508c3c 100644 --- a/process/elasticproc/logsevents/serialize.go +++ b/process/elasticproc/logsevents/serialize.go @@ -202,6 +202,9 @@ func serializeToken(tokenData *data.TokenInfo, index string) ([]byte, []byte, er if tokenData.TransferOwnership { return serializeTokenTransferOwnership(tokenData, index) } + if tokenData.ChangeToDynamic { + return serializeTokenChangeType(tokenData, index) + } meta := []byte(fmt.Sprintf(`{ "update" : { "_index":"%s", "_id" : "%s" } }%s`, index, converters.JsonEscape(tokenData.Token), "\n")) serializedTokenData, err := json.Marshal(tokenData) @@ -226,6 +229,23 @@ func serializeToken(tokenData *data.TokenInfo, index string) ([]byte, []byte, er return meta, []byte(serializedDataStr), nil } +func serializeTokenChangeType(tokenData *data.TokenInfo, index string) ([]byte, []byte, error) { + meta := []byte(fmt.Sprintf(`{ "update" : { "_index":"%s", "_id" : "%s" } }%s`, index, converters.JsonEscape(tokenData.Token), "\n")) + + codeToExecute := ` + ctx._source.type = params.type; + ctx._source.changedToDynamicTimestamp = params.timestamp; +` + serializedDataStr := fmt.Sprintf(`{"script": {`+ + `"source": "%s",`+ + `"lang": "painless",`+ + `"params": {"type": "%s", "timestamp": %d }},`+ + `"upsert": {}}`, + converters.FormatPainlessSource(codeToExecute), tokenData.Type, tokenData.Timestamp) + + return meta, []byte(serializedDataStr), nil +} + func serializeTokenTransferOwnership(tokenData *data.TokenInfo, index string) ([]byte, []byte, error) { meta := []byte(fmt.Sprintf(`{ "update" : { "_index":"%s", "_id" : "%s" } }%s`, index, converters.JsonEscape(tokenData.Token), "\n")) tokenDataSerialized, err := json.Marshal(tokenData) From e6d3af5689b66137c0f0bb1b3e054f383eab34ec Mon Sep 17 00:00:00 2001 From: miiu Date: Thu, 13 Jun 2024 13:42:11 +0300 Subject: [PATCH 06/29] fix integration tests --- integrationtests/issueTokenAndChangeType_test.go | 8 ++++---- .../issueTokenAndChangeType/token-with-new-type.json | 2 +- .../testdata/issueTokenAndChangeType/token.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/integrationtests/issueTokenAndChangeType_test.go b/integrationtests/issueTokenAndChangeType_test.go index 85314a83..a368634b 100644 --- a/integrationtests/issueTokenAndChangeType_test.go +++ b/integrationtests/issueTokenAndChangeType_test.go @@ -44,12 +44,12 @@ func TestIssueTokenAndChangeToDynamic(t *testing.T) { { Address: decodeAddress(address1), Identifier: []byte("issueSemiFungible"), - Topics: [][]byte{[]byte("NON-abcd"), []byte("semi-token"), []byte("SEMI"), []byte(core.SemiFungibleESDT)}, + Topics: [][]byte{[]byte("CON-abcd"), []byte("semi-token"), []byte("SEMI"), []byte(core.SemiFungibleESDT)}, }, { Address: decodeAddress(address1), Identifier: []byte("upgradeProperties"), - Topics: [][]byte{[]byte("NON-abcd"), big.NewInt(0).Bytes(), []byte("canUpgrade"), []byte("true")}, + Topics: [][]byte{[]byte("CON-abcd"), big.NewInt(0).Bytes(), []byte("canUpgrade"), []byte("true")}, }, nil, }, @@ -61,7 +61,7 @@ func TestIssueTokenAndChangeToDynamic(t *testing.T) { err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, map[string]*alteredAccount.AlteredAccount{}, testNumOfShards)) require.Nil(t, err) - ids := []string{"NON-abcd"} + ids := []string{"CON-abcd"} genericResponse := &GenericResponse{} err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TokensIndex, true, genericResponse) require.Nil(t, err) @@ -78,7 +78,7 @@ func TestIssueTokenAndChangeToDynamic(t *testing.T) { { Address: decodeAddress(address1), Identifier: []byte("changeToDynamic"), - Topics: [][]byte{[]byte("NON-abcd"), []byte("semi-token"), []byte("SEMI"), []byte(core.DynamicSFTESDT)}, + Topics: [][]byte{[]byte("CON-abcd"), []byte("semi-token"), []byte("SEMI"), []byte(core.DynamicSFTESDT)}, }, nil, }, diff --git a/integrationtests/testdata/issueTokenAndChangeType/token-with-new-type.json b/integrationtests/testdata/issueTokenAndChangeType/token-with-new-type.json index bd25ec8e..8f19fc4b 100644 --- a/integrationtests/testdata/issueTokenAndChangeType/token-with-new-type.json +++ b/integrationtests/testdata/issueTokenAndChangeType/token-with-new-type.json @@ -1,7 +1,7 @@ { "name": "semi-token", "ticker": "SEMI", - "token": "NON-abcd", + "token": "CON-abcd", "issuer": "erd1k04pxr6c0gvlcx4rd5fje0a4uy33axqxwz0fpcrgtfdy3nrqauqqgvxprv", "currentOwner": "erd1k04pxr6c0gvlcx4rd5fje0a4uy33axqxwz0fpcrgtfdy3nrqauqqgvxprv", "numDecimals": 0, diff --git a/integrationtests/testdata/issueTokenAndChangeType/token.json b/integrationtests/testdata/issueTokenAndChangeType/token.json index 912b53bf..8b33340d 100644 --- a/integrationtests/testdata/issueTokenAndChangeType/token.json +++ b/integrationtests/testdata/issueTokenAndChangeType/token.json @@ -1,7 +1,7 @@ { "name": "semi-token", "ticker": "SEMI", - "token": "NON-abcd", + "token": "CON-abcd", "issuer": "erd1k04pxr6c0gvlcx4rd5fje0a4uy33axqxwz0fpcrgtfdy3nrqauqqgvxprv", "currentOwner": "erd1k04pxr6c0gvlcx4rd5fje0a4uy33axqxwz0fpcrgtfdy3nrqauqqgvxprv", "numDecimals": 0, From 53fb5cd3646c57a2d882bcbca7931bb092f0871e Mon Sep 17 00:00:00 2001 From: miiu Date: Thu, 13 Jun 2024 14:45:49 +0300 Subject: [PATCH 07/29] fixes --- integrationtests/utils.go | 3 ++- templates/noKibana/esdts.go | 4 ++++ templates/noKibana/tokens.go | 4 ++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/integrationtests/utils.go b/integrationtests/utils.go index 27f07c23..5fe2aaf8 100644 --- a/integrationtests/utils.go +++ b/integrationtests/utils.go @@ -3,6 +3,7 @@ package integrationtests import ( "encoding/json" "fmt" + "io" "io/ioutil" "net/http" "net/url" @@ -68,7 +69,7 @@ func CreateElasticProcessor( // nolint func readExpectedResult(path string) string { jsonFile, _ := os.Open(path) - byteValue, _ := ioutil.ReadAll(jsonFile) + byteValue, _ := io.ReadAll(jsonFile) return string(byteValue) } diff --git a/templates/noKibana/esdts.go b/templates/noKibana/esdts.go index 072d215a..75d0bfa5 100644 --- a/templates/noKibana/esdts.go +++ b/templates/noKibana/esdts.go @@ -36,6 +36,10 @@ var ESDTs = Object{ "type": "date", "format": "epoch_second", }, + "changedToDynamicTimestamp": Object{ + "type": "date", + "format": "epoch_second", + }, "ownersHistory": Object{ "type": "nested", "properties": Object{ diff --git a/templates/noKibana/tokens.go b/templates/noKibana/tokens.go index f528f0bd..0035de16 100644 --- a/templates/noKibana/tokens.go +++ b/templates/noKibana/tokens.go @@ -161,6 +161,10 @@ var Tokens = Object{ "type": "date", "format": "epoch_second", }, + "changedToDynamicTimestamp": Object{ + "type": "date", + "format": "epoch_second", + }, "token": Object{ "type": "text", }, From b21ce8299fbb5151bc5965a76dded032b465ddf9 Mon Sep 17 00:00:00 2001 From: miiu Date: Thu, 13 Jun 2024 15:01:43 +0300 Subject: [PATCH 08/29] fixes --- integrationtests/testdata/mappings/esdts.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/integrationtests/testdata/mappings/esdts.json b/integrationtests/testdata/mappings/esdts.json index bcdaec16..da8bc0bd 100644 --- a/integrationtests/testdata/mappings/esdts.json +++ b/integrationtests/testdata/mappings/esdts.json @@ -110,6 +110,10 @@ "type": "date", "format": "epoch_second" }, + "changedToDynamicTimestamp": { + "type": "date", + "format": "epoch_second" + }, "token": { "type": "text" }, From 9588363d8845972dbe54c11a98cf7f90f957e602 Mon Sep 17 00:00:00 2001 From: miiu Date: Mon, 17 Jun 2024 14:42:56 +0300 Subject: [PATCH 09/29] MetaData recreate --- data/tokens.go | 1 + .../updateNFT/token-after-recreate.json | 16 ++++ .../updateNFT/token-before-recreate.json | 16 ++++ integrationtests/updateNFT_test.go | 88 +++++++++++++++++++ .../elasticproc/converters/tokenMetaData.go | 23 +++++ .../logsevents/logsAndEventsProcessor.go | 2 +- .../elasticproc/logsevents/nftsProcessor.go | 6 +- .../logsevents/nftsPropertiesProcessor.go | 24 ++++- .../nftsPropertiesProcessor_test.go | 36 +++++++- 9 files changed, 204 insertions(+), 8 deletions(-) create mode 100644 integrationtests/testdata/updateNFT/token-after-recreate.json create mode 100644 integrationtests/testdata/updateNFT/token-before-recreate.json diff --git a/data/tokens.go b/data/tokens.go index 93d8071c..c40bc369 100644 --- a/data/tokens.go +++ b/data/tokens.go @@ -16,6 +16,7 @@ type NFTDataUpdate struct { UnFreeze bool Pause bool UnPause bool + NewMetaData *TokenMetaData } // ResponseTokens is the structure for the tokens response diff --git a/integrationtests/testdata/updateNFT/token-after-recreate.json b/integrationtests/testdata/updateNFT/token-after-recreate.json new file mode 100644 index 00000000..3b2385f6 --- /dev/null +++ b/integrationtests/testdata/updateNFT/token-after-recreate.json @@ -0,0 +1,16 @@ +{ + "identifier": "NEW-abcd-64", + "token": "NEW-abcd", + "numDecimals": 0, + "nonce": 100, + "timestamp": 5040, + "data": { + "uris": [ + "dXJp" + ], + "whiteListedStorage": false, + "name": "token", + "nonEmptyURIs": true, + "hash": "aGFzaA==" + } +} diff --git a/integrationtests/testdata/updateNFT/token-before-recreate.json b/integrationtests/testdata/updateNFT/token-before-recreate.json new file mode 100644 index 00000000..8abec9d2 --- /dev/null +++ b/integrationtests/testdata/updateNFT/token-before-recreate.json @@ -0,0 +1,16 @@ +{ + "identifier": "NEW-abcd-64", + "token": "NEW-abcd", + "numDecimals": 0, + "nonce": 100, + "timestamp": 5040, + "data": { + "name": "token-token-token", + "uris": [ + "dXJp", + "dXJp" + ], + "nonEmptyURIs": true, + "whiteListedStorage": false + } +} diff --git a/integrationtests/updateNFT_test.go b/integrationtests/updateNFT_test.go index 723fddfc..37243baf 100644 --- a/integrationtests/updateNFT_test.go +++ b/integrationtests/updateNFT_test.go @@ -226,3 +226,91 @@ func TestNFTUpdateMetadata(t *testing.T) { require.Nil(t, err) require.JSONEq(t, readExpectedResult("./testdata/updateNFT/token-after-un-freeze.json"), string(genericResponse.Docs[0].Source)) } + +func TestCreateNFTAndMetaDataRecreate(t *testing.T) { + setLogLevelDebug() + + esClient, err := createESClient(esURL) + require.Nil(t, err) + + esdtCreateData := &esdt.ESDigitalToken{ + TokenMetaData: &esdt.MetaData{ + Name: []byte("token-token-token"), + URIs: [][]byte{[]byte("uri"), []byte("uri")}, + }, + } + marshalizedCreate, _ := json.Marshal(esdtCreateData) + + esProc, err := CreateElasticProcessor(esClient) + require.Nil(t, err) + + header := &dataBlock.Header{ + Round: 50, + TimeStamp: 5040, + ShardID: 1, + } + body := &dataBlock.Body{} + + // CREATE NFT data + address := "erd1w7jyzuj6cv4ngw8luhlkakatjpmjh3ql95lmxphd3vssc4vpymks6k5th7" + pool := &outport.TransactionPool{ + Logs: []*outport.LogData{ + { + TxHash: hex.EncodeToString([]byte("h1")), + Log: &transaction.Log{ + Events: []*transaction.Event{ + { + Address: decodeAddress(address), + Identifier: []byte(core.BuiltInFunctionESDTNFTCreate), + Topics: [][]byte{[]byte("NEW-abcd"), big.NewInt(100).Bytes(), big.NewInt(1).Bytes(), marshalizedCreate}, + }, + nil, + }, + }, + }, + }, + } + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + + ids := []string{"NEW-abcd-64"} + genericResponse := &GenericResponse{} + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TokensIndex, true, genericResponse) + require.Nil(t, err) + require.JSONEq(t, readExpectedResult("./testdata/updateNFT/token-before-recreate.json"), string(genericResponse.Docs[0].Source)) + + // RECREATE + reCreate := &esdt.ESDigitalToken{ + TokenMetaData: &esdt.MetaData{ + Name: []byte("token"), + URIs: [][]byte{[]byte("uri")}, + Hash: []byte("hash"), + }, + } + marshalizedReCreate, _ := json.Marshal(reCreate) + + pool = &outport.TransactionPool{ + Logs: []*outport.LogData{ + { + TxHash: hex.EncodeToString([]byte("h1")), + Log: &transaction.Log{ + Events: []*transaction.Event{ + { + Address: decodeAddress(address), + Identifier: []byte(core.ESDTMetaDataRecreate), + Topics: [][]byte{[]byte("NEW-abcd"), big.NewInt(100).Bytes(), big.NewInt(1).Bytes(), marshalizedReCreate}, + }, + nil, + }, + }, + }, + }, + } + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + + genericResponse = &GenericResponse{} + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TokensIndex, true, genericResponse) + require.Nil(t, err) + require.JSONEq(t, readExpectedResult("./testdata/updateNFT/token-after-recreate.json"), string(genericResponse.Docs[0].Source)) +} diff --git a/process/elasticproc/converters/tokenMetaData.go b/process/elasticproc/converters/tokenMetaData.go index 09f5f845..c99541d3 100644 --- a/process/elasticproc/converters/tokenMetaData.go +++ b/process/elasticproc/converters/tokenMetaData.go @@ -89,6 +89,13 @@ func PrepareNFTUpdateData(buffSlice *data.BufferSlice, updateNFTData []*data.NFT if pauseOrUnPauseTokenIndex { return buffSlice.PutData(metaData, prepareSerializedDataForPauseAndUnPause(nftUpdate)) } + if nftUpdate.NewMetaData != nil { + serializedData, err := prepareSerializedDataFromMetaDataRecreate(nftUpdate) + if err != nil { + return err + } + return buffSlice.PutData(metaData, serializedData) + } truncatedAttributes := TruncateFieldIfExceedsMaxLengthBase64(string(nftUpdate.NewAttributes)) base64Attr := base64.StdEncoding.EncodeToString([]byte(truncatedAttributes)) @@ -190,3 +197,19 @@ func prepareSerializedDataForPauseAndUnPause(nftUpdateData *data.NFTDataUpdate) return serializedData } + +func prepareSerializedDataFromMetaDataRecreate(nftUpdateData *data.NFTDataUpdate) ([]byte, error) { + tokenMetaDataBytes, err := json.Marshal(nftUpdateData.NewMetaData) + if err != nil { + return nil, err + } + + codeToExecute := ` + ctx._source.data = params.metaData +` + serializedData := []byte(fmt.Sprintf(`{"script": {"source": "%s","lang": "painless","params": {"metaData": %s}}, "upsert": {}}`, + FormatPainlessSource(codeToExecute), tokenMetaDataBytes), + ) + + return serializedData, nil +} diff --git a/process/elasticproc/logsevents/logsAndEventsProcessor.go b/process/elasticproc/logsevents/logsAndEventsProcessor.go index d3076699..b80e6714 100644 --- a/process/elasticproc/logsevents/logsAndEventsProcessor.go +++ b/process/elasticproc/logsevents/logsAndEventsProcessor.go @@ -69,7 +69,7 @@ func createEventsProcessors(args ArgsLogsAndEventsProcessor) []eventsProcessor { nftsProc := newNFTsProcessor(args.PubKeyConverter, args.Marshalizer) scDeploysProc := newSCDeploysProcessor(args.PubKeyConverter) informativeProc := newInformativeLogsProcessor() - updateNFTProc := newNFTsPropertiesProcessor(args.PubKeyConverter) + updateNFTProc := newNFTsPropertiesProcessor(args.PubKeyConverter, args.Marshalizer) esdtPropProc := newEsdtPropertiesProcessor(args.PubKeyConverter) esdtIssueProc := newESDTIssueProcessor(args.PubKeyConverter) delegatorsProcessor := newDelegatorsProcessor(args.PubKeyConverter, args.BalanceConverter) diff --git a/process/elasticproc/logsevents/nftsProcessor.go b/process/elasticproc/logsevents/nftsProcessor.go index 95716f15..4189f964 100644 --- a/process/elasticproc/logsevents/nftsProcessor.go +++ b/process/elasticproc/logsevents/nftsProcessor.go @@ -144,7 +144,7 @@ func (np *nftsProcessor) processNFTEventOnSender( return } - tokenMetaData := converters.PrepareTokenMetaData(np.convertMetaData(esdtToken.TokenMetaData)) + tokenMetaData := converters.PrepareTokenMetaData(convertMetaData(np.pubKeyConverter, esdtToken.TokenMetaData)) tokensCreateInfo.Add(&data.TokenInfo{ Token: token, Identifier: converters.ComputeTokenIdentifier(token, nonceBig.Uint64()), @@ -154,11 +154,11 @@ func (np *nftsProcessor) processNFTEventOnSender( }) } -func (np *nftsProcessor) convertMetaData(metaData *esdt.MetaData) *alteredAccount.TokenMetaData { +func convertMetaData(pubKeyConverter core.PubkeyConverter, metaData *esdt.MetaData) *alteredAccount.TokenMetaData { if metaData == nil { return nil } - encodedCreatorAddr, err := np.pubKeyConverter.Encode(metaData.Creator) + encodedCreatorAddr, err := pubKeyConverter.Encode(metaData.Creator) if err != nil { log.Warn("nftsProcessor.convertMetaData", "cannot encode creator address", "error", err, "address", metaData.Creator) } diff --git a/process/elasticproc/logsevents/nftsPropertiesProcessor.go b/process/elasticproc/logsevents/nftsPropertiesProcessor.go index 990e844e..e6dab39a 100644 --- a/process/elasticproc/logsevents/nftsPropertiesProcessor.go +++ b/process/elasticproc/logsevents/nftsPropertiesProcessor.go @@ -4,6 +4,8 @@ import ( "math/big" "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/data/esdt" + "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-es-indexer-go/data" "github.com/multiversx/mx-chain-es-indexer-go/process/elasticproc/converters" ) @@ -11,12 +13,14 @@ import ( const minTopicsUpdate = 4 type nftsPropertiesProc struct { + marshaller marshal.Marshalizer pubKeyConverter core.PubkeyConverter propertiesChangeOperations map[string]struct{} } -func newNFTsPropertiesProcessor(pubKeyConverter core.PubkeyConverter) *nftsPropertiesProc { +func newNFTsPropertiesProcessor(pubKeyConverter core.PubkeyConverter, marshaller marshal.Marshalizer) *nftsPropertiesProc { return &nftsPropertiesProc{ + marshaller: marshaller, pubKeyConverter: pubKeyConverter, propertiesChangeOperations: map[string]struct{}{ core.BuiltInFunctionESDTNFTAddURI: {}, @@ -25,6 +29,7 @@ func newNFTsPropertiesProcessor(pubKeyConverter core.PubkeyConverter) *nftsPrope core.BuiltInFunctionESDTUnFreeze: {}, core.BuiltInFunctionESDTPause: {}, core.BuiltInFunctionESDTUnPause: {}, + core.ESDTMetaDataRecreate: {}, }, } } @@ -54,6 +59,7 @@ func (npp *nftsPropertiesProc) processEvent(args *argsProcessEvent) argOutputPro // [1] --> nonce of the NFT (bytes) // [2] --> value // [3:] --> modified data + // [3] --> ESDT token data in case of ESDTMetaDataRecreate if len(topics) < minTopicsUpdate { return argOutputProcessEvent{ processed: true, @@ -90,6 +96,8 @@ func (npp *nftsPropertiesProc) processEvent(args *argsProcessEvent) argOutputPro updateNFT.Freeze = true case core.BuiltInFunctionESDTUnFreeze: updateNFT.UnFreeze = true + case core.ESDTMetaDataRecreate: + npp.processMetaDataRecreate(updateNFT, topics[3]) } return argOutputProcessEvent{ @@ -98,6 +106,20 @@ func (npp *nftsPropertiesProc) processEvent(args *argsProcessEvent) argOutputPro } } +func (npp *nftsPropertiesProc) processMetaDataRecreate(updateNFT *data.NFTDataUpdate, esdtTokenBytes []byte) { + esdtToken := &esdt.ESDigitalToken{} + err := npp.marshaller.Unmarshal(esdtToken, esdtTokenBytes) + if err != nil { + log.Warn("nftsPropertiesProc.processMetaDataRecreate() cannot urmarshal", "error", err.Error()) + return + } + + tokenMetaData := converters.PrepareTokenMetaData(convertMetaData(npp.pubKeyConverter, esdtToken.TokenMetaData)) + updateNFT.NewMetaData = tokenMetaData + + return +} + func (npp *nftsPropertiesProc) processPauseAndUnPauseEvent(eventIdentifier string, token string) argOutputProcessEvent { var updateNFT *data.NFTDataUpdate diff --git a/process/elasticproc/logsevents/nftsPropertiesProcessor_test.go b/process/elasticproc/logsevents/nftsPropertiesProcessor_test.go index 32f039c6..7ee39dda 100644 --- a/process/elasticproc/logsevents/nftsPropertiesProcessor_test.go +++ b/process/elasticproc/logsevents/nftsPropertiesProcessor_test.go @@ -1,10 +1,13 @@ package logsevents import ( + "encoding/hex" + "encoding/json" "math/big" "testing" "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/data/esdt" "github.com/multiversx/mx-chain-core-go/data/transaction" "github.com/multiversx/mx-chain-es-indexer-go/data" "github.com/multiversx/mx-chain-es-indexer-go/mock" @@ -24,7 +27,7 @@ func TestProcessNFTProperties_Update(t *testing.T) { event: event, } - nftsPropertiesP := newNFTsPropertiesProcessor(&mock.PubkeyConverterMock{}) + nftsPropertiesP := newNFTsPropertiesProcessor(&mock.PubkeyConverterMock{}, &mock.MarshalizerMock{}) res := nftsPropertiesP.processEvent(args) require.True(t, res.processed) @@ -48,7 +51,7 @@ func TestProcessNFTProperties_AddUris(t *testing.T) { event: event, } - nftsPropertiesP := newNFTsPropertiesProcessor(&mock.PubkeyConverterMock{}) + nftsPropertiesP := newNFTsPropertiesProcessor(&mock.PubkeyConverterMock{}, &mock.MarshalizerMock{}) res := nftsPropertiesP.processEvent(args) require.True(t, res.processed) @@ -59,6 +62,33 @@ func TestProcessNFTProperties_AddUris(t *testing.T) { }, res.updatePropNFT) } +func TestProcessNFTMetaDataRecreate(t *testing.T) { + nftsPropertiesP := newNFTsPropertiesProcessor(&mock.PubkeyConverterMock{}, &mock.MarshalizerMock{}) + + esdtData := &esdt.ESDigitalToken{ + TokenMetaData: &esdt.MetaData{ + Creator: []byte("creator"), + }, + } + esdtDataBytes, _ := json.Marshal(esdtData) + + nonce := uint64(19) + event := &transaction.Event{ + Address: []byte("addr"), + Identifier: []byte(core.ESDTMetaDataRecreate), + Topics: [][]byte{[]byte("my-token"), big.NewInt(0).SetUint64(nonce).Bytes(), big.NewInt(1).Bytes(), esdtDataBytes}, + } + args := &argsProcessEvent{ + timestamp: 1234, + event: event, + } + + res := nftsPropertiesP.processEvent(args) + require.True(t, res.processed) + require.NotNil(t, res.updatePropNFT.NewMetaData) + require.Equal(t, hex.EncodeToString([]byte("creator")), res.updatePropNFT.NewMetaData.Creator) +} + func TestProcessNFTProperties_FreezeAndUnFreeze(t *testing.T) { t.Parallel() @@ -73,7 +103,7 @@ func TestProcessNFTProperties_FreezeAndUnFreeze(t *testing.T) { event: event, } - nftsPropertiesP := newNFTsPropertiesProcessor(&mock.PubkeyConverterMock{}) + nftsPropertiesP := newNFTsPropertiesProcessor(&mock.PubkeyConverterMock{}, &mock.MarshalizerMock{}) res := nftsPropertiesP.processEvent(args) require.True(t, res.processed) From 7afaf28fe4bb224978a2513077272f27d1980a1e Mon Sep 17 00:00:00 2001 From: miiu Date: Tue, 18 Jun 2024 17:10:52 +0300 Subject: [PATCH 10/29] esdt new features --- data/tokens.go | 7 +- go.mod | 2 +- go.sum | 4 +- .../updateNFT/token-after-new-creator.json | 21 ++++ .../updateNFT/token-after-new-royalties.json | 22 ++++ .../updateNFT/token-after-set-new-uris.json | 20 +++ .../updateNFT/token-after-update.json | 16 +++ integrationtests/updateNFT_test.go | 116 +++++++++++++++++- .../elasticproc/converters/tokenMetaData.go | 43 ++++++- .../converters/tokenMetaData_test.go | 2 +- .../logsevents/nftsPropertiesProcessor.go | 25 +++- 11 files changed, 263 insertions(+), 15 deletions(-) create mode 100644 integrationtests/testdata/updateNFT/token-after-new-creator.json create mode 100644 integrationtests/testdata/updateNFT/token-after-new-royalties.json create mode 100644 integrationtests/testdata/updateNFT/token-after-set-new-uris.json create mode 100644 integrationtests/testdata/updateNFT/token-after-update.json diff --git a/data/tokens.go b/data/tokens.go index c40bc369..e878facf 100644 --- a/data/tokens.go +++ b/data/tokens.go @@ -2,6 +2,8 @@ package data import ( "time" + + "github.com/multiversx/mx-chain-core-go/core" ) const metaESDT = "MetaESDT" @@ -9,13 +11,16 @@ const metaESDT = "MetaESDT" // NFTDataUpdate will contain the update information for an NFT or SFT type NFTDataUpdate struct { Identifier string + Address string + NewCreator string URIsToAdd [][]byte NewAttributes []byte - Address string Freeze bool UnFreeze bool Pause bool UnPause bool + SetURIs bool + NewRoyalties core.OptionalUint32 NewMetaData *TokenMetaData } diff --git a/go.mod b/go.mod index ec7d974b..7043d98d 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240508074652-e128a1c05c8e github.com/multiversx/mx-chain-core-go v1.2.21-0.20240508071047-fefea5737840 github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240508072523-3f00a726af57 - github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240509103544-247ce5639c7a + github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240618132642-bd8b15211219 github.com/prometheus/client_model v0.4.0 github.com/prometheus/common v0.37.0 github.com/stretchr/testify v1.8.4 diff --git a/go.sum b/go.sum index 5a3744d9..2a965d37 100644 --- a/go.sum +++ b/go.sum @@ -254,8 +254,8 @@ github.com/multiversx/mx-chain-core-go v1.2.21-0.20240508071047-fefea5737840/go. github.com/multiversx/mx-chain-crypto-go v1.2.12-0.20240508074452-cc21c1b505df h1:clihfi78bMEOWk/qw6WA4uQbCM2e2NGliqswLAvw19k= github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240508072523-3f00a726af57 h1:g9t410dqjcb7UUptbVd/H6Ua12sEzWU4v7VplyNvRZ0= github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240508072523-3f00a726af57/go.mod h1:cY6CIXpndW5g5PTPn4WzPwka/UBEf+mgw+PSY5pHGAU= -github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240509103544-247ce5639c7a h1:7M+jXVlnl43zd2NuimL1KnAVAdpUr/QoHqG0TUKoyaM= -github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240509103544-247ce5639c7a/go.mod h1:RgGmPei0suQcFTHfO4cS5dxJSiokp2SM5lmNgp1icMo= +github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240618132642-bd8b15211219 h1:DX6I8zwPnNelzKWhUMZWTDADMN+2bRl3uCxtPpYXr8U= +github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240618132642-bd8b15211219/go.mod h1:RgGmPei0suQcFTHfO4cS5dxJSiokp2SM5lmNgp1icMo= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= diff --git a/integrationtests/testdata/updateNFT/token-after-new-creator.json b/integrationtests/testdata/updateNFT/token-after-new-creator.json new file mode 100644 index 00000000..ac967297 --- /dev/null +++ b/integrationtests/testdata/updateNFT/token-after-new-creator.json @@ -0,0 +1,21 @@ +{ + "identifier": "NFT-abcd-0e", + "token": "NFT-abcd", + "numDecimals": 0, + "nonce": 14, + "timestamp": 5040, + "data": { + "uris": [ + "dXJp", + "dXJp", + "dXJp", + "dXJp", + "dXJp" + ], + "nonEmptyURIs": true, + "whiteListedStorage": false, + "attributes": "c29tZXRoaW5n", + "creator": "erd12m3x8jp6dl027pj5f2nw6ght2cyhhjfrs86cdwsa8xn83r375qfqrwpdx0" + }, + "frozen": false +} diff --git a/integrationtests/testdata/updateNFT/token-after-new-royalties.json b/integrationtests/testdata/updateNFT/token-after-new-royalties.json new file mode 100644 index 00000000..b8eb8dbc --- /dev/null +++ b/integrationtests/testdata/updateNFT/token-after-new-royalties.json @@ -0,0 +1,22 @@ +{ + "identifier": "NFT-abcd-0e", + "token": "NFT-abcd", + "numDecimals": 0, + "nonce": 14, + "timestamp": 5040, + "data": { + "uris": [ + "dXJp", + "dXJp", + "dXJp", + "dXJp", + "dXJp" + ], + "nonEmptyURIs": true, + "whiteListedStorage": false, + "attributes": "c29tZXRoaW5n", + "creator": "erd12m3x8jp6dl027pj5f2nw6ght2cyhhjfrs86cdwsa8xn83r375qfqrwpdx0", + "royalties": 100 + }, + "frozen": false +} diff --git a/integrationtests/testdata/updateNFT/token-after-set-new-uris.json b/integrationtests/testdata/updateNFT/token-after-set-new-uris.json new file mode 100644 index 00000000..c3b3ad8a --- /dev/null +++ b/integrationtests/testdata/updateNFT/token-after-set-new-uris.json @@ -0,0 +1,20 @@ +{ + "identifier": "NFT-abcd-0e", + "token": "NFT-abcd", + "numDecimals": 0, + "nonce": 14, + "timestamp": 5040, + "data": { + "uris": [ + "dXJp", + "dXJp", + "dXJp", + "dXJp", + "dXJp" + ], + "nonEmptyURIs": true, + "whiteListedStorage": false, + "attributes": "c29tZXRoaW5n" + }, + "frozen": false +} diff --git a/integrationtests/testdata/updateNFT/token-after-update.json b/integrationtests/testdata/updateNFT/token-after-update.json new file mode 100644 index 00000000..ebb9c835 --- /dev/null +++ b/integrationtests/testdata/updateNFT/token-after-update.json @@ -0,0 +1,16 @@ +{ + "identifier": "NEW-abcd-64", + "token": "NEW-abcd", + "numDecimals": 0, + "nonce": 100, + "timestamp": 5040, + "data": { + "uris": [ + "dXJp" + ], + "whiteListedStorage": false, + "name": "token-second", + "nonEmptyURIs": true, + "hash": "aGFzaA==" + } +} diff --git a/integrationtests/updateNFT_test.go b/integrationtests/updateNFT_test.go index 37243baf..11fb2b84 100644 --- a/integrationtests/updateNFT_test.go +++ b/integrationtests/updateNFT_test.go @@ -225,6 +225,85 @@ func TestNFTUpdateMetadata(t *testing.T) { err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TokensIndex, true, genericResponse) require.Nil(t, err) require.JSONEq(t, readExpectedResult("./testdata/updateNFT/token-after-un-freeze.json"), string(genericResponse.Docs[0].Source)) + + // Set new uris + pool = &outport.TransactionPool{ + Logs: []*outport.LogData{ + { + TxHash: hex.EncodeToString([]byte("h1")), + Log: &transaction.Log{ + Events: []*transaction.Event{ + { + Address: decodeAddress(address), + Identifier: []byte(core.ESDTSetNewURIs), + Topics: [][]byte{[]byte("NFT-abcd"), big.NewInt(14).Bytes(), big.NewInt(0).Bytes(), []byte("uri"), []byte("uri"), []byte("uri"), []byte("uri"), []byte("uri")}, + }, + nil, + }, + }, + }, + }, + } + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + ids = []string{"NFT-abcd-0e"} + genericResponse = &GenericResponse{} + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TokensIndex, true, genericResponse) + require.Nil(t, err) + require.JSONEq(t, readExpectedResult("./testdata/updateNFT/token-after-set-new-uris.json"), string(genericResponse.Docs[0].Source)) + + // new creator + newCreator := "erd12m3x8jp6dl027pj5f2nw6ght2cyhhjfrs86cdwsa8xn83r375qfqrwpdx0" + pool = &outport.TransactionPool{ + Logs: []*outport.LogData{ + { + TxHash: hex.EncodeToString([]byte("h1")), + Log: &transaction.Log{ + Events: []*transaction.Event{ + { + Address: decodeAddress(newCreator), + Identifier: []byte(core.ESDTModifyCreator), + Topics: [][]byte{[]byte("NFT-abcd"), big.NewInt(14).Bytes(), big.NewInt(0).Bytes()}, + }, + nil, + }, + }, + }, + }, + } + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + ids = []string{"NFT-abcd-0e"} + genericResponse = &GenericResponse{} + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TokensIndex, true, genericResponse) + require.Nil(t, err) + require.JSONEq(t, readExpectedResult("./testdata/updateNFT/token-after-new-creator.json"), string(genericResponse.Docs[0].Source)) + + // new royalties + pool = &outport.TransactionPool{ + Logs: []*outport.LogData{ + { + TxHash: hex.EncodeToString([]byte("h1")), + Log: &transaction.Log{ + Events: []*transaction.Event{ + { + Address: decodeAddress(address), + Identifier: []byte(core.ESDTModifyRoyalties), + Topics: [][]byte{[]byte("NFT-abcd"), big.NewInt(14).Bytes(), big.NewInt(0).Bytes(), big.NewInt(100).Bytes()}, + }, + nil, + }, + }, + }, + }, + } + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + ids = []string{"NFT-abcd-0e"} + genericResponse = &GenericResponse{} + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TokensIndex, true, genericResponse) + require.Nil(t, err) + require.JSONEq(t, readExpectedResult("./testdata/updateNFT/token-after-new-royalties.json"), string(genericResponse.Docs[0].Source)) } func TestCreateNFTAndMetaDataRecreate(t *testing.T) { @@ -298,7 +377,7 @@ func TestCreateNFTAndMetaDataRecreate(t *testing.T) { { Address: decodeAddress(address), Identifier: []byte(core.ESDTMetaDataRecreate), - Topics: [][]byte{[]byte("NEW-abcd"), big.NewInt(100).Bytes(), big.NewInt(1).Bytes(), marshalizedReCreate}, + Topics: [][]byte{[]byte("NEW-abcd"), big.NewInt(100).Bytes(), big.NewInt(0).Bytes(), marshalizedReCreate}, }, nil, }, @@ -313,4 +392,39 @@ func TestCreateNFTAndMetaDataRecreate(t *testing.T) { err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TokensIndex, true, genericResponse) require.Nil(t, err) require.JSONEq(t, readExpectedResult("./testdata/updateNFT/token-after-recreate.json"), string(genericResponse.Docs[0].Source)) + + // UPDATE + update := &esdt.ESDigitalToken{ + TokenMetaData: &esdt.MetaData{ + Name: []byte("token-second"), + URIs: [][]byte{[]byte("uri")}, + Hash: []byte("hash"), + }, + } + marshalizedUpdate, _ := json.Marshal(update) + + pool = &outport.TransactionPool{ + Logs: []*outport.LogData{ + { + TxHash: hex.EncodeToString([]byte("h1")), + Log: &transaction.Log{ + Events: []*transaction.Event{ + { + Address: decodeAddress(address), + Identifier: []byte(core.ESDTMetaDataUpdate), + Topics: [][]byte{[]byte("NEW-abcd"), big.NewInt(100).Bytes(), big.NewInt(0).Bytes(), marshalizedUpdate}, + }, + nil, + }, + }, + }, + }, + } + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + + genericResponse = &GenericResponse{} + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TokensIndex, true, genericResponse) + require.Nil(t, err) + require.JSONEq(t, readExpectedResult("./testdata/updateNFT/token-after-update.json"), string(genericResponse.Docs[0].Source)) } diff --git a/process/elasticproc/converters/tokenMetaData.go b/process/elasticproc/converters/tokenMetaData.go index c99541d3..b51a620b 100644 --- a/process/elasticproc/converters/tokenMetaData.go +++ b/process/elasticproc/converters/tokenMetaData.go @@ -90,13 +90,20 @@ func PrepareNFTUpdateData(buffSlice *data.BufferSlice, updateNFTData []*data.NFT return buffSlice.PutData(metaData, prepareSerializedDataForPauseAndUnPause(nftUpdate)) } if nftUpdate.NewMetaData != nil { - serializedData, err := prepareSerializedDataFromMetaDataRecreate(nftUpdate) + serializedData, err := prepareSerializedDataForMetaDataRecreate(nftUpdate) if err != nil { return err } return buffSlice.PutData(metaData, serializedData) } + if nftUpdate.NewCreator != "" { + return buffSlice.PutData(metaData, prepareSerializeDataForNewCreator(nftUpdate)) + } + if nftUpdate.NewRoyalties.HasValue { + return buffSlice.PutData(metaData, prepareSerializeDataForNewRoyalties(nftUpdate)) + } + truncatedAttributes := TruncateFieldIfExceedsMaxLengthBase64(string(nftUpdate.NewAttributes)) base64Attr := base64.StdEncoding.EncodeToString([]byte(truncatedAttributes)) newTags := TruncateSliceElementsIfExceedsMaxLength(ExtractTagsFromAttributes(nftUpdate.NewAttributes)) @@ -141,7 +148,7 @@ func PrepareNFTUpdateData(buffSlice *data.BufferSlice, updateNFTData []*data.NFT codeToExecute = ` if (ctx._source.containsKey('data')) { - if (!ctx._source.data.containsKey('uris')) { + if ((!ctx._source.data.containsKey('uris')) || (params.set)) { ctx._source.data.uris = params.uris; } else { int i; @@ -162,7 +169,7 @@ func PrepareNFTUpdateData(buffSlice *data.BufferSlice, updateNFTData []*data.NFT ctx._source.data.nonEmptyURIs = true; } ` - serializedData = []byte(fmt.Sprintf(`{"script": {"source": "%s","lang": "painless","params": {"uris": %s}},"upsert": {}}`, FormatPainlessSource(codeToExecute), marshalizedURIS)) + serializedData = []byte(fmt.Sprintf(`{"script": {"source": "%s","lang": "painless","params": {"uris": %s, "set":%t}},"upsert": {}}`, FormatPainlessSource(codeToExecute), marshalizedURIS, nftUpdate.SetURIs)) } err := buffSlice.PutData(metaData, serializedData) @@ -198,14 +205,14 @@ func prepareSerializedDataForPauseAndUnPause(nftUpdateData *data.NFTDataUpdate) return serializedData } -func prepareSerializedDataFromMetaDataRecreate(nftUpdateData *data.NFTDataUpdate) ([]byte, error) { +func prepareSerializedDataForMetaDataRecreate(nftUpdateData *data.NFTDataUpdate) ([]byte, error) { tokenMetaDataBytes, err := json.Marshal(nftUpdateData.NewMetaData) if err != nil { return nil, err } codeToExecute := ` - ctx._source.data = params.metaData + ctx._source.data = params.metaData; ` serializedData := []byte(fmt.Sprintf(`{"script": {"source": "%s","lang": "painless","params": {"metaData": %s}}, "upsert": {}}`, FormatPainlessSource(codeToExecute), tokenMetaDataBytes), @@ -213,3 +220,29 @@ func prepareSerializedDataFromMetaDataRecreate(nftUpdateData *data.NFTDataUpdate return serializedData, nil } + +func prepareSerializeDataForNewRoyalties(nftUpdateData *data.NFTDataUpdate) []byte { + codeToExecute := ` + if (ctx._source.containsKey('data')) { + ctx._source.data.royalties = params.royalties; + } +` + serializedData := []byte(fmt.Sprintf(`{"script": {"source": "%s","lang": "painless","params": {"royalties": %d}}, "upsert": {}}`, + FormatPainlessSource(codeToExecute), nftUpdateData.NewRoyalties.Value), + ) + + return serializedData +} + +func prepareSerializeDataForNewCreator(nftUpdateData *data.NFTDataUpdate) []byte { + codeToExecute := ` + if (ctx._source.containsKey('data')) { + ctx._source.data.creator = params.creator; + } +` + serializedData := []byte(fmt.Sprintf(`{"script": {"source": "%s","lang": "painless","params": {"creator": "%s"}}, "upsert": {}}`, + FormatPainlessSource(codeToExecute), nftUpdateData.NewCreator), + ) + + return serializedData +} diff --git a/process/elasticproc/converters/tokenMetaData_test.go b/process/elasticproc/converters/tokenMetaData_test.go index b68c6551..a6bacfab 100644 --- a/process/elasticproc/converters/tokenMetaData_test.go +++ b/process/elasticproc/converters/tokenMetaData_test.go @@ -59,7 +59,7 @@ func TestPrepareNFTUpdateData(t *testing.T) { require.Equal(t, `{"update":{ "_index":"tokens","_id":"MYTKN-abcd-01"}} {"script": {"source": "if (ctx._source.containsKey('data')) {ctx._source.data.attributes = params.attributes;if (!params.metadata.isEmpty() ) {ctx._source.data.metadata = params.metadata} else {if (ctx._source.data.containsKey('metadata')) {ctx._source.data.remove('metadata')}}if (params.tags != null) {ctx._source.data.tags = params.tags} else {if (ctx._source.data.containsKey('tags')) {ctx._source.data.remove('tags')}}}","lang": "painless","params": {"attributes": "YWFhYQ==", "metadata": "", "tags": null}}, "upsert": {}} {"update":{ "_index":"tokens","_id":"TOKEN-1234-1a"}} -{"script": {"source": "if (ctx._source.containsKey('data')) {if (!ctx._source.data.containsKey('uris')) {ctx._source.data.uris = params.uris;} else {int i;for ( i = 0; i < params.uris.length; i++) {boolean found = false;int j;for ( j = 0; j < ctx._source.data.uris.length; j++) {if ( params.uris.get(i) == ctx._source.data.uris.get(j) ) {found = true;break}}if ( !found ) {ctx._source.data.uris.add(params.uris.get(i))}}}ctx._source.data.nonEmptyURIs = true;}","lang": "painless","params": {"uris": ["dXJpMQ==","dXJpMg=="]}},"upsert": {}} +{"script": {"source": "if (ctx._source.containsKey('data')) {if ((!ctx._source.data.containsKey('uris')) || (params.set)) {ctx._source.data.uris = params.uris;} else {int i;for ( i = 0; i < params.uris.length; i++) {boolean found = false;int j;for ( j = 0; j < ctx._source.data.uris.length; j++) {if ( params.uris.get(i) == ctx._source.data.uris.get(j) ) {found = true;break}}if ( !found ) {ctx._source.data.uris.add(params.uris.get(i))}}}ctx._source.data.nonEmptyURIs = true;}","lang": "painless","params": {"uris": ["dXJpMQ==","dXJpMg=="], "set":false}},"upsert": {}} `, buffSlice.Buffers()[0].String()) } diff --git a/process/elasticproc/logsevents/nftsPropertiesProcessor.go b/process/elasticproc/logsevents/nftsPropertiesProcessor.go index e6dab39a..ea53c9b0 100644 --- a/process/elasticproc/logsevents/nftsPropertiesProcessor.go +++ b/process/elasticproc/logsevents/nftsPropertiesProcessor.go @@ -30,6 +30,10 @@ func newNFTsPropertiesProcessor(pubKeyConverter core.PubkeyConverter, marshaller core.BuiltInFunctionESDTPause: {}, core.BuiltInFunctionESDTUnPause: {}, core.ESDTMetaDataRecreate: {}, + core.ESDTMetaDataUpdate: {}, + core.ESDTSetNewURIs: {}, + core.ESDTModifyCreator: {}, + core.ESDTModifyRoyalties: {}, }, } } @@ -60,7 +64,9 @@ func (npp *nftsPropertiesProc) processEvent(args *argsProcessEvent) argOutputPro // [2] --> value // [3:] --> modified data // [3] --> ESDT token data in case of ESDTMetaDataRecreate - if len(topics) < minTopicsUpdate { + + isModifyCreator := len(topics) == minTopicsUpdate-1 && eventIdentifier == core.ESDTModifyCreator + if len(topics) < minTopicsUpdate && !isModifyCreator { return argOutputProcessEvent{ processed: true, } @@ -92,12 +98,23 @@ func (npp *nftsPropertiesProc) processEvent(args *argsProcessEvent) argOutputPro updateNFT.NewAttributes = topics[3] case core.BuiltInFunctionESDTNFTAddURI: updateNFT.URIsToAdd = topics[3:] + case core.ESDTSetNewURIs: + updateNFT.SetURIs = true + updateNFT.URIsToAdd = topics[3:] case core.BuiltInFunctionESDTFreeze: updateNFT.Freeze = true case core.BuiltInFunctionESDTUnFreeze: updateNFT.UnFreeze = true - case core.ESDTMetaDataRecreate: - npp.processMetaDataRecreate(updateNFT, topics[3]) + case core.ESDTMetaDataRecreate, core.ESDTMetaDataUpdate: + npp.processMetaDataUpdate(updateNFT, topics[3]) + case core.ESDTModifyCreator: + updateNFT.NewCreator = callerAddress + case core.ESDTModifyRoyalties: + newRoyalties := uint32(big.NewInt(0).SetBytes(topics[3]).Uint64()) + updateNFT.NewRoyalties = core.OptionalUint32{ + Value: newRoyalties, + HasValue: true, + } } return argOutputProcessEvent{ @@ -106,7 +123,7 @@ func (npp *nftsPropertiesProc) processEvent(args *argsProcessEvent) argOutputPro } } -func (npp *nftsPropertiesProc) processMetaDataRecreate(updateNFT *data.NFTDataUpdate, esdtTokenBytes []byte) { +func (npp *nftsPropertiesProc) processMetaDataUpdate(updateNFT *data.NFTDataUpdate, esdtTokenBytes []byte) { esdtToken := &esdt.ESDigitalToken{} err := npp.marshaller.Unmarshal(esdtToken, esdtTokenBytes) if err != nil { From 731bddac48216a0f9b0260cff36ecee5e5f99439 Mon Sep 17 00:00:00 2001 From: miiu Date: Wed, 19 Jun 2024 09:09:17 +0300 Subject: [PATCH 11/29] fix linter --- process/elasticproc/logsevents/nftsPropertiesProcessor.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/process/elasticproc/logsevents/nftsPropertiesProcessor.go b/process/elasticproc/logsevents/nftsPropertiesProcessor.go index ea53c9b0..8b40f891 100644 --- a/process/elasticproc/logsevents/nftsPropertiesProcessor.go +++ b/process/elasticproc/logsevents/nftsPropertiesProcessor.go @@ -133,8 +133,6 @@ func (npp *nftsPropertiesProc) processMetaDataUpdate(updateNFT *data.NFTDataUpda tokenMetaData := converters.PrepareTokenMetaData(convertMetaData(npp.pubKeyConverter, esdtToken.TokenMetaData)) updateNFT.NewMetaData = tokenMetaData - - return } func (npp *nftsPropertiesProc) processPauseAndUnPauseEvent(eventIdentifier string, token string) argOutputProcessEvent { From 05143459c5547fdcfe5093fcbe7ae0c5a5fa8b46 Mon Sep 17 00:00:00 2001 From: miiu Date: Wed, 19 Jun 2024 15:28:42 +0300 Subject: [PATCH 12/29] latest vm common --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7043d98d..46f09b26 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240508074652-e128a1c05c8e github.com/multiversx/mx-chain-core-go v1.2.21-0.20240508071047-fefea5737840 github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240508072523-3f00a726af57 - github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240618132642-bd8b15211219 + github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240619122724-2bd2e64cebdc github.com/prometheus/client_model v0.4.0 github.com/prometheus/common v0.37.0 github.com/stretchr/testify v1.8.4 diff --git a/go.sum b/go.sum index 2a965d37..ad53f92a 100644 --- a/go.sum +++ b/go.sum @@ -254,8 +254,8 @@ github.com/multiversx/mx-chain-core-go v1.2.21-0.20240508071047-fefea5737840/go. github.com/multiversx/mx-chain-crypto-go v1.2.12-0.20240508074452-cc21c1b505df h1:clihfi78bMEOWk/qw6WA4uQbCM2e2NGliqswLAvw19k= github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240508072523-3f00a726af57 h1:g9t410dqjcb7UUptbVd/H6Ua12sEzWU4v7VplyNvRZ0= github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240508072523-3f00a726af57/go.mod h1:cY6CIXpndW5g5PTPn4WzPwka/UBEf+mgw+PSY5pHGAU= -github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240618132642-bd8b15211219 h1:DX6I8zwPnNelzKWhUMZWTDADMN+2bRl3uCxtPpYXr8U= -github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240618132642-bd8b15211219/go.mod h1:RgGmPei0suQcFTHfO4cS5dxJSiokp2SM5lmNgp1icMo= +github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240619122724-2bd2e64cebdc h1:KpLloX0pIclo3axCQVOm3wZE+U9cfeHgPWGvDuUohTk= +github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240619122724-2bd2e64cebdc/go.mod h1:RgGmPei0suQcFTHfO4cS5dxJSiokp2SM5lmNgp1icMo= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= From 95104d5072663e713d0c110b94c6108e3bcee7a2 Mon Sep 17 00:00:00 2001 From: miiu Date: Wed, 3 Jul 2024 15:24:02 +0300 Subject: [PATCH 13/29] contract address in topics --- .../logsevents/delegatorsProcessor.go | 12 ++++++-- .../logsevents/delegatorsProcessor_test.go | 29 +++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/process/elasticproc/logsevents/delegatorsProcessor.go b/process/elasticproc/logsevents/delegatorsProcessor.go index 26fd3a82..1cf6c6e7 100644 --- a/process/elasticproc/logsevents/delegatorsProcessor.go +++ b/process/elasticproc/logsevents/delegatorsProcessor.go @@ -18,6 +18,9 @@ const ( withdrawFunc = "withdraw" reDelegateRewardsFunc = "reDelegateRewards" claimRewardsFunc = "claimRewards" + + minNumTopicsClaimRewards = 2 + numTopicsClaimRewardsWithContractAddress = 3 ) type delegatorsProc struct { @@ -137,18 +140,23 @@ func (dp *delegatorsProc) getDelegatorFromClaimRewardsEvent(args *argsProcessEve // topics slice contains: // topics[0] -- claimed rewards // topics[1] -- true = if delegator was deleted + // topics[2] -- if is present will contain the contract address - if len(topics) < 2 { + if len(topics) < minNumTopicsClaimRewards { return nil } - shouldDelete := bytesToBool(topics[1]) + shouldDelete := bytesToBool(topics[minNumTopicsClaimRewards-1]) if !shouldDelete { return nil } encodedAddr := dp.pubkeyConverter.SilentEncode(args.event.GetAddress(), log) + encodedContractAddr := dp.pubkeyConverter.SilentEncode(args.logAddress, log) + if len(topics) == numTopicsClaimRewardsWithContractAddress { + encodedContractAddr = dp.pubkeyConverter.SilentEncode(topics[numTopicsClaimRewardsWithContractAddress-1], log) + } return &data.Delegator{ Address: encodedAddr, diff --git a/process/elasticproc/logsevents/delegatorsProcessor_test.go b/process/elasticproc/logsevents/delegatorsProcessor_test.go index e808fb4e..8d8a5471 100644 --- a/process/elasticproc/logsevents/delegatorsProcessor_test.go +++ b/process/elasticproc/logsevents/delegatorsProcessor_test.go @@ -1,6 +1,7 @@ package logsevents import ( + "encoding/hex" "math/big" "strconv" "testing" @@ -100,6 +101,34 @@ func TestDelegatorProcessor_ClaimRewardsWithDelete(t *testing.T) { }, res.delegator) } +func TestDelegatorProcessor_ClaimRewardsContractAddressInTopics(t *testing.T) { + t.Parallel() + + contractAddress := []byte("contract2") + event := &transaction.Event{ + Address: []byte("addr"), + Identifier: []byte(claimRewardsFunc), + Topics: [][]byte{big.NewInt(1000).Bytes(), []byte(strconv.FormatBool(true)), contractAddress}, + } + args := &argsProcessEvent{ + timestamp: 1234, + event: event, + logAddress: []byte("contract1"), + selfShardID: core.MetachainShardId, + } + + balanceConverter, _ := converters.NewBalanceConverter(10) + delegatorsProcessor := newDelegatorsProcessor(&mock.PubkeyConverterMock{}, balanceConverter) + + res := delegatorsProcessor.processEvent(args) + require.True(t, res.processed) + require.Equal(t, &data.Delegator{ + Address: "61646472", + Contract: hex.EncodeToString(contractAddress), + ShouldDelete: true, + }, res.delegator) +} + func TestDelegatorProcessor_ClaimRewardsNoDelete(t *testing.T) { t.Parallel() From 92d6b3033707efeefa178b8ac8883f22df1e74cb Mon Sep 17 00:00:00 2001 From: miiu Date: Mon, 8 Jul 2024 11:49:25 +0300 Subject: [PATCH 14/29] relayed v3 integration --- client/elasticClient.go | 17 +++ data/transaction.go | 94 ++++++------- go.mod | 2 +- go.sum | 4 +- integrationtests/relayedTxV3_test.go | 99 ++++++++++++++ .../testdata/relayedTxV3/relayed-tx-v3.json | 54 ++++++++ process/elasticproc/elasticProcessor.go | 17 ++- .../factory/elasticProcessorFactory.go | 5 + process/elasticproc/interface.go | 1 + .../templatesAndPolicies/interface.go | 7 +- .../templatesAndPolicies/noKibana.go | 18 +++ .../templatesAndPolicies/withKibana.go | 5 + .../transactions/transactionDBBuilder.go | 73 +++++++++- .../transactions/transactionDBBuilder_test.go | 127 ++++++++++++++++++ templates/noKibana/innerTx.go | 63 +++++++++ templates/types.go | 6 + 16 files changed, 535 insertions(+), 57 deletions(-) create mode 100644 integrationtests/relayedTxV3_test.go create mode 100644 integrationtests/testdata/relayedTxV3/relayed-tx-v3.json create mode 100644 templates/noKibana/innerTx.go diff --git a/client/elasticClient.go b/client/elasticClient.go index 64f7e30f..5ae130a4 100644 --- a/client/elasticClient.go +++ b/client/elasticClient.go @@ -3,6 +3,7 @@ package client import ( "bytes" "context" + "errors" "fmt" "io" "net/http" @@ -84,6 +85,22 @@ func (ec *elasticClient) CheckAndCreateIndex(indexName string) error { return ec.createIndex(indexName) } +func (ec *elasticClient) PutMappings(indexName string, mappings *bytes.Buffer) error { + res, err := ec.client.Indices.PutMapping( + mappings, + ec.client.Indices.PutMapping.WithIndex(indexName), + ) + if err != nil { + return err + } + + if res.IsError() { + return errors.New(res.String()) + } + + return nil +} + // CheckAndCreateAlias creates a new alias if it does not already exist func (ec *elasticClient) CheckAndCreateAlias(alias string, indexName string) error { if ec.aliasExists(alias) { diff --git a/data/transaction.go b/data/transaction.go index d5cefd56..2a85ce52 100644 --- a/data/transaction.go +++ b/data/transaction.go @@ -2,57 +2,61 @@ package data import ( "time" + + "github.com/multiversx/mx-chain-core-go/data/transaction" ) // Transaction is a structure containing all the fields that need // to be saved for a transaction. It has all the default fields // plus some extra information for ease of search and filter type Transaction struct { - MBHash string `json:"miniBlockHash"` - Nonce uint64 `json:"nonce"` - Round uint64 `json:"round"` - Value string `json:"value"` - ValueNum float64 `json:"valueNum"` - Receiver string `json:"receiver"` - Sender string `json:"sender"` - ReceiverShard uint32 `json:"receiverShard"` - SenderShard uint32 `json:"senderShard"` - GasPrice uint64 `json:"gasPrice"` - GasLimit uint64 `json:"gasLimit"` - GasUsed uint64 `json:"gasUsed"` - Fee string `json:"fee"` - FeeNum float64 `json:"feeNum"` - InitialPaidFee string `json:"initialPaidFee,omitempty"` - Data []byte `json:"data"` - Signature string `json:"signature"` - Timestamp time.Duration `json:"timestamp"` - Status string `json:"status"` - SearchOrder uint32 `json:"searchOrder"` - SenderUserName []byte `json:"senderUserName,omitempty"` - ReceiverUserName []byte `json:"receiverUserName,omitempty"` - HasSCR bool `json:"hasScResults,omitempty"` - IsScCall bool `json:"isScCall,omitempty"` - HasOperations bool `json:"hasOperations,omitempty"` - HasLogs bool `json:"hasLogs,omitempty"` - Tokens []string `json:"tokens,omitempty"` - ESDTValues []string `json:"esdtValues,omitempty"` - ESDTValuesNum []float64 `json:"esdtValuesNum,omitempty"` - Receivers []string `json:"receivers,omitempty"` - ReceiversShardIDs []uint32 `json:"receiversShardIDs,omitempty"` - Type string `json:"type,omitempty"` - Operation string `json:"operation,omitempty"` - Function string `json:"function,omitempty"` - IsRelayed bool `json:"isRelayed,omitempty"` - Version uint32 `json:"version,omitempty"` - GuardianAddress string `json:"guardian,omitempty"` - GuardianSignature string `json:"guardianSignature,omitempty"` - ErrorEvent bool `json:"errorEvent,omitempty"` - CompletedEvent bool `json:"completedEvent,omitempty"` - ExecutionOrder int `json:"-"` - SmartContractResults []*ScResult `json:"-"` - Hash string `json:"-"` - BlockHash string `json:"-"` - HadRefund bool `json:"-"` + MBHash string `json:"miniBlockHash"` + Nonce uint64 `json:"nonce"` + Round uint64 `json:"round"` + Value string `json:"value"` + ValueNum float64 `json:"valueNum"` + Receiver string `json:"receiver"` + Sender string `json:"sender"` + ReceiverShard uint32 `json:"receiverShard"` + SenderShard uint32 `json:"senderShard"` + GasPrice uint64 `json:"gasPrice"` + GasLimit uint64 `json:"gasLimit"` + GasUsed uint64 `json:"gasUsed"` + Fee string `json:"fee"` + FeeNum float64 `json:"feeNum"` + InitialPaidFee string `json:"initialPaidFee,omitempty"` + Data []byte `json:"data"` + Signature string `json:"signature"` + Timestamp time.Duration `json:"timestamp"` + Status string `json:"status"` + SearchOrder uint32 `json:"searchOrder"` + SenderUserName []byte `json:"senderUserName,omitempty"` + ReceiverUserName []byte `json:"receiverUserName,omitempty"` + HasSCR bool `json:"hasScResults,omitempty"` + IsScCall bool `json:"isScCall,omitempty"` + HasOperations bool `json:"hasOperations,omitempty"` + HasLogs bool `json:"hasLogs,omitempty"` + Tokens []string `json:"tokens,omitempty"` + ESDTValues []string `json:"esdtValues,omitempty"` + ESDTValuesNum []float64 `json:"esdtValuesNum,omitempty"` + Receivers []string `json:"receivers,omitempty"` + ReceiversShardIDs []uint32 `json:"receiversShardIDs,omitempty"` + Type string `json:"type,omitempty"` + Operation string `json:"operation,omitempty"` + Function string `json:"function,omitempty"` + IsRelayed bool `json:"isRelayed,omitempty"` + Version uint32 `json:"version,omitempty"` + GuardianAddress string `json:"guardian,omitempty"` + GuardianSignature string `json:"guardianSignature,omitempty"` + ErrorEvent bool `json:"errorEvent,omitempty"` + CompletedEvent bool `json:"completedEvent,omitempty"` + RelayedAddr string `json:"relayed,omitempty"` + InnerTransactions []*transaction.FrontendTransaction `json:"innerTransactions,omitempty"` + ExecutionOrder int `json:"-"` + SmartContractResults []*ScResult `json:"-"` + Hash string `json:"-"` + BlockHash string `json:"-"` + HadRefund bool `json:"-"` } // Receipt is a structure containing all the fields that need to be safe for a Receipt diff --git a/go.mod b/go.mod index 46f09b26..312a16e7 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/gin-contrib/cors v1.4.0 github.com/gin-gonic/gin v1.9.1 github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240508074652-e128a1c05c8e - github.com/multiversx/mx-chain-core-go v1.2.21-0.20240508071047-fefea5737840 + github.com/multiversx/mx-chain-core-go v1.2.21-0.20240703140829-626328c91a8d github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240508072523-3f00a726af57 github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240619122724-2bd2e64cebdc github.com/prometheus/client_model v0.4.0 diff --git a/go.sum b/go.sum index ad53f92a..975ffc74 100644 --- a/go.sum +++ b/go.sum @@ -249,8 +249,8 @@ github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240508074652-e128a1c05c8e h1:Tsmwhu+UleE+l3buPuqXSKTqfu5FbPmzQ4MjMoUvCWA= github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240508074652-e128a1c05c8e/go.mod h1:2yXl18wUbuV3cRZr7VHxM1xo73kTaC1WUcu2kx8R034= -github.com/multiversx/mx-chain-core-go v1.2.21-0.20240508071047-fefea5737840 h1:2mCrTUmbbA+Xv4UifZY9xptrGjcJBcJ2wavSb4FwejU= -github.com/multiversx/mx-chain-core-go v1.2.21-0.20240508071047-fefea5737840/go.mod h1:B5zU4MFyJezmEzCsAHE9YNULmGCm2zbPHvl9hazNxmE= +github.com/multiversx/mx-chain-core-go v1.2.21-0.20240703140829-626328c91a8d h1:2x1arnxYt28ZlDAZj61dzmG4NqoUmAZbe3pTFsBZHek= +github.com/multiversx/mx-chain-core-go v1.2.21-0.20240703140829-626328c91a8d/go.mod h1:B5zU4MFyJezmEzCsAHE9YNULmGCm2zbPHvl9hazNxmE= github.com/multiversx/mx-chain-crypto-go v1.2.12-0.20240508074452-cc21c1b505df h1:clihfi78bMEOWk/qw6WA4uQbCM2e2NGliqswLAvw19k= github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240508072523-3f00a726af57 h1:g9t410dqjcb7UUptbVd/H6Ua12sEzWU4v7VplyNvRZ0= github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240508072523-3f00a726af57/go.mod h1:cY6CIXpndW5g5PTPn4WzPwka/UBEf+mgw+PSY5pHGAU= diff --git a/integrationtests/relayedTxV3_test.go b/integrationtests/relayedTxV3_test.go new file mode 100644 index 00000000..d492c753 --- /dev/null +++ b/integrationtests/relayedTxV3_test.go @@ -0,0 +1,99 @@ +//go:build integrationtests + +package integrationtests + +import ( + "context" + "encoding/hex" + dataBlock "github.com/multiversx/mx-chain-core-go/data/block" + "github.com/multiversx/mx-chain-core-go/data/outport" + "github.com/multiversx/mx-chain-core-go/data/transaction" + indexerdata "github.com/multiversx/mx-chain-es-indexer-go/process/dataindexer" + "github.com/stretchr/testify/require" + "math/big" + "testing" +) + +func TestRelayedTxV3(t *testing.T) { + setLogLevelDebug() + + esClient, err := createESClient(esURL) + require.Nil(t, err) + + esProc, err := CreateElasticProcessor(esClient) + require.Nil(t, err) + + txHash := []byte("relayedTxV3") + header := &dataBlock.Header{ + Round: 50, + TimeStamp: 5040, + } + + body := &dataBlock.Body{ + MiniBlocks: dataBlock.MiniBlockSlice{ + { + Type: dataBlock.TxBlock, + SenderShardID: 0, + ReceiverShardID: 0, + TxHashes: [][]byte{txHash}, + }, + }, + } + + address1 := "erd1k7j6ewjsla4zsgv8v6f6fe3dvrkgv3d0d9jerczw45hzedhyed8sh2u34u" + address2 := "erd14eyayfrvlrhzfrwg5zwleua25mkzgncggn35nvc6xhv5yxwml2es0f3dht" + initialTx := &transaction.Transaction{ + Nonce: 1000, + SndAddr: decodeAddress(address1), + RcvAddr: decodeAddress(address2), + GasLimit: 15406000, + GasPrice: 1000000000, + Value: big.NewInt(0), + InnerTransactions: []*transaction.Transaction{ + { + Nonce: 10, + SndAddr: decodeAddress(address1), + RcvAddr: decodeAddress(address2), + GasLimit: 15406000, + GasPrice: 1000000000, + Value: big.NewInt(0), + }, + { + Nonce: 20, + SndAddr: decodeAddress(address1), + RcvAddr: decodeAddress(address2), + GasLimit: 15406000, + GasPrice: 1000000000, + Value: big.NewInt(1000), + }, + }, + } + + txInfo := &outport.TxInfo{ + Transaction: initialTx, + FeeInfo: &outport.FeeInfo{ + GasUsed: 10556000, + Fee: big.NewInt(2257820000000000), + InitialPaidFee: big.NewInt(2306320000000000), + }, + ExecutionOrder: 0, + } + + pool := &outport.TransactionPool{ + Transactions: map[string]*outport.TxInfo{ + hex.EncodeToString(txHash): txInfo, + }, + } + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + + ids := []string{hex.EncodeToString(txHash)} + genericResponse := &GenericResponse{} + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TransactionsIndex, true, genericResponse) + require.Nil(t, err) + + require.JSONEq(t, + readExpectedResult("./testdata/relayedTxV3/relayed-tx-v3.json"), + string(genericResponse.Docs[0].Source), + ) +} diff --git a/integrationtests/testdata/relayedTxV3/relayed-tx-v3.json b/integrationtests/testdata/relayedTxV3/relayed-tx-v3.json new file mode 100644 index 00000000..62a67fa1 --- /dev/null +++ b/integrationtests/testdata/relayedTxV3/relayed-tx-v3.json @@ -0,0 +1,54 @@ +{ + "miniBlockHash": "b3222be4506429fa237393c56b732a283eea5ccab465deb66b6348083793b6c9", + "nonce": 1000, + "round": 50, + "value": "0", + "valueNum": 0, + "receiver": "erd14eyayfrvlrhzfrwg5zwleua25mkzgncggn35nvc6xhv5yxwml2es0f3dht", + "sender": "erd1k7j6ewjsla4zsgv8v6f6fe3dvrkgv3d0d9jerczw45hzedhyed8sh2u34u", + "receiverShard": 0, + "senderShard": 0, + "gasPrice": 1000000000, + "gasLimit": 15406000, + "gasUsed": 10556000, + "fee": "2257820000000000", + "feeNum": 0.00225782, + "initialPaidFee": "2306320000000000", + "data": null, + "signature": "", + "timestamp": 5040, + "status": "success", + "searchOrder": 0, + "receivers": [ + "erd14eyayfrvlrhzfrwg5zwleua25mkzgncggn35nvc6xhv5yxwml2es0f3dht", + "erd14eyayfrvlrhzfrwg5zwleua25mkzgncggn35nvc6xhv5yxwml2es0f3dht" + ], + "receiversShardIDs": [ + 1, + 1 + ], + "operation": "transfer", + "isRelayed": true, + "innerTransactions": [ + { + "nonce": 10, + "value": "0", + "receiver": "erd14eyayfrvlrhzfrwg5zwleua25mkzgncggn35nvc6xhv5yxwml2es0f3dht", + "sender": "erd1k7j6ewjsla4zsgv8v6f6fe3dvrkgv3d0d9jerczw45hzedhyed8sh2u34u", + "gasPrice": 1000000000, + "gasLimit": 15406000, + "chainID": "", + "version": 0 + }, + { + "nonce": 20, + "value": "1000", + "receiver": "erd14eyayfrvlrhzfrwg5zwleua25mkzgncggn35nvc6xhv5yxwml2es0f3dht", + "sender": "erd1k7j6ewjsla4zsgv8v6f6fe3dvrkgv3d0d9jerczw45hzedhyed8sh2u34u", + "gasPrice": 1000000000, + "gasLimit": 15406000, + "chainID": "", + "version": 0 + } + ] +} \ No newline at end of file diff --git a/process/elasticproc/elasticProcessor.go b/process/elasticproc/elasticProcessor.go index 640e5f09..89634a95 100644 --- a/process/elasticproc/elasticProcessor.go +++ b/process/elasticproc/elasticProcessor.go @@ -20,6 +20,7 @@ import ( "github.com/multiversx/mx-chain-es-indexer-go/process/elasticproc/converters" "github.com/multiversx/mx-chain-es-indexer-go/process/elasticproc/tags" "github.com/multiversx/mx-chain-es-indexer-go/process/elasticproc/tokeninfo" + "github.com/multiversx/mx-chain-es-indexer-go/templates" logger "github.com/multiversx/mx-chain-logger-go" ) @@ -44,6 +45,7 @@ type ArgElasticProcessor struct { ImportDB bool IndexTemplates map[string]*bytes.Buffer IndexPolicies map[string]*bytes.Buffer + ExtraMappings []templates.ExtraMapping EnabledIndexes map[string]struct{} TransactionsProc DBTransactionsHandler AccountsProc DBAccountHandler @@ -94,7 +96,7 @@ func NewElasticProcessor(arguments *ArgElasticProcessor) (*elasticProcessor, err bulkRequestMaxSize: arguments.BulkRequestMaxSize, } - err = ei.init(arguments.UseKibana, arguments.IndexTemplates, arguments.IndexPolicies) + err = ei.init(arguments.UseKibana, arguments.IndexTemplates, arguments.IndexPolicies, arguments.ExtraMappings) if err != nil { return nil, err } @@ -105,7 +107,7 @@ func NewElasticProcessor(arguments *ArgElasticProcessor) (*elasticProcessor, err } // TODO move all the index create part in a new component -func (ei *elasticProcessor) init(useKibana bool, indexTemplates, _ map[string]*bytes.Buffer) error { +func (ei *elasticProcessor) init(useKibana bool, indexTemplates, _ map[string]*bytes.Buffer, extraMappings []templates.ExtraMapping) error { err := ei.createOpenDistroTemplates(indexTemplates) if err != nil { return err @@ -135,6 +137,17 @@ func (ei *elasticProcessor) init(useKibana bool, indexTemplates, _ map[string]*b return err } + return ei.addExtraMappings(extraMappings) +} + +func (ei *elasticProcessor) addExtraMappings(extraMappings []templates.ExtraMapping) error { + for _, mappingsTuple := range extraMappings { + err := ei.elasticClient.PutMappings(mappingsTuple.Index, mappingsTuple.Mappings) + if err != nil { + return err + } + } + return nil } diff --git a/process/elasticproc/factory/elasticProcessorFactory.go b/process/elasticproc/factory/elasticProcessorFactory.go index eb10110c..ad865953 100644 --- a/process/elasticproc/factory/elasticProcessorFactory.go +++ b/process/elasticproc/factory/elasticProcessorFactory.go @@ -40,6 +40,10 @@ func CreateElasticProcessor(arguments ArgElasticProcessorFactory) (dataindexer.E if err != nil { return nil, err } + extraMappings, err := templatesAndPoliciesReader.GetExtraMappings() + if err != nil { + return nil, err + } enabledIndexesMap := make(map[string]struct{}) for _, index := range arguments.EnabledIndexes { @@ -119,6 +123,7 @@ func CreateElasticProcessor(arguments ArgElasticProcessorFactory) (dataindexer.E UseKibana: arguments.UseKibana, IndexTemplates: indexTemplates, IndexPolicies: indexPolicies, + ExtraMappings: extraMappings, OperationsProc: operationsProc, ImportDB: arguments.ImportDB, Version: arguments.Version, diff --git a/process/elasticproc/interface.go b/process/elasticproc/interface.go index 997697b2..fe4b565f 100644 --- a/process/elasticproc/interface.go +++ b/process/elasticproc/interface.go @@ -21,6 +21,7 @@ type DatabaseClientHandler interface { DoCountRequest(ctx context.Context, index string, body []byte) (uint64, error) UpdateByQuery(ctx context.Context, index string, buff *bytes.Buffer) error + PutMappings(indexName string, mappings *bytes.Buffer) error CheckAndCreateIndex(index string) error CheckAndCreateAlias(alias string, index string) error CheckAndCreateTemplate(templateName string, template *bytes.Buffer) error diff --git a/process/elasticproc/templatesAndPolicies/interface.go b/process/elasticproc/templatesAndPolicies/interface.go index f4b740c9..2215c781 100644 --- a/process/elasticproc/templatesAndPolicies/interface.go +++ b/process/elasticproc/templatesAndPolicies/interface.go @@ -1,8 +1,13 @@ package templatesAndPolicies -import "bytes" +import ( + "bytes" + + "github.com/multiversx/mx-chain-es-indexer-go/templates" +) // TemplatesAndPoliciesHandler defines the actions that a templates and policies handler should do type TemplatesAndPoliciesHandler interface { GetElasticTemplatesAndPolicies() (map[string]*bytes.Buffer, map[string]*bytes.Buffer, error) + GetExtraMappings() ([]templates.ExtraMapping, error) } diff --git a/process/elasticproc/templatesAndPolicies/noKibana.go b/process/elasticproc/templatesAndPolicies/noKibana.go index a6928858..d87acaba 100644 --- a/process/elasticproc/templatesAndPolicies/noKibana.go +++ b/process/elasticproc/templatesAndPolicies/noKibana.go @@ -4,6 +4,7 @@ import ( "bytes" indexer "github.com/multiversx/mx-chain-es-indexer-go/process/dataindexer" + "github.com/multiversx/mx-chain-es-indexer-go/templates" "github.com/multiversx/mx-chain-es-indexer-go/templates/noKibana" ) @@ -45,3 +46,20 @@ func (tr *templatesAndPolicyReaderNoKibana) GetElasticTemplatesAndPolicies() (ma return indexTemplates, indexPolicies, nil } + +// GetExtraMappings will return an array of indices extra mappings +func (tr *templatesAndPolicyReaderNoKibana) GetExtraMappings() ([]templates.ExtraMapping, error) { + transactionsExtraMappings := templates.ExtraMapping{ + Index: indexer.TransactionsIndex, + Mappings: noKibana.InnerTxs.ToBuffer(), + } + operationsExtraMappings := templates.ExtraMapping{ + Index: indexer.OperationsIndex, + Mappings: noKibana.InnerTxs.ToBuffer(), + } + + return []templates.ExtraMapping{ + transactionsExtraMappings, + operationsExtraMappings, + }, nil +} diff --git a/process/elasticproc/templatesAndPolicies/withKibana.go b/process/elasticproc/templatesAndPolicies/withKibana.go index 2fe1cd38..33ddaa23 100644 --- a/process/elasticproc/templatesAndPolicies/withKibana.go +++ b/process/elasticproc/templatesAndPolicies/withKibana.go @@ -4,6 +4,7 @@ import ( "bytes" indexer "github.com/multiversx/mx-chain-es-indexer-go/process/dataindexer" + "github.com/multiversx/mx-chain-es-indexer-go/templates" "github.com/multiversx/mx-chain-es-indexer-go/templates/withKibana" ) @@ -22,6 +23,10 @@ func (tr *templatesAndPolicyReaderWithKibana) GetElasticTemplatesAndPolicies() ( return indexTemplates, indexPolicies, nil } +func (tr *templatesAndPolicyReaderWithKibana) GetExtraMappings() ([]templates.ExtraMapping, error) { + return []templates.ExtraMapping{}, nil +} + func getTemplatesKibana() map[string]*bytes.Buffer { indexTemplates := make(map[string]*bytes.Buffer) diff --git a/process/elasticproc/transactions/transactionDBBuilder.go b/process/elasticproc/transactions/transactionDBBuilder.go index 0b497ef7..ac5818d4 100644 --- a/process/elasticproc/transactions/transactionDBBuilder.go +++ b/process/elasticproc/transactions/transactionDBBuilder.go @@ -11,6 +11,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-core-go/data/outport" "github.com/multiversx/mx-chain-core-go/data/receipt" + "github.com/multiversx/mx-chain-core-go/data/transaction" "github.com/multiversx/mx-chain-es-indexer-go/data" "github.com/multiversx/mx-chain-es-indexer-go/process/dataindexer" "github.com/multiversx/mx-chain-es-indexer-go/process/elasticproc/converters" @@ -86,7 +87,8 @@ func (dtb *dbTransactionBuilder) prepareTransaction( senderUserName := converters.TruncateFieldIfExceedsMaxLengthBase64(string(tx.SndUserName)) receiverUserName := converters.TruncateFieldIfExceedsMaxLengthBase64(string(tx.RcvUserName)) - return &data.Transaction{ + + eTx := &data.Transaction{ Hash: hex.EncodeToString(txHash), MBHash: hex.EncodeToString(mbHash), Nonce: tx.Nonce, @@ -110,19 +112,78 @@ func (dtb *dbTransactionBuilder) prepareTransaction( ReceiverUserName: []byte(receiverUserName), SenderUserName: []byte(senderUserName), IsScCall: isScCall, - Operation: res.Operation, - Function: converters.TruncateFieldIfExceedsMaxLength(res.Function), ESDTValues: esdtValues, ESDTValuesNum: esdtValuesNum, - Tokens: converters.TruncateSliceElementsIfExceedsMaxLength(res.Tokens), Receivers: receiversAddr, - ReceiversShardIDs: res.ReceiversShardID, - IsRelayed: res.IsRelayed, Version: tx.Version, GuardianAddress: guardianAddress, GuardianSignature: hex.EncodeToString(tx.GuardianSignature), ExecutionOrder: int(txInfo.ExecutionOrder), } + + isRelayedV3 := len(tx.InnerTransactions) > 0 + if isRelayedV3 { + eTx.Operation = res.Operation + dtb.addRelayedV3InfoInIndexerTx(tx, eTx, numOfShards) + + return eTx + } + + eTx.Operation = res.Operation + eTx.Function = converters.TruncateFieldIfExceedsMaxLength(res.Function) + eTx.Tokens = converters.TruncateSliceElementsIfExceedsMaxLength(res.Tokens) + eTx.ReceiversShardIDs = res.ReceiversShardID + eTx.IsRelayed = res.IsRelayed + + return eTx +} + +func (dtb *dbTransactionBuilder) addRelayedV3InfoInIndexerTx(tx *transaction.Transaction, indexerTx *data.Transaction, numOfShards uint32) { + if len(tx.InnerTransactions) == 0 { + return + } + + innerTxs := make([]*transaction.FrontendTransaction, 0, len(tx.InnerTransactions)) + receivers := make([]string, 0, len(tx.InnerTransactions)) + receiversShardIDs := make([]uint32, 0, len(tx.InnerTransactions)) + for _, innerTx := range tx.InnerTransactions { + frontEndTx := &transaction.FrontendTransaction{ + Nonce: innerTx.Nonce, + Value: innerTx.Value.String(), + Receiver: dtb.addressPubkeyConverter.SilentEncode(innerTx.RcvAddr, log), + Sender: dtb.addressPubkeyConverter.SilentEncode(innerTx.SndAddr, log), + SenderUsername: innerTx.SndUserName, + ReceiverUsername: innerTx.RcvUserName, + GasPrice: innerTx.GasPrice, + GasLimit: innerTx.GasLimit, + Data: innerTx.Data, + Signature: hex.EncodeToString(innerTx.Signature), + ChainID: string(innerTx.ChainID), + Version: innerTx.Version, + Options: innerTx.Options, + } + + if len(innerTx.GuardianAddr) > 0 { + frontEndTx.GuardianAddr = dtb.addressPubkeyConverter.SilentEncode(innerTx.GuardianAddr, log) + frontEndTx.GuardianSignature = hex.EncodeToString(innerTx.GuardianSignature) + } + + if len(innerTx.RelayerAddr) > 0 { + frontEndTx.Relayer = dtb.addressPubkeyConverter.SilentEncode(innerTx.RelayerAddr, log) + } + + receivers = append(receivers, frontEndTx.Receiver) + receiversShardIDs = append(receiversShardIDs, sharding.ComputeShardID(innerTx.RcvAddr, numOfShards)) + + innerTxs = append(innerTxs, frontEndTx) + } + + indexerTx.InnerTransactions = innerTxs + indexerTx.IsRelayed = true + indexerTx.Receivers = receivers + indexerTx.ReceiversShardIDs = receiversShardIDs + + return } func (dtb *dbTransactionBuilder) prepareRewardTransaction( diff --git a/process/elasticproc/transactions/transactionDBBuilder_test.go b/process/elasticproc/transactions/transactionDBBuilder_test.go index ceeca3de..b892166e 100644 --- a/process/elasticproc/transactions/transactionDBBuilder_test.go +++ b/process/elasticproc/transactions/transactionDBBuilder_test.go @@ -204,3 +204,130 @@ func TestGetMoveBalanceTransactionInvalid(t *testing.T) { dbTx := cp.prepareTransaction(txInfo, txHash, mbHash, mb, header, status, 3) require.Equal(t, expectedTx, dbTx) } + +func TestTxsDatabaseProcessor_PrepareTransactionRelayedV3(t *testing.T) { + t.Parallel() + + txHash := []byte("txHash") + mbHash := []byte("mbHash") + mb := &block.MiniBlock{TxHashes: [][]byte{txHash}} + header := &block.Header{Nonce: 2} + status := "Success" + gasPrice := uint64(1000) + gasLimit := uint64(1000) + cp := createCommonProcessor() + + tx := &transaction.Transaction{ + Nonce: 1, + Value: big.NewInt(1000), + RcvAddr: []byte("receiver"), + SndAddr: []byte("sender"), + GasPrice: gasPrice, + GasLimit: gasLimit, + ChainID: []byte("1"), + Version: 1, + Signature: []byte("signature"), + RcvUserName: []byte("rcv"), + SndUserName: []byte("snd"), + InnerTransactions: []*transaction.Transaction{ + { + Nonce: 2, + Value: big.NewInt(1000), + SndAddr: []byte("inner1"), + RcvAddr: []byte("rcv1"), + Data: []byte("data1"), + Signature: []byte("signature1"), + GasPrice: gasPrice, + GasLimit: gasLimit, + ChainID: []byte("1"), + Version: 1, + }, + { + Nonce: 3, + Value: big.NewInt(1), + SndAddr: []byte("inner2"), + RcvAddr: []byte("rcv2"), + Data: []byte("data2"), + Signature: []byte("signature2"), + GasPrice: gasPrice, + GasLimit: gasLimit, + ChainID: []byte("1"), + Version: 1, + }, + }, + } + + txInfo := &outport.TxInfo{ + Transaction: tx, + FeeInfo: &outport.FeeInfo{ + GasUsed: 500, + Fee: big.NewInt(100), + InitialPaidFee: big.NewInt(100), + }, + ExecutionOrder: 0, + } + + senderAddr, err := cp.addressPubkeyConverter.Encode(tx.RcvAddr) + require.Nil(t, err) + receiverAddr, err := cp.addressPubkeyConverter.Encode(tx.SndAddr) + require.Nil(t, err) + + expectedTx := &data.Transaction{ + Hash: hex.EncodeToString(txHash), + MBHash: hex.EncodeToString(mbHash), + Nonce: tx.Nonce, + Round: header.Round, + Value: tx.Value.String(), + ValueNum: 1e-15, + Receiver: senderAddr, + Sender: receiverAddr, + ReceiverShard: mb.ReceiverShardID, + SenderShard: mb.SenderShardID, + GasPrice: gasPrice, + GasLimit: gasLimit, + GasUsed: uint64(500), + InitialPaidFee: "100", + Signature: hex.EncodeToString(tx.Signature), + Timestamp: time.Duration(header.GetTimeStamp()), + Status: status, + Fee: "100", + FeeNum: 1e-16, + ReceiverUserName: []byte("rcv"), + SenderUserName: []byte("snd"), + ESDTValuesNum: []float64{}, + Operation: "transfer", + Version: 1, + Receivers: []string{"72637631", "72637632"}, + ReceiversShardIDs: []uint32{1, 2}, + InnerTransactions: []*transaction.FrontendTransaction{ + { + Nonce: 2, + Value: "1000", + Sender: "696e6e657231", + Receiver: "72637631", + GasPrice: gasPrice, + GasLimit: gasLimit, + Signature: "7369676e617475726531", + Data: []byte("data1"), + Version: 1, + ChainID: "1", + }, + { + Nonce: 3, + Value: "1", + Sender: "696e6e657232", + Receiver: "72637632", + GasPrice: gasPrice, + GasLimit: gasLimit, + Signature: "7369676e617475726532", + Data: []byte("data2"), + Version: 1, + ChainID: "1", + }, + }, + IsRelayed: true, + } + + dbTx := cp.prepareTransaction(txInfo, txHash, mbHash, mb, header, status, 3) + require.Equal(t, expectedTx, dbTx) +} diff --git a/templates/noKibana/innerTx.go b/templates/noKibana/innerTx.go new file mode 100644 index 00000000..c97f5cbe --- /dev/null +++ b/templates/noKibana/innerTx.go @@ -0,0 +1,63 @@ +package noKibana + +// InnerTxs will hold the configuration for the inner transaction structure +var InnerTxs = Object{ + "properties": Object{ + "innerTransactions": Object{ + "properties": Object{ + "nonce": Object{ + "type": "double", + }, + "value": Object{ + "type": "keyword", + }, + "sender": Object{ + "type": "keyword", + }, + "receiver": Object{ + "type": "keyword", + }, + "senderUserName": Object{ + "type": "keyword", + }, + "receiverUsername": Object{ + "type": "keyword", + }, + "gasLimit": Object{ + "index": "false", + "type": "double", + }, + "gasPrice": Object{ + "index": "false", + "type": "double", + }, + "data": Object{ + "type": "text", + }, + "signature": Object{ + "index": "false", + "type": "keyword", + }, + "chainID": Object{ + "type": "keyword", + }, + "version": Object{ + "type": "long", + }, + "options": Object{ + "type": "long", + }, + "guardian": Object{ + "type": "keyword", + }, + "guardianSignature": Object{ + "index": "false", + "type": "keyword", + }, + "relayer": Object{ + "type": "keyword", + }, + }, + }, + }, +} diff --git a/templates/types.go b/templates/types.go index 74371fb5..3d776138 100644 --- a/templates/types.go +++ b/templates/types.go @@ -5,6 +5,12 @@ import ( "encoding/json" ) +// ExtraMapping holds the tuple for the index and extra mappings +type ExtraMapping struct { + Index string + Mappings *bytes.Buffer +} + // Array type will rename type []interface{} type Array []interface{} From f59580a961ca53b9b9dfe5de60fd0db6f69ef57d Mon Sep 17 00:00:00 2001 From: miiu Date: Mon, 8 Jul 2024 11:57:29 +0300 Subject: [PATCH 15/29] fix unit tests --- mock/databaseWriterStub.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mock/databaseWriterStub.go b/mock/databaseWriterStub.go index 9a41e0ff..1df608a8 100644 --- a/mock/databaseWriterStub.go +++ b/mock/databaseWriterStub.go @@ -14,6 +14,11 @@ type DatabaseWriterStub struct { DoScrollRequestCalled func(index string, body []byte, withSource bool, handlerFunc func(responseBytes []byte) error) error } +// PutMappings - +func (dwm *DatabaseWriterStub) PutMappings(_ string, _ *bytes.Buffer) error { + return nil +} + // UpdateByQuery - func (dwm *DatabaseWriterStub) UpdateByQuery(_ context.Context, _ string, _ *bytes.Buffer) error { return nil From e7f4007f995a42aa61363e2122793075d03928a8 Mon Sep 17 00:00:00 2001 From: miiu Date: Mon, 8 Jul 2024 11:59:33 +0300 Subject: [PATCH 16/29] fix linter issues --- process/elasticproc/transactions/transactionDBBuilder.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/process/elasticproc/transactions/transactionDBBuilder.go b/process/elasticproc/transactions/transactionDBBuilder.go index ac5818d4..aa9808eb 100644 --- a/process/elasticproc/transactions/transactionDBBuilder.go +++ b/process/elasticproc/transactions/transactionDBBuilder.go @@ -182,8 +182,6 @@ func (dtb *dbTransactionBuilder) addRelayedV3InfoInIndexerTx(tx *transaction.Tra indexerTx.IsRelayed = true indexerTx.Receivers = receivers indexerTx.ReceiversShardIDs = receiversShardIDs - - return } func (dtb *dbTransactionBuilder) prepareRewardTransaction( From e632bc2407a4dfdc076e74bfc1bd6f59cb3d4d63 Mon Sep 17 00:00:00 2001 From: miiu Date: Mon, 8 Jul 2024 12:04:53 +0300 Subject: [PATCH 17/29] new mappings in transaction and operation index --- templates/noKibana/operations.go | 56 ++++++++++++++++++++++++++++++ templates/noKibana/transactions.go | 56 ++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) diff --git a/templates/noKibana/operations.go b/templates/noKibana/operations.go index 8c734d9d..9834f19b 100644 --- a/templates/noKibana/operations.go +++ b/templates/noKibana/operations.go @@ -169,6 +169,62 @@ var Operations = Object{ "index": "false", "type": "keyword", }, + "innerTransactions": Object{ + "properties": Object{ + "nonce": Object{ + "type": "double", + }, + "value": Object{ + "type": "keyword", + }, + "sender": Object{ + "type": "keyword", + }, + "receiver": Object{ + "type": "keyword", + }, + "senderUserName": Object{ + "type": "keyword", + }, + "receiverUsername": Object{ + "type": "keyword", + }, + "gasLimit": Object{ + "index": "false", + "type": "double", + }, + "gasPrice": Object{ + "index": "false", + "type": "double", + }, + "data": Object{ + "type": "text", + }, + "signature": Object{ + "index": "false", + "type": "keyword", + }, + "chainID": Object{ + "type": "keyword", + }, + "version": Object{ + "type": "long", + }, + "options": Object{ + "type": "long", + }, + "guardian": Object{ + "type": "keyword", + }, + "guardianSignature": Object{ + "index": "false", + "type": "keyword", + }, + "relayer": Object{ + "type": "keyword", + }, + }, + }, }, }, } diff --git a/templates/noKibana/transactions.go b/templates/noKibana/transactions.go index 91ebea75..16ddef08 100644 --- a/templates/noKibana/transactions.go +++ b/templates/noKibana/transactions.go @@ -135,6 +135,62 @@ var Transactions = Object{ "index": "false", "type": "keyword", }, + "innerTransactions": Object{ + "properties": Object{ + "nonce": Object{ + "type": "double", + }, + "value": Object{ + "type": "keyword", + }, + "sender": Object{ + "type": "keyword", + }, + "receiver": Object{ + "type": "keyword", + }, + "senderUserName": Object{ + "type": "keyword", + }, + "receiverUsername": Object{ + "type": "keyword", + }, + "gasLimit": Object{ + "index": "false", + "type": "double", + }, + "gasPrice": Object{ + "index": "false", + "type": "double", + }, + "data": Object{ + "type": "text", + }, + "signature": Object{ + "index": "false", + "type": "keyword", + }, + "chainID": Object{ + "type": "keyword", + }, + "version": Object{ + "type": "long", + }, + "options": Object{ + "type": "long", + }, + "guardian": Object{ + "type": "keyword", + }, + "guardianSignature": Object{ + "index": "false", + "type": "keyword", + }, + "relayer": Object{ + "type": "keyword", + }, + }, + }, }, }, } From 643032ac245a6336a579dfa8f4e23d6d66214c67 Mon Sep 17 00:00:00 2001 From: miiu Date: Mon, 8 Jul 2024 12:11:28 +0300 Subject: [PATCH 18/29] comments --- client/elasticClient.go | 1 + process/elasticproc/templatesAndPolicies/withKibana.go | 1 + 2 files changed, 2 insertions(+) diff --git a/client/elasticClient.go b/client/elasticClient.go index 5ae130a4..f388c049 100644 --- a/client/elasticClient.go +++ b/client/elasticClient.go @@ -85,6 +85,7 @@ func (ec *elasticClient) CheckAndCreateIndex(indexName string) error { return ec.createIndex(indexName) } +// PutMappings will put the provided mappings to a given index func (ec *elasticClient) PutMappings(indexName string, mappings *bytes.Buffer) error { res, err := ec.client.Indices.PutMapping( mappings, diff --git a/process/elasticproc/templatesAndPolicies/withKibana.go b/process/elasticproc/templatesAndPolicies/withKibana.go index 33ddaa23..7ffe6b2f 100644 --- a/process/elasticproc/templatesAndPolicies/withKibana.go +++ b/process/elasticproc/templatesAndPolicies/withKibana.go @@ -23,6 +23,7 @@ func (tr *templatesAndPolicyReaderWithKibana) GetElasticTemplatesAndPolicies() ( return indexTemplates, indexPolicies, nil } +// GetExtraMappings will return an array of indices extra mappings func (tr *templatesAndPolicyReaderWithKibana) GetExtraMappings() ([]templates.ExtraMapping, error) { return []templates.ExtraMapping{}, nil } From 98808ec1d4da3146098ba2f6d1a5a860fa03eca2 Mon Sep 17 00:00:00 2001 From: miiu Date: Tue, 16 Jul 2024 15:27:46 +0300 Subject: [PATCH 19/29] fixes after review --- integrationtests/testdata/relayedTxV3/relayed-tx-v3.json | 2 +- process/elasticproc/transactions/transactionDBBuilder.go | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/integrationtests/testdata/relayedTxV3/relayed-tx-v3.json b/integrationtests/testdata/relayedTxV3/relayed-tx-v3.json index 62a67fa1..210df682 100644 --- a/integrationtests/testdata/relayedTxV3/relayed-tx-v3.json +++ b/integrationtests/testdata/relayedTxV3/relayed-tx-v3.json @@ -51,4 +51,4 @@ "version": 0 } ] -} \ No newline at end of file +} diff --git a/process/elasticproc/transactions/transactionDBBuilder.go b/process/elasticproc/transactions/transactionDBBuilder.go index aa9808eb..f22e1a31 100644 --- a/process/elasticproc/transactions/transactionDBBuilder.go +++ b/process/elasticproc/transactions/transactionDBBuilder.go @@ -119,17 +119,16 @@ func (dtb *dbTransactionBuilder) prepareTransaction( GuardianAddress: guardianAddress, GuardianSignature: hex.EncodeToString(tx.GuardianSignature), ExecutionOrder: int(txInfo.ExecutionOrder), + Operation: res.Operation, } isRelayedV3 := len(tx.InnerTransactions) > 0 if isRelayedV3 { - eTx.Operation = res.Operation dtb.addRelayedV3InfoInIndexerTx(tx, eTx, numOfShards) return eTx } - eTx.Operation = res.Operation eTx.Function = converters.TruncateFieldIfExceedsMaxLength(res.Function) eTx.Tokens = converters.TruncateSliceElementsIfExceedsMaxLength(res.Tokens) eTx.ReceiversShardIDs = res.ReceiversShardID From b3457c5308ca7af0e1497b5efb5fe4ed50ef5ad8 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 25 Jul 2024 10:39:33 +0300 Subject: [PATCH 20/29] updated deps after merge --- go.mod | 8 ++++---- go.sum | 18 +++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 46f09b26..f2181902 100644 --- a/go.mod +++ b/go.mod @@ -6,10 +6,10 @@ require ( github.com/elastic/go-elasticsearch/v7 v7.12.0 github.com/gin-contrib/cors v1.4.0 github.com/gin-gonic/gin v1.9.1 - github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240508074652-e128a1c05c8e - github.com/multiversx/mx-chain-core-go v1.2.21-0.20240508071047-fefea5737840 - github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240508072523-3f00a726af57 - github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240619122724-2bd2e64cebdc + github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240725071304-ebce652ff65d + github.com/multiversx/mx-chain-core-go v1.2.21-0.20240725065431-6e9bfee5a4c6 + github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240725065747-176bd697c775 + github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240725072715-8806f1301087 github.com/prometheus/client_model v0.4.0 github.com/prometheus/common v0.37.0 github.com/stretchr/testify v1.8.4 diff --git a/go.sum b/go.sum index ad53f92a..8fd47328 100644 --- a/go.sum +++ b/go.sum @@ -247,15 +247,15 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240508074652-e128a1c05c8e h1:Tsmwhu+UleE+l3buPuqXSKTqfu5FbPmzQ4MjMoUvCWA= -github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240508074652-e128a1c05c8e/go.mod h1:2yXl18wUbuV3cRZr7VHxM1xo73kTaC1WUcu2kx8R034= -github.com/multiversx/mx-chain-core-go v1.2.21-0.20240508071047-fefea5737840 h1:2mCrTUmbbA+Xv4UifZY9xptrGjcJBcJ2wavSb4FwejU= -github.com/multiversx/mx-chain-core-go v1.2.21-0.20240508071047-fefea5737840/go.mod h1:B5zU4MFyJezmEzCsAHE9YNULmGCm2zbPHvl9hazNxmE= -github.com/multiversx/mx-chain-crypto-go v1.2.12-0.20240508074452-cc21c1b505df h1:clihfi78bMEOWk/qw6WA4uQbCM2e2NGliqswLAvw19k= -github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240508072523-3f00a726af57 h1:g9t410dqjcb7UUptbVd/H6Ua12sEzWU4v7VplyNvRZ0= -github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240508072523-3f00a726af57/go.mod h1:cY6CIXpndW5g5PTPn4WzPwka/UBEf+mgw+PSY5pHGAU= -github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240619122724-2bd2e64cebdc h1:KpLloX0pIclo3axCQVOm3wZE+U9cfeHgPWGvDuUohTk= -github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240619122724-2bd2e64cebdc/go.mod h1:RgGmPei0suQcFTHfO4cS5dxJSiokp2SM5lmNgp1icMo= +github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240725071304-ebce652ff65d h1:grQCJW4DCvvIQ6q84sy23oAp8XQ8Dxr3Js8aoh+m99M= +github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240725071304-ebce652ff65d/go.mod h1:hFGM+O7rt+gWXSHFoRjC3/oN0OJfPfeFAxqXIac5UdQ= +github.com/multiversx/mx-chain-core-go v1.2.21-0.20240725065431-6e9bfee5a4c6 h1:Q7uUjTYTrt8Mw9oq5JWPv+WHhpxHTv6lhZZlhPuNcoQ= +github.com/multiversx/mx-chain-core-go v1.2.21-0.20240725065431-6e9bfee5a4c6/go.mod h1:B5zU4MFyJezmEzCsAHE9YNULmGCm2zbPHvl9hazNxmE= +github.com/multiversx/mx-chain-crypto-go v1.2.12-0.20240725071000-c3212540166f h1:jydjrmVFvSllBOTppveOAkLITpOYKk0kma5z0bfDImI= +github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240725065747-176bd697c775 h1:a8LOfz3p4MQfRtbF00rGDAJiebziwtSfVmBHIaHBDdY= +github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240725065747-176bd697c775/go.mod h1:owPYyrK7RcsLx9eOCAZQ22fIyW6BE7ttJr4XIhFIbQw= +github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240725072715-8806f1301087 h1:ovxs8X50iBL9TOkn0qHrkuXrBS1Y/EWfQOYmFEaXRNs= +github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240725072715-8806f1301087/go.mod h1:nNGN+rdLRN8Nd6OhFGrkEZS5Ipj5IQCvFT0L/iQbOpU= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= From eaa70a314cb28c0c9442bf98e78a9b49783de133 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 29 Jul 2024 11:05:53 +0300 Subject: [PATCH 21/29] updated deps --- go.mod | 8 ++++---- go.sum | 18 +++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index f2181902..eb32dd80 100644 --- a/go.mod +++ b/go.mod @@ -6,10 +6,10 @@ require ( github.com/elastic/go-elasticsearch/v7 v7.12.0 github.com/gin-contrib/cors v1.4.0 github.com/gin-gonic/gin v1.9.1 - github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240725071304-ebce652ff65d - github.com/multiversx/mx-chain-core-go v1.2.21-0.20240725065431-6e9bfee5a4c6 - github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240725065747-176bd697c775 - github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240725072715-8806f1301087 + github.com/multiversx/mx-chain-communication-go v1.1.0 + github.com/multiversx/mx-chain-core-go v1.2.21 + github.com/multiversx/mx-chain-logger-go v1.0.15 + github.com/multiversx/mx-chain-vm-common-go v1.5.13 github.com/prometheus/client_model v0.4.0 github.com/prometheus/common v0.37.0 github.com/stretchr/testify v1.8.4 diff --git a/go.sum b/go.sum index 8fd47328..82f3a0f7 100644 --- a/go.sum +++ b/go.sum @@ -247,15 +247,15 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240725071304-ebce652ff65d h1:grQCJW4DCvvIQ6q84sy23oAp8XQ8Dxr3Js8aoh+m99M= -github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240725071304-ebce652ff65d/go.mod h1:hFGM+O7rt+gWXSHFoRjC3/oN0OJfPfeFAxqXIac5UdQ= -github.com/multiversx/mx-chain-core-go v1.2.21-0.20240725065431-6e9bfee5a4c6 h1:Q7uUjTYTrt8Mw9oq5JWPv+WHhpxHTv6lhZZlhPuNcoQ= -github.com/multiversx/mx-chain-core-go v1.2.21-0.20240725065431-6e9bfee5a4c6/go.mod h1:B5zU4MFyJezmEzCsAHE9YNULmGCm2zbPHvl9hazNxmE= -github.com/multiversx/mx-chain-crypto-go v1.2.12-0.20240725071000-c3212540166f h1:jydjrmVFvSllBOTppveOAkLITpOYKk0kma5z0bfDImI= -github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240725065747-176bd697c775 h1:a8LOfz3p4MQfRtbF00rGDAJiebziwtSfVmBHIaHBDdY= -github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240725065747-176bd697c775/go.mod h1:owPYyrK7RcsLx9eOCAZQ22fIyW6BE7ttJr4XIhFIbQw= -github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240725072715-8806f1301087 h1:ovxs8X50iBL9TOkn0qHrkuXrBS1Y/EWfQOYmFEaXRNs= -github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240725072715-8806f1301087/go.mod h1:nNGN+rdLRN8Nd6OhFGrkEZS5Ipj5IQCvFT0L/iQbOpU= +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.21 h1:+XVKznPTlUU5EFS1A8chtS8fStW60upRIyF4Pgml19I= +github.com/multiversx/mx-chain-core-go v1.2.21/go.mod h1:B5zU4MFyJezmEzCsAHE9YNULmGCm2zbPHvl9hazNxmE= +github.com/multiversx/mx-chain-crypto-go v1.2.12 h1:zWip7rpUS4CGthJxfKn5MZfMfYPjVjIiCID6uX5BSOk= +github.com/multiversx/mx-chain-logger-go v1.0.15 h1:HlNdK8etyJyL9NQ+6mIXyKPEBo+wRqOwi3n+m2QIHXc= +github.com/multiversx/mx-chain-logger-go v1.0.15/go.mod h1:t3PRKaWB1M+i6gUfD27KXgzLJJC+mAQiN+FLlL1yoGQ= +github.com/multiversx/mx-chain-vm-common-go v1.5.13 h1:ymnIHJW4Z4mFa0hZzla4fozkF30vjH5O1q+Y7Ftc+pQ= +github.com/multiversx/mx-chain-vm-common-go v1.5.13/go.mod h1:OSvFbzdWThfRbLZbUsEr7bikBSaLrPJQ2iUm9jw9nXQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= From 70ffce2cd32bf983b99945b8d8a05722ae1f9114 Mon Sep 17 00:00:00 2001 From: Iulian Pascalau Date: Tue, 30 Jul 2024 13:33:27 +0300 Subject: [PATCH 22/29] - added docker build action --- .github/workflows/deploy-docker.yml | 54 +++++++++++++++++++++++++++++ Dockerfile | 2 +- 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/deploy-docker.yml diff --git a/.github/workflows/deploy-docker.yml b/.github/workflows/deploy-docker.yml new file mode 100644 index 00000000..b9cac20e --- /dev/null +++ b/.github/workflows/deploy-docker.yml @@ -0,0 +1,54 @@ +name: Publish Docker image + +on: + release: + types: [published] + +jobs: + push_to_registry: + name: Push Docker image to Docker Hub + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + attestations: write + steps: + - name: Check out the repo + uses: actions/checkout@v4 + + - name: Set up Go 1.x + uses: actions/setup-go@v2 + with: + go-version: 1.20.7 + id: go + + - name: Get dependencies + run: | + go mod download + if [ -f Gopkg.toml ]; then + curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh + dep ensure + fi + + - name: Log in to Docker Hub + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: multiversx/elastic-indexer + + - name: Build and push Docker image + id: push + uses: docker/build-push-action@events-notifier3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: . + file: ./Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + diff --git a/Dockerfile b/Dockerfile index d4436ca2..33ba0102 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.20.5 as builder +FROM golang:1.20.7 as builder RUN apt-get update && apt-get install -y From 275fccc3cb38997a9102381104b39ee6df15e354 Mon Sep 17 00:00:00 2001 From: Iulian Pascalau Date: Tue, 30 Jul 2024 14:28:32 +0300 Subject: [PATCH 23/29] - fixed docker build --- .github/workflows/deploy-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-docker.yml b/.github/workflows/deploy-docker.yml index b9cac20e..c3fe1998 100644 --- a/.github/workflows/deploy-docker.yml +++ b/.github/workflows/deploy-docker.yml @@ -44,7 +44,7 @@ jobs: - name: Build and push Docker image id: push - uses: docker/build-push-action@events-notifier3b5e8027fcad23fda98b2e3ac259d8d67585f671 + uses: docker/build-push-action@elastic-indexer3b5e8027fcad23fda98b2e3ac259d8d67585f671 with: context: . file: ./Dockerfile From 3392d77fdfe35d5df76a5bef491fbe60b366ceb2 Mon Sep 17 00:00:00 2001 From: Iulian Pascalau Date: Tue, 30 Jul 2024 14:44:23 +0300 Subject: [PATCH 24/29] - fixed docker build --- .github/workflows/deploy-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-docker.yml b/.github/workflows/deploy-docker.yml index c3fe1998..df006e3f 100644 --- a/.github/workflows/deploy-docker.yml +++ b/.github/workflows/deploy-docker.yml @@ -44,7 +44,7 @@ jobs: - name: Build and push Docker image id: push - uses: docker/build-push-action@elastic-indexer3b5e8027fcad23fda98b2e3ac259d8d67585f671 + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 with: context: . file: ./Dockerfile From b1cd8050835663f0d57862023fdbbcc814b4dcdd Mon Sep 17 00:00:00 2001 From: miiu Date: Wed, 7 Aug 2024 12:41:19 +0300 Subject: [PATCH 25/29] fix transaction status --- integrationtests/relayedTxV3_test.go | 274 +++++++++++++++++- .../relayed-tx-v3-with-events.json | 70 +++++ .../relayed-v3-execution-scr-on-dest.json | 58 ++++ .../relayed-v3-execution-source.json | 57 ++++ .../logsevents/informativeLogsProcessor.go | 5 + process/elasticproc/transactions/serialize.go | 4 + 6 files changed, 466 insertions(+), 2 deletions(-) create mode 100644 integrationtests/testdata/relayedTxV3/relayed-tx-v3-with-events.json create mode 100644 integrationtests/testdata/relayedTxV3/relayed-v3-execution-scr-on-dest.json create mode 100644 integrationtests/testdata/relayedTxV3/relayed-v3-execution-source.json diff --git a/integrationtests/relayedTxV3_test.go b/integrationtests/relayedTxV3_test.go index d492c753..e440c215 100644 --- a/integrationtests/relayedTxV3_test.go +++ b/integrationtests/relayedTxV3_test.go @@ -5,13 +5,16 @@ package integrationtests import ( "context" "encoding/hex" + "math/big" + "testing" + + "github.com/multiversx/mx-chain-core-go/core" dataBlock "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-core-go/data/outport" + "github.com/multiversx/mx-chain-core-go/data/smartContractResult" "github.com/multiversx/mx-chain-core-go/data/transaction" indexerdata "github.com/multiversx/mx-chain-es-indexer-go/process/dataindexer" "github.com/stretchr/testify/require" - "math/big" - "testing" ) func TestRelayedTxV3(t *testing.T) { @@ -97,3 +100,270 @@ func TestRelayedTxV3(t *testing.T) { string(genericResponse.Docs[0].Source), ) } + +func TestRelayedTxV3WithSignalErrorAndCompletedEvent(t *testing.T) { + setLogLevelDebug() + + esClient, err := createESClient(esURL) + require.Nil(t, err) + + esProc, err := CreateElasticProcessor(esClient) + require.Nil(t, err) + + txHash := []byte("relayedTxV3WithSignalErrorAndCompletedEvent") + header := &dataBlock.Header{ + Round: 50, + TimeStamp: 5040, + } + + body := &dataBlock.Body{ + MiniBlocks: dataBlock.MiniBlockSlice{ + { + Type: dataBlock.TxBlock, + SenderShardID: 0, + ReceiverShardID: 0, + TxHashes: [][]byte{txHash}, + }, + }, + } + + initialTx := &transaction.Transaction{ + Nonce: 1000, + SndAddr: decodeAddress("erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a"), + RcvAddr: decodeAddress("erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a"), + GasLimit: 300_000, + GasPrice: 1000000000, + Value: big.NewInt(0), + InnerTransactions: []*transaction.Transaction{ + { + Nonce: 5, + SndAddr: decodeAddress("erd10ksryjr065ad5475jcg82pnjfg9j9qtszjsrp24anl6ym7cmeddshwnru8"), + RcvAddr: decodeAddress("erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r"), + GasLimit: 50_000, + GasPrice: 1000000000, + Value: big.NewInt(10000000000000000), + }, + { + Nonce: 3, + SndAddr: decodeAddress("erd10ksryjr065ad5475jcg82pnjfg9j9qtszjsrp24anl6ym7cmeddshwnru8"), + RcvAddr: decodeAddress("erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r"), + GasLimit: 50_000, + GasPrice: 1000000000, + Value: big.NewInt(10000000000000000), + }, + { + Nonce: 4, + SndAddr: decodeAddress("erd10ksryjr065ad5475jcg82pnjfg9j9qtszjsrp24anl6ym7cmeddshwnru8"), + RcvAddr: decodeAddress("erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r"), + GasLimit: 50_000, + GasPrice: 1000000000, + Value: big.NewInt(10000000000000000), + }, + }, + } + + txInfo := &outport.TxInfo{ + Transaction: initialTx, + FeeInfo: &outport.FeeInfo{ + GasUsed: 10556000, + Fee: big.NewInt(2257820000000000), + InitialPaidFee: big.NewInt(2306320000000000), + }, + ExecutionOrder: 0, + } + + pool := &outport.TransactionPool{ + Transactions: map[string]*outport.TxInfo{ + hex.EncodeToString(txHash): txInfo, + }, + Logs: []*outport.LogData{ + { + TxHash: hex.EncodeToString(txHash), + Log: &transaction.Log{ + Address: decodeAddress("erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a"), + Events: []*transaction.Event{ + { + Address: decodeAddress("erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a"), + Identifier: []byte(core.CompletedTxEventIdentifier), + Topics: [][]byte{[]byte("t1"), []byte("t2")}, + }, + nil, + }, + }, + }, + { + TxHash: hex.EncodeToString(txHash), + Log: &transaction.Log{ + Address: decodeAddress("erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a"), + Events: []*transaction.Event{ + { + Address: decodeAddress("erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a"), + Identifier: []byte(core.SignalErrorOperation), + Topics: [][]byte{[]byte("t1"), []byte("t2")}, + }, + nil, + }, + }, + }, + }, + } + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + + ids := []string{hex.EncodeToString(txHash)} + genericResponse := &GenericResponse{} + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TransactionsIndex, true, genericResponse) + require.Nil(t, err) + + require.JSONEq(t, + readExpectedResult("./testdata/relayedTxV3/relayed-tx-v3-with-events.json"), + string(genericResponse.Docs[0].Source), + ) +} + +func TestRelayedV3WithSCRCross(t *testing.T) { + setLogLevelDebug() + + esClient, err := createESClient(esURL) + require.Nil(t, err) + + esProc, err := CreateElasticProcessor(esClient) + require.Nil(t, err) + + txHash := []byte("relayedTxV3WithScrCross") + header := &dataBlock.Header{ + Round: 50, + TimeStamp: 5040, + } + + body := &dataBlock.Body{ + MiniBlocks: dataBlock.MiniBlockSlice{ + { + Type: dataBlock.TxBlock, + SenderShardID: 0, + ReceiverShardID: 0, + TxHashes: [][]byte{txHash}, + }, + }, + } + + initialTx := &transaction.Transaction{ + Nonce: 1000, + SndAddr: decodeAddress("erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a"), + RcvAddr: decodeAddress("erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a"), + GasLimit: 300_000, + GasPrice: 1000000000, + Value: big.NewInt(0), + InnerTransactions: []*transaction.Transaction{ + { + Nonce: 5, + SndAddr: decodeAddress("erd10ksryjr065ad5475jcg82pnjfg9j9qtszjsrp24anl6ym7cmeddshwnru8"), + RcvAddr: decodeAddress("erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r"), + GasLimit: 50_000, + GasPrice: 1000000000, + Value: big.NewInt(10000000000000000), + }, + { + Nonce: 3, + SndAddr: decodeAddress("erd10ksryjr065ad5475jcg82pnjfg9j9qtszjsrp24anl6ym7cmeddshwnru8"), + RcvAddr: decodeAddress("erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r"), + GasLimit: 50_000, + GasPrice: 1000000000, + Value: big.NewInt(10000000000000000), + }, + }, + } + + txInfo := &outport.TxInfo{ + Transaction: initialTx, + FeeInfo: &outport.FeeInfo{ + GasUsed: 10556000, + Fee: big.NewInt(2257820000000000), + InitialPaidFee: big.NewInt(2306320000000000), + }, + ExecutionOrder: 0, + } + + pool := &outport.TransactionPool{ + Transactions: map[string]*outport.TxInfo{ + hex.EncodeToString(txHash): txInfo, + }, + Logs: []*outport.LogData{ + { + TxHash: hex.EncodeToString(txHash), + Log: &transaction.Log{ + Address: decodeAddress("erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a"), + Events: []*transaction.Event{ + { + Address: decodeAddress("erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a"), + Identifier: []byte(core.CompletedTxEventIdentifier), + Topics: [][]byte{[]byte("t1"), []byte("t2")}, + }, + nil, + }, + }, + }, + }, + } + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + + ids := []string{hex.EncodeToString(txHash)} + genericResponse := &GenericResponse{} + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TransactionsIndex, true, genericResponse) + require.Nil(t, err) + + require.JSONEq(t, + readExpectedResult("./testdata/relayedTxV3/relayed-v3-execution-source.json"), + string(genericResponse.Docs[0].Source), + ) + + // execute scr on destination + header = &dataBlock.Header{ + Round: 60, + TimeStamp: 6040, + } + + scrInfo := &outport.SCRInfo{ + SmartContractResult: &smartContractResult.SmartContractResult{ + OriginalTxHash: txHash, + }, + FeeInfo: &outport.FeeInfo{ + Fee: big.NewInt(0), + InitialPaidFee: big.NewInt(0), + }, + ExecutionOrder: 0, + } + + pool = &outport.TransactionPool{ + SmartContractResults: map[string]*outport.SCRInfo{ + hex.EncodeToString([]byte("scr")): scrInfo, + }, + Logs: []*outport.LogData{ + { + TxHash: hex.EncodeToString([]byte("scr")), + Log: &transaction.Log{ + Address: decodeAddress("erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a"), + Events: []*transaction.Event{ + { + Address: decodeAddress("erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a"), + Identifier: []byte(core.SignalErrorOperation), + Topics: [][]byte{[]byte("t1"), []byte("t2")}, + }, + nil, + }, + }, + }, + }, + } + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TransactionsIndex, true, genericResponse) + require.Nil(t, err) + + require.JSONEq(t, + readExpectedResult("./testdata/relayedTxV3/relayed-v3-execution-scr-on-dest.json"), + string(genericResponse.Docs[0].Source), + ) +} diff --git a/integrationtests/testdata/relayedTxV3/relayed-tx-v3-with-events.json b/integrationtests/testdata/relayedTxV3/relayed-tx-v3-with-events.json new file mode 100644 index 00000000..f60cafb2 --- /dev/null +++ b/integrationtests/testdata/relayedTxV3/relayed-tx-v3-with-events.json @@ -0,0 +1,70 @@ +{ + "miniBlockHash": "2b8a2e2b21d1cf1c5e3d782552810a07818e6b179dd196e901466bb588fc387a", + "nonce": 1000, + "round": 50, + "value": "0", + "valueNum": 0, + "receiver": "erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a", + "sender": "erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a", + "receiverShard": 0, + "senderShard": 0, + "gasPrice": 1000000000, + "gasLimit": 300000, + "gasUsed": 10556000, + "fee": "2257820000000000", + "feeNum": 0.00225782, + "initialPaidFee": "2306320000000000", + "data": null, + "signature": "", + "timestamp": 5040, + "status": "success", + "searchOrder": 0, + "hasOperations": true, + "hasLogs": true, + "receivers": [ + "erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r", + "erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r", + "erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r" + ], + "receiversShardIDs": [ + 1, + 1, + 1 + ], + "operation": "transfer", + "isRelayed": true, + "errorEvent": true, + "completedEvent": true, + "innerTransactions": [ + { + "nonce": 5, + "value": "10000000000000000", + "receiver": "erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r", + "sender": "erd10ksryjr065ad5475jcg82pnjfg9j9qtszjsrp24anl6ym7cmeddshwnru8", + "gasPrice": 1000000000, + "gasLimit": 50000, + "chainID": "", + "version": 0 + }, + { + "nonce": 3, + "value": "10000000000000000", + "receiver": "erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r", + "sender": "erd10ksryjr065ad5475jcg82pnjfg9j9qtszjsrp24anl6ym7cmeddshwnru8", + "gasPrice": 1000000000, + "gasLimit": 50000, + "chainID": "", + "version": 0 + }, + { + "nonce": 4, + "value": "10000000000000000", + "receiver": "erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r", + "sender": "erd10ksryjr065ad5475jcg82pnjfg9j9qtszjsrp24anl6ym7cmeddshwnru8", + "gasPrice": 1000000000, + "gasLimit": 50000, + "chainID": "", + "version": 0 + } + ] +} diff --git a/integrationtests/testdata/relayedTxV3/relayed-v3-execution-scr-on-dest.json b/integrationtests/testdata/relayedTxV3/relayed-v3-execution-scr-on-dest.json new file mode 100644 index 00000000..e525f876 --- /dev/null +++ b/integrationtests/testdata/relayedTxV3/relayed-v3-execution-scr-on-dest.json @@ -0,0 +1,58 @@ +{ + "miniBlockHash": "5fba08d48700058cf2789651a50ebaa35ee559ce51ee43a709943c6a4f763d25", + "nonce": 1000, + "round": 50, + "value": "0", + "valueNum": 0, + "receiver": "erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a", + "sender": "erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a", + "receiverShard": 0, + "senderShard": 0, + "gasPrice": 1000000000, + "gasLimit": 300000, + "gasUsed": 10556000, + "fee": "2257820000000000", + "feeNum": 0.00225782, + "initialPaidFee": "2306320000000000", + "data": null, + "signature": "", + "timestamp": 5040, + "status": "success", + "searchOrder": 0, + "hasOperations": true, + "hasLogs": true, + "receivers": [ + "erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r", + "erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r" + ], + "receiversShardIDs": [ + 1, + 1 + ], + "operation": "transfer", + "isRelayed": true, + "completedEvent": true, + "errorEvent": true, + "innerTransactions": [ + { + "nonce": 5, + "value": "10000000000000000", + "receiver": "erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r", + "sender": "erd10ksryjr065ad5475jcg82pnjfg9j9qtszjsrp24anl6ym7cmeddshwnru8", + "gasPrice": 1000000000, + "gasLimit": 50000, + "chainID": "", + "version": 0 + }, + { + "nonce": 3, + "value": "10000000000000000", + "receiver": "erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r", + "sender": "erd10ksryjr065ad5475jcg82pnjfg9j9qtszjsrp24anl6ym7cmeddshwnru8", + "gasPrice": 1000000000, + "gasLimit": 50000, + "chainID": "", + "version": 0 + } + ] +} diff --git a/integrationtests/testdata/relayedTxV3/relayed-v3-execution-source.json b/integrationtests/testdata/relayedTxV3/relayed-v3-execution-source.json new file mode 100644 index 00000000..e9d692b7 --- /dev/null +++ b/integrationtests/testdata/relayedTxV3/relayed-v3-execution-source.json @@ -0,0 +1,57 @@ +{ + "miniBlockHash": "5fba08d48700058cf2789651a50ebaa35ee559ce51ee43a709943c6a4f763d25", + "nonce": 1000, + "round": 50, + "value": "0", + "valueNum": 0, + "receiver": "erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a", + "sender": "erd1ykqd64fxxpp4wsz0v7sjqem038wfpzlljhx4mhwx8w9lcxmdzcfszrp64a", + "receiverShard": 0, + "senderShard": 0, + "gasPrice": 1000000000, + "gasLimit": 300000, + "gasUsed": 10556000, + "fee": "2257820000000000", + "feeNum": 0.00225782, + "initialPaidFee": "2306320000000000", + "data": null, + "signature": "", + "timestamp": 5040, + "status": "success", + "searchOrder": 0, + "hasOperations": true, + "hasLogs": true, + "receivers": [ + "erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r", + "erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r" + ], + "receiversShardIDs": [ + 1, + 1 + ], + "operation": "transfer", + "isRelayed": true, + "completedEvent": true, + "innerTransactions": [ + { + "nonce": 5, + "value": "10000000000000000", + "receiver": "erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r", + "sender": "erd10ksryjr065ad5475jcg82pnjfg9j9qtszjsrp24anl6ym7cmeddshwnru8", + "gasPrice": 1000000000, + "gasLimit": 50000, + "chainID": "", + "version": 0 + }, + { + "nonce": 3, + "value": "10000000000000000", + "receiver": "erd1aduqqezzw0u3j7tywlq3mrl0yn4z6f6vytdju8gg0neq38fauyzsa5yy6r", + "sender": "erd10ksryjr065ad5475jcg82pnjfg9j9qtszjsrp24anl6ym7cmeddshwnru8", + "gasPrice": 1000000000, + "gasLimit": 50000, + "chainID": "", + "version": 0 + } + ] +} diff --git a/process/elasticproc/logsevents/informativeLogsProcessor.go b/process/elasticproc/logsevents/informativeLogsProcessor.go index 3e53cbd6..8058d412 100644 --- a/process/elasticproc/logsevents/informativeLogsProcessor.go +++ b/process/elasticproc/logsevents/informativeLogsProcessor.go @@ -49,6 +49,11 @@ func (ilp *informativeLogsProcessor) processEvent(args *argsProcessEvent) argOut } } + setSuccess := tx.CompletedEvent && tx.ErrorEvent + if setSuccess { + tx.Status = transaction.TxStatusSuccess.String() + } + return argOutputProcessEvent{ processed: true, } diff --git a/process/elasticproc/transactions/serialize.go b/process/elasticproc/transactions/serialize.go index 0c3a8803..e913c579 100644 --- a/process/elasticproc/transactions/serialize.go +++ b/process/elasticproc/transactions/serialize.go @@ -136,6 +136,10 @@ func serializeTxHashStatus(buffSlice *data.BufferSlice, txHashStatusInfo map[str if (params.statusInfo.errorEvent) { ctx._source.errorEvent = params.statusInfo.errorEvent; } + + if ((ctx._source.completedEvent) && (ctx._source.errorEvent)) { + ctx._source.status = 'success'; + } ` serializedData := []byte(fmt.Sprintf(`{"script": {"source": "%s","lang": "painless","params": {"statusInfo": %s}}, "upsert": %s }`, converters.FormatPainlessSource(codeToExecute), string(marshaledStatusInfo), string(marshaledTx))) err = buffSlice.PutData(metaData, serializedData) From 4f2f595e52d9732253382e06e0f5871ebfe56409 Mon Sep 17 00:00:00 2001 From: miiu Date: Wed, 7 Aug 2024 12:51:16 +0300 Subject: [PATCH 26/29] extra check --- process/elasticproc/transactions/serialize.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process/elasticproc/transactions/serialize.go b/process/elasticproc/transactions/serialize.go index e913c579..939742a0 100644 --- a/process/elasticproc/transactions/serialize.go +++ b/process/elasticproc/transactions/serialize.go @@ -137,7 +137,7 @@ func serializeTxHashStatus(buffSlice *data.BufferSlice, txHashStatusInfo map[str ctx._source.errorEvent = params.statusInfo.errorEvent; } - if ((ctx._source.completedEvent) && (ctx._source.errorEvent)) { + if ((ctx._source.completedEvent != null && ctx._source.completedEvent) && (ctx._source.errorEvent != null && ctx._source.errorEvent)) { ctx._source.status = 'success'; } ` From 3287bbe713da6ec6021a792b06f0177e680bec77 Mon Sep 17 00:00:00 2001 From: miiu Date: Thu, 12 Sep 2024 14:01:20 +0300 Subject: [PATCH 27/29] bug fix multiple recreate --- .../testdata/updateNFT/token-color-1.json | 16 +++ .../testdata/updateNFT/token-color-2.json | 16 +++ integrationtests/updateNFT_test.go | 110 ++++++++++++++++++ .../elasticproc/converters/tokenMetaData.go | 34 +++++- 4 files changed, 171 insertions(+), 5 deletions(-) create mode 100644 integrationtests/testdata/updateNFT/token-color-1.json create mode 100644 integrationtests/testdata/updateNFT/token-color-2.json diff --git a/integrationtests/testdata/updateNFT/token-color-1.json b/integrationtests/testdata/updateNFT/token-color-1.json new file mode 100644 index 00000000..4c4f1a45 --- /dev/null +++ b/integrationtests/testdata/updateNFT/token-color-1.json @@ -0,0 +1,16 @@ +{ + "identifier": "COLORS-df0e82-01", + "token": "COLORS-df0e82", + "numDecimals": 0, + "nonce": 1, + "timestamp": 5040, + "data": { + "uris": [ + "dXJp" + ], + "whiteListedStorage": false, + "name": "GREEN", + "nonEmptyURIs": true, + "hash": "aGFzaA==" + } +} diff --git a/integrationtests/testdata/updateNFT/token-color-2.json b/integrationtests/testdata/updateNFT/token-color-2.json new file mode 100644 index 00000000..87eccc69 --- /dev/null +++ b/integrationtests/testdata/updateNFT/token-color-2.json @@ -0,0 +1,16 @@ +{ + "identifier": "COLORS-df0e82-02", + "token": "COLORS-df0e82", + "numDecimals": 0, + "nonce": 2, + "timestamp": 5040, + "data": { + "uris": [ + "dXJp" + ], + "whiteListedStorage": false, + "name": "GREEN", + "nonEmptyURIs": true, + "hash": "aGFzaA==" + } +} diff --git a/integrationtests/updateNFT_test.go b/integrationtests/updateNFT_test.go index 11fb2b84..5a482431 100644 --- a/integrationtests/updateNFT_test.go +++ b/integrationtests/updateNFT_test.go @@ -428,3 +428,113 @@ func TestCreateNFTAndMetaDataRecreate(t *testing.T) { require.Nil(t, err) require.JSONEq(t, readExpectedResult("./testdata/updateNFT/token-after-update.json"), string(genericResponse.Docs[0].Source)) } + +func TestMultipleESDTMetadataRecreate(t *testing.T) { + setLogLevelDebug() + + esClient, err := createESClient(esURL) + require.Nil(t, err) + + esdtCreateData := &esdt.ESDigitalToken{ + TokenMetaData: &esdt.MetaData{ + Name: []byte("YELLOW"), + URIs: [][]byte{[]byte("uri"), []byte("uri")}, + }, + } + marshalizedCreate, _ := json.Marshal(esdtCreateData) + + esProc, err := CreateElasticProcessor(esClient) + require.Nil(t, err) + + header := &dataBlock.Header{ + Round: 50, + TimeStamp: 5040, + ShardID: 1, + } + body := &dataBlock.Body{} + + // CREATE NFT data + address := "erd1w7jyzuj6cv4ngw8luhlkakatjpmjh3ql95lmxphd3vssc4vpymks6k5th7" + pool := &outport.TransactionPool{ + Logs: []*outport.LogData{ + { + TxHash: hex.EncodeToString([]byte("h1")), + Log: &transaction.Log{ + Events: []*transaction.Event{ + { + Address: decodeAddress(address), + Identifier: []byte(core.BuiltInFunctionESDTNFTCreate), + Topics: [][]byte{[]byte("COLORS-df0e82"), big.NewInt(1).Bytes(), big.NewInt(1).Bytes(), marshalizedCreate}, + }, + nil, + }, + }, + }, + { + TxHash: hex.EncodeToString([]byte("h2")), + Log: &transaction.Log{ + Events: []*transaction.Event{ + { + Address: decodeAddress(address), + Identifier: []byte(core.BuiltInFunctionESDTNFTCreate), + Topics: [][]byte{[]byte("COLORS-df0e82"), big.NewInt(2).Bytes(), big.NewInt(1).Bytes(), marshalizedCreate}, + }, + nil, + }, + }, + }, + }, + } + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + + // RECREATE + reCreate := &esdt.ESDigitalToken{ + TokenMetaData: &esdt.MetaData{ + Name: []byte("GREEN"), + URIs: [][]byte{[]byte("uri")}, + Hash: []byte("hash"), + }, + } + marshalizedReCreate, _ := json.Marshal(reCreate) + + pool = &outport.TransactionPool{ + Logs: []*outport.LogData{ + { + TxHash: hex.EncodeToString([]byte("h1")), + Log: &transaction.Log{ + Events: []*transaction.Event{ + { + Address: decodeAddress(address), + Identifier: []byte(core.ESDTMetaDataRecreate), + Topics: [][]byte{[]byte("COLORS-df0e82"), big.NewInt(1).Bytes(), big.NewInt(0).Bytes(), marshalizedReCreate}, + }, + nil, + }, + }, + }, + { + TxHash: hex.EncodeToString([]byte("h2")), + Log: &transaction.Log{ + Events: []*transaction.Event{ + { + Address: decodeAddress(address), + Identifier: []byte(core.ESDTMetaDataRecreate), + Topics: [][]byte{[]byte("COLORS-df0e82"), big.NewInt(2).Bytes(), big.NewInt(0).Bytes(), marshalizedReCreate}, + }, + nil, + }, + }, + }, + }, + } + err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards)) + require.Nil(t, err) + + ids := []string{"COLORS-df0e82-01", "COLORS-df0e82-02"} + genericResponse := &GenericResponse{} + err = esClient.DoMultiGet(context.Background(), ids, indexerdata.TokensIndex, true, genericResponse) + require.Nil(t, err) + require.JSONEq(t, readExpectedResult("./testdata/updateNFT/token-color-1.json"), string(genericResponse.Docs[0].Source)) + require.JSONEq(t, readExpectedResult("./testdata/updateNFT/token-color-2.json"), string(genericResponse.Docs[1].Source)) +} diff --git a/process/elasticproc/converters/tokenMetaData.go b/process/elasticproc/converters/tokenMetaData.go index b51a620b..8cff539b 100644 --- a/process/elasticproc/converters/tokenMetaData.go +++ b/process/elasticproc/converters/tokenMetaData.go @@ -83,25 +83,49 @@ func PrepareNFTUpdateData(buffSlice *data.BufferSlice, updateNFTData []*data.NFT metaData := []byte(fmt.Sprintf(`{"update":{ "_index":"%s","_id":"%s"}}%s`, index, id, "\n")) freezeOrUnfreezeTokenIndex := (nftUpdate.Freeze || nftUpdate.UnFreeze) && !isAccountsESDTIndex if freezeOrUnfreezeTokenIndex { - return buffSlice.PutData(metaData, prepareSerializeDataForFreezeAndUnFreeze(nftUpdate)) + err := buffSlice.PutData(metaData, prepareSerializeDataForFreezeAndUnFreeze(nftUpdate)) + if err != nil { + return err + } + continue } pauseOrUnPauseTokenIndex := (nftUpdate.Pause || nftUpdate.UnPause) && !isAccountsESDTIndex if pauseOrUnPauseTokenIndex { - return buffSlice.PutData(metaData, prepareSerializedDataForPauseAndUnPause(nftUpdate)) + err := buffSlice.PutData(metaData, prepareSerializedDataForPauseAndUnPause(nftUpdate)) + if err != nil { + return err + } + + continue } if nftUpdate.NewMetaData != nil { serializedData, err := prepareSerializedDataForMetaDataRecreate(nftUpdate) if err != nil { return err } - return buffSlice.PutData(metaData, serializedData) + err = buffSlice.PutData(metaData, serializedData) + if err != nil { + return err + } + + continue } if nftUpdate.NewCreator != "" { - return buffSlice.PutData(metaData, prepareSerializeDataForNewCreator(nftUpdate)) + err := buffSlice.PutData(metaData, prepareSerializeDataForNewCreator(nftUpdate)) + if err != nil { + return err + } + + continue } if nftUpdate.NewRoyalties.HasValue { - return buffSlice.PutData(metaData, prepareSerializeDataForNewRoyalties(nftUpdate)) + err := buffSlice.PutData(metaData, prepareSerializeDataForNewRoyalties(nftUpdate)) + if err != nil { + return err + } + + continue } truncatedAttributes := TruncateFieldIfExceedsMaxLengthBase64(string(nftUpdate.NewAttributes)) From f37745c352a59501aaffe33b0b868233e6c01299 Mon Sep 17 00:00:00 2001 From: Marius C Date: Wed, 9 Oct 2024 12:24:08 +0300 Subject: [PATCH 28/29] FIX: go mod --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 8daf717f..bdb9829c 100644 --- a/go.mod +++ b/go.mod @@ -7,9 +7,9 @@ require ( github.com/gin-contrib/cors v1.4.0 github.com/gin-gonic/gin v1.9.1 github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240508074652-e128a1c05c8e - github.com/multiversx/mx-chain-core-go v1.2.21-0.20240514102932-72b1cac83784 - github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240508072523-3f00a726af57 - github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240514104734-6dc768a4c5aa + github.com/multiversx/mx-chain-core-go v1.2.23-0.20241007113300-50ac1ae23824 + github.com/multiversx/mx-chain-logger-go v1.0.15 + github.com/multiversx/mx-chain-vm-common-go v1.5.17-0.20241008143259-334f3a5bafe0 github.com/prometheus/client_model v0.4.0 github.com/prometheus/common v0.37.0 github.com/stretchr/testify v1.8.4 diff --git a/go.sum b/go.sum index 74fbbfee..f2f9d56e 100644 --- a/go.sum +++ b/go.sum @@ -249,13 +249,13 @@ github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240508074652-e128a1c05c8e h1:Tsmwhu+UleE+l3buPuqXSKTqfu5FbPmzQ4MjMoUvCWA= github.com/multiversx/mx-chain-communication-go v1.0.15-0.20240508074652-e128a1c05c8e/go.mod h1:2yXl18wUbuV3cRZr7VHxM1xo73kTaC1WUcu2kx8R034= -github.com/multiversx/mx-chain-core-go v1.2.21-0.20240514102932-72b1cac83784 h1:Dxm8MIIbEQW9hUIjfiVFm7mR+UbOSkb7xhMtXHP7dmk= -github.com/multiversx/mx-chain-core-go v1.2.21-0.20240514102932-72b1cac83784/go.mod h1:P/YBoFnt25XUaCQ7Q/SD15vhnc9yV5JDhHxyFO9P8Z0= +github.com/multiversx/mx-chain-core-go v1.2.23-0.20241007113300-50ac1ae23824 h1:OHYcWOeTNwSaTMRAfusu6/1zoTWGEtHKPBig4dbRAwM= +github.com/multiversx/mx-chain-core-go v1.2.23-0.20241007113300-50ac1ae23824/go.mod h1:P/YBoFnt25XUaCQ7Q/SD15vhnc9yV5JDhHxyFO9P8Z0= github.com/multiversx/mx-chain-crypto-go v1.2.12-0.20240508074452-cc21c1b505df h1:clihfi78bMEOWk/qw6WA4uQbCM2e2NGliqswLAvw19k= -github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240508072523-3f00a726af57 h1:g9t410dqjcb7UUptbVd/H6Ua12sEzWU4v7VplyNvRZ0= -github.com/multiversx/mx-chain-logger-go v1.0.15-0.20240508072523-3f00a726af57/go.mod h1:cY6CIXpndW5g5PTPn4WzPwka/UBEf+mgw+PSY5pHGAU= -github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240514104734-6dc768a4c5aa h1:CJyBXV0PHDE3/bjJU3quoNBjOmGjrn/EBqU7wBdcqhk= -github.com/multiversx/mx-chain-vm-common-go v1.5.13-0.20240514104734-6dc768a4c5aa/go.mod h1:/scqfBjA912V3Z2sPlkRVxWAE3puVNS2adQegm4LjCc= +github.com/multiversx/mx-chain-logger-go v1.0.15 h1:HlNdK8etyJyL9NQ+6mIXyKPEBo+wRqOwi3n+m2QIHXc= +github.com/multiversx/mx-chain-logger-go v1.0.15/go.mod h1:t3PRKaWB1M+i6gUfD27KXgzLJJC+mAQiN+FLlL1yoGQ= +github.com/multiversx/mx-chain-vm-common-go v1.5.17-0.20241008143259-334f3a5bafe0 h1:WpfFe6ueS+nRIq2RzVaeF1/TJStyYH/YLYPCmN8kdDM= +github.com/multiversx/mx-chain-vm-common-go v1.5.17-0.20241008143259-334f3a5bafe0/go.mod h1:IOE+gYAtTEKZJwUr9ZhOnjdf4vFKrZdZ9RVEyuFsEP4= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= From 7b5c180a61ea85019a7d168c5d46443384f8a07e Mon Sep 17 00:00:00 2001 From: Marius C Date: Wed, 9 Oct 2024 12:30:24 +0300 Subject: [PATCH 29/29] FIX: go mod 2 --- go.mod | 14 +++++++------- go.sum | 28 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index eb32dd80..33369820 100644 --- a/go.mod +++ b/go.mod @@ -7,15 +7,15 @@ require ( github.com/gin-contrib/cors v1.4.0 github.com/gin-gonic/gin v1.9.1 github.com/multiversx/mx-chain-communication-go v1.1.0 - github.com/multiversx/mx-chain-core-go v1.2.21 + github.com/multiversx/mx-chain-core-go v1.2.23-0.20241007113300-50ac1ae23824 github.com/multiversx/mx-chain-logger-go v1.0.15 - github.com/multiversx/mx-chain-vm-common-go v1.5.13 + github.com/multiversx/mx-chain-vm-common-go v1.5.17-0.20241008143259-334f3a5bafe0 github.com/prometheus/client_model v0.4.0 github.com/prometheus/common v0.37.0 github.com/stretchr/testify v1.8.4 github.com/tidwall/gjson v1.14.0 github.com/urfave/cli v1.22.10 - google.golang.org/protobuf v1.30.0 + google.golang.org/protobuf v1.31.0 ) require ( @@ -54,9 +54,9 @@ require ( github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/crypto v0.9.0 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/net v0.16.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 82f3a0f7..9100464b 100644 --- a/go.sum +++ b/go.sum @@ -249,13 +249,13 @@ github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= 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.21 h1:+XVKznPTlUU5EFS1A8chtS8fStW60upRIyF4Pgml19I= -github.com/multiversx/mx-chain-core-go v1.2.21/go.mod h1:B5zU4MFyJezmEzCsAHE9YNULmGCm2zbPHvl9hazNxmE= +github.com/multiversx/mx-chain-core-go v1.2.23-0.20241007113300-50ac1ae23824 h1:OHYcWOeTNwSaTMRAfusu6/1zoTWGEtHKPBig4dbRAwM= +github.com/multiversx/mx-chain-core-go v1.2.23-0.20241007113300-50ac1ae23824/go.mod h1:P/YBoFnt25XUaCQ7Q/SD15vhnc9yV5JDhHxyFO9P8Z0= github.com/multiversx/mx-chain-crypto-go v1.2.12 h1:zWip7rpUS4CGthJxfKn5MZfMfYPjVjIiCID6uX5BSOk= github.com/multiversx/mx-chain-logger-go v1.0.15 h1:HlNdK8etyJyL9NQ+6mIXyKPEBo+wRqOwi3n+m2QIHXc= github.com/multiversx/mx-chain-logger-go v1.0.15/go.mod h1:t3PRKaWB1M+i6gUfD27KXgzLJJC+mAQiN+FLlL1yoGQ= -github.com/multiversx/mx-chain-vm-common-go v1.5.13 h1:ymnIHJW4Z4mFa0hZzla4fozkF30vjH5O1q+Y7Ftc+pQ= -github.com/multiversx/mx-chain-vm-common-go v1.5.13/go.mod h1:OSvFbzdWThfRbLZbUsEr7bikBSaLrPJQ2iUm9jw9nXQ= +github.com/multiversx/mx-chain-vm-common-go v1.5.17-0.20241008143259-334f3a5bafe0 h1:WpfFe6ueS+nRIq2RzVaeF1/TJStyYH/YLYPCmN8kdDM= +github.com/multiversx/mx-chain-vm-common-go v1.5.17-0.20241008143259-334f3a5bafe0/go.mod h1:IOE+gYAtTEKZJwUr9ZhOnjdf4vFKrZdZ9RVEyuFsEP4= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -362,8 +362,8 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -431,8 +431,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos= +golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -499,8 +499,8 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -510,8 +510,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -637,8 +637,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=