You wrote "RegNet", but based on your current stack this is regtest. The clean solution is to add a browser-safe HTTP adapter that fronts your existing regtest services and replaces the public blockchain APIs currently used by the web wallet.
| Component | Current Value | Best Use In Adapter |
|---|---|---|
| bitcoind RPC | 127.0.0.1:18443 |
Broadcast, fee estimation, raw transaction lookup fallback |
| electrs | 127.0.0.1:50001 plain TCP, dev-index.photonbolt.xyz:50002 TLS |
Address history and UTXO lookups |
| rgb-proxy-server | 127.0.0.1:3000/json-rpc, public via dev-proxy.photonbolt.xyz |
RGB only, not Bitcoin UTXO/history/broadcast |
bitcoind RPC, not electrs, as the primary source.estimatesmartfee for multiple confirmation targets, for example 1, 3, and 6 blocks.estimatesmartfee is not useful on regtest because of low mempool activity, fall back to fallbackfee=0.0002 from your Bitcoin config.sendrawtransaction on bitcoind.POST.electrs, not bitcoind RPC, for address history.scripthash, not by address directly.blockchain.scripthash.get_history.blockchain.transaction.get per txid.electrs method blockchain.scripthash.listunspent.electrs for history and UTXOs, and use bitcoind RPC for fees and broadcast.
That matches the strengths of each component in your current stack.
The easiest migration path is to make your adapter look like the public APIs your frontend already uses.
| HTTP Endpoint | Backend Source | Why |
|---|---|---|
GET /api/v1/fees/recommended |
bitcoind estimatesmartfee |
Replaces mempool fee API |
GET /api/address/:address |
electrs get_history plus optional tx lookups |
Lets frontend check whether the address has history |
GET /api/address/:address/utxo |
electrs listunspent |
Direct replacement for UTXO lookup |
GET /api/address/:address/txs |
electrs get_history + transaction.get |
Replaces activity/history feed |
POST /api/tx |
bitcoind sendrawtransaction |
Replaces public broadcast endpoint |
GET /api/health |
bitcoind + electrs checks | Operational safety |
{
"fastestFee": 2,
"halfHourFee": 2,
"hourFee": 1,
"minimumFee": 1
}
[
{
"txid": "....",
"vout": 0,
"value": 5000000000,
"status": {
"confirmed": true,
"block_height": 123,
"block_hash": "....",
"block_time": 1710000000
}
}
]
{
"address": "bcrt1....",
"chain_stats": {
"funded_txo_count": 2,
"funded_txo_sum": 5000001000,
"spent_txo_count": 1,
"spent_txo_sum": 1000,
"tx_count": 3
},
"mempool_stats": {
"funded_txo_count": 0,
"funded_txo_sum": 0,
"spent_txo_count": 0,
"spent_txo_sum": 0,
"tx_count": 0
}
}
127.0.0.1:9001.127.0.0.1:50001.dev-api.photonbolt.xyz.server {
listen 80;
server_name dev-api.photonbolt.xyz;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name dev-api.photonbolt.xyz;
location / {
proxy_pass http://127.0.0.1:9001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Add the new hostname to Certbot once the DNS record exists, the same way the other Photon dev subdomains were configured.
| Current Frontend Function | Current Source | New Source When Photon Profile Is Selected |
|---|---|---|
fetchLiveFees |
mempool.space |
dev-api.photonbolt.xyz/api/v1/fees/recommended |
checkAddressHistory |
mempool.space or blockstream.info |
dev-api.photonbolt.xyz/api/address/:address |
fetchUTXOsFromBlockchain |
mempool.space or blockstream.info |
dev-api.photonbolt.xyz/api/address/:address/utxo |
fetchBtcActivities |
mempool.space |
dev-api.photonbolt.xyz/api/address/:address/txs |
broadcastTransaction |
mempool.space or blockstream.info |
dev-api.photonbolt.xyz/api/tx |
/health, /fees/recommended, /address/:address/utxo, and /tx./address/:address and /address/:address/txs.