@sentio/sdk 1.7.12 → 1.7.15

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 (293) hide show
  1. package/{base-processor-template.d.ts → lib/base-processor-template.d.ts} +0 -0
  2. package/{base-processor-template.js → lib/base-processor-template.js} +0 -0
  3. package/lib/base-processor-template.js.map +1 -0
  4. package/{base-processor.d.ts → lib/base-processor.d.ts} +0 -0
  5. package/{base-processor.js → lib/base-processor.js} +0 -0
  6. package/lib/base-processor.js.map +1 -0
  7. package/{bind-options.d.ts → lib/bind-options.d.ts} +0 -0
  8. package/{bind-options.js → lib/bind-options.js} +0 -0
  9. package/lib/bind-options.js.map +1 -0
  10. package/{binds.d.ts → lib/binds.d.ts} +0 -0
  11. package/{binds.js → lib/binds.js} +0 -0
  12. package/lib/binds.js.map +1 -0
  13. package/{builtin → lib/builtin}/erc20/index.d.ts +0 -0
  14. package/{builtin → lib/builtin}/erc20/index.js +0 -0
  15. package/lib/builtin/erc20/index.js.map +1 -0
  16. package/{builtin → lib/builtin}/erc20/test-utils.d.ts +0 -0
  17. package/{builtin → lib/builtin}/erc20/test-utils.js +0 -0
  18. package/lib/builtin/erc20/test-utils.js.map +1 -0
  19. package/{builtin → lib/builtin}/internal/Erc20.d.ts +0 -0
  20. package/{builtin → lib/builtin}/internal/Erc20.js +0 -0
  21. package/lib/builtin/internal/Erc20.js.map +1 -0
  22. package/{builtin → lib/builtin}/internal/common.d.ts +0 -0
  23. package/{builtin → lib/builtin}/internal/common.js +0 -0
  24. package/lib/builtin/internal/common.js.map +1 -0
  25. package/{builtin → lib/builtin}/internal/erc20_processor.d.ts +0 -0
  26. package/{builtin → lib/builtin}/internal/erc20_processor.js +0 -0
  27. package/lib/builtin/internal/erc20_processor.js.map +1 -0
  28. package/{builtin → lib/builtin}/internal/factories/Erc20__factory.d.ts +0 -0
  29. package/{builtin → lib/builtin}/internal/factories/Erc20__factory.js +0 -0
  30. package/lib/builtin/internal/factories/Erc20__factory.js.map +1 -0
  31. package/{builtin → lib/builtin}/internal/factories/index.d.ts +0 -0
  32. package/{builtin → lib/builtin}/internal/factories/index.js +0 -0
  33. package/{builtin → lib/builtin}/internal/factories/index.js.map +1 -1
  34. package/{builtin → lib/builtin}/internal/index.d.ts +0 -0
  35. package/{builtin → lib/builtin}/internal/index.js +0 -0
  36. package/lib/builtin/internal/index.js.map +1 -0
  37. package/{chain-config.d.ts → lib/chain-config.d.ts} +0 -0
  38. package/{chain-config.js → lib/chain-config.js} +0 -0
  39. package/lib/chain-config.js.map +1 -0
  40. package/{cli → lib/cli}/build.d.ts +0 -0
  41. package/{cli → lib/cli}/build.js +0 -0
  42. package/lib/cli/build.js.map +1 -0
  43. package/{cli → lib/cli}/cli.d.ts +0 -0
  44. package/{cli → lib/cli}/cli.js +0 -0
  45. package/lib/cli/cli.js.map +1 -0
  46. package/{cli → lib/cli}/config.d.ts +0 -0
  47. package/{cli → lib/cli}/config.js +0 -0
  48. package/lib/cli/config.js.map +1 -0
  49. package/{cli → lib/cli}/key.d.ts +0 -0
  50. package/{cli → lib/cli}/key.js +0 -0
  51. package/{cli → lib/cli}/key.js.map +1 -1
  52. package/{cli → lib/cli}/solana-code-gen.d.ts +0 -0
  53. package/{cli → lib/cli}/solana-code-gen.js +0 -0
  54. package/{cli → lib/cli}/solana-code-gen.js.map +1 -1
  55. package/{cli → lib/cli}/upload.d.ts +0 -0
  56. package/{cli → lib/cli}/upload.js +0 -0
  57. package/{cli → lib/cli}/upload.js.map +1 -1
  58. package/{cli → lib/cli}/webpack.config.js +0 -0
  59. package/{context.d.ts → lib/context.d.ts} +0 -0
  60. package/{context.js → lib/context.js} +0 -0
  61. package/lib/context.js.map +1 -0
  62. package/{contract-namer.d.ts → lib/contract-namer.d.ts} +0 -0
  63. package/{contract-namer.js → lib/contract-namer.js} +0 -0
  64. package/{contract-namer.js.map → lib/contract-namer.js.map} +1 -1
  65. package/{error.d.ts → lib/error.d.ts} +0 -0
  66. package/{error.js → lib/error.js} +0 -0
  67. package/lib/error.js.map +1 -0
  68. package/{gen → lib/gen}/builtin.d.ts +0 -0
  69. package/{gen → lib/gen}/builtin.js +0 -0
  70. package/lib/gen/builtin.js.map +1 -0
  71. package/{gen → lib/gen}/google/protobuf/empty.d.ts +0 -0
  72. package/{gen → lib/gen}/google/protobuf/empty.js +0 -0
  73. package/lib/gen/google/protobuf/empty.js.map +1 -0
  74. package/{gen → lib/gen}/processor/protos/processor.d.ts +0 -0
  75. package/{gen → lib/gen}/processor/protos/processor.js +0 -0
  76. package/lib/gen/processor/protos/processor.js.map +1 -0
  77. package/{generic-processor.d.ts → lib/generic-processor.d.ts} +0 -0
  78. package/{generic-processor.js → lib/generic-processor.js} +0 -0
  79. package/lib/generic-processor.js.map +1 -0
  80. package/{index.d.ts → lib/index.d.ts} +0 -0
  81. package/{index.js → lib/index.js} +0 -0
  82. package/lib/index.js.map +1 -0
  83. package/{meter.d.ts → lib/meter.d.ts} +0 -0
  84. package/{meter.js → lib/meter.js} +0 -0
  85. package/lib/meter.js.map +1 -0
  86. package/{numberish.d.ts → lib/numberish.d.ts} +0 -0
  87. package/{numberish.js → lib/numberish.js} +0 -0
  88. package/lib/numberish.js.map +1 -0
  89. package/{numberish.test.d.ts → lib/numberish.test.d.ts} +0 -0
  90. package/{numberish.test.js → lib/numberish.test.js} +0 -0
  91. package/{numberish.test.js.map → lib/numberish.test.js.map} +1 -1
  92. package/{processor-runner.d.ts → lib/processor-runner.d.ts} +0 -0
  93. package/{processor-runner.js → lib/processor-runner.js} +0 -0
  94. package/lib/processor-runner.js.map +1 -0
  95. package/{processor-state.d.ts → lib/processor-state.d.ts} +0 -0
  96. package/{processor-state.js → lib/processor-state.js} +0 -0
  97. package/lib/processor-state.js.map +1 -0
  98. package/{promise-or-void.d.ts → lib/promise-or-void.d.ts} +0 -0
  99. package/{promise-or-void.js → lib/promise-or-void.js} +0 -0
  100. package/lib/promise-or-void.js.map +1 -0
  101. package/{provider.d.ts → lib/provider.d.ts} +0 -0
  102. package/{provider.js → lib/provider.js} +1 -1
  103. package/lib/provider.js.map +1 -0
  104. package/{release.config.js → lib/release.config.js} +0 -0
  105. package/{service.d.ts → lib/service.d.ts} +0 -0
  106. package/{service.js → lib/service.js} +0 -0
  107. package/lib/service.js.map +1 -0
  108. package/{solana → lib/solana}/builtin/index.d.ts +0 -0
  109. package/{solana → lib/solana}/builtin/index.js +0 -0
  110. package/lib/solana/builtin/index.js.map +1 -0
  111. package/{solana → lib/solana}/builtin/spl-token-processor.d.ts +0 -0
  112. package/{solana → lib/solana}/builtin/spl-token-processor.js +0 -0
  113. package/lib/solana/builtin/spl-token-processor.js.map +1 -0
  114. package/{solana → lib/solana}/builtin/types.d.ts +0 -0
  115. package/{solana → lib/solana}/builtin/types.js +0 -0
  116. package/lib/solana/builtin/types.js.map +1 -0
  117. package/{solana → lib/solana}/builtin/wormhole-processor.d.ts +0 -0
  118. package/{solana → lib/solana}/builtin/wormhole-processor.js +0 -0
  119. package/lib/solana/builtin/wormhole-processor.js.map +1 -0
  120. package/{solana-processor.d.ts → lib/solana-processor.d.ts} +0 -0
  121. package/{solana-processor.js → lib/solana-processor.js} +0 -0
  122. package/lib/solana-processor.js.map +1 -0
  123. package/{target-ethers-sentio → lib/target-ethers-sentio}/codegen.d.ts +0 -0
  124. package/{target-ethers-sentio → lib/target-ethers-sentio}/codegen.js +0 -0
  125. package/{target-ethers-sentio → lib/target-ethers-sentio}/codegen.js.map +0 -0
  126. package/{target-ethers-sentio → lib/target-ethers-sentio}/index.d.ts +0 -0
  127. package/{target-ethers-sentio → lib/target-ethers-sentio}/index.js +0 -0
  128. package/{target-ethers-sentio → lib/target-ethers-sentio}/index.js.map +0 -0
  129. package/{test → lib/test}/codegen.test.d.ts +0 -0
  130. package/{test → lib/test}/codegen.test.js +4 -8
  131. package/lib/test/codegen.test.js.map +1 -0
  132. package/{test → lib/test}/erc20-template.d.ts +0 -0
  133. package/{test → lib/test}/erc20-template.js +0 -0
  134. package/lib/test/erc20-template.js.map +1 -0
  135. package/{test → lib/test}/erc20-template.test.d.ts +0 -0
  136. package/{test → lib/test}/erc20-template.test.js +0 -0
  137. package/{test → lib/test}/erc20-template.test.js.map +1 -1
  138. package/{test → lib/test}/erc20.d.ts +0 -0
  139. package/{test → lib/test}/erc20.js +0 -0
  140. package/lib/test/erc20.js.map +1 -0
  141. package/{test → lib/test}/erc20.test.d.ts +0 -0
  142. package/{test → lib/test}/erc20.test.js +0 -0
  143. package/{test → lib/test}/erc20.test.js.map +1 -1
  144. package/{test → lib/test}/generic-processor.test.d.ts +0 -0
  145. package/{test → lib/test}/generic-processor.test.js +11 -1
  146. package/lib/test/generic-processor.test.js.map +1 -0
  147. package/{test → lib/test}/index.d.ts +0 -0
  148. package/{test → lib/test}/index.js +0 -0
  149. package/{test → lib/test}/index.js.map +1 -1
  150. package/{test → lib/test}/metric-utils.d.ts +0 -0
  151. package/{test → lib/test}/metric-utils.js +0 -0
  152. package/lib/test/metric-utils.js.map +1 -0
  153. package/{test → lib/test}/mirrorworld.d.ts +0 -0
  154. package/{test → lib/test}/mirrorworld.js +0 -0
  155. package/{test → lib/test}/mirrorworld.js.map +1 -1
  156. package/{test → lib/test}/solana.test.d.ts +0 -0
  157. package/{test → lib/test}/solana.test.js +0 -0
  158. package/lib/test/solana.test.js.map +1 -0
  159. package/{test → lib/test}/test-processor-server.d.ts +0 -0
  160. package/{test → lib/test}/test-processor-server.js +0 -0
  161. package/lib/test/test-processor-server.js.map +1 -0
  162. package/{test → lib/test}/types/game_wallet.d.ts +0 -0
  163. package/{test → lib/test}/types/game_wallet.js +0 -0
  164. package/lib/test/types/game_wallet.js.map +1 -0
  165. package/{test → lib/test}/types/game_wallet_processor.d.ts +0 -0
  166. package/{test → lib/test}/types/game_wallet_processor.js +0 -0
  167. package/lib/test/types/game_wallet_processor.js.map +1 -0
  168. package/{test → lib/test}/wormhole-token-bridge.d.ts +0 -0
  169. package/{test → lib/test}/wormhole-token-bridge.js +0 -0
  170. package/lib/test/wormhole-token-bridge.js.map +1 -0
  171. package/{utils → lib/utils}/chainmap.d.ts +0 -0
  172. package/{utils → lib/utils}/chainmap.js +0 -0
  173. package/lib/utils/chainmap.js.map +1 -0
  174. package/{utils → lib/utils}/convert.d.ts +0 -0
  175. package/{utils → lib/utils}/convert.js +0 -0
  176. package/lib/utils/convert.js.map +1 -0
  177. package/{utils → lib/utils}/index.d.ts +0 -0
  178. package/{utils → lib/utils}/index.js +0 -0
  179. package/lib/utils/index.js.map +1 -0
  180. package/package.json +47 -6
  181. package/src/abis/erc20.json +198 -0
  182. package/src/base-processor-template.ts +92 -0
  183. package/src/base-processor.ts +128 -0
  184. package/src/bind-options.ts +41 -0
  185. package/src/binds.ts +73 -0
  186. package/src/builtin/erc20/index.ts +6 -0
  187. package/src/builtin/erc20/test-utils.ts +49 -0
  188. package/src/builtin/internal/Erc20.ts +356 -0
  189. package/src/builtin/internal/common.ts +46 -0
  190. package/src/builtin/internal/erc20_processor.ts +295 -0
  191. package/src/builtin/internal/factories/Erc20__factory.ts +216 -0
  192. package/src/builtin/internal/factories/index.ts +4 -0
  193. package/src/builtin/internal/index.ts +6 -0
  194. package/src/chain-config.ts +6 -0
  195. package/src/cli/build.ts +180 -0
  196. package/src/cli/cli.ts +217 -0
  197. package/src/cli/config.ts +43 -0
  198. package/src/cli/key.ts +43 -0
  199. package/src/cli/solana-code-gen.ts +16 -0
  200. package/src/cli/upload.ts +86 -0
  201. package/src/cli/webpack.config.js +42 -0
  202. package/src/context.ts +93 -0
  203. package/src/contract-namer.ts +17 -0
  204. package/src/error.ts +43 -0
  205. package/src/gen/builtin.ts +22 -0
  206. package/src/gen/google/protobuf/empty.ts +70 -0
  207. package/src/gen/processor/protos/processor.ts +3071 -0
  208. package/src/generic-processor.ts +38 -0
  209. package/src/index.ts +19 -0
  210. package/src/meter.ts +122 -0
  211. package/src/numberish.test.ts +82 -0
  212. package/src/numberish.ts +99 -0
  213. package/src/processor-runner.ts +75 -0
  214. package/src/processor-state.ts +24 -0
  215. package/src/promise-or-void.ts +1 -0
  216. package/src/provider.ts +74 -0
  217. package/src/service.ts +434 -0
  218. package/src/solana/builtin/index.ts +2 -0
  219. package/src/solana/builtin/spl-token-processor.ts +164 -0
  220. package/src/solana/builtin/types.ts +268 -0
  221. package/src/solana/builtin/wormhole-processor.ts +178 -0
  222. package/src/solana-processor.ts +105 -0
  223. package/src/target-ethers-sentio/codegen.ts +289 -0
  224. package/src/target-ethers-sentio/index.ts +50 -0
  225. package/src/target-ethers-sentio/tsconfig.json +9 -0
  226. package/src/test/abis/evm/anyswapRouter.json +490 -0
  227. package/src/test/abis/solana/mirrorworld.json +1392 -0
  228. package/src/test/codegen.test.ts +26 -0
  229. package/src/test/erc20-template.test.ts +39 -0
  230. package/src/test/erc20-template.ts +25 -0
  231. package/src/test/erc20.test.ts +92 -0
  232. package/src/test/erc20.ts +48 -0
  233. package/src/test/generic-processor.test.ts +72 -0
  234. package/src/test/index.ts +1 -0
  235. package/src/test/metric-utils.ts +49 -0
  236. package/src/test/mirrorworld.ts +40 -0
  237. package/src/test/sentio.yaml +4 -0
  238. package/src/test/solana.test.ts +93 -0
  239. package/src/test/test-processor-server.ts +210 -0
  240. package/src/test/types/game_wallet.ts +1392 -0
  241. package/src/test/types/game_wallet_processor.ts +113 -0
  242. package/src/test/wormhole-token-bridge.ts +21 -0
  243. package/src/types/global.d.ts +17 -0
  244. package/src/utils/chainmap.ts +95 -0
  245. package/src/utils/convert.ts +6 -0
  246. package/src/utils/index.ts +2 -0
  247. package/base-processor-template.js.map +0 -1
  248. package/base-processor.js.map +0 -1
  249. package/bind-options.js.map +0 -1
  250. package/binds.js.map +0 -1
  251. package/builtin/erc20/index.js.map +0 -1
  252. package/builtin/erc20/test-utils.js.map +0 -1
  253. package/builtin/internal/Erc20.js.map +0 -1
  254. package/builtin/internal/common.js.map +0 -1
  255. package/builtin/internal/erc20_processor.js.map +0 -1
  256. package/builtin/internal/factories/Erc20__factory.js.map +0 -1
  257. package/builtin/internal/index.js.map +0 -1
  258. package/chain-config.js.map +0 -1
  259. package/cli/build.js.map +0 -1
  260. package/cli/cli.js.map +0 -1
  261. package/cli/config.js.map +0 -1
  262. package/context.js.map +0 -1
  263. package/error.js.map +0 -1
  264. package/gen/builtin.js.map +0 -1
  265. package/gen/google/protobuf/empty.js.map +0 -1
  266. package/gen/processor/protos/processor.js.map +0 -1
  267. package/generic-processor.js.map +0 -1
  268. package/index.js.map +0 -1
  269. package/meter.js.map +0 -1
  270. package/numberish.js.map +0 -1
  271. package/processor-runner.js.map +0 -1
  272. package/processor-state.js.map +0 -1
  273. package/promise-or-void.js.map +0 -1
  274. package/provider.js.map +0 -1
  275. package/service.js.map +0 -1
  276. package/solana/builtin/index.js.map +0 -1
  277. package/solana/builtin/spl-token-processor.js.map +0 -1
  278. package/solana/builtin/types.js.map +0 -1
  279. package/solana/builtin/wormhole-processor.js.map +0 -1
  280. package/solana-processor.js.map +0 -1
  281. package/test/codegen.test.js.map +0 -1
  282. package/test/erc20-template.js.map +0 -1
  283. package/test/erc20.js.map +0 -1
  284. package/test/generic-processor.test.js.map +0 -1
  285. package/test/metric-utils.js.map +0 -1
  286. package/test/solana.test.js.map +0 -1
  287. package/test/test-processor-server.js.map +0 -1
  288. package/test/types/game_wallet.js.map +0 -1
  289. package/test/types/game_wallet_processor.js.map +0 -1
  290. package/test/wormhole-token-bridge.js.map +0 -1
  291. package/utils/chainmap.js.map +0 -1
  292. package/utils/convert.js.map +0 -1
  293. package/utils/index.js.map +0 -1
