# Broxus JavaScript Core

## Introduction

This library provides MobX-based services, models and helpers
to build JavaScript Applications with any popular frameworks or
libraries (e.g. React, Angular, Vue, etc.) 

## Core

### AbstractStore

Abstract class `AbstractStore` is a primary way to create any services or stores that provides API
to manage state and data:

```typescript
abstract class AbstractStore {
    setData(keyOrData: string | object | ((prevData) => nextData)): this
    setState(keyOrState: string | object | ((prevState) => nextState)): this
    toJSON(): object
}
```

### TvmContractWrapper

Abstract class `TvmContractWrapper` is a primary way to create models (wrapper for contract)

```typescript
abstract class TvmContractWrapper {
    address: Address
    contractState?: FullContractState
    isDeployed?: boolean
    isSyncing?: boolean
    syncedAt?: number
    async syncContractState(): Promise<FullContractState | undefined>
    abstract watch?(): Promise<Subscriber>
    abstract unwatch?(): Promise<void>
}
```

## Models

### TvmToken

Model of the TVM-based token

```typescript
import { TvmToken } from '@broxus/js-core'

const token = new TvmToken(tvmWalletService.connection, {
    name: 'Wrapped EVER',
    symbol: 'WEVER',
    decimals: 9,
    address: '0:a49cd4e158a9a15555e624759e2e4e766d22600b7800d891e46f9291f044a93d',
    logoURI: 'https://raw.githubusercontent.com/broxus/flatqube-assets/master/icons/WEVER/logo.svg',
    version: 5,
    verified: true,
}, [tvmWalletService.provider])

await token.sync({ force: true, silent: true })

const userWallet = await token.wallet(ownerAddress: Address | string)
```
