nifty-wallet/app/scripts/lib/config-manager.js

329 lines
7.6 KiB
JavaScript
Raw Normal View History

const Migrator = require('pojo-migrator')
const extend = require('xtend')
2016-05-19 17:13:33 -07:00
const MetamaskConfig = require('../config.js')
2016-05-19 16:53:16 -07:00
const migrations = require('./migrations')
const STORAGE_KEY = 'metamask-config'
2016-05-19 16:53:16 -07:00
const TESTNET_RPC = MetamaskConfig.network.testnet
const MAINNET_RPC = MetamaskConfig.network.mainnet
/* The config-manager is a convenience object
* wrapping a pojo-migrator.
*
* It exists mostly to allow the creation of
* convenience methods to access and persist
* particular portions of the state.
*/
module.exports = ConfigManager
2016-06-21 13:18:32 -07:00
function ConfigManager () {
// ConfigManager is observable and will emit updates
this._subs = []
/* The migrator exported on the config-manager
* has two methods the user should be concerned with:
*
* getData(), which returns the app-consumable data object
* saveData(), which persists the app-consumable data object.
*/
2016-06-21 13:18:32 -07:00
this.migrator = new Migrator({
// Migrations must start at version 1 or later.
// They are objects with a `version` number
// and a `migrate` function.
//
// The `migrate` function receives the previous
// config data format, and returns the new one.
migrations: migrations,
// How to load initial config.
// Includes step on migrating pre-pojo-migrator data.
loadData: loadData,
// How to persist migrated config.
2016-06-21 13:18:32 -07:00
setData: function (data) {
window.localStorage[STORAGE_KEY] = JSON.stringify(data)
},
})
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.setConfig = function (config) {
var data = this.migrator.getData()
data.config = config
this.setData(data)
this._emitUpdates(config)
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.getConfig = function () {
var data = this.migrator.getData()
if ('config' in data) {
return data.config
} else {
return {
provider: {
type: 'testnet',
2016-06-21 13:18:32 -07:00
},
}
}
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.setRpcTarget = function (rpcUrl) {
2016-03-31 16:32:35 -07:00
var config = this.getConfig()
config.provider = {
type: 'rpc',
rpcTarget: rpcUrl,
}
this.setConfig(config)
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.setProviderType = function (type) {
var config = this.getConfig()
config.provider = {
type: type,
}
this.setConfig(config)
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.useEtherscanProvider = function () {
2016-03-31 16:32:35 -07:00
var config = this.getConfig()
config.provider = {
type: 'etherscan',
}
this.setConfig(config)
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.getProvider = function () {
2016-03-31 16:32:35 -07:00
var config = this.getConfig()
return config.provider
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.setData = function (data) {
this.migrator.saveData(data)
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.getData = function () {
return this.migrator.getData()
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.setWallet = function (wallet) {
var data = this.migrator.getData()
data.wallet = wallet
this.setData(data)
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.getSelectedAccount = function () {
var config = this.getConfig()
return config.selectedAccount
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.setSelectedAccount = function (address) {
var config = this.getConfig()
config.selectedAccount = address
this.setConfig(config)
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.getWallet = function () {
return this.migrator.getData().wallet
}
// Takes a boolean
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.setShowSeedWords = function (should) {
var data = this.migrator.getData()
data.showSeedWords = should
this.setData(data)
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.getShouldShowSeedWords = function () {
var data = this.migrator.getData()
return data.showSeedWords
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.getCurrentRpcAddress = function () {
var provider = this.getProvider()
if (!provider) return null
2016-06-21 13:18:32 -07:00
switch (provider.type) {
2016-06-21 13:18:32 -07:00
case 'mainnet':
return MAINNET_RPC
2016-06-21 13:18:32 -07:00
case 'testnet':
return TESTNET_RPC
2016-06-21 13:18:32 -07:00
default:
return provider && provider.rpcTarget ? provider.rpcTarget : TESTNET_RPC
}
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.clearWallet = function () {
var data = this.getConfig()
delete data.wallet
this.setData(data)
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.setData = function (data) {
this.migrator.saveData(data)
}
//
// Tx
//
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.getTxList = function () {
var data = this.migrator.getData()
if (data.transactions !== undefined) {
return data.transactions
} else {
return []
}
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.unconfirmedTxs = function () {
var transactions = this.getTxList()
return transactions.filter(tx => tx.status === 'unconfirmed')
.reduce((result, tx) => { result[tx.id] = tx; return result }, {})
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype._saveTxList = function (txList) {
var data = this.migrator.getData()
data.transactions = txList
this.setData(data)
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.addTx = function (tx) {
var transactions = this.getTxList()
transactions.push(tx)
this._saveTxList(transactions)
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.getTx = function (txId) {
var transactions = this.getTxList()
var matching = transactions.filter(tx => tx.id === txId)
return matching.length > 0 ? matching[0] : null
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.confirmTx = function (txId) {
this._setTxStatus(txId, 'confirmed')
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.rejectTx = function (txId) {
this._setTxStatus(txId, 'rejected')
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype._setTxStatus = function (txId, status) {
2016-04-19 17:32:09 -07:00
var tx = this.getTx(txId)
tx.status = status
this.updateTx(tx)
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.updateTx = function (tx) {
var transactions = this.getTxList()
2016-04-19 17:32:09 -07:00
var found, index
transactions.forEach((otherTx, i) => {
if (otherTx.id === tx.id) {
found = true
index = i
}
})
2016-04-19 17:32:09 -07:00
if (found) {
transactions[index] = tx
}
this._saveTxList(transactions)
}
2016-04-19 17:32:09 -07:00
// wallet nickname methods
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.getWalletNicknames = function () {
var data = this.getData()
2016-06-21 13:18:32 -07:00
const nicknames = ('walletNicknames' in data) ? data.walletNicknames : {}
return nicknames
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.nicknameForWallet = function (account) {
const nicknames = this.getWalletNicknames()
return nicknames[account]
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.setNicknameForWallet = function (account, nickname) {
const nicknames = this.getWalletNicknames()
nicknames[account] = nickname
var data = this.getData()
data.walletNicknames = nicknames
this.setData(data)
}
// observable
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.subscribe = function (fn) {
this._subs.push(fn)
var unsubscribe = this.unsubscribe.bind(this, fn)
return unsubscribe
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.unsubscribe = function (fn) {
var index = this._subs.indexOf(fn)
if (index !== -1) this._subs.splice(index, 1)
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype._emitUpdates = function (state) {
this._subs.forEach(function (handler) {
handler(state)
})
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.setConfirmed = function (confirmed) {
var data = this.getData()
data.isConfirmed = confirmed
this.setData(data)
}
2016-06-21 13:18:32 -07:00
ConfigManager.prototype.getConfirmed = function () {
var data = this.getData()
return ('isConfirmed' in data) && data.isConfirmed
}
2016-06-21 13:18:32 -07:00
function loadData () {
var oldData = getOldStyleData()
var newData
try {
newData = JSON.parse(window.localStorage[STORAGE_KEY])
} catch (e) {}
var data = extend({
meta: {
version: 0,
},
data: {
config: {
provider: {
type: 'testnet',
2016-06-21 13:18:32 -07:00
},
},
},
}, oldData || null, newData || null)
return data
}
2016-06-21 13:18:32 -07:00
function getOldStyleData () {
var config, wallet, seedWords
var result = {
meta: { version: 0 },
data: {},
}
try {
config = JSON.parse(window.localStorage['config'])
result.data.config = config
} catch (e) {}
try {
wallet = JSON.parse(window.localStorage['lightwallet'])
result.data.wallet = wallet
} catch (e) {}
try {
seedWords = window.localStorage['seedWords']
result.data.seedWords = seedWords
} catch (e) {}
return result
}