Broxus JavaScript Core library
This library provides a comprehensive set of MobX-based models, and utilities for building JavaScript applications
that interact with TVM-based blockchains. It offers reactive state management for smart contracts, tokens,
DEX operations, and more.
Installation
Install the package as development dependency
npm install @broxus/js-core
yarn add @broxus/js-core
pnpm add @broxus/js-core
bun add @broxus/js-core
Core
AbstractStore
Base abstract class for creating reactive stores and services with built-in state and data management.
Interface
abstract class AbstractStore<
T extends ObjectLiteral = ObjectLiteral,
U extends ObjectLiteral = ObjectLiteral
> {
protected _data: T
protected _state: U
setData<K extends keyof T>(dataOrFn: Pick<T, K> | ((prevData: Readonly<T>) => Pick<T, K>)): this
setData<K extends keyof T>(key: K, value: T[K]): this
setState<K extends keyof U>(stateOrFn: Pick<U, K> | ((prevState: Readonly<U>) => Pick<U, K>)): this
setState<K extends keyof U>(key: K, value?: U[K]): this
toJSON(): T
toJSON(both: true): [T, U]
}
Example
import { AbstractStore } from '@broxus/js-core'
import { makeObservable, observable } from 'mobx'
interface UserData {
balance: string
name: string
}
interface UserState {
error?: string
isLoading: boolean
}
class UserStore extends AbstractStore<UserData, UserState> {
constructor() {
super({
initialData: { name: '', balance: '0' },
initialState: { isLoading: false }
})
makeObservable(this)
}
async loadUser(address: string): Promise<void> {
this.setState('isLoading', true)
try {
this.setData({ balance: '1000', name: 'User' })
}
catch (e: any) {
this.setState('error', e.message)
}
finally {
this.setState('isLoading', false)
}
}
}
SmartContractModel
Abstract class for creating reactive smart contract wrappers with automatic state synchronization and blockchain event watching.
Interface
abstract class SmartContractModel<
T extends SmartContractModelData | ObjectLiteral = SmartContractModelData,
U extends SmartContractModelState | ObjectLiteral = SmartContractModelState,
> extends AbstractStore<SmartContractModelData & T, SmartContractModelState & U> {
readonly address: Address
readonly computedStorageData?: {
accountStatus: 'uninit' | 'frozen' | 'active' | 'nonexist'
deleteDueLimit: string
freezeDueLimit: string
storageFee: string
storageFeeDebt?: string
}
readonly contractState?: FullContractState
readonly isDeployed?: boolean
readonly isSyncing?: boolean
readonly syncedAt?: number
syncContractState(options?: { force?: boolean, ttl?: number }): Promise<FullContractState | undefined>
watch?(callback?: (data: T, state: U) => void): Promise<Subscriber>
unwatch?(): Promise<void>
}
Example
import { SmartContractModel } from '@broxus/js-core'
import { ProviderRpcClient } from 'everscale-inpage-provider'
interface CustomContractData {
owner: Address
value: string
}
class CustomContract extends SmartContractModel<CustomContractData> {
constructor(connection: ProviderRpcClient, address: Address) {
super(connection, address)
}
async sync() {
await this.syncContractState({ force: true })
if (!this.isDeployed) {
throw new Error('Contract not deployed')
}
this.setData({
owner: ,
value:
})
}
}
Endpoint
Class for creating type-safe HTTP API endpoints with automatic URL generation and request handling.
Interface
class Endpoint<TParams = undefined, TRequestBody = undefined, TResponse = any> {
constructor(path: string, basePath?: string)
url(params?: TParams): string
request(routeParams?: TParams, requestInit?: RequestInit, bodyData?: TRequestBody): Promise<Response>
fetch<UResponse = TResponse>(routeParams?: TParams, requestInit?: RequestInit, bodyData?: TRequestBody): Promise<UResponse>
post<UResponse = TResponse>(routeParams?: TParams, requestInit?: RequestInit, bodyData?: TRequestBody): Promise<UResponse>
put<UResponse = TResponse>(routeParams?: TParams, requestInit?: RequestInit, bodyData?: TRequestBody): Promise<UResponse>
delete<UResponse = TResponse>(routeParams?: TParams, requestInit?: RequestInit, bodyData?: TRequestBody): Promise<UResponse>
}
Example
import { Endpoint } from '@broxus/js-core'
interface TokenInfo {
symbol: string
decimals: number
}
const tokenEndpoint = new Endpoint<{ address: string }, undefined, TokenInfo>(
'/tokens/:address',
'https://api.example.com'
)
const tokenInfo = await tokenEndpoint.fetch({ address: '0:abc...' })
console.log(tokenInfo.symbol)
Network Configuration
MasterChainConfig
Model for accessing masterchain network configuration parameters including gas prices, limits, and message forwarding fees.
Features
- Gas prices and limits for masterchain
- Message forwarding prices
- Storage fee parameters
- Real-time configuration updates watching
Interface
class MasterChainConfig extends SmartContractModel<MasterChainConfigData> {
readonly gasPrice: string
readonly gasLimit: string
readonly gasCredit: string
readonly blockGasLimit: string
readonly freezeDueLimit: string
readonly deleteDueLimit: string
readonly flatGasLimit: string
readonly flatGasPrice: string
readonly specialGasLimit: string
readonly lumpPrice: string
readonly bitPrice: string
readonly cellPrice: string
readonly ihrPriceFactor: string
readonly firstFrac: string
readonly nextFrac: string
}
Example
import { MasterChainConfig } from '@broxus/js-core'
const masterConfig = await MasterChainConfig.create(
connection,
'-1:5555555555555555555555555555555555555555555555555555555555555555',
{ sync: true }
)
console.log(masterConfig.gasPrice)
console.log(masterConfig.gasLimit)
console.log(masterConfig.bitPrice)
console.log(masterConfig.cellPrice)
await masterConfig.watch((data, state) => {
console.log('Gas price updated:', data.gasPrice)
})
ShardChainConfig
Model for accessing shardchain (workchain) network configuration parameters including gas prices, limits, and message forwarding fees.
Features
- Gas prices and limits for workchain
- Message forwarding prices
- Storage fee parameters
- Real-time configuration updates watching
Interface
class ShardChainConfig extends SmartContractModel<ShardChainConfigData> {
readonly gasPrice: string
readonly gasLimit: string
readonly gasCredit: string
readonly blockGasLimit: string
readonly freezeDueLimit: string
readonly deleteDueLimit: string
readonly flatGasLimit: string
readonly flatGasPrice: string
readonly specialGasLimit: string
readonly lumpPrice: string
readonly bitPrice: string
readonly cellPrice: string
readonly ihrPriceFactor: string
readonly firstFrac: string
readonly nextFrac: string
}
Example
import { ShardChainConfig } from '@broxus/js-core'
const shardConfig = await ShardChainConfig.create(
connection,
'-1:5555555555555555555555555555555555555555555555555555555555555555',
{ sync: true }
)
console.log(shardConfig.gasPrice)
console.log(shardConfig.gasLimit)
const gasFee = BigInt(shardConfig.gasPrice) * BigInt(estimatedGas)
Models
TvmToken
Model for TVM-based token (TIP-3 standard) with reactive state management and blockchain synchronization.
Features
- Automatic token details synchronization (symbol, decimals, totalSupply, etc.)
- Real-time blockchain state watching
- Token wallet management
- Balance queries
Interface
class TvmToken<T extends TvmTokenData | ObjectLiteral = TvmTokenData>
extends SmartContractModel<T & TvmTokenData> {
static Utils: TvmTokenUtils
static Wallet: typeof TvmTokenWallet
readonly symbol: string
readonly decimals: number
readonly name: string
readonly totalSupply?: string
readonly rootOwnerAddress?: Address
readonly verified?: boolean
wallet(ownerAddress: Address | string): Promise<TvmTokenWallet>
walletOf(ownerAddress: Address | string): Promise<Address>
balance(ownerAddress: Address | string): Promise<string | undefined>
}
Example
import { TvmToken } from '@broxus/js-core'
const token = await TvmToken.create(
connection,
{
address: '0:a49cd4e158a9a15555e624759e2e4e766d22600b7800d891e46f9291f044a93d',
symbol: 'WEVER',
decimals: 9,
name: 'Wrapped EVER'
},
{ sync: true, watch: true }
)
console.log(token.symbol)
console.log(token.totalSupply)
const userWallet = await token.wallet('0:user_address...')
console.log(userWallet.balance)
TvmTokenWallet
Model for TVM token wallet with transfer and balance management capabilities.
Features
- Balance synchronization
- Token transfers
- Burn operations
- Wallet destruction
Interface
class TvmTokenWallet extends SmartContractModel<TvmTokenWalletData> {
static Utils: TvmTokenWalletUtils
readonly balance?: string
readonly ownerAddress?: Address
readonly tokenAddress?: Address
transfer(params: TransferParams, args?: SendInternalParams): Promise<DelayedMessageExecution>
transferToWallet(params: TransferToWalletParams, args?: SendInternalParams): Promise<DelayedMessageExecution>
burn(params: BurnParams, args?: SendInternalParams): Promise<DelayedMessageExecution>
destroy(params: DestroyParams, args?: SendInternalParams): Promise<DelayedMessageExecution>
}
Example
import { TvmTokenWallet } from '@broxus/js-core'
const wallet = await TvmTokenWallet.create(
connection,
{ address: '0:wallet_address...' },
{ sync: true },
provider
)
await wallet.transfer({
amount: '1000000000',
recipient: '0:recipient_address...',
remainingGasTo: '0:sender_address...'
})
Dex
Model for DEX root contract with pair/pool deployment and account management.
Features
- DEX account deployment
- Pair creation (constant product AMM)
- Stable pool creation
- Expected address calculation
Interface
class Dex extends SmartContractModel<DexData> {
static Utils: DexUtils
readonly manager: Address
readonly owner: Address
readonly vault: Address
deployAccount(params: DexDeployAccountParams, args?: SendInternalParams): Promise<Transaction | undefined>
deployPair(params: DexDeployPairParams, args?: SendInternalParams): Promise<Transaction | undefined>
deployStablePool(params: DexDeployPoolParams, args?: SendInternalParams): Promise<Transaction | undefined>
getExpectedAccountAddress(params: { ownerAddress: Address | string }): Promise<Address>
getExpectedPairAddress(params: { leftRootAddress: Address | string, rightRootAddress: Address | string }): Promise<Address>
getExpectedPoolAddress(params: { roots: (Address | string)[] }): Promise<Address>
}
Example
import { Dex } from '@broxus/js-core'
const dex = await Dex.create(
connection,
'0:dex_root_address...',
{ sync: true }
)
await dex.deployAccount({
ownerAddress: '0:user_address...',
sendGasTo: '0:user_address...',
onTransactionSuccess: ({ input }) => {
console.log('Account deployed:', input.dexAccountAddress)
}
})
DexAccount
Model for user's DEX account with liquidity management capabilities.
Features
- Token deposits and withdrawals
- Liquidity provision
- Pool management
- Balance tracking
Interface
class DexAccount extends SmartContractModel<DexAccountData> {
static Utils: DexAccountUtils
readonly balances?: Map<string, string>
readonly ownerAddress: Address
readonly wallets?: Map<string, Address>
depositToken(params: DepositTokenParams, args?: SendInternalParams): Promise<Transaction | undefined>
withdrawToken(params: WithdrawTokenParams, args?: SendInternalParams): Promise<Transaction | undefined>
depositLiquidity(params: DepositLiquidityParams, args?: SendInternalParams): Promise<Transaction | undefined>
addPool(params: AddPoolParams, args?: SendInternalParams): Promise<Transaction | undefined>
}
Example
import { DexAccount } from '@broxus/js-core'
const account = await DexAccount.create(
connection,
{ dex, ownerAddress: '0:user_address...' },
{ sync: true }
)
await account.depositToken({
amount: '1000000000',
tokenAddress: '0:token_address...',
senderAddress: '0:user_address...',
recipientTokenWallet: '0:dex_account_wallet...',
remainingGasTo: '0:user_address...'
})
DexGasValues
Model for querying DEX operation gas values and fees.
Interface
class DexGasValues extends SmartContractModel {
static Utils: DexGasValuesUtils
getDeployAccountGas(): Promise<string>
getDepositToAccountGas(): Promise<string>
getAccountWithdrawGas(params: { deployWalletValue?: string }): Promise<string>
getAccountDepositGas(params: { autoChange: boolean }): Promise<string>
getAddPoolGas(params: { N: number }): Promise<string>
getDeployPoolGas(params: { N: number }): Promise<string>
}
DexPair
Model for constant product AMM pair with liquidity operations.
Features
- Pair details synchronization
- Balance tracking
- Liquidity withdrawal
- Fee parameters
Interface
class DexPair extends SmartContractModel<DexPairData> {
static Utils: DexPairUtils
readonly leftToken: TokenInfo
readonly rightToken: TokenInfo
readonly lpToken: TokenInfo
readonly balances?: Map<string, string>
readonly feeParams: DexPairFeeParams
readonly isActive?: boolean
syncBalances(options?: { force?: boolean }): Promise<Map<string, string>>
withdrawLiquidity(params: WithdrawParams, args?: SendInternalParams): Promise<Transaction | undefined>
}
Example
import { DexPair } from '@broxus/js-core'
const pair = await DexPair.create(
connection,
{
dex,
leftRootAddress: '0:token1_address...',
rightRootAddress: '0:token2_address...'
},
{ sync: true }
)
console.log(pair.leftToken.symbol)
console.log(pair.rightToken.symbol)
console.log(pair.balances)
DexStablePair
Model for StableSwap pair (2 tokens) with reduced slippage for similar assets.
Similar to DexPair but optimized for stable pairs (e.g., USDT-USDC).
DexStablePool
Model for StableSwap pool supporting multiple tokens (N-token pool).
Features
- Multi-token pool management
- Virtual price calculation
- Amplification coefficient
- Low slippage swaps for correlated assets
Interface
class DexStablePool extends SmartContractModel<DexStablePoolData> {
static Utils: DexStablePoolUtils
readonly tokens: TokenInfo[]
readonly lpToken: TokenInfo
readonly balances?: Map<string, string>
readonly virtualPrice?: string
readonly feeParams: DexStablePoolFeeParams
withdrawLiquidity(params: WithdrawParams, args?: SendInternalParams): Promise<Transaction | undefined>
}
Example
import { DexStablePool } from '@broxus/js-core'
const pool = await DexStablePool.create(
connection,
{
dex,
roots: [
'0:usdt_address...',
'0:usdc_address...',
'0:dai_address...'
]
},
{ sync: true }
)
console.log(pool.tokens.length)
console.log(pool.virtualPrice)
Other Models
The library also includes the following models:
- Gauge - Liquidity mining gauge contract
- GaugeAccount - User's gauge account for rewards
- VoteEscrow - Vote-escrowed token locking
- VoteEscrowAccount - User's vote escrow account
- VoteEscrowDaoRoot - DAO governance root
- VoteEscrowProposal - Governance proposal
- TvmTokenFactory - Token factory contract
- VaultTokenWallet - Vault token wallet
- WrappedCurrencyVault - Native currency wrapping vault
Utilities
Each model comes with a static Utils class providing low-level ABI interaction methods:
TvmToken.Utils.getDetails(connection, address, state)
TvmToken.Utils.walletOf(connection, { ownerAddress, tokenAddress })
TvmToken.Utils.balance(connection, { walletAddress })
Dex.Utils.getExpectedPairAddress(connection, dexAddress, params, state)
DexPair.Utils.getBalances(connection, pairAddress, state)
DexPair.Utils.expectedExchange(connection, pairAddress, amount, state)
License
MIT