Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
3.85% |
1 / 26 |
|
50.00% |
1 / 2 |
CRAP | |
0.00% |
0 / 1 |
| BitWasp_API | |
3.85% |
1 / 26 |
|
50.00% |
1 / 2 |
38.00 | |
0.00% |
0 / 1 |
| __construct | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| generate_address | |
0.00% |
0 / 25 |
|
0.00% |
0 / 1 |
30 | |||
| 1 | <?php |
| 2 | /** |
| 3 | * The local PHP library for generating addresses. |
| 4 | * |
| 5 | * @see https://github.com/Bit-Wasp/bitcoin-php |
| 6 | * @see https://gist.github.com/mariodian/5b67a1f315a74a7753a6f23d0198ec48 |
| 7 | * |
| 8 | * @package brianhenryie/bh-wp-bitcoin-gateway |
| 9 | */ |
| 10 | |
| 11 | namespace BrianHenryIE\WP_Bitcoin_Gateway\API\Addresses; |
| 12 | |
| 13 | use BrianHenryIE\WP_Bitcoin_Gateway\API\Generate_Address_API_Interface; |
| 14 | use Exception; |
| 15 | use BrianHenryIE\WP_Bitcoin_Gateway\BitWasp\Bitcoin\Address\AddressCreator; |
| 16 | use BrianHenryIE\WP_Bitcoin_Gateway\BitWasp\Bitcoin\Bitcoin; |
| 17 | use BrianHenryIE\WP_Bitcoin_Gateway\BitWasp\Bitcoin\Key\Deterministic\HdPrefix\GlobalPrefixConfig; |
| 18 | use BrianHenryIE\WP_Bitcoin_Gateway\BitWasp\Bitcoin\Key\Deterministic\HdPrefix\NetworkConfig; |
| 19 | use BrianHenryIE\WP_Bitcoin_Gateway\BitWasp\Bitcoin\Key\Deterministic\Slip132\Slip132; |
| 20 | use BrianHenryIE\WP_Bitcoin_Gateway\BitWasp\Bitcoin\Key\KeyToScript\KeyToScriptHelper; |
| 21 | use BrianHenryIE\WP_Bitcoin_Gateway\BitWasp\Bitcoin\Network\NetworkFactory; |
| 22 | use BrianHenryIE\WP_Bitcoin_Gateway\BitWasp\Bitcoin\Network\Slip132\BitcoinRegistry; |
| 23 | use BrianHenryIE\WP_Bitcoin_Gateway\BitWasp\Bitcoin\Serializer\Key\HierarchicalKey\Base58ExtendedKeySerializer; |
| 24 | use BrianHenryIE\WP_Bitcoin_Gateway\BitWasp\Bitcoin\Serializer\Key\HierarchicalKey\ExtendedKeySerializer; |
| 25 | use Psr\Log\LoggerAwareTrait; |
| 26 | use Psr\Log\LoggerInterface; |
| 27 | |
| 28 | /** |
| 29 | * Use Bitwasp API to generate public addresses. |
| 30 | */ |
| 31 | class BitWasp_API implements Generate_Address_API_Interface { |
| 32 | use LoggerAwareTrait; |
| 33 | |
| 34 | /** |
| 35 | * Constructor. |
| 36 | * |
| 37 | * @param LoggerInterface $logger PSR Logger. |
| 38 | */ |
| 39 | public function __construct( LoggerInterface $logger ) { |
| 40 | $this->setLogger( $logger ); |
| 41 | } |
| 42 | |
| 43 | /** |
| 44 | * Generate the nth address for the given xpub|ypub|zpub. |
| 45 | * |
| 46 | * @param string $public_address The wallet address. |
| 47 | * @param int $nth Derive path nth address in sequence. |
| 48 | * |
| 49 | * @return string |
| 50 | * @throws Exception Failed to generate address. |
| 51 | */ |
| 52 | public function generate_address( string $public_address, int $nth ): string { |
| 53 | |
| 54 | $path = "0/$nth"; |
| 55 | |
| 56 | $adapter = Bitcoin::getEcAdapter(); |
| 57 | $helper = new KeyToScriptHelper( $adapter ); |
| 58 | $slip132 = new Slip132( $helper ); |
| 59 | $bitcoin_prefixes = new BitcoinRegistry(); |
| 60 | |
| 61 | switch ( substr( $public_address, 0, 4 ) ) { |
| 62 | case 'xpub': |
| 63 | /** |
| 64 | * Pay-to-Pubkey Hash. |
| 65 | * |
| 66 | * TODO: This also applies to 'tpub'? |
| 67 | * |
| 68 | * @see https://en.bitcoinwiki.org/wiki/Pay-to-Pubkey_Hash |
| 69 | */ |
| 70 | $pub_prefix = $slip132->p2pkh( $bitcoin_prefixes ); |
| 71 | break; |
| 72 | case 'ypub': |
| 73 | /** |
| 74 | * TODO: Pay To Script Hash - Pay to Witness Script Hash ? |
| 75 | */ |
| 76 | $pub_prefix = $slip132->p2shP2wpkh( $bitcoin_prefixes ); |
| 77 | break; |
| 78 | case 'zpub': |
| 79 | /** |
| 80 | * Pay to Witness Public Key Hash. |
| 81 | * |
| 82 | * TODO: This also applies to 'vpub'? |
| 83 | * |
| 84 | * @see https://programmingblockchain.gitbook.io/programmingblockchain/other_types_of_ownership/p2wpkh_pay_to_witness_public_key_hash |
| 85 | */ |
| 86 | $pub_prefix = $slip132->p2wpkh( $bitcoin_prefixes ); |
| 87 | break; |
| 88 | default: |
| 89 | throw new Exception( 'Bad public key' ); |
| 90 | } |
| 91 | |
| 92 | $network = NetworkFactory::bitcoin(); |
| 93 | |
| 94 | $network_config = new NetworkConfig( $network, array( $pub_prefix ) ); |
| 95 | $config = new GlobalPrefixConfig( array( $network_config ) ); |
| 96 | |
| 97 | $serializer = new Base58ExtendedKeySerializer( |
| 98 | new ExtendedKeySerializer( $adapter, $config ) |
| 99 | ); |
| 100 | |
| 101 | $key = $serializer->parse( $network, $public_address ); |
| 102 | $child_key = $key->derivePath( $path ); |
| 103 | |
| 104 | return $child_key->getAddress( new AddressCreator() )->getAddress(); |
| 105 | } |
| 106 | } |