Compare commits

...
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

63 Commits

Author SHA1 Message Date
wowario 1b81b8d698 Update 'README.md'
4 years ago
qvqc 0dcb6e617e Merge pull request 'welcome home <3' (#30) from qvqc/wow-lite-wallet:master into master
4 years ago
qvqc 684983ff90
welcome home <3
4 years ago
wowario 6af096be7b
update git url
4 years ago
wowario a369ad9190
add bg to seed textarea
4 years ago
wowario e27e90a7d8
credit artwork
4 years ago
wowario e0952c9e15
add credits bg and toad tilt
4 years ago
wowario 868a72d88b
add bg
4 years ago
wowario b8b541d2a7
update graphics
4 years ago
wowario 8221a022a3
rename to wowlite
4 years ago
清武 博二 d04a72cd60
Merge pull request #27 from wowario/patch
4 years ago
清武 博二 b54c36f498
Merge pull request #26 from wowario/bubbles
4 years ago
清武 博二 59805d2421
Merge pull request #24 from wowario/quotes
4 years ago
清武 博二 9aa1b95f01
Merge pull request #23 from wowario/master
4 years ago
wowario c3a6f8cb61
set inactivity_lock_timeout for 1 year
4 years ago
wowario 55324022a6
get XMR price
4 years ago
wowario c4162bc55d
fix bubbles
4 years ago
wowario ba3413fa2c
new messages
4 years ago
wowario af99864ed4
get BTC price
4 years ago
wowario 861521d832
bump up electron-builder
4 years ago
wowario 9e2699ca87
bump up to v0.1.4
4 years ago
清武 博二 f8d4ca62ad
Merge pull request #22 from qvqc/master
4 years ago
qvqc 348108628b update patch for release-v0.8 tag
4 years ago
xmrdsc 703cead0c5
Merge pull request #21 from qvqc/master
4 years ago
qvqc 7057570046 set default node to current
4 years ago
qvqc 8e1b0b2dea add non-interactive transfers to litepatch
4 years ago
qvqc 259e34d83d update window title
4 years ago
qvqc 005f18beb0 update package.json name, version, and contact
4 years ago
qvqc 4a4d66ca75 remove link to old releases
4 years ago
qvqc 52d6a0649e update screenshot in readme
4 years ago
qvqc 5f32ca6eca updated logo
4 years ago
qvqc 18b0ce2504 remove funding and comments from landing page
4 years ago
qvqc 9bcb0f9c37 update available nodes
4 years ago
qvqc 38c4829340 added seed generation and proper spacing
4 years ago
xmrdsc 35afa994c5
Merge pull request #20 from wowario/master
5 years ago
wowario 8452727ed5
update patch
5 years ago
dsc b1d623e2ca
piece of sh&&0@
5 years ago
xmrdsc da7b1c6451
Merge pull request #19 from wownero/bleepbleep
5 years ago
dsc f47a1b1f1b
Add Aluisyo node, fix navbar href
5 years ago
Hiroji Kiyotake ed43794a9a
Merge pull request #18 from wownero/feature_0_3_1
5 years ago
dsc 5b721f0edc
Release 0.3.1
5 years ago
xmrdsc 575f5b0d78
Merge pull request #15 from wownero/fix-wallets-json
5 years ago
dsc 2a6d8752e4
Fix wallet breaking error on startup
5 years ago
xmrdsc 1609ceb22d
Merge pull request #14 from jwinterm/master
5 years ago
jw 09147aa929
Allow for sending to subaddress
5 years ago
xmrdsc fdd3f6db28
Merge pull request #12 from wowario/fix
5 years ago
wowario 29fe539b8e
update webpack-dev-server
5 years ago
dsc 5af5fbcd73
Bump version
5 years ago
xmrdsc 2e0ef8f8f2
Merge pull request #11 from bomb-on/master
5 years ago
bomb-on 09f09f3291 More button > better!
5 years ago
bomb-on b5b6344968 So much wallets
5 years ago
bomb-on be39e55fcf Clean input pls?
5 years ago
bomb-on 1319c6e5fe Focus input plus much more equality<3
5 years ago
bomb-on 242d721653 Added moar messages
6 years ago
bomb-on 617a52cccd Added regex for integrated addresses
6 years ago
xmrdsc f89fc4241a
Merge pull request #10 from 0x000090/win-homedir-fix
6 years ago
0x000090 d10c3b7787 supa dupa equality
6 years ago
0x000090 d0028a2fab create wow dir in USERPROFILE on win
6 years ago
xmrdsc 720bbc5172
Update README.md
6 years ago
xmrdsc 9e75c2b106
Update README.md
6 years ago
Sander Ferdinand 55fce579c4
No comment on this one
6 years ago
Sander Ferdinand 95660f732c
Updating CLI diff
6 years ago
xmrdsc 93f537a7bc
Merge pull request #8 from skftn/0.1.1
6 years ago

@ -24,93 +24,95 @@ else if (process.env.BUILD_TARGET === 'web') web()
else build() else build()
function clean () { function clean () {
del.sync(['build/*', '!build/icons', '!build/icons/icon.*']) del.sync(['build/*', '!build/icons', '!build/icons/icon.*'])
console.log(`\n${doneLog}\n`) console.log(`\n${doneLog}\n`)
process.exit() process.exit()
} }
function build () { function build () {
greeting() greeting()
del.sync(['dist/electron/*', '!.gitkeep']) del.sync(['dist/electron/*', '!.gitkeep'])
const tasks = ['main', 'renderer'] const tasks = ['main', 'renderer']
const m = new Multispinner(tasks, { const m = new Multispinner(tasks, {
preText: 'building', preText: 'building',
postText: 'process' postText: 'process'
}) })
let results = '' let results = ''
m.on('success', () => { m.on('success', () => {
process.stdout.write('\x1B[2J\x1B[0f') process.stdout.write('\x1B[2J\x1B[0f')
console.log(`\n\n${results}`) console.log(`\n\n${results}`)
console.log(`${okayLog}take it away ${chalk.yellow('`electron-builder`')}\n`) console.log(`${okayLog}take it away ${chalk.yellow('`electron-builder`')}\n`)
process.exit() process.exit()
}) })
pack(mainConfig).then(result => { pack(mainConfig).then(result => {
results += result + '\n\n' results += result + '\n\n'
m.success('main') m.success('main')
}).catch(err => { }).catch(err => {
m.error('main') m.error('main')
console.log(`\n ${errorLog}failed to build main process`) console.log(`\n ${errorLog}failed to build main process`)
console.error(`\n${err}\n`) console.error(`\n${err}\n`)
process.exit(1) process.exit(1)
}) })
pack(rendererConfig).then(result => { pack(rendererConfig).then(result => {
results += result + '\n\n' results += result + '\n\n'
m.success('renderer') m.success('renderer')
}).catch(err => { }).catch(err => {
m.error('renderer') m.error('renderer')
console.log(`\n ${errorLog}failed to build renderer process`) console.log(`\n ${errorLog}failed to build renderer process`)
console.error(`\n${err}\n`) console.error(`\n${err}\n`)
process.exit(1) process.exit(1)
}) })
} }
function pack (config) { function pack (config) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
webpack(config, (err, stats) => { config.mode = 'production'
if (err) reject(err.stack || err) webpack(config, (err, stats) => {
else if (stats.hasErrors()) { if (err) reject(err.stack || err)
let err = '' else if (stats.hasErrors()) {
let err = ''
stats.toString({
chunks: false, stats.toString({
colors: true chunks: false,
colors: true
})
.split(/\r?\n/)
.forEach(line => {
err += ` ${line}\n`
})
reject(err)
} else {
resolve(stats.toString({
chunks: false,
colors: true
}))
}
}) })
.split(/\r?\n/)
.forEach(line => {
err += ` ${line}\n`
})
reject(err)
} else {
resolve(stats.toString({
chunks: false,
colors: true
}))
}
}) })
})
} }
function web () { function web () {
del.sync(['dist/web/*', '!.gitkeep']) del.sync(['dist/web/*', '!.gitkeep'])
webpack(webConfig, (err, stats) => { webConfig.mode = 'production'
if (err || stats.hasErrors()) console.log(err) webpack(webConfig, (err, stats) => {
if (err || stats.hasErrors()) console.log(err)
console.log(stats.toString({
chunks: false, console.log(stats.toString({
colors: true chunks: false,
})) colors: true
}))
process.exit() process.exit()
}) })
} }
function greeting () { function greeting () {
console.log('WOW such build\n'); console.log('WOW such build\n');
} }

