示例#1
0
    def feeTaken():
        request = app.current_request
        data = request.json_body
        print(data)

        token = Database.find_one("Token", {"address": data["token"]})
        ownerUser = Database.find_one("User", {'address': data["owner"]})
        if not ownerUser:
            raise NotFoundError('user not found with address {}'.format(
                data["owner"]))

        value = data['value']

        ownerBalance = Database.find_one("TokenBalance", {
            'userId': ownerUser['id'],
            "tokenId": token["id"]
        },
                                         insert=True)
        if 'balance' not in ownerBalance: ownerBalance['balance'] = '0'
        if not ownerBalance['balance']: ownerBalance['balance'] = '0'
        newOwnerBalance = int(float(ownerBalance['balance'])) + int(
            float(value))
        ownerBalance = Database.update("TokenBalance",
                                       {"id": ownerBalance["id"]},
                                       {"balance": newOwnerBalance},
                                       return_updated=True)[0]

        return {"message": "Fee taken"}
示例#2
0
    def balanceTotalSupply():
        request = app.current_request
        data = request.json_body
        token = Database.find_one("Token", {"address": data["token"]})
        if not token:
            raise NotFoundError('token not found with address {}'.format(
                data["token"]))
        print(data)
        Database.update("Token", {"id": token["id"]},
                        {"totalSupply": data["newTotalSupply"]})

        user = Database.find_one("User", {'address': data["owner"]})
        if not user:
            raise NotFoundError('user not found with address {}'.format(
                data["owner"]))
        userBalance = Database.find_one("TokenBalance", {
            'userId': user['id'],
            "tokenId": token["id"]
        },
                                        insert=True)
        if 'balance' not in userBalance: userBalance['balance'] = '0'
        if not userBalance['balance']: userBalance['balance'] = '0'
        newBalance = int(float(userBalance['balance'])) + int(
            float(data["newTotalSupply"])) - int(float(data["oldTotalSupply"]))
        userBalance = Database.update("TokenBalance",
                                      {"id": userBalance["id"]},
                                      {"balance": newBalance},
                                      return_updated=True)[0]
        return toObject(userBalance)
示例#3
0
  def trades_post():

    request = app.current_request
    data = request.json_body

    tradeData = {
      "investorId": data["investorId"],
      "tokenId": data["tokenId"],
      "executionDate": data["executionDate"],
      "expirationTimestampInSec": data["expirationTimestampInSec"],
      "salt": data["salt"]
    }
    trade = Database.find_one("Trade", tradeData)

    if trade: return toObject(trade)

    tradeData['state'] = 0
    Database.insert("Trade", tradeData)
    trade = Database.find_one("Trade", tradeData)
    data['id'] = trade['id']

    for brokerId, ik, ek, nominalAmount in zip(data['brokers'],data['iks'],data['eks'],data['nominalAmounts']):
      tradeBrokerData = {"tradeId": trade['id'],"brokerId": brokerId, "ik": ik, "ek": ek, "nominalAmount": nominalAmount}
      tradeBroker = Database.find_one("TradeBroker", tradeBrokerData)
      if tradeBroker: continue
      tradeBrokerData['state'] = 0
      Database.insert("TradeBroker", tradeBrokerData)
      tradeBroker = Database.find_one("TradeBroker", tradeBrokerData)
    # Socket, should be pushing to a message queue of some kind
    r = passWithoutError(requests.post)(socket_uri + "trade-created", data=data)
    return toObject(trade)
示例#4
0
    def test_update(self):
        with patch.dict('os.environ', env):
            Database.insert("User", {'name': 'tom'})
            Database.update("User", [[('name','=','tom')]], {'name': 'tom2'})

            user = Database.find_one("User", {'name': 'tom'})
            self.assertEqual(user, None)

            user = Database.find_one("User", {'name': 'tom2'})
            self.assertEqual(user['name'], 'tom2')
示例#5
0
def getBalance(tokenId, user):
    token = Database.find_one("Token", {"id": int(tokenId)})
    if not token:
        raise NotFoundError("token not found with id {}".format(tokenId))
    tokenBalance = Database.find_one("TokenBalance", {
        "tokenId": int(tokenId),
        "userId": user["id"]
    },
                                     insert=True)
    tokenBalance['token'] = toObject(token)
    return tokenBalance
