@sentio/sdk 2.35.0 → 2.36.0-rc.1

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 (85) hide show
  1. package/lib/aptos/aptos-plugin.d.ts.map +1 -1
  2. package/lib/aptos/aptos-plugin.js +30 -20
  3. package/lib/aptos/aptos-plugin.js.map +1 -1
  4. package/lib/eth/binds.d.ts +2 -2
  5. package/lib/eth/binds.d.ts.map +1 -1
  6. package/lib/eth/binds.js +4 -4
  7. package/lib/eth/binds.js.map +1 -1
  8. package/lib/eth/codegen/codegen.js +2 -0
  9. package/lib/eth/codegen/codegen.js.map +1 -1
  10. package/lib/eth/codegen/ethers-sentio.d.ts.map +1 -1
  11. package/lib/eth/codegen/ethers-sentio.js +2 -0
  12. package/lib/eth/codegen/ethers-sentio.js.map +1 -1
  13. package/lib/eth/eth-plugin.js +2 -2
  14. package/lib/eth/eth-plugin.js.map +1 -1
  15. package/lib/fuel/base-processor.d.ts +13 -0
  16. package/lib/fuel/base-processor.d.ts.map +1 -0
  17. package/lib/fuel/base-processor.js +26 -0
  18. package/lib/fuel/base-processor.js.map +1 -0
  19. package/lib/fuel/codegen/codegen.d.ts +2 -0
  20. package/lib/fuel/codegen/codegen.d.ts.map +1 -0
  21. package/lib/fuel/codegen/codegen.js +132 -0
  22. package/lib/fuel/codegen/codegen.js.map +1 -0
  23. package/lib/fuel/codegen/index.d.ts +2 -0
  24. package/lib/fuel/codegen/index.d.ts.map +1 -0
  25. package/lib/fuel/codegen/index.js +2 -0
  26. package/lib/fuel/codegen/index.js.map +1 -0
  27. package/lib/fuel/codegen/run.d.ts +2 -0
  28. package/lib/fuel/codegen/run.d.ts.map +1 -0
  29. package/lib/fuel/codegen/run.js +11 -0
  30. package/lib/fuel/codegen/run.js.map +1 -0
  31. package/lib/fuel/codegen/utils.d.ts +2 -0
  32. package/lib/fuel/codegen/utils.d.ts.map +1 -0
  33. package/lib/fuel/codegen/utils.js +4 -0
  34. package/lib/fuel/codegen/utils.js.map +1 -0
  35. package/lib/fuel/context.d.ts +14 -0
  36. package/lib/fuel/context.d.ts.map +1 -0
  37. package/lib/fuel/context.js +27 -0
  38. package/lib/fuel/context.js.map +1 -0
  39. package/lib/fuel/fuel-plugin.d.ts +17 -0
  40. package/lib/fuel/fuel-plugin.d.ts.map +1 -0
  41. package/lib/fuel/fuel-plugin.js +96 -0
  42. package/lib/fuel/fuel-plugin.js.map +1 -0
  43. package/lib/fuel/fuel-processor.d.ts +32 -0
  44. package/lib/fuel/fuel-processor.d.ts.map +1 -0
  45. package/lib/fuel/fuel-processor.js +94 -0
  46. package/lib/fuel/fuel-processor.js.map +1 -0
  47. package/lib/fuel/index.d.ts +7 -0
  48. package/lib/fuel/index.d.ts.map +1 -0
  49. package/lib/fuel/index.js +7 -0
  50. package/lib/fuel/index.js.map +1 -0
  51. package/lib/fuel/network.d.ts +8 -0
  52. package/lib/fuel/network.d.ts.map +1 -0
  53. package/lib/fuel/network.js +14 -0
  54. package/lib/fuel/network.js.map +1 -0
  55. package/lib/fuel/transaction.d.ts +8 -0
  56. package/lib/fuel/transaction.d.ts.map +1 -0
  57. package/lib/fuel/transaction.js +23 -0
  58. package/lib/fuel/transaction.js.map +1 -0
  59. package/lib/testing/fuel-facet.d.ts +9 -0
  60. package/lib/testing/fuel-facet.d.ts.map +1 -0
  61. package/lib/testing/fuel-facet.js +51 -0
  62. package/lib/testing/fuel-facet.js.map +1 -0
  63. package/lib/testing/test-processor-server.d.ts +2 -0
  64. package/lib/testing/test-processor-server.d.ts.map +1 -1
  65. package/lib/testing/test-processor-server.js +3 -0
  66. package/lib/testing/test-processor-server.js.map +1 -1
  67. package/package.json +12 -6
  68. package/src/aptos/aptos-plugin.ts +38 -32
  69. package/src/eth/binds.ts +4 -4
  70. package/src/eth/codegen/codegen.ts +2 -0
  71. package/src/eth/codegen/ethers-sentio.ts +4 -1
  72. package/src/eth/eth-plugin.ts +2 -2
  73. package/src/fuel/base-processor.ts +38 -0
  74. package/src/fuel/codegen/codegen.ts +149 -0
  75. package/src/fuel/codegen/index.ts +1 -0
  76. package/src/fuel/codegen/run.ts +10 -0
  77. package/src/fuel/codegen/utils.ts +6 -0
  78. package/src/fuel/context.ts +34 -0
  79. package/src/fuel/fuel-plugin.ts +128 -0
  80. package/src/fuel/fuel-processor.ts +125 -0
  81. package/src/fuel/index.ts +6 -0
  82. package/src/fuel/network.ts +16 -0
  83. package/src/fuel/transaction.ts +43 -0
  84. package/src/testing/fuel-facet.ts +58 -0
  85. package/src/testing/test-processor-server.ts +4 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentio/sdk",