@ -1,23 +1,23 @@
const hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') const hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
hotClient.subscribe(event => { hotClient.subscribe(event => {
/** /**
* Reload browser when HTMLWebpackPlugin emits a new index.html * Reload browser when HTMLWebpackPlugin emits a new index.html
* *
* Currently disabled until jantimon/html-webpack-plugin#680 is resolved. * Currently disabled until jantimon/html-webpack-plugin#680 is resolved.
* https://github.com/SimulatedGREG/electron-vue/issues/437 * https://github.com/SimulatedGREG/electron-vue/issues/437
* https://github.com/jantimon/html-webpack-plugin/issues/680 * https://github.com/jantimon/html-webpack-plugin/issues/680
*/ */
// if (event.action === 'reload') { // if (event.action === 'reload') {
// window.location.reload() // window.location.reload()
// } // }
/** /**
* Notify `mainWindow` when `main` process is compiling, * Notify `mainWindow` when `main` process is compiling,
* giving notice for an expected reload of the `electron` process * giving notice for an expected reload of the `electron` process
*/ */
if (event.action === 'compiling') { if (event.action === 'compiling') {
document.body.innerHTML += ` document.body.innerHTML += `
<style> <style>
#dev-client { #dev-client {
background: #4fc08d; background: #4fc08d;
@ -36,5 +36,5 @@ hotClient.subscribe(event => {
Compiling Main Process... Compiling Main Process...
</div> </div>
` `
} }
}) })

@ -17,132 +17,144 @@ let manualRestart = false
let hotMiddleware let hotMiddleware
function logStats (proc, data) { function logStats (proc, data) {
let log = '' let log = ''
log += chalk.yellow.bold(`${proc} Process ${new Array((19 - proc.length) + 1).join('-')}`) log += chalk.yellow.bold(`${proc} Process ${new Array((19 - proc.length) + 1).join('-')}`)
log += '\n\n' log += '\n\n'
if (typeof data === 'object') { if (typeof data === 'object') {
data.toString({ data.toString({
colors: true, colors: true,
chunks: false chunks: false
}).split(/\r?\n/).forEach(line => { }).split(/\r?\n/).forEach(line => {
log += ' ' + line + '\n' log += ' ' + line + '\n'
}) })
} else { } else {
log += ` ${data}\n` log += ` ${data}\n`
} }
log += '\n' + chalk.yellow.bold(`${new Array(28 + 1).join('-')}`) + '\n' log += '\n' + chalk.yellow.bold(`${new Array(28 + 1).join('-')}`) + '\n'
console.log(log) console.log(log)
} }
function startRenderer () { function startRenderer () {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer) rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer)
rendererConfig.mode = 'development'
const compiler = webpack(rendererConfig) const compiler = webpack(rendererConfig)
hotMiddleware = webpackHotMiddleware(compiler, { hotMiddleware = webpackHotMiddleware(compiler, {
log: false, log: false,
heartbeat: 2500 heartbeat: 2500
}) })
compiler.plugin('compilation', compilation => { compiler.hooks.compilation.tap('compilation', compilation => {
compilation.plugin('html-webpack-plugin-after-emit', (data, cb) => { compilation.hooks.htmlWebpackPluginAfterEmit.tapAsync('html-webpack-plugin-after-emit', (data, cb) => {
hotMiddleware.publish({ action: 'reload' }) hotMiddleware.publish({ action: 'reload' })
cb() cb()
}) })
})
compiler.hooks.done.tap('done', stats => {
logStats('Renderer', stats)
})
const server = new WebpackDevServer(
compiler,
{
contentBase: path.join(__dirname, '../'),
quiet: true,
before (app, ctx) {
app.use(hotMiddleware)
ctx.middleware.waitUntilValid(() => {
resolve()
})
}
}
)
server.listen(9080)
}) })
compiler.plugin('done', stats => {
logStats('Renderer', stats)
})
const server = new WebpackDevServer(
compiler,
{
contentBase: path.join(__dirname, '../'),
quiet: true,
before (app, ctx) {
app.use(hotMiddleware)
ctx.middleware.waitUntilValid(() => {
resolve()
})
}
}
)
server.listen(9080)
})
} }
function startMain () { function startMain () {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
mainConfig.entry.main = [path.join(__dirname, '../src/main/index.dev.js')].concat(mainConfig.entry.main) mainConfig.entry.main = [path.join(__dirname, '../src/main/index.dev.js')].concat(mainConfig.entry.main)
mainConfig.mode = 'development'
const compiler = webpack(mainConfig) const compiler = webpack(mainConfig)
compiler.plugin('watch-run', (compilation, done) => { compiler.hooks.watchRun.tapAsync('watch-run', (compilation, done) => {
logStats('Main', chalk.white.bold('compiling...')) logStats('Main', chalk.white.bold('compiling...'))
hotMiddleware.publish({ action: 'compiling' }) hotMiddleware.publish({ action: 'compiling' })
done() done()
}) })
compiler.watch({}, (err, stats) => { compiler.watch({}, (err, stats) => {
if (err) { if (err) {
console.log(err) console.log(err)
return return
} }
logStats('Main', stats)
if (electronProcess && electronProcess.kill) {
manualRestart = true
process.kill(electronProcess.pid)
electronProcess = null
startElectron()
setTimeout(() => {
manualRestart = false
}, 5000)
}
logStats('Main', stats) resolve()
})
if (electronProcess && electronProcess.kill) {
manualRestart = true
process.kill(electronProcess.pid)
electronProcess = null
startElectron()
setTimeout(() => {
manualRestart = false
}, 5000)
}
resolve()
}) })
})
} }
function startElectron () { function startElectron () {
electronProcess = spawn(electron, ['--inspect=5858', '.']) var args = [
'--inspect=5858',
electronProcess.stdout.on('data', data => { path.join(__dirname, '../dist/electron/main.js')
electronLog(data, 'blue') ]
})
electronProcess.stderr.on('data', data => { // detect yarn or npm and process commandline args accordingly
electronLog(data, 'red') if (process.env.npm_execpath.endsWith('yarn.js')) {
}) args = args.concat(process.argv.slice(3))
} else if (process.env.npm_execpath.endsWith('npm-cli.js')) {
electronProcess.on('close', () => { args = args.concat(process.argv.slice(2))
if (!manualRestart) process.exit() }
})
electronProcess = spawn(electron, args)
electronProcess.stdout.on('data', data => {
electronLog(data, 'blue')
})
electronProcess.stderr.on('data', data => {
electronLog(data, 'red')
})
electronProcess.on('close', () => {
if (!manualRestart) process.exit()
})
} }
function electronLog (data, color) { function electronLog (data, color) {
let log = '' let log = ''
data = data.toString().split(/\r?\n/) data = data.toString().split(/\r?\n/)
data.forEach(line => { data.forEach(line => {
log += ` ${line}\n` log += ` ${line}\n`
}) })
if (/[0-9A-z]+/.test(log)) { if (/[0-9A-z]+/.test(log)) {
console.log( console.log(
chalk[color].bold('┏ Electron -------------------') + chalk[color].bold('┏ Electron -------------------') +
'\n\n' + '\n\n' +
log + log +
chalk[color].bold('┗ ----------------------------') + chalk[color].bold('┗ ----------------------------') +
'\n' '\n'
) )
} }
} }
function greeting () { function greeting () {
@ -150,15 +162,15 @@ function greeting () {
} }
function init () { function init () {
greeting() greeting()
Promise.all([startRenderer(), startMain()]) Promise.all([startRenderer(), startMain()])
.then(() => { .then(() => {
startElectron() startElectron()
}) })
.catch(err => { .catch(err => {
console.error(err) console.error(err)
}) })
} }
init() init()

@ -6,67 +6,73 @@ const path = require('path')
const { dependencies } = require('../package.json') const { dependencies } = require('../package.json')
const webpack = require('webpack') const webpack = require('webpack')
const BabiliWebpackPlugin = require('babili-webpack-plugin') const BabiliWebpackPlugin = require('babel-minify-webpack-plugin')
let mainConfig = { let mainConfig = {
entry: { entry: {
main: path.join(__dirname, '../src/main/index.js') main: path.join(__dirname, '../src/main/index.js')
}, },
externals: [ externals: [
...Object.keys(dependencies || {}) ...Object.keys(dependencies || {})
], ],
module: { module: {
rules: [ rules: [
{ {
test: /\.js$/, test: /\.js$/,
use: 'babel-loader', use: 'babel-loader',
exclude: /node_modules/ exclude: /node_modules/
}, },
{ {
test: /\.node$/, test: /\.node$/,
use: 'node-loader' use: 'node-loader'
} }
] ]
}, },
node: { node: {
__dirname: process.env.NODE_ENV !== 'production', __dirname: process.env.NODE_ENV !== 'production',
__filename: process.env.NODE_ENV !== 'production' __filename: process.env.NODE_ENV !== 'production'
}, },
output: { output: {
filename: '[name].js', filename: '[name].js',
libraryTarget: 'commonjs2', libraryTarget: 'commonjs2',
path: path.join(__dirname, '../dist/electron') path: path.join(__dirname, '../dist/electron')
}, },
plugins: [ plugins: [
new webpack.NoEmitOnErrorsPlugin() new webpack.NoEmitOnErrorsPlugin()
], ],
resolve: { resolve: {
extensions: ['.js', '.json', '.node'] extensions: ['.js', '.json', '.node']
}, },
target: 'electron-main' target: 'electron-main'
} }
/** /**
* Adjust mainConfig for development settings * Adjust mainConfig for development settings
*/ */
if (process.env.NODE_ENV !== 'production') { if (process.env.NODE_ENV !== 'production') {
mainConfig.plugins.push( mainConfig.plugins.push(
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"` '__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`
}) })
) )
} }
/** /**
* Adjust mainConfig for production settings * Adjust mainConfig for production settings
*/ */
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
mainConfig.plugins.push( mainConfig.plugins.push(
new BabiliWebpackPlugin(), new webpack.DefinePlugin({
new webpack.DefinePlugin({ '__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`,
'process.env.NODE_ENV': '"production"' 'process.env.NODE_ENV': '"production"'
}) }),
) )
// mainConfig.plugins.push(
// new BabiliWebpackPlugin(),
// new webpack.DefinePlugin({
// 'process.env.NODE_ENV': '"production"'
// })
// )
} }
module.exports = mainConfig module.exports = mainConfig

