import type { PublicKey, ScriptElement} from "libnexa-ts"; import { Address, BNExtended, Hash, Opcode, Script, ScriptOpcode } from "libnexa-ts"; export function getVaultTemplate(): Script { return Script.empty() .add(Opcode.OP_FROMALTSTACK).add(Opcode.OP_DROP) .add(Opcode.OP_FROMALTSTACK).add(Opcode.OP_CHECKLOCKTIMEVERIFY).add(Opcode.OP_DROP) .add(Opcode.OP_FROMALTSTACK).add(Opcode.OP_CHECKSIGVERIFY); } export function getVaultTemplateHash(): Uint8Array { const template = getVaultTemplate(); return Hash.sha256ripemd160(template.toBuffer()); } export function generateVaultConstraint(pubKey: PublicKey): Script { return Script.empty().add(pubKey.toBuffer()); } export function getVaultConstraintHash(pubKey: PublicKey): Uint8Array { const constraint = generateVaultConstraint(pubKey); return Hash.sha256ripemd160(constraint.toBuffer()); } export function generateVaultVisibleArgs(args: number[]): ScriptElement[] { return args.map(arg => arg <= 16 ? ScriptOpcode.smallInt(arg) : BNExtended.fromNumber(arg).toScriptNumBuffer()); } export function generateVaultAddress(pubKey: PublicKey, args: number[]): string | undefined { if (args.length !== 2) { return undefined; } const templateHash = getVaultTemplateHash(); const constraintHash = getVaultConstraintHash(pubKey); const visibleArgs = generateVaultVisibleArgs(args); const address = Address.fromScriptTemplate(templateHash, constraintHash, visibleArgs); return address.toString(); }