@tronweb3/tronwallet-adapter-tokenpocket 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+ Copyright (c) 2022-Present, tronprotocol
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # `@tronweb3/tronwallet-adapter-tokenpocket`
2
+
3
+ This package provides an adapter to enable TRON DApps to connect to the [TokenPocket Wallet App](https://tokenpocket.pro/).
4
+
5
+ ## Demo
6
+
7
+ ```typescript
8
+ import { TokenPocketAdapter } from '@tronweb3/tronwallet-adapter-tokenpocket';
9
+ import TronWeb from 'tronweb';
10
+
11
+ const tronWeb = new TronWeb({
12
+ fullHost: 'https://api.trongrid.io',
13
+ headers: { 'TRON-PRO-API-KEY': 'your api key' },
14
+ });
15
+
16
+ const adapter = new TokenPocketAdapter();
17
+ // connect
18
+ await adapter.connect();
19
+
20
+ // then you can get address
21
+ console.log(adapter.address);
22
+
23
+ // create a send TRX transaction
24
+ const unSignedTransaction = await tronWeb.transactionBuilder.sendTrx(targetAddress, 100, adapter.address);
25
+ // using adapter to sign the transaction
26
+ const signedTransaction = await adapter.signTransaction(unSignedTransaction);
27
+ // broadcast the transaction
28
+ await tronWeb.trx.sendRawTransaction(signedTransaction);
29
+ ```
30
+
31
+ ## Documentation
32
+
33
+ ### API
34
+
35
+ - `Constructor(config: TokenPocketConfig)`
36
+
37
+ ```typescript
38
+ interface TokenPocketConfig {
39
+ /**
40
+ * Set if open Wallet's website when wallet is not installed.
41
+ * Default is true.
42
+ */
43
+ openUrlWhenWalletNotFound?: boolean;
44
+ /**
45
+ * Timeout in millisecond for checking if TokenPocket wallet is supported.
46
+ * Default is 2 * 1000ms
47
+ */
48
+ checkTimeout?: number;
49
+ /**
50
+ * Set if open TokenPocket app using DeepLink on mobile device.
51
+ * Default is true.
52
+ */
53
+ openAppWithDeeplink?: boolean;
54
+ }
55
+ ```
56
+
57
+ - `network()` method is supported to get current network information. The type of returned value is `Network` as follows:
58
+
59
+ ```typescript
60
+ export enum NetworkType {
61
+ Mainnet = 'Mainnet',
62
+ Shasta = 'Shasta',
63
+ Nile = 'Nile',
64
+ /**
65
+ * When use custom node
66
+ */
67
+ Unknown = 'Unknown',
68
+ }
69
+
70
+ export type Network = {
71
+ networkType: NetworkType;
72
+ chainId: string;
73
+ fullNode: string;
74
+ solidityNode: string;
75
+ eventServer: string;
76
+ };
77
+ ```
78
+
79
+ ### Caveats
80
+
81
+ - TokenPocket App doesn't implement `signMessage()`, `multiSign()` and `switchChain()`.
82
+ - TokenPocket App will be connected automatically and when user change accounts, the page will reload. So there is no need to to listen to `accountsChanged` event.
83
+
84
+ For more information about tronwallet adapters, please refer to [`@tronweb3/tronwallet-adapters`](https://github.com/tronprotocol/tronwallet-adapter/tree/main/packages/adapters/adapters)
@@ -0,0 +1,316 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TokenPocketAdapter = exports.TokenPocketAdapterName = void 0;
13
+ const tronwallet_abstract_adapter_1 = require("@tronweb3/tronwallet-abstract-adapter");
14
+ const tronwallet_adapter_tronlink_1 = require("@tronweb3/tronwallet-adapter-tronlink");
15
+ const utils_js_1 = require("./utils.js");
16
+ exports.TokenPocketAdapterName = 'TokenPocket';
17
+ class TokenPocketAdapter extends tronwallet_abstract_adapter_1.Adapter {
18
+ constructor(config = {}) {
19
+ super();
20
+ this.name = exports.TokenPocketAdapterName;
21
+ this.url = 'https://tokenpocket.pro/';
22
+ this.icon = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIwIiBoZWlnaHQ9IjEyMCIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGc+CjxwYXRoIGQ9Ik0xMDQxLjUyIDBILTI3VjEwMjRIMTA0MS41MlYwWiIgZmlsbD0iIzI5ODBGRSIvPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfNDA4XzIyNSkiPgo8cGF0aCBkPSJNNDA2Ljc5NiA0MzguNjQzSDQwNi45MjdDNDA2Ljc5NiA0MzcuODU3IDQwNi43OTYgNDM2Ljk0IDQwNi43OTYgNDM2LjE1NFY0MzguNjQzWiIgZmlsbD0iIzI5QUVGRiIvPgo8cGF0aCBkPSJNNjY3LjYwMiA0NjMuNTMzSDUyMy4yNDlWNzI0LjA3NkM1MjMuMjQ5IDczNi4zODkgNTMzLjIwNCA3NDYuMzQ1IDU0NS41MTcgNzQ2LjM0NUg2NDUuMzMzQzY1Ny42NDcgNzQ2LjM0NSA2NjcuNjAyIDczNi4zODkgNjY3LjYwMiA3MjQuMDc2VjQ2My41MzNaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNDUzLjU2MyAyNzdINDQ4LjcxNkgxOTAuMjY5QzE3Ny45NTUgMjc3IDE2OCAyODYuOTU1IDE2OCAyOTkuMjY5VjM4OS42NTNDMTY4IDQwMS45NjcgMTc3Ljk1NSA0MTEuOTIyIDE5MC4yNjkgNDExLjkyMkgyNTAuOTE4SDI3NS4wMjFWNDM4LjY0NFY3MjQuNzMxQzI3NS4wMjEgNzM3LjA0NSAyODQuOTc2IDc0NyAyOTcuMjg5IDc0N0gzOTIuMTI4QzQwNC40NDEgNzQ3IDQxNC4zOTYgNzM3LjA0NSA0MTQuMzk2IDcyNC43MzFWNDM4LjY0NFY0MzYuMTU2VjQxMS45MjJINDM4LjQ5OUg0NDguMzIzSDQ1My4xN0M0OTAuMzcyIDQxMS45MjIgNTIwLjYzMSAzODEuNjYzIDUyMC42MzEgMzQ0LjQ2MUM1MjEuMDI0IDMwNy4yNTkgNDkwLjc2NSAyNzcgNDUzLjU2MyAyNzdaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNjY3LjczNSA0NjMuNTMzVjY0NS4zNUM2NzIuNzEzIDY0Ni41MjkgNjc3LjgyMSA2NDcuNDQ2IDY4My4wNjEgNjQ4LjIzMkM2OTAuMzk3IDY0OS4yOCA2OTcuOTk0IDY0OS45MzUgNzA1LjU5MiA2NTAuMDY2QzcwNS45ODUgNjUwLjA2NiA3MDYuMzc4IDY1MC4wNjYgNzA2LjkwMiA2NTAuMDY2VjUwNS40NUM2ODUuMDI2IDUwNC4wMDkgNjY3LjczNSA0ODUuODAxIDY2Ny43MzUgNDYzLjUzM1oiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl80MDhfMjI1KSIvPgo8cGF0aCBkPSJNNzA5Ljc4MSAyNzdDNjA2LjgyMiAyNzcgNTIzLjI0OSAzNjAuNTczIDUyMy4yNDkgNDYzLjUzM0M1MjMuMjQ5IDU1Mi4wODQgNTg0Ljk0NiA2MjYuMjI1IDY2Ny43MzMgNjQ1LjM1VjQ2My41MzNDNjY3LjczMyA0NDAuMzQ3IDY4Ni41OTYgNDIxLjQ4NCA3MDkuNzgxIDQyMS40ODRDNzMyLjk2NyA0MjEuNDg0IDc1MS44MyA0NDAuMzQ3IDc1MS44MyA0NjMuNTMzQzc1MS44MyA0ODMuMDUxIDczOC42IDQ5OS40MjUgNzIwLjUyMyA1MDQuMTRDNzE3LjExNyA1MDUuMDU3IDcxMy40NDkgNTA1LjU4MSA3MDkuNzgxIDUwNS41ODFWNjUwLjA2NkM3MTMuNDQ5IDY1MC4wNjYgNzE2Ljk4NiA2NDkuOTM1IDcyMC41MjMgNjQ5LjgwNEM4MTguNTA1IDY0NC4xNzEgODk2LjMxNCA1NjIuOTU2IDg5Ni4zMTQgNDYzLjUzM0M4OTYuNDQ1IDM2MC41NzMgODEyLjg3MiAyNzcgNzA5Ljc4MSAyNzdaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzA5Ljc4IDY1MC4wNjZWNTA1LjU4MUM3MDguNzMzIDUwNS41ODEgNzA3LjgxNiA1MDUuNTgxIDcwNi43NjggNTA1LjQ1VjY1MC4wNjZDNzA3LjgxNiA2NTAuMDY2IDcwOC44NjQgNjUwLjA2NiA3MDkuNzggNjUwLjA2NloiIGZpbGw9IndoaXRlIi8+CjwvZz4KPC9nPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzQwOF8yMjUiIHgxPSI3MDkuODQ0IiB5MT0iNTU2LjgyNyIgeDI9IjY2Ny43NTMiIHkyPSI1NTYuODI3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IndoaXRlIi8+CjxzdG9wIG9mZnNldD0iMC45NjY3IiBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwLjMyMzMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwLjMiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF80MDhfMjI1Ij4KPHJlY3Qgd2lkdGg9IjcyOC40NDgiIGhlaWdodD0iNDcwIiBmaWxsPSJ3aGl0ZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY4IDI3NykiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K';
23
+ this._readyState = (0, tronwallet_abstract_adapter_1.isInBrowser)() ? tronwallet_abstract_adapter_1.WalletReadyState.Loading : tronwallet_abstract_adapter_1.WalletReadyState.NotFound;
24
+ this._state = tronwallet_abstract_adapter_1.AdapterState.Loading;
25
+ this.checkReadyInterval = null;
26
+ this._checkPromise = null;
27
+ this._updateWallet = () => {
28
+ var _a, _b, _c, _d;
29
+ let state = this.state;
30
+ let address = this.address;
31
+ if ((0, utils_js_1.supportTokenPocket)()) {
32
+ // fake tronLink
33
+ this._wallet = {
34
+ ready: (_a = window.tronWeb) === null || _a === void 0 ? void 0 : _a.ready,
35
+ tronWeb: window.tronWeb,
36
+ request: () => Promise.resolve(true),
37
+ };
38
+ address = ((_b = this._wallet.tronWeb.defaultAddress) === null || _b === void 0 ? void 0 : _b.base58) || null;
39
+ state = ((_c = window.tronWeb) === null || _c === void 0 ? void 0 : _c.ready) ? tronwallet_abstract_adapter_1.AdapterState.Connected : tronwallet_abstract_adapter_1.AdapterState.Disconnect;
40
+ if (!((_d = window.tronWeb) === null || _d === void 0 ? void 0 : _d.ready)) {
41
+ this.checkForWalletReady();
42
+ }
43
+ }
44
+ else {
45
+ // no tronlink support
46
+ this._wallet = null;
47
+ address = null;
48
+ state = tronwallet_abstract_adapter_1.AdapterState.NotFound;
49
+ }
50
+ this.setAddress(address);
51
+ this.setState(state);
52
+ };
53
+ const { checkTimeout = 2 * 1000, openUrlWhenWalletNotFound = true, openAppWithDeeplink = true } = config;
54
+ if (typeof checkTimeout !== 'number') {
55
+ throw new Error('[TokenPocketAdapter] config.checkTimeout should be a number');
56
+ }
57
+ this.config = {
58
+ checkTimeout,
59
+ openAppWithDeeplink,
60
+ openUrlWhenWalletNotFound,
61
+ };
62
+ this._connecting = false;
63
+ this._wallet = null;
64
+ this._address = null;
65
+ if (!(0, tronwallet_abstract_adapter_1.isInMobileBrowser)()) {
66
+ // Currently TokenPocket extension does not support Tron.
67
+ this._readyState = tronwallet_abstract_adapter_1.WalletReadyState.NotFound;
68
+ this._state = tronwallet_abstract_adapter_1.AdapterState.NotFound;
69
+ return;
70
+ }
71
+ if ((0, utils_js_1.supportTokenPocket)()) {
72
+ this._readyState = tronwallet_abstract_adapter_1.WalletReadyState.Found;
73
+ this._updateWallet();
74
+ }
75
+ else {
76
+ this._checkWallet().then(() => {
77
+ if (this.connected) {
78
+ this.emit('connect', this.address || '');
79
+ }
80
+ });
81
+ }
82
+ }
83
+ get address() {
84
+ return this._address;
85
+ }
86
+ get state() {
87
+ return this._state;
88
+ }
89
+ get readyState() {
90
+ return this._readyState;
91
+ }
92
+ get connecting() {
93
+ return this._connecting;
94
+ }
95
+ /**
96
+ * Get network information.
97
+ * @returns {Network} Current network information.
98
+ */
99
+ network() {
100
+ return __awaiter(this, void 0, void 0, function* () {
101
+ try {
102
+ yield this._checkWallet();
103
+ if (this.state !== tronwallet_abstract_adapter_1.AdapterState.Connected)
104
+ throw new tronwallet_abstract_adapter_1.WalletDisconnectedError();
105
+ const wallet = this._wallet;
106
+ if (!wallet || !wallet.tronWeb)
107
+ throw new tronwallet_abstract_adapter_1.WalletDisconnectedError();
108
+ try {
109
+ return yield (0, tronwallet_adapter_tronlink_1.getNetworkInfoByTronWeb)(wallet.tronWeb);
110
+ }
111
+ catch (e) {
112
+ throw new tronwallet_abstract_adapter_1.WalletGetNetworkError(e === null || e === void 0 ? void 0 : e.message, e);
113
+ }
114
+ }
115
+ catch (e) {
116
+ this.emit('error', e);
117
+ throw e;
118
+ }
119
+ });
120
+ }
121
+ connect() {
122
+ var _a;
123
+ return __awaiter(this, void 0, void 0, function* () {
124
+ try {
125
+ this.checkIfOpenApp();
126
+ if (this.connected || this.connecting)
127
+ return;
128
+ yield this._checkWallet();
129
+ if (this.readyState === tronwallet_abstract_adapter_1.WalletReadyState.NotFound) {
130
+ if (this.config.openUrlWhenWalletNotFound !== false && (0, tronwallet_abstract_adapter_1.isInBrowser)()) {
131
+ window.open(this.url, '_blank');
132
+ }
133
+ throw new tronwallet_abstract_adapter_1.WalletNotFoundError();
134
+ }
135
+ if (!this._wallet)
136
+ return;
137
+ this._connecting = true;
138
+ const wallet = this._wallet;
139
+ const address = ((_a = wallet.tronWeb.defaultAddress) === null || _a === void 0 ? void 0 : _a.base58) || '';
140
+ this.setAddress(address);
141
+ this.setState(tronwallet_abstract_adapter_1.AdapterState.Connected);
142
+ this.emit('connect', this.address || '');
143
+ }
144
+ catch (error) {
145
+ this.emit('error', error);
146
+ throw error;
147
+ }
148
+ finally {
149
+ this._connecting = false;
150
+ }
151
+ });
152
+ }
153
+ disconnect() {
154
+ return __awaiter(this, void 0, void 0, function* () {
155
+ if (this.state !== tronwallet_abstract_adapter_1.AdapterState.Connected) {
156
+ return;
157
+ }
158
+ this.setAddress(null);
159
+ this.setState(tronwallet_abstract_adapter_1.AdapterState.Disconnect);
160
+ this.emit('disconnect');
161
+ });
162
+ }
163
+ signTransaction(transaction, privateKey) {
164
+ return __awaiter(this, void 0, void 0, function* () {
165
+ try {
166
+ const wallet = yield this.checkAndGetWallet();
167
+ try {
168
+ return yield wallet.tronWeb.trx.sign(transaction, privateKey);
169
+ }
170
+ catch (error) {
171
+ if (error instanceof Error) {
172
+ throw new tronwallet_abstract_adapter_1.WalletSignTransactionError(error.message, error);
173
+ }
174
+ else {
175
+ throw new tronwallet_abstract_adapter_1.WalletSignTransactionError(error, new Error(error));
176
+ }
177
+ }
178
+ }
179
+ catch (error) {
180
+ this.emit('error', error);
181
+ throw error;
182
+ }
183
+ });
184
+ }
185
+ multiSign(...args) {
186
+ return __awaiter(this, void 0, void 0, function* () {
187
+ try {
188
+ const wallet = yield this.checkAndGetWallet();
189
+ try {
190
+ return yield wallet.tronWeb.trx.multiSign(...args);
191
+ }
192
+ catch (error) {
193
+ if (error instanceof Error) {
194
+ throw new tronwallet_abstract_adapter_1.WalletSignTransactionError(error.message, error);
195
+ }
196
+ else {
197
+ throw new tronwallet_abstract_adapter_1.WalletSignTransactionError(error, new Error(error));
198
+ }
199
+ }
200
+ }
201
+ catch (error) {
202
+ this.emit('error', error);
203
+ throw error;
204
+ }
205
+ });
206
+ }
207
+ signMessage(message, privateKey) {
208
+ return __awaiter(this, void 0, void 0, function* () {
209
+ try {
210
+ const wallet = yield this.checkAndGetWallet();
211
+ try {
212
+ return yield wallet.tronWeb.trx.signMessageV2(message, privateKey);
213
+ }
214
+ catch (error) {
215
+ if (error instanceof Error) {
216
+ throw new tronwallet_abstract_adapter_1.WalletSignMessageError(error.message, error);
217
+ }
218
+ else {
219
+ throw new tronwallet_abstract_adapter_1.WalletSignMessageError(error, new Error(error));
220
+ }
221
+ }
222
+ }
223
+ catch (error) {
224
+ this.emit('error', error);
225
+ throw error;
226
+ }
227
+ });
228
+ }
229
+ checkAndGetWallet() {
230
+ return __awaiter(this, void 0, void 0, function* () {
231
+ this.checkIfOpenApp();
232
+ yield this._checkWallet();
233
+ if (!this.connected)
234
+ throw new tronwallet_abstract_adapter_1.WalletDisconnectedError();
235
+ const wallet = this._wallet;
236
+ if (!wallet || !wallet.tronWeb)
237
+ throw new tronwallet_abstract_adapter_1.WalletDisconnectedError();
238
+ return wallet;
239
+ });
240
+ }
241
+ checkIfOpenApp() {
242
+ if (this.config.openAppWithDeeplink === false) {
243
+ return;
244
+ }
245
+ if ((0, utils_js_1.openTokenPocket)()) {
246
+ throw new tronwallet_abstract_adapter_1.WalletNotFoundError();
247
+ }
248
+ }
249
+ checkForWalletReady() {
250
+ if (this.checkReadyInterval) {
251
+ return;
252
+ }
253
+ let times = 0;
254
+ const maxTimes = Math.floor(this.config.checkTimeout / 200);
255
+ const check = () => {
256
+ var _a;
257
+ if ((_a = window === null || window === void 0 ? void 0 : window.tronWeb) === null || _a === void 0 ? void 0 : _a.ready) {
258
+ this.checkReadyInterval && clearInterval(this.checkReadyInterval);
259
+ this.checkReadyInterval = null;
260
+ this._updateWallet();
261
+ this.emit('connect', this.address || '');
262
+ }
263
+ else if (times > maxTimes) {
264
+ this.checkReadyInterval && clearInterval(this.checkReadyInterval);
265
+ this.checkReadyInterval = null;
266
+ }
267
+ else {
268
+ times++;
269
+ }
270
+ };
271
+ this.checkReadyInterval = setInterval(check, 200);
272
+ }
273
+ /**
274
+ * check if wallet exists by interval, the promise only resolve when wallet detected or timeout
275
+ * @returns if wallet exists
276
+ */
277
+ _checkWallet() {
278
+ if (this.readyState === tronwallet_abstract_adapter_1.WalletReadyState.Found) {
279
+ return Promise.resolve(true);
280
+ }
281
+ if (this._checkPromise) {
282
+ return this._checkPromise;
283
+ }
284
+ const interval = 100;
285
+ const maxTimes = Math.floor(this.config.checkTimeout / interval);
286
+ let times = 0, timer;
287
+ this._checkPromise = new Promise((resolve) => {
288
+ const check = () => {
289
+ times++;
290
+ const isSupport = (0, utils_js_1.supportTokenPocket)();
291
+ if (isSupport || times > maxTimes) {
292
+ timer && clearInterval(timer);
293
+ this._readyState = isSupport ? tronwallet_abstract_adapter_1.WalletReadyState.Found : tronwallet_abstract_adapter_1.WalletReadyState.NotFound;
294
+ this._updateWallet();
295
+ this.emit('readyStateChanged', this.readyState);
296
+ resolve(isSupport);
297
+ }
298
+ };
299
+ timer = setInterval(check, interval);
300
+ check();
301
+ });
302
+ return this._checkPromise;
303
+ }
304
+ setAddress(address) {
305
+ this._address = address;
306
+ }
307
+ setState(state) {
308
+ const preState = this.state;
309
+ if (state !== preState) {
310
+ this._state = state;
311
+ this.emit('stateChanged', state);
312
+ }
313
+ }
314
+ }
315
+ exports.TokenPocketAdapter = TokenPocketAdapter;
316
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./adapter.js"), exports);
18
+ __exportStar(require("./utils.js"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,6CAA2B"}
@@ -0,0 +1 @@
1
+ { "type": "commonjs" }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openTokenPocket = exports.isInTokenPocket = exports.supportTokenPocket = void 0;
4
+ const tronwallet_abstract_adapter_1 = require("@tronweb3/tronwallet-abstract-adapter");
5
+ function supportTokenPocket() {
6
+ return !!window.tronWeb && typeof window.tokenpocket !== 'undefined';
7
+ }
8
+ exports.supportTokenPocket = supportTokenPocket;
9
+ /**
10
+ * Detect if in TokenPocketApp
11
+ * There will be a `tokenpocket` object on window
12
+ */
13
+ function isInTokenPocket() {
14
+ return (0, tronwallet_abstract_adapter_1.isInBrowser)() && typeof window.tokenpocket !== 'undefined';
15
+ }
16
+ exports.isInTokenPocket = isInTokenPocket;
17
+ function openTokenPocket() {
18
+ if (!supportTokenPocket() && (0, tronwallet_abstract_adapter_1.isInMobileBrowser)() && !isInTokenPocket()) {
19
+ const { origin, pathname, search, hash } = window.location;
20
+ const url = origin + pathname + search + hash;
21
+ const params = {
22
+ action: 'open',
23
+ actionId: Date.now() + '',
24
+ callbackUrl: 'http://someurl.com',
25
+ blockchain: 'Tron',
26
+ chain: 'Tron',
27
+ url,
28
+ protocol: 'TokenPocket',
29
+ version: '1.0',
30
+ };
31
+ window.location.href = `tpdapp://open?params=${encodeURIComponent(JSON.stringify(params))}`;
32
+ return true;
33
+ }
34
+ return false;
35
+ }
36
+ exports.openTokenPocket = openTokenPocket;
37
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;AAAA,uFAAuF;AAEvF,SAAgB,kBAAkB;IAC9B,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,OAAQ,MAAc,CAAC,WAAW,KAAK,WAAW,CAAC;AAClF,CAAC;AAFD,gDAEC;AAED;;;GAGG;AACH,SAAgB,eAAe;IAC3B,OAAO,IAAA,yCAAW,GAAE,IAAI,OAAQ,MAAc,CAAC,WAAW,KAAK,WAAW,CAAC;AAC/E,CAAC;AAFD,0CAEC;AAED,SAAgB,eAAe;IAC3B,IAAI,CAAC,kBAAkB,EAAE,IAAI,IAAA,+CAAiB,GAAE,IAAI,CAAC,eAAe,EAAE,EAAE;QACpE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC3D,MAAM,GAAG,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;QAC9C,MAAM,MAAM,GAAG;YACX,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;YACzB,WAAW,EAAE,oBAAoB;YACjC,UAAU,EAAE,MAAM;YAClB,KAAK,EAAE,MAAM;YACb,GAAG;YACH,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,KAAK;SACjB,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,wBAAwB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAC;KACf;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAlBD,0CAkBC"}