@graphprotocol/graph-cli 0.37.3 → 0.37.4-alpha-20230117095424-b5750b1

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 (352) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/bin.js +6 -0
  3. package/dist/cli.js +26 -0
  4. package/dist/codegen/schema.js +244 -0
  5. package/dist/codegen/schema.test.js +455 -0
  6. package/dist/codegen/template.js +66 -0
  7. package/dist/codegen/types/conversions.js +335 -0
  8. package/dist/codegen/types/index.js +71 -0
  9. package/dist/codegen/types/index.test.js +563 -0
  10. package/dist/codegen/typescript.js +200 -0
  11. package/dist/codegen/util.js +40 -0
  12. package/dist/codegen/util.test.js +93 -0
  13. package/dist/command-helpers/abi.js +76 -0
  14. package/dist/command-helpers/auth.js +76 -0
  15. package/dist/command-helpers/compiler.js +66 -0
  16. package/dist/command-helpers/data-sources.js +29 -0
  17. package/dist/command-helpers/fs.js +9 -0
  18. package/dist/command-helpers/gluegun.js +48 -0
  19. package/dist/command-helpers/ipfs.js +5 -0
  20. package/dist/command-helpers/jsonrpc.js +27 -0
  21. package/dist/command-helpers/network.js +90 -0
  22. package/dist/command-helpers/network.test.js +86 -0
  23. package/dist/command-helpers/node.js +40 -0
  24. package/dist/command-helpers/scaffold.js +110 -0
  25. package/dist/command-helpers/spinner.js +80 -0
  26. package/dist/command-helpers/studio.js +14 -0
  27. package/dist/command-helpers/studio.test.js +41 -0
  28. package/dist/command-helpers/subgraph.js +22 -0
  29. package/dist/command-helpers/version.js +66 -0
  30. package/dist/command-helpers/version.test.js +186 -0
  31. package/dist/commands/add.js +187 -0
  32. package/dist/commands/auth.js +122 -0
  33. package/dist/commands/build.js +136 -0
  34. package/dist/commands/codegen.js +128 -0
  35. package/dist/commands/create.js +94 -0
  36. package/dist/commands/deploy.js +335 -0
  37. package/dist/commands/init.js +800 -0
  38. package/dist/commands/local.js +380 -0
  39. package/dist/commands/remove.js +95 -0
  40. package/dist/commands/test.js +293 -0
  41. package/dist/compiler/asc.js +83 -0
  42. package/dist/compiler/index.js +466 -0
  43. package/dist/debug.js +16 -0
  44. package/dist/migrations/mapping_api_version_0_0_1.js +83 -0
  45. package/dist/migrations/mapping_api_version_0_0_2.js +83 -0
  46. package/dist/migrations/mapping_api_version_0_0_3.js +83 -0
  47. package/dist/migrations/mapping_api_version_0_0_4.js +85 -0
  48. package/dist/migrations/mapping_api_version_0_0_5.js +85 -0
  49. package/dist/migrations/spec_version_0_0_2.js +45 -0
  50. package/dist/migrations/spec_version_0_0_3.js +50 -0
  51. package/dist/migrations/util/load-manifest.js +16 -0
  52. package/dist/migrations/util/versions.js +28 -0
  53. package/dist/migrations.js +54 -0
  54. package/{src → dist}/protocols/arweave/manifest.graphql +0 -0
  55. package/{src/protocols/arweave/scaffold/manifest.ts → dist/protocols/arweave/scaffold/manifest.js} +7 -3
  56. package/{src/protocols/arweave/scaffold/mapping.ts → dist/protocols/arweave/scaffold/mapping.js} +5 -2
  57. package/dist/protocols/arweave/subgraph.js +23 -0
  58. package/dist/protocols/contract.js +2 -0
  59. package/{src → dist}/protocols/cosmos/manifest.graphql +0 -0
  60. package/dist/protocols/cosmos/scaffold/manifest.js +15 -0
  61. package/{src/protocols/cosmos/scaffold/mapping.ts → dist/protocols/cosmos/scaffold/mapping.js} +5 -2
  62. package/dist/protocols/cosmos/subgraph.js +28 -0
  63. package/dist/protocols/ethereum/abi.js +138 -0
  64. package/dist/protocols/ethereum/codegen/abi.js +474 -0
  65. package/dist/protocols/ethereum/codegen/abi.test.js +325 -0
  66. package/dist/protocols/ethereum/codegen/template.js +52 -0
  67. package/dist/protocols/ethereum/contract.js +22 -0
  68. package/{src → dist}/protocols/ethereum/manifest.graphql +0 -0
  69. package/dist/protocols/ethereum/scaffold/manifest.js +32 -0
  70. package/{src/protocols/ethereum/scaffold/mapping.ts → dist/protocols/ethereum/scaffold/mapping.js} +18 -29
  71. package/dist/protocols/ethereum/subgraph.js +172 -0
  72. package/dist/protocols/ethereum/type-generator.js +123 -0
  73. package/dist/protocols/index.js +266 -0
  74. package/dist/protocols/ipfs/codegen/file_template.js +53 -0
  75. package/dist/protocols/near/contract.js +41 -0
  76. package/{src → dist}/protocols/near/manifest.graphql +0 -0
  77. package/dist/protocols/near/scaffold/manifest.js +16 -0
  78. package/{src/protocols/near/scaffold/mapping.ts → dist/protocols/near/scaffold/mapping.js} +5 -2
  79. package/dist/protocols/near/subgraph.js +23 -0
  80. package/dist/protocols/subgraph.js +2 -0
  81. package/{src → dist}/protocols/substreams/manifest.graphql +0 -0
  82. package/dist/protocols/substreams/scaffold/manifest.js +12 -0
  83. package/dist/protocols/substreams/subgraph.js +23 -0
  84. package/{src/scaffold/cosmos.test.ts → dist/scaffold/cosmos.test.js} +21 -22
  85. package/{src/scaffold/ethereum.test.ts → dist/scaffold/ethereum.test.js} +85 -101
  86. package/dist/scaffold/index.js +133 -0
  87. package/dist/scaffold/mapping.js +57 -0
  88. package/{src/scaffold/near.test.ts → dist/scaffold/near.test.js} +22 -23
  89. package/dist/scaffold/schema.js +86 -0
  90. package/dist/scaffold/tests.js +179 -0
  91. package/dist/schema.js +54 -0
  92. package/dist/subgraph.js +243 -0
  93. package/dist/type-generator.js +225 -0
  94. package/dist/validation/contract.js +44 -0
  95. package/dist/validation/index.js +10 -0
  96. package/dist/validation/manifest.js +266 -0
  97. package/dist/validation/schema.js +768 -0
  98. package/dist/validation/schema.test.js +35 -0
  99. package/dist/watcher.js +79 -0
  100. package/package.json +5 -1
  101. package/babel.config.js +0 -3
  102. package/jest.config.js +0 -175
  103. package/src/bin.ts +0 -6
  104. package/src/cli.ts +0 -30
  105. package/src/codegen/schema.test.ts +0 -460
  106. package/src/codegen/schema.ts +0 -299
  107. package/src/codegen/template.ts +0 -45
  108. package/src/codegen/types/conversions.ts +0 -358
  109. package/src/codegen/types/index.test.ts +0 -715
  110. package/src/codegen/types/index.ts +0 -111
  111. package/src/codegen/typescript.ts +0 -224
  112. package/src/codegen/util.test.ts +0 -112
  113. package/src/codegen/util.ts +0 -54
  114. package/src/command-helpers/abi.ts +0 -99
  115. package/src/command-helpers/auth.ts +0 -46
  116. package/src/command-helpers/compiler.ts +0 -60
  117. package/src/command-helpers/data-sources.ts +0 -36
  118. package/src/command-helpers/fs.ts +0 -5
  119. package/src/command-helpers/gluegun.ts +0 -52
  120. package/src/command-helpers/ipfs-http-client.d.ts +0 -1
  121. package/src/command-helpers/ipfs.ts +0 -3
  122. package/src/command-helpers/jsonrpc.ts +0 -22
  123. package/src/command-helpers/network.test.ts +0 -85
  124. package/src/command-helpers/network.ts +0 -133
  125. package/src/command-helpers/node.ts +0 -46
  126. package/src/command-helpers/scaffold.ts +0 -174
  127. package/src/command-helpers/spinner.ts +0 -60
  128. package/src/command-helpers/studio.test.ts +0 -84
  129. package/src/command-helpers/studio.ts +0 -25
  130. package/src/command-helpers/subgraph.ts +0 -21
  131. package/src/command-helpers/version.test.ts +0 -241
  132. package/src/command-helpers/version.ts +0 -53
  133. package/src/commands/add.ts +0 -220
  134. package/src/commands/auth.ts +0 -138
  135. package/src/commands/binary-install-raw.d.ts +0 -1
  136. package/src/commands/build.ts +0 -147
  137. package/src/commands/codegen.ts +0 -123
  138. package/src/commands/create.ts +0 -109
  139. package/src/commands/deploy.ts +0 -388
  140. package/src/commands/init.ts +0 -1060
  141. package/src/commands/local.ts +0 -539
  142. package/src/commands/remove.ts +0 -110
  143. package/src/commands/test.ts +0 -369
  144. package/src/compiler/asc.ts +0 -77
  145. package/src/compiler/index.ts +0 -677
  146. package/src/debug.ts +0 -15
  147. package/src/migrations/mapping_api_version_0_0_1.ts +0 -75
  148. package/src/migrations/mapping_api_version_0_0_2.ts +0 -75
  149. package/src/migrations/mapping_api_version_0_0_3.ts +0 -75
  150. package/src/migrations/mapping_api_version_0_0_4.ts +0 -77
  151. package/src/migrations/mapping_api_version_0_0_5.ts +0 -77
  152. package/src/migrations/spec_version_0_0_2.ts +0 -24
  153. package/src/migrations/spec_version_0_0_3.ts +0 -29
  154. package/src/migrations/util/load-manifest.ts +0 -10
  155. package/src/migrations/util/versions.ts +0 -27
  156. package/src/migrations.ts +0 -33
  157. package/src/protocols/arweave/subgraph.ts +0 -22
  158. package/src/protocols/contract.ts +0 -9
  159. package/src/protocols/cosmos/scaffold/manifest.ts +0 -11
  160. package/src/protocols/cosmos/subgraph.ts +0 -27
  161. package/src/protocols/ethereum/abi.ts +0 -153
  162. package/src/protocols/ethereum/codegen/abi.test.ts +0 -330
  163. package/src/protocols/ethereum/codegen/abi.ts +0 -719
  164. package/src/protocols/ethereum/codegen/template.ts +0 -41
  165. package/src/protocols/ethereum/contract.ts +0 -24
  166. package/src/protocols/ethereum/scaffold/manifest.ts +0 -28
  167. package/src/protocols/ethereum/subgraph.ts +0 -189
  168. package/src/protocols/ethereum/type-generator.ts +0 -191
  169. package/src/protocols/index.ts +0 -287
  170. package/src/protocols/ipfs/codegen/file_template.ts +0 -43
  171. package/src/protocols/near/contract.ts +0 -47
  172. package/src/protocols/near/scaffold/manifest.ts +0 -13
  173. package/src/protocols/near/subgraph.ts +0 -22
  174. package/src/protocols/subgraph.ts +0 -12
  175. package/src/protocols/substreams/scaffold/manifest.ts +0 -8
  176. package/src/protocols/substreams/subgraph.ts +0 -22
  177. package/src/scaffold/index.ts +0 -172
  178. package/src/scaffold/mapping.ts +0 -44
  179. package/src/scaffold/schema.ts +0 -89
  180. package/src/scaffold/tests.ts +0 -217
  181. package/src/schema.ts +0 -26
  182. package/src/subgraph.ts +0 -302
  183. package/src/type-generator.ts +0 -266
  184. package/src/validation/contract.ts +0 -51
  185. package/src/validation/index.ts +0 -5
  186. package/src/validation/manifest.ts +0 -360
  187. package/src/validation/schema.test.ts +0 -38
  188. package/src/validation/schema.ts +0 -957
  189. package/src/watcher.ts +0 -96
  190. package/tests/cli/globalSetup.ts +0 -8
  191. package/tests/cli/globalTeardown.ts +0 -8
  192. package/tests/cli/init/ethereum/abis/Marketplace.json +0 -408
  193. package/tests/cli/init/ethereum/abis/OverloadedElements.json +0 -91
  194. package/tests/cli/init/ethereum/abis/SoloMargin.json +0 -2729
  195. package/tests/cli/init/ethereum/from-contract-with-abi-and-structs.stderr +0 -14
  196. package/tests/cli/init/ethereum/from-contract-with-abi-and-structs.stdout +0 -12
  197. package/tests/cli/init/ethereum/from-contract-with-abi.stderr +0 -14
  198. package/tests/cli/init/ethereum/from-contract-with-abi.stdout +0 -12
  199. package/tests/cli/init/ethereum/from-contract-with-overloaded-elements.stderr +0 -14
  200. package/tests/cli/init/ethereum/from-contract-with-overloaded-elements.stdout +0 -12
  201. package/tests/cli/init/ethereum/from-contract.stderr +0 -16
  202. package/tests/cli/init/ethereum/from-contract.stdout +0 -12
  203. package/tests/cli/init/ethereum/from-example.stderr +0 -12
  204. package/tests/cli/init/ethereum/from-example.stdout +0 -12
  205. package/tests/cli/init/near/from-contract.stderr +0 -14
  206. package/tests/cli/init/near/from-contract.stdout +0 -12
  207. package/tests/cli/init.test.ts +0 -157
  208. package/tests/cli/spawn-command.d.ts +0 -7
  209. package/tests/cli/util.ts +0 -132
  210. package/tests/cli/validation/abi-not-found/Abi.json +0 -7
  211. package/tests/cli/validation/abi-not-found/mapping.ts +0 -0
  212. package/tests/cli/validation/abi-not-found/schema.graphql +0 -3
  213. package/tests/cli/validation/abi-not-found/subgraph.yaml +0 -42
  214. package/tests/cli/validation/abi-not-found copy.stderr +0 -13
  215. package/tests/cli/validation/big-decimal-is-valid/Abi.json +0 -7
  216. package/tests/cli/validation/big-decimal-is-valid/mapping.ts +0 -0
  217. package/tests/cli/validation/big-decimal-is-valid/schema.graphql +0 -4
  218. package/tests/cli/validation/big-decimal-is-valid/subgraph.yaml +0 -23
  219. package/tests/cli/validation/call-function-not-found/Abi.json +0 -57
  220. package/tests/cli/validation/call-function-not-found/mapping.ts +0 -0
  221. package/tests/cli/validation/call-function-not-found/schema.graphql +0 -3
  222. package/tests/cli/validation/call-function-not-found/subgraph.yaml +0 -22
  223. package/tests/cli/validation/call-function-not-found.stderr +0 -10
  224. package/tests/cli/validation/call-handler-with-tuple/Abi.json +0 -24
  225. package/tests/cli/validation/call-handler-with-tuple/generated/schema.ts +0 -44
  226. package/tests/cli/validation/call-handler-with-tuple/mapping.ts +0 -0
  227. package/tests/cli/validation/call-handler-with-tuple/schema.graphql +0 -3
  228. package/tests/cli/validation/call-handler-with-tuple/subgraph.yaml +0 -22
  229. package/tests/cli/validation/call-handler-with-tuple.stderr +0 -24
  230. package/tests/cli/validation/conflicting-network-names/Abi.json +0 -7
  231. package/tests/cli/validation/conflicting-network-names/mapping.ts +0 -0
  232. package/tests/cli/validation/conflicting-network-names/schema.graphql +0 -3
  233. package/tests/cli/validation/conflicting-network-names/subgraph.yaml +0 -41
  234. package/tests/cli/validation/conflicting-network-names.stderr +0 -10
  235. package/tests/cli/validation/conflicting-protocol-names/Abi.json +0 -7
  236. package/tests/cli/validation/conflicting-protocol-names/mapping.ts +0 -0
  237. package/tests/cli/validation/conflicting-protocol-names/schema.graphql +0 -3
  238. package/tests/cli/validation/conflicting-protocol-names/subgraph.yaml +0 -41
  239. package/tests/cli/validation/conflicting-protocol-names.stderr +0 -10
  240. package/tests/cli/validation/derived-from-target-type-missing/Abi.json +0 -6
  241. package/tests/cli/validation/derived-from-target-type-missing/mapping.ts +0 -0
  242. package/tests/cli/validation/derived-from-target-type-missing/schema.graphql +0 -4
  243. package/tests/cli/validation/derived-from-target-type-missing/subgraph.yaml +0 -22
  244. package/tests/cli/validation/derived-from-target-type-missing.stderr +0 -5
  245. package/tests/cli/validation/derived-from-with-interface/Gravity.json +0 -1
  246. package/tests/cli/validation/derived-from-with-interface/mapping.ts +0 -22
  247. package/tests/cli/validation/derived-from-with-interface/schema.graphql +0 -19
  248. package/tests/cli/validation/derived-from-with-interface/subgraph.yaml +0 -25
  249. package/tests/cli/validation/duplicate-data-source-name/Abi.json +0 -7
  250. package/tests/cli/validation/duplicate-data-source-name/mapping.ts +0 -0
  251. package/tests/cli/validation/duplicate-data-source-name/schema.graphql +0 -4
  252. package/tests/cli/validation/duplicate-data-source-name/subgraph.yaml +0 -40
  253. package/tests/cli/validation/duplicate-data-source-name.stderr +0 -5
  254. package/tests/cli/validation/duplicate-template-name/Abi.json +0 -7
  255. package/tests/cli/validation/duplicate-template-name/mapping.ts +0 -0
  256. package/tests/cli/validation/duplicate-template-name/schema.graphql +0 -4
  257. package/tests/cli/validation/duplicate-template-name/subgraph.yaml +0 -59
  258. package/tests/cli/validation/duplicate-template-name.stderr +0 -5
  259. package/tests/cli/validation/entity-field-args/Abi.json +0 -7
  260. package/tests/cli/validation/entity-field-args/mapping.ts +0 -0
  261. package/tests/cli/validation/entity-field-args/schema.graphql +0 -4
  262. package/tests/cli/validation/entity-field-args/subgraph.yaml +0 -22
  263. package/tests/cli/validation/entity-field-args.stderr +0 -5
  264. package/tests/cli/validation/ethereum-contract-without-handlers/Abi.json +0 -7
  265. package/tests/cli/validation/ethereum-contract-without-handlers/mapping.ts +0 -0
  266. package/tests/cli/validation/ethereum-contract-without-handlers/schema.graphql +0 -3
  267. package/tests/cli/validation/ethereum-contract-without-handlers/subgraph.yaml +0 -19
  268. package/tests/cli/validation/ethereum-contract-without-handlers.stderr +0 -6
  269. package/tests/cli/validation/event-not-found/Abi.json +0 -7
  270. package/tests/cli/validation/event-not-found/mapping.ts +0 -0
  271. package/tests/cli/validation/event-not-found/schema.graphql +0 -3
  272. package/tests/cli/validation/event-not-found/subgraph.yaml +0 -40
  273. package/tests/cli/validation/event-not-found.stderr +0 -12
  274. package/tests/cli/validation/example-values-found/Abi.json +0 -7
  275. package/tests/cli/validation/example-values-found/generated/ExampleSubgraph/ExampleContract.ts +0 -35
  276. package/tests/cli/validation/example-values-found/generated/schema.ts +0 -44
  277. package/tests/cli/validation/example-values-found/mapping.ts +0 -0
  278. package/tests/cli/validation/example-values-found/schema.graphql +0 -3
  279. package/tests/cli/validation/example-values-found/subgraph.yaml +0 -24
  280. package/tests/cli/validation/example-values-found.stderr +0 -34
  281. package/tests/cli/validation/invalid-abis/InvalidAbi.json +0 -1
  282. package/tests/cli/validation/invalid-abis/mapping.ts +0 -0
  283. package/tests/cli/validation/invalid-abis/schema.graphql +0 -3
  284. package/tests/cli/validation/invalid-abis/subgraph.yaml +0 -22
  285. package/tests/cli/validation/invalid-abis.stderr +0 -5
  286. package/tests/cli/validation/invalid-contract-addresses/Abi.json +0 -7
  287. package/tests/cli/validation/invalid-contract-addresses/mapping.ts +0 -0
  288. package/tests/cli/validation/invalid-contract-addresses/schema.graphql +0 -3
  289. package/tests/cli/validation/invalid-contract-addresses/subgraph.yaml +0 -58
  290. package/tests/cli/validation/invalid-contract-addresses.stderr +0 -14
  291. package/tests/cli/validation/invalid-data-source-template/mapping.ts +0 -0
  292. package/tests/cli/validation/invalid-data-source-template/schema.graphql +0 -3
  293. package/tests/cli/validation/invalid-data-source-template/subgraph.yaml +0 -32
  294. package/tests/cli/validation/invalid-data-source-template.stderr +0 -30
  295. package/tests/cli/validation/invalid-entity-field-types/Abi.json +0 -7
  296. package/tests/cli/validation/invalid-entity-field-types/mapping.ts +0 -0
  297. package/tests/cli/validation/invalid-entity-field-types/schema.graphql +0 -157
  298. package/tests/cli/validation/invalid-entity-field-types/subgraph.yaml +0 -22
  299. package/tests/cli/validation/invalid-entity-field-types.stderr +0 -148
  300. package/tests/cli/validation/invalid-fulltext-directive/Abi.json +0 -7
  301. package/tests/cli/validation/invalid-fulltext-directive/mapping.ts +0 -0
  302. package/tests/cli/validation/invalid-fulltext-directive/schema.graphql +0 -140
  303. package/tests/cli/validation/invalid-fulltext-directive/subgraph.yaml +0 -22
  304. package/tests/cli/validation/invalid-fulltext-directive.stderr +0 -32
  305. package/tests/cli/validation/invalid-graphql-schema/Abi.json +0 -7
  306. package/tests/cli/validation/invalid-graphql-schema/mapping.ts +0 -0
  307. package/tests/cli/validation/invalid-graphql-schema/schema.graphql +0 -8
  308. package/tests/cli/validation/invalid-graphql-schema/subgraph.yaml +0 -22
  309. package/tests/cli/validation/invalid-graphql-schema.stderr +0 -25
  310. package/tests/cli/validation/invalid-manifest/subgraph.yaml +0 -13
  311. package/tests/cli/validation/invalid-manifest-cannot-infer-protocol/subgraph.yaml +0 -12
  312. package/tests/cli/validation/invalid-manifest-cannot-infer-protocol.stderr +0 -5
  313. package/tests/cli/validation/invalid-manifest.stderr +0 -28
  314. package/tests/cli/validation/missing-entity-id/Abi.json +0 -7
  315. package/tests/cli/validation/missing-entity-id/mapping.ts +0 -0
  316. package/tests/cli/validation/missing-entity-id/schema.graphql +0 -3
  317. package/tests/cli/validation/missing-entity-id/subgraph.yaml +0 -22
  318. package/tests/cli/validation/missing-entity-id/types/ExampleSubgraph/ExampleContract.ts +0 -35
  319. package/tests/cli/validation/missing-entity-id/types/schema.ts +0 -27
  320. package/tests/cli/validation/missing-entity-id.stderr +0 -5
  321. package/tests/cli/validation/missing-or-invalid-derived-from-fields/Abi.json +0 -7
  322. package/tests/cli/validation/missing-or-invalid-derived-from-fields/mapping.ts +0 -0
  323. package/tests/cli/validation/missing-or-invalid-derived-from-fields/schema.graphql +0 -40
  324. package/tests/cli/validation/missing-or-invalid-derived-from-fields/subgraph.yaml +0 -22
  325. package/tests/cli/validation/missing-or-invalid-derived-from-fields.stderr +0 -10
  326. package/tests/cli/validation/missing-or-invalid-derived-from-fields.stdout +0 -0
  327. package/tests/cli/validation/near-is-valid/mapping.ts +0 -0
  328. package/tests/cli/validation/near-is-valid/schema.graphql +0 -8
  329. package/tests/cli/validation/near-is-valid/subgraph.yaml +0 -30
  330. package/tests/cli/validation/nested-template-nice-error/Abi.json +0 -7
  331. package/tests/cli/validation/nested-template-nice-error/mapping.ts +0 -0
  332. package/tests/cli/validation/nested-template-nice-error/schema.graphql +0 -3
  333. package/tests/cli/validation/nested-template-nice-error/subgraph.yaml +0 -35
  334. package/tests/cli/validation/nested-template-nice-error.stderr +0 -5
  335. package/tests/cli/validation/no-network-names/Abi.json +0 -7
  336. package/tests/cli/validation/no-network-names/mapping.ts +0 -0
  337. package/tests/cli/validation/no-network-names/schema.graphql +0 -3
  338. package/tests/cli/validation/no-network-names/subgraph.yaml +0 -40
  339. package/tests/cli/validation/no-network-names.stderr +0 -34
  340. package/tests/cli/validation/source-without-address-is-valid/Abi.json +0 -7
  341. package/tests/cli/validation/source-without-address-is-valid/generated/ExampleSubgraph/ExampleContract.ts +0 -35
  342. package/tests/cli/validation/source-without-address-is-valid/mapping.ts +0 -0
  343. package/tests/cli/validation/source-without-address-is-valid/schema.graphql +0 -3
  344. package/tests/cli/validation/source-without-address-is-valid/subgraph.yaml +0 -23
  345. package/tests/cli/validation/source-without-address-is-valid.stderr +0 -24
  346. package/tests/cli/validation/topic0-is-valid/Abi.json +0 -7
  347. package/tests/cli/validation/topic0-is-valid/mapping.ts +0 -0
  348. package/tests/cli/validation/topic0-is-valid/schema.graphql +0 -4
  349. package/tests/cli/validation/topic0-is-valid/subgraph.yaml +0 -24
  350. package/tests/cli/validation.test.ts +0 -226
  351. package/tsconfig.build.json +0 -4
  352. package/tsconfig.json +0 -19
