github.com/status-im/status-go@v1.1.0/services/wallet/thirdparty/paraswap/request_price_route.go (about) 1 package paraswap 2 3 import ( 4 "context" 5 "encoding/json" 6 "errors" 7 "math/big" 8 netUrl "net/url" 9 "strconv" 10 11 "github.com/ethereum/go-ethereum/common" 12 13 "github.com/status-im/status-go/services/wallet/bigint" 14 ) 15 16 const pricesURL = "https://api.paraswap.io/prices" 17 18 type Route struct { 19 GasCost *bigint.BigInt `json:"gasCost"` 20 SrcAmount *bigint.BigInt `json:"srcAmount"` 21 SrcTokenAddress common.Address `json:"srcToken"` 22 SrcTokenDecimals uint `json:"srcDecimals"` 23 DestAmount *bigint.BigInt `json:"destAmount"` 24 DestTokenAddress common.Address `json:"destToken"` 25 DestTokenDecimals uint `json:"destDecimals"` 26 RawPriceRoute json.RawMessage `json:"rawPriceRoute"` 27 Side SwapSide `json:"side"` 28 ContractAddress common.Address `json:"contractAddress"` 29 TokenTransferProxy common.Address `json:"tokenTransferProxy"` 30 } 31 32 type PriceRouteResponse struct { 33 PriceRoute json.RawMessage `json:"priceRoute"` 34 Error string `json:"error"` 35 } 36 37 func (c *ClientV5) FetchPriceRoute(ctx context.Context, srcTokenAddress common.Address, srcTokenDecimals uint, 38 destTokenAddress common.Address, destTokenDecimals uint, amountWei *big.Int, addressFrom common.Address, 39 addressTo common.Address, side SwapSide) (Route, error) { 40 41 params := netUrl.Values{} 42 params.Add("srcToken", srcTokenAddress.Hex()) 43 params.Add("srcDecimals", strconv.Itoa(int(srcTokenDecimals))) 44 params.Add("destToken", destTokenAddress.Hex()) 45 params.Add("destDecimals", strconv.Itoa(int(destTokenDecimals))) 46 params.Add("userAddress", addressFrom.Hex()) 47 // params.Add("receiver", addressTo.Hex()) // at this point paraswap doesn't allow swap and transfer transaction 48 params.Add("network", strconv.FormatUint(c.chainID, 10)) 49 params.Add("amount", amountWei.String()) 50 params.Add("side", string(side)) 51 params.Add("partner", c.partnerID) 52 params.Add("excludeContractMethodsWithoutFeeModel", "true") 53 params.Add("version", "6.2") 54 55 url := pricesURL 56 response, err := c.httpClient.DoGetRequest(ctx, url, params, nil) 57 if err != nil { 58 return Route{}, err 59 } 60 61 return handlePriceRouteResponse(response) 62 } 63 64 func handlePriceRouteResponse(response []byte) (Route, error) { 65 var priceRouteResponse PriceRouteResponse 66 err := json.Unmarshal(response, &priceRouteResponse) 67 if err != nil { 68 return Route{}, err 69 } 70 71 if priceRouteResponse.Error != "" { 72 return Route{}, errors.New(priceRouteResponse.Error) 73 } 74 75 var route Route 76 err = json.Unmarshal(priceRouteResponse.PriceRoute, &route) 77 if err != nil { 78 return Route{}, err 79 } 80 81 route.RawPriceRoute = priceRouteResponse.PriceRoute 82 83 return route, nil 84 }