示例#6
0
def getBalances(tokenId):
    token = Database.find_one("Token", {"id": int(tokenId)})
    if not token:
        raise NotFoundError("token not found with id {}".format(tokenId))
    tokenBalances = Database.find("TokenBalance", {"tokenId": token["id"]})
    for tokenBalance in tokenBalances:
        investor = Database.find_one(
            "User", {"id": tokenBalance["userId"]},
            ["id", "name", "type", "juristiction", "address"])
        tokenBalance["investor"] = investor
        tokenBalance["token"] = toObject(token)
    return tokenBalances
示例#7
0
    def balanceTransfer():
        request = app.current_request
        data = request.json_body
        print("\n\nbalanceTransfer\n\n")
        print(data)
        print("\n\nbalanceTransfer\n\n")
        token = Database.find_one("Token", {"address": data["token"]})
        fromUser = Database.find_one("User", {'address': data["from"]})
        if not fromUser:
            raise NotFoundError('user not found with address {}'.format(
                data["from"]))
        toUser = Database.find_one("User", {'address': data["to"]})
        if not toUser:
            raise NotFoundError('user not found with address {}'.format(
                data["to"]))
        value = data['value']

        fromBalance = Database.find_one("TokenBalance", {
            'userId': fromUser['id'],
            "tokenId": token["id"]
        },
                                        for_update=True)
        # If there is no from balance this transfer cannot be valid
        if not fromBalance:
            raise NotFoundError('token balance not found for user {}'.format(
                fromUser['id']))
        # Check does the user have enough balance
        print("fromBalanceYo: ", fromBalance)
        if ('balance' not in fromBalance or not fromBalance['balance']
                or int(fromBalance['balance']) < int(value)):
            raise NotFoundError('token balance not enough for user {}'.format(
                fromUser['id']))

        newFromBalance = int(float(fromBalance['balance'])) - int(float(value))
        fromBalance = Database.update("TokenBalance",
                                      {"id": fromBalance["id"]},
                                      {"balance": newFromBalance},
                                      return_updated=True)[0]

        toBalance = Database.find_one("TokenBalance", {
            'userId': toUser['id'],
            "tokenId": token["id"]
        },
                                      insert=True,
                                      for_update=True)
        if 'balance' not in toBalance: toBalance['balance'] = '0'
        if not toBalance['balance']: toBalance['balance'] = '0'
        newToBalance = int(float(toBalance['balance'])) + int(float(value))
        toBalance = Database.update("TokenBalance", {"id": toBalance["id"]},
                                    {"balance": newToBalance},
                                    return_updated=True)[0]

        return {"message": "Funds transferred"}
示例#8
0
  def trades_claim(tradeId):
    trade = Database.find_one("Trade", {"id": int(tradeId)})
    decrypted = Cryptor.decryptInput(trade['nominalAmount'], trade['sk'])
    price = Cryptor.decryptInput(trade['price'], trade['sk'])

    # Ill need to include the currency here
    amountInvested = int(decrypted.split(':')[1])
    if trade['state'] != 5:
      return {'message': 'Trade is in state {}, requires state 5'.format(trade['state'])}

    # get trade dates nav
    nav = Database.find_one("NAVTimestamp", {"tokenId": trade["tokenId"]}, order_by='-createdAt')
    # get todays nav and totalSupply
    token = Database.find_one('Token', {'id': trade['tokenId']})

    totalTokens = int(amountInvested / nav['price'])

    investorTokens = None
    if amountInvested > 0:
      effectiveNAV = (1.0+float(price)/100)*nav['price']
      investorTokens = amountInvested / effectiveNAV
    else:
      investorTokenBalance = Database.find_one("TokenBalance", {"tokenId": token["id"], "userId": investor["id"]})
      if not investorTokenBalance['balance']: investorTokenBalance['balance'] = '0'
      effectiveNAV = (1-float(price)/100)*nav['price']
      investorTokens =  min(int(amountInvested / effectiveNAV), -1 * int(investorTokenBalance['balance']))

    tokenContract = Web3Helper.getContract("ETT.json", token['address'])
    totalSupply = Web3Helper.call(tokenContract,'dateTotalSupply',arrow.get(trade['executionDate']).format('YYYY-MM-DD'),)

    # find number of tokens user allocated
    numberTokens = 0 if not nav['price'] else math.floor(amountInvested * totalSupply / nav['price'])
    investorTokens = int(investorTokens * math.pow(10, token['decimals']))

    # now ask the contract to distribute the tokens (maybe should be the investor that does this)
    investor = Database.find_one("User", {"id": trade["investorId"]})
    tradeKernelContract = Web3Helper.getContract("TradeKernel.json")
    tx = Web3Helper.transact(
      tradeKernelContract,
      'distributeTokens',
      trade['hash'],
      [
        Web3Helper.toChecksumAddress(token['address']),
        Web3Helper.toChecksumAddress(investor['address']),
      ],
      [
        investorTokens
      ]
    )
    print(tx.hex())
    Database.update("Trade", {"id": trade["id"]}, {"state": 6, "numberTokens": numberTokens})
    return {"message": "Tokens distributed"}
