@@ -120,6 +120,7 @@ impl QuoteGenerator {
120120 content : XorName ,
121121 data_size : usize ,
122122 data_type : u32 ,
123+ close_group : Vec < [ u8 ; 32 ] > ,
123124 ) -> Result < PaymentQuote > {
124125 let sign_fn = self
125126 . sign_fn
@@ -134,9 +135,15 @@ impl QuoteGenerator {
134135 // Convert XorName to xor_name::XorName
135136 let xor_name = xor_name:: XorName ( content) ;
136137
137- // Create bytes for signing (following autonomi's pattern)
138- let bytes =
139- PaymentQuote :: bytes_for_signing ( xor_name, timestamp, & price, & self . rewards_address ) ;
138+ // Create bytes for signing — includes close_group so it's
139+ // cryptographically bound to this quote.
140+ let bytes = PaymentQuote :: bytes_for_signing (
141+ xor_name,
142+ timestamp,
143+ & price,
144+ & self . rewards_address ,
145+ & close_group,
146+ ) ;
140147
141148 // Sign the bytes
142149 let signature = sign_fn ( & bytes) ;
@@ -152,6 +159,7 @@ impl QuoteGenerator {
152159 price,
153160 pub_key : self . pub_key . clone ( ) ,
154161 rewards_address : self . rewards_address ,
162+ close_group,
155163 signature,
156164 } ;
157165
@@ -437,7 +445,7 @@ mod tests {
437445 let generator = create_test_generator ( ) ;
438446 let content = [ 42u8 ; 32 ] ;
439447
440- let quote = generator. create_quote ( content, 1024 , 0 ) ;
448+ let quote = generator. create_quote ( content, 1024 , 0 , vec ! [ ] ) ;
441449 assert ! ( quote. is_ok( ) ) ;
442450
443451 let quote = quote. expect ( "valid quote" ) ;
@@ -450,7 +458,7 @@ mod tests {
450458 let content = [ 42u8 ; 32 ] ;
451459
452460 let quote = generator
453- . create_quote ( content, 1024 , 0 )
461+ . create_quote ( content, 1024 , 0 , vec ! [ ] )
454462 . expect ( "valid quote" ) ;
455463 assert ! ( verify_quote_content( & quote, & content) ) ;
456464
@@ -468,7 +476,7 @@ mod tests {
468476 assert ! ( !generator. can_sign( ) ) ;
469477
470478 let content = [ 42u8 ; 32 ] ;
471- let result = generator. create_quote ( content, 1024 , 0 ) ;
479+ let result = generator. create_quote ( content, 1024 , 0 , vec ! [ ] ) ;
472480 assert ! ( result. is_err( ) ) ;
473481 }
474482
@@ -491,7 +499,7 @@ mod tests {
491499
492500 let content = [ 7u8 ; 32 ] ;
493501 let quote = generator
494- . create_quote ( content, 2048 , 0 )
502+ . create_quote ( content, 2048 , 0 , vec ! [ ] )
495503 . expect ( "create quote" ) ;
496504
497505 // Valid signature should verify
@@ -511,7 +519,7 @@ mod tests {
511519 let content = [ 42u8 ; 32 ] ;
512520
513521 let quote = generator
514- . create_quote ( content, 1024 , 0 )
522+ . create_quote ( content, 1024 , 0 , vec ! [ ] )
515523 . expect ( "create quote" ) ;
516524
517525 // The dummy signer produces a 64-byte fake signature, not a valid
@@ -556,9 +564,15 @@ mod tests {
556564 let content = [ 10u8 ; 32 ] ;
557565
558566 // All data types produce the same price (price depends on records_stored, not data_type)
559- let q0 = generator. create_quote ( content, 1024 , 0 ) . expect ( "type 0" ) ;
560- let q1 = generator. create_quote ( content, 512 , 1 ) . expect ( "type 1" ) ;
561- let q2 = generator. create_quote ( content, 256 , 2 ) . expect ( "type 2" ) ;
567+ let q0 = generator
568+ . create_quote ( content, 1024 , 0 , vec ! [ ] )
569+ . expect ( "type 0" ) ;
570+ let q1 = generator
571+ . create_quote ( content, 512 , 1 , vec ! [ ] )
572+ . expect ( "type 1" ) ;
573+ let q2 = generator
574+ . create_quote ( content, 256 , 2 , vec ! [ ] )
575+ . expect ( "type 2" ) ;
562576
563577 // All quotes should have a valid price (minimum floor of 1)
564578 assert ! ( q0. price >= Amount :: from( 1u64 ) ) ;
@@ -572,7 +586,9 @@ mod tests {
572586 let content = [ 11u8 ; 32 ] ;
573587
574588 // Price depends on records_stored, not data size
575- let quote = generator. create_quote ( content, 0 , 0 ) . expect ( "zero size" ) ;
589+ let quote = generator
590+ . create_quote ( content, 0 , 0 , vec ! [ ] )
591+ . expect ( "zero size" ) ;
576592 assert ! ( quote. price >= Amount :: from( 1u64 ) ) ;
577593 }
578594
@@ -583,7 +599,7 @@ mod tests {
583599
584600 // Price depends on records_stored, not data size
585601 let quote = generator
586- . create_quote ( content, 10_000_000 , 0 )
602+ . create_quote ( content, 10_000_000 , 0 , vec ! [ ] )
587603 . expect ( "large size" ) ;
588604 assert ! ( quote. price >= Amount :: from( 1u64 ) ) ;
589605 }
@@ -595,6 +611,7 @@ mod tests {
595611 timestamp : SystemTime :: now ( ) ,
596612 price : Amount :: from ( 1u64 ) ,
597613 rewards_address : RewardsAddress :: new ( [ 0u8 ; 20 ] ) ,
614+ close_group : vec ! [ ] ,
598615 pub_key : vec ! [ ] ,
599616 signature : vec ! [ ] ,
600617 } ;
0 commit comments