Exemple #1
0
 def get(self, configuration_file_name):
     configuration_file = RaidenConfigurationFile.get_by_filename(
         configuration_file_name)
     self.render("account.html", configuration_file=configuration_file)
Exemple #2
0
 def get(self, configuration_file_name):
     configuration_file = RaidenConfigurationFile.get_by_filename(
         configuration_file_name)
     self.render("funding_select_method.html",
                 configuration_file=configuration_file)
Exemple #3
0
    def _run_swap(self, **kw):
        try:
            configuration_file_name = kw.get("configuration_file_name")
            exchange_name = kw["exchange"]
            token_amount = kw["amount"]
            token_ticker = kw["token"]
        except (ValueError, KeyError, TypeError) as exc:
            self._send_error_message(f"Invalid request: {exc}")
            return

        try:
            configuration_file = RaidenConfigurationFile.get_by_filename(
                configuration_file_name)
            network_name = configuration_file.network.name
            form = TokenExchangeForm({
                "network": [network_name],
                "exchange": [exchange_name],
                "token_amount": [token_amount],
                "token_ticker": [token_ticker],
            })

            if form.validate():
                account = configuration_file.account
                w3 = make_web3_provider(
                    configuration_file.ethereum_client_rpc_endpoint, account)
                token = Erc20Token.find_by_ticker(form.data["token_ticker"],
                                                  network_name)

                token_amount = TokenAmount(Wei(form.data["token_amount"]),
                                           token)
                exchange = Exchange.get_by_name(form.data["exchange"])(w3=w3)
                self._send_status_update(f"Starting swap at {exchange.name}")

                costs = exchange.calculate_transaction_costs(
                    token_amount, account)
                needed_funds = costs["total"]
                exchange_rate = costs["exchange_rate"]
                current_balance = account.get_ethereum_balance(w3)

                if needed_funds > current_balance:
                    raise ValueError((
                        f"Not enough ETH. {current_balance.formatted} available, but "
                        f"{needed_funds.formatted} needed"))

                self._send_status_update(
                    (f"Best exchange rate found at {exchange.name}: "
                     f"{exchange_rate.formatted} / {token_amount.ticker}"))
                self._send_status_update(
                    f"Trying to acquire up to {token_amount.formatted} at this rate"
                )
                self._send_status_update(
                    f"Estimated costs: {needed_funds.formatted}")

                exchange.buy_tokens(account, token_amount)
                token_balance = get_token_balance(w3, account, token)

                self._send_status_update(
                    f"Swap complete. {token_balance.formatted} available")
                self._send_redirect(
                    self.reverse_url("launch", configuration_file.file_name))
            else:
                for key, error_list in form.errors.items():
                    error_message = f"{key}: {'/'.join(error_list)}"
                    self._send_error_message(error_message)
        except (json.decoder.JSONDecodeError, KeyError, ExchangeError,
                ValueError) as exc:
            self._send_error_message(str(exc))
Exemple #4
0
    def get(self):
        if not RaidenConfigurationFile.list_existing_files():
            raise HTTPError(404)

        self.render("configuration_list.html")
Exemple #5
0
 def test_cannot_get_config_for_different_settings(self):
     self.configuration_file.save()
     settings = load_settings("mainnet")
     all_configs = RaidenConfigurationFile.get_available_configurations(
         settings)
     self.assertEqual(len(all_configs), 0)
Exemple #6
0
 def tearDown(self):
     for config in RaidenConfigurationFile.get_available_configurations(
             self.settings):
         config.path.unlink()
     self.account.keystore_file_path.unlink()
Exemple #7
0
 def test_can_create_configuration(self):
     self.configuration_file.save()
     all_configs = RaidenConfigurationFile.get_available_configurations(
         self.settings)
     self.assertEqual(len(all_configs), 1)
Exemple #8
0
 def test_cannot_get_by_not_existing_filename(self):
     with self.assertRaises(ValueError):
         RaidenConfigurationFile.get_by_filename("invalid")
Exemple #9
0
    def _run_funding(self, **kw):
        try:
            configuration_file_name = kw.get("configuration_file_name")
            configuration_file = RaidenConfigurationFile.get_by_filename(
                configuration_file_name)
        except Exception as exc:
            self._send_error_message(str(exc))
            return

        network = configuration_file.network
        if not network.FAUCET_AVAILABLE:
            self._send_error_message(
                f"Can not run automatic funding for {network.capitalized_name}"
            )
            return

        account = configuration_file.account
        try_unlock(account)
        if account.passphrase is None:
            self._send_error_message(
                "Failed to unlock account! Please reload page")
            return

        w3 = make_web3_provider(
            configuration_file.ethereum_client_rpc_endpoint, account)
        self._send_status_update(
            f"Obtaining {network.capitalized_name} ETH through faucet")
        network.fund(account)
        balance = account.wait_for_ethereum_funds(
            w3=w3, expected_amount=EthereumAmount(0.01))
        self._send_status_update(f"Account funded with {balance.formatted}")

        service_token = Erc20Token.find_by_ticker(
            self.installer_settings.service_token.ticker,
            self.installer_settings.network)

        if self.installer_settings.service_token.mintable:
            self._send_next_step(
                f"Minting {service_token.ticker}",
                f"Fund Account with {service_token.ticker}",
                3,
            )
            tx_hash = mint_tokens(w3, account, service_token)
            wait_for_transaction(w3, tx_hash)

        service_token_balance = get_token_balance(w3, account, service_token)
        if service_token_balance.as_wei > 0:
            self._deposit_to_udc(w3, account, service_token,
                                 service_token_balance)

        if self.installer_settings.transfer_token.mintable:
            transfer_token = Erc20Token.find_by_ticker(
                self.installer_settings.transfer_token.ticker,
                self.installer_settings.network)
            self._send_next_step(
                f"Minting {transfer_token.ticker}",
                f"Fund Account with {transfer_token.ticker}",
                4,
            )
            tx_hash = mint_tokens(w3, account, transfer_token)
            wait_for_transaction(w3, tx_hash)

        self._send_redirect(self.reverse_url("launch",
                                             configuration_file_name))
