{"version":3,"file":"index.mjs","names":["#walletName","#id","#icon","#accounts","#connect","#disconnect","#on","#signTransactionBlock","#signTransaction","#signPersonalMessage","#signAndExecuteTransaction","#getPreviouslyAuthorizedAccounts","#events","#origin","#name","#getNewPopupChannel","#setAccounts"],"sources":["../../src/wallet/index.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase64, toBase64 } from '@mysten/sui/utils';\nimport type {\n\tStandardConnectFeature,\n\tStandardConnectMethod,\n\tStandardDisconnectFeature,\n\tStandardDisconnectMethod,\n\tStandardEventsFeature,\n\tStandardEventsListeners,\n\tStandardEventsOnMethod,\n\tSuiChain,\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 { getWallets, ReadonlyWalletAccount, SUI_CHAINS } from '@mysten/wallet-standard';\nimport { mitt, type Emitter } from '@mysten/utils';\nimport type { InferOutput } from 'valibot';\nimport { boolean, object, parse, string } from 'valibot';\nimport { DappPostMessageChannel, decodeJwtSession } from '@mysten/window-wallet-core';\n\nconst DEFAULT_SLUSH_ORIGIN = 'https://my.slush.app';\n\ntype WalletEventsMap = {\n\t[E in keyof StandardEventsListeners]: Parameters<StandardEventsListeners[E]>[0];\n};\n\nconst SLUSH_SESSION_KEY = 'slush:session';\n\nexport const SLUSH_WALLET_NAME = 'Slush' as const;\n\nexport const SLUSH_WALLET_ICON =\n\t'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTAgMjRDMCAxMC43NDUyIDEwLjc0NTIgMCAyNCAwQzM3LjI1NDggMCA0OCAxMC43NDUyIDQ4IDI0QzQ4IDM3LjI1NDggMzcuMjU0OCA0OCAyNCA0OEMxMC43NDUyIDQ4IDAgMzcuMjU0OCAwIDI0WiIgZmlsbD0iIzBDMEExRiIvPgo8cGF0aCBkPSJNMTMuMTM1OCAzMi4xMDg1QzE0LjE3MDEgMzUuOTY4MyAxOC4wMzMxIDM5LjQ2MjQgMjYuMDI1NSAzNy4zMjA4QzMzLjY1MTUgMzUuMjc3NCAzOC40MzA5IDI5LjAwNCAzNy4xOTE2IDI0LjM3ODlDMzYuNzYzNiAyMi43ODE3IDM1LjQ3NDYgMjEuNzAwNiAzMy40ODcyIDIxLjg3NjVMMTUuNzE2NSAyMy4zNTcyQzE0LjU5NzMgMjMuNDQzIDE0LjA4NDIgMjMuMjU5NiAxMy43ODgxIDIyLjU1NDNDMTMuNTAxIDIxLjg4MjMgMTMuNjY0NiAyMS4xNjA5IDE1LjAxNjMgMjAuNDc3N0wyOC41NDAxIDEzLjUzNzRDMjkuNTc2NyAxMy4wMSAzMC4yNjcxIDEyLjc4OTMgMzAuODk4IDEzLjAxMjZDMzEuMjkzNCAxMy4xNTYzIDMxLjU1MzggMTMuNzI4NCAzMS4zMTQ3IDE0LjQzNDRMMzAuNDM3OCAxNy4wMjMyQzI5LjM2MTcgMjAuMjAwMiAzMS42NjUzIDIwLjkzODIgMzIuOTY0MSAyMC41OTAyQzM0LjkyODkgMjAuMDYzNyAzNS4zOTExIDE4LjE5MjMgMzQuNzU4MSAxNS44Mjk5QzMzLjE1MzMgOS44NDA1NCAyNi43OTkgOC45MDQxMSAyMS4wMzc4IDEwLjQ0NzhDMTUuMTc2NyAxMi4wMTgzIDEwLjA5NiAxNi43Njc2IDExLjY0NzQgMjIuNTU3M0MxMi4wMTI5IDIzLjkyMTYgMTMuMjY4NyAyNS4wMTE2IDE0LjcyMzIgMjQuOTc4NUwxNi45NDM4IDI0Ljk3MzFDMTcuNDAwNCAyNC45NjI1IDE3LjIzNiAyNSAxOC4xMTcgMjQuOTI3MUMxOC45OTggMjQuODU0MSAyMS4zNTA5IDI0LjU2NDYgMjEuMzUwOSAyNC41NjQ2TDMyLjg5NjIgMjMuMjU4TDMzLjE5MzcgMjMuMjE0OEMzMy44Njg5IDIzLjA5OTcgMzQuMzc5MiAyMy4yNzUgMzQuODEwNiAyNC4wMTgzQzM1LjQ1NjMgMjUuMTMwNCAzNC40NzEyIDI1Ljk2OTEgMzMuMjkyIDI2Ljk3MzFDMzMuMjYwNSAyNyAzMy4yMjg4IDI3LjAyNyAzMy4xOTcgMjcuMDU0MUwyMy4wNDgyIDM1LjgwMDVDMjEuMzA4NyAzNy4zMDA4IDIwLjA4NjcgMzYuNzM2NyAxOS42NTg4IDM1LjEzOTVMMTguMTQzMSAyOS40ODI5QzE3Ljc2ODcgMjguMDg1NCAxNi40MDQxIDI2Ljk4ODkgMTQuODA1NiAyNy40MTcyQzEyLjgwNzUgMjcuOTUyNiAxMi42NDU1IDMwLjI3ODQgMTMuMTM1OCAzMi4xMDg1WiIgZmlsbD0iI0ZCRkFGRiIvPgo8L3N2Zz4K' as const;\n\nconst SUI_WALLET_EXTENSION_ID = 'com.mystenlabs.suiwallet' as const;\nconst METADATA_API_URL = 'https://api.slush.app/api/wallet/metadata';\n\nconst FALLBACK_METADATA = {\n\tid: 'com.mystenlabs.suiwallet.web',\n\twalletName: 'Slush',\n\tdescription: 'Trade and earn on Sui.',\n\ticon: SLUSH_WALLET_ICON,\n\tenabled: true,\n};\n\nconst WalletMetadataSchema = object({\n\tid: string('Wallet ID is required'),\n\twalletName: string('Wallet name is required'),\n\ticon: string('Icon must be a valid wallet icon format'),\n\tenabled: boolean('Enabled is required'),\n});\n\nfunction setSessionToStorage(session: string) {\n\tlocalStorage.setItem(SLUSH_SESSION_KEY, session);\n}\n\nfunction getSessionFromStorage() {\n\tconst session = localStorage.getItem(SLUSH_SESSION_KEY);\n\n\tif (!session) {\n\t\tthrow new Error('No session found');\n\t}\n\n\treturn session;\n}\n\nconst walletAccountFeatures = [\n\t'sui:signTransaction',\n\t'sui:signAndExecuteTransaction',\n\t'sui:signPersonalMessage',\n\t'sui:signTransactionBlock',\n\t'sui:signAndExecuteTransactionBlock',\n] as const;\n\nfunction getAccountsFromSession(session: string) {\n\tconst { payload } = decodeJwtSession(session);\n\treturn payload.accounts.map((account) => {\n\t\treturn new ReadonlyWalletAccount({\n\t\t\taddress: account.address,\n\t\t\tchains: SUI_CHAINS,\n\t\t\tfeatures: walletAccountFeatures,\n\t\t\tpublicKey: fromBase64(account.publicKey),\n\t\t});\n\t});\n}\n\ntype WalletMetadata = InferOutput<typeof WalletMetadataSchema>;\nexport class SlushWallet implements Wallet {\n\t#id: string;\n\t#events: Emitter<WalletEventsMap>;\n\t#accounts: ReadonlyWalletAccount[];\n\t#origin: string;\n\t#walletName: string;\n\t#icon: WalletIcon;\n\t#name: string;\n\n\tget name() {\n\t\treturn this.#walletName;\n\t}\n\n\tget id() {\n\t\treturn this.#id;\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 SUI_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\tname,\n\t\torigin,\n\t\tmetadata,\n\t}: {\n\t\tname: string;\n\t\torigin?: string;\n\t\tchain?: SuiChain;\n\t\tmetadata: WalletMetadata;\n\t}) {\n\t\tthis.#id = metadata.id;\n\t\tthis.#accounts = this.#getPreviouslyAuthorizedAccounts();\n\t\tthis.#events = mitt();\n\t\tthis.#origin = origin || DEFAULT_SLUSH_ORIGIN;\n\t\tthis.#name = name;\n\t\tthis.#walletName = metadata.walletName;\n\t\tthis.#icon = metadata.icon as WalletIcon;\n\t}\n\n\t#signTransactionBlock: SuiSignTransactionBlockMethod = async ({\n\t\ttransactionBlock,\n\t\taccount,\n\t\tchain,\n\t}) => {\n\t\tconst data = await transactionBlock.toJSON();\n\n\t\tconst popup = this.#getNewPopupChannel();\n\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\ttransaction: data,\n\t\t\taddress: account.address,\n\t\t\tchain,\n\t\t\tsession: getSessionFromStorage(),\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\n\t\tconst tx = await transaction.toJSON();\n\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\ttransaction: tx,\n\t\t\taddress: account.address,\n\t\t\tchain,\n\t\t\tsession: getSessionFromStorage(),\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\n\t\tconst data = await transaction.toJSON();\n\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-and-execute-transaction',\n\t\t\ttransaction: data,\n\t\t\taddress: account.address,\n\t\t\tchain,\n\t\t\tsession: getSessionFromStorage(),\n\t\t});\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\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-personal-message',\n\t\t\tmessage: toBase64(message),\n\t\t\taddress: account.address,\n\t\t\tchain: chain ?? account.chains[0],\n\t\t\tsession: getSessionFromStorage(),\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\t\treturn () => this.#events.off(event, listener);\n\t};\n\n\t#setAccounts(accounts: ReadonlyWalletAccount[]) {\n\t\tthis.#accounts = accounts;\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\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\tsetSessionToStorage(response.session);\n\t\tthis.#setAccounts(getAccountsFromSession(response.session));\n\n\t\treturn { accounts: this.accounts };\n\t};\n\n\t#getPreviouslyAuthorizedAccounts() {\n\t\ttry {\n\t\t\treturn getAccountsFromSession(getSessionFromStorage());\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t#disconnect: StandardDisconnectMethod = async () => {\n\t\tlocalStorage.removeItem(SLUSH_SESSION_KEY);\n\t\tthis.#setAccounts([]);\n\t};\n\n\t#getNewPopupChannel() {\n\t\treturn new DappPostMessageChannel({\n\t\t\tappName: this.#name,\n\t\t\thostOrigin: this.#origin,\n\t\t});\n\t}\n\n\tupdateMetadata(metadata: WalletMetadata) {\n\t\tthis.#id = metadata.id;\n\t\tthis.#walletName = metadata.walletName;\n\t\tthis.#icon = metadata.icon as WalletIcon;\n\t}\n}\n\nasync function fetchMetadata(metadataApiUrl: string): Promise<WalletMetadata> {\n\tconst response = await fetch(metadataApiUrl);\n\tif (!response.ok) {\n\t\tthrow new Error('Failed to fetch wallet metadata');\n\t}\n\tconst data = await response.json();\n\treturn parse(WalletMetadataSchema, data);\n}\n\nexport function registerSlushWallet(\n\tname: string,\n\t{\n\t\torigin,\n\t\tmetadataApiUrl = METADATA_API_URL,\n\t}: {\n\t\torigin?: string;\n\t\tmetadataApiUrl?: string;\n\t} = {},\n) {\n\tconst wallets = getWallets();\n\n\tlet unregister: (() => void) | null = null;\n\n\t// listen for wallet registration\n\twallets.on('register', (wallet) => {\n\t\tif (wallet.id === SUI_WALLET_EXTENSION_ID) {\n\t\t\tunregister?.();\n\t\t}\n\t});\n\n\tconst extension = wallets.get().find((wallet) => wallet.id === SUI_WALLET_EXTENSION_ID);\n\tif (extension) {\n\t\treturn;\n\t}\n\n\tconst slushWalletInstance = new SlushWallet({\n\t\tname,\n\t\torigin,\n\t\tmetadata: FALLBACK_METADATA,\n\t});\n\tunregister = wallets.register(slushWalletInstance);\n\n\tfetchMetadata(metadataApiUrl)\n\t\t.then((metadata) => {\n\t\t\tif (!metadata.enabled) {\n\t\t\t\tconsole.log('Slush wallet is not currently enabled.');\n\t\t\t\tunregister?.();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tslushWalletInstance.updateMetadata(metadata);\n\t\t})\n\t\t.catch((error) => {\n\t\t\tconsole.error('Error fetching metadata', error);\n\t\t});\n\n\treturn {\n\t\twallet: slushWalletInstance,\n\t\tunregister,\n\t};\n}\n"],"mappings":"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"}