Source code for switcheo.ethereum.signatures

# -*- coding:utf-8 -*-
"""
Description:
    Functions for signing data to send to the Switcheo API by using Ethereum Utilities to cryptographically sign
    data that gets authenticated on the Ethereum network.
Usage:
    from switcheo.ethereum.signatures import <function_name>
"""

import binascii
from switcheo.utils import stringify_message
from switcheo.ethereum.utils import sign_txn_array
from eth_utils import to_checksum_address, to_normalized_address
from eth_account.messages import defunct_hash_message
from eth_account.account import Account
from web3 import Web3, HTTPProvider


[docs]def sign_create_cancellation(cancellation_params, private_key): """ Function to sign the parameters required to create a cancellation request from the Switcheo Exchange. Execution of this function is as follows:: sign_create_cancellation(cancellation_params=signable_params, private_key=eth_private_key) The expected return result for this function is as follows:: { 'order_id': '3125550a-04f9-4475-808b-42b5f89d6693', 'timestamp': 1542088842108, 'address': '0x32c46323b51c977814e05ef5e258ee4da0e4c3c3', 'signature': 'dac70ca711bcfbeefbdead2158ef8b15fab1a1....' } :param cancellation_params: Dictionary with Order ID and timestamp to sign for creating the cancellation. :type cancellation_params: dict :param private_key: The Ethereum private key to sign the deposit parameters. :type private_key: str :return: Dictionary of signed message to send to the Switcheo API. """ hash_message = defunct_hash_message(text=stringify_message(cancellation_params)) hex_message = binascii.hexlify(hash_message).decode() signed_message = binascii.hexlify(Account.signHash(hex_message, private_key=private_key)['signature']).decode() create_params = cancellation_params.copy() create_params['address'] = to_normalized_address(Account.privateKeyToAccount(private_key=private_key).address) create_params['signature'] = signed_message return create_params
[docs]def sign_execute_cancellation(cancellation_params, private_key): """ Function to sign the parameters required to execute a cancellation request on the Switcheo Exchange. Execution of this function is as follows:: sign_execute_cancellation(cancellation_params=signable_params, private_key=eth_private_key) The expected return result for this function is as follows:: { 'signature': '0x65986ed2cb631d4999ce8b9c895a43f....' } :param cancellation_params: Parameters the Switcheo Exchange returns from the create cancellation. :type cancellation_params: dict :param private_key: The Ethereum private key to sign the deposit parameters. :type private_key: str :return: Dictionary of signed message to send to the Switcheo API. """ cancellation_sha256 = cancellation_params['transaction']['sha256'] signed_sha256 = binascii.hexlify( Account.signHash(cancellation_sha256, private_key=private_key)['signature']).decode() return {'signature': '0x' + signed_sha256}
[docs]def sign_create_deposit(deposit_params, private_key): """ Function to sign the deposit parameters required by the Switcheo API. Execution of this function is as follows:: sign_create_deposit(deposit_params=signable_params, private_key=eth_private_key) The expected return result for this function is as follows:: { 'blockchain': 'eth', 'asset_id': 'ETH', 'amount': '10000000000000000', 'timestamp': 1542089346249, 'contract_hash': '0x607af5164d95bd293dbe2b994c7d8aef6bec03bf', 'address': '0x32c46323b51c977814e05ef5e258ee4da0e4c3c3', 'signature': 'd4b8491d6514bff28b9f2caa440f51a93f31d....' } :param deposit_params: Parameters needed to deposit to the Switcheo API and signed in this function. :type deposit_params: dict :param private_key: The Ethereum private key to sign the deposit parameters. :type private_key: str :return: Dictionary of signed message to send to the Switcheo API. """ hash_message = defunct_hash_message(text=stringify_message(deposit_params)) hex_message = binascii.hexlify(hash_message).decode() signed_message = binascii.hexlify(Account.signHash(hex_message, private_key=private_key)['signature']).decode() create_params = deposit_params.copy() create_params['address'] = to_normalized_address(Account.privateKeyToAccount(private_key=private_key).address) create_params['signature'] = signed_message return create_params
[docs]def sign_execute_deposit(deposit_params, private_key, infura_url): """ Function to execute the deposit request by signing the transaction generated from the create deposit function. Execution of this function is as follows:: sign_execute_deposit(deposit_params=create_deposit, private_key=eth_private_key) The expected return result for this function is as follows:: { 'transaction_hash': '0xcf3ea5d1821544e1686fbcb1f49d423b9ea9f42772ff9ecdaf615616d780fa75' } :param deposit_params: The parameters generated by the create function that now requires a signature. :type deposit_params: dict :param private_key: The Ethereum private key to sign the deposit parameters. :type private_key: str :param infura_url: The URL used to broadcast the deposit transaction to the Ethereum network. :type infura_url: str :return: Dictionary of the signed transaction to initiate the deposit of ETH via the Switcheo API. """ create_deposit_upper = deposit_params.copy() create_deposit_upper['transaction']['from'] = to_checksum_address(create_deposit_upper['transaction']['from']) create_deposit_upper['transaction']['to'] = to_checksum_address(create_deposit_upper['transaction']['to']) create_deposit_upper['transaction'].pop('sha256') signed_create_txn = Account.signTransaction(create_deposit_upper['transaction'], private_key=private_key) execute_signed_txn = binascii.hexlify(signed_create_txn['hash']).decode() # Broadcast transaction to Ethereum Network. Web3(HTTPProvider(infura_url)).eth.sendRawTransaction(signed_create_txn.rawTransaction) return {'transaction_hash': '0x' + execute_signed_txn}
[docs]def sign_create_order(order_params, private_key): """ Function to sign the create order parameters and send to the Switcheo API. Execution of this function is as follows:: sign_create_order(order_params=signable_params, private_key=eth_private_key) The expected return result for this function is as follows:: { 'blockchain': 'eth', 'pair': 'JRC_ETH', 'side': 'buy', 'price': '0.00000003', 'want_amount': '3350000000000000000000000', 'use_native_tokens': False, 'order_type': 'limit', 'timestamp': 1542089785915, 'contract_hash': '0x607af5164d95bd293dbe2b994c7d8aef6bec03bf', 'signature': '536306a2f2aee499ffd6584027029ee585293b3686....', 'address': '0x32c46323b51c977814e05ef5e258ee4da0e4c3c3' } :param order_params: Parameters to create an order to be submitted to the Switcheo Order Book. :type order_params: dict :param private_key: The Ethereum private key to sign the deposit parameters. :type private_key: str :return: Dictionary of signed message to send to the Switcheo API. """ hash_message = defunct_hash_message(text=stringify_message(order_params)) hex_message = binascii.hexlify(hash_message).decode() create_params = order_params.copy() signed_message = binascii.hexlify(Account.signHash(hex_message, private_key=private_key)['signature']).decode() create_params['signature'] = signed_message create_params['address'] = to_normalized_address(Account.privateKeyToAccount(private_key=private_key).address) return create_params
[docs]def sign_execute_order(order_params, private_key): """ Function to execute the order request by signing the transaction generated from the create order function. Execution of this function is as follows:: sign_execute_order(order_params=signable_params, private_key=eth_private_key) The expected return result for this function is as follows:: { 'signatures': { 'fill_groups': {}, 'fills': {}, 'makes': { '392cd607-27ed-4702-880d-eab8d67a4201': '0x5f62c585e0978454cc89aa3b86d3ea6afbd80fc521....' } } } :param order_params: The parameters generated by the create function that now require signing. :type order_params: dict :param private_key: The Ethereum private key to sign the deposit parameters. :type private_key: str :return: Dictionary of the signed transaction to place an order on the Switcheo Order Book. """ execute_params = { 'signatures': { 'fill_groups': sign_txn_array(messages=order_params['fill_groups'], private_key=private_key), 'fills': sign_txn_array(messages=order_params['fills'], private_key=private_key), 'makes': sign_txn_array(messages=order_params['makes'], private_key=private_key), } } return execute_params
[docs]def sign_create_withdrawal(withdrawal_params, private_key): """ Function to create a withdrawal from the Switcheo Smart Contract. Execution of this function is as follows:: sign_create_withdrawal(withdrawal_params=signable_params, private_key=eth_private_key) The expected return result for this function is as follows:: { 'blockchain': 'eth', 'asset_id': 'ETH', 'amount': '10000000000000000', 'timestamp': 1542090476102, 'contract_hash': '0x607af5164d95bd293dbe2b994c7d8aef6bec03bf', 'address': '0x32c46323b51c977814e05ef5e258ee4da0e4c3c3', 'signature': '375ddce62e5b3676d5e94ebb9f9a8af5963b....' } :param withdrawal_params: The parameters to be signed and create a withdraw from Switcheo. :type withdrawal_params: dict :param private_key: The Ethereum private key to sign the deposit parameters. :type private_key: str :return: Dictionary of the signed transaction to initiate the withdrawal of ETH via the Switcheo API. """ hash_message = defunct_hash_message(text=stringify_message(withdrawal_params)) hex_message = binascii.hexlify(hash_message).decode() signed_message = binascii.hexlify(Account.signHash(hex_message, private_key=private_key)['signature']).decode() create_params = withdrawal_params.copy() create_params['address'] = to_normalized_address(Account.privateKeyToAccount(private_key=private_key).address) create_params['signature'] = signed_message return create_params
[docs]def sign_execute_withdrawal(withdrawal_params, private_key): """ Function to execute the withdrawal request by signing the transaction generated from the create withdrawal function. Execution of this function is as follows:: sign_execute_withdrawal(withdrawal_params=signable_params, private_key=eth_private_key) The expected return result for this function is as follows:: { 'signature': '0x33656f88b364d344e5b04f6aead01cdd3ac084489c39a9efe88c9873249bf1954525b1....' } :param withdrawal_params: The parameters generated by the create function that now require signing. :type withdrawal_params: dict :param private_key: The Ethereum private key to sign the deposit parameters. :type private_key: str :return: Dictionary of the signed transaction hash and initiate the withdrawal of ETH via the Switcheo API. """ withdrawal_sha256 = withdrawal_params['transaction']['sha256'] signed_sha256 = binascii.hexlify(Account.signHash(withdrawal_sha256, private_key=private_key)['signature']).decode() return {'signature': '0x' + signed_sha256}