Skip to content

Commit 7788986

Browse files
steve proJannis
authored andcommitted
commands/init, scaffold: Add contract name support to graph init
1 parent ee3908f commit 7788986

File tree

3 files changed

+41
-22
lines changed

3 files changed

+41
-22
lines changed

src/commands/init.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,12 @@ ${chalk.dim('Options for --from-contract:')}
3333
--network <mainnet|kovan|rinkeby|ropsten|goerli|poa-core>
3434
Selects the network the contract is deployed to
3535
--index-events Index contract events as entities
36+
--contract-name Name of the contract (default: Contract)
3637
`
3738

3839
const processInitForm = async (
3940
toolbox,
40-
{ abi, address, allowSimpleName, directory, fromExample, network, subgraphName },
41+
{abi, address, allowSimpleName, directory, fromExample, network, subgraphName, contractName},
4142
) => {
4243
let networkChoices = ['mainnet', 'kovan', 'rinkeby', 'ropsten', 'goerli', 'poa-core']
4344
let addressPattern = /^(0x)?[0-9a-fA-F]{40}$/
@@ -147,6 +148,18 @@ const processInitForm = async (
147148
}
148149
},
149150
},
151+
{
152+
type: 'input',
153+
name: 'contractName',
154+
message: 'Contract Name',
155+
initial: contractName || 'Contract',
156+
skip: () => fromExample !== undefined,
157+
validate: value => value && value.length > 0,
158+
result: value => {
159+
contractName = value;
160+
return value;
161+
}
162+
},
150163
]
151164

152165
try {
@@ -233,6 +246,7 @@ module.exports = {
233246
abi,
234247
allowSimpleName,
235248
fromContract,
249+
contractName,
236250
fromExample,
237251
h,
238252
help,
@@ -338,6 +352,7 @@ module.exports = {
338352
indexEvents,
339353
network,
340354
subgraphName,
355+
contractName,
341356
},
342357
{ commands },
343358
)
@@ -352,6 +367,7 @@ module.exports = {
352367
fromExample,
353368
network,
354369
subgraphName,
370+
contractName
355371
})
356372

357373
// Exit immediately when the form is cancelled
@@ -382,6 +398,7 @@ module.exports = {
382398
network: inputs.network,
383399
address: inputs.address,
384400
indexEvents,
401+
contractName: inputs.contractName
385402
},
386403
{ commands },
387404
)
@@ -571,7 +588,7 @@ const initSubgraphFromExample = async (
571588

572589
const initSubgraphFromContract = async (
573590
toolbox,
574-
{ allowSimpleName, subgraphName, directory, abi, network, address, indexEvents },
591+
{allowSimpleName, subgraphName, directory, abi, network, address, indexEvents, contractName},
575592
{ commands },
576593
) => {
577594
let { print } = toolbox
@@ -609,6 +626,7 @@ const initSubgraphFromContract = async (
609626
network,
610627
address,
611628
indexEvents,
629+
contractName,
612630
},
613631
spinner,
614632
)

src/scaffold.js

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,19 @@ const generatePackageJson = ({ subgraphName }) =>
5050

5151
// Subgraph manifest
5252

53-
const generateManifest = ({ abi, address, network }) =>
53+
const generateManifest = ({ abi, address, network, contractName }) =>
5454
prettier.format(
5555
`
5656
specVersion: 0.0.1
5757
schema:
5858
file: ./schema.graphql
5959
dataSources:
6060
- kind: ethereum/contract
61-
name: Contract
61+
name: ${contractName}
6262
network: ${network}
6363
source:
6464
address: '${address}'
65-
abi: Contract
65+
abi: ${contractName}
6666
mapping:
6767
kind: ethereum/events
6868
apiVersion: 0.0.2
@@ -72,8 +72,8 @@ dataSources:
7272
.map(event => `- ${event.get('_alias')}`)
7373
.join('\n ')}
7474
abis:
75-
- name: Contract
76-
file: ./abis/Contract.json
75+
- name: ${contractName}
76+
file: ./abis/${contractName}.json
7777
eventHandlers:
7878
${abiEvents(abi)
7979
.map(
@@ -185,11 +185,11 @@ const generateEventFieldAssignments = event =>
185185
[],
186186
)
187187

188-
const generateEventIndexingHandlers = events =>
188+
const generateEventIndexingHandlers = (events, contractName) =>
189189
`
190190
import { ${events.map(
191191
event => `${event._alias} as ${event._alias}Event`,
192-
)}} from '../generated/Contract/Contract'
192+
)}} from '../generated/${contractName}/${contractName}'
193193
import { ${events.map(event => event._alias)} } from '../generated/schema'
194194
195195
${events
@@ -208,11 +208,11 @@ const generateEventIndexingHandlers = events =>
208208
.join('\n')}
209209
`
210210

211-
const generatePlaceholderHandlers = ({ abi, events }) =>
211+
const generatePlaceholderHandlers = ({ abi, events, contractName }) =>
212212
`
213213
import { BigInt } from '@graphprotocol/graph-ts'
214-
import { Contract, ${events.map(event => event._alias)} }
215-
from '../generated/Contract/Contract'
214+
import { ${contractName}, ${events.map(event => event._alias)} }
215+
from '../generated/${contractName}/${contractName}'
216216
import { ExampleEntity } from '../generated/schema'
217217
218218
${events
@@ -279,33 +279,33 @@ export function handle${event._alias}(event: ${event._alias}): void {}
279279
)
280280
.join('\n')}`
281281

282-
const generateMapping = ({ abi, indexEvents }) => {
282+
const generateMapping = ({ abi, indexEvents, contractName }) => {
283283
let events = abiEvents(abi).toJS()
284284
return prettier.format(
285285
indexEvents
286-
? generateEventIndexingHandlers(events)
287-
: generatePlaceholderHandlers({ abi, events: events }),
286+
? generateEventIndexingHandlers(events, contractName)
287+
: generatePlaceholderHandlers({ abi, events: events, contractName }),
288288
{ parser: 'typescript', semi: false },
289289
)
290290
}
291291

292292
const generateScaffold = async (
293-
{ abi, address, network, subgraphName, indexEvents },
293+
{ abi, address, network, subgraphName, indexEvents, contractName='Contract' },
294294
spinner,
295295
) => {
296296
step(spinner, 'Generate subgraph from ABI')
297297
let packageJson = generatePackageJson({ subgraphName })
298-
let manifest = generateManifest({ abi, address, network })
299-
let schema = generateSchema({ abi, indexEvents })
300-
let mapping = generateMapping({ abi, subgraphName, indexEvents })
298+
let manifest = generateManifest({ abi, address, network, contractName })
299+
let schema = generateSchema({ abi, indexEvents, contractName })
300+
let mapping = generateMapping({ abi, subgraphName, indexEvents, contractName })
301301

302302
return {
303303
'package.json': packageJson,
304304
'subgraph.yaml': manifest,
305305
'schema.graphql': schema,
306306
src: { 'mapping.ts': mapping },
307307
abis: {
308-
'Contract.json': prettier.format(JSON.stringify(abi.data), {
308+
[`${contractName}.json`]: prettier.format(JSON.stringify(abi.data), {
309309
parser: 'json',
310310
}),
311311
},

src/scaffold.test.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ describe('Subgraph scaffolding', () => {
8080
abi: TEST_ABI,
8181
network: 'kovan',
8282
address: '0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d',
83+
contractName: 'Contract'
8384
}),
8485
).toEqual(`\
8586
specVersion: 0.0.1
@@ -146,7 +147,7 @@ type ExampleEvent1 @entity {
146147
})
147148

148149
test('Mapping (default)', () => {
149-
expect(generateMapping({ abi: TEST_ABI })).toEqual(`\
150+
expect(generateMapping({ abi: TEST_ABI, contractName: 'Contract' })).toEqual(`\
150151
import { BigInt } from "@graphprotocol/graph-ts"
151152
import {
152153
Contract,
@@ -203,7 +204,7 @@ export function handleExampleEvent1(event: ExampleEvent1): void {}
203204
})
204205

205206
test('Mapping (for indexing events)', () => {
206-
expect(generateMapping({ abi: TEST_ABI, indexEvents: true })).toEqual(`\
207+
expect(generateMapping({ abi: TEST_ABI, indexEvents: true, contractName: 'Contract' })).toEqual(`\
207208
import {
208209
ExampleEvent as ExampleEventEvent,
209210
ExampleEvent1 as ExampleEvent1Event

0 commit comments

Comments
 (0)