-
Notifications
You must be signed in to change notification settings - Fork 199
/
testScProcessor.go
108 lines (87 loc) · 2.52 KB
/
testScProcessor.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package smartContract
import (
"encoding/hex"
"fmt"
"strings"
"github.com/ElrondNetwork/elrond-go/data"
"github.com/ElrondNetwork/elrond-go/data/smartContractResult"
)
// TestScProcessor extends scProcessor and is used in tests as it exposes some functions
// that are not supposed to be used in production code
// Exported functions simplify the reproduction of edge cases
type TestScProcessor struct {
*scProcessor
}
// NewTestScProcessor -
func NewTestScProcessor(internalData *scProcessor) *TestScProcessor {
return &TestScProcessor{internalData}
}
// GetLatestTestError locates the latest error in the collection of smart contracts results
func (tsp *TestScProcessor) GetLatestTestError() error {
scrProvider, ok := tsp.scrForwarder.(interface {
GetIntermediateTransactions() []data.TransactionHandler
})
if !ok {
return nil
}
scResults := scrProvider.GetIntermediateTransactions()
for i := len(scResults) - 1; i >= 0; i-- {
_, isScr := scResults[i].(*smartContractResult.SmartContractResult)
if !isScr {
continue
}
tx := scResults[i]
txData := string(tx.GetData())
dataTrimmed := strings.Trim(txData, "@")
parts := strings.Split(dataTrimmed, "@")
if len(parts) == 0 {
continue
}
returnCodeHex := parts[0]
returnCode, err := hex.DecodeString(returnCodeHex)
if err == nil {
returnCodeAsString := string(returnCode)
if returnCodeAsString == "ok" || returnCodeAsString == "" {
return nil
}
return fmt.Errorf(returnCodeAsString)
}
return fmt.Errorf(returnCodeHex)
}
return nil
}
// GetGasRemaining returns the remaining gas from the last transaction
func (tsp *TestScProcessor) GetGasRemaining() uint64 {
scrProvider, ok := tsp.scrForwarder.(interface {
GetIntermediateTransactions() []data.TransactionHandler
})
if !ok {
return 0
}
scResults := scrProvider.GetIntermediateTransactions()
for i := len(scResults) - 1; i >= 0; i-- {
tx := scResults[i]
txData := string(tx.GetData())
dataTrimmed := strings.Trim(txData, "@")
parts := strings.Split(dataTrimmed, "@")
if len(parts) == 0 {
continue
}
return tx.GetGasLimit()
}
return 0
}
// GetAllSCRs returns all generated scrs
func (tsp *TestScProcessor) GetAllSCRs() []data.TransactionHandler {
scrProvider, ok := tsp.scrForwarder.(interface {
GetIntermediateTransactions() []data.TransactionHandler
})
if !ok {
return nil
}
return scrProvider.GetIntermediateTransactions()
}
// CleanGasRefunded cleans the gas computation handler
func (tsp *TestScProcessor) CleanGasRefunded() {
tsp.gasHandler.Init()
}