@@ -0,0 +1,138 @@
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
+ const path_1 = __importDefault(require("path"));
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const immutable_1 = __importDefault(require("immutable"));
9
+ const abi_1 = __importDefault(require("./codegen/abi"));
10
+ const TUPLE_ARRAY_PATTERN = /^tuple\[([0-9]*)\]$/;
11
+ const TUPLE_MATRIX_PATTERN = /^tuple\[([0-9]*)\]\[([0-9]*)\]$/;
12
+ const buildOldSignatureParameter = (input) => {
13
+ return input.get('type') === 'tuple'
14
+ ? `(${input
15
+ .get('components')
16
+ .map((component) => buildSignatureParameter(component))
17
+ .join(',')})`
18
+ : String(input.get('type'));
19
+ };
20
+ const buildSignatureParameter = (input) => {
21
+ if (input.get('type') === 'tuple') {
22
+ return `(${input.get('indexed') ? 'indexed ' : ''}${input
23
+ .get('components')
24
+ .map((component) => buildSignatureParameter(component))
25
+ .join(',')})`;
26
+ }
27
+ if (input.get('type').match(TUPLE_ARRAY_PATTERN)) {
28
+ const length = input.get('type').match(TUPLE_ARRAY_PATTERN)[1];
29
+ return `(${input.get('indexed') ? 'indexed ' : ''}${input
30
+ .get('components')
31
+ .map((component) => buildSignatureParameter(component))
32
+ .join(',')})[${length ? length : ''}]`;
33
+ }
34
+ if (input.get('type').match(TUPLE_MATRIX_PATTERN)) {
35
+ const length1 = input.get('type').match(TUPLE_MATRIX_PATTERN)[1];
36
+ const length2 = input.get('type').match(TUPLE_MATRIX_PATTERN)[2];
37
+ return `(${input.get('indexed') ? 'indexed ' : ''}${input
38
+ .get('components')
39
+ .map((component) => buildSignatureParameter(component))
40
+ .join(',')})[${length1 ? length1 : ''}][${length2 ? length2 : ''}]`;
41
+ }
42
+ return `${input.get('indexed') ? 'indexed ' : ''}${input.get('type')}`;
43
+ };
44
+ class ABI {
45
+ name;
46
+ file;
47
+ data;
48
+ constructor(name, file, data) {
49
+ this.name = name;
50
+ this.file = file;
51
+ this.data = data;
52
+ this.name = name;
53
+ this.file = file;
54
+ this.data = data;
55
+ }
56
+ codeGenerator() {
57
+ return new abi_1.default(this);
58
+ }
59
+ static oldEventSignature(event) {
60
+ return `${event.get('name')}(${event
61
+ .get('inputs', [])
62
+ .map(buildOldSignatureParameter)
63
+ .join(',')})`;
64
+ }
65
+ static eventSignature(event) {
66
+ return `${event.get('name')}(${event
67
+ .get('inputs', [])
68
+ .map(buildSignatureParameter)
69
+ .join(',')})`;
70
+ }
71
+ /**
72
+ * For the ABI of a function, returns a string function signature compatible
73
+ * with the Rust `ethabi` library. It is of the form
74
+ *
75
+ * <function>([<input-type-1>, ...])[:(<output-type-1,...)]
76
+ *
77
+ * A few examples for a function called `example`:
78
+ *
79
+ * - No inputs or outputs: `example()`
80
+ * - One input and output: `example(uint256):(bool)`
81
+ * - Multiple inputs and outputs: `example(uint256,(string,bytes32)):(bool,uint256)`
82
+ */
83
+ functionSignature(fn) {
84
+ const inputs = fn.get('inputs', []).map(buildSignatureParameter).join(',');
85
+ const outputs = fn.get('outputs', []).map(buildSignatureParameter).join(',');
86
+ return `${fn.get('name')}(${inputs})${outputs.length > 0 ? `:(${outputs})` : ''}`;
87
+ }
88
+ oldEventSignatures() {
89
+ return this.data
90
+ .filter((entry) => entry.get('type') === 'event')
91
+ .map(ABI.oldEventSignature);
92
+ }
93
+ eventSignatures() {
94
+ return this.data.filter((entry) => entry.get('type') === 'event').map(ABI.eventSignature);
95
+ }
96
+ callFunctions() {
97
+ // An entry is a function if its type is not set or if it is one of
98
+ // 'constructor', 'function' or 'fallback'
99
+ const functionTypes = immutable_1.default.Set(['constructor', 'function', 'fallback']);
100
+ const functions = this.data.filter((entry) => !entry.has('type') || functionTypes.includes(entry.get('type')));
101
+ // A function is a call function if it is nonpayable, payable or
102
+ // not constant
103
+ const mutabilityTypes = immutable_1.default.Set(['nonpayable', 'payable']);
104
+ return functions.filter((entry) => mutabilityTypes.includes(entry.get('stateMutability')) || entry.get('constant') === false);
105
+ }
106
+ callFunctionSignatures() {
107
+ return this.callFunctions()
108
+ .filter((entry) => entry.get('type') !== 'constructor')
109
+ .map((entry) => {
110
+ const name = entry.get('name', '<default>');
111
+ const inputs = entry
112
+ .get('inputs', immutable_1.default.List())
113
+ .map((input) => buildSignatureParameter(input));
114
+ return `${name}(${inputs.join(',')})`;
115
+ });
116
+ }
117
+ static normalized(json) {
118
+ if (Array.isArray(json)) {
119
+ return json;
120
+ }
121
+ if (json.abi !== undefined) {
122
+ return json.abi;
123
+ }
124
+ if (json.compilerOutput?.abi) {
125
+ return json.compilerOutput.abi;
126
+ }
127
+ return undefined;
128
+ }
129
+ static load(name, file) {
130
+ const data = JSON.parse(fs_extra_1.default.readFileSync(file).toString());
131
+ const abi = ABI.normalized(data);
132
+ if (abi === null || abi === undefined) {
133
+ throw Error(`No valid ABI in file: ${path_1.default.relative(process.cwd(), file)}`);
134
+ }
135
+ return new ABI(name, file, immutable_1.default.fromJS(abi));
136
+ }
137
+ }
138
+ exports.default = ABI;
@@ -0,0 +1,474 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const fs_1 = __importDefault(require("fs"));
30
+ const immutable_1 = __importDefault(require("immutable"));
31
+ const sync_request_1 = __importDefault(require("sync-request"));
32
+ const web3_eth_abi_1 = __importDefault(require("web3-eth-abi"));
33
+ const yaml_1 = __importDefault(require("yaml"));
34
+ const typesCodegen = __importStar(require("../../../codegen/types"));
35
+ const tsCodegen = __importStar(require("../../../codegen/typescript"));
36
+ const util = __importStar(require("../../../codegen/util"));
37
+ const doFixtureCodegen = fs_1.default.existsSync('./fixtures.yaml');
38
+ class AbiCodeGenerator {
39
+ abi;
40
+ constructor(abi) {
41
+ this.abi = abi;
42
+ this.abi = abi;
43
+ }
44
+ generateModuleImports() {
45
+ const imports = [
46
+ tsCodegen.moduleImports([
47
+ // Ethereum integration
48
+ 'ethereum',
49
+ // Base classes
50
+ 'JSONValue',
51
+ 'TypedMap',
52
+ 'Entity',
53
+ // AssemblyScript types
54
+ 'Bytes',
55
+ 'Address',
56
+ 'BigInt',
57
+ ], '@graphprotocol/graph-ts'),
58
+ ];
59
+ if (doFixtureCodegen) {
60
+ imports.push(tsCodegen.moduleImports(['newMockEvent'], 'matchstick-as/assembly/index'));
61
+ }
62
+ return imports;
63
+ }
64
+ generateTypes() {
65
+ return [
66
+ ...this._generateEventTypes(),
67
+ ...this._generateSmartContractClass(),
68
+ ...this._generateCallTypes(),
69
+ ];
70
+ }
71
+ _generateCallTypes() {
72
+ let callFunctions = util.disambiguateNames({
73
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
74
+ values: this.abi.callFunctions(),
75
+ getName: fn =>
76
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
77
+ fn.get('name') || (fn.get('type') === 'constructor' ? 'constructor' : 'default'),
78
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
79
+ setName: (fn, name) => fn.set('_alias', name),
80
+ });
81
+ callFunctions = callFunctions.map(fn => {
82
+ const fnAlias = fn.get('_alias');
83
+ const fnClassName = `${fnAlias.charAt(0).toUpperCase()}${fnAlias.slice(1)}Call`;
84
+ const tupleClasses = [];
85
+ // First, generate a class with the input getters
86
+ const inputsClassName = fnClassName + '__Inputs';
87
+ const inputsClass = tsCodegen.klass(inputsClassName, { export: true });
88
+ inputsClass.addMember(tsCodegen.klassMember('_call', fnClassName));
89
+ inputsClass.addMethod(tsCodegen.method(`constructor`, [tsCodegen.param(`call`, fnClassName)], null, `this._call = call`));
90
+ // Generate getters and classes for function inputs
91
+ util
92
+ .disambiguateNames({
93
+ values: fn.get('inputs', immutable_1.default.List()),
94
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
95
+ getName: (input, index) => input.get('name') || `value${index}`,
96
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
97
+ setName: (input, name) => input.set('name', name),
98
+ })
99
+ .forEach((input, index) => {
100
+ const callInput = this._generateInputOrOutput(input, index, fnClassName, `call`, `inputValues`);
101
+ inputsClass.addMethod(callInput.getter);
102
+ tupleClasses.push(...callInput.classes);
103
+ });
104
+ // Second, generate a class with the output getters
105
+ const outputsClassName = fnClassName + '__Outputs';
106
+ const outputsClass = tsCodegen.klass(outputsClassName, { export: true });
107
+ outputsClass.addMember(tsCodegen.klassMember('_call', fnClassName));
108
+ outputsClass.addMethod(tsCodegen.method(`constructor`, [tsCodegen.param(`call`, fnClassName)], null, `this._call = call`));
109
+ // Generate getters and classes for function outputs
110
+ util
111
+ .disambiguateNames({
112
+ values: fn.get('outputs', immutable_1.default.List()),
113
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
114
+ getName: (output, index) => output.get('name') || `value${index}`,
115
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
116
+ setName: (output, name) => output.set('name', name),
117
+ })
118
+ .forEach((output, index) => {
119
+ const callInput = this._generateInputOrOutput(output, index, fnClassName, `call`, `outputValues`);
120
+ outputsClass.addMethod(callInput.getter);
121
+ tupleClasses.push(...callInput.classes);
122
+ });
123
+ // Then, generate the event class itself
124
+ const klass = tsCodegen.klass(fnClassName, {
125
+ export: true,
126
+ extends: 'ethereum.Call',
127
+ });
128
+ klass.addMethod(tsCodegen.method(`get inputs`, [], tsCodegen.namedType(inputsClassName), `return new ${inputsClassName}(this)`));
129
+ klass.addMethod(tsCodegen.method(`get outputs`, [], tsCodegen.namedType(outputsClassName), `return new ${outputsClassName}(this)`));
130
+ return [klass, inputsClass, outputsClass, ...tupleClasses];
131
+ });
132
+ return callFunctions.reduce(
133
+ // flatten the array
134
+ (array, classes) => array.concat(classes), []);
135
+ }
136
+ _generateEventTypes() {
137
+ // Enumerate events with duplicate names
138
+ let events = util.disambiguateNames({
139
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
140
+ values: this.abi.data.filter(member => member.get('type') === 'event'),
141
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
142
+ getName: event => event.get('name'),
143
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
144
+ setName: (event, name) => event.set('_alias', name),
145
+ });
146
+ events = events.map(event => {
147
+ const eventClassName = event.get('_alias');
148
+ const tupleClasses = [];
149
+ // First, generate a class with the param getters
150
+ const paramsClassName = eventClassName + '__Params';
151
+ const paramsClass = tsCodegen.klass(paramsClassName, { export: true });
152
+ paramsClass.addMember(tsCodegen.klassMember('_event', eventClassName));
153
+ paramsClass.addMethod(tsCodegen.method(`constructor`, [tsCodegen.param(`event`, eventClassName)], null, `this._event = event`));
154
+ // Enumerate inputs with duplicate names
155
+ const inputs = util.disambiguateNames({
156
+ values: event.get('inputs'),
157
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
158
+ getName: (input, index) => input.get('name') || `param${index}`,
159
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
160
+ setName: (input, name) => input.set('name', name),
161
+ });
162
+ const namesAndTypes = [];
163
+ inputs.forEach((input, index) => {
164
+ // Generate getters and classes for event params
165
+ const paramObject = this._generateInputOrOutput(input, index, eventClassName, `event`, `parameters`);
166
+ paramsClass.addMethod(paramObject.getter);
167
+ // Fixture generation
168
+ if (doFixtureCodegen) {
169
+ let ethType = typesCodegen.ethereumTypeForAsc(String(paramObject.getter.returnType));
170
+ if (typeof ethType !== 'string' && (ethType.test('int256') || ethType.test('uint256'))) {
171
+ ethType = 'int32';
172
+ }
173
+ namesAndTypes.push({ name: paramObject.getter.name.slice(4), type: ethType });
174
+ }
175
+ tupleClasses.push(...paramObject.classes);
176
+ });
177
+ // Then, generate the event class itself
178
+ const klass = tsCodegen.klass(eventClassName, {
179
+ export: true,
180
+ extends: 'ethereum.Event',
181
+ });
182
+ klass.addMethod(tsCodegen.method(`get params`, [], tsCodegen.namedType(paramsClassName), `return new ${paramsClassName}(this)`));
183
+ // Fixture generation
184
+ if (doFixtureCodegen) {
185
+ const args = yaml_1.default.parse(fs_1.default.readFileSync('./fixtures.yaml', 'utf8'));
186
+ const blockNumber = args['blockNumber'];
187
+ const contractAddr = args['contractAddr'];
188
+ const topic0 = args['topic0'];
189
+ const apiKey = args['apiKey'];
190
+ const url = `https://api.etherscan.io/api?module=logs&action=getLogs&fromBlock=${blockNumber}&toBlock=${blockNumber}&address=${contractAddr}&${topic0}=topic0&apikey=${apiKey}`;
191
+ const resp = (0, sync_request_1.default)('GET', url);
192
+ const body = JSON.parse(resp.getBody('utf8'));
193
+ if (body.status === '0') {
194
+ throw new Error(body.result);
195
+ }
196
+ const res = web3_eth_abi_1.default
197
+ // @ts-expect-error decodeLog seems to exist on Web3EthAbi
198
+ .decodeLog(namesAndTypes, body.result[0].data, []);
199
+ let stmnts = '';
200
+ for (let i = 0; i < namesAndTypes.length; i++) {
201
+ let code = '"' + res[i] + '"';
202
+ if (namesAndTypes[i].type.toString() == 'address') {
203
+ code = `Address.fromString(${code})`;
204
+ }
205
+ stmnts = stmnts.concat(`event.parameters.push(new ethereum.EventParam("${namesAndTypes[i].name}", ${typesCodegen.ethereumFromAsc(code, namesAndTypes[i].type)}));`, `\n`);
206
+ }
207
+ klass.addMethod(tsCodegen.staticMethod(`mock${eventClassName}`, [], tsCodegen.namedType(eventClassName), `
208
+ let event = changetype<${eventClassName}>(newMockEvent());
209
+ ${stmnts}
210
+ return event;
211
+ `));
212
+ }
213
+ return [klass, paramsClass, ...tupleClasses];
214
+ });
215
+ return events.reduce(
216
+ // flatten the array
217
+ (array, classes) => array.concat(classes), []);
218
+ }
219
+ _generateInputOrOutput(inputOrOutput, index, parentClass, parentType, parentField) {
220
+ // Get name and type of the param, adjusting for indexed params and missing names
221
+ let name = inputOrOutput.get('name');
222
+ const valueType = parentType === 'event' && inputOrOutput.get('indexed')
223
+ ? this._indexedInputType(inputOrOutput.get('type'))
224
+ : inputOrOutput.get('type');
225
+ if (name === undefined || name === null || name === '') {
226
+ name = parentType === 'event' ? `param${index}` : `value${index}`;
227
+ }
228
+ // Generate getters and classes for the param (classes only created for Ethereum tuple types)
229
+ return util.containsTupleType(valueType)
230
+ ? this._generateTupleType(inputOrOutput, index, parentClass, parentType, parentField)
231
+ : {
232
+ name: [],
233
+ getter: tsCodegen.method(`get ${name}`, [], typesCodegen.ascTypeForEthereum(valueType), `
234
+ return ${typesCodegen.ethereumToAsc(util.isTupleType(parentType)
235
+ ? `this[${index}]`
236
+ : `this._${parentType}.${parentField}[${index}].value`, valueType)}
237
+ `),
238
+ classes: [],
239
+ };
240
+ }
241
+ _tupleTypeName(inputOrOutput, index, parentClass, parentType) {
242
+ return this._generateTupleType(inputOrOutput, index, parentClass, parentType, '').name;
243
+ }
244
+ _generateTupleType(inputOrOutput, index, parentClass, parentType, parentField) {
245
+ const type = inputOrOutput.get('type');
246
+ let name = inputOrOutput.get('name');
247
+ if (name === undefined || name === null || name === '') {
248
+ name = parentType === 'event' ? `param${index}` : `value${index}`;
249
+ }
250
+ const tupleIdentifier = parentClass + tsCodegen.namedType(name).capitalize();
251
+ const tupleClassName = tupleIdentifier + 'Struct';
252
+ let tupleClasses = [];
253
+ const isTupleType = util.isTupleType(type);
254
+ const returnValue = typesCodegen.ethereumToAsc(parentType === 'tuple'
255
+ ? `this[${index}]`
256
+ : `this._${parentType}.${parentField}[${index}].value`, type, tupleClassName);
257
+ // Generate getter for parent class
258
+ const tupleGetter = tsCodegen.method(`get ${name}`, [], util.isTupleMatrixType(type)
259
+ ? `Array<Array<${tupleClassName}>>`
260
+ : util.isTupleArrayType(type)
261
+ ? `Array<${tupleClassName}>`
262
+ : tupleClassName, `
263
+ return ${isTupleType ? `changetype<${tupleClassName}>(${returnValue})` : String(returnValue)}
264
+ `);
265
+ // Generate tuple class
266
+ const baseTupleClass = tsCodegen.klass(tupleClassName, {
267
+ export: true,
268
+ extends: 'ethereum.Tuple',
269
+ });
270
+ // Add param getters to tuple class and generate classes for each tuple parameter
271
+ inputOrOutput.get('components').forEach((component, index) => {
272
+ const paramObject = this._generateInputOrOutput(component, index, tupleIdentifier, `tuple`);
273
+ baseTupleClass.addMethod(paramObject.getter);
274
+ tupleClasses = tupleClasses.concat(paramObject.classes);
275
+ });
276
+ // Combine all tuple classes generated
277
+ tupleClasses.unshift(baseTupleClass);
278
+ return {
279
+ name: tupleClassName,
280
+ getter: tupleGetter,
281
+ classes: tupleClasses,
282
+ };
283
+ }
284
+ _generateSmartContractClass() {
285
+ const klass = tsCodegen.klass(this.abi.name, {
286
+ export: true,
287
+ extends: 'ethereum.SmartContract',
288
+ });
289
+ let types = immutable_1.default.List();
290
+ klass.addMethod(tsCodegen.staticMethod('bind',
291
+ // TODO: add support for iterable staticMethod params
292
+ immutable_1.default.List([
293
+ tsCodegen.param('address', typesCodegen.ascTypeForEthereum('address')),
294
+ ]), tsCodegen.namedType(this.abi.name), `
295
+ return new ${this.abi.name}('${this.abi.name}', address);
296
+ `));
297
+ // Get view/pure functions from the contract
298
+ let functions = this.callableFunctions();
299
+ // Disambiguate functions with duplicate names
300
+ functions = util.disambiguateNames({
301
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
302
+ values: functions,
303
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
304
+ getName: fn => fn.get('name'),
305
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
306
+ setName: (fn, name) => fn.set('_alias', name),
307
+ });
308
+ functions.forEach(member => {
309
+ const fnName = member.get('name');
310
+ const fnAlias = member.get('_alias');
311
+ const fnSignature = this.abi.functionSignature(member);
312
+ // Generate a type for the result of calling the function
313
+ let returnType = undefined;
314
+ let simpleReturnType = true;
315
+ const tupleResultParentType = this.abi.name + '__' + fnAlias + 'Result';
316
+ // Disambiguate outputs with duplicate names
317
+ const outputs = util.disambiguateNames({
318
+ values: member.get('outputs', immutable_1.default.List()),
319
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
320
+ getName: (input, index) => input.get('name') || `value${index}`,
321
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
322
+ setName: (input, name) => input.set('name', name),
323
+ });
324
+ if (member.get('outputs', immutable_1.default.List()).size > 1) {
325
+ simpleReturnType = false;
326
+ // Create a type dedicated to holding the return values
327
+ returnType = tsCodegen.klass(this.abi.name + '__' + fnAlias + 'Result', {
328
+ export: true,
329
+ });
330
+ // Add a constructor to this type
331
+ returnType.addMethod(tsCodegen.method('constructor', outputs.map((output, index) => tsCodegen.param(`value${index}`, this._getTupleParamType(output, index, tupleResultParentType))), null, outputs
332
+ .map((_output, index) => `this.value${index} = value${index}`)
333
+ .join('\n')));
334
+ // Add a `toMap(): TypedMap<string,ethereum.Value>` function to the return type
335
+ returnType.addMethod(tsCodegen.method('toMap', [], tsCodegen.namedType('TypedMap<string,ethereum.Value>'), `
336
+ let map = new TypedMap<string,ethereum.Value>();
337
+ ${outputs
338
+ .map((output, index) => `map.set('value${index}', ${typesCodegen.ethereumFromAsc(`this.value${index}`, output.get('type'))})`)
339
+ .join(';')}
340
+ return map;
341
+ `));
342
+ // Add value0, value1 etc. members to the type
343
+ outputs
344
+ .map((output, index) => tsCodegen.klassMember(`value${index}`, this._getTupleParamType(output, index, tupleResultParentType)))
345
+ .forEach((member) => returnType.addMember(member));
346
+ // Add getters to the type
347
+ outputs
348
+ .map((output, index) => !!output.get('name') &&
349
+ tsCodegen.method(`get${output.get('name')[0].toUpperCase()}${output.get('name').slice(1)}`, [], this._getTupleParamType(output, index, tupleResultParentType), `return this.value${index};`))
350
+ .forEach((method) => !!method && returnType.addMethod(method));
351
+ // Create types for Tuple outputs
352
+ outputs.forEach((output, index) => {
353
+ if (util.containsTupleType(output.get('type'))) {
354
+ types = types.concat(this._generateTupleType(output, index, tupleResultParentType, 'function', this.abi.name).classes);
355
+ }
356
+ });
357
+ // Add the type to the types we'll create
358
+ types = types.push(returnType);
359
+ returnType = tsCodegen.namedType(returnType.name);
360
+ }
361
+ else {
362
+ const type = outputs.get(0).get('type');
363
+ if (util.containsTupleType(type)) {
364
+ // Add the Tuple type to the types we'll create
365
+ const tuple = this._generateTupleType(outputs.get(0), 0, tupleResultParentType, 'function', this.abi.name);
366
+ types = types.concat(tuple.classes);
367
+ returnType = util.isTupleType(type)
368
+ ? tsCodegen.namedType(tuple.name)
369
+ : `Array<${tsCodegen.namedType(tuple.name)}>`;
370
+ }
371
+ else {
372
+ returnType = tsCodegen.namedType(typesCodegen.ascTypeForEthereum(type));
373
+ }
374
+ }
375
+ // Disambiguate inputs with duplicate names
376
+ const inputs = util.disambiguateNames({
377
+ values: member.get('inputs', immutable_1.default.List()),
378
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
379
+ getName: (input, index) => input.get('name') || `param${index}`,
380
+ // @ts-expect-error improve typings of disambiguateNames to handle iterables
381
+ setName: (input, name) => input.set('name', name),
382
+ });
383
+ // Generate a type prefix to identify the Tuple inputs to a function
384
+ const tupleInputParentType = this.abi.name + '__' + fnAlias + 'Input';
385
+ // Create types for Tuple inputs
386
+ inputs.forEach((input, index) => {
387
+ if (util.containsTupleType(input.get('type'))) {
388
+ types = types.concat(this._generateTupleType(input, index, tupleInputParentType, 'function', this.abi.name)
389
+ .classes);
390
+ }
391
+ });
392
+ // Generate and add a method that implements calling the function on
393
+ // the smart contract
394
+ const params = inputs.map((input, index) => tsCodegen.param(input.get('name'), this._getTupleParamType(input, index, tupleInputParentType)));
395
+ const superInputs = `
396
+ '${fnName}',
397
+ '${fnSignature}',
398
+ [${inputs.size > 0
399
+ ? inputs
400
+ .map((input) => typesCodegen.ethereumFromAsc(input.get('name'), input.get('type')))
401
+ .map((coercion) => coercion.toString())
402
+ .join(', ')
403
+ : ''}]`;
404
+ const methodCallBody = (isTry) => {
405
+ const methodBody = `
406
+ ${isTry
407
+ ? `
408
+ let result = super.tryCall(${superInputs})
409
+ if (result.reverted) {
410
+ return new ethereum.CallResult()
411
+ }
412
+ let value = result.value
413
+ return ethereum.CallResult.fromValue(`
414
+ : `
415
+ let result = super.call(${superInputs})
416
+
417
+ return (`}`;
418
+ const returnVal = simpleReturnType
419
+ ? typesCodegen.ethereumToAsc(isTry ? 'value[0]' : 'result[0]', outputs.get(0).get('type'), util.isTupleArrayType(outputs.get(0).get('type'))
420
+ ? this._tupleTypeName(outputs.get(0), 0, tupleResultParentType, this.abi.name)
421
+ : '')
422
+ : `new ${returnType.name}(
423
+ ${outputs
424
+ .map((output, index) => {
425
+ const val = typesCodegen.ethereumToAsc(isTry ? `value[${index}]` : `result[${index}]`, output.get('type'), util.isTupleArrayType(output.get('type'))
426
+ ? this._tupleTypeName(output, index, tupleResultParentType, this.abi.name)
427
+ : '');
428
+ return util.isTupleType(output.get('type'))
429
+ ? `changetype<${this._tupleTypeName(output, index, tupleResultParentType, this.abi.name)}>(${val})`
430
+ : val;
431
+ })
432
+ .join(', ')}
433
+ )`;
434
+ const isTuple = util.isTupleType(outputs.get(0).get('type'));
435
+ return `${methodBody} ${isTuple ? `changetype<${returnType}>(${returnVal})` : returnVal})`;
436
+ };
437
+ // Generate method with an without `try_`.
438
+ klass.addMethod(tsCodegen.method(fnAlias, params, returnType, methodCallBody(false)));
439
+ klass.addMethod(tsCodegen.method('try_' + fnAlias, params, 'ethereum.CallResult<' + returnType + '>', methodCallBody(true)));
440
+ });
441
+ return [...types, klass];
442
+ }
443
+ _getTupleParamType(inputOrOutput, index, tupleParentType) {
444
+ const type = inputOrOutput.get('type');
445
+ return util.isTupleType(type)
446
+ ? this._tupleTypeName(inputOrOutput, index, tupleParentType, this.abi.name)
447
+ : util.isTupleMatrixType(type)
448
+ ? `Array<Array<${this._tupleTypeName(inputOrOutput, index, tupleParentType, this.abi.name)}>>`
449
+ : util.isTupleArrayType(type)
450
+ ? `Array<${this._tupleTypeName(inputOrOutput, index, tupleParentType, this.abi.name)}>`
451
+ : typesCodegen.ascTypeForEthereum(type);
452
+ }
453
+ _indexedInputType(inputType) {
454
+ // strings, bytes and arrays are encoded and hashed to a bytes32 value
455
+ if (inputType === 'string' ||
456
+ inputType === 'bytes' ||
457
+ inputType === 'tuple' ||
458
+ // the following matches arrays of the forms `uint256[]` and `uint256[12356789]`;
459
+ // the value type name doesn't matter here, just that the type name ends with
460
+ // brackets and, optionally, a number inside the brackets
461
+ inputType.match(/\[[0-9]*\]$/g)) {
462
+ return 'bytes32';
463
+ }
464
+ return inputType;
465
+ }
466
+ callableFunctions() {
467
+ const allowedMutability = ['view', 'pure', 'nonpayable', 'constant'];
468
+ return this.abi.data.filter(member => member.get('type') === 'function' &&
469
+ member.get('outputs', immutable_1.default.List()).size !== 0 &&
470
+ (allowedMutability.includes(member.get('stateMutability')) ||
471
+ (member.get('stateMutability') === undefined && !member.get('payable', false))));
472
+ }
473
+ }
474
+ exports.default = AbiCodeGenerator;