示例#9
0
 def token_get(fundId):
   request = app.current_request
   fund = Database.find_one("Fund", {"id": int(fundId)})
   if not fund: raise NotFoundError("fund not found with id {}".format(fundId))
   tokens = Database.find("Token", {"fundId": fund["id"]})
   fund["tokens"] = toObject(tokens)
   for token in fund["tokens"]:
     tokenHoldings = Database.find_one("TokenHoldings", {"tokenId": token["id"]})
     tokenHoldingsList = Database.find("TokenHolding", {"tokenHoldingsId": tokenHoldings["id"]})
     for tokenHolding in tokenHoldingsList:
       tokenHolding['security'] = toObject(Database.find_one('Security', {'id': tokenHolding["securityId"]}))
       tokenHolding['securityTimestamp'] = toObject(Database.find_one('SecurityTimestamp', {'securityId': tokenHolding["securityId"]}, order_by='-createdAt'))
     token['holdings'] = toObject(tokenHoldingsList)
   return toObject(fund)
示例#10
0
  def trades_show(tradeId):
    request = app.current_request
    data = request.json_body
    trade = Database.find_one("Trade", {"id": int(tradeId)})
    if not trade: raise NotFoundError("trade not found with id {}".format(tradeId))

    tradeBroker = Database.find_one("TradeBroker", {
      "tradeId": trade["id"],
      "brokerId": request.user["id"]
    })
    if not tradeBroker: raise NotFoundError("tradeBroker not found with trade id {}".format(tradeId))
    Database.update("TradeBroker", {"id": tradeBroker["id"]}, {"price": data["price"]})
    # Socket, should be pushing to a message queue of some kind
    r = passWithoutError(requests.post)(socket_uri + "trade-update", data=toObject(trade))
    return toObject(trade)
示例#11
0
  def orders_show(orderId):
    order = Database.find_one("Order", {"id": orderId})

    order["broker"] = Database.find_one("User", {"id": order["brokerId"]}, ['id','name','email','address'])
    order["token"] = toObject(Database.find_one("Token", {"id": order["tokenId"]}))
    order["orderHoldings"] = Database.find("OrderHolding", {"orderId": order["id"]})

    for orderHolding in order["orderHoldings"]:
      orderHolding["security"] = toObject(Database.find_one("Security", {"id": orderHolding["securityId"]}))

    order["orderTrades"] = Database.find("OrderTrade", {"orderId": order["id"]})
    for orderTrade in order["orderTrades"]:
      orderTrade["trade"] = toObject(Database.find_one("Trade", {"id": orderTrade["tradeId"]}))

    return toObject(order)
