@graphprotocol/graph-cli 0.37.3 → 0.37.4

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.
Files changed (267) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/package.json +5 -1
  3. package/babel.config.js +0 -3
  4. package/jest.config.js +0 -175
  5. package/src/bin.ts +0 -6
  6. package/src/cli.ts +0 -30
  7. package/src/codegen/schema.test.ts +0 -460
  8. package/src/codegen/schema.ts +0 -299
  9. package/src/codegen/template.ts +0 -45
  10. package/src/codegen/types/conversions.ts +0 -358
  11. package/src/codegen/types/index.test.ts +0 -715
  12. package/src/codegen/types/index.ts +0 -111
  13. package/src/codegen/typescript.ts +0 -224
  14. package/src/codegen/util.test.ts +0 -112
  15. package/src/codegen/util.ts +0 -54
  16. package/src/command-helpers/abi.ts +0 -99
  17. package/src/command-helpers/auth.ts +0 -46
  18. package/src/command-helpers/compiler.ts +0 -60
  19. package/src/command-helpers/data-sources.ts +0 -36
  20. package/src/command-helpers/fs.ts +0 -5
  21. package/src/command-helpers/gluegun.ts +0 -52
  22. package/src/command-helpers/ipfs-http-client.d.ts +0 -1
  23. package/src/command-helpers/ipfs.ts +0 -3
  24. package/src/command-helpers/jsonrpc.ts +0 -22
  25. package/src/command-helpers/network.test.ts +0 -85
  26. package/src/command-helpers/network.ts +0 -133
  27. package/src/command-helpers/node.ts +0 -46
  28. package/src/command-helpers/scaffold.ts +0 -174
  29. package/src/command-helpers/spinner.ts +0 -60
  30. package/src/command-helpers/studio.test.ts +0 -84
  31. package/src/command-helpers/studio.ts +0 -25
  32. package/src/command-helpers/subgraph.ts +0 -21
  33. package/src/command-helpers/version.test.ts +0 -241
  34. package/src/command-helpers/version.ts +0 -53
  35. package/src/commands/add.ts +0 -220
  36. package/src/commands/auth.ts +0 -138
  37. package/src/commands/binary-install-raw.d.ts +0 -1
  38. package/src/commands/build.ts +0 -147
  39. package/src/commands/codegen.ts +0 -123
  40. package/src/commands/create.ts +0 -109
  41. package/src/commands/deploy.ts +0 -388
  42. package/src/commands/init.ts +0 -1060
  43. package/src/commands/local.ts +0 -539
  44. package/src/commands/remove.ts +0 -110
  45. package/src/commands/test.ts +0 -369
  46. package/src/compiler/asc.ts +0 -77
  47. package/src/compiler/index.ts +0 -677
  48. package/src/debug.ts +0 -15
  49. package/src/migrations/mapping_api_version_0_0_1.ts +0 -75
  50. package/src/migrations/mapping_api_version_0_0_2.ts +0 -75
  51. package/src/migrations/mapping_api_version_0_0_3.ts +0 -75
  52. package/src/migrations/mapping_api_version_0_0_4.ts +0 -77
  53. package/src/migrations/mapping_api_version_0_0_5.ts +0 -77
  54. package/src/migrations/spec_version_0_0_2.ts +0 -24
  55. package/src/migrations/spec_version_0_0_3.ts +0 -29
  56. package/src/migrations/util/load-manifest.ts +0 -10
  57. package/src/migrations/util/versions.ts +0 -27
  58. package/src/migrations.ts +0 -33
  59. package/src/protocols/arweave/manifest.graphql +0 -57
  60. package/src/protocols/arweave/scaffold/manifest.ts +0 -14
  61. package/src/protocols/arweave/scaffold/mapping.ts +0 -49
  62. package/src/protocols/arweave/subgraph.ts +0 -22
  63. package/src/protocols/contract.ts +0 -9
  64. package/src/protocols/cosmos/manifest.graphql +0 -76
  65. package/src/protocols/cosmos/scaffold/manifest.ts +0 -11
  66. package/src/protocols/cosmos/scaffold/mapping.ts +0 -35
  67. package/src/protocols/cosmos/subgraph.ts +0 -27
  68. package/src/protocols/ethereum/abi.ts +0 -153
  69. package/src/protocols/ethereum/codegen/abi.test.ts +0 -330
  70. package/src/protocols/ethereum/codegen/abi.ts +0 -719
  71. package/src/protocols/ethereum/codegen/template.ts +0 -41
  72. package/src/protocols/ethereum/contract.ts +0 -24
  73. package/src/protocols/ethereum/manifest.graphql +0 -94
  74. package/src/protocols/ethereum/scaffold/manifest.ts +0 -28
  75. package/src/protocols/ethereum/scaffold/mapping.ts +0 -76
  76. package/src/protocols/ethereum/subgraph.ts +0 -189
  77. package/src/protocols/ethereum/type-generator.ts +0 -191
  78. package/src/protocols/index.ts +0 -287
  79. package/src/protocols/ipfs/codegen/file_template.ts +0 -43
  80. package/src/protocols/near/contract.ts +0 -47
  81. package/src/protocols/near/manifest.graphql +0 -64
  82. package/src/protocols/near/scaffold/manifest.ts +0 -13
  83. package/src/protocols/near/scaffold/mapping.ts +0 -35
  84. package/src/protocols/near/subgraph.ts +0 -22
  85. package/src/protocols/subgraph.ts +0 -12
  86. package/src/protocols/substreams/manifest.graphql +0 -45
  87. package/src/protocols/substreams/scaffold/manifest.ts +0 -8
  88. package/src/protocols/substreams/subgraph.ts +0 -22
  89. package/src/scaffold/cosmos.test.ts +0 -83
  90. package/src/scaffold/ethereum.test.ts +0 -512
  91. package/src/scaffold/index.ts +0 -172
  92. package/src/scaffold/mapping.ts +0 -44
  93. package/src/scaffold/near.test.ts +0 -86
  94. package/src/scaffold/schema.ts +0 -89
  95. package/src/scaffold/tests.ts +0 -217
  96. package/src/schema.ts +0 -26
  97. package/src/subgraph.ts +0 -302
  98. package/src/type-generator.ts +0 -266
  99. package/src/validation/contract.ts +0 -51
  100. package/src/validation/index.ts +0 -5
  101. package/src/validation/manifest.ts +0 -360
  102. package/src/validation/schema.test.ts +0 -38
  103. package/src/validation/schema.ts +0 -957
  104. package/src/watcher.ts +0 -96
  105. package/tests/cli/globalSetup.ts +0 -8
  106. package/tests/cli/globalTeardown.ts +0 -8
  107. package/tests/cli/init/ethereum/abis/Marketplace.json +0 -408
  108. package/tests/cli/init/ethereum/abis/OverloadedElements.json +0 -91
  109. package/tests/cli/init/ethereum/abis/SoloMargin.json +0 -2729
  110. package/tests/cli/init/ethereum/from-contract-with-abi-and-structs.stderr +0 -14
  111. package/tests/cli/init/ethereum/from-contract-with-abi-and-structs.stdout +0 -12
  112. package/tests/cli/init/ethereum/from-contract-with-abi.stderr +0 -14
  113. package/tests/cli/init/ethereum/from-contract-with-abi.stdout +0 -12
  114. package/tests/cli/init/ethereum/from-contract-with-overloaded-elements.stderr +0 -14
  115. package/tests/cli/init/ethereum/from-contract-with-overloaded-elements.stdout +0 -12
  116. package/tests/cli/init/ethereum/from-contract.stderr +0 -16
  117. package/tests/cli/init/ethereum/from-contract.stdout +0 -12
  118. package/tests/cli/init/ethereum/from-example.stderr +0 -12
  119. package/tests/cli/init/ethereum/from-example.stdout +0 -12
  120. package/tests/cli/init/near/from-contract.stderr +0 -14
  121. package/tests/cli/init/near/from-contract.stdout +0 -12
  122. package/tests/cli/init.test.ts +0 -157
  123. package/tests/cli/spawn-command.d.ts +0 -7
  124. package/tests/cli/util.ts +0 -132
  125. package/tests/cli/validation/abi-not-found/Abi.json +0 -7
  126. package/tests/cli/validation/abi-not-found/mapping.ts +0 -0
  127. package/tests/cli/validation/abi-not-found/schema.graphql +0 -3
  128. package/tests/cli/validation/abi-not-found/subgraph.yaml +0 -42
  129. package/tests/cli/validation/abi-not-found copy.stderr +0 -13
  130. package/tests/cli/validation/big-decimal-is-valid/Abi.json +0 -7
  131. package/tests/cli/validation/big-decimal-is-valid/mapping.ts +0 -0
  132. package/tests/cli/validation/big-decimal-is-valid/schema.graphql +0 -4
  133. package/tests/cli/validation/big-decimal-is-valid/subgraph.yaml +0 -23
  134. package/tests/cli/validation/call-function-not-found/Abi.json +0 -57
  135. package/tests/cli/validation/call-function-not-found/mapping.ts +0 -0
  136. package/tests/cli/validation/call-function-not-found/schema.graphql +0 -3
  137. package/tests/cli/validation/call-function-not-found/subgraph.yaml +0 -22
  138. package/tests/cli/validation/call-function-not-found.stderr +0 -10
  139. package/tests/cli/validation/call-handler-with-tuple/Abi.json +0 -24
  140. package/tests/cli/validation/call-handler-with-tuple/generated/schema.ts +0 -44
  141. package/tests/cli/validation/call-handler-with-tuple/mapping.ts +0 -0
  142. package/tests/cli/validation/call-handler-with-tuple/schema.graphql +0 -3
  143. package/tests/cli/validation/call-handler-with-tuple/subgraph.yaml +0 -22
  144. package/tests/cli/validation/call-handler-with-tuple.stderr +0 -24
  145. package/tests/cli/validation/conflicting-network-names/Abi.json +0 -7
  146. package/tests/cli/validation/conflicting-network-names/mapping.ts +0 -0
  147. package/tests/cli/validation/conflicting-network-names/schema.graphql +0 -3
  148. package/tests/cli/validation/conflicting-network-names/subgraph.yaml +0 -41
  149. package/tests/cli/validation/conflicting-network-names.stderr +0 -10
  150. package/tests/cli/validation/conflicting-protocol-names/Abi.json +0 -7
  151. package/tests/cli/validation/conflicting-protocol-names/mapping.ts +0 -0
  152. package/tests/cli/validation/conflicting-protocol-names/schema.graphql +0 -3
  153. package/tests/cli/validation/conflicting-protocol-names/subgraph.yaml +0 -41
  154. package/tests/cli/validation/conflicting-protocol-names.stderr +0 -10
  155. package/tests/cli/validation/derived-from-target-type-missing/Abi.json +0 -6
  156. package/tests/cli/validation/derived-from-target-type-missing/mapping.ts +0 -0
  157. package/tests/cli/validation/derived-from-target-type-missing/schema.graphql +0 -4
  158. package/tests/cli/validation/derived-from-target-type-missing/subgraph.yaml +0 -22
  159. package/tests/cli/validation/derived-from-target-type-missing.stderr +0 -5
  160. package/tests/cli/validation/derived-from-with-interface/Gravity.json +0 -1
  161. package/tests/cli/validation/derived-from-with-interface/mapping.ts +0 -22
  162. package/tests/cli/validation/derived-from-with-interface/schema.graphql +0 -19
  163. package/tests/cli/validation/derived-from-with-interface/subgraph.yaml +0 -25
  164. package/tests/cli/validation/duplicate-data-source-name/Abi.json +0 -7
  165. package/tests/cli/validation/duplicate-data-source-name/mapping.ts +0 -0
  166. package/tests/cli/validation/duplicate-data-source-name/schema.graphql +0 -4
  167. package/tests/cli/validation/duplicate-data-source-name/subgraph.yaml +0 -40
  168. package/tests/cli/validation/duplicate-data-source-name.stderr +0 -5
  169. package/tests/cli/validation/duplicate-template-name/Abi.json +0 -7
  170. package/tests/cli/validation/duplicate-template-name/mapping.ts +0 -0
  171. package/tests/cli/validation/duplicate-template-name/schema.graphql +0 -4
  172. package/tests/cli/validation/duplicate-template-name/subgraph.yaml +0 -59
  173. package/tests/cli/validation/duplicate-template-name.stderr +0 -5
  174. package/tests/cli/validation/entity-field-args/Abi.json +0 -7
  175. package/tests/cli/validation/entity-field-args/mapping.ts +0 -0
  176. package/tests/cli/validation/entity-field-args/schema.graphql +0 -4
  177. package/tests/cli/validation/entity-field-args/subgraph.yaml +0 -22
  178. package/tests/cli/validation/entity-field-args.stderr +0 -5
  179. package/tests/cli/validation/ethereum-contract-without-handlers/Abi.json +0 -7
  180. package/tests/cli/validation/ethereum-contract-without-handlers/mapping.ts +0 -0
  181. package/tests/cli/validation/ethereum-contract-without-handlers/schema.graphql +0 -3
  182. package/tests/cli/validation/ethereum-contract-without-handlers/subgraph.yaml +0 -19
  183. package/tests/cli/validation/ethereum-contract-without-handlers.stderr +0 -6
  184. package/tests/cli/validation/event-not-found/Abi.json +0 -7
  185. package/tests/cli/validation/event-not-found/mapping.ts +0 -0
  186. package/tests/cli/validation/event-not-found/schema.graphql +0 -3
  187. package/tests/cli/validation/event-not-found/subgraph.yaml +0 -40
  188. package/tests/cli/validation/event-not-found.stderr +0 -12
  189. package/tests/cli/validation/example-values-found/Abi.json +0 -7
  190. package/tests/cli/validation/example-values-found/generated/ExampleSubgraph/ExampleContract.ts +0 -35
  191. package/tests/cli/validation/example-values-found/generated/schema.ts +0 -44
  192. package/tests/cli/validation/example-values-found/mapping.ts +0 -0
  193. package/tests/cli/validation/example-values-found/schema.graphql +0 -3
  194. package/tests/cli/validation/example-values-found/subgraph.yaml +0 -24
  195. package/tests/cli/validation/example-values-found.stderr +0 -34
  196. package/tests/cli/validation/invalid-abis/InvalidAbi.json +0 -1
  197. package/tests/cli/validation/invalid-abis/mapping.ts +0 -0
  198. package/tests/cli/validation/invalid-abis/schema.graphql +0 -3
  199. package/tests/cli/validation/invalid-abis/subgraph.yaml +0 -22
  200. package/tests/cli/validation/invalid-abis.stderr +0 -5
  201. package/tests/cli/validation/invalid-contract-addresses/Abi.json +0 -7
  202. package/tests/cli/validation/invalid-contract-addresses/mapping.ts +0 -0
  203. package/tests/cli/validation/invalid-contract-addresses/schema.graphql +0 -3
  204. package/tests/cli/validation/invalid-contract-addresses/subgraph.yaml +0 -58
  205. package/tests/cli/validation/invalid-contract-addresses.stderr +0 -14
  206. package/tests/cli/validation/invalid-data-source-template/mapping.ts +0 -0
  207. package/tests/cli/validation/invalid-data-source-template/schema.graphql +0 -3
  208. package/tests/cli/validation/invalid-data-source-template/subgraph.yaml +0 -32
  209. package/tests/cli/validation/invalid-data-source-template.stderr +0 -30
  210. package/tests/cli/validation/invalid-entity-field-types/Abi.json +0 -7
  211. package/tests/cli/validation/invalid-entity-field-types/mapping.ts +0 -0
  212. package/tests/cli/validation/invalid-entity-field-types/schema.graphql +0 -157
  213. package/tests/cli/validation/invalid-entity-field-types/subgraph.yaml +0 -22
  214. package/tests/cli/validation/invalid-entity-field-types.stderr +0 -148
  215. package/tests/cli/validation/invalid-fulltext-directive/Abi.json +0 -7
  216. package/tests/cli/validation/invalid-fulltext-directive/mapping.ts +0 -0
  217. package/tests/cli/validation/invalid-fulltext-directive/schema.graphql +0 -140
  218. package/tests/cli/validation/invalid-fulltext-directive/subgraph.yaml +0 -22
  219. package/tests/cli/validation/invalid-fulltext-directive.stderr +0 -32
  220. package/tests/cli/validation/invalid-graphql-schema/Abi.json +0 -7
  221. package/tests/cli/validation/invalid-graphql-schema/mapping.ts +0 -0
  222. package/tests/cli/validation/invalid-graphql-schema/schema.graphql +0 -8
  223. package/tests/cli/validation/invalid-graphql-schema/subgraph.yaml +0 -22
  224. package/tests/cli/validation/invalid-graphql-schema.stderr +0 -25
  225. package/tests/cli/validation/invalid-manifest/subgraph.yaml +0 -13
  226. package/tests/cli/validation/invalid-manifest-cannot-infer-protocol/subgraph.yaml +0 -12
  227. package/tests/cli/validation/invalid-manifest-cannot-infer-protocol.stderr +0 -5
  228. package/tests/cli/validation/invalid-manifest.stderr +0 -28
  229. package/tests/cli/validation/missing-entity-id/Abi.json +0 -7
  230. package/tests/cli/validation/missing-entity-id/mapping.ts +0 -0
  231. package/tests/cli/validation/missing-entity-id/schema.graphql +0 -3
  232. package/tests/cli/validation/missing-entity-id/subgraph.yaml +0 -22
  233. package/tests/cli/validation/missing-entity-id/types/ExampleSubgraph/ExampleContract.ts +0 -35
  234. package/tests/cli/validation/missing-entity-id/types/schema.ts +0 -27
  235. package/tests/cli/validation/missing-entity-id.stderr +0 -5
  236. package/tests/cli/validation/missing-or-invalid-derived-from-fields/Abi.json +0 -7
  237. package/tests/cli/validation/missing-or-invalid-derived-from-fields/mapping.ts +0 -0
  238. package/tests/cli/validation/missing-or-invalid-derived-from-fields/schema.graphql +0 -40
  239. package/tests/cli/validation/missing-or-invalid-derived-from-fields/subgraph.yaml +0 -22
  240. package/tests/cli/validation/missing-or-invalid-derived-from-fields.stderr +0 -10
  241. package/tests/cli/validation/missing-or-invalid-derived-from-fields.stdout +0 -0
  242. package/tests/cli/validation/near-is-valid/mapping.ts +0 -0
  243. package/tests/cli/validation/near-is-valid/schema.graphql +0 -8
  244. package/tests/cli/validation/near-is-valid/subgraph.yaml +0 -30
  245. package/tests/cli/validation/nested-template-nice-error/Abi.json +0 -7
  246. package/tests/cli/validation/nested-template-nice-error/mapping.ts +0 -0
  247. package/tests/cli/validation/nested-template-nice-error/schema.graphql +0 -3
  248. package/tests/cli/validation/nested-template-nice-error/subgraph.yaml +0 -35
  249. package/tests/cli/validation/nested-template-nice-error.stderr +0 -5
  250. package/tests/cli/validation/no-network-names/Abi.json +0 -7
  251. package/tests/cli/validation/no-network-names/mapping.ts +0 -0
  252. package/tests/cli/validation/no-network-names/schema.graphql +0 -3
  253. package/tests/cli/validation/no-network-names/subgraph.yaml +0 -40
  254. package/tests/cli/validation/no-network-names.stderr +0 -34
  255. package/tests/cli/validation/source-without-address-is-valid/Abi.json +0 -7
  256. package/tests/cli/validation/source-without-address-is-valid/generated/ExampleSubgraph/ExampleContract.ts +0 -35
  257. package/tests/cli/validation/source-without-address-is-valid/mapping.ts +0 -0
  258. package/tests/cli/validation/source-without-address-is-valid/schema.graphql +0 -3
  259. package/tests/cli/validation/source-without-address-is-valid/subgraph.yaml +0 -23
  260. package/tests/cli/validation/source-without-address-is-valid.stderr +0 -24
  261. package/tests/cli/validation/topic0-is-valid/Abi.json +0 -7
  262. package/tests/cli/validation/topic0-is-valid/mapping.ts +0 -0
  263. package/tests/cli/validation/topic0-is-valid/schema.graphql +0 -4
  264. package/tests/cli/validation/topic0-is-valid/subgraph.yaml +0 -24
  265. package/tests/cli/validation.test.ts +0 -226
  266. package/tsconfig.build.json +0 -4
  267. package/tsconfig.json +0 -19
