Skip to content

Commit ebb8d01

Browse files
authored
Merge pull request #8 from bitcoin-education/script-to-address
adding script to address methods
2 parents c1b1980 + 453ce85 commit ebb8d01

5 files changed

Lines changed: 80 additions & 9 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Add the following dependency to your pom.xml:
88
<dependency>
99
<groupId>io.github.bitcoin-education</groupId>
1010
<artifactId>bitcoin-java</artifactId>
11-
<version>0.3.2</version>
11+
<version>0.4.0</version>
1212
</dependency>
1313
```
1414

@@ -30,7 +30,7 @@ Add the following plugin goal:
3030
<artifactItem>
3131
<groupId>io.github.bitcoin-education</groupId>
3232
<artifactId>bitcoin-java</artifactId>
33-
<version>0.3.2</version>
33+
<version>0.4.0</version>
3434
<overWrite>true</overWrite>
3535
<outputDirectory>${project.build.directory}/classes</outputDirectory>
3636
<destFileName>wordlist.txt</destFileName>

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>io.github.bitcoin-education</groupId>
88
<artifactId>bitcoin-java</artifactId>
9-
<version>0.3.2</version>
9+
<version>0.4.0</version>
1010
<name>${project.groupId}:${project.artifactId}</name>
1111
<description>A Bitcoin library written in Java</description>
1212
<url>https://github.com/bitcoin-education/bitcoin-java</url>

src/main/java/io/github/bitcoineducation/bitcoinjava/Base58.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,8 @@ private static boolean isValidAddress(byte[] combined, byte[] checksum) {
9292
public static String encodeFromHex(String key) {
9393
return encode(Hex.decodeStrict(key));
9494
}
95+
96+
public static String encodeWithChecksumFromHex(String key) {
97+
return encodeWithChecksum(Hex.decodeStrict(key));
98+
}
9599
}

src/main/java/io/github/bitcoineducation/bitcoinjava/Script.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,18 @@ public List<Object> getCommands() {
116116
return commands;
117117
}
118118

119+
public String p2pkhAddress(String prefix) {
120+
return Base58.encodeWithChecksumFromHex(prefix.concat((String) commands.get(2)));
121+
}
122+
123+
public String p2wpkhAddress(String prefix) {
124+
return Bech32.encode(prefix, 0, Hex.decodeStrict((String) commands.get(1)));
125+
}
126+
127+
public String p2trAddress(String prefix) {
128+
return Bech32.encode(prefix, 1, Hex.decodeStrict((String) commands.get(1)));
129+
}
130+
119131
public String p2shAddress(String prefix) {
120132
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
121133
byteArrayOutputStream.writeBytes(Hex.decodeStrict(prefix));

src/test/java/ScriptTest.java

Lines changed: 61 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22
import org.bouncycastle.jce.provider.BouncyCastleProvider;
33
import org.bouncycastle.util.encoders.Hex;
44
import org.junit.jupiter.api.Test;
5+
import org.junit.jupiter.params.ParameterizedTest;
6+
import org.junit.jupiter.params.provider.Arguments;
7+
import org.junit.jupiter.params.provider.MethodSource;
58

69
import java.io.ByteArrayInputStream;
710
import java.io.IOException;
811
import java.security.Security;
912
import java.util.List;
13+
import java.util.stream.Stream;
1014

1115
import static io.github.bitcoineducation.bitcoinjava.OpCodes.*;
1216
import static java.math.BigInteger.valueOf;
@@ -106,12 +110,6 @@ public void p2trScript() {
106110
assertEquals(script.getType(), Script.P2TR);
107111
}
108112

109-
@Test
110-
public void p2pkhScript() {
111-
Script script = Script.p2pkhScript(Base58.decodeWithChecksumToHex("1GtpSrGhRGY5kkrNz4RykoqRQoJuG2L6DS"));
112-
assertEquals(script.getType(), Script.P2PKH);
113-
}
114-
115113
@Test
116114
public void p2wshScript2() {
117115
Script redeemScript = new Script(List.of(
@@ -120,4 +118,61 @@ public void p2wshScript2() {
120118
));
121119
assertEquals("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", redeemScript.p2wshAddress(AddressConstants.TESTNET_P2WPKH_ADDRESS_PREFIX));
122120
}
121+
122+
@ParameterizedTest
123+
@MethodSource("p2wpkhAddressParameters")
124+
public void p2wpkhAddress(String address, String prefix) {
125+
Script script = Script.p2wpkhScript(Bech32.decode(prefix, address)[1]);
126+
assertEquals(script.p2wpkhAddress(prefix), address);
127+
}
128+
129+
@ParameterizedTest
130+
@MethodSource("p2trAddressParameters")
131+
public void p2trAddress(String address, String prefix) {
132+
Script script = Script.p2trScript(Bech32.decode(prefix, address)[1]);
133+
assertEquals(script.p2trAddress(prefix), address);
134+
}
135+
136+
@ParameterizedTest
137+
@MethodSource("p2pkhScriptParameters")
138+
public void p2pkhScript(String address, String prefix) {
139+
Script script = Script.p2pkhScript(Base58.decodeWithChecksumToHex(address));
140+
assertEquals(script.getType(), Script.P2PKH);
141+
assertEquals(script.p2pkhAddress(prefix), address);
142+
}
143+
144+
public static Stream<Arguments> p2trAddressParameters() {
145+
return Stream.of(
146+
Arguments.of("tb1psmxksw0jx8eu5ds5yphsszyjagw5ug2ce2z35j0mk8ytkunh3f2sugn56k", AddressConstants.TESTNET_P2WPKH_ADDRESS_PREFIX),
147+
Arguments.of("bc1p5cyxnuxmeuwuvkwfem96lqzszd02n6xdcjrs20cac6yqjjwudpxqkedrcr", AddressConstants.MAINNET_P2WPKH_ADDRESS_PREFIX),
148+
Arguments.of("bc1p4qhjn9zdvkux4e44uhx8tc55attvtyu358kutcqkudyccelu0was9fqzwh", AddressConstants.MAINNET_P2WPKH_ADDRESS_PREFIX),
149+
Arguments.of("bc1p3qkhfews2uk44qtvauqyr2ttdsw7svhkl9nkm9s9c3x4ax5h60wqwruhk7", AddressConstants.MAINNET_P2WPKH_ADDRESS_PREFIX)
150+
);
151+
}
152+
153+
public static Stream<Arguments> p2wpkhAddressParameters() {
154+
return Stream.of(
155+
Arguments.of("tb1q63rv8027mnhszkmf0f5qkxhk48r9tcyk0n6m8l", AddressConstants.TESTNET_P2WPKH_ADDRESS_PREFIX),
156+
Arguments.of("bcrt1qq5p8alfstj5fwqaj89xr0ssaadcmg6px98hsq5", AddressConstants.REGTEST_P2WPKH_ADDRESS_PREFIX),
157+
Arguments.of("bc1q3qau48a0gs3yya4fd5pm2qqm88rzh7j83ypcs9", AddressConstants.MAINNET_P2WPKH_ADDRESS_PREFIX),
158+
Arguments.of("bc1qlm2ukja7p7u6yjdphanj34dekd6p4f24vap4f9", AddressConstants.MAINNET_P2WPKH_ADDRESS_PREFIX),
159+
Arguments.of("bc1qjgl6gkfdkte0556v6sgwnunrnr54p39msm38na", AddressConstants.MAINNET_P2WPKH_ADDRESS_PREFIX)
160+
);
161+
}
162+
163+
public static Stream<Arguments> p2pkhScriptParameters() {
164+
return Stream.of(
165+
Arguments.of("1GtpSrGhRGY5kkrNz4RykoqRQoJuG2L6DS", AddressConstants.MAINNET_P2PKH_ADDRESS_PREFIX),
166+
Arguments.of("1osGyLLcLGuLmadLy2vZ7y5ZkaefxoEMu", AddressConstants.MAINNET_P2PKH_ADDRESS_PREFIX),
167+
Arguments.of("1FNSrAooN1cN85rXBAsHak5JxXgZPsNAXs", AddressConstants.MAINNET_P2PKH_ADDRESS_PREFIX),
168+
Arguments.of("19RXAAj2WFyBXbVWcoGUANn3SWma61DGVW", AddressConstants.MAINNET_P2PKH_ADDRESS_PREFIX),
169+
Arguments.of("1Dx9NMqtbpoaZvJRWmX1Ej9cK1GVoubyed", AddressConstants.MAINNET_P2PKH_ADDRESS_PREFIX),
170+
Arguments.of("moQMmyts9f3u3Th1zdQVvvK3GWKpNSQeaM", AddressConstants.TESTNET_P2PKH_ADDRESS_PREFIX),
171+
Arguments.of("mzUce6b1PmmSKqNWZfgkMpj3rnZ4rrsP9v", AddressConstants.TESTNET_P2PKH_ADDRESS_PREFIX),
172+
Arguments.of("mux4bhrfGMDrvdLeSqSpVy6tpCG9GDqPMN", AddressConstants.TESTNET_P2PKH_ADDRESS_PREFIX),
173+
Arguments.of("mzNdm9Caku7C8MvTMXhu4DCtVm27LBwhAA", AddressConstants.TESTNET_P2PKH_ADDRESS_PREFIX),
174+
Arguments.of("mj71KbiTptpzRXBVJknYKaAG8Z5Nxx63Df", AddressConstants.TESTNET_P2PKH_ADDRESS_PREFIX)
175+
);
176+
}
177+
123178
}

0 commit comments

Comments
 (0)