def sign_create_deposit(deposit_params, key_pair): """ Function to create a deposit request by generating a transaction request from the Switcheo API. Execution of this function is as follows:: sign_create_deposit(deposit_details=create_deposit, key_pair=key_pair) The expected return result for this function is as follows:: { 'blockchain': 'neo', 'asset_id': 'SWTH', 'amount': '100', 'timestamp': 1542091927575, 'contract_hash': 'a195c1549e7da61b8da315765a790ac7e7633b82', 'address': 'fea2b883725ef2d194c9060f606cd0a0468a2c59', 'signature': '24ef6c63964988a2efe5fe67f04f46fdc2f1504fb5....' } :param deposit_params: The parameters generated by the create deposit function that now requires signature. :type deposit_params: dict :param key_pair: The KeyPair for the wallet being used to sign deposit message. :type key_pair: KeyPair :return: Dictionary response of signed deposit request that is ready to be executed on the NEO blockchain. """ encoded_message = encode_message(deposit_params) create_params = deposit_params.copy() create_params['address'] = neo_get_scripthash_from_private_key(private_key=key_pair.PrivateKey).ToString() create_params['signature'] = sign_message(encoded_message=encoded_message, private_key_hex=private_key_to_hex(key_pair=key_pair)) return create_params
def sign_execute_withdrawal(withdrawal_params, key_pair): """ 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:: { 'id': '3e1c0802-b44e-4681-a94d-29c1dec2f518', 'timestamp': 1542090738192, 'signature': 'e05a7b7bd30eb85959d75ea634cee06ad35d96502a763ae40....' } :param withdrawal_params: Parameters passed from the create withdrawal function to be signed and confirmed. :type withdrawal_params: dict :param key_pair: The NEO key pair to be used to sign messages for the NEO Blockchain. :type key_pair: KeyPair :return: Dictionary of parameters to be sent to the Switcheo API """ withdrawal_id = withdrawal_params['id'] signable_params = { 'id': withdrawal_id, 'timestamp': get_epoch_milliseconds() } encoded_message = encode_message(signable_params) execute_params = signable_params.copy() execute_params['signature'] = sign_message(encoded_message=encoded_message, private_key_hex=private_key_to_hex(key_pair=key_pair)) return execute_params
def sign_create_withdrawal(withdrawal_params, key_pair): """ Function to create the withdrawal request by signing the parameters necessary for withdrawal. 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': 'neo', 'asset_id': 'SWTH', 'amount': '100', 'timestamp': 1542090737236, 'contract_hash': 'a195c1549e7da61b8da315765a790ac7e7633b82', 'address': 'fea2b883725ef2d194c9060f606cd0a0468a2c59', 'signature': 'f66d604c0a80940bf70ce9e13c0fd47bc79de....' } :param withdrawal_params: Dictionary specifications for withdrawal from the Switcheo Smart Contract. :type withdrawal_params: dict :param key_pair: The NEO key pair to be used to sign messages for the NEO Blockchain. :type key_pair: KeyPair :return: Dictionary of parameters to be sent to the Switcheo API """ encoded_message = encode_message(withdrawal_params) create_params = withdrawal_params.copy() create_params['address'] = neo_get_scripthash_from_private_key(private_key=key_pair.PrivateKey).ToString() create_params['signature'] = sign_message(encoded_message=encoded_message, private_key_hex=private_key_to_hex(key_pair=key_pair)) return create_params
def sign_create_cancellation(cancellation_params, key_pair): """ 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, key_pair=key_pair) The expected return result for this function is as follows:: { 'order_id': 'aa647b95-d546-4d29-961e-bd62b18b07bf', 'timestamp': 1542092600331, 'address': 'fea2b883725ef2d194c9060f606cd0a0468a2c59', 'signature': '475bc3ecd2310201a3b5357b52b1866aaf5a5618932500e43503ebb....' } :param cancellation_params: Dictionary with Order ID and timestamp to sign for creating the cancellation. :type cancellation_params: dict :param key_pair: The KeyPair for the wallet being used to sign deposit message. :type key_pair: KeyPair :return: Dictionary of signed message to send to the Switcheo API. """ encoded_message = encode_message(cancellation_params) create_params = cancellation_params.copy() create_params['address'] = neo_get_scripthash_from_private_key(private_key=key_pair.PrivateKey).ToString() create_params['signature'] = sign_message(encoded_message=encoded_message, private_key_hex=private_key_to_hex(key_pair=key_pair)) return create_params
def sign_create_order(order_params, key_pair): """ 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, key_pair=key_pair) The expected return result for this function is as follows:: { 'blockchain': 'neo', 'pair': 'SWTH_NEO', 'side': 'buy', 'price': '0.00001000', 'want_amount': '1000000000000', 'use_native_tokens': True, 'order_type': 'limit', 'timestamp': 1542091535839, 'contract_hash': 'a195c1549e7da61b8da315765a790ac7e7633b82', 'address': 'fea2b883725ef2d194c9060f606cd0a0468a2c59', 'signature': '88e93c14a7d3c2cf30dec012ad5cb69f5ff26fe2a....' } :param order_params: Parameters to create an order to be submitted to the Switcheo Order Book. :type order_params: dict :param key_pair: The NEO key pair to be used to sign messages for the NEO Blockchain. :type key_pair: KeyPair :return: Dictionary of signed message to send to the Switcheo API. """ encoded_message = encode_message(order_params) create_params = order_params.copy() create_params['address'] = neo_get_scripthash_from_private_key(private_key=key_pair.PrivateKey).ToString() create_params['signature'] = sign_message(encoded_message=encoded_message, private_key_hex=private_key_to_hex(key_pair=key_pair)) return create_params
def execute_withdrawal(self, withdrawal_details, kp): """ This function is to sign the message generated from the create withdrawal function and submit it to the blockchain for transfer from the smart contract to the owners address. Execution of this function is as follows:: execute_withdrawal(withdrawal_details=create_withdrawal, kp=kp) The expected return result for this function is as follows:: { 'event_type': 'withdrawal', 'amount': -100000, 'asset_id': 'ab38352559b8b203bde5fddfa0b07d8b2525e132', 'status': 'confirming', 'id': '96e5f797-435b-40ab-9085-4e95c6749218', 'blockchain': 'neo', 'reason_code': 9, 'address': 'fea2b883725ef2d194c9060f606cd0a0468a2c59', 'transaction_hash': None, 'created_at': '2018-08-05T10:03:58.885Z', 'updated_at': '2018-08-05T10:03:59.828Z', 'contract_hash': 'a195c1549e7da61b8da315765a790ac7e7633b82' } :param withdrawal_details: The dictionary generated by the create withdrawal function which now requires a signature to be submitted to the blockchain. :type withdrawal_details: dict :param kp: The KeyPair for the wallet being used to sign the withdrawal request. :type kp: KeyPair :return: Dictionary with the status of the withdrawal request and blockchain transaction details. """ withdrawal_id = withdrawal_details['id'] signable_params = { 'id': withdrawal_id, 'timestamp': get_epoch_milliseconds() } encoded_message = encode_message(signable_params) api_params = signable_params api_params['signature'] = sign_message( encoded_message=encoded_message, private_key_hex=private_key_to_hex(key_pair=kp)) return self.request.post( path='/withdrawals/{}/broadcast'.format(withdrawal_id), json_data=api_params)
def create_withdrawal(self, asset, amount, kp): """ Function to create a withdrawal request by generating a withdrawl ID request from the Switcheo API. Execution of this function is as follows:: create_withdrawal(asset="SWTH", amount=1.1, kp=kp) The expected return result for this function is as follows:: { 'id': 'a5a4d396-fa9f-4191-bf50-39a3d06d5e0d' } :param asset: Script Hash of asset ID from the available products. :type asset: str :param amount: The amount of coins/tokens to be withdrawn. :type amount: float :param kp: The KeyPair for the wallet being used to sign withdrawal messages. :type kp: KeyPair :return: Dictionary with the withdrawal ID generated by the Switcheo API. """ signable_params = { 'blockchain': self.blockchain, 'asset_id': asset, 'amount': str(to_neo_asset_amount(amount=amount)), 'timestamp': get_epoch_milliseconds(), 'contract_hash': self.contract_hash } encoded_message = encode_message(signable_params) api_params = signable_params api_params['address'] = neo_get_scripthash_from_private_key( private_key=kp.PrivateKey).ToString() api_params['signature'] = sign_message( encoded_message=encoded_message, private_key_hex=private_key_to_hex(key_pair=kp)) return self.request.post(path='/withdrawals', json_data=api_params)
def test_encode_message(self): self.assertEqual(encode_message(message=message), encoded_message) self.assertEqual(encode_message(message=json_message), json_encoded_message)
def create_cancellation(self, order_id, kp): """ Function to create a cancellation request for the order ID from the open orders on the order book. Execution of this function is as follows:: create_cancellation(order_id=order['id'], kp=kp) The expected return result for this function is as follows:: { 'id': '6b9f40de-f9bb-46b6-9434-d281f8c06b74', 'transaction': { 'hash': '50d99ebd7e57dbdceb7edc2014da5f446c8f44cc0a0b6d9c762a29e8a74bb051', 'sha256': '509edb9888fa675988fa71a27600b2655e63fe979424f13f5c958897b2e99ed8', 'type': 209, 'version': 1, 'attributes': [ { 'usage': 32, 'data': '592c8a46a0d06c600f06c994d1f25e7283b8a2fe' } ], 'inputs': [ { 'prevHash': '9eaca1adcbbc0669a936576cb9ad03c11c99c356347aae3037ce1f0e4d330d85', 'prevIndex': 0 }, { 'prevHash': 'c858e4d2af1e1525fa974fb2b1678caca1f81a5056513f922789594939ff713d', 'prevIndex': 37 } ], 'outputs': [ { 'assetId': '602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7', 'scriptHash': 'e707714512577b42f9a011f8b870625429f93573', 'value': 1e-08 } ], 'scripts': [], 'script': '....', 'gas': 0 }, 'script_params': { 'scriptHash': 'a195c1549e7da61b8da315765a790ac7e7633b82', 'operation': 'cancelOffer', 'args': [ '923ebd865a6c5db39bd67403c1677f29d3949d9d8d9a2eb36a56dabd2dd83068' ] } } :param order_id: The order ID of the open transaction on the order book that you want to cancel. :type order_id: str :param kp: The KeyPair that will be used to sign the transaction sent to the blockchain. :type kp: KeyPair :return: Dictionary that contains the cancellation request along with blockchain transaction information. """ signable_params = { "order_id": order_id, "timestamp": get_epoch_milliseconds() } encoded_message = encode_message(signable_params) api_params = signable_params api_params['address'] = neo_get_scripthash_from_private_key( private_key=kp.PrivateKey).ToString() api_params['signature'] = sign_message( encoded_message=encoded_message, private_key_hex=private_key_to_hex(key_pair=kp)) return self.request.post(path='/cancellations', json_data=api_params)
def create_deposit(self, asset, amount, kp): """ Function to create a deposit request by generating a transaction request from the Switcheo API. Execution of this function is as follows:: create_deposit(asset="SWTH", amount=1.1, kp=kp) The expected return result for this function is as follows:: { 'id': '768e2079-1504-4dad-b688-7e1e99ec0a24', 'transaction': { 'hash': '72b74c96b9174e9b9e1b216f7e8f21a6475e6541876a62614df7c1998c6e8376', 'sha256': '2109cbb5eea67a06f5dd8663e10fcd1128e28df5721a25d993e05fe2097c34f3', 'type': 209, 'version': 1, 'attributes': [ { 'usage': 32, 'data': '592c8a46a0d06c600f06c994d1f25e7283b8a2fe' } ], 'inputs': [ { 'prevHash': 'f09b3b697c580d1730cd360da5e1f0beeae00827eb2f0055cbc85a5a4dadd8ea', 'prevIndex': 0 }, { 'prevHash': 'c858e4d2af1e1525fa974fb2b1678caca1f81a5056513f922789594939ff713d', 'prevIndex': 31 } ], 'outputs': [ { 'assetId': '602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7', 'scriptHash': 'e707714512577b42f9a011f8b870625429f93573', 'value': 1e-08 } ], 'scripts': [], 'script': '....', 'gas': 0 }, 'script_params': { 'scriptHash': 'a195c1549e7da61b8da315765a790ac7e7633b82', 'operation': 'deposit', 'args': [ '592c8a46a0d06c600f06c994d1f25e7283b8a2fe', '32e125258b7db0a0dffde5bd03b2b859253538ab', 100000000 ] } } :param asset: Script Hash of asset ID from the available products. :type asset: str :param amount: The amount of coins/tokens to be deposited. :type amount: float :param kp: The KeyPair for the wallet being used to sign deposit message. :type kp: KeyPair :return: Dictionary response of signed deposit request that is ready to be executed on the NEO blockchain. """ signable_params = { 'blockchain': self.blockchain, 'asset_id': asset, 'amount': str(to_neo_asset_amount(amount=amount)), 'timestamp': get_epoch_milliseconds(), 'contract_hash': self.contract_hash } encoded_message = encode_message(signable_params) api_params = signable_params api_params['address'] = neo_get_scripthash_from_private_key( private_key=kp.PrivateKey).ToString() api_params['signature'] = sign_message( encoded_message=encoded_message, private_key_hex=private_key_to_hex(key_pair=kp)) return self.request.post(path='/deposits', json_data=api_params)
def create_order(self, kp, pair, side, price, amount, use_native_token=True, order_type="limit"): """ Function to create an order for the trade pair and details requested. Execution of this function is as follows:: create_order(kp=kp, pair="SWTH_NEO", side="buy", price=0.0002, amount=100, use_native_token=True, order_type="limit") The expected return result for this function is as follows:: { 'id': '4e6a59fd-d750-4332-aaf0-f2babfa8ad67', 'blockchain': 'neo', 'contract_hash': 'a195c1549e7da61b8da315765a790ac7e7633b82', 'address': 'fea2b883725ef2d194c9060f606cd0a0468a2c59', 'side': 'buy', 'offer_asset_id': 'c56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b', 'want_asset_id': 'ab38352559b8b203bde5fddfa0b07d8b2525e132', 'offer_amount': '2000000', 'want_amount': '10000000000', 'transfer_amount': '0', 'priority_gas_amount': '0', 'use_native_token': True, 'native_fee_transfer_amount': 0, 'deposit_txn': None, 'created_at': '2018-08-05T10:38:37.714Z', 'status': 'pending', 'fills': [], 'makes': [ { 'id': 'e30a7fdf-779c-4623-8f92-8a961450d843', 'offer_hash': None, 'available_amount': None, 'offer_asset_id': 'c56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b', 'offer_amount': '2000000', 'want_asset_id': 'ab38352559b8b203bde5fddfa0b07d8b2525e132', 'want_amount': '10000000000', 'filled_amount': None, 'txn': { 'offerHash': 'b45ddfb97ade5e0363d9e707dac9ad1c530448db263e86494225a0025006f968', 'hash': '5c4cb1e73b9f2e608b6e768e0654649a4d15e08a7fe63fc536c454fa563a2f0f', 'sha256': 'f0b70640627947584a2976edeb055a124ae85594db76453532b893c05618e6ca', 'invoke': { 'scriptHash': 'a195c1549e7da61b8da315765a790ac7e7633b82', 'operation': 'makeOffer', 'args': [ '592c8a46a0d06c600f06c994d1f25e7283b8a2fe', '9b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc5', 2000000, '32e125258b7db0a0dffde5bd03b2b859253538ab', 10000000000, '65333061376664662d373739632d343632332d386639322d386139363134353064383433' ] }, 'type': 209, 'version': 1, 'attributes': [ { 'usage': 32, 'data': '592c8a46a0d06c600f06c994d1f25e7283b8a2fe' } ], 'inputs': [ { 'prevHash': '0fcfd792a9d20a7795255d1d3d3927f5968b9953e80d16ffd222656edf8fedbc', 'prevIndex': 0 }, { 'prevHash': 'c858e4d2af1e1525fa974fb2b1678caca1f81a5056513f922789594939ff713d', 'prevIndex': 35 } ], 'outputs': [ { 'assetId': '602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7', 'scriptHash': 'e707714512577b42f9a011f8b870625429f93573', 'value': 1e-08 } ], 'scripts': [], 'script': '....', 'gas': 0 }, 'cancel_txn': None, 'price': '0.0002', 'status': 'pending', 'created_at': '2018-08-05T10:38:37.731Z', 'transaction_hash': '5c4cb1e73b9f2e608b6e768e0654649a4d15e08a7fe63fc536c454fa563a2f0f', 'trades': [] } ] } :param kp: The KeyPair used to sign the transaction requests. :type kp: KeyPair :param pair: The trading pair this order is being submitted for. :type pair: str :param side: The side of the trade being submitted i.e. buy or sell :type side: str :param price: The price target for this trade. :type price: float :param amount: The amount of the asset being exchanged in the trade. :type amount: float :param use_native_token: Flag to indicate whether or not to pay fees with the Switcheo native token. :type use_native_token: bool :param order_type: The type of order being submitted, currently this can only be a limit order. :type order_type: str :return: Dictionary of order details that specify which parts of the trade will be filled (taker) or open (maker). """ # Trading minimums # NEO: > 0.01 # GAS: > 0.1 # Other: > 1 if side.lower() not in ["buy", "sell"]: raise ValueError( "Allowed trade types are buy or sell, you entered {}".format( side.lower())) if order_type.lower() not in ["limit"]: raise ValueError( "Allowed order type is limit, you entered {}".format( order_type.lower())) signable_params = { "blockchain": self.blockchain, "pair": pair, "side": side, "price": '{:.8f}'.format(price), "want_amount": to_neo_asset_amount(amount), "use_native_tokens": use_native_token, "order_type": order_type, "timestamp": get_epoch_milliseconds(), "contract_hash": self.contract_hash } encoded_message = encode_message(signable_params) api_params = signable_params api_params['address'] = neo_get_scripthash_from_private_key( private_key=kp.PrivateKey).ToString() api_params['signature'] = sign_message( encoded_message=encoded_message, private_key_hex=private_key_to_hex(key_pair=kp)) return self.request.post(path='/orders', json_data=api_params)