@@ -1,41 +0,0 @@
1
- import immutable from 'immutable';
2
- import * as tsCodegen from '../../../codegen/typescript';
3
-
4
- export default class EthereumTemplateCodeGen {
5
- constructor(public template: immutable.Map<any, any>) {
6
- this.template = template;
7
- }
8
-
9
- generateModuleImports() {
10
- return ['Address'];
11
- }
12
-
13
- generateCreateMethod() {
14
- const name = this.template.get('name');
15
-
16
- return tsCodegen.staticMethod(
17
- 'create',
18
- [tsCodegen.param('address', tsCodegen.namedType('Address'))],
19
- tsCodegen.namedType('void'),
20
- `
21
- DataSourceTemplate.create('${name}', [address.toHex()])
22
- `,
23
- );
24
- }
25
-
26
- generateCreateWithContextMethod() {
27
- const name = this.template.get('name');
28
-
29
- return tsCodegen.staticMethod(
30
- 'createWithContext',
31
- [
32
- tsCodegen.param('address', tsCodegen.namedType('Address')),
33
- tsCodegen.param('context', tsCodegen.namedType('DataSourceContext')),
34
- ],
35
- tsCodegen.namedType('void'),
36
- `
37
- DataSourceTemplate.createWithContext('${name}', [address.toHex()], context)
38
- `,
39
- );
40
- }
41
- }
@@ -1,24 +0,0 @@
1
- import { Contract } from '../contract';
2
-
3
- export default class EthereumContract implements Contract {
4
- static identifierName() {
5
- return 'address';
6
- }
7
-
8
- constructor(private address: string) {
9
- this.address = address;
10
- }
11
-
12
- validate() {
13
- const pattern = /^(0x)?[0-9a-fA-F]{40}$/;
14
-
15
- const errorMessage = "Must be 40 hexadecimal characters, with an optional '0x' prefix.";
16
-
17
- const valid = pattern.test(this.address);
18
-
19
- return {
20
- valid,
21
- error: valid ? null : errorMessage,
22
- };
23
- }
24
- }
@@ -1,94 +0,0 @@
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
- }
@@ -1,28 +0,0 @@
1
- import { strings } from 'gluegun';
2
- import { abiEvents } from '../../../scaffold/schema';
3
- import ABI from '../abi';
4
-
5
- export const source = ({ contract, contractName }: { contract: string; contractName: string }) => `
6
- address: '${contract}'
7
- abi: ${contractName}`;
8
-
9
- export const mapping = ({ abi, contractName }: { abi: ABI; contractName: string }) => `
10
- kind: ethereum/events
11
- apiVersion: 0.0.7
12
- language: wasm/assemblyscript
13
- entities:
14
- ${abiEvents(abi)
15
- .map(event => `- ${event.get('_alias')}`)
16
- .join('\n ')}
17
- abis:
18
- - name: ${contractName}
19
- file: ./abis/${contractName}.json
20
- eventHandlers:
21
- ${abiEvents(abi)
22
- .map(
23
- event => `
24
- - event: ${ABI.eventSignature(event)}
25
- handler: handle${event.get('_alias')}`,
26
- )
27
- .join('')}
28
- file: ./src/${strings.kebabCase(contractName)}.ts`;
@@ -1,76 +0,0 @@
1
- import { generateEventFieldAssignments } from '../../../scaffold/mapping';
2
- import ABI from '../abi';
3
-
4
- export const generatePlaceholderHandlers = ({
5
- abi,
6
- events,
7
- contractName,
8
- }: {
9
- abi: ABI;
10
- events: any[];
11
- contractName: string;
12
- }) =>
13
- `
14
- import { BigInt } from '@graphprotocol/graph-ts'
15
- import { ${contractName}, ${events.map(event => event._alias)} }
16
- from '../generated/${contractName}/${contractName}'
17
- import { ExampleEntity } from '../generated/schema'
18
-
19
- ${events
20
- .map((event, index) =>
21
- index === 0
22
- ? `
23
- export function handle${event._alias}(event: ${event._alias}): void {
24
- // Entities can be loaded from the store using a string ID; this ID
25
- // needs to be unique across all entities of the same type
26
- let entity = ExampleEntity.load(event.transaction.from)
27
-
28
- // Entities only exist after they have been saved to the store;
29
- // \`null\` checks allow to create entities on demand
30
- if (!entity) {
31
- entity = new ExampleEntity(event.transaction.from)
32
-
33
- // Entity fields can be set using simple assignments
34
- entity.count = BigInt.fromI32(0)
35
- }
36
-
37
- // BigInt and BigDecimal math are supported
38
- entity.count = entity.count + BigInt.fromI32(1)
39
-
40
- // Entity fields can be set based on event parameters
41
- ${generateEventFieldAssignments(event).slice(0, 2).join('\n')}
42
-
43
- // Entities can be written to the store with \`.save()\`
44
- entity.save()
45
-
46
- // Note: If a handler doesn't require existing field values, it is faster
47
- // _not_ to load the entity from the store. Instead, create it fresh with
48
- // \`new Entity(...)\`, set the fields that should be updated and save the
49
- // entity back to the store. Fields that were not set or unset remain
50
- // unchanged, allowing for partial updates to be applied.
51
-
52
- // It is also possible to access smart contracts from mappings. For
53
- // example, the contract that has emitted the event can be connected to
54
- // with:
55
- //
56
- // let contract = Contract.bind(event.address)
57
- //
58
- // The following functions can then be called on this contract to access
59
- // state variables and other data:
60
- //
61
- // ${
62
- abi.codeGenerator().callableFunctions().isEmpty()
63
- ? 'None'
64
- : abi
65
- .codeGenerator()
66
- .callableFunctions()
67
- .map((fn: any) => `- contract.${fn.get('name')}(...)`)
68
- .join('\n// ')
69
- }
70
- }
71
- `
72
- : `
73
- export function handle${event._alias}(event: ${event._alias}): void {}
74
- `,
75
- )
76
- .join('\n')}`;
@@ -1,189 +0,0 @@
1
- import immutable from 'immutable';
2
- import * as DataSourcesExtractor from '../../command-helpers/data-sources';
3
- import { Subgraph, SubgraphOptions } from '../subgraph';
4
- import ABI from './abi';
5
-
6
- export default class EthereumSubgraph implements Subgraph {
7
- public manifest: SubgraphOptions['manifest'];
8
- public resolveFile: SubgraphOptions['resolveFile'];
9
- public protocol: SubgraphOptions['protocol'];
10
-
11
- constructor(options: SubgraphOptions) {
12
- this.manifest = options.manifest;
13
- this.resolveFile = options.resolveFile;
14
- this.protocol = options.protocol;
15
- }
16
-
17
- validateManifest() {
18
- return this.validateAbis().concat(this.validateEvents()).concat(this.validateCallFunctions());
19
- }
20
-
21
- validateAbis() {
22
- const dataSourcesAndTemplates = DataSourcesExtractor.fromManifest(this.manifest, this.protocol);
23
-
24
- return dataSourcesAndTemplates.reduce(
25
- (errors: any[], dataSourceOrTemplate: any) =>
26
- errors.concat(
27
- this.validateDataSourceAbis(
28
- dataSourceOrTemplate.get('dataSource'),
29
- dataSourceOrTemplate.get('path'),
30
- ),
31
- ),
32
- immutable.List(),
33
- );
34
- }
35
-
36
- validateDataSourceAbis(dataSource: any, path: string) {
37
- // Validate that the the "source > abi" reference of all data sources
38
- // points to an existing ABI in the data source ABIs
39
- const abiName = dataSource.getIn(['source', 'abi']);
40
- const abiNames = dataSource.getIn(['mapping', 'abis']).map((abi: any) => abi.get('name'));
41
- const nameErrors = abiNames.includes(abiName)
42
- ? immutable.List()
43
- : immutable.fromJS([
44
- {
45
- path: [...path, 'source', 'abi'],
46
- message: `\
47
- ABI name '${abiName}' not found in mapping > abis.
48
- Available ABIs:
49
- ${abiNames
50
- .sort()
51
- .map((name: string) => `- ${name}`)
52
- .join('\n')}`,
53
- },
54
- ]);
55
-
56
- // Validate that all ABI files are valid
57
- const fileErrors = dataSource
58
- .getIn(['mapping', 'abis'])
59
- .reduce((errors: any[], abi: any, abiIndex: number) => {
60
- try {
61
- ABI.load(abi.get('name'), this.resolveFile(abi.get('file')));
62
- return errors;
63
- } catch (e) {
64
- return errors.push(
65
- immutable.fromJS({
66
- path: [...path, 'mapping', 'abis', abiIndex, 'file'],
67
- message: e.message,
68
- }),
69
- );
70
- }
71
- }, immutable.List());
72
-
73
- return nameErrors.concat(fileErrors);
74
- }
75
-
76
- validateEvents() {
77
- const dataSourcesAndTemplates = DataSourcesExtractor.fromManifest(this.manifest, this.protocol);
78
-
79
- return dataSourcesAndTemplates.reduce((errors: any[], dataSourceOrTemplate: any) => {
80
- return errors.concat(
81
- this.validateDataSourceEvents(
82
- dataSourceOrTemplate.get('dataSource'),
83
- dataSourceOrTemplate.get('path'),
84
- ),
85
- );
86
- }, immutable.List());
87
- }
88
-
89
- validateDataSourceEvents(dataSource: any, path: string) {
90
- let abi: ABI;
91
- try {
92
- // Resolve the source ABI name into a real ABI object
93
- const abiName = dataSource.getIn(['source', 'abi']);
94
- const abiEntry = dataSource
95
- .getIn(['mapping', 'abis'])
96
- .find((abi: any) => abi.get('name') === abiName);
97
- abi = ABI.load(abiEntry.get('name'), this.resolveFile(abiEntry.get('file')));
98
- } catch (_) {
99
- // Ignore errors silently; we can't really say anything about
100
- // the events if the ABI can't even be loaded
101
- return immutable.List();
102
- }
103
-
104
- // Obtain event signatures from the mapping
105
- const manifestEvents = dataSource
106
- .getIn(['mapping', 'eventHandlers'], immutable.List())
107
- .map((handler: any) => handler.get('event'));
108
-
109
- // Obtain event signatures from the ABI
110
- const abiEvents = abi.eventSignatures();
111
-
112
- // Add errors for every manifest event signature that is not
113
- // present in the ABI
114
- return manifestEvents.reduce(
115
- (errors: any[], manifestEvent: any, index: number) =>
116
- abiEvents.includes(manifestEvent)
117
- ? errors
118
- : errors.push(
119
- immutable.fromJS({
120
- path: [...path, 'eventHandlers', index],
121
- message: `\
122
- Event with signature '${manifestEvent}' not present in ABI '${abi.name}'.
123
- Available events:
124
- ${abiEvents
125
- .sort()
126
- .map(event => `- ${event}`)
127
- .join('\n')}`,
128
- }),
129
- ),
130
- immutable.List(),
131
- );
132
- }
133
-
134
- validateCallFunctions() {
135
- return this.manifest
136
- .get('dataSources')
137
- .filter((dataSource: any) => this.protocol.isValidKindName(dataSource.get('kind')))
138
- .reduce((errors: any[], dataSource: any, dataSourceIndex: string) => {
139
- const path = ['dataSources', dataSourceIndex, 'callHandlers'];
140
-
141
- let abi: ABI;
142
- try {
143
- // Resolve the source ABI name into a real ABI object
144
- const abiName = dataSource.getIn(['source', 'abi']);
145
- const abiEntry = dataSource
146
- .getIn(['mapping', 'abis'])
147
- .find((abi: any) => abi.get('name') === abiName);
148
- abi = ABI.load(abiEntry.get('name'), this.resolveFile(abiEntry.get('file')));
149
- } catch (e) {
150
- // Ignore errors silently; we can't really say anything about
151
- // the call functions if the ABI can't even be loaded
152
- return errors;
153
- }
154
-
155
- // Obtain event signatures from the mapping
156
- const manifestFunctions = dataSource
157
- .getIn(['mapping', 'callHandlers'], immutable.List())
158
- .map((handler: any) => handler.get('function'));
159
-
160
- // Obtain event signatures from the ABI
161
- const abiFunctions = abi.callFunctionSignatures();
162
-
163
- // Add errors for every manifest event signature that is not
164
- // present in the ABI
165
- return manifestFunctions.reduce(
166
- (errors: any[], manifestFunction: any, index: number) =>
167
- abiFunctions.includes(manifestFunction)
168
- ? errors
169
- : errors.push(
170
- immutable.fromJS({
171
- path: [...path, index],
172
- message: `\
173
- Call function with signature '${manifestFunction}' not present in ABI '${abi.name}'.
174
- Available call functions:
175
- ${abiFunctions
176
- .sort()
177
- .map(tx => `- ${tx}`)
178
- .join('\n')}`,
179
- }),
180
- ),
181
- errors,
182
- );
183
- }, immutable.List());
184
- }
185
-
186
- handlerTypes() {
187
- return immutable.List(['blockHandlers', 'callHandlers', 'eventHandlers']);
188
- }
189
- }
@@ -1,191 +0,0 @@
1
- import path from 'path';
2
- import fs from 'fs-extra';
3
- import immutable from 'immutable';
4
- import prettier from 'prettier';
5
- import { GENERATED_FILE_NOTE } from '../../codegen/typescript';
6
- import { displayPath } from '../../command-helpers/fs';
7
- import { Spinner, step, withSpinner } from '../../command-helpers/spinner';
8
- import { TypeGeneratorOptions } from '../../type-generator';
9
- import ABI from './abi';
10
-
11
- export default class EthereumTypeGenerator {
12
- private sourceDir: TypeGeneratorOptions['sourceDir'];
13
- private outputDir: TypeGeneratorOptions['outputDir'];
14
-
15
- constructor(options: TypeGeneratorOptions) {
16
- this.sourceDir = options.sourceDir;
17
- this.outputDir = options.outputDir;
18
- }
19
-
20
- async loadABIs(subgraph: immutable.Map<any, any>) {
21
- return await withSpinner(
22
- 'Load contract ABIs',
23
- 'Failed to load contract ABIs',
24
- `Warnings while loading contract ABIs`,
25
- async spinner => {
26
- try {
27
- return subgraph
28
- .get('dataSources')
29
- .reduce(
30
- (abis: any[], dataSource: any) =>
31
- dataSource
32
- .getIn(['mapping', 'abis'])
33
- .reduce(
34
- (abis: any[], abi: any) =>
35
- abis.push(
36
- this._loadABI(dataSource, abi.get('name'), abi.get('file'), spinner),
37
- ),
38
- abis,
39
- ),
40
- immutable.List(),
41
- );
42
- } catch (e) {
43
- throw Error(`Failed to load contract ABIs: ${e.message}`);
44
- }
45
- },
46
- );
47
- }
48
-
49
- _loadABI(dataSource: any, name: string, maybeRelativePath: string, spinner: Spinner) {
50
- try {
51
- if (this.sourceDir) {
52
- const absolutePath = path.resolve(this.sourceDir, maybeRelativePath);
53
- step(spinner, `Load contract ABI from`, displayPath(absolutePath));
54
- return { dataSource, abi: ABI.load(name, absolutePath) };
55
- }
56
- return { dataSource, abi: ABI.load(name, maybeRelativePath) };
57
- } catch (e) {
58
- throw Error(`Failed to load contract ABI: ${e.message}`);
59
- }
60
- }
61
-
62
- async loadDataSourceTemplateABIs(subgraph: immutable.Map<any, any>) {
63
- return await withSpinner(
64
- `Load data source template ABIs`,
65
- `Failed to load data source template ABIs`,
66
- `Warnings while loading data source template ABIs`,
67
- async spinner => {
68
- const abis = [];
69
- for (const template of subgraph.get('templates', immutable.List())) {
70
- for (const abi of template.getIn(['mapping', 'abis'])) {
71
- abis.push(
72
- this._loadDataSourceTemplateABI(template, abi.get('name'), abi.get('file'), spinner),
73
- );
74
- }
75
- }
76
- return abis;
77
- },
78
- );
79
- }
80
-
81
- _loadDataSourceTemplateABI(
82
- template: any,
83
- name: string,
84
- maybeRelativePath: string,
85
- spinner: Spinner,
86
- ) {
87
- try {
88
- if (this.sourceDir) {
89
- const absolutePath = path.resolve(this.sourceDir, maybeRelativePath);
90
- step(spinner, `Load data source template ABI from`, displayPath(absolutePath));
91
- return { template, abi: ABI.load(name, absolutePath) };
92
- }
93
- return { template, abi: ABI.load(name, maybeRelativePath) };
94
- } catch (e) {
95
- throw Error(`Failed to load data source template ABI: ${e.message}`);
96
- }
97
- }
98
-
99
- generateTypesForABIs(abis: any[]) {
100
- return withSpinner(
101
- `Generate types for contract ABIs`,
102
- `Failed to generate types for contract ABIs`,
103
- `Warnings while generating types for contract ABIs`,
104
- async spinner => {
105
- return await Promise.all(
106
- abis.map(async abi => await this._generateTypesForABI(abi, spinner)),
107
- );
108
- },
109
- );
110
- }
111
-
112
- async _generateTypesForABI(abi: any, spinner: Spinner) {
113
- try {
114
- step(
115
- spinner,
116
- `Generate types for contract ABI:`,
117
- `${abi.abi.name} (${displayPath(abi.abi.file)})`,
118
- );
119
-
120
- const codeGenerator = abi.abi.codeGenerator();
121
- const code = prettier.format(
122
- [
123
- GENERATED_FILE_NOTE,
124
- ...codeGenerator.generateModuleImports(),
125
- ...codeGenerator.generateTypes(),
126
- ].join('\n'),
127
- {
128
- parser: 'typescript',
129
- },
130
- );
131
-
132
- const outputFile = path.join(
133
- this.outputDir,
134
- abi.dataSource.get('name'),
135
- `${abi.abi.name}.ts`,
136
- );
137
- step(spinner, `Write types to`, displayPath(outputFile));
138
- await fs.mkdirs(path.dirname(outputFile));
139
- await fs.writeFile(outputFile, code);
140
- } catch (e) {
141
- throw Error(`Failed to generate types for contract ABI: ${e.message}`);
142
- }
143
- }
144
-
145
- async generateTypesForDataSourceTemplateABIs(abis: any[]) {
146
- return await withSpinner(
147
- `Generate types for data source template ABIs`,
148
- `Failed to generate types for data source template ABIs`,
149
- `Warnings while generating types for data source template ABIs`,
150
- async spinner => {
151
- return await Promise.all(
152
- abis.map(async abi => await this._generateTypesForDataSourceTemplateABI(abi, spinner)),
153
- );
154
- },
155
- );
156
- }
157
-
158
- async _generateTypesForDataSourceTemplateABI(abi: any, spinner: Spinner) {
159
- try {
160
- step(
161
- spinner,
162
- `Generate types for data source template ABI:`,
163
- `${abi.template.get('name')} > ${abi.abi.name} (${displayPath(abi.abi.file)})`,
164
- );
165
-
166
- const codeGenerator = abi.abi.codeGenerator();
167
- const code = prettier.format(
168
- [
169
- GENERATED_FILE_NOTE,
170
- ...codeGenerator.generateModuleImports(),
171
- ...codeGenerator.generateTypes(),
172
- ].join('\n'),
173
- {
174
- parser: 'typescript',
175
- },
176
- );
177
-
178
- const outputFile = path.join(
179
- this.outputDir,
180
- 'templates',
181
- abi.template.get('name'),
182
- `${abi.abi.name}.ts`,
183
- );
184
- step(spinner, `Write types to`, displayPath(outputFile));
185
- await fs.mkdirs(path.dirname(outputFile));
186
- await fs.writeFile(outputFile, code);
187
- } catch (e) {
188
- throw Error(`Failed to generate types for data source template ABI: ${e.message}`);
189
- }
190
- }
191
- }