@mysten/enoki-connect 0.0.2 → 0.0.4

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/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @mysten/enoki-connect
2
2
 
3
+ ## 0.0.4
4
+
5
+ ### Patch Changes
6
+
7
+ - ff4193f: allow registering multiple enoki-connect wallets
8
+
9
+ - removes `registerEnokiConnectWallet`
10
+ - adds `registerEnokiConnectWallets`
11
+
12
+ ## 0.0.3
13
+
14
+ ### Patch Changes
15
+
16
+ - @mysten/sui@1.29.1
17
+ - @mysten/wallet-standard@0.14.9
18
+
3
19
  ## 0.0.2
4
20
 
5
21
  ### Patch Changes
@@ -1 +1 @@
1
- export { EnokiConnectWallet, registerEnokiConnectWallet, type SupportedNetwork, } from './wallet/index.js';
1
+ export { EnokiConnectWallet, registerEnokiConnectWallets, type SupportedNetwork, } from './wallet/index.js';
package/dist/cjs/index.js CHANGED
@@ -19,7 +19,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var index_exports = {};
20
20
  __export(index_exports, {
21
21
  EnokiConnectWallet: () => import_wallet.EnokiConnectWallet,
22
- registerEnokiConnectWallet: () => import_wallet.registerEnokiConnectWallet
22
+ registerEnokiConnectWallets: () => import_wallet.registerEnokiConnectWallets
23
23
  });
24
24
  module.exports = __toCommonJS(index_exports);
25
25
  var import_wallet = require("./wallet/index.js");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport {\n\tEnokiConnectWallet,\n\tregisterEnokiConnectWallet,\n\ttype SupportedNetwork,\n} from './wallet/index.js';\n"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport {\n\tEnokiConnectWallet,\n\tregisterEnokiConnectWallets,\n\ttype SupportedNetwork,\n} from './wallet/index.js';\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,oBAIO;",
6
6
  "names": []
7
7
  }
@@ -19,12 +19,12 @@ export declare class EnokiConnectWallet implements Wallet {
19
19
  icon: WalletIcon;
20
20
  });
21
21
  }
