This limit may be increased in the future. If you have any questions please contact support from bitfinex.com/support. Thank you for your understanding."},"settings":{"alerts":{"price1_html":"Receive a notification in your browser, desktop, and/or mobile device when the ticker price crosses your alert values.","price2_html":"You can quickly set price alerts by clicking directly in the order book. When you hover over a row in the order book on the Trading page, a bell icon will apear at the outer edge of the row. Click the bell icon to toggle a price alert at that price point.","price3_html":"Play an audio cue when price alerts are triggered","sound_demos":"sound demos"},"saved":"Settings saved."},"welcome":{"header":"Welcome to Bitfinex","p1":"Congratulations, and welcome to Bitfinex! The last step is to confirm your email address.","p2_html":"We've sent a confirmation email to %{email}. Please follow the link in that email to confirm your email address and then you'll be able to sign in to your new account.","p3":"If you haven't received the email in five minutes, please check the following:","h1":"Check if you have used the correct email.","h2":"Check your spam folder.","h3":"Contact us from bitfinex.com/support."},"token_manager":{"title":"Token Manager","no_active":"There are currently no active tokens for the Token Manager."},"platform_link":{"title":"Setup Account Link","one_time":"One-Time Setup","desc1":"%{this_platform} and %{signup_platform} are integrated platforms. That means you can use your %{signup_platform} account to access %{this_platform}. Please complete a one-time setup to begin.","desc2":"To connect your %{signup_platform} account to %{this_platform}, click the button below to request a confirmation email.","desc3":"The address associated with your %{signup_platform} account will receive an email asking you to approve.","desc4":"After you confirm, you will be able to log into %{this_platform} using your %{signup_platform} account credentials.","why_link":"Why Link Accounts?","desc5":"Connecting your %{signup_platform} account with %{this_platform} has many benefits, including balance sharing and easy transfers, shared verifications, and shared volume for fee tier calculations.","desc6":"If you prefer not to use your %{signup_platform} account for %{this_platform}, you can close this box and sign up for a new %{this_platform} account using a different email address instead.","u2f_notice":"Important U2F Notice","desc7_html":"Please notice that linking your %{signup_platform} account to a new %{this_platform} account will import all of %{signup_platform} account settings, security settings, and two-factor authentication settings except U2F security keys.","desc8_html":"This means that when you link these two accounts your new %{this_platform} account will not be protected by the U2F you have configured on %{signup_platform}.","desc9":"If you wish to proceed, after linking the accounts using the button below please immediately sign into your new %{this_platform} account and enable U2F."},"account":{"about":"About Page","newsletter":"Newsletter","yes_us_resident":"Yes, I am a US resident","no_us_resident":"No, I am not a US resident","account_name":"Account Name","status":"Account status","logged_out":"You have been logged out.","back_to_platform":"Return to platform","balance_details":"BALANCE DETAILS","bal_equiv":"Your approximate %{currency} equivalent balance using your balances and current market prices. Click to Toggle.","bal_equiv_market":"Include position P/L and position swap in USD approximate equivalent balance calculation.","bal_equiv_prefix":"EQUIVALENT","bal_equiv_label":"MARKET","transfer_source":"Select %{target} For %{currency} Transfer","ledger_entries_label":"Ledger Entries","exchange_wallet_name":"Exchange","trading_wallet_name":"Margin","deposit_wallet_name":"Funding","exchange_wallet_tooltip":"Funds in your Exchange Wallet are used for Exchange Trading.","trading_wallet_tooltip":"Funds in your Margin Wallet are used for Margin Trading.","deposit_wallet_tooltip":"Funds in your Funding Wallet are used for Margin Funding.","copy_value":"Value %{value} copied to clipboard.","manage_account":"Manage Account","account_number_strict":"Account number","account_settings":"Account","margin_funding_options":"Funding Options","margin_trading_options":"Trading Options","default_funding":"Defaults For Margin Positions","default_funding1":"Choose your default funding type when opening a new margin position (this can also be toggled on a per-position basis on any open position).","default_funding2":"Using term funding, when a position accumulates a funding cost additional loans may be needed out to cover this cost. Using daily funding the interest is settled daily against equity in your account, so no new funding is needed to cover the accumulation of a position's funding cost.","merchant_tools":"Merchant Tools","merchant_tools_sub":"Automation tools and settings","merchant_tools_expl":"Enable automatic orders and automatic withdrawals","merchant_tools_expl2":"Using a combination of automatic orders and automatic withdrawals complex workflows can be created. For example you could define an automatic order that sells ETH you deposit for BTC. Then, once your BTC balance reaches a minimum threshold the BTC could be automatically withdrawn. Deposit ETH and receive BTC.","auto_orders":"automatic orders","setting_saved":"Setting saved","filter_pair":"Filtering orders by current pair","filter_by_pair":"Filter by pair","filter_by_context":"Filter by Exchange vs Margin orders","all_pairs":"Showing orders for all pairs","filter_context":"Filtering orders by your current context, Exchange or Margin Trading","all_context":"Showing orders for both Exchange and Margin Trading","filter_curr":"Filtering funding by current currency","filter_by_curr":"Filter by currency","filter_tooltip":"Active filter. Click to remove.","all_currs":"Showing funding for all currencies","interface":{"header":"Header","theme":"Theme","theme_toggle":"Theme Toggle","theme_opt":"Light or Dark Theme Options","theme_q":"Prefer to try a different color scheme?","title":"Interface","settings":"Interface Settings","toggle":"Toggle to","order_book_q":"Choose the order of the columns in the order book","order_form":"Order Form","sidebar":"Sidebar","tables":"Tables","tables_interface":"Table Interface","tables_orders_filter":"On the Exchange and Margin Trading pages in the \"Active Orders\" section, only show the orders for the currently active pair","tables_funding_filter":"On the Margin Funding pages, only show my funding for the currently active currency","themes":{"black":"Black","dark":"Dark","light":"Light","title":"Color theme"},"desc_for":"Interface settings for %{section}","book_depth_vis":"Book Depth Visualization","tickers":{"first_ccy":"Show volume in terms of the first currency in the pair","ccy_equiv":"Show volume in %{ccy} equivalent"},"chart":{"show_orders":"Show your orders on the chart. For example, when viewing the BTC/USD chart, if you have any active BTC/USD orders in the chart's current visible price range, you will see a horizontal line indicating where your BTC/USD orders are. When enabled, you can also modify orders (by click or dragging) or cancel them directly from the chart.","show_pos":"Show your margin position on the chart for the current page. For example, when viewing the BTC/USD chart, if you have a open BTC/USD position in the chart's current visible price range you will see a horizontal line indicating your position's base price. You can also close a position directly from the chart.","show_alerts":"Show your price alerts on the chart. When enabled, you can also modify price alerts (by dragging) or remove them directly from the chart.","interval":"Default interval for chart candles. Note that also the chart will remember your last selected interval.","rescuing":"Possible connection interrupt. Getting a fresh connection to chart data.","too_many_candles":"Cannot load more candles: limit reached. Please choose a larger candle interval to view a wider time range."}},"notifications":"Notifications","negative_balance":"Negative balance","negative_balance_explain":"You currently have a negative balance in one of your wallet. Please settle this negative balance before submitting a withdrawal","autosell_explain":"The auto-sell feature allows you to immediately and automatically sell any of your currencies, as soon as they are deposited in your account, at a minimum price that you can set (limit order)","autowithdraw_explain":"The auto-withdraw feature allows you to automatically post a withdrawal request for the method of your choice as soon as your balance in a currency reaches a certain level","api":{"edit":"Edit","key_permissions":"API Key Permissions","requirements":"Editing API key permissions requires either Google Authenticator or Twilio SMS two-factor authentication. Set up one of these two services in the %{link: Security Center} before attempting to make changes."},"reports":"Reports","announcements":"Announcements","changelog":"Change Log","changelog_mistakes":"We're dedicated to bringing you the best platform possible. If we made any mistakes or if you have any suggestions please get in touch.","support_center":"Support Center","media":"Media Contact","team":"Team Page","tours":"Tours","account_token_key":"Account token (Key)","accounting_currency":"Accounting Currency","action":"Action","agree_to_bfx_tos":"By signing up on Bitfinex, you agree to our %{link1: Terms & Conditions} and %{link2: Anti-Spam Policy}","already_have_account":"Already have an account?","api_create_new":"Create New Key","api_customized":"Make a new customized API key","api_generation_page":"API","api_explain1":"Please treat the security of both your API keys and API secrets as you would treat a password. If you suspect either one has been compromised, revoke it immediately.","api_explain2_html":"The Bitfinex APIs are designed to allow access to all of the features of the Bitfinex platform.
We provide REST and WebSocket APIs which are documented at %{link: docs.bitfinex.com}. We also host several open source integrations and libraries including Go, Node.js, and Ruby.","api_explain4":"Here you can manage your API keys. ","api_explain5":"Store them carefully as the API keys cannot be recovered","api_generate":"Generate API key","api_key_label":"Label","api_label":"Label Your API Key","api_revoke":"To revoke your API key, click","api_save":"Store your API key somewhere safe. It will not be shown again.","api_your_api_key":"API key","api_my_keys":"My API Keys","api_mangage_keys":"Manage your API keys","api_no_read":"No read actions for this section","api_no_write":"No write actions for this section","api_permissions":"Permissions","api_keys":"API Keys","api_docs":"API Documentation","api_read":"Read","api_read_only":"Read-only key ","api_read_only_explain":"A read-only token will only be able to read information from your account and will not be able to make any changes or update any data.","api_whats_this":"(What's this?)","api_your_api_secret":"API key secret","api_id":"Key ID","api_secret":"Secret","api_withdrawal_enabled":"Withdrawal enabled","api_withdrawal_enabled_key":"Withdrawal enabled key ","api_withdrawal_enabled_key_explain":"A withdrawal enabled key will allow you to request withdrawals and move funds between your wallet via our API.","api_write":"Write","authenticate":"Authenticate","audit_title":"Bitfinex Audit Information","audit_posted":"Posted: ","automatic_withdrawals":"Automatic withdrawals","automatic_withdrawals_explain":"This feature allows you to set up an automatic withdrawal for a specific wallet and currency.","automatic_withdrawals_explain2":"Once enabled, proceed through the normal withdrawal process and you will see a new checkbox on the form labeled \"Set this withdrawal as an automatic withdrawal\".","automatic_withdrawals_explain3":"As an example: if you are submitting a BTC withdrawal from your Exchange wallet to address abc123 and you check the checkbox on the form to enable automatic withdrawals, you will see a new input field appear on the form labeled \"Threshold\". The threshold is the minimum available balance of BTC in your Exchange wallet that will trigger a new withdrawal for the total amount available in that wallet. For example, if you set 1.5 as the threshold value, then in the future as soon as your Exchange wallet has 1.5 BTC in available balance, the new withdrawal will be created from your Exchange wallet to address abc123 for the amount equal to your available BTC in that wallet.","automatic_withdrawals_explain4":"The Automatic Withdrawals feature can be enabled or disabled from the Account page under the Account Type heading. When activated, the new checkbox will become available on the withdrawal form.","available_balance_explain":"If you have limit orders, open positions, unused or active margin funding, this will decrease your available balance. To increase it, you can cancel limit orders or reduce/close your positions.","available_tether_pool":"Total tethers available in Bitfinex hot wallet","balance":"Balance","bank_address":"Bank Address","bank_name":"Bank Name","bank_template_name":"Bank Template","beneficiary_account_name":"Beneficiary Name","beneficiary_account_address":"Beneficiary Full Address (including city & post code)","beneficiary_account_number":"Beneficiary Account Number (or IBAN)","beneficiary_bank_name":"Beneficiary Bank Name","beneficiary_bank_address":"Beneficiary Bank Address","beneficiary_bank_city":"Beneficiary Bank City","beneficiary_bank_country":"Beneficiary Bank Country","beneficiary_bank_swift":"Beneficiary Bank SWIFT Code","bitcoin":"Bitcoin","btc":"Bitcoin","daemon_down":"The %{currency} watchonly daemon is restarting, please come back in a few minutes","gen_deposit_add":"Click to generate address","change_history":{"title":"Change History","desc":"Raw log of account events and changes.","none":"You haven't made any settings changes yet.","logid":"Log ID"},"reset_password":{"modal_title":"Change Your Password","current":"Current Password","new":"New Password","confirm_new":"Confirm New Password","header":"Request Password Reset","two_fa_required":"Two-factor authentication is required to change your password.","begin":"Begin the password reset process by requesting an email to the account email address. You will receive an email with details for completing the reset.","withdraw_lock_warn_forgot_pass_flow":"As a security precaution, resetting your password will put your account on a five day withdrawal hold.","sent1":"An email has been sent with a link to reset your password.","sent2":"Please check your email to proceed with the password reset process."},"two_fa_reset":{"header":"Request Two-Factor Authentication Reset","desc":"This page will help you securely reset your two-factor authentication (2FA).","desc1":"For users with total assets greater than %{amount} equivalent, please contact support for assistance.","desc2":"Visit the \"Account Access\" section of the %{link: Support Center} to begin.","desc3":"If your account has total assets less than %{amount} equivalent, use the form below to proceed.","desc4_html":"After confirming by email, your 2FA will be reset and your account will be put on temporary withdrawal hold.","desc5_html":"The duration of the withdrawal hold will be between 5 and 15 days, depending on your account equity.","min_eq_exceeded":"Your account is not eligible for automated two-factor authentication reset because your total account value exceeds %{amount} equivalent. Please contact support for assistance.","not_active":"Cannot reset %{method}. That 2FA method is not currently enabled for this user."},"contact_us":"Contact us","contact_us_to_change_userinfo":"To change username or email, please %{link:contact support}.","credit":"Credit","curr_pairs_title":"Currencies & Pairs","curr_pairs_desc":"Manage active currencies and pairs","date":"Date","date_time_title":"Date & Time","date_time_desc":"Customize timezone and date/time display","debit":"Debit","deposit":"Deposit","deposit_funds":"Deposit funds","no_deposits":"No recent deposits.","no_withdrawals":"No recent withdrawals.","deposit_citi":"CITIBANK, NEW YORK ( SWIFT: CITIUS33 )","deposit_select":"Select wallet","description":"Description","document rejected":"Document Rejected","details_payment_wire":"Message for Beneficiary / Notes","disabled":"Disabled","dont_have":"Don't have an account?","email":"Email address","email_is_required":"An email address is required","email_me_when":"Email me when","email_notifications_options":"Email Settings","email_notifications_title":"Emails","notifications_options":"In-app notification settings","notifications_toasts":"Toast Notifications","notify_me_when_html":"Displays a toast overlay in the lower right corner of the browser. Show example.","enabled":"Enabled","ensure_correct_wire":"Please ensure that all information is exactly correct and you have included the transaction reference. All incoming wires must comes from a bank account belonging to your verified name (or company). After sending the wire transfer, please create a deposit notification:","enter_otp_prompt":"Please enter your Google Authenticator 2FA token.","exchange_currency_type":"Fee type for Exchange orders","exchange_currency_type_explain":"This setting concerns Exchange orders. However, please note that if your account does not hold sufficient balance in the fee currency the platform will automatically apply the fee to the first available balance.","exchange_currency_type_ccy":"Currency Exchange Fee","exchange_currency_type_explain_ccy":"Fees will be taken in the currency you receive (BTC if you buy BTC/USD or USD if you sell BTC/USD for example).","exchange_currency_type_asset":"Asset Trading Fee","exchange_currency_type_explain_asset":"Fees will be taken in the default currency set above.","fees_desc":"Adjust fee currencies","forgot_your_pasword":"Password Reset","need_twofa_reset":"2FA Reset","have_referrer":"Have a Referrer Code?","important":"Important!","initiate_a_wire":"Use the bank account details below as the recipient bank for your wire","insert_correct_password":"Passwords must be at least 8 characters with one uppercase letter, one number, and one special character","insert_pass":"Password is required","intermediary_bank_name":"Intermediary Bank Name","intermediary_bank_address":"Intermediary Bank Address","intermediary_bank_city":"Intermediary Bank City","intermediary_bank_country":"Intermediary Bank Country","intermediary_bank_account":"Intermediary Bank Account","intermediary_bank_swift":"Intermediary Bank SWIFT code","pass_required":"Password is required","perc_day":"(%/day)","secret_phrase":"Secret phrase","price_alerts":"Price Alerts","price_alert_desc":"Notifications for prices","sounds_title":"Trading Alerts","sounds_desc":"Audio feedback on trade events","withdraw":"Withdraw","withdrawal_activate_modify":"Activate/modify automatic withdrawals.","withdrawal_destination":"Destination","withdrawal_lock_address":"Lock withdrawal address. ","withdrawal_explain":"To better protect your account, withdrawals are only automatically processed under the following security conditions","withdrawal_auto":"Auto-Withdrawal Processing","balances_overview":"Balances","withdrawal_locked":"Your account is currently on withdrawal hold. The most common reasons for a withdrawal hold are changes to password, withdrawal address whitelist, the other sensitive security settings.","withdrawal_locked_expiration":"This hold will be lifted %{exp_time}","withdrawal_reasons_opt1":"Condition Set One","withdrawal_reasons_opt2":"Condition Set Two","withdrawal_reasons1":"Two-Factor Authentication (%{link1:Modify}), or IP Address whitelisting has been enabled for at least 5 days (%{link2:Modify})","withdrawal_reasons2":"Withdrawal addresses for all crypto-currencies (and Tethers if you are verified) have been locked or disabled for at least 5 days (%{link:Modify})","withdrawal_reasons3":"Two-Factor Authentication has been enabled for at least 5 days (%{link:Modify})","withdrawal_reasons4":"IP Address whitelisting (%{link1:Modify}) or Withdrawal addresses for all crypto-currencies (and Tethers if you are verified) have been locked for at least 5 days (%{link2:Modify})","withdrawal_reasons5":"The \"Send Email on Login\" security setting is enabled (%{link:Modify})","withdrawal_reasons6":"The \"Monitor Withdrawals by IP\" security setting is enabled and your current IP Address is not new today (has been used before, more than 24 hours ago) (%{link:Modify})","withdrawal_reasons7":"If your account does not meet all of the conditions in one of the following two condition sets you will receive an email with a confirmation link to approve the withdrawal","withdrawal_reasons8":"In addition to these rules, sometimes large or unusual withdrawals will require direct admin approval","withdrawal_reasons9":"Please note that for security reasons, Bitfinex maintains limited crypto-currency balances in its on-line hot wallet. Should your withdrawal exceed the available amount, we will need to manually replenish the hot wallet and/or manually review and approve withdrawals, which may take up to 12 hours.","withdrawal_reasons10":"Withdrawals are guaranteed to be processed within 12 hours for crypto-currencies/tethers, 1 business day for express wire and 7 business days for wire. Do not contact support if your withdrawal has not been processed yet but is still within these limits.","withdrawal_threshold":"Threshold","withdrawal_threshold_amount":"Threshold (amount)","withdrawal_whats_this":"What's this?","ledger":"History","level":"Account Type","level_sub":"Choose your account type and options","level_trader":"Access to exchange trading, margin trading, and margin funding","level_exchange":"Access to exchange trading and margin funding","level_deposit":"Access to margin funding","level_explain":"There are 3 account types with different features.","level_no_margin":"Your account type, \"Exchange\", does not support Margin Trading. To change this setting, go to your Account page and change your Account Type setting.","login":"Log in","login_using":"Log in using","make_selection":"Please make a selection","managewallets":"Manage Wallets","margin_swaps_explain":"Margin funding is funding you provided that was used in a margin position.","mastercoin_tether_enabled":"Tether-enabled wallet","mastercoin_min":" (min 1.00)","no_order":"You don't have any order yet.","no_ledger":"You don't have any ledger record yet","notify_deposit":"A deposit arrives","notify_deposit_completes":"A deposit completes","notify_withdrawal":"A withdrawal completes","one_time_token":"2FA Token","open_account":"Open Account","otp_2fa_pending":"2FA activation is currently pending, please check your email","otp_disable":"Disable Two-factor Authentication","otp_enable":"Enable Two-factor Authentication","otp":"Two-Factor Authentication","otp_explain1":"The token will not be shown again after 2FA is enabled. If you have multiple devices, add your account token to all of them before clicking enable.","otp_explain2":"Note: Your Account Token will change each time you reload your browser.","otp_alt_download_intro":"If you do not have access to the Android Market or App Store, there are other options for getting Google Authenticator","otp_alt_download_android":"%{link: Android Download}","otp_alt_download_chrome":"%{link:Google Chrome Plugin}","otp_alt_download_apple":"%{link:iTunes App Store}","otp_help":"If you need help getting started, please see %{link:Google's Support Page}.","otp_number":"2FA token","otp_scan_html":"1. Scan the QR Code 2. Enter the token below","otp_sms_code":"SMS code","otp_phone_already_deactivated":"Your phone is already deactivated","otp_phone_deactivated":"Your phone 2FA setup has been cancelled","otp_phone_confirm":"Confirm SMS Token","otp_phone_token":"SMS Token","otp_phone_num":"Phone number","otp_phone_send":"Send SMS Token","otp_send_sms":"Send SMS","otp_phone_reset":"Cancel SMS setup","otp_phone_result":"Your SMS phone number for 2FA is %{ring_phone}. To disable SMS based 2FA, click the button below and enter the code you receive at that number.","password":"Password","password_confirmation":"Password confirmation","pending verification":"Pending Verification","prefcurrency":"Default currency for fees","prefcurrency_explain":"Your default currency to deduct fees from (for margin trading, and exchange depending on Exchange fee setting)","proof_of_address":"Proof of Address","quick_transfer":"Quick Transfer","quick_transfer_click":"Click to quick transfer","readonly":"Read-only","referrer":"Referrer code","referrer_explain":"Enter the code given by your referrer. (Optional.)","request_for_withdrawal":"Request Withdrawal","reset_withdrawal":"Reset withdrawal address","security_settings":"Security Settings","signup_confirm_password":"Confirm password","signup_dollar":" Dollar","signup_password":"Password","signup_timezone":"Timezone","login_history":"Login history","security_center":"Security","security_settings_enforce_single_login":"Detect IP Address Change","security_settings_enforce_single_login_explain":"If the IP address used to access your account changes on any request, all of your sessions will be immediately invalidated and you will be logged out. This prevents session hijacking.","security_settings_enforce_withdrawal_check":"Monitor Withdrawals by IP","security_settings_enforce_withdrawal_check_explain":"If a withdrawal is requested from a new IP address you will receive an email asking you to check and verify the withdrawal. The 'untrusting' period for IP changes is 24 hours. If the withdrawal is made more than 24 hours after the IP address change, this extra email check is not triggered.","security_settings_lock_after_newip":"Lock withdrawals for 24 hours when a new IP address is used","security_settings_lock_after_newip_explain":"When a new IP address is used to log into your account all withdrawals will be locked for 24 hours and you will receive an email notification.","security_settings_email_on_login":"Send Email on Login","security_settings_email_on_login_explain":"Receive an email each time someone logs into your account. The email will contain information about the IP of the authenticated user and a link to freeze your account if you suspect malicious activity. ","security_settings_keep_session_alive":"Keep Session Alive","security_settings_keep_session_alive_explain":"When logged in but inactive, your browser will ping the platform every 10 minutes to keep your session alive. If disabled, your session will expire after 30 minutes of inactivity.","security_email_add_key":"Add Key","security_email_update_key":"Update Key","deposit_send_to":"Please send %{currency} to one of your deposit %{name} displayed below.","deposit_send_to2":"The deposit will be credited in your corresponding wallet.","deposit_send_to3":"Learn more about wallets","deposit_add_change_html":"You can generate new deposit addresses using the [ ] buttons below.","deposit_add_change_payid_html":"You can generate a new deposit %{type} using the [ ] buttons below. When you generate a new deposit %{type}, the old %{type} is still valid for accepting deposits.","deposit_add_change2":"When you generate a new deposit address, the old address is still valid for accepting deposits.","deposit_add_still":"New address generated. Note that prior addresses are still valid.","send_to_btc_tx_fee_notice":"To ensure your transaction is confirmed as soon as possible, a miner transaction fee of at least %{fee} BTC is recommended.","send_to_mastercoin":"Please send assets to one of your Tether deposit addresses displayed below. The deposit will be credited in your corresponding wallet.","send_tether_protocol":"Tethers can be sent on multiple transport protocols. Please select a transport protocol below to reveal the corresponding deposit addresses.","send_to_mastercoin_warning":"These addresses only accept tethers USD₮ (using either Omni Layer on Bitcoin or Ethereum protocol). Please do not send bitcoins, ether, or any other currency to these addresses. They will not be credited.","send_to_eth_warning_html":"At this time Bitfinex does not support Ethereum transactions generated from smart contracts. To avoid missing deposits or deposit delays ETH and ETC should only be sent in traditional transactions.","send_to_eth_warning_short_html":"At this time Bitfinex does not accept transactions sent from smart contracts.","send_to_eth_more":"If you are uncertain that your deposit will not be sent as part of an Ethereum contract execution, please find out for sure before sending your deposit.","send_paymend_id_warning":"Sending %{ccy} requires both an address and a %{type}. The %{type} for each of your wallets is displayed in the table below.","send_special_deposit_address":"Bitfinex's %{ccy} deposit address","wd_address_invalid":"Please check that the withdrawal address is correct. It doesn't seem to be valid.","send_sms_2fa":"Send SMS code","signup":"Sign up","sigin_warning_url":"Please check that you are visiting https://www.bitfinex.com","deposit_confirmations_crypto":"%{currency} deposits are credited after a minimum of %{number} confirmations (about %{time}, sometimes longer)","sms_code":"SMS Code","something_wrong":"Something went wrong.","swift":"SWIFT Code","time_zone":"Time zone","tether_what":"What is Tether?","tether_info":"Tether's blockchain-enabled platform allows you to transact with real-world currency like bitcoin. Store, send, and receive 1-to-1 backed digital currency across Tether integrated exchanges, platforms, and wallets. %{link:Learn more}","tether_warning1":"Please confirm that you are sending tethers to a ","tether_warning2":"Tethers sent to a non-Tether compatible address may be non-retrievable by the recipient.","total_fees_paid":"Total fees paid (last 30 days), for exchange and margin orders","total_interests_earned":"Total return on your margin funds provided in the last %{nbdays} days","total_profit_loss":"Your total margin trading profit/loss for the last %{nbdays} days (including fees) is","total_exchange_profit_loss":"Your total exchange trading profit/loss for the last %{nbdays} days (including fees) is","to_transfer":"to transfer","trading_sum":"Performance summary","transaction_reference":"Transaction number (message to beneficiary)","transfer":"Transfer","transfer_total_avail":"Total/Available","transfer_wallet":"Wallet Transfer","transfer_available":"Available","two_factor_authentication":"Two-factor authentication","two_fa_check":"Two-Factor Security Check","two_fa_check_explain":"For certain sensitive actions we provide an extra layer of security by asking you to complete a two-factor authentication step.","secure_apologize":"We apologize for the inconvenience. Account security is our top priority.","contact_support_with_q":"Please contact support from bitfinex.com/support if you have any questions or concerns.","contact_support_html":"Please contact support if you have any questions or concerns.","unused_swaps_explain":"Unused funding is margin funding you provided that was not used in a margin position. They give you a minimum of 1 hour of return.","updated":"Updated","userinfo":"Account information","username":"Username","username_or_email":"Username or Email","username_is_required":"Username is required","verification_complete":"Your account has been verified. To complete or change your personal information, contact us at","verification_explain1":"If you wish to deposit or withdraw USD, Euro, or other fiat currencies, your account must be verified to comply with relevant anti-money laundering (AML) and counter-terrorism financing (CTF) laws and regulations.","wallets":"Wallets","wallet":"Wallet","wallet_address":"Recipient Wallet Address","wallet_payment_id":"Payment ID","wallet_tag":"Tag","wallet_memo":"Memo","withdraw_confirm_num":"Confirmation number","withdraw_select_wallet":"Select Wallet","withdraw_wire_intermediary":"Intermediary","withdraw_wire_intermediary_explain":"In some cases your bank will require the use of an intermediary bank, please fill out below if needed:","withdraw_wire_explain":"Fee structure: ","withdraw_wire_explain2":"%{percent}% of the amount %{type}, with a minimum of %{min}.","withdraw_wire_explain4":"Before proceeding:","withdraw_wire_explain5":"Wire withdrawals will be processed within 7 business days, unless you request the option \"Express\". In this case, they will be processed within 1 business day, for ","withdraw_wire_explain6":"% of the amount requested.","withdraw_wire_explain7":"Please check beforehand whether your account can receive %{ccy}. If wires are returned because the account cannot receive %{ccy} all additional charges are to be paid by the client.","withdraw_wire_explain8":"Express wire (processed within 24 hours on business days)","withdraw_wire_explain9":"New template","withdraw_wire_explain10":"Save as template","withdraw_wire_explain10b":"(or update current template)","withdraw_wire_explain11":"Wire Information","withdraw_wire_explain_arb1_html":"NOTE: your account is subject to the new frequency/size fee (read more here). If you believe this should not apply to you please contact our customer support.","withdraw_wire_intermediary_explain2":"If you cannot provide a SWIFT code or if your bank does not have a SWIFT code, you may incur additional wire transfer charges imposed by an intermediary bank.","withdraw_wire_intermediary_explain3":"If not all details are provided this may lead to delays or additional bank charges imposed by the processing bank.","withdraw_wire_intermediary_explain4":"If mistakes are made in the bank details provided by the customer, and if this results in the wire to be returned, BITFINEX will reserve the right to charge a handling fee of 25 %{ccy} on top of the additional fees charged by the bank to resolve such errors. BITFINEX shall not be responsible in case of delays or by the customer. It is the responsibility of the customer to properly check all details in advance.","withdraw_deposit_notice_1":"Notice regarding wiring other currencies than %{ccy}","withdraw_deposit_notice_2":"In case the customer wires funds with the wrong currency (other than %{ccy}), Bitfinex will not be responsible for the exchange rate conversion applied upon arrival of such funds. Bitfinex will credit the amount provided by the bank in %{ccy} after conversion, based on the rates applied by our bank at the time of conversion","withdraw_wire_comply_info":"In order to comply with the antiterrorism policy of the FATF, please also instruct your bank to include the following in the SWIFT message: (1) remitters account name (2) account number and (3) remitters full residential address (not a PO Box no.). Crediting your account is seriously delayed if any of the above information is missing.","withdraw_wire_comply_info_cn":"為了遵從中華民國中央銀行的規定和國際洗錢防制組織的反恐政策,請務必通知您的匯款 銀行,匯款的SWIFT電報文必須包含以下的訊息:(1)匯款人的完整姓名(2)帳號和(3)匯款 人詳細地址。 若因上述的訊息不完整, 可能會造成您的收款嚴重的延誤。","confirm_withdrawal":"Confirm withdrawal","wire_confirmation":"By clicking the button below, I confirm that I have sent a wire transfer with the correct transaction reference and I accept that some fees may be applied by the banks involved in the transaction.","wire_create_notification":"Create Deposit Notification"},"address_book":{"add":"Add to Address Book","create_fail":"Error when creating address book entry.","create_success":"Address successfully added to address book.","delete_fail":"Error deleting address book entry.","delete_success":"Address removed from address book.","desc":"Save withdrawal addresses for easy reference","desc1":"For convenience, you can save withdrawal addresses to your address book.","desc2":"Access your address book from the Account page.","empty":"Your %{ccy} address book is empty. Click to learn more.","entries":"Address Book Entries","nice_desc1":"Withdrawing cryptocurrencies from Bitfinex requires specifying a destination address.","nice_desc2":"The address book allows for labeling and saving destination addresses for easy use later.","nice_desc3":"When withdrawing you can quickly select an address from your address book.","nice_desc4_html":"Also, learn how to use the address book for improved security.","title":"Address Book","locked":"The withdrawal address is already locked and cannot be set right now.","locked2":"To adjust locked withdrawal addresses, go to your Security page.","no_iota":"In IOTA the security of a transaction decreases when you send tokens more than once from the same address.","no_iota2":"Please do not use the Address Book to reuse IOTA addresses."},"active":"Active","not_active":"Not Active","ago":"ago","cancel":"Cancel","completed":"Completed","calculator":{"title":"Calculator","disclaim":"All values are approximate and do not take into account fees or slippage.","entry":"Entry","exit":"Exit","stop":"Stop","long":"Long","short":"Short"},"credit":{"activateautolend":"Activate","active_credits":"Provided","active_offers":"Bids & Offers","amount":"Amount of funding (of 1 %{curr} each)","autolending_propose":"The auto-renew feature allows you to configure settings once and ensure that your available funds will be continually offered on the funding market.","autolending_propose2":"As you deposit funds to your Funding Wallet, as provided funding expires, and as your receive payments for your provided funding - those available funds will be automatically re-offered at the rate and period of your choosing.","autolending_propose3":"Auto-renew is configured on a per-currency basis. The minimum balance to trigger the auto-renew is %{equiv} USD equivalent.","autolending_propose4":"Your can set a \"Maximum amount of funds to auto-renew\". If you set this maximum, the system will not renew funds once you are offering and/or providing more than your set maximum of funding.","autolending_currently_at":"Renewing %{currency} at %{rate}%, max %{period} days","autolending_currently_at_vir":"Renewing %{currency} at FRR, max %{period} days","autolending_currently_threshold":" Renewing up to a maximum threshold of %{threshold}","autorenew":"Auto-renew %{currency} Offers","autorenew_no_curr":"Auto-renew Offers","autorenewed":"Auto-renew","ccy_not_found":"The funding currency %{ccy} was either not found or you do not have access to it. Check your settings on 'Account > Currencies & Pairs' to review your available currencies.","credit_history":"Funding History","expirein":"Expire in","dontrenew":"Don't renew","desactivateautolend":"Deactivate","form_title":"Funding Form","funds":"Funds Provided","hidden":"Hidden offers incur an additional fee; %{hidden_fee}% instead of the normal %{normal_fee}% (of the fees generated by active margin funding contracts)","hidden_short":"Hidden","hidden_explain":"Margin funding opened by hidden offers are marked here by 'Yes'","insured":"Insurance","lend_all":"Offer All","matched":"Matched","maximum_period_html":"Period days","maxperiod":"Margin funding time period (days)","maxperiod_short":"PER","min":"Min","max":"Max","no_active_credits":"No funding provided","no_close":"if checked, when a position is reduced or closed, the used fund(s) will not be closed but put back into unused margin funding.","no_close_short":"Keep","no_close_yes":"Do not keep open after being used","no_close_no":"Keep open after being used","no_close_explain":"If Yes, when a position is reduced or closed, the fund will not be closed but put back into unused margin funding.","no_credits":"No credits","no_active_offers":"No funding bids or offers","not_found":"Funding not found.","offer_history":"Funding Offers","offer_history_explain":"Negative amount means you made a demand for credit, positive amount means you offered a credit.","rateasked_html":"Rate % per day","delta_rate_html":"Delta FRR offset","rateasked":"Rate % per day","delta_rate":"Delta FRR offset","type":"Type","renew":"Renew funding","selected_total":"Total selected","bids":"Bids","offers":"Offers","totalamount":"Total amount of funding","used":"Used Margin Funding","vir":"Flash Return Rate","vir_short":"FRR","vir_desc":"The \"Flash Return Rate\" is a dynamic rate calculated as the average of all fixed-rate positions weighted by their amount. The Flash Return Rate (FRR) updates once per hour.","vir_delta_short":"FRR Delta","vir_delta_desc":"The \"FRR Delta\" is a dynamic rate that allows you to specify an offset to the Flash Return Rate. For example, if you specifiy a delta of -0.001, when the FRR is 0.045 your calculated rate will be 0.044. Once matched, the rate becomes static and will not update against FRR any more.","zoom_out":"Zoom out book depth visualization","zoom_in":"Zoom in book depth visualization","threshold_autol":"Maximum amount of funds to auto-renew (0 for no maximum).","threshold_autol_short_html":"Max amount (0 for 'No Max')"},"deposits":{"title":"Deposit","copy":"Copy to Clipboard","change":"Change Address","create_for":"Create a wire deposit for","deposits":"Deposits","permalink":"Permalink","id":"Deposit ID","recent":"Recent","reports":"Reports","mymymy":"to my","scan":"Scan QR-Code","extra":"WARNING: Failure to follow correct %{term} deposit procedure will result in lost deposits.","extra2":"Depositing %{term} to Bitfinex requires BOTH a deposit address and a deposit %{field}.","extra3":"To make a %{term} deposit, you need to use both","extra4":"On the following page, the deposit address is shown at the top, and then below you will see a deposit %{field} for each of your wallets.","extra5":"To make a deposit to your Exchange wallet, for example, you will need to use the deposit address shown near the top and the deposit %{field} next to your Exchange wallet.","extra6":"Do NOT send %{term} to Bitfinex unless you know how to indicate a %{field}.","extra7":"If you fail to include the %{field} with your deposit the funds will be lost forever.","understand":"I understand. Continue."},"history":{"logins":"Login History","margin_funding":"Funding","margin_funding_offers":"Funding Offers","overview":"Overview","provided_margin_funding":"Funding Provided","margin_funding_earnings":"Funding Earnings","summary":"Summary of volume, fees, and funding","taken_margin_funding":"Funding Taken","unused":"Unused","used":"Used","generate":"Generate Report","summary_vol":"Your volume in the last 30 days","summary_fees":"Your fees on Bitfinex (based on your trading volume)","summary_gen1":"The Summary Report is automatically generated and updated every 24 hours.","summary_gen2":"You may request a Summary Report now by clicking the button below.","summary_requested":"Summary Report requested. The report will be ready momentarily.","summary_cooldown1":"This report can only be requested once per hour.","summary_cooldown2":"Please wait at least one hour from the last report time then try again."},"loan":{"active_loans":"Taken: Unused","expires":"Expires","amount_long":"Amount of funding (of 1 %{curr} each)","confirmcloseselected":"Are you sure you want to return selected funding?","no_active_loans":"No unused funding","no_loans":"You don't have any funding yet"},"managewallets":{"from_wallet":"from wallet","transfer_from":"Transfer","to_wallet":"to wallet"},"positions":{"no_active":"No active positions","active_position":"Active Position","base_price_mes":"The open P&L for this position is greater than the market value of the position rendering base price a nonsensical negative number","max_can_claim":"The maximum you can claim on this position is ","to_claim_more_add":" To claim more than this amount, add additional ","to_trading_wallet":" to your Margin Wallet.","liquidate_submitted":"Submitting a market order to liquidate this position.","position_not_found":"Problem closing position. Please try again or place an order manually to liquidate.","cannot_liquidate":"Your position cannot be liquidated. Please try again.","ordersize_max":"You cannot place a market order bigger than %{size}.","new_orders_wait":"You cannot place new orders at the moment. Please try again in 5 seconds.","recently_updated":"This position has been updated recently. Please wait a moment (%{seconds} seconds) and try again.","funding_type_changed":"Position funding type changed to %{to}.","not_found":"Position not found.","no_claim_one":"You have insufficient %{last} funds in your Margin Wallet to claim %{amount} %{first}.","no_claim_two":"You have insufficient profit and/or %{first} funds in your Margin Wallet to claim %{amount} %{last}.","claim_success":"Successfully claimed %{amount} %{ccy} from this %{pair} position.","claim_claimable_long":"This uses a combination of the [LAST_IN_PAIR] in your trading wallet balance and the unrealized P&L in your position (net of any outstanding financing charges) to satisfy some or all of the outstanding financing associated with your position, resulting in some or all of your position now being reflected as part of your [FIRST_IN_PAIR] wallet balance. The cost of claiming this position is [CLAIM_FEE]%. [MAX_CLAIMABLE_FEE]","claim_claimable_long_label":"Amount of [FIRST_IN_PAIR] to Claim","claim_not_claimable_long":"Claiming some or all of this position requires that you have enough partially realized P&L (position reduced at a profit) or [LAST_IN_PAIR] in your trading wallet (net of any outstanding financing charges) to satisfy some or all of the outstanding financing associated with your position.","claim_claimable_short":"This uses the [FIRST_IN_PAIR] in your trading wallet balance (net of any outstanding financing charges) to satisfy some or all of the outstanding financing associated with your position, resulting in some or all of your position's [LAST_IN_PAIR] now being reflected as part of your [LAST_IN_PAIR] wallet balance. The cost of claiming this position is [CLAIM_FEE]%. [MAX_CLAIMABLE_FEE]","claim_claimable_short_label":"Portion (in [FIRST_IN_PAIR]) of the position to Claim","claim_not_claimable_short":"Claiming some or all of this position requires that you have enough [FIRST_IN_PAIR] in your trading wallet (net of any outstanding financing charges) to satisfy some or all of the outstanding financing associated with your position.","modify_failure":"Insufficient %{ccy} in Margin wallet to %{action} %{pair} position.","modify_success":"Successfully %{action} %{pair} position."},"positionloan":{"active_loans":"Taken: Using","no_active_loans":"No used funding"},"trades":{"stream_unavailable":"Data Stream Unavailable"},"exchange":{"activateautoorder":"Activate","automatic_orders":"Automatic Orders","automatic_orders_pair":"Auto Orders: %{pair}","automatic_orders_explain1":"Automatic Orders allow you to automatically place a limit buy or sell order as soon as a deposit is credited to your Exchange Wallet.","automatic_orders_explain2":"For example, if you have automatic orders enabled for ETH/BTC with side \"buy\" and maximum slippage at \"5%\", then when you receive a deposit of 1.0 BTC to your Exchange Wallet the system will place a limit buy order on ETH/BTC. If the current price is 0.04, the limit buy price will be calculated to be 0.04 * (1 + .05) = 0.042 BTC.","automatic_orders_explain3":"Access to the Automatic Orders feature can be enabled or disabled from the Account page under the Merchange Tools heading. When activated, the Automatic Orders section will appear on the Exchange page.","auto_price":"Maximum Slippage (Max val 10%)","autoselling_active_html":"Automatic %{verb} active on %{pair} at a maximum of %{price} away from the market price.","desactivateautoorder":"Deactivate","enter_amount":"Enter amount","exchange":"Exchange"},"footer":{"blog":"Blog","contact":"Contact Us","contact_short":"Contact","community":"Community","explore":"Explore","features":"Features","fees":"Our fees","full_book":"Full Funding Book","howitworks":"How it works","lang":"Language","legal":"Legal","more":"More","news_discuss":"News & Discussion","newsletter":"Newsletter","security":"Security","status":"Status Page","support":"Support","tos":"Terms & Conditions","util":"Utility","utility":"Utility & API","verification":"Verification"},"two_fa":{"warn1":"We strongly recommend enabling at least one form of 2FA as a minimum security standard.","warn2":"Please ensure you have other two-factor authentication protection activated."},"modals":{"claim_position":{"title":"Claim this Position","explain":"Amount to Claim"},"confirm":"Please Confirm","bitlicense":{"title":"Bitlicense Restrictions","explain":"Pursuant to Title 23, Chapter I, Part 200 of the New York Codes, Rules and Regulations (the \"Regulations\"), persons may not engage in Virtual Currency Business Activities (as defined in subsection 200.2(q) of the Regulations) involving New York or New York Residents (as defined in subsection 200.2(h) of the Regulations) without a license issued by the New York Department of Financial Services: the so-called '","explain2":"BitLicense","explain3":".'","explain4":"As Bitfinex is not applying for a BitLicense at this time, we are unable to provide certain services to New York Residents. It appears that you may be accessing bitfinex.com from an IP address originating in New York.","explain5":"Are you a New York Resident?","explain6":"Yes, I am a New York Resident","explain7":"No, I am not a New York Resident","explain8_1":"Unfortunately Bitfinex is unable to offer ","explain8_2":"claiming of a position","explain8_3":" to our customers in New York. This restriction is due to the ","explain8_4":" regulation.","explain9":"We sincerely apologize for the inconvenience.","explain10":"Questions or concerns? "},"change_email_pass":{"title":"Security Check"},"export_title":"Export Data","export":"Select a date range (max range 3 months) to download your %{title} data as a comma-separated values for use with third-party spreedsheet, accounting, and/or record keeping software.","report":"Select a date range for the %{title} report (max range 3 months)","need_help":"Need some help?","open_ticket":{"title":"Open a Help Desk Ticket","title2":"How can we help?","log_in":"Please log in before attempting to submit a help desk ticket.","please":"Please send a message to the support team.","respond":"We will respond to this ticket by email to","subject":"Subject","topic":"Help Topic","topic_title":"Topic","cant_find":"If you cannot find an answer to your question in the %{link: knowledge base}, please make sure to include as many relevant details as you can. This helps us efficiently address your inquiry.","flood1":"It appears that you have opened a support ticket recently.","flood2_html":"If you have additional information to add to your original inquiry, please reply to the confirmation email you received at %{email}.","flood3":"Please do not open more than one ticket for the same request.","flood4":"We will answer your initial request as soon as possible. Opening more than one ticket for the same issue will slow things down for you and also for all other users waiting for assistance.","flood5":"Okay, I will wait","flood6":"Okay, I will respond to my prior ticket by email","flood7":"I understand, but I need to create a new ticket","useful":"tickets: please include","include_conf":"For faster ticket processing, I included as much of the recommended information (above) as possible.","not_helpful":"If none of these links seem helpful, please send a message to the support team. We will be happy to help you.","happy1":"Our support team is happy to help you.","happy2":"However, please keep in mind that requests to support can take some time until we can respond to you - especially during times of busy platform activity.","kb_first":"For instant support, many inquiries can be answered by our Knowledge Base articles at %{link: support.bitfinex.com}.","kb_first2":"Please consider checking the Knowledge Base if you would like a faster information.","feedback1":"We greatly value user feedback.","feedback2":"The Bitfinex platform has been influenced at every step by input from the community.","look_forward":"We look forward to hearing from you.","remind1":"A reminder: this is not the correct route to take if you need information or are having a problem.","remind2":"In those cases, please review our %{link: Knowledge Base}.","broken1":"We want to know if something seems to be broken, disfunctional, or even difficult to use.","broken2":"By reporting an issue to the support team we can prioritize solving it.","report":"When reporting a bug, please be sure to first","report1":"Do a full page refresh","report2":"Log out of your account and log back in","report3":"Try another browser","please_include":"In your report, please remember to include the following information","please_include1":"The steps you took to resolve the issue, including the steps above","please_include2":"What browser you are using. Does the problem happen in multiple browsers?","please_include3":"Does the problem occur constantly, intermittently, or just one time?","speed":"This will greatly speed up our ability to solve your issue.","kb":"Knowledge Base","kb_review":"For instant support, please take a moment to check the information available in our Knowledge Base","kb_review_link":"For instant support, please take a moment to check the information available in our %{link: Knowledge Base}","info_for":"Information for %{topic}","how_help":"How can we help you?","no_results":"Sorry, no results found for \"%{query}\" in Knowledge Base.","unable_html":"If you are unable to log into your account, select "Account Access" at the top of the Support page and follow the steps to receive assistance.","what_info":"What type of information do you need?","question_concern":"What is the nature of your question or concern?","what_broken":"What seems to be broken?","what_cat":"Which of these categories are most relevant to your question or concern?","opts":{"question":"I have a question","need_info":"I need information","broken":"Something is broken","guidance":"I need guidance","feedback":"I have feedback","sec":"Security concern"},"topics":{"feedback":"Feedback","account_access":"Account Access","account_verification":"Account verification","api":"API","balances":"Balances","deposit_withdraw_bank":"Bank Wire","change_email":"Change email/username","deposit_withdraw_crypto":"Deposit/Withdraw - crypto\"","funding":"Funding","trading":"Trading","other":"Other","lag":"Platform Lag","bug":"Bug Report"},"req":{"general":{"n1":"Use the Reports page to find and include relevant data such as IDs and timestamps.","n2":"Consider providing a link to a screenshot, gif, or video to illustrate your question or concern.","n3":"Copy/paste any error messages you see.","n4":"Does this issue happen all the time or intermittent? When did it start?","n5":"If this is an ongoing issue, please list the exact steps you can take to reproduce the problem.","n6":"If you are seeing incorrect numbers, have you tried logging out and back in? It might be a display issue.","n7":"Include all the details you can about any crypto transactions, especially TXID. A link to the transaction on a block explorer is ideal.","n8":"What browser are you using? Does the problem also exist when using other browsers such as Firefox or Chrome?"},"trading":{"n1":"Include any relevant order or trade IDs. These can be found using the Reports page."},"funding":{"n1":"Include any relevant offer or funding IDs. These can be found using the Reports page."},"api":{"n1":"What protocol (REST or WebSockets) and version are you using?","n2":"Have you received the API documentation at http://docs.bitfinex.com/docs","n3":"Include the request body and headers","n4":"Include the complete repsonse and what repsonse you are expecting","n5":"If using a library, what library and function are you using?"},"mobile":{"n1":"What OS (Android or iOS) are you using?","n2":"What version of the mobile app do you have installed?"}},"what":"What can we help you with?"},"otp":{"migrate":"Two-Factor Token Migration"},"row_expander":"Row Details","tamper_proof":{"title":"Tamper-proof Confirmation","explain":"When withdrawing, you will see a tamper-proof image that confirms the details of your withdraw. This is another step to help you ensure your withdrawal details have not been compromised by malware on your browser or a man-in-the-middle attack.","explain2":"If you want, this setting allows you to add a custom word, number, or phrase to also show on the tamper-proof image. This helps you to know that the image was generated from your account."},"tours":{"title":"Choose a Tour","log_in":"Please log in before attempting to take a tour."},"twilio":{"title":"Two-Factor Authentication by SMS"}},"nav":{"affiliation":"Affiliation","charts":"Charts","credit":"Margin Funding","credit_short":"Funding","exchange":"Exchange Trading","features":"Features","funding_book":"Funding Book","trades_history":"Trades History","home":"Home","interest_rates":"Rates on Margin Funding","ll_order_book":"Level 2 Order Book","ll_orderbook_information":"This page displays all orders available on Bitfinex.","logout":"Logout","order_book":"Order Book","orderbook_information":"This page displays the public order book of active limit orders.","settings":"Settings","stats":"Market Statistics","trading":"Margin Trading","trading_short":"Trading"},"notifications":{"no_balance":"Your %{wallet_phrase} empty. %{link1:Transfer funds} or make a %{link2:new deposit} to get started. Want a tour?","deposit_now":"Deposit Now","margin_danger":"Your margin is in danger!","margin_danger_1":"Your positions will be closed when your net value falls below maintenance margin. Please either make deposit now or liquidate some positions yourself."},"orders":{"us_block":"US individual users cannot place orders.","active_order":"Active Order","canceled":"Canceled","no_place_frozen":"Cannot place new orders. Your account is likely frozen due to security concerns. Please contact support from bitfinex.com/support for assistance.","cannot_place_new":"Cannot place new orders. Please try again in a few seconds and contact support from bitfinex.com/support if the issue persists.","should_not_be_here":"You should't be here.","no_margin":"You cannot margin trade with your current account type. Visit the Account page to change your account type.","invalid_pair":"Invalid pair.","cst_terms":"Please review and accept the CST terms and conditions for %{ccy} before using.","invalid_price":"Invalid price.","invalid_order":"Invalid order: not enough %{context} balance for %{amount} %{pair} at %{price}","cannot_modify_oco":"This order is part of an OCO (one-cancels-the-other) pair. Orders that are part of an OCO pair are not editable at this time.
To modify OCO orders, cancel and recreate it.","cannot_modify_cross":"Modifying this order would make it cross the book. Please do not modify orders to make them immediately execute.","pair_no_margin":"This pair cannot be traded on margin.","anti_spam":"Your anti-spam limit of %{limit} api calls per 2 min on %{pair} has been reached. Please wait before placing a new order.","cooldown":"Cannot place additional order at the moment.","max_per_pair":"You cannot place more than %{max} limit orders per pair.","max_order":"Invalid order: maximum size for %{pair} is %{size}","min_order":"Invalid order: minimum size for %{pair} is %{size}","liquidating":"Position currently liquidating.","none_to_cancel":"None to cancel","cancel_all_submitted":"All (%{count}) submitted for cancellation; waiting for confirmation.","none_submitted_cancel":"No order cancellations submitted.","cancel_submitted":"Submitted for cancellation; waiting for confirmation (ID: %{id}).","cancel_submit_err":"Order could not be submitted for cancellation. Please try again (ID: %{id}).","error":"An error has occured. Please try again.","insufficient margin":"Insufficient Margin","hidden":"Hidden","order_canceled":"Your order #%{id} has been canceled.","order_cannot_be_canceled":"Your order #%{id} cannot be canceled.","not_found":"Order not found.","no_orders":"You don't have any order yet.","scaled_no_balance":"Invalid scaled order: not enough %{context} balance to place this scaled order.","alerts":{"bid_above_ask_rate":"Are you sure you want to bid above the lowest offered rate?","ask_below_bid_rate":"Are you sure you want to offer below the highest bid rate?","less_than_ticker":"Are you sure to put a LIMIT SELL order below the ticker price?","less_than_ticker_ten":"Price set at less than 10% of the ticker price, aborting","limit_buy_above_ticker":"Are you sure to put a LIMIT BUY order above the ticker price?","limit_buy_abv_ticker_abort":"LIMIT BUY price above the ticker price, aborting","limit_sell_abort":"LIMIT SELL price below the ticker price, aborting","market_o_confirm":"Are you sure to put a MARKET order?","more_than_ten_abort":"Price set at more than 10% of the ticker price, aborting","no_price":"No price set. Please review your order.","no_oco_price":"No OCO stop price set. Please review your order.","no_stoplimit_price":"No limit price set. Please review your order.","stop_buy_below_confirm":"Are you sure to put a STOP BUY order below the ticker price?","stop_price_abort":"OCO Stop price above or at the ticker price, aborting","stop_price_at_ticker_abort":"OCO Stop price under or at the ticker price, aborting","stop_sell_above_ticker":"Are you sure to put a STOP SELL order above the ticker price?","sig_figs":"The value you entered ([ENTERED]) exceeds the allowable number of significant digits ([SIGFIG_VAL]).
An acceptable value would be: [ACCEPTABLE_VAL]
To learn more about significant digits and the benefits of using them when calculating price points, read more on the knowledge base."}},"offers":{"us_block":"US users cannot take or offer funding.","cancel_all_confirm":"Are you sure to cancel all of your active bids and offers?","offer_only":"(offers only)","offer_notify":"You will receive an email when this funding bid/offer fully executes.","offer_renew":"Funding opened with this offer will automatically be renewed when closed.","offer_unrenew":"Funding opened with this offer will not be automatically renewed when closed.","offer_renew_lock":"You are auto-renewing %{ccy}. To manage auto-renewal of individual %{type} first disable auto-renew for %{ccy}.","offer_notify_off":"Email notice for this funding bid/offer disabled.","offset_too_large":"FRR offset larger than 30% of FRR, aborting.","offer_placed":"Offer placed","error":"Your offer couldn't be placed","no_offers":"You don't have any offer yet.","return_rate":"Return Rate","your_offer":"Your Offer of ","your_offer_num":"Your offer #","at":" at ","for":" for ","days":" days ","executed":"has been executed.","twenty_four":"than 24 hours"},"otc":{"accept":"Accept Trade","active":"Active OTC Orders","already_enabled_html":"You have been granted access to the Bitfinex OTC market. Proceed to the main OTC page to get started.","apply_html":"When you are ready to begin, apply for OTC access.","begin1":"To get started with Bitfinex's OTC market, the first step is to provide some basic information to %{name} so he can know how to handle your requirements best.","begin2_html":"Please email %{name} at otc@bitfinex.com and provide a numbered list corresponding to each of the required details specified above.","begin_required":"Required Information","begin_list1":"The minimum OTC trade size is a 100,000 USD notional minimum. What do you expect your average trade size will be?","begin_list2":"What do you expect your average weekly OTC trading volume will be?","begin_list3":"What currencies are you interested in trading? Please list in rank order of importance;","begin_list4":"What are your trading hours?","begin_list5":"Is your Bitfinex account verified? If yes, do you have an Individual or Corporate account?","begin_list6":"Do you have counter parties for OTC trades, or will you be looking for liquidity through our desk?","begin_list7":"Where do you bank?","begin_list8":"Do you intend to withdraw fiat or cryptocurrencies?","enabled1_html":"You have been enabled for the Bitfinex OTC Market. Your OTC alias is %{alias}.","enabled2":"Two ways to OTC trade","enabled3_html":"For instant liquidity, contact Bitfinex's OTC trader %{name} at bill@bitfinex.com.","enabled4":"Trade directly with another Bitfinex user if you know their OTC alias.","enabled5":"When you initiate a new OTC trade, the other party will be emailed and asked to accept the trade.","enabled6_html":"OTC trades are completed using funds in your %{wallet} Wallet.","inactive":"Inactive OTC Orders","intro1":"Many Bitfinex users have expressed interest in the ability to make larger trades directly with a counterparty without having to go through the public order books.","intro2":"To make that possible, Bitfinex is pleased to offer a new Over The Counter (OTC) trading desk. Through our OTC desk, customers will be able to access digital currency liquidity without affecting the exchange market price.","intro3":"OTC trades incur a fee of %{fee} on both sides.","intro4":"OTC is for large orders only (%{min} notional minimum)","intro6":"Introduction to %{name}","intro7":"Heading up our desk is %{name}, the former Chief Trading Officer of DigitalX. He brings with him over three years of digital currency trading experience and contacts throughout the industry. Before trading digital currencies, %{name_short} spent 18 years trading and brokering energies and metals on the NYMEX floor and in the OTC markets. With over 20 years of trading and sales experience, %{name_short} is the ideal candidate to lead our OTC desk and support future innovation at Bitfinex.","intro8":"There are two ways to take advantage of the OTC desk.","intro9":"You can access instant liquidity through Bitfinex's OTC desk, or you can trade directly with another Bitfinex user.","new":"New OTC Trade","no_active":"You don't have any active OTC orders right now.","reject":"Reject","title":"OTC Market"},"pages":{"about":{"about_us":"About Us","intro1":"Bitfinex is a digital asset trading platform offering state-of-the-art services for digital currency traders and global liquidity providers.","intro2":"Founded in 2012, Bitfinex was one of the first professional platforms set up to accomodate for the booming interest in cryptocurrency trading. Since then, the team has gained invaluable experience whilst cementing their spot as the go-to platform for digital asset traders and institutions.","intro3":"In addition to a suite of advanced trading features and charting tools, Bitfinex provides access to peer-to-peer financing, an OTC market and margin trading for a wide selection of digital assets. Bitfinex’s strategy focuses on providing unparalleled support, tools, and innovation for professional traders and liquidity providers around the world.","title":"About"},"careers":{"title":"Careers"},"contact":{"for_business":"For Business and Press","for_compliance":"For AML/KYC related topics","for_suggestions":"For Suggestions","for_support":"For general support"},"features":{"title":"Features","api_title":"API Platform","customizable_interface":"Customizable Interface","customizable_interface_desc":"Bitfinex allows to set up your preferences and organize the workspace according to your needs","exchange":"Exchange","exchange_explain":"Bitfinex offers the most liquid order book in the world, allowing users to easily exchange Bitcoin, Ethereum, EOS, Litecoin, Ripple, NEO and many other digital assets with minimal slippage. Bitfinex also boasts a suite of order types to help traders take advantage of every situation.","fill_kill":"Fill or Kill","fill_kill_explain":"This type of order is a limit order that must be filled in its entirety or canceled (killed). The purpose of a fill or kill order is to ensure that a position is entered at a desired price.","hidden_order":"Hidden Order","hidden_order_explain":"A hidden order is an order which does not appear in the order book and thus doesn't influence other market participants. See the ","hidden_order_explain2":"fees page","hidden_order_explain3":" for minimum size and fee applicable.","how_it_works":"How It Works","limit":"Limit","limit_explain":"An order to buy/sell at a specified price or better.","margin_trading":"Margin Trading","margin_trading_explain":"Bitfinex allows for users to trade with up to 3.3x leverage by receiving funding from the peer to peer margin funding platform. Users can enter an order to borrow the desired amount of funding at the rate and duration of their choice, or they can simply open a position and Bitfinex will take out funding for them at the best available rate at that time.","margin_trading_explain2":"For more information on our Margin Trading feature, please go to ","margin_funding":"Margin Funding","margin_funding_explain":"The Bitfinex margin funding market provides a secure way to earn interest on fiat and digital assets by providing funding to traders wanting to trade with leverage. Users can offer funding across a wide range of currencies & assets, at the rate and duration of their choice. In addition to this, users can use the Auto-Renew feature to renew offers automatically upon expiry.","margin_funding_explain2":"For more information on our Margin Funding feature, please go to ","market":"Market","market_explain":"An order in which a buy or sell order to be executed immediately at current market prices.","oco":"One Cancels Other (OCO)","oco_explain":"This option allows you to place a pair of orders stipulating that if one order is executed fully or partially, then the other order is automatically canceled. A one-cancels-the-other order combines a stop order with a limit order. This option allows you to place both take profit and stop loss targets for your position (only for limit orders).","order_types":"Order Types","order_types_explain":"Bitfinex offers our users a suite of order types to give traders the tools they need for every scenario. We currently offer the following order types:","stop":"Stop","stop_explain":"An order to sell or close your position once the market reaches a certain price.","trailing_stop":"Trailing Stop","trailing_stop_explain":"A stop order that can be set to execute once the market goes against you by a defined price, called the price difference. Trailing–stop sell orders are used to maximize and protect profit as a stock's price rises and limit losses when its price falls."},"fees":{"charged_on_uninsured_loans":"Charge on fees collected by Margin Funding Providers","charged_on_hidden_loans":"Charge on fees collected by Margin Funding Providers, when opened by a hidden offer","charged_on_returned_loans":"Charge on funding that is borrowed and subsequently returned without being used in a margin position (%{link:More Information})","charged_on_returned_loans_fee":"Up to one full day’s interest","executed_on":"Executed in the last 30 days","equivalent":"Equivalent","fee_interests_generated_loans":"%{lendingcut}% (of the fees generated by active margin funding contracts)","free":"free","bank_wire":"Bank wire","loans":"Margin Funding","maker_fees":"Maker fees","express_wire":"Express bank wire (within 24 hours on business days)","arb_wire":"High frequency/size wire fee","order_execution":"Order Execution","taker_fees":"Taker fees","maker_taker_explain_1_html":"Maker fees are paid when you add liquidity to our order book by placing a limit order under the ticker price for buy and above the ticker price for sell. Taker fees are paid when you remove liquidity from our order book by placing any order that is executed against an order of the order book.","maker_taker_explain_2":"Note: If you place a hidden order, you will always pay the taker fee. If you place a limit order that hits a hidden order, you will always pay the maker fee.","of_deposit":"%{percent} (min %{min})","of_withdrawal":"%{percent} (min %{min})","tether":"TetherUSD","title":"Fees Schedule","type":"Type","volume_traded_last_days":"%{mark} or more traded","withdrawal":"Withdrawal","small_deposit_intro":"Please take a moment to review and understand the fee applied for small deposits.","small_deposit":"Small Deposit Fee","small_deposit1":"A Small Deposit Fee is applied on deposits less than a %{equiv} USD equivalent.","small_deposit2":"Many small deposits create an excess of tiny wallet inputs that can accumulate, requiring wallet input consolidation maintenance and eventually delaying customer withdrawals.","small_deposit3":"In an effort to keep withdrawals flowing smoothly for all customers, avoid sending many small deposits.","small_deposit4":"Instead, batch smaller deposits together into larger amounts.","small_deposit5":"The current fee schedule is displayed below.","small_deposit6":"Please monitor the %{link:Fees Page} as fees are subject to change.","small_deposit6b":"Please monitor the Fees Page as fees are subject to change.","small_deposit_amt":"A Small Deposit Fee of %{amount} %{ccy} is applied on deposits less than a %{equiv} USD equivalent.","small_deposit_understand0":"Do you understand that a large number of small deposits causes slowdowns for all users, and that whenever possible larger deposits should be used for the benefit of all?","small_deposit_understand1":"Do you understand that deposits smaller than a %{equiv} USD equivalent will have a small fee applied? This fee is to discourage small deposits except when they cannot be avoided."},"freeze_account":{"title":"Freeze Your Account","confirm":"Are you sure you want to freeze your account?","confirm_details":"Freezing your account will cause the following:","confirm_details1":"All pending withdrawals will be cancelled.","confirm_details2_html":"Future withdrawals will be disabled (Note: Upon reactivation withdrawals will not be able to be made for a minimum of 5 days).","confirm_details3":"All trading and lending capacities from your account will be disabled.","confirm_details4":"You will need to %{link:contact support} when you decide to reactivate your account.","desc1":"Freezing your Bitfinex account puts a temporary hold on sensitive account actions.","frozen":"Your Account Has Been Frozen","freeze_help":"%{link:Contact Support} for account assistance or to reactivate your account.","please_contact":"Please %{link:contact support} for help with account access and security."},"index":{"api":"API","api_doc_more":"Bitfinex's API are designed to offer an easy and efficient way to build digital asset trading applications and tools: create your own charts, monitor and edit your orders and positions,track your trading history and wallets movements. Discover all the possibilities.","api_read_more":"View Bitfinex API Documentation","apps":"Discover the mobile apps","available":"Stay Connected","available_on_go_html":"We've created the mobile tools you need for trading on the go.","chart":"Advanced Chart Tools","chart2":"Prefer a graphical trading experience? Trade directly from the Bitfinex charts","chart3":"Visualize your orders, positions, and price alerts","chart4":"Drag to change price","chart5":"Tap to modify order properties","chart6":"See your position profits","chart7_html":"Bitfinex has integrated TradingView charts so you can enjoy a complete suite of tools to draw, annotation, download and share your charts.","customizable_interface":"Customizable Interface","customizable_interface_read_more":"Organize your workspace according to your needs: compose your layout, choose between themes, set up notifications and data preferences.","exchange":"Exchange","exchange_read_more":"Bitfinex offers the most liquid order book in the world, allowing users to easily exchange Bitcoin, Ethereum, EOS, Litecoin, Ripple, NEO and many other digital assets with minimal slippage.","features":"Features","join_today":"Start trading within minutes","join_today2":"Discover the world's leading cryptocurrency trading platform now.","margin_funding":"Margin Funding","margin_funding_read_more":"Liquidity providers can earn interest by providing funding to traders wanting to trade with leverage. Funding is traded on an order book at various rates and periods.","margin_trading":"Margin Trading","margin_trading_read_more":"Bitfinex allows up to 3.3x leverage trading by providing traders with access to the peer-to-peer funding market.","market_stats":"Market stats","more_market_data":"More market data","order_types_read_more":"Bitfinex offers a suite of order types to give traders the tools they need for every scenario. Discover more about our most advanced Algorithmic orders types.","platform_features":"Bitfinex Platform Features","platform_features_one_html":"Bitfinex is a full-featured spot trading platform for major digital assets & cryptocurrencies, including Bitcoin, Ethereum, EOS, Litecoin, Ripple, NEO, Monero and many more. Bitfinex offers leveraged margin trading through a peer-to-peer funding market, allowing users to securely trade with up to 3.3x leverage. We also boast a suite of order types to help traders take advantage of every situation.","rates_margin_funding":"Margin Funding","read_more":"Read More","security":"Security","security_read_more":"Security of user information and funds is our first priority. Learn more about our security features and integrations.","tagline":"The World's Leading Cryptocurrency Trading Platform","totalamount":"Total active funding","totalusedamount":"Amount used in margin pos.","view_demo":"View Demo","vol24h":"24 hour","vol7days":"7 day","vol30days":"30 day","volume":"Volume"},"mobileapp":{"title":"Mobile App","explain":"Stay connected, trade, and recieve notifications on the go.","download_app":"Download","download_apk":"download the apk","create_key":"Create a new API key","create_key_explain":"For added security, your mobile app can be customized with only the permissions you want to grant it. To do that, read carefully:","create_key_explain2":"Instead of logging into the app with your username and password, you will generate an API key and import it into the app. To create the key, go to %{link:bitfinex.com/api}.","create_key_explain3":"During creation, select only the permissions you want your mobile app to have. For example you could give the key \"read\" permission for orders but not \"write\" permission for orders. This would allow your app to view orders, but not place new ones.","funding":"Funding","funding_explain":"Margin Funding, manage your funding status, bids and offers","getting_started":"Getting started","login":"Login","login_explain":"Secure set up access via API keys and PIN/Passcode protection","notifications":"Notifications","notifications_explain":"Receive notifications on trade execution and Price Alerts","scan_qr":"Scan the QR code","scan_qr_explain":"When the API key from step 2 has been created, a QR code will be shown in your browser (only once). Now, using your app and your phone's camera you can scan this QR code to import the API key and log in. After this initial setup, logging into the mobile app is performed via a passcode.","settings":"Settings","settings_explain":"Customize your experience setting up your preferences","smart_features":"Smart features","trading":"Trading","trading_explain":"Exchange and Margin trading, manage your orders and positions","wallets":"Wallets","wallets_explain":"Transfer between wallets and check your latest movements"},"ethfinex":{"collaboration-title-1":"Collaboration","collaboration-title-2":"Community","collaboration-desc-1":"Ethfinex reflects the nature of the Ethereum community itself, building strong two-way relationships with other project teams.","collaboration-desc-2":"Smart contracts and decentralisation will increasingly be built into everything Ethfinex does, creating tools and modules necessary to interact with and contribute back to other projects in the ecosystem.","collaboration-desc-3":"To explore how Ethfinex can support your team or project, please contact","decentralisation":"Decentralisation","decentralisation-desc-1":"Ethfinex’s vision is to move towards a completely trustless exchange, including steadily decentralising ownership of the platform to its community of users.","decentralisation-desc-2":"We believe that fully decentralised models for exchange are not yet mature or scalable. Ethfinex pioneers a hybrid decentralised architecture, allowing decentralised exchanges to plug into it and trade with Ethfinex customers, as well as each other.","decentralisation-desc-3":"Ethfinex will encourage the emergence of scalable and trustless solutions by acting as an experimentation zone for emerging decentralised exchange protocols, providing feedback and allowing them to test and learn.","discover-whitepaper":"Discover the Nectar token loyalty program and how you can earn a stake in Ethfinex.","community":"Community","community-desc-1":"Collaborate, review and discuss upcoming crowdsales and traded tokens. Whether you want whitepaper reviews, sentiment analysis, or developer guides and FAQs, all the information you need to study will be in one place.","community-desc-2":"By crowdsourcing information and analysis, with a user reputation system to ensure high quality content, the entire blockchain ecosystem can benefit and accelerate.","trading-desc":"An industry first, Ethfinex Trustless allows for the trading of tokens from the security of a privately held wallet, whilst still facing high-speed liquid centralised order books. This offers the best of all worlds: speed, security and privacy. Advanced centralised exchange and margin trading is also available.","token-listings-desc":"Identify, track, and discuss upcoming token listings. View the latest discussions and directly contribute to your favourite projects, often at favourable terms compared with the public token issuances.","join-team-desc-1":"We are looking for talented individuals to join our team as we execute on our vision.","join-team-desc-2":"to apply or find out more.","intro-desc-1":"Ethfinex is a community hub for developers, enthusiasts and traders to share, discuss and crowdsource information from across the decentralised ecosystem.","intro-desc-2":"The platform offers both centralised exchange trading and secure trustless trading from a private wallet or custom custody solution, for all Ethereum based tokens.","nectar-title":"The Nectar Token Loyalty Program","nectar-desc-1":"Our journey towards decentralisation is centred around Nectar (NEC). We believe that our customers are the most important part of our platform, and therefore we reward loyal traders through distribution of Nectar.","nectar-desc-2":"Nectar's long-term role is to distribute the ownership of Ethfinex amongst its traders, providing those that contribute with a stake in the long-term success of the exchange.","nectar-desc-3":"Read the whitepaper to learn more about the Nectar token","project":"The home of digital tokens trading and investments","project-desc-1":"Tokens and tokenised assets on Ethereum are fast proving themselves to represent one of the most exciting innovations of the decade, with the potential to displace traditional business models and revolutionise financial infrastructures.","project-desc-2":"Ethfinex offers a new community & information hub for Ethereum based projects. It will facilitate learning, discussion, and analysis, whilst simultaneously offering access to the most highly liquid and advanced trading platform for Ethereum ERC20 tokens.","project-desc-3":"The Ethfinex platform will pioneer a hybrid, decentralised model for exchange. It will reflect the nature of the Ethereum community itself building smart contracts and decentralisation increasingly into everything it does, whilst providing the tools and modules necessary to interact with, and contribute back to, other projects in the ecosystem.","project-desc-4":"The vision will be to move towards a completely decentralised exchange, including steadily decentralising ownership of the platform to its community of users.","learn-discuss-trade":"Learn - Discuss - Trade","ethfinex-desc-1":"Home of token trading","ethfinex-desc-2":"Built for the Ethereum community, using Ethereum.","why-ethfinex":"Why Ethfinex?","why-ethfinex-desc-1":"We believe in providing you with full control over every aspect of your trading experience.","why-ethfinex-desc-2":"Ethfinex is a digital asset trading platform with access to highly-flexible centralised and on-chain trading portals, as well as fee-sharing, discussion features, and voting tools. We return power to our users, and hand them the tools they need to succeed.","why-ethfinex-security":"Security","why-ethfinex-security-desc":"With solid industry experience, Ethfinex is a highly-secure digital asset exchange. Our suite of advanced tools, including on-chain custody solutions, lets you focus on your trading.","why-ethfinex-transparency":"Transparency","why-ethfinex-transparency-desc":"Ethfinex gives users access to a fully transparent trading platform centered around providing the community with open & free information, continuous updates and real time performance insights.","why-ethfinex-liquidity":"Liquidity","why-ethfinex-liquidity-desc":"With access to industry-leading APIs, a suite of high-flexibility order types, a market maker incentivisation scheme and a competitive fee schedule, Ethfinex provides the most liquid cryptocurrency trading experience.","why-ethfinex-read-more":"Read more","nectar":"Nectar token","nectar-learn-more":"Learn more about Nectar","nectar-community":"Nectar.Community","nectar-community-desc":"Nectar.Community is the decentralized community portal for Ethfinex governance decisions. With its accessible voting functionality, performance statistics, learning resources and more, NEC holders can determine the long-term evolution of Ethfinex.","nectar-community-visit":"Visit Nectar Community","features":"Features","features-desc-1":"Ethfinex is a full-featured hybrid Ethereum exchange platform providing access to spot trading, margin trading, P2P funding & decentralised trading portals for a suite of high-quality Ethereum tokens.","features-desc-2":"With an intuitive & customisable interface, a suite of advanced order types, industry-leading APIs and advanced charting tools, our tools allow traders to capitalise on every situation.","features-read-more":"Read more","join-new-era":"Join the new era of cryptocurrency exchange","access-your-account":"Access your account","join-list":"Join our newsletter, featuring top stories from the world of cryptocurrencies, exclusive token interviews, and Ethfinex updates as we journey towards decentralisation","email-address":"Email address","newsletter":"The Weekly Market Digest","sign-up":"Subscribe","start-tour":"Start tour","listing-vote":"Listing vote","contact-us":"Leave us a message","chat-support":"Support","chat-search":"Search","chat-suggestions":"Suggestions","vote-next-token":"Vote for your next favourite token to get listed on Ethfinex","vote-time-left":"Time left","vote-goto":"Take me to vote","show_more":"Show More"},"order_book":{"asks":"Asks","bids":"Bids"},"trades":{"title":"Trades","time":"Time"},"tos":{"title":"Terms of Service","notice1":"Your approval is needed","notice2":"Please read our Terms of Service and use the form at the bottom of the page to indicate that you have read, understand, and agree to the terms.","please_agree":"If you have read, understood, and agree with these Terms of Service please indicate below:","consent":"Yes, I agree","no_consent":"No, I do not agree"},"risk":{"title":"Risk Disclosure Statement"},"antispam":{"title":"Anti-Spam Policy","notice1":"Your approval is needed","notice2":"Please take a look at our anti-spam policy and consent to receive email from Bitfinex if you agree.","consent":"Yes, I consent","no_consent":"No, I do not consent"},"law":{"title":"Law Enforcement Requests Policy"},"twofa_help":{"page_title":"Two Factor Authentication Help","title":"Syncing Issues with Google Authenticator App","explain":"Logging in using Google Authenticator can fail when the Google Authenticator app is not synced correctly.","explain2":"To make sure that you have the correct time","explain3":"If you'll keep experiencing issues with 2FA after completing these steps, %{link:contact support} and we'll help you further.","android":"On Android","android_explain":"Go to the main menu on the Google Authenticator app","android_explain2_html":"Tap Settings","android_explain3_html":"Tap Time correction for codes","android_explain4_html":"Tap Sync now","android_explain5":"On the next screen, the app will confirm that the time has been synced, and you should now be able to use your verification codes to sign in. The sync will only affect the internal time of your Google Authenticator app, and will not change your device’s Date & Time settings.","android_explain6":"Reference documentation","ios":"On iOS","ios_explain":"Open the Settings app of your iPhone home screen","ios_explain2_html":"Tap General","ios_explain3_html":"Tap Date & Time","ios_explain4_html":"Disable Set Automatically Option and re-enable again","ios_explain5":"Reboot your device"},"how":{"title":"How it Works","intro":"Introduction","p1":"The Site is a trading environment for the spot purchase and sale of Digital Tokens. The Site permits both unfinanced and financed transactions. Unfinanced purchases are fully funded by trading participants through funds deposited by the participants on the Site. For example, if a trader deposits $100.00 into her account on the Site, she may then purchase $100.00 worth of bitcoins in an unfinanced transaction. Purchases and sales of bitcoins on the Site, whether in an unfinanced transaction or a financed transaction, are settled by actual delivery of the full amount of the bitcoins or other Digital Tokens by the seller to the purchaser’s account against payment in full by the purchaser to the seller’s account.","p2":"Financed transactions in Digital Tokens are permitted through the Site’s platform-enabled, peer-to-peer financing functionality. Financing Providers may offer financing from and on their own account if they so choose. Financing Recipients may accept financing from Financing Providers for up to 70% of the value of a Digital Token purchase. For example, if a trader deposits $30.00 to the Site, she may then obtain financing in an amount not exceeding $70.00 in order to buy $100.00 worth of bitcoins in a financed transaction. In other words, she may accept financing equal to a maximum total bitcoins-to-equity ratio of 3 1/3 to 1.","p3":"Shorting is another type of financed transaction permitted on the Site’s platform. In a typical “long sale” of bitcoin, the seller enters into a regular spot trade of bitcoin and settles the transaction by delivering bitcoin that she owns outright. In a “short sale” of bitcoin, the seller also enters into a regular spot sale of bitcoin except that the transaction is settled by delivering bitcoin that she has borrowed.","p4":"Digital Tokens can be borrowed for purposes of short sales through the platform’s peer-to-peer financing functionality. The bitcoin borrower may seek offers or make a bid to borrow Digital Tokens on the Financing Order Book. Bitcoin borrowers are not permitted to borrow more than 70% of the bitcoins sold in a short sale. The fiat proceeds of any short sale serve as collateral for the borrowing of the bitcoins until those bitcoins are repaid.","h2":"Peer-to-Peer Financing","p5":"Bitfinex allows trading participants to use third party peer-to-peer financing from other participants on the platform to trade Digital Tokens. Financing Recipients may obtain financing in one of two general ways: they may place bids for financing on the Financing Order Book; or, they may elect to be automatically matched through the Site’s order matching engine with one or more Financing Providers on the Financing Order Book at the best prevailing price on the Financing Order Book. Although Bitfinex is not a party to these financing contracts, Bitfinex enforces the contracts established between Financing Providers and Financing Recipients on the Financing Order Book.","p6":"The Financing Order Book operates independent of the Trading Order Book. Once the desired financing is secured by a Financing Recipient, both financed and unfinanced transactions on the Trading Order Book are indistinguishable from each other to the trade matching engine.","p7":"The amount of the financing, the term of the financing, and the interest rate are all commercial terms negotiated through the Financing Order Book between Financing Providers and Financing Recipients. For instance, assume that A has $30.00 (in dollars) in her account on the Site. A obtains $70.00 in financing at X interest rate for Y term on the Financing Order Book (thereby becoming a Financing Recipient) from B, a Financing Provider. With that aggregate amount of $100.00, A may purchase $100.00 in bitcoins on the Trading Order Book from C, or from one or more other sellers. A has the right to repay the financing (including any accrued interest) at any time without pre-payment or other penalty. Obtaining financing does not create any obligation to purchase bitcoins on the Trading Order Book. A may also replace financing from B at any time with more favorable financing.","p8":"In the above example, the bitcoins purchased by A ($100.00) are subject to a Lien in favor of B up to the total amount of financing secured from B ($70.00 plus any interest component). A may remove any amount of bitcoins from the Site that is not subject to the Lien. If the Financing Recipient’s equity falls to or below 15%—calculated as the quotient (expressed as a percentage) obtained by dividing (a) the excess of (i) the market value of the purchased bitcoins over (ii) the total principal amount (plus accrued and unpaid interest) relating to all financing outstanding by (b) the market value used in (a)(i), above—Bitfinex will force the liquidation of the bitcoins in A’s account without notice to A, return financing to the Financing Provider, with accrued interest, and return the balance to the Financing Recipient. Bitfinex does not make margin calls. For example, if the purchased bitcoins’ value falls from $100.00 to $82.35, the difference between that value and the financing obtained by A would be $82.35 – $70.00, or $12.35. Taken as a percentage of the bitcoins’ value, $12.35 ∕ $82.35 equals 15%. In other words, if the value of the bitcoins fell to $82.35 in aggregate, A’s bitcoins would be liquidated by Bitfinex on the Trading Order Book, B would be repaid, and any remaining difference ($12.35, exclusive of interest) would be A’s to retain.","p9":"As set out in the %{link:Terms of Service}, you grant Bitfinex agency to implement, levy, monitor, and maintain any and all Liens in favor of Financing Providers and to force-liquidate any Digital Tokens in your name or control on the Site if necessary to ensure that any Financing Provider on the Site from whom you have obtained financing is repaid in full. As set out in the Terms of Service, trading markets in digital tokens can shift quickly. Price movements can be unexpected. There is no guarantee against losses on the Site. You may lose more than is in your various wallets on the Site if you engage in financing on the Site. You are responsible for any trading and non-trading activity on your Bitfinex account, but Bitfinex must at all times retain the ability to protect Financing Providers by force-liquidating your account, as and when necessary. Bitfinex cannot guarantee to stop losses even with the ability to force-liquidate any of your positions (due to, for example, market volatility and liquidity). Bitfinex will not be and is not responsible for any Financing Provider losing funds or Digital Tokens to any Financing Recipient on Bitfinex.","p10":"If the market value of bitcoins rises, A may sell her bitcoins and repay the loan. For example, assume the value of A’s bitcoins rises to $115.00. Now the difference between the bitcoins’ value and the financing is $115.00 – $70.00, or $45.00. Taken as a percentage of the value of the bitcoins, $45.00 ∕ $115.00 equals approximately 39%. Accordingly, A could remove part of her equity, but may not fall below her initial equity requirement. A could also sell the bitcoins on the Trading Order Book, repay the financing to B (plus any interest), and retain the balance on the transaction.","p11":"Alternatively, A could satisfy the Lien and unencumber the bitcoins by repaying the financing used to purchase the bitcoins. Unencumbering the bitcoins simply refers to the process of using some combination of unrealized gain or additionally deposited funds, or both, for the purposes of paying off the financing and removing the Lien. In the above example, A could deploy the unrealized gain of $15.00 to partially unencumber the bitcoins owned by her, thereby reducing the financed amount outstanding to B.","p12":"You can use the trading features of the Trading Order Book through your \"Margin Wallet.\" You may access the Funding Order Book through your \"Funding Wallet.\""},"privacy":{"title":"Bitfinex Privacy Policy"},"security":{"title":"Security","account_protection":"User Account Protection","account_protection_desc1":"Some of the security measures highlighted below are in place by default, and others can be activated based on the security level you need. Please visit ","account_protection_desc2":" to check the security status of your account and see recommendations.","account_protection_link":"www.bitfinex.com/security","adv_tools":"Advanced verification tools to monitor the integrity of your account","adv_tools_p1":"Login data is saved and analyzed for unusual activity.","adv_tools_p2":"Intelligent system detects IP Address changes to prevent session hijacking.","adv_tools_p3":"Email notifications report logins and include a link to instantly freeze your account if you suspect malicious activity.","adv_tools_p4":"Limit access to your account based on IP address.","api":"Advanced API key permissions","api_explain":"Create API keys with advanced read/write permissions on a per-feature basis. Unleash the full power of the platform through our REST and WebSockets APIs.","backups":"Automatic backup of the database once a day","backups_explain":"Once a day, the database of the platform is backed up, encrypted and compressed as an archive.","cryptoc_storage":"Cryptocurrency Storage","cryptoc_storage_desc":"The overwhelming majority of system funds are stored in offline, cold wallets. Only approximately 0.5% of crypto assets are accessible in hot wallets for day-to-day platform operations. As an added protection, the cold wallets are not available from the platform or the platform servers. The funds in offline cold storage require manual intervention by several members of our management to access.","ddos":"Protection from DDoS attacks","ddos_explain":"We are protected by automatic Distributed Denial of Service protection to ensure that trading cannot be halted by outside attacks.","duplication":"Duplication of backup data automatically","duplication_explain":"As soon as a new backup is ready (database, log files,...), it is sent to others servers in several physical locations.","explain":"Security of user information and funds is our first priority.","explain2":"Every detail is analyzed to avoid security holes. We pride ourselves on being the most secure Bitcoin exchange.","intro":"Security of funds and user information is our top priority. Our security team is continually improving our end-to-end security measures, improving auditing processes, and reducing the 'attack surface' of our infrastructure. Please note that we cannot disclose too many details of the security measures implemented on the platform for security and proprietary reasons.","linux":"Always up-to-date Linux systems to host the platform","linux_explain":"Our servers network is protected using always up-to-date software and the best possible practices.","pgp_email":"Email Encryption with OpenPGP","pgp_email_desc":"Want more protection? Encrypted email communication (PGP) adds an extra layer of privacy and security.","protection":"Advanced account protection","protection_explain":"We offer two options to secure your account: Two-factor authentication (2FA) token and SMS authentication to validate your withdrawals.","protection_explain2":"We have advanced verification tools to try and detect if your account is compromised","security_policies":"Security Policies","twofa_title":"Two-factor authentication (2FA)","twofa_desc":"Add an extra layer of security to your account and protect sensitive operations such as logging in, generating API keys, and withdrawing. Configure two-factor authentication using Google Authenticator, Twilio, or a U2F Security Key.","u2f_title":"Universal 2nd Factor (U2F)","u2f_desc":"Use a physical Security Key to take advantage of the ultra-secure FIDO Universal 2nd Factor (U2F) open authentication standard.","wd_protection":"Withdrawals protection","wd_protection_p1":"Security system monitors withdrawals by IP address and other user behavior patterns, triggering manual admin inspection on withdrawals that appear unusual.","wd_protection_p2":"Withdrawal confirmation step that is immune to malicious browser malware.","wd_protection_p3":"Define an address whitelist to ensure no withdrawals can go anywhere else.","wd_unlock_html":"Important: You may be put on a 5-day withdrawal hold.","wd_unlock2":"Please take a moment to review.","wd_unlock3":"The following actions will put your account on a 5-day withdrawal hold","wd_unlock4":"Removing a whitelisted address from a currency that had one saved.","wd_unlock5":"Switching withdrawals from Off to On for one or more currencies.","wd_unlock6":"Modifying an existing whitelisted withdrawal address.","wd_unlock7":"The following actions will NOT trigger a 5-day withdrawal hold","wd_unlock8":"Adding a whitelisted address for a currency that was previously enabled but did not have a whitelisted address saved.","wd_unlock9":"Switching withdrawals from On to Off for one or more currencies."},"stats":{"stats":"Statistics","bsi_explain":"Our Bitfinex Sentiment Index allows you to see what the market of BTC/USD currently feels like, bullish or bearish. It is based on market participants sentiment about BTC/USD price.","days_30_ago":"30 days ago","days_30_change":"30 day change","days_7_ago":"7 days ago","days_7_change":"7 day change","hours_24_ago":"24 hours ago","hours_24_change":"24 hour change","find":"Find a ","find_link":"complete and detailed set of data and charts","find_explain":" to help you analyze the crypto-markets of Bitfinex at ","last_trade":"Last Trade","vol24h_simple":"24h VOL","vol24h":"Volume on the last 24 hours","vol7days":"Volume on the last 7 days","vol30days":"Volume on the last 30 days","volume":"Volume","apy":"Flash Return Rate","apy_explain":"Average Rate on funding (per day)","title":" Bitfinex Data and Charts","totalamount":"Total sum of active funding","totalusedamount":"Total amount used in margin positions","pairs":"Currency Pairs","prevailing_interest_rates":"Average rates of the open funding (positions) as of %{date}.","volatility":"Trading Pairs Historical Volatility","volatility_explain":"pair-Volex is our measure of historical volatility for each pair traded on Bitfinex. It is calculated as the standard deviation of each pair's hourly prices, over the previous 7 trading days, and then annualized. Prices used to calculate Btc-Volex are the average prices of all trades executed on Bitfinex in the previous hour, therefore Btc-Volex will be refreshed every hour."}},"pairs":{"btcusd":"BTCUSD","ltcusd":"LTCUSD","ltcbtc":"LTCBTC"},"pending":"Pending","processing":"Processing","representatives":{"affiliate_list":"Your affiliates list","default_currency":"Currency to receive income","generated_income":"Generated income","in_last_x_days":"In the last %{days} days","no_affiliate_yet":"No affiliates yet!","ref_code":"Your referrer code (give this code to your affiliates when they register on Bitfinex)","rep_explain":"The affiliate program gives you access to the following benefits","rep_explain_1":"%{rep_fees}% on affiliates' trading fees","rep_explain_2":"%{rep_fees}% on affiliates' lending fees","rep_explain_disclaimer":"Bitfinex reserves the right to make adjustments or changes to the affiliate program","total":"Total","your_account_is":"Your affiliate account is %{status}","your_parameters":"Your parameters"},"sidebar":{"maintenance":"Required Equity","maintenance_tip":"The amount of equity required to maintain open margin positions for this pair. For example, for a margin position worth 500 USD and a maintenance value of 0.25, 125 USD worth of available collateral is required in the Margin Wallet to prevent automatic position liquidation.","margin_requirement":"Maintenance","margin_requirement_tip":"The percentage of equity required to maintain open margin positions for this pair.","margin_balance":"Gross Trading Balance","margin_balance_tip":"Gross Trading Balance is the USD equivalent of your Margin wallet balances.","net_value":"Net Trading Balance","net_value_tip":"(Gross Trading Balance) + (Unrealized P/L) + (Unrealized Funding Cost)","tradable_balance":"Gross Tradable Balance","tradable_balance_tip":"The total value you can use in margin trading positions.","unrealized_pl":"Unrealized P/L","unrealized_pl_tip":"Total unrealized profit/loss for all open margin positions.","unrealized_swap":"Unrealized Funding Cost","unrealized_swap_tip":"Total unrealized funding cost for all open margin positions.","initial_margin":"Initial Margin","initial_margin_tip":"The percent needed to open a position of value X. For an initial margin of 50% and a Net Trading Balance of 100 USD you could open a position worth 200 USD.","gross":"Gross","gross_tip":"Gross Tradable Balance is calculated from the available collateral in your Margin wallet and the initial margin requirement for this pair.","positions_tip":"Amount of Tradable Balance used by your active margin positions.","orders_tip":"Amount of Tradable Balance used by your active margin orders.","net_tip":"Total amount of Tradable Balance available based on the collateral in you Margin Wallet and the state of your margin positions and margin orders.","buysell_tip":"Calculations for determining the available Tradable Balance for margin %{word}."},"sign_up":"Sign Up","submit":"Submit","top":"TOP ","trading":{"actions":"Actions","active_orders":"Orders","inactive_orders":"Order History","active_positions":"Positions","ask":"Ask","ask_oco_cancel":"Also cancel this order's OCO pair order?","avg_price":"Average execution price","base_price":"Base price","bid":"Bid","offer":"Offer","buy":"Buy","buy_all":"Buy All","buy_sell_all_no_trailing":"\"Buy All and \"Sell All\" feature is not compatible with trailing orders.","chart":"Chart","executed_amount":"Executed amount","for_pair":"On Pair","form_error":"Please correct form errors and try again.","hideorder":"Hidden","hideorder_tooltip":"This option allows you to place an order into the book but not have it displayed to other traders. Price/time priority is the same as a displayed order, but the hidden order will always pay the \"taker\" fee while those trading against a hidden order will pay the \"maker\" fee.","inactive":"Inactive","inactive_explain":"The time that the order became inactive, either by being cancelled or executed.","includevir":"Include variable rates?","limit_price":"Limit Price","liquidation_price":"Liq Price","lp_explain":"Liquidation Price is indicative: it varies with your trading balance and your margin funding, and the number of your active positions. It does not represent a contractual price.","liquidate_do":"Close this position with a MARKET order","liquidate_confirmation":"Are you sure you want to close this position with a MARKET order?","marginreserved":"Margin reserved","margin_available":"Margin available","margin_go_reserve":"Go reserve some","maxrate":"Maximum margin rate?","no_active_orders":"No active orders.","no_active_positions":"No active positions.","no_balanes_chart":"No balances. Deposit funds to see a visualization of your balances here.","no_favs":"No favorites yet. Browse tickers using the \"Trading\" and \"Funding\" tabs directly above. Then, set your favorite tickers by clicking the small star to the right of each ticker.","no_ticker_found":"No tickers found for that search.","no_query":"Use the form above to search trading or funding tickers.","ocoorder":"OCO","advops":"Funding Options","advops_short":"Funding Opts","pair_not_found":"The trading pair %{pair} was either not found or you do not have access to it. Check your settings on 'Account > Currencies & Pairs' to review your available pairs.","platform":"Platform","postonly":"Post Only","postonly_long":"\"Post Only\" limit orders are orders that allow you to be sure to always pay the maker fee. When placed, a \"Post Only\" limit order is either inserted into the order book or cancelled (only for limit orders).","order_history":"Order history","order_type":"Order Type","order_types":{"limit":"Limit","market":"Market","stop":"Stop","stop_limit":"Stop-Limit","trailing_stop":"Trailing Stop","fok":"Fill or Kill","exchange_limit":"Exchange Limit","exchange_trailing_stop":"Exchange Trailing Stop"},"order_size":"Order size","original_amount":"Original Amount","pl":"P/L","pl_explain":"P/L is indicative: it is based on best ask and bid, and includes the maximum order fees you can have when closing the position.","price":"Price","routing_order":"Route","sell":"Sell","sell_all":"Sell All","stop_price":"Stop Price","swap":"Funding Cost","swap_explain":"Current amount owed to margin funding lenders for this position. If you have multiple positions, this figure may not be completely accurate on a per positions-basis, but is accurate in total.","swap_type":"Funding Type","swap_type_tooltip":"Users can choose to settle margin funding interest daily or when the position is closed (term). Some users prefer term because it shows the total cost over the lifetime of the position, but will result in additional funding being reserved to account for the growing balance.","swap_backed":"Term","swap_daily":"Daily","swaprate":"Margin Funding rate (per day)","total_loans":"Total funding of positions","type":"Type","update":"Modifying cancels this %{thing} and creates a new %{thing}. Updating an %{thing} therefore causes it to lose its place in the queue.","true_update":"Orders are modified in-line and do not lose their priority in the order book unless the amount of the order is increased or the price is changed."},"order_book":{"zoom_out":"Zoom out book depth visualization","zoom_in":"Zoom in book depth visualization","decrease_prec":"Decrease Precision","cannot_decrease_prec":"Cannot decrease precision any more.","increase_prec":"Increase Precision","cannot_increase_prec":"Cannot increase precision any more.","websockets":{"real_time":"Real-time","throttled_5s":"Throttled 5s"},"no_active_orders":"No active orders","no_inactive_orders":"No order history.","your":"Your","of_your":"of your","order_of":"order of","was_canceled":"has been canceled","executed_partial":"has been partially executed","executed_full":"has been fully executed","buy":"buy","sell":"sell"},"update":"Update","users":{"enabled_curr":"Enabled Currencies","active_for":"Active for deposits, withdrawals, and trading:","exh_pairs":"Exchange Pairs","for_exh":"Active for exchange trading:","trading":"Trading Pairs","for_trading":"Active for margin trading:"},"password_reset":{"see_req":"See password requirements above."},"security":{"alerts":{"logout_on_ip":"WARNING: You should enable automatic logout on IP address changes in \"Session\" section to meet minimum saftey standards","on_ip_change":"WARNING: You should set withdrawals to require confirmation when made from new IP addresses in \"Withdrawals\" section to meet minimum saftey standards","twofa":"Two-factor authentication is highly recommended. See the \"Two-Factor Authentication\" section below."},"email_encrypt":{"title":"Email Encryption with OpenPGP","title_two":"Email Encryption","added":"Added on","description":"Set up encryption for email services","description_html":"Pretty Good Privacy (PGP) is a data encryption and decryption program that provides cryptographic privacy and authentication for data communication. It uses a variation of the public key system. To use PGP with Bitfinex email communication, please provide your PGP public key below. %{link: PGP on Wikipedia }","pub_key":"PGP Public Key","pending":"Enabling email encryption for your account is currently pending. Please check your email, decrypt the activation email, and follow the link in the email to complete activation."},"ip_whitelist":{"title":"IP Address Whitelist","description":"Limit account access by IP address. You can provide one or more IP addresses and/or specify an IP range.","description2_html":"Important: You can lock yourself out of your account if you are not careful. Please be sure you are on a static IP address (most users are not) and that you understand this feature.","examples":"Examples (one entry per line; use hyphen to specify range)"},"login_history":{"title":"Login History","audit":"Each login to your account is saved and %{link: can be audited here}"},"not_perf":"If you did not perform this action or a member of Bitfinex support staff has not performed this action at your specific request, and you suspect malicious activity, please take the following steps:","recs":{"title":"Recommendations","title_two":"Security recommendations","confirm_phrase":"Setup a withdrawal confirmation phrase in \"Withdrawals\" section","lock_ip":"Limit access to your account based on IP address in \"Session\" section","lock_withdraw":"Lock or disable withdrawal addresses for all currencies in the \"Withdrawals\" section","lock_withdraw_new_ip":"Lock withdrawals when a new IP address is used to log into your account in the \"Withdrawals\" section","login_email":"Enable email login notifications in \"Session\" section","pgp_email":"Enable PGP email encryption in \"Email Encryption\" section","session_alive":"Disable \"Keep Session Alive\" if you are using a public computer or prefer to not have a more persistent session."},"session":{"title":"Session","description":"Adjust session settings"},"score":{"good":"Good","low":"Low","okay":"Okay"},"token_renew":{"complete":"Please complete this renewal before","description":"We are migrating to a new storage mechanism for two-factor tokens. To switch to the new storage, please take a moment to renew your token.","disable":"Disable Old","disable_how":": Click the \"Enabled\" button under the \"Google Authenticator\" section on this page and disable current token.","enable":"Enable New","enable_how":": Immediately re-enable two-factor authentication using the same section of this page."},"twofa":{"title":"Two-Factor Authentication","api_key":"API Key Creation","sensitive_changes":"Sensitive Account Settings Changes","security_changes":"Security Settings Changes","auth_token":"Please enter your Google Authenticator Token to proceed with disabling","current":"Your current coverage","confirm_goog":"Confirm Via Google Authenticator","confirm_sms":"Confirm Via SMS 2FA","description":"Configure 2FA services","goog_tagline":"Use Google's Android or iPhone app for adding token-based 2FA.","u2f_tagline":"Physical Security Key using FIDO Universal 2nd Factor (U2F).","intercept":"This action requires an additional security check.","intercept_confirm":"Please confirm using two-factor authentication.","intercept_confirm_either":"Please confirm using one of your two-factor authentication services.","logins":"Logins","password":"Password Changes","protected":"Protected actions:","recommended":"Using Two-factor authentication is highly recommended.","recommended2":"Please consider our available options for increasing the security of your account. We want to give you every opportunity to be confident that your account is secure.","recommended3":"If you enable multiple 2FA methods, the precedence goes left to right. U2F takes priority over Token 2FA.","sms_tagline":"Receive SMS messages on your phone for confirming critical actions.","step_one":"The first step is to download the Google Authenticator app for your Android or iOS device.","switch_goog":"Switch To Google 2FA","switch_sms":"Switch To SMS 2FA","withdrawals":"Withdrawal Confirmations","u2f_req":"Requirements","u2f_req1":"An up-to-date version of the Chrome browser (or modern browser with U2F support).","u2f_req2":"A Security Key device that plugs into a USB port and works with FIDO Universal 2nd Factor (U2F)","u2f_opt":"Options","u2f_opt1":"Enter a label for this Security Key (useful if you are using multiple keys).","u2f_opt2":"Choose if a user who logs in using this Security Key should have permission to trade and/or withdraw.","u2f_insert":"Insert your Security Key into your computer's USB port and if it has a button, tap it now."},"tips":{"addy_lock":"Lock Withdrawal Addresses","custom_check":"Custom Withdrawal Check","detect_ip":"Detect IP Address Change","email_encrypt":"Email Encryption","login_email":"Send Email on Login","session_alive":"Don't Keep Session Alive","monitor":"Monitor Withdrawals by IP","new_ip":"New IP Withdrawal Lock","whitelist":"IP Address Whitelist"},"warn_modal":{"title":"Please set up two-factor authentication","body1":"The value of your account is greater than %{value}, but you are not yet protected by two-factor authentication.","body2":"Please seriously consider enabling two-factor authentication. Enabling 2FA adds an extra layer of security to your account and protects you against the most common password crack and social engineering hacks.","body3":"To increase your security now, please proceed to the %{link: Security Center} and enable two-factor authentication.","withdraw":"For faster withdrawal processing, please enable two-factor authentication from the Security page. Withdrawal requests from accounts without 2FA protection take considerably longer to process."},"withdraw":{"title":"Withdrawals","address":"withdraw address","custom_check_title":"Custom Withdrawal Check","custom_check_tagline":"Add a secret phrase to the withdrawal confirmation image. This is another step to help you ensure your withdrawal details have not been compromised by malware on your browser or a man-in-the-middle attack.","description":"Tailor your withdrawal settings","lock_disable_title":"Withdrawal Addresses Whitelist","lock_disable_tagline":"For optimum withdrawal security, for each currency you can limit crypto withdrawals to a specifically whitelisted address.","lock_disable_tagline2":"Alternatively, if you know you will not be using certain cryptos, you can disable withdrawals for a currency altogether.","lock_disable_tagline3":"IMPORTANT: For optimum security, unlocking or changing a locked withdrawal address of your Bitfinex account triggers an automatic withdrawal hold of 5 days.","lock_disable_tagline4":"Please note that the 5-day withdrawal hold is only applied when re-enabling disabled withdrawals for a currency or when modifying an existing whitelisted address. This is because it marginally reduces your withdrawal security. There is no 5-day hold applied when disabling withdrawals or adding whitelisted addresses since these actions marginally increase withdrawal security.","tether_title":"Tether","check_email":"Almost done! Check your email to approve the withdrawal.","submit_success":"New withdrawal request has been successfully submitted.","suspicious":"Withdrawal canceled. If you believe this withdrawal was suspicious, please contact support from bitfinex.com/support immediately.","token_mismatch":"Tokenized link mismatch with destination withdrawal. Please retry your withdrawal or contact support from bitfinex.com/support. Sorry for the inconvenience - security is our top priority.","param_mismatch":"Problem reviewing withdraw: Invalid user parameters. Please retry your withdrawal or contact support from bitfinex.com/support. Sorry for the inconvenience - security is our top priority.","not_found":"Could not locate withdraw. Please retry your withdrawal or contact support from bitfinex.com/support. Sorry for the inconvenience - security is our top priority.","err_restart":"Something went wrong. Please restart the withdrawal process.","how_to_freeze":"If you did not submit this withdrawal and feel that your account may have been compromised, you may %{link: freeze your account} to prevent any further account actions.","resend_conf_email":"Re-send email"},"whitelist":{"title":"Address Whitelist","description":"Withdrawal Addresses Whitelist"}},"signup":{"username":"Username","email":"Email Address","pass":"Password","ref":"Referrer Code","confirm0":"Professional Platform","confirm0_desc":"%{co} is a platform for professional traders. If you are new to cryptocurrency trading, please consider another, more straightforward platform first and return to %{co} later.","confirm1":"Minimum Account Equity","confirm1_desc":"New accounts will not be able to trade or perform any platform function until they reach a minimum account equity of %{amount} USD, achieved by depositing cryptocurrency.","confirm2":"Verification Timeline","confirm2_desc":"If you wish to complete the verification process to gain access to additional features such as fiat deposits and withdrawals, please understand that the verification process is significantly backlogged. New verification requests are taking 6-8 weeks to complete.","confirm3":"Inactivity Fee","confirm3_desc":"%{co} is not a wallet service. If you are not participating in %{co} markets, please withdraw your funds from the platform. In the future, users who hold balances in their %{co} account but do not participate in markets may be charged a small inactivity fee.","acknowledge":"I understand","acknowledge_err":"Please read","copy1":"Thank you for your interest in opening a %{co} account.","copy2":"Before continuing, please read, understand, and acknowledge the following important notices","copy3":"Thank you for taking a moment to understand more about %{co}.","copy4":"If you have read, understood, and acknowledged each of the items above we invite you to proceed.","copy5":"Welcome to %{co}.","copy6":"%{co} Management"},"min_equity":{"warn0":"You have been redirected. Please review our account activation policy.","warn1":"New accounts must achieve an initial account equity of %{amount} USD to access platform features.","warn2":"Your current account equity is %{amount} USD.","warn3":"Please deposit cryptocurrency or become verified and deposit via a bank wire.","warn4":"After achieving this minimum equity, all platform features will become available and you will not be required to maintain this level of equity to continue.","warn5":"You will be able to continue using %{co} while reducing your equity if you desire.","warn6":"If your equity has changed recently and you believe you are now over the minimum, please allow a few minutes for the system to update."},"ticker":{"last":"Last Trade","twenty_four":"24h Change","twenty_four_range":"24h Range"},"tickets":{"title":"Support Tickets","intro":"Monitor and update your open supprt tickets.","redir":"To get support or open a new support ticket, please proceed to the %{link: Support Center}","my_tickets":"My Open Tickets","my_tickets_desc":"View and manage your open support tickets","open_new":"New Support Ticket","open_new_desc":"Submit a support ticket for a new issue or question"},"tooltips":{"deposit":{"copy":"Copy to Clipboard","copied":"Copied","how_copy":"Press ⌘ + C to Copy","wallet":" Wallet","send_to_form":"Send To Form"}},"tours":{"finish":{"title":"You've finished","content":"Thanks for taking the tour. Take another?","ctaLabel":"Take Another"},"demo_finish":{"content":"Thanks for exploring Bitfinex!
Sign up now to begin trading and exploring the other areas of the platform.
Have questions? We're happy to chat with you. Contact support from bitfinex.com/support and we'll organize a platform walkthrough."},"resume_demo_tour":{"title":"Tour Later","content":"Take the tour whenever you are ready"},"go_home":{"title":"Welcome to Bitfinex","content":"Let's go to the home page to start the tour. Click the Bitfinex logo"},"go_home_wallets":{"title":"Bitfinex Wallets","content":"Let's go to the home page to start the tour"},"go_home_tips":{"title":"Tricks and Tips","content":"Let's go to the home page to start"},"go_to_trading":{"title":"Go To Trading","content":"Let's go to Trading to start. Click the button above to continue"},"go_to_funding":{"title":"Go To Funding","content":"Let's go to Funding to start. Click the button above to continue"},"funding_form":{"title":"Margin Funding Form","content":"By offering funding to margin traders you can earn interest at a rate and duration of your choice. Likewise, you can request to receive funding which will be available for your margin trading.
Note that if you are margin trading, it is optional to manage your own funding. If you do not manually take out funding by placing funding bids, the system will automatically take out the best available funding for you at the time when you need it"},"log_in":{"title":"Please Log In","content":"Log in and then continue the tour"},"loan_offers":{"title":"Funding Bids","content":"The Margin Funding 'Bids' book shows requests for funding and the rates and periods that are being requested"},"lend_offers":{"title":"Funding Offers","content":"The Margin Funding 'Offers' book shows the funding that is being offered at various rates and periods"},"three_features":{"title":"Three Main Features","content":"Bitfinex offers three main features: Exchange Trading, Margin Trading, and Margin Funding"},"manage_wallets":{"title":"Moving Funds","content":"To move funds between wallets using the Wallets page, navigate to 'Transfer > Wallets' using the top right menu"},"order_form":{"title":"Order Form","content":"This is the form for placing new orders. There are a variety of order types and options available - from simple market orders to complex algorithmic order types"},"order_form_type":{"title":"Exchange or Margin","content":"You can toggle the form between Exchange and Margin mode to place either an exchange order or a margin order"},"order_form_exchange":{"title":"Exchange Trading","content":"When you select Exchange, the form is in Exchange Trading mode.
Exchange orders are the most basic: they exchange one currency for another and your wallet balances are settled when the trade executes"},"order_form_trading":{"title":"Margin Trading","content":"When you select Margin, the form is in Margin Trading mode.
Executed margin orders do not immediately settle your wallet balances. Instead, they open, close, or modify a leveraged position. Your wallet balances are settled only when you close or claim a position"},"pairs_menu":{"title":"Tickers and Navigation","content":"The ticker information for your current view is shown here.
Hover over the current ticker to reveal the navigation sidebar.
Tip: When the sidebar is revealed, click the star next to a pair or currency to mark your favorites"},"funding_pairs_menu":{"title":"Margin Funding Menu","content":"You can offer or receive funding in any of the currencies used for Margin Trading.
Hover over the ticker to reveal the sidebar navigation. Then notice the 'Funding' section that lists all available funding currencies"},"buy_button":{"title":"Buying","content":"Here you can complete the placing of a buy order.
Assuming the BTC/USD pair, in Exchange Mode, you would be submitting an order to buy BTC with the available USD in your Exchange Wallet.
In Margin Mode, you would be submitting an order to open (or add to) a BTC/USD long position using your Tradable Balance in your Margin Wallet. Or, if you have an open BTC/USD short position, a Margin buy would close (or reduce) your BTC/USD short position"},"trades_toggle":{"title":"View Trades Stream","content":"View a stream of all public trades or only your own"},"sell_button":{"title":"Selling","content":"Here you can complete the placing of a sell order.
Assuming the BTC/USD pair, in Exchange Mode, you would be submitting an order to sell available BTC in your Exchange Wallet for USD.
In Margin Mode, you would be submitting an order to open (or add to) a BTC/USD short position using your Tradable Balance in your Margin Wallet. Or, if you have an open BTC/USD long position, a Margin sell would close (or reduce) your BTC/USD long position"},"bids":{"title":"Order Book - Bids","content":"The order book shows you the public orders. 'Bids' are orders to buy at a given price"},"asks":{"title":"Order Book - Asks","content":"'Asks' are orders placed to sell at a given price"},"trades":{"title":"Trades","content":"Recent trades stream here in real-time. The color and shade indicate a buy or sell and the relative trade size.
You can also toggle this widget to display your recent trades instead"},"chart":{"title":"Chart","content":"The Chart provides a graphic interface for monitoring market activity and your own trading activity.
- Draw and place indicators - Save and load charts for later - View, cancel, and modify your orders - View and manage price alerts - View leveraged positions and liquidation prices"},"my_orders":{"title":"Your Orders","content_html":"All of your active orders will be shown in this collapsible section. We offer a variety of order types. To better understand each, visit the Knowledge Base"},"my_inactive_orders":{"title":"Your Order History","content":"This section provides a history of past orders. All executed or canceled orders are displayed here"},"my_positions":{"title":"Your Positions","content":"All of your active positions will be shown in this collapsible section. Long positions have positive amount while short positions have a negative amount value"},"advanced_orders":{"title":"Advanced Orders","content":"Make use of the more advanced order types. For example, using a Trailing Stop order allows for dynamic orders based on market activity.
Information for all order types can be found in the Knowledge Base"},"price_agg":{"title":"Price Aggregation","content":"Adjust the order book's price aggregation to understand the market at both a micro and macro level"},"balance_overview":{"title":"Balances & Wallets","content":"You have a separate wallet for each site feature: Exchange Trading, Margin Trading, and Margin Funding.
Each wallet shows its balances and available balances, which might be smaller than the total balance if you have open orders or funds are being used"},"trading_summary":{"title":"Trading Summary","content":"Your trading summary displays an overview of your current open margin positions and your available tradable balance. Your tradable balance is calculated based off of your margin allowance and your Margin Wallet balances.
Your tradable balance (in USD) is an indication of the size of margin positions you can open. If your tradable balance is 1000 and BTC/USD is at 500.00, you can open a short or long position of approximately 2.0 BTC"},"total_avail":{"title":"Total and Available Balances","content":"If you have limit orders, open positions, unused or active margin funding, this will decrease your available balance. To increase it, you can cancel limit orders or reduce/close your positions"},"wallet_transfers":{"title":"Instantly Transfer Funds","content":"Use the transfer form to instantly move funds to the wallet where you need it. For Margin Trading, send funds to the Margin Wallet. For Exchange Trading use the Exchange wallet. For Margin Funding use the Funding Wallet"},"user_menu":{"title":"Explore","content":"Explore the Account menu to take advantage of a variety of security features and settings"},"quick_transfer":{"title_html":"Quick Transfer","content_html":"Save time by completing wallet transfers without going to the Wallets page. Click on a value to view options for each balance"},"funding_loans":{"title":"Unused Funding","content":"This section shows a summary of any borrowed funding that are not currently being used as collateral in a margin trading position"},"funding_positionloans":{"title":"Funding Used","content":"When you have taken funding for use as collateral in a margin trading position, the summary of your used funding is shown here"},"funding_credits":{"title":"Funding Provided","content":"When one of your offers is matched and executed, you can monitor your lent funds here"},"funding_offers":{"title":"Your Bids and Offers","content":"Your active funding bids and offers will be shown here"}},"verification":{"add":"Add Member","address":"Address","address_biz":"Business Address","address_explain":"Location information for secure record keeping.","address_no_po_html":"Address PO Box not accepted","address_office":"Registered Office Address","address_perm":"Permanent Address","address_res":"Residential Address","address_res_in_place":"Registered Office Address in place of incorporation","address_same":"Is your permanent address the same as residential address?","address_same2":"Business address is the same as registered office address?","add_docs":{"add_new":"Add Documents","additional":"additional","additional_2":"required for account verification, security, or to complete a pending deposit or withdrawal.","attach_html":"Please attach a PDF, JPG, or JPEG.","failed_msg":"Please ensure your file is a PDF, JPG, or JPEG that is less than 30 MB in size.","name_file":"File Name (eg \"passport front\", \"utility bill\")","name_locked":"File Name (locked)","new":"Add new documents","no_additional":"There are no additional documents that have been requested from you at this time.","page":"page for more information.","proceed":"Please proceed to the","use":"Used for adding specially requested files or to replace out-of-date documents."},"all_docs":"All your uploaded documents","apt":"Apartment Number","area_code":"Area Code","bank":{"bank":"Bank","statement":"Bank Statement","statement_accepted":"*Deposits only from the account you have provided will be accepted.","statement1":"Bank statement or bank letter showing the account number, account holder and logo of the bank (not a screenshot, nor debit card nor credit card) - a downloadable e-statement could also be provided. The document must be in english or you should provide a certified english translation.","statement2":"Must clearly show","req1":"Bank name","req2":"Account holder name","req3":"Account number"},"bank_statement":{"not_accepted":"Not Accepted as Bank Statement","not_accepted1":"Screenshot of online banking interface","not_accepted2":"Credit card or debit card statements","not_accepted3":"Bank statements that are not in your name","not_accepted4":"Banks that appear on a Sanction List","not_accepted5":"A statement omitting the account number","not_accepted6":"A scan of an ATM card","required":"Required","requirement1":"Bank name","requirement2":"Account holder name - must be for a personal account in your name - not for a corporation","requirement3":"Account number"},"begin":"Begin Verification","birth_day":"Date of Birth Day","birth_mon":"Date of Birth Month","birth_year":"Date of Birth Year","building":"Building Name/House Number","check_all":"Check all that apply","city":"City/Town","contact":"Contact Person & Information","contact_person":"(contact person)","cont_to_indiv":"Continue to Individual Verification","cont_to_corp":"Continue to Corporate Verification","country":"Country","country_code":"Country Code","corporate":"Corporate","corporate_explain":"Location information for secure record keeping.","corp_country":"Country of Incorporation","corp_copies":"Please Provide Copies of the Following Documents (high resolution-readable in Latin Letters and Translated Into English)","corp_day":"Incorporation Day","corp_docs":"Corporate Documents","corp_docs_types":"Accepted document types: PDF, JPG, or JPEG.","corp_mon":"Incorporation Month","corp_year":"Incorporation Year","corp_full_name":"Full Corporate Name","corp_info":"Corporate Information","corp_mem":"Corporate Members","corp_mem_explain":"Add each Director, Beneficial Owner and Shareholders owning 20% or greater.","corp_num":"Registration or Incorporation Number","corp_num_directors":"Number of directors/officers","corp_state":"State of Incorporation","corp_tax":"Company Tax / VAT ID","corp_type":"Is your business a?","corp_web":"Corporate Website","dist":"District","doc_requirements":{"both_sides_html":"You need to upload both sides (front and back) for ID cards.","face_photo_html":"The document must show a photo of your face","gov_issued_html":"The document must be issued from a government","high_res_html":"The document must have a high resolution","required":"Required","valid_doc_html":"The document must be valid: please double check expiration date"},"download_step":"Download Verification Form","fin":"Financial","fin_explain":"Information required for bank wires and withdrawals.","first":"First Name","floor":"Office Floor","gen":"Gender","good_news":"Based on your selections above, you do not need to request a verified account.","good_news2":"All of the items you selected above are already available to non-verified accounts.","good_news3_html":"Return to account page or continue with verification anyways.","id":"ID","id_bill_day":"Bill/Statement Day","id_bill_mon":"Bill/Statement Month","id_bill_year":"Bill/Statement Year","id_cards":"Identity Cards must have photo with both sides copied. Please provide official English translation for Non-Roman Letters.","id_dl":"Drivers License","id_doc_type":"Document Type","id_natl":"National ID Card","id_other":"Other Photo ID","id_pass":"Passport","id_provide":"Please provide a photo of you holding your photo ID so that both your face and your photo ID are clearly visible and free from glare.","id_lic":"Licensed Company","id_res":"Proof of Residence","id_resident":"Are you a US resident?","id_showing":"Clearly Showing Name, Address and Issue Date","id_serv":"Service Bill","id_tax":"Tax Statement","id_trans":"Official English translation required for non-Roman letters","id_two_forms":"Two forms of identification with photo are required (passport preferred)","id_util":"Utility Bill","id_us_res":"US Resident","id_sections":"Choose two sections to complete:","identity":"Identity","identity_explain":"Information for ensuring only you are capable of transacting on your account","id_selfie":"Selfie with Photo ID and Note","id_selfie2_html":"Please provide a photo of you holding your passport or photo ID. In the same picture have a reference to Bitfinex and today's date displayed — a note with the word 'Bitfinex', today's date, and your signature will do. Make sure your face will be clearly visible and that all passport details are clearly readable.","id_selfie1":"Face clearly visible","id_selfie2":"Photo ID clearly visible","id_selfie3":"Note with word \"Bitfinex\"","id_selfie4":"Note with today's date","id_selfie5":"Note with signature","id_selfie_scold1":"Please confirm that your selfie image contains each of the following items.","id_selfie_scold2_html":"Verification requests missing any of these components will not be processed.","info":"Contact Information","kyc":"Know Your Customer","kyc_explain":"Please download, sign, and upload a copy of the \"know your customer\" form as required by KYC/AML regulation.","last":"Last Name","manage_docs":"Manage Documents","manage_docs_explain":"View existing documents and add upload new ones. Useful for adding specially requested files or to replace out-of-date documents.","my_docs":"My Documents","middle":"Middle Name","monitor":"Here you can monitor your progress towards verification. Please complete each section below. After all sections are complete and all documents have been provided, the compliance team will begin to review your information and approve your account.","name":"Name","name_contact":"Name & Contact","name_contact_explain":"Information for securely identifying the account holder.","nash":"Nationality","no_docs":"No documents submitted yet.","false":"Office Number","one_reason":"Please select at least one reason why you want to request a verified account.","only_one_doc":"If you do not have two forms of photo ID, please upload a single valid form of photo ID in two sections to complete the form; a Skype video or Hangout call could be arranged with the Compliance Team once all sections of the form have been populated.","pending_invalid":"All your forms are completed, but the admins are not reviewing your account yet. It could be that some of your information was invalid.","pending_review":"All forms have been submitted. The compliance team will review your application.","please_confirm":"Please confirm that you understand all the above items before proceeding.","please_understand":"Please understand","pr_requirements":{"address_match_html":"The address has to match with the one you wrote in the online form","doc_accepted":"Documents accepted as proof of residence","doc_not_accepted_html":"Document types Not Accepted as proof of residence","gov_letter":"Letter from a government department","insurance_statement":"Insurance statement","invalid":"Documents out of date (older than 90 days)","no_date":"Documents without date","not_accepted1":"Duplicate Bank Statement","not_accepted2":"Purchase receipt or invoice of any type","not_accepted3":"Medical invoice","not_accepted4":"Tenancy agreement/rental contract","not_accepted5":"Letters from employers","not_PO_box":"Not to a P.O. Box","notary_statement":"Certified statement from a Notary","different_address":"Documents showing a different address from the one you put in the online form","different_name":"Documents not in your name","not_accepted_html":"Not Accepted as proof of residence","tax_statement":"Tax statement","utility_bill":"Utility bill (water, gas, mobile, internet...)","valid_html":"Must show a date no older than 90 days (counting from the day the verification form was completed)","your_name_html":"Must clearly highlight your name: it must be a personal proof of address"},"selfie_requirements":{"not_accepted":"Not Accepted as Selfie","not_accepted1":"Selfie in low-resolution/unclear information","not_accepted2":"Selfie without a form of ID","not_accepted3":"Selfie with a different form of ID from the uploads","not_accepted4":"Selfie missing the note","not_accepted5":"Selfie missing \"To Bitfinex\" in the note (we won't accept other exchange names as well)","not_accepted6":"Selfie missing the date in the note","not_accepted7":"Selfie missing your signature in the note","not_accepted8":"You CAN’T write ON the picture using a postproduction program like photoshop - the informations on the note but be hold physically"},"prelim":"Preliminary Questions","prelim_long":"Before beginning the verification process, please answer some preliminary questions.","proof_of_address_html":"Proof of address (a statement such as a utility bill, letter from a government dept., tax statement outside of your banking information no older than 90 days - clearly indicating your name and residential address. The document must be in Roman Lettering, or a certified English translation should be uploaded in addition to the original document.","expect_wait":"Due to high verification demand, please expect a processing time between %{time} after all forms are submitted. Monitor your email for status updates and progress reports from the compliance team.","phone_num":"Phone Number","questions_html":"Questions? Contact %{link: compliance@bitfinex.com}","reasons":"Reasons for Requesting Verification","reasons_list":{"apis":"I want full access to trading and funding APIs","crypto":"I want to deposit and/or withdraw crypto currencies with no daily limits","fiat":"I want to deposit and/or withdraw USD, Euro, other fiat currencies","lend":"I want to partake in the peer-to-peer lending market","tether":"I want to deposit and/or withdraw Tether USD₮ (or other Tether currencies)","trade":"I want to exchange and/or margin trade all Bitfinex currencies and pairs","nectar":"I want to earn Nectar tokens (NEC) for my trades as a Market Maker on Ethfinex"},"requirements_html":"Must be Issued In past 90 days. Cannot use banking information.","re_sub":"When you are ready,","resubmit":"resubmit your information","rom":"Use Roman letters","select_one":"Select one to continue","status":"Verification Status","state":"State/Province (or NA if Not Applicable)","state_prov":"State/Province","step_one":"Please download, complete all fields/sign and upload a copy of the \"know your customer\" acknowledgement form as required by AML/KYC regulations.","street":"Street Name (or NA if Not Applicable)","tel":"Telephone Number","types":{"corp":"Corporate account","corp_explain":"An account in the name of a corporation, partnership, or trust","corp_explain_html":"An account in the name of a corporation, partnership, or trust","explain":"Bitfinex has adopted an online verification procedure which will require you to complete an online questionnaire and attach certain documents as support. You will also need to download, sign and upload a declaration form confirming the accuracy of the information provided and authorizing Bitfinex to verify the information.","individual":"Individual account","individual_explain":"An account in the name of an individual","individual_explain_html":"An account in the name of an individual","message":"You are changing your account type and this will reset the verification process. Any data you previously entered will be lost.","note":"Please note:","n1":"All documents provided must be in Roman/Latin alphabet or a certified English translation is required.","n2":"All files uploaded must be in pdf, jpg or jpeg.","n3":"All fields in the following verification form are mandatory (NA for Non Applicable can be used).","n4":"To avoid possible delays, please check the correctness before submitting documents, please double check you do not send the same document twice and possibly forget one.","reqs":"Verification Requirements:","r1":"Complete online form.","r2":"Age: at least 18 years old.","r3":"Information: telephone number, email address, residential address.","r4_html":"Identification: two forms of valid government issued identification with picture; i.e., passport, national ID card, driving license, residency card, employment permit card, etc. If you do not have 2 forms of ID, you can provide only one and contact compliance@bitfinex.com to arrange for a Skype or google hangout call.","r5":"Bank Statement: clearly highlighting your name as the account holder (your first deposit to Bitfinex must come from this account).","r6":"Proof of Address: a statement not older than 3 months from a utility, service company, licensed corporation or government authority clearly indicating your name and residential address.","r7":"Corporate Documents: %{link: required documents list} (PDF).","r8":"Director Information: each director, significant shareholder and controlling officer(s) are required to provide identification. Please review the online form for complete details.","r9":"After completing the corporate verification form, an individual form for each director, significant shareholder(s) and controlling officer(s) will be required to be completed.","two_types":"Bitfinex offers two types of accounts."},"type_required":"Please select either Individual or Corporate account type.","zip":"Postal/Zip code (or NA if Not Applicable)","understand":{"time":"I understand that due to high verification demand, processing time may take %{time} after all forms are submitted.","order":"I understand that the Bitfinex verification team will only begin to review my verification request after all of my forms and documents have been submitted.","usd":"I understand that USD wire deposits and withdrawals are currently experiencing difficulties for non-institutional customers. Individual accounts will likely not have access to USD deposits and withdrawals."},"confirmation":{"cancel":"Cancel","resume":"Resume","cancel_explain":"Cancel Verification Process","resume_explain":"Resume Verification Process","trim":"Please indicate the option that applies to you","confirm_trim":"I wish to have my account still KYC verified. I understand that this may still take several weeks to complete.","cancel_trim":"Cancel the request for KYC verification.","canceled_msg":"Success! Your verification has been canceled.","resumed_msg":"Success! Your verification has been resumed."}},"validation":{"allowed_chars":"Allowed characters: letters, numbers, and .-_@","amount_less_than_fee":"Cannot withdraw less than the transaction fee (%{amount} %{ccy})","claimed_username":"This username is already taken","enter_good_pwd":"Please enter a good password","expired":"Document expired","invalid_ip_list":"Invalid list of ip addresses","invalid_crypto_amt":"Invalid crypto amount","invalid_fiat_amt":"Invalid fiat amount","invalid_fields":" invalid fields","no_older_90_days":"Must be no older than 90 days","no_spaces":"No spaces allowed","eth_address":"Address must start with 0x","min_wd_amt":"Min %{amount}","no_chase":"Sorry, JP Morgan Chase cannot currently be used for fiat currency wires on our platform. Please provide a statement from a different financial institution.","no_stanchar":"Sorry, Standard Chartered cannot currently be used for fiat currency wires on our platform. Please provide a statement from a different financial institution.","bank_sanctioned":"Apologies, it appears this bank is on a Sanctions List. Please provide a statement from a different financial institution.","no_usa":"Sorry, we are currently not processing verification requests for U.S. individual customer accounts.","normal_chars":"Standard Latin characters (eg., 'A' - 'Z') and numbers only.","number_between":"Enter a number between %{MIN} and %{MAX}"},"wallets":{"trading":"Margin","deposit":"Funding","exchange":"Exchange","conversion":"Conversion"},"websockets":{"attempting":"WebSocket connection issues. Attempting to reconnect in ","back":"Successfully reconnected to Websocket.","connected":"Websocket connected","real_time":"Real-time","limited":"Limited connectivity","polling":"Polling","private_fail":"Failed to connect to WebSocket private data after several attempts. Please try refreshing the page.","resync_explain":"WebSockets is resyncing. This only affects the display; All trading and functionality will remain uninterrupted. Resyncing takes 5-30 seconds.","resync_complete":"WebSockets resync complete.","time":{"five":"5 seconds","ten":"10 seconds","thirty":"30 seconds","sixty":"60 seconds"}},"withdraw":{"title":"Withdraw","confirm":"Confirm Withdrawal","express_confirm":"You requested an Express option which implies a fee of 1%. Do you confirm?","conditions1":"I have read, understand, and agree to the","conditions2":"conditions for auto-withdrawal processing","processing_notice":"Processing. If still processing after 24 hours please contact support from bitfinex.com/support.","no_payment_id_info_html":"In some unusual situations a %{type} is not needed when withdrawing %{ccy}.
Please do not check this box unless you are CERTAIN you do not need a %{type}.","tx_fee_explain":"There is a small network fee for sending a %{ccy} transaction.
The transaction fee is updated periodically based on %{ccy} network activity in order to achieve reasonable transaction confirmation times.","tx_fee_offchain":"Normally there is a small network fee for sending a %{ccy} transaction. However, this withdrawal seems to be to an address that belongs to a Bitfinex user. This transaction can be completed with no transaction fee.","take_fee_amt":"Take fee from amount","take_fee_amt_explain":"If selected, your withdrawal amount will include the fee. For example, if the withdraw amount is 1.5 and the fee is 0.001, your wallet will be debited 1.5, and you will receive 1.499 at the withdrawal address.
If unchecked, your wallet will be debited your withdrawal amount plus the fee (1.501), and you will receive the full 1.5 at the withdrawal address.","whitelist_only":{"title":"Why do I need to whitelist an address to withdraw %{currency}?","info":"The design of the token is such that only Ethereum addresses which have been approved to hold the tokens are able to send and receive them. This means that before being able to transfer them you must ensure your address has been added to the list of those which are able to hold the tokens.","cannot_withdraw_warning_html":"Your account is not registered on the Market Maker Loyalty Program. You need to first verify your account and accept the terms to withdraw NEC. Please sign up.","new":"If you have not previously added an address to the whitelist for this token, it will be added automatically when you request a withdrawal. You will then be able to transfer to and from this address on the Ethereum blockchain.","create_new":"Whitelist A New Address","warning":"Please be aware that once your tokens are withdrawn you wil only be able to transfer them to other whitelisted addresses. This may result in unexpected behaviour when interacting with Ethereum contracts."}},"deposit":{"iota0":"Understanding IOTA, Wallets, Nodes, and Tangle","iota1":"IOTA is different than other major cryptocurrencies in several important ways.","iota2":"Before using IOTA on Bitfinex, please review the following critical items.","iota3":"Select each checkbox below to indicate that you have read, agree, and understand.","iota4":"Learn more","iota5":"%{link: An introduction to IOTA}","iota6":"%{link: IOTA Node/Wallet Types}","iota7":"IOTA Technicals and Connection Help","iota8":"Connect your light wallet to %{address}","iota_warn0_title":"The golden rule","iota_warn0_desc":"In IOTA the security of a transaction decreases when you send tokens more than once from the same address. To ensure that you are safe, you should always generate a new address (by going into the \"Receive\" section of the GUI and attaching the new address to the Tangle) for each transfer that is made.","iota_warn1_title":"Sticky sessions","iota_warn1_desc":"IP address is used to serve the wallet with the same server, whenever possible. This means that you can log in/log out of the wallet and see the balance, history, and addresses as usual. However, if your IP changes it is likely that the load balancing server will direct you to a different server (to keep work balance between all servers). As it is the nature of the Tangle that any node sees it from a different perspective, your balance and history might not be displayed completely. To resolve this, go to the \"Receive\"-section of your wallet and generate addresses until everything gets displayed correctly.","iota_warn2_title":"Snapshots","iota_warn2_desc":"After a snapshot, the Database of every full node (and with that the database on every light wallet server) gets deleted. Therefore, your history and balance disappeared. You can get your balance back by simply going into the \"Receive\"-section of your wallet and generate addresses until you see your correct balance again (your wallet will re-generate every address that you used pre-snapshot again).","iota_warn3_title":"New releases","iota_warn3_desc":"After a new release, it might be required by the foundation to delete the database of each full node. The same issue with the same solution as seen in point #2 will occur.","iota_warn4_title":"Status reports","iota_warn4_desc":"Follow %{link: @IOTASupport} on Twitter for status reports of the service.","iota_warn5_title":"Disclaimer","iota_warn5_desc":"Neither Bitfinex nor the other parties involved can be made responsible for potential problems/losses of any way. The service is provided \"as is\".","no_decimals":"%{ccy} withdrawal amounts must be whole values; no decimals","disclaimer1":"This banking information is being provided to you for purposes of contributing good faith funding to your account on Bitfinex. At all times, you are subject to our Terms of Service.","disclaimer2":"This banking information is commercially sensitive and confidential. You should be very careful with this information. You are asked to keep this information to yourself and to not share it except with your financial institution. Divulging this information could damage not just yourself and Bitfinex, but the entire digital token ecosystem. Accordingly, you are cautioned that there may be serious negative effects associated with this information becoming public.","disclaimer3":"Pursuant to the Terms of Service, Bitfinex is not liable for or responsible for the actions of third parties.","disclaimer4":"I agree not to make this information public and that I have read and understood the above."},"sound":{"options":"Sound Options","preview":"Preview","order_full_html":"Play an audio cue when one of your orders is fully executed (sound demos).","order_partial_html":"Play an audio cue when one of your orders is partially executed (sound demos).","public_trades_html":"Play an audio cue on every public trade. The sound will only play if you are on the Exchange or Margin Trading page and if the trade is for the pair you are currently viewing (eg. A LTC/USD trade will not trigger the sound if you are on /t/BTC:USD) (sound demos)."},"error_boundary":{"component_error":"Component error","suggestion_text":"An unexpected error occurred. Please refresh the page or contact support if the issue persists","no_stack_trace":"No stack trace available"},"proof":{"head_menu":"Proof & Ballot","title":"Proof of Liabilities and Voting"},"ethfinex":{"for_feedback_and_suggestions":"For feedback and suggestions","for_business_enquires":"For any other business enquires","features":{"api_desc":"Ethfinex's API are designed to offer an easy and efficient way to build digital asset trading applications and tools: trade whilst keeping custody of your funds, create your own charts, monitor and edit your orders and positions, track your trading history and wallets movements. Discover all the possibilities.","api_read_more":"View Ethfinex API Documentation","exchange_trading":"Exchange and Trading","exchange_explain":"Ethfinex is the world’s first hybrid decentralised exchange, allowing users to choose between trustless on-chain settlement, or high speed execution and professional APIs, whilst enjoying high liquidity in both cases. Users can trade a wide range of ERC20 tokens against ETH or USD. We also boast a suite of order types, advanced charting, and 3.3x leveraged margin trading thanks to our peer to peer funding market.","analysis":"Analysis","analysis_explain":"Our professional discussion boards provide a community hub for analysis and discussion of ERC20 tokens. Ratings based on user consensus, the latest news, and expert opinions help filter out the quality projects and keep you informed about developments.","margin_trading":"Margin Trading","margin_trading_explain":"Ethfinex allows for users to trade with up to 3.3x leverage by receiving funding from the peer to peer margin funding platform. Users can enter an order to borrow the desired amount of funding at the rate and duration of their choice, or they can simply open a position and Ethfinex will take out funding for them at the best available rate at that time. For more information on our Margin Trading feature, please go to How It Works.","margin_financing":"Marging Financing","margin_financing_explain":"The margin funding market provides a way to earn interest on Euro, Japanese Yen, US Dollar, and Ethereum by providing funding to traders wanting to trade with leverage. Users can offer funding at the rate and duration of their choice, or they can simply lend at the FRR (Flash Return Rate). In addition users can use our Auto-Renew feature to renew their offers automatically upon expiry. For more information on our Margin Funding feature, please go to How It Works.","remote_portals":"Trustless Access","remote_portals_explain":"Ethfinex Trustless allows customers to access the liquid Ethfinex centralised order book without first depositing their funds on the exchange. For the first time in the industry, customers can have the experience of using a centralised exchange but with full control and custody of their funds. Non-custodial trading is also possible directly via API.","remote_portals_try_html":" Try it now.","nectar_tokens":"Nectar tokens","nectar_tokens_explain1":"Nectar tokens (NEC) are given for free to token market makers in proportion to the volume of trades they participate in on the exchange. The tokens are issued on a 28 day basis according to trading volumes.","nectar_tokens_explain2":"Owners of the tokens will be able to use them to claim loyalty rewards from the total monthly exchange fees, and advise on the future governance of Ethfinex. Initially the tokens will be majority owned by Ethfinex, but gradually as more tokens are issued the ownership of them will therefore become decentralised so that our customers will have a stake in Ethfinex.","discussion_boards":"Discussion Boards","discussion_boards_explain":"Post and read structured analysis and discussion about upcoming token listings or tradable tokens. Experts, and those in the community most familiar with each project, will be able to share their opinions and contribute to separating the wheat from the chaff. The discussion boards are split by token, and structured to encourage professional debate.","open_venue":"Open Venue","open_venue_explain":"Any project launching an ERC20 token can set-up it’s own discussion board, to build a community and keep users up to date with their development progress. This means that all tokens have a fair chance to reach new users, not just those with large marketing budgets. Project admins can respond to questions, post updates, and apply to open their token listing to Ethfinex users.","token_ratings":"Token Ratings","token_ratings_explain":"Every token will have a crowdsourced quality rating based on user consensus. These ratings will be across several dimensions including Whitepaper, Tech and Concept. Filtering and aiding discovery of extremely high quality tokens is becoming increasingly important as the volume of new tokens being launched grows exponentially.","trusted_partners":"Trusted Partners","trusted_partners_explain":"Ethfinex has built a network of trusted partner organisations, such as SICOS and CoFound.it , who select, support and train teams before and during their crowdsales. Since our partners work with only the highest quality legally compliant tokens, Ethfinex can offer our users the ability to contribute directly to these sales, and afterwards to make the tokens immediately available for trading.","guaranteed_contribution":"Guaranteed Contribution","guaranteed_contribution_explain":"Guaranteed contribution to certain token listings is available to Ethfinex users as part of a whitelist. You can opt to contribute using your Ethfinex balance in any currency, and it will be automatically converted to Ethereum to be sent to the contract during the conversion period.","track_identify":"Track and Identify","track_identify_explain":"As well as making use of the information and ratings on the discussion boards, our token listing dashboard allows you to find highly rated projects and set alerts about their contribution periods. Never miss a sale, and pre-register to contribute from your Ethfinex balance."},"security":{"industry_best_practices":"Industry Best Practices","industry_best_practices_explain":"Ethfinex’s security is based on the significant expertise gained by Bitfinex’s over it’s 4 year experience operating as one of the oldest cryptocurrency exchanges. As well as organizational and systems security best practices, there are 2 central themes for Ethfinex’s cryptocurrency specific security:","crypto_offline_storage":"Cryptocurrency Offline Storage","crypto_offline_storage_desc":"The overwhelming majority of system funds are stored in offline, ‘cold’ wallets. Only approximately 0.5% of crypto assets are accessible in ‘hot’ wallets for day-to-day platform operations. As an added protection, the cold wallets are not available from the platform or the platform servers. The funds in offline cold storage require manual intervention by several members of our management to access.","user_account_protection":"User Account Protection","user_account_protection_desc1":"Some of the security measures highlighted below are in place by default, and others can be activated based on the security level you need. Please visit","user_account_protection_desc2":"to check the security status of your account and see recommendations.","2fa":"Two-factor authentication (2FA)","verification_tools":"Advanced verification tools to monitor suspicious behaviour and the integrity of your account","withdrawals_protection":"Withdrawals protection","api_key_permissions":"Advanced API key permissions","open_pgp":"Email Encryption with OpenPGP","more_security_info":"More information on Security best practices is available at our","go_trustless":"Go Trustless","go_trustless_desc1":"In the spirit of achieving ultimate security and transparency for users, and minimising every possible attack surface, the ultimate aim of Ethfinex is to be decentralised, settling transactions using blockchain based technology.","go_trustless_desc2":"Currently a first step towards this is goal is available via Ethfinex Trustless, allowing you to choose to take your security into your own hands, instead of trusting our security systems with your funds.","go_trustless_desc3":"Ethfinex Trustless allows you to view the Ethfinex order book and trade without needing to first deposit your funds to your Ethfinex account. The portal operates using decentralised exchange protocols, allowing the trades to be completed by smart contracts on the Ethereum blockchain. The current implementation uses the 0x protocol, but in the future this will be technology agnostic and opened up to allow any other decentralised exchange protocol to connect with Ethfinex.","go_trustless_desc4":"Ethfinex Trustless gives you a secure and private trading experience without compromising on transaction speed."},"api_docs":{"intro_explain1":"The Ethfinex Rest and Websocket APIs use the same endpoints as the","intro_explain2":"This allows seamless compatibility for any application or website already interacting with the Bitfinex APIs, as well as allow the reuse of any related open source libraries."}}};
\ No newline at end of file
diff --git a/public/assets/ABS-alt.svg b/public/assets/ABS-alt.svg
deleted file mode 100644
index 1d3be6f96..000000000
--- a/public/assets/ABS-alt.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
diff --git a/public/assets/ABS.svg b/public/assets/ABS.svg
deleted file mode 100644
index 1d3be6f96..000000000
--- a/public/assets/ABS.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
diff --git a/public/assets/ADD-alt.svg b/public/assets/ADD-alt.svg
deleted file mode 100644
index 29f477b22..000000000
--- a/public/assets/ADD-alt.svg
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
diff --git a/public/assets/ADD.svg b/public/assets/ADD.svg
deleted file mode 100644
index 29f477b22..000000000
--- a/public/assets/ADD.svg
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
diff --git a/public/assets/AGI-alt.svg b/public/assets/AGI-alt.svg
deleted file mode 100644
index 561582a45..000000000
--- a/public/assets/AGI-alt.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
diff --git a/public/assets/AGI.svg b/public/assets/AGI.svg
deleted file mode 100644
index 561582a45..000000000
--- a/public/assets/AGI.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
diff --git a/public/assets/AID-alt.svg b/public/assets/AID-alt.svg
deleted file mode 100644
index 30c1a5d7f..000000000
--- a/public/assets/AID-alt.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
diff --git a/public/assets/AID.svg b/public/assets/AID.svg
deleted file mode 100644
index 30c1a5d7f..000000000
--- a/public/assets/AID.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
diff --git a/public/assets/AIO-alt.svg b/public/assets/AIO-alt.svg
deleted file mode 100644
index 2a1c8806d..000000000
--- a/public/assets/AIO-alt.svg
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
diff --git a/public/assets/AIO.svg b/public/assets/AIO.svg
deleted file mode 100644
index 2a1c8806d..000000000
--- a/public/assets/AIO.svg
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
diff --git a/public/assets/ANT-alt.svg b/public/assets/ANT-alt.svg
deleted file mode 100644
index b51ea941e..000000000
--- a/public/assets/ANT-alt.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
diff --git a/public/assets/ANT.svg b/public/assets/ANT.svg
deleted file mode 100644
index b51ea941e..000000000
--- a/public/assets/ANT.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
diff --git a/public/assets/ATD-alt.svg b/public/assets/ATD-alt.svg
deleted file mode 100644
index 29f477b22..000000000
--- a/public/assets/ATD-alt.svg
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
diff --git a/public/assets/ATD.svg b/public/assets/ATD.svg
deleted file mode 100644
index 29f477b22..000000000
--- a/public/assets/ATD.svg
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
diff --git a/public/assets/ATM-alt.svg b/public/assets/ATM-alt.svg
deleted file mode 100644
index 3dbbe0bb5..000000000
--- a/public/assets/ATM-alt.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
diff --git a/public/assets/ATM.svg b/public/assets/ATM.svg
deleted file mode 100644
index 3dbbe0bb5..000000000
--- a/public/assets/ATM.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
diff --git a/public/assets/AUC-alt.svg b/public/assets/AUC-alt.svg
deleted file mode 100644
index 0db3e9cdc..000000000
--- a/public/assets/AUC-alt.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
diff --git a/public/assets/AUC.svg b/public/assets/AUC.svg
deleted file mode 100644
index 0db3e9cdc..000000000
--- a/public/assets/AUC.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
diff --git a/public/assets/AVT-alt.svg b/public/assets/AVT-alt.svg
deleted file mode 100644
index 3cf3b4062..000000000
--- a/public/assets/AVT-alt.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/public/assets/AVT.svg b/public/assets/AVT.svg
deleted file mode 100644
index 3cf3b4062..000000000
--- a/public/assets/AVT.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/public/assets/BANK.svg b/public/assets/BANK.svg
deleted file mode 100644
index 8217ee179..000000000
--- a/public/assets/BANK.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
\ No newline at end of file
diff --git a/public/assets/BAT-alt.svg b/public/assets/BAT-alt.svg
deleted file mode 100644
index 643a1071e..000000000
--- a/public/assets/BAT-alt.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
diff --git a/public/assets/BAT.svg b/public/assets/BAT.svg
deleted file mode 100644
index 643a1071e..000000000
--- a/public/assets/BAT.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
diff --git a/public/assets/BBN-alt.svg b/public/assets/BBN-alt.svg
deleted file mode 100644
index 8db0406c7..000000000
--- a/public/assets/BBN-alt.svg
+++ /dev/null
@@ -1,395 +0,0 @@
-
-
-
diff --git a/public/assets/BBN.svg b/public/assets/BBN.svg
deleted file mode 100644
index 8db0406c7..000000000
--- a/public/assets/BBN.svg
+++ /dev/null
@@ -1,395 +0,0 @@
-
-
-
diff --git a/public/assets/BCC-alt.svg b/public/assets/BCC-alt.svg
deleted file mode 100644
index 3efb71857..000000000
--- a/public/assets/BCC-alt.svg
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
diff --git a/public/assets/BCC.svg b/public/assets/BCC.svg
deleted file mode 100644
index 8bc68c7e6..000000000
--- a/public/assets/BCC.svg
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
diff --git a/public/assets/BCH-alt.svg b/public/assets/BCH-alt.svg
deleted file mode 100644
index 2c5dc18bc..000000000
--- a/public/assets/BCH-alt.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
diff --git a/public/assets/BCH.svg b/public/assets/BCH.svg
deleted file mode 100644
index 2c5dc18bc..000000000
--- a/public/assets/BCH.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
diff --git a/public/assets/BCI-alt.svg b/public/assets/BCI-alt.svg
deleted file mode 100644
index e7220204a..000000000
--- a/public/assets/BCI-alt.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
diff --git a/public/assets/BCI.svg b/public/assets/BCI.svg
deleted file mode 100644
index e7220204a..000000000
--- a/public/assets/BCI.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
diff --git a/public/assets/BCU-alt.svg b/public/assets/BCU-alt.svg
deleted file mode 100644
index 07c05f26b..000000000
--- a/public/assets/BCU-alt.svg
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
diff --git a/public/assets/BCU.svg b/public/assets/BCU.svg
deleted file mode 100644
index 04eb5f395..000000000
--- a/public/assets/BCU.svg
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
diff --git a/public/assets/BFT-alt.svg b/public/assets/BFT-alt.svg
deleted file mode 100644
index be2a349ac..000000000
--- a/public/assets/BFT-alt.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
diff --git a/public/assets/BFT.svg b/public/assets/BFT.svg
deleted file mode 100644
index be2a349ac..000000000
--- a/public/assets/BFT.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
diff --git a/public/assets/BFX-alt.svg b/public/assets/BFX-alt.svg
deleted file mode 100644
index 6fa5d1de2..000000000
--- a/public/assets/BFX-alt.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
\ No newline at end of file
diff --git a/public/assets/BNT-alt.svg b/public/assets/BNT-alt.svg
deleted file mode 100644
index e906af38a..000000000
--- a/public/assets/BNT-alt.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/public/assets/BNT.svg b/public/assets/BNT.svg
deleted file mode 100644
index e906af38a..000000000
--- a/public/assets/BNT.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/public/assets/BT1-alt.svg b/public/assets/BT1-alt.svg
deleted file mode 100644
index 29f477b22..000000000
--- a/public/assets/BT1-alt.svg
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
diff --git a/public/assets/BT1.svg b/public/assets/BT1.svg
deleted file mode 100644
index 29f477b22..000000000
--- a/public/assets/BT1.svg
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
diff --git a/public/assets/BT2-alt.svg b/public/assets/BT2-alt.svg
deleted file mode 100644
index 29f477b22..000000000
--- a/public/assets/BT2-alt.svg
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
diff --git a/public/assets/BT2.svg b/public/assets/BT2.svg
deleted file mode 100644
index 29f477b22..000000000
--- a/public/assets/BT2.svg
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
diff --git a/public/assets/BTC-alt.svg b/public/assets/BTC-alt.svg
deleted file mode 100644
index c5d55f412..000000000
--- a/public/assets/BTC-alt.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
diff --git a/public/assets/BTC.svg b/public/assets/BTC.svg
deleted file mode 100644
index ddab8ed63..000000000
--- a/public/assets/BTC.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-
diff --git a/public/assets/BTG-alt.svg b/public/assets/BTG-alt.svg
deleted file mode 100644
index 6afbc991c..000000000
--- a/public/assets/BTG-alt.svg
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
diff --git a/public/assets/BTG.svg b/public/assets/BTG.svg
deleted file mode 100644
index 6afbc991c..000000000
--- a/public/assets/BTG.svg
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
diff --git a/public/assets/CBT-alt.svg b/public/assets/CBT-alt.svg
deleted file mode 100644
index 1cfab5bd2..000000000
--- a/public/assets/CBT-alt.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
diff --git a/public/assets/CBT.svg b/public/assets/CBT.svg
deleted file mode 100644
index 1cfab5bd2..000000000
--- a/public/assets/CBT.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
diff --git a/public/assets/CFI-alt.svg b/public/assets/CFI-alt.svg
deleted file mode 100644
index 5778d968b..000000000
--- a/public/assets/CFI-alt.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
diff --git a/public/assets/CFI.svg b/public/assets/CFI.svg
deleted file mode 100644
index 5778d968b..000000000
--- a/public/assets/CFI.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
diff --git a/public/assets/CND-alt.svg b/public/assets/CND-alt.svg
deleted file mode 100644
index e0ad6ca71..000000000
--- a/public/assets/CND-alt.svg
+++ /dev/null
@@ -1,100 +0,0 @@
-
-
-
diff --git a/public/assets/CND.svg b/public/assets/CND.svg
deleted file mode 100644
index e0ad6ca71..000000000
--- a/public/assets/CND.svg
+++ /dev/null
@@ -1,100 +0,0 @@
-
-
-
diff --git a/public/assets/CTX-alt.svg b/public/assets/CTX-alt.svg
deleted file mode 100644
index 29f477b22..000000000
--- a/public/assets/CTX-alt.svg
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
diff --git a/public/assets/CTX.svg b/public/assets/CTX.svg
deleted file mode 100644
index 29f477b22..000000000
--- a/public/assets/CTX.svg
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
diff --git a/public/assets/DAD-alt.svg b/public/assets/DAD-alt.svg
deleted file mode 100644
index 37930422c..000000000
--- a/public/assets/DAD-alt.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
diff --git a/public/assets/DAD.svg b/public/assets/DAD.svg
deleted file mode 100644
index 37930422c..000000000
--- a/public/assets/DAD.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
diff --git a/public/assets/DAI-alt.svg b/public/assets/DAI-alt.svg
deleted file mode 100644
index 6fb7256c5..000000000
--- a/public/assets/DAI-alt.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
diff --git a/public/assets/DAI.svg b/public/assets/DAI.svg
deleted file mode 100644
index 6fb7256c5..000000000
--- a/public/assets/DAI.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
diff --git a/public/assets/DAT-alt.svg b/public/assets/DAT-alt.svg
deleted file mode 100644
index 20957c369..000000000
--- a/public/assets/DAT-alt.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
diff --git a/public/assets/DAT.svg b/public/assets/DAT.svg
deleted file mode 100644
index 20957c369..000000000
--- a/public/assets/DAT.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
diff --git a/public/assets/DGX-alt.svg b/public/assets/DGX-alt.svg
deleted file mode 100644
index 423c492d6..000000000
--- a/public/assets/DGX-alt.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
diff --git a/public/assets/DGX.svg b/public/assets/DGX.svg
deleted file mode 100644
index 423c492d6..000000000
--- a/public/assets/DGX.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
diff --git a/public/assets/DSH-alt.svg b/public/assets/DSH-alt.svg
deleted file mode 100644
index 2b737e4b6..000000000
--- a/public/assets/DSH-alt.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
diff --git a/public/assets/DSH.svg b/public/assets/DSH.svg
deleted file mode 100644
index df1f36541..000000000
--- a/public/assets/DSH.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/public/assets/DTA-alt.svg b/public/assets/DTA-alt.svg
deleted file mode 100644
index 79574a849..000000000
--- a/public/assets/DTA-alt.svg
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
diff --git a/public/assets/DTA.svg b/public/assets/DTA.svg
deleted file mode 100644
index 79574a849..000000000
--- a/public/assets/DTA.svg
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
diff --git a/public/assets/DTH-alt.svg b/public/assets/DTH-alt.svg
deleted file mode 100644
index 2e285ec24..000000000
--- a/public/assets/DTH-alt.svg
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
diff --git a/public/assets/DTH.svg b/public/assets/DTH.svg
deleted file mode 100644
index 2e285ec24..000000000
--- a/public/assets/DTH.svg
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
diff --git a/public/assets/EDO-alt.svg b/public/assets/EDO-alt.svg
deleted file mode 100644
index f39368a3f..000000000
--- a/public/assets/EDO-alt.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
diff --git a/public/assets/EDO.svg b/public/assets/EDO.svg
deleted file mode 100644
index f39368a3f..000000000
--- a/public/assets/EDO.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
diff --git a/public/assets/ELF-alt.svg b/public/assets/ELF-alt.svg
deleted file mode 100644
index 0993b1997..000000000
--- a/public/assets/ELF-alt.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
diff --git a/public/assets/ELF.svg b/public/assets/ELF.svg
deleted file mode 100644
index 0993b1997..000000000
--- a/public/assets/ELF.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
diff --git a/public/assets/EOS-alt.svg b/public/assets/EOS-alt.svg
deleted file mode 100644
index 1cb71e8d5..000000000
--- a/public/assets/EOS-alt.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
diff --git a/public/assets/EOS.svg b/public/assets/EOS.svg
deleted file mode 100644
index 48279a4dc..000000000
--- a/public/assets/EOS.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
diff --git a/public/assets/ESS-alt.svg b/public/assets/ESS-alt.svg
deleted file mode 100644
index a2443101c..000000000
--- a/public/assets/ESS-alt.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
diff --git a/public/assets/ESS.svg b/public/assets/ESS.svg
deleted file mode 100644
index a2443101c..000000000
--- a/public/assets/ESS.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
diff --git a/public/assets/ETC-alt.svg b/public/assets/ETC-alt.svg
deleted file mode 100644
index 1a0dc8777..000000000
--- a/public/assets/ETC-alt.svg
+++ /dev/null
@@ -1,27 +0,0 @@
-
\ No newline at end of file
diff --git a/public/assets/ETH-alt.svg b/public/assets/ETH-alt.svg
deleted file mode 100644
index 68fa4cfc9..000000000
--- a/public/assets/ETH-alt.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
diff --git a/public/assets/ETH.svg b/public/assets/ETH.svg
deleted file mode 100644
index c535daab8..000000000
--- a/public/assets/ETH.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
diff --git a/public/assets/ETP-alt.svg b/public/assets/ETP-alt.svg
deleted file mode 100644
index e659c930a..000000000
--- a/public/assets/ETP-alt.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
diff --git a/public/assets/ETP.svg b/public/assets/ETP.svg
deleted file mode 100644
index e659c930a..000000000
--- a/public/assets/ETP.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
diff --git a/public/assets/EUR-alt.svg b/public/assets/EUR-alt.svg
deleted file mode 100644
index 85b2af9f7..000000000
--- a/public/assets/EUR-alt.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
diff --git a/public/assets/EUX-alt.svg b/public/assets/EUX-alt.svg
deleted file mode 100644
index c6cae6f59..000000000
--- a/public/assets/EUX-alt.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
diff --git a/public/assets/EUX.svg b/public/assets/EUX.svg
deleted file mode 100644
index c6cae6f59..000000000
--- a/public/assets/EUX.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
diff --git a/public/assets/EVT-alt.svg b/public/assets/EVT-alt.svg
deleted file mode 100644
index 3082e4f46..000000000
--- a/public/assets/EVT-alt.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
diff --git a/public/assets/EVT.svg b/public/assets/EVT.svg
deleted file mode 100644
index 3082e4f46..000000000
--- a/public/assets/EVT.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
diff --git a/public/assets/FSN-alt.svg b/public/assets/FSN-alt.svg
deleted file mode 100644
index 407e9f043..000000000
--- a/public/assets/FSN-alt.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/public/assets/FSN.svg b/public/assets/FSN.svg
deleted file mode 100644
index 407e9f043..000000000
--- a/public/assets/FSN.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/public/assets/FUN-alt.svg b/public/assets/FUN-alt.svg
deleted file mode 100644
index f3d447a49..000000000
--- a/public/assets/FUN-alt.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
diff --git a/public/assets/FUN.svg b/public/assets/FUN.svg
deleted file mode 100644
index f3d447a49..000000000
--- a/public/assets/FUN.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
diff --git a/public/assets/GBP-alt.svg b/public/assets/GBP-alt.svg
deleted file mode 100644
index 63882c2c6..000000000
--- a/public/assets/GBP-alt.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
diff --git a/public/assets/GBP.svg b/public/assets/GBP.svg
deleted file mode 100644
index 63882c2c6..000000000
--- a/public/assets/GBP.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
diff --git a/public/assets/GNT-alt.svg b/public/assets/GNT-alt.svg
deleted file mode 100644
index 16dc73906..000000000
--- a/public/assets/GNT-alt.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
diff --git a/public/assets/GNT.svg b/public/assets/GNT.svg
deleted file mode 100644
index 16dc73906..000000000
--- a/public/assets/GNT.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
diff --git a/public/assets/HOT-alt.svg b/public/assets/HOT-alt.svg
deleted file mode 100644
index f2fc6fa8a..000000000
--- a/public/assets/HOT-alt.svg
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
diff --git a/public/assets/HOT.svg b/public/assets/HOT.svg
deleted file mode 100644
index f2fc6fa8a..000000000
--- a/public/assets/HOT.svg
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
diff --git a/public/assets/IFX-alt.svg b/public/assets/IFX-alt.svg
deleted file mode 100644
index db60ec292..000000000
--- a/public/assets/IFX-alt.svg
+++ /dev/null
@@ -1,26 +0,0 @@
-
diff --git a/public/assets/IFX.svg b/public/assets/IFX.svg
deleted file mode 100644
index a45f4a1d6..000000000
--- a/public/assets/IFX.svg
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
diff --git a/public/assets/IOS-alt.svg b/public/assets/IOS-alt.svg
deleted file mode 100644
index 68634403a..000000000
--- a/public/assets/IOS-alt.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/public/assets/IOS.svg b/public/assets/IOS.svg
deleted file mode 100644
index 68634403a..000000000
--- a/public/assets/IOS.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/public/assets/IOT-alt.svg b/public/assets/IOT-alt.svg
deleted file mode 100644
index 5a58000c8..000000000
--- a/public/assets/IOT-alt.svg
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
diff --git a/public/assets/IQX-alt.svg b/public/assets/IQX-alt.svg
deleted file mode 100644
index a7a0dd2b8..000000000
--- a/public/assets/IQX-alt.svg
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
diff --git a/public/assets/IQX.svg b/public/assets/IQX.svg
deleted file mode 100644
index a7a0dd2b8..000000000
--- a/public/assets/IQX.svg
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
diff --git a/public/assets/JPY-alt.svg b/public/assets/JPY-alt.svg
deleted file mode 100644
index afd77f5f0..000000000
--- a/public/assets/JPY-alt.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
diff --git a/public/assets/KNC-alt.svg b/public/assets/KNC-alt.svg
deleted file mode 100644
index ed6ed4c62..000000000
--- a/public/assets/KNC-alt.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
diff --git a/public/assets/KNC.svg b/public/assets/KNC.svg
deleted file mode 100644
index ed6ed4c62..000000000
--- a/public/assets/KNC.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
diff --git a/public/assets/LRC-alt.svg b/public/assets/LRC-alt.svg
deleted file mode 100644
index d53272564..000000000
--- a/public/assets/LRC-alt.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/public/assets/LRC.svg b/public/assets/LRC.svg
deleted file mode 100644
index d53272564..000000000
--- a/public/assets/LRC.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/public/assets/LTC-alt.svg b/public/assets/LTC-alt.svg
deleted file mode 100644
index 3d15f574a..000000000
--- a/public/assets/LTC-alt.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-
diff --git a/public/assets/LTC.svg b/public/assets/LTC.svg
deleted file mode 100644
index d52715cfb..000000000
--- a/public/assets/LTC.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
diff --git a/public/assets/LYM-alt.svg b/public/assets/LYM-alt.svg
deleted file mode 100644
index 75099b3ca..000000000
--- a/public/assets/LYM-alt.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
diff --git a/public/assets/LYM.svg b/public/assets/LYM.svg
deleted file mode 100644
index 75099b3ca..000000000
--- a/public/assets/LYM.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
diff --git a/public/assets/MAN-alt.svg b/public/assets/MAN-alt.svg
deleted file mode 100644
index e6297278b..000000000
--- a/public/assets/MAN-alt.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
diff --git a/public/assets/MAN.svg b/public/assets/MAN.svg
deleted file mode 100644
index e6297278b..000000000
--- a/public/assets/MAN.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
diff --git a/public/assets/MIT-alt.svg b/public/assets/MIT-alt.svg
deleted file mode 100644
index 4d35be87a..000000000
--- a/public/assets/MIT-alt.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
diff --git a/public/assets/MIT.svg b/public/assets/MIT.svg
deleted file mode 100644
index 4d35be87a..000000000
--- a/public/assets/MIT.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
diff --git a/public/assets/MKR-alt.svg b/public/assets/MKR-alt.svg
deleted file mode 100644
index b18bb943a..000000000
--- a/public/assets/MKR-alt.svg
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
diff --git a/public/assets/MKR.svg b/public/assets/MKR.svg
deleted file mode 100644
index b18bb943a..000000000
--- a/public/assets/MKR.svg
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
diff --git a/public/assets/MNA-alt.svg b/public/assets/MNA-alt.svg
deleted file mode 100644
index 7983fbce2..000000000
--- a/public/assets/MNA-alt.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
diff --git a/public/assets/MNA.svg b/public/assets/MNA.svg
deleted file mode 100644
index 7983fbce2..000000000
--- a/public/assets/MNA.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
diff --git a/public/assets/MTN-alt.svg b/public/assets/MTN-alt.svg
deleted file mode 100644
index fb117d2ca..000000000
--- a/public/assets/MTN-alt.svg
+++ /dev/null
@@ -1,146 +0,0 @@
-
-
-
diff --git a/public/assets/MTN.svg b/public/assets/MTN.svg
deleted file mode 100644
index fb117d2ca..000000000
--- a/public/assets/MTN.svg
+++ /dev/null
@@ -1,146 +0,0 @@
-
-
-
diff --git a/public/assets/MTO-alt.svg b/public/assets/MTO-alt.svg
deleted file mode 100644
index 29f477b22..000000000
--- a/public/assets/MTO-alt.svg
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
diff --git a/public/assets/MTO.svg b/public/assets/MTO.svg
deleted file mode 100644
index 29f477b22..000000000
--- a/public/assets/MTO.svg
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
diff --git a/public/assets/NCA-alt.svg b/public/assets/NCA-alt.svg
deleted file mode 100644
index 120d2307f..000000000
--- a/public/assets/NCA-alt.svg
+++ /dev/null
@@ -1,706 +0,0 @@
-
-
-
diff --git a/public/assets/NCA.svg b/public/assets/NCA.svg
deleted file mode 100644
index 120d2307f..000000000
--- a/public/assets/NCA.svg
+++ /dev/null
@@ -1,706 +0,0 @@
-
-
-
diff --git a/public/assets/NEC-alt.svg b/public/assets/NEC-alt.svg
deleted file mode 100644
index 28effe8ec..000000000
--- a/public/assets/NEC-alt.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
diff --git a/public/assets/NEC.svg b/public/assets/NEC.svg
deleted file mode 100644
index 28effe8ec..000000000
--- a/public/assets/NEC.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
diff --git a/public/assets/NEO-alt.svg b/public/assets/NEO-alt.svg
deleted file mode 100644
index 443b84241..000000000
--- a/public/assets/NEO-alt.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/public/assets/NEO.svg b/public/assets/NEO.svg
deleted file mode 100644
index 443b84241..000000000
--- a/public/assets/NEO.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/public/assets/NIO-alt.svg b/public/assets/NIO-alt.svg
deleted file mode 100644
index 7955919dc..000000000
--- a/public/assets/NIO-alt.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
diff --git a/public/assets/NIO.svg b/public/assets/NIO.svg
deleted file mode 100644
index 7955919dc..000000000
--- a/public/assets/NIO.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
diff --git a/public/assets/ODE-alt.svg b/public/assets/ODE-alt.svg
deleted file mode 100644
index 3f72e27c4..000000000
--- a/public/assets/ODE-alt.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
diff --git a/public/assets/ODE.svg b/public/assets/ODE.svg
deleted file mode 100644
index 3f72e27c4..000000000
--- a/public/assets/ODE.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
diff --git a/public/assets/OMG-alt.svg b/public/assets/OMG-alt.svg
deleted file mode 100644
index f320ac997..000000000
--- a/public/assets/OMG-alt.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
diff --git a/public/assets/OMG.svg b/public/assets/OMG.svg
deleted file mode 100644
index f320ac997..000000000
--- a/public/assets/OMG.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
diff --git a/public/assets/ORS-alt.svg b/public/assets/ORS-alt.svg
deleted file mode 100644
index d270247fd..000000000
--- a/public/assets/ORS-alt.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
diff --git a/public/assets/ORS.svg b/public/assets/ORS.svg
deleted file mode 100644
index d270247fd..000000000
--- a/public/assets/ORS.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
diff --git a/public/assets/PAI-alt.svg b/public/assets/PAI-alt.svg
deleted file mode 100644
index 020d9800e..000000000
--- a/public/assets/PAI-alt.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/public/assets/PAI.svg b/public/assets/PAI.svg
deleted file mode 100644
index 020d9800e..000000000
--- a/public/assets/PAI.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/public/assets/POA-alt.svg b/public/assets/POA-alt.svg
deleted file mode 100644
index f2273909d..000000000
--- a/public/assets/POA-alt.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
diff --git a/public/assets/POA.svg b/public/assets/POA.svg
deleted file mode 100644
index f2273909d..000000000
--- a/public/assets/POA.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
diff --git a/public/assets/POY-alt.svg b/public/assets/POY-alt.svg
deleted file mode 100644
index adea9beb9..000000000
--- a/public/assets/POY-alt.svg
+++ /dev/null
@@ -1,79 +0,0 @@
-
-
-
diff --git a/public/assets/POY.svg b/public/assets/POY.svg
deleted file mode 100644
index adea9beb9..000000000
--- a/public/assets/POY.svg
+++ /dev/null
@@ -1,79 +0,0 @@
-
-
-
diff --git a/public/assets/QSH-alt.svg b/public/assets/QSH-alt.svg
deleted file mode 100644
index 36874bd24..000000000
--- a/public/assets/QSH-alt.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
diff --git a/public/assets/QSH.svg b/public/assets/QSH.svg
deleted file mode 100644
index 36874bd24..000000000
--- a/public/assets/QSH.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
diff --git a/public/assets/QTM-alt.svg b/public/assets/QTM-alt.svg
deleted file mode 100644
index b4115ddd1..000000000
--- a/public/assets/QTM-alt.svg
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
diff --git a/public/assets/QTM.svg b/public/assets/QTM.svg
deleted file mode 100644
index b4115ddd1..000000000
--- a/public/assets/QTM.svg
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
diff --git a/public/assets/RCN-alt.svg b/public/assets/RCN-alt.svg
deleted file mode 100644
index 4ada7c773..000000000
--- a/public/assets/RCN-alt.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
diff --git a/public/assets/RCN.svg b/public/assets/RCN.svg
deleted file mode 100644
index 4ada7c773..000000000
--- a/public/assets/RCN.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
diff --git a/public/assets/RDN-alt.svg b/public/assets/RDN-alt.svg
deleted file mode 100644
index 39fb633f1..000000000
--- a/public/assets/RDN-alt.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/public/assets/RDN.svg b/public/assets/RDN.svg
deleted file mode 100644
index 39fb633f1..000000000
--- a/public/assets/RDN.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/public/assets/REP-alt.svg b/public/assets/REP-alt.svg
deleted file mode 100644
index aff4d5773..000000000
--- a/public/assets/REP-alt.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
diff --git a/public/assets/REP.svg b/public/assets/REP.svg
deleted file mode 100644
index aff4d5773..000000000
--- a/public/assets/REP.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
diff --git a/public/assets/REQ-alt.svg b/public/assets/REQ-alt.svg
deleted file mode 100644
index 161d5bda5..000000000
--- a/public/assets/REQ-alt.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/public/assets/REQ.svg b/public/assets/REQ.svg
deleted file mode 100644
index 161d5bda5..000000000
--- a/public/assets/REQ.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/public/assets/RLC-alt.svg b/public/assets/RLC-alt.svg
deleted file mode 100644
index 6f972aea7..000000000
--- a/public/assets/RLC-alt.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
diff --git a/public/assets/RLC.svg b/public/assets/RLC.svg
deleted file mode 100644
index 6f972aea7..000000000
--- a/public/assets/RLC.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
diff --git a/public/assets/RRT-alt.svg b/public/assets/RRT-alt.svg
deleted file mode 100644
index bc2e073e7..000000000
--- a/public/assets/RRT-alt.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
diff --git a/public/assets/SAN-alt.svg b/public/assets/SAN-alt.svg
deleted file mode 100644
index 508c44bb4..000000000
--- a/public/assets/SAN-alt.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
diff --git a/public/assets/SAN.svg b/public/assets/SAN.svg
deleted file mode 100644
index 508c44bb4..000000000
--- a/public/assets/SAN.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
diff --git a/public/assets/SEE-alt.svg b/public/assets/SEE-alt.svg
deleted file mode 100644
index 9ce56c9b6..000000000
--- a/public/assets/SEE-alt.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
diff --git a/public/assets/SEE.svg b/public/assets/SEE.svg
deleted file mode 100644
index 9ce56c9b6..000000000
--- a/public/assets/SEE.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
diff --git a/public/assets/SEN-alt.svg b/public/assets/SEN-alt.svg
deleted file mode 100644
index 886ebbeaf..000000000
--- a/public/assets/SEN-alt.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
diff --git a/public/assets/SEN.svg b/public/assets/SEN.svg
deleted file mode 100644
index 886ebbeaf..000000000
--- a/public/assets/SEN.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
diff --git a/public/assets/SNG-alt.svg b/public/assets/SNG-alt.svg
deleted file mode 100644
index ee08d7a9e..000000000
--- a/public/assets/SNG-alt.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
diff --git a/public/assets/SNG.svg b/public/assets/SNG.svg
deleted file mode 100644
index ee08d7a9e..000000000
--- a/public/assets/SNG.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
diff --git a/public/assets/SNT-alt.svg b/public/assets/SNT-alt.svg
deleted file mode 100644
index c96ace857..000000000
--- a/public/assets/SNT-alt.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
diff --git a/public/assets/SNT.svg b/public/assets/SNT.svg
deleted file mode 100644
index c96ace857..000000000
--- a/public/assets/SNT.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
diff --git a/public/assets/SPK-alt.svg b/public/assets/SPK-alt.svg
deleted file mode 100644
index 184997a92..000000000
--- a/public/assets/SPK-alt.svg
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
diff --git a/public/assets/SPK.svg b/public/assets/SPK.svg
deleted file mode 100644
index 184997a92..000000000
--- a/public/assets/SPK.svg
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
diff --git a/public/assets/STJ-alt.svg b/public/assets/STJ-alt.svg
deleted file mode 100644
index 91274b4d7..000000000
--- a/public/assets/STJ-alt.svg
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
diff --git a/public/assets/STJ.svg b/public/assets/STJ.svg
deleted file mode 100644
index 91274b4d7..000000000
--- a/public/assets/STJ.svg
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
diff --git a/public/assets/TETHER.svg b/public/assets/TETHER.svg
deleted file mode 100644
index 371272013..000000000
--- a/public/assets/TETHER.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
\ No newline at end of file
diff --git a/public/assets/TNB-alt.svg b/public/assets/TNB-alt.svg
deleted file mode 100644
index 760df9d66..000000000
--- a/public/assets/TNB-alt.svg
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
diff --git a/public/assets/TNB.svg b/public/assets/TNB.svg
deleted file mode 100644
index 760df9d66..000000000
--- a/public/assets/TNB.svg
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
diff --git a/public/assets/TRX-alt.svg b/public/assets/TRX-alt.svg
deleted file mode 100644
index a1a483d35..000000000
--- a/public/assets/TRX-alt.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
diff --git a/public/assets/TRX.svg b/public/assets/TRX.svg
deleted file mode 100644
index a1a483d35..000000000
--- a/public/assets/TRX.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
diff --git a/public/assets/TST-alt.svg b/public/assets/TST-alt.svg
deleted file mode 100644
index e6e5293d1..000000000
--- a/public/assets/TST-alt.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/public/assets/TST.svg b/public/assets/TST.svg
deleted file mode 100644
index 2f6b0efa7..000000000
--- a/public/assets/TST.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/public/assets/USD-alt.svg b/public/assets/USD-alt.svg
deleted file mode 100644
index 7b98ec8d2..000000000
--- a/public/assets/USD-alt.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
diff --git a/public/assets/USX-alt.svg b/public/assets/USX-alt.svg
deleted file mode 100644
index 0fbe3c466..000000000
--- a/public/assets/USX-alt.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
diff --git a/public/assets/USX.svg b/public/assets/USX.svg
deleted file mode 100644
index 0fbe3c466..000000000
--- a/public/assets/USX.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
diff --git a/public/assets/UTK-alt.svg b/public/assets/UTK-alt.svg
deleted file mode 100644
index cc3accd21..000000000
--- a/public/assets/UTK-alt.svg
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
diff --git a/public/assets/UTK.svg b/public/assets/UTK.svg
deleted file mode 100644
index cc3accd21..000000000
--- a/public/assets/UTK.svg
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
diff --git a/public/assets/VEE-alt.svg b/public/assets/VEE-alt.svg
deleted file mode 100644
index 77136cb93..000000000
--- a/public/assets/VEE-alt.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/public/assets/VEE.svg b/public/assets/VEE.svg
deleted file mode 100644
index 77136cb93..000000000
--- a/public/assets/VEE.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/public/assets/VET-alt.svg b/public/assets/VET-alt.svg
deleted file mode 100644
index 3291f90ce..000000000
--- a/public/assets/VET-alt.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
diff --git a/public/assets/VET.svg b/public/assets/VET.svg
deleted file mode 100644
index 3291f90ce..000000000
--- a/public/assets/VET.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
diff --git a/public/assets/WAX-alt.svg b/public/assets/WAX-alt.svg
deleted file mode 100644
index d6e76a99c..000000000
--- a/public/assets/WAX-alt.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
diff --git a/public/assets/WAX.svg b/public/assets/WAX.svg
deleted file mode 100644
index d6e76a99c..000000000
--- a/public/assets/WAX.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
diff --git a/public/assets/WPR-alt.svg b/public/assets/WPR-alt.svg
deleted file mode 100644
index b6073001c..000000000
--- a/public/assets/WPR-alt.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/public/assets/WPR.svg b/public/assets/WPR.svg
deleted file mode 100644
index b6073001c..000000000
--- a/public/assets/WPR.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/public/assets/XLM-alt.svg b/public/assets/XLM-alt.svg
deleted file mode 100644
index 4407ef440..000000000
--- a/public/assets/XLM-alt.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
diff --git a/public/assets/XLM.svg b/public/assets/XLM.svg
deleted file mode 100644
index 4407ef440..000000000
--- a/public/assets/XLM.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
diff --git a/public/assets/XMR-alt.svg b/public/assets/XMR-alt.svg
deleted file mode 100644
index 24bc9cee7..000000000
--- a/public/assets/XMR-alt.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
diff --git a/public/assets/XMR.svg b/public/assets/XMR.svg
deleted file mode 100644
index 0f04f6e01..000000000
--- a/public/assets/XMR.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
diff --git a/public/assets/XRA-alt.svg b/public/assets/XRA-alt.svg
deleted file mode 100644
index 78f9ffcd2..000000000
--- a/public/assets/XRA-alt.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
diff --git a/public/assets/XRA.svg b/public/assets/XRA.svg
deleted file mode 100644
index 78f9ffcd2..000000000
--- a/public/assets/XRA.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
diff --git a/public/assets/XRP-alt.svg b/public/assets/XRP-alt.svg
deleted file mode 100644
index e15b46acd..000000000
--- a/public/assets/XRP-alt.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/public/assets/XRP.svg b/public/assets/XRP.svg
deleted file mode 100644
index e15b46acd..000000000
--- a/public/assets/XRP.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/public/assets/XVG-alt.svg b/public/assets/XVG-alt.svg
deleted file mode 100644
index b24077361..000000000
--- a/public/assets/XVG-alt.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
diff --git a/public/assets/XVG.svg b/public/assets/XVG.svg
deleted file mode 100644
index b24077361..000000000
--- a/public/assets/XVG.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
diff --git a/public/assets/YYW-alt.svg b/public/assets/YYW-alt.svg
deleted file mode 100644
index 30c02ed52..000000000
--- a/public/assets/YYW-alt.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
diff --git a/public/assets/YYW.svg b/public/assets/YYW.svg
deleted file mode 100644
index 30c02ed52..000000000
--- a/public/assets/YYW.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
diff --git a/public/assets/ZCN-alt.svg b/public/assets/ZCN-alt.svg
deleted file mode 100644
index eeab28e16..000000000
--- a/public/assets/ZCN-alt.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
diff --git a/public/assets/ZCN.svg b/public/assets/ZCN.svg
deleted file mode 100644
index eeab28e16..000000000
--- a/public/assets/ZCN.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
diff --git a/public/assets/ZEC-alt.svg b/public/assets/ZEC-alt.svg
deleted file mode 100644
index 9f150d290..000000000
--- a/public/assets/ZEC-alt.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/public/assets/ZIL-alt.svg b/public/assets/ZIL-alt.svg
deleted file mode 100644
index 50194f439..000000000
--- a/public/assets/ZIL-alt.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/public/assets/ZIL.svg b/public/assets/ZIL.svg
deleted file mode 100644
index 50194f439..000000000
--- a/public/assets/ZIL.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/public/assets/ZRX-alt.svg b/public/assets/ZRX-alt.svg
deleted file mode 100644
index f559d649f..000000000
--- a/public/assets/ZRX-alt.svg
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
diff --git a/public/assets/ZRX.svg b/public/assets/ZRX.svg
deleted file mode 100644
index f559d649f..000000000
--- a/public/assets/ZRX.svg
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
diff --git a/public/assets/bp_symbol.svg b/public/assets/bp_symbol.svg
deleted file mode 100644
index 436ca1766..000000000
--- a/public/assets/bp_symbol.svg
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
diff --git a/public/assets/chevy.svg b/public/assets/chevy.svg
deleted file mode 100644
index 0d64d95df..000000000
--- a/public/assets/chevy.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
diff --git a/public/assets/code.svg b/public/assets/code.svg
deleted file mode 100644
index a7d6cb724..000000000
--- a/public/assets/code.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
diff --git a/public/assets/container-center-bg.svg b/public/assets/container-center-bg.svg
deleted file mode 100644
index 7961ef960..000000000
--- a/public/assets/container-center-bg.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
\ No newline at end of file
diff --git a/public/assets/icon-exchange.svg b/public/assets/icon-exchange.svg
deleted file mode 100644
index 57cff8212..000000000
--- a/public/assets/icon-exchange.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
diff --git a/public/assets/icon-funding.svg b/public/assets/icon-funding.svg
deleted file mode 100644
index 4055798c8..000000000
--- a/public/assets/icon-funding.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
diff --git a/public/assets/icon-layout.svg b/public/assets/icon-layout.svg
deleted file mode 100644
index 9c8b7ae4a..000000000
--- a/public/assets/icon-layout.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
diff --git a/public/assets/icon-orders.svg b/public/assets/icon-orders.svg
deleted file mode 100644
index fa3ef913f..000000000
--- a/public/assets/icon-orders.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
diff --git a/public/assets/icon-security.svg b/public/assets/icon-security.svg
deleted file mode 100644
index 98e07534c..000000000
--- a/public/assets/icon-security.svg
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
diff --git a/public/assets/icon-trading.svg b/public/assets/icon-trading.svg
deleted file mode 100644
index eab39cb0f..000000000
--- a/public/assets/icon-trading.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/public/assets/lock-icon.svg b/public/assets/lock-icon.svg
deleted file mode 100644
index ec1a32f30..000000000
--- a/public/assets/lock-icon.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
\ No newline at end of file
diff --git a/public/assets/logo3-dark-theme-holidays.svg b/public/assets/logo3-dark-theme-holidays.svg
deleted file mode 100644
index c1daa4f12..000000000
--- a/public/assets/logo3-dark-theme-holidays.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
\ No newline at end of file
diff --git a/public/assets/logo3-dark-theme.svg b/public/assets/logo3-dark-theme.svg
deleted file mode 100644
index a155bae74..000000000
--- a/public/assets/logo3-dark-theme.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
\ No newline at end of file
diff --git a/public/assets/logo3-light-theme-holidays.svg b/public/assets/logo3-light-theme-holidays.svg
deleted file mode 100644
index 77269d03c..000000000
--- a/public/assets/logo3-light-theme-holidays.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
\ No newline at end of file
diff --git a/public/assets/logo3-light-theme.svg b/public/assets/logo3-light-theme.svg
deleted file mode 100644
index ce2b39907..000000000
--- a/public/assets/logo3-light-theme.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
\ No newline at end of file
diff --git a/public/assets/logo_white.svg b/public/assets/logo_white.svg
deleted file mode 100644
index f1fc61b61..000000000
--- a/public/assets/logo_white.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
\ No newline at end of file
diff --git a/public/assets/mobile_logo_dark.svg b/public/assets/mobile_logo_dark.svg
deleted file mode 100644
index 685f1fb58..000000000
--- a/public/assets/mobile_logo_dark.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
\ No newline at end of file
diff --git a/public/assets/mobile_logo_light.svg b/public/assets/mobile_logo_light.svg
deleted file mode 100644
index 8d16661a1..000000000
--- a/public/assets/mobile_logo_light.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
\ No newline at end of file
diff --git a/public/assets/u2f-desktop.svg b/public/assets/u2f-desktop.svg
deleted file mode 100644
index f5ff0b0f2..000000000
--- a/public/assets/u2f-desktop.svg
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
diff --git a/public/assets/u2f-security-key.svg b/public/assets/u2f-security-key.svg
deleted file mode 100644
index d995160a2..000000000
--- a/public/assets/u2f-security-key.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
diff --git a/public/constants.js b/public/constants.js
new file mode 100644
index 000000000..edb6da0e7
--- /dev/null
+++ b/public/constants.js
@@ -0,0 +1,24 @@
+const os = require('os')
+
+const LOG_PATH = `${os.tmpdir()}/bfx-hf-ui-logs`
+const LOG_PATH_DS_BITFINEX = `${LOG_PATH}/ds-bitfinex-server.log`
+const LOG_PATH_API_SERVER = `${LOG_PATH}/api-server.log`
+
+const SCRIPT_PATH = `${__dirname}/../scripts`
+const SCRIPT_PATH_DS_BITFINEX = `${SCRIPT_PATH}/start-ds-bitfinex.js`
+const SCRIPT_PATH_API_SERVER = `${SCRIPT_PATH}/start-api-server.js`
+
+const LOCAL_STORE_CWD = `${os.homedir()}/.bitfinexhoney`
+
+const ELECTRON_CONTEXT_ALLOWED_URLS = ['https://app.eu.pendo.io']
+
+module.exports = {
+ LOG_PATH,
+ LOG_PATH_DS_BITFINEX,
+ LOG_PATH_API_SERVER,
+ SCRIPT_PATH,
+ SCRIPT_PATH_DS_BITFINEX,
+ SCRIPT_PATH_API_SERVER,
+ LOCAL_STORE_CWD,
+ ELECTRON_CONTEXT_ALLOWED_URLS,
+}
diff --git a/public/electron.js b/public/electron.js
index fb560046d..d44009b4b 100644
--- a/public/electron.js
+++ b/public/electron.js
@@ -1,49 +1,47 @@
-const { app, BrowserWindow, protocol } = require('electron')
+const { app } = require('electron') // eslint-disable-line
+const fs = require('fs')
const path = require('path')
-const url = require('url')
-
-require('../scripts/start-server') // run server
-
-const env = {
- ...process.env,
- ELECTRON_VERSION: process.versions.electron,
-}
-
-let mainWindow
-
-function createWindow() {
- mainWindow = new BrowserWindow({ width: 800, height: 600 })
-
- mainWindow.loadURL(url.format({
- pathname: 'index.html',
- protocol: 'file',
- slashes: true,
- }))
+const { fork } = require('child_process')
+// const logger = require('electron-log')
+const HFUIApplication = require('./lib/app')
+const {
+ LOG_PATH,
+ LOG_PATH_DS_BITFINEX,
+ LOG_PATH_API_SERVER,
+ SCRIPT_PATH_DS_BITFINEX,
+ SCRIPT_PATH_API_SERVER,
+ LOCAL_STORE_CWD,
+} = require('./constants')
+
+const REQUIRED_PATHS = [LOCAL_STORE_CWD, LOG_PATH]
+
+REQUIRED_PATHS.forEach((dir) => {
+ if (!fs.existsSync(dir)) {
+ fs.mkdirSync(dir)
+ }
+})
- mainWindow.on('closed', () => {
- mainWindow = null
- })
+const SCRIPT_SPAWN_OPTS = {
+ env: { ELECTRON_RUN_AS_NODE: '1' },
}
-app.on('ready', () => {
- protocol.interceptFileProtocol('file', (request, callback) => {
- const url = request.url.substr(7) /* all urls start with 'file://' */
+const dsLogStream = fs.openSync(LOG_PATH_DS_BITFINEX, 'a')
+const apiLogStream = fs.openSync(LOG_PATH_API_SERVER, 'a')
- callback({ path: path.normalize(`${__dirname}/${url}`) })
- }, (err) => {
- if (err) console.error('Failed to register protocol')
- })
- createWindow()
+const childDSProcess = fork(path.resolve(SCRIPT_PATH_DS_BITFINEX), [], {
+ ...SCRIPT_SPAWN_OPTS,
+ stdio: [null, dsLogStream, dsLogStream, 'ipc'],
})
-app.on('window-all-closed', () => {
- if (process.platform !== 'darwin') {
- app.quit()
- }
+const childAPIProcess = fork(path.resolve(SCRIPT_PATH_API_SERVER), [], {
+ ...SCRIPT_SPAWN_OPTS,
+ stdio: [null, apiLogStream, apiLogStream, 'ipc'],
})
-app.on('activate', () => {
- if (mainWindow === null) {
- createWindow()
- }
+new HFUIApplication({ // eslint-disable-line
+ app,
+ onExit: () => {
+ childAPIProcess.kill('SIGKILL')
+ childDSProcess.kill('SIGKILL')
+ },
})
diff --git a/public/entitlements.mac.plist b/public/entitlements.mac.plist
new file mode 100644
index 000000000..ac5427653
--- /dev/null
+++ b/public/entitlements.mac.plist
@@ -0,0 +1,25 @@
+
+
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.network.client
+
+ com.apple.security.network.server
+
+ com.apple.security.files.user-selected.read-only
+
+ com.apple.security.files.user-selected.read-write
+
+ com.apple.security.files.user-selected.executable
+
+ com.apple.security.device.audio-video-bridging
+
+ com.apple.security.personal-information.location
+
+ com.apple.security.cs.allow-unsigned-executable-memory
+
+ com.apple.security.cs.disable-library-validation
+
+
+
diff --git a/public/entitlements.mas.inherit.plist b/public/entitlements.mas.inherit.plist
new file mode 100644
index 000000000..4b8d65fa9
--- /dev/null
+++ b/public/entitlements.mas.inherit.plist
@@ -0,0 +1,28 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.inherit
+
+ com.apple.security.network.client
+
+ com.apple.security.network.server
+
+ com.apple.security.files.user-selected.read-only
+
+ com.apple.security.files.user-selected.read-write
+
+ com.apple.security.files.user-selected.executable
+
+ com.apple.security.device.audio-video-bridging
+
+ com.apple.security.personal-information.location
+
+ com.apple.security.cs.allow-unsigned-executable-memory
+
+ com.apple.security.cs.disable-library-validation
+
+
+
diff --git a/public/favicon.ico b/public/favicon.ico
deleted file mode 100644
index a11777cc4..000000000
Binary files a/public/favicon.ico and /dev/null differ
diff --git a/public/icon.icns b/public/icon.icns
new file mode 100644
index 000000000..1124ec253
Binary files /dev/null and b/public/icon.icns differ
diff --git a/public/icon.png b/public/icon.png
index 477af70dd..a628a9e34 100644
Binary files a/public/icon.png and b/public/icon.png differ
diff --git a/public/index.html b/public/index.html
deleted file mode 100644
index 231e6cbd5..000000000
--- a/public/index.html
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- The Honey Framework UI
-
-
-
-
-
-
-
-
diff --git a/public/lib/app.js b/public/lib/app.js
new file mode 100644
index 000000000..feee9e4c0
--- /dev/null
+++ b/public/lib/app.js
@@ -0,0 +1,351 @@
+const url = require('url')
+const path = require('path')
+const {
+ BrowserWindow,
+ protocol,
+ shell,
+ ipcMain,
+ dialog,
+ screen,
+} = require('electron')
+const { autoUpdater: _autoUpdater } = require('electron-updater')
+const logger = require('electron-log')
+const windowStateKeeper = require('electron-window-state')
+const os = require('os')
+const { appendFile, mkdir } = require('fs/promises')
+const { existsSync } = require('fs')
+const enforceMacOSAppLocation = require('../../scripts/enforce-macos-app-location')
+const BfxMacUpdater = require('../../scripts/auto-updater/bfx.mac.updater')
+const {
+ showLoadingWindow,
+ hideLoadingWindow,
+} = require('../../scripts/change-loading-win-visibility-state')
+const { createAppMenu } = require('../utils/appMenu')
+const { createAppTray } = require('../utils/tray')
+const syncReadUserSettings = require('../utils/syncReadUserSettings')
+const saveStrategiesToZIP = require('../utils/saveStrategiesToZIP')
+const { ELECTRON_CONTEXT_ALLOWED_URLS } = require('../constants')
+
+const LOG_DIR_PATH = `${os.tmpdir()}/bfx-hf-ui-logs`
+const APP_LOG_PATH = `${LOG_DIR_PATH}/app.log`
+
+const isElectronDebugMode = process.env.REACT_APP_ELECTRON_DEBUG === 'true'
+
+let autoUpdater = _autoUpdater
+
+if (process.platform === 'darwin') {
+ autoUpdater = new BfxMacUpdater()
+ autoUpdater.addInstallingUpdateEventHandler(() => {
+ return showLoadingWindow({
+ description: 'Updating...',
+ isRequiredToCloseAllWins: true,
+ })
+ })
+}
+
+autoUpdater.allowPrerelease = false
+autoUpdater.logger = logger
+autoUpdater.logger.transports.file.level = 'info'
+autoUpdater.autoDownload = false
+
+const CHECK_APP_UPDATES_EVERY_MS = 30 * 60 * 1000 // 30 min
+let appUpdatesIntervalRef = null
+module.exports = class HFUIApplication {
+ static createWindow() {
+ const fullscreen = syncReadUserSettings()?.fullScreen
+
+ const { width: monitorWidth, height: monitorHeight } = screen.getPrimaryDisplay().workAreaSize
+ const minWidth = Math.min(1200, monitorWidth)
+ const minHeight = Math.min(600, monitorHeight)
+
+ const mainWindowState = windowStateKeeper({
+ defaultWidth: 1500,
+ defaultHeight: 850,
+ path: path.resolve(os.homedir(), '.bitfinexhoney'),
+ })
+
+ const win = new BrowserWindow({
+ width: mainWindowState.width,
+ height: mainWindowState.height,
+ minHeight,
+ minWidth,
+ x: mainWindowState.x,
+ y: mainWindowState.y,
+ icon: path.resolve(__dirname, '../icon.png'),
+ show: true,
+ webPreferences: {
+ preload: path.join(__dirname, 'preload.js'),
+ },
+ fullscreen,
+ fullscreenable: true,
+ })
+
+ mainWindowState.manage(win)
+
+ win.loadURL(
+ url.format({
+ pathname: 'index.html',
+ protocol: 'file',
+ slashes: true,
+ }),
+ )
+
+ return win
+ }
+
+ static handleURLRedirect({ url: _url }) {
+ const isURLAllowed = ELECTRON_CONTEXT_ALLOWED_URLS.some((extUrl) => _url?.includes(extUrl))
+ if (isURLAllowed) {
+ return {
+ action: 'allow',
+ }
+ }
+
+ shell.openExternal(_url)
+ return { action: 'deny' }
+ }
+
+ constructor({ app, onExit }) {
+ this.mainWindow = null
+ this.tray = null
+ this.onExitCB = onExit
+ this.app = app
+
+ this.onReady = this.onReady.bind(this)
+ this.onActivate = this.onActivate.bind(this)
+ this.onAllWindowsClosed = this.onAllWindowsClosed.bind(this)
+ this.onMainWindowClosed = this.onMainWindowClosed.bind(this)
+ this.sendOpenSettingsModalMessage = this.sendOpenSettingsModalMessage.bind(this)
+
+ const isLocked = app.requestSingleInstanceLock()
+
+ if (!isLocked) {
+ app.quit()
+ } else {
+ app.on('second-instance', () => {
+ if (this.mainWindow) {
+ this.mainWindow.show()
+ this.mainWindow.focus()
+ dialog.showErrorBox(
+ 'Bitfinex Honey',
+ 'Application has been already launched',
+ )
+ }
+ })
+ }
+
+ // increase memory size
+ app.commandLine.appendSwitch('js-flags', '--max-old-space-size=2048')
+ app.on('ready', this.onReady)
+ app.on('window-all-closed', this.onAllWindowsClosed)
+ app.on('activate', this.onActivate)
+ app.on('before-quit', () => {
+ if (this.mainWindow) {
+ this.mainWindow.removeAllListeners('close')
+ this.mainWindow.close()
+ }
+ })
+ }
+
+ spawnMainWindow() {
+ if (this.mainWindow !== null) {
+ return
+ }
+
+ this.mainWindow = HFUIApplication.createWindow()
+ this.mainWindow.on('closed', this.onMainWindowClosed)
+ this.mainWindow.on('close', (e) => {
+ if (this.mainWindow !== null) {
+ e.preventDefault()
+
+ const shouldHideOnClose = syncReadUserSettings()?.hideOnClose
+ if (shouldHideOnClose) {
+ this.mainWindow.hide()
+ } else {
+ this.mainWindow.webContents.send('app-close')
+ }
+ }
+ })
+
+ this.mainWindow.on('hide', () => {
+ this.mainWindow.webContents.send('app_hidden')
+ this.mainWindow.once('show', () => this.mainWindow.webContents.send('app_restored'))
+ })
+
+ this.mainWindow.once('ready-to-show', () => {
+ autoUpdater.checkForUpdates()
+
+ appUpdatesIntervalRef = setInterval(() => {
+ autoUpdater.checkForUpdates()
+ }, CHECK_APP_UPDATES_EVERY_MS)
+ })
+
+ this.mainWindow.webContents.setWindowOpenHandler(
+ HFUIApplication.handleURLRedirect,
+ )
+
+ this.mainWindow.webContents.once('did-finish-load', () => {
+ const isFullscreen = this.mainWindow.isFullScreen()
+
+ if (isFullscreen) {
+ this.mainWindow.webContents.send('app_fullscreen_changed', {
+ fullscreen: true,
+ })
+ }
+ })
+
+ this.mainWindow.on('enter-full-screen', () => {
+ this.mainWindow.webContents.send('app_fullscreen_changed', {
+ fullscreen: true,
+ })
+ })
+
+ this.mainWindow.on('leave-full-screen', () => {
+ this.mainWindow.webContents.send('app_fullscreen_changed', {
+ fullscreen: false,
+ })
+ })
+
+ ipcMain.on('app_should_restored', () => {
+ this.mainWindow.show()
+ })
+
+ ipcMain.on('app-closed', () => {
+ if (appUpdatesIntervalRef) {
+ clearInterval(appUpdatesIntervalRef)
+ }
+ if (this.mainWindow) {
+ this.mainWindow.removeAllListeners('close')
+ this.mainWindow.close()
+ }
+ })
+
+ ipcMain.on('restart_app', () => {
+ autoUpdater.quitAndInstall(false, true)
+ })
+
+ ipcMain.on('clear_app_update_timer', () => {
+ if (appUpdatesIntervalRef) {
+ clearInterval(appUpdatesIntervalRef)
+ }
+ })
+
+ ipcMain.on('app_change_fullscreen', (_, { fullscreen }) => {
+ this.mainWindow.setFullScreen(fullscreen)
+ })
+
+ ipcMain.on('dump_log_data', async (_, _data) => {
+ try {
+ if (!existsSync(LOG_DIR_PATH)) {
+ await mkdir(LOG_DIR_PATH)
+ }
+ let data
+ if (_data instanceof Object) {
+ data = JSON.stringify(_data)
+ } else {
+ data = _data
+ }
+
+ await appendFile(APP_LOG_PATH, `${data}${os.EOL}`)
+ } catch (e) {
+ console.error('[dump_log_data] (electron) Error:', e)
+ }
+ })
+
+ ipcMain.on('download_update', () => {
+ autoUpdater.downloadUpdate()
+ })
+
+ ipcMain.on('app_save_all_strategies.request', (_, { strategies }) => {
+ saveStrategiesToZIP(this.app, this.mainWindow, strategies)
+ })
+
+ autoUpdater.on('update-available', (args) => {
+ this.mainWindow.webContents.send('update_available', args)
+ })
+
+ autoUpdater.on('download-progress', (args) => {
+ this.mainWindow.webContents.send('update_in_progress', args)
+ })
+
+ autoUpdater.on('update-downloaded', (info) => {
+ const { downloadedFile } = { ...info }
+ if (autoUpdater instanceof BfxMacUpdater) {
+ autoUpdater.setDownloadedFilePath(downloadedFile)
+ }
+
+ this.mainWindow.webContents.send('update_downloaded', info)
+ })
+
+ autoUpdater.on('error', async (err) => {
+ try {
+ // Skip error when can't get code signature on mac
+ if (/Could not get code signature/gi.test(err.toString())) {
+ return
+ }
+ // Skip error when can't find app-update.yml. The error appears in zip packages
+ if (/app-update.yml/gi.test(err.toString())) {
+ return
+ }
+
+ this.mainWindow.webContents.send('update_error')
+ await hideLoadingWindow({ isRequiredToShowMainWin: false })
+ } catch (_err) {
+ logger.error('autoUpdater error: ', _err)
+ }
+ })
+ }
+
+ sendOpenSettingsModalMessage() {
+ const isVisible = this.mainWindow.isVisible()
+ if (!isVisible) {
+ this.mainWindow.show()
+ }
+ this.mainWindow.webContents.send('open_settings')
+ }
+
+ async onReady() {
+ protocol.interceptFileProtocol(
+ 'file',
+ (request, callback) => {
+ const fileURL = request.url.substr(7) // all urls start with 'file://'
+ const pathfinal = path.normalize(`${__dirname}/../${fileURL}`)
+ callback({ path: pathfinal })
+ },
+ (err) => {
+ if (err) {
+ logger.error('Failed to register protocol')
+ }
+ },
+ )
+
+ if (!isElectronDebugMode) {
+ await enforceMacOSAppLocation()
+ }
+
+ createAppMenu({
+ app: this.app,
+ sendOpenSettingsModalMessage: this.sendOpenSettingsModalMessage,
+ })
+
+ this.spawnMainWindow()
+
+ this.tray = createAppTray({
+ win: this.mainWindow,
+ sendOpenSettingsModalMessage: this.sendOpenSettingsModalMessage,
+ })
+ }
+
+ async onActivate() {
+ this.spawnMainWindow()
+ }
+
+ onMainWindowClosed() {
+ this.mainWindow = null
+ }
+
+ onAllWindowsClosed() {
+ this.onExitCB()
+ this.app.quit()
+ }
+}
diff --git a/public/lib/preload.js b/public/lib/preload.js
new file mode 100644
index 000000000..5d4c189fa
--- /dev/null
+++ b/public/lib/preload.js
@@ -0,0 +1,47 @@
+const { contextBridge, ipcRenderer } = require('electron')
+
+contextBridge.exposeInMainWorld(
+ 'electronService',
+ {
+ sendAppClosedEvent: () => ipcRenderer.send('app-closed'),
+ sendRestartAppEvent: () => ipcRenderer.send('restart_app'),
+ sendClearAppUpdateTimerEvent: () => ipcRenderer.send('clear_app_update_timer'),
+ sendDownloadUpdateEvent: () => ipcRenderer.send('download_update'),
+ sendRestoreAppMessage: () => ipcRenderer.send('app_should_restored'),
+ sendChangeFullscreenEvent: (fullscreen) => ipcRenderer.send('app_change_fullscreen', { fullscreen }),
+
+ addAppUpdateAvailableEventListener: (cb) => ipcRenderer.on('update_available', cb),
+ addAppUpdateDownloadProgressListener: (cb) => ipcRenderer.on('update_in_progress', cb),
+ addAppUpdateDownloadedEventListener: (cb) => ipcRenderer.on('update_downloaded', cb),
+ addAppUpdateErrorListener: (cb) => ipcRenderer.on('update_error', cb),
+
+ dumpLogData: (data) => ipcRenderer.send('dump_log_data', data),
+
+ removeAllAppUpdateEventListeners: () => {
+ ipcRenderer.removeAllListeners('update_available')
+ ipcRenderer.removeAllListeners('update_in_progress')
+ ipcRenderer.removeAllListeners('update_downloaded')
+ ipcRenderer.removeAllListeners('update_error')
+ },
+
+ getAllEvents: () => ipcRenderer.eventNames(),
+
+ addAppCloseEventListener: (cb) => ipcRenderer.on('app-close', cb),
+ addOpenSettingsModalListener: (cb) => ipcRenderer.on('open_settings', cb),
+ addAppHiddenListener: (cb) => ipcRenderer.on('app_hidden', cb),
+ addAppRestoredListener: (cb) => ipcRenderer.on('app_restored', cb),
+ addFullscreenChangeListener: (cb) => ipcRenderer.on('app_fullscreen_changed', cb),
+
+ sendSaveAllStrategiesEvent: (strategies) => ipcRenderer.send('app_save_all_strategies.request', { strategies }),
+ addSaveAllStrategiesResultListner: (cb) => ipcRenderer.on('app_save_all_strategies.result', cb),
+ removeSaveAllStrategiesResultListener: () => ipcRenderer.removeAllListeners('app_save_all_strategies.result'),
+
+ removeAllGlobalListeners: () => {
+ ipcRenderer.removeAllListeners('app-close')
+ ipcRenderer.removeAllListeners('open_settings')
+ ipcRenderer.removeAllListeners('app_hidden')
+ ipcRenderer.removeAllListeners('app_restored')
+ ipcRenderer.removeAllListeners('app_fullscreen_changed')
+ },
+ },
+)
diff --git a/public/manifest.json b/public/manifest.json
deleted file mode 100644
index ef19ec243..000000000
--- a/public/manifest.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "short_name": "React App",
- "name": "Create React App Sample",
- "icons": [
- {
- "src": "favicon.ico",
- "sizes": "64x64 32x32 24x24 16x16",
- "type": "image/x-icon"
- }
- ],
- "start_url": "./index.html",
- "display": "standalone",
- "theme_color": "#000000",
- "background_color": "#ffffff"
-}
diff --git a/public/trayIcon.png b/public/trayIcon.png
new file mode 100644
index 000000000..dd929fe2d
Binary files /dev/null and b/public/trayIcon.png differ
diff --git a/public/trayIcon@2x.png b/public/trayIcon@2x.png
new file mode 100644
index 000000000..7e82d4bed
Binary files /dev/null and b/public/trayIcon@2x.png differ
diff --git a/public/utils/appMenu.js b/public/utils/appMenu.js
new file mode 100644
index 000000000..9e67a1fd0
--- /dev/null
+++ b/public/utils/appMenu.js
@@ -0,0 +1,147 @@
+const { Menu, shell } = require('electron')
+const os = require('os')
+const url = require('url')
+// const { app } = require('electron')
+
+const {
+ LOG_PATH,
+ LOG_PATH_DS_BITFINEX,
+ LOG_PATH_API_SERVER,
+} = require('../constants')
+
+const RC_KEYWORD = '-rc'
+const isElectronDebugMode = process.env.REACT_APP_ELECTRON_DEBUG === 'true'
+
+const DEBUG_MENU = [
+ {
+ label: 'Toggle Developer Tools',
+ accelerator: (function getKeys() {
+ const platform = os.platform()
+ if (platform === 'darwin') {
+ return 'Alt+Command+I'
+ }
+ return 'Ctrl+Shift+I'
+ }()),
+ click(item, focusedWindow) {
+ if (focusedWindow) {
+ focusedWindow.toggleDevTools()
+ }
+ },
+ },
+ {
+ label: 'Reload',
+ accelerator: 'Command+R',
+ click: (item, focusedWindow) => {
+ if (focusedWindow) {
+ focusedWindow.webContents.loadURL(
+ url.format({
+ pathname: 'index.html',
+ protocol: 'file',
+ slashes: true,
+ }),
+ )
+ }
+ },
+ },
+ {
+ label: 'Pendo Visual Design Studio',
+ click: async (_, focusedWindow) => {
+ if (focusedWindow) {
+ await focusedWindow.webContents.executeJavaScript(
+ 'window.pendo?.designerv2.launchInAppDesigner()',
+ )
+ }
+ },
+ },
+]
+
+const getTemplate = ({ app, sendOpenSettingsModalMessage }) => {
+ const appVersion = app.getVersion()
+ const isRCMode = appVersion && appVersion.includes(RC_KEYWORD)
+
+ return [
+ {
+ label: 'Application',
+ submenu: [
+ {
+ label: 'Open settings',
+ click: sendOpenSettingsModalMessage,
+ },
+ {
+ label: 'Toggle fullscreen',
+ role: 'togglefullscreen',
+ accelerator: (function getKeys() {
+ const platform = os.platform()
+ if (platform === 'darwin') {
+ return 'Cmd+F11'
+ }
+ return 'F11'
+ }()),
+ },
+ {
+ label: 'Quit',
+ accelerator: 'CmdOrCtrl+Q',
+ click: () => {
+ app.quit()
+ },
+ },
+ ],
+ },
+ {
+ label: 'Edit',
+ submenu: [
+ { label: 'Undo', accelerator: 'CmdOrCtrl+Z', selector: 'undo:' },
+ { label: 'Redo', accelerator: 'Shift+CmdOrCtrl+Z', selector: 'redo:' },
+ { type: 'separator' },
+ { label: 'Cut', accelerator: 'CmdOrCtrl+X', selector: 'cut:' },
+ { label: 'Copy', accelerator: 'CmdOrCtrl+C', selector: 'copy:' },
+ { label: 'Paste', accelerator: 'CmdOrCtrl+V', selector: 'paste:' },
+ {
+ label: 'Select All',
+ accelerator: 'CmdOrCtrl+A',
+ selector: 'selectAll:',
+ },
+ ],
+ },
+ {
+ label: 'Diagnostics',
+ submenu: [
+ {
+ label: 'Open Logs Folder',
+ click: () => {
+ shell.openPath(LOG_PATH).catch((e) => {
+ console.error(`failed to open logs folder: ${e.message}`)
+ })
+ },
+ },
+ {
+ label: 'Open Data Server Log',
+ click: () => {
+ shell.openPath(LOG_PATH_DS_BITFINEX).catch((e) => {
+ console.error(
+ `failed to open data server log file: ${e.message}`,
+ )
+ })
+ },
+ },
+ {
+ label: 'Open API Server Log',
+ click: () => {
+ shell.openPath(LOG_PATH_API_SERVER).catch((e) => {
+ console.error(`failed to open api server log file: ${e.message}`)
+ })
+ },
+ },
+ ...(isRCMode || isElectronDebugMode ? DEBUG_MENU : []),
+ ],
+ },
+ ]
+}
+
+const createAppMenu = (params) => {
+ Menu.setApplicationMenu(Menu.buildFromTemplate(getTemplate(params)))
+}
+
+module.exports = {
+ createAppMenu,
+}
diff --git a/public/utils/saveStrategiesToZIP.js b/public/utils/saveStrategiesToZIP.js
new file mode 100644
index 000000000..98efc6ecc
--- /dev/null
+++ b/public/utils/saveStrategiesToZIP.js
@@ -0,0 +1,41 @@
+const { dialog } = require('electron')
+const path = require('path')
+const AdmZip = require('adm-zip')
+
+module.exports = (app, mainWindow, strategies) => {
+ const savePath = dialog.showSaveDialogSync(mainWindow, {
+ title: 'Export strategies to...',
+ message: 'Export strategies to...',
+ defaultPath: path.join(
+ app.getPath('downloads'),
+ 'BitfinexHoney_strategies.zip',
+ ),
+ })
+
+ if (!savePath) {
+ mainWindow.webContents.send('app_save_all_strategies.result', {
+ isSuccess: false,
+ })
+ return
+ }
+
+ const zip = new AdmZip()
+
+ strategies.forEach((strategy) => {
+ const filename = `${strategy.label}_${new Date(strategy.savedTs)
+ .toLocaleString()}.json`.replace(/\//g, '_')
+
+ zip.addFile(filename, Buffer.from(JSON.stringify(strategy)), 'utf-8')
+ })
+
+ zip
+ .writeZipPromise(savePath)
+ .then(() => {
+ mainWindow.webContents.send('app_save_all_strategies.result', {
+ isSuccess: true,
+ })
+ })
+ .catch(() => mainWindow.webContents.send('app_save_all_strategies.result', {
+ isSuccess: false,
+ }))
+}
diff --git a/public/utils/syncReadUserSettings.js b/public/utils/syncReadUserSettings.js
new file mode 100644
index 000000000..017f21aae
--- /dev/null
+++ b/public/utils/syncReadUserSettings.js
@@ -0,0 +1,17 @@
+const fs = require('fs')
+const os = require('os')
+const path = require('path')
+
+module.exports = () => {
+ const filePath = path.resolve(
+ os.homedir(),
+ '.bitfinexhoney',
+ 'ui.json',
+ )
+
+ const settingsObject = JSON.parse(
+ fs.readFileSync(filePath, { encoding: 'utf-8' }),
+ )?.user_settings?.userSettings
+
+ return settingsObject
+}
diff --git a/public/utils/tray.js b/public/utils/tray.js
new file mode 100644
index 000000000..89d11010b
--- /dev/null
+++ b/public/utils/tray.js
@@ -0,0 +1,31 @@
+const { nativeImage, Tray, Menu } = require('electron')
+const path = require('path')
+
+const getTemplate = ({ win, sendOpenSettingsModalMessage }) => [
+ { label: 'Bitfinex Honey', enabled: false },
+ { type: 'separator' },
+ {
+ label: 'Hide/show application',
+ click: () => (win.isVisible() ? win.hide() : win.show()),
+ },
+ {
+ label: 'Open settings',
+ click: sendOpenSettingsModalMessage,
+ },
+ {
+ role: 'quit',
+ },
+]
+
+const createAppTray = (params) => {
+ const img = nativeImage.createFromPath(
+ path.resolve(__dirname, '../trayIcon.png'),
+ )
+ const tray = new Tray(img)
+ tray.setContextMenu(Menu.buildFromTemplate(getTemplate(params)))
+ return tray
+}
+
+module.exports = {
+ createAppTray,
+}
diff --git a/res/bfx-hf-ui-v1.0.0.png b/res/bfx-hf-ui-v1.0.0.png
deleted file mode 100644
index af984d6cc..000000000
Binary files a/res/bfx-hf-ui-v1.0.0.png and /dev/null differ
diff --git a/res/bfx-hf-ui.png b/res/bfx-hf-ui.png
new file mode 100644
index 000000000..56f41b6be
Binary files /dev/null and b/res/bfx-hf-ui.png differ
diff --git a/scripts/auto-updater/bfx.mac.updater.js b/scripts/auto-updater/bfx.mac.updater.js
new file mode 100644
index 000000000..4e98fb6d1
--- /dev/null
+++ b/scripts/auto-updater/bfx.mac.updater.js
@@ -0,0 +1,174 @@
+'use strict'
+
+const path = require('path')
+const fs = require('fs')
+const { spawn } = require('child_process')
+const { MacUpdater } = require('electron-updater')
+const extract = require('extract-zip')
+
+const { rootPath: appDir } = require('electron-root-path')
+const logger = require('electron-log')
+
+class BfxMacUpdater extends MacUpdater {
+ constructor(...args) {
+ super(...args)
+
+ this.quitAndInstallCalled = false
+ this.quitHandlerAdded = false
+
+ this.EVENT_INSTALLING_UPDATE = 'EVENT_INSTALLING_UPDATE'
+
+ this.installingUpdateEventHandlers = []
+ // eslint-disable-next-line no-unused-expressions
+ this._logger === logger
+ }
+
+ setDownloadedFilePath(downloadedFilePath) {
+ this.downloadedFilePath = downloadedFilePath
+ }
+
+ getDownloadedFilePath() {
+ return this.downloadedFilePath
+ }
+
+ addInstallingUpdateEventHandler(handler) {
+ this.installingUpdateEventHandlers.push(handler)
+ }
+
+ async install(isSilent, isForceRunAfter) {
+ try {
+ if (this.quitAndInstallCalled) {
+ return false
+ }
+
+ this.quitAndInstallCalled = true
+
+ if (!isSilent) {
+ await this.dispatchInstallingUpdate()
+ }
+
+ const downloadedFilePath = this.getDownloadedFilePath()
+
+ const root = path.join(appDir, '../../..')
+ const dist = path.join(root, '..')
+ const productName = 'Bitfinex Honey'
+ const exec = path.join(root, `Contents/MacOS/${productName}`)
+
+ await fs.promises.rmdir(root, { recursive: true, force: true })
+
+ await extract(
+ downloadedFilePath,
+ {
+ dir: dist,
+ defaultDirMode: '0o744',
+ defaultFileMode: '0o744',
+ },
+ )
+
+ if (!isForceRunAfter) {
+ return true
+ }
+
+ spawn(exec, [], {
+ detached: true,
+ stdio: 'ignore',
+ env: {
+ ...process.env,
+ },
+ }).unref()
+ return true
+ } catch (err) {
+ // this.dispatchError(err)
+ this._logger.error(err)
+
+ return false
+ }
+ }
+
+ async asyncQuitAndInstall(isSilent, isForceRunAfter) {
+ const isInstalled = await this.install(
+ isSilent,
+ isSilent
+ ? isForceRunAfter
+ : true,
+ )
+
+ if (isInstalled) {
+ setImmediate(() => this.app.quit())
+
+ return
+ }
+
+ this.quitAndInstallCalled = false
+ }
+
+ quitAndInstall(...args) {
+ const downloadedFilePath = this.getDownloadedFilePath()
+
+ if (!fs.existsSync(downloadedFilePath)) {
+ return
+ }
+ if (path.extname(downloadedFilePath) !== '.zip') {
+ return super.quitAndInstall(...args)
+ }
+
+ return this.asyncQuitAndInstall(...args)
+ }
+
+ async dispatchInstallingUpdate() {
+ this.emit(this.EVENT_INSTALLING_UPDATE)
+
+ // eslint-disable-next-line no-restricted-syntax
+ for (const handler of this.installingUpdateEventHandlers) {
+ if (typeof handler !== 'function') {
+ return
+ }
+
+ // eslint-disable-next-line no-await-in-loop
+ await handler()
+ }
+ }
+
+ dispatchUpdateDownloaded(...args) {
+ super.dispatchUpdateDownloaded(...args)
+
+ this.addQuitHandler()
+ }
+
+ addQuitHandler() {
+ if (
+ this.quitHandlerAdded
+ || !this.autoInstallOnAppQuit
+ ) {
+ return
+ }
+
+ this.quitHandlerAdded = true
+
+ // this.app.onQuit((exitCode) => {
+ // if (exitCode === 0) {
+
+ // }
+ // })
+
+ // Need to use this.app.app prop due this.app is ElectronAppAdapter
+ this.app.app.once('will-quit', (e) => {
+ if (this.quitAndInstallCalled) {
+ return
+ }
+
+ e.preventDefault()
+ this.install(true, true).then((isInstalled) => {
+ if (isInstalled) {
+ setImmediate(() => this.app.quit())
+
+ return
+ }
+
+ setImmediate(() => this.app.app.exit(1))
+ })
+ })
+ }
+}
+
+module.exports = BfxMacUpdater
diff --git a/scripts/change-loading-win-visibility-state.js b/scripts/change-loading-win-visibility-state.js
new file mode 100644
index 000000000..baf825660
--- /dev/null
+++ b/scripts/change-loading-win-visibility-state.js
@@ -0,0 +1,207 @@
+const { BrowserWindow, ipcMain } = require('electron')
+const logger = require('electron-log')
+
+const wins = require('./windows')
+const {
+ hideWindow,
+ showWindow,
+ centerWindow,
+} = require('./helpers/manage-window')
+const windowCreators = require('./window-creators')
+
+let intervalMarker
+
+const _closeAllWindows = () => {
+ const _wins = BrowserWindow.getAllWindows()
+ .filter((win) => win !== wins.loadingWindow)
+
+ const promises = _wins.map((win) => hideWindow(win))
+
+ return Promise.all(promises)
+}
+
+const _setParentWindow = (noParent) => {
+ if (wins.loadingWindow.isFocused()) {
+ return
+ }
+
+ const win = BrowserWindow.getFocusedWindow()
+
+ if (
+ noParent
+ || Object.values(wins).every((w) => w !== win)
+ ) {
+ wins.loadingWindow.setParentWindow(null)
+
+ return
+ }
+
+ wins.loadingWindow.setParentWindow(win)
+}
+
+const _runProgressLoader = (opts = {}) => {
+ const {
+ win = wins.loadingWindow,
+ isIndeterminateMode = false,
+ } = { ...opts }
+
+ if (
+ !win
+ || typeof win !== 'object'
+ || win.isDestroyed()
+ ) {
+ return
+ }
+ if (isIndeterminateMode) {
+ // Change to indeterminate mode when progress > 1
+ win.setProgressBar(2)
+
+ return
+ }
+
+ const fps = 50
+ const duration = 3000 // ms
+ const interval = duration / fps // ms
+ const step = 1 / (duration / interval)
+ let progress = 0
+
+ intervalMarker = setInterval(() => {
+ if (progress >= 1) {
+ progress = 0
+ }
+
+ progress += step
+
+ if (
+ !win
+ || typeof win !== 'object'
+ || win.isDestroyed()
+ ) {
+ clearInterval(intervalMarker)
+
+ return
+ }
+
+ win.setProgressBar(progress)
+ }, interval).unref()
+}
+
+const _stopProgressLoader = (
+ win = wins.loadingWindow,
+) => {
+ clearInterval(intervalMarker)
+
+ if (
+ !win
+ || typeof win !== 'object'
+ || win.isDestroyed()
+ ) {
+ return
+ }
+
+ // Remove progress bar when progress < 0
+ win.setProgressBar(-1)
+}
+
+const _setLoadingDescription = (win, description) => {
+ return new Promise((resolve) => {
+ try {
+ if (
+ !win
+ || typeof win !== 'object'
+ || win.isDestroyed()
+ || typeof description !== 'string'
+ ) {
+ resolve()
+
+ return
+ }
+
+ ipcMain.once('loading:description-ready', (event, err) => {
+ if (err) {
+ logger.error('loading:description-ready error: ', err)
+ }
+
+ resolve()
+ })
+
+ win.webContents.send(
+ 'loading:description',
+ description,
+ )
+ } catch (err) {
+ logger.error('_setLoadingDescription error: ', err)
+
+ resolve()
+ }
+ })
+}
+
+const showLoadingWindow = async (opts = {}) => {
+ try {
+ const {
+ description = '',
+ isRequiredToCloseAllWins = false,
+ isNotRunProgressLoaderRequired = false,
+ isIndeterminateMode = false,
+ noParent = false,
+ } = { ...opts }
+
+ if (isRequiredToCloseAllWins) {
+ _closeAllWindows()
+ }
+
+ if (
+ !wins.loadingWindow
+ || typeof wins.loadingWindow !== 'object'
+ || wins.loadingWindow.isDestroyed()
+ ) {
+ await windowCreators.createLoadingWindow()
+ }
+
+ _setParentWindow(isRequiredToCloseAllWins || noParent)
+
+ if (!isNotRunProgressLoaderRequired) {
+ _runProgressLoader({ isIndeterminateMode })
+ }
+
+ await _setLoadingDescription(
+ wins.loadingWindow,
+ description,
+ )
+
+ if (wins.loadingWindow.isVisible()) {
+ return
+ }
+
+ centerWindow(wins.loadingWindow)
+
+ return showWindow(wins.loadingWindow)
+ } catch (err) {
+ logger.error('showLoadingWindow error: ', err)
+ }
+}
+
+const hideLoadingWindow = async (opts = {}) => {
+ const {
+ isRequiredToShowMainWin = false,
+ } = { ...opts }
+
+ if (isRequiredToShowMainWin) {
+ await showWindow(wins.mainWindow)
+ }
+
+ // need to empty description
+ await _setLoadingDescription(
+ wins.loadingWindow,
+ '',
+ )
+ _stopProgressLoader()
+
+ return hideWindow(wins.loadingWindow)
+}
+
+module.exports = {
+ showLoadingWindow,
+ hideLoadingWindow,
+}
diff --git a/scripts/db/.keep b/scripts/db/.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/scripts/enforce-macos-app-location.js b/scripts/enforce-macos-app-location.js
new file mode 100644
index 000000000..a4e7a1d60
--- /dev/null
+++ b/scripts/enforce-macos-app-location.js
@@ -0,0 +1,63 @@
+const { app, dialog } = require('electron')
+
+const productName = 'Bitfinex Honey'
+const {
+ showLoadingWindow,
+ hideLoadingWindow,
+} = require('./change-loading-win-visibility-state')
+
+module.exports = async () => {
+ if (
+ process.env.NODE_ENV === 'development1'
+ || process.platform !== 'darwin'
+ ) {
+ return
+ }
+ if (app.isInApplicationsFolder()) {
+ return
+ }
+
+ const clickedButtonIndex = dialog.showMessageBoxSync({
+ type: 'error',
+ message: 'Move to Applications folder?',
+ detail: `${productName} must live in the Applications folder to be able to run correctly.`,
+ buttons: [
+ 'Move to Applications folder',
+ `Quit ${productName}`,
+ ],
+ defaultId: 0,
+ cancelId: 1,
+ })
+
+ if (clickedButtonIndex === 1) {
+ app.quit()
+
+ return
+ }
+
+ await showLoadingWindow({
+ description: 'Moving the app...',
+ isRequiredToCloseAllWins: true,
+ isIndeterminateMode: true,
+ })
+
+ app.moveToApplicationsFolder({
+ conflictHandler: (conflict) => {
+ if (conflict === 'existsAndRunning') {
+ dialog.showMessageBoxSync({
+ type: 'error',
+ message: `Another version of ${productName} is currently running. Quit it, then launch this version of the app again.`,
+ buttons: [
+ 'OK',
+ ],
+ })
+
+ app.quit()
+ }
+
+ return true
+ },
+ })
+
+ await hideLoadingWindow()
+}
diff --git a/scripts/helpers/manage-window.js b/scripts/helpers/manage-window.js
new file mode 100644
index 000000000..f31dbfa4e
--- /dev/null
+++ b/scripts/helpers/manage-window.js
@@ -0,0 +1,86 @@
+'use strict'
+
+const electron = require('electron')
+
+const hideWindow = (win) => {
+ return new Promise((resolve, reject) => {
+ try {
+ if (
+ !win
+ || typeof win !== 'object'
+ || win.isDestroyed()
+ || !win.isVisible()
+ ) {
+ resolve()
+
+ return
+ }
+
+ win.once('hide', resolve)
+
+ win.hide()
+ } catch (err) {
+ reject(err)
+ }
+ })
+}
+
+const showWindow = (win) => {
+ return new Promise((resolve, reject) => {
+ try {
+ if (
+ !win
+ || typeof win !== 'object'
+ || win.isDestroyed()
+ || win.isVisible()
+ ) {
+ resolve()
+
+ return
+ }
+
+ win.once('show', resolve)
+
+ win.show()
+ } catch (err) {
+ reject(err)
+ }
+ })
+}
+
+const centerWindow = (win, workArea) => {
+ const screen = electron.screen || electron.remote.screen
+ const { getCursorScreenPoint, getDisplayNearestPoint } = screen
+
+ // doesn't center the window on mac
+ // https://github.com/electron/electron/issues/26362
+ // https://github.com/electron/electron/issues/22324
+ win.center()
+
+ const _workArea = workArea
+ && typeof workArea === 'object'
+ && Number.isFinite(workArea.width)
+ && Number.isFinite(workArea.height)
+ && Number.isFinite(workArea.x)
+ && Number.isFinite(workArea.y)
+ ? workArea
+ : getDisplayNearestPoint(getCursorScreenPoint()).workArea
+
+ const { width, height } = win.getContentBounds()
+ const {
+ width: screenWidth, height: screenHeight, x, y,
+ } = _workArea
+
+ const boundsOpts = {
+ x: Math.round(x + (screenWidth - width) / 2),
+ y: Math.round(y + (screenHeight - height) / 2),
+ }
+
+ win.setBounds(boundsOpts)
+}
+
+module.exports = {
+ hideWindow,
+ showWindow,
+ centerWindow,
+}
diff --git a/scripts/ipcs.js b/scripts/ipcs.js
new file mode 100644
index 000000000..66eb40a32
--- /dev/null
+++ b/scripts/ipcs.js
@@ -0,0 +1,5 @@
+'use strict'
+
+module.exports = {
+ serverIpc: null,
+}
diff --git a/scripts/postbuild.bat b/scripts/postbuild.bat
new file mode 100644
index 000000000..cdc2962fd
--- /dev/null
+++ b/scripts/postbuild.bat
@@ -0,0 +1,12 @@
+@echo off
+
+if exist %CD%\build (
+ del /s /f /q %CD%\build
+ rd /s /q .\build
+)
+
+mkdir build
+robocopy %CD%\bfx-hf-ui-core\build %CD%\build /e
+robocopy %CD%\public %CD%\build /e
+
+exit /b 0
diff --git a/scripts/start-api-server.js b/scripts/start-api-server.js
new file mode 100755
index 000000000..ee158f0cd
--- /dev/null
+++ b/scripts/start-api-server.js
@@ -0,0 +1,32 @@
+process.env.DEBUG = 'bfx:hf:*'
+process.env.DEBUG_TRACE = true
+
+require('dotenv').config()
+require('bfx-hf-util/lib/catch_uncaught_errors')
+
+const startHFServer = require('bfx-hf-server')
+const os = require('os')
+const { version } = require('../package.json')
+
+const dir = `${os.homedir()}/.bitfinexhoney`
+const { locale } = Intl.DateTimeFormat().resolvedOptions()
+
+startHFServer({
+ dataDir: dir,
+ uiDBPath: `${dir}/ui.json`,
+ algoDBPath: `${dir}/algos.json`,
+
+ bfxWSURL: process.env.WS_URL,
+ bfxRestURL: 'https://api.bitfinex.com/',
+ bfxHostedWsUrl: process.env.HOSTED_WS_URL,
+ strategyExecutionPath: `${dir}/strategy-executions.json`,
+
+ bfxMetricsWsUrl: process.env.METRICS_SERVER_URL || 'wss://h.bitfinex.com/ws/metrics/',
+ os: process.platform,
+ releaseVersion: version,
+ isRC: version.includes('rc'),
+ locale,
+
+ // Data servers are started by individual scripts
+ // hfBitfinexDBPath: `${__dirname}/db/hf-bitfinex.json`,
+})
diff --git a/scripts/start-ds-bitfinex.js b/scripts/start-ds-bitfinex.js
new file mode 100755
index 000000000..a3a3002d2
--- /dev/null
+++ b/scripts/start-ds-bitfinex.js
@@ -0,0 +1,30 @@
+process.env.DEBUG = 'bfx:hf:*'
+
+require('dotenv').config()
+require('bfx-hf-util/lib/catch_uncaught_errors')
+
+const HFDB = require('bfx-hf-models')
+const os = require('os')
+const DataServer = require('bfx-hf-data-server')
+const HFDBLowDBAdapter = require('bfx-hf-models-adapter-lowdb')
+const { schema: HFDBBitfinexSchema } = require('bfx-hf-ext-plugin-bitfinex')
+
+// const dir = `${os.homedir()}/.bitfinexhoney`
+
+const dbBitfinex = new HFDB({
+ schema: HFDBBitfinexSchema,
+ adapter: HFDBLowDBAdapter({
+ dbPath: `${os.homedir()}/.bitfinexhoney/hf-bitfinex.json`,
+ }),
+})
+
+const dsBitfinex = new DataServer({
+ port: 23521,
+ db: dbBitfinex,
+ sqlitePath: `${os.homedir()}/.bitfinexhoney`,
+})
+
+dsBitfinex.open()
+ .catch(err => {
+ console.error(err)
+ })
diff --git a/scripts/start-server.js b/scripts/start-server.js
deleted file mode 100644
index d08a922a5..000000000
--- a/scripts/start-server.js
+++ /dev/null
@@ -1,190 +0,0 @@
-process.env.DEBUG = 'bfx:hf:*'
-
-/* eslint-disable */
-require('dotenv').config()
-require('bfx-hf-util/lib/catch_uncaught_errors')
-
-// internal
-const HFDBLowDBAdapter = require('bfx-hf-models-adapter-lowdb')
-const { schema: HFDBBitfinexSchema } = require('bfx-hf-ext-plugin-bitfinex')
-const { RESTv2 } = require('bfx-api-node-rest')
-const HFDB = require('bfx-hf-models')
-const hfDb = new HFDB({
- schema: HFDBBitfinexSchema,
- adapter: HFDBLowDBAdapter({
- dbPath: `${__dirname}/../db`,
- schema: HFDBBitfinexSchema
- })
-})
-const { Credential } = hfDb
-const CRED_KEY = 'hf-ui-credentials'
-
-
-// external
-const debug = require('debug')('bfx:hf:api-server')
-const _isString = require('lodash/isString')
-const CORS = require('cors')
-const Express = require('express')
-const BodyParser = require('body-parser')
-const HFServer = require('bfx-hf-server')
-const SocksProxyAgent = require('socks-proxy-agent')
-const requestProxy = require('express-request-proxy')
-/* eslint-enable */
-
-const {
- SOCKS_PROXY_URL, REST_URL, WS_URL,
-} = process.env
-const API_PORT = process.env.API_PORT || '9987'
-
-const run = async () => {
- const app = Express()
-
- app.use(CORS())
- app.use(BodyParser.json())
-
- let hfServer = null
- let restAPI = null
-
- const startHFServer = async () => {
- if (hfServer) {
- hfServer.close()
- }
- const creds = await Credential.get(CRED_KEY)
- if (creds) {
- restAPI = new RESTv2({
- apiKey: creds.key,
- apiSecret: creds.secret,
- agent: SOCKS_PROXY_URL ? new SocksProxyAgent(SOCKS_PROXY_URL) : null,
- url: REST_URL,
- })
- hfServer = new HFServer({
- db: hfDb,
- apiKey: creds.key,
- apiSecret: creds.secret,
- transform: true,
- proxy: true,
- asPort: 9999,
- dsPort: 8899,
- hfPort: 7799,
- port: 10000,
- agent: SOCKS_PROXY_URL ? new SocksProxyAgent(SOCKS_PROXY_URL) : null,
- restURL: REST_URL,
- wsURL: WS_URL,
- })
- }
- }
-
- app.get('/api-key', async (req, res) => {
- const creds = await Credential.get(CRED_KEY)
- if (!creds) {
- return res.status(200).json({ error: `Unable to find api credentials for id ${CRED_KEY}` })
- }
- return res.json({
- key: creds.key,
- secret: creds.secret,
- })
- })
-
- app.post('/api-key', async (req, res) => {
- const { key, secret } = req.body
-
- if (!_isString(key)) {
- return res.status(400).json({ error: 'No API key provided' })
- }
-
- if (!_isString(secret)) {
- return res.status(400).json({ error: 'No API secret provided' })
- }
-
- try {
- await Credential.create({
- cid: CRED_KEY,
- key,
- secret,
- })
- } catch (error) {
- console.error(error)
- return res.status(500).json({ error: error.message })
- }
- startHFServer()
- return res.json({ key, secret })
- })
-
- app.post('/api-key-update', async (req, res) => {
- const { key, secret } = req.body
- debug(key, secret)
-
- if (!_isString(key)) {
- return res.status(400).json({ error: 'No API key provided' })
- }
-
- if (!_isString(secret)) {
- return res.status(400).json({ error: 'No API secret provided' })
- }
-
- try {
- debug(await Credential.update(CRED_KEY, {
- cid: CRED_KEY,
- key,
- secret,
- }))
- } catch (error) {
- debug('===============', error)
- return res.status(500).json({ error: error.message })
- }
- startHFServer()
- return res.json({ key, secret })
- })
-
- app.post('/reconnect-bfx', async (req, res) => {
- await startHFServer()
- res.status(200)
- })
-
-
- app.get('/v2/tickers', requestProxy({
- url: 'https://www.bitfinex.com/v2/tickers',
- }))
-
- app.get('/v2/auth/r/settings', requestProxy({
- url: 'https://www.bitfinex.com/v2/auth/r/settings',
- }))
-
- // app.post('/v2/auth/r/orders/hist', requestProxy({
- // url: 'https://www.bitfinex.com/v2/auth/r/orders/hist',
- // }))
-
- app.post('/v2/auth/r/orders/hist', async (req, res) => {
- if (restAPI === null) {
- return res.status(503).json({ error: 'REST API unavailable' })
- }
-
- const { limit, end = Date.now() } = req.query
- const data = await restAPI.orderHistory(null, null, end, +limit)
-
- return res.json(data)
- })
-
- app.post('/v2/auth/r/orders/:sym/hist', async (req, res) => {
- if (restAPI === null) {
- return res.status(503).json({ error: 'REST API unavailable' })
- }
-
- const { sym } = req.params
- const { limit, end = Date.now() } = req.query
- const data = await restAPI.orderHistory(sym, null, end, limit)
-
- return res.json(data)
- })
-
- await startHFServer()
- app.listen(API_PORT)
-
- debug(`server listening on port ${API_PORT}`)
-}
-
-try {
- run()
-} catch (e) {
- debug('error: %s', e.message)
-}
diff --git a/scripts/window-creators.js b/scripts/window-creators.js
new file mode 100644
index 000000000..8dd4657ef
--- /dev/null
+++ b/scripts/window-creators.js
@@ -0,0 +1,168 @@
+'use strict'
+
+const electron = require('electron')
+// const serve = require('electron-serve')
+const path = require('path')
+const url = require('url')
+// const logger = require('electron-log')
+
+const { BrowserWindow } = electron
+// const isDevEnv = process.env.NODE_ENV === 'development'
+
+const wins = require('./windows')
+const ipcs = require('./ipcs')
+const {
+ showLoadingWindow,
+ // hideLoadingWindow,
+} = require('./change-loading-win-visibility-state')
+const { showWindow, centerWindow } = require('./helpers/manage-window')
+
+const pathToLayoutAppInit = path.join('', 'app_init.html')
+
+const _createWindow = async (
+ { pathname = null, winName = 'mainWindow' } = {},
+ props = {},
+) => {
+ const point = electron.screen.getCursorScreenPoint()
+ const { bounds, workAreaSize } = electron.screen.getDisplayNearestPoint(point)
+ const { width: defaultWidth, height: defaultHeight } = workAreaSize
+ const isMainWindow = winName === 'mainWindow'
+ const {
+ width = defaultWidth,
+ height = defaultHeight,
+ x,
+ y,
+ isMaximized,
+ manage,
+ } = {}
+ const _props = {
+ autoHideMenuBar: true,
+ width,
+ height,
+ minWidth: 1000,
+ minHeight: 650,
+ x: !x ? bounds.x : x,
+ y: !y ? bounds.y : y,
+ icon: path.join(__dirname, '../build/icon.png'),
+ backgroundColor: '#172d3e',
+ show: true,
+ // webPreferences: {
+ // preload: path.join(__dirname, '../build/preload.js'),
+ // },
+ ...props,
+ }
+
+ wins[winName] = new BrowserWindow(_props)
+
+ const startUrl = pathname
+ ? url.format({
+ pathname,
+ protocol: 'file:',
+ slashes: true,
+ })
+ : 'app://-'
+
+ if (!pathname) {
+ // eslint-disable-next-line no-undef
+ await loadURL(wins[winName])
+ }
+
+ wins[winName].on('closed', () => {
+ wins[winName] = null
+
+ if (ipcs.serverIpc && typeof ipcs.serverIpc === 'object') {
+ ipcs.serverIpc.kill('SIGINT')
+ }
+ })
+
+ await wins[winName].loadURL(startUrl)
+
+ const res = {
+ isMaximized,
+ isMainWindow,
+ manage,
+ win: wins[winName],
+ }
+
+ if (!pathname) {
+ // eslint-disable-next-line no-use-before-define
+ await createLoadingWindow()
+
+ return res
+ }
+ if (_props.center) {
+ centerWindow(wins[winName])
+ }
+
+ await showWindow(wins[winName])
+
+ return res
+}
+
+const _createChildWindow = async (pathname, winName, opts = {}) => {
+ const { width = 500, height = 500 } = { ...opts }
+
+ const point = electron.screen.getCursorScreenPoint()
+ const { bounds } = electron.screen.getDisplayNearestPoint(point)
+ const x = Math.ceil(bounds.x + (bounds.width - width) / 2)
+ const y = Math.ceil(bounds.y + (bounds.height - height) / 2)
+
+ const winProps = await _createWindow(
+ {
+ pathname,
+ winName,
+ },
+ {
+ minWidth: width,
+ minHeight: height,
+ x,
+ y,
+ resizable: false,
+ center: true,
+ parent: wins.mainWindow,
+ frame: false,
+ ...opts,
+ },
+ )
+
+ winProps.win.on('closed', () => {
+ if (wins.mainWindow) {
+ wins.mainWindow.close()
+ }
+
+ wins.mainWindow = null
+ })
+
+ return winProps
+}
+
+const createLoadingWindow = async () => {
+ if (
+ wins.loadingWindow
+ && typeof wins.loadingWindow === 'object'
+ && !wins.loadingWindow.isDestroyed()
+ && !wins.loadingWindow.isVisible()
+ ) {
+ await showLoadingWindow()
+
+ return {}
+ }
+
+ const winProps = await _createChildWindow(
+ pathToLayoutAppInit,
+ 'loadingWindow',
+ {
+ width: 350,
+ height: 350,
+ webPreferences: {
+ nodeIntegration: true,
+ contextIsolation: false,
+ },
+ },
+ )
+
+ return winProps
+}
+module.exports = {
+ createLoadingWindow,
+}
diff --git a/scripts/windows.js b/scripts/windows.js
new file mode 100644
index 000000000..00673539c
--- /dev/null
+++ b/scripts/windows.js
@@ -0,0 +1,7 @@
+'use strict'
+
+module.exports = {
+ mainWindow: null,
+ loadingWindow: null,
+ errorWindow: null,
+}
diff --git a/src/StoreWrapper.js b/src/StoreWrapper.js
deleted file mode 100644
index 4130ab27f..000000000
--- a/src/StoreWrapper.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import React from 'react'
-import { Provider } from 'react-redux'
-import { routerReducer, routerMiddleware } from 'react-router-redux'
-// import { configureStore } from 'bfxuilib/dist/redux'
-import { configureStore } from './redux'
-
-import sagas from './redux/sagas'
-import dataReducer from './redux/reducers/data'
-import hfSocketReducer from './redux/reducers/ws-hf-server'
-import hfSocketMiddleware from './redux/middleware/ws-hf-server'
-
-const config = {
- development: true,
- sagas,
-}
-
-const optionalReducers = {
- router: routerReducer,
- socketHF: hfSocketReducer,
- dataHF: dataReducer,
-}
-
-const optionalMiddleware = [
- hfSocketMiddleware(),
- routerMiddleware(),
-]
-
-export const store = configureStore(
- config,
- optionalReducers,
- optionalMiddleware,
-)
-
-window._store = store
-
-export default class StoreWrapper extends React.PureComponent {
- render() {
- return (
-
- {this.props.children}
-
- )
- }
-}
diff --git a/src/components/ADAOForm/AlgoOrderForm.js b/src/components/ADAOForm/AlgoOrderForm.js
deleted file mode 100644
index 39aa77ae5..000000000
--- a/src/components/ADAOForm/AlgoOrderForm.js
+++ /dev/null
@@ -1,117 +0,0 @@
-import React, { PureComponent } from 'react'
-import Modal from 'react-modal'
-import { Icon } from '@blueprintjs/core'
-import { NotificationManager } from 'react-notifications'
-
-import { store } from '../../StoreWrapper'
-
-const customStyles = {
- content: {
- top: '40%',
- left: '50%',
- bottom: 'auto',
- width: '50%',
- marginRight: '-50%',
- transform: 'translate(-50%, -50%)',
- background: '#161E24',
- border: 'none',
- position: 'relative',
- },
- overlay: {
- background: 'rgba(0,0,0,0.5)',
- },
-}
-
-export default class ModalForm extends PureComponent {
- state = {
- modalIsOpen: false,
- fileName: '',
- }
-
- toggleModal() {
- const { modalIsOpen } = this.state
- this.setState({
- modalIsOpen: !modalIsOpen,
- fileName: '',
- })
- }
-
- handleFile(e) {
- if (e.target.files[0]) {
- const { name } = e.target.files[0]
- this.setState({ fileName: name })
- }
- }
-
- handleSubmit(e) {
- e.preventDefault()
- const { algoName, algoDesc } = e.target
-
- /* POST data to HF server (this is pseudo-code)
-
- const options = {
- name: algoName.value,
- description: algoDesc.value,
- file: this.state.file,
- }
- axios.('POST','some-back-url', options)
-
- */
-
- store.dispatch({
- type: 'ADD_ALGO_ORDER',
- payload: {
- algoOrder: [42, 'bfx-ping_pong', false, null, 1561361614648],
- },
- })
- NotificationManager.success('Algo order Succesfuly added!', 'Success!')
- this.toggleModal()
- }
-
- render() {
- const { modalIsOpen, fileName } = this.state || {}
- return (
-