diff --git a/package.json b/package.json index 3e7bbd79..003c6f50 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "electron-log": "4.4.8" }, "devDependencies": { - "electron": "19.0.14", + "electron": "20.1.0", "electron-builder": "23.3.3", "electron-notarize": "1.2.1", "electron-packager": "16.0.0", @@ -45,4 +45,4 @@ "engines": { "node": ">=14.17.0" } -} +} \ No newline at end of file diff --git a/qortal-ui-core/src/components/sidenav-menu.js b/qortal-ui-core/src/components/sidenav-menu.js index 0d8e207b..77651aa8 100644 --- a/qortal-ui-core/src/components/sidenav-menu.js +++ b/qortal-ui-core/src/components/sidenav-menu.js @@ -9,6 +9,7 @@ import '@vaadin/icons'; import '../functional-components/side-menu.js'; import '../functional-components/side-menu-item.js'; +import './start-minting.js' class SidenavMenu extends connect(store)(LitElement) { static get properties() { @@ -44,13 +45,6 @@ class SidenavMenu extends connect(store)(LitElement) { border-top: 1px solid var(--border); outline: none; } - - .start-minting-wrapper { - position: absolute; - bottom: 130px; - left: 50%; - transform: translateX(calc(-50% - 10px)); - } `, ]; } @@ -59,9 +53,7 @@ class SidenavMenu extends connect(store)(LitElement) { super(); this.urls = []; this.nodeType = ''; - this.theme = localStorage.getItem('qortalTheme') - ? localStorage.getItem('qortalTheme') - : 'light'; + this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'; this.addressInfo = {}; } @@ -225,15 +217,15 @@ class SidenavMenu extends connect(store)(LitElement) { ${this.renderNodeManagement()} +
+ +
`; } } renderNodeManagement() { - const checkNodeManagement = - store.getState().app.nodeConfig.knownNodes[ - store.getState().app.nodeConfig.node - ]; + const checkNodeManagement = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]; if ((checkNodeManagement.enableManagement = true)) { return html` 0) { yield count--; await new Promise((r) => setTimeout(r, 1000)); if (count === 0) { - callback() } } } + class StartMinting extends connect(store)(LitElement) { static get properties() { return { @@ -194,101 +191,86 @@ class StartMinting extends connect(store)(LitElement) { } renderErrorMsg1() { - return html`${translate("startminting.smchange1")}` -} - -renderErrorMsg2() { - return html`${translate("startminting.smchange2")}` -} - -renderErrorMsg3() { - return html`${translate("startminting.smchange3")}` -} - -renderErrorMsg4() { - return html`${translate("startminting.smchange4")}` -} - -async getMintingAcccounts() { - const myNode = - store.getState().app.nodeConfig.knownNodes[ - store.getState().app.nodeConfig.node - ]; - const nodeUrl = - myNode.protocol + '://' + myNode.domain + ':' + myNode.port; - const url = `${nodeUrl}/admin/mintingaccounts`; - try { - const res = await fetch(url); - const mintingAccountData = await res.json(); - - this.mintingAccountData = mintingAccountData; - } catch (error) { - this.errorMsg = this.renderErrorMsg1(); + return html`${translate("startminting.smchange1")}` } -} -async changeStatus(value){ - const myNode = - store.getState().app.nodeConfig.knownNodes[ - store.getState().app.nodeConfig.node - ]; + renderErrorMsg2() { + return html`${translate("startminting.smchange2")}` + } - const nodeUrl = - myNode.protocol + '://' + myNode.domain + ':' + myNode.port; - this.status = value - const publicAddress = - window.parent.reduxStore.getState().app?.selectedAddress - ?.base58PublicKey; - // Check to see if a sponsorship key on a newly-level 1 minter exists. If it does, remove it. - const findMintingAccountFromOtherUser = this.mintingAccountData.find( - (ma) => !ma.publicKey.includes(publicAddress) - ); - const removeMintingAccount = async (publicKey) => { + renderErrorMsg3() { + return html`${translate("startminting.smchange3")}` + } - const url = `${nodeUrl}/admin/mintingaccounts?apiKey=${myNode.apiKey}`; + renderErrorMsg4() { + return html`${translate("startminting.smchange4")}` + } - return await fetch(url, { - method: 'DELETE', - body: publicKey, - }); - }; + async getMintingAcccounts() { + const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]; + const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port; + const url = `${nodeUrl}/admin/mintingaccounts`; + try { + const res = await fetch(url); + const mintingAccountData = await res.json(); - const addMintingAccount = async (sponsorshipKeyValue) => { - const url = `${nodeUrl}/admin/mintingaccounts?apiKey=${myNode.apiKey}`; - - return await fetch(url, { - method: 'POST', - body: sponsorshipKeyValue, - }); - }; - - try { - if ( - findMintingAccountFromOtherUser && - findMintingAccountFromOtherUser?.publicKey[0] - ) { - await removeMintingAccount( - findMintingAccountFromOtherUser?.publicKey[0] - ); + this.mintingAccountData = mintingAccountData; + } catch (error) { + this.errorMsg = this.renderErrorMsg1(); } - } catch (error) { - this.errorMsg = this.renderErrorMsg2(); - return; } - try { - await addMintingAccount(this.privateRewardShareKey); - routes.showSnackBar({ - data: translate('becomeMinterPage.bchange19'), - }); - this.status = 5; - this.getMintingAcccounts(); - } catch (error) { - this.errorMsg = this.renderErrorMsg3(); - return; - } + async changeStatus(value){ + const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]; + const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port; + this.status = value + const publicAddress = window.parent.reduxStore.getState().app?.selectedAddress ?.base58PublicKey; -} + // Check to see if a sponsorship key on a newly-level 1 minter exists. If it does, remove it. + const findMintingAccountFromOtherUser = this.mintingAccountData.find((ma) => !ma.publicKey.includes(publicAddress)); + + const removeMintingAccount = async (publicKey) => { + const url = `${nodeUrl}/admin/mintingaccounts?apiKey=${myNode.apiKey}`; + return await fetch(url, { + method: 'DELETE', + body: publicKey, + }); + }; + + const addMintingAccount = async (sponsorshipKeyValue) => { + const url = `${nodeUrl}/admin/mintingaccounts?apiKey=${myNode.apiKey}`; + return await fetch(url, { + method: 'POST', + body: sponsorshipKeyValue, + }); + }; + + try { + if ( + findMintingAccountFromOtherUser && + findMintingAccountFromOtherUser?.publicKey[0] + ) { + await removeMintingAccount( + findMintingAccountFromOtherUser?.publicKey[0] + ); + } + } catch (error) { + this.errorMsg = this.renderErrorMsg2(); + return; + } + + try { + await addMintingAccount(this.privateRewardShareKey); + routes.showSnackBar({ + data: translate('becomeMinterPage.bchange19'), + }); + this.status = 5; + this.getMintingAcccounts(); + } catch (error) { + this.errorMsg = this.renderErrorMsg3(); + return; + } + } async confirmRelationship(){ const myNode = @@ -337,232 +319,193 @@ async confirmRelationship(){ interval = setInterval(getAnswer, 5000); } -renderStartMintingButton() { - const myNode = - store.getState().app.nodeConfig.knownNodes[ - store.getState().app.nodeConfig.node - ]; + renderStartMintingButton() { + const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]; + const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port; + const mintingAccountData = this.mintingAccountData; + const addressInfo = window.parent.reduxStore.getState().app.accountInfo.addressInfo + const address = window.parent.reduxStore.getState().app?.selectedAddress?.address; + const nonce = window.parent.reduxStore.getState().app?.selectedAddress?.nonce; + const publicAddress = window.parent.reduxStore.getState().app?.selectedAddress ?.base58PublicKey; + const findMintingAccount = mintingAccountData.find((ma) => ma.mintingAccount === address); + const isMinterButKeyMintingKeyNotAssigned = addressInfo?.error !== 124 && addressInfo?.level >= 1 && !findMintingAccount; - const nodeUrl = - myNode.protocol + '://' + myNode.domain + ':' + myNode.port; + const makeTransactionRequest = async (lastRef) => { + let mylastRef = lastRef; + let rewarddialog1 = get('transactions.rewarddialog1'); + let rewarddialog2 = get('transactions.rewarddialog2'); + let rewarddialog3 = get('transactions.rewarddialog3'); + let rewarddialog4 = get('transactions.rewarddialog4'); - const mintingAccountData = this.mintingAccountData; - - const addressInfo = window.parent.reduxStore.getState().app.accountInfo.addressInfo - - const address = - window.parent.reduxStore.getState().app?.selectedAddress?.address; - - const nonce = - window.parent.reduxStore.getState().app?.selectedAddress?.nonce; - - const publicAddress = - window.parent.reduxStore.getState().app?.selectedAddress - ?.base58PublicKey; - - - const findMintingAccount = mintingAccountData.find((ma) => - ma.mintingAccount === address - ); - - const isMinterButKeyMintingKeyNotAssigned = - addressInfo?.error !== 124 && - addressInfo?.level >= 1 && - !findMintingAccount; - const makeTransactionRequest = async (lastRef) => { - let mylastRef = lastRef; - let rewarddialog1 = get('transactions.rewarddialog1'); - let rewarddialog2 = get('transactions.rewarddialog2'); - let rewarddialog3 = get('transactions.rewarddialog3'); - let rewarddialog4 = get('transactions.rewarddialog4'); - - let myTxnrequest = await routes.transaction({ - data: { - type: 38, - nonce: nonce, - params: { - recipientPublicKey: publicAddress, - percentageShare: 0, - lastReference: mylastRef, - rewarddialog1: rewarddialog1, - rewarddialog2: rewarddialog2, - rewarddialog3: rewarddialog3, - rewarddialog4: rewarddialog4, + let myTxnrequest = await routes.transaction({ + data: { + type: 38, + nonce: nonce, + params: { + recipientPublicKey: publicAddress, + percentageShare: 0, + lastReference: mylastRef, + rewarddialog1: rewarddialog1, + rewarddialog2: rewarddialog2, + rewarddialog3: rewarddialog3, + rewarddialog4: rewarddialog4, + }, }, - }, - disableModal: true, - }); - return myTxnrequest; - }; + disableModal: true, + }); + return myTxnrequest; + }; - const getTxnRequestResponse = (txnResponse) => { - let err6string = get('rewardsharepage.rchange21'); - if (txnResponse?.extraData?.rewardSharePrivateKey && (txnResponse?.data?.message?.includes('multiple') || txnResponse?.data?.message?.includes('SELF_SHARE_EXISTS'))) { - return err6string - } - if (txnResponse.success === false && txnResponse.message) { - throw (txnResponse); - } else if ( - txnResponse.success === true && - !txnResponse.data.error - ) { + const getTxnRequestResponse = (txnResponse) => { + let err6string = get('rewardsharepage.rchange21'); + if (txnResponse?.extraData?.rewardSharePrivateKey && (txnResponse?.data?.message?.includes('multiple') || txnResponse?.data?.message?.includes('SELF_SHARE_EXISTS'))) { + return err6string + } + if (txnResponse.success === false && txnResponse.message) { + throw (txnResponse); + } else if ( + txnResponse.success === true && + !txnResponse.data.error + ) { - return err6string; - } else { - throw (txnResponse); - } - }; + return err6string; + } else { + throw (txnResponse); + } + }; - const createSponsorshipKey = async () => { - this.status = 1 - let lastRef = await getLastRef(); + const createSponsorshipKey = async () => { + this.status = 1 + let lastRef = await getLastRef(); - let myTransaction = await makeTransactionRequest(lastRef); + let myTransaction = await makeTransactionRequest(lastRef); - getTxnRequestResponse(myTransaction); - return myTransaction?.extraData?.rewardSharePrivateKey - }; + getTxnRequestResponse(myTransaction); + return myTransaction?.extraData?.rewardSharePrivateKey + }; + const getLastRef = async () => { + const url = `${nodeUrl}/addresses/lastreference/${address}`; + const res = await fetch(url); + const data = await res.text(); + return data; + }; - const getLastRef = async () => { - const url = `${nodeUrl}/addresses/lastreference/${address}`; + const startMinting = async () => { + this.openDialogRewardShare = true + this.errorMsg = ''; - const res = await fetch(url); + try { + this.privateRewardShareKey = await createSponsorshipKey(); + this.confirmRelationship(publicAddress) + } catch (error) { + console.log({ error }) + this.errorMsg = error?.data?.message || this.renderErrorMsg4(); + return; + } + }; - const data = await res.text(); + return html` + ${isMinterButKeyMintingKeyNotAssigned ? html` +
+ { + await startMinting(); + if (this.errorMsg) { + routes.showSnackBar({ + data: this.errorMsg, + }); + } + }} + > + +
- return data; - }; - - const startMinting = async () => { - this.openDialogRewardShare = true - - this.errorMsg = ''; - - try { - - this.privateRewardShareKey = await createSponsorshipKey(); - this.confirmRelationship(publicAddress) - } catch (error) { - console.log({ error }) - this.errorMsg = error?.data?.message || this.renderErrorMsg4(); - return; - } - - - }; - - return html` - ${isMinterButKeyMintingKeyNotAssigned - ? html` -
- { - await startMinting(); - if (this.errorMsg) { - routes.showSnackBar({ - data: this.errorMsg, - }); - } - }} - > -
- - - + - - ${this.openDialogRewardShare ? html` + ${this.openDialogRewardShare ? html`
-
-
-

In progress

3 && 'hide'}`}>
-
- -
-
-
-
    -
  • -

    - 1. ${translate("startminting.smchange5")} -

    -
    -
  • - -
  • -

    - 2. ${translate("startminting.smchange6")} -

    -
    -
  • - -
  • -

    - 3. ${translate("startminting.smchange7")} -

    -
    -
    ${asyncReplace(this.timer)} +
    +
    +

    In progress

    +
    3 && 'hide'}`}>
    -
  • +
    +
+
+
    +
  • +

    + 1. ${translate("startminting.smchange5")} +

    +
    +
  • -
  • -

    - 4. ${translate("startminting.smchange8")} -

    -
    -
  • +
  • +

    + 2. ${translate("startminting.smchange6")} +

    +
    +
  • -
  • -

    - 5. ${translate("startminting.smchange9")} -

    -
  • -
-
-

- Warning: do not close the Qortal UI until completion! -

-

${this.errorMsg}

-
-
-
- ${this.errorMsg || this.status === 5 ? html` - { - this.openDialogRewardShare = false - this.errorMsg = '' +
  • +

    + 3. ${translate("startminting.smchange7")} +

    +
    +
    ${asyncReplace(this.timer)} +
    +
  • - }} - class="red" - > - ${translate("general.close")} -
    +
  • +

    + 4. ${translate("startminting.smchange8")} +

    +
    +
  • + +
  • +

    + 5. ${translate("startminting.smchange9")} +

    +
  • + +
    +

    + Warning: do not close the Qortal UI until completion! +

    +

    ${this.errorMsg}

    +
    +
    +
    + ${this.errorMsg || this.status === 5 ? html` + { + this.openDialogRewardShare = false + this.errorMsg = '' + }} + class="red" + > + ${translate("general.close")} + ` : '' } -
    -
    - - -
    - ` : ""} + + - ` - : ''} + ` : ""} + ` : ''} `; -} + } -stateChanged(state) { - this.addressInfo = state.app.accountInfo.addressInfo; -} + stateChanged(state) { + this.addressInfo = state.app.accountInfo.addressInfo; + } } window.customElements.define('start-minting', StartMinting); diff --git a/qortal-ui-core/src/components/wallet-profile.js b/qortal-ui-core/src/components/wallet-profile.js index 3e192f27..65e2ec6c 100644 --- a/qortal-ui-core/src/components/wallet-profile.js +++ b/qortal-ui-core/src/components/wallet-profile.js @@ -6,8 +6,6 @@ import { translate, translateUnsafeHTML } from 'lit-translate' import '@polymer/paper-toast' import '@material/mwc-icon-button' -import './start-minting.js' - class WalletProfile extends connect(store)(LitElement) { static get properties() { return { @@ -90,7 +88,6 @@ class WalletProfile extends connect(store)(LitElement) {

    ${translate("walletprofile.blocksminted")} - ${this.accountInfo.addressInfo.blocksMinted + this.accountInfo.addressInfo.blocksMintedAdjustment}

    ${this.wallet.addresses[0].address}

    - ` diff --git a/qortal-ui-crypto/api/transactions/PaymentTransaction.js b/qortal-ui-crypto/api/transactions/PaymentTransaction.js index 64589991..54de72c3 100644 --- a/qortal-ui-crypto/api/transactions/PaymentTransaction.js +++ b/qortal-ui-crypto/api/transactions/PaymentTransaction.js @@ -36,7 +36,7 @@ export default class PaymentTransaction extends TransactionBase { } set amount(amount) { - this._amount = amount * store.getState().config.coin.decimals + this._amount = Math.round(amount * store.getState().config.coin.decimals) this._amountBytes = this.constructor.utils.int64ToBytes(this._amount) }