mirror of
https://github.com/Qortal/qortal-ui.git
synced 2025-02-11 17:55:51 +00:00
Merge branch 'ravencoin' into new-coins
# Conflicts: # qortal-ui-core/src/plugins/routes.js # qortal-ui-crypto/api/PhraseWallet.js # qortal-ui-crypto/api/api.js # qortal-ui-crypto/api/tradeRequest.js # qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js # qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js
This commit is contained in:
commit
80fd579029
BIN
img/qortrvn.png
Normal file
BIN
img/qortrvn.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.8 KiB |
@ -21,6 +21,7 @@ const sendBtc = api.sendBtc
|
|||||||
const sendLtc = api.sendLtc
|
const sendLtc = api.sendLtc
|
||||||
const sendDoge = api.sendDoge
|
const sendDoge = api.sendDoge
|
||||||
const sendDgb = api.sendDgb
|
const sendDgb = api.sendDgb
|
||||||
|
const sendRvn = api.sendRvn
|
||||||
|
|
||||||
export const routes = {
|
export const routes = {
|
||||||
hello: async (req) => {
|
hello: async (req) => {
|
||||||
@ -347,4 +348,17 @@ export const routes = {
|
|||||||
}
|
}
|
||||||
return response
|
return response
|
||||||
},
|
},
|
||||||
|
|
||||||
|
sendRvn: async (req) => {
|
||||||
|
let response
|
||||||
|
try {
|
||||||
|
const res = await sendRvn(req.data)
|
||||||
|
response = res
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e)
|
||||||
|
console.error(e.message)
|
||||||
|
response = e.message
|
||||||
|
}
|
||||||
|
return response
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
@ -153,12 +153,28 @@ export default class PhraseWallet {
|
|||||||
}
|
}
|
||||||
}).createWallet(new Uint8Array(dgbSeed), false, 'DGB');
|
}).createWallet(new Uint8Array(dgbSeed), false, 'DGB');
|
||||||
|
|
||||||
|
// Create Ravencoin HD Wallet
|
||||||
|
const rvnSeed = [...addrSeed];
|
||||||
|
const rvnWallet = new AltcoinHDWallet({
|
||||||
|
mainnet: {
|
||||||
|
private: 0x0488ADE4,
|
||||||
|
public: 0x0488B21E,
|
||||||
|
prefix: 0x3C
|
||||||
|
},
|
||||||
|
testnet: {
|
||||||
|
private: 0x04358394,
|
||||||
|
public: 0x043587CF,
|
||||||
|
prefix: 0x6F
|
||||||
|
}
|
||||||
|
}).createWallet(new Uint8Array(rvnSeed), false, 'RVN');
|
||||||
|
|
||||||
this._addresses[nonce] = {
|
this._addresses[nonce] = {
|
||||||
address,
|
address,
|
||||||
btcWallet,
|
btcWallet,
|
||||||
ltcWallet,
|
ltcWallet,
|
||||||
dogeWallet,
|
dogeWallet,
|
||||||
dgbWallet,
|
dgbWallet,
|
||||||
|
rvnWallet,
|
||||||
qoraAddress,
|
qoraAddress,
|
||||||
keyPair: {
|
keyPair: {
|
||||||
publicKey: addrKeyPair.publicKey,
|
publicKey: addrKeyPair.publicKey,
|
||||||
|
@ -4,6 +4,6 @@ export { transactionTypes as transactions } from './transactions/transactions.js
|
|||||||
|
|
||||||
export { processTransaction, createTransaction, computeChatNonce, signChatTransaction, signArbitraryTransaction } from './createTransaction.js'
|
export { processTransaction, createTransaction, computeChatNonce, signChatTransaction, signArbitraryTransaction } from './createTransaction.js'
|
||||||
|
|
||||||
export { tradeBotCreateRequest, tradeBotRespondRequest, signTradeBotTxn, deleteTradeOffer, sendBtc, sendLtc, sendDoge, sendDgb } from './tradeRequest.js'
|
export { tradeBotCreateRequest, tradeBotRespondRequest, signTradeBotTxn, deleteTradeOffer, sendBtc, sendLtc, sendDoge, sendDgb, sendRvn } from './tradeRequest.js'
|
||||||
|
|
||||||
export { cancelAllOffers } from './transactions/trade-portal/tradeoffer/cancelAllOffers.js'
|
export { cancelAllOffers } from './transactions/trade-portal/tradeoffer/cancelAllOffers.js'
|
||||||
|
@ -115,3 +115,18 @@ export const sendDgb = (requestObject) => {
|
|||||||
body: JSON.stringify(requestObject)
|
body: JSON.stringify(requestObject)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Send RVN
|
||||||
|
export const sendRvn = (requestObject) => {
|
||||||
|
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node];
|
||||||
|
|
||||||
|
return request(`/crosschain/rvn/send?apiKey=${myNode.apiKey}`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Accept': 'application/json',
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(requestObject)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -350,6 +350,10 @@ class TradePortal extends LitElement {
|
|||||||
background-image: url('/img/qortdgb.png');
|
background-image: url('/img/qortdgb.png');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.rvn.coinName:before {
|
||||||
|
background-image: url('/img/qortrvn.png');
|
||||||
|
}
|
||||||
|
|
||||||
.coinName {
|
.coinName {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
height: 26px;
|
height: 26px;
|
||||||
@ -463,11 +467,27 @@ class TradePortal extends LitElement {
|
|||||||
coinAmount: this.amountString
|
coinAmount: this.amountString
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let ravencoin = {
|
||||||
|
name: "RAVENCOIN",
|
||||||
|
balance: "0",
|
||||||
|
coinCode: "RVN",
|
||||||
|
openOrders: [],
|
||||||
|
openFilteredOrders: [],
|
||||||
|
historicTrades: [],
|
||||||
|
myOrders: [],
|
||||||
|
myHistoricTrades: [],
|
||||||
|
myOfferingOrders: [],
|
||||||
|
openTradeOrders: null,
|
||||||
|
tradeOffersSocketCounter: 1,
|
||||||
|
coinAmount: this.amountString
|
||||||
|
}
|
||||||
|
|
||||||
this.listedCoins = new Map()
|
this.listedCoins = new Map()
|
||||||
this.listedCoins.set("QORTAL", qortal)
|
this.listedCoins.set("QORTAL", qortal)
|
||||||
this.listedCoins.set("LITECOIN", litecoin)
|
this.listedCoins.set("LITECOIN", litecoin)
|
||||||
this.listedCoins.set("DOGECOIN", dogecoin)
|
this.listedCoins.set("DOGECOIN", dogecoin)
|
||||||
this.listedCoins.set("DIGIBYTE", digibyte)
|
this.listedCoins.set("DIGIBYTE", digibyte)
|
||||||
|
this.listedCoins.set("RAVENCOIN", ravencoin)
|
||||||
|
|
||||||
workers.set("QORTAL", {
|
workers.set("QORTAL", {
|
||||||
tradesConnectedWorker: null,
|
tradesConnectedWorker: null,
|
||||||
@ -489,6 +509,11 @@ class TradePortal extends LitElement {
|
|||||||
handleStuckTradesConnectedWorker: null
|
handleStuckTradesConnectedWorker: null
|
||||||
})
|
})
|
||||||
|
|
||||||
|
workers.set("RAVENCOIN", {
|
||||||
|
tradesConnectedWorker: null,
|
||||||
|
handleStuckTradesConnectedWorker: null
|
||||||
|
})
|
||||||
|
|
||||||
this.selectedCoin = "LITECOIN"
|
this.selectedCoin = "LITECOIN"
|
||||||
this.selectedAddress = {}
|
this.selectedAddress = {}
|
||||||
this.config = {}
|
this.config = {}
|
||||||
@ -872,6 +897,7 @@ class TradePortal extends LitElement {
|
|||||||
<mwc-list-item value="LITECOIN" selected><span class="coinName ltc" style="color: var(--black);">QORT / LTC</span></mwc-list-item>
|
<mwc-list-item value="LITECOIN" selected><span class="coinName ltc" style="color: var(--black);">QORT / LTC</span></mwc-list-item>
|
||||||
<mwc-list-item value="DOGECOIN"><span class="coinName doge" style="color: var(--black);">QORT / DOGE</span></mwc-list-item>
|
<mwc-list-item value="DOGECOIN"><span class="coinName doge" style="color: var(--black);">QORT / DOGE</span></mwc-list-item>
|
||||||
<mwc-list-item value="DIGIBYTE"><span class="coinName dgb" style="color: var(--black);">QORT / DGB</span></mwc-list-item>
|
<mwc-list-item value="DIGIBYTE"><span class="coinName dgb" style="color: var(--black);">QORT / DGB</span></mwc-list-item>
|
||||||
|
<mwc-list-item value="RAVENCOIN"><span class="coinName rvn" style="color: var(--black);">QORT / RVN</span></mwc-list-item>
|
||||||
</mwc-select>
|
</mwc-select>
|
||||||
</div>
|
</div>
|
||||||
<div id="trade-portal">
|
<div id="trade-portal">
|
||||||
@ -1037,6 +1063,10 @@ class TradePortal extends LitElement {
|
|||||||
case 'DIGIBYTE':
|
case 'DIGIBYTE':
|
||||||
_url = `/crosschain/dgb/walletbalance?apiKey=${this.getApiKey()}`
|
_url = `/crosschain/dgb/walletbalance?apiKey=${this.getApiKey()}`
|
||||||
_body = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.derivedMasterPublicKey
|
_body = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.derivedMasterPublicKey
|
||||||
|
break
|
||||||
|
case 'RAVENCOIN':
|
||||||
|
_url = `/crosschain/rvn/walletbalance?apiKey=${this.getApiKey()}`
|
||||||
|
_body = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
@ -1481,6 +1511,72 @@ class TradePortal extends LitElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RavencoinACCTv1 TRADEBOT STATES
|
||||||
|
* - BOB_WAITING_FOR_AT_CONFIRM
|
||||||
|
* - BOB_WAITING_FOR_MESSAGE
|
||||||
|
* - BOB_WAITING_FOR_AT_REDEEM
|
||||||
|
* - BOB_DONE
|
||||||
|
* - BOB_REFUNDED
|
||||||
|
* - ALICE_WAITING_FOR_AT_LOCK
|
||||||
|
* - ALICE_DONE
|
||||||
|
* - ALICE_REFUNDING_A
|
||||||
|
* - ALICE_REFUNDED
|
||||||
|
*
|
||||||
|
* @param {[{}]} states
|
||||||
|
*/
|
||||||
|
|
||||||
|
const RavencoinACCTv1 = (states) => {
|
||||||
|
// Reverse the states
|
||||||
|
states.reverse()
|
||||||
|
states.forEach((state) => {
|
||||||
|
if (state.creatorAddress === this.selectedAddress.address) {
|
||||||
|
if (state.tradeState == 'BOB_WAITING_FOR_AT_CONFIRM') {
|
||||||
|
this.changeTradeBotState(state, 'PENDING')
|
||||||
|
} else if (state.tradeState == 'BOB_WAITING_FOR_MESSAGE') {
|
||||||
|
this.changeTradeBotState(state, 'LISTED')
|
||||||
|
} else if (state.tradeState == 'BOB_WAITING_FOR_AT_REDEEM') {
|
||||||
|
this.changeTradeBotState(state, 'TRADING')
|
||||||
|
} else if (state.tradeState == 'BOB_DONE') {
|
||||||
|
this.handleCompletedState(state)
|
||||||
|
} else if (state.tradeState == 'BOB_REFUNDED') {
|
||||||
|
this.handleCompletedState(state)
|
||||||
|
} else if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') {
|
||||||
|
this.changeTradeBotState(state, 'BUYING')
|
||||||
|
} else if (state.tradeState == 'ALICE_DONE') {
|
||||||
|
this.handleCompletedState(state)
|
||||||
|
} else if (state.tradeState == 'ALICE_REFUNDING_A') {
|
||||||
|
this.changeTradeBotState(state, 'REFUNDING')
|
||||||
|
} else if (state.tradeState == 'ALICE_REFUNDED') {
|
||||||
|
this.handleCompletedState(state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (this.selectedCoin) {
|
||||||
|
case 'BITCOIN':
|
||||||
|
BitcoinACCTv1(tradeStates)
|
||||||
|
break
|
||||||
|
case 'LITECOIN':
|
||||||
|
LitecoinACCTv1(tradeStates)
|
||||||
|
break
|
||||||
|
case 'DOGECOIN':
|
||||||
|
DogecoinACCTv1(tradeStates)
|
||||||
|
break
|
||||||
|
case 'RAVENCOIN':
|
||||||
|
RavencoinACCTv1(tradeStates)
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fill Historic Trades and Filter Stuck Trades
|
||||||
|
if (this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter === 1) {
|
||||||
|
setTimeout(() => this.filterStuckTrades(tradeStates), 50)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
changeTradeBotState(state, tradeState) {
|
changeTradeBotState(state, tradeState) {
|
||||||
// Set Loading state
|
// Set Loading state
|
||||||
this.isLoadingMyOpenOrders = true
|
this.isLoadingMyOpenOrders = true
|
||||||
@ -1762,6 +1858,9 @@ class TradePortal extends LitElement {
|
|||||||
break
|
break
|
||||||
case 'DIGIBYTE':
|
case 'DIGIBYTE':
|
||||||
_receivingAddress = this.selectedAddress.dgbWallet.address
|
_receivingAddress = this.selectedAddress.dgbWallet.address
|
||||||
|
break
|
||||||
|
case 'RAVENCOIN':
|
||||||
|
_receivingAddress = this.selectedAddress.rvnWallet.address
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
@ -1825,6 +1924,9 @@ class TradePortal extends LitElement {
|
|||||||
break
|
break
|
||||||
case 'DIGIBYTE':
|
case 'DIGIBYTE':
|
||||||
_foreignKey = this.selectedAddress.dgbWallet.derivedMasterPrivateKey
|
_foreignKey = this.selectedAddress.dgbWallet.derivedMasterPrivateKey
|
||||||
|
break
|
||||||
|
case 'RAVENCOIN':
|
||||||
|
_foreignKey = this.selectedAddress.rvnWallet.derivedMasterPrivateKey
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
|
@ -25,7 +25,7 @@ import '@github/time-elements'
|
|||||||
|
|
||||||
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent })
|
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent })
|
||||||
|
|
||||||
const coinsNames = ['qort', 'btc', 'ltc', 'doge', 'dgb']
|
const coinsNames = ['qort', 'btc', 'ltc', 'doge', 'dgb', 'rvn']
|
||||||
|
|
||||||
class MultiWallet extends LitElement {
|
class MultiWallet extends LitElement {
|
||||||
static get properties() {
|
static get properties() {
|
||||||
@ -48,6 +48,8 @@ class MultiWallet extends LitElement {
|
|||||||
dogeAmount: { type: Number },
|
dogeAmount: { type: Number },
|
||||||
dgbRecipient: { type: String },
|
dgbRecipient: { type: String },
|
||||||
dgbAmount: { type: Number },
|
dgbAmount: { type: Number },
|
||||||
|
rvnRecipient: { type: String },
|
||||||
|
rvnAmount: { type: Number },
|
||||||
errorMessage: { type: String },
|
errorMessage: { type: String },
|
||||||
successMessage: { type: String },
|
successMessage: { type: String },
|
||||||
sendMoneyLoading: { type: Boolean },
|
sendMoneyLoading: { type: Boolean },
|
||||||
@ -58,6 +60,7 @@ class MultiWallet extends LitElement {
|
|||||||
ltcFeePerByte: { type: Number },
|
ltcFeePerByte: { type: Number },
|
||||||
dogeFeePerByte: { type: Number },
|
dogeFeePerByte: { type: Number },
|
||||||
dgbFeePerByte: { type: Number },
|
dgbFeePerByte: { type: Number },
|
||||||
|
rvnFeePerByte: { type: Number },
|
||||||
balanceString: { type: String }
|
balanceString: { type: String }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -428,6 +431,10 @@ class MultiWallet extends LitElement {
|
|||||||
background-image: url('/img/dgb.png');
|
background-image: url('/img/dgb.png');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.rvn .currency-image {
|
||||||
|
background-image: url('/img/rvn.png');
|
||||||
|
}
|
||||||
|
|
||||||
.card-list {
|
.card-list {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
}
|
}
|
||||||
@ -561,6 +568,7 @@ class MultiWallet extends LitElement {
|
|||||||
this.ltcRecipient = ''
|
this.ltcRecipient = ''
|
||||||
this.dogeRecipient = ''
|
this.dogeRecipient = ''
|
||||||
this.dgbRecipient = ''
|
this.dgbRecipient = ''
|
||||||
|
this.rvnRecipient = ''
|
||||||
this.errorMessage = ''
|
this.errorMessage = ''
|
||||||
this.successMessage = ''
|
this.successMessage = ''
|
||||||
this.sendMoneyLoading = false
|
this.sendMoneyLoading = false
|
||||||
@ -572,6 +580,7 @@ class MultiWallet extends LitElement {
|
|||||||
this.ltcAmount = 0
|
this.ltcAmount = 0
|
||||||
this.dogeAmount = 0
|
this.dogeAmount = 0
|
||||||
this.dgbAmount = 0
|
this.dgbAmount = 0
|
||||||
|
this.rvnAmount = 0
|
||||||
this.btcFeePerByte = 100
|
this.btcFeePerByte = 100
|
||||||
this.btcSatMinFee = 20
|
this.btcSatMinFee = 20
|
||||||
this.btcSatMaxFee = 150
|
this.btcSatMaxFee = 150
|
||||||
@ -584,6 +593,9 @@ class MultiWallet extends LitElement {
|
|||||||
this.dgbFeePerByte = 100
|
this.dgbFeePerByte = 100
|
||||||
this.dgbSatMinFee = 10
|
this.dgbSatMinFee = 10
|
||||||
this.dgbSatMaxFee = 1000
|
this.dgbSatMaxFee = 1000
|
||||||
|
this.rvnFeePerByte = 1125
|
||||||
|
this.rvnSatMinFee = 1000
|
||||||
|
this.rvnSatMaxFee = 10000
|
||||||
|
|
||||||
this.wallets = new Map()
|
this.wallets = new Map()
|
||||||
|
|
||||||
@ -604,6 +616,7 @@ class MultiWallet extends LitElement {
|
|||||||
this.wallets.get('ltc').wallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet
|
this.wallets.get('ltc').wallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet
|
||||||
this.wallets.get('doge').wallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet
|
this.wallets.get('doge').wallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet
|
||||||
this.wallets.get('dgb').wallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet
|
this.wallets.get('dgb').wallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet
|
||||||
|
this.wallets.get('rvn').wallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet
|
||||||
|
|
||||||
this._selectedWallet = 'qort'
|
this._selectedWallet = 'qort'
|
||||||
|
|
||||||
@ -653,6 +666,10 @@ class MultiWallet extends LitElement {
|
|||||||
<div coin="dgb" class="currency-box dgb">
|
<div coin="dgb" class="currency-box dgb">
|
||||||
<div class="currency-image"></div>
|
<div class="currency-image"></div>
|
||||||
<div class="currency-text">Digibyte</div>
|
<div class="currency-text">Digibyte</div>
|
||||||
|
</div>
|
||||||
|
<div coin="rvn" class="currency-box rvn">
|
||||||
|
<div class="currency-image"></div>
|
||||||
|
<div class="currency-text">Ravencoin</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -930,6 +947,56 @@ class MultiWallet extends LitElement {
|
|||||||
</mwc-button>
|
</mwc-button>
|
||||||
</mwc-dialog>
|
</mwc-dialog>
|
||||||
|
|
||||||
|
<mwc-dialog id="showRvnTransactionDetailsDialog" scrimClickAction="${this.showRvnTransactionDetailsLoading ? '' : 'close'}">
|
||||||
|
<div style="text-align: center;">
|
||||||
|
<h1>${translate("walletpage.wchange5")}</h1>
|
||||||
|
<hr />
|
||||||
|
</div>
|
||||||
|
<div id="transactionList">
|
||||||
|
<span class="title"> ${translate("walletpage.wchange6")} </span>
|
||||||
|
<br />
|
||||||
|
<div>
|
||||||
|
<span>${translate("walletpage.wchange40")}</span>
|
||||||
|
${this.selectedTransaction.rvnTxnFlow === 'OUT' ? html`<span class="color-out">${translate("walletpage.wchange7")}</span>` : html`<span class="color-in">${translate("walletpage.wchange8")}</span>`}
|
||||||
|
</div>
|
||||||
|
<span class="title"> ${translate("walletpage.wchange9")} </span>
|
||||||
|
<br />
|
||||||
|
<div>
|
||||||
|
<span>${this.selectedTransaction.rvnSender}</span>
|
||||||
|
</div>
|
||||||
|
<span class="title"> ${translate("walletpage.wchange10")} </span>
|
||||||
|
<br />
|
||||||
|
<div>
|
||||||
|
<span>${this.selectedTransaction.rvnReceiver}</span>
|
||||||
|
</div>
|
||||||
|
<span class="title"> ${translate("walletpage.wchange12")} </span>
|
||||||
|
<br />
|
||||||
|
<div>
|
||||||
|
<span>${(this.selectedTransaction.feeAmount / 1e8).toFixed(8)} RVN</span>
|
||||||
|
</div>
|
||||||
|
<span class="title"> ${translate("walletpage.wchange37")} </span>
|
||||||
|
<br />
|
||||||
|
<div>
|
||||||
|
<span>${(this.selectedTransaction.totalAmount / 1e8).toFixed(8)} RVN</span>
|
||||||
|
</div>
|
||||||
|
<span class="title"> ${translate("walletpage.wchange14")} </span>
|
||||||
|
<br />
|
||||||
|
<div><span>${new Date(this.selectedTransaction.timestamp).toString()}</span></div>
|
||||||
|
<span class="title"> ${translate("walletpage.wchange16")} </span>
|
||||||
|
<br />
|
||||||
|
<div>
|
||||||
|
<span>${this.selectedTransaction.txHash}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<mwc-button
|
||||||
|
slot="primaryAction"
|
||||||
|
dialogAction="cancel"
|
||||||
|
class="red"
|
||||||
|
>
|
||||||
|
${translate("general.close")}
|
||||||
|
</mwc-button>
|
||||||
|
</mwc-dialog>
|
||||||
|
|
||||||
<mwc-dialog id="sendQortDialog">
|
<mwc-dialog id="sendQortDialog">
|
||||||
<div class="send-coin-dialog">
|
<div class="send-coin-dialog">
|
||||||
<div style="text-align: center;">
|
<div style="text-align: center;">
|
||||||
@ -1291,6 +1358,82 @@ class MultiWallet extends LitElement {
|
|||||||
>
|
>
|
||||||
${translate("general.close")}
|
${translate("general.close")}
|
||||||
</mwc-button>
|
</mwc-button>
|
||||||
|
</mwc-dialog>
|
||||||
|
|
||||||
|
<mwc-dialog id="sendRvnDialog">
|
||||||
|
<div class="send-coin-dialog">
|
||||||
|
<div style="text-align: center;">
|
||||||
|
<img src="/img/rvn.png" width="32" height="32">
|
||||||
|
<h2>${translate("walletpage.wchange17")} RVN</h2>
|
||||||
|
<hr />
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<span>${translate("walletpage.wchange18")}:</span><br />
|
||||||
|
<span style="font-weight: bold;">${this.getSelectedWalletAddress()}</span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<span>${translate("walletpage.wchange19")}:</span><br />
|
||||||
|
<span style="font-weight: bold;">${this.balanceString}</span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<mwc-textfield
|
||||||
|
style="width: 100%;"
|
||||||
|
required
|
||||||
|
@input="${(e) => { this._checkAmount(e) }}"
|
||||||
|
id="rvnAmountInput"
|
||||||
|
label="${translate("walletpage.wchange11")} (RVN)"
|
||||||
|
type="number"
|
||||||
|
auto-validate="false"
|
||||||
|
value="${this.rvnAmount}"
|
||||||
|
>
|
||||||
|
</mwc-textfield>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<mwc-textfield
|
||||||
|
style="width: 100%;"
|
||||||
|
required
|
||||||
|
id="rvnRecipient"
|
||||||
|
label="${translate("walletpage.wchange23")}"
|
||||||
|
type="text"
|
||||||
|
value="${this.rvnRecipient}"
|
||||||
|
>
|
||||||
|
</mwc-textfield>
|
||||||
|
</p>
|
||||||
|
<div style="margin-bottom: 0;">
|
||||||
|
<p style="margin-bottom: 0;">
|
||||||
|
${translate("walletpage.wchange24")}: <span style="font-weight: bold;">${(this.rvnFeePerByte / 1e8).toFixed(8)} RVN</span><br>L${translate("walletpage.wchange25")}
|
||||||
|
</p>
|
||||||
|
<paper-slider
|
||||||
|
class="blue"
|
||||||
|
style="width: 100%;"
|
||||||
|
pin
|
||||||
|
@change="${(e) => (this.rvnFeePerByte = e.target.value)}"
|
||||||
|
id="rvnFeeSlider"
|
||||||
|
min="${this.rvnSatMinFee}"
|
||||||
|
max="${this.rvnSatMaxFee}"
|
||||||
|
value="${this.rvnFeePerByte}"
|
||||||
|
>
|
||||||
|
</paper-slider>
|
||||||
|
</div>
|
||||||
|
<p style="color: red;">${this.errorMessage}</p>
|
||||||
|
<p style="color: green;">${this.successMessage}</p>
|
||||||
|
${this.sendMoneyLoading ? html` <paper-progress indeterminate style="width: 100%; margin: 4px;"></paper-progress> ` : ''}
|
||||||
|
<div class="buttons">
|
||||||
|
<div>
|
||||||
|
<vaadin-button ?disabled="${this.btnDisable}" theme="primary medium" style="width: 100%;" @click=${() => this.sendRvn()}>
|
||||||
|
<vaadin-icon icon="vaadin:arrow-forward" slot="prefix"></vaadin-icon>
|
||||||
|
${translate("walletpage.wchange17")} RVN
|
||||||
|
</vaadin-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<mwc-button
|
||||||
|
slot="primaryAction"
|
||||||
|
dialogAction="cancel"
|
||||||
|
class="red"
|
||||||
|
>
|
||||||
|
${translate("general.close")}
|
||||||
|
</mwc-button>
|
||||||
</mwc-dialog>
|
</mwc-dialog>
|
||||||
</div>
|
</div>
|
||||||
`
|
`
|
||||||
@ -1557,6 +1700,52 @@ class MultiWallet extends LitElement {
|
|||||||
checkSelectedTextAndShowMenu()
|
checkSelectedTextAndShowMenu()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
this.shadowRoot.getElementById('rvnAmountInput').addEventListener('contextmenu', (event) => {
|
||||||
|
const getSelectedText = () => {
|
||||||
|
var text = ''
|
||||||
|
if (typeof window.getSelection != 'undefined') {
|
||||||
|
text = window.getSelection().toString()
|
||||||
|
} else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') {
|
||||||
|
text = this.shadowRoot.selection.createRange().text
|
||||||
|
}
|
||||||
|
return text
|
||||||
|
}
|
||||||
|
const checkSelectedTextAndShowMenu = () => {
|
||||||
|
let selectedText = getSelectedText()
|
||||||
|
if (selectedText && typeof selectedText === 'string') {
|
||||||
|
} else {
|
||||||
|
this.pasteMenu(event, 'rvnAmountInput')
|
||||||
|
this.isPasteMenuOpen = true
|
||||||
|
event.preventDefault()
|
||||||
|
event.stopPropagation()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
checkSelectedTextAndShowMenu()
|
||||||
|
})
|
||||||
|
|
||||||
|
this.shadowRoot.getElementById('rvnRecipient').addEventListener('contextmenu', (event) => {
|
||||||
|
const getSelectedText = () => {
|
||||||
|
var text = ''
|
||||||
|
if (typeof window.getSelection != 'undefined') {
|
||||||
|
text = window.getSelection().toString()
|
||||||
|
} else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') {
|
||||||
|
text = this.shadowRoot.selection.createRange().text
|
||||||
|
}
|
||||||
|
return text
|
||||||
|
}
|
||||||
|
const checkSelectedTextAndShowMenu = () => {
|
||||||
|
let selectedText = getSelectedText()
|
||||||
|
if (selectedText && typeof selectedText === 'string') {
|
||||||
|
} else {
|
||||||
|
this.pasteMenu(event, 'rvnRecipient')
|
||||||
|
this.isPasteMenuOpen = true
|
||||||
|
event.preventDefault()
|
||||||
|
event.stopPropagation()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
checkSelectedTextAndShowMenu()
|
||||||
|
})
|
||||||
|
|
||||||
this.shadowRoot.getElementById('dgbRecipient').addEventListener('contextmenu', (event) => {
|
this.shadowRoot.getElementById('dgbRecipient').addEventListener('contextmenu', (event) => {
|
||||||
const getSelectedText = () => {
|
const getSelectedText = () => {
|
||||||
var text = ''
|
var text = ''
|
||||||
@ -2002,6 +2191,52 @@ class MultiWallet extends LitElement {
|
|||||||
this.showWallet()
|
this.showWallet()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async sendRvn() {
|
||||||
|
const rvnAmount = this.shadowRoot.getElementById('rvnAmountInput').value
|
||||||
|
let rvnRecipient = this.shadowRoot.getElementById('rvnRecipient').value
|
||||||
|
const xprv58 = this.wallets.get(this._selectedWallet).wallet.derivedMasterPrivateKey
|
||||||
|
|
||||||
|
this.sendMoneyLoading = true
|
||||||
|
this.btnDisable = true
|
||||||
|
|
||||||
|
const makeRequest = async () => {
|
||||||
|
const opts = {
|
||||||
|
xprv58: xprv58,
|
||||||
|
receivingAddress: rvnRecipient,
|
||||||
|
ravencoinAmount: rvnAmount,
|
||||||
|
feePerByte: (this.rvnFeePerByte / 1e8).toFixed(8),
|
||||||
|
}
|
||||||
|
const response = await parentEpml.request('sendRvn', opts)
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
|
||||||
|
const manageResponse = (response) => {
|
||||||
|
if (response.length === 64) {
|
||||||
|
this.shadowRoot.getElementById('rvnAmountInput').value = 0
|
||||||
|
this.shadowRoot.getElementById('rvnRecipient').value = ''
|
||||||
|
this.errorMessage = ''
|
||||||
|
this.rvnRecipient = ''
|
||||||
|
this.rvnAmount = 0
|
||||||
|
this.successMessage = this.renderSuccessText()
|
||||||
|
this.sendMoneyLoading = false
|
||||||
|
this.btnDisable = false
|
||||||
|
} else if (response === false) {
|
||||||
|
this.errorMessage = this.renderFailText()
|
||||||
|
this.sendMoneyLoading = false
|
||||||
|
this.btnDisable = false
|
||||||
|
throw new Error(txnResponse)
|
||||||
|
} else {
|
||||||
|
this.errorMessage = response.message
|
||||||
|
this.sendMoneyLoading = false
|
||||||
|
this.btnDisable = false
|
||||||
|
throw new Error(response)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const res = await makeRequest()
|
||||||
|
manageResponse(res)
|
||||||
|
this.showWallet()
|
||||||
|
}
|
||||||
|
|
||||||
async showWallet() {
|
async showWallet() {
|
||||||
this.transactionsDOM.hidden = true
|
this.transactionsDOM.hidden = true
|
||||||
this.loading = true
|
this.loading = true
|
||||||
@ -2053,6 +2288,7 @@ class MultiWallet extends LitElement {
|
|||||||
case 'ltc':
|
case 'ltc':
|
||||||
case 'doge':
|
case 'doge':
|
||||||
case 'dgb':
|
case 'dgb':
|
||||||
|
case 'rvn':
|
||||||
const walletName = `${coin}Wallet`
|
const walletName = `${coin}Wallet`
|
||||||
parentEpml.request('apiCall', {
|
parentEpml.request('apiCall', {
|
||||||
url: `/crosschain/${coin}/walletbalance?apiKey=${this.getApiKey()}`,
|
url: `/crosschain/${coin}/walletbalance?apiKey=${this.getApiKey()}`,
|
||||||
@ -2105,6 +2341,8 @@ class MultiWallet extends LitElement {
|
|||||||
return html`<vaadin-button theme="primary large" style="width: 75%;" @click=${() => this.openSendDoge()}><vaadin-icon icon="vaadin:coin-piles" slot="prefix"></vaadin-icon> ${translate("walletpage.wchange17")} DOGE</vaadin-button>`
|
return html`<vaadin-button theme="primary large" style="width: 75%;" @click=${() => this.openSendDoge()}><vaadin-icon icon="vaadin:coin-piles" slot="prefix"></vaadin-icon> ${translate("walletpage.wchange17")} DOGE</vaadin-button>`
|
||||||
} else if ( this._selectedWallet === "dgb" ) {
|
} else if ( this._selectedWallet === "dgb" ) {
|
||||||
return html`<vaadin-button theme="primary large" style="width: 75%;" @click=${() => this.openSendDgb()}><vaadin-icon icon="vaadin:coin-piles" slot="prefix"></vaadin-icon> ${translate("walletpage.wchange17")} DGB</vaadin-button>`
|
return html`<vaadin-button theme="primary large" style="width: 75%;" @click=${() => this.openSendDgb()}><vaadin-icon icon="vaadin:coin-piles" slot="prefix"></vaadin-icon> ${translate("walletpage.wchange17")} DGB</vaadin-button>`
|
||||||
|
} else if ( this._selectedWallet === "rvn" ) {
|
||||||
|
return html`<vaadin-button theme="primary large" style="width: 75%;" @click=${() => this.openSendRvn()}><vaadin-icon icon="vaadin:coin-piles" slot="prefix"></vaadin-icon> ${translate("walletpage.wchange17")} RVN</vaadin-button>`
|
||||||
} else {
|
} else {
|
||||||
return html``
|
return html``
|
||||||
}
|
}
|
||||||
@ -2130,6 +2368,10 @@ class MultiWallet extends LitElement {
|
|||||||
this.shadowRoot.querySelector("#sendDgbDialog").show();
|
this.shadowRoot.querySelector("#sendDgbDialog").show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
openSendRvn() {
|
||||||
|
this.shadowRoot.querySelector("#sendRvnDialog").show();
|
||||||
|
}
|
||||||
|
|
||||||
changeTheme() {
|
changeTheme() {
|
||||||
const checkTheme = localStorage.getItem('qortalTheme')
|
const checkTheme = localStorage.getItem('qortalTheme')
|
||||||
if (checkTheme === 'dark') {
|
if (checkTheme === 'dark') {
|
||||||
@ -2204,6 +2446,15 @@ class MultiWallet extends LitElement {
|
|||||||
},
|
},
|
||||||
{ passive: true }
|
{ passive: true }
|
||||||
)
|
)
|
||||||
|
} else if (coin === 'dgb') {
|
||||||
|
this.transactionsGrid.addEventListener(
|
||||||
|
'click',
|
||||||
|
(e) => {
|
||||||
|
let dgbItem = this.transactionsGrid.getEventContext(e).item
|
||||||
|
this.showDgbTransactionDetails(dgbItem, this.wallets.get(this._selectedWallet).transactions)
|
||||||
|
},
|
||||||
|
{ passive: true }
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.pagesControl = this.shadowRoot.querySelector('#pages')
|
this.pagesControl = this.shadowRoot.querySelector('#pages')
|
||||||
@ -2221,6 +2472,8 @@ class MultiWallet extends LitElement {
|
|||||||
render(this.renderDogeTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM)
|
render(this.renderDogeTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM)
|
||||||
} else if (this._selectedWallet === 'dgb') {
|
} else if (this._selectedWallet === 'dgb') {
|
||||||
render(this.renderDgbTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM)
|
render(this.renderDgbTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM)
|
||||||
|
} else if (this._selectedWallet === 'rvn') {
|
||||||
|
render(this.renderRvnTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2541,6 +2794,71 @@ class MultiWallet extends LitElement {
|
|||||||
`
|
`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderRvnTransactions(transactions, coin) {
|
||||||
|
return html`
|
||||||
|
<div style="padding-left:12px;" ?hidden="${!this.isEmptyArray(transactions)}"><span style="color: var(--black);">${translate("walletpage.wchange38")}</span></div>
|
||||||
|
<vaadin-grid theme="large" id="${coin}TransactionsGrid" ?hidden="${this.isEmptyArray(this.wallets.get(this._selectedWallet).transactions)}" page-size="25" all-rows-visible>
|
||||||
|
<vaadin-grid-column
|
||||||
|
auto-width
|
||||||
|
header="${translate("walletpage.wchange41")}"
|
||||||
|
.renderer=${(root, column, data) => {
|
||||||
|
render(html`<mwc-icon style="color: #00C851">check</mwc-icon>`, root)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
</vaadin-grid-column>
|
||||||
|
<vaadin-grid-column
|
||||||
|
auto-width
|
||||||
|
resizable
|
||||||
|
header="${translate("walletpage.wchange35")}"
|
||||||
|
.renderer=${(root, column, data) => {
|
||||||
|
render(html` ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? html`<span class="color-out">${translate("walletpage.wchange7")}</span>` : html`<span class="color-in">${translate("walletpage.wchange8")}</span>`} `, root)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
</vaadin-grid-column>
|
||||||
|
<vaadin-grid-column
|
||||||
|
auto-width
|
||||||
|
resizable
|
||||||
|
header="${translate("walletpage.wchange9")}"
|
||||||
|
.renderer=${(root, column, data) => {
|
||||||
|
render(html`${data.item.inputs[0].address}`, root)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
</vaadin-grid-column>
|
||||||
|
<vaadin-grid-column
|
||||||
|
auto-width
|
||||||
|
resizable
|
||||||
|
header="${translate("walletpage.wchange10")}"
|
||||||
|
.renderer=${(root, column, data) => {
|
||||||
|
render(html`${data.item.outputs[0].address}`, root)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
</vaadin-grid-column>
|
||||||
|
<vaadin-grid-column auto-width resizable header="${translate("walletpage.wchange16")}" path="txHash"></vaadin-grid-column>
|
||||||
|
<vaadin-grid-column
|
||||||
|
auto-width
|
||||||
|
resizable
|
||||||
|
header="${translate("walletpage.wchange37")}"
|
||||||
|
.renderer=${(root, column, data) => {
|
||||||
|
const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8)
|
||||||
|
render(html`${amount}`, root)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
</vaadin-grid-column>
|
||||||
|
<vaadin-grid-column
|
||||||
|
auto-width
|
||||||
|
resizable
|
||||||
|
header="${translate("walletpage.wchange14")}"
|
||||||
|
.renderer=${(root, column, data) => {
|
||||||
|
const time = new Date(data.item.timestamp * 1000)
|
||||||
|
render(html` <time-ago datetime=${time.toISOString()}> </time-ago> `, root)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
</vaadin-grid-column>
|
||||||
|
</vaadin-grid>
|
||||||
|
<div id="pages"></div>
|
||||||
|
`
|
||||||
|
}
|
||||||
|
|
||||||
async updateItemsFromPage(page, changeWallet = false) {
|
async updateItemsFromPage(page, changeWallet = false) {
|
||||||
if (page === undefined) {
|
if (page === undefined) {
|
||||||
return
|
return
|
||||||
@ -2727,6 +3045,20 @@ class MultiWallet extends LitElement {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
showRvnTransactionDetails(myTransaction, allTransactions) {
|
||||||
|
allTransactions.forEach((transaction) => {
|
||||||
|
if (myTransaction.txHash === transaction.txHash) {
|
||||||
|
let rvnTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN'
|
||||||
|
let rvnSender = myTransaction.inputs[0].address
|
||||||
|
let rvnReceiver = myTransaction.outputs[0].address
|
||||||
|
this.selectedTransaction = { ...transaction, rvnTxnFlow, rvnSender, rvnReceiver }
|
||||||
|
if (this.selectedTransaction.txHash.length != 0) {
|
||||||
|
this.shadowRoot.querySelector('#showRvnTransactionDetailsDialog').show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
isEmptyArray(arr) {
|
isEmptyArray(arr) {
|
||||||
if (!arr) {
|
if (!arr) {
|
||||||
return true
|
return true
|
||||||
|
Loading…
x
Reference in New Issue
Block a user