@broxus/js-core
Version:
MobX-based JavaScript Core library
237 lines (236 loc) • 10.3 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { debounce, throwException } from '@broxus/js-utils';
import { BigNumber } from 'bignumber.js';
import { action, makeObservable } from 'mobx';
import { SmartContractModel } from '../../core';
import { DexGasValuesUtils, } from '../../models/dex-gas-values/DexGasValuesUtils';
import { areAddressesEqual, contractStateChangeDebugMessage, gasToValue, subscribeDebugMessage, syncErrorMessage, unsubscribeDebugMessage, unsubscribeErrorMessage, } from '../../utils';
/**
* Calculate gas
* @param {string} fixedValue
* @param {string} dynamicGas
* @param {number} [gasPrice]
* @returns {string}
*/
function calcGas(fixedValue, dynamicGas, gasPrice = 1000) {
return gasToValue(fixedValue, BigNumber(dynamicGas).plus(100_000).toFixed(), gasPrice);
}
export class DexGasValues extends SmartContractModel {
_connection;
options;
static Utils = DexGasValuesUtils;
/**
* @param {ProviderRpcClient} _connection
* Standalone RPC client that doesn't require connection to the TVM wallet provider
* @param {Address | string} address
* DexGasValues root address
* @param {Readonly<DexCtorOptions>} [options]
* (optional) DexGasValues Smart Contract Model options
*/
constructor(_connection, address, options) {
super(_connection, address);
this._connection = _connection;
this.options = options;
makeObservable(this);
}
/**
* @param {ProviderRpcClient} connection
* Standalone RPC client that doesn't require connection to the TVM wallet provider
* @param {Address | string} address
* DexGasValues root address
* @param {Readonly<DexGasValuesCreateOptions>} [options]
* (optional) DexGasValues Smart Contract Model options
*/
static async create(connection, address, options) {
const { sync = true, watch, watchCallback, ...restOptions } = { ...options };
const dexGasValues = new DexGasValues(connection, address, restOptions);
if (sync) {
await dexGasValues.sync({ force: false });
}
if (watch) {
await dexGasValues.watch(watchCallback);
}
return dexGasValues;
}
async sync(options) {
if (!options?.force && this.isSyncing) {
return;
}
try {
this.setState('isSyncing', !options?.silent);
await this.syncContractState({ force: options?.force || !this.contractState });
if (!this.isDeployed) {
throwException('DexGasValues is not deployed');
}
}
catch (e) {
if (process.env.NODE_ENV !== 'production') {
const state = await this._connection.getProviderState();
syncErrorMessage(this.constructor.name, this.address, e, state.networkId.toString());
}
}
finally {
this.setState('isSyncing', false);
}
}
async watch(callback) {
try {
this.contractSubscriber = new this._connection.Subscriber();
await this.contractSubscriber.states(this.address).delayed(stream => {
if (process.env.NODE_ENV !== 'production') {
subscribeDebugMessage(this.constructor.name, this.address);
}
return stream.on(debounce(async (event) => {
if (process.env.NODE_ENV !== 'production') {
const state = await this._connection.getProviderState();
contractStateChangeDebugMessage(this.constructor.name, this.address, event, state.networkId.toString());
}
if (areAddressesEqual(event.address, this.address)) {
await this.sync({ force: !this.isSyncing, silent: true });
callback?.(...this.toJSON(true));
return;
}
await this.unwatch();
}, this.options?.watchDebounceDelay ?? 3000));
});
return this.contractSubscriber;
}
catch (e) {
await this.unwatch();
throw e;
}
}
async unwatch() {
if (this.contractSubscriber === undefined) {
return;
}
try {
await this.contractSubscriber?.unsubscribe();
this.contractSubscriber = undefined;
if (process.env.NODE_ENV !== 'production') {
unsubscribeDebugMessage(this.constructor.name, this.address);
}
}
catch (e) {
if (process.env.NODE_ENV !== 'production') {
const state = await this._connection.getProviderState();
unsubscribeErrorMessage(this.constructor.name, this.address, e, state.networkId.toString());
}
}
}
async getDeployAccountGas() {
const result = await DexGasValues.Utils.getDeployAccountGas(this._connection, this.address, this.contractState);
const gasPrice = await this.getGasPrice();
return calcGas(result.fixedValue, result.dynamicGas, gasPrice);
}
async getDepositToAccountGas() {
const result = await DexGasValues.Utils.getDepositToAccountGas(this._connection, this.address, this.contractState);
const gasPrice = await this.getGasPrice();
return calcGas(result.fixedValue, result.dynamicGas, gasPrice);
}
async getAccountWithdrawGas(params) {
const result = await DexGasValues.Utils.getAccountWithdrawGas(this._connection, this.address, params, this.contractState);
const gasPrice = await this.getGasPrice();
return calcGas(result.fixedValue, result.dynamicGas, gasPrice);
}
async getAccountDepositGas(params) {
const result = await DexGasValues.Utils.getAccountDepositGas(this._connection, this.address, params, this.contractState);
const gasPrice = await this.getGasPrice();
return calcGas(result.fixedValue, result.dynamicGas, gasPrice);
}
async getAddPoolGas(params) {
const result = await DexGasValues.Utils.getAddPoolGas(this._connection, this.address, params, this.contractState);
const gasPrice = await this.getGasPrice();
return calcGas(result.fixedValue, result.dynamicGas, gasPrice);
}
async getDeployPoolGas(params) {
const result = await DexGasValues.Utils.getDeployPoolGas(this._connection, this.address, params, this.contractState);
const gasPrice = await this.getGasPrice();
return calcGas(result.fixedValue, result.dynamicGas, gasPrice);
}
async getPoolDirectNoFeeWithdrawGas(params) {
const result = await DexGasValues.Utils.getPoolDirectNoFeeWithdrawGas(this._connection, this.address, params, this.contractState);
const gasPrice = await this.getGasPrice();
return calcGas(result.fixedValue, result.dynamicGas, gasPrice);
}
async getGasPrice() {
if (typeof this.options?.gasPrice === 'function') {
return this.options.gasPrice();
}
return this.options?.gasPrice ?? 1000;
}
}
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], DexGasValues.prototype, "sync", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Function]),
__metadata("design:returntype", Promise)
], DexGasValues.prototype, "watch", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], DexGasValues.prototype, "unwatch", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], DexGasValues.prototype, "getDeployAccountGas", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], DexGasValues.prototype, "getDepositToAccountGas", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], DexGasValues.prototype, "getAccountWithdrawGas", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], DexGasValues.prototype, "getAccountDepositGas", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], DexGasValues.prototype, "getAddPoolGas", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], DexGasValues.prototype, "getDeployPoolGas", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], DexGasValues.prototype, "getPoolDirectNoFeeWithdrawGas", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], DexGasValues.prototype, "getGasPrice", null);