99 "github.com/rs/zerolog/log"
1010)
1111
12+ const urlPath = "/bridge/v1"
13+
1214type BridgeService struct {
1315 bridge_service.BridgeServiceBase
1416 httpClient * http.Client
@@ -23,19 +25,26 @@ func NewBridgeService(url string, insecure bool) (*BridgeService, error) {
2325}
2426
2527func (s * BridgeService ) GetDeposit (depositNetwork , depositCount uint32 ) (* bridge_service.Deposit , error ) {
26- endpoint := fmt .Sprintf ("%s/bridges?network_id=%d&deposit_count =%d" , s .BridgeServiceBase .Url (), depositNetwork , depositCount )
27- resp , respError , statusCode , err := httpjson .HTTPGetWithError [GetBridgeResponse , ErrorResponse ](s .httpClient , endpoint )
28+ bridgeEndpoint := fmt .Sprintf ("%s/%s/ bridges?network_id=%d&deposi.t_count =%d" , s .BridgeServiceBase .Url (), urlPath , depositNetwork , depositCount )
29+ bridgeResp , bridgeRespError , statusCode , err := httpjson .HTTPGetWithError [GetBridgeResponse , ErrorResponse ](s .httpClient , bridgeEndpoint )
2830 if err != nil {
2931 return nil , err
3032 }
3133
3234 if statusCode != http .StatusOK {
3335 errMsg := "unable to retrieve bridge deposit"
34- log .Warn ().Int ("code" , statusCode ).Str ("message" , respError .Error ).Msgf ("%s" , errMsg )
36+ log .Warn ().Int ("code" , statusCode ).Str ("message" , bridgeRespError .Error ).Msgf ("%s" , errMsg )
3537 return nil , bridge_service .ErrUnableToRetrieveDeposit
3638 }
3739
38- deposit := resp .Bridges [0 ].ToDeposit ()
40+ if len (bridgeResp .Bridges ) == 0 {
41+ return nil , fmt .Errorf ("no deposit found in the response" )
42+ }
43+
44+ deposit , err := s .responseToDeposit (bridgeResp .Bridges [0 ])
45+ if err != nil {
46+ return nil , err
47+ }
3948
4049 return deposit , nil
4150}
@@ -45,11 +54,11 @@ func (s *BridgeService) GetDeposits(destinationAddress string, offset, limit int
4554 pageNumber := offset / limit + 1
4655 skipItems := offset % limit
4756
48- const endpointTemplate = "%s/bridges?from_address=%s&page_number=%d&page_size=%d"
57+ const endpointTemplate = "%s/%s/ bridges?from_address=%s&page_number=%d&page_size=%d"
4958
5059 // loads all deposits when offset is exactly the size of a page or the first part of them when offset is not
5160 // exactly the size of a page
52- endpoint := fmt .Sprintf (endpointTemplate , s .BridgeServiceBase .Url (), destinationAddress , pageNumber , pageSize )
61+ endpoint := fmt .Sprintf (endpointTemplate , s .BridgeServiceBase .Url (), urlPath , destinationAddress , pageNumber , pageSize )
5362 resp , respError , statusCode , err := httpjson .HTTPGetWithError [GetBridgeResponse , ErrorResponse ](s .httpClient , endpoint )
5463 if err != nil {
5564 return nil , 0 , err
@@ -68,7 +77,7 @@ func (s *BridgeService) GetDeposits(destinationAddress string, offset, limit int
6877 // this is needed because the API only supports pagination by page number and page size
6978 // and not by offset and limit
7079 if skipItems > 0 {
71- endpoint := fmt .Sprintf (endpointTemplate , s .BridgeServiceBase .Url (), destinationAddress , pageNumber + 1 , pageSize )
80+ endpoint := fmt .Sprintf (endpointTemplate , s .BridgeServiceBase .Url (), urlPath , destinationAddress , pageNumber + 1 , pageSize )
7281 resp , respError , statusCode , err = httpjson .HTTPGetWithError [GetBridgeResponse , ErrorResponse ](s .httpClient , endpoint )
7382 if err != nil {
7483 return nil , 0 , err
@@ -89,8 +98,11 @@ func (s *BridgeService) GetDeposits(destinationAddress string, offset, limit int
8998 }
9099
91100 deposits := make ([]bridge_service.Deposit , 0 , len (bridgesResponses ))
92- for _ , d := range bridgesResponses {
93- deposit := d .ToDeposit ()
101+ for _ , bridgeResp := range bridgesResponses {
102+ deposit , err := s .responseToDeposit (bridgeResp )
103+ if err != nil {
104+ return nil , 0 , err
105+ }
94106 deposits = append (deposits , * deposit )
95107 }
96108
@@ -99,30 +111,93 @@ func (s *BridgeService) GetDeposits(destinationAddress string, offset, limit int
99111}
100112
101113func (s * BridgeService ) GetProof (depositNetwork , depositCount uint32 ) (* bridge_service.Proof , error ) {
102- l1InfoTreeIndexEndpoint := fmt .Sprintf ("%s/l1-info-tree-index?network_id=%d&deposit_count=%d" , s .BridgeServiceBase .Url (), depositNetwork , depositCount )
103- l1InfoTreeIndex , l1InfoTreeIndexRespError , statusCode , err := httpjson .HTTPGetWithError [int , ErrorResponse ](s .httpClient , l1InfoTreeIndexEndpoint )
114+ l1InfoTreeIndex , err := s .getL1InfoTreeIndex (depositNetwork , depositCount )
104115 if err != nil {
105116 return nil , err
106117 }
107118
108- if statusCode != http .StatusOK {
109- errMsg := "unable to retrieve l1 info tree index"
110- log .Warn ().Int ("code" , statusCode ).Str ("message" , l1InfoTreeIndexRespError .Error ).Msgf ("%s" , errMsg )
111- return nil , fmt .Errorf (l1InfoTreeIndexRespError .Error )
112- }
113-
114- endpoint := fmt .Sprintf ("%s/claim-proof?network_id=%d&leaf_index=%d&deposit_count=%d" , s .BridgeServiceBase .Url (), depositNetwork , l1InfoTreeIndex , depositCount )
119+ endpoint := fmt .Sprintf ("%s/%s/claim-proof?network_id=%d&leaf_index=%d&deposit_count=%d" , s .BridgeServiceBase .Url (), urlPath , depositNetwork , l1InfoTreeIndex , depositCount )
115120 resp , respError , statusCode , err := httpjson .HTTPGetWithError [GetClaimProofResponse , ErrorResponse ](s .httpClient , endpoint )
116121 if err != nil {
117122 return nil , err
118123 }
119124
120125 if statusCode != http .StatusOK {
121- errMsg := "unable to retrieve bridge deposits"
126+ if statusCode == http .StatusNotFound {
127+ return nil , nil
128+ }
129+ errMsg := "unable to retrieve proof"
122130 log .Warn ().Int ("code" , statusCode ).Str ("message" , respError .Error ).Msgf ("%s" , errMsg )
123131 return nil , fmt .Errorf (respError .Error )
124132 }
125133
126134 proof := resp .ToProof ()
127135 return proof , nil
128136}
137+
138+ func (s * BridgeService ) getL1InfoLeaf (depositNetwork , l1InfoTreeIndex uint32 ) (* getInjectedL1InfoLeafResponse , error ) {
139+ endpoint := fmt .Sprintf ("%s/%s/injected-l1-info-leaf?network_id=%d&leaf_index=%d" , s .BridgeServiceBase .Url (), urlPath , depositNetwork , l1InfoTreeIndex )
140+ resp , errorResp , statusCode , err := httpjson .HTTPGetWithError [* getInjectedL1InfoLeafResponse , ErrorResponse ](s .httpClient , endpoint )
141+ if err != nil {
142+ return nil , err
143+ }
144+
145+ if statusCode != http .StatusOK {
146+ if statusCode == http .StatusNotFound {
147+ return nil , nil
148+ }
149+ errMsg := "unable to retrieve l1 info leaf"
150+ log .Warn ().Int ("code" , statusCode ).Str ("message" , errorResp .Error ).Msgf ("%s" , errMsg )
151+ return nil , bridge_service .ErrUnableToRetrieveDeposit
152+ }
153+
154+ return resp , nil
155+ }
156+
157+ func (s * BridgeService ) getL1InfoTreeIndex (depositNetwork , depositCount uint32 ) (* uint32 , error ) {
158+ l1InfoTreeIndexEndpoint := fmt .Sprintf ("%s/%s/l1-info-tree-index?network_id=%d&deposit_count=%d" , s .BridgeServiceBase .Url (), urlPath , depositNetwork , depositCount )
159+ l1InfoTreeIndex , l1InfoTreeIndexRespError , statusCode , err := httpjson .HTTPGetWithError [uint32 , ErrorResponse ](s .httpClient , l1InfoTreeIndexEndpoint )
160+ if err != nil {
161+ return nil , err
162+ }
163+
164+ if statusCode != http .StatusOK {
165+ if statusCode == http .StatusNotFound {
166+ return nil , nil
167+ }
168+ errMsg := "unable to retrieve l1 info tree index"
169+ log .Warn ().Int ("code" , statusCode ).Str ("message" , l1InfoTreeIndexRespError .Error ).Msgf ("%s" , errMsg )
170+ return nil , fmt .Errorf (l1InfoTreeIndexRespError .Error )
171+ }
172+
173+ return & l1InfoTreeIndex , nil
174+ }
175+
176+ func (s * BridgeService ) responseToDeposit (bridgeResp BridgeResponse ) (* bridge_service.Deposit , error ) {
177+ depositNetwork := bridgeResp .OrigNet
178+ depositCount := bridgeResp .DepositCnt
179+
180+ proof , err := s .GetProof (depositNetwork , depositCount )
181+ if err != nil {
182+ return nil , err
183+ }
184+
185+ isReadyForClaim := false
186+ if proof == nil {
187+ l1InfoTreeIndex , err := s .getL1InfoTreeIndex (depositNetwork , depositCount )
188+ if err != nil {
189+ return nil , err
190+ }
191+ if l1InfoTreeIndex == nil {
192+ l1InfoLeaf , err := s .getL1InfoLeaf (depositNetwork , * l1InfoTreeIndex )
193+ if err != nil {
194+ return nil , err
195+ }
196+ isReadyForClaim = l1InfoLeaf != nil
197+ }
198+ }
199+
200+ deposit := bridgeResp .ToDeposit (isReadyForClaim )
201+
202+ return deposit , nil
203+ }
0 commit comments