UNPKG

@btc-vision/btc-runtime

Version:

Bitcoin L1 Smart Contract Runtime for OP_NET. Build decentralized applications on Bitcoin using AssemblyScript and WebAssembly. Fully audited.

110 lines (95 loc) 3.58 kB
import { Revert } from '../types/Revert'; export enum Networks { Unknown = -1, Mainnet = 0, Testnet = 1, Regtest = 2, OpnetTestnet = 3, } @final export class NetworkManager { private readonly mainnet: Uint8Array; private readonly testnet: Uint8Array; private readonly opnetTestnet: Uint8Array; private readonly regtest: Uint8Array; constructor() { const mainnet = new Uint8Array(32); mainnet.set([ 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xd6, 0x68, 0x9c, 0x08, 0x5a, 0xe1, 0x65, 0x83, 0x1e, 0x93, 0x4f, 0xf7, 0x63, 0xae, 0x46, 0xa2, 0xa6, 0xc1, 0x72, 0xb3, 0xf1, 0xb6, 0x0a, 0x8c, 0xe2, 0x6f, ]); const testnet = new Uint8Array(32); testnet.set([ 0x00, 0x00, 0x00, 0x00, 0x09, 0x33, 0xea, 0x01, 0xad, 0x0e, 0xe9, 0x84, 0x20, 0x97, 0x79, 0xba, 0xae, 0xc3, 0xce, 0xd9, 0x0f, 0xa3, 0xf4, 0x08, 0x71, 0x95, 0x26, 0xf8, 0xd7, 0x7f, 0x49, 0x43, ]); const regtest = new Uint8Array(32); regtest.set([ 0x0f, 0x91, 0x88, 0xf1, 0x3c, 0xb7, 0xb2, 0xc7, 0x1f, 0x2a, 0x33, 0x5e, 0x3a, 0x4f, 0xc3, 0x28, 0xbf, 0x5b, 0xeb, 0x43, 0x60, 0x12, 0xaf, 0xca, 0x59, 0x0b, 0x1a, 0x11, 0x46, 0x6e, 0x22, 0x06, ]); const opnetTestnet = new Uint8Array(32); opnetTestnet.set([ 0, 0, 1, 127, 133, 16, 107, 31, 238, 175, 47, 112, 241, 226, 184, 5, 152, 91, 181, 117, 248, 143, 155, 11, 165, 117, 61, 47, 60, 241, 50, 115, ]); this.mainnet = mainnet; this.testnet = testnet; this.opnetTestnet = opnetTestnet; this.regtest = regtest; } public hrp(n: Networks): string { switch (n) { case Networks.Mainnet: return 'bc'; case Networks.Testnet: return 'tb'; case Networks.Regtest: return 'bcrt'; case Networks.OpnetTestnet: return 'opt'; default: throw new Revert('Unknown network'); } } public getChainId(network: Networks): Uint8Array { const out = new Uint8Array(32); switch (network) { case Networks.Mainnet: out.set(this.mainnet); return out; case Networks.Testnet: out.set(this.testnet); return out; case Networks.Regtest: out.set(this.regtest); return out; case Networks.OpnetTestnet: out.set(this.opnetTestnet); return out; default: throw new Revert('Unknown network'); } } public fromChainId(chainId: Uint8Array): Networks { if (chainId.length !== 32) { throw new Revert('Invalid chain id length'); } if (this.equals(chainId, this.mainnet)) return Networks.Mainnet; if (this.equals(chainId, this.testnet)) return Networks.Testnet; if (this.equals(chainId, this.regtest)) return Networks.Regtest; if (this.equals(chainId, this.opnetTestnet)) return Networks.OpnetTestnet; throw new Revert('Unknown chain id'); } private equals(a: Uint8Array, b: Uint8Array): boolean { if (a.length !== b.length) return false; for (let i = 0; i < a.length; i++) { if (a[i] !== b[i]) return false; } return true; } } export const Network: NetworkManager = new NetworkManager();