@smartledger/bsv 5.5.0 → 5.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/.mocharc.json +5 -0
  2. package/CHANGELOG.md +40 -0
  3. package/README.md +38 -38
  4. package/bsv-covenant.min.js +2 -2
  5. package/bsv-gdaf.min.js +2 -2
  6. package/bsv-ltp.min.js +2 -2
  7. package/bsv-smartcontract.min.js +2 -2
  8. package/bsv.bundle.js +2 -2
  9. package/bsv.min.js +2 -2
  10. package/docs/MODULE_REFERENCE_COMPLETE.md +27 -27
  11. package/docs/advanced/UTXO_MANAGER_GUIDE.md +1 -1
  12. package/docs/getting-started/INSTALLATION.md +23 -23
  13. package/docs/getting-started/QUICK_START.md +7 -7
  14. package/docs/migration/FROM_BSV_1_5_6.md +5 -5
  15. package/lib/smart_contract/covenant_helpers.js +3 -3
  16. package/lib/smart_contract/index.js +4 -5
  17. package/package.json +5 -1
  18. package/test/address.js +629 -0
  19. package/test/block/block.js +239 -0
  20. package/test/block/blockheader.js +270 -0
  21. package/test/block/merkleblock.js +207 -0
  22. package/test/cli/smoke.js +261 -0
  23. package/test/credentials-test.js +329 -0
  24. package/test/crypto/bn.js +168 -0
  25. package/test/crypto/ecdsa.js +328 -0
  26. package/test/crypto/elliptic-fixed.js +61 -0
  27. package/test/crypto/hash.browser.js +121 -0
  28. package/test/crypto/hash.js +122 -0
  29. package/test/crypto/point.js +193 -0
  30. package/test/crypto/random.js +32 -0
  31. package/test/crypto/security.js +127 -0
  32. package/test/crypto/shamir.js +169 -0
  33. package/test/crypto/signature.js +318 -0
  34. package/test/data/bip69.json +215 -0
  35. package/test/data/bitcoind/base58_keys_invalid.json +152 -0
  36. package/test/data/bitcoind/base58_keys_valid.json +452 -0
  37. package/test/data/bitcoind/blocks.json +27 -0
  38. package/test/data/bitcoind/script_tests.json +2244 -0
  39. package/test/data/bitcoind/sig_canonical.json +7 -0
  40. package/test/data/bitcoind/sig_noncanonical.json +22 -0
  41. package/test/data/bitcoind/tx_invalid.json +177 -0
  42. package/test/data/bitcoind/tx_valid.json +224 -0
  43. package/test/data/blk86756-testnet.dat +0 -0
  44. package/test/data/blk86756-testnet.js +12 -0
  45. package/test/data/blk86756-testnet.json +684 -0
  46. package/test/data/ecdsa.json +230 -0
  47. package/test/data/merkleblocks.js +486 -0
  48. package/test/data/messages.json +22 -0
  49. package/test/data/sighash.json +1004 -0
  50. package/test/data/tx_creation.json +85 -0
  51. package/test/ecies/bitcore-ecies.js +170 -0
  52. package/test/ecies/electrum-ecies.js +206 -0
  53. package/test/encoding/base58.js +131 -0
  54. package/test/encoding/base58check.js +136 -0
  55. package/test/encoding/bufferreader.js +328 -0
  56. package/test/encoding/bufferwriter.js +160 -0
  57. package/test/encoding/varint.js +104 -0
  58. package/test/gdaf/canonicalize.js +140 -0
  59. package/test/hdkeys.js +365 -0
  60. package/test/hdprivatekey.js +330 -0
  61. package/test/hdpublickey.js +293 -0
  62. package/test/index.js +16 -0
  63. package/test/ltp/right.js +198 -0
  64. package/test/message/message.js +190 -0
  65. package/test/mnemonic/data/fixtures.json +300 -0
  66. package/test/mnemonic/mnemonic.js +245 -0
  67. package/test/mnemonic/mocha.opts +1 -0
  68. package/test/mnemonic/pbkdf2.test.js +43 -0
  69. package/test/networks.js +162 -0
  70. package/test/opcode.js +161 -0
  71. package/test/privatekey.js +430 -0
  72. package/test/publickey.js +411 -0
  73. package/test/script/genesis_limits.js +80 -0
  74. package/test/script/interpreter.js +723 -0
  75. package/test/script/script.js +1256 -0
  76. package/test/script/string_ops.js +72 -0
  77. package/test/smart_contract/covenants.js +247 -0
  78. package/test/smart_contract/dsl_debugger.js +103 -0
  79. package/test/smart_contract/token_generalized.js +187 -0
  80. package/test/transaction/deserialize.js +33 -0
  81. package/test/transaction/input/input.js +92 -0
  82. package/test/transaction/input/multisig.js +174 -0
  83. package/test/transaction/input/multisigscripthash.js +111 -0
  84. package/test/transaction/input/publickey.js +68 -0
  85. package/test/transaction/input/publickeyhash.js +59 -0
  86. package/test/transaction/output.js +185 -0
  87. package/test/transaction/sighash.js +71 -0
  88. package/test/transaction/signature.js +127 -0
  89. package/test/transaction/transaction.js +1299 -0
  90. package/test/transaction/unspentoutput.js +92 -0
  91. package/test/util/js.js +76 -0
  92. package/test/util/preconditions.js +79 -0
  93. package/test/vcjwt/interop.js +126 -0
