@ledgerhq/coin-algorand
Version:
Ledger Algorand Coin integration
64 lines • 2.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.encodeToBroadcast = exports.encodeToSign = exports.buildTransactionPayload = void 0;
const algosdk_1 = require("algosdk");
const network_1 = require("./network");
const tokens_1 = require("./tokens");
const buildTransactionPayload = async (account, transaction) => {
const { amount, recipient, mode, memo, assetId, subAccountId } = transaction;
const subAccount = subAccountId
? account.subAccounts && account.subAccounts.find(t => t.id === subAccountId)
: null;
const note = memo ? new TextEncoder().encode(memo) : undefined;
const params = await (0, network_1.getTransactionParams)();
const suggestedParams = {
...params,
firstValid: params.lastRound,
lastValid: params.lastRound + 1000,
genesisHash: (0, algosdk_1.base64ToBytes)(params.genesisHash),
};
if (subAccount || (assetId && mode === "optIn")) {
const targetAssetId = subAccount && subAccount.type === "TokenAccount"
? (0, tokens_1.extractTokenId)(subAccount.token.id)
: assetId
? (0, tokens_1.extractTokenId)(assetId)
: "";
if (!targetAssetId) {
throw new Error("Token Asset Id not found");
}
return (0, algosdk_1.makeAssetTransferTxnWithSuggestedParamsFromObject)({
sender: account.freshAddress,
receiver: recipient,
amount: amount.toNumber(),
assetIndex: Number(targetAssetId),
suggestedParams,
...(note ? { note } : {}),
});
}
return (0, algosdk_1.makePaymentTxnWithSuggestedParamsFromObject)({
sender: account.freshAddress,
receiver: recipient,
amount: amount.toNumber(),
suggestedParams,
...(note ? { note } : {}),
});
};
exports.buildTransactionPayload = buildTransactionPayload;
const encodeToSign = (payload) => {
const msgPackEncoded = (0, algosdk_1.encodeMsgpack)(payload);
return Buffer.from(msgPackEncoded).toString("hex");
};
exports.encodeToSign = encodeToSign;
const encodeToBroadcast = (payload, signature) => {
// App Algorand returns 66 bytes signatures, including the status word
// ED25519 signature length is exactly 64 bytes
const ED25519_SIGNATURE_LENGTH = 64;
const signedPayload = new algosdk_1.SignedTransaction({
sig: signature.subarray(0, ED25519_SIGNATURE_LENGTH),
txn: payload,
});
const msgPackEncoded = (0, algosdk_1.encodeMsgpack)(signedPayload);
return Buffer.from(msgPackEncoded);
};
exports.encodeToBroadcast = encodeToBroadcast;
//# sourceMappingURL=buildTransaction.js.map