@stellot/crypto
Version:
Crypto libraries for front and backend
46 lines (45 loc) • 1.74 kB
JavaScript
import { encrypt, decrypt } from './stellarBox';
import Long from 'long';
import { Memo, MemoID, MemoHash, MemoReturn, MemoText, } from 'stellar-sdk';
const padding = Buffer.alloc(8);
async function work(fn, sequenceNumber, keys, to, memo) {
if (!memo.value) {
throw new Error('Invalid memo value');
}
const seqNum = Long.fromString(sequenceNumber);
const nonce = Buffer.concat([
padding,
Buffer.from(seqNum.mul(2).toBytesBE())
]);
if (memo.type === MemoText) {
const data = Buffer.from(memo.value);
const res = await fn(keys, to, data, nonce, false);
const value = Buffer.from(res);
return new Memo(memo.type, value);
}
else if (memo.type === MemoID) {
const data = Buffer.from(Long.fromString(memo.value, true).toBytesBE());
const res = await fn(keys, to, data, nonce, false);
const value = Long.fromBytesBE(res, true).toString();
return new Memo(memo.type, value);
}
else if ((memo.type === MemoHash) || (memo.type === MemoReturn)) {
const data = memo.value;
const res = await fn(keys, to, data, nonce, false);
const value = Buffer.from(res);
return new Memo(memo.type, value);
}
else {
throw new Error('Invalid memo type');
}
}
export function encodeMemo(sequenceNumber, keys, to, memo) {
const sequence = Long.fromString(sequenceNumber).add(1).toString();
return work(encrypt, sequence, keys, to, memo);
}
export function decodeMemo(sequenceNumber, keys, from, memo) {
return work(decrypt, sequenceNumber, keys, from, memo);
}
export function decodeTransactionMemo(tx, keys) {
return work(decrypt, tx.sequence, keys, tx.source, tx.memo);
}