1616
1717package com .iexec .blockchain .broker ;
1818
19- import com .iexec .blockchain .tool .ChainConfig ;
2019import com .iexec .blockchain .tool .IexecHubService ;
2120import com .iexec .common .sdk .broker .BrokerOrder ;
22- import com .iexec .common .sdk .cli .FillOrdersCliOutput ;
23- import com .iexec .common .utils .FeignBuilder ;
2421import com .iexec .commons .poco .chain .ChainAccount ;
22+ import com .iexec .commons .poco .contract .generated .IexecHubContract ;
2523import com .iexec .commons .poco .order .AppOrder ;
2624import com .iexec .commons .poco .order .DatasetOrder ;
2725import com .iexec .commons .poco .order .RequestOrder ;
2826import com .iexec .commons .poco .order .WorkerpoolOrder ;
2927import com .iexec .commons .poco .utils .BytesUtils ;
30- import feign .Logger ;
3128import lombok .extern .slf4j .Slf4j ;
3229import org .apache .commons .lang3 .StringUtils ;
30+ import org .springframework .context .annotation .Profile ;
3331import org .springframework .stereotype .Service ;
32+ import org .web3j .protocol .core .methods .response .TransactionReceipt ;
3433
3534import java .math .BigInteger ;
3635import java .text .MessageFormat ;
36+ import java .util .List ;
3737import java .util .Objects ;
3838import java .util .Optional ;
39+ import java .util .stream .Collectors ;
3940
4041@ Slf4j
4142@ Service
43+ @ Profile ("itest" )
4244public class BrokerService {
4345
44- private final BrokerClient brokerClient ;
4546 private final IexecHubService iexecHubService ;
4647
4748
48- public BrokerService (ChainConfig chainConfig , IexecHubService iexecHubService ) {
49- //TODO Assert broker is up
49+ public BrokerService (IexecHubService iexecHubService ) {
5050 this .iexecHubService = iexecHubService ;
51- this .brokerClient = FeignBuilder .createBuilder (Logger .Level .BASIC )
52- .target (BrokerClient .class , chainConfig .getBrokerUrl ());
5351 }
5452
5553 void checkBrokerOrder (BrokerOrder brokerOrder ) {
@@ -97,7 +95,8 @@ public String matchOrders(BrokerOrder brokerOrder) {
9795 RequestOrder requestOrder = brokerOrder .getRequestOrder ();
9896 final boolean withDataset = withDataset (requestOrder .getDataset ());
9997 BigInteger datasetPrice = withDataset ? datasetOrder .getDatasetprice () : BigInteger .ZERO ;
100- if (!hasRequesterAcceptedPrices (brokerOrder .getRequestOrder (),
98+ if (!hasRequesterAcceptedPrices (
99+ requestOrder ,
101100 appOrder .getAppprice (),
102101 workerpoolOrder .getWorkerpoolprice (),
103102 datasetPrice ,
@@ -114,27 +113,51 @@ public String matchOrders(BrokerOrder brokerOrder) {
114113 datasetPrice .longValue ())) {
115114 throw new IllegalStateException ("Deposit too low" );
116115 }
117- String beneficiary = brokerOrder . getRequestOrder () .getBeneficiary ();
116+ String beneficiary = requestOrder .getBeneficiary ();
118117 String messageDetails = MessageFormat .format ("requester:{0}, beneficiary:{1}, pool:{2}, app:{3}" ,
119118 requestOrder .getRequester (), beneficiary , workerpoolOrder .getWorkerpool (), appOrder .getApp ());
120119 if (withDataset ) {
121120 messageDetails += ", dataset:" + datasetOrder .getDataset ();
122121 }
123122 log .info ("Matching valid orders on-chain [{}]" , messageDetails );
124- return fireMatchOrders (brokerOrder ).orElse ("" );
123+ return fireMatchOrders (appOrder , datasetOrder , workerpoolOrder , requestOrder )
124+ .orElse ("" );
125125 }
126126
127- Optional <String > fireMatchOrders (BrokerOrder brokerOrder ) {
127+ Optional <String > fireMatchOrders (
128+ AppOrder appOrder ,
129+ DatasetOrder datasetOrder ,
130+ WorkerpoolOrder workerpoolOrder ,
131+ RequestOrder requestOrder ) {
128132 try {
129- FillOrdersCliOutput dealResponse = brokerClient .matchOrders (brokerOrder );
130- log .info ("Matched orders [chainDealId:{}, tx:{}]" , dealResponse .getDealid (), dealResponse .getTxHash ());
131- return Optional .of (dealResponse .getDealid ());
133+ TransactionReceipt receipt = iexecHubService .
134+ getHubContract ()
135+ .matchOrders (
136+ appOrder .toHubContract (),
137+ datasetOrder .toHubContract (),
138+ workerpoolOrder .toHubContract (),
139+ requestOrder .toHubContract ()
140+ ).send ();
141+ log .info ("block {}, hash {}, status {}" , receipt .getBlockNumber (), receipt .getTransactionHash (), receipt .getStatus ());
142+ log .info ("logs count {}" , receipt .getLogs ().size ());
143+
144+ String workerpoolAddress = workerpoolOrder .getWorkerpool ();
145+ List <String > events = IexecHubContract .getSchedulerNoticeEvents (receipt )
146+ .stream ()
147+ .filter (event -> workerpoolAddress .equals (event .workerpool ))
148+ .map (event -> BytesUtils .bytesToString (event .dealid ))
149+ .collect (Collectors .toList ());
150+ log .info ("events count {}" , events .size ());
151+ if (events .size () != 1 ) {
152+ throw new IllegalStateException ("A single deal should have been created, not " + events .size ());
153+ }
154+ String dealId = events .get (0 );
155+ log .info ("Matched orders [chainDealId:{}, tx:{}]" , dealId , receipt .getTransactionHash ());
156+ return Optional .of (dealId );
132157 } catch (Exception e ) {
133158 log .error ("Failed to request match order [requester:{}, app:{}, workerpool:{}, dataset:{}]" ,
134- brokerOrder .getRequestOrder ().getRequester (),
135- brokerOrder .getRequestOrder ().getApp (),
136- brokerOrder .getRequestOrder ().getWorkerpool (),
137- brokerOrder .getRequestOrder ().getDataset (), e );
159+ requestOrder .getRequester (), requestOrder .getApp (),
160+ requestOrder .getWorkerpool (), requestOrder .getDataset (), e );
138161 }
139162 return Optional .empty ();
140163 }
0 commit comments