@sentio/sdk 3.0.0-rc-next.1 → 3.0.0-rc-next.3
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.
- package/lib/core/base-context.d.ts +2 -4
- package/lib/core/base-context.d.ts.map +1 -1
- package/lib/core/base-context.js +2 -6
- package/lib/core/base-context.js.map +1 -1
- package/lib/core/core-plugin.d.ts.map +1 -1
- package/lib/core/core-plugin.js +1 -6
- package/lib/core/core-plugin.js.map +1 -1
- package/lib/core/event-logger.d.ts +0 -5
- package/lib/core/event-logger.d.ts.map +1 -1
- package/lib/core/event-logger.js +16 -30
- package/lib/core/event-logger.js.map +1 -1
- package/lib/core/index.d.ts +1 -1
- package/lib/core/index.d.ts.map +1 -1
- package/lib/core/index.js +1 -1
- package/lib/core/index.js.map +1 -1
- package/lib/core/meter.d.ts +0 -43
- package/lib/core/meter.d.ts.map +1 -1
- package/lib/core/meter.js +18 -122
- package/lib/core/meter.js.map +1 -1
- package/lib/fuel/asset-processor.d.ts.map +1 -1
- package/lib/fuel/asset-processor.js +5 -1
- package/lib/fuel/asset-processor.js.map +1 -1
- package/lib/stark/codegen/codegen.d.ts +2 -0
- package/lib/stark/codegen/codegen.d.ts.map +1 -0
- package/lib/stark/codegen/codegen.js +110 -0
- package/lib/stark/codegen/codegen.js.map +1 -0
- package/lib/stark/codegen/index.d.ts +2 -0
- package/lib/stark/codegen/index.d.ts.map +1 -0
- package/lib/stark/codegen/index.js +2 -0
- package/lib/stark/codegen/index.js.map +1 -0
- package/lib/stark/codegen/run.d.ts +2 -0
- package/lib/stark/codegen/run.d.ts.map +1 -0
- package/lib/stark/codegen/run.js +11 -0
- package/lib/stark/codegen/run.js.map +1 -0
- package/lib/stark/codegen/utils.d.ts +2 -0
- package/lib/stark/codegen/utils.d.ts.map +1 -0
- package/lib/stark/codegen/utils.js +4 -0
- package/lib/stark/codegen/utils.js.map +1 -0
- package/lib/stark/context.d.ts +28 -0
- package/lib/stark/context.d.ts.map +1 -0
- package/lib/stark/context.js +59 -0
- package/lib/stark/context.js.map +1 -0
- package/lib/stark/contract.d.ts +12 -0
- package/lib/stark/contract.d.ts.map +1 -0
- package/lib/stark/contract.js +43 -0
- package/lib/stark/contract.js.map +1 -0
- package/lib/stark/event.d.ts +7 -0
- package/lib/stark/event.d.ts.map +1 -0
- package/lib/stark/event.js +11 -0
- package/lib/stark/event.js.map +1 -0
- package/lib/stark/index.d.ts +7 -0
- package/lib/stark/index.d.ts.map +1 -0
- package/lib/stark/index.js +7 -0
- package/lib/stark/index.js.map +1 -0
- package/lib/stark/starknet-plugin.d.ts +15 -0
- package/lib/stark/starknet-plugin.d.ts.map +1 -0
- package/lib/stark/starknet-plugin.js +87 -0
- package/lib/stark/starknet-plugin.js.map +1 -0
- package/lib/stark/starknet-processor.d.ts +35 -0
- package/lib/stark/starknet-processor.d.ts.map +1 -0
- package/lib/stark/starknet-processor.js +133 -0
- package/lib/stark/starknet-processor.js.map +1 -0
- package/lib/stark/types.d.ts +11 -0
- package/lib/stark/types.d.ts.map +1 -0
- package/lib/stark/types.js +2 -0
- package/lib/stark/types.js.map +1 -0
- package/lib/testing/starknet-facet.d.ts +9 -0
- package/lib/testing/starknet-facet.d.ts.map +1 -0
- package/lib/testing/starknet-facet.js +53 -0
- package/lib/testing/starknet-facet.js.map +1 -0
- package/lib/testing/test-processor-server.d.ts +2 -0
- package/lib/testing/test-processor-server.d.ts.map +1 -1
- package/lib/testing/test-processor-server.js +3 -0
- package/lib/testing/test-processor-server.js.map +1 -1
- package/lib/utils/price.js +1 -1
- package/package.json +9 -5
- package/src/core/base-context.ts +2 -6
- package/src/core/core-plugin.ts +1 -6
- package/src/core/event-logger.ts +18 -35
- package/src/core/index.ts +1 -12
- package/src/core/meter.ts +18 -148
- package/src/fuel/asset-processor.ts +5 -2
- package/src/stark/codegen/codegen.ts +125 -0
- package/src/stark/codegen/index.ts +1 -0
- package/src/stark/codegen/run.ts +10 -0
- package/src/stark/codegen/utils.ts +3 -0
- package/src/stark/context.ts +78 -0
- package/src/stark/contract.ts +55 -0
- package/src/stark/event.ts +7 -0
- package/src/stark/index.ts +9 -0
- package/src/stark/starknet-plugin.ts +116 -0
- package/src/stark/starknet-processor.ts +164 -0
- package/src/stark/types.ts +11 -0
- package/src/testing/starknet-facet.ts +62 -0
- package/src/testing/test-processor-server.ts +3 -0
- package/src/utils/price.ts +1 -1
- package/lib/core/base-context.test.d.ts +0 -2
- package/lib/core/base-context.test.d.ts.map +0 -1
- package/lib/core/base-context.test.js.map +0 -1
@@ -0,0 +1,164 @@
|
|
1
|
+
import { Data_StarknetEvent, ProcessResult } from '@sentio/protos'
|
2
|
+
import { StarknetChainId } from '@sentio/chain'
|
3
|
+
import { CallData, events, ParsedEvent, RpcProvider } from 'starknet'
|
4
|
+
import { StarknetContext } from './context.js'
|
5
|
+
import { StarknetEvent } from './event.js'
|
6
|
+
import { ListStateStorage, mergeProcessResults } from '@sentio/runtime'
|
7
|
+
import { StarknetProcessorConfig } from './types.js'
|
8
|
+
import { StarknetContractView } from './contract.js'
|
9
|
+
import { getHandlerName, proxyProcessor } from '../utils/metrics.js'
|
10
|
+
import { HandlerOptions } from '../core/handler-options.js'
|
11
|
+
|
12
|
+
export class StarknetProcessor {
|
13
|
+
callHandlers: CallHandler<Data_StarknetEvent>[] = []
|
14
|
+
|
15
|
+
private provider: RpcProvider
|
16
|
+
|
17
|
+
static bind(config: StarknetProcessorConfig): StarknetProcessor {
|
18
|
+
const processor = new StarknetProcessor(config)
|
19
|
+
StarknetProcessorState.INSTANCE.addValue(processor)
|
20
|
+
return processor
|
21
|
+
}
|
22
|
+
|
23
|
+
classHash: string
|
24
|
+
|
25
|
+
constructor(readonly config: StarknetProcessorConfig) {
|
26
|
+
return proxyProcessor(this)
|
27
|
+
}
|
28
|
+
|
29
|
+
async configure() {
|
30
|
+
this.provider = new RpcProvider({
|
31
|
+
nodeUrl: getRpcEndpoint(this.config.chainId)
|
32
|
+
})
|
33
|
+
const classHash = await this.provider.getClassHashAt(this.config.address)
|
34
|
+
if (!classHash) {
|
35
|
+
throw new Error("can't find the class hash defined at " + this.config.address)
|
36
|
+
}
|
37
|
+
this.classHash = classHash
|
38
|
+
if (!this.config.abi) {
|
39
|
+
const clazz = await this.provider.getClass(classHash, 'latest')
|
40
|
+
this.config.abi = clazz.abi
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
public onEvent(
|
45
|
+
event: string | string[],
|
46
|
+
handler: (events: StarknetEvent<ParsedEvent>, ctx: StarknetContext<StarknetContractView>) => void | Promise<void>,
|
47
|
+
handlerOptions?: HandlerOptions<object, StarknetEvent<ParsedEvent>>
|
48
|
+
) {
|
49
|
+
const eventFilter = Array.isArray(event) ? event : [event]
|
50
|
+
if (!this.config.abi) {
|
51
|
+
throw new Error('abi not found')
|
52
|
+
}
|
53
|
+
const abi = this.config.abi
|
54
|
+
const callHandler = {
|
55
|
+
handlerName: getHandlerName(),
|
56
|
+
handler: async (call: Data_StarknetEvent) => {
|
57
|
+
try {
|
58
|
+
const eventData = [call.result] as any[]
|
59
|
+
const abiEvents = events.getAbiEvents(abi)
|
60
|
+
|
61
|
+
const abiStructs = CallData.getAbiStruct(abi)
|
62
|
+
const abiEnums = CallData.getAbiEnum(abi)
|
63
|
+
|
64
|
+
const parsedEvents = events.parseEvents(eventData, abiEvents, abiStructs, abiEnums)
|
65
|
+
const results: ProcessResult[] = []
|
66
|
+
const { block_hash, block_number, transaction_hash, from_address } = call.result!
|
67
|
+
for (let i = 0; i < parsedEvents.length; i++) {
|
68
|
+
const ctx = new StarknetContext<StarknetContractView>(
|
69
|
+
this.config,
|
70
|
+
this.provider,
|
71
|
+
block_number,
|
72
|
+
block_hash,
|
73
|
+
transaction_hash,
|
74
|
+
i,
|
75
|
+
this.classHash
|
76
|
+
)
|
77
|
+
const e = new StarknetEvent(from_address, transaction_hash, parsedEvents[i])
|
78
|
+
try {
|
79
|
+
await handler(e, ctx)
|
80
|
+
} catch (e) {
|
81
|
+
console.error(e)
|
82
|
+
}
|
83
|
+
results.push(ctx.stopAndGetResult())
|
84
|
+
}
|
85
|
+
return mergeProcessResults(results)
|
86
|
+
} catch (e) {
|
87
|
+
console.error(e)
|
88
|
+
return ProcessResult.fromPartial({})
|
89
|
+
}
|
90
|
+
},
|
91
|
+
eventFilter,
|
92
|
+
partitionHandler: async (call: Data_StarknetEvent): Promise<string | undefined> => {
|
93
|
+
const p = handlerOptions?.partitionKey
|
94
|
+
if (!p) return undefined
|
95
|
+
if (typeof p === 'function') {
|
96
|
+
try {
|
97
|
+
const eventData = [call.result] as any[]
|
98
|
+
const abiEvents = events.getAbiEvents(abi)
|
99
|
+
const abiStructs = CallData.getAbiStruct(abi)
|
100
|
+
const abiEnums = CallData.getAbiEnum(abi)
|
101
|
+
const parsedEvents = events.parseEvents(eventData, abiEvents, abiStructs, abiEnums)
|
102
|
+
if (parsedEvents.length > 0) {
|
103
|
+
const { from_address, transaction_hash } = call.result!
|
104
|
+
const e = new StarknetEvent(from_address, transaction_hash, parsedEvents[0])
|
105
|
+
return p(e)
|
106
|
+
}
|
107
|
+
return undefined
|
108
|
+
} catch (e) {
|
109
|
+
console.error(e)
|
110
|
+
return undefined
|
111
|
+
}
|
112
|
+
}
|
113
|
+
return p
|
114
|
+
}
|
115
|
+
}
|
116
|
+
this.callHandlers.push(callHandler)
|
117
|
+
return this
|
118
|
+
}
|
119
|
+
}
|
120
|
+
|
121
|
+
export type CallHandler<T> = {
|
122
|
+
handlerName: string
|
123
|
+
handler: (call: T) => Promise<ProcessResult>
|
124
|
+
eventFilter?: string[]
|
125
|
+
partitionHandler?: (call: T) => Promise<string | undefined>
|
126
|
+
}
|
127
|
+
|
128
|
+
function getRpcEndpoint(chainId: StarknetChainId | string) {
|
129
|
+
switch (chainId) {
|
130
|
+
case StarknetChainId.STARKNET_MAINNET:
|
131
|
+
return 'https://starknet-mainnet.g.alchemy.com/starknet/version/rpc/v0_8/8sD5yitBslIYCPFzSq_Q1ObJHqPlZxFw'
|
132
|
+
default:
|
133
|
+
return 'https://starknet-sepolia.g.alchemy.com/starknet/version/rpc/v0_8/8sD5yitBslIYCPFzSq_Q1ObJHqPlZxFw'
|
134
|
+
}
|
135
|
+
}
|
136
|
+
|
137
|
+
export class StarknetProcessorState extends ListStateStorage<StarknetProcessor> {
|
138
|
+
static INSTANCE = new StarknetProcessorState()
|
139
|
+
}
|
140
|
+
|
141
|
+
export abstract class AbstractStarknetProcessor {
|
142
|
+
private readonly processor: StarknetProcessor
|
143
|
+
protected constructor(
|
144
|
+
readonly abi: any,
|
145
|
+
readonly config: StarknetProcessorConfig
|
146
|
+
) {
|
147
|
+
this.processor = new StarknetProcessor(config)
|
148
|
+
StarknetProcessorState.INSTANCE.addValue(this.processor)
|
149
|
+
return proxyProcessor(this)
|
150
|
+
}
|
151
|
+
|
152
|
+
onEvent<T, C>(
|
153
|
+
eventName: string,
|
154
|
+
structName: string,
|
155
|
+
handler: (event: StarknetEvent<T>, ctx: StarknetContext<C>) => Promise<void>
|
156
|
+
) {
|
157
|
+
this.processor.onEvent(eventName, async (events, ctx) => {
|
158
|
+
const eventData = events.data[structName] as T
|
159
|
+
const e = new StarknetEvent<T>(events.caller, events.transactionHash, eventData)
|
160
|
+
await handler(e, ctx as StarknetContext<C>)
|
161
|
+
})
|
162
|
+
return this
|
163
|
+
}
|
164
|
+
}
|
@@ -0,0 +1,62 @@
|
|
1
|
+
import { TestProcessorServer } from './test-processor-server.js'
|
2
|
+
import { DataBinding, HandlerType } from '@sentio/protos'
|
3
|
+
import { StarknetChainId } from '@sentio/chain'
|
4
|
+
|
5
|
+
export class StarknetFacet {
|
6
|
+
server: TestProcessorServer
|
7
|
+
|
8
|
+
constructor(server: TestProcessorServer) {
|
9
|
+
this.server = server
|
10
|
+
}
|
11
|
+
|
12
|
+
testOnEvents(events: any, network: StarknetChainId = StarknetChainId.STARKNET_SEPOLIA) {
|
13
|
+
const bindings = this.buildBinding(events, network)
|
14
|
+
if (!bindings) {
|
15
|
+
throw Error('Invalid test : ' + JSON.stringify(events))
|
16
|
+
}
|
17
|
+
|
18
|
+
return this.server.processBindings({
|
19
|
+
bindings
|
20
|
+
})
|
21
|
+
}
|
22
|
+
|
23
|
+
private buildBinding(events: any, network: StarknetChainId): DataBinding[] {
|
24
|
+
const res: DataBinding[] = []
|
25
|
+
const data = Array.isArray(events) ? events : [events]
|
26
|
+
for (const event of data) {
|
27
|
+
for (const config of this.server.contractConfigs) {
|
28
|
+
if (config.contract?.chainId !== network) {
|
29
|
+
continue
|
30
|
+
}
|
31
|
+
|
32
|
+
for (const logConfig of config.starknetEventConfigs) {
|
33
|
+
const binding = {
|
34
|
+
data: {
|
35
|
+
starknetEvents: {
|
36
|
+
result: event,
|
37
|
+
timestamp: new Date()
|
38
|
+
}
|
39
|
+
},
|
40
|
+
handlerIds: [logConfig.handlerId],
|
41
|
+
handlerType: HandlerType.STARKNET_EVENT,
|
42
|
+
chainId: config.contract.chainId
|
43
|
+
}
|
44
|
+
|
45
|
+
const logFilters = logConfig.filters
|
46
|
+
const keys = event.keys as string[]
|
47
|
+
|
48
|
+
for (const key of keys) {
|
49
|
+
for (const logFilter of logFilters) {
|
50
|
+
if (logFilter.keys.includes(key)) {
|
51
|
+
res.push(binding)
|
52
|
+
return res
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
return res
|
61
|
+
}
|
62
|
+
}
|
@@ -25,6 +25,7 @@ import { EthFacet } from './eth-facet.js'
|
|
25
25
|
import { SuiFacet } from './sui-facet.js'
|
26
26
|
import { FuelFacet } from './fuel-facet.js'
|
27
27
|
import { CosmosFacet } from './cosmos-facet.js'
|
28
|
+
import { StarknetFacet } from './starknet-facet.js'
|
28
29
|
import { Subject } from 'rxjs'
|
29
30
|
import { MemoryDatabase } from './memory-database.js'
|
30
31
|
import { DatabaseSchemaState } from '../core/database-schema.js'
|
@@ -53,6 +54,7 @@ export class TestProcessorServer implements ProcessorServiceImplementation {
|
|
53
54
|
iota: IotaFacet
|
54
55
|
fuel: FuelFacet
|
55
56
|
cosmos: CosmosFacet
|
57
|
+
starknet: StarknetFacet
|
56
58
|
_db: MemoryDatabase
|
57
59
|
|
58
60
|
constructor(loader: () => Promise<any>, httpEndpoints: Record<string, string> = {}) {
|
@@ -66,6 +68,7 @@ export class TestProcessorServer implements ProcessorServiceImplementation {
|
|
66
68
|
this.iota = new IotaFacet(this)
|
67
69
|
this.fuel = new FuelFacet(this)
|
68
70
|
this.cosmos = new CosmosFacet(this)
|
71
|
+
this.starknet = new StarknetFacet(this)
|
69
72
|
|
70
73
|
for (const k of Object.keys(ChainInfo)) {
|
71
74
|
const http = httpEndpoints[k] || ''
|
package/src/utils/price.ts
CHANGED
@@ -23,7 +23,7 @@ export function getPriceClient(basePath = Endpoints.INSTANCE.priceFeedAPI) {
|
|
23
23
|
basePath = basePath.slice(0, -1)
|
24
24
|
}
|
25
25
|
client.setConfig({
|
26
|
-
baseUrl: basePath || 'https://
|
26
|
+
baseUrl: basePath || 'https://api.sentio.xyz',
|
27
27
|
auth: getApiKey()
|
28
28
|
})
|
29
29
|
return PriceService
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"base-context.test.d.ts","sourceRoot":"","sources":["../../src/core/base-context.test.ts"],"names":[],"mappings":""}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"base-context.test.js","sourceRoot":"","sources":["../../src/core/base-context.test.ts"],"names":[],"mappings":"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"}
|