import time import requests import urllib.parse import hashlib import hmac import base64 import json # Read Kraken API key and secret stored in environment variables api_url = "https://api.kraken.com" api_key = '' api_sec = '' def get_kraken_signature(urlpath, data, secret): postdata = urllib.parse.urlencode(data) encoded = (str(data['nonce']) + postdata).encode() message = urlpath.encode() + hashlib.sha256(encoded).digest() mac = hmac.new(base64.b64decode(secret), message, hashlib.sha512) sigdigest = base64.b64encode(mac.digest()) return sigdigest.decode() # Attaches auth headers and returns results of a POST request def kraken_request(uri_path, data, api_key, api_sec): headers = {} headers['API-Key'] = api_key # get_kraken_signature() as defined in the 'Authentication' section headers['API-Sign'] = get_kraken_signature(uri_path, data, api_sec) req = requests.post((api_url + uri_path), headers=headers, data=data) return req #Get balances for all accounts def getAccountBalances(): # Construct the request and print the result resp = kraken_request('/0/private/Balance', { "nonce": str(int(time.time()*1000)) }, api_key, api_sec) return resp.json()['result'] #Get account coin balance passing in the coin def getCoinBalance(coin): accounts = getAccountBalances() print(accounts) try: return accounts[coin] except KeyError: print(f"You don't have any {coin} in your Kraken account, or you are using an invalid coin in coin_to_withdraw.") return 0 def getWithdrawalInfo(coin, my_wallet_address, my_balance): # Construct the request and print the result resp = kraken_request('/0/private/WithdrawInfo', { "nonce": str(int(1000*time.time())), "asset": coin, "key": my_wallet_address, "amount": my_balance }, api_key, api_sec) print(f"getWithdrawalInfo: {resp.json()}") if(resp.json()['error'] != []): return resp.json()['error'] return resp.json()['result'] def crypto_Withdrawal(coin, my_wallet_address, amount): # Construct the request and print the result resp = kraken_request('/0/private/Withdraw', { "nonce": str(int(1000*time.time())), "asset": coin, "key": my_wallet_address, "amount": amount }, api_key, api_sec) return resp.json() def lambda_handler(event, context): #Which coin do you want to withdraw? XXBT = Bitcoin, ETH = Ethereum etc coin_to_withdraw = "XXBT" #Which wallet do you want to withdraw to? Type in the name of your wallet as it appears in Kraken wallet_name = "COLDCARD Mk4" #Get the current balance of the coin you want to withdraw balance = getCoinBalance(coin_to_withdraw) if float(balance) == 0: print(f"Your balance for {coin_to_withdraw} is zero.") else: #Get the maximum allowable withdraw amount max_withdrawal = getWithdrawalInfo(coin_to_withdraw, wallet_name, balance)['limit'] #Set the amount you want to withdraw. You can make this a static number (ie. 1 for 1 BTC) or you can set it to max_withdrawal or some factor of max_withdrawal amount_to_withdraw = max_withdrawal #Process the withdrawal print(crypto_Withdrawal(coin_to_withdraw, wallet_name, amount_to_withdraw)) return { 'statusCode': 200, 'body': json.dumps('End of script') }