44 chrono:: { DateTime , NaiveDateTime } ,
55 ethers:: { core:: utils:: hex:: ToHex , prelude:: TxHash , types:: Address } ,
66 serde:: Serialize ,
7+ serde_with:: serde_as,
78 sqlx:: { migrate, Pool , Sqlite , SqlitePool } ,
89 std:: sync:: Arc ,
910 tokio:: { spawn, sync:: mpsc} ,
1011 utoipa:: ToSchema ,
1112} ;
1213
14+ #[ serde_as]
1315#[ derive( Clone , Debug , Serialize , ToSchema , PartialEq ) ]
1416#[ serde( tag = "state" , rename_all = "kebab-case" ) ]
1517pub enum RequestEntryState {
@@ -19,12 +21,17 @@ pub enum RequestEntryState {
1921 /// The transaction hash of the reveal transaction.
2022 #[ schema( example = "0xfe5f880ac10c0aae43f910b5a17f98a93cdd2eb2dce3a5ae34e5827a3a071a32" , value_type = String ) ]
2123 reveal_tx_hash : TxHash ,
24+ /// The provider contribution to the random number.
25+ #[ schema( example = "a905ab56567d31a7fda38ed819d97bc257f3ebe385fc5c72ce226d3bb855f0fe" ) ]
26+ #[ serde_as( as = "serde_with::hex::Hex" ) ]
27+ provider_random_number : [ u8 ; 32 ] ,
2228 } ,
2329 Failed {
2430 reason : String ,
2531 } ,
2632}
2733
34+ #[ serde_as]
2835#[ derive( Clone , Debug , Serialize , ToSchema , PartialEq ) ]
2936pub struct RequestStatus {
3037 /// The chain ID of the request.
@@ -41,6 +48,10 @@ pub struct RequestStatus {
4148 /// The transaction hash of the request transaction.
4249 #[ schema( example = "0x5a3a984f41bb5443f5efa6070ed59ccb25edd8dbe6ce7f9294cf5caa64ed00ae" , value_type = String ) ]
4350 pub request_tx_hash : TxHash ,
51+ /// The user contribution to the random number.
52+ #[ schema( example = "a905ab56567d31a7fda38ed819d97bc257f3ebe385fc5c72ce226d3bb855f0fe" ) ]
53+ #[ serde_as( as = "serde_with::hex::Hex" ) ]
54+ pub user_random_number : [ u8 ; 32 ] ,
4455 /// This is the address that initiated the request.
4556 #[ schema( example = "0x78357316239040e19fc823372cc179ca75e64b81" , value_type = String ) ]
4657 pub sender : Address ,
@@ -57,9 +68,11 @@ struct RequestRow {
5768 state : String ,
5869 request_block_number : i64 ,
5970 request_tx_hash : String ,
71+ user_random_number : String ,
6072 sender : String ,
6173 reveal_block_number : Option < i64 > ,
6274 reveal_tx_hash : Option < String > ,
75+ provider_random_number : Option < String > ,
6376 info : Option < String > ,
6477}
6578
@@ -73,6 +86,7 @@ impl TryFrom<RequestRow> for RequestStatus {
7386 let created_at = row. created_at . and_utc ( ) ;
7487 let last_updated_at = row. last_updated_at . and_utc ( ) ;
7588 let request_block_number = row. request_block_number as u64 ;
89+ let user_random_number = hex:: FromHex :: from_hex ( row. user_random_number ) ?;
7690 let request_tx_hash = row. request_tx_hash . parse ( ) ?;
7791 let sender = row. sender . parse ( ) ?;
7892
@@ -88,9 +102,15 @@ impl TryFrom<RequestRow> for RequestStatus {
88102 "Reveal transaction hash is missing for completed request"
89103 ) ) ?
90104 . parse ( ) ?;
105+ let provider_random_number = row. provider_random_number . ok_or ( anyhow:: anyhow!(
106+ "Provider random number is missing for completed request"
107+ ) ) ?;
108+ let provider_random_number: [ u8 ; 32 ] =
109+ hex:: FromHex :: from_hex ( provider_random_number) ?;
91110 RequestEntryState :: Completed {
92111 reveal_block_number,
93112 reveal_tx_hash,
113+ provider_random_number,
94114 }
95115 }
96116 "Failed" => RequestEntryState :: Failed {
@@ -107,6 +127,7 @@ impl TryFrom<RequestRow> for RequestStatus {
107127 state,
108128 request_block_number,
109129 request_tx_hash,
130+ user_random_number,
110131 sender,
111132 } )
112133 }
@@ -170,7 +191,8 @@ impl History {
170191 RequestEntryState :: Pending => {
171192 let block_number = new_status. request_block_number as i64 ;
172193 let sender: String = new_status. sender . encode_hex ( ) ;
173- sqlx:: query!( "INSERT INTO request(chain_id, provider, sequence, created_at, last_updated_at, state, request_block_number, request_tx_hash, sender) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)" ,
194+ let user_random_number: String = new_status. user_random_number . encode_hex ( ) ;
195+ sqlx:: query!( "INSERT INTO request(chain_id, provider, sequence, created_at, last_updated_at, state, request_block_number, request_tx_hash, user_random_number, sender) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" ,
174196 chain_id,
175197 provider,
176198 sequence,
@@ -179,21 +201,25 @@ impl History {
179201 "Pending" ,
180202 block_number,
181203 request_tx_hash,
204+ user_random_number,
182205 sender)
183206 . execute ( pool)
184207 . await
185208 }
186209 RequestEntryState :: Completed {
187210 reveal_block_number,
188211 reveal_tx_hash,
212+ provider_random_number,
189213 } => {
190214 let reveal_block_number = reveal_block_number as i64 ;
191215 let reveal_tx_hash: String = reveal_tx_hash. encode_hex ( ) ;
192- sqlx:: query!( "UPDATE request SET state = ?, last_updated_at = ?, reveal_block_number = ?, reveal_tx_hash = ? WHERE chain_id = ? AND sequence = ? AND provider = ? AND request_tx_hash = ?" ,
216+ let provider_random_number: String = provider_random_number. encode_hex ( ) ;
217+ sqlx:: query!( "UPDATE request SET state = ?, last_updated_at = ?, reveal_block_number = ?, reveal_tx_hash = ?, provider_random_number = ? WHERE chain_id = ? AND sequence = ? AND provider = ? AND request_tx_hash = ?" ,
193218 "Completed" ,
194219 new_status. last_updated_at,
195220 reveal_block_number,
196221 reveal_tx_hash,
222+ provider_random_number,
197223 chain_id,
198224 sequence,
199225 provider,
@@ -362,6 +388,7 @@ mod test {
362388 last_updated_at : chrono:: Utc :: now ( ) ,
363389 request_block_number : 1 ,
364390 request_tx_hash : TxHash :: random ( ) ,
391+ user_random_number : [ 20 ; 32 ] ,
365392 sender : Address :: random ( ) ,
366393 state : RequestEntryState :: Pending ,
367394 }
@@ -376,6 +403,7 @@ mod test {
376403 status. state = RequestEntryState :: Completed {
377404 reveal_block_number : 1 ,
378405 reveal_tx_hash,
406+ provider_random_number : [ 40 ; 32 ] ,
379407 } ;
380408 History :: update_request_status ( & history. pool , status. clone ( ) ) . await ;
381409
0 commit comments