3
- "version": "2.35.0",
3
+ "version": "2.36.0-rc.1",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "exports": {
@@ -33,7 +33,9 @@
33
33
  "./sui/builtin": "./lib/sui/builtin/index.js",
34
34
  "./sui/builtin/0x1": "./lib/sui/builtin/0x1.js",
35
35
  "./sui/builtin/0x2": "./lib/sui/builtin/0x2.js",
36
- "./sui/builtin/0x3": "./lib/sui/builtin/0x3.js"
36
+ "./sui/builtin/0x3": "./lib/sui/builtin/0x3.js",
37
+ "./fuel": "./lib/fuel/index.js",
38
+ "./fuel/codegen": "./lib/fuel/codegen/index.js"
37
39
  },
38
40
  "files": [
39
41
  "{lib,src}",
@@ -43,10 +45,11 @@
43
45
  "dependencies": {
44
46
  "@aptos-labs/ts-sdk": "~1.13.0",
45
47
  "@coral-xyz/borsh": "^0.29.0",
48
+ "@fuel-ts/abi-typegen": "^0.82.0",
46
49
  "@mysten/sui.js": "~0.51.0",
47
50
  "@project-serum/anchor": "^0.26.0",
48
51
  "@sentio/bigdecimal": "9.1.1-patch.3",
49
- "@sentio/chain": "^1.0.16",
52
+ "@sentio/chain": "^1.0.21",
50
53
  "@sentio/ethers-v6": "^1.0.29",
51
54
  "@solana/web3.js": "1.89.1",
52
55
  "@typemove/aptos": "~1.5.6",
@@ -56,6 +59,7 @@
56
59
  "chalk": "^5.3.0",
57
60
  "csv-parse": "^5.5.3",
58
61
  "ethers": "npm:@sentio/ethers@6.7.1-patch.4",
62
+ "fuels": "^0.81.0",
59
63
  "js-sha3": "^0.9.3",
60
64
  "lru-cache": "^10.2.0",
61
65
  "mkdirp": "^1.0.4",
@@ -73,8 +77,8 @@
73
77
  "typedoc": "^0.25.7",
74
78
  "utility-types": "^3.11.0",
75
79
  "yaml": "^2.3.4",
76
- "@sentio/protos": "2.35.0",
77
- "@sentio/runtime": "^2.35.0"
80
+ "@sentio/protos": "2.36.0-rc.1",
81
+ "@sentio/runtime": "^2.36.0-rc.1"
78
82
  },
79
83
  "peerDependencies": {
80
84
  "tsup": "npm:@sentio/tsup@^6.7.2"
@@ -93,12 +97,14 @@
93
97
  "build": "pnpm gen && pnpm compile",
94
98
  "build:all": "pnpm --filter=$(node -p \"require('./package.json').name\")... build",
95
99
  "compile": "tsc && cp src/utils/*.csv lib/utils && cp src/tsup.config.ts lib",
96
- "gen": "pnpm gen:eth && pnpm gen:aptos && pnpm gen:sui && pnpm gen:solana",
100
+ "gen": "pnpm gen:eth && pnpm gen:aptos && pnpm gen:sui && pnpm gen:solana && pnpm gen:fuel",
97
101
  "gen:aptos": "node --loader ts-node/esm src/aptos/codegen/run.ts src/aptos/abis src/aptos/builtin && pnpm gen:aptos_test",
98
102
  "gen:aptos_test": "node --loader ts-node/esm src/aptos/codegen/run.ts src/aptos/tests/abis src/aptos/tests/types",
99
103
  "gen:docs": "typedoc --options typedoc.json",
100
104
  "gen:eth": "node --loader ts-node/esm src/eth/codegen/run.ts src/eth/abis src/eth/builtin && pnpm gen:eth_test",
101
105
  "gen:eth_test": "node --loader ts-node/esm src/eth/codegen/run.ts src/eth/tests/abis/eth ./src/eth/tests/types",
106
+ "gen:fuel": "node --loader ts-node/esm src/fuel/codegen/run.ts src/fuel/abis src/sui/builtin && pnpm gen:fuel_test",
107
+ "gen:fuel_test": "node --loader ts-node/esm src/fuel/codegen/run.ts src/fuel/tests/abis src/fuel/tests/types",
102
108
  "gen:solana": "node --loader ts-node/esm src/solana/codegen/run.ts src/solana/tests/abis src/solana/tests/types",
103
109
  "gen:sui": "node --loader ts-node/esm src/sui/codegen/run.ts src/sui/abis src/sui/builtin && pnpm gen:sui_test",
104
110
  "gen:sui_test": "node --loader ts-node/esm src/sui/codegen/run.ts src/sui/tests/abis src/sui/tests/types",
@@ -1,4 +1,4 @@
1
- import { errorString, mergeProcessResults, Plugin, PluginManager, USER_PROCESSOR } from '@sentio/runtime'
1
+ import { errorString, GLOBAL_CONFIG, mergeProcessResults, Plugin, PluginManager, USER_PROCESSOR } from '@sentio/runtime'
2
2
  import {
3
3
  AccountConfig,
4
4
  ContractConfig,
@@ -12,7 +12,7 @@ import {
12
12
  MoveOwnerType,
13
13
  ProcessConfigResponse,
14
14
  ProcessResult,
15
- StartRequest,
15
+ StartRequest
16
16
  } from '@sentio/protos'
17
17
 
18
18
  import { ServerError, Status } from 'nice-grpc'
@@ -24,7 +24,7 @@ import { AptosChainId } from '@sentio/chain'
24
24
  import { AptosResourcesContext } from './context.js'
25
25
  import {
26
26
  AptosResourceProcessorTemplate,
27
- AptosResourceProcessorTemplateState,
27
+ AptosResourceProcessorTemplateState
28
28
  } from './aptos-resource-processor-template.js'
29
29
  import { AptosNetwork } from './network.js'
30
30
 
@@ -38,7 +38,7 @@ export class AptosPlugin extends Plugin {
38
38
  handlers: Handlers = {
39
39
  aptosEventHandlers: [],
40
40
  aptosCallHandlers: [],
41
- aptosResourceHandlers: [],
41
+ aptosResourceHandlers: []
42
42
  }
43
43
 
44
44
  async start(request: StartRequest) {
@@ -57,7 +57,7 @@ export class AptosPlugin extends Plugin {
57
57
  {
58
58
  address: instance.contract?.address || '',
59
59
  network: <AptosNetwork>instance.contract?.chainId || AptosNetwork.MAIN_NET,
60
- startVersion: instance.startBlock || 0n,
60
+ startVersion: instance.startBlock || 0n
61
61
  },
62
62
  NoopContext
63
63
  )
@@ -68,7 +68,7 @@ export class AptosPlugin extends Plugin {
68
68
  const handlers: Handlers = {
69
69
  aptosEventHandlers: [],
70
70
  aptosCallHandlers: [],
71
- aptosResourceHandlers: [],
71
+ aptosResourceHandlers: []
72
72
  }
73
73
  for (const aptosProcessor of AptosProcessorState.INSTANCE.getValues()) {
74
74
  const contractConfig = ContractConfig.fromPartial({
@@ -77,9 +77,9 @@ export class AptosPlugin extends Plugin {
77
77
  name: aptosProcessor.moduleName,
78
78
  chainId: aptosProcessor.getChainId(),
79
79
  address: aptosProcessor.config.address,
80
- abi: '',
80
+ abi: ''
81
81
  },
82
- startBlock: aptosProcessor.config.startVersion,
82
+ startBlock: aptosProcessor.config.startVersion
83
83
  })
84
84
  // 1. Prepare event handlers
85
85
  for (const handler of aptosProcessor.eventHandlers) {
@@ -88,11 +88,11 @@ export class AptosPlugin extends Plugin {
88
88
  filters: handler.filters.map((f) => {
89
89
  return {
90
90
  type: f.type,
91
- account: f.account || '',
91
+ account: f.account || ''
92
92
  }
93
93
  }),
94
94
  fetchConfig: handler.fetchConfig,
95
- handlerId,
95
+ handlerId
96
96
  }
97
97
  contractConfig.moveEventConfigs.push(eventHandlerConfig)
98
98
  }
@@ -107,11 +107,11 @@ export class AptosPlugin extends Plugin {
107
107
  typeArguments: filter.typeArguments || [],
108
108
  withTypeArguments: !!filter.typeArguments,
109
109
  includeFailed: filter.includeFailed || false,
110
- publicKeyPrefix: filter.publicKeyPrefix || '',
110
+ publicKeyPrefix: filter.publicKeyPrefix || ''
111
111
  }
112
112
  }),
113
113
  fetchConfig: handler.fetchConfig,
114
- handlerId,
114
+ handlerId
115
115
  }
116
116
  contractConfig.moveCallConfigs.push(functionHandlerConfig)
117
117
  }
@@ -122,7 +122,7 @@ export class AptosPlugin extends Plugin {
122
122
  const accountConfig = AccountConfig.fromPartial({
123
123
  address: aptosProcessor.config.address,
124
124
  chainId: aptosProcessor.getChainId(),
125
- startBlock: aptosProcessor.config.startVersion,
125
+ startBlock: aptosProcessor.config.startVersion
126
126
  })
127
127
  for (const handler of aptosProcessor.resourcesHandlers) {
128
128
  const handlerId = handlers.aptosResourceHandlers.push(handler.handler) - 1
@@ -133,11 +133,11 @@ export class AptosPlugin extends Plugin {
133
133
  minutesInterval: handler.timeIntervalInMinutes,
134
134
  slot: 0,
135
135
  slotInterval: handler.versionInterval,
136
- fetchConfig: undefined,
136
+ fetchConfig: undefined
137
137
  },
138
138
  type: handler.type || '',
139
139
  ownerType: MoveOwnerType.ADDRESS,
140
- fetchConfig: undefined,
140
+ fetchConfig: undefined
141
141
  })
142
142
  }
143
143
  config.accountConfigs.push(accountConfig)
@@ -168,15 +168,16 @@ export class AptosPlugin extends Plugin {
168
168
  const event = binding.data.aptEvent
169
169
 
170
170
  for (const handlerId of binding.handlerIds) {
171
- // only support aptos event for now
172
- promises.push(
173
- this.handlers.aptosEventHandlers[handlerId](event).catch((e) => {
174
- throw new ServerError(
175
- Status.INTERNAL,
176
- 'error processing event: ' + JSON.stringify(event) + '\n' + errorString(e)
177
- )
178
- })
179
- )
171
+ const promise = this.handlers.aptosEventHandlers[handlerId](event).catch((e) => {
172
+ throw new ServerError(
173
+ Status.INTERNAL,
174
+ 'error processing event: ' + JSON.stringify(event) + '\n' + errorString(e)
175
+ )
176
+ })
177
+ if (GLOBAL_CONFIG.execution.sequential) {
178
+ await promise
179
+ }
180
+ promises.push(promise)
180
181
  }
181
182
  return mergeProcessResults(await Promise.all(promises))
182
183
  }
@@ -189,14 +190,16 @@ export class AptosPlugin extends Plugin {
189
190
 
190
191
  const promises: Promise<ProcessResult>[] = []
191
192
  for (const handlerId of binding.handlerIds) {
192
- promises.push(
193
- this.handlers.aptosResourceHandlers[handlerId](resource).catch((e) => {
194
- throw new ServerError(
195
- Status.INTERNAL,
196
- 'error processing resource: ' + JSON.stringify(resource) + '\n' + errorString(e)
197
- )
198
- })
199
- )
193
+ const promise = this.handlers.aptosResourceHandlers[handlerId](resource).catch((e) => {
194
+ throw new ServerError(
195
+ Status.INTERNAL,
196
+ 'error processing resource: ' + JSON.stringify(resource) + '\n' + errorString(e)
197
+ )
198
+ })
199
+ if (GLOBAL_CONFIG.execution.sequential) {
200
+ await promise
201
+ }
202
+ promises.push(promise)
200
203
  }
201
204
  return mergeProcessResults(await Promise.all(promises))
202
205
  }
@@ -213,6 +216,9 @@ export class AptosPlugin extends Plugin {
213
216
  const promise = this.handlers.aptosCallHandlers[handlerId](call).catch((e) => {
214
217
  throw new ServerError(Status.INTERNAL, 'error processing call: ' + JSON.stringify(call) + '\n' + errorString(e))
215
218
  })
219
+ if (GLOBAL_CONFIG.execution.sequential) {
220
+ await promise
221
+ }
216
222
  promises.push(promise)
217
223
  }
218
224
  return mergeProcessResults(await Promise.all(promises))
package/src/eth/binds.ts CHANGED
@@ -6,8 +6,8 @@ import { BaseContract } from 'ethers'
6
6
  import { MapStateStorage } from '@sentio/runtime'
7
7
  import { EthChainId } from '@sentio/chain'
8
8
 
9
- export class ProcessorState extends MapStateStorage<BaseProcessor<any, any>> {
10
- static INSTANCE = new ProcessorState()
9
+ export class EthProcessorState extends MapStateStorage<BaseProcessor<any, any>> {
10
+ static INSTANCE = new EthProcessorState()
11
11
  }
12
12
 
13
13
  // from abiName_address_chainId => contract wrapper
@@ -20,13 +20,13 @@ function getKey(abiName: string, address: string, network: EthChainId) {
20
20
  // Dedup processor that bind multiple times
21
21
  export function getProcessor(opts: BindOptions) {
22
22
  const sig = getOptionsSignature(opts)
23
- return ProcessorState.INSTANCE.getValue(sig)
23
+ return EthProcessorState.INSTANCE.getValue(sig)
24
24
  }
25
25
 
26
26
  export function addProcessor(opts: BindOptions, processor: BaseProcessor<any, any>) {
27
27
  const sig = getOptionsSignature(opts)
28
28
 
29
- ProcessorState.INSTANCE.getOrSetValue(sig, processor)
29
+ EthProcessorState.INSTANCE.getOrSetValue(sig, processor)
30
30
  }
31
31
 
32
32
  export function getContractByABI(abiName: string, address: string, network: EthChainId) {
@@ -67,9 +67,11 @@ async function codegenInternal(
67
67
 
68
68
  const fileDescriptions = loadFileDescriptions(services, config.filesToProcess)
69
69
 
70
+ // @ts-ignore - no types
70
71
  filesGenerated += processOutput(services, config, await target.beforeRun())
71
72
 
72
73
  for (const fd of fileDescriptions) {
74
+ // @ts-ignore - no types
73
75
  filesGenerated += processOutput(services, config, await target.transformFile(fd))
74
76
  }
75
77
 
@@ -1,3 +1,6 @@
1
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
2
+ // @ts-nocheck
3
+
1
4
  import Ethers from '@sentio/ethers-v6'
2
5
  import {
3
6
  Config,
@@ -65,7 +68,7 @@ export default class EthersSentio extends Ethers.default {
65
68
  }
66
69
  }
67
70
 
68
- override afterRun() {
71
+ override afterRun(): FileDescription[] {
69
72
  const commonPath = join('internal', 'common.ts')
70
73
  const files = super.afterRun()
71
74
  for (const [idx, file] of files.entries()) {
@@ -16,7 +16,7 @@ import {
16
16
  } from '@sentio/protos'
17
17
 
18
18
  import { ServerError, Status } from 'nice-grpc'
19
- import { ProcessorState } from './binds.js'
19
+ import { EthProcessorState } from './binds.js'
20
20
  import { AccountProcessorState } from './account-processor-state.js'
21
21
  import { ProcessorTemplateProcessorState } from './base-processor-template.js'
22
22
  import { GlobalProcessorState } from './base-processor.js'
@@ -49,7 +49,7 @@ export class EthPlugin extends Plugin {
49
49
  transactionHandlers: []
50
50
  }
51
51
 
52
- for (const processor of ProcessorState.INSTANCE.getValues()) {
52
+ for (const processor of EthProcessorState.INSTANCE.getValues()) {
53
53
  // If server favor incremental update this need to change
54
54
  // Start basic config for contract
55
55
  const chainId = processor.getChainId()
@@ -0,0 +1,38 @@
1
+ import { FuelProcessor, FuelProcessorConfig, FuelProcessorState } from './fuel-processor.js'
2
+ import { JsonAbi } from 'fuels'
3
+ import { FuelCall, FuelContext } from './context.js'
4
+ import { FuelFetchConfig } from './transaction.js'
5
+ import { FuelChainId } from '@sentio/chain'
6
+
7
+
8
+ export abstract class FuelAbstractProcessor extends FuelProcessor {
9
+
10
+ protected constructor(abi: JsonAbi, config?: FuelProcessorConfig) {
11
+ if (!config) {
12
+ config = {
13
+ chainId: FuelChainId.FUEL_MAINNET,
14
+ address: ''
15
+ }
16
+ }
17
+ config.abi = abi
18
+ super(config)
19
+ FuelProcessorState.INSTANCE.addValue(this)
20
+ }
21
+
22
+ protected onCallMethod<T extends Array<any>, R>(method: string, fn: (call: TypedCall<T, R>, ctx: FuelContext) => (void | Promise<void>), config: FuelFetchConfig): this {
23
+ const nameFilter = method
24
+ const handler =async (call: FuelCall, ctx: FuelContext) => {
25
+ await fn({
26
+ args: call.functionScopes[0].getCallConfig().args as T,
27
+ returnValue: call.value as R
28
+ }, ctx)
29
+ }
30
+ return super.onCall(nameFilter, handler, config)
31
+ }
32
+
33
+ }
34
+
35
+ export type TypedCall<T extends Array<any>, R> = {
36
+ args: T
37
+ returnValue: R
38
+ }
@@ -0,0 +1,149 @@
1
+ import fs, { readFileSync, writeFileSync } from 'fs'
2
+ import chalk from 'chalk'
3
+ import { AbiTypeGen, IFile, IFunction, ProgramTypeEnum } from '@fuel-ts/abi-typegen'
4
+ import mkdirp from 'mkdirp'
5
+ import path from 'path'
6
+ import { upperFirst } from './utils.js'
7
+
8
+ export async function codegen(abisDir: string, outDir: string) {
9
+ if (!fs.existsSync(abisDir)) {
10
+ return
11
+ }
12
+
13
+ const numFiles = await codegenInternal(abisDir, outDir)
14
+ console.log(chalk.green(`Generated ${numFiles} files for Fuel`))
15
+ }
16
+
17
+ function patchImport(contents: string) {
18
+ return contents.replace(/from\s+['"](\..+)['"]/g, `from '\$1.js'`)
19
+ }
20
+
21
+ function patchEnumType(contents: string) {
22
+ const matches = contents.matchAll(/export type (.+) = Enum<{ Ok: T, Err: E }>;/g)
23
+
24
+ for (const m of matches) {
25
+ const vname = m[1]
26
+ contents = contents.replace(m[0], `export type ${vname}<T,E> = Enum<{ Ok: T, Err: E }>;`)
27
+
28
+ const reg = new RegExp(`export type (.+) = ${vname}`, 'g')
29
+ contents = contents.replace(reg, `export type \$1<T,E> = ${vname}<T,E>`)
30
+ }
31
+ return contents
32
+ }
33
+
34
+ async function codegenInternal(abisDir: string, outDir: string): Promise<number> {
35
+ const allFiles = fs.readdirSync(abisDir)
36
+ if (allFiles.length === 0) {
37
+ return 0
38
+ }
39
+
40
+ const allABIFiles = []
41
+ for (const f of allFiles) {
42
+ if (f.toLowerCase().endsWith('-abi.json')) {
43
+ allABIFiles.push(path.join(abisDir, f))
44
+ }
45
+ }
46
+ if (allABIFiles.length === 0) {
47
+ return 0
48
+ }
49
+ const abiFiles = allABIFiles.map((filepath) => {
50
+ const abi: IFile = {
51
+ path: filepath,
52
+ contents: readFileSync(filepath, 'utf-8')
53
+ }
54
+ return abi
55
+ })
56
+
57
+ // fuels type gen
58
+ const abiTypeGen = new AbiTypeGen({
59
+ abiFiles,
60
+ binFiles: [],
61
+ storageSlotsFiles: [],
62
+ outputDir: outDir,
63
+ programType: ProgramTypeEnum.CONTRACT
64
+ })
65
+
66
+ mkdirp.sync(outDir)
67
+ mkdirp.sync(path.join(outDir, 'factories'))
68
+
69
+ abiTypeGen.files.forEach((file) => {
70
+ if (!file.path.endsWith('.hex.ts')) {
71
+ let content = patchImport(file.contents)
72
+ content = patchEnumType(content)
73
+ writeFileSync(file.path, content)
74
+ }
75
+ })
76
+
77
+ for (const abi of abiTypeGen.abis) {
78
+ const name = abi.name.endsWith('Abi') ? abi.name.slice(0, -3) : abi.name
79
+ const filePath = path.join(outDir, `${name}Processor.ts`)
80
+ const importedTypes = collectImportedTypes(abi.types)
81
+
82
+ const content = `/* Autogenerated file. Do not edit manually. */
83
+
84
+ /* tslint:disable */
85
+ /* eslint-disable */
86
+
87
+ import { FuelAbstractProcessor, FuelContext, FuelProcessorConfig, TypedCall, FuelFetchConfig} from '@sentio/sdk/fuel'
88
+ import {${abi.name}__factory } from './factories/${abi.name}__factory.js'
89
+ import {${abi.commonTypesInUse.join(',')}} from './common.js'
90
+ import {${importedTypes.join(',')}} from './${abi.name}.js'
91
+
92
+ import type {
93
+ BigNumberish,
94
+ BN,
95
+ BytesLike,
96
+ } from 'fuels';
97
+
98
+
99
+ namespace ${name} {
100
+ ${abi.functions.map(genCallType).join('\n')}
101
+ }
102
+
103
+ export class ${name}Processor extends FuelAbstractProcessor {
104
+ constructor(config?: FuelProcessorConfig) {
105
+ super(${abi.name}__factory.abi, config)
106
+ }
107
+
108
+ static bind(config?: FuelProcessorConfig) {
109
+ return new ${name}Processor(config)
110
+ }
111
+
112
+ ${abi.functions.map((f) => genOnCallFunction(name, f)).join('\n')}
113
+ }
114
+ `
115
+ writeFileSync(filePath, content)
116
+ }
117
+
118
+ return allABIFiles.length
119
+ }
120
+
121
+ function genCallType(f: IFunction) {
122
+ const name = upperFirst(f.name)
123
+ return `
124
+ export interface ${name}Call extends TypedCall<[${f.attributes.inputs}], ${f.attributes.output}> {
125
+ args: [${f.attributes.inputs}]
126
+ returnValue: ${f.attributes.output}
127
+ }
128
+ `
129
+ }
130
+
131
+ function genOnCallFunction(contractName: string, f: IFunction) {
132
+ const name = upperFirst(f.name)
133
+ return `
134
+ onCall${name}(handler: (call: ${contractName}.${name}Call, ctx: FuelContext) => void | Promise<void>, config: FuelFetchConfig) {
135
+ super.onCallMethod('${f.name}', handler, config)
136
+ }`
137
+ }
138
+
139
+ function collectImportedTypes(types: any[]): string[] {
140
+ const ret = new Set<string>()
141
+ for (const type of types) {
142
+ if ((type && type.name == 'struct') || type.name == 'enum') {
143
+ ret.add(type.attributes.inputLabel)
144
+ ret.add(type.attributes.outputLabel)
145
+ }
146
+ }
147
+
148
+ return Array.from(ret)
149
+ }
@@ -0,0 +1 @@
1
+ export * from './codegen.js'
@@ -0,0 +1,10 @@
1
+ import { codegen } from './index.js'
2
+
3
+ if (process.argv.length > 3) {
4
+ const abisDir = process.argv[2]
5
+ const targetDir = process.argv[3]
6
+ await codegen(abisDir, targetDir)
7
+ } else {
8
+ console.error('Not enough argument')
9
+ process.exit(1)
10
+ }
@@ -0,0 +1,6 @@
1
+
2
+
3
+
4
+ export function upperFirst(str: string): string {
5
+ return str.charAt(0).toUpperCase() + str.slice(1);
6
+ }
@@ -0,0 +1,34 @@
1
+ import { BaseContext, Labels, normalizeLabels } from '../core/index.js'
2
+ import { ChainId } from '@sentio/chain'
3
+ import { RecordMetaData } from '@sentio/protos'
4
+ import { InvocationCallResult } from 'fuels'
5
+ import { FuelTransaction } from './transaction.js'
6
+
7
+ export type FuelCall = InvocationCallResult
8
+
9
+ export class FuelContext extends BaseContext {
10
+ constructor(
11
+ readonly transaction: FuelTransaction | null,
12
+ readonly chainId: ChainId
13
+ ) {
14
+ super({})
15
+ }
16
+
17
+ getChainId(): ChainId {
18
+ return this.chainId
19
+ }
20
+
21
+ protected getMetaDataInternal(name: string, labels: Labels): RecordMetaData {
22
+ return {
23
+ address: this.transaction?.id || '',
24
+ contractName: this.transaction?.id || '', // TODO
25
+ blockNumber: 0n,
26
+ transactionIndex: 0,
27
+ transactionHash: this.transaction?.id || '', // TODO
28
+ chainId: this.getChainId(),
29
+ name: name,
30
+ logIndex: 0,
31
+ labels: normalizeLabels(labels)
32
+ }
33
+ }
34
+ }