@ -6,10 +6,11 @@ const path = require('path')
const { dependencies } = require('../package.json') const { dependencies } = require('../package.json')
const webpack = require('webpack') const webpack = require('webpack')
const BabiliWebpackPlugin = require('babili-webpack-plugin') const BabiliWebpackPlugin = require('babel-minify-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin') const CopyWebpackPlugin = require('copy-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin') const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin') const HtmlWebpackPlugin = require('html-webpack-plugin')
const { VueLoaderPlugin } = require('vue-loader')
/** /**
* List of node_modules to include in webpack bundle * List of node_modules to include in webpack bundle
@ -21,147 +22,150 @@ const HtmlWebpackPlugin = require('html-webpack-plugin')
let whiteListedModules = ['vue'] let whiteListedModules = ['vue']
let rendererConfig = { let rendererConfig = {
devtool: '#cheap-module-eval-source-map', devtool: '#cheap-module-eval-source-map',
entry: { entry: {
renderer: path.join(__dirname, '../src/renderer/main.js') renderer: path.join(__dirname, '../src/renderer/main.js')
}, },
externals: [ externals: [
...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d)) ...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d))
], ],
module: { module: {
rules: [ rules: [
{ {
test: /\.css$/, test: /\.less$/,
use: ExtractTextPlugin.extract({ use: ['vue-style-loader', 'css-loader', 'less-loader']
fallback: 'style-loader', },
use: 'css-loader' {
}) test: /\.css$/,
}, use: ['vue-style-loader', 'css-loader']
{ },
test: /\.html$/, {
use: 'vue-html-loader' test: /\.html$/,
}, use: 'vue-html-loader'
{ },
test: /\.js$/, {
use: 'babel-loader', test: /\.js$/,
exclude: /node_modules/ use: 'babel-loader',
}, exclude: /node_modules/
{ },
test: /\.node$/, {
use: 'node-loader' test: /\.node$/,
}, use: 'node-loader'
{ },
test: /\.vue$/, {
use: { test: /\.vue$/,
loader: 'vue-loader', use: {
options: { loader: 'vue-loader',
extractCSS: process.env.NODE_ENV === 'production', options: {
loaders: { extractCSS: process.env.NODE_ENV === 'production',
sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1', loaders: {
scss: 'vue-style-loader!css-loader!sass-loader' sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1',
scss: 'vue-style-loader!css-loader!sass-loader',
less: 'vue-style-loader!css-loader!less-loader'
}
}
}
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
use: {
loader: 'url-loader',
query: {
limit: 10000,
name: 'imgs/[name]--[folder].[ext]'
}
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: 'media/[name]--[folder].[ext]'
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
use: {
loader: 'url-loader',
query: {
limit: 10000,
name: 'fonts/[name]--[folder].[ext]'
}
}
} }
} ]
} },
}, node: {
{ __dirname: process.env.NODE_ENV !== 'production',
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, __filename: process.env.NODE_ENV !== 'production'
use: { },
loader: 'url-loader', plugins: [
query: { new VueLoaderPlugin(),
limit: 10000, new MiniCssExtractPlugin({filename: 'styles.css'}),
name: 'imgs/[name]--[folder].[ext]' new HtmlWebpackPlugin({
} filename: 'index.html',
} template: path.resolve(__dirname, '../src/index.ejs'),
}, minify: {
{ collapseWhitespace: true,
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, removeAttributeQuotes: true,
loader: 'url-loader', removeComments: true
options: { },
limit: 10000, nodeModules: process.env.NODE_ENV !== 'production'
name: 'media/[name]--[folder].[ext]' ? path.resolve(__dirname, '../node_modules')
} : false
}, }),
{ new webpack.HotModuleReplacementPlugin(),
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, new webpack.NoEmitOnErrorsPlugin()
use: { ],
loader: 'url-loader', output: {
query: { filename: '[name].js',
limit: 10000, libraryTarget: 'commonjs2',
name: 'fonts/[name]--[folder].[ext]' path: path.join(__dirname, '../dist/electron')
}
}
}
]
},
node: {
__dirname: process.env.NODE_ENV !== 'production',
__filename: process.env.NODE_ENV !== 'production'
},
plugins: [
new ExtractTextPlugin('styles.css'),
new HtmlWebpackPlugin({
filename: 'index.html',
template: path.resolve(__dirname, '../src/index.ejs'),
minify: {
collapseWhitespace: true,
removeAttributeQuotes: true,
removeComments: true
},
nodeModules: process.env.NODE_ENV !== 'production'
? path.resolve(__dirname, '../node_modules')
: false
}),
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin()
],
output: {
filename: '[name].js',
libraryTarget: 'commonjs2',
path: path.join(__dirname, '../dist/electron')
},
resolve: {
alias: {
'@': path.join(__dirname, '../src/renderer'),
'vue$': 'vue/dist/vue.esm.js'
}, },
extensions: ['.js', '.vue', '.json', '.css', '.node'] resolve: {
}, alias: {
target: 'electron-renderer' '@': path.join(__dirname, '../src/renderer'),
'vue$': 'vue/dist/vue.esm.js'
},
extensions: ['.js', '.vue', '.json', '.css', '.node']
},
target: 'electron-renderer'
} }
/** /**
* Adjust rendererConfig for development settings * Adjust rendererConfig for development settings
*/ */
if (process.env.NODE_ENV !== 'production') { if (process.env.NODE_ENV !== 'production') {
rendererConfig.plugins.push( rendererConfig.plugins.push(
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"` '__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`
}) })
) )
} }
/** /**
* Adjust rendererConfig for production settings * Adjust rendererConfig for production settings
*/ */
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
rendererConfig.devtool = '' rendererConfig.devtool = ''
rendererConfig.plugins.push( rendererConfig.plugins.push(
new BabiliWebpackPlugin(), new BabiliWebpackPlugin(),
new CopyWebpackPlugin([ new CopyWebpackPlugin([
{ {
from: path.join(__dirname, '../static'), from: path.join(__dirname, '../static'),
to: path.join(__dirname, '../dist/electron/static'), to: path.join(__dirname, '../dist/electron/static'),
ignore: ['.*'] ignore: ['.*']
} }
]), ]),
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'process.env.NODE_ENV': '"production"' 'process.env.NODE_ENV': '"production"'
}), }),
new webpack.LoaderOptionsPlugin({ new webpack.LoaderOptionsPlugin({
minimize: true minimize: true
}) })
) )
} }
module.exports = rendererConfig module.exports = rendererConfig

@ -5,124 +5,128 @@ process.env.BABEL_ENV = 'web'
const path = require('path') const path = require('path')
const webpack = require('webpack') const webpack = require('webpack')
const BabiliWebpackPlugin = require('babili-webpack-plugin') const BabiliWebpackPlugin = require('babel-minify-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin') const CopyWebpackPlugin = require('copy-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin') const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin') const HtmlWebpackPlugin = require('html-webpack-plugin')
const { VueLoaderPlugin } = require('vue-loader')
let webConfig = { let webConfig = {
devtool: '#cheap-module-eval-source-map', devtool: '#cheap-module-eval-source-map',
entry: { entry: {
web: path.join(__dirname, '../src/renderer/main.js') web: path.join(__dirname, '../src/renderer/main.js')
}, },
module: { module: {
rules: [ rules: [
{ {
test: /\.css$/, test: /\.less$/,
use: ExtractTextPlugin.extract({ use: ['vue-style-loader', 'css-loader', 'less-loader']
fallback: 'style-loader', },
use: 'css-loader' {
}) test: /\.css$/,
}, use: ['vue-style-loader', 'css-loader']
{ },
test: /\.html$/, {
use: 'vue-html-loader' test: /\.html$/,
}, use: 'vue-html-loader'
{ },
test: /\.js$/, {
use: 'babel-loader', test: /\.js$/,
include: [ path.resolve(__dirname, '../src/renderer') ], use: 'babel-loader',
exclude: /node_modules/ include: [ path.resolve(__dirname, '../src/renderer') ],
}, exclude: /node_modules/
{ },
test: /\.vue$/, {
use: { test: /\.vue$/,
loader: 'vue-loader', use: {
options: { loader: 'vue-loader',
extractCSS: true, options: {
loaders: { extractCSS: true,
sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1', loaders: {
scss: 'vue-style-loader!css-loader!sass-loader' sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1',
scss: 'vue-style-loader!css-loader!sass-loader',
less: 'vue-style-loader!css-loader!less-loader'
}
}
}
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
use: {
loader: 'url-loader',
query: {
limit: 10000,
name: 'imgs/[name].[ext]'
}
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
use: {
loader: 'url-loader',
query: {
limit: 10000,
name: 'fonts/[name].[ext]'
}
}
} }
} ]
} },
}, plugins: [
{ new VueLoaderPlugin(),
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, new MiniCssExtractPlugin({filename: 'styles.css'}),
use: { new HtmlWebpackPlugin({
loader: 'url-loader', filename: 'index.html',
query: { template: path.resolve(__dirname, '../src/index.ejs'),
limit: 10000, minify: {
name: 'imgs/[name].[ext]' collapseWhitespace: true,
} removeAttributeQuotes: true,
} removeComments: true
}, },
{ nodeModules: false
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, }),
use: { new webpack.DefinePlugin({
loader: 'url-loader', 'process.env.IS_WEB': 'true'
query: { }),
limit: 10000, new webpack.HotModuleReplacementPlugin(),
name: 'fonts/[name].[ext]' new webpack.NoEmitOnErrorsPlugin()
} ],
} output: {
} filename: '[name].js',
] path: path.join(__dirname, '../dist/web')
},
plugins: [
new ExtractTextPlugin('styles.css'),
new HtmlWebpackPlugin({
filename: 'index.html',
template: path.resolve(__dirname, '../src/index.ejs'),
minify: {
collapseWhitespace: true,
removeAttributeQuotes: true,
removeComments: true
},
nodeModules: false
}),
new webpack.DefinePlugin({
'process.env.IS_WEB': 'true'
}),
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin()
],
output: {
filename: '[name].js',
path: path.join(__dirname, '../dist/web')
},
resolve: {
alias: {
'@': path.join(__dirname, '../src/renderer'),
'vue$': 'vue/dist/vue.esm.js'
}, },
extensions: ['.js', '.vue', '.json', '.css'] resolve: {
}, alias: {
target: 'web' '@': path.join(__dirname, '../src/renderer'),
'vue$': 'vue/dist/vue.esm.js'
},
extensions: ['.js', '.vue', '.json', '.css']
},
target: 'web'
} }
/** /**
* Adjust webConfig for production settings * Adjust webConfig for production settings
*/ */
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
webConfig.devtool = '' webConfig.devtool = ''
webConfig.plugins.push( webConfig.plugins.push(
new BabiliWebpackPlugin(), new BabiliWebpackPlugin(),
new CopyWebpackPlugin([ new CopyWebpackPlugin([
{ {
from: path.join(__dirname, '../static'), from: path.join(__dirname, '../static'),
to: path.join(__dirname, '../dist/web/static'), to: path.join(__dirname, '../dist/web/static'),
ignore: ['.*'] ignore: ['.*']
} }
]), ]),
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'process.env.NODE_ENV': '"production"' 'process.env.NODE_ENV': '"production"'
}), }),
new webpack.LoaderOptionsPlugin({ new webpack.LoaderOptionsPlugin({
minimize: true minimize: true
}) })
) )
} }
module.exports = webConfig module.exports = webConfig

4
.gitignore vendored

@ -9,4 +9,6 @@ npm-debug.log.*
thumbs.db thumbs.db
!.gitkeep !.gitkeep
.idea .idea
wowlight wowlite
package-lock.json
*.log

@ -20,7 +20,7 @@ If `npm run dev` works, you can install a custom version of `wownero-wallet-cli`
#### wownero-wallet-cli :star2: #### wownero-wallet-cli :star2:
``` ```
git clone https://github.com/wownero/wownero.git git clone https://git.wownero.com/wownero/wownero.git
cd wownero cd wownero
git checkout <latest version here> git checkout <latest version here>
git apply light_patch.diff git apply light_patch.diff
@ -30,7 +30,7 @@ make -j4
Use `light_patch.diff` that's included in this repository. Move resulting binary into the resources folder: Use `light_patch.diff` that's included in this repository. Move resulting binary into the resources folder:
``` ```
cp build/release/bin/wownero-wallet-cli wowlight/resources/linux/bin/wowlight cp build/release/bin/wownero-wallet-cli wowlite/resources/linux/bin/wowlite
``` ```
Build the light wallet: Build the light wallet:

@ -1,18 +1,3 @@
# wowlight Deprecated - No longer maintained.
Use latest [CLI wallet](https://git.wownero.com/wownero/wownero/releases), [web wallet](https://wowstash.app), or [feather-wow wallet](https://featherwallet.org/wownero/)
![](https://light.wownero.com/wowlight.png)
Wownero wallet full of questionable development practices.
- Electron/Vue.js
- Remote node only
- 100% WOW
Download: [https://light.wownero.com](https://light.wownero.com)
See `Install.md` for compilation instructions.
### License
© 2018 WTFPL Do What the Fuck You Want to Public License

@ -1,138 +1,52 @@
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c3dc88b0..e04892f8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -466,15 +466,18 @@ endif()
include_directories(${LIBUNWIND_INCLUDE})
link_directories(${LIBUNWIND_LIBRARY_DIRS})
+if(USE_DEVICE_LEDGER)
+ set(USE_DEVICE_LEDGER 0)
+
# Final setup for libpcsc
-if (PCSC_FOUND)
- message(STATUS "Using PCSC include dir at ${PCSC_INCLUDE_DIR}")
- add_definitions(-DHAVE_PCSC)
- include_directories(${PCSC_INCLUDE_DIR})
- link_directories(${LIBPCSC_LIBRARY_DIRS})
-else (PCSC_FOUND)
- message(STATUS "Could not find PCSC")
-endif()
+#if (PCSC_FOUND)
+# message(STATUS "Using PCSC include dir at ${PCSC_INCLUDE_DIR}")
+# add_definitions(-DHAVE_PCSC)
+# include_directories(${PCSC_INCLUDE_DIR})
+# link_directories(${LIBPCSC_LIBRARY_DIRS})
+#else (PCSC_FOUND)
+# message(STATUS "Could not find PCSC")
+#endif()
if(MSVC)
add_definitions("/bigobj /MP /W3 /GS- /D_CRT_SECURE_NO_WARNINGS /wd4996 /wd4345 /D_WIN32_WINNT=0x0600 /DWIN32_LEAN_AND_MEAN /DGTEST_HAS_TR1_TUPLE=0 /FIinline_c.h /D__SSE4_1__")
@@ -904,31 +907,31 @@ endif()
add_subdirectory(contrib)
add_subdirectory(src)
-if(BUILD_TESTS)
- add_subdirectory(tests)
-endif()
-
-if(BUILD_DOCUMENTATION)
- set(DOC_GRAPHS "YES" CACHE STRING "Create dependency graphs (needs graphviz)")
- set(DOC_FULLGRAPHS "NO" CACHE STRING "Create call/callee graphs (large)")
-
- find_program(DOT_PATH dot)
-
- if (DOT_PATH STREQUAL "DOT_PATH-NOTFOUND")
- message("Doxygen: graphviz not found - graphs disabled")
- set(DOC_GRAPHS "NO")
- endif()
+#if(BUILD_TESTS)
+# add_subdirectory(tests)
+#endif()
- find_package(Doxygen)
- if(DOXYGEN_FOUND)
- configure_file("cmake/Doxyfile.in" "Doxyfile" @ONLY)
- configure_file("cmake/Doxygen.extra.css.in" "Doxygen.extra.css" @ONLY)
- add_custom_target(doc
- ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
- COMMENT "Generating API documentation with Doxygen.." VERBATIM)
- endif()
-endif()
+#if(BUILD_DOCUMENTATION)
+# set(DOC_GRAPHS "YES" CACHE STRING "Create dependency graphs (needs graphviz)")
+# set(DOC_FULLGRAPHS "NO" CACHE STRING "Create call/callee graphs (large)")
+#
+# find_program(DOT_PATH dot)
+#
+# if (DOT_PATH STREQUAL "DOT_PATH-NOTFOUND")
+# message("Doxygen: graphviz not found - graphs disabled")
+# set(DOC_GRAPHS "NO")
+# endif()
+#
+# find_package(Doxygen)
+# if(DOXYGEN_FOUND)
+# configure_file("cmake/Doxyfile.in" "Doxyfile" @ONLY)
+# configure_file("cmake/Doxygen.extra.css.in" "Doxygen.extra.css" @ONLY)
+# add_custom_target(doc
+# ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
+# WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+# COMMENT "Generating API documentation with Doxygen.." VERBATIM)
+# endif()
+#endif()
# when ON - will install libwallet_merged into "lib"
option(BUILD_GUI_DEPS "Build GUI dependencies." OFF)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 3b71c38c..bbdeba8d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -30,6 +30,7 @@
if (WIN32 OR STATIC)
add_definitions(-DSTATICLIB)
+ add_definitions(-DUSE_DEVICE_LEDGER=0)
# miniupnp changed their static define
add_definitions(-DMINIUPNP_STATICLIB)
endif ()
diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp
index d2acf518..f935c6ea 100755 index 69d4652bb..efd04ca68 100644
--- a/src/simplewallet/simplewallet.cpp --- a/src/simplewallet/simplewallet.cpp
+++ b/src/simplewallet/simplewallet.cpp +++ b/src/simplewallet/simplewallet.cpp
@@ -3488,12 +3488,7 @@ bool simple_wallet::ask_wallet_create_if_needed() @@ -3876,23 +3876,10 @@ bool simple_wallet::ask_wallet_create_if_needed()
*/ */
void simple_wallet::print_seed(std::string seed) void simple_wallet::print_seed(const epee::wipeable_string &seed)
{ {
- success_msg_writer(true) << "\n" << tr("NOTE: the following 25 words can be used to recover access to your wallet. " - success_msg_writer(true) << "\n" << boost::format(tr("NOTE: the following %s can be used to recover access to your wallet. "
- "Write them down and store them somewhere safe and secure. Please do not store them in " - "Write them down and store them somewhere safe and secure. Please do not store them in "
- "your email or on file storage services outside of your immediate control.\n"); - "your email or on file storage services outside of your immediate control.\n")) % (m_wallet->multisig() ? tr("string") : tr("25 words"));
- boost::replace_nth(seed, " ", 15, "\n");
- boost::replace_nth(seed, " ", 7, "\n");
- // don't log - // don't log
+ success_msg_writer(true) << "**********************************************************************\n"; int space_index = 0;
std::cout << seed << std::endl; size_t len = seed.size();
} for (const char *ptr = seed.data(); len--; ++ptr)
//---------------------------------------------------------------------------------------------------- {
@@ -4169,37 +4164,8 @@ bool simple_wallet::try_connect_to_daemon(bool silent, uint32_t* version) - if (*ptr == ' ')
- {
- if (space_index == 15 || space_index == 7)
- putchar('\n');
- else
- putchar(*ptr);
- ++space_index;
- }
- else
putchar(*ptr);
}
putchar('\n');
@@ -4640,40 +4627,9 @@ bool simple_wallet::try_connect_to_daemon(bool silent, uint32_t* version)
*/
std::string simple_wallet::get_mnemonic_language() std::string simple_wallet::get_mnemonic_language()
{ {
std::vector<std::string> language_list; - std::vector<std::string> language_list_self, language_list_english;
- const std::vector<std::string> &language_list = m_use_english_language_names ? language_list_english : language_list_self;
- std::string language_choice; - std::string language_choice;
- int language_number = -1; - int language_number = -1;
crypto::ElectrumWords::get_language_list(language_list, m_use_english_language_names); - crypto::ElectrumWords::get_language_list(language_list_self, false);
- crypto::ElectrumWords::get_language_list(language_list_english, true);
- std::cout << tr("List of available languages for your wallet's seed:") << std::endl; - std::cout << tr("List of available languages for your wallet's seed:") << std::endl;
- std::cout << tr("If your display freezes, exit blind with ^C, then run again with --use-english-language-names") << std::endl; - std::cout << tr("If your display freezes, exit blind with ^C, then run again with --use-english-language-names") << std::endl;
- int ii; - int ii;
- std::vector<std::string>::iterator it; - std::vector<std::string>::const_iterator it;
- for (it = language_list.begin(), ii = 0; it != language_list.end(); it++, ii++) - for (it = language_list.begin(), ii = 0; it != language_list.end(); it++, ii++)
- { - {
- std::cout << ii << " : " << *it << std::endl; - std::cout << ii << " : " << *it << std::endl;
- } - }
- while (language_number < 0) - while (language_number < 0)
- { - {
- language_choice = input_line(tr("Enter the number corresponding to the language of your choice: ")); - language_choice = input_line(tr("Enter the number corresponding to the language of your choice"));
- if (std::cin.eof()) - if (std::cin.eof())
- return std::string(); - return std::string();
- try - try
@ -149,81 +63,86 @@ index d2acf518..f935c6ea 100755
- fail_msg_writer() << tr("invalid language choice entered. Please try again.\n"); - fail_msg_writer() << tr("invalid language choice entered. Please try again.\n");
- } - }
- } - }
- return language_list[language_number]; - return language_list_self[language_number];
+ std::vector<std::string> language_list;
+ crypto::ElectrumWords::get_language_list(language_list, m_use_english_language_names);
+ return language_list[1]; + return language_list[1];
} }
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
boost::optional<tools::password_container> simple_wallet::get_and_verify_password() const boost::optional<tools::password_container> simple_wallet::get_and_verify_password() const
@@ -4299,11 +4265,9 @@ boost::optional<epee::wipeable_string> simple_wallet::new_wallet(const boost::pr @@ -4778,11 +4734,9 @@ boost::optional<epee::wipeable_string> simple_wallet::new_wallet(const boost::pr
"your wallet again (your wallet keys are NOT at risk in any case).\n") "your wallet again (your wallet keys are NOT at risk in any case).\n")
; ;
- if (!two_random) - if (!two_random)
- { - {
- print_seed(electrum_words); - print_seed(electrum_words);
- } - }
- success_msg_writer() << "**********************************************************************"; - success_msg_writer() << "**********************************************************************";
+ success_msg_writer() << "******************************************************************SEED"; + success_msg_writer() << "******************************************************************SEED";
+ success_msg_writer() << electrum_words; + print_seed(electrum_words);
+ success_msg_writer() << "******************************************************************SEED"; + success_msg_writer() << "******************************************************************SEED";
return std::move(password); return password;
} }
@@ -6666,17 +6620,6 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vector<std::stri
{
prompt << tr("WARNING: this is a non default ring size, which may harm your privacy. Default is recommended.");
}
- prompt << ENDL << tr("Is this okay?");
-
- std::string accepted = input_line(prompt.str(), true);
- if (std::cin.eof())
- return false;
- if (!command_line::is_yes(accepted))
- {
- fail_msg_writer() << tr("transaction cancelled.");
-
- return false;
- }
}
// actually commit the transactions
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index 1bb9f52b..c9fdecc5 100755 index 4779c3335..e218df7e1 100644
--- a/src/wallet/wallet2.cpp --- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp
@@ -2952,6 +2952,13 @@ bool wallet2::load_keys(const std::string& keys_file_name, const epee::wipeable_ @@ -1134,7 +1134,7 @@ wallet2::wallet2(network_type nettype, uint64_t kdf_rounds, bool unattended, std
return false; m_trusted_daemon(false),
} m_nettype(nettype),
m_multisig_rounds_passed(0),
+ m_ask_password = false; - m_always_confirm_transfers(true),
+ m_always_confirm_transfers(false),
m_print_ring_members(false),
m_store_tx_info(true),
m_default_mixin(0),
@@ -1145,13 +1145,13 @@ wallet2::wallet2(network_type nettype, uint64_t kdf_rounds, bool unattended, std
m_refresh_from_block_height(0),
m_explicit_refresh_from_block_height(true),
m_confirm_non_default_ring_size(true),
- m_ask_password(AskPasswordOnAction),
+ m_ask_password(AskPasswordNever),
m_min_output_count(0),
m_min_output_value(0),
m_merge_destinations(false),
- m_confirm_backlog(true),
+ m_confirm_backlog(false),
m_confirm_backlog_threshold(0),
- m_confirm_export_overwrite(true),
+ m_confirm_export_overwrite(false),
m_auto_low_priority(true),
m_segregate_pre_fork_outputs(false),
m_key_reuse_mitigation2(false),
@@ -4000,6 +4000,12 @@ void wallet2::change_password(const std::string &filename, const epee::wipeable_
*/
bool wallet2::load_keys(const std::string& keys_file_name, const epee::wipeable_string& password)
{
+ m_ask_password = AskPasswordNever;
+ m_always_confirm_transfers = false; + m_always_confirm_transfers = false;
+ m_confirm_subaddress = false;
+ m_confirm_backlog = false; + m_confirm_backlog = false;
+ m_confirm_export_overwrite = false; + m_confirm_export_overwrite = false;
+ m_confirm_non_default_ring_size = true; + m_confirm_non_default_ring_size = true;
+ + m_inactivity_lock_timeout = 525600;
r = epee::serialization::load_t_from_binary(m_account, account_data); std::string keys_file_buf;
if (r && m_key_on_device) { bool r = load_from_file(keys_file_name, keys_file_buf);
LOG_PRINT_L0("Account on device. Initing device..."); THROW_WALLET_EXCEPTION_IF(!r, error::file_read_error, keys_file_name);
diff --git a/src/wallet/wallet_args.cpp b/src/wallet/wallet_args.cpp
index fcd9cc0f..5c0cebdb 100644
--- a/src/wallet/wallet_args.cpp
+++ b/src/wallet/wallet_args.cpp
@@ -122,7 +122,7 @@ namespace wallet_args
command_line::add_arg(desc_params, arg_max_concurrency);
command_line::add_arg(desc_params, arg_config_file);
- i18n_set_language("translations", "monero", lang);
+ i18n_set_language("translations", "monero", "en");
po::options_description desc_all;
desc_all.add(desc_general).add(desc_params);
@@ -134,7 +134,7 @@ namespace wallet_args
if (command_line::get_arg(vm, command_line::arg_help))
{
- Print(print) << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL;
+ Print(print) << "Wownero Light'" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL;
Print(print) << wallet_args::tr("This is the command line wownero wallet. It needs to connect to a wownero\n"
"daemon to work correctly.") << ENDL;
Print(print) << wallet_args::tr("Usage:") << ENDL << " " << usage;
@@ -143,7 +143,7 @@ namespace wallet_args
}
else if (command_line::get_arg(vm, command_line::arg_version))
{
- Print(print) << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")";
+ Print(print) << "Wownero Light'" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")";
return false;
}
@@ -190,7 +190,7 @@ namespace wallet_args
if (!command_line::is_arg_defaulted(vm, arg_max_concurrency))
tools::set_max_concurrency(command_line::get_arg(vm, arg_max_concurrency));
- Print(print) << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")";
+ Print(print) << "Wownero Light'" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")";
if (!command_line::is_arg_defaulted(vm, arg_log_level))
MINFO("Setting log level = " << command_line::get_arg(vm, arg_log_level));

@ -1,8 +1,9 @@
{ {
"name": "wowlight", "name": "wowlite",
"version": "0.1.1", "version": "0.1.4",
"__version": "bumping this should also bump LandingPage.vue (version checker)",
"author": "dsc <xmrdsc@protonmail.com>", "author": "dsc <xmrdsc@protonmail.com>",
"description": "Wownero Light Wallet", "description": "Wownero Lite Wallet",
"license": "WTFPL", "license": "WTFPL",
"main": "./dist/electron/main.js", "main": "./dist/electron/main.js",
"scripts": { "scripts": {
@ -17,8 +18,8 @@
"postinstall": "" "postinstall": ""
}, },
"build": { "build": {
"productName": "wowlight", "productName": "wowlite",
"appId": "org.wownero.wowlight", "appId": "org.wownero.wowlite",
"directories": { "directories": {
"output": "build" "output": "build"
}, },
@ -75,53 +76,54 @@
} }
}, },
"dependencies": { "dependencies": {
"vue": "^2.3.3", "app-root-dir": "1.0.2",
"axios": "^0.16.2", "axios": "^0.18.0",
"jquery": "^3.3.1",
"text-encoding": "0.7.0",
"vue": "^2.5.16",
"vue-electron": "^1.0.6", "vue-electron": "^1.0.6",
"vue-router": "^2.5.3", "vue-router": "^3.0.1",
"vuex": "^3.0.1", "vuex": "^3.0.1",
"opn": "^5.4.0", "vuex-electron": "^1.0.0",
"electron-context-menu": "0.10.0", "bootstrap": "^4.1.1",
"jquery": "^3.3.1", "popper.js": "^1.12.9"
"app-root-dir": "1.0.2"
}, },
"devDependencies": { "devDependencies": {
"babel-core": "^6.25.0", "ajv": "^6.5.0",
"babel-loader": "^7.1.1", "babel-core": "^6.26.3",
"babel-loader": "^7.1.4",
"babel-plugin-transform-runtime": "^6.23.0", "babel-plugin-transform-runtime": "^6.23.0",
"babel-preset-env": "^1.6.0", "babel-preset-env": "^1.7.0",
"babel-preset-stage-0": "^6.24.1", "babel-preset-stage-0": "^6.24.1",
"babel-register": "^6.24.1", "babel-register": "^6.26.0",
"babili-webpack-plugin": "^0.1.2", "babel-minify-webpack-plugin": "0.3.1",
"cfonts": "^1.1.3", "cfonts": "^2.1.2",
"chalk": "^2.1.0", "chalk": "^2.4.1",
"copy-webpack-plugin": "^4.0.1", "copy-webpack-plugin": "^4.5.1",
"cross-env": "^5.0.5", "cross-env": "^5.1.6",
"css-loader": "^0.28.4", "css-loader": "^0.28.11",
"del": "^3.0.0", "del": "^3.0.0",
"devtron": "^1.4.0", "devtron": "^1.4.0",
"electron": "^1.7.5", "electron": "^2.0.4",
"electron-builder": "^19.19.1", "electron-debug": "3.0.0",
"electron-debug": "^1.4.0", "electron-util": "0.11.0",
"electron-devtools-installer": "^2.2.0", "electron-devtools-installer": "^2.2.4",
"electron-store": "^2.0.0", "electron-builder": "^21.2.0",
"electron-util": "^0.9.0", "mini-css-extract-plugin": "0.4.0",
"extract-text-webpack-plugin": "^3.0.0", "file-loader": "^1.1.11",
"file-loader": "^0.11.2", "html-webpack-plugin": "^3.2.0",
"html-webpack-plugin": "^2.30.1",
"jquery": "^3.3.1",
"multispinner": "^0.2.1", "multispinner": "^0.2.1",
"node-loader": "^0.6.0", "node-loader": "^0.6.0",
"style-loader": "^0.18.2", "style-loader": "^0.21.0",
"text-encoding": "^0.6.4", "url-loader": "^1.0.1",
"url-loader": "^0.5.9",
"vue-html-loader": "^1.2.4", "vue-html-loader": "^1.2.4",
"vue-loader": "^13.0.5", "vue-loader": "^15.2.4",
"vue-style-loader": "^3.0.1", "vue-style-loader": "^4.1.0",
"vue-template-compiler": "^2.4.2", "vue-template-compiler": "^2.5.16",
"vuex": "^3.0.1", "webpack-cli": "^3.0.8",
"webpack": "^3.5.2", "webpack": "^4.15.1",
"webpack-dev-server": "^2.7.1", "webpack-dev-server": "^3.1.4",
"webpack-hot-middleware": "^2.18.2" "webpack-hot-middleware": "^2.22.2",
"webpack-merge": "^4.1.3"
} }
} }

@ -2,11 +2,9 @@
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>wowlight</title> <title>wowlite</title>
<script> <script>
const {ipcRenderer} = require('electron'); const {ipcRenderer} = require('electron');
// window.$ = window.jQuery = require('./assets/scripts/jquery.min.js');
window.jQuery = window.$ = require('jquery');
</script> </script>
<% if (htmlWebpackPlugin.options.nodeModules) { %> <% if (htmlWebpackPlugin.options.nodeModules) { %>
@ -17,8 +15,13 @@
<% } %> <% } %>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" crossorigin="anonymous"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" crossorigin="anonymous">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.5/umd/popper.min.js"></script> <!--<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.5/umd/popper.min.js"></script>-->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script> <!--<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>-->
<script src="./node_modules/popper.js/dist/umd/popper.js" crossorigin="anonymous"></script>
<script src="./node_modules/bootstrap/dist/js/bootstrap.js" crossorigin="anonymous"></script>
<link rel="stylesheet"
href="./node_modules/bootstrap/dist/css/bootstrap.css"
crossorigin="anonymous">
</head> </head>
<body> <body>

@ -14,9 +14,9 @@ const execPath = IS_PROD ?
const cli_binaries = { const cli_binaries = {
'linux': 'wowlight', 'linux': 'wowlite',
'mac': 'wowlight', 'mac': 'wowlite',
'win': 'wowlight.exe' 'win': 'wowlite.exe'
} }
export const cliPath = `${joinPath(execPath, cli_binaries[getPlatform()])}`; export const cliPath = `${joinPath(execPath, cli_binaries[getPlatform()])}`;

@ -3,7 +3,7 @@ const fs = require('fs');
export class Config { export class Config {
constructor(wowdir) { constructor(wowdir) {
this._path_cfg = `${wowdir}/wowlight.json`; this._path_cfg = `${wowdir}/wowlite.json`;
this.create(); this.create();
this.data = this.load(); this.data = this.load();
} }
@ -24,14 +24,16 @@ export class Config {
} }
let data = JSON.stringify({ let data = JSON.stringify({
"node": "node.wowne.ro:34568", "node": "wow.candy.surf:34568",
"nodes": [ "nodes": [
{"address": "node.wowne.ro:34568", "location": "New Jersey, United States", "region": "US"}, {"address": "wow.candy.surf:34568", "location": "All you can eat.", "region": "WOW"},
{"address": "node.pwned.systems:34568", "location": "Amsterdam, The Netherlands", "region": "EU"}, {"address": "so.wow.candy.surf:34568", "location": "San Francisco, United States", "region": "US"},
{"address": "node.wownero.com:34568", "location": "Montreal, Canada", "region": "US"}, {"address": "much.wow.candy.surf:34568", "location": "London, England", "region": "UK"},
{"address": "such.wow.candy.surf:34568", "location": "Montreal, Canada", "region": "CA"},
{"address": "very.wow.candy.surf:34568", "location": "Bangalore, India", "region": "IN"},
{"address": "localhost:34568", 'location': "", "region": "*"} {"address": "localhost:34568", 'location': "", "region": "*"}
], ],
"wallet_path": "" "wallets": []
}); });
fs.writeFileSync(this._path_cfg, JSON.stringify(data)); fs.writeFileSync(this._path_cfg, JSON.stringify(data));
@ -59,17 +61,4 @@ export class Config {
return true; return true;
} }
saveLastWalletPath(path){
if (typeof this.data === 'string' || this.data instanceof String){
this.data = JSON.parse(this.data);
}
if(path === ''){
return;
}
this.data.wallet_path = path;
this.save();
}
} }

@ -7,21 +7,18 @@
/* eslint-disable */ /* eslint-disable */
// Set environment for development
process.env.NODE_ENV = 'development'
// Install `electron-debug` with `devtron` // Install `electron-debug` with `devtron`
require('electron-debug')({ showDevTools: true }) require('electron-debug')({ showDevTools: true })
// Install `vue-devtools` // Install `vue-devtools`
require('electron').app.on('ready', () => { require('electron').app.on('ready', () => {
let installExtension = require('electron-devtools-installer') let installExtension = require('electron-devtools-installer')
installExtension.default(installExtension.VUEJS_DEVTOOLS) installExtension.default(installExtension.VUEJS_DEVTOOLS)
.then(() => {}) .then(() => {})
.catch(err => { .catch(err => {
console.log('Unable to install `vue-devtools`: \n', err) console.log('Unable to install `vue-devtools`: \n', err)
}) })
}) })
// Require `main` process to boot app // Require `main` process to boot app
require('./index') require('./index')

@ -21,7 +21,12 @@ const store = new Store();
const fs = require('fs'); const fs = require('fs');
const utils = require('electron-util'); const utils = require('electron-util');
let homedir = (process.platform === 'win32') ? process.env.HOMEPATH : process.env.HOME; let homedir = process.env.HOME;
if (process.platform === 'win32'){
homedir = process.env.HOMEPATH; // back-compat
if (!fs.existsSync(path.join(homedir, 'Wownero')))
homedir = process.env.USERPROFILE;
}
let wowdir = path.join(homedir, 'Wownero'); let wowdir = path.join(homedir, 'Wownero');
if (!fs.existsSync(wowdir)){ if (!fs.existsSync(wowdir)){
@ -170,7 +175,7 @@ ipcMain.on('rpc_commit_wallet', (event, data) => {
event.sender.send('rpc_wallet_committed'); event.sender.send('rpc_wallet_committed');
}); });
ipcMain.on('rate_usd_wow', (event, data) => { ipcMain.on('rate_btc_wow', (event, data) => {
console.log(data); console.log(data);
}); });
@ -211,7 +216,6 @@ ipcMain.on('rpc_kill_wallet', (event) => {
ipcMain.on('rpc_open_wallet', (event, data) => { ipcMain.on('rpc_open_wallet', (event, data) => {
wallet.onWalletOpened = function(data){ wallet.onWalletOpened = function(data){
cfg.saveLastWalletPath(data.wallet_path);
event.sender.send('rpc_wallet_opened', data); event.sender.send('rpc_wallet_opened', data);
} }

@ -11,7 +11,7 @@ export class WowRpc {
constructor(wowdir, cli_path) { constructor(wowdir, cli_path) {
this._wowdir = wowdir; this._wowdir = wowdir;
this._cli_process = null; this._cli_process = null;
this._cli_log_path = path.join(os.tmpdir(), 'wowlight-wallet.log'); this._cli_log_path = path.join(os.tmpdir(), 'wowlite-wallet.log');
if(!cli_path) { if(!cli_path) {
this._cli_path = cliPath; this._cli_path = cliPath;
} else { } else {
@ -89,6 +89,7 @@ export class WowRpc {
if(this._state === 5){ if(this._state === 5){
this._sendCmd('show_transfers'); this._sendCmd('show_transfers');
this._sendCmd('balance'); this._sendCmd('balance');
this._sendCmd('save');
setTimeout(this._checkMemPool.bind(this), this._checkMemPoolTimeout); setTimeout(this._checkMemPool.bind(this), this._checkMemPoolTimeout);
} }
} }
@ -138,6 +139,12 @@ export class WowRpc {
} }
} }
// detect background mining prompt
let re_background_mining = /Do you want to do it now?/g;
if(data.match(re_background_mining)){
this._sendCmd("No\n");
}
if(this._state === 5 && data.match(/Error: invalid password/)){ if(this._state === 5 && data.match(/Error: invalid password/)){
this._sendCmd(this._cli_wallet_password); this._sendCmd(this._cli_wallet_password);
} }
@ -275,22 +282,22 @@ export class WowRpc {
// } // }
if(data.match(/Background refresh thread started/)){ if(data.match(/Background refresh thread started/)){
let re_addy = /Generated new wallet: (W[o|W][a-zA-Z0-9]{95})/ let re_addy = /Generated new wallet: (W[o|W][a-zA-Z0-9]{95})/;
let re_addy_match = this._buffer.match(re_addy); let re_addy_match = this._buffer.match(re_addy);
if(re_addy_match){ if(re_addy_match){
this._create_wallet['address'] = re_addy_match[1]; this._create_wallet['address'] = re_addy_match[1];
} }
let re_view_key = /View key: ([0-9a-fA-F]+)\n/ let re_view_key = /View key: ([0-9a-fA-F]+)\n/;
let re_view_key_match = this._buffer.match(re_view_key); let re_view_key_match = this._buffer.match(re_view_key);
if(re_view_key_match){ if(re_view_key_match){
this._create_wallet['view_key'] = re_view_key_match[1]; this._create_wallet['view_key'] = re_view_key_match[1];
} }
let re_seed = /\*\*\*\*\*\*SEED\n(.*)\n\*\*/ let re_seed_lol = /(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+ )(\w+)/g;
let re_seed_match = this._buffer.match(re_seed); let re_seed_match = this._buffer.match(re_seed_lol);
if(re_seed_match){ if(re_seed_match){
let seed = re_seed_match[1].trim(); let seed = re_seed_match[0].trim();
if(seed.split(' ').length !== 25){ if(seed.split(' ').length !== 25){
this.onCreateWalletFinished("could not get seed; invalid num words"); this.onCreateWalletFinished("could not get seed; invalid num words");
} }
@ -362,6 +369,11 @@ export class WowRpc {
this._wallet_path = wallet_path; this._wallet_path = wallet_path;
this._cli_wallet_password = wallet_password; this._cli_wallet_password = wallet_password;
if(typeof this._cli_daemon_address == 'undefined'){
// this is some truly stupid hacky shit
this._cli_daemon_address = 'wow.candy.surf:34568';
}
let cli_args = ['--daemon-address', this._cli_daemon_address]; let cli_args = ['--daemon-address', this._cli_daemon_address];
cli_args = cli_args.concat(this._cli_args_default); cli_args = cli_args.concat(this._cli_args_default);
cli_args.push('--wallet-file'); cli_args.push('--wallet-file');

@ -47,7 +47,7 @@
<script> <script>
export default { export default {
name: 'wowlight', name: 'wowlite',
computed: { computed: {
height_from() { height_from() {
return this.$store.getters.height_from; return this.$store.getters.height_from;

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

@ -83,6 +83,10 @@ export const messages = [
'Sending all funds to wownero.win', 'Sending all funds to wownero.win',
'Shaving away klubus and grumbo', 'Shaving away klubus and grumbo',
'Contacting Stealy for more plumbus', 'Contacting Stealy for more plumbus',
'Rebuilding WinoBot!' 'Rebuilding WinoBot!',
] 'He who runs, doesn\'t walk!',
'Downloading Shaggy_Complete_Collection.zip [148 GB left]',
'Arrays start at 1!',
'Junkie Jeff thanks you for mining Wownero',
'Wownero - Iterative Discourse - a blackhat culture'
];

@ -88,7 +88,7 @@ html {
} }
body { body {
background: url("~@/assets/background.png") 0 0; background: url("~@/assets/background2.png") 0 0;
font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif; font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;
} }
@ -361,7 +361,7 @@ textarea.seed {
font-size: 18px; font-size: 18px;
color: #70bf19; color: #70bf19;
font-weight: bold; font-weight: bold;
background: rgba(0, 0, 0, 0.03); background-color: rgba(255, 255, 255, 0.85);
} }
p { p {
@ -638,6 +638,7 @@ form#sendForm .amount label small {
} }
main.dashboard{ main.dashboard{
background-image: url("~@/assets/background3.png");
margin-top: 42px; margin-top: 42px;
} }
@ -829,6 +830,7 @@ main.create-wallet-seed {
} }
main.credits ul, main.landing ul, main.create-wallet-seed ul { main.credits ul, main.landing ul, main.create-wallet-seed ul {
background-color: rgba(255, 255, 255, 0.85);
margin-left: 20px; margin-left: 20px;
} }
@ -896,7 +898,7 @@ main.credits ul, main.landing ul, main.create-wallet-seed ul {
width: 100%; width: 100%;
position: fixed; position: fixed;
bottom: 0; bottom: 0;
height: 200px; height: 170px;
z-index: 666; z-index: 666;
} }
@ -931,9 +933,8 @@ main.credits ul, main.landing ul, main.create-wallet-seed ul {
} }
.wario_seq .wario_walking_animated .wario_walking { .wario_seq .wario_walking_animated .wario_walking {
background-image: url("~@/assets/wariorunningcropped.gif"); background-image: url("~@/assets/dog.gif");
background-position-x: 0; background-position-x: 0;
-webkit-transform: scaleX(-1);
background-size: contain; background-size: contain;
background-repeat: no-repeat; background-repeat: no-repeat;
height: 138px; height: 138px;
@ -950,25 +951,25 @@ main.credits ul, main.landing ul, main.create-wallet-seed ul {
position: absolute; position: absolute;
} }
.wario_seq .perlsux { .wario_seq .hypnotoad {
background-image: url("~@/assets/perl_forbidden.png"); background-image: url("~@/assets/hypnotoad.gif");
background-position-x: 0; background-position-x: 0;
background-size: contain; background-size: contain;
background-repeat: no-repeat; background-repeat: no-repeat;
position: absolute; position: absolute;
width: 100px; width: 200px;
height: 100px; height: 145px;
right: 40px; right: 100px;
bottom: 40px; bottom: 5px;
z-index: 666; z-index: 666;
} }
main.credits .perlsux { main.credits .hypnotoad {
cursor: pointer; cursor: pointer;
} }
main.credits .perlsux:hover { main.credits .hypnotoad:hover {
transform: rotate(10deg); transform: rotate(-10deg);
} }
.wario_seq .grassfill .version { .wario_seq .grassfill .version {
@ -1012,9 +1013,8 @@ main.landing .wario_seq .grassfill .author {
} }
.wario_seq .wario_standing_animated .wario_standing { .wario_seq .wario_standing_animated .wario_standing {
background-image: url("~@/assets/wariostanding.gif"); background-image: url("~@/assets/dog2.gif");
background-position-x: 0; background-position-x: 0;
-webkit-transform: scaleX(-1);
background-size: contain; background-size: contain;
background-repeat: no-repeat; background-repeat: no-repeat;
height: 138px; height: 138px;
@ -1027,9 +1027,9 @@ main.landing .wario_seq .grassfill .author {
background-size: contain; background-size: contain;
background-repeat: no-repeat; background-repeat: no-repeat;
width: 164px; width: 164px;
height: 50px; height: 35px;
position: absolute; position: absolute;
left: 80px; left: 130px;
top: 4px; top: 4px;
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 18 KiB

@ -65,6 +65,7 @@
<li>kloinka</li> <li>kloinka</li>
<li>ilovetron</li> <li>ilovetron</li>
<li>\x</li> <li>\x</li>
<li>mj <small>(Resident artist)</small></li>
</ul> </ul>
</div> </div>
</div> </div>
@ -102,7 +103,7 @@
} }
}, },
mounted() { mounted() {
jQuery('main.credits .perlsux').click((event) => { jQuery('main.credits .hypnotoad').click((event) => {
this.back(); this.back();
}); });
}, },

@ -51,7 +51,7 @@
} }
}, },
mounted() { mounted() {
jQuery('main.credits .perlsux').click((event) => { jQuery('main.credits .hypnotoad').click((event) => {
this.back(); this.back();
}); });
jQuery('#password').focus(); jQuery('#password').focus();

@ -4,33 +4,25 @@
<div class="col-sm-7"> <div class="col-sm-7">
<img id="logo" src="~@/assets/wownero-light-intro.png" alt="electron-vue"> <img id="logo" src="~@/assets/wownero-light-intro.png" alt="electron-vue">
<p>Welcome to wownero light!</p>
<ul style="margin-bottom: 22px">
<li>Electron/Vue.js <small>(OSX/Windows/Linux)</small></li>
<li>Works most of the time</li>
</ul>
<button id="create_wallet_btn" v-on:click="createWallet" type="button" class="btn btn-success btn-sm"> <button id="create_wallet_btn" v-on:click="createWallet" type="button" class="btn btn-success btn-sm">
<i class="fa fa-plus" id="create_wallet_icon" aria-hidden="true"></i> <i class="fa fa-plus" id="create_wallet_icon" aria-hidden="true"></i>
Create wallet Create wallet
</button> </button>
<div class="dropdown" style="display: inline-block;"> <button id="create_wallet_btn" v-on:click="openWallet" type="button" class="btn btn-success btn-sm">
<button class="btn btn-success btn-sm dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <i class="fa fa-plus" id="create_wallet_icon" aria-hidden="true"></i>
<i class="fa fa-folder-open" aria-hidden="true"></i> Open wallet
Open wallet </button>
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<a v-on:click="openWallet" class="dropdown-item" href="#">Browse</a>
<a v-on:click="openLastWallet" v-if="cfg_wallet_path !== ''" class="dropdown-item" href="#">{{cfg_wallet_path_name}}</a>
</div>
</div>
<button id="" v-on:click="settings" type="button" class="btn btn-success btn-sm"> <button id="" v-on:click="settings" type="button" class="btn btn-success btn-sm">
<!-- fa fa-refresh fa-spin --> <!-- fa fa-refresh fa-spin -->
<i class="fa fa-cog" aria-hidden="true"></i> <i class="fa fa-cog" aria-hidden="true"></i>
Settings Settings
</button> </button>
<button type="button" class="btn btn-success btn-sm">
Does nothing
</button>
</div> </div>
<div class="col-sm-5"> <div class="col-sm-5">
@ -47,13 +39,6 @@
</div> </div>
</div> </div>
</div> </div>
<div class="card my-4 wfs-explorer" style="margin-top: 0 !important;">
<h5 class="card-header">Funding required</h5>
<div class="card-body">
<wfs-explorer></wfs-explorer>
</div>
</div>
</div> </div>
</div> </div>
@ -118,34 +103,37 @@
} }
}); });
}, },
openLastWallet(){ openLastWallet(event){
if(!this.cfg_wallet_path || this.cfg_wallet_path === ''){ const selectedWallet = this.cfg_wallets.find(i => i.name === event.currentTarget.text);
alert('Invalid wallet path?!'); this.$store.commit('addWalletPath', selectedWallet.path);
return;
}
this.$store.commit('addWalletPath', this.cfg_wallet_path);
this.$store.commit('showPassword', { this.$store.commit('showPassword', {
'message': 'Enter wallet password' 'message': 'Enter wallet password'
}); });
setTimeout(() => {
jQuery('#password').focus();
}, 50);
} }
}, },
mounted() { mounted() {
let select_node = jQuery('#selectnode'); let select_node = jQuery('#selectnode');
const axios = require('axios'); const axios = require('axios');
axios.get('https://funding.wownero.com/api/1/convert/wow-usd?amount=1000').then(response => { axios.get('https://tradeogre.com/api/v1/ticker/btc-wow').then(response => {
this.$store.commit('addRate', response.data.usd); this.$store.commit('addRate', response.data.ask);
});
axios.get('https://tradeogre.com/api/v1/ticker/btc-xmr').then(response => {
this.$store.commit('addRateXMR', response.data.ask);
}); });
let appVersion = require('electron').remote.app.getVersion(); axios.get(`https://funding.wownero.com/api/1/wowlite?version=0.1.4`).then(response => {
axios.get(`https://funding.wownero.com/api/1/wowlight?version=${appVersion}`).then(response => {
if(response.data.data === false) { if(response.data.data === false) {
const {dialog} = require('electron').remote const {dialog} = require('electron').remote
const dialogOptions = { const dialogOptions = {
type: 'error', type: 'error',
title: 'Outdated client', title: 'Outdated client',
buttons: ['OK'], buttons: ['OK'],
message: `You are running an old instance of wowlight and need to upgrade!\n\nVisit https://light.wownero.com for a shiny new version.` message: `You are running an old instance of wowlite and need to upgrade!\n\nVisit https://light.wownero.com for a shiny new version.`
} }
dialog.showMessageBox(dialogOptions, i => {}); dialog.showMessageBox(dialogOptions, i => {});
} }
@ -188,12 +176,11 @@
selected_node(){ selected_node(){
return this.$store.getters.cfg.node; return this.$store.getters.cfg.node;
}, },
cfg_wallet_path(){ cfg_wallets(){
return this.$store.getters.cfg.wallet_path; return this.$store.getters.cfg.wallets;
}, },
cfg_wallet_path_name(){ cfg_wallet_names(){
let path = require("path"); return this.$store.getters.cfg.wallets.map(i => i.name);
return path.basename(this.cfg_wallet_path);
} }
} }
} }

@ -69,7 +69,7 @@
pathConfig() { pathConfig() {
const path = require('path'); const path = require('path');
return path.join(this.$store.state.wallet_dir, 'wowlight.json'); return path.join(this.$store.state.wallet_dir, 'wowlite.json');
} }
} }
} }

@ -10,14 +10,14 @@
<div class="coin" style="height: 24px;width: 24px;top:54px;right:32px;"></div> <div class="coin" style="height: 24px;width: 24px;top:54px;right:32px;"></div>
</div> </div>
<div class="perlsux"></div> <div class="hypnotoad"></div>
<div class="grass_container"> <div class="grass_container">
<div class="grass"></div> <div class="grass"></div>
<div class="grassfill"> <div class="grassfill">
<span class="version"> <span class="version">
{{version}} - <span style="font-size:12px;">{{version_embedded}}</span> 0.1.4 - <span style="font-size:12px;">{{version_embedded}}</span>
</span> </span>
<a class="credits" href="#" v-on:click="openCredits"> <a class="credits" href="#" v-on:click="openCredits">
Credits Credits
@ -46,7 +46,7 @@
function wario_animate(){ function wario_animate(){
wario.animate({ wario.animate({
left: `${window_width}px` left: `${window_width}px`
}, 8000, 'linear', () => { }, 8500, 'linear', () => {
wario.css('left', '-400px'); wario.css('left', '-400px');
wario_animate(); wario_animate();
}); });

@ -10,7 +10,7 @@
<div class="coin" style="height: 24px;width: 24px;top:54px;right:32px;"></div> <div class="coin" style="height: 24px;width: 24px;top:54px;right:32px;"></div>
</div> </div>
<div class="perlsux"></div> <div class="hypnotoad"></div>
<div class="grass_container"> <div class="grass_container">
<div class="grass"></div> <div class="grass"></div>
@ -34,7 +34,7 @@
} }
}, },
mounted() { mounted() {
jQuery('main.credits .perlsux').click((event) => { jQuery('main.credits .hypnotoad').click((event) => {
this.back(); this.back();
}); });
}, },

