github.com/status-im/status-go@v1.1.0/services/wallet/thirdparty/paraswap/request_build_transaction.go (about)

     1  package paraswap
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"errors"
     7  	"fmt"
     8  	"math/big"
     9  
    10  	"github.com/ethereum/go-ethereum/common"
    11  
    12  	walletCommon "github.com/status-im/status-go/services/wallet/common"
    13  )
    14  
    15  const transactionsURL = "https://api.paraswap.io/transactions/%d"
    16  
    17  type Transaction struct {
    18  	From     string `json:"from"`
    19  	To       string `json:"to"`
    20  	Value    string `json:"value"`
    21  	Data     string `json:"data"`
    22  	GasPrice string `json:"gasPrice"`
    23  	Gas      string `json:"gas"`
    24  	ChainID  uint64 `json:"chainId"`
    25  	Error    string `json:"error"`
    26  }
    27  
    28  func (c *ClientV5) BuildTransaction(ctx context.Context, srcTokenAddress common.Address, srcTokenDecimals uint, srcAmountWei *big.Int,
    29  	destTokenAddress common.Address, destTokenDecimals uint, destAmountWei *big.Int, slippageBasisPoints uint,
    30  	addressFrom common.Address, addressTo common.Address, priceRoute json.RawMessage, side SwapSide) (Transaction, error) {
    31  
    32  	params := map[string]interface{}{}
    33  	params["srcToken"] = srcTokenAddress.Hex()
    34  	params["srcDecimals"] = srcTokenDecimals
    35  	params["destToken"] = destTokenAddress.Hex()
    36  	params["destDecimals"] = destTokenDecimals
    37  	params["userAddress"] = addressFrom.Hex()
    38  	// params["receiver"] = addressTo.Hex() // at this point paraswap doesn't allow swap and transfer transaction
    39  	params["priceRoute"] = priceRoute
    40  
    41  	if slippageBasisPoints > 0 {
    42  		params["slippage"] = slippageBasisPoints
    43  		if side == SellSide {
    44  			params["srcAmount"] = srcAmountWei.String()
    45  		} else {
    46  			params["destAmount"] = destAmountWei.String()
    47  		}
    48  	} else {
    49  		params["srcAmount"] = srcAmountWei.String()
    50  		params["destAmount"] = destAmountWei.String()
    51  	}
    52  	params["partner"] = c.partnerID
    53  	if c.partnerAddress != walletCommon.ZeroAddress && c.partnerFeePcnt > 0 {
    54  		params["partnerAddress"] = c.partnerAddress.Hex()
    55  		params["partnerFeeBps"] = uint(c.partnerFeePcnt * 100)
    56  	}
    57  
    58  	url := fmt.Sprintf(transactionsURL, c.chainID)
    59  	response, err := c.httpClient.DoPostRequest(ctx, url, params, nil)
    60  	if err != nil {
    61  		return Transaction{}, err
    62  	}
    63  
    64  	tx, err := handleBuildTransactionResponse(response)
    65  	if err != nil {
    66  		return Transaction{}, err
    67  	}
    68  
    69  	return tx, nil
    70  }
    71  
    72  func handleBuildTransactionResponse(response []byte) (Transaction, error) {
    73  	var transactionResponse Transaction
    74  	err := json.Unmarshal(response, &transactionResponse)
    75  	if err != nil {
    76  		return Transaction{}, err
    77  	}
    78  	if transactionResponse.Error != "" {
    79  		return Transaction{}, errors.New(transactionResponse.Error)
    80  	}
    81  	return transactionResponse, nil
    82  }