@ledgerhq/coin-stacks
Version:
Ledger Stacks Coin integration
79 lines • 2.71 kB
JavaScript
import { log } from "@ledgerhq/logs";
import { bufferCV, deserializeCV, cvToJSON, someCV, noneCV, } from "@stacks/transactions";
/**
* Converts a memo string to a buffer Clarity Value for sending in transactions
*
* @param memo - The memo to convert
* @returns Clarity Value representing the memo (some(buffer) or none)
*/
export const memoToBufferCV = (memo) => {
if (memo === undefined || memo === null || memo === "") {
return noneCV();
}
return someCV(bufferCV(new Uint8Array(Buffer.from(String(memo)))));
};
/**
* Converts a hex string (from memo) to a readable string
*
* @param memoHex - Hex string representation of memo
* @returns Readable string or empty string if conversion fails
*/
export const hexMemoToString = (memoHex) => {
if (memoHex?.substring(0, 2) === "0x") {
try {
// eslint-disable-next-line no-control-regex
return Buffer.from(memoHex.substring(2), "hex").toString().replaceAll("\x00", "");
}
catch (e) {
log("error", "Failed to convert hex memo to string", e);
}
}
return "";
};
/**
* Converts a Clarity Value memo to readable string
* Used when processing incoming transactions
*
* @param memoJson - The memo Clarity Value from a transaction
* @returns Readable string or undefined if conversion fails
*/
export const bufferMemoToString = (memoJson) => {
// If memo is a buffer type, try to convert to string if it contains valid printable chars
if (memoJson?.type?.startsWith("(buff ") &&
typeof memoJson?.value === "string" &&
memoJson.value.startsWith("0x")) {
try {
const buffer = Buffer.from(memoJson.value.substring(2), "hex");
const str = buffer.toString();
// Check if string contains only printable characters
if (/^[\x20-\x7E]*$/.test(str)) {
return str;
}
}
catch (e) {
// Keep original memo value if conversion fails
log("error", "Failed to convert memo buffer to string", e);
}
}
return undefined;
};
/**
* Processes a memo CV hex string from a transaction
*
* @param memoHex - Hex string of serialized Clarity Value memo
* @returns Readable string or undefined if conversion fails
*/
export const processMemoCV = (memoHex) => {
if (!memoHex)
return undefined;
try {
const deserialized = deserializeCV(memoHex);
const memoJson = cvToJSON(deserialized).value;
return bufferMemoToString(memoJson);
}
catch (e) {
log("error", "Failed to process memo CV", e);
return undefined;
}
};
//# sourceMappingURL=memoUtils.js.map