@@ -0,0 +1,318 @@
1
+ 'use strict'
2
+
3
+ var _ = require('../../lib/util/_')
4
+ var should = require('chai').should()
5
+ var bsv = require('../..')
6
+ var BN = bsv.crypto.BN
7
+ var Signature = bsv.crypto.Signature
8
+ var JSUtil = bsv.util.js
9
+ var Interpreter = bsv.Script.Interpreter
10
+
11
+ var sigCanonical = require('../data/bitcoind/sig_canonical')
12
+ var sigNonCanonical = require('../data/bitcoind/sig_noncanonical')
13
+
14
+ describe('Signature', function () {
15
+ it('should make a blank signature', function () {
16
+ var sig = new Signature()
17
+ should.exist(sig)
18
+ })
19
+
20
+ it('should work with conveniently setting r, s', function () {
21
+ var r = new BN()
22
+ var s = new BN()
23
+ var sig = new Signature(r, s)
24
+ should.exist(sig)
25
+ sig.r.toString().should.equal(r.toString())
26
+ sig.s.toString().should.equal(s.toString())
27
+ })
28
+
29
+ describe('#set', function () {
30
+ it('should set compressed', function () {
31
+ should.exist(Signature().set({
32
+ compressed: true
33
+ }))
34
+ })
35
+
36
+ it('should set nhashtype', function () {
37
+ var sig = Signature().set({
38
+ nhashtype: Signature.SIGHASH_ALL
39
+ })
40
+ sig.nhashtype.should.equal(Signature.SIGHASH_ALL)
41
+ sig.set({
42
+ nhashtype: Signature.SIGHASH_ALL | Signature.SIGHASH_ANYONECANPAY
43
+ })
44
+ sig.nhashtype.should.equal(Signature.SIGHASH_ALL | Signature.SIGHASH_ANYONECANPAY)
45
+ })
46
+ })
47
+
48
+ describe('#fromCompact', function () {
49
+ it('should create a signature from a compressed signature', function () {
50
+ var blank = Buffer.alloc(32)
51
+ blank.fill(0)
52
+ var compressed = Buffer.concat([
53
+ Buffer.from([0 + 27 + 4]),
54
+ blank,
55
+ blank
56
+ ])
57
+ var sig = Signature.fromCompact(compressed)
58
+ sig.r.cmp(BN.Zero).should.equal(0)
59
+ sig.s.cmp(BN.Zero).should.equal(0)
60
+ sig.compressed.should.equal(true)
61
+ })
62
+
63
+ it('should create a signature from an uncompressed signature', function () {
64
+ var sigHexaStr = '1cd5e61ab5bfd0d1450997894cb1a53e917f89d82eb43f06fa96f32c96e061aec12fc1188e8b' +
65
+ '0dc553a2588be2b5b68dbbd7f092894aa3397786e9c769c5348dc6'
66
+ var sig = Signature.fromCompact(Buffer.from(sigHexaStr, 'hex'))
67
+ var r = 'd5e61ab5bfd0d1450997894cb1a53e917f89d82eb43f06fa96f32c96e061aec1'
68
+ var s = '2fc1188e8b0dc553a2588be2b5b68dbbd7f092894aa3397786e9c769c5348dc6'
69
+ sig.r.toString('hex').should.equal(r)
70
+ sig.s.toString('hex').should.equal(s)
71
+ sig.compressed.should.equal(false)
72
+ })
73
+ })
74
+
75
+ describe('#fromDER', function () {
76
+ var buf = Buffer.from('3044022075fc517e541bd54769c080b64397e32161c850f6c1b2b67a5c433affbb3e62770220729e85cc46ffab881065ec07694220e71d4df9b2b8c8fd12c3122cf3a5efbcf2', 'hex')
77
+
78
+ it('should parse this DER format signature', function () {
79
+ var sig = Signature.fromDER(buf)
80
+ sig.r.toBuffer({
81
+ size: 32
82
+ }).toString('hex').should.equal('75fc517e541bd54769c080b64397e32161c850f6c1b2b67a5c433affbb3e6277')
83
+ sig.s.toBuffer({
84
+ size: 32
85
+ }).toString('hex').should.equal('729e85cc46ffab881065ec07694220e71d4df9b2b8c8fd12c3122cf3a5efbcf2')
86
+ })
87
+ })
88
+
89
+ describe('#fromString', function () {
90
+ var buf = Buffer.from('3044022075fc517e541bd54769c080b64397e32161c850f6c1b2b67a5c433affbb3e62770220729e85cc46ffab881065ec07694220e71d4df9b2b8c8fd12c3122cf3a5efbcf2', 'hex')
91
+
92
+ it('should parse this DER format signature in hex', function () {
93
+ var sig = Signature.fromString(buf.toString('hex'))
94
+ sig.r.toBuffer({
95
+ size: 32
96
+ }).toString('hex').should.equal('75fc517e541bd54769c080b64397e32161c850f6c1b2b67a5c433affbb3e6277')
97
+ sig.s.toBuffer({
98
+ size: 32
99
+ }).toString('hex').should.equal('729e85cc46ffab881065ec07694220e71d4df9b2b8c8fd12c3122cf3a5efbcf2')
100
+ })
101
+ })
102
+
103
+ describe('#toTxFormat', function () {
104
+ it('should parse this known signature and rebuild it with updated zero-padded sighash types', function () {
105
+ var original = '30450221008bab1f0a2ff2f9cb8992173d8ad73c229d31ea8e10b0f4d4ae1a0d8ed76021fa02200993a6ec81755b9111762fc2cf8e3ede73047515622792110867d12654275e7201'
106
+ var buf = Buffer.from(original, 'hex')
107
+ var sig = Signature.fromTxFormat(buf)
108
+ sig.nhashtype.should.equal(Signature.SIGHASH_ALL)
109
+ sig.set({
110
+ nhashtype: Signature.SIGHASH_ALL | Signature.SIGHASH_ANYONECANPAY
111
+ })
112
+ sig.toTxFormat().toString('hex').should.equal(original.slice(0, -2) + '81')
113
+ sig.set({
114
+ nhashtype: Signature.SIGHASH_SINGLE
115
+ })
116
+ sig.toTxFormat().toString('hex').should.equal(original.slice(0, -2) + '03')
117
+ })
118
+ })
119
+
120
+ describe('#fromTxFormat', function () {
121
+ it('should convert from this known tx-format buffer', function () {
122
+ var buf = Buffer.from('30450221008bab1f0a2ff2f9cb8992173d8ad73c229d31ea8e10b0f4d4ae1a0d8ed76021fa02200993a6ec81755b9111762fc2cf8e3ede73047515622792110867d12654275e7201', 'hex')
123
+ var sig = Signature.fromTxFormat(buf)
124
+ sig.r.toString().should.equal('63173831029936981022572627018246571655303050627048489594159321588908385378810')
125
+ sig.s.toString().should.equal('4331694221846364448463828256391194279133231453999942381442030409253074198130')
126
+ sig.nhashtype.should.equal(Signature.SIGHASH_ALL)
127
+ })
128
+
129
+ it('should parse this known signature and rebuild it', function () {
130
+ var hex = '3044022007415aa37ce7eaa6146001ac8bdefca0ddcba0e37c5dc08c4ac99392124ebac802207d382307fd53f65778b07b9c63b6e196edeadf0be719130c5db21ff1e700d67501'
131
+ var buf = Buffer.from(hex, 'hex')
132
+ var sig = Signature.fromTxFormat(buf)
133
+ sig.toTxFormat().toString('hex').should.equal(hex)
134
+ })
135
+ })
136
+
137
+ describe('#parseDER', function () {
138
+ it('should parse this signature generated in node', function () {
139
+ var sighex = '30450221008bab1f0a2ff2f9cb8992173d8ad73c229d31ea8e10b0f4d4ae1a0d8ed76021fa02200993a6ec81755b9111762fc2cf8e3ede73047515622792110867d12654275e72'
140
+ var sig = Buffer.from(sighex, 'hex')
141
+ var parsed = Signature.parseDER(sig)
142
+ parsed.header.should.equal(0x30)
143
+ parsed.length.should.equal(69)
144
+ parsed.rlength.should.equal(33)
145
+ parsed.rneg.should.equal(true)
146
+ parsed.rbuf.toString('hex').should.equal('008bab1f0a2ff2f9cb8992173d8ad73c229d31ea8e10b0f4d4ae1a0d8ed76021fa')
147
+ parsed.r.toString().should.equal('63173831029936981022572627018246571655303050627048489594159321588908385378810')
148
+ parsed.slength.should.equal(32)
149
+ parsed.sneg.should.equal(false)
150
+ parsed.sbuf.toString('hex').should.equal('0993a6ec81755b9111762fc2cf8e3ede73047515622792110867d12654275e72')
151
+ parsed.s.toString().should.equal('4331694221846364448463828256391194279133231453999942381442030409253074198130')
152
+ })
153
+
154
+ it('should parse this 69 byte signature', function () {
155
+ var sighex = '3043021f59e4705959cc78acbfcf8bd0114e9cc1b389a4287fb33152b73a38c319b50302202f7428a27284c757e409bf41506183e9e49dfb54d5063796dfa0d403a4deccfa'
156
+ var sig = Buffer.from(sighex, 'hex')
157
+ var parsed = Signature.parseDER(sig)
158
+ parsed.header.should.equal(0x30)
159
+ parsed.length.should.equal(67)
160
+ parsed.rlength.should.equal(31)
161
+ parsed.rneg.should.equal(false)
162
+ parsed.rbuf.toString('hex').should.equal('59e4705959cc78acbfcf8bd0114e9cc1b389a4287fb33152b73a38c319b503')
163
+ parsed.r.toString().should.equal('158826015856106182499128681792325160381907915189052224498209222621383996675')
164
+ parsed.slength.should.equal(32)
165
+ parsed.sneg.should.equal(false)
166
+ parsed.sbuf.toString('hex').should.equal('2f7428a27284c757e409bf41506183e9e49dfb54d5063796dfa0d403a4deccfa')
167
+ parsed.s.toString().should.equal('21463938592353267769710297084836796652964571266930856168996063301532842380538')
168
+ })
169
+
170
+ it('should parse this 68 byte signature', function () {
171
+ var sighex = '3042021e17cfe77536c3fb0526bd1a72d7a8e0973f463add210be14063c8a9c37632022061bfa677f825ded82ba0863fb0c46ca1388dd3e647f6a93c038168b59d131a51'
172
+ var sig = Buffer.from(sighex, 'hex')
173
+ var parsed = Signature.parseDER(sig)
174
+ parsed.header.should.equal(0x30)
175
+ parsed.length.should.equal(66)
176
+ parsed.rlength.should.equal(30)
177
+ parsed.rneg.should.equal(false)
178
+ parsed.rbuf.toString('hex').should.equal('17cfe77536c3fb0526bd1a72d7a8e0973f463add210be14063c8a9c37632')
179
+ parsed.r.toString().should.equal('164345250294671732127776123343329699648286106708464198588053542748255794')
180
+ parsed.slength.should.equal(32)
181
+ parsed.sneg.should.equal(false)
182
+ parsed.sbuf.toString('hex').should.equal('61bfa677f825ded82ba0863fb0c46ca1388dd3e647f6a93c038168b59d131a51')
183
+ parsed.s.toString().should.equal('44212963026209759051804639008236126356702363229859210154760104982946304432721')
184
+ })
185
+
186
+ it('should parse this signature from script_valid.json', function () {
187
+ var sighex = '304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef051'
188
+ var sig = Buffer.from(sighex, 'hex')
189
+ var parsed = Signature.parseDER(sig, false)
190
+ should.exist(parsed)
191
+ })
192
+ })
193
+
194
+ describe('#toDER', function () {
195
+ it('should convert these known r and s values into a known signature', function () {
196
+ var r = new BN('63173831029936981022572627018246571655303050627048489594159321588908385378810')
197
+ var s = new BN('4331694221846364448463828256391194279133231453999942381442030409253074198130')
198
+ var sig = new Signature({
199
+ r: r,
200
+ s: s
201
+ })
202
+ var der = sig.toDER(r, s)
203
+ der.toString('hex').should.equal('30450221008bab1f0a2ff2f9cb8992173d8ad73c229d31ea8e10b0f4d4ae1a0d8ed76021fa02200993a6ec81755b9111762fc2cf8e3ede73047515622792110867d12654275e72')
204
+ })
205
+ })
206
+
207
+ describe('#toString', function () {
208
+ it('should convert this signature in to hex DER', function () {
209
+ var r = new BN('63173831029936981022572627018246571655303050627048489594159321588908385378810')
210
+ var s = new BN('4331694221846364448463828256391194279133231453999942381442030409253074198130')
211
+ var sig = new Signature({
212
+ r: r,
213
+ s: s
214
+ })
215
+ var hex = sig.toString()
216
+ hex.should.equal('30450221008bab1f0a2ff2f9cb8992173d8ad73c229d31ea8e10b0f4d4ae1a0d8ed76021fa02200993a6ec81755b9111762fc2cf8e3ede73047515622792110867d12654275e72')
217
+ })
218
+ })
219
+
220
+ describe('@isTxDER', function () {
221
+ it('should know this is a DER signature', function () {
222
+ var sighex = '3042021e17cfe77536c3fb0526bd1a72d7a8e0973f463add210be14063c8a9c37632022061bfa677f825ded82ba0863fb0c46ca1388dd3e647f6a93c038168b59d131a5101'
223
+ var sigbuf = Buffer.from(sighex, 'hex')
224
+ Signature.isTxDER(sigbuf).should.equal(true)
225
+ })
226
+
227
+ it('should know this is not a DER signature', function () {
228
+ // for more extensive tests, see the script interpreter
229
+ var sighex = '3042021e17cfe77536c3fb0526bd1a72d7a8e0973f463add210be14063c8a9c37632022061bfa677f825ded82ba0863fb0c46ca1388dd3e647f6a93c038168b59d131a5101'
230
+ var sigbuf = Buffer.from(sighex, 'hex')
231
+ sigbuf[0] = 0x31
232
+ Signature.isTxDER(sigbuf).should.equal(false)
233
+ })
234
+
235
+ describe('bitcoind fixtures', function () {
236
+ var testSigs = function (set, expected) {
237
+ var i = 0
238
+ set.forEach(function (vector) {
239
+ if (!JSUtil.isHexa(vector)) {
240
+ // non-hex strings are ignored
241
+ return
242
+ }
243
+ it('should be ' + (expected ? '' : 'in') + 'valid for fixture #' + i, function () {
244
+ var sighex = vector
245
+ var interp = Interpreter()
246
+ interp.flags = Interpreter.SCRIPT_VERIFY_DERSIG |
247
+ Interpreter.SCRIPT_VERIFY_STRICTENC
248
+ var result = interp.checkSignatureEncoding(Buffer.from(sighex, 'hex'))
249
+ result.should.equal(expected)
250
+ })
251
+ i++
252
+ })
253
+ }
254
+ testSigs(sigCanonical, true)
255
+ testSigs(sigNonCanonical, false)
256
+ })
257
+ })
258
+ describe('#hasLowS', function () {
259
+ it('should detect high and low S', function () {
260
+ var r = new BN('63173831029936981022572627018246571655303050627048489594159321588908385378810')
261
+
262
+ var sig = new Signature({
263
+ r: r,
264
+ s: new BN('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A1', 'hex')
265
+ })
266
+ sig.hasLowS().should.equal(false)
267
+
268
+ var sig2 = new Signature({
269
+ r: r,
270
+ s: new BN('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0', 'hex')
271
+ })
272
+ sig2.hasLowS().should.equal(true)
273
+
274
+ var sig3 = new Signature({
275
+ r: r,
276
+ s: new BN(1)
277
+ })
278
+ sig3.hasLowS().should.equal(true)
279
+
280
+ var sig4 = new Signature({
281
+ r: r,
282
+ s: new BN(0)
283
+ })
284
+ sig4.hasLowS().should.equal(false)
285
+ })
286
+ })
287
+
288
+ describe('#hasDefinedHashtype', function () {
289
+ it('should reject invalid sighash types and accept valid ones', function () {
290
+ var sig = new Signature()
291
+ sig.hasDefinedHashtype().should.equal(false)
292
+ var testCases = [
293
+ [undefined, false],
294
+ [null, false],
295
+ [0, false],
296
+ [1.1, false],
297
+ [-1, false],
298
+ [-1.1, false],
299
+ ['', false],
300
+ ['1', false],
301
+ [Signature.SIGHASH_ANYONECANPAY, false],
302
+ [Signature.SIGHASH_ANYONECANPAY | Signature.SIGHASH_ALL, true],
303
+ [Signature.SIGHASH_ANYONECANPAY | Signature.SIGHASH_NONE, true],
304
+ [Signature.SIGHASH_ANYONECANPAY | Signature.SIGHASH_SINGLE, true],
305
+ [Signature.SIGHASH_ALL, true],
306
+ [Signature.SIGHASH_NONE, true],
307
+ [Signature.SIGHASH_SINGLE, true],
308
+ [Signature.SIGHASH_SINGLE + 1, false],
309
+ [(Signature.SIGHASH_ANYONECANPAY | Signature.SIGHASH_SINGLE) + 1, false],
310
+ [(Signature.SIGHASH_ANYONECANPAY | Signature.SIGHASH_ALL) - 1, false]
311
+ ]
312
+ _.each(testCases, function (testCase) {
313
+ sig.nhashtype = testCase[0]
314
+ sig.hasDefinedHashtype().should.equal(testCase[1])
315
+ })
316
+ })
317
+ })
318
+ })
@@ -0,0 +1,215 @@
1
+ {
2
+ "inputs": [
3
+ {
4
+ "description": "Ordered by txId, descending (reverse-byte-order ascending)",
5
+ "inputs": [
6
+ {
7
+ "txId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8
+ "vout": 0
9
+ },
10
+ {
11
+ "txId": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
12
+ "vout": 0
13
+ },
14
+ {
15
+ "txId": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
16
+ "vout": 0
17
+ },
18
+ {
19
+ "txId": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbff",
20
+ "vout": 0
21
+ },
22
+ {
23
+ "txId": "ffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
24
+ "vout": 0
25
+ }
26
+ ],
27
+ "expected": [0, 2, 3, 1, 4]
28
+ },
29
+ {
30
+ "description": "Ordered by vout, ascending",
31
+ "inputs": [
32
+ {
33
+ "txId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
34
+ "vout": 1
35
+ },
36
+ {
37
+ "txId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
38
+ "vout": 2
39
+ },
40
+ {
41
+ "txId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
42
+ "vout": 0
43
+ }
44
+ ],
45
+ "expected": [2, 0, 1]
46
+ },
47
+ {
48
+ "description": "Ordered by txId, then vout",
49
+ "inputs": [
50
+ {
51
+ "txId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
52
+ "vout": 99
53
+ },
54
+ {
55
+ "txId": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
56
+ "vout": 99
57
+ },
58
+ {
59
+ "txId": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
60
+ "vout": 0
61
+ },
62
+ {
63
+ "txId": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
64
+ "vout": 0
65
+ }
66
+ ],
67
+ "expected": [0, 3, 1, 2]
68
+ },
69
+ {
70
+ "description": "BIP69 test vector 1",
71
+ "inputs": [
72
+ { "txId": "0e53ec5dfb2cb8a71fec32dc9a634a35b7e24799295ddd5278217822e0b31f57", "vout": 0 },
73
+ { "txId": "26aa6e6d8b9e49bb0630aac301db6757c02e3619feb4ee0eea81eb1672947024", "vout": 1 },
74
+ { "txId": "28e0fdd185542f2c6ea19030b0796051e7772b6026dd5ddccd7a2f93b73e6fc2", "vout": 0 },
75
+ { "txId": "381de9b9ae1a94d9c17f6a08ef9d341a5ce29e2e60c36a52d333ff6203e58d5d", "vout": 1 },
76
+ { "txId": "3b8b2f8efceb60ba78ca8bba206a137f14cb5ea4035e761ee204302d46b98de2", "vout": 0 },
77
+ { "txId": "402b2c02411720bf409eff60d05adad684f135838962823f3614cc657dd7bc0a", "vout": 1 },
78
+ { "txId": "54ffff182965ed0957dba1239c27164ace5a73c9b62a660c74b7b7f15ff61e7a", "vout": 1 },
79
+ { "txId": "643e5f4e66373a57251fb173151e838ccd27d279aca882997e005016bb53d5aa", "vout": 0 },
80
+ { "txId": "6c1d56f31b2de4bfc6aaea28396b333102b1f600da9c6d6149e96ca43f1102b1", "vout": 1 },
81
+ { "txId": "7a1de137cbafb5c70405455c49c5104ca3057a1f1243e6563bb9245c9c88c191", "vout": 0 },
82
+ { "txId": "7d037ceb2ee0dc03e82f17be7935d238b35d1deabf953a892a4507bfbeeb3ba4", "vout": 1 },
83
+ { "txId": "a5e899dddb28776ea9ddac0a502316d53a4a3fca607c72f66c470e0412e34086", "vout": 0 },
84
+ { "txId": "b4112b8f900a7ca0c8b0e7c4dfad35c6be5f6be46b3458974988e1cdb2fa61b8", "vout": 0 },
85
+ { "txId": "bafd65e3c7f3f9fdfdc1ddb026131b278c3be1af90a4a6ffa78c4658f9ec0c85", "vout": 0 },
86
+ { "txId": "de0411a1e97484a2804ff1dbde260ac19de841bebad1880c782941aca883b4e9", "vout": 1 },
87
+ { "txId": "f0a130a84912d03c1d284974f563c5949ac13f8342b8112edff52971599e6a45", "vout": 0 },
88
+ { "txId": "f320832a9d2e2452af63154bc687493484a0e7745ebd3aaf9ca19eb80834ad60", "vout": 0 }
89
+ ],
90
+ "expected": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
91
+ },
92
+ {
93
+ "description": "BIP69 test vector 2",
94
+ "inputs": [
95
+ { "txId": "35288d269cee1941eaebb2ea85e32b42cdb2b04284a56d8b14dcc3f5c65d6055", "vout": 0 },
96
+ { "txId": "35288d269cee1941eaebb2ea85e32b42cdb2b04284a56d8b14dcc3f5c65d6055", "vout": 1 }
97
+ ],
98
+ "expected": [0, 1]
99
+ }
100
+ ],
101
+ "outputs": [
102
+ {
103
+ "description": "Ordered by Amount, ascending",
104
+ "outputs": [
105
+ {
106
+ "script": "00000000",
107
+ "value": 3000
108
+ },
109
+ {
110
+ "script": "00000000",
111
+ "value": 2000
112
+ },
113
+ {
114
+ "script": "00000000",
115
+ "value": 1000
116
+ }
117
+ ],
118
+ "expected": [2, 1, 0]
119
+ },
120
+ {
121
+ "description": "Ordered by Script, ascending",
122
+ "outputs": [
123
+ {
124
+ "script": "00000000",
125
+ "value": 1000
126
+ },
127
+ {
128
+ "script": "22222222",
129
+ "value": 1000
130
+ },
131
+ {
132
+ "script": "11111111",
133
+ "value": 1000
134
+ }
135
+ ],
136
+ "expected": [0, 2, 1]
137
+ },
138
+ {
139
+ "description": "Ordered by Amount, then Script",
140
+ "outputs": [
141
+ {
142
+ "script": "11111111",
143
+ "value": 1000
144
+ },
145
+ {
146
+ "script": "11111111",
147
+ "value": 2000
148
+ },
149
+ {
150
+ "script": "00000000",
151
+ "value": 3000
152
+ },
153
+ {
154
+ "script": "00000000",
155
+ "value": 2000
156
+ }
157
+ ],
158
+ "expected": [0, 3, 1, 2]
159
+ },
160
+ {
161
+ "description": "Sorting is irrelevant for equivalent outputs",
162
+ "outputs": [
163
+ {
164
+ "script": "00000000",
165
+ "value": 2000
166
+ },
167
+ {
168
+ "script": "11111111",
169
+ "value": 2000
170
+ },
171
+ {
172
+ "script": "00000000",
173
+ "value": 2000
174
+ },
175
+ {
176
+ "script": "11111111",
177
+ "value": 3000
178
+ },
179
+ {
180
+ "script": "22222222",
181
+ "value": 3000
182
+ }
183
+ ],
184
+ "expected": [0, 2, 1, 3, 4]
185
+ },
186
+ {
187
+ "description": "BIP69 test vector 1",
188
+ "outputs": [
189
+ {
190
+ "script": "76a9144a5fba237213a062f6f57978f796390bdcf8d01588ac",
191
+ "value": 400057456
192
+ },
193
+ {
194
+ "script": "76a9145be32612930b8323add2212a4ec03c1562084f8488ac",
195
+ "value": 40000000000
196
+ }
197
+ ],
198
+ "expected": [0, 1]
199
+ },
200
+ {
201
+ "description": "BIP69 test vector 2",
202
+ "outputs": [
203
+ {
204
+ "script": "41046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac",
205
+ "value": 100000000
206
+ },
207
+ {
208
+ "script": "41044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac",
209
+ "value": 2400000000
210
+ }
211
+ ],
212
+ "expected": [0, 1]
213
+ }
214
+ ]
215
+ }
@@ -0,0 +1,152 @@
1
+ [
2
+ [
3
+ ""
4
+ ],
5
+ [
6
+ "x"
7
+ ],
8
+ [
9
+ "37qgekLpCCHrQuSjvX3fs496FWTGsHFHizjJAs6NPcR47aefnnCWECAhHV6E3g4YN7u7Yuwod5Y"
10
+ ],
11
+ [
12
+ "dzb7VV1Ui55BARxv7ATxAtCUeJsANKovDGWFVgpTbhq9gvPqP3yv"
13
+ ],
14
+ [
15
+ "MuNu7ZAEDFiHthiunm7dPjwKqrVNCM3mAz6rP9zFveQu14YA8CxExSJTHcVP9DErn6u84E6Ej7S"
16
+ ],
17
+ [
18
+ "rPpQpYknyNQ5AEHuY6H8ijJJrYc2nDKKk9jjmKEXsWzyAQcFGpDLU2Zvsmoi8JLR7hAwoy3RQWf"
19
+ ],
20
+ [
21
+ "4Uc3FmN6NQ6zLBK5QQBXRBUREaaHwCZYsGCueHauuDmJpZKn6jkEskMB2Zi2CNgtb5r6epWEFfUJq"
22
+ ],
23
+ [
24
+ "7aQgR5DFQ25vyXmqZAWmnVCjL3PkBcdVkBUpjrjMTcghHx3E8wb"
25
+ ],
26
+ [
27
+ "17QpPprjeg69fW1DV8DcYYCKvWjYhXvWkov6MJ1iTTvMFj6weAqW7wybZeH57WTNxXVCRH4veVs"
28
+ ],
29
+ [
30
+ "KxuACDviz8Xvpn1xAh9MfopySZNuyajYMZWz16Dv2mHHryznWUp3"
31
+ ],
32
+ [
33
+ "7nK3GSmqdXJQtdohvGfJ7KsSmn3TmGqExug49583bDAL91pVSGq5xS9SHoAYL3Wv3ijKTit65th"
34
+ ],
35
+ [
36
+ "cTivdBmq7bay3RFGEBBuNfMh2P1pDCgRYN2Wbxmgwr4ki3jNUL2va"
37
+ ],
38
+ [
39
+ "gjMV4vjNjyMrna4fsAr8bWxAbwtmMUBXJS3zL4NJt5qjozpbQLmAfK1uA3CquSqsZQMpoD1g2nk"
40
+ ],
41
+ [
42
+ "emXm1naBMoVzPjbk7xpeTVMFy4oDEe25UmoyGgKEB1gGWsK8kRGs"
43
+ ],
44
+ [
45
+ "7VThQnNRj1o3Zyvc7XHPRrjDf8j2oivPTeDXnRPYWeYGE4pXeRJDZgf28ppti5hsHWXS2GSobdqyo"
46
+ ],
47
+ [
48
+ "1G9u6oCVCPh2o8m3t55ACiYvG1y5BHewUkDSdiQarDcYXXhFHYdzMdYfUAhfxn5vNZBwpgUNpso"
49
+ ],
50
+ [
51
+ "31QQ7ZMLkScDiB4VyZjuptr7AEc9j1SjstF7pRoLhHTGkW4Q2y9XELobQmhhWxeRvqcukGd1XCq"
52
+ ],
53
+ [
54
+ "DHqKSnpxa8ZdQyH8keAhvLTrfkyBMQxqngcQA5N8LQ9KVt25kmGN"
55
+ ],
56
+ [
57
+ "2LUHcJPbwLCy9GLH1qXmfmAwvadWw4bp4PCpDfduLqV17s6iDcy1imUwhQJhAoNoN1XNmweiJP4i"
58
+ ],
59
+ [
60
+ "7USRzBXAnmck8fX9HmW7RAb4qt92VFX6soCnts9s74wxm4gguVhtG5of8fZGbNPJA83irHVY6bCos"
61
+ ],
62
+ [
63
+ "1DGezo7BfVebZxAbNT3XGujdeHyNNBF3vnficYoTSp4PfK2QaML9bHzAMxke3wdKdHYWmsMTJVu"
64
+ ],
65
+ [
66
+ "2D12DqDZKwCxxkzs1ZATJWvgJGhQ4cFi3WrizQ5zLAyhN5HxuAJ1yMYaJp8GuYsTLLxTAz6otCfb"
67
+ ],
68
+ [
69
+ "8AFJzuTujXjw1Z6M3fWhQ1ujDW7zsV4ePeVjVo7D1egERqSW9nZ"
70
+ ],
71
+ [
72
+ "163Q17qLbTCue8YY3AvjpUhotuaodLm2uqMhpYirsKjVqnxJRWTEoywMVY3NbBAHuhAJ2cF9GAZ"
73
+ ],
74
+ [
75
+ "2MnmgiRH4eGLyLc9eAqStzk7dFgBjFtUCtu"
76
+ ],
77
+ [
78
+ "461QQ2sYWxU7H2PV4oBwJGNch8XVTYYbZxU"
79
+ ],
80
+ [
81
+ "2UCtv53VttmQYkVU4VMtXB31REvQg4ABzs41AEKZ8UcB7DAfVzdkV9JDErwGwyj5AUHLkmgZeobs"
82
+ ],
83
+ [
84
+ "cSNjAsnhgtiFMi6MtfvgscMB2Cbhn2v1FUYfviJ1CdjfidvmeW6mn"
85
+ ],
86
+ [
87
+ "gmsow2Y6EWAFDFE1CE4Hd3Tpu2BvfmBfG1SXsuRARbnt1WjkZnFh1qGTiptWWbjsq2Q6qvpgJVj"
88
+ ],
89
+ [
90
+ "nksUKSkzS76v8EsSgozXGMoQFiCoCHzCVajFKAXqzK5on9ZJYVHMD5CKwgmX3S3c7M1U3xabUny"
91
+ ],
92
+ [
93
+ "L3favK1UzFGgdzYBF2oBT5tbayCo4vtVBLJhg2iYuMeePxWG8SQc"
94
+ ],
95
+ [
96
+ "7VxLxGGtYT6N99GdEfi6xz56xdQ8nP2dG1CavuXx7Rf2PrvNMTBNevjkfgs9JmkcGm6EXpj8ipyPZ"
97
+ ],
98
+ [
99
+ "2mbZwFXF6cxShaCo2czTRB62WTx9LxhTtpP"
100
+ ],
101
+ [
102
+ "dB7cwYdcPSgiyAwKWL3JwCVwSk6epU2txw"
103
+ ],
104
+ [
105
+ "HPhFUhUAh8ZQQisH8QQWafAxtQYju3SFTX"
106
+ ],
107
+ [
108
+ "4ctAH6AkHzq5ioiM1m9T3E2hiYEev5mTsB"
109
+ ],
110
+ [
111
+ "Hn1uFi4dNexWrqARpjMqgT6cX1UsNPuV3cHdGg9ExyXw8HTKadbktRDtdeVmY3M1BxJStiL4vjJ"
112
+ ],
113
+ [
114
+ "Sq3fDbvutABmnAHHExJDgPLQn44KnNC7UsXuT7KZecpaYDMU9Txs"
115
+ ],
116
+ [
117
+ "6TqWyrqdgUEYDQU1aChMuFMMEimHX44qHFzCUgGfqxGgZNMUVWJ"
118
+ ],
119
+ [
120
+ "giqJo7oWqFxNKWyrgcBxAVHXnjJ1t6cGoEffce5Y1y7u649Noj5wJ4mmiUAKEVVrYAGg2KPB3Y4"
121
+ ],
122
+ [
123
+ "cNzHY5e8vcmM3QVJUcjCyiKMYfeYvyueq5qCMV3kqcySoLyGLYUK"
124
+ ],
125
+ [
126
+ "37uTe568EYc9WLoHEd9jXEvUiWbq5LFLscNyqvAzLU5vBArUJA6eydkLmnMwJDjkL5kXc2VK7ig"
127
+ ],
128
+ [
129
+ "EsYbG4tWWWY45G31nox838qNdzksbPySWc"
130
+ ],
131
+ [
132
+ "nbuzhfwMoNzA3PaFnyLcRxE9bTJPDkjZ6Rf6Y6o2ckXZfzZzXBT"
133
+ ],
134
+ [
135
+ "cQN9PoxZeCWK1x56xnz6QYAsvR11XAce3Ehp3gMUdfSQ53Y2mPzx"
136
+ ],
137
+ [
138
+ "1Gm3N3rkef6iMbx4voBzaxtXcmmiMTqZPhcuAepRzYUJQW4qRpEnHvMojzof42hjFRf8PE2jPde"
139
+ ],
140
+ [
141
+ "2TAq2tuN6x6m233bpT7yqdYQPELdTDJn1eU"
142
+ ],
143
+ [
144
+ "ntEtnnGhqPii4joABvBtSEJG6BxjT2tUZqE8PcVYgk3RHpgxgHDCQxNbLJf7ardf1dDk2oCQ7Cf"
145
+ ],
146
+ [
147
+ "Ky1YjoZNgQ196HJV3HpdkecfhRBmRZdMJk89Hi5KGfpfPwS2bUbfd"
148
+ ],
149
+ [
150
+ "2A1q1YsMZowabbvta7kTy2Fd6qN4r5ZCeG3qLpvZBMzCixMUdkN2Y4dHB1wPsZAeVXUGD83MfRED"
151
+ ]
152
+ ]