bitcoin/bips
Comprehensive collection of Bitcoin Improvement Proposals (BIPs) in one place. Browse specifications for Bitcoin standards, consensus rules, wallets, and protocols, with the full text and history of each BIP for quick reference and research.
Installation
composer require bitcoin/bips
No additional configuration is needed—this is a pure PHP library with no Laravel-specific dependencies.
First Use Case: Fetching a BIP
use Bitcoin\Bitcoin;
use Bitcoin\Network\NetworkFactory;
$network = NetworkFactory::mainnet();
$bitcoin = new Bitcoin($network);
// Fetch BIP-21 (URI Scheme)
$bip21 = $bitcoin->getBip(21);
echo $bip21->getTitle(); // Output: "Bitcoin URI Scheme"
Where to Look First
$bitcoin->getBips() (returns an array of BIP objects).NetworkFactory to switch between mainnet, testnet, or regtest.Validating Bitcoin Addresses (BIP-173)
$network = NetworkFactory::mainnet();
$bitcoin = new Bitcoin($network);
$bip173 = $bitcoin->getBip(173);
$isValid = $bip173->validateAddress('1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'); // true
Parsing URIs (BIP-21)
$bip21 = $bitcoin->getBip(21);
$uri = $bip21->parseUri('bitcoin:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa?amount=0.1');
echo $uri->getAddress(); // 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
echo $uri->getAmount(); // 0.1
Generating Bech32 Addresses (BIP-173)
$bip173 = $bitcoin->getBip(173);
$bech32 = $bip173->generateBech32Address('bc', '0014751e76e8199196d454941c45d1b3a323f1433bd6');
echo $bech32; // bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq
Integration with Laravel Requests
use Illuminate\Http\Request;
public function handleBitcoinUri(Request $request) {
$uri = $request->input('bitcoin_uri');
$bip21 = (new Bitcoin(NetworkFactory::mainnet()))->getBip(21);
$parsed = $bip21->parseUri($uri);
return response()->json($parsed->toArray());
}
Testing with Regtest
$network = NetworkFactory::regtest();
$bitcoin = new Bitcoin($network);
$bip32 = $bitcoin->getBip(32); // Hierarchical Deterministic Wallets
Bitcoin\BIP\BIPInterface for unsupported BIPs.NetworkFactory to add custom networks (e.g., for forks like Litecoin).$bip = Cache::remember("bip.{$bipNumber}", now()->addHours(1), fn() =>
(new Bitcoin($network))->getBip($bipNumber)
);
Network Mismatches
mainnet BIPs with testnet addresses (or vice versa) will fail validation.Bitcoin with the correct network:
$network = NetworkFactory::testnet(); // For testnet addresses
BIP Versioning
getVersion() method or documentation for compatibility.Deprecated BIPs
Performance with Large BIPs
$bip = $bitcoin->getBip(158)->setLazyLoading(true);
Enable Strict Mode
$bitcoin = new Bitcoin($network, true); // Throws exceptions for invalid operations
Log BIP Parsing Errors
try {
$bip = $bitcoin->getBip(9999); // Non-existent BIP
} catch (\Bitcoin\Exception\BIPNotFoundException $e) {
Log::error("BIP not found: {$e->getBipNumber()}");
}
Validate Inputs
$uri = filter_var($request->input('uri'), FILTER_SANITIZE_URL);
Default Network
mainnet. Explicitly set the network to avoid surprises:
$bitcoin = new Bitcoin(NetworkFactory::mainnet()); // Always specify!
BIP Metadata
purpose or version. Access via:
$bip44 = $bitcoin->getBip(44);
echo $bip44->getMetadata()['purpose']; // "Multi-purpose"
Thread Safety
Bitcoin per request or reuse across threads.Batch Processing
$bips = [
$bitcoin->getBip(32),
$bitcoin->getBip(44),
$bitcoin->getBip(49),
];
Laravel Service Provider
Bitcoin instance to the container for dependency injection:
// config/app.php
'bindings' => [
Bitcoin::class => fn() => new Bitcoin(NetworkFactory::mainnet()),
];
Custom Exceptions
Bitcoin\Exception\BitcoinException for domain-specific error handling:
throw new BitcoinException("Invalid BIP-21 URI: {$uri}");
Testing
NetworkFactory::regtest() for isolated testing:
$bitcoin = new Bitcoin(NetworkFactory::regtest());
$bip32 = $bitcoin->getBip(32);
$this->assertTrue($bip32->isValidMasterPrivateKey('xprv...'));
How can I help you explore Laravel packages today?