@@ -28,6 +28,32 @@ impl<M> From<DIDRegistry<M>> for Resolver<M> {
28
28
}
29
29
}
30
30
31
+ /// Extra context passed to the document builder from the [`Resolver`]
32
+ #[ derive( Debug , Clone , PartialEq , Eq ) ]
33
+ pub struct EventContext {
34
+ /// the timestamp in seconds in which the block from the document was built.
35
+ pub block_timestamp : u64 ,
36
+ }
37
+
38
+ impl EventContext {
39
+ pub async fn new < M : Middleware > (
40
+ meta : & LogMeta ,
41
+ signer : impl Middleware ,
42
+ ) -> Result < Self , ResolverError < M > > {
43
+ let block = signer
44
+ . get_block ( meta. block_number )
45
+ . await
46
+ . map_err ( |e| ResolverError :: Middleware ( e. to_string ( ) ) ) ?;
47
+
48
+ let block_timestamp: u64 = block
49
+ . ok_or ( ResolverError :: MissingBlock ( meta. block_number ) ) ?
50
+ . timestamp
51
+ . as_u64 ( ) ;
52
+
53
+ Ok ( Self { block_timestamp } )
54
+ }
55
+ }
56
+
31
57
impl < M : Middleware + ' static > Resolver < M > {
32
58
/// Instantiate a new did:ethr resolver
33
59
pub async fn new ( middleware : M , registry : Address ) -> Result < Self , ResolverError < M > > {
@@ -83,21 +109,22 @@ impl<M: Middleware + 'static> Resolver<M> {
83
109
Ok ( history)
84
110
}
85
111
86
- fn dispatch_event (
112
+ async fn dispatch_event (
87
113
& self ,
88
114
doc : & mut EthrBuilder ,
89
115
address : H160 ,
90
116
event : DIDRegistryEvents ,
91
117
meta : LogMeta ,
92
- ) {
118
+ ) -> Result < ( ) , ResolverError < M > > {
119
+ let context = EventContext :: new ( & meta, self . signer ( ) ) . await ?;
93
120
let res = match event {
94
121
DIDRegistryEvents :: DiddelegateChangedFilter ( delegate_changed) => {
95
122
log:: trace!( "Delegate Changed {:?}" , delegate_changed) ;
96
- doc. delegate_event ( delegate_changed)
123
+ doc. delegate_event ( delegate_changed, & context )
97
124
}
98
125
DIDRegistryEvents :: DidattributeChangedFilter ( attribute_event) => {
99
126
log:: trace!( "Attribute Changed {:?}" , attribute_event) ;
100
- doc. attribute_event ( attribute_event)
127
+ doc. attribute_event ( attribute_event, & context )
101
128
}
102
129
DIDRegistryEvents :: DidownerChangedFilter ( owner_changed) => {
103
130
log:: trace!( "Owner Changed {:?}" , owner_changed) ;
@@ -116,6 +143,7 @@ impl<M: Middleware + 'static> Resolver<M> {
116
143
address, meta. block_number, meta. log_index, e,
117
144
) ;
118
145
} ;
146
+ Ok ( ( ) )
119
147
}
120
148
121
149
async fn wrap_did_resolution (
@@ -150,7 +178,8 @@ impl<M: Middleware + 'static> Resolver<M> {
150
178
if version_id. unwrap_or_default ( ) > U64 :: zero ( ) {
151
179
if meta. block_number <= version_id. unwrap_or_default ( ) {
152
180
// 1. delegate events
153
- Resolver :: dispatch_event ( self , & mut base_document, address, event, meta) ;
181
+ Resolver :: dispatch_event ( self , & mut base_document, address, event, meta)
182
+ . await ?;
154
183
// 2. set latest version
155
184
if current_version_id < block_number {
156
185
current_version_id = block_number;
@@ -162,7 +191,7 @@ impl<M: Middleware + 'static> Resolver<M> {
162
191
}
163
192
} else {
164
193
// 1. delegate events
165
- Resolver :: dispatch_event ( self , & mut base_document, address, event, meta) ;
194
+ Resolver :: dispatch_event ( self , & mut base_document, address, event, meta) . await ? ;
166
195
// 2. set latest version
167
196
if current_version_id < block_number {
168
197
current_version_id = block_number;
@@ -216,6 +245,8 @@ impl<M: Middleware + 'static> Resolver<M> {
216
245
217
246
#[ cfg( test) ]
218
247
mod tests {
248
+ use ethers:: { prelude:: Provider , providers:: MockProvider , types:: TxHash } ;
249
+
219
250
use super :: * ;
220
251
221
252
#[ test]
@@ -225,4 +256,23 @@ mod tests {
225
256
let resolver = Resolver :: from ( registry) ;
226
257
assert_eq ! ( resolver. registry. address( ) , Address :: zero( ) ) ;
227
258
}
259
+
260
+ #[ tokio:: test]
261
+ async fn test_context_constructor ( ) {
262
+ let ( provider, mock) = Provider :: mocked ( ) ;
263
+ mock. push ( Block :: < TxHash > :: default ( ) ) . unwrap ( ) ;
264
+
265
+ let meta = LogMeta {
266
+ address : Address :: zero ( ) ,
267
+ block_hash : H256 :: zero ( ) ,
268
+ block_number : U64 :: zero ( ) ,
269
+ log_index : U256 :: zero ( ) ,
270
+ transaction_hash : H256 :: zero ( ) ,
271
+ transaction_index : U64 :: zero ( ) ,
272
+ } ;
273
+ let context = EventContext :: new :: < Provider < MockProvider > > ( & meta, Arc :: new ( provider) )
274
+ . await
275
+ . unwrap ( ) ;
276
+ assert_eq ! ( context. block_timestamp, 0 ) ;
277
+ }
228
278
}
0 commit comments