@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,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.staticMethod = exports.StaticMethod = exports.param = exports.Param = exports.nullableType = exports.NullableType = exports.namedType = exports.NamedType = exports.moduleImports = exports.ModuleImports = exports.method = exports.Method = exports.klassMember = exports.klass = exports.GENERATED_FILE_NOTE = exports.ClassMember = exports.Class = exports.arrayType = exports.ArrayType = void 0;
|
|
4
|
+
class Param {
|
|
5
|
+
name;
|
|
6
|
+
type;
|
|
7
|
+
constructor(name, type) {
|
|
8
|
+
this.name = name;
|
|
9
|
+
this.type = type;
|
|
10
|
+
this.name = name;
|
|
11
|
+
this.type = type;
|
|
12
|
+
}
|
|
13
|
+
toString() {
|
|
14
|
+
return `${this.name}: ${this.type.toString()}`;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.Param = Param;
|
|
18
|
+
class Method {
|
|
19
|
+
name;
|
|
20
|
+
params;
|
|
21
|
+
returnType;
|
|
22
|
+
body;
|
|
23
|
+
constructor(name, params, returnType, body) {
|
|
24
|
+
this.name = name;
|
|
25
|
+
this.params = params;
|
|
26
|
+
this.returnType = returnType;
|
|
27
|
+
this.body = body;
|
|
28
|
+
this.name = name;
|
|
29
|
+
this.params = params || [];
|
|
30
|
+
this.returnType = returnType;
|
|
31
|
+
this.body = body || '';
|
|
32
|
+
}
|
|
33
|
+
toString() {
|
|
34
|
+
return `
|
|
35
|
+
${this.name}(${this.params.map(param => param.toString()).join(', ')})${this.returnType ? `: ${this.returnType.toString()}` : ''} {${this.body}
|
|
36
|
+
}
|
|
37
|
+
`;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.Method = Method;
|
|
41
|
+
class StaticMethod {
|
|
42
|
+
name;
|
|
43
|
+
params;
|
|
44
|
+
returnType;
|
|
45
|
+
body;
|
|
46
|
+
constructor(name, params, returnType, body) {
|
|
47
|
+
this.name = name;
|
|
48
|
+
this.params = params;
|
|
49
|
+
this.returnType = returnType;
|
|
50
|
+
this.body = body;
|
|
51
|
+
this.name = name;
|
|
52
|
+
this.params = params || [];
|
|
53
|
+
this.returnType = returnType || 'void';
|
|
54
|
+
this.body = body || '';
|
|
55
|
+
}
|
|
56
|
+
toString() {
|
|
57
|
+
return `
|
|
58
|
+
static ${this.name}(${this.params.map(param => param.toString()).join(', ')})${this.returnType ? `: ${this.returnType.toString()}` : ''} {${this.body}
|
|
59
|
+
}
|
|
60
|
+
`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.StaticMethod = StaticMethod;
|
|
64
|
+
class Class {
|
|
65
|
+
name;
|
|
66
|
+
extends;
|
|
67
|
+
methods;
|
|
68
|
+
members;
|
|
69
|
+
export;
|
|
70
|
+
constructor(name, options) {
|
|
71
|
+
this.name = name;
|
|
72
|
+
this.name = name;
|
|
73
|
+
this.extends = options.extends;
|
|
74
|
+
this.methods = [];
|
|
75
|
+
this.members = [];
|
|
76
|
+
this.export = options.export || false;
|
|
77
|
+
}
|
|
78
|
+
addMember(member) {
|
|
79
|
+
this.members.push(member);
|
|
80
|
+
}
|
|
81
|
+
addMethod(method) {
|
|
82
|
+
this.methods.push(method);
|
|
83
|
+
}
|
|
84
|
+
toString() {
|
|
85
|
+
return `
|
|
86
|
+
${this.export ? 'export' : ''} class ${this.name}${this.extends ? ` extends ${this.extends}` : ''} {
|
|
87
|
+
${this.members.map(member => member.toString()).join('\n')}
|
|
88
|
+
${this.methods.map(method => method.toString()).join('')}
|
|
89
|
+
}
|
|
90
|
+
`;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.Class = Class;
|
|
94
|
+
class ClassMember {
|
|
95
|
+
name;
|
|
96
|
+
type;
|
|
97
|
+
constructor(name, type) {
|
|
98
|
+
this.name = name;
|
|
99
|
+
this.type = type;
|
|
100
|
+
this.name = name;
|
|
101
|
+
this.type = type;
|
|
102
|
+
}
|
|
103
|
+
toString() {
|
|
104
|
+
return ` ${this.name}: ${this.type.toString()}`;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.ClassMember = ClassMember;
|
|
108
|
+
class NamedType {
|
|
109
|
+
name;
|
|
110
|
+
constructor(name) {
|
|
111
|
+
this.name = name;
|
|
112
|
+
this.name = name;
|
|
113
|
+
}
|
|
114
|
+
toString() {
|
|
115
|
+
return this.name;
|
|
116
|
+
}
|
|
117
|
+
capitalize() {
|
|
118
|
+
this.name = this.name.charAt(0).toUpperCase() + this.name.slice(1);
|
|
119
|
+
return this;
|
|
120
|
+
}
|
|
121
|
+
isPrimitive() {
|
|
122
|
+
const primitives = [
|
|
123
|
+
'boolean',
|
|
124
|
+
'u8',
|
|
125
|
+
'i8',
|
|
126
|
+
'u16',
|
|
127
|
+
'i16',
|
|
128
|
+
'u32',
|
|
129
|
+
'i32',
|
|
130
|
+
'u64',
|
|
131
|
+
'i64',
|
|
132
|
+
'f32',
|
|
133
|
+
'f64',
|
|
134
|
+
'usize',
|
|
135
|
+
'isize',
|
|
136
|
+
];
|
|
137
|
+
return primitives.includes(this.name);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.NamedType = NamedType;
|
|
141
|
+
class ArrayType {
|
|
142
|
+
inner;
|
|
143
|
+
name;
|
|
144
|
+
constructor(inner) {
|
|
145
|
+
this.inner = inner;
|
|
146
|
+
this.inner = inner;
|
|
147
|
+
this.name = `Array<${inner.toString()}>`;
|
|
148
|
+
}
|
|
149
|
+
toString() {
|
|
150
|
+
return this.name;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
exports.ArrayType = ArrayType;
|
|
154
|
+
class NullableType {
|
|
155
|
+
inner;
|
|
156
|
+
constructor(inner) {
|
|
157
|
+
this.inner = inner;
|
|
158
|
+
this.inner = inner;
|
|
159
|
+
}
|
|
160
|
+
toString() {
|
|
161
|
+
return `${this.inner.toString()} | null`;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
exports.NullableType = NullableType;
|
|
165
|
+
class ModuleImports {
|
|
166
|
+
nameOrNames;
|
|
167
|
+
module;
|
|
168
|
+
constructor(nameOrNames, module) {
|
|
169
|
+
this.nameOrNames = nameOrNames;
|
|
170
|
+
this.module = module;
|
|
171
|
+
this.nameOrNames = nameOrNames;
|
|
172
|
+
this.module = module;
|
|
173
|
+
}
|
|
174
|
+
toString() {
|
|
175
|
+
return `import { ${typeof this.nameOrNames === 'string' ? this.nameOrNames : this.nameOrNames.join(',')} } from "${this.module}"`;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
exports.ModuleImports = ModuleImports;
|
|
179
|
+
const namedType = (name) => new NamedType(name);
|
|
180
|
+
exports.namedType = namedType;
|
|
181
|
+
const arrayType = (name) => new ArrayType(name);
|
|
182
|
+
exports.arrayType = arrayType;
|
|
183
|
+
const param = (name, type) => new Param(name, type);
|
|
184
|
+
exports.param = param;
|
|
185
|
+
const method = (name, params, returnType, body) => new Method(name, params, returnType, body);
|
|
186
|
+
exports.method = method;
|
|
187
|
+
const staticMethod = (name, params, returnType, body) => new StaticMethod(name, params, returnType, body);
|
|
188
|
+
exports.staticMethod = staticMethod;
|
|
189
|
+
const klass = (name, options) => new Class(name, options);
|
|
190
|
+
exports.klass = klass;
|
|
191
|
+
const klassMember = (name, type) => new ClassMember(name, type);
|
|
192
|
+
exports.klassMember = klassMember;
|
|
193
|
+
const nullableType = (type) => new NullableType(type);
|
|
194
|
+
exports.nullableType = nullableType;
|
|
195
|
+
const moduleImports = (nameOrNames, module) => new ModuleImports(nameOrNames, module);
|
|
196
|
+
exports.moduleImports = moduleImports;
|
|
197
|
+
const GENERATED_FILE_NOTE = `
|
|
198
|
+
// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
199
|
+
`;
|
|
200
|
+
exports.GENERATED_FILE_NOTE = GENERATED_FILE_NOTE;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.unrollTuple = exports.isTupleMatrixType = exports.isTupleArrayType = exports.containsTupleType = exports.isTupleType = exports.disambiguateNames = void 0;
|
|
4
|
+
function disambiguateNames({ values, getName, setName, }) {
|
|
5
|
+
const collisionCounter = new Map();
|
|
6
|
+
return values.map((value, index) => {
|
|
7
|
+
const name = getName(value, index);
|
|
8
|
+
const counter = collisionCounter.get(name);
|
|
9
|
+
if (counter === undefined) {
|
|
10
|
+
collisionCounter.set(name, 1);
|
|
11
|
+
return setName(value, name);
|
|
12
|
+
}
|
|
13
|
+
collisionCounter.set(name, counter + 1);
|
|
14
|
+
return setName(value, `${name}${counter}`);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
exports.disambiguateNames = disambiguateNames;
|
|
18
|
+
function isTupleType(t) {
|
|
19
|
+
return t === 'tuple';
|
|
20
|
+
}
|
|
21
|
+
exports.isTupleType = isTupleType;
|
|
22
|
+
function containsTupleType(t) {
|
|
23
|
+
return isTupleType(t) || isTupleArrayType(t) || isTupleMatrixType(t);
|
|
24
|
+
}
|
|
25
|
+
exports.containsTupleType = containsTupleType;
|
|
26
|
+
function isTupleArrayType(t) {
|
|
27
|
+
return t.match(/^tuple\[([0-9]+)?\]$/);
|
|
28
|
+
}
|
|
29
|
+
exports.isTupleArrayType = isTupleArrayType;
|
|
30
|
+
function isTupleMatrixType(t) {
|
|
31
|
+
return t.match(/^tuple\[([0-9]+)?\]\[([0-9]+)?\]$/);
|
|
32
|
+
}
|
|
33
|
+
exports.isTupleMatrixType = isTupleMatrixType;
|
|
34
|
+
const unrollTuple = ({ path, value, }) => value.components.reduce((acc, component, index) => {
|
|
35
|
+
const name = component.name || `value${index}`;
|
|
36
|
+
return acc.concat(component.type === 'tuple'
|
|
37
|
+
? (0, exports.unrollTuple)({ path: [...path, name], index, value: component })
|
|
38
|
+
: [{ path: [...path, name], type: component.type }]);
|
|
39
|
+
}, []);
|
|
40
|
+
exports.unrollTuple = unrollTuple;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const util_1 = require("./util");
|
|
4
|
+
describe('Codegen utilities', () => {
|
|
5
|
+
test('Name disambiguation', () => {
|
|
6
|
+
expect((0, util_1.disambiguateNames)({
|
|
7
|
+
values: ['a', 'b', 'c'],
|
|
8
|
+
getName: x => x,
|
|
9
|
+
setName: (_x, name) => name,
|
|
10
|
+
})).toEqual(['a', 'b', 'c']);
|
|
11
|
+
expect((0, util_1.disambiguateNames)({
|
|
12
|
+
values: ['a', 'a', 'a'],
|
|
13
|
+
getName: x => x,
|
|
14
|
+
setName: (_x, name) => name,
|
|
15
|
+
})).toEqual(['a', 'a1', 'a2']);
|
|
16
|
+
expect((0, util_1.disambiguateNames)({
|
|
17
|
+
values: [
|
|
18
|
+
{ name: 'ExampleEvent', inputs: [] },
|
|
19
|
+
{ name: 'ExampleEvent', inputs: [{ type: 'uint256' }] },
|
|
20
|
+
{ name: 'ExampleEvent', inputs: [{ type: 'uint96' }] },
|
|
21
|
+
],
|
|
22
|
+
getName: event => event.name,
|
|
23
|
+
setName: (event, name) => {
|
|
24
|
+
event.name = name;
|
|
25
|
+
return event;
|
|
26
|
+
},
|
|
27
|
+
})).toEqual([
|
|
28
|
+
{ name: 'ExampleEvent', inputs: [] },
|
|
29
|
+
{ name: 'ExampleEvent1', inputs: [{ type: 'uint256' }] },
|
|
30
|
+
{ name: 'ExampleEvent2', inputs: [{ type: 'uint96' }] },
|
|
31
|
+
]);
|
|
32
|
+
});
|
|
33
|
+
test('Tuple unrolling', () => {
|
|
34
|
+
expect((0, util_1.unrollTuple)({
|
|
35
|
+
value: { type: 'tuple', name: 'value', components: [] },
|
|
36
|
+
path: ['value'],
|
|
37
|
+
index: 0,
|
|
38
|
+
})).toEqual([]);
|
|
39
|
+
expect((0, util_1.unrollTuple)({
|
|
40
|
+
value: {
|
|
41
|
+
type: 'tuple',
|
|
42
|
+
name: 'value',
|
|
43
|
+
components: [{ name: 'a', type: 'string' }],
|
|
44
|
+
},
|
|
45
|
+
path: ['value'],
|
|
46
|
+
index: 0,
|
|
47
|
+
})).toEqual([{ path: ['value', 'a'], type: 'string' }]);
|
|
48
|
+
expect((0, util_1.unrollTuple)({
|
|
49
|
+
value: {
|
|
50
|
+
type: 'tuple',
|
|
51
|
+
name: 'value',
|
|
52
|
+
components: [
|
|
53
|
+
{ name: 'a', type: 'string' },
|
|
54
|
+
{ name: 'b', type: 'uint256' },
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
path: ['value'],
|
|
58
|
+
index: 0,
|
|
59
|
+
})).toEqual([
|
|
60
|
+
{ path: ['value', 'a'], type: 'string' },
|
|
61
|
+
{ path: ['value', 'b'], type: 'uint256' },
|
|
62
|
+
]);
|
|
63
|
+
expect((0, util_1.unrollTuple)({
|
|
64
|
+
value: {
|
|
65
|
+
type: 'tuple',
|
|
66
|
+
name: 'value',
|
|
67
|
+
components: [
|
|
68
|
+
{ name: 'a', type: 'string' },
|
|
69
|
+
{ name: 'b', type: 'uint256' },
|
|
70
|
+
{
|
|
71
|
+
name: 'c',
|
|
72
|
+
type: 'tuple',
|
|
73
|
+
components: [
|
|
74
|
+
{ type: 'bytes32' },
|
|
75
|
+
{
|
|
76
|
+
name: 'd',
|
|
77
|
+
type: 'tuple',
|
|
78
|
+
components: [{ name: 'd1', type: 'uint72' }],
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
path: ['value'],
|
|
85
|
+
index: 1,
|
|
86
|
+
})).toEqual([
|
|
87
|
+
{ path: ['value', 'a'], type: 'string' },
|
|
88
|
+
{ path: ['value', 'b'], type: 'uint256' },
|
|
89
|
+
{ path: ['value', 'c', 'value0'], type: 'bytes32' },
|
|
90
|
+
{ path: ['value', 'c', 'd', 'd1'], type: 'uint72' },
|
|
91
|
+
]);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
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.loadAbiFromBlockScout = exports.loadAbiFromEtherscan = void 0;
|
|
7
|
+
const immutable_1 = __importDefault(require("immutable"));
|
|
8
|
+
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
9
|
+
const spinner_1 = require("./spinner");
|
|
10
|
+
const loadAbiFromEtherscan = async (ABICtor, network, address) => await (0, spinner_1.withSpinner)(`Fetching ABI from Etherscan`, `Failed to fetch ABI from Etherscan`, `Warnings while fetching ABI from Etherscan`, async () => {
|
|
11
|
+
const scanApiUrl = getEtherscanLikeAPIUrl(network);
|
|
12
|
+
const result = await (0, node_fetch_1.default)(`${scanApiUrl}?module=contract&action=getabi&address=${address}`);
|
|
13
|
+
const json = await result.json();
|
|
14
|
+
// Etherscan returns a JSON object that has a `status`, a `message` and
|
|
15
|
+
// a `result` field. The `status` is '0' in case of errors and '1' in
|
|
16
|
+
// case of success
|
|
17
|
+
if (json.status === '1') {
|
|
18
|
+
return new ABICtor('Contract', undefined, immutable_1.default.fromJS(JSON.parse(json.result)));
|
|
19
|
+
}
|
|
20
|
+
throw new Error('ABI not found, try loading it from a local file');
|
|
21
|
+
});
|
|
22
|
+
exports.loadAbiFromEtherscan = loadAbiFromEtherscan;
|
|
23
|
+
const loadAbiFromBlockScout = async (ABICtor, network, address) => await (0, spinner_1.withSpinner)(`Fetching ABI from BlockScout`, `Failed to fetch ABI from BlockScout`, `Warnings while fetching ABI from BlockScout`, async () => {
|
|
24
|
+
const result = await (0, node_fetch_1.default)(`https://blockscout.com/${network.replace('-', '/')}/api?module=contract&action=getabi&address=${address}`);
|
|
25
|
+
const json = await result.json();
|
|
26
|
+
// BlockScout returns a JSON object that has a `status`, a `message` and
|
|
27
|
+
// a `result` field. The `status` is '0' in case of errors and '1' in
|
|
28
|
+
// case of success
|
|
29
|
+
if (json.status === '1') {
|
|
30
|
+
return new ABICtor('Contract', undefined, immutable_1.default.fromJS(JSON.parse(json.result)));
|
|
31
|
+
}
|
|
32
|
+
throw new Error('ABI not found, try loading it from a local file');
|
|
33
|
+
});
|
|
34
|
+
exports.loadAbiFromBlockScout = loadAbiFromBlockScout;
|
|
35
|
+
const getEtherscanLikeAPIUrl = (network) => {
|
|
36
|
+
switch (network) {
|
|
37
|
+
case 'mainnet':
|
|
38
|
+
return `https://api.etherscan.io/api`;
|
|
39
|
+
case 'arbitrum-one':
|
|
40
|
+
return `https://api.arbiscan.io/api`;
|
|
41
|
+
case 'bsc':
|
|
42
|
+
return `https://api.bscscan.com/api`;
|
|
43
|
+
case 'chapel':
|
|
44
|
+
return `https://api-testnet.bscscan.com/api`;
|
|
45
|
+
case 'matic':
|
|
46
|
+
return `https://api.polygonscan.com/api`;
|
|
47
|
+
case 'mumbai':
|
|
48
|
+
return `https://api-testnet.polygonscan.com/api`;
|
|
49
|
+
case 'aurora':
|
|
50
|
+
return `https://api.aurorascan.dev/api`;
|
|
51
|
+
case 'aurora-testnet':
|
|
52
|
+
return `https://api-testnet.aurorascan.dev/api`;
|
|
53
|
+
case 'optimism-kovan':
|
|
54
|
+
return `https://api-kovan-optimistic.etherscan.io/api`;
|
|
55
|
+
case 'optimism':
|
|
56
|
+
return `https://api-optimistic.etherscan.io/api`;
|
|
57
|
+
case 'moonbeam':
|
|
58
|
+
return `https://api-moonbeam.moonscan.io/api`;
|
|
59
|
+
case 'moonriver':
|
|
60
|
+
return `https://api-moonriver.moonscan.io/api`;
|
|
61
|
+
case 'mbase':
|
|
62
|
+
return `https://api-moonbase.moonscan.io/api`;
|
|
63
|
+
case 'avalanche':
|
|
64
|
+
return `https://api.snowtrace.io/api`;
|
|
65
|
+
case 'fuji':
|
|
66
|
+
return `https://api-testnet.snowtrace.io/api`;
|
|
67
|
+
case 'gnosis':
|
|
68
|
+
return `https://api.gnosisscan.io/api`;
|
|
69
|
+
case 'fantom':
|
|
70
|
+
return `https://api.ftmscan.com/api`;
|
|
71
|
+
case 'fantom-testnet':
|
|
72
|
+
return `https://api-testnet.ftmscan.com/api`;
|
|
73
|
+
default:
|
|
74
|
+
return `https://api-${network}.etherscan.io/api`;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
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
|
+
exports.saveDeployKey = exports.identifyDeployKey = void 0;
|
|
30
|
+
const fs_1 = __importDefault(require("fs"));
|
|
31
|
+
const os_1 = __importDefault(require("os"));
|
|
32
|
+
const path_1 = __importDefault(require("path"));
|
|
33
|
+
const toolbox = __importStar(require("gluegun"));
|
|
34
|
+
const node_1 = require("./node");
|
|
35
|
+
const homedir = os_1.default.homedir();
|
|
36
|
+
const CONFIG_PATH = path_1.default.join(homedir, '/.graph-cli.json');
|
|
37
|
+
const getConfig = () => {
|
|
38
|
+
let config;
|
|
39
|
+
try {
|
|
40
|
+
config = JSON.parse(fs_1.default.readFileSync(CONFIG_PATH).toString());
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
config = {};
|
|
44
|
+
}
|
|
45
|
+
return config;
|
|
46
|
+
};
|
|
47
|
+
const identifyDeployKey = async (node, deployKey) => {
|
|
48
|
+
// Determine the deploy key to use, if any:
|
|
49
|
+
// - First try using --deploy-key, if provided
|
|
50
|
+
// - Then see if we have a deploy key set for the Graph node
|
|
51
|
+
if (deployKey !== undefined) {
|
|
52
|
+
return deployKey;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
node = (0, node_1.normalizeNodeUrl)(node);
|
|
56
|
+
const config = getConfig();
|
|
57
|
+
return config[node];
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
toolbox.print.warning(`Could not get deploy key: ${e.message}`);
|
|
61
|
+
toolbox.print.info(`Continuing without a deploy key\n`);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
exports.identifyDeployKey = identifyDeployKey;
|
|
65
|
+
const saveDeployKey = async (node, deployKey) => {
|
|
66
|
+
try {
|
|
67
|
+
node = (0, node_1.normalizeNodeUrl)(node);
|
|
68
|
+
const config = getConfig();
|
|
69
|
+
config[node] = deployKey;
|
|
70
|
+
fs_1.default.writeFileSync(CONFIG_PATH, JSON.stringify(config));
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
throw new Error(`Error storing deploy key: ${e.message}`);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
exports.saveDeployKey = saveDeployKey;
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
exports.createCompiler = void 0;
|
|
30
|
+
const url_1 = require("url");
|
|
31
|
+
const toolbox = __importStar(require("gluegun"));
|
|
32
|
+
const ipfs_http_client_1 = __importDefault(require("ipfs-http-client"));
|
|
33
|
+
const compiler_1 = __importDefault(require("../compiler"));
|
|
34
|
+
// Helper function to construct a subgraph compiler
|
|
35
|
+
function createCompiler(manifest, { ipfs, headers, outputDir, outputFormat, skipMigrations, blockIpfsMethods, protocol, }) {
|
|
36
|
+
// Parse the IPFS URL
|
|
37
|
+
let url;
|
|
38
|
+
try {
|
|
39
|
+
url = ipfs ? new url_1.URL(ipfs) : undefined;
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
toolbox.print.error(`Invalid IPFS URL: ${ipfs}
|
|
43
|
+
The IPFS URL must be of the following format: http(s)://host[:port]/[path]`);
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
// Connect to the IPFS node (if a node address was provided)
|
|
47
|
+
ipfs = ipfs
|
|
48
|
+
? (0, ipfs_http_client_1.default)({
|
|
49
|
+
protocol: url?.protocol.replace(/[:]+$/, ''),
|
|
50
|
+
host: url?.hostname,
|
|
51
|
+
port: url?.port,
|
|
52
|
+
'api-path': url?.pathname.replace(/\/$/, '') + '/api/v0/',
|
|
53
|
+
headers,
|
|
54
|
+
})
|
|
55
|
+
: undefined;
|
|
56
|
+
return new compiler_1.default({
|
|
57
|
+
ipfs,
|
|
58
|
+
subgraphManifest: manifest,
|
|
59
|
+
outputDir,
|
|
60
|
+
outputFormat,
|
|
61
|
+
skipMigrations,
|
|
62
|
+
blockIpfsMethods,
|
|
63
|
+
protocol,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
exports.createCompiler = createCompiler;
|
|
@@ -0,0 +1,29 @@
|
|
|
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.fromManifest = exports.fromFilePath = void 0;
|
|
7
|
+
const immutable_1 = __importDefault(require("immutable"));
|
|
8
|
+
const load_manifest_1 = require("../migrations/util/load-manifest");
|
|
9
|
+
// Loads manifest from file path and returns all:
|
|
10
|
+
// - data sources
|
|
11
|
+
// - templates
|
|
12
|
+
// In a single list.
|
|
13
|
+
const fromFilePath = async (manifestPath) => {
|
|
14
|
+
const { dataSources = [], templates = [] } = await (0, load_manifest_1.loadManifest)(manifestPath);
|
|
15
|
+
return dataSources.concat(templates);
|
|
16
|
+
};
|
|
17
|
+
exports.fromFilePath = fromFilePath;
|
|
18
|
+
const extractDataSourceByType = (manifest, dataSourceType, protocol) => manifest
|
|
19
|
+
.get(dataSourceType, immutable_1.default.List())
|
|
20
|
+
.reduce((dataSources, dataSource, dataSourceIndex) => protocol.isValidKindName(dataSource.get('kind'))
|
|
21
|
+
? dataSources.push(immutable_1.default.Map({ path: [dataSourceType, dataSourceIndex], dataSource }))
|
|
22
|
+
: dataSources, immutable_1.default.List());
|
|
23
|
+
// Extracts data sources and templates from a immutable manifest data structure
|
|
24
|
+
const fromManifest = (manifest, protocol) => {
|
|
25
|
+
const dataSources = extractDataSourceByType(manifest, 'dataSources', protocol);
|
|
26
|
+
const templates = extractDataSourceByType(manifest, 'templates', protocol);
|
|
27
|
+
return dataSources.concat(templates);
|
|
28
|
+
};
|
|
29
|
+
exports.fromManifest = fromManifest;
|
|
@@ -0,0 +1,9 @@
|
|
|
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.displayPath = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const displayPath = (p) => path_1.default.relative(process.cwd(), p);
|
|
9
|
+
exports.displayPath = displayPath;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Workaround for https://github.com/infinitered/gluegun/pull/464.
|
|
3
|
+
//
|
|
4
|
+
// There is currently no way in Gluegun to define command-line options
|
|
5
|
+
// that take no arguments (like `--watch`). As a consequence, boolean
|
|
6
|
+
// options like `--watch` will consume the immediately following argument,
|
|
7
|
+
// leading to confusing behavior.
|
|
8
|
+
//
|
|
9
|
+
// E.g. `graph deploy --watch subgraph/name
|
|
10
|
+
//
|
|
11
|
+
// Will result in
|
|
12
|
+
// ```
|
|
13
|
+
// toolbox.parameters.options === { watch: 'subgraph/name' }
|
|
14
|
+
// toolbox.parameters.first === undefined
|
|
15
|
+
// toolbox.parameters.array === []
|
|
16
|
+
// ```
|
|
17
|
+
// where what we really want is
|
|
18
|
+
// ```
|
|
19
|
+
// toolbox.parameters.options === { watch: true }
|
|
20
|
+
// toolbox.parameters.first = 'subgraph/name'
|
|
21
|
+
// toolbox.parameters.array = ['subgraph/name']
|
|
22
|
+
// ```
|
|
23
|
+
//
|
|
24
|
+
// The `fixParameters` function checks if any of the provided boolean
|
|
25
|
+
// options has a string value; if so, it pushes it to the front of the
|
|
26
|
+
// parameters array and returns the result of that.
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.fixParameters = void 0;
|
|
29
|
+
const fixParameters = (parameters, booleanOptions) => {
|
|
30
|
+
const unexpectedStringOptions = Object.keys(booleanOptions)
|
|
31
|
+
.filter(key => typeof booleanOptions[key] === 'string')
|
|
32
|
+
.map(key => ({ key, value: booleanOptions[key] }));
|
|
33
|
+
const optionNames = unexpectedStringOptions
|
|
34
|
+
.map(({ key }) => `--` + key.replace(/([A-Z])/, '-$1').toLowerCase())
|
|
35
|
+
.join(', ');
|
|
36
|
+
if (unexpectedStringOptions.length > 1) {
|
|
37
|
+
throw new Error(`Unexpected value provided for one or more of ${optionNames}. See --help for more information.`);
|
|
38
|
+
}
|
|
39
|
+
else if (unexpectedStringOptions.length == 1) {
|
|
40
|
+
const params = parameters.array;
|
|
41
|
+
params.unshift(unexpectedStringOptions[0].value);
|
|
42
|
+
return params;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
return parameters.array;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
exports.fixParameters = fixParameters;
|
|
@@ -0,0 +1,27 @@
|
|
|
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.createJsonRpcClient = void 0;
|
|
7
|
+
const gluegun_1 = require("gluegun");
|
|
8
|
+
const jayson_1 = __importDefault(require("jayson"));
|
|
9
|
+
function createJsonRpcClient(url) {
|
|
10
|
+
const params = {
|
|
11
|
+
host: url.hostname,
|
|
12
|
+
port: url.port,
|
|
13
|
+
path: url.pathname,
|
|
14
|
+
// username may be empty
|
|
15
|
+
auth: url.password ? `${url.username}:${url.password}` : undefined,
|
|
16
|
+
};
|
|
17
|
+
if (url.protocol === 'https:') {
|
|
18
|
+
return jayson_1.default.Client.https(params);
|
|
19
|
+
}
|
|
20
|
+
if (url.protocol === 'http:') {
|
|
21
|
+
return jayson_1.default.Client.http(params);
|
|
22
|
+
}
|
|
23
|
+
gluegun_1.print.error(`Unsupported protocol: ${url.protocol.substring(0, url.protocol.length - 1)}`);
|
|
24
|
+
gluegun_1.print.error('The Graph Node URL must be of the following format: http(s)://host[:port]/[path]');
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
exports.createJsonRpcClient = createJsonRpcClient;
|