From 61303c013e07fe37ed7e0f0590ed2f7cff4977a6 Mon Sep 17 00:00:00 2001 From: Gal Buki Date: Mon, 20 Jun 2022 07:58:23 +0300 Subject: [PATCH] add function to create safe data (op_false op_return) scripts --- functions/create-safedata-script.js | 19 ++++++++++++ functions/index.js | 1 + test/functions/create-safedata-script.js | 39 ++++++++++++++++++++++++ test/index.js | 1 + 4 files changed, 60 insertions(+) create mode 100644 functions/create-safedata-script.js create mode 100644 test/functions/create-safedata-script.js diff --git a/functions/create-safedata-script.js b/functions/create-safedata-script.js new file mode 100644 index 0000000..5973b48 --- /dev/null +++ b/functions/create-safedata-script.js @@ -0,0 +1,19 @@ +const BufferWriter = require('../classes/buffer-writer') +const writePushData = require('./write-push-data') + +function createSafeDataScript (data = []) { + const writer = new BufferWriter() + writer.write([0]) // OP_FALSE + writer.write([106]) // OP_RETURN + + try { + const datas = Array.isArray(data) ? data : [data]; + datas.forEach(data => writePushData(writer, new Buffer.from(data))) + } catch (err) { + throw new Error('invalid data ', err) + } + + return writer.toBuffer() +} + +module.exports = createSafeDataScript diff --git a/functions/index.js b/functions/index.js index 5b3ad1b..cae4c1e 100644 --- a/functions/index.js +++ b/functions/index.js @@ -6,6 +6,7 @@ module.exports = { calculateTxid: require('./calculate-txid'), createP2PKHLockScript: require('./create-p2pkh-lock-script'), createP2PKHUnlockScript: require('./create-p2pkh-unlock-script'), + createSafeDataScript: require('./create-safedata-script'), decodeAddress: require('./decode-address'), decodeASM: require('./decode-asm'), decodeBase58Check: require('./decode-base58-check'), diff --git a/test/functions/create-safedata-script.js b/test/functions/create-safedata-script.js new file mode 100644 index 0000000..b5b054d --- /dev/null +++ b/test/functions/create-safedata-script.js @@ -0,0 +1,39 @@ +const { describe, it } = require('mocha') +const { expect } = require('chai') +const nimble = require('../env/nimble') +const { createSafeDataScript } = nimble.functions +const bsv = require('bsv') + +describe('safe data script', () => { + it('script with no values', () => { + const data = [] + const emptyString = '' + const bsvScript = bsv.Script.buildSafeDataOut(data).toBuffer() + const bsvScript2 = bsv.Script.buildSafeDataOut(emptyString).toBuffer() + const nimbleScript = createSafeDataScript(data) + const nimbleScript2 = createSafeDataScript(emptyString) + const nimbleScript3 = createSafeDataScript() + expect(Array.from(bsvScript)).to.deep.equal(Array.from(nimbleScript)) + expect(Array.from(bsvScript2)).to.deep.equal(Array.from(nimbleScript2)) + expect(Array.from(bsvScript)).to.deep.equal(Array.from(nimbleScript3)) + }) + + it('script from single pushdata', () => { + const data = 'Nimble 42' + const bsvSCript = bsv.Script.buildSafeDataOut(data).toBuffer() + const nimbleScript = createSafeDataScript(data) + expect(Array.from(bsvSCript)).to.deep.equal(Array.from(nimbleScript)) + }) + + it('script from pushdata array', () => { + const data = ['Nimble', '42'] + const bsvSCript = bsv.Script.buildSafeDataOut(data).toBuffer() + const nimbleScript = createSafeDataScript(data) + expect(Array.from(bsvSCript)).to.deep.equal(Array.from(nimbleScript)) + }) + + it('throws if not valid data', () => { + const data = {} + expect(() => createSafeDataScript(data)).to.throw('invalid data') + }) +}) diff --git a/test/index.js b/test/index.js index 79014ce..edd292b 100644 --- a/test/index.js +++ b/test/index.js @@ -19,6 +19,7 @@ describe('functions', () => { require('./functions/calculate-txid') require('./functions/create-p2pkh-lock-script') require('./functions/create-p2pkh-unlock-script') + require('./functions/create-safedata-script') require('./functions/decode-address') require('./functions/decode-asm') require('./functions/decode-base64')