@algodex/algodex-sdk
Version:
API calls for interacting with the Algorand blockchain
66 lines (52 loc) • 2.17 kB
JavaScript
/*
* Copyright (C) 2021-2022 Algodex VASP (BVI) Corp.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
const {default: algosdk} = require('algosdk');
const {formatJsonRpcRequest} = require('@json-rpc-tools/utils');
const groupBy = require('../../utils/groupBy');
/**
* WalletConnectSigner
*
* @todo move to SDK
* @param {Array<Order>} orders A list of Compiled Orders
* @return {Promise<*>}
*/
async function signer(orders) {
const orderTxns = orders.map((execObj) => execObj.contract.txns);
orderTxns.forEach((outerTxns) => algosdk.assignGroupID(
outerTxns.map((txn) => txn.unsignedTxn),
));
const outerTxns = [];
let txNum = 0; // txNum has to be assigned outside nested loop in order to preserve total order
orderTxns.forEach((txns, groupNum) => {
txns.forEach((txn) => {
outerTxns.push({...txn, groupNum: groupNum, txNum: txNum});
txNum++;
});
});
const encodedTxns = outerTxns.map((txn) => {
const encodedTxn = Buffer.from(algosdk.encodeUnsignedTransaction(txn.unsignedTxn)).toString('base64');
if (algosdk.encodeAddress(txn.unsignedTxn.from.publicKey) !== this.accounts[0]) return {txn: encodedTxn, signers: []}; // naive solution assuming target address is first item in accountds array
return {txn: encodedTxn};
});
const request = formatJsonRpcRequest('algo_signTxn', [encodedTxns]);
const result = await this.sendCustomRequest(request);
const resultsFormatted = result.map((element, idx) => {
return element ? {
txID: encodedTxns[idx].txn,
blob: new Uint8Array(Buffer.from(element, 'base64')),
} : {
...algosdk.signLogicSigTransactionObject(outerTxns[idx].unsignedTxn, outerTxns[idx].lsig),
};
});
const outerTxnsWithResults = outerTxns.map((txn, i) => {
return {...txn, signedTxn: resultsFormatted[i]};
});
const signedTxnsObjGroupedByGroupNum = groupBy(outerTxnsWithResults, 'groupNum');
return Object.values(signedTxnsObjGroupedByGroupNum);
}
module.exports = signer;