package io.rudefox.cold; import com.bjdweck.test.CliTestFixture; import org.junit.jupiter.api.Test; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import static org.junit.jupiter.api.Assertions.assertEquals; class wallet_command_tests extends CliTestFixture { static { OUTPUT_CHARSET = "UTF8"; } @Test void with_sentence_and_passphrase_should_output_xpub() throws UnsupportedEncodingException { withArgs(new String[] {"wallet", "--sentence","stove prefer lunch collect small orphan wasp size beyond auction guilt great", "--passphrase","apple", "listxpub"}); doMain(); assertEquals("[39F8B071:m/44'/0'/0']xpub6CKy5SECeJipZid8dF3bopoMGdRzd7hMJuPzMGesZCobrMSssZyASexzXuzRTPVLcqqdyAEZJKPMGvDthgZW2Z3mPHLohxEAVbkvGKAXjqx" + EOL, getOutput()); } @Test void with_testnet_sentence_and_passphrase_and_witness_should_output_vpub() throws UnsupportedEncodingException { withArgs(new String[] {"--testnet", "wallet", "--sentence","icon issue absorb apology price atom bread toward worry final dune dial swing armor donkey", "--passphrase","apple", "listxpub", "--purpose","P2WPKH", "--account","6"}); doMain(); assertEquals("[CBACA81C:m/84'/1'/6']vpub5Z1KP7PJ8f85AqbvPMKeFHxmDfrgimiAar3KqwCzfsw65tmFLevm4MJX9cRcoiERYkjeG5Z3VwhSf1E3fVBFF86J33CHSED45Hk6kLZumqV" + EOL, getOutput()); } @Test void with_testnet_sentence_and_passphrase_and_witness_should_output_addresses() throws UnsupportedEncodingException { withArgs(new String[] {"--testnet", "wallet", "--sentence","icon issue absorb apology price atom bread toward worry final dune dial swing armor donkey", "--passphrase","apple", "listaddress", "--purpose","P2WPKH", "--account","6", "--address-chain","INTERNAL", "--address-seq","3", "--count","5"}); doMain(); assertEquals("CBACA81C:m/84'/1'/6'/1/3: tb1qs7cnr9sql9nef5e95jk5t7pr2qwpjsqtffnuxj" + EOL + "CBACA81C:m/84'/1'/6'/1/4: tb1qgl947tylg3tazgdy2rm3rs4gxheue707dkg3q2" + EOL + "CBACA81C:m/84'/1'/6'/1/5: tb1q03n6q2jjeks9zaneglqz5g37xkcrzy8nh8hn6s" + EOL + "CBACA81C:m/84'/1'/6'/1/6: tb1q50gylhzz2mrf76ffn7dc5zvymsd9lghj24t7ns" + EOL + "CBACA81C:m/84'/1'/6'/1/7: tb1qvzkez0zg6xm9z780n0358xp7nx96fh508awktw" + EOL, getOutput()); } @Test void with_testnet_sentence_and_passphrase_and_witness_can_sign_psbt() throws UnsupportedEncodingException { withArgs(new String[] {"--testnet", "wallet", "--sentence","vibrant delay limit tenant prepare reflect lonely pepper dragon calm dolphin prize slide inch purse term raw eternal twin kidney scan power magnet humble", "signpsbt", "cHNidP8BAHcCAAAAAS/zE49gxbTp0n4mTv0wPV7KuLtQlbzTL/E9s4b4JKl/AQAAAAD/////AkAfAAAAAAAAGXapFE9U1GY" + "KflieNl1PUIpdTTzcXnUkiKxiyR4AAAAAABl2qRR6uJziLUo4i7ooJyzxIctMZfxb5IisAAAAAE8BBDWHzwOP9tWogAAAAN/zgjOY" + "H39q085n7GG+5+/Jtovkvc8WQftwMSsBV7svAhPpi88y7pGhXzOdH0iJbXJsMq3F9GNRnRyqkQ7hVEtjEI2C0R8sAACAAQAAgAAAA" + "IAAAQDeAQAAAAGVcHJZzeDV1JsQv869yoS/f8eSufNKON0o56ChVEnxCwEAAABqRzBEAiAD95mxgC+CHJNt1Ui+Y/raIymIiK1fyV" + "c9wx0EALk/uQIgdQS27tjyujeItDg96m5GR7UD5tIz+95A4RQX4YOXXZoBIQNsvOVlbTqbZoKJbx8z94F6C/xS4faQ2XsHINcd50q" + "T5P////8CQB8AAAAAAAAWABRzMqPZdHy0JMwPKY/YRhrODmyijpzpHgAAAAAAGXapFKmSAlpRxRJXr8ywpN500rXVsxIHiKwAAAAA" + "IgYCUEaaspCm8AVu5WJ9Z7RG53iW66Btq6QODz7xfMlRogoYjYLRHywAAIABAACAAAAAgAEAAAADAAAAAAAA"}); doMain(); assertEquals("cHNidP8BAHcCAAAAAS/zE49gxbTp0n4mTv0wPV7KuLtQlbzTL/E9s4b4JKl/AQAAAAD/////AkAfAAAAAAAAGXapFE9U1GYKflieNl1PUIpdTTzcXnUkiKxiyR4AAAAAABl2qRR6uJziLUo4i7ooJyzxIctMZfxb5IisAAAAAE8BBDWHzwOP9tWogAAAAN/zgjOYH39q085n7GG+5+/Jtovkvc8WQftwMSsBV7svAhPpi88y7pGhXzOdH0iJbXJsMq3F9GNRnRyqkQ7hVEtjEI2C0R8sAACAAQAAgAAAAIAAAQDeAQAAAAGVcHJZzeDV1JsQv869yoS/f8eSufNKON0o56ChVEnxCwEAAABqRzBEAiAD95mxgC+CHJNt1Ui+Y/raIymIiK1fyVc9wx0EALk/uQIgdQS27tjyujeItDg96m5GR7UD5tIz+95A4RQX4YOXXZoBIQNsvOVlbTqbZoKJbx8z94F6C/xS4faQ2XsHINcd50qT5P////8CQB8AAAAAAAAWABRzMqPZdHy0JMwPKY/YRhrODmyijpzpHgAAAAAAGXapFKmSAlpRxRJXr8ywpN500rXVsxIHiKwAAAAAIgYCUEaaspCm8AVu5WJ9Z7RG53iW66Btq6QODz7xfMlRogoYjYLRHywAAIABAACAAAAAgAEAAAADAAAAIgICUEaaspCm8AVu5WJ9Z7RG53iW66Btq6QODz7xfMlRogpIMEUCIQCrgKRLUmzYL8edfZ7cltQWnLdVdU2Ta3BYbu5NR8JYwgIgDeOEdkOmOkPp7HpC4dkniXvXsvfzagmJ6pkBDd2DcgwBAAAA" + EOL, getOutput()); } @Test void with_sentence_without_passphrase_should_output_xpub() throws UnsupportedEncodingException { withArgs(new String[] {"wallet", "--sentence","ordinary debate stomach mix poverty upset amateur small sadness female general fabric", "listxpub"}); doMain(); assertEquals("[A6932DE1:m/44'/0'/0']xpub6BjcsZDafUukJNMhD1Porw4SZB1RkiCE7EsQWJGVaMcZd9qXyawcjeVa28SJt5WNNAKJGGUbebfgzyrsWPTsLRkWmMNwrThaq8umcp7Yzn8" + EOL, getOutput()); } @Test void with_sentence_without_passphrase_should_output_xpub_qrcode() throws UnsupportedEncodingException { withArgs(new String[] {"wallet", "--sentence","ordinary debate stomach mix poverty upset amateur small sadness female general fabric", "listxpub", "--qrcode"}); String ExpectedQRCode = "█▀▀▀▀▀█ █ ▄ ██▀▄▄ ▀▀ ▀ █ ██▄ █▀▀▀▀▀█\n" + "█ ███ █ █▄ ▄▀▄█ ▄▄█▄▀███▄█▄▀█▄██ █ ███ █\n" + "█ ▀▀▀ █ ▄▄▄█ ▀▀ ▄ ▀█▀▄▀▀ ▄▀▀▀ █ █ ▀▀▀ █\n" + "▀▀▀▀▀▀▀ ▀ ▀ ▀ ▀▄█▄▀ ▀▄▀ ▀ ▀ ▀▄█▄█ ▀▀▀▀▀▀▀\n" + "▀▀▄ ▀▀▀▄ ▀ ▀█▄▄▄▄▀▀█ █ ▀█▄▀█▀▄█▀ █▄▀█▀▀\n" + "▀▄ ▀█ ▀▄▄▀ █ ▄▀██▄▄▀▄ ▀█▀ █▀█▀▄ █▀███ █\n" + "███▄▀▀▀▄█ █▀▀█▀▀▄▄▀█▀ █▄▀█ ▄█ ▄ ▀▄▄▄█ ▄▄\n" + " ▀ ▄▀▄█▄▄ ▄ ▄ ▀█▄█▄█▀██▀ █ █ ▄▀▄█ █▀▄█\n" + " ▀▄ ▄█▀█▀ ▀▀ ▀█▄█ ▀▄██▄▄▀█▀ ▄█▀▀▄████ \n" + "▄ ▄▀█▄▀ █████▀▀▄ ▀ ██▀██ ▀▀ ▄▄▄▀▄▀▄▀ ▀▄▀\n" + " █▄▄ ▀▀█▄█ ▄█▄ ▀ ▄▄▄▀█▄▀▄▄ ▄ ▄ ▀▄▄▄▄ ██\n" + "▀▀█▀▀▄▀ ▄█▀▀ █▄█▄ ▀▄ ██ ▄█ █▀▄ ▀██▀▄▀▄█\n" + "▀▄█ ▄▀ ▄ █▄▄▄▀▄▄ █▀▄▀ ▀▀ ███▀▀▀▀▄█▄▀█ ▀\n" + "▀ ▄█ ▀▀ ▄▀ █▄ ▄▀ █▄ ▀▄█▀▀ ▀██▀ █ ▀▄▀▄▀▄▀\n" + "█▀█▄▀▀▀ ██▄ ▀▀▀ ▄▄▀█▀█▀▄ ▄▄▄▄ ▀ █▄▄▄▀███\n" + " ▀██▀▀▀█▀ ▄ ▀█ █▄▄██ ▀ ▀ █▄ ▀▄▀ █▀ ▀\n" + "▀▀ ▀▀▄▀▀█ ▀ ███ ▀▄▀▀▀▄▄▄█ █▀▀▀███▀▀\n" + "█▀▀▀▀▀█ ▄█▀▀ █▀█▄ ▀▄▄▄▄█▀ ▄▀ ▄ ██ ▀ █▄▀ ▀\n" + "█ ███ █ ▀▀█▀▄█▄ ▀▄▄██▀▄█▄ ▀█▀▄▀██▀▀▀▀▄▀▄\n" + "█ ▀▀▀ █ ▄█ █▀▀▄█▄█▄ ▄ █▀▀▄▀▄█ █▄▄▀▄▄█▀▄█\n" + "▀▀▀▀▀▀▀ ▀ ▀ ▀▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀▀ " + EOL; doMain(); assertEquals(ExpectedQRCode, getOutput()); } private void doMain() { setInput(); ServiceLocator.DEFAULT_CHARSET = StandardCharsets.UTF_8; RudefoxCold.main(getArgs()); } }