I decided to run the code that I wrote that checks for intact bitbills. I found that all the bitbills funds were sent from one address originally. So following the blockchain, you can find all the bitbills that were funded from that one address.
20BTC: 88 (32 intact)
10BTC: 107 (33 intact)
5BTC: 144 (58 intact)
1BTC: 589 (333 intact)
As one expect, a lot of the larger bills have been peeled. So there are now at most only 32 complete sets of bitbills that are intact.
Here's the python code in case anyone is interested:
import urllib
import json
URL = "https://blockchain.info/address/%s?format=json"
ONE = 100000000
FIVE = 500000000
TEN = 1000000000
TWENTY = 2000000000
addresses = ['1FhTe1bMtoKHDbNw13v3BQ9sb2kFTagaRH']
processed = []
addr1 = []
addr5 = []
addr10 = []
addr20 = []
print "Searching for all BitBills..."
print
while addresses:
a = addresses.pop(0)
print "processing %s" % a
processed.append(a)
file = urllib.urlopen(URL % a).read()
data = json.loads(file)
for tx in data['txs']:
skip = True
for input in tx['inputs']:
if input['prev_out']['addr'] == a:
skip = False
if skip:
continue
for out in tx['out']:
addr = out['addr']
value = out['value']
if value < ONE:
continue
if value == ONE:
if not addr in addr1:
addr1.append(addr)
elif value == FIVE:
if not addr in addr5:
addr5.append(addr)
elif value == TEN:
if not addr in addr10:
addr10.append(addr)
elif value == TWENTY:
if not addr in addr20:
addr20.append(addr)
elif not addr in processed and not addr in addresses:
addresses.append(addr)
def process_address(addr, denom):
intact = 0
for a in addr:
# print "checking %s" % a
processed.append(a)
file = urllib.urlopen(URL % a).read()
data = json.loads(file)
if data['total_sent'] == 0:
# print "intact %s" % a
intact+=1
print "%dBTC: %d (%d intact)" % (denom, len(addr), intact)
print
print "Checking coins..."
print
process_address(addr20, 20)
process_address(addr10, 10)
process_address(addr5, 5)
process_address(addr1, 1)