示例#12
0
  def trades_confirmed():
    request = app.current_request
    data = request.json_body
    tradeHash = data['tradeHash']
    broker = Database.find_one("User", {"address": data["broker"]})
    trade = Database.find_one("Trade", {"hash": tradeHash})
    if not trade: raise NotFoundError("trade not found with hash {}".format(tradeHash))

    Database.update("Trade", {"id": trade["id"]}, {"state": 1})
    Database.update("TradeBroker", {"tradeId": trade["id"], "brokerId": broker["id"]}, {"state": 1})

    trade["state"] = 1
    # Socket, should be pushing to a message queue of some kind
    r = passWithoutError(requests.post)(socket_uri + "trade-update", data=toObject(trade))
    return toObject(trade)
示例#13
0
    def test_update_multiple_with_or(self):
        with patch.dict('os.environ', env):
            Database.insert("User", {'name': 'tom'})
            Database.insert("User", {'name': 'tom2'})

            Database.update("User", [[('name','=','tom')],[('name','=','tom2')]], {'name': 'tom3'})

            user = Database.find_one("User", {'name': 'tom'})
            self.assertEqual(user, None)
            user = Database.find_one("User", {'name': 'tom2'})
            self.assertEqual(user, None)

            users = Database.find("User", {'name': 'tom3'})
            self.assertEqual(len(users), 2)
            self.assertEqual(users[0]['name'], 'tom3')
            self.assertEqual(users[1]['name'], 'tom3')
示例#14
0
    def auth_login():
        request = app.current_request
        data = request.json_body
        email = data['email']
        password = data['password']

        user = Database.find_one("User", {'email': email})
        if not user:
            raise NotFoundError('user not found with email {}'.format(email))
        if not pbkdf2_sha256.verify(password, user['password']):
            raise ForbiddenError('Wrong password')
        token = jwt.encode(toObject(user, [
            'id', 'name', 'email', 'address', 'role', 'ik', 'spk', 'signature',
            'truelayerAccountId'
        ]),
                           secret,
                           algorithm='HS256')
        return {
            'user':
            toObject(user, [
                'id', 'name', 'email', 'address', 'role', 'ik', 'spk',
                'signature', 'truelayerAccountId'
            ]),
            'token':
            token.decode("utf-8")
        }
示例#15
0
    def user_put(userId):
        request = app.current_request
        data = request.json_body

        if 'address' in data:
            # Find if another user
            # requestingUser = request.user
            data['address'] = Web3Helper.toChecksumAddress(data['address'])
            # user = Database.find_one("User", {'address': data['address']})
            # if user and user['id'] != requestingUser['id']:
            #   raise ForbiddenError('user already exists with address {}'.format(data['address']))

        user = Database.find_one("User", {'id': int(userId)})
        if not user:
            raise NotFoundError('user not found with id {}'.format(userId))
        user = Database.update('User', {'id': user['id']},
                               data,
                               return_updated=True)[0]

        if 'address' in data:
            # Set user athorized as investor
            tx = Web3Helper.transact(permissions_contract, 'setAuthorized',
                                     data['address'], 1)

        return toObject(
            user, ['id', 'name', 'address', 'role', 'ik', 'spk', 'signature'])
示例#16
0
def getTokenHoldings(tokenId):
    token = Database.find_one("Token", {"id": int(tokenId)})
    if not token:
        raise NotFoundError("token not found with id {}".format(tokenId))
    tokenHoldings = Database.find_one("TokenHoldings",
                                      {"tokenId": token["id"]},
                                      order_by='-createdAt')
    tokenHoldingsList = Database.find("TokenHolding",
                                      {"tokenHoldingsId": tokenHoldings["id"]})
    for tokenHolding in tokenHoldingsList:
        tokenHolding['security'] = toObject(
            Database.find_one('Security', {'id': tokenHolding["securityId"]}))
        tokenHolding['securityTimestamp'] = toObject(
            Database.find_one('SecurityTimestamp',
                              {'securityId': tokenHolding["securityId"]},
                              order_by='-createdAt'))
    return tokenHoldingsList
