feat(wallet): integrate swap slippage percentage parameter

Closes #15096
This commit is contained in:
Dario Gabriel Lipicar 2024-06-16 21:18:55 -03:00 committed by dlipicar
parent f118af8403
commit 15452aa79c
8 changed files with 42 additions and 20 deletions

View File

@ -1,5 +1,5 @@
import sugar, sequtils, stint
import uuids, chronicles
import uuids, chronicles, options
import io_interface
import app_service/service/wallet_account/service as wallet_account_service
import app_service/service/network/service as network_service
@ -116,9 +116,10 @@ proc suggestedRoutes*(self: Controller, accountFrom: string, accountTo: string,
proc transfer*(self: Controller, from_addr: string, to_addr: string, assetKey: string, toAssetKey: string,
uuid: string, selectedRoutes: seq[TransactionPathDto], password: string, sendType: SendType,
usePassword: bool, doHashing: bool, tokenName: string, isOwnerToken: bool) =
usePassword: bool, doHashing: bool, tokenName: string, isOwnerToken: bool,
slippagePercentage: Option[float]) =
self.transactionService.transfer(from_addr, to_addr, assetKey, toAssetKey, uuid, selectedRoutes, password, sendType,
usePassword, doHashing, tokenName, isOwnerToken)
usePassword, doHashing, tokenName, isOwnerToken, slippagePercentage)
proc proceedWithTransactionsSignatures*(self: Controller, fromAddr: string, toAddr: string, uuid: string,
signatures: TransactionsSignatures, selectedRoutes: seq[TransactionPathDto]) =

View File

@ -1,4 +1,4 @@
import stint
import stint, options
import app/modules/shared_models/currency_amount
import app_service/service/transaction/dto
import app/modules/shared_models/collectibles_model as collectibles
@ -36,7 +36,8 @@ method authenticateAndTransfer*(self: AccessInterface, from_addr: string, to_add
raise newException(ValueError, "No implementation available")
method authenticateAndTransferWithPaths*(self: AccessInterface, from_addr: string, to_addr: string, assetKey: string,
toAssetKey: string, uuid: string, sendType: SendType, selectedTokenName: string, selectedTokenIsOwnerToken: bool, rawPaths: string) {.base.} =
toAssetKey: string, uuid: string, sendType: SendType, selectedTokenName: string, selectedTokenIsOwnerToken: bool, rawPaths: string,
slippagePercentage: Option[float]) {.base.} =
raise newException(ValueError, "No implementation available")
method onUserAuthenticated*(self: AccessInterface, password: string, pin: string) {.base.} =

View File

@ -1,4 +1,4 @@
import tables, NimQml, sequtils, sugar, stint, strutils, chronicles
import tables, NimQml, sequtils, sugar, stint, strutils, chronicles, options
import ./io_interface, ./view, ./controller, ./network_item, ./transaction_routes, ./suggested_route_item, ./suggested_route_model, ./gas_estimate_item, ./gas_fees_item, ./network_model
import ../io_interface as delegate_interface
@ -41,6 +41,7 @@ type TmpSendTransactionDetails = object
resolvedSignatures: TransactionsSignatures
tokenName: string
isOwnerToken: bool
slippagePercentage: Option[float]
type
Module* = ref object of io_interface.AccessInterface
@ -282,8 +283,9 @@ method authenticateAndTransfer*(self: Module, fromAddr: string, toAddr: string,
self.controller.authenticate()
method authenticateAndTransferWithPaths*(self: Module, fromAddr: string, toAddr: string, assetKey: string, toAssetKey: string, uuid: string,
sendType: SendType, selectedTokenName: string, selectedTokenIsOwnerToken: bool, rawPaths: string) =
sendType: SendType, selectedTokenName: string, selectedTokenIsOwnerToken: bool, rawPaths: string, slippagePercentage: Option[float]) =
self.tmpSendTransactionDetails.paths = rawPaths.convertToTransactionPathsDto()
self.tmpSendTransactionDetails.slippagePercentage = slippagePercentage
self.authenticateAndTransfer(fromAddr, toAddr, assetKey, toAssetKey, uuid, sendType, selectedTokenName, selectedTokenIsOwnerToken)
method onUserAuthenticated*(self: Module, password: string, pin: string) =
@ -297,7 +299,7 @@ method onUserAuthenticated*(self: Module, password: string, pin: string) =
self.tmpSendTransactionDetails.fromAddr, self.tmpSendTransactionDetails.toAddr,
self.tmpSendTransactionDetails.assetKey, self.tmpSendTransactionDetails.toAssetKey, self.tmpSendTransactionDetails.uuid,
self.tmpSendTransactionDetails.paths, password, self.tmpSendTransactionDetails.sendType, usePassword, doHashing,
self.tmpSendTransactionDetails.tokenName, self.tmpSendTransactionDetails.isOwnerToken
self.tmpSendTransactionDetails.tokenName, self.tmpSendTransactionDetails.isOwnerToken, self.tmpSendTransactionDetails.slippagePercentage
)
proc signOnKeycard(self: Module) =
@ -344,6 +346,7 @@ method suggestedRoutes*(self: Module, accountFrom: string, accountTo: string, am
method suggestedRoutesReady*(self: Module, suggestedRoutes: SuggestedRoutesDto) =
self.tmpSendTransactionDetails.paths = suggestedRoutes.best
self.tmpSendTransactionDetails.slippagePercentage = none(float)
let paths = suggestedRoutes.best.map(x => self.convertTransactionPathDtoToSuggestedRouteItem(x))
let suggestedRouteModel = newSuggestedRouteModel()
suggestedRouteModel.setItems(paths)

View File

@ -1,4 +1,4 @@
import NimQml, sequtils, strutils, stint, sugar
import NimQml, sequtils, strutils, stint, sugar, options
import ./io_interface, ./accounts_model, ./account_item, ./network_model, ./network_item, ./suggested_route_item, ./transaction_routes
import app/modules/shared_models/collectibles_model as collectibles
@ -340,6 +340,14 @@ QtObject:
SendType(sendType), lockedInAmounts)
proc authenticateAndTransferWithParameters*(self: View, uuid: string, accountFrom: string, accountTo: string, token: string, toToken: string,
sendType: int, tokenName: string, tokenIsOwnerToken: bool, rawPaths: string) {.slot.} =
sendTypeInt: int, tokenName: string, tokenIsOwnerToken: bool, rawPaths: string, slippagePercentageString: string) {.slot.} =
let sendType = SendType(sendTypeInt)
var slippagePercentage: Option[float]
if sendType == SendType.Swap:
if slippagePercentageString.len > 0:
slippagePercentage = slippagePercentageString.parseFloat().some
self.delegate.authenticateAndTransferWithPaths(accountFrom, accountTo, token,
toToken, uuid, SendType(sendType), tokenName, tokenIsOwnerToken, rawPaths)
toToken, uuid, sendType, tokenName, tokenIsOwnerToken, rawPaths, slippagePercentage)

View File

@ -25,6 +25,8 @@ type
tokenID*: Option[UInt256] # (optional) chainID in case of a ERC721 transaction
slippagePercentage*: Option[float] # (optional) max slippage percentage allowed in case of a Swap transaction
proc `%`*(x: TransactionDataDto): JsonNode =
result = newJobject()
result["from"] = %x.source
@ -59,6 +61,8 @@ proc `%`*(x: TransactionDataDto): JsonNode =
result["bonderFee"] = %x.bonderFee.unsafeGet
if x.tokenID.isSome:
result["tokenID"] = %x.tokenID.unsafeGet
if x.slippagePercentage.isSome:
result["slippagePercentage"] = %x.slippagePercentage.unsafeGet
type TransactionBridgeDto* = object
bridgeName*: string

View File

