@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,76 +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
-
11
- type SubgraphManifest {
12
- specVersion: String!
13
- features: [String!]
14
- schema: Schema!
15
- description: String
16
- repository: String
17
- graft: Graft
18
- dataSources: [DataSource!]!
19
- }
20
-
21
- type Schema {
22
- file: File!
23
- }
24
-
25
- type DataSource {
26
- kind: String!
27
- name: String!
28
- network: String
29
- source: ContractSource!
30
- mapping: ContractMapping!
31
- }
32
-
33
- type ContractSource {
34
- startBlock: BigInt
35
- }
36
-
37
- type ContractMapping {
38
- apiVersion: String!
39
- language: String!
40
- file: File!
41
- entities: [String!]!
42
- blockHandlers: [BlockHandler!]
43
- eventHandlers: [EventHandler!]
44
- transactionHandlers: [TransactionHandler!]
45
- messageHandlers: [MessageHandler!]
46
- }
47
-
48
- type BlockHandler {
49
- handler: String!
50
- }
51
-
52
- enum EventOrigin {
53
- BeginBlock
54
- DeliverTx
55
- EndBlock
56
- }
57
-
58
- type EventHandler {
59
- event: String!
60
- origin: EventOrigin
61
- handler: String!
62
- }
63
-
64
- type TransactionHandler {
65
- handler: String!
66
- }
67
-
68
- type MessageHandler {
69
- message: String!
70
- handler: String!
71
- }
72
-
73
- type Graft {
74
- base: String!
75
- block: BigInt!
76
- }
@@ -1,11 +0,0 @@
1
- export const source = () => `
2
- startBlock: 0`;
3
-
4
- export const mapping = () => `
5
- apiVersion: 0.0.5
6
- language: wasm/assemblyscript
7
- entities:
8
- - ExampleEntity
9
- blockHandlers:
10
- - handler: handleBlock
11
- file: ./src/contract.ts`;
@@ -1,35 +0,0 @@
1
- export const generatePlaceholderHandlers = () =>
2
- `
3
- import { cosmos, BigInt } from '@graphprotocol/graph-ts'
4
- import { ExampleEntity } from '../generated/schema'
5
-
6
- export function handleBlock(block: cosmos.Block): void {
7
- // Entities can be loaded from the store using a string ID; this ID
8
- // needs to be unique across all entities of the same type
9
- let entity = ExampleEntity.load(block.header.hash.toHex())
10
-
11
- // Entities only exist after they have been saved to the store;
12
- // \`null\` checks allow to create entities on demand
13
- if (!entity) {
14
- entity = new ExampleEntity(block.header.hash.toHex())
15
-
16
- // Entity fields can be set using simple assignments
17
- entity.count = BigInt.fromI32(0)
18
- }
19
-
20
- // BigInt and BigDecimal math are supported
21
- entity.count = entity.count + BigInt.fromI32(1)
22
-
23
- // Entity fields can be set based on receipt information
24
- entity.height = block.header.height
25
-
26
- // Entities can be written to the store with \`.save()\`
27
- entity.save()
28
-
29
- // Note: If a handler doesn't require existing field values, it is faster
30
- // _not_ to load the entity from the store. Instead, create it fresh with
31
- // \`new Entity(...)\`, set the fields that should be updated and save the
32
- // entity back to the store. Fields that were not set or unset remain
33
- // unchanged, allowing for partial updates to be applied.
34
- }
35
- `;
@@ -1,27 +0,0 @@
1
- import immutable from 'immutable';
2
- import { Subgraph, SubgraphOptions } from '../subgraph';
3
-
4
- export default class CosmosSubgraph implements Subgraph {
5
- manifest: SubgraphOptions['manifest'];
6
- resolveFile: SubgraphOptions['resolveFile'];
7
- protocol: SubgraphOptions['protocol'];
8
-
9
- constructor(options: SubgraphOptions) {
10
- this.manifest = options.manifest;
11
- this.resolveFile = options.resolveFile;
12
- this.protocol = options.protocol;
13
- }
14
-
15
- validateManifest() {
16
- return immutable.List();
17
- }
18
-
19
- handlerTypes() {
20
- return immutable.List([
21
- 'blockHandlers',
22
- 'eventHandlers',
23
- 'transactionHandlers',
24
- 'messageHandlers',
25
- ]);
26
- }
27
- }
@@ -1,153 +0,0 @@
1
- import path from 'path';
2
- import fs from 'fs-extra';
3
- import immutable from 'immutable';
4
- import AbiCodeGenerator from './codegen/abi';
5
-
6
- const TUPLE_ARRAY_PATTERN = /^tuple\[([0-9]*)\]$/;
7
- const TUPLE_MATRIX_PATTERN = /^tuple\[([0-9]*)\]\[([0-9]*)\]$/;
8
-
9
- const buildOldSignatureParameter = (input: immutable.Map<any, any>) => {
10
- return input.get('type') === 'tuple'
11
- ? `(${input
12
- .get('components')
13
- .map((component: any) => buildSignatureParameter(component))
14
- .join(',')})`
15
- : String(input.get('type'));
16
- };
17
-
18
- const buildSignatureParameter = (input: immutable.Map<any, any>) => {
19
- if (input.get('type') === 'tuple') {
20
- return `(${input.get('indexed') ? 'indexed ' : ''}${input
21
- .get('components')
22
- .map((component: any) => buildSignatureParameter(component))
23
- .join(',')})`;
24
- }
25
- if (input.get('type').match(TUPLE_ARRAY_PATTERN)) {
26
- const length = input.get('type').match(TUPLE_ARRAY_PATTERN)[1];
27
- return `(${input.get('indexed') ? 'indexed ' : ''}${input
28
- .get('components')
29
- .map((component: any) => buildSignatureParameter(component))
30
- .join(',')})[${length ? length : ''}]`;
31
- }
32
- if (input.get('type').match(TUPLE_MATRIX_PATTERN)) {
33
- const length1 = input.get('type').match(TUPLE_MATRIX_PATTERN)[1];
34
- const length2 = input.get('type').match(TUPLE_MATRIX_PATTERN)[2];
35
- return `(${input.get('indexed') ? 'indexed ' : ''}${input
36
- .get('components')
37
- .map((component: any) => buildSignatureParameter(component))
38
- .join(',')})[${length1 ? length1 : ''}][${length2 ? length2 : ''}]`;
39
- }
40
- return `${input.get('indexed') ? 'indexed ' : ''}${input.get('type')}`;
41
- };
42
-
43
- export default class ABI {
44
- constructor(
45
- public name: string,
46
- public file: string | undefined,
47
- public data: immutable.Collection<any, any>,
48
- ) {
49
- this.name = name;
50
- this.file = file;
51
- this.data = data;
52
- }
53
-
54
- codeGenerator() {
55
- return new AbiCodeGenerator(this);
56
- }
57
-
58
- static oldEventSignature(event: immutable.Map<any, any>) {
59
- return `${event.get('name')}(${event
60
- .get('inputs', [])
61
- .map(buildOldSignatureParameter)
62
- .join(',')})`;
63
- }
64
-
65
- static eventSignature(event: immutable.Map<any, any>) {
66
- return `${event.get('name')}(${event
67
- .get('inputs', [])
68
- .map(buildSignatureParameter)
69
- .join(',')})`;
70
- }
71
-
72
- /**
73
- * For the ABI of a function, returns a string function signature compatible
74
- * with the Rust `ethabi` library. It is of the form
75
- *
76
- * <function>([<input-type-1>, ...])[:(<output-type-1,...)]
77
- *
78
- * A few examples for a function called `example`:
79
- *
80
- * - No inputs or outputs: `example()`
81
- * - One input and output: `example(uint256):(bool)`
82
- * - Multiple inputs and outputs: `example(uint256,(string,bytes32)):(bool,uint256)`
83
- */
84
- functionSignature(fn: immutable.Map<any, any>) {
85
- const inputs = fn.get('inputs', []).map(buildSignatureParameter).join(',');
86
- const outputs = fn.get('outputs', []).map(buildSignatureParameter).join(',');
87
- return `${fn.get('name')}(${inputs})${outputs.length > 0 ? `:(${outputs})` : ''}`;
88
- }
89
-
90
- oldEventSignatures() {
91
- return this.data
92
- .filter((entry: any) => entry.get('type') === 'event')
93
- .map(ABI.oldEventSignature);
94
- }
95
-
96
- eventSignatures() {
97
- return this.data.filter((entry: any) => entry.get('type') === 'event').map(ABI.eventSignature);
98
- }
99
-
100
- callFunctions() {
101
- // An entry is a function if its type is not set or if it is one of
102
- // 'constructor', 'function' or 'fallback'
103
- const functionTypes = immutable.Set(['constructor', 'function', 'fallback']);
104
- const functions = this.data.filter(
105
- (entry: any) => !entry.has('type') || functionTypes.includes(entry.get('type')),
106
- );
107
-
108
- // A function is a call function if it is nonpayable, payable or
109
- // not constant
110
- const mutabilityTypes = immutable.Set(['nonpayable', 'payable']);
111
- return functions.filter(
112
- (entry: any) =>
113
- mutabilityTypes.includes(entry.get('stateMutability')) || entry.get('constant') === false,
114
- );
115
- }
116
-
117
- callFunctionSignatures() {
118
- return this.callFunctions()
119
- .filter((entry: any) => entry.get('type') !== 'constructor')
120
- .map((entry: any) => {
121
- const name = entry.get('name', '<default>');
122
- const inputs = entry
123
- .get('inputs', immutable.List())
124
- .map((input: any) => buildSignatureParameter(input));
125
-
126
- return `${name}(${inputs.join(',')})`;
127
- });
128
- }
129
-
130
- static normalized(json: any) {
131
- if (Array.isArray(json)) {
132
- return json;
133
- }
134
- if (json.abi !== undefined) {
135
- return json.abi;
136
- }
137
- if (json.compilerOutput?.abi) {
138
- return json.compilerOutput.abi;
139
- }
140
- return undefined;
141
- }
142
-
143
- static load(name: string, file: string) {
144
- const data = JSON.parse(fs.readFileSync(file).toString());
145
- const abi = ABI.normalized(data);
146
-
147
- if (abi === null || abi === undefined) {
148
- throw Error(`No valid ABI in file: ${path.relative(process.cwd(), file)}`);
149
- }
150
-
151
- return new ABI(name, file, immutable.fromJS(abi));
152
- }
153
- }
@@ -1,330 +0,0 @@
1
- import path from 'path';
2
- import fs from 'fs-extra';
3
- import immutable from 'immutable';
4
- import * as ts from '../../../codegen/typescript';
5
- import ABI from '../abi';
6
- import AbiCodeGenerator from './abi';
7
-
8
- let tempdir: string;
9
- let abi: ABI;
10
- let generatedTypes: any[];
11
-
12
- describe('ABI code generation', () => {
13
- beforeAll(async () => {
14
- tempdir = await fs.mkdtemp('abi-codegen');
15
-
16
- try {
17
- const filename = path.join(tempdir, 'ABI.json');
18
- await fs.writeFile(
19
- filename,
20
- JSON.stringify([
21
- {
22
- constant: true,
23
- inputs: [],
24
- name: 'read',
25
- outputs: [{ name: '', type: 'bytes32' }],
26
- payable: false,
27
- type: 'function',
28
- },
29
- {
30
- constant: true,
31
- inputs: [
32
- {
33
- name: 'proposalId',
34
- type: 'uint256',
35
- },
36
- {
37
- components: [
38
- {
39
- name: 'foo',
40
- type: 'uint8',
41
- },
42
- {
43
- name: 'bar',
44
- type: 'tuple',
45
- components: [{ name: 'baz', type: 'address' }],
46
- },
47
- ],
48
- name: '',
49
- type: 'tuple',
50
- },
51
- ],
52
- name: 'getProposal',
53
- outputs: [
54
- {
55
- components: [
56
- {
57
- name: 'result',
58
- type: 'uint8',
59
- },
60
- {
61
- name: 'target',
62
- type: 'address',
63
- },
64
- {
65
- name: 'data',
66
- type: 'bytes',
67
- },
68
- {
69
- name: 'proposer',
70
- type: 'address',
71
- },
72
- {
73
- name: 'feeRecipient',
74
- type: 'address',
75
- },
76
- {
77
- name: 'fee',
78
- type: 'uint256',
79
- },
80
- {
81
- name: 'startTime',
82
- type: 'uint256',
83
- },
84
- {
85
- name: 'yesCount',
86
- type: 'uint256',
87
- },
88
- {
89
- name: 'noCount',
90
- type: 'uint256',
91
- },
92
- ],
93
- name: '',
94
- type: 'tuple',
95
- },
96
- ],
97
- payable: false,
98
- stateMutability: 'view',
99
- type: 'function',
100
- },
101
- {
102
- type: 'function',
103
- stateMutability: 'view',
104
- payable: 'false',
105
- name: 'getProposals',
106
- outputs: [
107
- {
108
- type: 'uint256',
109
- name: 'size',
110
- },
111
- {
112
- type: 'tuple[]',
113
- components: [
114
- { name: 'first', type: 'uint256' },
115
- { name: 'second', type: 'string' },
116
- ],
117
- },
118
- ],
119
- },
120
- {
121
- type: 'function',
122
- stateMutability: 'view',
123
- name: 'overloaded',
124
- inputs: [
125
- {
126
- type: 'string',
127
- },
128
- ],
129
- outputs: [
130
- {
131
- type: 'string',
132
- },
133
- ],
134
- },
135
- {
136
- type: 'function',
137
- stateMutability: 'view',
138
- name: 'overloaded',
139
- inputs: [
140
- {
141
- type: 'uint256',
142
- },
143
- ],
144
- outputs: [
145
- {
146
- type: 'string',
147
- },
148
- ],
149
- },
150
- {
151
- type: 'function',
152
- stateMutability: 'view',
153
- name: 'overloaded',
154
- inputs: [
155
- {
156
- type: 'bytes32',
157
- },
158
- ],
159
- outputs: [
160
- {
161
- type: 'string',
162
- },
163
- ],
164
- },
165
- ]),
166
- 'utf-8',
167
- );
168
- abi = ABI.load('Contract', filename);
169
- const codegen = new AbiCodeGenerator(abi);
170
- generatedTypes = codegen.generateTypes();
171
- } finally {
172
- await fs.remove(tempdir);
173
- }
174
- });
175
-
176
- afterAll(async () => {
177
- await fs.remove(tempdir);
178
- });
179
-
180
- describe('Generated types', () => {
181
- test('All expected types are generated', () => {
182
- expect(generatedTypes.map(type => type.name)).toEqual([
183
- 'Contract__getProposalResultValue0Struct',
184
- 'Contract__getProposalInputParam1Struct',
185
- 'Contract__getProposalInputParam1BarStruct',
186
- 'Contract__getProposalsResultValue1Struct',
187
- 'Contract__getProposalsResult',
188
- 'Contract',
189
- ]);
190
- });
191
- });
192
-
193
- describe('Contract class', () => {
194
- test('Exists', () => {
195
- expect(generatedTypes.find(type => type.name === 'Contract')).toBeDefined();
196
- });
197
-
198
- test('Has methods', () => {
199
- const contract = generatedTypes.find(type => type.name === 'Contract');
200
- expect(contract.methods).toBeInstanceOf(Array);
201
- });
202
-
203
- test('Has `bind` method', () => {
204
- const contract = generatedTypes.find(type => type.name === 'Contract');
205
- expect(contract.methods.find((method: any) => method.name === 'bind')).toBeDefined();
206
- });
207
-
208
- test('Has methods for all callable functions', () => {
209
- const contract = generatedTypes.find(type => type.name === 'Contract');
210
- expect(contract.methods.map((method: any) => method.name)).toContain('getProposal');
211
- });
212
- });
213
-
214
- describe('Methods for callable functions', () => {
215
- test('Have correct parameters', () => {
216
- const contract = generatedTypes.find(type => type.name === 'Contract');
217
- expect(contract.methods.map((method: any) => [method.name, method.params])).toEqual([
218
- ['bind', immutable.List([ts.param('address', 'Address')])],
219
- ['read', immutable.List()],
220
- ['try_read', immutable.List()],
221
- [
222
- 'getProposal',
223
- immutable.List([
224
- ts.param('proposalId', 'BigInt'),
225
- ts.param('param1', 'Contract__getProposalInputParam1Struct'),
226
- ]),
227
- ],
228
- [
229
- 'try_getProposal',
230
- immutable.List([
231
- ts.param('proposalId', 'BigInt'),
232
- ts.param('param1', 'Contract__getProposalInputParam1Struct'),
233
- ]),
234
- ],
235
- ['getProposals', immutable.List()],
236
- ['try_getProposals', immutable.List()],
237
- ['overloaded', immutable.List([ts.param('param0', 'string')])],
238
- ['try_overloaded', immutable.List([ts.param('param0', 'string')])],
239
- ['overloaded1', immutable.List([ts.param('param0', 'BigInt')])],
240
- ['try_overloaded1', immutable.List([ts.param('param0', 'BigInt')])],
241
- ['overloaded2', immutable.List([ts.param('param0', 'Bytes')])],
242
- ['try_overloaded2', immutable.List([ts.param('param0', 'Bytes')])],
243
- ]);
244
- });
245
-
246
- test('Have correct return types', () => {
247
- const contract = generatedTypes.find(type => type.name === 'Contract');
248
- expect(contract.methods.map((method: any) => [method.name, method.returnType])).toEqual([
249
- ['bind', ts.namedType('Contract')],
250
- ['read', ts.namedType('Bytes')],
251
- ['try_read', 'ethereum.CallResult<Bytes>'],
252
- ['getProposal', ts.namedType('Contract__getProposalResultValue0Struct')],
253
- ['try_getProposal', 'ethereum.CallResult<Contract__getProposalResultValue0Struct>'],
254
- ['getProposals', ts.namedType('Contract__getProposalsResult')],
255
- ['try_getProposals', 'ethereum.CallResult<Contract__getProposalsResult>'],
256
- ['overloaded', ts.namedType('string')],
257
- ['try_overloaded', 'ethereum.CallResult<string>'],
258
- ['overloaded1', ts.namedType('string')],
259
- ['try_overloaded1', 'ethereum.CallResult<string>'],
260
- ['overloaded2', ts.namedType('string')],
261
- ['try_overloaded2', 'ethereum.CallResult<string>'],
262
- ]);
263
- });
264
- });
265
-
266
- describe('Tuples', () => {
267
- test('Tuple types exist for function parameters', () => {
268
- let tupleType = generatedTypes.find(
269
- type => type.name === 'Contract__getProposalInputParam1Struct',
270
- );
271
-
272
- // Verify that the tuple type has methods
273
- expect(tupleType.methods).toBeDefined();
274
-
275
- // Verify that the tuple type has getters for all tuple fields with
276
- // the right return types
277
- expect(tupleType.methods.map((method: any) => [method.name, method.returnType])).toEqual([
278
- ['get foo', 'i32'],
279
- ['get bar', 'Contract__getProposalInputParam1BarStruct'],
280
- ]);
281
-
282
- // Inner tuple:
283
- tupleType = generatedTypes.find(
284
- type => type.name === 'Contract__getProposalInputParam1BarStruct',
285
- );
286
-
287
- // Verify that the tuple type has methods
288
- expect(tupleType.methods).toBeDefined();
289
-
290
- // Verify that the tuple type has getters for all tuple fields with
291
- // the right return types
292
- expect(tupleType.methods.map((method: any) => [method.name, method.returnType])).toEqual([
293
- ['get baz', 'Address'],
294
- ]);
295
- });
296
-
297
- test('Tuple types exist for function return values', () => {
298
- const tupleType = generatedTypes.find(
299
- type => type.name === 'Contract__getProposalResultValue0Struct',
300
- );
301
-
302
- // Verify that the tuple type has methods
303
- expect(tupleType.methods).toBeDefined();
304
-
305
- // Verify that the tuple type has getters for all tuple fields with
306
- // the right return types
307
- expect(tupleType.methods.map((method: any) => [method.name, method.returnType])).toEqual([
308
- ['get result', 'i32'],
309
- ['get target', 'Address'],
310
- ['get data', 'Bytes'],
311
- ['get proposer', 'Address'],
312
- ['get feeRecipient', 'Address'],
313
- ['get fee', 'BigInt'],
314
- ['get startTime', 'BigInt'],
315
- ['get yesCount', 'BigInt'],
316
- ['get noCount', 'BigInt'],
317
- ]);
318
- });
319
-
320
- test('Function bodies are generated correctly for tuple arrays', () => {
321
- const contract = generatedTypes.find(type => type.name === 'Contract');
322
- const getter = contract.methods.find((method: any) => method.name === 'getProposals');
323
-
324
- expect(getter.body).not.toContain('toTupleArray<undefined>');
325
- expect(getter.body).toContain(
326
- 'result[1].toTupleArray<Contract__getProposalsResultValue1Struct>()',
327
- );
328
- });
329
- });
330
- });