diff --git a/src/main/java/com/sparrowwallet/hummingbird/LegacyURDecoder.java b/src/main/java/com/sparrowwallet/hummingbird/LegacyURDecoder.java index 2e83c10..88f32d3 100644 --- a/src/main/java/com/sparrowwallet/hummingbird/LegacyURDecoder.java +++ b/src/main/java/com/sparrowwallet/hummingbird/LegacyURDecoder.java @@ -83,23 +83,21 @@ public class LegacyURDecoder { String[] components = fragment.split("/"); switch(components.length) { - case 2 -> { + case 2: return new UR(components[0].substring(UR.UR_PREFIX.length() + 1), BC32.decode(components[1])); - } - case 3 -> { + case 3: String digest = components[1]; String data = components[2]; checkDigest(data, digest); return new UR(components[0].substring(UR.UR_PREFIX.length() + 1), BC32.decode(data)); - } - case 4 -> { + case 4: checkAndGetSequence(components[1]); - String digest = components[2]; - String data = components[3]; - checkDigest(digest, fragment); - return new UR(components[0].substring(UR.UR_PREFIX.length() + 1), BC32.decode(data)); - } - default -> throw new IllegalArgumentException("Invalid number of fragments: expected 2 / 3 / 4 but got " + components.length); + String seqDigest = components[2]; + String seqData = components[3]; + checkDigest(seqDigest, fragment); + return new UR(components[0].substring(UR.UR_PREFIX.length() + 1), BC32.decode(seqData)); + default: + throw new IllegalArgumentException("Invalid number of fragments: expected 2 / 3 / 4 but got " + components.length); } } diff --git a/src/main/java/com/sparrowwallet/hummingbird/fountain/FountainDecoder.java b/src/main/java/com/sparrowwallet/hummingbird/fountain/FountainDecoder.java index 12e8c23..59b11e7 100644 --- a/src/main/java/com/sparrowwallet/hummingbird/fountain/FountainDecoder.java +++ b/src/main/java/com/sparrowwallet/hummingbird/fountain/FountainDecoder.java @@ -266,7 +266,9 @@ public class FountainDecoder { static byte[] joinFragments(List fragments, int messageLen) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); - fragments.forEach(baos::writeBytes); + for(byte[] fragment : fragments) { + baos.write(fragment, 0, fragment.length); + } byte[] message = baos.toByteArray(); byte[] unpaddedMessage = new byte[messageLen]; diff --git a/src/main/java/com/sparrowwallet/hummingbird/fountain/FountainUtils.java b/src/main/java/com/sparrowwallet/hummingbird/fountain/FountainUtils.java index 47e3acf..3eda209 100644 --- a/src/main/java/com/sparrowwallet/hummingbird/fountain/FountainUtils.java +++ b/src/main/java/com/sparrowwallet/hummingbird/fountain/FountainUtils.java @@ -2,6 +2,7 @@ package com.sparrowwallet.hummingbird.fountain; import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -15,7 +16,7 @@ public class FountainUtils { // others. This means that if you only generate the first `seqLen` parts, // then you have all the parts you need to decode the message. if(seqNum <= seqLen) { - return List.of((int)seqNum - 1); + return Collections.singletonList((int)seqNum - 1); } else { ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES * 2); buffer.putInt((int)(seqNum)); diff --git a/src/test/java/com/sparrowwallet/hummingbird/fountain/FountainCodesTest.java b/src/test/java/com/sparrowwallet/hummingbird/fountain/FountainCodesTest.java index be6d98d..85372fe 100644 --- a/src/test/java/com/sparrowwallet/hummingbird/fountain/FountainCodesTest.java +++ b/src/test/java/com/sparrowwallet/hummingbird/fountain/FountainCodesTest.java @@ -24,7 +24,7 @@ public class FountainCodesTest { @Test public void testRandomSampler() { RandomXoshiro256StarStar rng = new RandomXoshiro256StarStar("Wolf"); - RandomSampler randomSampler = new RandomSampler(List.of(1d, 2d, 4d, 8d)); + RandomSampler randomSampler = new RandomSampler(Arrays.asList(1d, 2d, 4d, 8d)); int[] numbers = IntStream.range(0, 500).map(i -> randomSampler.next(rng)).toArray(); int[] expectedNumbers = new int[] {3, 3, 3, 3, 3, 3, 3, 0, 2, 3, 3, 3, 3, 1, 2, 2, 1, 3, 3, 2, 3, 3, 1, 1, 2, 1, 1, 3, 1, 3, 1, 2, 0, 2, 1, 0, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 2, 3, 2, 2, 3, 3, 3, 3, 2, 3, 3, 0, 3, 3, 3, 3, 1, 2, 3, 3, 2, 2, 2, 1, 2, 2, 1, 2, 3, 1, 3, 0, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 1, 3, 3, 2, 0, 2, 2, 3, 1, 1, 2, 3, 2, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 2, 3, 1, 2, 1, 1, 3, 1, 3, 2, 2, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3, 3, 1, 2, 3, 3, 1, 3, 2, 3, 3, 3, 2, 3, 1, 3, 0, 3, 2, 1, 1, 3, 1, 3, 2, 3, 3, 3, 3, 2, 0, 3, 3, 1, 3, 0, 2, 1, 3, 3, 1, 1, 3, 1, 2, 3, 3, 3, 0, 2, 3, 2, 0, 1, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 3, 3, 2, 0, 2, 3, 3, 3, 3, 2, 1, 1, 1, 2, 1, 3, 3, 3, 2, 2, 3, 3, 1, 2, 3, 0, 3, 2, 3, 3, 3, 3, 0, 2, 2, 3, 2, 2, 3, 3, 3, 3, 1, 3, 2, 3, 3, 3, 3, 3, 2, 2, 3, 1, 3, 0, 2, 1, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 2, 2, 2, 3, 1, 1, 3, 2, 2, 0, 3, 2, 1, 2, 1, 0, 3, 3, 3, 2, 2, 3, 2, 1, 2, 0, 0, 3, 3, 2, 3, 3, 2, 3, 3, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 1, 1, 3, 2, 2, 3, 1, 1, 0, 1, 3, 2, 3, 3, 2, 3, 3, 2, 3, 3, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 3, 3, 2, 2, 2, 2, 3, 3, 2, 0, 2, 1, 3, 3, 3, 3, 0, 3, 3, 3, 3, 2, 2, 3, 1, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 3, 2, 3, 2, 1, 3, 3, 3, 3, 2, 2, 0, 1, 2, 3, 2, 0, 3, 3, 3, 3, 3, 3, 1, 3, 3, 2, 3, 2, 2, 3, 3, 3, 3, 3, 2, 2, 3, 3, 2, 2, 2, 1, 3, 3, 3, 3, 1, 2, 3, 2, 3, 3, 2, 3, 2, 3, 3, 3, 2, 3, 1, 2, 3, 2, 1, 1, 3, 3, 2, 3, 3, 2, 3, 3, 0, 0, 1, 3, 3, 2, 3, 3, 3, 3, 1, 3, 3, 0, 3, 2, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 2}; @@ -36,7 +36,7 @@ public class FountainCodesTest { RandomXoshiro256StarStar rng = new RandomXoshiro256StarStar("Wolf"); List numbers = IntStream.range(1, 11).boxed().collect(Collectors.toList()); numbers = FountainUtils.shuffled(numbers, rng); - List expectedNumbers = List.of(6, 4, 9, 3, 10, 5, 7, 8, 1, 2); + List expectedNumbers = Arrays.asList(6, 4, 9, 3, 10, 5, 7, 8, 1, 2); Assert.assertEquals(expectedNumbers, numbers); } diff --git a/src/test/java/com/sparrowwallet/hummingbird/registry/CryptoAccountTest.java b/src/test/java/com/sparrowwallet/hummingbird/registry/CryptoAccountTest.java index 5b40158..4db4606 100644 --- a/src/test/java/com/sparrowwallet/hummingbird/registry/CryptoAccountTest.java +++ b/src/test/java/com/sparrowwallet/hummingbird/registry/CryptoAccountTest.java @@ -9,6 +9,8 @@ import com.sparrowwallet.hummingbird.UREncoder; import org.junit.Assert; import org.junit.Test; +import java.util.Arrays; +import java.util.Collections; import java.util.List; public class CryptoAccountTest { @@ -21,7 +23,7 @@ public class CryptoAccountTest { Assert.assertEquals("37b5eed4", TestUtils.bytesToHex(cryptoAccount.getMasterFingerprint())); CryptoOutput cryptoOutput1 = cryptoAccount.getOutputDescriptors().get(0); - Assert.assertEquals(List.of(ScriptExpression.PUBLIC_KEY_HASH), cryptoOutput1.getScriptExpressions()); + Assert.assertEquals(Collections.singletonList(ScriptExpression.PUBLIC_KEY_HASH), cryptoOutput1.getScriptExpressions()); Assert.assertEquals("03eb3e2863911826374de86c231a4b76f0b89dfa174afb78d7f478199884d9dd32", TestUtils.bytesToHex(cryptoOutput1.getHdKey().getKey())); Assert.assertEquals("6456a5df2db0f6d9af72b2a1af4b25f45200ed6fcc29c3440b311d4796b70b5b", TestUtils.bytesToHex(cryptoOutput1.getHdKey().getChainCode())); Assert.assertEquals("44'/0'/0'", cryptoOutput1.getHdKey().getOrigin().getPath()); @@ -29,7 +31,7 @@ public class CryptoAccountTest { Assert.assertNull(cryptoOutput1.getHdKey().getChildren()); CryptoOutput cryptoOutput2 = cryptoAccount.getOutputDescriptors().get(1); - Assert.assertEquals(List.of(ScriptExpression.SCRIPT_HASH, ScriptExpression.WITNESS_PUBLIC_KEY_HASH), cryptoOutput2.getScriptExpressions()); + Assert.assertEquals(Arrays.asList(ScriptExpression.SCRIPT_HASH, ScriptExpression.WITNESS_PUBLIC_KEY_HASH), cryptoOutput2.getScriptExpressions()); Assert.assertEquals("02c7e4823730f6ee2cf864e2c352060a88e60b51a84e89e4c8c75ec22590ad6b69", TestUtils.bytesToHex(cryptoOutput2.getHdKey().getKey())); Assert.assertEquals("9d2f86043276f9251a4a4f577166a5abeb16b6ec61e226b5b8fa11038bfda42d", TestUtils.bytesToHex(cryptoOutput2.getHdKey().getChainCode())); Assert.assertEquals("49'/0'/0'", cryptoOutput2.getHdKey().getOrigin().getPath()); @@ -37,7 +39,7 @@ public class CryptoAccountTest { Assert.assertNull(cryptoOutput2.getHdKey().getChildren()); CryptoOutput cryptoOutput3 = cryptoAccount.getOutputDescriptors().get(2); - Assert.assertEquals(List.of(ScriptExpression.WITNESS_PUBLIC_KEY_HASH), cryptoOutput3.getScriptExpressions()); + Assert.assertEquals(Collections.singletonList(ScriptExpression.WITNESS_PUBLIC_KEY_HASH), cryptoOutput3.getScriptExpressions()); Assert.assertEquals("03fd433450b6924b4f7efdd5d1ed017d364be95ab2b592dc8bddb3b00c1c24f63f", TestUtils.bytesToHex(cryptoOutput3.getHdKey().getKey())); Assert.assertEquals("72ede7334d5acf91c6fda622c205199c595a31f9218ed30792d301d5ee9e3a88", TestUtils.bytesToHex(cryptoOutput3.getHdKey().getChainCode())); Assert.assertEquals("84'/0'/0'", cryptoOutput3.getHdKey().getOrigin().getPath()); @@ -45,7 +47,7 @@ public class CryptoAccountTest { Assert.assertNull(cryptoOutput3.getHdKey().getChildren()); CryptoOutput cryptoOutput4 = cryptoAccount.getOutputDescriptors().get(3); - Assert.assertEquals(List.of(ScriptExpression.SCRIPT_HASH), cryptoOutput4.getScriptExpressions()); + Assert.assertEquals(Collections.singletonList(ScriptExpression.SCRIPT_HASH), cryptoOutput4.getScriptExpressions()); Assert.assertEquals("035ccd58b63a2cdc23d0812710603592e7457573211880cb59b1ef012e168e059a", TestUtils.bytesToHex(cryptoOutput4.getHdKey().getKey())); Assert.assertEquals("88d3299b448f87215d96b0c226235afc027f9e7dc700284f3e912a34daeb1a23", TestUtils.bytesToHex(cryptoOutput4.getHdKey().getChainCode())); Assert.assertEquals("45'", cryptoOutput4.getHdKey().getOrigin().getPath()); @@ -53,7 +55,7 @@ public class CryptoAccountTest { Assert.assertNull(cryptoOutput4.getHdKey().getChildren()); CryptoOutput cryptoOutput5 = cryptoAccount.getOutputDescriptors().get(4); - Assert.assertEquals(List.of(ScriptExpression.SCRIPT_HASH, ScriptExpression.WITNESS_SCRIPT_HASH), cryptoOutput5.getScriptExpressions()); + Assert.assertEquals(Arrays.asList(ScriptExpression.SCRIPT_HASH, ScriptExpression.WITNESS_SCRIPT_HASH), cryptoOutput5.getScriptExpressions()); Assert.assertEquals("032c78ebfcabdac6d735a0820ef8732f2821b4fb84cd5d6b26526938f90c050711", TestUtils.bytesToHex(cryptoOutput5.getHdKey().getKey())); Assert.assertEquals("7953efe16a73e5d3f9f2d4c6e49bd88e22093bbd85be5a7e862a4b98a16e0ab6", TestUtils.bytesToHex(cryptoOutput5.getHdKey().getChainCode())); Assert.assertEquals("48'/0'/0'/1'", cryptoOutput5.getHdKey().getOrigin().getPath()); @@ -61,7 +63,7 @@ public class CryptoAccountTest { Assert.assertNull(cryptoOutput5.getHdKey().getChildren()); CryptoOutput cryptoOutput6 = cryptoAccount.getOutputDescriptors().get(5); - Assert.assertEquals(List.of(ScriptExpression.WITNESS_SCRIPT_HASH), cryptoOutput6.getScriptExpressions()); + Assert.assertEquals(Collections.singletonList(ScriptExpression.WITNESS_SCRIPT_HASH), cryptoOutput6.getScriptExpressions()); Assert.assertEquals("0260563ee80c26844621b06b74070baf0e23fb76ce439d0237e87502ebbd3ca346", TestUtils.bytesToHex(cryptoOutput6.getHdKey().getKey())); Assert.assertEquals("2fa0e41c9dc43dc4518659bfcef935ba8101b57dbc0812805dd983bc1d34b813", TestUtils.bytesToHex(cryptoOutput6.getHdKey().getChainCode())); Assert.assertEquals("48'/0'/0'/2'", cryptoOutput6.getHdKey().getOrigin().getPath()); diff --git a/src/test/java/com/sparrowwallet/hummingbird/registry/CryptoBip39Test.java b/src/test/java/com/sparrowwallet/hummingbird/registry/CryptoBip39Test.java index 1c87eb0..871b089 100644 --- a/src/test/java/com/sparrowwallet/hummingbird/registry/CryptoBip39Test.java +++ b/src/test/java/com/sparrowwallet/hummingbird/registry/CryptoBip39Test.java @@ -7,6 +7,7 @@ import com.sparrowwallet.hummingbird.TestUtils; import org.junit.Assert; import org.junit.Test; +import java.util.Arrays; import java.util.List; public class CryptoBip39Test { @@ -16,7 +17,7 @@ public class CryptoBip39Test { byte[] data = TestUtils.hexToBytes(hex); List items = CborDecoder.decode(data); CryptoBip39 cryptoSeed = CryptoBip39.fromCbor(items.get(0)); - Assert.assertEquals(List.of("shield", "group", "erode", "awake", "lock", "sausage", "cash", "glare", "wave", "crew", "flame", "glove"), cryptoSeed.getWords()); + Assert.assertEquals(Arrays.asList("shield", "group", "erode", "awake", "lock", "sausage", "cash", "glare", "wave", "crew", "flame", "glove"), cryptoSeed.getWords()); Assert.assertEquals("en", cryptoSeed.getLanguage()); } } diff --git a/src/test/java/com/sparrowwallet/hummingbird/registry/CryptoOutputTest.java b/src/test/java/com/sparrowwallet/hummingbird/registry/CryptoOutputTest.java index 8936bec..0f047f3 100644 --- a/src/test/java/com/sparrowwallet/hummingbird/registry/CryptoOutputTest.java +++ b/src/test/java/com/sparrowwallet/hummingbird/registry/CryptoOutputTest.java @@ -7,6 +7,8 @@ import com.sparrowwallet.hummingbird.TestUtils; import org.junit.Assert; import org.junit.Test; +import java.util.Arrays; +import java.util.Collections; import java.util.List; public class CryptoOutputTest { @@ -16,7 +18,7 @@ public class CryptoOutputTest { byte[] data = TestUtils.hexToBytes(hex); List items = CborDecoder.decode(data); CryptoOutput cryptoOutput = CryptoOutput.fromCbor(items.get(0)); - Assert.assertEquals(List.of(ScriptExpression.PUBLIC_KEY_HASH), cryptoOutput.getScriptExpressions()); + Assert.assertEquals(Collections.singletonList(ScriptExpression.PUBLIC_KEY_HASH), cryptoOutput.getScriptExpressions()); Assert.assertEquals("02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5", TestUtils.bytesToHex(cryptoOutput.getEcKey().getData())); } @@ -26,7 +28,7 @@ public class CryptoOutputTest { byte[] data = TestUtils.hexToBytes(hex); List items = CborDecoder.decode(data); CryptoOutput cryptoOutput = CryptoOutput.fromCbor(items.get(0)); - Assert.assertEquals(List.of(ScriptExpression.SCRIPT_HASH, ScriptExpression.WITNESS_PUBLIC_KEY_HASH), cryptoOutput.getScriptExpressions()); + Assert.assertEquals(Arrays.asList(ScriptExpression.SCRIPT_HASH, ScriptExpression.WITNESS_PUBLIC_KEY_HASH), cryptoOutput.getScriptExpressions()); Assert.assertEquals("03fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556", TestUtils.bytesToHex(cryptoOutput.getEcKey().getData())); } @@ -36,7 +38,7 @@ public class CryptoOutputTest { byte[] data = TestUtils.hexToBytes(hex); List items = CborDecoder.decode(data); CryptoOutput cryptoOutput = CryptoOutput.fromCbor(items.get(0)); - Assert.assertEquals(List.of(ScriptExpression.SCRIPT_HASH, ScriptExpression.MULTISIG), cryptoOutput.getScriptExpressions()); + Assert.assertEquals(Arrays.asList(ScriptExpression.SCRIPT_HASH, ScriptExpression.MULTISIG), cryptoOutput.getScriptExpressions()); Assert.assertNull(cryptoOutput.getHdKey()); Assert.assertEquals(2, cryptoOutput.getMultiKey().getThreshold()); @@ -53,7 +55,7 @@ public class CryptoOutputTest { byte[] data = TestUtils.hexToBytes(hex); List items = CborDecoder.decode(data); CryptoOutput cryptoOutput = CryptoOutput.fromCbor(items.get(0)); - Assert.assertEquals(List.of(ScriptExpression.PUBLIC_KEY_HASH), cryptoOutput.getScriptExpressions()); + Assert.assertEquals(Collections.singletonList(ScriptExpression.PUBLIC_KEY_HASH), cryptoOutput.getScriptExpressions()); Assert.assertEquals("02d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0", TestUtils.bytesToHex(cryptoOutput.getHdKey().getKey())); Assert.assertEquals("637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e29", TestUtils.bytesToHex(cryptoOutput.getHdKey().getChainCode())); Assert.assertEquals("44'/0'/0'", cryptoOutput.getHdKey().getOrigin().getPath()); @@ -69,7 +71,7 @@ public class CryptoOutputTest { byte[] data = TestUtils.hexToBytes(hex); List items = CborDecoder.decode(data); CryptoOutput cryptoOutput = CryptoOutput.fromCbor(items.get(0)); - Assert.assertEquals(List.of(ScriptExpression.WITNESS_SCRIPT_HASH, ScriptExpression.MULTISIG), cryptoOutput.getScriptExpressions()); + Assert.assertEquals(Arrays.asList(ScriptExpression.WITNESS_SCRIPT_HASH, ScriptExpression.MULTISIG), cryptoOutput.getScriptExpressions()); Assert.assertNull(cryptoOutput.getHdKey()); Assert.assertEquals(1, cryptoOutput.getMultiKey().getThreshold());