Exemple #10
0
 def get(self, configuration_file_name, keystore_filename):
     configuration_file = RaidenConfigurationFile.get_by_filename(
         configuration_file_name)
     keystore_path = configuration_file.configuration_data["keystore-path"]
     self.render(f"{keystore_path}/{keystore_filename}")
Exemple #11
0
 def get(self):
     self.render_json([
         self.reverse_url("api-configuration-detail", os.path.basename(f))
         for f in RaidenConfigurationFile.list_existing_files()
     ])
Exemple #12
0
    def _run_swap(self, **kw):
        try:
            configuration_file_name = kw.get("configuration_file_name")
            exchange_name = kw["exchange"]
            token_amount = kw["amount"]
            token_ticker = kw["token"]
        except (ValueError, KeyError, TypeError) as exc:
            self._send_error_message(f"Invalid request: {exc}")
            return

        try:
            configuration_file = RaidenConfigurationFile.get_by_filename(
                configuration_file_name)
            network_name = configuration_file.network.name
            form = TokenExchangeForm({
                "network": [network_name],
                "exchange": [exchange_name],
                "token_amount": [token_amount],
                "token_ticker": [token_ticker],
            })

            if form.validate():
                account = configuration_file.account
                try_unlock(account)
                w3 = make_web3_provider(
                    configuration_file.ethereum_client_rpc_endpoint, account)
                token = Erc20Token.find_by_ticker(form.data["token_ticker"],
                                                  network_name)

                token_amount = TokenAmount(Wei(form.data["token_amount"]),
                                           token)
                exchange = Exchange.get_by_name(form.data["exchange"])(w3=w3)
                self._send_status_update(f"Starting swap at {exchange.name}")

                costs = exchange.calculate_transaction_costs(
                    token_amount, account)
                needed_funds = costs["total"]
                exchange_rate = costs["exchange_rate"]
                balance_before_swap = account.get_ethereum_balance(w3)

                if needed_funds > balance_before_swap:
                    raise ValueError((
                        f"Not enough ETH. {balance_before_swap.formatted} available, but "
                        f"{needed_funds.formatted} needed"))

                self._send_status_update(
                    (f"Best exchange rate found at {exchange.name}: "
                     f"{exchange_rate} / {token_amount.ticker}"))
                self._send_status_update(
                    f"Trying to acquire {token_amount} at this rate")

                transaction_receipt = exchange.buy_tokens(
                    account, token_amount, costs)
                wait_for_transaction(w3, transaction_receipt)

                token_balance = get_token_balance(w3, account, token)
                balance_after_swap = account.get_ethereum_balance(w3)
                actual_total_costs = balance_before_swap - balance_after_swap

                self._send_status_update(
                    f"Swap complete. {token_balance.formatted} available")
                self._send_status_update(f"Actual costs: {actual_total_costs}")

                required = RequiredAmounts.for_network(network_name)
                service_token = Erc20Token.find_by_ticker(
                    required.service_token.ticker, network_name)
                service_token_balance = get_token_balance(
                    w3, account, service_token)
                total_service_token_balance = get_total_token_owned(
                    w3, account, service_token)
                transfer_token = Erc20Token.find_by_ticker(
                    required.transfer_token.ticker, network_name)
                transfer_token_balance = get_token_balance(
                    w3, account, transfer_token)

                if total_service_token_balance < required.service_token:
                    raise ExchangeError("Exchange was not successful")

                elif service_token_balance.as_wei > 0:

                    self._send_status_update(
                        f"Making deposit of {service_token_balance.formatted} to the "
                        "User Deposit Contract")
                    self._send_status_update(f"This might take a few minutes")
                    transaction_receipt = deposit_service_tokens(
                        w3=w3,
                        account=account,
                        token=service_token,
                        amount=service_token_balance.as_wei,
                    )
                    wait_for_transaction(w3, transaction_receipt)
                    service_token_deposited = get_token_deposit(
                        w3=w3, account=account, token=service_token)
                    self._send_status_update(
                        f"Total amount deposited at UDC: {service_token_deposited.formatted}"
                    )

                if transfer_token_balance < required.transfer_token:
                    redirect_url = self.reverse_url(
                        "swap", configuration_file.file_name,
                        transfer_token.ticker)
                    next_page = "Moving on to exchanging DAI ..."

                else:
                    redirect_url = self.reverse_url(
                        "launch", configuration_file.file_name)
                    next_page = "You are ready to launch Raiden! ..."

                self._send_summary(
                    ["Congratulations! Swap Successful!", next_page],
                    icon=token_ticker)
                time.sleep(5)
                self._send_redirect(redirect_url)
            else:
                for key, error_list in form.errors.items():
                    error_message = f"{key}: {'/'.join(error_list)}"
                    self._send_error_message(error_message)
        except (json.decoder.JSONDecodeError, KeyError, ExchangeError,
                ValueError) as exc:
            self._send_error_message(str(exc))
            redirect_url = self.reverse_url("swap",
                                            configuration_file.file_name,
                                            token_ticker)
            next_page = f"Try again to exchange {token_ticker}..."
            self._send_summary(["Transaction failed",
                                str(exc), next_page],
                               icon="error")
            time.sleep(5)
            self._send_redirect(redirect_url)
