33
44use std:: { str:: FromStr , sync:: Arc } ;
55
6- use ipfs:: IpfsFetcher ;
7- use price:: PriceCalculator ;
6+ use server:: DipsServerContext ;
87use thegraph_core:: alloy:: {
98 core:: primitives:: Address ,
109 primitives:: { b256, ChainId , PrimitiveSignature as Signature , Uint , B256 } ,
@@ -18,6 +17,7 @@ pub mod ipfs;
1817pub mod price;
1918pub mod proto;
2019pub mod server;
20+ pub mod signers;
2121pub mod store;
2222
2323use store:: AgreementStore ;
@@ -190,14 +190,16 @@ impl SignedIndexingAgreementVoucher {
190190 // TODO: Validate all values
191191 pub fn validate (
192192 & self ,
193+ signer_validator : & Arc < dyn signers:: SignerValidator > ,
193194 domain : & Eip712Domain ,
194195 expected_payee : & Address ,
195196 allowed_payers : impl AsRef < [ Address ] > ,
196197 ) -> Result < ( ) , DipsError > {
197198 let sig = Signature :: from_str ( & self . signature . to_string ( ) )
198199 . map_err ( |err| DipsError :: InvalidSignature ( err. to_string ( ) ) ) ?;
199200
200- let payer = sig
201+ let payer = self . voucher . payer ;
202+ let signer = sig
201203 . recover_address_from_prehash ( & self . voucher . eip712_signing_hash ( domain) )
202204 . map_err ( |err| DipsError :: InvalidSignature ( err. to_string ( ) ) ) ?;
203205
@@ -207,6 +209,10 @@ impl SignedIndexingAgreementVoucher {
207209 return Err ( DipsError :: PayerNotAuthorised ( payer) ) ;
208210 }
209211
212+ signer_validator
213+ . validate ( & payer, & signer)
214+ . map_err ( |_| DipsError :: SignerNotAuthorised ( signer) ) ?;
215+
210216 if !self . voucher . recipient . eq ( expected_payee) {
211217 return Err ( DipsError :: UnexpectedPayee {
212218 expected : * expected_payee,
@@ -284,14 +290,18 @@ impl CollectionRequest {
284290}
285291
286292pub async fn validate_and_create_agreement (
287- store : Arc < dyn AgreementStore > ,
293+ ctx : Arc < DipsServerContext > ,
288294 domain : & Eip712Domain ,
289295 expected_payee : & Address ,
290296 allowed_payers : impl AsRef < [ Address ] > ,
291297 voucher : Vec < u8 > ,
292- price_calculator : & PriceCalculator ,
293- ipfs_client : Arc < dyn IpfsFetcher > ,
294298) -> Result < Uuid , DipsError > {
299+ let DipsServerContext {
300+ store,
301+ ipfs_fetcher,
302+ price_calculator,
303+ signer_validator,
304+ } = ctx. as_ref ( ) ;
295305 let decoded_voucher = SignedIndexingAgreementVoucher :: abi_decode ( voucher. as_ref ( ) , true )
296306 . map_err ( |e| DipsError :: AbiDecoding ( e. to_string ( ) ) ) ?;
297307 let metadata = SubgraphIndexingVoucherMetadata :: abi_decode (
@@ -300,9 +310,9 @@ pub async fn validate_and_create_agreement(
300310 )
301311 . map_err ( |e| DipsError :: AbiDecoding ( e. to_string ( ) ) ) ?;
302312
303- decoded_voucher. validate ( domain, expected_payee, allowed_payers) ?;
313+ decoded_voucher. validate ( signer_validator , domain, expected_payee, allowed_payers) ?;
304314
305- let manifest = ipfs_client . fetch ( & metadata. subgraphDeploymentId ) . await ?;
315+ let manifest = ipfs_fetcher . fetch ( & metadata. subgraphDeploymentId ) . await ?;
306316 match manifest. network ( ) {
307317 Some ( chain_id) if chain_id == metadata. chainId => { }
308318 Some ( chain_id) => {
@@ -384,9 +394,9 @@ mod test {
384394
385395 pub use crate :: store:: { AgreementStore , InMemoryAgreementStore } ;
386396 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 ,
390400 } ;
391401
392402 #[ tokio:: test]
@@ -424,22 +434,19 @@ mod test {
424434 let abi_voucher = voucher. abi_encode ( ) ;
425435 let id = Uuid :: from_bytes ( voucher. voucher . agreement_id . into ( ) ) ;
426436
427- let store = Arc :: new ( InMemoryAgreementStore :: default ( ) ) ;
428-
437+ let ctx = DipsServerContext :: for_testing ( ) ;
429438 let actual_id = super :: validate_and_create_agreement (
430- store . clone ( ) ,
439+ ctx . clone ( ) ,
431440 & domain,
432441 & payee_addr,
433442 vec ! [ payer_addr] ,
434443 abi_voucher,
435- & PriceCalculator :: for_testing ( ) ,
436- Arc :: new ( TestIpfsClient :: mainnet ( ) ) ,
437444 )
438445 . await
439446 . unwrap ( ) ;
440447 assert_eq ! ( actual_id, id) ;
441448
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 ( ) ;
443450
444451 assert_eq ! ( voucher, stored_agreement. voucher) ;
445452 assert ! ( !stored_agreement. cancelled) ;
@@ -448,6 +455,7 @@ mod test {
448455
449456 #[ test]
450457 fn voucher_signature_verification ( ) {
458+ let ctx = DipsServerContext :: for_testing ( ) ;
451459 let deployment_id = "Qmbg1qF4YgHjiVfsVt6a13ddrVcRtWyJQfD4LA3CwHM29f" . to_string ( ) ;
452460 let payee = PrivateKeySigner :: random ( ) ;
453461 let payee_addr = payee. address ( ) ;
@@ -480,18 +488,24 @@ mod test {
480488 let signed = voucher. sign ( & domain, payer) . unwrap ( ) ;
481489 assert_eq ! (
482490 signed
483- . validate( & domain, & payee_addr, vec![ ] )
491+ . validate( & ctx . signer_validator , & domain, & payee_addr, vec![ ] )
484492 . unwrap_err( )
485493 . to_string( ) ,
486494 DipsError :: PayerNotAuthorised ( voucher. payer) . to_string( )
487495 ) ;
488496 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+ )
490503 . is_ok( ) ) ;
491504 }
492505
493506 #[ test]
494507 fn check_voucher_modified ( ) {
508+ let ctx = DipsServerContext :: for_testing ( ) ;
495509 let deployment_id = "Qmbg1qF4YgHjiVfsVt6a13ddrVcRtWyJQfD4LA3CwHM29f" . to_string ( ) ;
496510 let payee = PrivateKeySigner :: random ( ) ;
497511 let payee_addr = payee. address ( ) ;
@@ -526,7 +540,12 @@ mod test {
526540
527541 assert ! ( matches!(
528542 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+ )
530549 . unwrap_err( ) ,
531550 DipsError :: PayerNotAuthorised ( _)
532551 ) ) ;
@@ -630,6 +649,7 @@ mod test {
630649
631650 #[ tokio:: test]
632651 async fn test_create_and_cancel_agreement ( ) -> anyhow:: Result < ( ) > {
652+ let ctx = DipsServerContext :: for_testing ( ) ;
633653 let voucher_ctx = VoucherContext :: random ( ) ;
634654 let store = Arc :: new ( InMemoryAgreementStore :: default ( ) ) ;
635655
@@ -645,13 +665,11 @@ mod test {
645665
646666 // Create agreement
647667 let agreement_id = super :: validate_and_create_agreement (
648- store . clone ( ) ,
668+ ctx . clone ( ) ,
649669 & voucher_ctx. domain ( ) ,
650670 & voucher_ctx. payee . address ( ) ,
651671 vec ! [ voucher_ctx. payer. address( ) ] ,
652672 signed_voucher. encode_vec ( ) ,
653- & PriceCalculator :: for_testing ( ) ,
654- Arc :: new ( TestIpfsClient :: mainnet ( ) ) ,
655673 )
656674 . await ?;
657675
@@ -681,8 +699,8 @@ mod test {
681699
682700 #[ tokio:: test]
683701 async fn test_create_validations_errors ( ) -> anyhow:: Result < ( ) > {
702+ let ctx = DipsServerContext :: for_testing ( ) ;
684703 let voucher_ctx = VoucherContext :: random ( ) ;
685- let store = Arc :: new ( InMemoryAgreementStore :: default ( ) ) ;
686704
687705 let metadata = SubgraphIndexingVoucherMetadata {
688706 basePricePerEpoch : U256 :: from ( 10000_u64 ) ,
@@ -734,13 +752,11 @@ mod test {
734752 let cases = vec ! [ wrong_network_voucher, low_price_voucher, valid_voucher] ;
735753 for ( voucher, result) in cases. into_iter ( ) . zip ( expected_result. into_iter ( ) ) {
736754 let out = super :: validate_and_create_agreement (
737- store . clone ( ) ,
755+ ctx . clone ( ) ,
738756 & voucher_ctx. domain ( ) ,
739757 & voucher_ctx. payee . address ( ) ,
740758 vec ! [ voucher_ctx. payer. address( ) ] ,
741759 voucher. encode_vec ( ) ,
742- & PriceCalculator :: for_testing ( ) ,
743- Arc :: new ( TestIpfsClient :: mainnet ( ) ) ,
744760 )
745761 . await ;
746762
0 commit comments