secant-ios-wallet/secant/Models/Balance.swift

109 lines
2.3 KiB
Swift

//
// Balance.swift
// secant
//
// Created by Francisco Gindre on 8/9/21.
//
import Foundation
/**
Funds Expressed in Zatoshis
*/
protocol Funds {
/**
Confirmed, spendable funds
*/
var confirmed: Int64 { get }
/**
Unconfirmed, not yet spendable funds.
*/
var unconfirmed: Int64 { get }
/**
Represents a null value of Funds with Zero confirmed and Zero unconfirmed funds.
*/
static var noFunds: Funds { get }
}
/**
Wallet Balance that condenses transparent, Sapling and Orchard funds
*/
protocol WalletBalance {
/**
Transparent funds. This is the sum of the UTXOs of the user found at a given time
*/
var transparent: Funds { get }
/**
Funds on the Sapling shielded pool for a given user.
*/
var sapling: Funds { get }
/**
Funds on the Orchard shielded pool for a given user.
*/
var orchard: Funds { get }
/**
The sum of all confirmed funds, transparent, sapling and orchard funds (calculated)
*/
var totalAvailableBalance: Int64 { get }
/**
The sum of all unconfirmed funds: transparent, sapling, and orchard funds (calculated
*/
var totalUnconfirmedBalance: Int64 { get }
/**
The sum of all funds confirmed and unconfirmed of all pools (transparent, sapling and orchard).
*/
var totalBalance: Int64 { get }
/**
Represents a the value of Zero funds.
*/
static var nullBalance: WalletBalance { get }
}
extension WalletBalance {
static var nullBalance: WalletBalance {
Balance(
transparent: ZcashFunds.noFunds,
sapling: ZcashFunds.noFunds,
orchard: ZcashFunds.noFunds
)
}
var totalAvailableBalance: Int64 {
transparent.confirmed + sapling.confirmed + orchard.confirmed
}
var totalUnconfirmedBalance: Int64 {
transparent.unconfirmed + sapling.unconfirmed + orchard.unconfirmed
}
var totalBalance: Int64 {
totalAvailableBalance + totalUnconfirmedBalance
}
}
/**
Concrete Wallet Balance.
*/
struct Balance: WalletBalance {
var transparent: Funds
var sapling: Funds
var orchard: Funds
}
struct ZcashFunds: Funds {
static var noFunds: Funds {
ZcashFunds(confirmed: 0, unconfirmed: 0)
}
var confirmed: Int64
var unconfirmed: Int64
}