Skip to content

Commit 9b82e7a

Browse files
author
Victor Velev
committed
add mock event fixture generator
1 parent 3ac7a34 commit 9b82e7a

File tree

3 files changed

+2353
-45
lines changed

3 files changed

+2353
-45
lines changed

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
"prettier": "^1.13.5",
2424
"request": "^2.88.0",
2525
"semver": "7.3.5",
26+
"sync-request": "^6.1.0",
2627
"tmp-promise": "^3.0.2",
28+
"web3": "^1.6.1",
2729
"which": "2.0.2",
2830
"yaml": "^1.5.1"
2931
},

src/protocols/ethereum/codegen/abi.js

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
const immutable = require('immutable')
2+
const fs = require('fs')
3+
const yaml = require('yaml')
4+
const request = require('sync-request')
5+
const Web3 = require('web3')
6+
const web3 = new Web3(null)
27

38
const tsCodegen = require('../../../codegen/typescript')
49
const typesCodegen = require('../../../codegen/types')
@@ -28,6 +33,12 @@ module.exports = class AbiCodeGenerator {
2833
],
2934
'@graphprotocol/graph-ts',
3035
),
36+
tsCodegen.moduleImports(
37+
[
38+
'newMockEvent',
39+
],
40+
'matchstick-as/assembly/index',
41+
),
3142
]
3243
}
3344

@@ -182,6 +193,7 @@ module.exports = class AbiCodeGenerator {
182193
setName: (input, name) => input.set('name', name),
183194
})
184195

196+
let namesAndTypes = []
185197
inputs.forEach((input, index) => {
186198
// Generate getters and classes for event params
187199
let paramObject = this._generateInputOrOutput(
@@ -192,6 +204,11 @@ module.exports = class AbiCodeGenerator {
192204
`parameters`,
193205
)
194206
paramsClass.addMethod(paramObject.getter)
207+
let ethType = typesCodegen.ethereumTypeForAsc(paramObject.getter.returnType)
208+
if (typeof ethType === typeof {} && (ethType.test("int256") || ethType.test("uint256"))) {
209+
ethType = "int32"
210+
}
211+
namesAndTypes.push({name: paramObject.getter.name.slice(4), type: ethType})
195212
tupleClasses.push(...paramObject.classes)
196213
})
197214

@@ -208,6 +225,54 @@ module.exports = class AbiCodeGenerator {
208225
`return new ${paramsClassName}(this)`,
209226
),
210227
)
228+
229+
// Fixture generation
230+
try {
231+
const args = yaml.parse(fs.readFileSync('./fixtures.yaml', 'utf8'))
232+
const blockNumber = args['blockNumber']
233+
const contractAddr = args['contractAddr']
234+
const topic0 = args['topic0']
235+
const apiKey = args['apiKey']
236+
const url = `https://api.etherscan.io/api?module=logs&action=getLogs&fromBlock=${blockNumber}&toBlock=${blockNumber}&address=${contractAddr}&${topic0}=topic0&apikey=${apiKey}`;
237+
238+
let resp = request("GET", url)
239+
let body = JSON.parse(resp.getBody("utf8"))
240+
if (body.status === '0') {
241+
throw new Error(body.result)
242+
}
243+
244+
let res = web3.eth.abi.decodeLog(
245+
namesAndTypes,
246+
body.result[0].data,
247+
[]
248+
);
249+
250+
let stmnts = ""
251+
for (let i = 0; i < namesAndTypes.length; i++) {
252+
let code = '"' + res[i] + '"'
253+
if (namesAndTypes[i].type.toString() == "address") {
254+
code = `Address.fromString(${code})`
255+
}
256+
stmnts = stmnts.concat(`event.parameters.push(new ethereum.EventParam(\"${namesAndTypes[i].name}\", ${typesCodegen.ethereumFromAsc(code, namesAndTypes[i].type)}));`, `\n`)
257+
}
258+
259+
klass.addMethod(
260+
tsCodegen.staticMethod(
261+
`mock${eventClassName}`,
262+
[],
263+
tsCodegen.namedType(eventClassName),
264+
`
265+
let event = changetype<${eventClassName}>(newMockEvent());
266+
${stmnts}
267+
return event;
268+
`,
269+
)
270+
)
271+
} catch (e) {
272+
// no fixtures
273+
console.log(e)
274+
}
275+
211276
return [klass, paramsClass, ...tupleClasses]
212277
})
213278

0 commit comments

Comments
 (0)