Exemple #13
0
    def _run_swap(self, **kw):
        try:
            configuration_file_name = kw.get("configuration_file_name")
            exchange_name = kw["exchange"]
            token_amount = kw["amount"]
            token_ticker = kw["token"]
        except (ValueError, KeyError, TypeError) as exc:
            self._send_error_message(f"Invalid request: {exc}")
            return

        try:
            configuration_file = RaidenConfigurationFile.get_by_filename(
                configuration_file_name)
            network_name = configuration_file.network.name
            form = TokenExchangeForm({
                "network": [network_name],
                "exchange": [exchange_name],
                "token_amount": [token_amount],
                "token_ticker": [token_ticker],
            })

            if form.validate():
                account = configuration_file.account
                try_unlock(account)
                w3 = make_web3_provider(
                    configuration_file.ethereum_client_rpc_endpoint, account)
                token = Erc20Token.find_by_ticker(form.data["token_ticker"],
                                                  network_name)

                token_amount = TokenAmount(Wei(form.data["token_amount"]),
                                           token)
                exchange = Exchange.get_by_name(form.data["exchange"])(w3=w3)
                self._send_status_update(f"Starting swap at {exchange.name}")

                costs = exchange.calculate_transaction_costs(
                    token_amount, account)
                needed_funds = costs["total"]
                exchange_rate = costs["exchange_rate"]
                balance_before_swap = account.get_ethereum_balance(w3)

                if needed_funds > balance_before_swap:
                    raise ValueError((
                        f"Not enough ETH. {balance_before_swap.formatted} available, but "
                        f"{needed_funds.formatted} needed"))

                self._send_status_update(
                    (f"Best exchange rate found at {exchange.name}: "
                     f"{exchange_rate} / {token_amount.ticker}"))
                self._send_status_update(
                    f"Trying to acquire {token_amount} at this rate")

                tx_hash = exchange.buy_tokens(account, token_amount, costs)
                wait_for_transaction(w3, tx_hash)

                token_balance = get_token_balance(w3, account, token)
                balance_after_swap = account.get_ethereum_balance(w3)
                actual_total_costs = balance_before_swap - balance_after_swap

                self._send_status_update(
                    f"Swap complete. {token_balance.formatted} available")
                self._send_status_update(f"Actual costs: {actual_total_costs}")

                required = RequiredAmounts.from_settings(
                    self.installer_settings)
                service_token = Erc20Token.find_by_ticker(
                    required.service_token.ticker, network_name)
                service_token_balance = get_token_balance(
                    w3, account, service_token)
                total_service_token_balance = get_total_token_owned(
                    w3, account, service_token)
                transfer_token = Erc20Token.find_by_ticker(
                    required.transfer_token.ticker, network_name)
                transfer_token_balance = get_token_balance(
                    w3, account, transfer_token)

                if total_service_token_balance < required.service_token:
                    raise ExchangeError("Exchange was not successful")
                elif token_ticker == service_token.ticker and service_token_balance > required.service_token:
                    self._deposit_to_udc(w3, account, service_token,
                                         service_token_balance)

                self._redirect_transfer_swap(configuration_file,
                                             transfer_token_balance, required)
            else:
                for key, error_list in form.errors.items():
                    error_message = f"{key}: {'/'.join(error_list)}"
                    self._send_error_message(error_message)
        except (json.decoder.JSONDecodeError, KeyError, ExchangeError,
                ValueError) as exc:
            self._redirect_after_swap_error(exc, configuration_file.file_name,
                                            token_ticker)
Exemple #14
0
 def tearDown(self):
     for config in RaidenConfigurationFile.get_available_configurations():
         config.passphrase_file_path.unlink()
         config.path.unlink()
Exemple #15
0
 def get(self):
     file_names = [os.path.basename(f) for f in RaidenConfigurationFile.list_existing_files()]
     self.render("raiden_setup.html", configuration_file_names=file_names)