Browse Source

Merge branch 'master' of https://github.com/Qortal/qortal-ui

qchat-updates
AlphaX-Projects 2 years ago
parent
commit
fc5ad49ca9
  1. BIN
      img/qortarrr.png
  2. 14
      qortal-ui-core/src/plugins/routes.js
  3. 16
      qortal-ui-crypto/api/PhraseWallet.js
  4. 2
      qortal-ui-crypto/api/api.js
  5. 13
      qortal-ui-crypto/api/bitcoin/AltcoinHDWallet.js
  6. 13
      qortal-ui-crypto/api/tradeRequest.js
  7. 111
      qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js

BIN
img/qortarrr.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

14
qortal-ui-core/src/plugins/routes.js

@ -34,6 +34,7 @@ const sendLtc = api.sendLtc;
const sendDoge = api.sendDoge; const sendDoge = api.sendDoge;
const sendDgb = api.sendDgb; const sendDgb = api.sendDgb;
const sendRvn = api.sendRvn; const sendRvn = api.sendRvn;
const sendArrr = api.sendArrr;
export const routes = { export const routes = {
hello: async (req) => { hello: async (req) => {
@ -411,4 +412,17 @@ export const routes = {
} }
return response; return response;
}, },
sendArrr: async (req) => {
let response
try {
const res = await sendArrr(req.data)
response = res
} catch (e) {
console.error(e)
console.error(e.message)
response = e.message
}
return response
},
}; };

16
qortal-ui-crypto/api/PhraseWallet.js

@ -168,6 +168,21 @@ export default class PhraseWallet {
} }
}).createWallet(new Uint8Array(rvnSeed), false, 'RVN'); }).createWallet(new Uint8Array(rvnSeed), false, 'RVN');
// Create Pirate Chain HD Wallet
const arrrSeed = [...addrSeed];
const arrrWallet = new AltcoinHDWallet({
mainnet: {
private: 0x0488ADE4,
public: 0x0488B21E,
prefix: [0x16, 0x9A]
},
testnet: {
private: 0x04358394,
public: 0x043587CF,
prefix: [0x14, 0x51]
}
}).createWallet(new Uint8Array(arrrSeed), false, 'ARRR');
this._addresses[nonce] = { this._addresses[nonce] = {
address, address,
btcWallet, btcWallet,
@ -175,6 +190,7 @@ export default class PhraseWallet {
dogeWallet, dogeWallet,
dgbWallet, dgbWallet,
rvnWallet, rvnWallet,
arrrWallet,
qoraAddress, qoraAddress,
keyPair: { keyPair: {
publicKey: addrKeyPair.publicKey, publicKey: addrKeyPair.publicKey,

2
qortal-ui-crypto/api/api.js

@ -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, sendRvn } from './tradeRequest.js' export { tradeBotCreateRequest, tradeBotRespondRequest, signTradeBotTxn, deleteTradeOffer, sendBtc, sendLtc, sendDoge, sendDgb, sendRvn, sendArrr } from './tradeRequest.js'
export { cancelAllOffers } from './transactions/trade-portal/tradeoffer/cancelAllOffers.js' export { cancelAllOffers } from './transactions/trade-portal/tradeoffer/cancelAllOffers.js'

13
qortal-ui-crypto/api/bitcoin/AltcoinHDWallet.js

@ -276,6 +276,8 @@ export default class AltcoinHDWallet {
const privateKeyHash = seedHash.slice(0, 32); const privateKeyHash = seedHash.slice(0, 32);
this.seed58 = Base58.encode(privateKeyHash);
const _privateKeyHash = [...privateKeyHash] const _privateKeyHash = [...privateKeyHash]
let privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKeyHash); let privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKeyHash);
@ -687,8 +689,14 @@ export default class AltcoinHDWallet {
* Derive Litecoin Legacy Address * Derive Litecoin Legacy Address
*/ */
// Append Address Prefix // Append Address Prefix
const k = [this.versionBytes.mainnet.prefix].concat(...this.grandChildPublicKeyHash) let prefix = [this.versionBytes.mainnet.prefix]
if (2 == this.versionBytes.mainnet.prefix.length) {
prefix = [this.versionBytes.mainnet.prefix[0]]
prefix.push([this.versionBytes.mainnet.prefix[1]])
}
const k = prefix.concat(...this.grandChildPublicKeyHash)
// Derive Checksum // Derive Checksum
const _addressCheckSum = new Sha256().process(new Sha256().process(new Uint8Array(k)).finish().result).finish().result const _addressCheckSum = new Sha256().process(new Sha256().process(new Uint8Array(k)).finish().result).finish().result
@ -859,6 +867,7 @@ export default class AltcoinHDWallet {
derivedMasterPublicKey: this.masterPublicKey, derivedMasterPublicKey: this.masterPublicKey,
_tDerivedMasterPrivateKey: this._tMasterPrivateKey, _tDerivedMasterPrivateKey: this._tMasterPrivateKey,
_tDerivedmasterPublicKey: this._tmasterPublicKey, _tDerivedmasterPublicKey: this._tmasterPublicKey,
seed58: this.seed58,
// derivedPrivateChildKey: this.xPrivateChildKey, // derivedPrivateChildKey: this.xPrivateChildKey,
// derivedPublicChildKey: this.xPublicChildKey, // derivedPublicChildKey: this.xPublicChildKey,
// derivedPrivateGrandChildKey: this.xPrivateGrandChildKey, // derivedPrivateGrandChildKey: this.xPrivateGrandChildKey,

13
qortal-ui-crypto/api/tradeRequest.js

@ -130,3 +130,16 @@ export const sendRvn = (requestObject) => {
}) })
} }
// Send ARRR
export const sendArrr = (requestObject) => {
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node];
return request(`/crosschain/arrr/send?apiKey=${myNode.apiKey}`, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(requestObject)
})
}

