Skip to content

Commit

Permalink
feat: fix incorrect index at method encodeFullBech32 (#576)
Browse files Browse the repository at this point in the history
  • Loading branch information
fjchen7 committed Jul 12, 2022
1 parent e69e34f commit f25fb8b
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ public String encodeFullBech32() {
if (script.hashType == Script.HashType.TYPE) {
payload[0] = 0x04;
} else if (script.hashType == Script.HashType.DATA) {
payload[1] = 0x02;
payload[0] = 0x02;
} else {
throw new AddressFormatException("Unknown script hash type");
}
Expand Down
130 changes: 69 additions & 61 deletions core/src/test/java/utils/AddressTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,79 +14,73 @@ public class AddressTest {
/**
* Addresses for test come from https://github.com/rev-chaos/ckb-address-demo.
*/
private Script secp256k1Blake160Script = new Script(
Numeric.hexStringToByteArray("0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8"),
Numeric.hexStringToByteArray("0xb39bbc0b3673c7d36450bc14cfcdad2d559c6c64"),
Script.HashType.TYPE);
private Script multiSignScript = new Script(
Numeric.hexStringToByteArray("0x5c5069eb0857efc65e1bca0c07df34c31663b3622fd3876c876320fc9634e2a8"),
Numeric.hexStringToByteArray("0x4fb2be2e5d0c1a3b8694f832350a33c1685d477a"),
Script.HashType.TYPE);
private Script acpScript = new Script(
Numeric.hexStringToByteArray("0xd369597ff47f29fbc0d47d2e3775370d1250b85140c670e4718af712983a2354"),
Numeric.hexStringToByteArray("bd07d9f32bce34d27152a6a0391d324f79aab854"),
Script.HashType.TYPE);

private Script script4 = new Script(
Numeric.hexStringToByteArray("9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8"),
Numeric.hexStringToByteArray("b39bbc0b3673c7d36450bc14cfcdad2d559c6c64"),
Script.HashType.DATA);

@Test
@SuppressWarnings("deprecation")
public void testEncode() {
Address address = new Address(secp256k1Blake160Script, Network.MAINNET);
assertEquals("ckb1qyqt8xaupvm8837nv3gtc9x0ekkj64vud3jqfwyw5v",
address.encodeShort());
assertEquals("ckb1qjda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xw3vumhs9nvu786dj9p0q5elx66t24n3kxgj53qks",
address.encodeFullBech32());
assertEquals("ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqdnnw7qkdnnclfkg59uzn8umtfd2kwxceqxwquc4",
address.encodeFullBech32m());
public void testDecodeDecode() {
// Short
Script script = generateScript(Script.SECP256K1_BLAKE160_SIGNHASH_ALL_CODE_HASH,
"b39bbc0b3673c7d36450bc14cfcdad2d559c6c64", Script.HashType.TYPE);
testShort(script, Network.MAINNET, "ckb1qyqt8xaupvm8837nv3gtc9x0ekkj64vud3jqfwyw5v");
testShort(script, Network.TESTNET, "ckt1qyqt8xaupvm8837nv3gtc9x0ekkj64vud3jq5t63cs");

assertEquals("ckb1qyq5lv479ewscx3ms620sv34pgeuz6zagaaqklhtgg",
new Address(multiSignScript, Network.MAINNET).encodeShort());
assertEquals("ckt1qyq5lv479ewscx3ms620sv34pgeuz6zagaaqt6f5y5",
new Address(multiSignScript, Network.TESTNET).encodeShort());
script = generateScript(Script.SECP256K1_BLAKE160_MULTISIG_ALL_CODE_HASH,
"4fb2be2e5d0c1a3b8694f832350a33c1685d477a", Script.HashType.TYPE);
testShort(script, Network.MAINNET, "ckb1qyq5lv479ewscx3ms620sv34pgeuz6zagaaqklhtgg");
testShort(script, Network.TESTNET, "ckt1qyq5lv479ewscx3ms620sv34pgeuz6zagaaqt6f5y5");

assertEquals("ckb1qypt6p7e7v4uudxjw9f2dgper5ey77d2hp2qxz4u4u",
new Address(acpScript, Network.MAINNET).encodeShort());
script = generateScript(Script.ANY_CAN_PAY_CODE_HASH_MAINNET,
"bd07d9f32bce34d27152a6a0391d324f79aab854", Script.HashType.TYPE);
testShort(script, Network.MAINNET, "ckb1qypt6p7e7v4uudxjw9f2dgper5ey77d2hp2qxz4u4u");
script = generateScript(Script.ANY_CAN_PAY_CODE_HASH_TESTNET,
"bd07d9f32bce34d27152a6a0391d324f79aab854", Script.HashType.TYPE);
testShort(script, Network.TESTNET, "ckt1qypt6p7e7v4uudxjw9f2dgper5ey77d2hp2qm8treq");

assertEquals("ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq9nnw7qkdnnclfkg59uzn8umtfd2kwxceqvguktl",
new Address(script4, Network.MAINNET).encodeFullBech32m());
assertEquals("ckt1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq9nnw7qkdnnclfkg59uzn8umtfd2kwxceqz6hep8",
new Address(script4, Network.TESTNET).encodeFullBech32m());
}
// Full bech32
script = generateScript("9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8",
"b39bbc0b3673c7d36450bc14cfcdad2d559c6c64", Script.HashType.DATA);
testFullBech32(script, Network.MAINNET, "ckb1q2da0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xw3vumhs9nvu786dj9p0q5elx66t24n3kxgdwd2q8");
testFullBech32(script, Network.TESTNET, "ckt1q2da0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xw3vumhs9nvu786dj9p0q5elx66t24n3kxgqd588c");
script = generateScript("9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8",
"b39bbc0b3673c7d36450bc14cfcdad2d559c6c64", Script.HashType.TYPE);
testFullBech32(script, Network.MAINNET, "ckb1qjda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xw3vumhs9nvu786dj9p0q5elx66t24n3kxgj53qks");
testFullBech32(script, Network.TESTNET, "ckt1qjda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xw3vumhs9nvu786dj9p0q5elx66t24n3kxglhgd30");

@Test
public void testDecode() {
Address expected = new Address(secp256k1Blake160Script, Network.MAINNET);
// short format
Address actual = Address.decode("ckb1qyqt8xaupvm8837nv3gtc9x0ekkj64vud3jqfwyw5v");
assertEquals(expected, actual);
// long bech32 format
actual = Address.decode("ckb1qjda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xw3vumhs9nvu786dj9p0q5elx66t24n3kxgj53qks");
assertEquals(expected, actual);
// long bech32m format
actual = Address.decode("ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqdnnw7qkdnnclfkg59uzn8umtfd2kwxceqxwquc4");
assertEquals(expected, actual);
// Full bech32m
script = generateScript("9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8",
"b39bbc0b3673c7d36450bc14cfcdad2d559c6c64", Script.HashType.DATA);
testFullBech32m(script, Network.MAINNET, "ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq9nnw7qkdnnclfkg59uzn8umtfd2kwxceqvguktl");
testFullBech32m(script, Network.TESTNET, "ckt1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq9nnw7qkdnnclfkg59uzn8umtfd2kwxceqz6hep8");

script = generateScript("9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8",
"b39bbc0b3673c7d36450bc14cfcdad2d559c6c64", Script.HashType.TYPE);
testFullBech32m(script, Network.MAINNET, "ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqdnnw7qkdnnclfkg59uzn8umtfd2kwxceqxwquc4");
testFullBech32m(script, Network.TESTNET, "ckt1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqdnnw7qkdnnclfkg59uzn8umtfd2kwxceqgutnjd");

actual = Address.decode("ckb1qyq5lv479ewscx3ms620sv34pgeuz6zagaaqklhtgg");
assertEquals(new Address(multiSignScript, Network.MAINNET), actual);
actual = Address.decode("ckt1qyq5lv479ewscx3ms620sv34pgeuz6zagaaqt6f5y5");
assertEquals(new Address(multiSignScript, Network.TESTNET), actual);
script = generateScript("9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8",
"b39bbc0b3673c7d36450bc14cfcdad2d559c6c64", Script.HashType.DATA1);
testFullBech32m(script, Network.MAINNET, "ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq4nnw7qkdnnclfkg59uzn8umtfd2kwxceqcydzyt");
testFullBech32m(script, Network.TESTNET, "ckt1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq4nnw7qkdnnclfkg59uzn8umtfd2kwxceqkkxdwn");
}

actual = Address.decode("ckb1qypt6p7e7v4uudxjw9f2dgper5ey77d2hp2qxz4u4u");
assertEquals(new Address(acpScript, Network.MAINNET), actual);
private void testShort(Script script, Network network, String encoded) {
Address address = new Address(script, network);
assertEquals(encoded, address.encodeShort());
assertEquals(address, Address.decode(encoded));
}

actual = Address.decode("ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq9nnw7qkdnnclfkg59uzn8umtfd2kwxceqvguktl");
assertEquals(new Address(script4, Network.MAINNET), actual);
actual = Address.decode("ckt1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq9nnw7qkdnnclfkg59uzn8umtfd2kwxceqz6hep8");
assertEquals(new Address(script4, Network.TESTNET), actual);
private void testFullBech32(Script script, Network network, String encoded) {
Address address = new Address(script, network);
assertEquals(encoded, address.encodeFullBech32());
assertEquals(address, Address.decode(encoded));
}

private void testFullBech32m(Script script, Network network, String encoded) {
Address address = new Address(script, network);
assertEquals(encoded, address.encodeFullBech32m());
assertEquals(address, Address.decode(encoded));
}

@Test
void testInvalidDecode() {
public void testInvalidDecode() {
// These invalid addresses come form https://github.com/nervosnetwork/ckb-sdk-rust/pull/7/files
// INVALID bech32 encoding
assertThrows(AddressFormatException.class, () -> Address.decode("ckb1qyqylv479ewscx3ms620sv34pgeuz6zagaaqh0knz7"));
Expand All @@ -101,4 +95,18 @@ void testInvalidDecode() {
assertThrows(AddressFormatException.class, () -> Address.decode("ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqz0k2lzuhgvrgacvhcym08"));
assertThrows(AddressFormatException.class, () -> Address.decode("ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqj0k2lzuhgvrgacvnhnzl8"));
}

private Script generateScript(String codeHash, String args, Script.HashType hashType) {
return new Script(
Numeric.hexStringToByteArray(codeHash),
Numeric.hexStringToByteArray(args),
hashType);
}

private Script generateScript(byte[] codeHash, String args, Script.HashType hashType) {
return new Script(
codeHash,
Numeric.hexStringToByteArray(args),
hashType);
}
}

0 comments on commit f25fb8b

Please sign in to comment.