Loading...
Loading...
This skill should be used when the user asks to "create a script template", "add a new template to ts-templates", "create a BitCom template", "build an OP_RETURN template", or mentions creating templates for protocols like SIGMA, AIP, MAP, BAP, B. Guides creation of @bsv/sdk ScriptTemplate implementations.
npx skill4agent add b-open-io/bsv-skills create-script-templateimport { ScriptTemplate, LockingScript, UnlockingScript, Script, Utils } from '@bsv/sdk'
import BitCom, { Protocol, BitComDecoded } from './BitCom.js'
export const PREFIX = 'PROTOCOL_ID'
export interface ProtocolData {
bitcomIndex?: number
// protocol-specific fields
valid?: boolean
}
export default class Protocol implements ScriptTemplate {
public readonly data: ProtocolData
constructor(data: ProtocolData) {
this.data = data
}
static decode(bitcom: BitComDecoded): Protocol[] { /* ... */ }
static sign(/* params */): Promise<Protocol> { /* ... */ }
lock(): LockingScript { /* ... */ }
unlock(): { sign: Function, estimateLength: Function } { /* ... */ }
verify(): boolean { /* ... */ }
}src/template/bitcom/ProtocolName.tsPREFIXProtocolDataScriptTemplatestatic decode(bitcom: BitComDecoded): Protocol[] {
const results: Protocol[] = []
for (const protocol of bitcom.protocols) {
if (protocol.protocol === PREFIX) {
const script = Script.fromBinary(protocol.script)
const chunks = script.chunks
// Extract fields from chunks using Utils.toUTF8(chunk.data)
}
}
return results
}lock(): LockingScript {
const script = new Script()
script.writeBin(Utils.toArray(field1, 'utf8'))
script.writeBin(Utils.toArray(field2, 'utf8'))
const protocols: Protocol[] = [{
protocol: PREFIX,
script: script.toBinary(),
pos: 0
}]
return new BitCom(protocols).lock()
}export { default as Protocol, PREFIX } from './src/template/bitcom/Protocol.js'
export type { ProtocolData, ProtocolOptions } from './src/template/bitcom/Protocol.js'git checkout -b feature/protocol-templatescript.chunksconst script = Script.fromBinary(protocol.script)
const chunks = script.chunks
const field1 = Utils.toUTF8(chunks[0].data ?? [])
const field2 = Utils.toUTF8(chunks[1].data ?? [])
const signature = Array.from(chunks[2].data ?? [])Utils.toArray(string, 'utf8')Utils.toUTF8(bytes)Utils.toHex(bytes)Utils.toBase64(bytes)for (let recovery = 0; recovery < 4; recovery++) {
try {
const publicKey = sig.RecoverPublicKey(
recovery,
new BigNumber(BSM.magicHash(message))
)
if (BSM.verify(message, sig, publicKey) &&
publicKey.toAddress().toString() === address) {
return true
}
} catch { /* try next */ }
}references/template-anatomy.mdreferences/pr-workflow.mdexamples/OpReturn.tsbitcom/Sigma.tsbitcom/AIP.tsbitcom/MAP.tsbitcom/BAP.tsbitcom/B.tsopreturn/OpReturn.ts