111
qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js

@ -40,7 +40,8 @@ class TradePortal extends LitElement {
isLoadingHistoricTrades: { type: Boolean }, isLoadingHistoricTrades: { type: Boolean },
isLoadingOpenTrades: { type: Boolean }, isLoadingOpenTrades: { type: Boolean },
isLoadingMyOpenOrders: { type: Boolean }, isLoadingMyOpenOrders: { type: Boolean },
theme: { type: String, reflect: true } theme: { type: String, reflect: true },
arrrWalletAddress: { type: String },
} }
} }
@ -370,6 +371,10 @@ class TradePortal extends LitElement {
background-image: url('/img/qortrvn.png'); background-image: url('/img/qortrvn.png');
} }
.arrr.coinName:before {
background-image: url('/img/qortarrr.png');
}
.coinName { .coinName {
display: inline-block; display: inline-block;
height: 26px; height: 26px;
@ -519,13 +524,30 @@ class TradePortal extends LitElement {
tradeFee: "~0.006" tradeFee: "~0.006"
} }
let piratechain = {
name: "PIRATECHAIN",
balance: "0",
coinCode: "ARRR",
openOrders: [],
openFilteredOrders: [],
historicTrades: [],
myOrders: [],
myHistoricTrades: [],
myOfferingOrders: [],
openTradeOrders: null,
tradeOffersSocketCounter: 1,
coinAmount: this.amountString,
tradeFee: "~0.0002"
}
this.listedCoins = new Map() this.listedCoins = new Map()
this.listedCoins.set("QORTAL", qortal) this.listedCoins.set("QORTAL", qortal)
this.listedCoins.set("BITCOIN", bitcoin) this.listedCoins.set("BITCOIN", bitcoin)
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) this.listedCoins.set("RAVENCOIN", ravencoin)
this.listedCoins.set("PIRATECHAIN", piratechain)
workers.set("QORTAL", { workers.set("QORTAL", {
tradesConnectedWorker: null, tradesConnectedWorker: null,
@ -557,6 +579,11 @@ class TradePortal extends LitElement {
handleStuckTradesConnectedWorker: null handleStuckTradesConnectedWorker: null
}) })
workers.set("PIRATECHAIN", {
tradesConnectedWorker: null,
handleStuckTradesConnectedWorker: null
})
this.selectedCoin = "LITECOIN" this.selectedCoin = "LITECOIN"
this.selectedAddress = {} this.selectedAddress = {}
this.config = {} this.config = {}
@ -571,6 +598,7 @@ class TradePortal extends LitElement {
this.isLoadingOpenTrades = true this.isLoadingOpenTrades = true
this.isLoadingMyOpenOrders = false this.isLoadingMyOpenOrders = false
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
this.arrrWalletAddress = ''
} }
// TODO: Move each template to a separate components! Maybe // TODO: Move each template to a separate components! Maybe
@ -948,6 +976,7 @@ class TradePortal extends LitElement {
<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-list-item value="RAVENCOIN"><span class="coinName rvn" style="color: var(--black);">QORT / RVN</span></mwc-list-item>
<mwc-list-item value="PIRATECHAIN"><span class="coinName arrr" style="color: var(--black);">QORT / ARRR</span></mwc-list-item>
</mwc-select> </mwc-select>
</div> </div>
<div id="trade-portal"> <div id="trade-portal">
@ -988,6 +1017,7 @@ class TradePortal extends LitElement {
this.changeTheme() this.changeTheme()
this.changeLanguage() this.changeLanguage()
this.updateWalletBalance() this.updateWalletBalance()
this.fetchWalletAddress(this.selectedCoin)
setTimeout(() => { setTimeout(() => {
this.displayTabContent('buy') this.displayTabContent('buy')
@ -1122,6 +1152,10 @@ class TradePortal extends LitElement {
_url = `/crosschain/rvn/walletbalance?apiKey=${this.getApiKey()}` _url = `/crosschain/rvn/walletbalance?apiKey=${this.getApiKey()}`
_body = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey _body = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey
break break
case 'PIRATECHAIN':
_url = `/crosschain/arrr/walletbalance?apiKey=${this.getApiKey()}`
_body = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58
break
default: default:
break break
} }
@ -1141,6 +1175,26 @@ class TradePortal extends LitElement {
}) })
} }
async fetchWalletAddress(coin) {
console.log("fetchWalletAddress: " + coin)
switch (coin) {
case 'PIRATECHAIN':
let res = await parentEpml.request('apiCall', {
url: `/crosschain/arrr/walletaddress?apiKey=${this.getApiKey()}`,
method: 'POST',
body: `${window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58}`,
})
if (res != null && res.error != 1201) {
this.arrrWalletAddress = res
}
break
default:
// Not used for other coins yet
break
}
}
setForeignCoin(coin,beingInitialized) { setForeignCoin(coin,beingInitialized) {
let _this = this let _this = this
this.selectedCoin = coin this.selectedCoin = coin
@ -1174,6 +1228,7 @@ class TradePortal extends LitElement {
this.clearSellForm() this.clearSellForm()
this.clearBuyForm() this.clearBuyForm()
this.updateWalletBalance() this.updateWalletBalance()
this.fetchWalletAddress(coin)
} }
displayTabContent(tab) { displayTabContent(tab) {
@ -1628,6 +1683,49 @@ class TradePortal extends LitElement {
}) })
} }
/**
* PirateChainACCTv1 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 PirateChainACCTv1 = (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) { switch (this.selectedCoin) {
case 'BITCOIN': case 'BITCOIN':
BitcoinACCTv1(tradeStates) BitcoinACCTv1(tradeStates)
@ -1644,6 +1742,9 @@ class TradePortal extends LitElement {
case 'RAVENCOIN': case 'RAVENCOIN':
RavencoinACCTv1(tradeStates) RavencoinACCTv1(tradeStates)
break break
case 'PIRATECHAIN':
PirateChainACCTv1(tradeStates)
break
default: default:
break break
} }
@ -1942,6 +2043,9 @@ class TradePortal extends LitElement {
case 'RAVENCOIN': case 'RAVENCOIN':
_receivingAddress = this.selectedAddress.rvnWallet.address _receivingAddress = this.selectedAddress.rvnWallet.address
break break
case 'PIRATECHAIN':
_receivingAddress = this.arrrWalletAddress
break
default: default:
break break
} }
@ -2011,6 +2115,9 @@ class TradePortal extends LitElement {
case 'RAVENCOIN': case 'RAVENCOIN':
_foreignKey = this.selectedAddress.rvnWallet.derivedMasterPrivateKey _foreignKey = this.selectedAddress.rvnWallet.derivedMasterPrivateKey
break break
case 'PIRATECHAIN':
_foreignKey = this.selectedAddress.arrrWallet.seed58
break
default: default:
break break
} }

Loading…
Cancel
Save