@@ -31,6 +31,7 @@ export class SvmCpiEventsClient {
31
31
private programAddress : Address ;
32
32
private programEventAuthority : Address ;
33
33
private idl : Idl ;
34
+ private derivedAddress ?: Address ;
34
35
35
36
/**
36
37
* Private constructor. Use the async create() method to instantiate.
@@ -39,12 +40,14 @@ export class SvmCpiEventsClient {
39
40
rpc : web3 . Rpc < web3 . SolanaRpcApiFromTransport < RpcTransport > > ,
40
41
address : Address ,
41
42
eventAuthority : Address ,
42
- idl : Idl
43
+ idl : Idl ,
44
+ derivedAddress ?: Address
43
45
) {
44
46
this . rpc = rpc ;
45
47
this . programAddress = address ;
46
48
this . programEventAuthority = eventAuthority ;
47
49
this . idl = idl ;
50
+ this . derivedAddress = derivedAddress ;
48
51
}
49
52
50
53
/**
@@ -60,14 +63,16 @@ export class SvmCpiEventsClient {
60
63
public static async createFor (
61
64
rpc : web3 . Rpc < web3 . SolanaRpcApiFromTransport < RpcTransport > > ,
62
65
programId : string ,
63
- idl : Idl
66
+ idl : Idl ,
67
+ pda ?: string
64
68
) : Promise < SvmCpiEventsClient > {
65
69
const address = web3 . address ( programId ) ;
70
+ const derivedAddress = pda ? web3 . address ( pda ) : undefined ;
66
71
const [ eventAuthority ] = await web3 . getProgramDerivedAddress ( {
67
72
programAddress : address ,
68
73
seeds : [ "__event_authority" ] ,
69
74
} ) ;
70
- return new SvmCpiEventsClient ( rpc , address , eventAuthority , idl ) ;
75
+ return new SvmCpiEventsClient ( rpc , address , eventAuthority , idl , derivedAddress ) ;
71
76
}
72
77
73
78
/**
@@ -89,26 +94,52 @@ export class SvmCpiEventsClient {
89
94
return events . filter ( ( event ) => event . name === eventName ) as EventWithData [ ] ;
90
95
}
91
96
97
+ /**
98
+ * Queries events for the provided derived address at instantiation filtered by event name.
99
+ *
100
+ * @param eventName - The name of the event to filter by.
101
+ * @param fromBlock - Optional starting block.
102
+ * @param toBlock - Optional ending block.
103
+ * @param options - Options for fetching signatures.
104
+ * @returns A promise that resolves to an array of events matching the eventName.
105
+ */
106
+ public async queryDerivedAddressEvents (
107
+ eventName : string ,
108
+ fromBlock ?: bigint ,
109
+ toBlock ?: bigint ,
110
+ options : GetSignaturesForAddressConfig = { limit : 1000 , commitment : "confirmed" }
111
+ ) : Promise < EventWithData [ ] > {
112
+ const events = await this . queryAllEvents ( fromBlock , toBlock , options , true ) ;
113
+ return events . filter ( ( event ) => event . name === eventName ) as EventWithData [ ] ;
114
+ }
115
+
92
116
/**
93
117
* Queries all events for a specific program.
94
118
*
95
119
* @param fromSlot - Optional starting slot.
96
120
* @param toSlot - Optional ending slot.
97
121
* @param options - Options for fetching signatures.
122
+ * @param forDerivedAddress - Whether to query events for the program or the derived address.
98
123
* @returns A promise that resolves to an array of all events with additional metadata.
99
124
*/
100
125
private async queryAllEvents (
101
126
fromSlot ?: bigint ,
102
127
toSlot ?: bigint ,
103
- options : GetSignaturesForAddressConfig = { limit : 1000 , commitment : "confirmed" }
128
+ options : GetSignaturesForAddressConfig = { limit : 1000 , commitment : "confirmed" } ,
129
+ forDerivedAddress : boolean = false
104
130
) : Promise < EventWithData [ ] > {
105
131
const allSignatures : GetSignaturesForAddressTransaction [ ] = [ ] ;
106
132
let hasMoreSignatures = true ;
107
133
let currentOptions = options ;
108
134
135
+ if ( forDerivedAddress && ! this . derivedAddress ) {
136
+ throw new Error ( "Unable to query PDA events. Derived address not set." ) ;
137
+ }
138
+ const addressToQuery = forDerivedAddress ? this . derivedAddress : this . programAddress ;
139
+
109
140
while ( hasMoreSignatures ) {
110
141
const signatures : GetSignaturesForAddressApiResponse = await this . rpc
111
- . getSignaturesForAddress ( this . programAddress , currentOptions )
142
+ . getSignaturesForAddress ( addressToQuery ! , currentOptions )
112
143
. send ( ) ;
113
144
// Signatures are sorted by slot in descending order.
114
145
allSignatures . push ( ...signatures ) ;
0 commit comments