Merge branch 'development' into hardware-wallet

This commit is contained in:
Sean 2022-07-14 11:53:14 +10:00 committed by GitHub
commit d33ccfe0cd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 24547 additions and 2787 deletions

105
.drone.jsonnet Normal file
View File

@ -0,0 +1,105 @@
local docker_image = 'registry.oxen.rocks/lokinet-ci-nodejs';
local apt_get_quiet = 'apt-get -o=Dpkg::Use-Pty=0 -q';
[
{
kind: 'pipeline',
type: 'docker',
name: 'Linux (amd64)',
platform: { arch: 'amd64' },
steps: [
{
name: 'build',
image: docker_image,
environment: {
SSH_KEY: { from_secret: 'SSH_KEY' },
NODE_OPTIONS: '--openssl-legacy-provider',
},
commands: [
'echo "Building on ${DRONE_STAGE_MACHINE}"',
'echo "man-db man-db/auto-update boolean false" | debconf-set-selections',
apt_get_quiet + ' update',
apt_get_quiet + ' install -y eatmydata',
'eatmydata ' + apt_get_quiet + ' dist-upgrade -y',
'./tools/download-oxen-files.sh https://oxen.rocks/oxen-io/oxen-core/oxen-stable-linux-LATEST.tar.xz',
'npm --version',
'node --version',
'mkdir -p $CCACHE_DIR/electron-builder',
'mkdir -p $CCACHE_DIR/npm',
'npm ci --cache $CCACHE_DIR/npm',
'ELECTRON_BUILDER_CACHE=$CCACHE_DIR/electron-builder npm --cache $CCACHE_DIR/npm run build',
'./tools/ci-drone-static-upload.sh',
],
},
],
},
{
kind: 'pipeline',
type: 'docker',
name: 'Windows (x64)',
platform: { arch: 'amd64' },
steps: [
{
name: 'build',
image: docker_image,
environment: {
SSH_KEY: { from_secret: 'SSH_KEY' },
WINEDEBUG: '-all',
NODE_OPTIONS: '--openssl-legacy-provider',
},
commands: [
'echo "Building on ${DRONE_STAGE_MACHINE}"',
'echo "man-db man-db/auto-update boolean false" | debconf-set-selections',
apt_get_quiet + ' update',
apt_get_quiet + ' install -y eatmydata zip',
'eatmydata ' + apt_get_quiet + ' dist-upgrade -y',
'./tools/download-oxen-files.sh https://oxen.rocks/oxen-io/oxen-core/oxen-stable-win-LATEST.zip',
'wine bin/oxend.exe --version',
'wine bin/oxen-wallet-rpc.exe --version',
'npm --version',
'node --version',
'mkdir -p $CCACHE_DIR/electron-builder',
'mkdir -p $CCACHE_DIR/npm',
'npm ci --cache $CCACHE_DIR/npm',
'ELECTRON_BUILDER_CACHE=$CCACHE_DIR/electron-builder npm --cache $CCACHE_DIR/npm run windows',
'./tools/ci-drone-static-upload.sh',
],
},
],
},
{
kind: 'pipeline',
type: 'exec',
name: 'MacOS (unsigned)',
platform: { os: 'darwin', arch: 'amd64' },
steps: [
{
name: 'build',
environment: {
SSH_KEY: { from_secret: 'SSH_KEY' },
CSC_LINK: 'tools/macos-codesign-cert.p12',
CSC_KEY_PASSWORD: { from_secret: 'CSC_KEY_PASSWORD' },
SIGNING_APPLE_ID: { from_secret: 'SIGNING_APPLE_ID' },
SIGNING_APP_PASSWORD: { from_secret: 'SIGNING_APP_PASSWORD' },
SIGNING_TEAM_ID: 'SUQ8J2PCT7',
},
commands: [
'echo "Building on ${DRONE_STAGE_MACHINE}"',
'./tools/download-oxen-files.sh https://oxen.rocks/oxen-io/oxen-core/oxen-stable-macos-LATEST.tar.xz',
'if [ -z "$${SIGNING_APPLE_ID}" ]; then export CSC_IDENTITY_AUTO_DISCOVERY=false; fi',
'npm --version',
'node --version',
'mkdir -p $CCACHE_DIR/electron-builder',
'mkdir -p $CCACHE_DIR/npm',
'npm ci --cache $CCACHE_DIR/npm',
'ELECTRON_BUILDER_CACHE=$CCACHE_DIR/electron-builder WINEDEBUG=-all npm --cache $CCACHE_DIR/npm run build',
'./tools/ci-drone-static-upload.sh',
],
},
],
},
]

