diff --git a/qortal-ui-crypto/api/api.js b/qortal-ui-crypto/api/api.js index bcc5d8b8..3fc50db4 100644 --- a/qortal-ui-crypto/api/api.js +++ b/qortal-ui-crypto/api/api.js @@ -2,7 +2,7 @@ export { request } from './fetch-request.js' export { transactionTypes as transactions } from './transactions/transactions.js' -export { processTransaction, createTransaction, computeChatNonce, signChatTransaction } from './createTransaction.js' +export { processTransaction, createTransaction, computeChatNonce, signChatTransaction, signArbitraryTransaction } from './createTransaction.js' export { tradeBotCreateRequest, tradeBotRespondRequest, signTradeBotTxn, deleteTradeOffer, sendBtc, sendLtc, sendDoge } from './tradeRequest.js' diff --git a/qortal-ui-crypto/api/createTransaction.js b/qortal-ui-crypto/api/createTransaction.js index 3481f121..d876b98a 100644 --- a/qortal-ui-crypto/api/createTransaction.js +++ b/qortal-ui-crypto/api/createTransaction.js @@ -2,6 +2,7 @@ import { transactionTypes as transactions } from './transactions/transactions.js import Base58 from './deps/Base58.js' import { request } from './fetch-request' import signChat from './transactions/chat/signChat.js' +import signArbitrary from './transactions/arbitrary/signArbitrary.js' export const createTransaction = (type, keyPair, params) => { @@ -25,6 +26,11 @@ export const signChatTransaction = (chatBytes, nonce, keyPair) => { return signChat(chatBytes, nonce, keyPair) } +// Sign Arbitrary Transactions +export const signArbitraryTransaction = (arbitraryBytesBase58, arbitraryBytesForSigningBase58, nonce, keyPair) => { + return signArbitrary(arbitraryBytesBase58, arbitraryBytesForSigningBase58, nonce, keyPair) +} + // Process Transactions export const processTransaction = bytes => request('/transactions/process', { method: 'POST', diff --git a/qortal-ui-crypto/api/tradeRequest.js b/qortal-ui-crypto/api/tradeRequest.js index 18ec53a4..8eab79a6 100644 --- a/qortal-ui-crypto/api/tradeRequest.js +++ b/qortal-ui-crypto/api/tradeRequest.js @@ -12,8 +12,9 @@ import { request } from './fetch-request' // TradeBotCreateRequest export const tradeBotCreateRequest = (requestObject) => { const txn = new TradeBotCreateRequest().createTransaction(requestObject) + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; - return request('/crosschain/tradebot/create', { + return request(`/crosschain/tradebot/create?apiKey=${myNode.apiKey}`, { method: 'POST', headers: { 'Accept': 'text/plain', @@ -26,8 +27,9 @@ export const tradeBotCreateRequest = (requestObject) => { // TradeBotRespondRequest export const tradeBotRespondRequest = (requestObject) => { const txn = new TradeBotRespondRequest().createTransaction(requestObject) + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; - return request('/crosschain/tradebot/respond', { + return request(`/crosschain/tradebot/respond?apiKey=${myNode.apiKey}`, { method: 'POST', headers: { 'Accept': 'application/json', @@ -46,8 +48,9 @@ export const signTradeBotTxn = (unsignedTxn, keyPair) => { // Delete Trade Offer export const deleteTradeOffer = (requestObject) => { const txn = new DeleteTradeOffer().createTransaction(requestObject) + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; - return request('/crosschain/tradeoffer', { + return request(`/crosschain/tradeoffer?apiKey=${myNode.apiKey}`, { method: 'DELETE', headers: { 'Accept': 'application/json', @@ -59,8 +62,9 @@ export const deleteTradeOffer = (requestObject) => { // Send BTC export const sendBtc = (requestObject) => { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; - return request('/crosschain/btc/send', { + return request(`/crosschain/btc/send?apiKey=${myNode.apiKey}`, { method: 'POST', headers: { 'Accept': 'application/json', @@ -72,8 +76,9 @@ export const sendBtc = (requestObject) => { // Send LTC export const sendLtc = (requestObject) => { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; - return request('/crosschain/ltc/send', { + return request(`/crosschain/ltc/send?apiKey=${myNode.apiKey}`, { method: 'POST', headers: { 'Accept': 'application/json', @@ -85,8 +90,9 @@ export const sendLtc = (requestObject) => { // Send DOGE export const sendDoge = (requestObject) => { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; - return request('/crosschain/doge/send', { + return request(`/crosschain/doge/send?apiKey=${myNode.apiKey}`, { method: 'POST', headers: { 'Accept': 'application/json', diff --git a/qortal-ui-crypto/api/transactions/arbitrary/signArbitrary.js b/qortal-ui-crypto/api/transactions/arbitrary/signArbitrary.js new file mode 100644 index 00000000..47f37f81 --- /dev/null +++ b/qortal-ui-crypto/api/transactions/arbitrary/signArbitrary.js @@ -0,0 +1,39 @@ +import nacl from '../../deps/nacl-fast.js' +import utils from '../../deps/utils.js' +import Base58 from '../../deps/Base58.js' + + +const signArbitrary = (arbitraryBytesBase58, arbitraryBytesForSigningBase58, nonce, keyPair) => { + + if (!arbitraryBytesBase58) { + throw new Error('ArbitraryBytesBase58 not defined') + } + + if (!nonce) { + throw new Error('Nonce not defined') + } + + if (!keyPair) { + throw new Error('keyPair not defined') + } + + const arbitraryBytes = Base58.decode(arbitraryBytesBase58) + const _arbitraryBytesBuffer = Object.keys(arbitraryBytes).map(function (key) { return arbitraryBytes[key]; }); + const arbitraryBytesBuffer = new Uint8Array(_arbitraryBytesBuffer) + + const arbitraryBytesForSigning = Base58.decode(arbitraryBytesForSigningBase58) + const _arbitraryBytesForSigningBuffer = Object.keys(arbitraryBytesForSigning).map(function (key) { return arbitraryBytesForSigning[key]; }); + const arbitraryBytesForSigningBuffer = new Uint8Array(_arbitraryBytesForSigningBuffer) + + const _nonce = utils.int32ToBytes(nonce) + arbitraryBytesBuffer.set(_nonce, 112) + arbitraryBytesForSigningBuffer.set(_nonce, 112) + + const signature = nacl.sign.detached(arbitraryBytesForSigningBuffer, keyPair.privateKey) + + const signedBytes = utils.appendBuffer(arbitraryBytesBuffer, signature) + + return signedBytes +} + +export default signArbitrary