示例#17
0
  def trades_show(tradeId):
    request = app.current_request
    trade = Database.find_one("Trade", {"id": int(tradeId)})
    if not trade: raise NotFoundError("trade not found with id {}".format(tradeId))
    investor = Database.find_one("User", {"id": trade["investorId"]}, ["address", "id","name"])
    trade["investor"] = investor
    if trade['brokerId']:
      broker = Database.find_one("User", {"id": trade["brokerId"]}, ["address", "id","name"])
      trade["broker"] = broker

    token = Database.find_one("Token", {"id": trade["tokenId"]}, ["id","address","cutoffTime","symbol","decimals"])
    trade["token"] = token

    tradeBrokers = Database.find("TradeBroker", {"tradeId": trade["id"]})
    for ob in tradeBrokers: ob["broker"] = Database.find_one("User", {"id": ob["brokerId"]}, ["address", "id","name"])
    trade["tradeBrokers"] = tradeBrokers
    return toObject(trade)
示例#18
0
 def user_get(userId):
     request = app.current_request
     user = Database.find_one("User", {'id': int(userId)})
     if not user:
         raise NotFoundError('user not found with id {}'.format(userId))
     user['bankConnected'] = not not user['truelayerAccessToken']
     user = refresh_user_token(user)
     accounts = TL.get_accounts(user)
     return toObject(accounts)
示例#19
0
 def truelayer():
     request = app.current_request
     if 'id' not in request.query_params: raise NotFoundError('id')
     user_id = request.query_params['id']
     user = Database.find_one('User', {'id': user_id})
     nonce = ''.join(
         random.choice("qwertyuioplkjhgfdsazxvbnm") for _ in range(10))
     Database.update('User', {"id": int(user["id"])}, {"nonce": nonce})
     url = TL.get_auth_url(nonce)
     return Response(body=None, status_code=302, headers={"Location": url})
示例#20
0
  def trades_delete(tradeId):
    request = app.current_request
    data = request.json_body
    trade = Database.find_one("Trade", {"id": int(tradeId)})
    if not trade: raise NotFoundError("trade not found with id {}".format(tradeId))

    trade = Database.update("Trade", {"id": int(tradeId)}, {'state': 3}, return_updated=True)[0]
    # Socket, should be pushing to a message queue of some kind
    r = passWithoutError(requests.post)(socket_uri + "trade-update", data=toObject(trade))
    return toObject(trade)
示例#21
0
  def orders_complete():
    request = app.current_request
    data = request.json_body
    order = Database.find_one("Order", {"hash": data["orderHash"]})

    # set order state to complete
    Database.update("Order", {"id": order["id"]}, {"state": 1})

    # set state to all trade as verified
    orderTrades = Database.find("OrderTrade", {"orderId": order["id"]})
    tradeIds = [o['tradeId'] for o in orderTrades]
    tradeQuery = [[('id','=',tradeId)] for tradeId in tradeIds]
    Database.update("Trade", tradeQuery, {'state': 2})

    # Here I need to check if all orders are complete for the day
    executionDate = order["executionDate"]
    incompleteOrders = Database.find("Order", {"state": 0, "executionDate": executionDate, "tokenId": order["tokenId"]})
    if len(incompleteOrders):
      # There are still orders waiting to complete
      print("There are still orders waiting to complete")
      return {"message": "Order completed"}

    # Here I need to calculate the AUM
    # find the token
    token = Database.find_one("Token", {"id": order["tokenId"]})
    print(token['address'])
    tokenContract = Web3Helper.getContract("ETT.json", token['address'])

    tokenHoldingsObject = Database.find_one("TokenHoldings", {"tokenId": token["id"]})
    tokenHoldings = Database.find("TokenHolding", {"tokenHoldingsId": tokenHoldingsObject["id"]})

    newAUM = 0
    for tokenHolding in tokenHoldings:
      securityTimestamp = Database.find_one('SecurityTimestamp', {'securityId': tokenHolding["securityId"]}, order_by='-createdAt')
      newAUM += securityTimestamp['price'] * tokenHolding['securityAmount']

    executionDateString = arrow.get(executionDate).format('YYYY-MM-DD')

    tx = Web3Helper.transact(tokenContract, 'endOfDay', executionDateString)
    # tx = b''
    print({"message": "AUM updated", "AUM": newAUM, "hash": tx.hex()})
    return {"message": "AUM updated", "AUM": newAUM, "hash": tx.hex()}