22
- export declare function registerEnokiConnectWallet({ publicAppSlug, dappName, network, enokiApiUrl, }: {
23
- publicAppSlug: string;
22
+ export declare function registerEnokiConnectWallets({ publicAppSlugs, dappName, network, enokiApiUrl, }: {
23
+ publicAppSlugs: string[];
24
24
  dappName: string;
25
25
  network?: SupportedNetwork;
26
26
  enokiApiUrl?: string;
27
27
  }): Promise<{
28
- wallet: EnokiConnectWallet;
28
+ wallets: EnokiConnectWallet[];
29
29
  unregister: () => void;
30
30
  }>;
@@ -37,7 +37,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
37
37
  var wallet_exports = {};
38
38
  __export(wallet_exports, {
39
39
  EnokiConnectWallet: () => EnokiConnectWallet,
40
- registerEnokiConnectWallet: () => registerEnokiConnectWallet
40
+ registerEnokiConnectWallets: () => registerEnokiConnectWallets
41
41
  });
42
42
  module.exports = __toCommonJS(wallet_exports);
43
43
  var import_utils = require("@mysten/sui/utils");
@@ -282,34 +282,50 @@ getAccountsFromSession_fn = function(session) {
282
282
  return [];
283
283
  }
284
284
  };
285
- async function getEnokiConnectMetadata(publicAppSlug, enokiApiUrl) {
286
- const res = await fetch(new URL(`/connect/metadata/${publicAppSlug}`, enokiApiUrl));
285
+ async function getEnokiConnectMetadata(publicAppSlugs, enokiApiUrl) {
286
+ const sortedPublicAppSlugs = [...publicAppSlugs].sort();
287
+ const queryParams = new URLSearchParams();
288
+ for (const publicAppSlug of sortedPublicAppSlugs) {
289
+ queryParams.append("s", publicAppSlug);
290
+ }
291
+ queryParams.sort();
292
+ const res = await fetch(new URL(`/connect/metadata?${queryParams.toString()}`, enokiApiUrl));
287
293
  if (!res.ok) {
288
294
  throw new Error("Failed to fetch enoki connect metadata");
289
295
  }
290
296
  const { data } = await res.json();
291
297
  return data;
292
298
  }
293
- async function registerEnokiConnectWallet({
294
- publicAppSlug,
299
+ async function registerEnokiConnectWallets({
300
+ publicAppSlugs,
295
301
  dappName,
296
302
  network = "mainnet",
297
303
  enokiApiUrl = "https://api.enoki.mystenlabs.com"
298
304
  }) {
299
- const data = await getEnokiConnectMetadata(publicAppSlug, enokiApiUrl);
300
305
  const wallets = (0, import_wallet_standard.getWallets)();
301
- const wallet = new EnokiConnectWallet({
302
- walletName: data.name,
303
- dappName,
304
- hostOrigin: data.appUrl,
305
- icon: data.logoUrl,
306
- network,
307
- publicAppSlug
308
- });
309
- const unregister = wallets.register(wallet);
306
+ const data = await getEnokiConnectMetadata(publicAppSlugs, enokiApiUrl);
307
+ const unregisterCallbacks = [];
308
+ const registeredWallets = [];
309
+ for (const aWalletMetadata of data) {
310
+ const wallet = new EnokiConnectWallet({
311
+ walletName: aWalletMetadata.name,
312
+ dappName,
313
+ hostOrigin: aWalletMetadata.appUrl,
314
+ icon: aWalletMetadata.logoUrl,
315
+ network,
316
+ publicAppSlug: aWalletMetadata.publicAppSlug
317
+ });
318
+ const unregister = wallets.register(wallet);
319
+ unregisterCallbacks.push(unregister);
320
+ registeredWallets.push(wallet);
321
+ }
310
322
  return {
311
- wallet,
312
- unregister
323
+ wallets: registeredWallets,
324
+ unregister: () => {
325
+ for (const unregister of unregisterCallbacks) {
326
+ unregister();
327
+ }
328
+ }
313
329
  };
314
330
  }
315
331
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/wallet/index.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase64, toBase64 } from '@mysten/sui/utils';\nimport type {\n\tIdentifierString,\n\tStandardConnectFeature,\n\tStandardConnectMethod,\n\tStandardDisconnectFeature,\n\tStandardDisconnectMethod,\n\tStandardEventsFeature,\n\tStandardEventsListeners,\n\tStandardEventsOnMethod,\n\tSuiSignAndExecuteTransactionFeature,\n\tSuiSignAndExecuteTransactionMethod,\n\tSuiSignPersonalMessageFeature,\n\tSuiSignPersonalMessageMethod,\n\tSuiSignTransactionBlockFeature,\n\tSuiSignTransactionBlockMethod,\n\tSuiSignTransactionFeature,\n\tSuiSignTransactionMethod,\n\tWallet,\n\tWalletIcon,\n} from '@mysten/wallet-standard';\nimport {\n\tgetWallets,\n\tReadonlyWalletAccount,\n\tSUI_MAINNET_CHAIN,\n\tSUI_TESTNET_CHAIN,\n} from '@mysten/wallet-standard';\nimport type { Emitter } from 'mitt';\nimport mitt from 'mitt';\nimport { DappPostMessageChannel, decodeJwtSession } from '@mysten/window-wallet-core';\n\nexport type SupportedNetwork = 'mainnet' | 'testnet';\n\ntype WalletEventsMap = {\n\t[E in keyof StandardEventsListeners]: Parameters<StandardEventsListeners[E]>[0];\n};\n\nconst SUPPORTED_CHAINS = [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN] as const;\nconst ACCOUNT_FEATURES = [\n\t'sui:signTransaction',\n\t'sui:signAndExecuteTransaction',\n\t'sui:signPersonalMessage',\n\t'sui:signTransactionBlock',\n\t'sui:signAndExecuteTransactionBlock',\n] as const;\n\nexport class EnokiConnectWallet implements Wallet {\n\treadonly id: string;\n\t#events: Emitter<WalletEventsMap>;\n\t#accounts: ReadonlyWalletAccount[];\n\t#hostOrigin: string;\n\t#walletName: string;\n\t#dappName: string;\n\t#icon: WalletIcon;\n\t#defaultChain: IdentifierString;\n\t#publicAppSlug: string;\n\n\tget name() {\n\t\treturn this.#walletName;\n\t}\n\n\tget icon() {\n\t\treturn this.#icon;\n\t}\n\n\tget version() {\n\t\treturn '1.0.0' as const;\n\t}\n\n\tget chains() {\n\t\treturn SUPPORTED_CHAINS;\n\t}\n\n\tget accounts() {\n\t\treturn this.#accounts;\n\t}\n\n\tget features(): StandardConnectFeature &\n\t\tStandardDisconnectFeature &\n\t\tStandardEventsFeature &\n\t\tSuiSignTransactionBlockFeature &\n\t\tSuiSignTransactionFeature &\n\t\tSuiSignPersonalMessageFeature &\n\t\tSuiSignAndExecuteTransactionFeature {\n\t\treturn {\n\t\t\t'standard:connect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tconnect: this.#connect,\n\t\t\t},\n\t\t\t'standard:disconnect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tdisconnect: this.#disconnect,\n\t\t\t},\n\t\t\t'standard:events': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\ton: this.#on,\n\t\t\t},\n\t\t\t'sui:signTransactionBlock': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tsignTransactionBlock: this.#signTransactionBlock,\n\t\t\t},\n\t\t\t'sui:signTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignTransaction: this.#signTransaction,\n\t\t\t},\n\t\t\t'sui:signPersonalMessage': {\n\t\t\t\tversion: '1.1.0',\n\t\t\t\tsignPersonalMessage: this.#signPersonalMessage,\n\t\t\t},\n\t\t\t'sui:signAndExecuteTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignAndExecuteTransaction: this.#signAndExecuteTransaction,\n\t\t\t},\n\t\t};\n\t}\n\n\tconstructor({\n\t\tpublicAppSlug,\n\t\twalletName,\n\t\tdappName,\n\t\thostOrigin,\n\t\ticon,\n\t\tnetwork,\n\t}: {\n\t\tpublicAppSlug: string;\n\t\twalletName: string;\n\t\tdappName: string;\n\t\tnetwork: SupportedNetwork;\n\t\thostOrigin: string;\n\t\ticon: WalletIcon;\n\t}) {\n\t\tthis.#accounts = [];\n\t\tthis.#events = mitt();\n\t\tthis.#hostOrigin = hostOrigin;\n\t\tthis.#walletName = walletName;\n\t\tthis.#dappName = dappName;\n\t\tthis.#icon = icon;\n\t\tthis.#defaultChain = `sui:${network}`;\n\t\tthis.#publicAppSlug = publicAppSlug;\n\t\tthis.id = `enoki-connect-${publicAppSlug}`;\n\t}\n\n\t#signTransactionBlock: SuiSignTransactionBlockMethod = async ({\n\t\ttransactionBlock,\n\t\taccount,\n\t\tchain,\n\t}) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\tchain,\n\t\t\ttransaction: await transactionBlock.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\ttransactionBlockBytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#signTransaction: SuiSignTransactionMethod = async ({ transaction, account, chain }) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\tchain,\n\t\t\ttransaction: await transaction.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#signAndExecuteTransaction: SuiSignAndExecuteTransactionMethod = async ({\n\t\ttransaction,\n\t\taccount,\n\t\tchain,\n\t}) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-and-execute-transaction',\n\t\t\ttransaction: await transaction.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tchain,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t\tdigest: response.digest,\n\t\t\teffects: response.effects,\n\t\t};\n\t};\n\n\t#signPersonalMessage: SuiSignPersonalMessageMethod = async ({ message, account, chain }) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-personal-message',\n\t\t\tchain: chain ?? this.#defaultChain,\n\t\t\tmessage: toBase64(message),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#on: StandardEventsOnMethod = (event, listener) => {\n\t\tthis.#events.on(event, listener);\n\n\t\treturn () => this.#events.off(event, listener);\n\t};\n\n\t#setAccounts(session?: string) {\n\t\tif (session) {\n\t\t\tthis.#accounts = this.#getAccountsFromSession(session);\n\t\t\tlocalStorage.setItem(this.#getSessionKey(), session);\n\t\t} else {\n\t\t\tthis.#accounts = [];\n\t\t}\n\n\t\tthis.#events.emit('change', { accounts: this.accounts });\n\t}\n\n\t#connect: StandardConnectMethod = async (input) => {\n\t\tif (input?.silent) {\n\t\t\ttry {\n\t\t\t\tconst session = this.#getStoredSession();\n\n\t\t\t\tif (session) {\n\t\t\t\t\tthis.#setAccounts(session);\n\t\t\t\t}\n\t\t\t} catch (_e) {\n\t\t\t\t// ignore\n\t\t\t}\n\n\t\t\treturn { accounts: this.accounts };\n\t\t}\n\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'connect',\n\t\t});\n\n\t\tthis.#setAccounts(response.session);\n\n\t\treturn { accounts: this.accounts };\n\t};\n\n\t#disconnect: StandardDisconnectMethod = async () => {\n\t\tlocalStorage.removeItem(this.#getSessionKey());\n\t\tthis.#setAccounts();\n\t};\n\n\t#getSessionKey() {\n\t\treturn `enoki-connect-${this.#publicAppSlug}:session`;\n\t}\n\n\t#getStoredSession() {\n\t\tconst session = localStorage.getItem(this.#getSessionKey());\n\n\t\tif (!session) {\n\t\t\tthrow new Error('No session found');\n\t\t}\n\n\t\treturn session;\n\t}\n\n\t#getNewPopupChannel() {\n\t\treturn new DappPostMessageChannel({\n\t\t\tappName: this.#dappName,\n\t\t\thostOrigin: this.#hostOrigin,\n\t\t\textraRequestOptions: {\n\t\t\t\tpublicAppSlug: this.#publicAppSlug,\n\t\t\t},\n\t\t});\n\t}\n\n\t#getAccountsFromSession(session: string) {\n\t\ttry {\n\t\t\tconst {\n\t\t\t\tpayload: { accounts },\n\t\t\t} = decodeJwtSession(session);\n\n\t\t\treturn accounts.map(\n\t\t\t\t(anAccount) =>\n\t\t\t\t\tnew ReadonlyWalletAccount({\n\t\t\t\t\t\taddress: anAccount.address,\n\t\t\t\t\t\tchains: SUPPORTED_CHAINS,\n\t\t\t\t\t\tfeatures: ACCOUNT_FEATURES,\n\t\t\t\t\t\tpublicKey: fromBase64(anAccount.publicKey),\n\t\t\t\t\t}),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treturn [];\n\t\t}\n\t}\n}\n\ntype EnokiConnectMetadata = {\n\tname: string;\n\tlogoUrl: WalletIcon;\n\tappUrl: string;\n};\n\nasync function getEnokiConnectMetadata(publicAppSlug: string, enokiApiUrl: string) {\n\tconst res = await fetch(new URL(`/connect/metadata/${publicAppSlug}`, enokiApiUrl));\n\n\tif (!res.ok) {\n\t\tthrow new Error('Failed to fetch enoki connect metadata');\n\t}\n\n\tconst { data } = await res.json();\n\n\treturn data as EnokiConnectMetadata;\n}\n\nexport async function registerEnokiConnectWallet({\n\tpublicAppSlug,\n\tdappName,\n\tnetwork = 'mainnet',\n\tenokiApiUrl = 'https://api.enoki.mystenlabs.com',\n}: {\n\tpublicAppSlug: string;\n\tdappName: string;\n\tnetwork?: SupportedNetwork;\n\tenokiApiUrl?: string;\n}) {\n\tconst data = await getEnokiConnectMetadata(publicAppSlug, enokiApiUrl);\n\tconst wallets = getWallets();\n\tconst wallet = new EnokiConnectWallet({\n\t\twalletName: data.name,\n\t\tdappName,\n\t\thostOrigin: data.appUrl,\n\t\ticon: data.logoUrl,\n\t\tnetwork,\n\t\tpublicAppSlug,\n\t});\n\tconst unregister = wallets.register(wallet);\n\n\treturn {\n\t\twallet,\n\t\tunregister,\n\t};\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase64, toBase64 } from '@mysten/sui/utils';\nimport type {\n\tIdentifierString,\n\tStandardConnectFeature,\n\tStandardConnectMethod,\n\tStandardDisconnectFeature,\n\tStandardDisconnectMethod,\n\tStandardEventsFeature,\n\tStandardEventsListeners,\n\tStandardEventsOnMethod,\n\tSuiSignAndExecuteTransactionFeature,\n\tSuiSignAndExecuteTransactionMethod,\n\tSuiSignPersonalMessageFeature,\n\tSuiSignPersonalMessageMethod,\n\tSuiSignTransactionBlockFeature,\n\tSuiSignTransactionBlockMethod,\n\tSuiSignTransactionFeature,\n\tSuiSignTransactionMethod,\n\tWallet,\n\tWalletIcon,\n} from '@mysten/wallet-standard';\nimport {\n\tgetWallets,\n\tReadonlyWalletAccount,\n\tSUI_MAINNET_CHAIN,\n\tSUI_TESTNET_CHAIN,\n} from '@mysten/wallet-standard';\nimport type { Emitter } from 'mitt';\nimport mitt from 'mitt';\nimport { DappPostMessageChannel, decodeJwtSession } from '@mysten/window-wallet-core';\n\nexport type SupportedNetwork = 'mainnet' | 'testnet';\n\ntype WalletEventsMap = {\n\t[E in keyof StandardEventsListeners]: Parameters<StandardEventsListeners[E]>[0];\n};\n\nconst SUPPORTED_CHAINS = [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN] as const;\nconst ACCOUNT_FEATURES = [\n\t'sui:signTransaction',\n\t'sui:signAndExecuteTransaction',\n\t'sui:signPersonalMessage',\n\t'sui:signTransactionBlock',\n\t'sui:signAndExecuteTransactionBlock',\n] as const;\n\nexport class EnokiConnectWallet implements Wallet {\n\treadonly id: string;\n\t#events: Emitter<WalletEventsMap>;\n\t#accounts: ReadonlyWalletAccount[];\n\t#hostOrigin: string;\n\t#walletName: string;\n\t#dappName: string;\n\t#icon: WalletIcon;\n\t#defaultChain: IdentifierString;\n\t#publicAppSlug: string;\n\n\tget name() {\n\t\treturn this.#walletName;\n\t}\n\n\tget icon() {\n\t\treturn this.#icon;\n\t}\n\n\tget version() {\n\t\treturn '1.0.0' as const;\n\t}\n\n\tget chains() {\n\t\treturn SUPPORTED_CHAINS;\n\t}\n\n\tget accounts() {\n\t\treturn this.#accounts;\n\t}\n\n\tget features(): StandardConnectFeature &\n\t\tStandardDisconnectFeature &\n\t\tStandardEventsFeature &\n\t\tSuiSignTransactionBlockFeature &\n\t\tSuiSignTransactionFeature &\n\t\tSuiSignPersonalMessageFeature &\n\t\tSuiSignAndExecuteTransactionFeature {\n\t\treturn {\n\t\t\t'standard:connect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tconnect: this.#connect,\n\t\t\t},\n\t\t\t'standard:disconnect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tdisconnect: this.#disconnect,\n\t\t\t},\n\t\t\t'standard:events': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\ton: this.#on,\n\t\t\t},\n\t\t\t'sui:signTransactionBlock': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tsignTransactionBlock: this.#signTransactionBlock,\n\t\t\t},\n\t\t\t'sui:signTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignTransaction: this.#signTransaction,\n\t\t\t},\n\t\t\t'sui:signPersonalMessage': {\n\t\t\t\tversion: '1.1.0',\n\t\t\t\tsignPersonalMessage: this.#signPersonalMessage,\n\t\t\t},\n\t\t\t'sui:signAndExecuteTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignAndExecuteTransaction: this.#signAndExecuteTransaction,\n\t\t\t},\n\t\t};\n\t}\n\n\tconstructor({\n\t\tpublicAppSlug,\n\t\twalletName,\n\t\tdappName,\n\t\thostOrigin,\n\t\ticon,\n\t\tnetwork,\n\t}: {\n\t\tpublicAppSlug: string;\n\t\twalletName: string;\n\t\tdappName: string;\n\t\tnetwork: SupportedNetwork;\n\t\thostOrigin: string;\n\t\ticon: WalletIcon;\n\t}) {\n\t\tthis.#accounts = [];\n\t\tthis.#events = mitt();\n\t\tthis.#hostOrigin = hostOrigin;\n\t\tthis.#walletName = walletName;\n\t\tthis.#dappName = dappName;\n\t\tthis.#icon = icon;\n\t\tthis.#defaultChain = `sui:${network}`;\n\t\tthis.#publicAppSlug = publicAppSlug;\n\t\tthis.id = `enoki-connect-${publicAppSlug}`;\n\t}\n\n\t#signTransactionBlock: SuiSignTransactionBlockMethod = async ({\n\t\ttransactionBlock,\n\t\taccount,\n\t\tchain,\n\t}) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\tchain,\n\t\t\ttransaction: await transactionBlock.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\ttransactionBlockBytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#signTransaction: SuiSignTransactionMethod = async ({ transaction, account, chain }) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\tchain,\n\t\t\ttransaction: await transaction.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#signAndExecuteTransaction: SuiSignAndExecuteTransactionMethod = async ({\n\t\ttransaction,\n\t\taccount,\n\t\tchain,\n\t}) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-and-execute-transaction',\n\t\t\ttransaction: await transaction.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tchain,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t\tdigest: response.digest,\n\t\t\teffects: response.effects,\n\t\t};\n\t};\n\n\t#signPersonalMessage: SuiSignPersonalMessageMethod = async ({ message, account, chain }) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-personal-message',\n\t\t\tchain: chain ?? this.#defaultChain,\n\t\t\tmessage: toBase64(message),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#on: StandardEventsOnMethod = (event, listener) => {\n\t\tthis.#events.on(event, listener);\n\n\t\treturn () => this.#events.off(event, listener);\n\t};\n\n\t#setAccounts(session?: string) {\n\t\tif (session) {\n\t\t\tthis.#accounts = this.#getAccountsFromSession(session);\n\t\t\tlocalStorage.setItem(this.#getSessionKey(), session);\n\t\t} else {\n\t\t\tthis.#accounts = [];\n\t\t}\n\n\t\tthis.#events.emit('change', { accounts: this.accounts });\n\t}\n\n\t#connect: StandardConnectMethod = async (input) => {\n\t\tif (input?.silent) {\n\t\t\ttry {\n\t\t\t\tconst session = this.#getStoredSession();\n\n\t\t\t\tif (session) {\n\t\t\t\t\tthis.#setAccounts(session);\n\t\t\t\t}\n\t\t\t} catch (_e) {\n\t\t\t\t// ignore\n\t\t\t}\n\n\t\t\treturn { accounts: this.accounts };\n\t\t}\n\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'connect',\n\t\t});\n\n\t\tthis.#setAccounts(response.session);\n\n\t\treturn { accounts: this.accounts };\n\t};\n\n\t#disconnect: StandardDisconnectMethod = async () => {\n\t\tlocalStorage.removeItem(this.#getSessionKey());\n\t\tthis.#setAccounts();\n\t};\n\n\t#getSessionKey() {\n\t\treturn `enoki-connect-${this.#publicAppSlug}:session`;\n\t}\n\n\t#getStoredSession() {\n\t\tconst session = localStorage.getItem(this.#getSessionKey());\n\n\t\tif (!session) {\n\t\t\tthrow new Error('No session found');\n\t\t}\n\n\t\treturn session;\n\t}\n\n\t#getNewPopupChannel() {\n\t\treturn new DappPostMessageChannel({\n\t\t\tappName: this.#dappName,\n\t\t\thostOrigin: this.#hostOrigin,\n\t\t\textraRequestOptions: {\n\t\t\t\tpublicAppSlug: this.#publicAppSlug,\n\t\t\t},\n\t\t});\n\t}\n\n\t#getAccountsFromSession(session: string) {\n\t\ttry {\n\t\t\tconst {\n\t\t\t\tpayload: { accounts },\n\t\t\t} = decodeJwtSession(session);\n\n\t\t\treturn accounts.map(\n\t\t\t\t(anAccount) =>\n\t\t\t\t\tnew ReadonlyWalletAccount({\n\t\t\t\t\t\taddress: anAccount.address,\n\t\t\t\t\t\tchains: SUPPORTED_CHAINS,\n\t\t\t\t\t\tfeatures: ACCOUNT_FEATURES,\n\t\t\t\t\t\tpublicKey: fromBase64(anAccount.publicKey),\n\t\t\t\t\t}),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treturn [];\n\t\t}\n\t}\n}\n\ntype EnokiConnectMetadata = {\n\tpublicAppSlug: string;\n\tname: string;\n\tlogoUrl: WalletIcon;\n\tappUrl: string;\n};\n\nasync function getEnokiConnectMetadata(publicAppSlugs: string[], enokiApiUrl: string) {\n\tconst sortedPublicAppSlugs = [...publicAppSlugs].sort();\n\tconst queryParams = new URLSearchParams();\n\n\tfor (const publicAppSlug of sortedPublicAppSlugs) {\n\t\tqueryParams.append('s', publicAppSlug);\n\t}\n\n\tqueryParams.sort();\n\n\tconst res = await fetch(new URL(`/connect/metadata?${queryParams.toString()}`, enokiApiUrl));\n\n\tif (!res.ok) {\n\t\tthrow new Error('Failed to fetch enoki connect metadata');\n\t}\n\n\tconst { data } = await res.json();\n\n\treturn data as EnokiConnectMetadata[];\n}\n\nexport async function registerEnokiConnectWallets({\n\tpublicAppSlugs,\n\tdappName,\n\tnetwork = 'mainnet',\n\tenokiApiUrl = 'https://api.enoki.mystenlabs.com',\n}: {\n\tpublicAppSlugs: string[];\n\tdappName: string;\n\tnetwork?: SupportedNetwork;\n\tenokiApiUrl?: string;\n}) {\n\tconst wallets = getWallets();\n\tconst data = await getEnokiConnectMetadata(publicAppSlugs, enokiApiUrl);\n\tconst unregisterCallbacks: (() => void)[] = [];\n\tconst registeredWallets: EnokiConnectWallet[] = [];\n\n\tfor (const aWalletMetadata of data) {\n\t\tconst wallet = new EnokiConnectWallet({\n\t\t\twalletName: aWalletMetadata.name,\n\t\t\tdappName,\n\t\t\thostOrigin: aWalletMetadata.appUrl,\n\t\t\ticon: aWalletMetadata.logoUrl,\n\t\t\tnetwork,\n\t\t\tpublicAppSlug: aWalletMetadata.publicAppSlug,\n\t\t});\n\t\tconst unregister = wallets.register(wallet);\n\n\t\tunregisterCallbacks.push(unregister);\n\t\tregisteredWallets.push(wallet);\n\t}\n\n\treturn {\n\t\twallets: registeredWallets,\n\t\tunregister: () => {\n\t\t\tfor (const unregister of unregisterCallbacks) {\n\t\t\t\tunregister();\n\t\t\t}\n\t\t},\n\t};\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["mitt"]
7
7
  }
@@ -1 +1 @@
1
- export { EnokiConnectWallet, registerEnokiConnectWallet, type SupportedNetwork, } from './wallet/index.js';
1
+ export { EnokiConnectWallet, registerEnokiConnectWallets, type SupportedNetwork, } from './wallet/index.js';
package/dist/esm/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  EnokiConnectWallet,
3
- registerEnokiConnectWallet
3
+ registerEnokiConnectWallets
4
4
  } from "./wallet/index.js";
5
5
  export {
6
6
  EnokiConnectWallet,
7
- registerEnokiConnectWallet
7
+ registerEnokiConnectWallets
8
8
  };
9
9
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport {\n\tEnokiConnectWallet,\n\tregisterEnokiConnectWallet,\n\ttype SupportedNetwork,\n} from './wallet/index.js';\n"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport {\n\tEnokiConnectWallet,\n\tregisterEnokiConnectWallets,\n\ttype SupportedNetwork,\n} from './wallet/index.js';\n"],
5
5
  "mappings": "AAGA;AAAA,EACC;AAAA,EACA;AAAA,OAEM;",
6
6
  "names": []
7
7
  }