@ -343,7 +343,8 @@ QtObject:
uuid: string,
routes: seq[TransactionPathDto],
password: string,
sendType: SendType
sendType: SendType,
slippagePercentage: Option[float]
) =
try:
var paths: seq[TransactionBridgeDto] = @[]
@ -364,6 +365,7 @@ QtObject:
txData = ens_utils.buildTransaction(parseAddress(from_addr), route.amountIn,
$route.gasAmount, gasFees, route.gasFees.eip1559Enabled, $route.gasFees.maxPriorityFeePerGas, $route.gasFees.maxFeePerGasM)
txData.to = parseAddress(to_addr).some
txData.slippagePercentage = slippagePercentage
paths.add(self.createPath(route, txData, tokenSymbol, to_addr))
@ -402,7 +404,8 @@ QtObject:
password: string,
sendType: SendType,
tokenName: string,
isOwnerToken: bool
isOwnerToken: bool,
slippagePercentage: Option[float]
) =
var
toContractAddress: Address
@ -473,6 +476,7 @@ QtObject:
$route.gasFees.maxFeePerGasM
)
txData.data = data
txData.slippagePercentage = slippagePercentage
let path = self.createPath(route, txData, mtCommand.toAsset, mtCommand.toAddress)
paths.add(path)
@ -500,7 +504,8 @@ QtObject:
usePassword: bool,
doHashing: bool,
tokenName: string,
isOwnerToken: bool
isOwnerToken: bool,
slippagePercentage: Option[float]
) =
var finalPassword = ""
if usePassword:
@ -532,11 +537,11 @@ QtObject:
let network = self.networkService.getNetworkByChainId(chainID)
if not network.isNil and network.nativeCurrencySymbol == asset.symbol:
self.transferEth(fromAddr, toAddr, asset.symbol, toAsset.symbol, uuid, selectedRoutes, finalPassword, sendType)
self.transferEth(fromAddr, toAddr, asset.symbol, toAsset.symbol, uuid, selectedRoutes, finalPassword, sendType, slippagePercentage)
return
self.transferToken(fromAddr, toAddr, assetKey, asset, toAssetKey, toAsset, uuid, selectedRoutes, finalPassword,
sendType, tokenName, isOwnerToken)
sendType, tokenName, isOwnerToken, slippagePercentage)
except Exception as e:
self.events.emit(SIGNAL_TRANSACTION_SENT, TransactionSentArgs(chainId: 0, txHash: "", uuid: uuid, error: fmt"Error sending token transfer transaction: {e.msg}"))

View File

@ -288,7 +288,7 @@ QObject {
root.swapStore.authenticateAndTransfer(d.uuid, accountAddress, accountAddress,
root.swapFormData.fromTokensKey, root.swapFormData.toTokenKey,
Constants.SendType.Approve, "", false, root.swapOutputData.rawPaths)
Constants.SendType.Approve, "", false, root.swapOutputData.rawPaths, "")
}
function sendSwapTx() {
@ -297,6 +297,6 @@ QObject {
root.swapStore.authenticateAndTransfer(d.uuid, accountAddress, accountAddress,
root.swapFormData.fromTokensKey, root.swapFormData.toTokenKey,
Constants.SendType.Swap, "", false, root.swapOutputData.rawPaths)
Constants.SendType.Swap, "", false, root.swapOutputData.rawPaths, root.swapFormData.selectedSlippage)
}
}

View File

@ -33,9 +33,9 @@ QtObject {
}
function authenticateAndTransfer(uuid, accountFrom, accountTo,
tokenFrom, tokenTo, sendType, tokenName, tokenIsOwnerToken, paths) {
tokenFrom, tokenTo, sendType, tokenName, tokenIsOwnerToken, paths, slippagePercentage) {
root.walletSectionSendInst.authenticateAndTransferWithParameters(uuid, accountFrom, accountTo,
tokenFrom, tokenTo, sendType, tokenName, tokenIsOwnerToken, paths)
tokenFrom, tokenTo, sendType, tokenName, tokenIsOwnerToken, paths, slippagePercentage)
}
function getWei2Eth(wei, decimals) {