package/src/cli/cli.ts ADDED
@@ -0,0 +1,217 @@
1
+ #!/usr/bin/env node
2
+
3
+ import commandLineArgs from 'command-line-args'
4
+ import commandLineUsage from 'command-line-usage'
5
+ import fs from 'fs'
6
+ import https from 'https'
7
+ import http from 'http'
8
+ import path from 'path'
9
+
10
+ import yaml from 'js-yaml'
11
+ import { EVM, FinalizeHost, FinalizeProjectName, SentioProjectConfig } from './config'
12
+ import { WriteKey } from './key'
13
+ import { uploadFile } from './upload'
14
+ import chalk from 'chalk'
15
+ import { buildProcessor } from './build'
16
+
17
+ const mainDefinitions = [{ name: 'command', defaultOption: true }]
18
+ const mainOptions = commandLineArgs(mainDefinitions, {
19
+ stopAtFirstUnknown: true,
20
+ })
21
+ const argv = mainOptions._unknown || []
22
+
23
+ // Process configs
24
+ let processorConfig: SentioProjectConfig = { host: '', project: '', source: '', build: true, targets: [] }
25
+ // Fist step, read from project yaml file
26
+ try {
27
+ console.log(chalk.blue('Loading Process config'))
28
+ // TODO correctly located sentio.yaml
29
+ const pwd = process.cwd()
30
+ const packageJson = path.join(pwd, 'package.json')
31
+ if (!fs.existsSync(packageJson)) {
32
+ console.error('package.json not found, please run this command in the root of your project')
33
+ process.exit(1)
34
+ }
35
+
36
+ const yamlPath = path.join(pwd, 'sentio.yaml')
37
+ if (!fs.existsSync(yamlPath)) {
38
+ console.error('sentio.yaml not found, please create one according to: TODO docs')
39
+ process.exit(1)
40
+ }
41
+
42
+ processorConfig = yaml.load(fs.readFileSync('sentio.yaml', 'utf8')) as SentioProjectConfig
43
+ if (!processorConfig.project === undefined) {
44
+ console.error('Config yaml must have contain a valid project identifier')
45
+ process.exit(1)
46
+ }
47
+ if (processorConfig.build === undefined) {
48
+ processorConfig.build = true
49
+ }
50
+ if (!processorConfig.host) {
51
+ processorConfig.host = 'prod'
52
+ }
53
+
54
+ if (!processorConfig.source) {
55
+ processorConfig.source = 'src/processor.ts'
56
+ }
57
+ if (!processorConfig.targets) {
58
+ console.warn('targets is not defined, use EVM as the default target')
59
+ processorConfig.targets = []
60
+ }
61
+ if (processorConfig.targets.length === 0) {
62
+ // By default evm
63
+ processorConfig.targets.push({ chain: EVM })
64
+ }
65
+ } catch (e) {
66
+ console.error(e)
67
+ process.exit(1)
68
+ }
69
+
70
+ if (mainOptions.command === 'upload') {
71
+ const optionDefinitions = [
72
+ {
73
+ name: 'help',
74
+ alias: 'h',
75
+ type: Boolean,
76
+ description: 'Display this usage guide.',
77
+ },
78
+ {
79
+ name: 'api-key',
80
+ type: String,
81
+ description: '(Optional) Manually provide API key rather than use saved credential',
82
+ },
83
+ {
84
+ name: 'host',
85
+ description: '(Optional) Override Sentio Host name',
86
+ type: String,
87
+ },
88
+ {
89
+ name: 'owner',
90
+ description: '(Optional) Override Project owner',
91
+ type: String,
92
+ },
93
+ {
94
+ name: 'nobuild',
95
+ description: '(Optional) Skip build & pack file before uploading, default false',
96
+ type: Boolean,
97
+ },
98
+ ]
99
+ const options = commandLineArgs(optionDefinitions, { argv })
100
+ if (options.help) {
101
+ const usage = commandLineUsage([
102
+ {
103
+ header: 'Sentio upload',
104
+ content: 'Upload your project files to Sentio.',
105
+ },
106
+ {
107
+ header: 'Options',
108
+ optionList: optionDefinitions,
109
+ },
110
+ ])
111
+ console.log(usage)
112
+ } else {
113
+ if (options.host) {
114
+ processorConfig.host = options.host
115
+ }
116
+ if (options.nobuild) {
117
+ processorConfig.build = false
118
+ }
119
+ FinalizeHost(processorConfig)
120
+ FinalizeProjectName(processorConfig, options.owner)
121
+ console.log(processorConfig)
122
+
123
+ let apiOverride = undefined
124
+ if (options['api-key']) {
125
+ apiOverride = options['api-key']
126
+ }
127
+ uploadFile(processorConfig, apiOverride)
128
+ }
129
+ } else if (mainOptions.command === 'login') {
130
+ const optionDefinitions = [
131
+ {
132
+ name: 'help',
133
+ alias: 'h',
134
+ type: Boolean,
135
+ description: 'Display this usage guide.',
136
+ },
137
+ {
138
+ name: 'api-key',
139
+ type: String,
140
+ description: '(Required) Your API key',
141
+ },
142
+ {
143
+ name: 'host',
144
+ description: '(Optional) Override Sentio Host name',
145
+ type: String,
146
+ },
147
+ ]
148
+ const options = commandLineArgs(optionDefinitions, { argv })
149
+
150
+ if (options.help || !options['api-key']) {
151
+ const usage = commandLineUsage([
152
+ {
153
+ header: 'Sentio login',
154
+ content: 'Try login to Sentio with your apikey.',
155
+ },
156
+ {
157
+ header: 'Options',
158
+ optionList: optionDefinitions,
159
+ },
160
+ ])
161
+ console.log(usage)
162
+ } else {
163
+ if (options.host) {
164
+ processorConfig.host = options.host
165
+ }
166
+ FinalizeHost(processorConfig)
167
+ console.log(processorConfig)
168
+
169
+ const url = new URL(processorConfig.host)
170
+ const reqOptions = {
171
+ hostname: url.hostname,
172
+ port: url.port,
173
+ path: '/api/v1/processors/check_key',
174
+ method: 'HEAD',
175
+ headers: {
176
+ 'api-key': options['api-key'],
177
+ },
178
+ }
179
+ const h = url.protocol == 'https:' ? https : http
180
+ const req = h.request(reqOptions, (res) => {
181
+ if (res.statusCode == 200) {
182
+ WriteKey(processorConfig.host, options['api-key'])
183
+ console.log(chalk.green('login success'))
184
+ } else {
185
+ console.error(chalk.red('login failed, code:', res.statusCode, res.statusMessage))
186
+ }
187
+ })
188
+
189
+ req.on('error', (error) => {
190
+ console.error(error)
191
+ })
192
+
193
+ req.end()
194
+ }
195
+ } else if (mainOptions.command === 'build') {
196
+ buildProcessor(false, processorConfig.targets)
197
+ } else if (mainOptions.command === 'gen') {
198
+ buildProcessor(true, processorConfig.targets)
199
+ } else {
200
+ const usage = commandLineUsage([
201
+ {
202
+ header: 'Sentio',
203
+ content: 'Login & Upload your project files to Sentio.',
204
+ },
205
+ {
206
+ header: 'Usage',
207
+ content: [
208
+ 'sentio $command --help\t\tshow detail usage of specific command',
209
+ 'sentio login --api-key=xx\t\tsave credential to local',
210
+ 'sentio upload\t\t\t\tbuild and upload processor to sentio',
211
+ 'sentio gen\t\t\t\tgenerate abi',
212
+ 'sentio build\t\t\t\tgenerate abi and build',
213
+ ],
214
+ },
215
+ ])
216
+ console.log(usage)
217
+ }
@@ -0,0 +1,43 @@
1
+ export interface SentioProjectConfig {
2
+ project: string
3
+ host: string
4
+ source: string
5
+ build: boolean
6
+ targets: Target[]
7
+ }
8
+
9
+ export function FinalizeHost(config: SentioProjectConfig) {
10
+ switch (config.host) {
11
+ case '':
12
+ case 'prod':
13
+ config.host = 'https://app.sentio.xyz'
14
+ break
15
+ case 'test':
16
+ config.host = 'https://test.sentio.xyz'
17
+ break
18
+ case 'staging':
19
+ config.host = 'https://staging.sentio.xyz'
20
+ break
21
+ case 'local':
22
+ config.host = 'http://localhost:10000'
23
+ }
24
+ }
25
+
26
+ export function FinalizeProjectName(config: SentioProjectConfig, owner: string | undefined) {
27
+ if (owner) {
28
+ let name = config.project
29
+ if (name.includes('/')) {
30
+ name = config.project.split('/')[1]
31
+ }
32
+ config.project = [owner, name].join('/')
33
+ }
34
+ }
35
+
36
+ export interface Target {
37
+ chain: string
38
+ abisDir?: string
39
+ }
40
+
41
+ // Supported target chain, lower case
42
+ export const EVM = 'evm'
43
+ export const SOLANA = 'solana'
package/src/cli/key.ts ADDED
@@ -0,0 +1,43 @@
1
+ import path from 'path'
2
+ import fs from 'fs'
3
+ import os from 'os'
4
+
5
+ const homeDir = os.homedir()
6
+ const sentioDir = path.join(homeDir, '.sentio')
7
+ const configFile = path.join(sentioDir, 'config.json')
8
+
9
+ interface SentioKeyConfig {
10
+ [key: string]: {
11
+ api_keys: string
12
+ }
13
+ }
14
+
15
+ export function WriteKey(host: string, api_key: string) {
16
+ const sentioDir = path.join(homeDir, '.sentio')
17
+ if (!fs.existsSync(sentioDir)) {
18
+ fs.mkdirSync(sentioDir, { recursive: true })
19
+ }
20
+ let config: SentioKeyConfig = {}
21
+ if (fs.existsSync(configFile)) {
22
+ const content = fs.readFileSync(configFile, 'utf8')
23
+ config = JSON.parse(content)
24
+ }
25
+ const hostConfig = config[host] || { api_keys: {} }
26
+ hostConfig.api_keys = api_key
27
+ config[host] = hostConfig
28
+ fs.writeFileSync(configFile, JSON.stringify(config, null, 2))
29
+ }
30
+
31
+ export function ReadKey(host: string): string | undefined {
32
+ if (!fs.existsSync(sentioDir)) {
33
+ return undefined
34
+ }
35
+ const configFile = path.join(sentioDir, 'config.json')
36
+ if (fs.existsSync(configFile)) {
37
+ const content = fs.readFileSync(configFile, 'utf8')
38
+ const config = JSON.parse(content)
39
+ return config[host]?.api_keys
40
+ } else {
41
+ return undefined
42
+ }
43
+ }
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { codeGenSolanaProcessor } from './build'
4
+
5
+ const abisDir = 'abis/solana'
6
+ if (process.argv.length > 2) {
7
+ const rootPath = process.argv[2]
8
+ if (process.argv.length > 3) {
9
+ const targetPath = process.argv[3]
10
+ codeGenSolanaProcessor(abisDir, rootPath, targetPath)
11
+ } else {
12
+ codeGenSolanaProcessor(abisDir, rootPath)
13
+ }
14
+ } else {
15
+ codeGenSolanaProcessor(abisDir)
16
+ }
@@ -0,0 +1,86 @@
1
+ import { execSync } from 'child_process'
2
+ import { createHash } from 'crypto'
3
+ import FormData from 'form-data'
4
+ import fs from 'fs'
5
+ import { SentioProjectConfig } from './config'
6
+ import { ReadKey } from './key'
7
+ import path from 'path'
8
+ import chalk from 'chalk'
9
+ import { buildProcessor } from './build'
10
+ import fetch from 'node-fetch'
11
+
12
+ export async function uploadFile(options: SentioProjectConfig, apiKeyOverride: string) {
13
+ if (options.build) {
14
+ await buildProcessor(false, options.targets)
15
+ }
16
+
17
+ console.log(chalk.blue('Uploading'))
18
+
19
+ const PROCESSOR_FILE = path.join(process.cwd(), 'dist/lib.js')
20
+
21
+ const url = new URL(options.host)
22
+ const apiKey = apiKeyOverride || ReadKey(options.host)
23
+
24
+ const isProd = options.host === 'https://app.sentio.xyz'
25
+ if (!apiKey) {
26
+ const cmd = isProd ? 'sentio login' : 'sentio login --host=' + options.host
27
+ console.error(chalk.red('No Credential found for', options.host, '. Please run `' + cmd + '`.'))
28
+ process.exit(1)
29
+ }
30
+
31
+ if (!fs.existsSync(PROCESSOR_FILE)) {
32
+ console.error(chalk.red('File not existed ', PROCESSOR_FILE, "don't use --nobuild"))
33
+ process.exit(1)
34
+ }
35
+
36
+ const stat = fs.statSync(PROCESSOR_FILE)
37
+ console.log('Packed processor file size', Math.floor(stat.size / 1024) + 'K, last modified', stat.mtime)
38
+ const content = fs.readFileSync(PROCESSOR_FILE)
39
+ const hash = createHash('sha256')
40
+ hash.update(content)
41
+ const digest = hash.digest('hex')
42
+
43
+ const data = new FormData()
44
+ data.append('attachment', fs.createReadStream(PROCESSOR_FILE))
45
+ data.append('sha256', digest)
46
+
47
+ let commitSha
48
+ try {
49
+ commitSha = execSync('git rev-parse HEAD').toString().trim()
50
+ data.append('commitSha', commitSha)
51
+ } catch (e) {
52
+ chalk.yellow(e)
53
+ }
54
+
55
+ url.pathname = '/api/v1/processors'
56
+
57
+ let packageJson: { version: string }
58
+ try {
59
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
60
+ packageJson = require('../package.json')
61
+ } catch (e) {
62
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
63
+ packageJson = require('../../package.json')
64
+ }
65
+
66
+ const res = await fetch(url, {
67
+ method: 'POST',
68
+ headers: {
69
+ 'api-key': apiKey,
70
+ project: options.project,
71
+ version: packageJson.version,
72
+ },
73
+ body: data,
74
+ })
75
+
76
+ if (res.ok) {
77
+ console.log(chalk.green('Upload success: '))
78
+ console.log('\t', chalk.blue('sha256:'), digest)
79
+ if (commitSha) {
80
+ console.log('\t', chalk.blue('Git commit SHA:'), commitSha)
81
+ }
82
+ } else {
83
+ console.error(chalk.red('Upload Failed'))
84
+ console.error(chalk.red(await res.text()))
85
+ }
86
+ }
@@ -0,0 +1,42 @@
1
+ /* eslint-disable */
2
+ const path = require('path')
3
+
4
+ module.exports = {
5
+ entry: {
6
+ lib: './src/processor.ts',
7
+ },
8
+ devtool: 'inline-source-map',
9
+ module: {
10
+ rules: [
11
+ {
12
+ test: /\.tsx?$/,
13
+ use: 'ts-loader',
14
+ exclude: /node_modules/,
15
+ },
16
+ ],
17
+ },
18
+ resolve: {
19
+ extensions: ['.ts', '.js'],
20
+ },
21
+ output: {
22
+ filename: '[name].js',
23
+ path: path.resolve(process.cwd(), 'dist'),
24
+ },
25
+ target: 'node',
26
+ mode: 'production',
27
+ externals: [
28
+ {
29
+ ethers: 'commonjs2 ethers',
30
+ '@sentio/sdk': 'root sentio_sdk',
31
+ bs58: 'commonjs2 bs58',
32
+ "bignumber.js": 'commonjs2 bignumber.js',
33
+ 'bn.js': 'commonjs2 bn.js',
34
+ },
35
+ function ({ context, request }, callback) {
36
+ if (/^@(ethersproject|solana|project-serum).*$/.test(request)) {
37
+ return callback(null, 'commonjs ' + request)
38
+ }
39
+ callback()
40
+ },
41
+ ],
42
+ }
package/src/context.ts ADDED
@@ -0,0 +1,93 @@
1
+ import { CounterResult, GaugeResult } from './gen/processor/protos/processor'
2
+ import { BaseContract, EventFilter } from 'ethers'
3
+ import { Block, Log } from '@ethersproject/abstract-provider'
4
+ import { Meter } from './meter'
5
+ import Long from 'long'
6
+
7
+ export class EthContext {
8
+ chainId: number
9
+ log?: Log
10
+ block?: Block
11
+ blockNumber: Long
12
+ gauges: GaugeResult[] = []
13
+ counters: CounterResult[] = []
14
+ meter: Meter
15
+
16
+ constructor(chainId: number, block?: Block, log?: Log) {
17
+ this.chainId = chainId
18
+ this.log = log
19
+ this.block = block
20
+ if (log) {
21
+ this.blockNumber = Long.fromNumber(log.blockNumber)
22
+ } else if (block) {
23
+ this.blockNumber = Long.fromNumber(block.number)
24
+ }
25
+ this.meter = new Meter(this)
26
+ }
27
+ }
28
+
29
+ export class Context<
30
+ TContract extends BaseContract,
31
+ TContractBoundView extends BoundContractView<TContract, ContractView<TContract>>
32
+ > extends EthContext {
33
+ contract: TContractBoundView
34
+
35
+ constructor(view: TContractBoundView, chainId: number, block?: Block, log?: Log) {
36
+ super(chainId, block, log)
37
+ view.context = this
38
+ this.contract = view
39
+ }
40
+ }
41
+
42
+ export class ContractView<TContract extends BaseContract> {
43
+ filters: { [name: string]: (...args: Array<any>) => EventFilter }
44
+ protected contract: TContract
45
+
46
+ constructor(contract: TContract) {
47
+ this.contract = contract
48
+ this.filters = contract.filters
49
+ }
50
+
51
+ get rawContract() {
52
+ return this.contract
53
+ }
54
+
55
+ get provider() {
56
+ return this.contract.provider
57
+ }
58
+ }
59
+
60
+ export class BoundContractView<TContract extends BaseContract, TContractView extends ContractView<TContract>> {
61
+ protected view: TContractView
62
+ // context will be set right after context creation (in context's constructor)
63
+ context: Context<TContract, BoundContractView<TContract, TContractView>>
64
+
65
+ constructor(view: TContractView) {
66
+ this.view = view
67
+ }
68
+
69
+ get rawContract() {
70
+ return this.view.rawContract
71
+ }
72
+
73
+ get provider() {
74
+ return this.view.provider
75
+ }
76
+
77
+ get filters() {
78
+ return this.view.filters
79
+ }
80
+ }
81
+
82
+ export class SolanaContext {
83
+ gauges: GaugeResult[] = []
84
+ counters: CounterResult[] = []
85
+ meter: Meter
86
+
87
+ address: string
88
+
89
+ constructor(address: string) {
90
+ this.meter = new Meter(this)
91
+ this.address = address
92
+ }
93
+ }
@@ -0,0 +1,17 @@
1
+ export class ContractNamer {
2
+ defaultName: string
3
+ counter: number
4
+
5
+ constructor(defaultName: string) {
6
+ this.defaultName = defaultName
7
+ this.counter = 0
8
+ }
9
+
10
+ public nextName(): string {
11
+ const id = this.counter++
12
+ if (id > 0) {
13
+ return this.defaultName + '_' + id
14
+ }
15
+ return this.defaultName
16
+ }
17
+ }
package/src/error.ts ADDED
@@ -0,0 +1,43 @@
1
+ // Transform error in more readable format
2
+ import { Context } from './context'
3
+ import { errors } from 'ethers'
4
+
5
+ class EthersError extends Error {
6
+ constructor(message: string, stack?: string) {
7
+ super(message)
8
+ this.stack = stack
9
+ }
10
+
11
+ toString() {
12
+ return this.message + '\n' + this.stack?.toString()
13
+ }
14
+ }
15
+
16
+ export function transformEtherError(e: Error, ctx: Context<any, any> | undefined): Error {
17
+ let msg = ''
18
+ // @ts-ignore expected error fields
19
+ if (e.code === errors.CALL_EXCEPTION) {
20
+ // @ts-ignore expected error fields
21
+ if (e.data === '0x') {
22
+ if (ctx) {
23
+ msg =
24
+ "jsonrpc eth_call return '0x' (likely contract not existed) at chain " +
25
+ ctx.chainId +
26
+ ': ' +
27
+ JSON.stringify(e)
28
+ } else {
29
+ msg = "jsonrpc eth_call return '0x' (likely contract not existed): " + JSON.stringify(e)
30
+ }
31
+ }
32
+ return new EthersError(msg, e.stack)
33
+ }
34
+
35
+ if (e instanceof EthersError) {
36
+ return e
37
+ }
38
+
39
+ // TODO gracefully handle more errors
40
+
41
+ msg = 'ethers call error\n' + e.message + '\n' + e.stack?.toString()
42
+ return new Error(msg)
43
+ }
@@ -0,0 +1,22 @@
1
+ import Long from 'long'
2
+
3
+ type Builtin =
4
+ | Date
5
+ | Function
6
+ | Uint8Array
7
+ | string
8
+ | number
9
+ | boolean
10
+ | undefined;
11
+
12
+ export type DeepPartial<T> = T extends Builtin
13
+ ? T
14
+ : T extends Long
15
+ ? string | number | Long
16
+ : T extends Array<infer U>
17
+ ? Array<DeepPartial<U>>
18
+ : T extends ReadonlyArray<infer U>
19
+ ? ReadonlyArray<DeepPartial<U>>
20
+ : T extends {}
21
+ ? { [K in keyof T]?: DeepPartial<T[K]> }
22
+ : Partial<T>;
@@ -0,0 +1,70 @@
1
+ /* eslint-disable */
2
+ import Long from "long";
3
+ import _m0 from "protobufjs/minimal";
4
+
5
+ export interface Empty {}
6
+
7
+ function createBaseEmpty(): Empty {
8
+ return {};
9
+ }
10
+
11
+ export const Empty = {
12
+ encode(_: Empty, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
13
+ return writer;
14
+ },
15
+
16
+ decode(input: _m0.Reader | Uint8Array, length?: number): Empty {
17
+ const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
18
+ let end = length === undefined ? reader.len : reader.pos + length;
19
+ const message = createBaseEmpty();
20
+ while (reader.pos < end) {
21
+ const tag = reader.uint32();
22
+ switch (tag >>> 3) {
23
+ default:
24
+ reader.skipType(tag & 7);
25
+ break;
26
+ }
27
+ }
28
+ return message;
29
+ },
30
+
31
+ fromJSON(_: any): Empty {
32
+ return {};
33
+ },
34
+
35
+ toJSON(_: Empty): unknown {
36
+ const obj: any = {};
37
+ return obj;
38
+ },
39
+
40
+ fromPartial(_: DeepPartial<Empty>): Empty {
41
+ const message = createBaseEmpty();
42
+ return message;
43
+ },
44
+ };
45
+
46
+ type Builtin =
47
+ | Date
48
+ | Function
49
+ | Uint8Array
50
+ | string
51
+ | number
52
+ | boolean
53
+ | undefined;
54
+
55
+ type DeepPartial<T> = T extends Builtin
56
+ ? T
57
+ : T extends Long
58
+ ? string | number | Long
59
+ : T extends Array<infer U>
60
+ ? Array<DeepPartial<U>>
61
+ : T extends ReadonlyArray<infer U>
62
+ ? ReadonlyArray<DeepPartial<U>>
63
+ : T extends {}
64
+ ? { [K in keyof T]?: DeepPartial<T[K]> }
65
+ : Partial<T>;
66
+
67
+ if (_m0.util.Long !== Long) {
68
+ _m0.util.Long = Long as any;
69
+ _m0.configure();
70
+ }