tfix #1181 - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 75ddc066bb84c5b2d05753884b9871c39f582548 DIR parent df73b8017a3a367f85ad8a8f7012fa80ab77415d HTML Author: ThomasV <thomasv@gitorious> Date: Sat, 2 May 2015 11:05:38 +0200 fix #1181 Diffstat: M lib/wallet.py | 49 ++++++++++++++----------------- 1 file changed, 22 insertions(+), 27 deletions(-) --- DIR diff --git a/lib/wallet.py b/lib/wallet.py t@@ -462,39 +462,45 @@ class Abstract_Wallet(object): fee = v_out - v_in return is_relevant, is_send, v, fee - def get_addr_utxo(self, address): + def get_addr_io(self, address): h = self.history.get(address, []) - coins = {} + received = {} + sent = {} for tx_hash, height in h: l = self.txo.get(tx_hash, {}).get(address, []) for n, v, is_cb in l: - coins[tx_hash + ':%d'%n] = (height, v, is_cb) + received[tx_hash + ':%d'%n] = (height, v, is_cb) for tx_hash, height in h: l = self.txi.get(tx_hash, {}).get(address, []) for txi, v in l: - coins.pop(txi) + sent[txi] = height + return received, sent + + def get_addr_utxo(self, address): + coins, spent = self.get_addr_io(address) + for txi in spent: + coins.pop(txi) return coins.items() - #return the total amount ever received by an address + # return the total amount ever received by an address def get_addr_received(self, address): - h = self.history.get(address, []) - received = 0 - for tx_hash, height in h: - l = self.txo.get(tx_hash, {}).get(address, []) - for n, v, is_cb in l: - received += v - return received + received, sent = self.get_addr_io(address) + return sum([v for height, v, is_cb in received.values()]) + # return the confirmed balance and pending (unconfirmed) balance change of a bitcoin address def get_addr_balance(self, address): - "returns the confirmed balance and pending (unconfirmed) balance change of a bitcoin address" - coins = self.get_addr_utxo(address) + received, sent = self.get_addr_io(address) c = u = 0 - for txo, v in coins: - tx_height, v, is_cb = v + for txo, (tx_height, v, is_cb) in received.items(): if tx_height > 0: c += v else: u += v + if txo in sent: + if sent[txo] > 0: + c -= v + else: + u -= v return c, u t@@ -525,17 +531,6 @@ class Abstract_Wallet(object): coins = coins[1:] + [ coins[0] ] return [value for height, value in coins] - def get_addr_balance2(self, address): - "returns the confirmed balance and pending (unconfirmed) balance change of a bitcoin address" - coins = self.get_addr_utxo(address) - c = u = 0 - for txo, v, height in coins: - if height > 0: - c += v - else: - u += v - return c, u - def get_account_name(self, k): return self.labels.get(k, self.accounts[k].get_name(k))