@graphprotocol/graph-cli 0.37.2 → 0.37.3-alpha-20230110163550-d64bef6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/babel.config.js +3 -0
- package/dist/bin.js +6 -0
- package/dist/cli.js +32 -0
- package/dist/codegen/schema.js +250 -0
- package/dist/codegen/schema.test.js +458 -0
- package/dist/codegen/template.js +65 -0
- package/dist/codegen/types/conversions.js +359 -0
- package/dist/codegen/types/index.js +71 -0
- package/dist/codegen/types/index.test.js +563 -0
- package/dist/codegen/typescript.js +200 -0
- package/dist/codegen/util.js +46 -0
- package/dist/codegen/util.test.js +93 -0
- package/dist/command-helpers/abi.js +78 -0
- package/dist/command-helpers/auth.js +77 -0
- package/dist/command-helpers/compiler.js +66 -0
- package/dist/command-helpers/data-sources.js +29 -0
- package/dist/command-helpers/fs.js +9 -0
- package/dist/command-helpers/gluegun.js +49 -0
- package/dist/command-helpers/ipfs.js +5 -0
- package/dist/command-helpers/jsonrpc.js +29 -0
- package/dist/command-helpers/network.js +93 -0
- package/dist/command-helpers/network.test.js +86 -0
- package/dist/command-helpers/node.js +40 -0
- package/dist/command-helpers/scaffold.js +112 -0
- package/dist/command-helpers/spinner.js +84 -0
- package/dist/command-helpers/studio.js +13 -0
- package/dist/command-helpers/studio.test.js +41 -0
- package/dist/command-helpers/subgraph.js +24 -0
- package/dist/command-helpers/version.js +74 -0
- package/dist/command-helpers/version.test.js +179 -0
- package/dist/commands/add.js +190 -0
- package/dist/commands/auth.js +127 -0
- package/dist/commands/build.js +140 -0
- package/dist/commands/codegen.js +135 -0
- package/dist/commands/create.js +86 -0
- package/dist/commands/deploy.js +334 -0
- package/dist/commands/init.js +788 -0
- package/dist/commands/local.js +387 -0
- package/dist/commands/remove.js +86 -0
- package/dist/commands/test.js +295 -0
- package/dist/compiler/asc.js +83 -0
- package/dist/compiler/index.js +474 -0
- package/dist/debug.js +16 -0
- package/dist/migrations/mapping_api_version_0_0_1.js +78 -0
- package/dist/migrations/mapping_api_version_0_0_2.js +76 -0
- package/dist/migrations/mapping_api_version_0_0_3.js +78 -0
- package/dist/migrations/mapping_api_version_0_0_4.js +80 -0
- package/dist/migrations/mapping_api_version_0_0_5.js +80 -0
- package/dist/migrations/spec_version_0_0_2.js +49 -0
- package/dist/migrations/spec_version_0_0_3.js +54 -0
- package/dist/migrations/util/load-manifest.js +18 -0
- package/dist/migrations/util/versions.js +29 -0
- package/dist/migrations.js +56 -0
- package/dist/protocols/arweave/manifest.graphql +57 -0
- package/dist/protocols/arweave/scaffold/manifest.js +18 -0
- package/dist/protocols/arweave/scaffold/mapping.js +52 -0
- package/dist/protocols/arweave/subgraph.js +23 -0
- package/dist/protocols/cosmos/manifest.graphql +76 -0
- package/dist/protocols/cosmos/scaffold/manifest.js +15 -0
- package/dist/protocols/cosmos/scaffold/mapping.js +38 -0
- package/dist/protocols/cosmos/subgraph.js +25 -0
- package/dist/protocols/ethereum/abi.js +140 -0
- package/dist/protocols/ethereum/codegen/abi.js +451 -0
- package/dist/protocols/ethereum/codegen/abi.test.js +328 -0
- package/dist/protocols/ethereum/codegen/template.js +50 -0
- package/dist/protocols/ethereum/contract.js +20 -0
- package/dist/protocols/ethereum/manifest.graphql +94 -0
- package/dist/protocols/ethereum/scaffold/manifest.js +32 -0
- package/dist/protocols/ethereum/scaffold/mapping.js +65 -0
- package/dist/protocols/ethereum/subgraph.js +171 -0
- package/dist/protocols/ethereum/type-generator.js +125 -0
- package/dist/protocols/index.js +268 -0
- package/dist/protocols/ipfs/codegen/file_template.js +50 -0
- package/dist/protocols/near/contract.js +41 -0
- package/dist/protocols/near/manifest.graphql +64 -0
- package/dist/protocols/near/scaffold/manifest.js +16 -0
- package/dist/protocols/near/scaffold/mapping.js +38 -0
- package/dist/protocols/near/subgraph.js +20 -0
- package/dist/protocols/subgraph.js +2 -0
- package/dist/protocols/substreams/manifest.graphql +45 -0
- package/dist/protocols/substreams/scaffold/manifest.js +12 -0
- package/dist/protocols/substreams/subgraph.js +23 -0
- package/dist/scaffold/cosmos.test.js +83 -0
- package/dist/scaffold/ethereum.test.js +505 -0
- package/dist/scaffold/index.js +128 -0
- package/dist/scaffold/mapping.js +61 -0
- package/dist/scaffold/near.test.js +86 -0
- package/dist/scaffold/schema.js +83 -0
- package/dist/scaffold/tests.js +175 -0
- package/dist/schema.js +54 -0
- package/dist/subgraph.js +249 -0
- package/dist/type-generator.js +224 -0
- package/dist/validation/contract.js +46 -0
- package/dist/validation/index.js +8 -0
- package/dist/validation/manifest.js +271 -0
- package/dist/validation/schema.js +796 -0
- package/dist/validation/schema.test.js +35 -0
- package/dist/watcher.js +79 -0
- package/jest.config.js +1 -1
- package/package.json +16 -9
- package/{bin/graph → src/bin.ts} +2 -1
- package/src/cli.ts +36 -0
- package/src/codegen/schema.js +23 -22
- package/src/codegen/schema.test.js +33 -27
- package/src/codegen/{template.js → template.ts} +8 -6
- package/src/codegen/types/conversions.ts +382 -0
- package/src/codegen/types/index.js +4 -7
- package/src/codegen/types/index.test.js +10 -4
- package/src/codegen/{typescript.js → typescript.ts} +44 -26
- package/src/codegen/util.js +1 -1
- package/src/codegen/util.test.js +5 -2
- package/src/command-helpers/abi.js +46 -30
- package/src/command-helpers/auth.js +6 -9
- package/src/command-helpers/compiler.js +4 -6
- package/src/command-helpers/data-sources.js +8 -11
- package/src/command-helpers/fs.ts +5 -0
- package/src/command-helpers/gluegun.js +2 -4
- package/src/command-helpers/ipfs.ts +3 -0
- package/src/command-helpers/{jsonrpc.js → jsonrpc.ts} +11 -16
- package/src/command-helpers/network.js +58 -44
- package/src/command-helpers/network.test.js +23 -19
- package/src/command-helpers/node.js +3 -7
- package/src/command-helpers/scaffold.js +34 -25
- package/src/command-helpers/{spinner.js → spinner.ts} +10 -10
- package/src/command-helpers/studio.test.js +61 -30
- package/src/command-helpers/studio.ts +20 -0
- package/src/command-helpers/{subgraph.js → subgraph.ts} +6 -6
- package/src/command-helpers/version.js +11 -16
- package/src/command-helpers/version.test.js +111 -82
- package/src/commands/add.js +49 -35
- package/src/commands/auth.js +13 -25
- package/src/commands/build.js +9 -9
- package/src/commands/codegen.js +12 -12
- package/src/commands/create.js +22 -22
- package/src/commands/deploy.js +39 -34
- package/src/commands/init.js +21 -24
- package/src/commands/local.js +15 -14
- package/src/commands/remove.js +22 -22
- package/src/commands/test.js +86 -70
- package/src/compiler/{asc.js → asc.ts} +29 -16
- package/src/compiler/index.js +18 -18
- package/src/{debug.js → debug.ts} +2 -2
- package/src/migrations/mapping_api_version_0_0_1.js +7 -7
- package/src/migrations/mapping_api_version_0_0_2.js +5 -5
- package/src/migrations/mapping_api_version_0_0_3.js +7 -7
- package/src/migrations/mapping_api_version_0_0_4.js +7 -7
- package/src/migrations/mapping_api_version_0_0_5.js +7 -7
- package/src/migrations/spec_version_0_0_2.js +5 -5
- package/src/migrations/spec_version_0_0_3.js +5 -5
- package/src/migrations/util/load-manifest.js +6 -9
- package/src/migrations/util/versions.js +5 -10
- package/src/{migrations.js → migrations.ts} +14 -15
- package/src/protocols/arweave/scaffold/manifest.js +1 -4
- package/src/protocols/arweave/scaffold/mapping.js +1 -3
- package/src/protocols/arweave/subgraph.ts +22 -0
- package/src/protocols/cosmos/scaffold/manifest.js +1 -4
- package/src/protocols/cosmos/scaffold/mapping.js +1 -3
- package/src/protocols/cosmos/subgraph.js +2 -2
- package/src/protocols/ethereum/abi.js +7 -13
- package/src/protocols/ethereum/codegen/abi.js +219 -222
- package/src/protocols/ethereum/codegen/abi.test.js +6 -6
- package/src/protocols/ethereum/codegen/template.js +3 -5
- package/src/protocols/ethereum/contract.js +3 -2
- package/src/protocols/ethereum/scaffold/manifest.js +4 -7
- package/src/protocols/ethereum/scaffold/mapping.js +4 -11
- package/src/protocols/ethereum/subgraph.js +21 -20
- package/src/protocols/ethereum/type-generator.js +24 -30
- package/src/protocols/{index.js → index.ts} +65 -46
- package/src/protocols/ipfs/codegen/file_template.js +2 -2
- package/src/protocols/near/{contract.js → contract.ts} +16 -12
- package/src/protocols/near/scaffold/manifest.js +2 -5
- package/src/protocols/near/scaffold/mapping.js +1 -3
- package/src/protocols/near/subgraph.js +3 -6
- package/src/protocols/subgraph.ts +12 -0
- package/src/protocols/substreams/scaffold/{manifest.js → manifest.ts} +2 -7
- package/src/protocols/substreams/subgraph.ts +22 -0
- package/src/scaffold/cosmos.test.js +3 -3
- package/src/scaffold/ethereum.test.js +4 -4
- package/src/scaffold/index.js +7 -7
- package/src/scaffold/mapping.js +3 -3
- package/src/scaffold/near.test.js +3 -3
- package/src/scaffold/schema.js +4 -4
- package/src/scaffold/tests.js +72 -58
- package/src/schema.ts +26 -0
- package/src/{subgraph.js → subgraph.ts} +80 -60
- package/src/type-generator.js +20 -20
- package/src/validation/contract.js +2 -6
- package/src/validation/index.js +1 -1
- package/src/validation/manifest.js +24 -22
- package/src/validation/schema.test.js +1 -1
- package/src/validation/{schema.js → schema.ts} +268 -221
- package/src/{watcher.js → watcher.ts} +23 -12
- package/tests/cli/globalSetup.js +2 -2
- package/tests/cli/globalTeardown.js +2 -2
- package/tests/cli/init.test.js +2 -2
- package/tests/cli/util.js +7 -13
- package/tsconfig.json +18 -0
- package/src/cli.js +0 -38
- package/src/codegen/types/conversions.js +0 -329
- package/src/command-helpers/fs.js +0 -8
- package/src/command-helpers/ipfs.js +0 -6
- package/src/command-helpers/studio.js +0 -15
- package/src/protocols/arweave/subgraph.js +0 -20
- package/src/protocols/substreams/subgraph.js +0 -17
- package/src/schema.js +0 -23
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const Web3EthAbi = require('web3-eth-abi')
|
|
1
|
+
import immutable from 'immutable'
|
|
2
|
+
import fs from 'fs'
|
|
3
|
+
import yaml from 'yaml'
|
|
4
|
+
import request from 'sync-request'
|
|
5
|
+
const Web3EthAbi = require('web3-eth-abi')
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
import * as tsCodegen from '../../../codegen/typescript'
|
|
8
|
+
import * as typesCodegen from '../../../codegen/types'
|
|
9
|
+
import * as util from '../../../codegen/util'
|
|
10
10
|
|
|
11
|
-
const doFixtureCodegen = fs.existsSync('./fixtures.yaml')
|
|
11
|
+
const doFixtureCodegen = fs.existsSync('./fixtures.yaml')
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
export default class AbiCodeGenerator {
|
|
14
14
|
constructor(abi) {
|
|
15
15
|
this.abi = abi
|
|
16
16
|
}
|
|
@@ -33,17 +33,12 @@ module.exports = class AbiCodeGenerator {
|
|
|
33
33
|
'BigInt',
|
|
34
34
|
],
|
|
35
35
|
'@graphprotocol/graph-ts',
|
|
36
|
-
)
|
|
36
|
+
),
|
|
37
37
|
]
|
|
38
38
|
|
|
39
39
|
if (doFixtureCodegen) {
|
|
40
40
|
imports.push(
|
|
41
|
-
tsCodegen.moduleImports(
|
|
42
|
-
[
|
|
43
|
-
'newMockEvent',
|
|
44
|
-
],
|
|
45
|
-
'matchstick-as/assembly/index',
|
|
46
|
-
)
|
|
41
|
+
tsCodegen.moduleImports(['newMockEvent'], 'matchstick-as/assembly/index'),
|
|
47
42
|
)
|
|
48
43
|
}
|
|
49
44
|
|
|
@@ -66,106 +61,104 @@ module.exports = class AbiCodeGenerator {
|
|
|
66
61
|
setName: (fn, name) => fn.set('_alias', name),
|
|
67
62
|
})
|
|
68
63
|
|
|
69
|
-
callFunctions = callFunctions
|
|
70
|
-
.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
let tupleClasses = []
|
|
74
|
-
|
|
75
|
-
// First, generate a class with the input getters
|
|
76
|
-
let inputsClassName = fnClassName + '__Inputs'
|
|
77
|
-
let inputsClass = tsCodegen.klass(inputsClassName, { export: true })
|
|
78
|
-
inputsClass.addMember(tsCodegen.klassMember('_call', fnClassName))
|
|
79
|
-
inputsClass.addMethod(
|
|
80
|
-
tsCodegen.method(
|
|
81
|
-
`constructor`,
|
|
82
|
-
[tsCodegen.param(`call`, fnClassName)],
|
|
83
|
-
null,
|
|
84
|
-
`this._call = call`,
|
|
85
|
-
),
|
|
86
|
-
)
|
|
64
|
+
callFunctions = callFunctions.map(fn => {
|
|
65
|
+
let fnAlias = fn.get('_alias')
|
|
66
|
+
let fnClassName = `${fnAlias.charAt(0).toUpperCase()}${fnAlias.slice(1)}Call`
|
|
67
|
+
let tupleClasses = []
|
|
87
68
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
`call`,
|
|
101
|
-
`inputValues`,
|
|
102
|
-
)
|
|
103
|
-
inputsClass.addMethod(callInput.getter)
|
|
104
|
-
tupleClasses.push(...callInput.classes)
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
// Second, generate a class with the output getters
|
|
108
|
-
let outputsClassName = fnClassName + '__Outputs'
|
|
109
|
-
let outputsClass = tsCodegen.klass(outputsClassName, { export: true })
|
|
110
|
-
outputsClass.addMember(tsCodegen.klassMember('_call', fnClassName))
|
|
111
|
-
outputsClass.addMethod(
|
|
112
|
-
tsCodegen.method(
|
|
113
|
-
`constructor`,
|
|
114
|
-
[tsCodegen.param(`call`, fnClassName)],
|
|
115
|
-
null,
|
|
116
|
-
`this._call = call`,
|
|
117
|
-
),
|
|
118
|
-
)
|
|
69
|
+
// First, generate a class with the input getters
|
|
70
|
+
let inputsClassName = fnClassName + '__Inputs'
|
|
71
|
+
let inputsClass = tsCodegen.klass(inputsClassName, { export: true })
|
|
72
|
+
inputsClass.addMember(tsCodegen.klassMember('_call', fnClassName))
|
|
73
|
+
inputsClass.addMethod(
|
|
74
|
+
tsCodegen.method(
|
|
75
|
+
`constructor`,
|
|
76
|
+
[tsCodegen.param(`call`, fnClassName)],
|
|
77
|
+
null,
|
|
78
|
+
`this._call = call`,
|
|
79
|
+
),
|
|
80
|
+
)
|
|
119
81
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
82
|
+
// Generate getters and classes for function inputs
|
|
83
|
+
util
|
|
84
|
+
.disambiguateNames({
|
|
85
|
+
values: fn.get('inputs', immutable.List()),
|
|
86
|
+
getName: (input, index) => input.get('name') || `value${index}`,
|
|
87
|
+
setName: (input, name) => input.set('name', name),
|
|
88
|
+
})
|
|
89
|
+
.forEach((input, index) => {
|
|
90
|
+
let callInput = this._generateInputOrOutput(
|
|
91
|
+
input,
|
|
92
|
+
index,
|
|
93
|
+
fnClassName,
|
|
94
|
+
`call`,
|
|
95
|
+
`inputValues`,
|
|
96
|
+
)
|
|
97
|
+
inputsClass.addMethod(callInput.getter)
|
|
98
|
+
tupleClasses.push(...callInput.classes)
|
|
99
|
+
})
|
|
138
100
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
101
|
+
// Second, generate a class with the output getters
|
|
102
|
+
let outputsClassName = fnClassName + '__Outputs'
|
|
103
|
+
let outputsClass = tsCodegen.klass(outputsClassName, { export: true })
|
|
104
|
+
outputsClass.addMember(tsCodegen.klassMember('_call', fnClassName))
|
|
105
|
+
outputsClass.addMethod(
|
|
106
|
+
tsCodegen.method(
|
|
107
|
+
`constructor`,
|
|
108
|
+
[tsCodegen.param(`call`, fnClassName)],
|
|
109
|
+
null,
|
|
110
|
+
`this._call = call`,
|
|
111
|
+
),
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
// Generate getters and classes for function outputs
|
|
115
|
+
util
|
|
116
|
+
.disambiguateNames({
|
|
117
|
+
values: fn.get('outputs', immutable.List()),
|
|
118
|
+
getName: (output, index) => output.get('name') || `value${index}`,
|
|
119
|
+
setName: (output, name) => output.set('name', name),
|
|
120
|
+
})
|
|
121
|
+
.forEach((output, index) => {
|
|
122
|
+
let callInput = this._generateInputOrOutput(
|
|
123
|
+
output,
|
|
124
|
+
index,
|
|
125
|
+
fnClassName,
|
|
126
|
+
`call`,
|
|
127
|
+
`outputValues`,
|
|
128
|
+
)
|
|
129
|
+
outputsClass.addMethod(callInput.getter)
|
|
130
|
+
tupleClasses.push(...callInput.classes)
|
|
143
131
|
})
|
|
144
|
-
klass.addMethod(
|
|
145
|
-
tsCodegen.method(
|
|
146
|
-
`get inputs`,
|
|
147
|
-
[],
|
|
148
|
-
tsCodegen.namedType(inputsClassName),
|
|
149
|
-
`return new ${inputsClassName}(this)`,
|
|
150
|
-
),
|
|
151
|
-
)
|
|
152
|
-
klass.addMethod(
|
|
153
|
-
tsCodegen.method(
|
|
154
|
-
`get outputs`,
|
|
155
|
-
[],
|
|
156
|
-
tsCodegen.namedType(outputsClassName),
|
|
157
|
-
`return new ${outputsClassName}(this)`,
|
|
158
|
-
),
|
|
159
|
-
)
|
|
160
|
-
return [klass, inputsClass, outputsClass, ...tupleClasses]
|
|
161
|
-
})
|
|
162
132
|
|
|
163
|
-
|
|
164
|
-
.
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
133
|
+
// Then, generate the event class itself
|
|
134
|
+
let klass = tsCodegen.klass(fnClassName, {
|
|
135
|
+
export: true,
|
|
136
|
+
extends: 'ethereum.Call',
|
|
137
|
+
})
|
|
138
|
+
klass.addMethod(
|
|
139
|
+
tsCodegen.method(
|
|
140
|
+
`get inputs`,
|
|
141
|
+
[],
|
|
142
|
+
tsCodegen.namedType(inputsClassName),
|
|
143
|
+
`return new ${inputsClassName}(this)`,
|
|
144
|
+
),
|
|
145
|
+
)
|
|
146
|
+
klass.addMethod(
|
|
147
|
+
tsCodegen.method(
|
|
148
|
+
`get outputs`,
|
|
149
|
+
[],
|
|
150
|
+
tsCodegen.namedType(outputsClassName),
|
|
151
|
+
`return new ${outputsClassName}(this)`,
|
|
152
|
+
),
|
|
168
153
|
)
|
|
154
|
+
return [klass, inputsClass, outputsClass, ...tupleClasses]
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
return callFunctions.reduce(
|
|
158
|
+
// flatten the array
|
|
159
|
+
(array, classes) => array.concat(classes),
|
|
160
|
+
[],
|
|
161
|
+
)
|
|
169
162
|
}
|
|
170
163
|
|
|
171
164
|
_generateEventTypes() {
|
|
@@ -176,122 +169,124 @@ module.exports = class AbiCodeGenerator {
|
|
|
176
169
|
setName: (event, name) => event.set('_alias', name),
|
|
177
170
|
})
|
|
178
171
|
|
|
179
|
-
events = events
|
|
180
|
-
.
|
|
181
|
-
|
|
182
|
-
let tupleClasses = []
|
|
172
|
+
events = events.map(event => {
|
|
173
|
+
let eventClassName = event.get('_alias')
|
|
174
|
+
let tupleClasses = []
|
|
183
175
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
// Enumerate inputs with duplicate names
|
|
198
|
-
let inputs = util.disambiguateNames({
|
|
199
|
-
values: event.get('inputs'),
|
|
200
|
-
getName: (input, index) => input.get('name') || `param${index}`,
|
|
201
|
-
setName: (input, name) => input.set('name', name),
|
|
202
|
-
})
|
|
203
|
-
|
|
204
|
-
let namesAndTypes = []
|
|
205
|
-
inputs.forEach((input, index) => {
|
|
206
|
-
// Generate getters and classes for event params
|
|
207
|
-
let paramObject = this._generateInputOrOutput(
|
|
208
|
-
input,
|
|
209
|
-
index,
|
|
210
|
-
eventClassName,
|
|
211
|
-
`event`,
|
|
212
|
-
`parameters`,
|
|
213
|
-
)
|
|
214
|
-
paramsClass.addMethod(paramObject.getter)
|
|
215
|
-
|
|
216
|
-
// Fixture generation
|
|
217
|
-
if (doFixtureCodegen) {
|
|
218
|
-
let ethType = typesCodegen.ethereumTypeForAsc(paramObject.getter.returnType)
|
|
219
|
-
if (typeof ethType === typeof {} && (ethType.test("int256") || ethType.test("uint256"))) {
|
|
220
|
-
ethType = "int32"
|
|
221
|
-
}
|
|
222
|
-
namesAndTypes.push({name: paramObject.getter.name.slice(4), type: ethType})
|
|
223
|
-
}
|
|
176
|
+
// First, generate a class with the param getters
|
|
177
|
+
let paramsClassName = eventClassName + '__Params'
|
|
178
|
+
let paramsClass = tsCodegen.klass(paramsClassName, { export: true })
|
|
179
|
+
paramsClass.addMember(tsCodegen.klassMember('_event', eventClassName))
|
|
180
|
+
paramsClass.addMethod(
|
|
181
|
+
tsCodegen.method(
|
|
182
|
+
`constructor`,
|
|
183
|
+
[tsCodegen.param(`event`, eventClassName)],
|
|
184
|
+
null,
|
|
185
|
+
`this._event = event`,
|
|
186
|
+
),
|
|
187
|
+
)
|
|
224
188
|
|
|
225
|
-
|
|
226
|
-
|
|
189
|
+
// Enumerate inputs with duplicate names
|
|
190
|
+
let inputs = util.disambiguateNames({
|
|
191
|
+
values: event.get('inputs'),
|
|
192
|
+
getName: (input, index) => input.get('name') || `param${index}`,
|
|
193
|
+
setName: (input, name) => input.set('name', name),
|
|
194
|
+
})
|
|
227
195
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
tsCodegen.namedType(paramsClassName),
|
|
238
|
-
`return new ${paramsClassName}(this)`,
|
|
239
|
-
),
|
|
196
|
+
let namesAndTypes = []
|
|
197
|
+
inputs.forEach((input, index) => {
|
|
198
|
+
// Generate getters and classes for event params
|
|
199
|
+
let paramObject = this._generateInputOrOutput(
|
|
200
|
+
input,
|
|
201
|
+
index,
|
|
202
|
+
eventClassName,
|
|
203
|
+
`event`,
|
|
204
|
+
`parameters`,
|
|
240
205
|
)
|
|
206
|
+
paramsClass.addMethod(paramObject.getter)
|
|
241
207
|
|
|
242
208
|
// Fixture generation
|
|
243
209
|
if (doFixtureCodegen) {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
let resp = request("GET", url)
|
|
252
|
-
let body = JSON.parse(resp.getBody("utf8"))
|
|
253
|
-
if (body.status === '0') {
|
|
254
|
-
throw new Error(body.result)
|
|
210
|
+
let ethType = typesCodegen.ethereumTypeForAsc(paramObject.getter.returnType)
|
|
211
|
+
if (
|
|
212
|
+
typeof ethType === typeof {} &&
|
|
213
|
+
(ethType.test('int256') || ethType.test('uint256'))
|
|
214
|
+
) {
|
|
215
|
+
ethType = 'int32'
|
|
255
216
|
}
|
|
217
|
+
namesAndTypes.push({ name: paramObject.getter.name.slice(4), type: ethType })
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
tupleClasses.push(...paramObject.classes)
|
|
221
|
+
})
|
|
256
222
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
223
|
+
// Then, generate the event class itself
|
|
224
|
+
let klass = tsCodegen.klass(eventClassName, {
|
|
225
|
+
export: true,
|
|
226
|
+
extends: 'ethereum.Event',
|
|
227
|
+
})
|
|
228
|
+
klass.addMethod(
|
|
229
|
+
tsCodegen.method(
|
|
230
|
+
`get params`,
|
|
231
|
+
[],
|
|
232
|
+
tsCodegen.namedType(paramsClassName),
|
|
233
|
+
`return new ${paramsClassName}(this)`,
|
|
234
|
+
),
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
// Fixture generation
|
|
238
|
+
if (doFixtureCodegen) {
|
|
239
|
+
const args = yaml.parse(fs.readFileSync('./fixtures.yaml', 'utf8'))
|
|
240
|
+
const blockNumber = args['blockNumber']
|
|
241
|
+
const contractAddr = args['contractAddr']
|
|
242
|
+
const topic0 = args['topic0']
|
|
243
|
+
const apiKey = args['apiKey']
|
|
244
|
+
const url = `https://api.etherscan.io/api?module=logs&action=getLogs&fromBlock=${blockNumber}&toBlock=${blockNumber}&address=${contractAddr}&${topic0}=topic0&apikey=${apiKey}`
|
|
245
|
+
|
|
246
|
+
let resp = request('GET', url)
|
|
247
|
+
let body = JSON.parse(resp.getBody('utf8'))
|
|
248
|
+
if (body.status === '0') {
|
|
249
|
+
throw new Error(body.result)
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
let res = Web3EthAbi.decodeLog(namesAndTypes, body.result[0].data, [])
|
|
253
|
+
|
|
254
|
+
let stmnts = ''
|
|
255
|
+
for (let i = 0; i < namesAndTypes.length; i++) {
|
|
256
|
+
let code = '"' + res[i] + '"'
|
|
257
|
+
if (namesAndTypes[i].type.toString() == 'address') {
|
|
258
|
+
code = `Address.fromString(${code})`
|
|
270
259
|
}
|
|
260
|
+
stmnts = stmnts.concat(
|
|
261
|
+
`event.parameters.push(new ethereum.EventParam(\"${
|
|
262
|
+
namesAndTypes[i].name
|
|
263
|
+
}\", ${typesCodegen.ethereumFromAsc(code, namesAndTypes[i].type)}));`,
|
|
264
|
+
`\n`,
|
|
265
|
+
)
|
|
266
|
+
}
|
|
271
267
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
268
|
+
klass.addMethod(
|
|
269
|
+
tsCodegen.staticMethod(
|
|
270
|
+
`mock${eventClassName}`,
|
|
271
|
+
[],
|
|
272
|
+
tsCodegen.namedType(eventClassName),
|
|
273
|
+
`
|
|
278
274
|
let event = changetype<${eventClassName}>(newMockEvent());
|
|
279
275
|
${stmnts}
|
|
280
276
|
return event;
|
|
281
277
|
`,
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
278
|
+
),
|
|
279
|
+
)
|
|
280
|
+
}
|
|
285
281
|
|
|
286
|
-
|
|
287
|
-
|
|
282
|
+
return [klass, paramsClass, ...tupleClasses]
|
|
283
|
+
})
|
|
288
284
|
|
|
289
|
-
return events
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
)
|
|
285
|
+
return events.reduce(
|
|
286
|
+
// flatten the array
|
|
287
|
+
(array, classes) => array.concat(classes),
|
|
288
|
+
[],
|
|
289
|
+
)
|
|
295
290
|
}
|
|
296
291
|
|
|
297
292
|
_generateInputOrOutput(inputOrOutput, index, parentClass, parentType, parentField) {
|
|
@@ -363,10 +358,10 @@ module.exports = class AbiCodeGenerator {
|
|
|
363
358
|
`get ${name}`,
|
|
364
359
|
[],
|
|
365
360
|
util.isTupleMatrixType(type)
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
361
|
+
? `Array<Array<${tupleClassName}>>`
|
|
362
|
+
: util.isTupleArrayType(type)
|
|
363
|
+
? `Array<${tupleClassName}>`
|
|
364
|
+
: tupleClassName,
|
|
370
365
|
`
|
|
371
366
|
return ${
|
|
372
367
|
isTupleType ? `changetype<${tupleClassName}>(${returnValue})` : `${returnValue}`
|
|
@@ -506,16 +501,18 @@ module.exports = class AbiCodeGenerator {
|
|
|
506
501
|
),
|
|
507
502
|
)
|
|
508
503
|
.forEach(member => returnType.addMember(member))
|
|
509
|
-
|
|
504
|
+
|
|
510
505
|
// Add getters to the type
|
|
511
506
|
outputs
|
|
512
|
-
.map(
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
507
|
+
.map(
|
|
508
|
+
(output, index) =>
|
|
509
|
+
!!output.get('name') &&
|
|
510
|
+
tsCodegen.method(
|
|
511
|
+
`get${output.get('name')[0].toUpperCase()}${output.get('name').slice(1)}`,
|
|
512
|
+
[],
|
|
513
|
+
this._getTupleParamType(output, index, tupleResultParentType),
|
|
514
|
+
`return this.value${index};`,
|
|
515
|
+
),
|
|
519
516
|
)
|
|
520
517
|
.forEach(method => !!method && returnType.addMethod(method))
|
|
521
518
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import fs from 'fs-extra'
|
|
2
|
+
import path from 'path'
|
|
3
|
+
import immutable from 'immutable'
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
import ABI from '../abi'
|
|
6
|
+
import * as ts from '../../../codegen/typescript'
|
|
7
|
+
import AbiCodeGenerator from './abi'
|
|
8
8
|
|
|
9
9
|
let tempdir
|
|
10
10
|
let abi
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
import * as tsCodegen from '../../../codegen/typescript'
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
export default class EthereumTemplateCodeGen {
|
|
4
4
|
constructor(template) {
|
|
5
5
|
this.template = template
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
generateModuleImports() {
|
|
9
|
-
return [
|
|
10
|
-
'Address',
|
|
11
|
-
]
|
|
9
|
+
return ['Address']
|
|
12
10
|
}
|
|
13
11
|
|
|
14
12
|
generateCreateMethod() {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
export default class EthereumContract {
|
|
2
2
|
static identifierName() {
|
|
3
3
|
return 'address'
|
|
4
4
|
}
|
|
@@ -10,7 +10,8 @@ module.exports = class EthereumContract {
|
|
|
10
10
|
validate() {
|
|
11
11
|
const pattern = /^(0x)?[0-9a-fA-F]{40}$/
|
|
12
12
|
|
|
13
|
-
const errorMessage =
|
|
13
|
+
const errorMessage =
|
|
14
|
+
"Must be 40 hexadecimal characters, with an optional '0x' prefix."
|
|
14
15
|
|
|
15
16
|
const valid = pattern.test(this.address)
|
|
16
17
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { abiEvents } from '../../../scaffold/schema'
|
|
2
|
+
import { strings } from 'gluegun'
|
|
3
|
+
import ABI from '../abi'
|
|
4
4
|
|
|
5
5
|
const source = ({ contract, contractName }) => `
|
|
6
6
|
address: '${contract}'
|
|
@@ -27,7 +27,4 @@ const mapping = ({ abi, contractName }) => `
|
|
|
27
27
|
.join('')}
|
|
28
28
|
file: ./src/${strings.kebabCase(contractName)}.ts`
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
source,
|
|
32
|
-
mapping,
|
|
33
|
-
}
|
|
30
|
+
export { source, mapping }
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import { generateEventFieldAssignments } from '../../../scaffold/mapping'
|
|
2
2
|
|
|
3
3
|
const generatePlaceholderHandlers = ({ abi, events, contractName }) =>
|
|
4
4
|
`
|
|
@@ -29,9 +29,7 @@ const generatePlaceholderHandlers = ({ abi, events, contractName }) =>
|
|
|
29
29
|
entity.count = entity.count + BigInt.fromI32(1)
|
|
30
30
|
|
|
31
31
|
// Entity fields can be set based on event parameters
|
|
32
|
-
${generateEventFieldAssignments(event)
|
|
33
|
-
.slice(0, 2)
|
|
34
|
-
.join('\n')}
|
|
32
|
+
${generateEventFieldAssignments(event).slice(0, 2).join('\n')}
|
|
35
33
|
|
|
36
34
|
// Entities can be written to the store with \`.save()\`
|
|
37
35
|
entity.save()
|
|
@@ -52,10 +50,7 @@ const generatePlaceholderHandlers = ({ abi, events, contractName }) =>
|
|
|
52
50
|
// state variables and other data:
|
|
53
51
|
//
|
|
54
52
|
// ${
|
|
55
|
-
abi
|
|
56
|
-
.codeGenerator()
|
|
57
|
-
.callableFunctions()
|
|
58
|
-
.isEmpty()
|
|
53
|
+
abi.codeGenerator().callableFunctions().isEmpty()
|
|
59
54
|
? 'None'
|
|
60
55
|
: abi
|
|
61
56
|
.codeGenerator()
|
|
@@ -71,6 +66,4 @@ export function handle${event._alias}(event: ${event._alias}): void {}
|
|
|
71
66
|
)
|
|
72
67
|
.join('\n')}`
|
|
73
68
|
|
|
74
|
-
|
|
75
|
-
generatePlaceholderHandlers,
|
|
76
|
-
}
|
|
69
|
+
export { generatePlaceholderHandlers }
|