parent
ff9f272295
commit
c515a963e3
|
@ -150,7 +150,7 @@ QtObject:
|
||||||
uuidOfTheLastRequestForSuggestedRoutes: string
|
uuidOfTheLastRequestForSuggestedRoutes: string
|
||||||
|
|
||||||
## Forward declarations
|
## Forward declarations
|
||||||
proc suggestedRoutesV2Ready(self: Service, uuid: string, route: seq[TransactionPathDtoV2], routeRaw: string, errCode: string, errDescription: string)
|
proc suggestedRoutesReady(self: Service, uuid: string, route: seq[TransactionPathDtoV2], routeRaw: string, errCode: string, errDescription: string)
|
||||||
|
|
||||||
proc delete*(self: Service) =
|
proc delete*(self: Service) =
|
||||||
self.QObject.delete
|
self.QObject.delete
|
||||||
|
@ -181,7 +181,7 @@ QtObject:
|
||||||
|
|
||||||
self.events.on(SignalType.WalletSuggestedRoutes.event) do(e:Args):
|
self.events.on(SignalType.WalletSuggestedRoutes.event) do(e:Args):
|
||||||
var data = WalletSignal(e)
|
var data = WalletSignal(e)
|
||||||
self.suggestedRoutesV2Ready(data.uuid, data.bestRoute, data.bestRouteRaw, data.errorCode, data.error)
|
self.suggestedRoutesReady(data.uuid, data.bestRoute, data.bestRouteRaw, data.errorCode, data.error)
|
||||||
|
|
||||||
self.events.on(PendingTransactionTypeDto.WalletTransfer.event) do(e: Args):
|
self.events.on(PendingTransactionTypeDto.WalletTransfer.event) do(e: Args):
|
||||||
try:
|
try:
|
||||||
|
@ -653,7 +653,7 @@ QtObject:
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
error "Error getting suggested fees", msg = e.msg
|
error "Error getting suggested fees", msg = e.msg
|
||||||
|
|
||||||
proc suggestedRoutesV2Ready(self: Service, uuid: string, route: seq[TransactionPathDtoV2], routeRaw: string, errCode: string, errDescription: string) =
|
proc suggestedRoutesReady(self: Service, uuid: string, route: seq[TransactionPathDtoV2], routeRaw: string, errCode: string, errDescription: string) =
|
||||||
if self.uuidOfTheLastRequestForSuggestedRoutes != uuid:
|
if self.uuidOfTheLastRequestForSuggestedRoutes != uuid:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -697,7 +697,7 @@ QtObject:
|
||||||
amountOutHex = "0x" & eth_utils.stripLeadingZeros(bigAmountOut.toHex)
|
amountOutHex = "0x" & eth_utils.stripLeadingZeros(bigAmountOut.toHex)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
let res = eth.suggestedRoutesV2Async(uuid, ord(sendType), accountFrom, accountTo, amountInHex, amountOutHex, token,
|
let res = eth.suggestedRoutesAsync(uuid, ord(sendType), accountFrom, accountTo, amountInHex, amountOutHex, token,
|
||||||
toToken, disabledFromChainIDs, disabledToChainIDs, lockedInAmounts, extraParamsTable)
|
toToken, disabledFromChainIDs, disabledToChainIDs, lockedInAmounts, extraParamsTable)
|
||||||
except CatchableError as e:
|
except CatchableError as e:
|
||||||
error "suggestedRoutes", exception=e.msg
|
error "suggestedRoutes", exception=e.msg
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const noGasErrorCode = "WR-017"
|
const noGasErrorCode = "WR-002"
|
||||||
|
|
||||||
# This method will group the account assets by symbol (in case of communiy, the token address)
|
# This method will group the account assets by symbol (in case of communiy, the token address)
|
||||||
proc onAllTokensBuilt*(self: Service, response: string) {.slot.} =
|
proc onAllTokensBuilt*(self: Service, response: string) {.slot.} =
|
||||||
|
@ -119,7 +119,7 @@ proc getHasBalanceCache*(self: Service): bool =
|
||||||
|
|
||||||
proc getChainsWithNoGasFromError*(self: Service, errCode: string, errDescription: string): Table[int, string] =
|
proc getChainsWithNoGasFromError*(self: Service, errCode: string, errDescription: string): Table[int, string] =
|
||||||
## Extracts the chainId and token from the error description for chains with no gas.
|
## Extracts the chainId and token from the error description for chains with no gas.
|
||||||
## If the error code is not "WR-017", an empty table is returned.
|
## If the error code is not "WR-002", an empty table is returned.
|
||||||
result = initTable[int, string]()
|
result = initTable[int, string]()
|
||||||
|
|
||||||
if errCode == noGasErrorCode:
|
if errCode == noGasErrorCode:
|
||||||
|
|
|
@ -38,7 +38,7 @@ proc suggestedFees*(chainId: int): RpcResponse[JsonNode] =
|
||||||
let payload = %* [chainId]
|
let payload = %* [chainId]
|
||||||
return core.callPrivateRPC("wallet_getSuggestedFees", payload)
|
return core.callPrivateRPC("wallet_getSuggestedFees", payload)
|
||||||
|
|
||||||
proc prepareDataForSuggestedRoutesV2(uuid: string, sendType: int, accountFrom: string, accountTo: string, amountIn: string, amountOut: string,
|
proc prepareDataForSuggestedRoutes(uuid: string, sendType: int, accountFrom: string, accountTo: string, amountIn: string, amountOut: string,
|
||||||
token: string, toToken: string, disabledFromChainIDs, disabledToChainIDs: seq[int], lockedInAmounts: Table[string, string],
|
token: string, toToken: string, disabledFromChainIDs, disabledToChainIDs: seq[int], lockedInAmounts: Table[string, string],
|
||||||
extraParamsTable: Table[string, string]): JsonNode =
|
extraParamsTable: Table[string, string]): JsonNode =
|
||||||
|
|
||||||
|
@ -68,26 +68,26 @@ proc prepareDataForSuggestedRoutesV2(uuid: string, sendType: int, accountFrom: s
|
||||||
|
|
||||||
return %* [data]
|
return %* [data]
|
||||||
|
|
||||||
proc suggestedRoutesV2*(sendType: int, accountFrom: string, accountTo: string, amountIn: string, amountOut: string, token: string,
|
proc suggestedRoutes*(sendType: int, accountFrom: string, accountTo: string, amountIn: string, amountOut: string, token: string,
|
||||||
toToken: string, disabledFromChainIDs, disabledToChainIDs: seq[int], lockedInAmounts: Table[string, string],
|
toToken: string, disabledFromChainIDs, disabledToChainIDs: seq[int], lockedInAmounts: Table[string, string],
|
||||||
extraParamsTable: Table[string, string]): RpcResponse[JsonNode] {.raises: [RpcException].} =
|
extraParamsTable: Table[string, string]): RpcResponse[JsonNode] {.raises: [RpcException].} =
|
||||||
let payload = prepareDataForSuggestedRoutesV2(uuid = "", sendType, accountFrom, accountTo, amountIn, amountOut, token, toToken, disabledFromChainIDs,
|
let payload = prepareDataForSuggestedRoutes(uuid = "", sendType, accountFrom, accountTo, amountIn, amountOut, token, toToken, disabledFromChainIDs,
|
||||||
disabledToChainIDs, lockedInAmounts, extraParamsTable)
|
disabledToChainIDs, lockedInAmounts, extraParamsTable)
|
||||||
if payload.isNil:
|
if payload.isNil:
|
||||||
raise newException(RpcException, "Invalid key in extraParamsTable")
|
raise newException(RpcException, "Invalid key in extraParamsTable")
|
||||||
return core.callPrivateRPC("wallet_getSuggestedRoutesV2", payload)
|
return core.callPrivateRPC("wallet_getSuggestedRoutes", payload)
|
||||||
|
|
||||||
proc suggestedRoutesV2Async*(uuid: string, sendType: int, accountFrom: string, accountTo: string, amountIn: string, amountOut: string, token: string,
|
proc suggestedRoutesAsync*(uuid: string, sendType: int, accountFrom: string, accountTo: string, amountIn: string, amountOut: string, token: string,
|
||||||
toToken: string, disabledFromChainIDs, disabledToChainIDs: seq[int], lockedInAmounts: Table[string, string],
|
toToken: string, disabledFromChainIDs, disabledToChainIDs: seq[int], lockedInAmounts: Table[string, string],
|
||||||
extraParamsTable: Table[string, string]): RpcResponse[JsonNode] {.raises: [RpcException].} =
|
extraParamsTable: Table[string, string]): RpcResponse[JsonNode] {.raises: [RpcException].} =
|
||||||
let payload = prepareDataForSuggestedRoutesV2(uuid, sendType, accountFrom, accountTo, amountIn, amountOut, token, toToken, disabledFromChainIDs,
|
let payload = prepareDataForSuggestedRoutes(uuid, sendType, accountFrom, accountTo, amountIn, amountOut, token, toToken, disabledFromChainIDs,
|
||||||
disabledToChainIDs, lockedInAmounts, extraParamsTable)
|
disabledToChainIDs, lockedInAmounts, extraParamsTable)
|
||||||
if payload.isNil:
|
if payload.isNil:
|
||||||
raise newException(RpcException, "Invalid key in extraParamsTable")
|
raise newException(RpcException, "Invalid key in extraParamsTable")
|
||||||
return core.callPrivateRPC("wallet_getSuggestedRoutesV2Async", payload)
|
return core.callPrivateRPC("wallet_getSuggestedRoutesAsync", payload)
|
||||||
|
|
||||||
proc stopSuggestedRoutesV2AsyncCalcualtion*() : RpcResponse[JsonNode] =
|
proc stopSuggestedRoutesAsyncCalculation*() : RpcResponse[JsonNode] =
|
||||||
return core.callPrivateRPC("wallet_stopSuggestedRoutesV2AsyncCalcualtion")
|
return core.callPrivateRPC("wallet_stopSuggestedRoutesAsyncCalculation")
|
||||||
|
|
||||||
rpc(getEstimatedLatestBlockNumber, "wallet"):
|
rpc(getEstimatedLatestBlockNumber, "wallet"):
|
||||||
chainId: int
|
chainId: int
|
||||||
|
|
|
@ -366,11 +366,11 @@ SplitView {
|
||||||
ComboBox {
|
ComboBox {
|
||||||
id: routerErrorComboBox
|
id: routerErrorComboBox
|
||||||
model: [
|
model: [
|
||||||
{name: "errNotEnoughTokenBalance", value: Constants.swap.errorCodes.errNotEnoughTokenBalance},
|
{name: "errNotEnoughTokenBalance", value: Constants.routerErrorCodes.router.errNotEnoughTokenBalance},
|
||||||
{name: "errNotEnoughNativeBalance", value: Constants.swap.errorCodes.errNotEnoughNativeBalance},
|
{name: "errNotEnoughNativeBalance", value: Constants.routerErrorCodes.router.errNotEnoughNativeBalance},
|
||||||
{name: "errPriceTimeout", value: Constants.swap.errorCodes.errPriceTimeout},
|
{name: "errPriceTimeout", value: Constants.routerErrorCodes.processor.errPriceTimeout},
|
||||||
{name: "errNotEnoughLiquidity", value: Constants.swap.errorCodes.errNotEnoughLiquidity},
|
{name: "errNotEnoughLiquidity", value: Constants.routerErrorCodes.processor.errNotEnoughLiquidity},
|
||||||
{name: "errPriceImpactTooHigh", value: Constants.swap.errorCodes.errPriceImpactTooHigh}
|
{name: "errPriceImpactTooHigh", value: Constants.routerErrorCodes.processor.errPriceImpactTooHigh}
|
||||||
]
|
]
|
||||||
textRole: "name"
|
textRole: "name"
|
||||||
valueRole: "value"
|
valueRole: "value"
|
||||||
|
|
|
@ -632,7 +632,7 @@ Item {
|
||||||
|
|
||||||
// emit event that no routes were found due to not enough token balance
|
// emit event that no routes were found due to not enough token balance
|
||||||
txRoutes.uuid = root.swapAdaptor.uuid
|
txRoutes.uuid = root.swapAdaptor.uuid
|
||||||
root.swapStore.suggestedRoutesReady(txRoutes, Constants.swap.errorCodes.errNotEnoughTokenBalance, "errNotEnoughTokenBalance")
|
root.swapStore.suggestedRoutesReady(txRoutes, Constants.routerErrorCodes.router.errNotEnoughTokenBalance, "errNotEnoughTokenBalance")
|
||||||
|
|
||||||
// verify loading state was removed and that error was displayed
|
// verify loading state was removed and that error was displayed
|
||||||
verify(!root.swapAdaptor.validSwapProposalReceived)
|
verify(!root.swapAdaptor.validSwapProposalReceived)
|
||||||
|
@ -670,7 +670,7 @@ Item {
|
||||||
|
|
||||||
// emit event that no routes were found due to not enough eth balance
|
// emit event that no routes were found due to not enough eth balance
|
||||||
txRoutes.uuid = root.swapAdaptor.uuid
|
txRoutes.uuid = root.swapAdaptor.uuid
|
||||||
root.swapStore.suggestedRoutesReady(txRoutes, Constants.swap.errorCodes.errNotEnoughNativeBalance, "errNotEnoughNativeBalance")
|
root.swapStore.suggestedRoutesReady(txRoutes, Constants.routerErrorCodes.router.errNotEnoughNativeBalance, "errNotEnoughNativeBalance")
|
||||||
|
|
||||||
// verify loading state was removed and that error was displayed
|
// verify loading state was removed and that error was displayed
|
||||||
verify(!root.swapAdaptor.validSwapProposalReceived)
|
verify(!root.swapAdaptor.validSwapProposalReceived)
|
||||||
|
@ -708,7 +708,7 @@ Item {
|
||||||
|
|
||||||
// emit event that no routes were found due to price timeout
|
// emit event that no routes were found due to price timeout
|
||||||
txRoutes.uuid = root.swapAdaptor.uuid
|
txRoutes.uuid = root.swapAdaptor.uuid
|
||||||
root.swapStore.suggestedRoutesReady(txRoutes, Constants.swap.errorCodes.errPriceTimeout, "errPriceTimeout")
|
root.swapStore.suggestedRoutesReady(txRoutes, Constants.routerErrorCodes.processor.errPriceTimeout, "errPriceTimeout")
|
||||||
|
|
||||||
// verify loading state was removed and that error was displayed
|
// verify loading state was removed and that error was displayed
|
||||||
verify(!root.swapAdaptor.validSwapProposalReceived)
|
verify(!root.swapAdaptor.validSwapProposalReceived)
|
||||||
|
@ -746,7 +746,7 @@ Item {
|
||||||
|
|
||||||
// emit event that no routes were found due to not enough liquidity
|
// emit event that no routes were found due to not enough liquidity
|
||||||
txRoutes.uuid = root.swapAdaptor.uuid
|
txRoutes.uuid = root.swapAdaptor.uuid
|
||||||
root.swapStore.suggestedRoutesReady(txRoutes, Constants.swap.errorCodes.errNotEnoughLiquidity, "errNotEnoughLiquidity")
|
root.swapStore.suggestedRoutesReady(txRoutes, Constants.routerErrorCodes.processor.errNotEnoughLiquidity, "errNotEnoughLiquidity")
|
||||||
|
|
||||||
// verify loading state was removed and that error was displayed
|
// verify loading state was removed and that error was displayed
|
||||||
verify(!root.swapAdaptor.validSwapProposalReceived)
|
verify(!root.swapAdaptor.validSwapProposalReceived)
|
||||||
|
|
|
@ -155,9 +155,9 @@ QObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Properties to handle error states
|
// Properties to handle error states
|
||||||
readonly property bool isRouteEthBalanceInsufficient: root.validSwapProposalReceived && root.swapOutputData.errCode === Constants.swap.errorCodes.errNotEnoughNativeBalance
|
readonly property bool isRouteEthBalanceInsufficient: root.validSwapProposalReceived && root.swapOutputData.errCode === Constants.routerErrorCodes.router.errNotEnoughNativeBalance
|
||||||
|
|
||||||
readonly property bool isRouteTokenBalanceInsufficient: root.validSwapProposalReceived && root.swapOutputData.errCode === Constants.swap.errorCodes.errNotEnoughTokenBalance
|
readonly property bool isRouteTokenBalanceInsufficient: root.validSwapProposalReceived && root.swapOutputData.errCode === Constants.routerErrorCodes.router.errNotEnoughTokenBalance
|
||||||
|
|
||||||
readonly property bool isTokenBalanceInsufficient: {
|
readonly property bool isTokenBalanceInsufficient: {
|
||||||
if (!!root.fromToken && !!root.fromToken.symbol) {
|
if (!!root.fromToken && !!root.fromToken.symbol) {
|
||||||
|
@ -191,12 +191,13 @@ QObject {
|
||||||
} else if (isBalanceInsufficientForFees) {
|
} else if (isBalanceInsufficientForFees) {
|
||||||
return qsTr("Insufficient funds to pay gas fees")
|
return qsTr("Insufficient funds to pay gas fees")
|
||||||
} else if (root.swapOutputData.hasError) {
|
} else if (root.swapOutputData.hasError) {
|
||||||
|
// TOOD #15874: Unify with WalletUtils router error code handling
|
||||||
switch (root.swapOutputData.errCode) {
|
switch (root.swapOutputData.errCode) {
|
||||||
case Constants.swap.errorCodes.errPriceTimeout:
|
case Constants.routerErrorCodes.processor.errPriceTimeout:
|
||||||
return qsTr("Fetching the price took longer than expected. Please, try again later.")
|
return qsTr("Fetching the price took longer than expected. Please, try again later.")
|
||||||
case Constants.swap.errorCodes.errNotEnoughLiquidity:
|
case Constants.routerErrorCodes.processor.errNotEnoughLiquidity:
|
||||||
return qsTr("Not enough liquidity. Lower token amount or try again later.")
|
return qsTr("Not enough liquidity. Lower token amount or try again later.")
|
||||||
case Constants.swap.errorCodes.errPriceImpactTooHigh:
|
case Constants.routerErrorCodes.processor.errPriceImpactTooHigh:
|
||||||
return qsTr("Price impact too high. Lower token amount or try again later.")
|
return qsTr("Price impact too high. Lower token amount or try again later.")
|
||||||
}
|
}
|
||||||
return qsTr("Something went wrong. Change amount, token or try again later.")
|
return qsTr("Something went wrong. Change amount, token or try again later.")
|
||||||
|
|
|
@ -1105,33 +1105,34 @@ QtObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
readonly property QtObject router: QtObject {
|
readonly property QtObject router: QtObject {
|
||||||
readonly property string errENSRegisterRequiresUsernameAndPubKey : "WR-001"
|
readonly property string errENSRegisterRequiresUsernameAndPubKey : "WRR-001"
|
||||||
readonly property string errENSRegisterTestnetSTTOnly : "WR-002"
|
readonly property string errENSRegisterTestnetSTTOnly : "WRR-002"
|
||||||
readonly property string errENSRegisterMainnetSNTOnly : "WR-003"
|
readonly property string errENSRegisterMainnetSNTOnly : "WRR-003"
|
||||||
readonly property string errENSReleaseRequiresUsername : "WR-004"
|
readonly property string errENSReleaseRequiresUsername : "WRR-004"
|
||||||
readonly property string errENSSetPubKeyRequiresUsernameAndPubKey : "WR-005"
|
readonly property string errENSSetPubKeyRequiresUsernameAndPubKey : "WRR-005"
|
||||||
readonly property string errStickersBuyRequiresPackID : "WR-006"
|
readonly property string errStickersBuyRequiresPackID : "WRR-006"
|
||||||
readonly property string errSwapRequiresToTokenID : "WR-007"
|
readonly property string errSwapRequiresToTokenID : "WRR-007"
|
||||||
readonly property string errSwapTokenIDMustBeDifferent : "WR-008"
|
readonly property string errSwapTokenIDMustBeDifferent : "WRR-008"
|
||||||
readonly property string errSwapAmountInAmountOutMustBeExclusive : "WR-009"
|
readonly property string errSwapAmountInAmountOutMustBeExclusive : "WRR-009"
|
||||||
readonly property string errSwapAmountInMustBePositive : "WR-010"
|
readonly property string errSwapAmountInMustBePositive : "WRR-010"
|
||||||
readonly property string errSwapAmountOutMustBePositive : "WR-011"
|
readonly property string errSwapAmountOutMustBePositive : "WRR-011"
|
||||||
readonly property string errLockedAmountNotSupportedForNetwork : "WR-012"
|
readonly property string errLockedAmountNotSupportedForNetwork : "WRR-012"
|
||||||
readonly property string errLockedAmountNotNegative : "WR-013"
|
readonly property string errLockedAmountNotNegative : "WRR-013"
|
||||||
readonly property string errLockedAmountExceedsTotalSendAmount : "WR-014"
|
readonly property string errLockedAmountExceedsTotalSendAmount : "WRR-014"
|
||||||
readonly property string errLockedAmountLessThanSendAmountAllNetworks : "WR-015"
|
readonly property string errLockedAmountLessThanSendAmountAllNetworks : "WRR-015"
|
||||||
readonly property string errNotEnoughTokenBalance : "WR-016"
|
readonly property string errDisabledChainFoundAmongLockedNetworks : "WRR-016"
|
||||||
readonly property string errNotEnoughNativeBalance : "WR-017"
|
readonly property string errENSSetPubKeyInvalidUsername : "WRR-017"
|
||||||
readonly property string errNativeTokenNotFound : "WR-018"
|
readonly property string errLockedAmountExcludesAllSupported : "WRR-018"
|
||||||
readonly property string errDisabledChainFoundAmongLockedNetworks : "WR-019"
|
readonly property string errCannotCheckLockedAmounts : "WRR-019"
|
||||||
readonly property string errENSSetPubKeyInvalidUsername : "WR-020"
|
|
||||||
readonly property string errLockedAmountExcludesAllSupported : "WR-021"
|
readonly property string errNotEnoughTokenBalance : "WR-001"
|
||||||
readonly property string errTokenNotFound : "WR-022"
|
readonly property string errNotEnoughNativeBalance : "WR-002"
|
||||||
readonly property string errNoBestRouteFound : "WR-023"
|
readonly property string errNativeTokenNotFound : "WR-003"
|
||||||
readonly property string errCannotCheckReceiverBalance : "WR-024"
|
readonly property string errTokenNotFound : "WR-004"
|
||||||
readonly property string errCannotCheckLockedAmounts : "WR-025"
|
readonly property string errNoBestRouteFound : "WR-005"
|
||||||
readonly property string errLowAmountInForHopBridge : "WR-026"
|
readonly property string errCannotCheckReceiverBalance : "WR-006"
|
||||||
readonly property string errNoPositiveBalance : "WR-027"
|
readonly property string errLowAmountInForHopBridge : "WR-007"
|
||||||
|
readonly property string errNoPositiveBalance : "WR-008"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1444,15 +1445,6 @@ QtObject {
|
||||||
readonly property string paraswapV5SwapContractAddress: "0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57"
|
readonly property string paraswapV5SwapContractAddress: "0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57"
|
||||||
readonly property string paraswapV6_2ContractAddress: "0x6a000f20005980200259b80c5102003040001068"
|
readonly property string paraswapV6_2ContractAddress: "0x6a000f20005980200259b80c5102003040001068"
|
||||||
readonly property string paraswapTermsAndConditionUrl: "https://files.paraswap.io/tos_v4.pdf"
|
readonly property string paraswapTermsAndConditionUrl: "https://files.paraswap.io/tos_v4.pdf"
|
||||||
|
|
||||||
// TOOD #15874: Unify with WalletUtils router error code handling
|
|
||||||
readonly property QtObject errorCodes: QtObject {
|
|
||||||
readonly property string errNotEnoughTokenBalance: "WR-016"
|
|
||||||
readonly property string errNotEnoughNativeBalance: "WR-017"
|
|
||||||
readonly property string errPriceTimeout: "WPP-037"
|
|
||||||
readonly property string errNotEnoughLiquidity: "WPP-038"
|
|
||||||
readonly property string errPriceImpactTooHigh: "WPP-039"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mirrors src/app_service/service/transaction/service.nim -> EstimatedTime
|
// Mirrors src/app_service/service/transaction/service.nim -> EstimatedTime
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit fb150f3d166aaf2bc1d512ff14953dd1509a9ddc
|
Subproject commit 0235889e12bcd13e8e25fe1ee9a6d497ece57d01
|
Loading…
Reference in New Issue