@@ -19,12 +19,12 @@ export declare class EnokiConnectWallet implements Wallet {
19
19
  icon: WalletIcon;
20
20
  });
21
21
  }
22
- export declare function registerEnokiConnectWallet({ publicAppSlug, dappName, network, enokiApiUrl, }: {
23
- publicAppSlug: string;
22
+ export declare function registerEnokiConnectWallets({ publicAppSlugs, dappName, network, enokiApiUrl, }: {
23
+ publicAppSlugs: string[];
24
24
  dappName: string;
25
25
  network?: SupportedNetwork;
26
26
  enokiApiUrl?: string;
27
27
  }): Promise<{
28
- wallet: EnokiConnectWallet;
28
+ wallets: EnokiConnectWallet[];
29
29
  unregister: () => void;
30
30
  }>;
@@ -253,38 +253,54 @@ getAccountsFromSession_fn = function(session) {
253
253
  return [];
254
254
  }
255
255
  };
256
- async function getEnokiConnectMetadata(publicAppSlug, enokiApiUrl) {
257
- const res = await fetch(new URL(`/connect/metadata/${publicAppSlug}`, enokiApiUrl));
256
+ async function getEnokiConnectMetadata(publicAppSlugs, enokiApiUrl) {
257
+ const sortedPublicAppSlugs = [...publicAppSlugs].sort();
258
+ const queryParams = new URLSearchParams();
259
+ for (const publicAppSlug of sortedPublicAppSlugs) {
260
+ queryParams.append("s", publicAppSlug);
261
+ }
262
+ queryParams.sort();
263
+ const res = await fetch(new URL(`/connect/metadata?${queryParams.toString()}`, enokiApiUrl));
258
264
  if (!res.ok) {
259
265
  throw new Error("Failed to fetch enoki connect metadata");
260
266
  }
261
267
  const { data } = await res.json();
262
268
  return data;
263
269
  }
264
- async function registerEnokiConnectWallet({
265
- publicAppSlug,
270
+ async function registerEnokiConnectWallets({
271
+ publicAppSlugs,
266
272
  dappName,
267
273
  network = "mainnet",
268
274
  enokiApiUrl = "https://api.enoki.mystenlabs.com"
269
275
  }) {
270
- const data = await getEnokiConnectMetadata(publicAppSlug, enokiApiUrl);
271
276
  const wallets = getWallets();
272
- const wallet = new EnokiConnectWallet({
273
- walletName: data.name,
274
- dappName,
275
- hostOrigin: data.appUrl,
276
- icon: data.logoUrl,
277
- network,
278
- publicAppSlug
279
- });
280
- const unregister = wallets.register(wallet);
277
+ const data = await getEnokiConnectMetadata(publicAppSlugs, enokiApiUrl);
278
+ const unregisterCallbacks = [];
279
+ const registeredWallets = [];
280
+ for (const aWalletMetadata of data) {
281
+ const wallet = new EnokiConnectWallet({
282
+ walletName: aWalletMetadata.name,
283
+ dappName,
284
+ hostOrigin: aWalletMetadata.appUrl,
285
+ icon: aWalletMetadata.logoUrl,
286
+ network,
287
+ publicAppSlug: aWalletMetadata.publicAppSlug
288
+ });
289
+ const unregister = wallets.register(wallet);
290
+ unregisterCallbacks.push(unregister);
291
+ registeredWallets.push(wallet);
292
+ }
281
293
  return {
282
- wallet,
283
- unregister
294
+ wallets: registeredWallets,
295
+ unregister: () => {
296
+ for (const unregister of unregisterCallbacks) {
297
+ unregister();
298
+ }
299
+ }
284
300
  };
285
301
  }
286
302
  export {
287
303
  EnokiConnectWallet,
288
- registerEnokiConnectWallet
304
+ registerEnokiConnectWallets
289
305
  };
290
306
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/wallet/index.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase64, toBase64 } from '@mysten/sui/utils';\nimport type {\n\tIdentifierString,\n\tStandardConnectFeature,\n\tStandardConnectMethod,\n\tStandardDisconnectFeature,\n\tStandardDisconnectMethod,\n\tStandardEventsFeature,\n\tStandardEventsListeners,\n\tStandardEventsOnMethod,\n\tSuiSignAndExecuteTransactionFeature,\n\tSuiSignAndExecuteTransactionMethod,\n\tSuiSignPersonalMessageFeature,\n\tSuiSignPersonalMessageMethod,\n\tSuiSignTransactionBlockFeature,\n\tSuiSignTransactionBlockMethod,\n\tSuiSignTransactionFeature,\n\tSuiSignTransactionMethod,\n\tWallet,\n\tWalletIcon,\n} from '@mysten/wallet-standard';\nimport {\n\tgetWallets,\n\tReadonlyWalletAccount,\n\tSUI_MAINNET_CHAIN,\n\tSUI_TESTNET_CHAIN,\n} from '@mysten/wallet-standard';\nimport type { Emitter } from 'mitt';\nimport mitt from 'mitt';\nimport { DappPostMessageChannel, decodeJwtSession } from '@mysten/window-wallet-core';\n\nexport type SupportedNetwork = 'mainnet' | 'testnet';\n\ntype WalletEventsMap = {\n\t[E in keyof StandardEventsListeners]: Parameters<StandardEventsListeners[E]>[0];\n};\n\nconst SUPPORTED_CHAINS = [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN] as const;\nconst ACCOUNT_FEATURES = [\n\t'sui:signTransaction',\n\t'sui:signAndExecuteTransaction',\n\t'sui:signPersonalMessage',\n\t'sui:signTransactionBlock',\n\t'sui:signAndExecuteTransactionBlock',\n] as const;\n\nexport class EnokiConnectWallet implements Wallet {\n\treadonly id: string;\n\t#events: Emitter<WalletEventsMap>;\n\t#accounts: ReadonlyWalletAccount[];\n\t#hostOrigin: string;\n\t#walletName: string;\n\t#dappName: string;\n\t#icon: WalletIcon;\n\t#defaultChain: IdentifierString;\n\t#publicAppSlug: string;\n\n\tget name() {\n\t\treturn this.#walletName;\n\t}\n\n\tget icon() {\n\t\treturn this.#icon;\n\t}\n\n\tget version() {\n\t\treturn '1.0.0' as const;\n\t}\n\n\tget chains() {\n\t\treturn SUPPORTED_CHAINS;\n\t}\n\n\tget accounts() {\n\t\treturn this.#accounts;\n\t}\n\n\tget features(): StandardConnectFeature &\n\t\tStandardDisconnectFeature &\n\t\tStandardEventsFeature &\n\t\tSuiSignTransactionBlockFeature &\n\t\tSuiSignTransactionFeature &\n\t\tSuiSignPersonalMessageFeature &\n\t\tSuiSignAndExecuteTransactionFeature {\n\t\treturn {\n\t\t\t'standard:connect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tconnect: this.#connect,\n\t\t\t},\n\t\t\t'standard:disconnect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tdisconnect: this.#disconnect,\n\t\t\t},\n\t\t\t'standard:events': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\ton: this.#on,\n\t\t\t},\n\t\t\t'sui:signTransactionBlock': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tsignTransactionBlock: this.#signTransactionBlock,\n\t\t\t},\n\t\t\t'sui:signTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignTransaction: this.#signTransaction,\n\t\t\t},\n\t\t\t'sui:signPersonalMessage': {\n\t\t\t\tversion: '1.1.0',\n\t\t\t\tsignPersonalMessage: this.#signPersonalMessage,\n\t\t\t},\n\t\t\t'sui:signAndExecuteTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignAndExecuteTransaction: this.#signAndExecuteTransaction,\n\t\t\t},\n\t\t};\n\t}\n\n\tconstructor({\n\t\tpublicAppSlug,\n\t\twalletName,\n\t\tdappName,\n\t\thostOrigin,\n\t\ticon,\n\t\tnetwork,\n\t}: {\n\t\tpublicAppSlug: string;\n\t\twalletName: string;\n\t\tdappName: string;\n\t\tnetwork: SupportedNetwork;\n\t\thostOrigin: string;\n\t\ticon: WalletIcon;\n\t}) {\n\t\tthis.#accounts = [];\n\t\tthis.#events = mitt();\n\t\tthis.#hostOrigin = hostOrigin;\n\t\tthis.#walletName = walletName;\n\t\tthis.#dappName = dappName;\n\t\tthis.#icon = icon;\n\t\tthis.#defaultChain = `sui:${network}`;\n\t\tthis.#publicAppSlug = publicAppSlug;\n\t\tthis.id = `enoki-connect-${publicAppSlug}`;\n\t}\n\n\t#signTransactionBlock: SuiSignTransactionBlockMethod = async ({\n\t\ttransactionBlock,\n\t\taccount,\n\t\tchain,\n\t}) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\tchain,\n\t\t\ttransaction: await transactionBlock.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\ttransactionBlockBytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#signTransaction: SuiSignTransactionMethod = async ({ transaction, account, chain }) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\tchain,\n\t\t\ttransaction: await transaction.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#signAndExecuteTransaction: SuiSignAndExecuteTransactionMethod = async ({\n\t\ttransaction,\n\t\taccount,\n\t\tchain,\n\t}) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-and-execute-transaction',\n\t\t\ttransaction: await transaction.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tchain,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t\tdigest: response.digest,\n\t\t\teffects: response.effects,\n\t\t};\n\t};\n\n\t#signPersonalMessage: SuiSignPersonalMessageMethod = async ({ message, account, chain }) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-personal-message',\n\t\t\tchain: chain ?? this.#defaultChain,\n\t\t\tmessage: toBase64(message),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#on: StandardEventsOnMethod = (event, listener) => {\n\t\tthis.#events.on(event, listener);\n\n\t\treturn () => this.#events.off(event, listener);\n\t};\n\n\t#setAccounts(session?: string) {\n\t\tif (session) {\n\t\t\tthis.#accounts = this.#getAccountsFromSession(session);\n\t\t\tlocalStorage.setItem(this.#getSessionKey(), session);\n\t\t} else {\n\t\t\tthis.#accounts = [];\n\t\t}\n\n\t\tthis.#events.emit('change', { accounts: this.accounts });\n\t}\n\n\t#connect: StandardConnectMethod = async (input) => {\n\t\tif (input?.silent) {\n\t\t\ttry {\n\t\t\t\tconst session = this.#getStoredSession();\n\n\t\t\t\tif (session) {\n\t\t\t\t\tthis.#setAccounts(session);\n\t\t\t\t}\n\t\t\t} catch (_e) {\n\t\t\t\t// ignore\n\t\t\t}\n\n\t\t\treturn { accounts: this.accounts };\n\t\t}\n\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'connect',\n\t\t});\n\n\t\tthis.#setAccounts(response.session);\n\n\t\treturn { accounts: this.accounts };\n\t};\n\n\t#disconnect: StandardDisconnectMethod = async () => {\n\t\tlocalStorage.removeItem(this.#getSessionKey());\n\t\tthis.#setAccounts();\n\t};\n\n\t#getSessionKey() {\n\t\treturn `enoki-connect-${this.#publicAppSlug}:session`;\n\t}\n\n\t#getStoredSession() {\n\t\tconst session = localStorage.getItem(this.#getSessionKey());\n\n\t\tif (!session) {\n\t\t\tthrow new Error('No session found');\n\t\t}\n\n\t\treturn session;\n\t}\n\n\t#getNewPopupChannel() {\n\t\treturn new DappPostMessageChannel({\n\t\t\tappName: this.#dappName,\n\t\t\thostOrigin: this.#hostOrigin,\n\t\t\textraRequestOptions: {\n\t\t\t\tpublicAppSlug: this.#publicAppSlug,\n\t\t\t},\n\t\t});\n\t}\n\n\t#getAccountsFromSession(session: string) {\n\t\ttry {\n\t\t\tconst {\n\t\t\t\tpayload: { accounts },\n\t\t\t} = decodeJwtSession(session);\n\n\t\t\treturn accounts.map(\n\t\t\t\t(anAccount) =>\n\t\t\t\t\tnew ReadonlyWalletAccount({\n\t\t\t\t\t\taddress: anAccount.address,\n\t\t\t\t\t\tchains: SUPPORTED_CHAINS,\n\t\t\t\t\t\tfeatures: ACCOUNT_FEATURES,\n\t\t\t\t\t\tpublicKey: fromBase64(anAccount.publicKey),\n\t\t\t\t\t}),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treturn [];\n\t\t}\n\t}\n}\n\ntype EnokiConnectMetadata = {\n\tname: string;\n\tlogoUrl: WalletIcon;\n\tappUrl: string;\n};\n\nasync function getEnokiConnectMetadata(publicAppSlug: string, enokiApiUrl: string) {\n\tconst res = await fetch(new URL(`/connect/metadata/${publicAppSlug}`, enokiApiUrl));\n\n\tif (!res.ok) {\n\t\tthrow new Error('Failed to fetch enoki connect metadata');\n\t}\n\n\tconst { data } = await res.json();\n\n\treturn data as EnokiConnectMetadata;\n}\n\nexport async function registerEnokiConnectWallet({\n\tpublicAppSlug,\n\tdappName,\n\tnetwork = 'mainnet',\n\tenokiApiUrl = 'https://api.enoki.mystenlabs.com',\n}: {\n\tpublicAppSlug: string;\n\tdappName: string;\n\tnetwork?: SupportedNetwork;\n\tenokiApiUrl?: string;\n}) {\n\tconst data = await getEnokiConnectMetadata(publicAppSlug, enokiApiUrl);\n\tconst wallets = getWallets();\n\tconst wallet = new EnokiConnectWallet({\n\t\twalletName: data.name,\n\t\tdappName,\n\t\thostOrigin: data.appUrl,\n\t\ticon: data.logoUrl,\n\t\tnetwork,\n\t\tpublicAppSlug,\n\t});\n\tconst unregister = wallets.register(wallet);\n\n\treturn {\n\t\twallet,\n\t\tunregister,\n\t};\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase64, toBase64 } from '@mysten/sui/utils';\nimport type {\n\tIdentifierString,\n\tStandardConnectFeature,\n\tStandardConnectMethod,\n\tStandardDisconnectFeature,\n\tStandardDisconnectMethod,\n\tStandardEventsFeature,\n\tStandardEventsListeners,\n\tStandardEventsOnMethod,\n\tSuiSignAndExecuteTransactionFeature,\n\tSuiSignAndExecuteTransactionMethod,\n\tSuiSignPersonalMessageFeature,\n\tSuiSignPersonalMessageMethod,\n\tSuiSignTransactionBlockFeature,\n\tSuiSignTransactionBlockMethod,\n\tSuiSignTransactionFeature,\n\tSuiSignTransactionMethod,\n\tWallet,\n\tWalletIcon,\n} from '@mysten/wallet-standard';\nimport {\n\tgetWallets,\n\tReadonlyWalletAccount,\n\tSUI_MAINNET_CHAIN,\n\tSUI_TESTNET_CHAIN,\n} from '@mysten/wallet-standard';\nimport type { Emitter } from 'mitt';\nimport mitt from 'mitt';\nimport { DappPostMessageChannel, decodeJwtSession } from '@mysten/window-wallet-core';\n\nexport type SupportedNetwork = 'mainnet' | 'testnet';\n\ntype WalletEventsMap = {\n\t[E in keyof StandardEventsListeners]: Parameters<StandardEventsListeners[E]>[0];\n};\n\nconst SUPPORTED_CHAINS = [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN] as const;\nconst ACCOUNT_FEATURES = [\n\t'sui:signTransaction',\n\t'sui:signAndExecuteTransaction',\n\t'sui:signPersonalMessage',\n\t'sui:signTransactionBlock',\n\t'sui:signAndExecuteTransactionBlock',\n] as const;\n\nexport class EnokiConnectWallet implements Wallet {\n\treadonly id: string;\n\t#events: Emitter<WalletEventsMap>;\n\t#accounts: ReadonlyWalletAccount[];\n\t#hostOrigin: string;\n\t#walletName: string;\n\t#dappName: string;\n\t#icon: WalletIcon;\n\t#defaultChain: IdentifierString;\n\t#publicAppSlug: string;\n\n\tget name() {\n\t\treturn this.#walletName;\n\t}\n\n\tget icon() {\n\t\treturn this.#icon;\n\t}\n\n\tget version() {\n\t\treturn '1.0.0' as const;\n\t}\n\n\tget chains() {\n\t\treturn SUPPORTED_CHAINS;\n\t}\n\n\tget accounts() {\n\t\treturn this.#accounts;\n\t}\n\n\tget features(): StandardConnectFeature &\n\t\tStandardDisconnectFeature &\n\t\tStandardEventsFeature &\n\t\tSuiSignTransactionBlockFeature &\n\t\tSuiSignTransactionFeature &\n\t\tSuiSignPersonalMessageFeature &\n\t\tSuiSignAndExecuteTransactionFeature {\n\t\treturn {\n\t\t\t'standard:connect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tconnect: this.#connect,\n\t\t\t},\n\t\t\t'standard:disconnect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tdisconnect: this.#disconnect,\n\t\t\t},\n\t\t\t'standard:events': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\ton: this.#on,\n\t\t\t},\n\t\t\t'sui:signTransactionBlock': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tsignTransactionBlock: this.#signTransactionBlock,\n\t\t\t},\n\t\t\t'sui:signTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignTransaction: this.#signTransaction,\n\t\t\t},\n\t\t\t'sui:signPersonalMessage': {\n\t\t\t\tversion: '1.1.0',\n\t\t\t\tsignPersonalMessage: this.#signPersonalMessage,\n\t\t\t},\n\t\t\t'sui:signAndExecuteTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignAndExecuteTransaction: this.#signAndExecuteTransaction,\n\t\t\t},\n\t\t};\n\t}\n\n\tconstructor({\n\t\tpublicAppSlug,\n\t\twalletName,\n\t\tdappName,\n\t\thostOrigin,\n\t\ticon,\n\t\tnetwork,\n\t}: {\n\t\tpublicAppSlug: string;\n\t\twalletName: string;\n\t\tdappName: string;\n\t\tnetwork: SupportedNetwork;\n\t\thostOrigin: string;\n\t\ticon: WalletIcon;\n\t}) {\n\t\tthis.#accounts = [];\n\t\tthis.#events = mitt();\n\t\tthis.#hostOrigin = hostOrigin;\n\t\tthis.#walletName = walletName;\n\t\tthis.#dappName = dappName;\n\t\tthis.#icon = icon;\n\t\tthis.#defaultChain = `sui:${network}`;\n\t\tthis.#publicAppSlug = publicAppSlug;\n\t\tthis.id = `enoki-connect-${publicAppSlug}`;\n\t}\n\n\t#signTransactionBlock: SuiSignTransactionBlockMethod = async ({\n\t\ttransactionBlock,\n\t\taccount,\n\t\tchain,\n\t}) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\tchain,\n\t\t\ttransaction: await transactionBlock.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\ttransactionBlockBytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#signTransaction: SuiSignTransactionMethod = async ({ transaction, account, chain }) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\tchain,\n\t\t\ttransaction: await transaction.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#signAndExecuteTransaction: SuiSignAndExecuteTransactionMethod = async ({\n\t\ttransaction,\n\t\taccount,\n\t\tchain,\n\t}) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-and-execute-transaction',\n\t\t\ttransaction: await transaction.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tchain,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t\tdigest: response.digest,\n\t\t\teffects: response.effects,\n\t\t};\n\t};\n\n\t#signPersonalMessage: SuiSignPersonalMessageMethod = async ({ message, account, chain }) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-personal-message',\n\t\t\tchain: chain ?? this.#defaultChain,\n\t\t\tmessage: toBase64(message),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#on: StandardEventsOnMethod = (event, listener) => {\n\t\tthis.#events.on(event, listener);\n\n\t\treturn () => this.#events.off(event, listener);\n\t};\n\n\t#setAccounts(session?: string) {\n\t\tif (session) {\n\t\t\tthis.#accounts = this.#getAccountsFromSession(session);\n\t\t\tlocalStorage.setItem(this.#getSessionKey(), session);\n\t\t} else {\n\t\t\tthis.#accounts = [];\n\t\t}\n\n\t\tthis.#events.emit('change', { accounts: this.accounts });\n\t}\n\n\t#connect: StandardConnectMethod = async (input) => {\n\t\tif (input?.silent) {\n\t\t\ttry {\n\t\t\t\tconst session = this.#getStoredSession();\n\n\t\t\t\tif (session) {\n\t\t\t\t\tthis.#setAccounts(session);\n\t\t\t\t}\n\t\t\t} catch (_e) {\n\t\t\t\t// ignore\n\t\t\t}\n\n\t\t\treturn { accounts: this.accounts };\n\t\t}\n\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'connect',\n\t\t});\n\n\t\tthis.#setAccounts(response.session);\n\n\t\treturn { accounts: this.accounts };\n\t};\n\n\t#disconnect: StandardDisconnectMethod = async () => {\n\t\tlocalStorage.removeItem(this.#getSessionKey());\n\t\tthis.#setAccounts();\n\t};\n\n\t#getSessionKey() {\n\t\treturn `enoki-connect-${this.#publicAppSlug}:session`;\n\t}\n\n\t#getStoredSession() {\n\t\tconst session = localStorage.getItem(this.#getSessionKey());\n\n\t\tif (!session) {\n\t\t\tthrow new Error('No session found');\n\t\t}\n\n\t\treturn session;\n\t}\n\n\t#getNewPopupChannel() {\n\t\treturn new DappPostMessageChannel({\n\t\t\tappName: this.#dappName,\n\t\t\thostOrigin: this.#hostOrigin,\n\t\t\textraRequestOptions: {\n\t\t\t\tpublicAppSlug: this.#publicAppSlug,\n\t\t\t},\n\t\t});\n\t}\n\n\t#getAccountsFromSession(session: string) {\n\t\ttry {\n\t\t\tconst {\n\t\t\t\tpayload: { accounts },\n\t\t\t} = decodeJwtSession(session);\n\n\t\t\treturn accounts.map(\n\t\t\t\t(anAccount) =>\n\t\t\t\t\tnew ReadonlyWalletAccount({\n\t\t\t\t\t\taddress: anAccount.address,\n\t\t\t\t\t\tchains: SUPPORTED_CHAINS,\n\t\t\t\t\t\tfeatures: ACCOUNT_FEATURES,\n\t\t\t\t\t\tpublicKey: fromBase64(anAccount.publicKey),\n\t\t\t\t\t}),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treturn [];\n\t\t}\n\t}\n}\n\ntype EnokiConnectMetadata = {\n\tpublicAppSlug: string;\n\tname: string;\n\tlogoUrl: WalletIcon;\n\tappUrl: string;\n};\n\nasync function getEnokiConnectMetadata(publicAppSlugs: string[], enokiApiUrl: string) {\n\tconst sortedPublicAppSlugs = [...publicAppSlugs].sort();\n\tconst queryParams = new URLSearchParams();\n\n\tfor (const publicAppSlug of sortedPublicAppSlugs) {\n\t\tqueryParams.append('s', publicAppSlug);\n\t}\n\n\tqueryParams.sort();\n\n\tconst res = await fetch(new URL(`/connect/metadata?${queryParams.toString()}`, enokiApiUrl));\n\n\tif (!res.ok) {\n\t\tthrow new Error('Failed to fetch enoki connect metadata');\n\t}\n\n\tconst { data } = await res.json();\n\n\treturn data as EnokiConnectMetadata[];\n}\n\nexport async function registerEnokiConnectWallets({\n\tpublicAppSlugs,\n\tdappName,\n\tnetwork = 'mainnet',\n\tenokiApiUrl = 'https://api.enoki.mystenlabs.com',\n}: {\n\tpublicAppSlugs: string[];\n\tdappName: string;\n\tnetwork?: SupportedNetwork;\n\tenokiApiUrl?: string;\n}) {\n\tconst wallets = getWallets();\n\tconst data = await getEnokiConnectMetadata(publicAppSlugs, enokiApiUrl);\n\tconst unregisterCallbacks: (() => void)[] = [];\n\tconst registeredWallets: EnokiConnectWallet[] = [];\n\n\tfor (const aWalletMetadata of data) {\n\t\tconst wallet = new EnokiConnectWallet({\n\t\t\twalletName: aWalletMetadata.name,\n\t\t\tdappName,\n\t\t\thostOrigin: aWalletMetadata.appUrl,\n\t\t\ticon: aWalletMetadata.logoUrl,\n\t\t\tnetwork,\n\t\t\tpublicAppSlug: aWalletMetadata.publicAppSlug,\n\t\t});\n\t\tconst unregister = wallets.register(wallet);\n\n\t\tunregisterCallbacks.push(unregister);\n\t\tregisteredWallets.push(wallet);\n\t}\n\n\treturn {\n\t\twallets: registeredWallets,\n\t\tunregister: () => {\n\t\t\tfor (const unregister of unregisterCallbacks) {\n\t\t\t\tunregister();\n\t\t\t}\n\t\t},\n\t};\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }