@@ -7,6 +7,19 @@ import { logError, logInfo } from "../logger";
77
88dotenv . config ( ) ;
99
10+ type SorobanEvent = {
11+ txHash ?: string ;
12+ ledger ?: number ;
13+ event_index ?: number ;
14+ type ?: string ;
15+ contract_id ?: string ;
16+ value ?: unknown ;
17+ topic ?: unknown ;
18+ timestamp ?: number ;
19+ ledgerCloseTime ?: number ;
20+ [ key : string ] : unknown ;
21+ } ;
22+
1023const SOROBAN_RPC_URL = process . env . SOROBAN_RPC_URL || "https://soroban-testnet.stellar.org:443" ;
1124const CONTRACT_ID = process . env . CONTRACT_ID || "" ;
1225
@@ -47,7 +60,7 @@ async function fetchSorobanEvents() {
4760}
4861
4962
50- function isDuplicateEvent ( db : any , event : any ) : boolean {
63+ function isDuplicateEvent ( db : ReturnType < typeof getDb > , event : SorobanEvent ) : boolean {
5164 // Use transaction hash for better deduplication if available
5265 if ( event . txHash ) {
5366 const row = db . prepare (
@@ -67,16 +80,16 @@ function isDuplicateEvent(db: any, event: any): boolean {
6780}
6881
6982
70- function parseSorobanEvent ( event : any ) {
83+ function parseSorobanEvent ( event : SorobanEvent ) {
7184 // Example event: { ledger, event_index, type, contract_id, txHash, ledgerCloseTime, ...data }
7285 // Map to local event schema
7386 if ( ! event || ! event . type || ! event . contract_id ) return null ;
7487 // Only process contract events
7588 if ( event . type !== "contract" || event . contract_id !== CONTRACT_ID ) return null ;
7689
7790 // Parse event topic and data
78- const topic = event . topic && Array . isArray ( event . topic ) ? event . topic . map ( ( t : any ) => t . toString ( ) ) . join ( ":" ) : "" ;
79- let eventType : any = undefined ;
91+ const topic = Array . isArray ( event . topic ) ? event . topic . map ( ( t ) => String ( t ) ) . join ( ":" ) : "" ;
92+ let eventType : "created" | "pledged" | "claimed" | "refunded" | undefined ;
8093 if ( topic . includes ( "Goal:Create" ) ) eventType = "created" ;
8194 else if ( topic . includes ( "Goal:Pledge" ) ) eventType = "pledged" ;
8295 else if ( topic . includes ( "Goal:Claim" ) ) eventType = "claimed" ;
@@ -85,19 +98,22 @@ function parseSorobanEvent(event: any) {
8598
8699 // Extract campaignId, actor, amount, etc. from event.value or event.data
87100 let campaignId = "" ;
88- let actor = undefined ;
89- let amount = undefined ;
90- let metadata = { ...event } ;
101+ let actor : string | undefined ;
102+ let amount : number | undefined ;
103+ let metadata : Record < string , unknown > = { ...event } ;
104+ const value = event . value as Record < string , unknown > | undefined ;
91105
92106 try {
93- if ( event . value ) {
94- if ( event . value . campaign_id !== undefined ) campaignId = String ( event . value . campaign_id ) ;
95- if ( event . value . creator ) actor = event . value . creator ;
96- if ( event . value . contributor ) actor = event . value . contributor ;
97- if ( event . value . amount !== undefined ) amount = Number ( event . value . amount ) ;
98- metadata = { ...event , ...event . value } ;
107+ if ( value ) {
108+ if ( value . campaign_id !== undefined ) campaignId = String ( value . campaign_id ) ;
109+ if ( value . creator ) actor = String ( value . creator ) ;
110+ if ( value . contributor ) actor = String ( value . contributor ) ;
111+ if ( value . amount !== undefined ) amount = Number ( value . amount ) ;
112+ metadata = { ...event , ...value } ;
99113 }
100- } catch { }
114+ } catch ( err : unknown ) {
115+ logError ( err , { event : "soroban_event_parse_error" } , config . logLevel ) ;
116+ }
101117
102118 // Create blockchain metadata
103119 const blockchainMetadata : BlockchainMetadata = {
0 commit comments