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  }