@ -26,22 +26,21 @@
wallet() { wallet() {
return this.$store.getters.wallet; return this.$store.getters.wallet;
}, },
usd(){ btc(){
return (this.$store.getters.usd_rate / 1000) * this.$store.getters.wallet.balance; return (this.$store.getters.btc_rate) * this.$store.getters.wallet.balance;
}, },
bubble_img() { bubble_img() {
let rate = this.$store.getters.usd_rate; let bal = this.$store.getters.wallet.balance;
let usd = (rate / 1000) * this.$store.getters.wallet.balance;
if(usd < 1){ if(bal < 1){
return this.path_bubble(0); return this.path_bubble(0);
} else if(usd < 100){ } else if(bal < 100){
return this.path_bubble(1); return this.path_bubble(1);
} else if(usd < 500){ } else if(bal < 1000){
return this.path_bubble(2); return this.path_bubble(2);
} else if(usd < 1000){ } else if(bal < 2000){
return this.path_bubble(3); return this.path_bubble(3);
} else if(usd < 1000){ } else if(bal > 2000){
return this.path_bubble(4); return this.path_bubble(4);
} }
} }

@ -6,23 +6,23 @@
</div> </div>
<div v-if="usd < 1"> <div v-if="btc < 1">
<div class="bubble" :style="`background-image: url(${this.path_bubble(0)})`"></div> <div class="bubble" :style="`background-image: url(${this.path_bubble(0)})`"></div>
</div> </div>
<div v-else-if="usd < 100"> <div v-else-if="btc < 100">
<div class="bubble" :style="`background-image: url(${this.path_bubble(1)})`"></div> <div class="bubble" :style="`background-image: url(${this.path_bubble(1)})`"></div>
</div> </div>
<div v-else-if="usd < 500"> <div v-else-if="btc < 500">
<div class="bubble" :style="`background-image: url(${this.path_bubble(2)})`"></div> <div class="bubble" :style="`background-image: url(${this.path_bubble(2)})`"></div>
</div> </div>
<div v-else-if="usd < 1500"> <div v-else-if="btc < 1500">
<div class="bubble" :style="`background-image: url(${this.path_bubble(3)})`"></div> <div class="bubble" :style="`background-image: url(${this.path_bubble(3)})`"></div>
</div> </div>
<div v-else-if="usd >= 1500"> <div v-else-if="btc >= 1500">
<div class="bubble" :style="`background-image: url(${this.path_bubble(4)})`"></div> <div class="bubble" :style="`background-image: url(${this.path_bubble(4)})`"></div>
</div> </div>
</div> </div>
@ -43,22 +43,21 @@
wallet() { wallet() {
return this.$store.getters.wallet; return this.$store.getters.wallet;
}, },
usd(){ btc(){
return (this.$store.getters.usd_rate / 1000) * this.$store.getters.wallet.balance; return this.$store.getters.btc_rate * this.$store.getters.wallet.balance;
}, },
bubble_img() { bubble_img() {
let rate = this.$store.getters.usd_rate; let bal = this.$store.getters.wallet.balance;
let usd = (rate / 1000) * this.$store.getters.wallet.balance;
if(usd < 1){ if(bal < 1){
return this.path_bubble(0); return this.path_bubble(0);
} else if(usd < 100){ } else if(bal < 100){
return this.path_bubble(1); return this.path_bubble(1);
} else if(usd < 500){ } else if(bal < 1000){
return this.path_bubble(2); return this.path_bubble(2);
} else if(usd < 1000){ } else if(bal < 2000){
return this.path_bubble(3); return this.path_bubble(3);
} else if(usd < 1000){ } else if(bal > 2000){
return this.path_bubble(4); return this.path_bubble(4);
} }
} }

