ADD: Electrum server configuration

This commit is contained in:
Overtorment 2019-07-18 11:22:01 +01:00
parent f6fa631734
commit da7d8697bb
28 changed files with 236 additions and 0 deletions

View file

@ -1,4 +1,5 @@
import AsyncStorage from '@react-native-community/async-storage';
import { AppStorage } from './class';
const ElectrumClient = require('electrum-client');
let bitcoin = require('bitcoinjs-lib');
let reverse = require('buffer-reverse');
@ -27,6 +28,11 @@ let wasConnectedAtLeastOnce = false;
async function connectMain() {
let usingPeer = await getRandomHardcodedPeer();
let savedPeer = await getSavedPeer();
if (savedPeer && savedPeer.host && savedPeer.tcp) {
usingPeer = savedPeer;
}
try {
console.log('begin connection:', JSON.stringify(usingPeer));
mainClient = new ElectrumClient(usingPeer.tcp, usingPeer.host, 'tcp');
@ -69,6 +75,12 @@ async function getRandomHardcodedPeer() {
return hardcodedPeers[(hardcodedPeers.length * Math.random()) | 0];
}
async function getSavedPeer() {
let host = await AsyncStorage.getItem(AppStorage.ELECTRUM_HOST);
let port = await AsyncStorage.getItem(AppStorage.ELECTRUM_TCP_PORT);
return { host, tcp: port };
}
/**
* Returns random electrum server out of list of servers
* previous electrum server told us. Nearly half of them is
@ -114,6 +126,15 @@ module.exports.getBalanceByAddress = async function(address) {
return balance;
};
module.exports.getConfig = async function() {
if (!mainClient) throw new Error('Electrum client is not connected');
return {
host: mainClient.host,
port: mainClient.port,
status: mainClient.status,
};
};
/**
*
* @param address {String}
@ -345,6 +366,28 @@ module.exports.broadcastV2 = async function(hex) {
return mainClient.blockchainTransaction_broadcast(hex);
};
/**
*
* @param host
* @param tcpPort
* @returns {Promise<boolean>} Whether provided host:port is a valid electrum server
*/
module.exports.testConnection = async function(host, tcpPort) {
let client = new ElectrumClient(tcpPort, host, 'tcp');
try {
await client.connect();
await client.server_version('2.7.11', '1.4');
await client.server_ping();
client.keepAlive = () => {}; // dirty hack to make it stop reconnecting
client.reconnect = () => {}; // dirty hack to make it stop reconnecting
client.close();
return true;
} catch (_) {
return false;
}
};
module.exports.forceDisconnect = () => {
mainClient.keepAlive = () => {}; // dirty hack to make it stop reconnecting
mainClient.reconnect = () => {}; // dirty hack to make it stop reconnecting

View file

@ -9,6 +9,7 @@ import Currency from './screen/settings/currency';
import EncryptStorage from './screen/settings/encryptStorage';
import PlausibleDeniability from './screen/plausibledeniability';
import LightningSettings from './screen/settings/lightningSettings';
import ElectrumSettings from './screen/settings/electrumSettings';
import WalletsList from './screen/wallets/list';
import WalletTransactions from './screen/wallets/transactions';
import AddWallet from './screen/wallets/add';
@ -123,6 +124,10 @@ const WalletsStackNavigator = createStackNavigator(
screen: LightningSettings,
path: 'LightningSettings',
},
ElectrumSettings: {
screen: ElectrumSettings,
path: 'ElectrumSettings',
},
LNDViewInvoice: {
screen: LNDViewInvoice,
swipeEnabled: false,

View file

@ -18,6 +18,8 @@ export class AppStorage {
static LANG = 'lang';
static EXCHANGE_RATES = 'currency';
static LNDHUB = 'lndhub';
static ELECTRUM_HOST = 'electrum_host';
static ELECTRUM_TCP_PORT = 'electrum_tcp_port';
static PREFERRED_CURRENCY = 'preferredCurrency';
static ADVANCED_MODE_ENABLED = 'advancedmodeenabled';

View file

@ -186,6 +186,8 @@ module.exports = {
'To connect to your own LND node please install LndHub' +
' and put its URL here in settings. Leave blank to use default ' +
'ndHub\n (lndhub.io)',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'save',
about: 'O BlueWallet',
language: 'Jazyk',

View file

@ -186,6 +186,8 @@ module.exports = {
'To connect to your own LND node please install LndHub' +
' and put its URL here in settings. Leave blank to use default ' +
'ndHub\n (lndhub.io)',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'save',
about: 'Andet',
language: 'Sprog',

View file

@ -188,6 +188,8 @@ module.exports = {
'Bitte installier Lndhub, um mit deiner eigenen LND Node zu verbinden' +
' und setz seine URL hier in den Einstellungen. Lass das Feld leer, um Standard- ' +
'LndHub\n (lndhub.io) zu verwenden',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'Speichern',
about: 'Über',
language: 'Sprache',

View file

@ -188,6 +188,8 @@ module.exports = {
lightning_settings_explain:
'Για να συνδεθείτε στον δικό σας κόμβο LND παρακαλούμε εγκαταστήστε το LndHub' +
' και βάλτε το URL του εδώ. Αφήστε το κενό για να χρησιμοποιήσετε το LNDHub της BlueWallet (lndhub.io). Αφού σώσετε τις ρυθμίσεις τυχόν νέα πορτοφόλια που θα δημιουργήσετε θα συνδεθούν στο LNDHub που επιλέξατε.',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'Σώσε',
about: 'Σχετικά',
language: 'Γλώσσα',

View file

@ -186,6 +186,8 @@ module.exports = {
lightning_settings_explain:
'To connect to your own LND node please install LndHub' +
" and put its URL here in settings. Leave blank to use BlueWallet's LNDHub (lndhub.io). Wallets created after saving changes will connect to the specified LNDHub.",
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'Save',
about: 'About',
language: 'Language',

View file

@ -189,6 +189,8 @@ module.exports = {
'To connect to your own LND node please install LndHub' +
' and put its URL here in settings. Leave blank to use default ' +
'ndHub\n (lndhub.io)',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'save',
about: 'Sobre nosotros',
language: 'Idioma',

View file

@ -188,6 +188,8 @@ module.exports = {
lightning_settings_explain:
'Yhdistääksesi omaan LND noodiin, asenna LndHub' +
' ja laita sen URL tänne. Jätä tyhjäksi käyttääksesi BlueWalletin LNDHubia (lndhub.io). Muutosten tallentamisen jälkeen luodut lompakot yhdistävät annettuun LNDHubiin.',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'Tallenna',
about: 'Tietoa',
language: 'Kieli',

View file

@ -188,6 +188,8 @@ module.exports = {
'To connect to your own LND node please install LndHub' +
' and put its URL here in settings. Leave blank to use default ' +
'ndHub\n (lndhub.io)',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'save',
about: 'À propos',
language: 'Langue',

View file

@ -184,6 +184,8 @@ module.exports = {
'Za spajanje na tvoj vlastiti LND čvor trebaš instalirati LndHub' +
' i upisati njegov URL ovdje. Ostavi prazno za standardni ' +
'ndHub\n (lndhub.io)',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'Spremi',
about: 'Informacije',
language: 'Jezik',

View file

@ -185,6 +185,8 @@ module.exports = {
lightning_settings_explain:
'Pasang LndHub untuk menghubungkan ke node LND kamu' +
' dan masukkan URL di sini. Biarkan kosong untuk menghubungkan ke LndHub standar (lndhub.io)',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'simpan',
about: 'Tentang',
language: 'Bahasa',

View file

@ -188,6 +188,8 @@ module.exports = {
lightning_settings_explain:
'Per connetterti al tuo nodo LND personale installa LndHub' +
' e inserisci il suo URL qui nelle impostazioni. Lascialo vuoto per utilizzare il nodo LndHub di default (lndhub.io)',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'Salva',
about: 'Informazioni',
language: 'Lingua',

View file

@ -186,6 +186,8 @@ module.exports = {
'他の LND ノードへ接続するには LndHub をインストール後、' +
'URL を入力してください。既定の設定を使用するには空欄にします' +
'ndHub\n (lndhub.io)',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: '保存',
about: 'BlueWallet について',
language: '言語',

View file

@ -186,6 +186,8 @@ module.exports = {
lightning_settings_explain:
'For å koble til din egen LND-node, vennligst installer LndHub' +
' og legg URLen her i innstillinger. La feltet være tomt for å bruke BlueWallets LNDHub (lndhub.io). Lommebøker opprettet etter lagring av endringer, vil koble til den angitte LNDHub.',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'Lagre',
about: 'Om',
language: 'Språk',

View file

@ -187,6 +187,8 @@ module.exports = {
'Om verbinding te maken met uw eigen LND-knooppunt' +
' installeert u LndHub en zet u de URL hier in de instellingen. ' +
'Laat dit leeg om de standaard lndHub (lndhub.io) te gebruiken.',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'Opslaan',
about: 'Over',
language: 'Taal',

View file

@ -191,6 +191,8 @@ module.exports = {
'Para se conectar ao seu próprio ponto LND, você precisa instalar a aplicação LndHub' +
' e copiar sua URL para cá. Deixe em branco para usar a LndHub padrão fornecida pela BlueWallet (lndhub.io).' +
' Carteiras criadas após mudanças nestas preferências ficarão ligadas à instância LndHub que estiver especificada.',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'Salvar',
about: 'Sobre',
language: 'Idioma',

View file

@ -189,6 +189,8 @@ module.exports = {
'To connect to your own LND node please install LndHub' +
' and put its URL here in settings. Leave blank to use default ' +
'ndHub\n (lndhub.io)',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'save',
about: 'Sobre',
language: 'Idioma',

View file

@ -188,6 +188,8 @@ module.exports = {
'Чтобы подключиться к своему узлу LND, пожалуйста, установи LndHub' +
' и добавь его URL в настройки. Оставь поле пустым, чтобы использоавать стандартный ' +
'LndHub\n (lndhub.io)',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'Сохранить',
about: 'О программе',
language: 'Язык',

View file

@ -185,6 +185,8 @@ module.exports = {
lightning_settings_explain:
'För att ansluta till din egen LND-nod, installera LndHub' +
" och mata in dess URL nedan. Lämna blankt för att använda BlueWallet's LNDHub (lndhub.io). Plånböcker skapade efter att inställningarna sparats kommer att använda den angivna LNDHub:en",
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'Spara',
about: 'Om',
language: 'Språk',

View file

@ -186,6 +186,8 @@ module.exports = {
'กรณีที่ต้องการต่อเชื่อมไปยังไลท์นิงโนดของท่านเอง กรุณาติดตั้ง LndHub ของท่าน' +
' และไส่ URL ที่นี่. ระบบจะใช้ LndHub ของ lndhub.io ในกรณืที่ท่าน ' +
' ไม่ตั้งค่าใดๆ',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'บันทึก',
about: 'เกี่ยวกับ',
language: 'ภาษา',

View file

@ -186,6 +186,8 @@ module.exports = {
lightning_settings_explain:
'Kendi LND düğümünüze bağlanmak için lütfen LndHubı yükleyin.' +
" ve URLsini buraya, ayarlara yazın. BlueWallet'in LNDHub (lndhub.io) programını kullanmak için boş bırakın. Değişiklikleri kaydettikten sonra oluşturulan cüzdanlar belirtilen LNDHub'a bağlanacaktır.",
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'Kaydet',
about: 'Hakkında',
language: 'Dil',

View file

@ -188,6 +188,8 @@ module.exports = {
'To connect to your own LND node please install LndHub' +
' and put its URL here in settings. Leave blank to use default ' +
'ndHub\n (lndhub.io)',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: 'save',
about: 'Про програму',
language: 'Мова',

View file

@ -181,6 +181,8 @@ module.exports = {
encrypt_storage: '加密存储',
lightning_settings: '闪电网络设置',
lightning_settings_explain: '如要要连接你自己的闪电节点请安装LndHub' + ' 并把url地址输入到下面. 空白将使用默认的LndHub (lndhub.io)',
electrum_settings: 'Electrum Settings',
electrum_settings_explain: 'Set to blank to use default',
save: '保存',
about: '关于',
language: '语言',

View file

@ -0,0 +1,135 @@
/* global alert */
import React, { Component } from 'react';
import { View, TextInput } from 'react-native';
import { AppStorage } from '../../class';
import AsyncStorage from '@react-native-community/async-storage';
import { BlueLoading, BlueSpacing20, BlueButton, SafeBlueArea, BlueCard, BlueNavigationStyle, BlueText } from '../../BlueComponents';
import PropTypes from 'prop-types';
let loc = require('../../loc');
let BlueElectrum = require('../../BlueElectrum');
export default class ElectrumSettings extends Component {
static navigationOptions = () => ({
...BlueNavigationStyle(),
title: loc.settings.electrum_settings,
});
constructor(props) {
super(props);
this.state = {
isLoading: true,
config: {},
};
}
async componentDidMount() {
let host = await AsyncStorage.getItem(AppStorage.ELECTRUM_HOST);
let port = await AsyncStorage.getItem(AppStorage.ELECTRUM_TCP_PORT);
this.setState({
isLoading: false,
host,
port,
});
await this.setState({
config: await BlueElectrum.getConfig(),
});
}
save = () => {
this.setState({ isLoading: true }, async () => {
this.state.host = this.state.host ? this.state.host : '';
this.state.port = this.state.port ? this.state.port : '';
try {
if (!(await BlueElectrum.testConnection(this.state.host, this.state.port))) {
alert("Can't connect to provided Electrum server");
} else {
await AsyncStorage.setItem(AppStorage.ELECTRUM_HOST, this.state.host);
await AsyncStorage.setItem(AppStorage.ELECTRUM_TCP_PORT, this.state.port);
alert('Your changes have been saved successfully. Restart may be required for changes to take effect.');
}
} catch (_) {}
this.setState({ isLoading: false });
});
};
render() {
return (
<SafeBlueArea forceInset={{ horizontal: 'always' }} style={{ flex: 1 }}>
<BlueCard>
<BlueText>{loc.settings.electrum_settings_explain}</BlueText>
</BlueCard>
<BlueCard>
<View
style={{
flexDirection: 'row',
borderColor: '#d2d2d2',
borderBottomColor: '#d2d2d2',
borderWidth: 1.0,
borderBottomWidth: 0.5,
backgroundColor: '#f5f5f5',
minHeight: 44,
height: 44,
alignItems: 'center',
borderRadius: 4,
}}
>
<TextInput
placeholder={'host, for example 111.222.333.444'}
value={this.state.host}
onChangeText={text => this.setState({ host: text })}
numberOfLines={1}
style={{ flex: 1, marginHorizontal: 8, minHeight: 36, height: 36 }}
editable={!this.state.isLoading}
underlineColorAndroid="transparent"
/>
</View>
<BlueSpacing20 />
<View
style={{
flexDirection: 'row',
borderColor: '#d2d2d2',
borderBottomColor: '#d2d2d2',
borderWidth: 1.0,
borderBottomWidth: 0.5,
backgroundColor: '#f5f5f5',
minHeight: 44,
height: 44,
alignItems: 'center',
borderRadius: 4,
}}
>
<TextInput
placeholder={'TCP port, usually 50001'}
value={this.state.port}
onChangeText={text => this.setState({ port: text })}
numberOfLines={1}
style={{ flex: 1, marginHorizontal: 8, minHeight: 36, height: 36 }}
editable={!this.state.isLoading}
underlineColorAndroid="transparent"
/>
</View>
<BlueSpacing20 />
{this.state.isLoading ? <BlueLoading /> : <BlueButton onPress={this.save} title={loc.settings.save} />}
</BlueCard>
<BlueCard>
<BlueSpacing20 />
<BlueText>Currently using:</BlueText>
<BlueText>Host: {this.state.config.host}</BlueText>
<BlueText>Port: {this.state.config.port}</BlueText>
<BlueText>Connected: {(this.state.config.status === 1 && 'Yes') || 'No'}</BlueText>
</BlueCard>
</SafeBlueArea>
);
}
}
ElectrumSettings.propTypes = {
navigation: PropTypes.shape({
navigate: PropTypes.func,
goBack: PropTypes.func,
}),
};

View file

@ -65,6 +65,9 @@ export default class Settings extends Component {
<TouchableOpacity onPress={() => this.props.navigation.navigate('Currency')}>
<BlueListItem title={loc.settings.currency} />
</TouchableOpacity>
<TouchableOpacity onPress={() => this.props.navigation.navigate('ElectrumSettings')}>
<BlueListItem title={'Electrum server'} />
</TouchableOpacity>
<TouchableOpacity onPress={() => this.setState({ showAdvancedOptions: !this.state.showAdvancedOptions })}>
<BlueListItem title={loc.settings.advanced_options} />
</TouchableOpacity>

View file

@ -23,6 +23,10 @@ beforeAll(async () => {
});
describe('Electrum', () => {
it('ElectrumClient can test connection', async () => {
assert.ok(await BlueElectrum.testConnection('electrum1.bluewallet.io', '50001'));
});
it('ElectrumClient can connect and query', async () => {
const ElectrumClient = require('electrum-client');