Django wallet for Bitcoin and other cryptocurrencies
MIT License
Django-cryptocurrencies web wallet for Bitcoin and a few other cryptocurrencies.
Simple pluggable application inspired by django-bitcoin.
Python 3
Edit Currency model
from cc.models import Currency
currency = Currency.objects.create(
label = 'Bitcoin',
ticker = 'BTC',
api_url = 'http://root:toor@localhost:8332'
)
Start Celery worker
$ celery worker -A tst.cel.app
Get new addresses for wallets
$ celery call cc.tasks.refill_addresses_queue
Now you can create wallets, deposit and withdraw funds
from cc.models import Wallet
wallet = Wallet.objects.create(
currency=currency
)
wallet.get_address()
wallet.withdraw_to_address('mvEnyQ9b9iTA11QMHAwSVtHUrtD4CTfiDB', Decimal('0.01'))
After creating a withdraw transaction, you need to run
$ celery call cc.tasks.process_withdraw_transactions
Query for new deposit transactions:
$ cc.tasks.query_transactions
If you want to catch event from bitcoind, but these calls options in bitcoin.conf file
walletnotify=~/env/bin/celery call cc.tasks.query_transaction --args='["BTC", "'%s'"]'
blocknotify=~/env/bin/celery call cc.tasks.query_transactions --args='["BTC"]'
where "BTC" - ticker (short name) of the Currency
This library relies heavily on Celery for running tasks in the background. You need to add it to your Project. There are a few tasks which djano-cc should do periodically:
But it is better to run 'query-transactions' in response to new events from bitcoind. You can do this by adding these lines to bitcoin.conf
walletnotify=~/env/bin/celery call cc.tasks.query_transaction --args='["BTC", "'%s'"]'
blocknotify=~/env/bin/celery call cc.tasks.query_transactions --args='["BTC"]'
Each time bitcoin will receive new tx or block, you will get an instant update on balances.
If bitcoind works in another environment, you can send this events by HTTP hooks. Expose 'django-cc' views in urls.py:
urlpatterns = [
...
url(r'^cc/', include('cc.urls')),
]
Then you can send http requests to trigger actions:
curl -k "https://yourhost/cc/blocknotify/?currency=BTC"
curl -k "https://yourhost/cc/walletnotify/?currency=BTC&txid=$1"
Withdraw to network:
wallet.withdraw_to_address('mvEnyQ9b9iTA11QMHAwSVtHUrtD4CTfiDB', Decimal('0.01'))
Transfer from wallet to wallet:
wallet1.transfer(wallet1.balance, wallet2, None, 'description')
Get wallet history:
for operation in wallet.get_operations():
print(operation.created)
print(operation.balance)
print(operation.reason.txid)
print(operation.reason.address)
When you write applications that are working with money, it is extremely important to use Database transactions. Currenly django-cc doesn't inclues any '@transaction.atomic'. You should do this by yourself.
In my code I have a higher level wrapper with @transaction.atomic and to get wallets I'm always using select for update, like 'Wallet.objects.select_for_update().get(addresses=address)' to get a lock over the Wallet.
In general django-cc should work with most Bitcoin forks. I've tested it against: Bitcoin, Litecoin, Zcash (not anonymous transactions), Dogecoin and Dash.
When you are adding any other than Bitcoin Currency
, you should define magicbyte
and dust
values. Use tables below to get the values.
Magic bytes are used to verify withdraw addresses. They are different for each cryptocurrency.
CC | Mainnet | Testnet |
---|---|---|
Bitcoin | 0,5 | 111,196 |
Litecoin | 48,50 | 58 |
Zcash | 28 | 29 |
Dogecoin | 30,22 | |
Dash | 76,16 | 140 |
Minimal amount of valid transaction
CC | Dust size |
---|---|
Bitcoin | 0.00005430 |
Litecoin | 0.00054600 |
CC_CONFIRMATIONS - how many confirmations incoming transaction needs to increase wallet balance. Default is 2.
CC_ADDRESS_QUEUE - how many addresses generate during refill_addresses_queue
. Default is 20.
CC_ALLOW_NEGATIVE_BALANCE - minimal amount of Wallet to be able to withdraw funds from it. Default is Decimal('0.001').
CC_ACCOUNT - Bitcoind once had an account system. Now it is deprecated. Do not change this. Default is '' — empty string.
CC_ALLOWED_HOSTS - list of addresses how can call /cc/blocknotify
and /cc/walletnotify
. Default is ['localhost', '127.0.0.1']
.
Tests are written using Regtest. To run them you need docker and docker-compose. Simply run docker-compose up
and it will build and run all tests for you. Usually it takes about 5 min to run all the tests.