diff --git a/BlockchainSdk/Blockchains/Kaspa/KaspaTransactionBuilder.swift b/BlockchainSdk/Blockchains/Kaspa/KaspaTransactionBuilder.swift index 0a26df2a00..19e82e1f2e 100644 --- a/BlockchainSdk/Blockchains/Kaspa/KaspaTransactionBuilder.swift +++ b/BlockchainSdk/Blockchains/Kaspa/KaspaTransactionBuilder.swift @@ -22,31 +22,16 @@ class KaspaTransactionBuilder { } func availableAmount() -> Amount { - let inputs = unspentOutputs + let inputs = Array(unspentOutputs.prefix(maxInputCount)) let availableAmountInSatoshi = inputs.reduce(0) { $0 + $1.amount } return Amount(with: blockchain, value: Decimal(availableAmountInSatoshi) / blockchain.decimalValue) } - func unspentOutputsCount(for amount: Amount) -> Int { - return unspentOutputs.count - } - - func setUnspentOutputs(_ unspentOutputs: [BitcoinUnspentOutput]) { - let sortedOutputs = unspentOutputs.sorted { - $0.amount > $1.amount - } - - self.unspentOutputs = Array(sortedOutputs.prefix(maxInputCount)) + func setUnspentOutputs(_ unspentOutputs: [BitcoinUnspentOutput]) { + self.unspentOutputs = unspentOutputs.sorted { $0.amount > $1.amount } } func buildForSign(_ transaction: Transaction) throws -> (KaspaTransaction, [Data]) { - let availableInputValue = self.availableAmount() - - guard transaction.amount.type == availableInputValue.type, - transaction.amount <= availableInputValue else { - throw WalletError.failedToBuildTx - } - let destinationAddressScript = try scriptPublicKey(address: transaction.destinationAddress).hexString.lowercased() var outputs: [KaspaOutput] = [ diff --git a/BlockchainSdk/Blockchains/Kaspa/KaspaWalletManager.swift b/BlockchainSdk/Blockchains/Kaspa/KaspaWalletManager.swift index a33f89ca39..6de9ab79d3 100644 --- a/BlockchainSdk/Blockchains/Kaspa/KaspaWalletManager.swift +++ b/BlockchainSdk/Blockchains/Kaspa/KaspaWalletManager.swift @@ -148,7 +148,13 @@ extension KaspaWalletManager: WithdrawalNotificationProvider { extension KaspaWalletManager: MaximumAmountRestrictable { func validateMaximumAmount(amount: Amount, fee: Amount) throws { - let amountAvailableToSend = txBuilder.availableAmount() - fee + var amountAvailableToSend = txBuilder.availableAmount() - fee + + let change = amount - amountAvailableToSend + if change > .zeroCoin(for: wallet.blockchain), change < dustValue { + amountAvailableToSend = amountAvailableToSend - (dustValue - change) + } + if amount <= amountAvailableToSend { return }