UNPKG

@stellot/crypto

Version:

Crypto libraries for front and backend

46 lines (45 loc) 1.74 kB
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); }