diff --git a/core/src/plugins/routes.js b/core/src/plugins/routes.js
index d50c95b2..6dd953fd 100644
--- a/core/src/plugins/routes.js
+++ b/core/src/plugins/routes.js
@@ -24,6 +24,7 @@ const signArbitraryTransaction = api.signArbitraryTransaction
const signArbitraryWithFeeTransaction = api.signArbitraryWithFeeTransaction
const tradeBotCreateRequest = api.tradeBotCreateRequest
const tradeBotRespondRequest = api.tradeBotRespondRequest
+const tradeBotRespondMultipleRequest = api.tradeBotRespondMultipleRequest
const signTradeBotTxn = api.signTradeBotTxn
const deleteTradeOffer = api.deleteTradeOffer
const cancelAllOffers = api.cancelAllOffers
@@ -396,6 +397,21 @@ export const routes = {
return response
},
+ tradeBotRespondMultipleRequest: async (req) => {
+ let response
+
+ try {
+ response = await tradeBotRespondMultipleRequest(req.data)
+ } catch (e) {
+ console.error(e)
+ console.error(e.message)
+
+ response = e.message
+ }
+
+ return response
+ },
+
deleteTradeOffer: async (req) => {
let response
diff --git a/core/src/tradebot/trade-bot-routes.js b/core/src/tradebot/trade-bot-routes.js
index de0a47f2..cb0c1d58 100644
--- a/core/src/tradebot/trade-bot-routes.js
+++ b/core/src/tradebot/trade-bot-routes.js
@@ -6,6 +6,7 @@ const createTransaction = api.createTransaction
const processTransaction = api.processTransaction
const tradeBotCreateRequest = api.tradeBotCreateRequest
const tradeBotRespondRequest = api.tradeBotRespondRequest
+const tradeBotRespondMultipleRequest = api.tradeBotRespondMultipleRequest
const signTradeBotTxn = api.signTradeBotTxn
const deleteTradeOffer = api.deleteTradeOffer
const cancelAllOffers = api.cancelAllOffers
@@ -163,6 +164,21 @@ export const routes = {
return response
},
+ tradeBotRespondMultipleRequest: async (req) => {
+ let response
+
+ try {
+ response = await tradeBotRespondMultipleRequest(req.data)
+ } catch (e) {
+ console.error(e)
+ console.error(e.message)
+
+ response = e.message
+ }
+
+ return response
+ },
+
deleteTradeOffer: async (req) => {
let response
diff --git a/crypto/api/api.js b/crypto/api/api.js
index 3c240b2e..f264bc85 100644
--- a/crypto/api/api.js
+++ b/crypto/api/api.js
@@ -1,5 +1,5 @@
export { request } from './fetch-request'
export { transactionTypes as transactions } from './transactions/transactions'
export { processTransaction, processTransactionVersion2, createTransaction, computeChatNonce, signChatTransaction, signArbitraryTransaction, signArbitraryWithFeeTransaction } from './createTransaction'
-export { tradeBotCreateRequest, tradeBotRespondRequest, signTradeBotTxn, deleteTradeOffer, sendBtc, sendLtc, sendDoge, sendDgb, sendRvn, sendArrr } from './tradeRequest'
+export { tradeBotCreateRequest, tradeBotRespondRequest, tradeBotRespondMultipleRequest, signTradeBotTxn, deleteTradeOffer, sendBtc, sendLtc, sendDoge, sendDgb, sendRvn, sendArrr } from './tradeRequest'
export { cancelAllOffers } from './transactions/trade-portal/tradeoffer/cancelAllOffers'
diff --git a/crypto/api/tradeRequest.js b/crypto/api/tradeRequest.js
index f95380b7..69420c38 100644
--- a/crypto/api/tradeRequest.js
+++ b/crypto/api/tradeRequest.js
@@ -4,6 +4,7 @@ import TradeBotRespondRequest from './transactions/trade-portal/tradebot/TradeBo
import signTradeBotTransaction from './transactions/trade-portal/tradebot/signTradeBotTransaction'
import DeleteTradeOffer from './transactions/trade-portal/tradeoffer/DeleteTradeOffer'
import { request } from './fetch-request'
+import TradeBotRespondMultipleRequest from "./transactions/trade-portal/tradebot/TradeBotRespondMultipleRequest";
// TradeBotCreateRequest
export const tradeBotCreateRequest = (requestObject) => {
@@ -35,6 +36,21 @@ export const tradeBotRespondRequest = (requestObject) => {
})
}
+// TradeBotRespondRequest
+export const tradeBotRespondMultipleRequest = (requestObject) => {
+ const txn = new TradeBotRespondMultipleRequest().createTransaction(requestObject)
+ const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
+
+ return request(`/crosschain/tradebot/respondmultiple?apiKey=${myNode.apiKey}`, {
+ method: 'POST',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify(txn)
+ })
+}
+
// Sign Trade Transactions
export const signTradeBotTxn = (unsignedTxn, keyPair) => {
return signTradeBotTransaction(unsignedTxn, keyPair)
diff --git a/crypto/api/transactions/trade-portal/tradebot/TradeBotRespondMultipleRequest.js b/crypto/api/transactions/trade-portal/tradebot/TradeBotRespondMultipleRequest.js
new file mode 100644
index 00000000..5dcc2e40
--- /dev/null
+++ b/crypto/api/transactions/trade-portal/tradebot/TradeBotRespondMultipleRequest.js
@@ -0,0 +1,39 @@
+/**
+ * CrossChain - TradeBot Respond Multiple Request (Buy Action)
+ *
+ * These are special types of transactions (JSON ENCODED)
+ */
+
+export default class TradeBotRespondMultipleRequest {
+ constructor() {
+ // ...
+ }
+
+ createTransaction(txnReq) {
+ this.addresses(txnReq.addresses)
+ this.foreignKey(txnReq.foreignKey)
+ this.receivingAddress(txnReq.receivingAddress)
+
+ return this.txnRequest()
+ }
+
+ addresses(addresses) {
+ this._addresses = addresses
+ }
+
+ foreignKey(foreignKey) {
+ this._foreignKey = foreignKey
+ }
+
+ receivingAddress(receivingAddress) {
+ this._receivingAddress = receivingAddress
+ }
+
+ txnRequest() {
+ return {
+ addresses: this._addresses,
+ foreignKey: this._foreignKey,
+ receivingAddress: this._receivingAddress
+ }
+ }
+}
diff --git a/plugins/plugins/core/trade-portal/trade-portal.src.js b/plugins/plugins/core/trade-portal/trade-portal.src.js
index d122b0df..f42d3ab3 100644
--- a/plugins/plugins/core/trade-portal/trade-portal.src.js
+++ b/plugins/plugins/core/trade-portal/trade-portal.src.js
@@ -30,6 +30,7 @@ import '@polymer/paper-spinner/paper-spinner-lite.js'
import '@vaadin/grid'
import '@vaadin/grid/vaadin-grid-sorter'
import '@vaadin/password-field'
+import '@vaadin/grid/vaadin-grid-selection-column.js'
// Multi language support
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
@@ -498,6 +499,10 @@ class TradePortal extends LitElement {
this._openOrdersGrid = this.shadowRoot.getElementById('openOrdersGrid')
+ this._openOrdersGrid.addEventListener("selected-items-changed", function(event){
+ _this.fillBuyFormMultiple(event.detail.value);
+ });
+
this._openOrdersGrid.querySelector('#priceColumn').headerRenderer = function (root) {
const priceString = get("tradepage.tchange9")
root.innerHTML = '' + priceString + ' (' + _this.listedCoins.get(_this.selectedCoin).coinCode + ')'
@@ -733,6 +738,25 @@ class TradePortal extends LitElement {
`
}
+ coinGridSelection() {
+
+ if(this.selectedCoin == 'PIRATECHAIN') {
+ return html``
+ }
+ else {
+ return html`
+
+ `
+ }
+ }
+
+ clickHandler(data) {
+
+ if(this.selectedCoin == 'PIRATECHAIN') {
+ this.fillBuyFormSingle(data)
+ }
+ }
+
openTradesTemplate() {
return html`
@@ -751,13 +775,14 @@ class TradePortal extends LitElement {
aria-label="Open Orders"
.items="${this.listedCoins.get(this.selectedCoin).openFilteredOrders}"
>
+ ${this.coinGridSelection()}
{
- render(html` this.fillBuyForm(data)}">${this.round(data.item.qortAmount)}`, root)
+ render(html` this.clickHandler(data)}">${this.round(data.item.qortAmount)}`, root)
}}
>
@@ -767,7 +792,7 @@ class TradePortal extends LitElement {
header="${translate("tradepage.tchange9")} (${this.listedCoins.get(this.selectedCoin).coinCode})"
id="priceColumn"
.renderer=${(root, column, data) => {
- render(html` this.fillBuyForm(data)}">${this.round(data.item.price)}`, root)
+ render(html` this.clickHandler(data)}">${this.round(data.item.price)}`, root)
}}
>
@@ -777,7 +802,7 @@ class TradePortal extends LitElement {
header="${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})"
id="foreignAmountColumn"
.renderer=${(root, column, data) => {
- render(html` this.fillBuyForm(data)}">${data.item.foreignAmount}`, root)
+ render(html` this.clickHandler(data)}">${data.item.foreignAmount}`, root)
}}
>
@@ -787,7 +812,7 @@ class TradePortal extends LitElement {
header="${translate("tradepage.tchange13")}"
id="qortalCreatorColumn"
.renderer=${(root, column, data) => {
- render(html` this.fillBuyForm(data)}">${data.item.qortalCreator}`, root)
+ render(html` this.clickHandler(data)}">${data.item.qortalCreator}`, root)
}}
>
@@ -1546,19 +1571,52 @@ class TradePortal extends LitElement {
this.isLoadingOpenTrades = false
}
+ reSelectOpenOrders() {
+ const qortalATAddressesString = this.shadowRoot.getElementById('qortalAtAddress').value;
+ const qortalATAddresses = qortalATAddressesString.split(',');
+ const itemsToSelect = this.tradesPresenceCleaned.filter((order) => qortalATAddresses.includes(order.qortalAtAddress));
+ this._openOrdersGrid.selectedItems = [...itemsToSelect];
+ this.fillBuyFormMultiple(itemsToSelect);
+ }
+
async reRenderMyOpenOrders() {
this.requestUpdate()
await this.updateComplete
this.isLoadingMyOpenOrders = false
}
- fillBuyForm(sellerRequest) {
+ fillBuyFormSingle(sellerRequest) {
this.shadowRoot.getElementById('buyAmountInput').value = parseFloat(sellerRequest.item.qortAmount)
this.shadowRoot.getElementById('buyPriceInput').value = this.round(parseFloat(sellerRequest.item.foreignAmount) / parseFloat(sellerRequest.item.qortAmount))
this.shadowRoot.getElementById('buyTotalInput').value = parseFloat(sellerRequest.item.foreignAmount)
this.shadowRoot.getElementById('qortalAtAddress').value = sellerRequest.item.qortalAtAddress
const buyFunds = this.round(parseFloat(sellerRequest.item.foreignAmount))
+ this.fillBuyForm(buyFunds)
+ }
+
+ fillBuyFormMultiple(sellerRequests) {
+ let qortalATAddresses = [];
+ let qortAmount = 0;
+ let foreignAmount = 0;
+
+ sellerRequests.forEach((item, index) => {
+ qortalATAddresses.push(item.qortalAtAddress);
+ qortAmount += parseFloat(item.qortAmount);
+ foreignAmount += parseFloat(item.foreignAmount);
+ })
+
+ this.shadowRoot.getElementById('buyAmountInput').value = qortAmount
+ this.shadowRoot.getElementById('buyPriceInput').value = qortAmount > 0 ? this.round(foreignAmount / qortAmount) : 0
+ this.shadowRoot.getElementById('buyTotalInput').value = foreignAmount
+ this.shadowRoot.getElementById('qortalAtAddress').value = qortalATAddresses
+
+ const buyFunds = this.round(foreignAmount)
+ this.fillBuyForm(buyFunds)
+ }
+
+ fillBuyForm(buyFunds) {
const haveFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance))
+
if (Number(haveFunds) > Number(buyFunds)) {
this.buyBtnDisable = false
this.autoBuyWarning = false
@@ -1568,7 +1626,6 @@ class TradePortal extends LitElement {
this.autoBuyWarning = true
this.displayTabContent('buy')
}
-
}
processOfferingTrade(offer) {
@@ -2330,11 +2387,21 @@ class TradePortal extends LitElement {
}
const makeRequest = async () => {
- return await parentEpml.request('tradeBotRespondRequest', {
- atAddress: qortalAtAddress,
- foreignKey: _foreignKey,
- receivingAddress: this.selectedAddress.address
- })
+
+ if( this.selectedCoin == 'PIRATECHAIN') {
+ return await parentEpml.request('tradeBotRespondRequest', {
+ atAddress: qortalAtAddress,
+ foreignKey: _foreignKey,
+ receivingAddress: this.selectedAddress.address
+ })
+ }
+ else {
+ return await parentEpml.request('tradeBotRespondMultipleRequest', {
+ addresses: qortalAtAddress.split(','),
+ foreignKey: _foreignKey,
+ receivingAddress: this.selectedAddress.address
+ })
+ }
}
const manageResponse = (response) => {
@@ -2648,6 +2715,9 @@ class TradePortal extends LitElement {
filterPresenceList()
this.listedCoins.get(message.data.relatedCoin).openFilteredOrders = this.tradesPresenceCleaned
this.reRenderOpenFilteredOrders()
+ if( this.selectedCoin != 'PIRATECHAIN') {
+ this.reSelectOpenOrders()
+ }
return null
default:
break
@@ -2836,4 +2906,4 @@ class TradePortal extends LitElement {
}
}
-window.customElements.define('trade-portal', TradePortal)
\ No newline at end of file
+window.customElements.define('trade-portal', TradePortal)
diff --git a/plugins/plugins/core/wallet/wallet-app.src.js b/plugins/plugins/core/wallet/wallet-app.src.js
index d2fc024f..c3a53588 100644
--- a/plugins/plugins/core/wallet/wallet-app.src.js
+++ b/plugins/plugins/core/wallet/wallet-app.src.js
@@ -2311,7 +2311,7 @@ class MultiWallet extends LitElement {
${translate("walletpage.wchange6")} :
this.myTabChanged(0)}>PAYMENT
- this.myTabChanged(1)}>ARBITARY
+ this.myTabChanged(1)}>ARBITRARY
this.myTabChanged(2)}>AT
this.myTabChanged(3)}>GROUP
this.myTabChanged(4)}>NAME
@@ -4250,7 +4250,7 @@ class MultiWallet extends LitElement {
this.shadowRoot.getElementById('type').selected = false
this.shadowRoot.getElementById('payment-tab').selected = true
- this.shadowRoot.getElementById('arbitary-tab').selected = false
+ this.shadowRoot.getElementById('arbitrary-tab').selected = false
this.shadowRoot.getElementById('at-tab').selected = false
this.shadowRoot.getElementById('group-tab').selected = false
this.shadowRoot.getElementById('name-tab').selected = false
@@ -4339,14 +4339,14 @@ class MultiWallet extends LitElement {
&txType=PAYMENT
`
})
- const arbitaryTxsQort = await parentEpml.request('apiCall', {
+ const arbitraryTxsQort = await parentEpml.request('apiCall', {
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
&limit=${this.searchLimit}
&offset=${this.searchOffset}
&txType=ARBITRARY
`
})
- const pendingArbitaryTxsQort = await parentEpml.request('apiCall', {
+ const pendingArbitraryTxsQort = await parentEpml.request('apiCall', {
url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true
&limit=${this.searchLimit}
&offset=${this.searchOffset}
@@ -4503,7 +4503,7 @@ class MultiWallet extends LitElement {
if (this.visitedTab === 0) {
this.wallets.get(coin).transactions = pendingPaymentTxsQort.concat(paymentTxsQort)
} else if (this.visitedTab === 1) {
- this.wallets.get(coin).transactions = pendingArbitaryTxsQort.concat(arbitaryTxsQort)
+ this.wallets.get(coin).transactions = pendingArbitraryTxsQort.concat(arbitraryTxsQort)
} else if (this.visitedTab === 2) {
this.wallets.get(coin).transactions = pendingAtTxsQort.concat(atTxsQort)
} else if (this.visitedTab === 3) {