API Endpoints
The base URL is the URL of the wallet installation.
Responses and errors
Usually an API call will return a 200 OK HTTP response:
{
"status": "ok"
}
But if API call is unsuccessful you will get a JSON response with a list of errors:
{
"status": "error",
"errors": [{"hashed_password": "required"},{"__all__": "invalid_login"}]
}
The key in "errors" array contains name of the field. all key means error doesn't have certain field. List of possible values and their meanings is described at Error meanings section.
Authorization
User's password first must be hashed using Ambisafe EToken JS library:
var hashed_password = EToken.Ambisafe.deriveKey(password, EToken.Ambisafe.SHA1(password), 2000);
POST /api/login:
{
"email": "test@test.com",
"password": "c466d3d67153d98a220679ca31d16c219f9acb408685647c762d6ef9d965c1f7"
"mobile_token": "coI_xMeRusw:APA91bEjTHplB_WUljzIYDLjSXPc-Zen_5v0l1xHQ75WN-vO6Ctf0Fj9FEL7hOTyljPKFi_4x3wNKo7R0MKCgf1Wf0w_pC6r1VRyWT31st_i-tZWDcNSwWxgo74rCfajsTg74v8l5PZ0" # Not required, used to send push notifications
"device": 1/2/3 # DEVICE_IOS = 1 DEVICE_ANDROID = 2 DEVICE_WINDOWS = 3 # Reqiured if mobile token was sent
}
Response:
"status": "ok"
If user enable his OTP protection for login or its needed because of some device/ip/browser canges: Response:
"status": "ok", "data": "OTP confirmation needed"
And email woth OTP token will be sent
Signup
User's password first must be hashed and new account should be generated using Ambisafe EToken JS library:
function b64EncodeUnicode(str) {
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
return String.fromCharCode('0x' + p1);
}));
}
var hashed_password = EToken.Ambisafe.deriveKey(password, EToken.Ambisafe.SHA1(password), 2000);
var account = EToken.Ambisafe.generateAccount('BTC', password, EToken.Ambisafe.SHA1(password));
var wallet = b64EncodeUnicode(account.getStringContainer());
var trust_raw = EToken.buildRawTransaction(etoken_contract, 'trust')(window.opts.recovery_contract_address,
{
gas: gas, gasPrice: gasPrice, nonce: 0
}
);
var approve_raw = EToken.buildRawTransaction(proxy_contract, 'approve')(window.opts.contract_address,
'0xf000000000000000000000000000000000000000000000000000000000000000',
{
gas: gas, gasPrice: gasPrice, nonce: 1
}
);
!!!!!!It is important to build Trust first bcs its nonce must lower then approve tx, becouse there could be situations when no approve needed!!!!
POST /api/signup:
{
"email": "test@test.com",
"first_name": "Test",
"last_name": "User",
"password": "c466d3d67153d98a220679ca31d16c219f9acb408685647c762d6ef9d965c1f7",
"wallet": "eyJzYWx0IjoiMzU2YTE5MmI3OTEzYjA0YzU0NTc0ZDE4YzI4ZDQ2ZTYzOTU0MjhhYiIsImN1cnJlbmN5IjoiQlRDIiwicHVibGljS2V5IjoiMDNmNDlhMDdiNTkxYThkZjUzYWVmYWM2MWJiOWMxNjE5OGUzMTk1ZGQ3NTBiNzkyOWViYTU2NWJlYzdiNGMxMmRhIiwiaXYiOiI0MTFjYzg0OTk3MWI0MDIxM2RhMTM4YjAwMTZlZjMzMCIsImRhdGEiOiJiMGU1Y2EwZjY4OWYyZGU3NmYxODY1NTJiNzg4ZWU1YTcyMjMxZGUwNDI4Zjk4YTNmZmJmZWE2ZDk5YTMyYzEzYTQyZDE0NTJjNWEwNjZiM2NjNzljODUxYWVkYjY5ZWZkN2VmNDIwMDAwMmIyZTVlNjcyOTliYmU1ZTQyMGIzYWI4YTdiNjY1MWRjOTg5ODQ2MzQxMDJjYjJlMzIxZDE5In0=",
"approve_raw": '0xf8aa808504e3b292008303d0909411dc9acbbd6eac0096ac6d08beb36121303f4c0d80b844095ea7b'
'30000000000000000000000003fce483a0236ba36869e4e82151006045e7d3331f000000000000000000'
'0000000000000000000000000000000000000000000001ba040e51255ad2076e715f5ccf86844cd816542'
'126b95b2f92170cca318adf8ca5ea00bab0a4742750f4f6271d94be0cba23a37ee04968a718422b4f21d06cb2bfd9e',
"trust_raw": '0xf889808504e3b292008303d090943fce483a0236ba36869e4e82151006045e7d333180a44637d827000000000000000'
'00000000000462a425aa5c86830cc6bd02d81675b0f736f801ca01c4e4edad7e88d6a12ddbf12b470ef56a1980a385534'
'be6aafaad062e8a9b0c6a01a01c004f23f358d386569a820a1d3c6fc5eee2908d5365edd4db556df9a51a7'
}
Confirm email
Server sends email with next link example: ###cryptocarbon://login?action=verifyEmail&email={{ email }}&token={{ token }}###
POST /api/email/verify:
{
"email": "test@test.com",
"token": "dbc2a2c9-5c31-4a7c-bfe5-97f4515d35db"
}
Check email existance
GET /api/email/existence/{email}/ response:
{
"status": "ok",
"existance": "True/False",
}
Getting encrypted container
GET /api/account/container response:
{
"public_key": "032af8969d20bcda259f20cb2ead949ebb4e07daebd16ef13e2ac23ef3fc12cbe3",
"data": "4f9eb6bd875e69d1409403ad22fedacd9a618187eace546c1bab233a92c09499b1a99043617773d0730a71066816d7ae",
"salt": "40bd001563085fc35165329ea1ff5c5ecbdbbeef",
"iv": "efd5d8f44f13acb87b4e82664bf555a1"
}
Set reactivation raws
POST /api/account/activate/raws/:
{
"approve_raw": '0xf8aa808504e3b292008303d0909411dc9acbbd6eac0096ac6d08beb36121303f4c0d80b844095ea7b'
'30000000000000000000000003fce483a0236ba36869e4e82151006045e7d3331f000000000000000000'
'0000000000000000000000000000000000000000000001ba040e51255ad2076e715f5ccf86844cd816542'
'126b95b2f92170cca318adf8ca5ea00bab0a4742750f4f6271d94be0cba23a37ee04968a718422b4f21d06cb2bfd9e',
"trust_raw": '0xf889808504e3b292008303d090943fce483a0236ba36869e4e82151006045e7d333180a44637d827000000000000000'
'00000000000462a425aa5c86830cc6bd02d81675b0f736f801ca01c4e4edad7e88d6a12ddbf12b470ef56a1980a385534'
'be6aafaad062e8a9b0c6a01a01c004f23f358d386569a820a1d3c6fc5eee2908d5365edd4db556df9a51a7'
}
Success response:
{
"status": "ok",
}
Getting account info
GET /api/account response:
{
"email": "test@test.com",
"phone": "+17777777123",
"first_name": "Darth",
"last_name": "Vader",
"state": "Tattoine",
"country": "GB",
"login_otp_enabled": "True"/"False",
"transaction_maximum_amount": "100.000",
"netki_nick_name": dart.ambisafe.co # or False if no Netki name,
"activation": 0/1/2/3,
"reactivation_needed": true/false
}
ACTIVATION STATUSES CODES: STATUS_NOT_ACTIVATED = 0 STATUS_IN_PROCESS = 1 STATUS_DONE = 2 STATUS_FAILED = 3 You need to show some message and block send transaction ability in case activation != 2;
Getting countries list
GET /api/countries response:
{
{"countries":
{
"BD": "Bangladesh",
"BE": "Belgium",
"BF": "Burkina Faso",
"BG": "Bulgaria"
...
}
Set account first_name/ last_name
POST /api/account/name POST data:
{
"first_name": "Darth"
"last_name": "Vader"
}
Error response:
```json
{
"status": "error",
"errors": {errors}
}
Success response:
{
"status": "ok"
}
Set account profile
POST /api/account/profile Get country code from countries endpoint POST data:
{
"country": "UA"
"state": "Kiev"
}
Success response:
```json
{
"status": "error",
"errors": {errors}
}
Error response:
{
"status": "ok"
}
Change password
POST /api/account/password POST data:
{
"old_password": "c466d3d67153d98a220679ca31d16c219f9acb408685647c762d6ef9d965c1f7",
"password": "5555d3d67153d98a123456ca31d16c219f9acb408685647c762d6ef9d965cc56",
"wallet": "eyJzYWx0IjoiMzU2YTE5MmI3OTEzYjA0YzU0NTc0ZDE4YzI4ZDQ2ZTYzOTU0MjhhYiIsImN1cnJlbmN5IjoiQlRDIiwicHVibGljS2V5IjoiMDNmNDlhMDdiNTkxYThkZjUzYWVmYWM2MWJiOWMxNjE5OGUzMTk1ZGQ3NTBiNzkyOWViYTU2NWJlYzdiNGMxMmRhIiwiaXYiOiI0MTFjYzg0OTk3MWI0MDIxM2RhMTM4YjAwMTZlZjMzMCIsImRhdGEiOiJiMGU1Y2EwZjY4OWYyZGU3NmYxODY1NTJiNzg4ZWU1YTcyMjMxZGUwNDI4Zjk4YTNmZmJmZWE2ZDk5YTMyYzEzYTQyZDE0NTJjNWEwNjZiM2NjNzljODUxYWVkYjY5ZWZkN2VmNDIwMDAwMmIyZTVlNjcyOTliYmU1ZTQyMGIzYWI4YTdiNjY1MWRjOTg5ODQ2MzQxMDJjYjJlMzIxZDE5In0="
}
To generate new container use:
account = new EToken.Ambisafe.Account(window.opts.container, oldPassword);
account.setNewPassword(password);
data: {
password: EToken.Ambisafe.deriveKey(password, EToken.Ambisafe.SHA1(password), 2000),
wallet: b64EncodeUnicode(account.getStringContainer()),
old_password: EToken.Ambisafe.deriveKey(oldPassword, EToken.Ambisafe.SHA1(oldPassword), 2000),
}
Success response:
{
"status": "error",
"errors": {errors}
}
Error response:
{
"status": "ok"
}
Request email with wallet backup
POST /api/account/wallet/backup/ Empty data response:
{
"status": "ok",
}
Getting account balance
GET /api/account/balance response:
{
"balance": 1.3567,
}
Getting account address
GET /api/account/address response:
{
"address": "0x9cbfcb30e3f53acf708907a7a246d2aec943c003",
}
Getting account activation status
GET /api/account/activation/status/ response:
{
"isTrusted": "True/False",
"feeIsAllowed": "True/False"
}
Getting qr code of address
GET /api/qr/{address}/ response:
HTTP Response with content_type="image/png"
Getting account transactions list
GET /api/transactions response:
{
"type": 0/1, # 0 = INCOMING; 1 = OUTGOING
"detail": 0/1/2, #0='Simple tx' 1='Exchange tx' 2='POS/POT transaction'
"status": 1/2/3, # 1='pending', 2='confirmed', 3='failed'
"currency_code": "AMB",
"sender_address": "0x9cbfcb30e3f53acf708907a7a246d2aec943c003",
"recipient_address": "0xcdf5fb30e3f53acf756987a7a246d2aec943c773",
"amount": 123000000, # Amount returned in contract view, and must be devided by 10**base_unit
"timestamp": 12345678,
"transaction_hash": "0x06d8b67d1c631226f346ed6853212953cc275608ee23c5e8b35f138788d3d231",
"text_status": "Received/Sent/In process",
"user_amount": "123,000000", #User like amount
"user_date": "%Y-%m-%d %H:%M:%S",
"paid_fee": 3000000,
"transaction_reference": "Hello World"
}
Submititng transaction to server
POST /api/transaction/submit POST data:
{
"destination": "0x9cbfcb30e3f53acf708907a7a246d2aec943c003"
"hash": "0x06d8b67d1c631226f346ed6853212953cc275608ee23c5e8b35f138788d3d231"
"amount": 31.3245,
"asset": "AMB",
"fee": 0,
"reference": 'Hello World' # Transaction comment, could be empty
}
response:
{
"status": "ok", "tx": "{ tx.pk }"
}
Getting contract variables
GET /api/contracts response:
{
"contract_address": "0x9cbfcb30e3f53acf708907a7a246d2aec943c003",
"contract_currency": "AMB",
"icap_currency_symbol": "AMB",
"etoken_contract": "0xcdf5fb30e3f53acf756987a7a246d2aec943c773",
"recovery_contract_address": "0x7e7348ba686953f05995326bf50c9d29290bdacb",
"base_unit": 6,
"use_fee": True/False # Tells does wallet uses fee for transactions,
"topup_amount": 8000000000000000 # Tells wich ethers amount (in wei) must be on users addres after topup
}
Request 2fa token
POST /api/register/request_2fa_token POST data:
{
"phone_number": "+177757473"
"call": "True/False" #If True user will receive phone call, if False will receive SMS
}
Success response:
{
"data": "Sms was sent to your number"
}
Error responseresponse:
{
"data": "{error}"
}
Confirming 2fa token
POST /api/register/validate_2fa_token POST data:
{
"auth_token": "1235"
}
Success response:
{
"data": "Token ok"
}
Error response:
{
"data": "Security token is wrong"
}
Account recovery Request
Please notice that account must be trusted to recovery contract to have ability to make recovery request.
POST /api/account/recovery/request/
POST data:
{
"email": "darth_vader@empire.com"
}
Success response:
{
"status": "ok"
}
Error response:
{
"status": "error",
"errors": {errors}
}
Get exchangeable currencies
GET /api/exchange/currencies/
Success response: Returns list of currencies that can be exchanged
{
"status": "ok",
"data": "{['AMB', 'BTC', 'EXP']}"
}
Error response:
{
"status": "error",
"errors": {errors}
}
Create exchange order
POST /api/exchange/create/ List of exchangeable could be taken from currencies endpoint POST data:
{
"amount": "123"
"source_currency": "HAU",
"target_currency": "BTC",
"target_address"="1HfKonf6kNMQwoSKcqxk2uMiHYTvk19WJg" #Required when 'target_currency' == 'BTC'
}
Success response: Returns created order primary key
{
"status": "ok", "data": "1"
}
Error response:
{
"status": "error",
"errors": {errors}
}
Possible errors: "all":"exchange_is_not_active", "amount":"invalid", "all":"minimal_exchange_amount", "all":"exchange_wallet_empty", "target_address":"invalid"
Get exchange order
GET /api/exchange/order/{pk}/
Success response: Returns created order primary key
{
"status": "ok", "order": "
{
"pk": 1,
"created_at": "1469806001",
"status": "CREATED",
"target_currency": "BTC",
"exchanged_amount": 1.000,
"amount_to_exchange": 0.002,
"exchange_rate": 0.00152627,
"source_account_id": 2,
"target_account_id": 2,
"updated_at": "1469806001",
"exchange_transaction_id": "59dd49d58394bc037d6b0bea36ca93961b09d94b3a264f254a18e1c3cc12f2b2",
"withdrawal_transaction_id": "0xdeb7b1b25a056550af066d18ab5c80c67968ef1b7391ed876979d6ee53353eac",
"source_currency": "AMB",
"exchange_btc_address": "1DWewC8uxcPwsYSWpPNneDtJJjcjGgT3w2",
"left_to_pay": 0.002,
"invoice_time_left": 356
}"
}
Error response:
{
"status": "error",
"errors": {errors}
}
Get exchange orders list
GET /api/exchange/order/list/
Success response: Returns created order primary key
{
"status": "ok",
"order": "
[{
"pk": 1,
"created_at": "1469806001",
"status": "CREATED",
"target_currency": "BTC",
"exchanged_amount": 1.000,
"amount_to_exchange": 0.002,
"exchange_rate": 0.00152627,
"source_account_id": 2,
"target_account_id": 2,
"updated_at": "1469806001",
"exchange_transaction_id": "59dd49d58394bc037d6b0bea36ca93961b09d94b3a264f254a18e1c3cc12f2b2",
"withdrawal_transaction_id": "0xdeb7b1b25a056550af066d18ab5c80c67968ef1b7391ed876979d6ee53353eac",
"source_currency": "AMB",
"exchange_btc_address": "1DWewC8uxcPwsYSWpPNneDtJJjcjGgT3w2",
"left_to_pay": 0.002,
"invoice_time_left": 356
},
{
"pk": 2,
"created_at": "146980609",
"status": "CREATED",
"target_currency": "BTC",
"exchanged_amount": 1.000,
"amount_to_exchange": 0.002,
"exchange_rate": 0.00152627,
"source_account_id": 2,
"target_account_id": 2,
"updated_at": "1469806009",
"exchange_transaction_id": "59dd49d58394bc037d6b0bea36ca93adadadb3a264f254a18e1c3cc12f2b2",
"withdrawal_transaction_id": "0xdeb7b1b25a056550af066d18abweqwe7968ef1b7391ed876979d6ee53353eac",
"source_currency": "AMB",
"exchange_btc_address": "1DWewC8uxcPwsYSWpPNneDtJJjcjGcT3G3",
"left_to_pay": 0.002,
"invoice_time_left": 356
}]"
}
Error response:
{
"status": "error",
"errors": {errors}
}
Get exchange rates
GET /api/exchange/rates/
Success response: List of rates
{
"exchange_rates" :
[{
"exchange_rate": "576.46000000",
"source_currency": "BTC",
"target_currency": "USD",
"created_at": "1469806009",
"updated_at": "1469806009"
},{
"exchange_rate": "0.00001735",
"source_currency": "AMB",
"target_currency": "BTC",
"created_at": "1469806009",
"updated_at": "1469806009"
}]
}
Request OTP token message
GET /api/account/otp/protection
Success response: List of rates
{
"status": "ok"
}
Validate OTP token message
POST /api/account/otp/protection POST data:
{
"otp_token": "12345"
}
Success response:
{
"status": "ok"
}
Wrong token response:
{
"status": "error",
"errors": [{"__all__": "wrong_otp"}]
}
Edit Security settings
POST /api/account/set/security POST data:
{
"transaction_maximum_amount": "1.00",
"advanced_security_mode": "True/False"
}
Success response:
{
"status": "ok"
}
Wrong token response:
{
"status": "error",
"errors": "{errors}"
}
Get sessions
GET /api/account/sessions/
Success response: List of sessions
{
"sessions" :
[{
"os": "Ubuntu",
"browser_family": "Chrome",
"device": "Desktop",
"ip_address": "10.0.0.0",
"time": "1469806009"
},{
"os": "Windows",
"browser_family": "Firefox",
"device": "Desktop",
"ip_address": "10.0.0.1",
"time": "1469806009"
}]
}
Address Book
GET/POST/DELETE /address_book/api/
GET returns all users address book notes:
{ "status": "ok",
"sessions" :
[{
"pk": "1",
"address_nickname": "Darth Vader",
"description": "Lord",
"recipient_address": "0x7e7348ba686953f05995326bf50c9d29290bdacb",
},{
"pk": "2",
"address_nickname": "Palpatin",
"description": "Emperor",
"recipient_address": "0x7e7348ba686953f05995326bf50c9d29290bdacc",
}]
}
POST to create new note:
{
"address_nickname": "Darth Vader", # Must be unique per user
"description": "Lord", # Not required
"recipient_address": "0x7e7348ba686953f05995326bf50c9d29290bdacb", # Must be unique per user
}
response:
```json
{
"status": "ok"
}
status_code = 201
Posible errors: 'nickname_duplication', 'duplicate_address', 'invalid_address', 'wrong_nickname', 'wrong_description'
DELETE to remove note: Send list of notes pk's will remove them.
{
"idtodelete": "[1,2,3]"
}
response:
{
"status": "ok"
}
Netki setup/update
POST /api/netki/setup/
POST to create or updated if instance already exists (updates only name):
{
"netki_name": "Darth Vader",
}
response:
```json
{
"status": "ok"
}
status_code = 201
Netki domain name lookup
GET /api/netki/get/address/{{name}}/
response:
{
"status": "ok",
"address": "0xf313590f37bf6c09f65f9014cfca8bafb39aa1ca"
}
status_code = 200
Error meanings
"required": "Заполните это поле" "Please fill out this field"
"invalid_login": "Пожалуйста, укажите действительные имя пользователя и пароль. Учтите, что оба поля чувствительны к регистру", "Please enter valid username and password. Pay attention that both fields are case sensitive",
"inactive": "Этот аккаунт неактивен, свяжитесь с администрацией" "This account is inactive, please contact support",
"email_not_confirmed": "Электронный адрес не подтвержден" "This email is not confirmed",
"phone_not_confirmed": "Номер телефона не подтвержден" "This phone number is not confirmed",
"keyserver_error": "Can"t connect to KeyServer, try again later or contact support",
"invalid_login_code": "Вы ввели неверный код аутентификации. Вы сможете повторно залогиниться не ранее, чем через 2 минуты" "You have entered wrong authentication code. You can try to re-login in 2 minutes ",
"password_mismatch": "Пароли не совпадают" "Passwords do not match",
"phone_number_exists": "Этот номер телефона уже существует в базе" "This phone number already exists in a database",
"phone_number_wrong_characters": "Только цифры, +, -, () допустимы в телефонном номере" "Phone number can contain only digits and +,-,() symbols ",
"email_exists": "Пользователь с такой электронной почтой уже зарегистрирован" "User with this email already exists",
"email_empty": "Введите адрес электронной почты" "Email can"t be blank",
"accept_agreements": "Пожалуйста, примите уловия предоставления сервиса" "Please accept Terms Of Service",
"first_name_contains_numbers": "Имя не должно содержать цифр" "First name shouldn't contain digits",
"last_name_contains_numbers": "Фамилия не должна содержать цифр" "Last name shouldn't contain digits",
"required": "Заполните это поле" "Please fill out this field",
"state_contains_numbers": "Область не должна содержать цифр" "State shouldn"t contain digits",
"city_contains_numbers": "Город не должен содержать цифр" "City shouldn"t contain digits",
"pin_code_invalid": "Пин Код должен содержать 4 цифры" "Choose 4 digits for you PIN",
"pin_code_empty" : "Введите PIN код" "Please enter PIN code",
"insufficient_funds": "Недостаточно средств" "Insufficient funds",
"user_address_not_exists": "Такой email не зарегистрирован." "User with this email address does not exists"
"transactions_frozen": "Возможность отправлять транзакции отключена" "Your permission to send transactions is frozen, please contact support",
"invalid_address": "Неверный адрес" "Invalid address",
"user_address": "Нельзя отправлять транзакции на свой адрес" "You can't make sendings to your own address",
"max_length": "Адрес должен состоять не более чем из 26 символов" "Max length of valid address is 26 symbols",
"min_length": "Адрес должен состоять не менее чем из 26 символов" "Min length of valid address is 26 symbols",
"max_decimal_places": "Убедитесь что вы ввели не более 3х цифр после запятой" "Please make sure that you have entered not more than 3 decimal digits",
"invalid": "Введите число" "Please enter a number",
"wrong_password": "Введите пароль от входа в кошелек для подтверждения транзакции" "Please enter your password to confirm transaction",
"duplicate_address": "Адрес уже записан в вашу книгу" "This address is already added to your address book",
"invalid_address": "Неверный адрес" "Invalid address",
"wrong_nickname": "Имя не должно содержать специальных символов" "Name shouldn't contain special characters",
"wrong_description": "Описание не должно содержать специальных символов" "Description shouldn't contain special characters"
"same_email": "Новый адрес повторяет старый" "New email duplicates the old one",
"enter_code_from_sms": "Введите код потверждения из СМС, которое было отправленно по вашему номеру" "Please enter the confirmation code from SMS you"ve received",
"number_confirmed": "Номер успешно подтвержден" "Phone number is confirmed successfully",
"wrong_code": "Неверный код потдверждения" "Incorrect confirmation code"
"2fa_disabled": "Аутентификация успешно отключена" "2fa is disabled successfully"
"email_not_exists": "Пользователь с введенным электронным адресом не существует" "User with such email address isn’t registered yet",
"double_request": "У Вас уже есть, необработаный запрос на восстановление аккаунта" "You have one pending account recovery request already",
"service_unavailable": "Извините, в данный момент этот сервис недоступен для аккаунтов с НЕНУЛЕВЫМ балансом!" "We are sorry, but service is unavailable for users with NON-ZERO balances for this moment",
"wait_until": Пожалуйста подождите 5 минут перед тем как запросить новое сообщение" "Please wait for 5 minutes before requesting another message"
"token_confirmed": "Токен подтвержден" "Token is confirmed"
"message_repeated": "Вам было выслано повторное сообщение" "Message has been re-sent"
"wrong_old_password" : "Старый пароль неверный!" "Old password is incorrect"
"minimal_exchange_amount": "Минимальная сумма для покупки 1 coin." "Minimal exchange amount should be equal 1 coin"
"exchange_wallet_empty": Недостаточно денег на резервном счету. Свяжитесь пожалуйста с администрацией" "There is not enough money in the pool. Please contact support"
"exchange_is_not_active": "Exchange is not setup yet"