Skip to content

Commit 1f044bf

Browse files
Merge pull request #79 from iulianpascalau/remove-contracts-reference-and-code
Added query contract error treated as paused
2 parents 9632490 + b8e1a58 commit 1f044bf

2 files changed

Lines changed: 36 additions & 8 deletions

File tree

services/crypto-payment/process/contractQueryHandler.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const (
1717
keyCreditsPerEgld = "creditsPerEgld"
1818

1919
contractNotFoundStatus = "contract not found"
20+
returnCodeOk = "ok"
2021
)
2122

2223
type contractQueryHandler struct {
@@ -63,14 +64,20 @@ func (cqh *contractQueryHandler) IsContractPaused(ctx context.Context) (bool, er
6364
CallerAddr: cqh.contractBech32Address, // Caller can be the contract itself for views usually, or random
6465
})
6566
if err != nil {
66-
return false, err
67+
return true, err
6768
}
6869

6970
if res.Data == nil || res.Data.ReturnCode == contractNotFoundStatus {
7071
// malformed response or the contract was not found, signal that the contract is paused
7172
return true, nil
7273
}
7374

75+
// If the return code is not "ok", something went wrong (e.g. function not found, execution failed).
76+
// We should treat this as the contract being paused/unavailable for safety.
77+
if res.Data.ReturnCode != returnCodeOk {
78+
return true, nil
79+
}
80+
7481
if len(res.Data.ReturnData) == 0 || len(res.Data.ReturnData[0]) == 0 {
7582
isPaused = false
7683
} else {

services/crypto-payment/process/contractQueryHandler_test.go

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func TestContractQueryHandler_IsContractPaused(t *testing.T) {
5858

5959
handler, _ := NewContractQueryHandler(proxy, "erd1test", &testsCommon.CacherStub{})
6060
paused, err := handler.IsContractPaused(context.Background())
61-
require.False(t, paused)
61+
require.True(t, paused)
6262
require.Equal(t, expectedErr, err)
6363
})
6464

@@ -74,6 +74,7 @@ func TestContractQueryHandler_IsContractPaused(t *testing.T) {
7474
handler, _ := NewContractQueryHandler(proxy, "erd1test", &testsCommon.CacherStub{})
7575
paused, err := handler.IsContractPaused(context.Background())
7676
require.NoError(t, err)
77+
// Data nil -> Paused
7778
require.True(t, paused)
7879
})
7980

@@ -83,7 +84,7 @@ func TestContractQueryHandler_IsContractPaused(t *testing.T) {
8384
proxy := &testsCommon.BlockchainDataProviderStub{
8485
ExecuteVMQueryHandler: func(ctx context.Context, vmRequest *data.VmValueRequest) (*data.VmValuesResponseData, error) {
8586
return &data.VmValuesResponseData{
86-
Data: &vm.VMOutputApi{ReturnData: nil},
87+
Data: &vm.VMOutputApi{ReturnData: nil, ReturnCode: "ok"},
8788
}, nil
8889
},
8990
}
@@ -100,7 +101,7 @@ func TestContractQueryHandler_IsContractPaused(t *testing.T) {
100101
proxy := &testsCommon.BlockchainDataProviderStub{
101102
ExecuteVMQueryHandler: func(ctx context.Context, vmRequest *data.VmValueRequest) (*data.VmValuesResponseData, error) {
102103
return &data.VmValuesResponseData{
103-
Data: &vm.VMOutputApi{ReturnData: make([][]byte, 0)},
104+
Data: &vm.VMOutputApi{ReturnData: make([][]byte, 0), ReturnCode: "ok"},
104105
}, nil
105106
},
106107
}
@@ -117,7 +118,7 @@ func TestContractQueryHandler_IsContractPaused(t *testing.T) {
117118
proxy := &testsCommon.BlockchainDataProviderStub{
118119
ExecuteVMQueryHandler: func(ctx context.Context, vmRequest *data.VmValueRequest) (*data.VmValuesResponseData, error) {
119120
return &data.VmValuesResponseData{
120-
Data: &vm.VMOutputApi{ReturnData: [][]byte{{}}},
121+
Data: &vm.VMOutputApi{ReturnData: [][]byte{{}}, ReturnCode: "ok"},
121122
}, nil
122123
},
123124
}
@@ -147,13 +148,33 @@ func TestContractQueryHandler_IsContractPaused(t *testing.T) {
147148
require.True(t, paused)
148149
})
149150

151+
t.Run("execution failed", func(t *testing.T) {
152+
t.Parallel()
153+
154+
proxy := &testsCommon.BlockchainDataProviderStub{
155+
ExecuteVMQueryHandler: func(ctx context.Context, vmRequest *data.VmValueRequest) (*data.VmValuesResponseData, error) {
156+
return &data.VmValuesResponseData{
157+
Data: &vm.VMOutputApi{
158+
ReturnCode: "execution failed",
159+
ReturnData: nil,
160+
},
161+
}, nil
162+
},
163+
}
164+
165+
handler, _ := NewContractQueryHandler(proxy, "erd1test", &testsCommon.CacherStub{})
166+
paused, err := handler.IsContractPaused(context.Background())
167+
require.NoError(t, err)
168+
require.True(t, paused)
169+
})
170+
150171
t.Run("paused", func(t *testing.T) {
151172
t.Parallel()
152173

153174
proxy := &testsCommon.BlockchainDataProviderStub{
154175
ExecuteVMQueryHandler: func(ctx context.Context, vmRequest *data.VmValueRequest) (*data.VmValuesResponseData, error) {
155176
return &data.VmValuesResponseData{
156-
Data: &vm.VMOutputApi{ReturnData: [][]byte{{1}}},
177+
Data: &vm.VMOutputApi{ReturnData: [][]byte{{1}}, ReturnCode: "ok"},
157178
}, nil
158179
},
159180
}
@@ -170,7 +191,7 @@ func TestContractQueryHandler_IsContractPaused(t *testing.T) {
170191
proxy := &testsCommon.BlockchainDataProviderStub{
171192
ExecuteVMQueryHandler: func(ctx context.Context, vmRequest *data.VmValueRequest) (*data.VmValuesResponseData, error) {
172193
return &data.VmValuesResponseData{
173-
Data: &vm.VMOutputApi{ReturnData: [][]byte{{0}}},
194+
Data: &vm.VMOutputApi{ReturnData: [][]byte{{0}}, ReturnCode: "ok"},
174195
}, nil
175196
},
176197
}
@@ -189,7 +210,7 @@ func TestContractQueryHandler_IsContractPaused(t *testing.T) {
189210
ExecuteVMQueryHandler: func(ctx context.Context, vmRequest *data.VmValueRequest) (*data.VmValuesResponseData, error) {
190211
calls++
191212
return &data.VmValuesResponseData{
192-
Data: &vm.VMOutputApi{ReturnData: [][]byte{{1}}},
213+
Data: &vm.VMOutputApi{ReturnData: [][]byte{{1}}, ReturnCode: "ok"},
193214
}, nil
194215
},
195216
}

0 commit comments

Comments
 (0)