-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathparser_test.go
311 lines (243 loc) · 18.9 KB
/
parser_test.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
package ces
import (
"context"
"encoding/json"
"errors"
"fmt"
"os"
"strings"
"testing"
"github.com/golang/mock/gomock"
"github.com/make-software/casper-go-sdk/v2/casper"
"github.com/make-software/casper-go-sdk/v2/rpc"
"github.com/make-software/casper-go-sdk/v2/types"
"github.com/make-software/casper-go-sdk/v2/types/key"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/make-software/ces-go-parser/v2/utils/mocks"
)
func TestEventParser(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()
mockedClient := mocks.NewMockClient(mockCtrl)
contractHashToParse, err := casper.NewHash("ea0c001d969da098fefec42b141db88c74c5682e49333ded78035540a0b4f0bc")
assert.NoError(t, err)
contractPackageHash, err := casper.NewContractPackageHash("7a5fce1d9ad45c9d71a5e59638602213295a51a6cf92518f8b262cd3e23d6d7e")
assert.NoError(t, err)
eventParser := EventParser{
casperClient: mockedClient,
}
t.Run("Test several events parsing", func(t *testing.T) {
var schemaHex = `08000000100000004164646564546f57686974656c6973740100000007000000616464726573730b0e00000042616c6c6f7443616e63656c65640500000005000000766f7465720b09000000766f74696e675f6964040b000000766f74696e675f74797065030600000063686f69636503050000007374616b65080a00000042616c6c6f74436173740500000005000000766f7465720b09000000766f74696e675f6964040b000000766f74696e675f74797065030600000063686f69636503050000007374616b65080c0000004f776e65724368616e67656401000000090000006e65775f6f776e65720b1400000052656d6f76656446726f6d57686974656c6973740100000007000000616464726573730b1300000053696d706c65566f74696e67437265617465640c0000000d000000646f63756d656e745f686173680a0700000063726561746f720b050000007374616b650d0809000000766f74696e675f69640416000000636f6e6669675f696e666f726d616c5f71756f72756d041b000000636f6e6669675f696e666f726d616c5f766f74696e675f74696d650514000000636f6e6669675f666f726d616c5f71756f72756d0419000000636f6e6669675f666f726d616c5f766f74696e675f74696d650516000000636f6e6669675f746f74616c5f6f6e626f61726465640822000000636f6e6669675f646f75626c655f74696d655f6265747765656e5f766f74696e6773001d000000636f6e6669675f766f74696e675f636c6561726e6573735f64656c7461082e000000636f6e6669675f74696d655f6265747765656e5f696e666f726d616c5f616e645f666f726d616c5f766f74696e67050e000000566f74696e6743616e63656c65640300000009000000766f74696e675f6964040b000000766f74696e675f747970650308000000756e7374616b6573110b080b000000566f74696e67456e6465640d00000009000000766f74696e675f6964040b000000766f74696e675f74797065030d000000766f74696e675f726573756c74030e0000007374616b655f696e5f6661766f72080d0000007374616b655f616761696e73740816000000756e626f756e645f7374616b655f696e5f6661766f720815000000756e626f756e645f7374616b655f616761696e7374080e000000766f7465735f696e5f6661766f72040d000000766f7465735f616761696e73740408000000756e7374616b657311130b0408060000007374616b657311130b0408050000006275726e7311130b0408050000006d696e747311130b0408`
hash, _ := casper.NewHash("002596e815c7235dccf76358695de0088b4636ecb2473c12bb5ff0fbbb7ae94a")
mockedClient.EXPECT().GetStateRootHashLatest(context.Background()).Return(casper.ChainGetStateRootHashResult{StateRootHash: hash}, nil)
eventUref, err := key.NewKey("uref-d2263e86f497f42e405d5d1390aa3c1a8bfc35f3699fdc3be806a5cfe139dac9-007")
assert.NoError(t, err)
eventSchemaUref, err := key.NewKey("uref-12263e86f497f42e405d5d1390aa3c1a8bfc35f3699fdc3be806a5cfe139dac9-007")
assert.NoError(t, err)
rootHash := hash.String()
mockedClient.EXPECT().QueryGlobalStateByStateHash(context.Background(), &rootHash, fmt.Sprintf("hash-%s", contractHashToParse.ToHex()), nil).Return(rpc.QueryGlobalStateResult{
StoredValue: casper.StoredValue{
Contract: &casper.Contract{
ContractPackageHash: contractPackageHash,
NamedKeys: casper.NamedKeys{
casper.NamedKey{
Name: eventNamedKey,
Key: eventUref,
}, casper.NamedKey{
Name: eventSchemaNamedKey,
Key: eventSchemaUref,
}},
},
},
}, nil)
var arg casper.Argument
err = json.Unmarshal([]byte(fmt.Sprintf(`{"cl_type": "Any", "bytes": "%s"}`, schemaHex)), &arg)
require.NoError(t, err)
mockedClient.EXPECT().QueryGlobalStateByStateHash(context.Background(), &rootHash, "uref-12263e86f497f42e405d5d1390aa3c1a8bfc35f3699fdc3be806a5cfe139dac9-007", nil).Return(
rpc.QueryGlobalStateResult{
StoredValue: casper.StoredValue{
CLValue: &arg,
},
}, nil)
contractsMetadata, err := eventParser.loadContractsMetadata([]casper.Hash{contractHashToParse}, Casper1x)
require.NoError(t, err)
eventParser.contractsMetadata = contractsMetadata
type rawData struct {
APIVersion string `json:"api_version"`
Deploy *types.Deploy `json:"deploy"`
ExecutionResults []types.DeployExecutionResult `json:"execution_results"`
}
var results rawData
data, err := os.ReadFile("./utils/fixtures/deploys/voting_created.json")
assert.NoError(t, err)
err = json.Unmarshal(data, &results)
assert.NoError(t, err)
res := types.DeployExecutionInfoFromV1(results.ExecutionResults, nil)
parseResults, err := eventParser.ParseExecutionResults(res.ExecutionResult)
assert.NoError(t, err)
require.True(t, len(parseResults) == 2)
assert.Equal(t, parseResults[0].Event.Name, "BallotCast")
assert.Equal(t, parseResults[0].Event.ContractHash.String(), contractHashToParse.String())
assert.Equal(t, parseResults[0].Event.ContractPackageHash.String(), contractPackageHash.String())
assert.Equal(t, parseResults[0].Event.TransformID, uint(99))
assert.Equal(t, parseResults[0].Event.EventID, uint(2))
assert.True(t, len(parseResults[0].Event.Data) > 0)
assert.Equal(t, parseResults[1].Event.Name, "SimpleVotingCreated")
assert.Equal(t, parseResults[1].Event.ContractHash.String(), contractHashToParse.String())
assert.Equal(t, parseResults[1].Event.ContractPackageHash.String(), contractPackageHash.String())
assert.Equal(t, parseResults[1].Event.TransformID, uint(115))
assert.Equal(t, parseResults[1].Event.EventID, uint(3))
assert.True(t, len(parseResults[1].Event.Data) > 0)
})
t.Run("Test events parsing from addressable entity", func(t *testing.T) {
var schemaHex = `08000000100000004164646564546f57686974656c6973740100000007000000616464726573730b0e00000042616c6c6f7443616e63656c65640500000005000000766f7465720b09000000766f74696e675f6964040b000000766f74696e675f74797065030600000063686f69636503050000007374616b65080a00000042616c6c6f74436173740500000005000000766f7465720b09000000766f74696e675f6964040b000000766f74696e675f74797065030600000063686f69636503050000007374616b65080c0000004f776e65724368616e67656401000000090000006e65775f6f776e65720b1400000052656d6f76656446726f6d57686974656c6973740100000007000000616464726573730b1300000053696d706c65566f74696e67437265617465640c0000000d000000646f63756d656e745f686173680a0700000063726561746f720b050000007374616b650d0809000000766f74696e675f69640416000000636f6e6669675f696e666f726d616c5f71756f72756d041b000000636f6e6669675f696e666f726d616c5f766f74696e675f74696d650514000000636f6e6669675f666f726d616c5f71756f72756d0419000000636f6e6669675f666f726d616c5f766f74696e675f74696d650516000000636f6e6669675f746f74616c5f6f6e626f61726465640822000000636f6e6669675f646f75626c655f74696d655f6265747765656e5f766f74696e6773001d000000636f6e6669675f766f74696e675f636c6561726e6573735f64656c7461082e000000636f6e6669675f74696d655f6265747765656e5f696e666f726d616c5f616e645f666f726d616c5f766f74696e67050e000000566f74696e6743616e63656c65640300000009000000766f74696e675f6964040b000000766f74696e675f747970650308000000756e7374616b6573110b080b000000566f74696e67456e6465640d00000009000000766f74696e675f6964040b000000766f74696e675f74797065030d000000766f74696e675f726573756c74030e0000007374616b655f696e5f6661766f72080d0000007374616b655f616761696e73740816000000756e626f756e645f7374616b655f696e5f6661766f720815000000756e626f756e645f7374616b655f616761696e7374080e000000766f7465735f696e5f6661766f72040d000000766f7465735f616761696e73740408000000756e7374616b657311130b0408060000007374616b657311130b0408050000006275726e7311130b0408050000006d696e747311130b0408`
hash, _ := casper.NewHash("002596e815c7235dccf76358695de0088b4636ecb2473c12bb5ff0fbbb7ae94a")
mockedClient.EXPECT().GetStateRootHashLatest(context.Background()).Return(casper.ChainGetStateRootHashResult{StateRootHash: hash}, nil)
eventUref, err := key.NewKey("uref-d2263e86f497f42e405d5d1390aa3c1a8bfc35f3699fdc3be806a5cfe139dac9-007")
assert.NoError(t, err)
eventSchemaUref, err := key.NewKey("uref-12263e86f497f42e405d5d1390aa3c1a8bfc35f3699fdc3be806a5cfe139dac9-007")
assert.NoError(t, err)
rootHash := hash.String()
data, err := os.ReadFile("./utils/fixtures/addressable_entity/smart_contract_entity.json")
assert.NoError(t, err)
var stateGetEntityResp rpc.StateGetEntity
err = json.Unmarshal(data, &stateGetEntityResp)
assert.NoError(t, err)
namedKeys := stateGetEntityResp.Entity.AddressableEntity.NamedKeys
namedKeys = append(namedKeys, types.NamedKey{
Name: eventNamedKey,
Key: eventUref,
})
namedKeys = append(namedKeys, types.NamedKey{
Name: eventSchemaNamedKey,
Key: eventSchemaUref,
})
stateGetEntityResp.Entity.AddressableEntity.NamedKeys = namedKeys
mockedClient.EXPECT().GetLatestEntity(gomock.Any(), gomock.Any()).Return(stateGetEntityResp, nil)
var arg casper.Argument
err = json.Unmarshal([]byte(fmt.Sprintf(`{"cl_type": "Any", "bytes": "%s"}`, schemaHex)), &arg)
require.NoError(t, err)
mockedClient.EXPECT().QueryGlobalStateByStateHash(context.Background(), &rootHash, "uref-12263e86f497f42e405d5d1390aa3c1a8bfc35f3699fdc3be806a5cfe139dac9-007", nil).Return(
rpc.QueryGlobalStateResult{
StoredValue: casper.StoredValue{
CLValue: &arg,
},
}, nil)
contractsMetadata, err := eventParser.loadContractsMetadata([]casper.Hash{contractHashToParse}, Casper2xRC4)
require.NoError(t, err)
eventParser.contractsMetadata = contractsMetadata
type rawData struct {
APIVersion string `json:"api_version"`
Deploy *types.Deploy `json:"deploy"`
ExecutionResults []types.DeployExecutionResult `json:"execution_results"`
}
var results rawData
data, err = os.ReadFile("./utils/fixtures/deploys/voting_created.json")
assert.NoError(t, err)
err = json.Unmarshal(data, &results)
assert.NoError(t, err)
res := types.DeployExecutionInfoFromV1(results.ExecutionResults, nil)
parseResults, err := eventParser.ParseExecutionResults(res.ExecutionResult)
assert.NoError(t, err)
require.True(t, len(parseResults) == 2)
assert.Equal(t, parseResults[0].Event.Name, "BallotCast")
assert.Equal(t, parseResults[0].Event.ContractHash.String(), contractHashToParse.String())
assert.Equal(t, parseResults[0].Event.ContractPackageHash.String(), strings.TrimPrefix(stateGetEntityResp.Entity.AddressableEntity.Entity.PackageHash, "package-"))
assert.Equal(t, parseResults[0].Event.TransformID, uint(99))
assert.Equal(t, parseResults[0].Event.EventID, uint(2))
assert.True(t, len(parseResults[0].Event.Data) > 0)
assert.Equal(t, parseResults[1].Event.Name, "SimpleVotingCreated")
assert.Equal(t, parseResults[1].Event.ContractHash.String(), contractHashToParse.String())
assert.Equal(t, parseResults[1].Event.ContractPackageHash.String(), strings.TrimPrefix(stateGetEntityResp.Entity.AddressableEntity.Entity.PackageHash, "package-"))
assert.Equal(t, parseResults[1].Event.TransformID, uint(115))
assert.Equal(t, parseResults[1].Event.EventID, uint(3))
assert.True(t, len(parseResults[1].Event.Data) > 0)
})
t.Run("Test events parsing addressable entity and transaction", func(t *testing.T) {
var schemaHex = `09000000040000004275726e02000000050000006f776e65720b06000000616d6f756e7407100000004368616e67654576656e74734d6f6465010000000b0000006576656e74735f6d6f6465030e0000004368616e67655365637572697479020000000500000061646d696e0b0e0000007365635f6368616e67655f6d6170110b03110000004465637265617365416c6c6f77616e636504000000050000006f776e65720b070000007370656e6465720b09000000616c6c6f77616e63650707000000646563725f62790711000000496e637265617365416c6c6f77616e636504000000050000006f776e65720b070000007370656e6465720b09000000616c6c6f77616e63650706000000696e635f627907040000004d696e740200000009000000726563697069656e740b06000000616d6f756e74070c000000536574416c6c6f77616e636503000000050000006f776e65720b070000007370656e6465720b09000000616c6c6f77616e636507080000005472616e73666572030000000600000073656e6465720b09000000726563697069656e740b06000000616d6f756e74070c0000005472616e7366657246726f6d04000000070000007370656e6465720b050000006f776e65720b09000000726563697069656e740b06000000616d6f756e7407`
hash, _ := casper.NewHash("002596e815c7235dccf76358695de0088b4636ecb2473c12bb5ff0fbbb7ae94a")
mockedClient.EXPECT().GetStateRootHashLatest(context.Background()).Return(casper.ChainGetStateRootHashResult{StateRootHash: hash}, nil)
rootHash := hash.String()
data, err := os.ReadFile("./utils/fixtures/addressable_entity/smart_contract_ces_entity.json")
assert.NoError(t, err)
var stateGetEntityResp rpc.StateGetEntity
err = json.Unmarshal(data, &stateGetEntityResp)
assert.NoError(t, err)
mockedClient.EXPECT().GetLatestEntity(gomock.Any(), gomock.Any()).Return(stateGetEntityResp, nil)
var arg casper.Argument
err = json.Unmarshal([]byte(fmt.Sprintf(`{"cl_type": "Any", "bytes": "%s"}`, schemaHex)), &arg)
require.NoError(t, err)
mockedClient.EXPECT().QueryGlobalStateByStateHash(context.Background(), &rootHash, "uref-0560a66d045da0293fc86eb0e0b8e38637b3ba2099cf492b0992b94d04ac46d1-007", nil).Return(
rpc.QueryGlobalStateResult{
StoredValue: casper.StoredValue{
CLValue: &arg,
},
}, nil)
contractsMetadata, err := eventParser.loadContractsMetadata([]casper.Hash{contractHashToParse}, Casper2xRC4)
require.NoError(t, err)
eventParser.contractsMetadata = contractsMetadata
var mintTransaction rpc.InfoGetTransactionResult
data, err = os.ReadFile("./utils/fixtures/transactions/mint.json")
assert.NoError(t, err)
err = json.Unmarshal(data, &mintTransaction)
assert.NoError(t, err)
parseResults, err := eventParser.ParseExecutionResults(mintTransaction.ExecutionInfo.ExecutionResult)
assert.NoError(t, err)
require.True(t, len(parseResults) == 1)
assert.Equal(t, parseResults[0].Event.Name, "Mint")
assert.Equal(t, parseResults[0].Event.ContractHash.String(), contractHashToParse.String())
assert.Equal(t, parseResults[0].Event.ContractPackageHash.String(), strings.TrimPrefix(stateGetEntityResp.Entity.AddressableEntity.Entity.PackageHash, "package-"))
assert.Equal(t, parseResults[0].Event.TransformID, uint(76))
assert.Equal(t, parseResults[0].Event.EventID, uint(0))
assert.NotEmpty(t, parseResults[0].Event.RawData)
assert.True(t, len(parseResults[0].Event.Data) > 0)
var transferTransaction rpc.InfoGetTransactionResult
data, err = os.ReadFile("./utils/fixtures/transactions/transfer.json")
assert.NoError(t, err)
err = json.Unmarshal(data, &transferTransaction)
assert.NoError(t, err)
parseResults, err = eventParser.ParseExecutionResults(transferTransaction.ExecutionInfo.ExecutionResult)
assert.NoError(t, err)
require.True(t, len(parseResults) == 1)
assert.Equal(t, parseResults[0].Event.Name, "Transfer")
assert.Equal(t, parseResults[0].Event.ContractHash.String(), contractHashToParse.String())
assert.Equal(t, parseResults[0].Event.ContractPackageHash.String(), strings.TrimPrefix(stateGetEntityResp.Entity.AddressableEntity.Entity.PackageHash, "package-"))
assert.Equal(t, parseResults[0].Event.TransformID, uint(11))
assert.Equal(t, parseResults[0].Event.EventID, uint(1))
assert.NotEmpty(t, parseResults[0].Event.RawData)
assert.True(t, len(parseResults[0].Event.Data) > 0)
})
}
func TestParseEventAndData(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()
contractHashToParse, err := casper.NewHash("ea0c001d969da098fefec42b141db88c74c5682e49333ded78035540a0b4f0bc")
assert.NoError(t, err)
mockedClient := mocks.NewMockClient(mockCtrl)
eventParser := EventParser{
casperClient: mockedClient,
networkVersion: Casper2xRC4,
}
var schemaHex = `08000000100000004164646564546f57686974656c6973740100000007000000616464726573730b0e00000042616c6c6f7443616e63656c65640500000005000000766f7465720b09000000766f74696e675f6964040b000000766f74696e675f74797065030600000063686f69636503050000007374616b65080a00000042616c6c6f74436173740500000005000000766f7465720b09000000766f74696e675f6964040b000000766f74696e675f74797065030600000063686f69636503050000007374616b65080c0000004f776e65724368616e67656401000000090000006e65775f6f776e65720b1400000052656d6f76656446726f6d57686974656c6973740100000007000000616464726573730b1300000053696d706c65566f74696e67437265617465640c0000000d000000646f63756d656e745f686173680a0700000063726561746f720b050000007374616b650d0809000000766f74696e675f69640416000000636f6e6669675f696e666f726d616c5f71756f72756d041b000000636f6e6669675f696e666f726d616c5f766f74696e675f74696d650514000000636f6e6669675f666f726d616c5f71756f72756d0419000000636f6e6669675f666f726d616c5f766f74696e675f74696d650516000000636f6e6669675f746f74616c5f6f6e626f61726465640822000000636f6e6669675f646f75626c655f74696d655f6265747765656e5f766f74696e6773001d000000636f6e6669675f766f74696e675f636c6561726e6573735f64656c7461082e000000636f6e6669675f74696d655f6265747765656e5f696e666f726d616c5f616e645f666f726d616c5f766f74696e67050e000000566f74696e6743616e63656c65640300000009000000766f74696e675f6964040b000000766f74696e675f747970650308000000756e7374616b6573110b080b000000566f74696e67456e6465640d00000009000000766f74696e675f6964040b000000766f74696e675f74797065030d000000766f74696e675f726573756c74030e0000007374616b655f696e5f6661766f72080d0000007374616b655f616761696e73740816000000756e626f756e645f7374616b655f696e5f6661766f720815000000756e626f756e645f7374616b655f616761696e7374080e000000766f7465735f696e5f6661766f72040d000000766f7465735f616761696e73740408000000756e7374616b657311130b0408060000007374616b657311130b0408050000006275726e7311130b0408050000006d696e747311130b0408`
var arg casper.Argument
err = json.Unmarshal([]byte(fmt.Sprintf(`{"cl_type": "Any", "bytes": "%s"}`, schemaHex)), &arg)
require.NoError(t, err)
mockedClient.EXPECT().GetLatestEntity(gomock.Any(), gomock.Any()).Return(
rpc.StateGetEntity{}, errors.New("error on state_get_entity request "))
mockedClient.EXPECT().QueryGlobalStateByStateHash(context.Background(), nil, fmt.Sprintf("hash-%s", contractHashToParse.ToHex()), []string{eventSchemaNamedKey}).Return(
rpc.QueryGlobalStateResult{
StoredValue: casper.StoredValue{
CLValue: &arg,
},
}, nil)
contractSchemaBytes, err := eventParser.FetchContractSchemasBytes(contractHashToParse)
assert.NoError(t, err)
schema, err := NewSchemasFromBytes(contractSchemaBytes)
assert.NoError(t, err)
eventHex := "420000003e000000100000006576656e745f42616c6c6f74436173740056befc13a6fd62e18f361700a5e08f966901c34df8041b36ec97d54d605c23de00000000000102e8030e0320000000d2263e86f497f42e405d5d1390aa3c1a8bfc35f3699fdc3be806a5cfe139dac90100000032"
eventName, eventData, err := ParseEventNameAndData(eventHex, schema)
assert.NoError(t, err)
assert.Equal(t, eventName, "BallotCast")
assert.True(t, len(eventData) > 0)
}