diff --git a/packages/network/src/index.ts b/packages/network/src/index.ts index ad21ee0ab..ef7db99eb 100644 --- a/packages/network/src/index.ts +++ b/packages/network/src/index.ts @@ -4,14 +4,13 @@ export const HIRO_MAINNET_DEFAULT = 'https://stacks-node-api.mainnet.stacks.co'; export const HIRO_TESTNET_DEFAULT = 'https://stacks-node-api.testnet.stacks.co'; export const HIRO_MOCKNET_DEFAULT = 'http://localhost:3999'; -export interface NetworkUrl { +export interface NetworkConfig { url: string; } export interface StacksNetwork { version: TransactionVersion; chainId: ChainID; - readonly coreApiUrl: string; bnsLookupUrl: string; broadcastEndpoint: string; transferFeeEstimateEndpoint: string; @@ -47,18 +46,24 @@ export interface StacksNetwork { export class StacksMainnet implements StacksNetwork { version = TransactionVersion.Mainnet; chainId = ChainID.Mainnet; - readonly coreApiUrl; bnsLookupUrl = 'https://stacks-node-api.mainnet.stacks.co'; broadcastEndpoint = '/v2/transactions'; transferFeeEstimateEndpoint = '/v2/fees/transfer'; accountEndpoint = '/v2/accounts'; contractAbiEndpoint = '/v2/contracts/interface'; readOnlyFunctionCallEndpoint = '/v2/contracts/call-read'; + private _coreApiUrl: string; - constructor(networkUrl: NetworkUrl = { url: HIRO_MAINNET_DEFAULT }) { - this.coreApiUrl = networkUrl.url; + get coreApiUrl() { + return this._coreApiUrl; + } + set coreApiUrl(_url: string) { + throw new Error('Cannot modify property `coreApiUrl` after object initialization'); } + constructor(networkUrl: NetworkConfig = { url: HIRO_MAINNET_DEFAULT }) { + this._coreApiUrl = networkUrl.url; + } isMainnet = () => this.version === TransactionVersion.Mainnet; getBroadcastApiUrl = () => `${this.coreApiUrl}${this.broadcastEndpoint}`; getTransferFeeEstimateApiUrl = () => `${this.coreApiUrl}${this.transferFeeEstimateEndpoint}`; @@ -112,7 +117,7 @@ export class StacksTestnet extends StacksMainnet implements StacksNetwork { version = TransactionVersion.Testnet; chainId = ChainID.Testnet; - constructor(networkUrl: NetworkUrl = { url: HIRO_TESTNET_DEFAULT }) { + constructor(networkUrl: NetworkConfig = { url: HIRO_TESTNET_DEFAULT }) { super(networkUrl); } } @@ -121,7 +126,7 @@ export class StacksMocknet extends StacksMainnet implements StacksNetwork { version = TransactionVersion.Testnet; chainId = ChainID.Testnet; - constructor(networkUrl: NetworkUrl = { url: HIRO_MOCKNET_DEFAULT }) { + constructor(networkUrl: NetworkConfig = { url: HIRO_MOCKNET_DEFAULT }) { super(networkUrl); } } diff --git a/packages/network/tests/network.test.ts b/packages/network/tests/network.test.ts index f3e41549a..b787f99be 100644 --- a/packages/network/tests/network.test.ts +++ b/packages/network/tests/network.test.ts @@ -7,17 +7,28 @@ import { StacksTestnet, } from '@stacks/network'; -test('network test-- coreApiUrl', () => { - const mainnet = new StacksMainnet(); - expect(mainnet.coreApiUrl).toBe(HIRO_MAINNET_DEFAULT); - - const testnet = new StacksTestnet(); - expect(testnet.coreApiUrl).toBe(HIRO_TESTNET_DEFAULT); - - const mocknet = new StacksMocknet(); - expect(mocknet.coreApiUrl).toBe(HIRO_MOCKNET_DEFAULT); - - const customURL = 'customeURL'; - const customNET = new StacksMainnet({ url: customURL }); - expect(customNET.coreApiUrl).toBe(customURL); +describe('Setting coreApiUrl', () => { + test('it sets mainnet default url', () => { + const mainnet = new StacksMainnet(); + expect(mainnet.coreApiUrl).toEqual(HIRO_MAINNET_DEFAULT); + }); + test('it sets testnet url', () => { + const testnet = new StacksTestnet(); + expect(testnet.coreApiUrl).toEqual(HIRO_TESTNET_DEFAULT); + }); + test('it sets mocknet url', () => { + const mocknet = new StacksMocknet(); + expect(mocknet.coreApiUrl).toEqual(HIRO_MOCKNET_DEFAULT); + }); + test('it sets custom url', () => { + const customURL = 'https://customurl.com'; + const customNET = new StacksMainnet({ url: customURL }); + expect(customNET.coreApiUrl).toEqual(customURL); + }); + test('it prevents changing url after initialisation', () => { + const network = new StacksMainnet({ url: 'https://legiturl.com' }); + // @ts-ignore + expect(() => (network.coreApiUrl = 'https://dodgyurl.com')).toThrowError(); + expect(network.coreApiUrl).toEqual('https://legiturl.com'); + }); });