示例#22
0
  def orders_get():
    request = app.current_request
    query = request.query_params or {}
    single = False
    orders = []
    total = None

    if 'page' in query:
      page = int(query['page'])
      del query['page']
    if 'page_count' in query:
      page_count = int(query['page_count'])
      del query['page_count']

    if 'single' in query:
      del query['single']
      single = True
      order = Database.find_one("Order", query)
      if not order: raise NotFoundError("No order found")
      orders = [order]
    else:
      dbRes = Database.find("Order", query, page=page, page_count=page_count)
      orders = dbRes['data']
      total = dbRes['total']


    for order in orders:
      order["broker"] = Database.find_one("User", {"id": order["brokerId"]}, ['id','name','email','address'])
      order["token"] = toObject(Database.find_one("Token", {"id": order["tokenId"]}))
      order["orderHoldings"] = Database.find("OrderHolding", {"orderId": order["id"]})

      for orderHolding in order["orderHoldings"]:
        orderHolding["security"] = toObject(Database.find_one("Security", {"id": orderHolding["securityId"]}))

      order["orderTrades"] = Database.find("OrderTrade", {"orderId": order["id"]})
      for orderTrade in order["orderTrades"]:
        orderTrade["trade"] = toObject(Database.find_one("Trade", {"id": orderTrade["tradeId"]}))

    if single:
      return toObject(orders[0])

    return {"data": toObject(orders), "total": total}
示例#23
0
    def tokens_nav_update():
        print('\n\n\n\n')
        request = app.current_request
        data = request.json_body
        token = Database.find_one("Token", {"address": data["token"]})
        time = data["time"]
        executionDate = arrow.get(time).format('YYYY-MM-DD')
        nav = Database.insert("NAVTimestamp", {
            "tokenId": token['id'],
            "price": data['value'],
            "executionDate": executionDate
        },
                              return_inserted=True)

        # First need to collect the trades
        print(token['id'])
        trades = Database.find("Trade", {"state": 1, "tokenId": token["id"]})
        print(trades)
        # Need to go through each trade and get the NAV+price
        supplyUpdate = 0
        for trade in trades:
            decryptedNominalAmount = Cryptor.decryptInput(
                trade['nominalAmount'], trade['sk'])
            amountInvested = int(decryptedNominalAmount.split(':')[1])
            price = Cryptor.decryptInput(trade['price'], trade['sk'])
            price = float(price)
            print("amountInvested: ", amountInvested)
            print("price: ", price)
            effectiveNAV = (1.0 + float(price) / 100) * nav['price']
            print("supplyUpdate", int(amountInvested * 1.0 / effectiveNAV))
            # supplyUpdate += int(amountInvested * math.pow(10, token['decimals']) / nav['price'])
            supplyUpdate += int(amountInvested *
                                math.pow(10, token['decimals']) / effectiveNAV)

        tokenContract = Web3Helper.getContract("ETT.json", token['address'])

        # Update trades to be ready for claiming
        tradeQuery = [[('id', '=', t['id'])] for t in trades]
        trades = Database.update("Trade",
                                 tradeQuery, {'state': 4},
                                 return_updated=True)
        for trade in trades:
            # Take funds
            takeFunds(trade)
        tx = Web3Helper.transact(
            tokenContract,
            'updateTotalSupply',
            supplyUpdate,
            '',  # we are ignoring this for now
            executionDate)
        # tx = b''
        print(tx.hex())

        return toObject(nav)
示例#24
0
 def checkKyc(address):
     user = Database.find_one("User", {'address': address})
     if not user:
         raise NotFoundError(
             'user not found with address {}'.format(address))
     user = refresh_user_token(user)
     accounts = TL.get_accounts(user)
     if not (len(accounts)):
         raise ForbiddenError('Not KYC')
     else:
         return {'message': 'Is KYC', 'status': 200}
示例#25
0
 def user_get(userId):
     request = app.current_request
     user = Database.find_one("User", {'id': int(userId)})
     if not user:
         raise NotFoundError('user not found with id {}'.format(userId))
     user['bankConnected'] = not not user['truelayerAccessToken']
     return toObject(user, [
         'id', 'name', 'address', 'role', 'ik', 'spk', 'signature',
         'bankConnected', 'identity', 'juristiction'
         'addressLine1', 'addressLine2', 'city', 'postcode', 'country',
         'truelayerAccountId'
     ])
