Skip to content

Commit 6608ee8

Browse files
authored
Merge pull request #281 from multiversx/change-indexing-mechanism-for-cross-shard-esdt-transfer
New indexing mechanism for cross-shard esdt transfer
2 parents d125bb0 + 6c5d2db commit 6608ee8

File tree

6 files changed

+385
-4
lines changed

6 files changed

+385
-4
lines changed

integrationtests/esdtTransfer_test.go

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,3 +113,203 @@ func TestESDTTransferTooMuchGasProvided(t *testing.T) {
113113

114114
require.JSONEq(t, readExpectedResult("./testdata/esdtTransfer/esdt-transfer.json"), string(genericResponse.Docs[0].Source))
115115
}
116+
117+
func TestESDTTransferCrossShardWithRefundOnSourceShard(t *testing.T) {
118+
esClient, err := createESClient(esURL)
119+
require.Nil(t, err)
120+
121+
esProc, err := CreateElasticProcessor(esClient)
122+
require.Nil(t, err)
123+
124+
txHash := []byte("esdtTransferCross")
125+
header := &dataBlock.Header{
126+
Round: 50,
127+
TimeStamp: 10101,
128+
ShardID: 2,
129+
}
130+
131+
scrHash1 := []byte("scrHash1ESDTTransferOnSourceShard")
132+
body := &dataBlock.Body{
133+
MiniBlocks: dataBlock.MiniBlockSlice{
134+
{
135+
Type: dataBlock.TxBlock,
136+
SenderShardID: 2,
137+
ReceiverShardID: 1,
138+
TxHashes: [][]byte{txHash},
139+
},
140+
{
141+
Type: dataBlock.SmartContractResultBlock,
142+
SenderShardID: 2,
143+
ReceiverShardID: 2,
144+
TxHashes: [][]byte{scrHash1},
145+
},
146+
},
147+
}
148+
149+
address1 := "erd1ef6470tjdtlgpa9f6g3ae4nsedmjg0gv6w73v32xtvhkfff993hq750xl9"
150+
address2 := "erd13u7zyekzvdvzek8768r5gau9p6677ufppsjuklu9e6t7yx7rhg4s68e2ze"
151+
152+
txESDT := outport.TxInfo{
153+
Transaction: &transaction.Transaction{
154+
Nonce: 1,
155+
SndAddr: decodeAddress(address1),
156+
RcvAddr: decodeAddress(address2),
157+
GasLimit: 500_000,
158+
GasPrice: 1000000000,
159+
Data: []byte("ESDTTransfer@54474e2d383862383366@0a"),
160+
Value: big.NewInt(0),
161+
},
162+
FeeInfo: &outport.FeeInfo{
163+
GasUsed: 334_000,
164+
Fee: big.NewInt(136000000000000),
165+
InitialPaidFee: big.NewInt(137660000000000),
166+
},
167+
}
168+
169+
refundValueBig, _ := big.NewInt(0).SetString("1660000000000", 10)
170+
scrRefund := &smartContractResult.SmartContractResult{
171+
Nonce: 20,
172+
SndAddr: decodeAddress(address2),
173+
RcvAddr: decodeAddress(address1),
174+
PrevTxHash: txHash,
175+
OriginalTxHash: txHash,
176+
Value: refundValueBig,
177+
Data: []byte("@6f6b"),
178+
}
179+
180+
pool := &outport.TransactionPool{
181+
Transactions: map[string]*outport.TxInfo{
182+
hex.EncodeToString(txHash): &txESDT,
183+
},
184+
SmartContractResults: map[string]*outport.SCRInfo{
185+
hex.EncodeToString(scrHash1): {SmartContractResult: scrRefund, FeeInfo: &outport.FeeInfo{}},
186+
},
187+
}
188+
err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards))
189+
require.Nil(t, err)
190+
191+
ids := []string{hex.EncodeToString(txHash)}
192+
genericResponse := &GenericResponse{}
193+
err = esClient.DoMultiGet(context.Background(), ids, indexerdata.OperationsIndex, true, genericResponse)
194+
require.Nil(t, err)
195+
196+
require.JSONEq(t, readExpectedResult("./testdata/esdtTransfer/esdt-transfer-cross-shard-on-source.json"), string(genericResponse.Docs[0].Source))
197+
198+
header = &dataBlock.Header{
199+
Round: 55,
200+
TimeStamp: 10102,
201+
ShardID: 1,
202+
}
203+
txESDT.FeeInfo = &outport.FeeInfo{
204+
GasUsed: 500_000,
205+
Fee: big.NewInt(137660000000000),
206+
InitialPaidFee: big.NewInt(137660000000000),
207+
}
208+
209+
err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards))
210+
require.Nil(t, err)
211+
212+
err = esClient.DoMultiGet(context.Background(), ids, indexerdata.OperationsIndex, true, genericResponse)
213+
require.Nil(t, err)
214+
215+
require.JSONEq(t, readExpectedResult("./testdata/esdtTransfer/esdt-transfer-cross-shard-on-destination.json"), string(genericResponse.Docs[0].Source))
216+
}
217+
218+
func TestESDTTransferCrossShardIndexFirstOnDestinationAndAfterSource(t *testing.T) {
219+
esClient, err := createESClient(esURL)
220+
require.Nil(t, err)
221+
222+
esProc, err := CreateElasticProcessor(esClient)
223+
require.Nil(t, err)
224+
225+
txHash := []byte("esdtTransferCross2")
226+
header := &dataBlock.Header{
227+
Round: 55,
228+
TimeStamp: 10102,
229+
ShardID: 1,
230+
}
231+
232+
scrHash1 := []byte("scrHash1ESDTTransferOnSourceShard2")
233+
body := &dataBlock.Body{
234+
MiniBlocks: dataBlock.MiniBlockSlice{
235+
{
236+
Type: dataBlock.TxBlock,
237+
SenderShardID: 2,
238+
ReceiverShardID: 1,
239+
TxHashes: [][]byte{txHash},
240+
},
241+
},
242+
}
243+
244+
address1 := "erd1ef6470tjdtlgpa9f6g3ae4nsedmjg0gv6w73v32xtvhkfff993hq750xl9"
245+
address2 := "erd13u7zyekzvdvzek8768r5gau9p6677ufppsjuklu9e6t7yx7rhg4s68e2ze"
246+
247+
txESDT := outport.TxInfo{
248+
Transaction: &transaction.Transaction{
249+
Nonce: 1,
250+
SndAddr: decodeAddress(address1),
251+
RcvAddr: decodeAddress(address2),
252+
GasLimit: 500_000,
253+
GasPrice: 1000000000,
254+
Data: []byte("ESDTTransfer@54474e2d383862383366@0a"),
255+
Value: big.NewInt(0),
256+
},
257+
FeeInfo: &outport.FeeInfo{
258+
GasUsed: 500_000,
259+
Fee: big.NewInt(137660000000000),
260+
InitialPaidFee: big.NewInt(137660000000000),
261+
},
262+
}
263+
264+
refundValueBig, _ := big.NewInt(0).SetString("1660000000000", 10)
265+
scrRefund := &smartContractResult.SmartContractResult{
266+
Nonce: 20,
267+
SndAddr: decodeAddress(address2),
268+
RcvAddr: decodeAddress(address1),
269+
PrevTxHash: txHash,
270+
OriginalTxHash: txHash,
271+
Value: refundValueBig,
272+
Data: []byte("@6f6b"),
273+
}
274+
275+
pool := &outport.TransactionPool{
276+
Transactions: map[string]*outport.TxInfo{
277+
hex.EncodeToString(txHash): &txESDT,
278+
},
279+
SmartContractResults: map[string]*outport.SCRInfo{
280+
hex.EncodeToString(scrHash1): {SmartContractResult: scrRefund, FeeInfo: &outport.FeeInfo{}},
281+
},
282+
}
283+
err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards))
284+
require.Nil(t, err)
285+
286+
ids := []string{hex.EncodeToString(txHash)}
287+
genericResponse := &GenericResponse{}
288+
err = esClient.DoMultiGet(context.Background(), ids, indexerdata.OperationsIndex, true, genericResponse)
289+
require.Nil(t, err)
290+
require.JSONEq(t, readExpectedResult("./testdata/esdtTransfer/esdt-transfer-first-on-destination.json"), string(genericResponse.Docs[0].Source))
291+
292+
txESDT.FeeInfo = &outport.FeeInfo{
293+
GasUsed: 334_000,
294+
Fee: big.NewInt(136000000000000),
295+
InitialPaidFee: big.NewInt(137660000000000),
296+
}
297+
header = &dataBlock.Header{
298+
Round: 50,
299+
TimeStamp: 10101,
300+
ShardID: 2,
301+
}
302+
body.MiniBlocks = append(body.MiniBlocks, &dataBlock.MiniBlock{
303+
Type: dataBlock.SmartContractResultBlock,
304+
SenderShardID: 2,
305+
ReceiverShardID: 2,
306+
TxHashes: [][]byte{scrHash1},
307+
})
308+
309+
err = esProc.SaveTransactions(createOutportBlockWithHeader(body, header, pool, nil, testNumOfShards))
310+
require.Nil(t, err)
311+
312+
err = esClient.DoMultiGet(context.Background(), ids, indexerdata.OperationsIndex, true, genericResponse)
313+
require.Nil(t, err)
314+
require.JSONEq(t, readExpectedResult("./testdata/esdtTransfer/esdt-transfer-second-on-source.json"), string(genericResponse.Docs[0].Source))
315+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"miniBlockHash": "579fe2f60e8fa9c396254b2173282c6ecb6e736b42e015c3b744c86001be3981",
3+
"nonce": 1,
4+
"round": 55,
5+
"value": "0",
6+
"valueNum": 0,
7+
"receiver": "erd13u7zyekzvdvzek8768r5gau9p6677ufppsjuklu9e6t7yx7rhg4s68e2ze",
8+
"sender": "erd1ef6470tjdtlgpa9f6g3ae4nsedmjg0gv6w73v32xtvhkfff993hq750xl9",
9+
"receiverShard": 1,
10+
"senderShard": 2,
11+
"gasPrice": 1000000000,
12+
"gasLimit": 500000,
13+
"gasUsed": 334000,
14+
"fee": "136000000000000",
15+
"feeNum": 0.000136,
16+
"initialPaidFee": "137660000000000",
17+
"data": "RVNEVFRyYW5zZmVyQDU0NDc0ZTJkMzgzODYyMzgzMzY2QDBh",
18+
"signature": "",
19+
"timestamp": 10102,
20+
"status": "success",
21+
"searchOrder": 0,
22+
"hasScResults": true,
23+
"tokens": [
24+
"TGN-88b83f"
25+
],
26+
"esdtValues": [
27+
"10"
28+
],
29+
"esdtValuesNum": [
30+
1e-17
31+
],
32+
"type": "normal",
33+
"operation": "ESDTTransfer"
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"miniBlockHash": "579fe2f60e8fa9c396254b2173282c6ecb6e736b42e015c3b744c86001be3981",
3+
"nonce": 1,
4+
"round": 50,
5+
"value": "0",
6+
"valueNum": 0,
7+
"receiver": "erd13u7zyekzvdvzek8768r5gau9p6677ufppsjuklu9e6t7yx7rhg4s68e2ze",
8+
"sender": "erd1ef6470tjdtlgpa9f6g3ae4nsedmjg0gv6w73v32xtvhkfff993hq750xl9",
9+
"receiverShard": 1,
10+
"senderShard": 2,
11+
"gasPrice": 1000000000,
12+
"gasLimit": 500000,
13+
"gasUsed": 334000,
14+
"fee": "136000000000000",
15+
"feeNum": 0.000136,
16+
"initialPaidFee": "137660000000000",
17+
"data": "RVNEVFRyYW5zZmVyQDU0NDc0ZTJkMzgzODYyMzgzMzY2QDBh",
18+
"signature": "",
19+
"timestamp": 10101,
20+
"status": "pending",
21+
"searchOrder": 0,
22+
"hasScResults": true,
23+
"tokens": [
24+
"TGN-88b83f"
25+
],
26+
"esdtValues": [
27+
"10"
28+
],
29+
"esdtValuesNum": [
30+
1e-17
31+
],
32+
"type": "normal",
33+
"operation": "ESDTTransfer"
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"data": "RVNEVFRyYW5zZmVyQDU0NDc0ZTJkMzgzODYyMzgzMzY2QDBh",
3+
"signature": "",
4+
"fee": "137660000000000",
5+
"esdtValues": [
6+
"10"
7+
],
8+
"initialPaidFee": "137660000000000",
9+
"type": "normal",
10+
"gasLimit": 500000,
11+
"esdtValuesNum": [
12+
1e-17
13+
],
14+
"gasUsed": 500000,
15+
"miniBlockHash": "d0f273198e773465908be139872605d93e86115b6320f9b34edb6a5e38668989",
16+
"senderShard": 2,
17+
"tokens": [
18+
"TGN-88b83f"
19+
],
20+
"value": "0",
21+
"gasPrice": 1000000000,
22+
"timestamp": 10102,
23+
"receiver": "erd13u7zyekzvdvzek8768r5gau9p6677ufppsjuklu9e6t7yx7rhg4s68e2ze",
24+
"valueNum": 0,
25+
"feeNum": 0.00013766,
26+
"nonce": 1,
27+
"round": 55,
28+
"hasScResults": true,
29+
"sender": "erd1ef6470tjdtlgpa9f6g3ae4nsedmjg0gv6w73v32xtvhkfff993hq750xl9",
30+
"receiverShard": 1,
31+
"operation": "ESDTTransfer",
32+
"status": "success",
33+
"searchOrder": 0
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"data": "RVNEVFRyYW5zZmVyQDU0NDc0ZTJkMzgzODYyMzgzMzY2QDBh",
3+
"signature": "",
4+
"fee": "136000000000000",
5+
"esdtValues": [
6+
"10"
7+
],
8+
"initialPaidFee": "137660000000000",
9+
"type": "normal",
10+
"gasLimit": 500000,
11+
"esdtValuesNum": [
12+
1e-17
13+
],
14+
"gasUsed": 334000,
15+
"miniBlockHash": "d0f273198e773465908be139872605d93e86115b6320f9b34edb6a5e38668989",
16+
"senderShard": 2,
17+
"tokens": [
18+
"TGN-88b83f"
19+
],
20+
"value": "0",
21+
"gasPrice": 1000000000,
22+
"timestamp": 10102,
23+
"receiver": "erd13u7zyekzvdvzek8768r5gau9p6677ufppsjuklu9e6t7yx7rhg4s68e2ze",
24+
"valueNum": 0,
25+
"feeNum": 0.000136,
26+
"nonce": 1,
27+
"round": 55,
28+
"hasScResults": true,
29+
"sender": "erd1ef6470tjdtlgpa9f6g3ae4nsedmjg0gv6w73v32xtvhkfff993hq750xl9",
30+
"receiverShard": 1,
31+
"operation": "ESDTTransfer",
32+
"status": "success",
33+
"searchOrder": 0
34+
}

0 commit comments

Comments
 (0)