@graphprotocol/graph-cli 0.37.4 → 0.37.5
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 +8 -0
- package/dist/bin.js +6 -0
- package/dist/cli.js +26 -0
- package/dist/codegen/schema.js +244 -0
- package/dist/codegen/schema.test.js +455 -0
- package/dist/codegen/template.js +66 -0
- package/dist/codegen/types/conversions.js +335 -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 +40 -0
- package/dist/codegen/util.test.js +93 -0
- package/dist/command-helpers/abi.js +76 -0
- package/dist/command-helpers/auth.js +76 -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 +48 -0
- package/dist/command-helpers/ipfs.js +5 -0
- package/dist/command-helpers/jsonrpc.js +27 -0
- package/dist/command-helpers/network.js +90 -0
- package/dist/command-helpers/network.test.js +86 -0
- package/dist/command-helpers/node.js +40 -0
- package/dist/command-helpers/scaffold.js +110 -0
- package/dist/command-helpers/spinner.js +80 -0
- package/dist/command-helpers/studio.js +14 -0
- package/dist/command-helpers/studio.test.js +41 -0
- package/dist/command-helpers/subgraph.js +22 -0
- package/dist/command-helpers/version.js +66 -0
- package/dist/command-helpers/version.test.js +186 -0
- package/dist/commands/add.js +187 -0
- package/dist/commands/auth.js +122 -0
- package/dist/commands/build.js +136 -0
- package/dist/commands/codegen.js +128 -0
- package/dist/commands/create.js +94 -0
- package/dist/commands/deploy.js +335 -0
- package/dist/commands/init.js +800 -0
- package/dist/commands/local.js +380 -0
- package/dist/commands/remove.js +95 -0
- package/dist/commands/test.js +293 -0
- package/dist/compiler/asc.js +83 -0
- package/dist/compiler/index.js +466 -0
- package/dist/debug.js +16 -0
- package/dist/migrations/mapping_api_version_0_0_1.js +83 -0
- package/dist/migrations/mapping_api_version_0_0_2.js +83 -0
- package/dist/migrations/mapping_api_version_0_0_3.js +83 -0
- package/dist/migrations/mapping_api_version_0_0_4.js +85 -0
- package/dist/migrations/mapping_api_version_0_0_5.js +85 -0
- package/dist/migrations/spec_version_0_0_2.js +45 -0
- package/dist/migrations/spec_version_0_0_3.js +50 -0
- package/dist/migrations/util/load-manifest.js +16 -0
- package/dist/migrations/util/versions.js +28 -0
- package/dist/migrations.js +54 -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/contract.js +2 -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 +28 -0
- package/dist/protocols/ethereum/abi.js +138 -0
- package/dist/protocols/ethereum/codegen/abi.js +474 -0
- package/dist/protocols/ethereum/codegen/abi.test.js +325 -0
- package/dist/protocols/ethereum/codegen/template.js +52 -0
- package/dist/protocols/ethereum/contract.js +22 -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 +172 -0
- package/dist/protocols/ethereum/type-generator.js +123 -0
- package/dist/protocols/index.js +266 -0
- package/dist/protocols/ipfs/codegen/file_template.js +53 -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 +23 -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 +82 -0
- package/dist/scaffold/ethereum.test.js +496 -0
- package/dist/scaffold/index.js +133 -0
- package/dist/scaffold/mapping.js +57 -0
- package/dist/scaffold/near.test.js +85 -0
- package/dist/scaffold/schema.js +86 -0
- package/dist/scaffold/tests.js +179 -0
- package/dist/schema.js +54 -0
- package/dist/subgraph.js +243 -0
- package/dist/type-generator.js +225 -0
- package/dist/validation/contract.js +44 -0
- package/dist/validation/index.js +10 -0
- package/dist/validation/manifest.js +266 -0
- package/dist/validation/schema.js +768 -0
- package/dist/validation/schema.test.js +35 -0
- package/dist/watcher.js +79 -0
- package/package.json +1 -1
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
const path_1 = __importDefault(require("path"));
|
|
30
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
31
|
+
const immutable_1 = __importDefault(require("immutable"));
|
|
32
|
+
const ts = __importStar(require("../../../codegen/typescript"));
|
|
33
|
+
const abi_1 = __importDefault(require("../abi"));
|
|
34
|
+
const abi_2 = __importDefault(require("./abi"));
|
|
35
|
+
let tempdir;
|
|
36
|
+
let abi;
|
|
37
|
+
let generatedTypes;
|
|
38
|
+
describe('ABI code generation', () => {
|
|
39
|
+
beforeAll(async () => {
|
|
40
|
+
tempdir = await fs_extra_1.default.mkdtemp('abi-codegen');
|
|
41
|
+
try {
|
|
42
|
+
const filename = path_1.default.join(tempdir, 'ABI.json');
|
|
43
|
+
await fs_extra_1.default.writeFile(filename, JSON.stringify([
|
|
44
|
+
{
|
|
45
|
+
constant: true,
|
|
46
|
+
inputs: [],
|
|
47
|
+
name: 'read',
|
|
48
|
+
outputs: [{ name: '', type: 'bytes32' }],
|
|
49
|
+
payable: false,
|
|
50
|
+
type: 'function',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
constant: true,
|
|
54
|
+
inputs: [
|
|
55
|
+
{
|
|
56
|
+
name: 'proposalId',
|
|
57
|
+
type: 'uint256',
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
components: [
|
|
61
|
+
{
|
|
62
|
+
name: 'foo',
|
|
63
|
+
type: 'uint8',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'bar',
|
|
67
|
+
type: 'tuple',
|
|
68
|
+
components: [{ name: 'baz', type: 'address' }],
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
name: '',
|
|
72
|
+
type: 'tuple',
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
name: 'getProposal',
|
|
76
|
+
outputs: [
|
|
77
|
+
{
|
|
78
|
+
components: [
|
|
79
|
+
{
|
|
80
|
+
name: 'result',
|
|
81
|
+
type: 'uint8',
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'target',
|
|
85
|
+
type: 'address',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: 'data',
|
|
89
|
+
type: 'bytes',
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: 'proposer',
|
|
93
|
+
type: 'address',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'feeRecipient',
|
|
97
|
+
type: 'address',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: 'fee',
|
|
101
|
+
type: 'uint256',
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'startTime',
|
|
105
|
+
type: 'uint256',
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: 'yesCount',
|
|
109
|
+
type: 'uint256',
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'noCount',
|
|
113
|
+
type: 'uint256',
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
name: '',
|
|
117
|
+
type: 'tuple',
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
payable: false,
|
|
121
|
+
stateMutability: 'view',
|
|
122
|
+
type: 'function',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'function',
|
|
126
|
+
stateMutability: 'view',
|
|
127
|
+
payable: 'false',
|
|
128
|
+
name: 'getProposals',
|
|
129
|
+
outputs: [
|
|
130
|
+
{
|
|
131
|
+
type: 'uint256',
|
|
132
|
+
name: 'size',
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
type: 'tuple[]',
|
|
136
|
+
components: [
|
|
137
|
+
{ name: 'first', type: 'uint256' },
|
|
138
|
+
{ name: 'second', type: 'string' },
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
],
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
type: 'function',
|
|
145
|
+
stateMutability: 'view',
|
|
146
|
+
name: 'overloaded',
|
|
147
|
+
inputs: [
|
|
148
|
+
{
|
|
149
|
+
type: 'string',
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
outputs: [
|
|
153
|
+
{
|
|
154
|
+
type: 'string',
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
type: 'function',
|
|
160
|
+
stateMutability: 'view',
|
|
161
|
+
name: 'overloaded',
|
|
162
|
+
inputs: [
|
|
163
|
+
{
|
|
164
|
+
type: 'uint256',
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
outputs: [
|
|
168
|
+
{
|
|
169
|
+
type: 'string',
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
type: 'function',
|
|
175
|
+
stateMutability: 'view',
|
|
176
|
+
name: 'overloaded',
|
|
177
|
+
inputs: [
|
|
178
|
+
{
|
|
179
|
+
type: 'bytes32',
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
outputs: [
|
|
183
|
+
{
|
|
184
|
+
type: 'string',
|
|
185
|
+
},
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
]), 'utf-8');
|
|
189
|
+
abi = abi_1.default.load('Contract', filename);
|
|
190
|
+
const codegen = new abi_2.default(abi);
|
|
191
|
+
generatedTypes = codegen.generateTypes();
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
await fs_extra_1.default.remove(tempdir);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
afterAll(async () => {
|
|
198
|
+
await fs_extra_1.default.remove(tempdir);
|
|
199
|
+
});
|
|
200
|
+
describe('Generated types', () => {
|
|
201
|
+
test('All expected types are generated', () => {
|
|
202
|
+
expect(generatedTypes.map(type => type.name)).toEqual([
|
|
203
|
+
'Contract__getProposalResultValue0Struct',
|
|
204
|
+
'Contract__getProposalInputParam1Struct',
|
|
205
|
+
'Contract__getProposalInputParam1BarStruct',
|
|
206
|
+
'Contract__getProposalsResultValue1Struct',
|
|
207
|
+
'Contract__getProposalsResult',
|
|
208
|
+
'Contract',
|
|
209
|
+
]);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
describe('Contract class', () => {
|
|
213
|
+
test('Exists', () => {
|
|
214
|
+
expect(generatedTypes.find(type => type.name === 'Contract')).toBeDefined();
|
|
215
|
+
});
|
|
216
|
+
test('Has methods', () => {
|
|
217
|
+
const contract = generatedTypes.find(type => type.name === 'Contract');
|
|
218
|
+
expect(contract.methods).toBeInstanceOf(Array);
|
|
219
|
+
});
|
|
220
|
+
test('Has `bind` method', () => {
|
|
221
|
+
const contract = generatedTypes.find(type => type.name === 'Contract');
|
|
222
|
+
expect(contract.methods.find((method) => method.name === 'bind')).toBeDefined();
|
|
223
|
+
});
|
|
224
|
+
test('Has methods for all callable functions', () => {
|
|
225
|
+
const contract = generatedTypes.find(type => type.name === 'Contract');
|
|
226
|
+
expect(contract.methods.map((method) => method.name)).toContain('getProposal');
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
describe('Methods for callable functions', () => {
|
|
230
|
+
test('Have correct parameters', () => {
|
|
231
|
+
const contract = generatedTypes.find(type => type.name === 'Contract');
|
|
232
|
+
expect(contract.methods.map((method) => [method.name, method.params])).toEqual([
|
|
233
|
+
['bind', immutable_1.default.List([ts.param('address', 'Address')])],
|
|
234
|
+
['read', immutable_1.default.List()],
|
|
235
|
+
['try_read', immutable_1.default.List()],
|
|
236
|
+
[
|
|
237
|
+
'getProposal',
|
|
238
|
+
immutable_1.default.List([
|
|
239
|
+
ts.param('proposalId', 'BigInt'),
|
|
240
|
+
ts.param('param1', 'Contract__getProposalInputParam1Struct'),
|
|
241
|
+
]),
|
|
242
|
+
],
|
|
243
|
+
[
|
|
244
|
+
'try_getProposal',
|
|
245
|
+
immutable_1.default.List([
|
|
246
|
+
ts.param('proposalId', 'BigInt'),
|
|
247
|
+
ts.param('param1', 'Contract__getProposalInputParam1Struct'),
|
|
248
|
+
]),
|
|
249
|
+
],
|
|
250
|
+
['getProposals', immutable_1.default.List()],
|
|
251
|
+
['try_getProposals', immutable_1.default.List()],
|
|
252
|
+
['overloaded', immutable_1.default.List([ts.param('param0', 'string')])],
|
|
253
|
+
['try_overloaded', immutable_1.default.List([ts.param('param0', 'string')])],
|
|
254
|
+
['overloaded1', immutable_1.default.List([ts.param('param0', 'BigInt')])],
|
|
255
|
+
['try_overloaded1', immutable_1.default.List([ts.param('param0', 'BigInt')])],
|
|
256
|
+
['overloaded2', immutable_1.default.List([ts.param('param0', 'Bytes')])],
|
|
257
|
+
['try_overloaded2', immutable_1.default.List([ts.param('param0', 'Bytes')])],
|
|
258
|
+
]);
|
|
259
|
+
});
|
|
260
|
+
test('Have correct return types', () => {
|
|
261
|
+
const contract = generatedTypes.find(type => type.name === 'Contract');
|
|
262
|
+
expect(contract.methods.map((method) => [method.name, method.returnType])).toEqual([
|
|
263
|
+
['bind', ts.namedType('Contract')],
|
|
264
|
+
['read', ts.namedType('Bytes')],
|
|
265
|
+
['try_read', 'ethereum.CallResult<Bytes>'],
|
|
266
|
+
['getProposal', ts.namedType('Contract__getProposalResultValue0Struct')],
|
|
267
|
+
['try_getProposal', 'ethereum.CallResult<Contract__getProposalResultValue0Struct>'],
|
|
268
|
+
['getProposals', ts.namedType('Contract__getProposalsResult')],
|
|
269
|
+
['try_getProposals', 'ethereum.CallResult<Contract__getProposalsResult>'],
|
|
270
|
+
['overloaded', ts.namedType('string')],
|
|
271
|
+
['try_overloaded', 'ethereum.CallResult<string>'],
|
|
272
|
+
['overloaded1', ts.namedType('string')],
|
|
273
|
+
['try_overloaded1', 'ethereum.CallResult<string>'],
|
|
274
|
+
['overloaded2', ts.namedType('string')],
|
|
275
|
+
['try_overloaded2', 'ethereum.CallResult<string>'],
|
|
276
|
+
]);
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
describe('Tuples', () => {
|
|
280
|
+
test('Tuple types exist for function parameters', () => {
|
|
281
|
+
let tupleType = generatedTypes.find(type => type.name === 'Contract__getProposalInputParam1Struct');
|
|
282
|
+
// Verify that the tuple type has methods
|
|
283
|
+
expect(tupleType.methods).toBeDefined();
|
|
284
|
+
// Verify that the tuple type has getters for all tuple fields with
|
|
285
|
+
// the right return types
|
|
286
|
+
expect(tupleType.methods.map((method) => [method.name, method.returnType])).toEqual([
|
|
287
|
+
['get foo', 'i32'],
|
|
288
|
+
['get bar', 'Contract__getProposalInputParam1BarStruct'],
|
|
289
|
+
]);
|
|
290
|
+
// Inner tuple:
|
|
291
|
+
tupleType = generatedTypes.find(type => type.name === 'Contract__getProposalInputParam1BarStruct');
|
|
292
|
+
// Verify that the tuple type has methods
|
|
293
|
+
expect(tupleType.methods).toBeDefined();
|
|
294
|
+
// Verify that the tuple type has getters for all tuple fields with
|
|
295
|
+
// the right return types
|
|
296
|
+
expect(tupleType.methods.map((method) => [method.name, method.returnType])).toEqual([
|
|
297
|
+
['get baz', 'Address'],
|
|
298
|
+
]);
|
|
299
|
+
});
|
|
300
|
+
test('Tuple types exist for function return values', () => {
|
|
301
|
+
const tupleType = generatedTypes.find(type => type.name === 'Contract__getProposalResultValue0Struct');
|
|
302
|
+
// Verify that the tuple type has methods
|
|
303
|
+
expect(tupleType.methods).toBeDefined();
|
|
304
|
+
// Verify that the tuple type has getters for all tuple fields with
|
|
305
|
+
// the right return types
|
|
306
|
+
expect(tupleType.methods.map((method) => [method.name, method.returnType])).toEqual([
|
|
307
|
+
['get result', 'i32'],
|
|
308
|
+
['get target', 'Address'],
|
|
309
|
+
['get data', 'Bytes'],
|
|
310
|
+
['get proposer', 'Address'],
|
|
311
|
+
['get feeRecipient', 'Address'],
|
|
312
|
+
['get fee', 'BigInt'],
|
|
313
|
+
['get startTime', 'BigInt'],
|
|
314
|
+
['get yesCount', 'BigInt'],
|
|
315
|
+
['get noCount', 'BigInt'],
|
|
316
|
+
]);
|
|
317
|
+
});
|
|
318
|
+
test('Function bodies are generated correctly for tuple arrays', () => {
|
|
319
|
+
const contract = generatedTypes.find(type => type.name === 'Contract');
|
|
320
|
+
const getter = contract.methods.find((method) => method.name === 'getProposals');
|
|
321
|
+
expect(getter.body).not.toContain('toTupleArray<undefined>');
|
|
322
|
+
expect(getter.body).toContain('result[1].toTupleArray<Contract__getProposalsResultValue1Struct>()');
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
});
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const tsCodegen = __importStar(require("../../../codegen/typescript"));
|
|
27
|
+
class EthereumTemplateCodeGen {
|
|
28
|
+
template;
|
|
29
|
+
constructor(template) {
|
|
30
|
+
this.template = template;
|
|
31
|
+
this.template = template;
|
|
32
|
+
}
|
|
33
|
+
generateModuleImports() {
|
|
34
|
+
return ['Address'];
|
|
35
|
+
}
|
|
36
|
+
generateCreateMethod() {
|
|
37
|
+
const name = this.template.get('name');
|
|
38
|
+
return tsCodegen.staticMethod('create', [tsCodegen.param('address', tsCodegen.namedType('Address'))], tsCodegen.namedType('void'), `
|
|
39
|
+
DataSourceTemplate.create('${name}', [address.toHex()])
|
|
40
|
+
`);
|
|
41
|
+
}
|
|
42
|
+
generateCreateWithContextMethod() {
|
|
43
|
+
const name = this.template.get('name');
|
|
44
|
+
return tsCodegen.staticMethod('createWithContext', [
|
|
45
|
+
tsCodegen.param('address', tsCodegen.namedType('Address')),
|
|
46
|
+
tsCodegen.param('context', tsCodegen.namedType('DataSourceContext')),
|
|
47
|
+
], tsCodegen.namedType('void'), `
|
|
48
|
+
DataSourceTemplate.createWithContext('${name}', [address.toHex()], context)
|
|
49
|
+
`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.default = EthereumTemplateCodeGen;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class EthereumContract {
|
|
4
|
+
address;
|
|
5
|
+
static identifierName() {
|
|
6
|
+
return 'address';
|
|
7
|
+
}
|
|
8
|
+
constructor(address) {
|
|
9
|
+
this.address = address;
|
|
10
|
+
this.address = address;
|
|
11
|
+
}
|
|
12
|
+
validate() {
|
|
13
|
+
const pattern = /^(0x)?[0-9a-fA-F]{40}$/;
|
|
14
|
+
const errorMessage = "Must be 40 hexadecimal characters, with an optional '0x' prefix.";
|
|
15
|
+
const valid = pattern.test(this.address);
|
|
16
|
+
return {
|
|
17
|
+
valid,
|
|
18
|
+
error: valid ? null : errorMessage,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.default = EthereumContract;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Each referenced type's in any of the types below must be listed
|
|
2
|
+
# here either as `scalar` or `type` for the validation code to work
|
|
3
|
+
# properly.
|
|
4
|
+
#
|
|
5
|
+
# That's why `String` is listed as a scalar even though it's built-in
|
|
6
|
+
# GraphQL basic types.
|
|
7
|
+
scalar String
|
|
8
|
+
scalar File
|
|
9
|
+
scalar BigInt
|
|
10
|
+
scalar Boolean
|
|
11
|
+
|
|
12
|
+
type SubgraphManifest {
|
|
13
|
+
specVersion: String!
|
|
14
|
+
features: [String!]
|
|
15
|
+
schema: Schema!
|
|
16
|
+
description: String
|
|
17
|
+
repository: String
|
|
18
|
+
graft: Graft
|
|
19
|
+
dataSources: [DataSource!]!
|
|
20
|
+
templates: [DataSourceTemplate!]
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
type Schema {
|
|
24
|
+
file: File!
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
type DataSource {
|
|
28
|
+
kind: String!
|
|
29
|
+
name: String!
|
|
30
|
+
network: String
|
|
31
|
+
source: ContractSource!
|
|
32
|
+
mapping: ContractMapping!
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
type ContractSource {
|
|
36
|
+
address: String
|
|
37
|
+
abi: String!
|
|
38
|
+
startBlock: BigInt
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
type ContractMapping {
|
|
42
|
+
kind: String
|
|
43
|
+
apiVersion: String!
|
|
44
|
+
language: String!
|
|
45
|
+
file: File!
|
|
46
|
+
entities: [String!]!
|
|
47
|
+
abis: [ContractAbi!]!
|
|
48
|
+
blockHandlers: [BlockHandler!]
|
|
49
|
+
callHandlers: [CallHandler!]
|
|
50
|
+
eventHandlers: [ContractEventHandler!]
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
type ContractAbi {
|
|
54
|
+
name: String!
|
|
55
|
+
file: File!
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
type BlockHandler {
|
|
59
|
+
handler: String!
|
|
60
|
+
filter: BlockFilter
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
type BlockFilter {
|
|
64
|
+
kind: String!
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
type CallHandler {
|
|
68
|
+
function: String!
|
|
69
|
+
handler: String!
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
type ContractEventHandler {
|
|
73
|
+
event: String!
|
|
74
|
+
topic0: String
|
|
75
|
+
handler: String!
|
|
76
|
+
receipt: Boolean
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
type Graft {
|
|
80
|
+
base: String!
|
|
81
|
+
block: BigInt!
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
type DataSourceTemplate {
|
|
85
|
+
kind: String!
|
|
86
|
+
name: String!
|
|
87
|
+
network: String
|
|
88
|
+
source: ContractSourceTemplate!
|
|
89
|
+
mapping: ContractMapping!
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
type ContractSourceTemplate {
|
|
93
|
+
abi: String!
|
|
94
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.mapping = exports.source = void 0;
|
|
7
|
+
const gluegun_1 = require("gluegun");
|
|
8
|
+
const schema_1 = require("../../../scaffold/schema");
|
|
9
|
+
const abi_1 = __importDefault(require("../abi"));
|
|
10
|
+
const source = ({ contract, contractName }) => `
|
|
11
|
+
address: '${contract}'
|
|
12
|
+
abi: ${contractName}`;
|
|
13
|
+
exports.source = source;
|
|
14
|
+
const mapping = ({ abi, contractName }) => `
|
|
15
|
+
kind: ethereum/events
|
|
16
|
+
apiVersion: 0.0.7
|
|
17
|
+
language: wasm/assemblyscript
|
|
18
|
+
entities:
|
|
19
|
+
${(0, schema_1.abiEvents)(abi)
|
|
20
|
+
.map(event => `- ${event.get('_alias')}`)
|
|
21
|
+
.join('\n ')}
|
|
22
|
+
abis:
|
|
23
|
+
- name: ${contractName}
|
|
24
|
+
file: ./abis/${contractName}.json
|
|
25
|
+
eventHandlers:
|
|
26
|
+
${(0, schema_1.abiEvents)(abi)
|
|
27
|
+
.map(event => `
|
|
28
|
+
- event: ${abi_1.default.eventSignature(event)}
|
|
29
|
+
handler: handle${event.get('_alias')}`)
|
|
30
|
+
.join('')}
|
|
31
|
+
file: ./src/${gluegun_1.strings.kebabCase(contractName)}.ts`;
|
|
32
|
+
exports.mapping = mapping;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generatePlaceholderHandlers = void 0;
|
|
4
|
+
const mapping_1 = require("../../../scaffold/mapping");
|
|
5
|
+
const generatePlaceholderHandlers = ({ abi, events, contractName, }) => `
|
|
6
|
+
import { BigInt } from '@graphprotocol/graph-ts'
|
|
7
|
+
import { ${contractName}, ${events.map(event => event._alias)} }
|
|
8
|
+
from '../generated/${contractName}/${contractName}'
|
|
9
|
+
import { ExampleEntity } from '../generated/schema'
|
|
10
|
+
|
|
11
|
+
${events
|
|
12
|
+
.map((event, index) => index === 0
|
|
13
|
+
? `
|
|
14
|
+
export function handle${event._alias}(event: ${event._alias}): void {
|
|
15
|
+
// Entities can be loaded from the store using a string ID; this ID
|
|
16
|
+
// needs to be unique across all entities of the same type
|
|
17
|
+
let entity = ExampleEntity.load(event.transaction.from)
|
|
18
|
+
|
|
19
|
+
// Entities only exist after they have been saved to the store;
|
|
20
|
+
// \`null\` checks allow to create entities on demand
|
|
21
|
+
if (!entity) {
|
|
22
|
+
entity = new ExampleEntity(event.transaction.from)
|
|
23
|
+
|
|
24
|
+
// Entity fields can be set using simple assignments
|
|
25
|
+
entity.count = BigInt.fromI32(0)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// BigInt and BigDecimal math are supported
|
|
29
|
+
entity.count = entity.count + BigInt.fromI32(1)
|
|
30
|
+
|
|
31
|
+
// Entity fields can be set based on event parameters
|
|
32
|
+
${(0, mapping_1.generateEventFieldAssignments)(event).slice(0, 2).join('\n')}
|
|
33
|
+
|
|
34
|
+
// Entities can be written to the store with \`.save()\`
|
|
35
|
+
entity.save()
|
|
36
|
+
|
|
37
|
+
// Note: If a handler doesn't require existing field values, it is faster
|
|
38
|
+
// _not_ to load the entity from the store. Instead, create it fresh with
|
|
39
|
+
// \`new Entity(...)\`, set the fields that should be updated and save the
|
|
40
|
+
// entity back to the store. Fields that were not set or unset remain
|
|
41
|
+
// unchanged, allowing for partial updates to be applied.
|
|
42
|
+
|
|
43
|
+
// It is also possible to access smart contracts from mappings. For
|
|
44
|
+
// example, the contract that has emitted the event can be connected to
|
|
45
|
+
// with:
|
|
46
|
+
//
|
|
47
|
+
// let contract = Contract.bind(event.address)
|
|
48
|
+
//
|
|
49
|
+
// The following functions can then be called on this contract to access
|
|
50
|
+
// state variables and other data:
|
|
51
|
+
//
|
|
52
|
+
// ${abi.codeGenerator().callableFunctions().isEmpty()
|
|
53
|
+
? 'None'
|
|
54
|
+
: abi
|
|
55
|
+
.codeGenerator()
|
|
56
|
+
.callableFunctions()
|
|
57
|
+
.map((fn) => `- contract.${fn.get('name')}(...)`)
|
|
58
|
+
.join('\n// ')}
|
|
59
|
+
}
|
|
60
|
+
`
|
|
61
|
+
: `
|
|
62
|
+
export function handle${event._alias}(event: ${event._alias}): void {}
|
|
63
|
+
`)
|
|
64
|
+
.join('\n')}`;
|
|
65
|
+
exports.generatePlaceholderHandlers = generatePlaceholderHandlers;
|