Swap XMR and XRP through kyc.rip without leaving the app
This commit is contained in:
@@ -93,6 +93,62 @@ final class AppModel: ObservableObject {
|
||||
|
||||
// MARK: - Biometric lock
|
||||
|
||||
// MARK: - Swaps (kyc.rip)
|
||||
|
||||
@Published var swapOrders: [SwapOrder] = []
|
||||
|
||||
func loadSwapOrders() {
|
||||
swapOrders = WalletStore.swapOrders()
|
||||
}
|
||||
|
||||
func estimateSwap(amount: String, from: Chain, to: Chain) async throws -> SwapEstimate {
|
||||
guard let amountNumber = Double(amount.trimmingCharacters(in: .whitespaces)),
|
||||
amountNumber > 0 else {
|
||||
throw SwapError.api("Enter a valid amount")
|
||||
}
|
||||
return try await SwapService.shared.estimate(from: from.rawValue, to: to.rawValue, amount: amountNumber)
|
||||
}
|
||||
|
||||
func createSwap(route: SwapRoute, amountFrom: String, from: Chain, to: Chain) async throws -> SwapOrder {
|
||||
guard let amountNumber = Double(amountFrom.trimmingCharacters(in: .whitespaces)), amountNumber > 0 else {
|
||||
throw SwapError.api("Enter a valid amount")
|
||||
}
|
||||
guard let destination = (to == .xrp ? xrpWallet?.address : xmrWallet?.address), !destination.isEmpty else {
|
||||
throw SwapError.api("No \(to.title) wallet to receive into")
|
||||
}
|
||||
let order = try await SwapService.shared.createOrder(route: route,
|
||||
from: from.rawValue,
|
||||
to: to.rawValue,
|
||||
addressTo: destination,
|
||||
amountFrom: amountNumber)
|
||||
WalletStore.saveSwapOrder(order)
|
||||
loadSwapOrders()
|
||||
return order
|
||||
}
|
||||
|
||||
/// Sends the swap deposit using the same payment path as a normal send.
|
||||
func sendSwapDeposit(_ order: SwapOrder) async throws {
|
||||
try await send(to: order.depositAddress,
|
||||
amount: String(order.depositAmount),
|
||||
tag: order.depositMemo ?? "",
|
||||
priority: .defaultPriority)
|
||||
}
|
||||
|
||||
func refreshSwapStatus(_ order: SwapOrder) async -> SwapOrder {
|
||||
guard let updated = try? await SwapService.shared.orderStatus(order) else { return order }
|
||||
var order = order
|
||||
order.status = updated.status
|
||||
if let index = swapOrders.firstIndex(where: { $0.id == order.id }) {
|
||||
swapOrders[index] = order
|
||||
}
|
||||
return order
|
||||
}
|
||||
|
||||
func removeSwapOrder(id: String) {
|
||||
WalletStore.removeSwapOrder(id: id)
|
||||
loadSwapOrders()
|
||||
}
|
||||
|
||||
func authenticate() async {
|
||||
if await Biometrics.authenticate(reason: "Unlock Koins") {
|
||||
locked = false
|
||||
@@ -147,6 +203,7 @@ final class AppModel: ObservableObject {
|
||||
if xrpWallet != nil || xmrWallet != nil, faceIDEnabled, Biometrics.isAvailable {
|
||||
locked = true
|
||||
}
|
||||
loadSwapOrders()
|
||||
showCached(chain)
|
||||
await refresh(force: true)
|
||||
startAutoRefresh()
|
||||
|
||||
Reference in New Issue
Block a user