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 }