View File

@ -1,89 +0,0 @@
name: Oxen Electron Wallet Build
on:
push:
branches:
- master
- development
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, macos-latest, ubuntu-latest]
steps:
- name: Checkout git repo
uses: actions/checkout@v1
# Read node version from `.nvmrc` file
- name: Read nvm rc
id: nvmrc
uses: browniebroke/read-nvmrc-action@v1
- name: Install node
uses: actions/setup-node@v1
with:
node-version: ${{ steps.nvmrc.outputs.node_version }}
- name: Install dependencies
run: npm install
- name: Download oxend binaries
run: ./download-release-bins.sh
env:
OS: ${{ runner.os }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
shell: bash
working-directory: ./downloads
- name: Extract zip binaries
if: runner.os == 'Windows'
run: unzip latest
shell: bash
working-directory: ./downloads
- name: Extract xz binaries
if: runner.os != 'Windows'
run: tar -xf latest
shell: bash
working-directory: ./downloads
- name: Move oxend binaries
run: |
find ./downloads -type f -name "oxend*" -exec cp '{}' ./bin \;
find ./downloads -type f -name "oxen-wallet-rpc*" -exec cp '{}' ./bin \;
shell: bash
- name: Verify binaries
run: ls ./bin
shell: bash
- name: Build window and linux binaries
if: runner.os != 'macOS'
run: npm run build
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build mac binaries
if: runner.os == 'macOS'
run: npm run build
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CSC_LINK: ${{ secrets.MAC_CERTIFICATE }}
CSC_KEY_PASSWORD: ${{ secrets.MAC_CERTIFICATE_PASSWORD }}
SIGNING_APPLE_ID: ${{ secrets.SIGNING_APPLE_ID }}
SIGNING_APP_PASSWORD: ${{ secrets.SIGNING_APP_PASSWORD }}
SIGNING_TEAM_ID: ${{ secrets.SIGNING_TEAM_ID }}
- name: Remove un-needed artifacts
run: rm -r -- ./*/
shell: bash
working-directory: ./dist/electron/Packaged
- name: Upload artifacts
uses: actions/upload-artifact@v1
with:
name: ${{ runner.OS }}
path: dist/electron/Packaged

View File

@ -1,87 +0,0 @@
name: Oxen Electron Wallet With Dev Binaries
on:
push:
branches:
- dev-bins
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, macos-latest, ubuntu-latest]
steps:
- name: Checkout git repo
uses: actions/checkout@v1
# Read node version from `.nvmrc` file
- name: Read nvm rc
id: nvmrc
uses: browniebroke/read-nvmrc-action@v1
- name: Install node
uses: actions/setup-node@v1
with:
node-version: ${{ steps.nvmrc.outputs.node_version }}
- name: Install dependencies
run: npm install
- name: Download oxend binaries
run: ./download-dev-bins.sh
env:
OS: ${{ runner.os }}
shell: bash
working-directory: ./downloads
- name: Extract zip binaries
if: runner.os == 'Windows'
run: unzip latest
shell: bash
working-directory: ./downloads
- name: Extract xz binaries
if: runner.os != 'Windows'
run: tar -xf latest
shell: bash
working-directory: ./downloads
- name: Move oxend binaries
run: |
find ./downloads -type f -name "oxend*" -exec cp '{}' ./bin \;
find ./downloads -type f -name "oxen-wallet-rpc*" -exec cp '{}' ./bin \;
shell: bash
- name: Verify binaries
run: ls ./bin
shell: bash
- name: Build window and linux binaries
if: runner.os != 'macOS'
run: npm run build
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build mac binaries
if: runner.os == 'macOS'
run: npm run build
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CSC_LINK: ${{ secrets.MAC_CERTIFICATE }}
CSC_KEY_PASSWORD: ${{ secrets.MAC_CERTIFICATE_PASSWORD }}
SIGNING_APPLE_ID: ${{ secrets.SIGNING_APPLE_ID }}
SIGNING_APP_PASSWORD: ${{ secrets.SIGNING_APP_PASSWORD }}
SIGNING_TEAM_ID: ${{ secrets.SIGNING_TEAM_ID }}
- name: Remove un-needed artifacts
run: rm -r -- ./*/
shell: bash
working-directory: ./dist/electron/Packaged
- name: Upload artifacts
uses: actions/upload-artifact@v1
with:
name: ${{ runner.OS }}
path: dist/electron/Packaged

View File

@ -1,77 +0,0 @@
name: Oxen Electron Wallet Release
on:
push:
branches:
- master
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, macos-latest, ubuntu-latest]
steps:
- name: Checkout git repo
uses: actions/checkout@v1
# Read node version from `.nvmrc` file
- name: Read nvm rc
id: nvmrc
uses: browniebroke/read-nvmrc-action@v1
- name: Install node
uses: actions/setup-node@v1
with:
node-version: ${{ steps.nvmrc.outputs.node_version }}
- name: Install dependencies
run: npm install
- name: Download oxend binaries
run: ./download-release-bins.sh
env:
OS: ${{ runner.os }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
shell: bash
working-directory: ./downloads
- name: Extract zip binaries
if: runner.os == 'Windows'
run: unzip latest
shell: bash
working-directory: ./downloads
- name: Extract xz binaries
if: runner.os != 'Windows'
run: tar -xf latest
shell: bash
working-directory: ./downloads
- name: Move oxend binaries
run: |
find ./downloads -type f -name "oxend*" -exec cp '{}' ./bin \;
find ./downloads -type f -name "oxen-wallet-rpc*" -exec cp '{}' ./bin \;
shell: bash
- name: Verify binaries
run: ls ./bin
shell: bash
- name: Publish window and linux binaries
if: runner.os != 'macOS'
run: npm run release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Publish mac binaries
if: runner.os == 'macOS'
run: npm run release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CSC_LINK: ${{ secrets.MAC_CERTIFICATE }}
CSC_KEY_PASSWORD: ${{ secrets.MAC_CERTIFICATE_PASSWORD }}
SIGNING_APPLE_ID: ${{ secrets.SIGNING_APPLE_ID }}
SIGNING_APP_PASSWORD: ${{ secrets.SIGNING_APP_PASSWORD }}
SIGNING_TEAM_ID: ${{ secrets.SIGNING_TEAM_ID }}

View File

@ -1,42 +1,43 @@
# Building
Building oxen electron wallet binaries is done using github actions. Windows and linux binaries will build right out of the box but there are some extra steps needed for Mac OS
Set up the supported versions of npm/node/etc.:
## Mac OS
nvm use
The build script for Mac OS requires you to have a valid `Developer ID Application` certificate. Without this the build script cannot sign and notarize the mac binary which is needed for Catalina 10.15 and above.
If you would like to disable this then comment out `"afterSign": "build/notarize.js",` in package.json.
## Linux, Windows
You will also need an [App-specific password](https://support.apple.com/en-al/HT204397) for the apple account you wish to notarize with
npm run build
### Setup
## MacOS
Once you have your `Developer ID Application` you need to export it into a `.p12` file. Keep a note of the password used to encrypt this file as it will be needed later.
If you don't care about signing (i.e. you are not going to distribute) then you should be able to
simply `npm run build`.
We need to Base64 encode this file, so run the following command:
When you want to distribute the app, however, you need to do a bunch of crap to satisfy Apple's
arbitrary security theatre Rube Goldberg machine that purports to keep users safe but in reality is
designed to further Apple lock-in control of the Apple ecosystem.
```
base64 -i certificate.p12 -o encoded.txt
```
1. You have to pay Apple money (every year) to get a developer account.
2. You need a `Developer ID Application` certificate, created and signed from the Apple, and loaded
into your system keychain. `security find-identity -v` should show it.
3. You need to create an [App-specific password](https://support.apple.com/en-al/HT204397) for the
Apple developer account under which you are notarizing.
4. In the project root, create a `.env` file with contents:
#### On GitHub:
SIGNING_APPLE_ID=your-developer-id@example.com
SIGNING_APP_PASSWORD=app-specific-password
1. Navigate to the main page of the repository.
2. Under your repository name, click **Settings**.
3. In the left sidebar, click **Secrets**.
4. Add the following secrets:
1. Certificate
- Name: `MAC_CERTIFICATE`
- Value: The encoded Base64 certificate
2. Certificate password
- Name: `MAC_CERTIFICATE_PASSWORD`
- Value: The password that was set when the certificate was exported.
3. Apple ID
- Name: `SIGNING_APPLE_ID`
- Value: The apple id (email) to use for signing
4. Apple Password
- Name: `SIGNING_APP_PASSWORD`
- Value: The app-specific password that was generated for the apple id
5. Team ID (Optional)
- Name: `SIGNING_TEAM_ID`
- Value: The apple team id if you're sigining the application for a team
This password can be plaintext if absolutely needed (e.g. in a CI job) but should be a [keychain
reference](https://github.com/electron/electron-notarize#safety-when-using-appleidpassword) such
as `@keychain:some-token` for better security where feasible.
- If you have multiple ids and need to use a particular signing team ID you can add:
SIGNING_TEAM_ID=TEAMIDXYZ1
5. If building from a remote connection (e.g. ssh'd into a mac) then unlock the keychain for that
session by running `security unlock`.
With all of that set up, your `npm run build` should produce a signed and notarized installer.
Hopefully. Maybe. Sometimes Apple's servers are broken and you might have to try again. But don't
worry, Apple's incompetence around signing makes everything more secure because... reasons.

View File

@ -36,11 +36,11 @@ exports.default = async function notarizing(context) {
}
const options = {
appBundleId: "com.oxen.electron-wallet",
tool: "notarytool",
appPath: `${appOutDir}/${appName}.app`,
appleId: SIGNING_APPLE_ID,
appleIdPassword: SIGNING_APP_PASSWORD
};
if (!isEmpty(SIGNING_TEAM_ID)) options.ascProvider = SIGNING_TEAM_ID;
if (!isEmpty(SIGNING_TEAM_ID)) options.teamId = SIGNING_TEAM_ID;
return notarize(options);
};

View File

@ -1,32 +0,0 @@
#!/bin/bash
set -e
if [ -z "$OS" ]; then
echo "OS must be set"
exit 1
fi
if [ -z "$RENAME" ]; then
RENAME="latest"
fi
if [ "$OS" == "Linux" ]; then
ASSET_URL="https://oxen.rocks/oxen-io/oxen-core/oxen-dev-linux-LATEST.tar.xz"
elif [ "$OS" == "Windows" ]; then
ASSET_URL="https://oxen.rocks/oxen-io/oxen-core/oxen-dev-win-LATEST.zip"
elif [ "$OS" == "macOS" ]; then
ASSET_URL="https://oxen.rocks/oxen-io/oxen-core/oxen-dev-macos-LATEST.tar.xz"
else
echo "OS must be Linux, Windows or macOS"
exit 1
fi
echo "About to download the binaries"
curl -sL --fail \
-H "Accept: application/octet-stream" \
-o "${RENAME}" \
"$ASSET_URL"
echo "Oxen binaries downloaded"

View File

@ -1,40 +0,0 @@
#!/bin/bash
# Source from: https://github.com/houqp/download-release-assets-action
set -e
if [ -z "$OS" ]; then
echo "OS must be set"
exit 1
fi
if [ -z "$RENAME" ]; then
RENAME="latest"
fi
REPO="oxen-io/oxen-core"
RELEASE="latest"
if [ "$OS" == "Linux" ]; then
FILE_NAME_REGEX="linux"
elif [ "$OS" == "Windows" ]; then
FILE_NAME_REGEX="win"
elif [ "$OS" == "macOS" ]; then
FILE_NAME_REGEX="macos"
else
echo "OS must be Linux, Windows or macOS"
exit 1
fi
ASSET_URL=$(curl -sL --fail \
-H "Accept: application/vnd.github.v3+json" \
-H "Authorization: Bearer ${GITHUB_TOKEN}" \
"https://api.github.com/repos/${REPO}/releases/${RELEASE}" \
| jq -r ".assets | .[] | select(.name | test(\"${FILE_NAME_REGEX}\")) | .url")
curl -sL --fail \
-H "Accept: application/octet-stream" \
-H "Authorization: Bearer ${GITHUB_TOKEN}" \
-o "${RENAME}" \
"$ASSET_URL"

26544
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "oxen-electron-wallet",
"version": "1.6.0",
"version": "1.7.2",
"description": "Modern GUI interface for Oxen Currency",
"productName": "Oxen Electron Wallet",
"repository": {
@ -16,7 +16,7 @@
"scripts": {
"dev": "quasar dev -m electron",
"build": "quasar build -m electron --publish=never",
"release": "quasar build -m electron --publish=always",
"windows": "quasar build -m electron --publish=never -T win",
"lint": "eslint --fix .",
"format": "prettier --write \"**/*.+(js|jsx|json|yml|yaml|css|md|vue)\"",
"ready": "npm run lint && npm run format"
@ -48,7 +48,7 @@
"devtron": "^1.4.0",
"dotenv": "^8.1.0",
"electron": "^4.1.1",
"electron-builder": "^22.4.1",
"electron-builder": "^23.0.3",
"electron-debug": "^2.1.0",
"electron-devtools-installer": "^2.2.4",
"electron-notarize": "^0.1.1",
@ -63,7 +63,6 @@
"eslint-plugin-vue": "^5.2.3",
"husky": "^4.2.3",
"lint-staged": "^10.0.8",
"node-sass": "^4.13.1",
"prettier": "^1.19.1",
"sass-loader": "^7.1.0",
"strip-ansi": "^3.0.1"

View File

@ -158,16 +158,31 @@ module.exports = function() {
appId: "com.oxen.electron-wallet",
productName: "Oxen Electron Wallet",
copyright: "Copyright © 2018-2021 Oxen, 2018 Ryo Currency Project",
copyright: "Copyright © 2018-2022 Oxen, 2018 Ryo Currency Project",
afterSign: "build/notarize.js",
artifactName: "oxen-electron-wallet-${version}-${os}.${ext}",
publish: "github",
linux: {
target: ["AppImage", "deb"],
icon: "src-electron/icon.png",
icon: "oxen-electron-wallet.png",
category: "Finance"
},
// see https://www.electron.build/configuration/linux#debian-package-options
deb: {
depends: [
"libgtk-3-0",
"libnotify4",
"libnss3",
"libxss1",
"libxtst6",
"xdg-utils",
"libatspi2.0-0",
"libuuid1",
"libsecret-1-0",
"libappindicator3-1 | libayatana-appindicator3-1"
]
},
mac: {
// We need zip for auto-updating

View File

@ -13,7 +13,7 @@ const path = require("upath");
* The reason we are setting it here is that the path needs to be evaluated at runtime
*/
if (process.env.PROD) {
global.__statics = path.join(__dirname, "statics").replace(/\\/g, "\\\\");
global.__statics = path.join(__dirname, "").replace(/\\/g, "\\\\");
global.__ryo_bin = path.join(__dirname, "..", "bin").replace(/\\/g, "\\\\");
} else {
global.__ryo_bin = path.join(process.cwd(), "bin").replace(/\\/g, "\\\\");

View File

@ -288,7 +288,7 @@ export class Backend {
if (params.type === "tx") {
path = "tx";
} else if (params.type === "service_node") {
path = "service_node";
path = "sn";
}
if (path) {

View File

@ -25,6 +25,8 @@ export class WalletRPC {
password_hash: null,
balance: null,
unlocked_balance: null,
accrued_balance: null,
accrued_balance_next_payout: null,
onsRecords: []
};
this.isRPCSyncing = false;
@ -777,6 +779,8 @@ export class WalletRPC {
address: "",
balance: 0,
unlocked_balance: 0,
accrued_balance: 0,
accrued_balance_next_payout: 0,
height: 0,
view_only: false
},
@ -797,6 +801,9 @@ export class WalletRPC {
} else if (n.method == "getbalance") {
wallet.info.balance = n.result.balance;
wallet.info.unlocked_balance = n.result.unlocked_balance;
wallet.info.accrued_balance = n.result.accrued_balance;
wallet.info.accrued_balance_next_payout =
n.result.accrued_balance_next_payout;
} else if (n.method == "query_key") {
wallet.secret[n.params.key_type] = n.result.key;
if (n.params.key_type == "spend_key") {
@ -972,7 +979,10 @@ export class WalletRPC {
} else if (n.method == "getbalance") {
if (
this.wallet_state.balance == n.result.balance &&
this.wallet_state.unlocked_balance == n.result.unlocked_balance
this.wallet_state.unlocked_balance == n.result.unlocked_balance &&
this.wallet_state.accrued_balance == n.result.accrued_balance &&
this.wallet_state.accrued_balance_next_payout ==
n.result.accrued_balance_next_payout
) {
continue;
}
@ -980,6 +990,10 @@ export class WalletRPC {
this.wallet_state.balance = wallet.info.balance = n.result.balance;
this.wallet_state.unlocked_balance = wallet.info.unlocked_balance =
n.result.unlocked_balance;
this.wallet_state.accrued_balance = wallet.info.accrued_balance =
n.result.accrued_balance;
this.wallet_state.accrued_balance_next_payout = wallet.info.accrued_balance_next_payout =
n.result.accrued_balance_next_payout;
this.sendGateway("set_wallet_data", {
info: wallet.info
});
@ -2162,7 +2176,10 @@ export class WalletRPC {
info: {
address: data[0].result.address,
balance: data[1].result.balance,
unlocked_balance: data[1].result.unlocked_balance
unlocked_balance: data[1].result.unlocked_balance,
accrued_balance: data[1].result.accrued_balance,
accrued_balance_next_payout:
data[1].result.accrued_balance_next_payout
// num_unspent_outputs: data[1].result.num_unspent_outputs
},
address_list: {
@ -2933,6 +2950,8 @@ export class WalletRPC {
password_hash: null,
balance: null,
unlocked_balance: null,
accrued_balance: null,
accrued_balance_next_payout: null,
onsRecords: []
};

View File

@ -0,0 +1,35 @@
<template>
<span> {{ value }} </span>
</template>
<script>
export default {
name: "FormatNextPayout",
props: {
payoutBlock: {
type: Number,
required: true
},
currentBlock: {
type: Number,
required: true
}
},
computed: {
value() {
console.log(this.payoutBlock);
console.log(this.currentBlock);
if (this.payoutBlock == 0) return "";
let blocks = this.payoutBlock - this.currentBlock;
console.log(this.currentBlock);
if (blocks > 720) return (blocks / 720).toFixed(1) + " days";
else if (blocks > 30) return (blocks / 30).toFixed(1) + " hours";
else return blocks * 2 + " minutes";
}
}
};
</script>
<style></style>

View File

@ -32,7 +32,7 @@
<img class="q-mb-md" src="oxen.svg" height="42" />
<p class="q-my-sm">Wallet Version: v{{ version }}</p>
<p class="q-my-sm">Deaemon Version: v{{ daemonVersion }}</p>
<p class="q-my-sm">Daemon Version: v{{ daemonVersion }}</p>
<p class="q-my-sm">Copyright (c) 2018-2021, Oxen</p>
<p class="q-my-sm">Copyright (c) 2018, Ryo Currency Project</p>
<p class="q-my-sm">All rights reserved.</p>

View File

@ -40,7 +40,7 @@ export default {
ons_status: state => state.gateway.ons_status,
unlocked_balance: state => state.gateway.wallet.info.unlocked_balance,
disable_submit_button() {
const minBalance = this.updating ? 0.05 : 8;
const minBalance = this.updating ? 0.05 : 7.1;
return this.unlocked_balance < minBalance * 1e9;
},
submit_label() {

View File

@ -245,7 +245,7 @@ export default {
}),
methods: {
openUserWalletInfo(contributorAddress) {
const url = `https://www.lokisn.com/user/${contributorAddress}`;
const url = `https://www.oxensn.com/user/${contributorAddress}`;
this.$gateway.send("core", "open_url", {
url
});

View File

@ -8,19 +8,46 @@
<div class="row justify-center">
<div class="funds column items-center">
<div class="balance">
<div class="text">
<span>{{ $t("strings.oxenBalance") }}</span>
</div>
<q-btn-toggle
v-model="balancestakeselector"
text-color="white"
toggle-text-color="primary"
flat
:options="[
{
label: $t('strings.oxenBalance'),
value: 'balance'
},
{
label: $t('strings.stake'),
value: 'stake'
}
]"
/>
<div class="value">
<span><FormatOxen :amount="info.balance"/></span>
</div>
</div>
<div class="row unlocked">
<div v-if="balancestakeselector != 'stake'" class="row unlocked">
<span
>{{ $t("strings.oxenUnlockedShort") }}:
<FormatOxen :amount="info.unlocked_balance"
/></span>
</div>
<div v-if="balancestakeselector == 'stake'" class="row unlocked">
<span v-if="info.accrued_balance > 0"
>{{ $t("strings.oxenAccumulatedRewards") }}:
<FormatOxen :amount="info.accrued_balance" />
{{ $t("strings.nextPayout") }}:
<FormatNextPayout
:payout-block="info.accrued_balance_next_payout"
:current-block="info.height"
/>
</span>
<span v-if="info.accrued_balance == 0">
No accumulated rewards from staking
</span>
</div>
</div>
</div>
<div class="wallet-address row justify-center items-center">
@ -34,19 +61,26 @@
<script>
import { mapState } from "vuex";
import FormatOxen from "components/format_oxen";
import FormatNextPayout from "components/format_next_payout";
import WalletSettings from "components/menus/wallet_settings";
import CopyIcon from "components/icons/copy_icon";
export default {
name: "WalletDetails",
components: {
FormatOxen,
FormatNextPayout,
WalletSettings,
CopyIcon
},
computed: mapState({
theme: state => state.gateway.app.config.appearance.theme,
info: state => state.gateway.wallet.info
})
}),
data() {
return {
balancestakeselector: "balance"
};
}
};
</script>

View File

@ -423,8 +423,7 @@ footer,
.header-popover {
background: $primary;
color: white;
background: white;
max-width: 250px !important;
}

View File

@ -20,7 +20,7 @@ export class Gateway extends EventEmitter {
let theme = LocalStorage.has("theme")
? LocalStorage.getItem("theme")
: "dark";
: "light";
this.app.store.commit("gateway/set_app_data", {
config: {
appearance: {

View File

@ -504,6 +504,7 @@ export default {
destinationUnknown: "Destination Unknown",
editAddressBookEntry: "Edit address book entry",
expirationHeight: "Expiration height",
nextPayout: "Next payout",
ons: {
sessionID: "Session ID",
wallet: "Wallet Address",
@ -521,6 +522,7 @@ export default {
oxenBalance: "Balance",
lokinetNameDescription:
"Purchase or update a name on Lokinet. If you purchase a name it may take a minute or two for it to show up in the list. To learn more about lokinet visit: ",
oxenAccumulatedRewards: "Accumulated rewards",
oxenUnlockedBalance: "Unlocked balance",
oxenUnlockedShort: "Unlocked",
me: "Me",
@ -578,6 +580,7 @@ export default {
signAndVerifyDescription:
"Sign data with your primary address's private key or verify a signature against a public address.",
spendKey: "Spend key",
stake: "Staking",
startingDaemon: "Starting daemon",
startingWallet: "Starting wallet",
switchToDateSelect: "Switch to date select",

View File

@ -14,7 +14,7 @@ export default {
return 0;
}
const MAX_NUMBER_OF_CONTRIBUTORS = 4;
const MAX_NUMBER_OF_CONTRIBUTORS = 10;
// If we have a reserved spot then that is our minimum:
let minContributionAtomicUnits = this.getUnfilledReservedContribution(node, myaddr);
// Otherwise we can contribute our fair share of whatever amount is left (i.e. REMAINING/N
@ -22,8 +22,13 @@ export default {
if (minContributionAtomicUnits === 0 && node.contributors.length < MAX_NUMBER_OF_CONTRIBUTORS) {
const openContributionRemaining = this.openForContribution(node);
let contributors_length = 0;
for (const contributor of node.contributors) {
contributors_length = contributors_length + contributor.locked_contributions.length;
}
minContributionAtomicUnits = openContributionRemaining /
(MAX_NUMBER_OF_CONTRIBUTORS - node.contributors.length);
(MAX_NUMBER_OF_CONTRIBUTORS - contributors_length);
}
const minContributionOxen = minContributionAtomicUnits / 1e9;

View File

@ -187,11 +187,9 @@ export default {
},
cancel: {
flat: true,
label: this.$t("dialog.buttons.cancel"),
color: this.theme === "dark" ? "white" : "dark"
label: this.$t("dialog.buttons.cancel")
},
dark: this.theme == "dark",
color: "positive"
color: "primary"
});
passwordPromise
.onOk(() => {

View File

@ -10,6 +10,8 @@ export const resetWalletData = state => {
height: 0,
balance: 0,
unlocked_balance: 0,
accrued_balance: 0,
accrued_balance_next_payout: 0,
view_only: false
},
secret: {

View File

@ -35,6 +35,9 @@ export default {
unlocked_balance: 0,
view_only: false,
hardware_wallet: false
accrued_balance: 0,
accrued_balance_next_payout: 0,
},
secret: {
mnemonic: "",

78
tools/ci-drone-static-upload.sh Executable file
View File

@ -0,0 +1,78 @@
#!/usr/bin/env bash
# Script used with Drone CI to upload build artifacts (because specifying all this in
# .drone.jsonnet is too painful).
set -o errexit
if [ -z "$SSH_KEY" ]; then
echo -e "\n\n\n\e[31;1mUnable to upload artifact: SSH_KEY not set\e[0m"
# Just warn but don't fail, so that this doesn't trigger a build failure for untrusted builds
exit 0
fi
echo "$SSH_KEY" >ssh_key
set -o xtrace # Don't start tracing until *after* we write the ssh key
chmod 600 ssh_key
branch_or_tag=${DRONE_BRANCH:-${DRONE_TAG:-unknown}}
upload_to="oxen.rocks/${DRONE_REPO// /_}/${branch_or_tag// /_}"
MACOS_APP=${MACOS_APP:-"dist/electron/Packaged/mac/Oxen Electron Wallet.app"}
if [ "$(uname -s)" == "Darwin" ]; then
if codesign -v "$MACOS_APP"; then
echo -e "\e[32;1mApp is codesigned!"
else
echo -e "\e[33;1mApp is not codesigned; renaming to -unsigned"
if [ -z "$MAC_BUILD_IS_CODESIGNED" ]; then
for f in dist/electron/Packaged/{oxen-electron-wallet,latest}*-mac*; do
if [[ $f = *\** ]]; then # Unexpanded glob means it didn't match anything
echo "Did not find any files matching $f"
fi
newname="${f/mac/mac-unsigned}"
mv "$f" "$newname"
if [[ "$f" = *.yml ]]; then
sed -ie 's/-mac/-mac-unsigned/' "$newname"
fi
done
fi
fi
fi
puts=
for f in dist/electron/Packaged/{oxen-electron-wallet-*,latest*.yml}; do
if [[ $f = *\** ]]; then # Unexpanded glob means it didn't match anything
echo "Did not find any files matching $f"
ls --color -F -l dist/electron/Packaged
exit 1
fi
puts="$puts
put $f $upload_to"
done
# sftp doesn't have any equivalent to mkdir -p, so we have to split the above up into a chain of
# -mkdir a/, -mkdir a/b/, -mkdir a/b/c/, ... commands. The leading `-` allows the command to fail
# without error.
upload_dirs=(${upload_to//\// })
mkdirs=
dir_tmp=""
for p in "${upload_dirs[@]}"; do
dir_tmp="$dir_tmp$p/"
mkdirs="$mkdirs
-mkdir $dir_tmp"
done
sftp -i ssh_key -b - -o StrictHostKeyChecking=off drone@oxen.rocks <<SFTP
$mkdirs
$puts
SFTP
set +o xtrace
echo -e "\n\n\n\n\e[32;1mUploaded to https://${upload_to}/${filename}\e[0m\n\n\n"

49
tools/download-oxen-files.sh Executable file
View File

@ -0,0 +1,49 @@
#!/bin/bash
if [ "$#" -ne 1 ] || [[ "$1" != http* ]]; then
cat <<EOF >&2
Usage: $0 URL -- download and extract an oxen-core build (typically from https://oxen.rocks)
Some common URLs:
https://oxen.rocks/oxen-io/oxen-core/oxen-stable-linux-LATEST.tar.xz
https://oxen.rocks/oxen-io/oxen-core/oxen-stable-win-LATEST.zip
https://oxen.rocks/oxen-io/oxen-core/oxen-stable-macos-LATEST.tar.xz
https://oxen.rocks/oxen-io/oxen-core/oxen-dev-linux-LATEST.tar.xz
https://oxen.rocks/oxen-io/oxen-core/oxen-dev-win-LATEST.zip
https://oxen.rocks/oxen-io/oxen-core/oxen-dev-macos-LATEST.tar.xz
EOF
exit 1
fi
if ! [ -f tools/download-oxen-files.sh ] || ! [ -d bin ]; then
echo "This script needs to be invoked from the oxen-electron-gui-wallet top-level project directory" >&2
exit 1
fi
tar=tar
if [[ "$($tar --version)" == bsdtar* ]]; then
tar=gtar
if ! command -v $tar; then
echo "GNU tar is required, but your tar is \`bsdtar' and \`gtar' doesn't work." >&2
echo "This is probably a mac; please install gnutar (e.g. via macports or homebrew)" >&2
exit 1
fi
fi
rm -f bin/oxen*
if [[ "$1" = *win*.zip ]]; then
tmpzip=$(mktemp XXXXXXXXXXXX.zip)
curl -sSo $tmpzip "$1"
unzip -p $tmpzip '*/oxend.exe' >bin/oxend.exe
unzip -p $tmpzip '*/oxen-wallet-rpc.exe' >bin/oxen-wallet-rpc.exe
rm -f $tmpzip
echo "Extracted:"
ls -l bin/*.exe
else
curl -sS "$1" | $tar --strip-components=1 -C bin -xJv --no-anchored oxend oxen-wallet-rpc
echo "Checking downloaded versions:"
echo -n "oxend: "; ./bin/oxend --version
echo -n "oxen-wallet-rpc: "; ./bin/oxen-wallet-rpc --version
fi

Binary file not shown.