3
3
4
4
use std:: { str:: FromStr , sync:: Arc } ;
5
5
6
- use ipfs:: IpfsFetcher ;
7
- use price:: PriceCalculator ;
6
+ use server:: DipsServerContext ;
8
7
use thegraph_core:: alloy:: {
9
8
core:: primitives:: Address ,
10
9
primitives:: { b256, ChainId , PrimitiveSignature as Signature , Uint , B256 } ,
@@ -18,6 +17,7 @@ pub mod ipfs;
18
17
pub mod price;
19
18
pub mod proto;
20
19
pub mod server;
20
+ pub mod signers;
21
21
pub mod store;
22
22
23
23
use store:: AgreementStore ;
@@ -190,14 +190,16 @@ impl SignedIndexingAgreementVoucher {
190
190
// TODO: Validate all values
191
191
pub fn validate (
192
192
& self ,
193
+ signer_validator : & Arc < dyn signers:: SignerValidator > ,
193
194
domain : & Eip712Domain ,
194
195
expected_payee : & Address ,
195
196
allowed_payers : impl AsRef < [ Address ] > ,
196
197
) -> Result < ( ) , DipsError > {
197
198
let sig = Signature :: from_str ( & self . signature . to_string ( ) )
198
199
. map_err ( |err| DipsError :: InvalidSignature ( err. to_string ( ) ) ) ?;
199
200
200
- let payer = sig
201
+ let payer = self . voucher . payer ;
202
+ let signer = sig
201
203
. recover_address_from_prehash ( & self . voucher . eip712_signing_hash ( domain) )
202
204
. map_err ( |err| DipsError :: InvalidSignature ( err. to_string ( ) ) ) ?;
203
205
@@ -207,6 +209,10 @@ impl SignedIndexingAgreementVoucher {
207
209
return Err ( DipsError :: PayerNotAuthorised ( payer) ) ;
208
210
}
209
211
212
+ signer_validator
213
+ . validate ( & payer, & signer)
214
+ . map_err ( |_| DipsError :: SignerNotAuthorised ( signer) ) ?;
215
+
210
216
if !self . voucher . recipient . eq ( expected_payee) {
211
217
return Err ( DipsError :: UnexpectedPayee {
212
218
expected : * expected_payee,
@@ -284,14 +290,18 @@ impl CollectionRequest {
284
290
}
285
291
286
292
pub async fn validate_and_create_agreement (
287
- store : Arc < dyn AgreementStore > ,
293
+ ctx : Arc < DipsServerContext > ,
288
294
domain : & Eip712Domain ,
289
295
expected_payee : & Address ,
290
296
allowed_payers : impl AsRef < [ Address ] > ,
291
297
voucher : Vec < u8 > ,
292
- price_calculator : & PriceCalculator ,
293
- ipfs_client : Arc < dyn IpfsFetcher > ,
294
298
) -> Result < Uuid , DipsError > {
299
+ let DipsServerContext {
300
+ store,
301
+ ipfs_fetcher,
302
+ price_calculator,
303
+ signer_validator,
304
+ } = ctx. as_ref ( ) ;
295
305
let decoded_voucher = SignedIndexingAgreementVoucher :: abi_decode ( voucher. as_ref ( ) , true )
296
306
. map_err ( |e| DipsError :: AbiDecoding ( e. to_string ( ) ) ) ?;
297
307
let metadata = SubgraphIndexingVoucherMetadata :: abi_decode (
@@ -300,9 +310,9 @@ pub async fn validate_and_create_agreement(
300
310
)
301
311
. map_err ( |e| DipsError :: AbiDecoding ( e. to_string ( ) ) ) ?;
302
312
303
- decoded_voucher. validate ( domain, expected_payee, allowed_payers) ?;
313
+ decoded_voucher. validate ( signer_validator , domain, expected_payee, allowed_payers) ?;
304
314
305
- let manifest = ipfs_client . fetch ( & metadata. subgraphDeploymentId ) . await ?;
315
+ let manifest = ipfs_fetcher . fetch ( & metadata. subgraphDeploymentId ) . await ?;
306
316
match manifest. network ( ) {
307
317
Some ( chain_id) if chain_id == metadata. chainId => { }
308
318
Some ( chain_id) => {
@@ -384,9 +394,9 @@ mod test {
384
394
385
395
pub use crate :: store:: { AgreementStore , InMemoryAgreementStore } ;
386
396
use crate :: {
387
- dips_agreement_eip712_domain, dips_cancellation_eip712_domain, ipfs :: TestIpfsClient ,
388
- price :: PriceCalculator , CancellationRequest , DipsError , IndexingAgreementVoucher ,
389
- SignedIndexingAgreementVoucher , SubgraphIndexingVoucherMetadata ,
397
+ dips_agreement_eip712_domain, dips_cancellation_eip712_domain, server :: DipsServerContext ,
398
+ CancellationRequest , DipsError , IndexingAgreementVoucher , SignedIndexingAgreementVoucher ,
399
+ SubgraphIndexingVoucherMetadata ,
390
400
} ;
391
401
392
402
#[ tokio:: test]
@@ -424,22 +434,19 @@ mod test {
424
434
let abi_voucher = voucher. abi_encode ( ) ;
425
435
let id = Uuid :: from_bytes ( voucher. voucher . agreement_id . into ( ) ) ;
426
436
427
- let store = Arc :: new ( InMemoryAgreementStore :: default ( ) ) ;
428
-
437
+ let ctx = DipsServerContext :: for_testing ( ) ;
429
438
let actual_id = super :: validate_and_create_agreement (
430
- store . clone ( ) ,
439
+ ctx . clone ( ) ,
431
440
& domain,
432
441
& payee_addr,
433
442
vec ! [ payer_addr] ,
434
443
abi_voucher,
435
- & PriceCalculator :: for_testing ( ) ,
436
- Arc :: new ( TestIpfsClient :: mainnet ( ) ) ,
437
444
)
438
445
. await
439
446
. unwrap ( ) ;
440
447
assert_eq ! ( actual_id, id) ;
441
448
442
- let stored_agreement = store. get_by_id ( actual_id) . await . unwrap ( ) . unwrap ( ) ;
449
+ let stored_agreement = ctx . store . get_by_id ( actual_id) . await . unwrap ( ) . unwrap ( ) ;
443
450
444
451
assert_eq ! ( voucher, stored_agreement. voucher) ;
445
452
assert ! ( !stored_agreement. cancelled) ;
@@ -448,6 +455,7 @@ mod test {
448
455
449
456
#[ test]
450
457
fn voucher_signature_verification ( ) {
458
+ let ctx = DipsServerContext :: for_testing ( ) ;
451
459
let deployment_id = "Qmbg1qF4YgHjiVfsVt6a13ddrVcRtWyJQfD4LA3CwHM29f" . to_string ( ) ;
452
460
let payee = PrivateKeySigner :: random ( ) ;
453
461
let payee_addr = payee. address ( ) ;
@@ -480,18 +488,24 @@ mod test {
480
488
let signed = voucher. sign ( & domain, payer) . unwrap ( ) ;
481
489
assert_eq ! (
482
490
signed
483
- . validate( & domain, & payee_addr, vec![ ] )
491
+ . validate( & ctx . signer_validator , & domain, & payee_addr, vec![ ] )
484
492
. unwrap_err( )
485
493
. to_string( ) ,
486
494
DipsError :: PayerNotAuthorised ( voucher. payer) . to_string( )
487
495
) ;
488
496
assert ! ( signed
489
- . validate( & domain, & payee_addr, vec![ payer_addr] )
497
+ . validate(
498
+ & ctx. signer_validator,
499
+ & domain,
500
+ & payee_addr,
501
+ vec![ payer_addr]
502
+ )
490
503
. is_ok( ) ) ;
491
504
}
492
505
493
506
#[ test]
494
507
fn check_voucher_modified ( ) {
508
+ let ctx = DipsServerContext :: for_testing ( ) ;
495
509
let deployment_id = "Qmbg1qF4YgHjiVfsVt6a13ddrVcRtWyJQfD4LA3CwHM29f" . to_string ( ) ;
496
510
let payee = PrivateKeySigner :: random ( ) ;
497
511
let payee_addr = payee. address ( ) ;
@@ -526,7 +540,12 @@ mod test {
526
540
527
541
assert ! ( matches!(
528
542
signed
529
- . validate( & domain, & payee_addr, vec![ payer_addr] )
543
+ . validate(
544
+ & ctx. signer_validator,
545
+ & domain,
546
+ & payee_addr,
547
+ vec![ payer_addr]
548
+ )
530
549
. unwrap_err( ) ,
531
550
DipsError :: PayerNotAuthorised ( _)
532
551
) ) ;
@@ -630,6 +649,7 @@ mod test {
630
649
631
650
#[ tokio:: test]
632
651
async fn test_create_and_cancel_agreement ( ) -> anyhow:: Result < ( ) > {
652
+ let ctx = DipsServerContext :: for_testing ( ) ;
633
653
let voucher_ctx = VoucherContext :: random ( ) ;
634
654
let store = Arc :: new ( InMemoryAgreementStore :: default ( ) ) ;
635
655
@@ -645,13 +665,11 @@ mod test {
645
665
646
666
// Create agreement
647
667
let agreement_id = super :: validate_and_create_agreement (
648
- store . clone ( ) ,
668
+ ctx . clone ( ) ,
649
669
& voucher_ctx. domain ( ) ,
650
670
& voucher_ctx. payee . address ( ) ,
651
671
vec ! [ voucher_ctx. payer. address( ) ] ,
652
672
signed_voucher. encode_vec ( ) ,
653
- & PriceCalculator :: for_testing ( ) ,
654
- Arc :: new ( TestIpfsClient :: mainnet ( ) ) ,
655
673
)
656
674
. await ?;
657
675
@@ -681,8 +699,8 @@ mod test {
681
699
682
700
#[ tokio:: test]
683
701
async fn test_create_validations_errors ( ) -> anyhow:: Result < ( ) > {
702
+ let ctx = DipsServerContext :: for_testing ( ) ;
684
703
let voucher_ctx = VoucherContext :: random ( ) ;
685
- let store = Arc :: new ( InMemoryAgreementStore :: default ( ) ) ;
686
704
687
705
let metadata = SubgraphIndexingVoucherMetadata {
688
706
basePricePerEpoch : U256 :: from ( 10000_u64 ) ,
@@ -734,13 +752,11 @@ mod test {
734
752
let cases = vec ! [ wrong_network_voucher, low_price_voucher, valid_voucher] ;
735
753
for ( voucher, result) in cases. into_iter ( ) . zip ( expected_result. into_iter ( ) ) {
736
754
let out = super :: validate_and_create_agreement (
737
- store . clone ( ) ,
755
+ ctx . clone ( ) ,
738
756
& voucher_ctx. domain ( ) ,
739
757
& voucher_ctx. payee . address ( ) ,
740
758
vec ! [ voucher_ctx. payer. address( ) ] ,
741
759
voucher. encode_vec ( ) ,
742
- & PriceCalculator :: for_testing ( ) ,
743
- Arc :: new ( TestIpfsClient :: mainnet ( ) ) ,
744
760
)
745
761
. await ;
746
762
0 commit comments