示例#26
0
 def tokens_contract_update():
     request = app.current_request
     data = request.json_body
     Database.update(
         "Token", {"symbol": data["symbol"]}, {
             "address": Web3Helper.toChecksumAddress(data["tokenAddress"]),
         })
     token = Database.find_one("Token", {"symbol": data["symbol"]})
     owner = Database.find_one(
         "User", {"address": Web3Helper.toChecksumAddress(data["owner"])})
     tokenBalance = Database.find_one("TokenBalance", {
         "tokenId": token['id'],
         "userId": owner["id"]
     })
     if not tokenBalance:
         tokenBalance = Database.find_one("TokenBalance", {
             "tokenId": token['id'],
             "userId": owner["id"],
             "balance": data['initialAmount']
         },
                                          insert=True)
     return toObject(token)
示例#27
0
  def funds_post():
    request = app.current_request
    data = request.json_body
    owner = None
    ownerId = data["ownerId"] if "ownerId" in data else None
    if not ownerId:
      owner = Database.find_one("User", {"address": Web3Helper.account()})
      ownerId = owner["id"]
    else:
      owner = Database.find_one("User", {"id": ownerId})
    if not owner: raise NotFoundError('No user found')

    fund_data = {
      "name": data["name"],
      "ownerId": ownerId
    }

    fund = Database.find_one('Fund', fund_data, insert=True)

    for token in data["tokens"]:
      token_data = {
        "name": data["name"],
        "fundId": fund["id"],
        "decimals": token["decimals"],
        "symbol": token["symbol"],
        "cutoffTime": int(token["cutoffTime"]),
        "fee": int(token["fee"]),
        "ownerId": ownerId,
        "currency": token["currency"],
        "initialAmount": token["initialAmount"],
        "incomeCategory": token["incomeCategory"],
        "minimumOrder": token["minimumOrder"]
      }
      if "nav" in token: token_data["nav"] = token['nav']
      if "holdings" in token: token_data["holdings"] = token["holdings"]
      token = createToken(token_data)

    return toObject(fund)
示例#28
0
    def truelayer_callback():
        request = app.current_request
        code = request.query_params['code']
        nonce = request.query_params['state']
        user = Database.find_one("User", {'nonce': nonce})
        if not user: raise NotFoundError('user not found')
        user = Database.update('User', {"id": user["id"]},
                               TL.get_access_token(user, code),
                               return_updated=True)[0]
        accounts = TL.get_accounts(user)
        if not len(accounts): raise NotFoundError('No accounts found for user')

        # update the permissions contract
        # Web3Helper.transact(permissions_contract,'setAuthorized',Web3Helper.toChecksumAddress(user['address']),1)

        return Response(
            body=None,
            status_code=302,
            headers={"Location": "{}investor/profile".format(front_end_url)})
示例#29
0
    def checkBalance(address):
        request = app.current_request
        amount = int(request.query_params['amount'])

        user = Database.find_one("User",
                                 {'address': Web3.toChecksumAddress(address)})
        if not user:
            raise NotFoundError(
                'user not found with address {}'.format(address))

        user = refresh_user_token(user)
        balance = TL.get_balance(user)

        balance_small = int(balance['available'] * 100)

        if (balance_small < amount):
            raise ForbiddenError('Not enough funds')
        else:
            return {'message': 'Has funds', 'status': 200}
示例#30
0
def getInvested(tokenId, user):
    token = Database.find_one("Token", {"id": int(tokenId)})
    if not token:
        raise NotFoundError("token not found with id {}".format(tokenId))

    # Need to find all the trades this investor invested in
    claimedTrades = Database.find("Trade", {
        "tokenId": token["id"],
        "investorId": user["id"],
        "state": 6
    })

    totalAmount = 0
    for trade in claimedTrades:
        decrypted = Cryptor.decryptInput(trade['nominalAmount'], trade['sk'])
        # I'll need to include the currency here
        amountInvested = int(decrypted.split(':')[1])
        print(amountInvested)
        totalAmount += amountInvested
    return totalAmount