All files bridge.js

52.38% Statements 22/42
53.33% Branches 8/15
44.44% Functions 4/9
53.66% Lines 22/41

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97                    1x     1x 1x 143x 495x 27x     468x     143x           1x 1x 1x     1x 1x     1x   1x 1x   1x   1x       1x   1x 1x   1x                                                                                    
import 'babel-polyfill';
import logger from 'winston';
import Datastore from 'nedb';
import path from 'path';
import Relayer from './Relayer';
import Verifyer from './Verifyer';
import './promise-polyfill';
import { getHomeWeb3, getForeignWeb3 } from './getWeb3';
import NonceTracker from './NonceTracker';
 
logger.level = process.env.LOG_LEVEL || 'info';
 
// replace log function to prettyPrint objects
logger.origLog = logger.log;
logger.log = function(level, ...args) {
    const newArgs = args.map(a => {
        if (typeof a === 'object' && !(a instanceof Error)) {
            return JSON.stringify(a, null, 2);
        }
 
        return a;
    });
 
    return this.origLog(level, ...newArgs);
};
 
/**
 * used for testing
 */
export const testBridge = (config, writeDB = false) => {
    const db = {};
    db.bridge = new Datastore(
        writeDB ? path.join(__dirname, config.dataDir, 'bridge-data.db') : undefined,
    );
    db.bridge.loadDatabase();
    db.txs = new Datastore(
        writeDB ? path.join(__dirname, config.dataDir, 'bridge-txs.db') : undefined,
    );
    db.txs.loadDatabase();
 
    const homeWeb3 = getHomeWeb3(config);
    const foreignWeb3 = getForeignWeb3(config);
 
    const addy = homeWeb3.eth.accounts.wallet[0].address;
 
    return Promise.all([
        homeWeb3.eth.getTransactionCount(addy, 'pending'),
        foreignWeb3.eth.getTransactionCount(addy, 'pending'),
    ]).then(([homeNonce, foreignNonce]) => {
        const nonceTracker = new NonceTracker(homeNonce, foreignNonce);
 
        const relayer = new Relayer(homeWeb3, foreignWeb3, nonceTracker, config, db);
        const verifyer = new Verifyer(homeWeb3, foreignWeb3, nonceTracker, config, db);
 
        return { db, relayer, verifyer };
    });
};
 
/* istanbul ignore next */
export default config => {
    const db = {};
    db.bridge = new Datastore(path.join(config.dataDir, 'bridge-data.db'));
    db.bridge.loadDatabase();
    db.txs = new Datastore(path.join(config.dataDir, 'bridge-txs.db'));
    db.txs.loadDatabase();
 
    const homeWeb3 = getHomeWeb3(config);
    const foreignWeb3 = getForeignWeb3(config);
 
    const addy = homeWeb3.eth.accounts.wallet[0].address;
 
    let relayer;
    let verifyer;
    Promise.all([
        homeWeb3.eth.getTransactionCount(addy, 'pending'),
        foreignWeb3.eth.getTransactionCount(addy, 'pending'),
    ])
        .then(([homeNonce, foreignNonce]) => {
            const nonceTracker = new NonceTracker(homeNonce, foreignNonce);
 
            relayer = new Relayer(homeWeb3, foreignWeb3, nonceTracker, config, db);
            verifyer = new Verifyer(homeWeb3, foreignWeb3, nonceTracker, config, db);
        })
        .then(() => relayer.loadBridgeData())
        .then(bridgeData => {
            if (bridgeData.homeContractAddress !== config.homeBridge) {
                throw new Error('stored homeBridge address does not match config.homeBridge');
            }
            if (bridgeData.foreignContractAddress !== config.foreignBridge) {
                throw new Error('stored foreignBridge address does not match config.foreignBridge');
            }
            relayer.start();
 
            setTimeout(() => verifyer.start(), config.pollTime / 2);
        });
};