Contract Addresses
Canonical on-chain addresses for every Catpound vault and the supporting contracts they interact with. Verify any contract on-chain via the OPNet JSON-RPC method btc_getCode.
OPNet uses two parallel address encodings — bech32m (starts with op1 on mainnet, opt1 on testnet) and 0x-prefixed hex (32-byte ML-DSA key hash). Both refer to the same contract. Wallets, explorers, and the Catpound UI handle the translation.
Mainnet
Vaults
| Vault | Bech32 address | Hex address |
|---|---|---|
| cpMOTO | op1sqz2tfud8mg0fqy3sx2kxezsarzqm8mx2rs6rmlc0 | 0x88a647a8989a0bf3ab9f91459fd04771fb9678efd7ac4359c33ff48759877ee6 |
| PILL | op1sqz2jya5t800s0k9fcr8zd2v4a2h2usgwt5phq9t0 | 0x5cc490a4c20b3abf85f7f82db725692e6a675a4e7a388bcfd726267e74c0fd9c |
| MCHAD | op1sqqggx47yzjdzuc98xv0tu2lv2dtke0g4ncs6xnvx | 0xb39d8eefa7dbfaa109d34c7b3a98424903d5dd61d8b75c4b899e8747ee80828b |
| OrangePill MOTO | op1sqq5mn9p6ma3ykmpncpaj04snks9dpefxrgpj7mem | 0x6635ebefa2411b983c539ede7614575e304331f22b8e680bc0b78af1a5bdcfc8 |
| OrangePill MOTO/PILL LP | op1sqz6z6m6yq2j4lt634emj0td22glzu94vdvafw554 | 0x8486406d47d40ce10af837ffaf63b14f42810ac2d2e66a117156974ceab6f2ff |
Underlying tokens
| Token | Hex address | Decimals |
|---|---|---|
| MOTO | 0xc3d18f9d7db3f26ed107a9f4a4c65eef14c1ca73db5684ef9789fdd4fbb3ea9a | 18 |
| PILL | 0xc6c3674b1c6c4ca3d4b3652d1d6fc2b197f45c4ad1eda90d37952472719d1c05 | 18 |
| MCHAD | 0x8d325ab5516f23dce15d650f58a160a2c1c2515bda3f0212ca0b8b2b5705b4ab | 8 |
| MOTO/PILL LP | 0xf8bf27905acd0d440048d78c1512b468d3139495f6e72c14733813a065302031 | 18 |
Supporting infrastructure
| Contract | Hex address |
|---|---|
| MotoChef | 0xab99e31ebb30b8e596d5be1bd1e501ee8e7b7e5ec9dc7ee880f4937b0c929dcb |
| Catpound NFT | op1sqqfa70lnq5ysufna060pp02uaurxslpq05kfp2pw |
Testnet (OPNet Testnet — bech32 HRP opt)
| Vault | Bech32 address |
|---|---|
| cpMOTO | opt1sqplm4d7sh08vllp99fmmsytcn264uuznuu2a9cqr |
| PILL | opt1sqphgq2zjumvsrstqtfsncgmhfp97zdy43yycmely |
| MCHAD | opt1sqzqxhc9q0f3rkjjdhfjccanvvyf4gae8scnm3slg |
| OrangePill MOTO | opt1sqqftzu0ykfmzeksx720rklxcylew5wrpgvg6uv7n |
| OrangePill MOTO/PILL LP | opt1sqzkn5nvcuhqg3057a32h9rz0rq73cv0cwgfpgfhn |
| Catpound NFT | opt1sqz853ql5jnh58a957hdjw00x3a8lq3clhg2mzuen |
| Supporting | Hex |
|---|---|
| MOTO | 0xfd4473840751d58d9f8b73bdd57d6c5260453d5518bd7cd02d0a4cf3df9bf4dd |
| MotoChef | 0x831ca1f8ebcc1925be9aa3a22fd3c5c4bf7d03a86c66c39194fef698acb886ae |
| MotoSwap Router | 0x0e6ff1f2d7db7556cb37729e3738f4dae82659b984b2621fab08e1111b1b937a |
RPC endpoints
| Network | URL | Network constant (@btc-vision/bitcoin) |
|---|---|---|
| Mainnet | https://mainnet.opnet.org | networks.bitcoin |
| Testnet | https://testnet.opnet.org | networks.opnetTestnet |
Do not use networks.testnet — that's Testnet4, which OPNet does not support.
Address format notes
op1.../opt1...are bech32m-encoded witness-v16 addresses (OP-NET contract addresses).0x...is the 32-byte ML-DSA key hash used internally by the VM.- Wallets display bech32; on-chain calldata uses the hex form. Converting between them requires
provider.getPublicKeyInfo(bech32Addr, true)— simplefromBech32(addr).datagives the wrong 20-byte witness hash and should not be used for cross-contract lookups.
Verification
curl -s -X POST https://mainnet.opnet.org \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"btc_getCode","params":["0x88a647a8989a0bf3ab9f91459fd04771fb9678efd7ac4359c33ff48759877ee6"]}'
Returns the deployed WASM bytecode for the cpMOTO vault. Every vault is a single canonical deployment — no proxies, no upgradeable-contract shims.