@broxus/tvm-connect
Version:
Nekoton-compatible wallets connector.
126 lines (125 loc) • 5.76 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);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SparXWallet = exports.sparxRpcFallback = void 0;
const js_utils_1 = require("@broxus/js-utils");
const everscale_inpage_provider_1 = require("everscale-inpage-provider");
const mobx_1 = require("mobx");
const core_1 = require("../core");
const types_1 = require("../types");
// eslint-disable-next-line max-len
const sparxRpcFallback = (opts) => async (client) => new Promise((resolve, reject) => {
if (client) {
resolve(client);
}
else {
const fallbackAttempts = opts?.fallbackAttempts ?? 5;
let attempts = 0;
const tryToResolve = (0, js_utils_1.debounce)(() => {
if (attempts >= fallbackAttempts) {
reject(new Error(`Max attempts (${fallbackAttempts}) is reached.`));
return;
}
if ((0, js_utils_1.isBrowser)() && window.__sparx) {
(0, js_utils_1.debug)('SparX Wallet provider was found with fallback', window.__sparx);
resolve(window.__sparx);
return;
}
attempts += 1;
tryToResolve();
}, 1000);
tryToResolve();
}
});
exports.sparxRpcFallback = sparxRpcFallback;
const rdnsList = [types_1.TvmWalletRdnsList.SPARX_WALLET.toString(), types_1.TvmWalletRdnsList.SPARX_WALLET_MOBILE.toString()];
class SparXWallet extends core_1.NekotonConnector {
params;
name = 'SparXWallet';
type = types_1.ConnectionType.NEKOTON_WALLET;
constructor(params) {
super(params);
this.params = params;
(0, mobx_1.makeObservable)(this);
if (params?.autoInit ?? true) {
this.init().catch(js_utils_1.error);
}
}
async init() {
let provider;
const onAnnouncement = async (event) => {
const { name, rdns } = event.detail.info;
if (name === 'SparX Wallet' || (rdns && rdnsList.includes(rdns))) {
window.removeEventListener(types_1.TvmProviderEvent.ANNOUNCE_PROVIDER, onAnnouncement);
provider = new everscale_inpage_provider_1.ProviderRpcClient({
provider: new everscale_inpage_provider_1.StaticProviderAdapter(event.detail.provider),
});
(0, js_utils_1.debug)('SparX Wallet provider event was captured', event);
}
};
try {
this.setState('isInitializing', true);
if ((0, js_utils_1.isBrowser)()) {
window.addEventListener(types_1.TvmProviderEvent.ANNOUNCE_PROVIDER, onAnnouncement);
window.dispatchEvent(new Event(types_1.TvmProviderEvent.REQUEST_PROVIDER));
}
// Try to resolve provider from the global scope
if (!provider) {
if (this.params?.fallbackProviderFactory) {
provider = await this.params.fallbackProviderFactory();
}
else {
const fallback = await this.params?.options?.provider ?? await (0, exports.sparxRpcFallback)({
fallbackAttempts: this.params?.fallbackAttempts,
})();
if (!fallback) {
(0, js_utils_1.throwException)('No provider found');
}
provider = new everscale_inpage_provider_1.ProviderRpcClient({ provider: fallback });
}
}
const hasProvider = await provider.hasProvider();
if (!hasProvider) {
(0, js_utils_1.throwException)('No provider found');
}
(0, mobx_1.runInAction)(() => {
this.provider = provider;
if ((0, js_utils_1.isBrowser)()) {
window.removeEventListener(types_1.TvmProviderEvent.ANNOUNCE_PROVIDER, onAnnouncement);
}
});
const state = await (0, js_utils_1.timeoutPromise)(provider.getProviderState(), 2000);
if (!state.permissions.accountInteraction) {
(0, js_utils_1.throwException)('No permissions returned');
}
this.setData({
account: state.permissions.accountInteraction,
chainId: state.networkId,
version: state.version,
});
this.setState({ isInitialized: true, isInitializing: false });
await this.runSubscriptions();
}
catch (e) {
(0, js_utils_1.debug)('SparX Wallet could not be pre-connected', e);
this.setState({ isInitialized: false, isInitializing: false });
await this.stopSubscriptions();
}
return this.provider;
}
}
exports.SparXWallet = SparXWallet;
__decorate([
mobx_1.action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], SparXWallet.prototype, "init", null);