@ -1,7 +1,7 @@
<template> <template>
<nav class="navbar navbar-dark bg-dark fixed-top navbar-expand-md"> <nav class="navbar navbar-dark bg-dark fixed-top navbar-expand-md">
<div class="container nopadding nomargin"> <div class="container nopadding nomargin">
<a class="navbar-brand" href="/"> <a class="navbar-brand" href="#">
<img id="logo" src="~@/assets/wownero.png"> <img id="logo" src="~@/assets/wownero.png">
</a> </a>
@ -10,12 +10,16 @@
Balance: <span>{{wallet.balance}}</span> Balance: <span>{{wallet.balance}}</span>
</span> </span>
| |
<span class="balance_usd"> <span class="balance_btc">
Unlocked: <span>{{wallet.unlocked}}</span> Unlocked: <span>{{wallet.unlocked}}</span>
</span> </span>
| |
<span class="balance_usd"> <span class="balance_btc">
USD: <span>{{Number((usd_rate/1000)*wallet.balance).toFixed(2)}}</span> BTC: <span>{{Number(btc_rate*wallet.balance).toFixed(9)}}</span>
</span>
|
<span class="balance_xmr">
XMR: <span>{{Number(btc_rate*wallet.balance/xmr_rate).toFixed(9)}}</span>
</span> </span>
</div> </div>
@ -45,8 +49,11 @@
wallet() { wallet() {
return this.$store.getters.wallet; return this.$store.getters.wallet;
}, },
usd_rate() { btc_rate() {
return this.$store.getters.usd_rate; return this.$store.getters.btc_rate;
},
xmr_rate() {
return this.$store.getters.xmr_rate;
} }
}, },
methods: { methods: {

@ -12,13 +12,13 @@
<!-- text input --> <!-- text input -->
<div class="form-group"> <div class="form-group">
<label>Destination address</label> <label>Destination address</label>
<textarea placeholder="WO..." rows=1 v-on:input="validate" class="form-control address"></textarea> <textarea placeholder="WO/SO..." rows=1 v-on:input="validate" class="form-control address"></textarea>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-3"> <div class="col-md-3">
<div class="form-group amount"> <div class="form-group amount">
<label>Amount <small class="amount_usd"></small></label> <label>Amount <small class="amount_btc"></small></label>
<input type="text" v-on:input="validate" v-on:keypress="isAmount()" name="amount" class="form-control amount" placeholder="Amount"> <input type="text" v-on:input="validate" v-on:keypress="isAmount()" name="amount" class="form-control amount" placeholder="Amount">
</div> </div>
</div> </div>
@ -74,8 +74,8 @@
wallet() { wallet() {
return this.$store.getters.wallet; return this.$store.getters.wallet;
}, },
usd_rate() { btc_rate() {
return this.$store.getters.usd_rate; return this.$store.getters.btc_rate;
} }
}, },
methods: { methods: {
@ -123,10 +123,10 @@
validate(){ validate(){
this.error = ''; this.error = '';
let form = jQuery('#sendForm'); let form = jQuery('#sendForm');
let regexp_address = /(W[o|W][a-zA-Z0-9]{95})/g; let regexp_address = /([S|W][o|W][a-zA-Z0-9]{95})|(So[a-zA-Z0-9]{106})/g;
let address = form.find('textarea.address').val().trim(); let address = form.find('textarea.address').val().trim();
let amount = form.find('input.amount').val().trim(); let amount = form.find('input.amount').val().trim();
let usd = jQuery('form#sendForm .amount label small'); let btc = jQuery('form#sendForm .amount label small');
let invalid = function(msg){ let invalid = function(msg){
jQuery('button.send_btn').addClass('disabled'); jQuery('button.send_btn').addClass('disabled');
@ -134,23 +134,23 @@
if(amount.startsWith('.') || amount.endsWith('.')) { if(amount.startsWith('.') || amount.endsWith('.')) {
this.error = 'Invalid WOW amount' this.error = 'Invalid WOW amount'
usd.html(''); btc.html('');
return invalid(); return invalid();
} }
if((amount.split('.').length - 1) > 1){ if((amount.split('.').length - 1) > 1){
this.error = 'Invalid WOW amount'; this.error = 'Invalid WOW amount';
usd.html(''); btc.html('');
return invalid(); return invalid();
} }
if((amount == 0)){ if((amount === 0)){
//this.error = 'Invalid WOW amount'; //this.error = 'Invalid WOW amount';
usd.html(''); btc.html('');
return invalid(); return invalid();
} }
usd.html(`(${Number((this.usd_rate/1000)*amount).toFixed(2)} USD)`); btc.html(`(${Number(this.btc_rate*amount).toFixed(9)} BTC)`);
let addy_match = address.match(regexp_address); let addy_match = address.match(regexp_address);
if(!addy_match){ if(!addy_match){
@ -179,6 +179,12 @@
this.$electron.ipcRenderer.on('rpc_monies_sent_error', (event, data) => { this.$electron.ipcRenderer.on('rpc_monies_sent_error', (event, data) => {
this.error = data.message; this.error = data.message;
}); });
this.$electron.ipcRenderer.on('rpc_monies_sent', () => {
const form = jQuery('#sendForm');
form.find('textarea.address').val('');
form.find('input.amount').val('');
});
} }
} }
</script> </script>

@ -34,7 +34,7 @@
{{tx.in === 'in' ? '+' : '-'}}{{tx.amount}} {{tx.in === 'in' ? '+' : '-'}}{{tx.amount}}
<small style="color: black"> <small style="color: black">
$ {{Number((usd_rate/1000)*tx.amount).toFixed(2)}} $ {{Number(btc_rate*tx.amount).toFixed(9)}}
</small> </small>
</span> </span>
</span> </span>
@ -55,8 +55,8 @@
export default { export default {
name: "TxHistoryList", name: "TxHistoryList",
computed: { computed: {
usd_rate() { btc_rate() {
return this.$store.getters.usd_rate; return this.$store.getters.btc_rate;
}, },
wallet() { wallet() {
return this.$store.getters.wallet; return this.$store.getters.wallet;

@ -67,12 +67,20 @@
this.create_wallet(wallet_name, wallet_pass); this.create_wallet(wallet_name, wallet_pass);
} }
}, },
wallet_exists (name) {
return !!this.wallets.find(i => i.name === name);
},
create_wallet (name, password) { create_wallet (name, password) {
this.clearMatrixMsg(); if (this.wallet_exists(name)) {
this.showMatrixMsg('GENERATING NEW WALLET') console.log('Wallet exists!')
// @TODO check if wallet with same name exists no matter the path
} else {
this.clearMatrixMsg();
this.showMatrixMsg('GENERATING NEW WALLET');
this.$store.commit('appState', "create_wallet"); this.$store.commit('appState', "create_wallet");
ipcRenderer.send('rpc_create_wallet', {name: name, password: password}) ipcRenderer.send('rpc_create_wallet', {name: name, password: password})
}
}, },
showMatrixMsg(msg){ showMatrixMsg(msg){
let obj = jQuery('.teh_matrix span.centered'); let obj = jQuery('.teh_matrix span.centered');
@ -179,6 +187,9 @@
}, },
walletCreating(){ walletCreating(){
return this.$store.state.wallet_creating; return this.$store.state.wallet_creating;
},
wallets() {
return this.$store.getters.cfg.wallets;
} }
} }
} }

@ -10,7 +10,7 @@ const EventBus = new Vue();
export default EventBus; export default EventBus;
import { shell } from 'electron' import { shell } from 'electron'
window.jQuery = window.$ = require('jquery');
/* eslint-disable no-new */ /* eslint-disable no-new */
let app = new Vue({ let app = new Vue({

@ -11,7 +11,7 @@ export default new Vuex.Store({
cfg: { cfg: {
"node": "", "node": "",
"nodes": [], "nodes": [],
"wallet_path": "" "wallets": []
}, },
created_wallet: {}, // only used when creating wallets created_wallet: {}, // only used when creating wallets
appState: "", // not really used appState: "", // not really used
@ -23,14 +23,14 @@ export default new Vuex.Store({
password_box: { password_box: {
'message': '' 'message': ''
}, },
usd_rate: 0, // per 1000 WOW btc_rate: 0, // per 1000 WOW
wallet: { wallet: {
'path': '', 'path': '',
'txs': [], 'txs': [],
'balance': 0, 'balance': 0,
'unlocked': 0, 'unlocked': 0,
'address': '', 'address': '',
'usd': 0, 'btc': 0,
'state': -1 'state': -1
}, // wallet opened }, // wallet opened
wallet_path: '', wallet_path: '',
@ -69,12 +69,19 @@ export default new Vuex.Store({
if(data.hasOwnProperty('wallet_path')){ if(data.hasOwnProperty('wallet_path')){
cfg.wallet_path = data.wallet_path; cfg.wallet_path = data.wallet_path;
} }
if(data.hasOwnProperty('wallets')){
cfg.wallets = data.wallets;
}
}, },
appState(state, data){ appState(state, data){
state.appState = data; state.appState = data;
}, },
addRate(state, data){ addRate(state, data){
state.usd_rate = data; state.btc_rate = data;
},
addRateXMR(state, data){
state.xmr_rate = data;
}, },
showError(state, data){ showError(state, data){
state.error = data; state.error = data;
@ -132,7 +139,8 @@ export default new Vuex.Store({
wallet: state => state.wallet, wallet: state => state.wallet,
wallet_path: state => state.wallet_path, wallet_path: state => state.wallet_path,
wallet_password: state => state.wallet_password, wallet_password: state => state.wallet_password,
usd_rate: state => state.usd_rate, btc_rate: state => state.btc_rate,
xmr_rate: state => state.xmr_rate,
message_box: state => state.message_box, message_box: state => state.message_box,
password_box: state => state.password_box, password_box: state => state.password_box,
height_from: state => state.height_from, height_from: state => state.height_from,