@broxus/js-core
Version:
MobX-based JavaScript Core library
47 lines (46 loc) • 2.43 kB
JavaScript
import { debug, groupCollapsed, groupEnd, sliceString } from '@broxus/js-utils';
import { baseLabelStyle, inheritTextStyle, successTextStyle } from '../console';
import { getScanLink } from '../utils/get-scan-link';
import { resolveTvmAddress } from '../utils/resolve-tvm-address';
const cache = new Map();
const ttl = 10 * 1000;
export async function getFullContractState(connection, address, options) {
const addr = address.toString().toLowerCase();
try {
const cached = cache.get(addr);
if (cached && !options?.force) {
const _ttl = options?.ttl ?? ttl;
const { state, timestamp } = cached;
if (Date.now() - timestamp < _ttl && state) {
if (process.env.NODE_ENV !== 'production') {
connection.getProviderState().then(providerState => {
groupCollapsed(`%cjRPC%c Full contract state %c${sliceString(addr.toString())}%c retrieved from cache`, baseLabelStyle, inheritTextStyle, successTextStyle, inheritTextStyle);
debug(`Address: %c${sliceString(addr.toString())}%c ${getScanLink(addr.toString(), providerState.networkId.toString())}`, successTextStyle, inheritTextStyle);
debug(`Last updated at: %c${new Date(timestamp).toLocaleString()}`, inheritTextStyle);
groupEnd();
}).catch(() => undefined);
}
return await state;
}
}
const state = connection.getFullContractState({ address: resolveTvmAddress(address) })
.then(r => r.state)
.catch(e => {
cache.delete(addr);
throw e;
});
if (process.env.NODE_ENV !== 'production') {
connection.getProviderState().then(providerState => {
groupCollapsed(`%cjRPC%c Request a full contract state %c${sliceString(addr.toString())}%c`, baseLabelStyle, inheritTextStyle, successTextStyle, inheritTextStyle);
debug(`Address: %c${sliceString(addr.toString())}%c ${getScanLink(addr.toString(), providerState.networkId.toString())}`, successTextStyle, inheritTextStyle);
groupEnd();
}).catch(() => undefined);
}
cache.set(addr, { state, timestamp: Date.now() });
return await state;
}
catch (e) {
cache.delete(addr);
return undefined;
}
}