def transfer_token(sender: User, recipient: User, amount: float, reason_id: Optional[int] = None, transfer_subtype: Optional[TransferSubTypeEnum]=TransferSubTypeEnum.STANDARD): sent_token = default_token(sender) received_token = default_token(recipient) transfer_use = None if reason_id is not None: transfer_use = str(int(reason_id)) transfer = make_payment_transfer(amount, token=sent_token, send_user=sender, receive_user=recipient, transfer_use=transfer_use, is_ghost_transfer=True, require_sender_approved=False, require_recipient_approved=False, transfer_subtype=transfer_subtype, transfer_mode=TransferModeEnum.USSD) exchanged_amount = None if sent_token.id != received_token.id: exchange = Exchange() exchange.exchange_from_amount(user=recipient, from_token=sent_token, to_token=received_token, from_amount=amount, prior_task_uuids=[transfer.blockchain_task_uuid], transfer_mode=TransferModeEnum.USSD) exchanged_amount = exchange.to_transfer.transfer_amount return exchanged_amount
def make_exchange(user, from_token, to_token, from_amount): exchange = Exchange() exchange.exchange_from_amount( user=user, from_token=from_token, to_token=to_token, from_amount=from_amount ) db.session.add(exchange) db.session.commit()
def get_exchange_rates(self, obj): rates = {} for to_token in self.context.get('exchange_pairs', []): if to_token != obj: try: rate = Exchange.get_exchange_rate(obj, to_token) rates[to_token.symbol] = rate except SubexchangeNotFound: pass return rates
def get_exchange_rate(user: User, from_token: Token): to_token = user.get_reserve_token() if from_token == to_token: return None exchange = Exchange() return exchange.get_exchange_rate(from_token, to_token)
def post(self, exchange_id): """ Exchange Entry Point Method Method: POST :param from_token_id: the ID of the token being exchanged from :param to_token_id: the ID of the token being exchanged to :param from_amount: the amount of the token being exchanged from :return: status of exchange, and serialised exchange object if successful """ post_data = request.get_json() user = g.user from_token_id = post_data.get('from_token_id') to_token_id = post_data.get('to_token_id') from_amount = post_data.get('from_amount') to_desired_amount = post_data.get('to_desired_amount') from_token = Token.query.get(from_token_id) to_token = Token.query.get(to_token_id) if not from_token: response_object = { 'message': f'From token not found for ID {from_token_id}', } return make_response(jsonify(response_object)), 400 if not to_token: response_object = { 'message': f'To token not found for ID {to_token_id}', } return make_response(jsonify(response_object)), 400 if from_amount and to_desired_amount: response_object = { 'message': 'Must not specify both from amount and to amount', } return make_response(jsonify(response_object)), 400 elif from_amount: try: exchange = Exchange() exchange.exchange_from_amount( user=user, from_token=from_token, to_token=to_token, from_amount=from_amount ) except Exception as e: db.session.commit() response_object = { 'message': str(e), } return make_response(jsonify(response_object)), 400 elif to_desired_amount: try: exchange = Exchange() exchange.exchange_to_desired_amount( user=user, from_token=from_token, to_token=to_token, to_desired_amount=to_desired_amount ) except Exception as e: db.session.commit() response_object = { 'message': str(e), } return make_response(jsonify(response_object)), 400 else: response_object = { 'message': 'Must specify either from amount or to amount', } return make_response(jsonify(response_object)), 400 response_object = { 'message': 'Exchange Successful', 'data': { 'exchange': me_exchange_schema.dump(exchange).data } } return make_response(jsonify(response_object)), 200