@kheopskit/core 6.0.0-rc.1 → 6.0.0-rc.2
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 +12 -0
- package/MIGRATING_TO_V6.md +49 -35
- package/README.md +46 -34
- package/dist/ethereum.d.mts +2 -1
- package/dist/ethereum.d.ts +2 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +21 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +22 -17
- package/dist/index.mjs.map +1 -1
- package/dist/internal.d.mts +1 -1
- package/dist/internal.d.ts +1 -1
- package/dist/polkadot.d.mts +1 -1
- package/dist/polkadot.d.ts +1 -1
- package/dist/polkadot.js +4 -38
- package/dist/polkadot.js.map +1 -1
- package/dist/polkadot.mjs +5 -39
- package/dist/polkadot.mjs.map +1 -1
- package/dist/registryReads-BpHsWLd7.js +38 -0
- package/dist/registryReads-BpHsWLd7.js.map +1 -0
- package/dist/{pageLoad-BZ7o8p5R.mjs → registryReads-BvtznSo3.mjs} +12 -3
- package/dist/registryReads-BvtznSo3.mjs.map +1 -0
- package/dist/solana.d.mts +2 -1
- package/dist/solana.d.ts +2 -1
- package/dist/solana.js +1 -0
- package/dist/solana.js.map +1 -1
- package/dist/solana.mjs +1 -0
- package/dist/solana.mjs.map +1 -1
- package/dist/testing.d.mts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/types-BWHvNFlN.js.map +1 -1
- package/dist/{types-lkMXVJNG.d.ts → types-DCaL9bIc.d.mts} +37 -23
- package/dist/{types-lkMXVJNG.d.mts → types-DCaL9bIc.d.ts} +37 -23
- package/dist/types-Yor672md.mjs.map +1 -1
- package/dist/walletconnect.d.mts +1 -1
- package/dist/walletconnect.d.ts +1 -1
- package/package.json +1 -1
- package/dist/pageLoad-BZ7o8p5R.mjs.map +0 -1
- package/dist/pageLoad-D1wLeuFG.js +0 -28
- package/dist/pageLoad-D1wLeuFG.js.map +0 -1
package/dist/polkadot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polkadot.js","names":["getInjectedExtensions","getWalletId","Observable","pageLoaded$","skip","distinctUntilChanged","isEqual","shareReplay","createInjectedWallets$","parseWalletId","isRefusalMessage","POLKADOT_EXTENSIONS","hex","of","Observable","getWalletAccountId","pjs","KheopskitError","getWalletConnectSessionAccounts$","getCaip10Addresses","getSessionCaip10s","createPlatformAccounts$"],"sources":["../src/api/polkadot/wallets.ts","../src/api/polkadot/accounts.ts","../src/api/polkadot/plugin.ts"],"sourcesContent":["import { isEqual } from \"lodash-es\";\nimport { getInjectedExtensions } from \"polkadot-api/pjs-signer\";\nimport { distinctUntilChanged, Observable, shareReplay, skip } from \"rxjs\";\nimport { pageLoaded$ } from \"../../utils/pageLoad\";\nimport { POLKADOT_EXTENSIONS } from \"../../utils/polkadotExtensions\";\nimport {\n\tgetWalletId,\n\tparseWalletId,\n\ttype WalletId,\n} from \"../../utils/WalletId\";\nimport { isRefusalMessage } from \"../errors\";\nimport { createInjectedWallets$ } from \"../injectedWallets\";\nimport type { KheopskitStore } from \"../store\";\nimport type { KheopskitConfig } from \"../types\";\nimport type {\n\tPolkadotInjected,\n\tPolkadotInjectedAccount,\n\tPolkadotInjectedWallet,\n} from \"./types\";\n\ntype EnableResult = {\n\taccounts?: Partial<PolkadotInjected[\"accounts\"]>;\n\tsigner?: Partial<PolkadotInjected[\"signer\"]>;\n\tmetadata?: unknown;\n\tprovider?: unknown;\n};\n\ntype InjectedWeb3Window = {\n\tinjectedWeb3?: Record<\n\t\tstring,\n\t\t| { enable(appName: string): Promise<EnableResult | null | undefined> }\n\t\t| undefined\n\t>;\n};\n\nconst isPolkadotInjected = (\n\tinjected: EnableResult | null | undefined,\n): injected is PolkadotInjected =>\n\ttypeof injected?.accounts?.get === \"function\" &&\n\ttypeof injected.accounts.subscribe === \"function\" &&\n\ttypeof injected.signer?.signPayload === \"function\" &&\n\ttypeof injected.signer.signRaw === \"function\";\n\n/**\n * The list each extension last reported: read when its connect was granted,\n * so the emission that first shows the wallet connected already lists it, and\n * updated by every `subscribe` callback, so an accounts stream that restarts\n * resumes from the current list rather than the connect-time one.\n */\nexport const latestAccounts = new WeakMap<\n\tPolkadotInjected,\n\tPolkadotInjectedAccount[]\n>();\n\ntype InjectedWeb3Entry = NonNullable<\n\tNonNullable<InjectedWeb3Window[\"injectedWeb3\"]>[string]\n>;\n\n/**\n * The connect each extension is still answering. An extension keeps its\n * prompt open after kheopskit abandons the attempt, and a second `enable()`\n * meanwhile fails (polkadot-js: \"Pending authorisation request already\n * exists\") or resolves unauthorised (Talisman), so a new attempt joins this\n * one instead.\n */\nconst pendingConnects = new WeakMap<\n\tInjectedWeb3Entry,\n\tPromise<PolkadotInjected>\n>();\n\nconst enableExtension = async (\n\tidentifier: string,\n\tentry: InjectedWeb3Entry,\n\tappName: string,\n) => {\n\tconst injected = await entry.enable(appName);\n\tif (!isPolkadotInjected(injected))\n\t\tthrow new Error(`Unsupported extension: \"${identifier}\"`);\n\tlatestAccounts.set(injected, await injected.accounts.get());\n\treturn injected;\n};\n\nconst connectExtension = (\n\tidentifier: string,\n\tappName: string,\n): Promise<PolkadotInjected> => {\n\tconst entry = (globalThis as InjectedWeb3Window).injectedWeb3?.[identifier];\n\tif (!entry)\n\t\treturn Promise.reject(new Error(`Unavailable extension: \"${identifier}\"`));\n\tconst pending = pendingConnects.get(entry);\n\tif (pending) return pending;\n\tconst connecting = enableExtension(identifier, entry, appName);\n\tpendingConnects.set(entry, connecting);\n\tconst settle = () => pendingConnects.delete(entry);\n\tconnecting.then(settle, settle);\n\treturn connecting;\n};\n\nconst getInjectedWalletsIds = () =>\n\ttypeof window === \"undefined\"\n\t\t? []\n\t\t: getInjectedExtensions().map((name) => getWalletId(\"polkadot\", name));\n\n// Create a polling observable that starts immediately and polls at intervals\nconst createWalletIdsPoller$ = () => {\n\treturn new Observable<WalletId[]>((subscriber) => {\n\t\t// Emit immediately on subscribe\n\t\tsubscriber.next(getInjectedWalletsIds());\n\n\t\t// Poll at shorter intervals initially, then slow down\n\t\tconst intervals = [100, 200, 300, 500];\n\t\tlet index = 0;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\n\t\tconst poll = () => {\n\t\t\tsubscriber.next(getInjectedWalletsIds());\n\t\t\tif (index < intervals.length) {\n\t\t\t\tconst delay = intervals[index++];\n\t\t\t\ttimer = setTimeout(poll, delay);\n\t\t\t}\n\t\t};\n\n\t\t// Start polling after first immediate emission\n\t\tif (intervals.length > 0) {\n\t\t\ttimer = setTimeout(poll, intervals[index++] ?? 100);\n\t\t}\n\n\t\tlet loadTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst loadSub = pageLoaded$.pipe(skip(1)).subscribe(() => {\n\t\t\tloadTimer = setTimeout(\n\t\t\t\t() => subscriber.next(getInjectedWalletsIds()),\n\t\t\t\t100,\n\t\t\t);\n\t\t\tsubscriber.next(getInjectedWalletsIds());\n\t\t});\n\n\t\treturn () => {\n\t\t\t// Cancel any pending poll so it can't fire after unsubscribe.\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\tclearTimeout(loadTimer);\n\t\t\tloadSub.unsubscribe();\n\t\t};\n\t}).pipe(\n\t\tdistinctUntilChanged<WalletId[]>(isEqual),\n\t\tshareReplay({ refCount: true, bufferSize: 1 }),\n\t);\n};\n\n// The shared WalletConnect connector is emitted once by core (see\n// `getWallets$`), not per platform — so this returns only injected wallets.\nexport const getPolkadotWallets$ = (\n\tstore: KheopskitStore,\n\tconfig: Pick<KheopskitConfig, \"appName\" | \"walletConnect\">,\n) =>\n\tcreateInjectedWallets$<WalletId, PolkadotInjectedWallet, PolkadotInjected>(\n\t\tstore,\n\t\t{\n\t\t\tsources$: createWalletIdsPoller$(),\n\t\t\tgetWalletId: (walletId) => walletId,\n\t\t\tconnect: (walletId) =>\n\t\t\t\tconnectExtension(\n\t\t\t\t\tparseWalletId(walletId).identifier,\n\t\t\t\t\tconfig.appName ||\n\t\t\t\t\t\tconfig.walletConnect?.metadata.name ||\n\t\t\t\t\t\twindow.location.hostname,\n\t\t\t\t),\n\t\t\tisUserRejection: isRefusalMessage,\n\t\t\tbuildWallet: ({\n\t\t\t\twalletId,\n\t\t\t\thandle,\n\t\t\t\tstatus,\n\t\t\t\terror,\n\t\t\t\tisConnected,\n\t\t\t\tconnect,\n\t\t\t\tdisconnect,\n\t\t\t}) => {\n\t\t\t\tconst { identifier } = parseWalletId(walletId);\n\t\t\t\tconst extInfo = POLKADOT_EXTENSIONS[identifier];\n\n\t\t\t\treturn {\n\t\t\t\t\tid: walletId,\n\t\t\t\t\ttype: \"injected\",\n\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\tname: extInfo?.name ?? identifier,\n\t\t\t\t\ticon: extInfo?.icon ?? \"\",\n\t\t\t\t\tsourceId: identifier,\n\t\t\t\t\textension: handle,\n\t\t\t\t\tstatus,\n\t\t\t\t\terror,\n\t\t\t\t\tisConnected,\n\t\t\t\t\tconnect,\n\t\t\t\t\tdisconnect,\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t);\n","import { hex } from \"@scure/base\";\nimport type {\n\tKeypairType,\n\tSignPayload,\n\tSignRaw,\n} from \"polkadot-api/pjs-signer\";\nimport * as pjs from \"polkadot-api/pjs-signer\";\nimport { Observable, of } from \"rxjs\";\nimport { getWalletAccountId } from \"../../utils\";\nimport { KheopskitError } from \"../errors\";\nimport {\n\tcreatePlatformAccounts$,\n\tgetCaip10Addresses,\n\tgetSessionCaip10s,\n\tgetWalletConnectSessionAccounts$,\n\ttype LiveWalletConnectWallet,\n} from \"../platformAccounts\";\nimport type {\n\tAppKitInstance,\n\tPolkadotAccountType,\n\tWalletConnectProvider,\n\tWalletConnectWallet,\n} from \"../types\";\nimport type {\n\tPolkadotAccount,\n\tPolkadotInjectedAccount,\n\tPolkadotInjectedWallet,\n\tPolkadotSignRawType,\n\tPolkadotWallet,\n} from \"./types\";\nimport { latestAccounts } from \"./wallets\";\n\ntype RawSignature = `0x${string}`;\n\nconst encodeRawData = (\n\tdata: string | Uint8Array,\n\ttype?: PolkadotSignRawType,\n): { data: string; type: PolkadotSignRawType } =>\n\ttypeof data === \"string\"\n\t\t? { data, type: type ?? \"payload\" }\n\t\t: { data: `0x${hex.encode(data)}`, type: type ?? \"bytes\" };\n\n/**\n * pjs-signer's signature-type map knows ed25519, sr25519 and ecdsa only, so an\n * `ethereum` type would get a 64-byte mock signature where ecdsa needs 65.\n */\nconst toSignerType = (type: PolkadotAccountType): KeypairType =>\n\ttype === \"ethereum\" ? \"ecdsa\" : type;\n\nconst getInjectedWalletAccounts$ = (\n\twallet: PolkadotInjectedWallet,\n): Observable<PolkadotAccount[]> => {\n\tconst injected = wallet.extension;\n\tif (!wallet.isConnected || !injected) return of([]);\n\n\treturn new Observable<PolkadotAccount[]>((subscriber) => {\n\t\tconst signPayload = injected.signer.signPayload.bind(injected.signer);\n\t\tconst signRaw = injected.signer.signRaw.bind(injected.signer);\n\t\tconst { field, factory } = getPjsSignerField();\n\n\t\tconst toAccount = (account: PolkadotInjectedAccount): PolkadotAccount => {\n\t\t\tconst { address } = account;\n\t\t\tconst type = account.type ?? \"sr25519\";\n\t\t\treturn {\n\t\t\t\t...account,\n\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\ttype,\n\t\t\t\tplatform: \"polkadot\",\n\t\t\t\twalletName: wallet.name,\n\t\t\t\twalletId: wallet.id,\n\t\t\t\t[field]: factory(address, signPayload, signRaw, toSignerType(type)),\n\t\t\t\tsignRaw: async (data, options) =>\n\t\t\t\t\t(await signRaw({ address, ...encodeRawData(data, options?.type) }))\n\t\t\t\t\t\t.signature,\n\t\t\t} as Exclude<PolkadotAccount, { isPlaceholder: true }>;\n\t\t};\n\n\t\tconst toAccounts = (accounts: PolkadotInjectedAccount[]) =>\n\t\t\taccounts.flatMap((account) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn [toAccount(account)];\n\t\t\t\t} catch {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t});\n\n\t\tconst emit = (accounts: PolkadotInjectedAccount[]) => {\n\t\t\tlatestAccounts.set(injected, accounts);\n\t\t\tsubscriber.next(toAccounts(accounts));\n\t\t};\n\n\t\temit(latestAccounts.get(injected) ?? []);\n\t\treturn injected.accounts.subscribe(emit);\n\t});\n};\n\n/**\n * polkadot-api v2's `getPolkadotSignerFromPjs` takes three parameters and\n * ignores the fourth at runtime.\n */\ntype PjsSignerFactory = (\n\taddress: string,\n\tsignPayload: SignPayload,\n\tsignRaw: SignRaw,\n\ttype?: KeypairType,\n) => unknown;\n\ntype PjsSignerModule = {\n\tgetTxCreatorFromPjs?: PjsSignerFactory;\n\tgetPolkadotSignerFromPjs?: PjsSignerFactory;\n};\n\n/**\n * polkadot-api v3 replaced `polkadotSigner` (PolkadotSigner) with `txCreator`\n * (TxCreator). Which one the app's installed version provides is detected at\n * runtime so a single @kheopskit/core release supports both.\n */\nconst getPjsSignerField = (): {\n\tfield: \"txCreator\" | \"polkadotSigner\";\n\tfactory: PjsSignerFactory;\n} => {\n\tconst module = pjs as PjsSignerModule;\n\tif (module.getTxCreatorFromPjs)\n\t\treturn { field: \"txCreator\", factory: module.getTxCreatorFromPjs };\n\tif (module.getPolkadotSignerFromPjs)\n\t\treturn {\n\t\t\tfield: \"polkadotSigner\",\n\t\t\tfactory: module.getPolkadotSignerFromPjs,\n\t\t};\n\tthrow new KheopskitError(\n\t\t\"UNSUPPORTED_VERSION\",\n\t\t\"Unsupported polkadot-api/pjs-signer version\",\n\t);\n};\n\nconst requestSignMessage = (\n\tappKit: AppKitInstance,\n\tprovider: WalletConnectProvider,\n\taddress: string,\n\tmessage: string,\n) => {\n\tif (!provider.session)\n\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\tconst chainId = appKit.getCaipNetworks(\"polkadot\")[0]?.caipNetworkId;\n\tif (!chainId)\n\t\tthrow new KheopskitError(\n\t\t\t\"NO_SESSION\",\n\t\t\t\"No CAIP network available for polkadot\",\n\t\t);\n\n\treturn provider.client.request<{ signature: RawSignature }>({\n\t\ttopic: provider.session.topic,\n\t\tchainId,\n\t\trequest: {\n\t\t\tmethod: \"polkadot_signMessage\",\n\t\t\tparams: { address, message },\n\t\t},\n\t});\n};\n\nconst getAppKitPolkadotSigning = (appKit: AppKitInstance, address: string) => {\n\tconst provider = appKit.getProvider(\"polkadot\");\n\tif (!provider) throw new KheopskitError(\"NO_PROVIDER\", \"No provider found\");\n\tif (!provider.session)\n\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\n\tconst signMessage = (message: string) =>\n\t\trequestSignMessage(appKit, provider, address, message);\n\n\tconst { field, factory } = getPjsSignerField();\n\n\tconst signer = factory(\n\t\taddress,\n\t\t(transactionPayload) => {\n\t\t\tif (!provider.session)\n\t\t\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\n\t\t\treturn provider.client.request({\n\t\t\t\ttopic: provider.session.topic,\n\t\t\t\tchainId: `polkadot:${transactionPayload.genesisHash.substring(2, 34)}`,\n\t\t\t\trequest: {\n\t\t\t\t\tmethod: \"polkadot_signTransaction\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\ttransactionPayload,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tasync ({ data }) => ({\n\t\t\tid: 0,\n\t\t\tsignature: (await signMessage(data)).signature,\n\t\t}),\n\t\t\"sr25519\",\n\t);\n\n\tconst signRaw: PolkadotAccount[\"signRaw\"] = async (data) =>\n\t\t(await signMessage(encodeRawData(data).data)).signature;\n\n\treturn { [field]: signer, signRaw };\n};\n\nconst getWalletConnectAccounts$ = (\n\twallet: LiveWalletConnectWallet,\n): Observable<PolkadotAccount[]> =>\n\tgetWalletConnectSessionAccounts$({\n\t\twallet,\n\t\tplatform: \"polkadot\",\n\t\tnamespace: \"polkadot\",\n\t\tcacheKey: `accounts:${wallet.id}:polkadot:`,\n\t\tbuildAccounts: (provider) => {\n\t\t\tconst session = provider.session;\n\t\t\tif (!session) return [];\n\n\t\t\tconst addresses = getCaip10Addresses(\n\t\t\t\tgetSessionCaip10s(session, \"polkadot\"),\n\t\t\t);\n\n\t\t\treturn addresses.map(\n\t\t\t\t(address) =>\n\t\t\t\t\t({\n\t\t\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\t...getAppKitPolkadotSigning(wallet.appKit, address),\n\t\t\t\t\t\tgenesisHash: null,\n\t\t\t\t\t\tname: `${wallet.name} Polkadot`,\n\t\t\t\t\t\t// WalletConnect (Reown AppKit) doesn't expose account key type;\n\t\t\t\t\t\t// default to sr25519, which is the most common Polkadot key type.\n\t\t\t\t\t\ttype: \"sr25519\",\n\t\t\t\t\t}) as PolkadotAccount,\n\t\t\t);\n\t\t},\n\t});\n\nexport const getPolkadotAccounts$ = (\n\tpolkadotWallets$: Observable<(PolkadotWallet | WalletConnectWallet)[]>,\n\tpolkadotAccountTypes: PolkadotAccountType[],\n) => {\n\tif (polkadotAccountTypes.length === 0) {\n\t\tconsole.warn(\n\t\t\t\"[kheopskit] polkadot({ accountTypes }) is empty; all Polkadot accounts will be filtered out.\",\n\t\t);\n\t}\n\n\treturn createPlatformAccounts$({\n\t\twallets$: polkadotWallets$,\n\t\tgetInjectedAccounts$: getInjectedWalletAccounts$,\n\t\tgetWalletConnectAccounts$,\n\t\tmapAccounts: (accounts) =>\n\t\t\taccounts.filter((account) => polkadotAccountTypes.includes(account.type)),\n\t});\n};\n","import type {\n\tKheopskitPlatform,\n\tPlatformContext,\n\tPolkadotAccountType,\n} from \"../types\";\nimport { getPolkadotAccounts$ } from \"./accounts\";\nimport type { PolkadotAccount, PolkadotWallet } from \"./types\";\nimport { getPolkadotWallets$ } from \"./wallets\";\n\nconst DEFAULT_ACCOUNT_TYPES: PolkadotAccountType[] = [\n\t\"sr25519\",\n\t\"ed25519\",\n\t\"ecdsa\",\n];\n\nconst VALID_ACCOUNT_TYPES = new Set<string>([\n\t\"sr25519\",\n\t\"ed25519\",\n\t\"ecdsa\",\n\t\"ethereum\",\n]);\n\nexport type PolkadotPluginOptions = {\n\t/**\n\t * Allowed Polkadot account key types. Accounts with other key types are\n\t * filtered out from kheopskit state.\n\t *\n\t * @default [\"sr25519\", \"ed25519\", \"ecdsa\"]\n\t */\n\taccountTypes?: PolkadotAccountType[];\n};\n\n/**\n * Polkadot platform plugin. Pass to `getKheopskit$({ platforms: [polkadot()] })`.\n *\n * @example\n * ```ts\n * import { polkadot } from \"@kheopskit/core/polkadot\";\n * polkadot({ accountTypes: [\"sr25519\", \"ed25519\", \"ecdsa\"] });\n * ```\n */\nexport const polkadot = (\n\toptions: PolkadotPluginOptions = {},\n): KheopskitPlatform<\"polkadot\", PolkadotWallet, PolkadotAccount> => {\n\tconst accountTypes = options.accountTypes ?? DEFAULT_ACCOUNT_TYPES;\n\n\tconst invalid = accountTypes.filter((t) => !VALID_ACCOUNT_TYPES.has(t));\n\tif (invalid.length > 0) {\n\t\tconsole.warn(\n\t\t\t`[kheopskit] Unknown polkadot accountTypes: ${JSON.stringify(invalid)}. Valid values: \"sr25519\", \"ed25519\", \"ecdsa\", \"ethereum\".`,\n\t\t);\n\t}\n\n\treturn {\n\t\tplatform: \"polkadot\",\n\t\tgetWallets$: (ctx: PlatformContext) =>\n\t\t\tgetPolkadotWallets$(ctx.store, ctx.config),\n\t\tgetAccounts$: (wallets$) => getPolkadotAccounts$(wallets$, accountTypes),\n\t\tacceptsCachedAccount: (cached) =>\n\t\t\taccountTypes.includes(cached.polkadotAccountType ?? \"sr25519\"),\n\t};\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"polkadot.js","names":["getInjectedExtensions","getWalletId","createRegistryReads$","createInjectedWallets$","map","distinctUntilChanged","isEqual","parseWalletId","isRefusalMessage","POLKADOT_EXTENSIONS","hex","of","Observable","getWalletAccountId","pjs","KheopskitError","getWalletConnectSessionAccounts$","getCaip10Addresses","getSessionCaip10s","createPlatformAccounts$"],"sources":["../src/api/polkadot/wallets.ts","../src/api/polkadot/accounts.ts","../src/api/polkadot/plugin.ts"],"sourcesContent":["import { isEqual } from \"lodash-es\";\nimport { getInjectedExtensions } from \"polkadot-api/pjs-signer\";\nimport { distinctUntilChanged, map, type Observable } from \"rxjs\";\nimport { POLKADOT_EXTENSIONS } from \"../../utils/polkadotExtensions\";\nimport { createRegistryReads$ } from \"../../utils/registryReads\";\nimport {\n\tgetWalletId,\n\tparseWalletId,\n\ttype WalletId,\n} from \"../../utils/WalletId\";\nimport { isRefusalMessage } from \"../errors\";\nimport { createInjectedWallets$ } from \"../injectedWallets\";\nimport type { KheopskitStore } from \"../store\";\nimport type { KheopskitConfig } from \"../types\";\nimport type {\n\tPolkadotInjected,\n\tPolkadotInjectedAccount,\n\tPolkadotInjectedWallet,\n} from \"./types\";\n\ntype EnableResult = {\n\taccounts?: Partial<PolkadotInjected[\"accounts\"]>;\n\tsigner?: Partial<PolkadotInjected[\"signer\"]>;\n\tmetadata?: unknown;\n\tprovider?: unknown;\n};\n\ntype InjectedWeb3Window = {\n\tinjectedWeb3?: Record<\n\t\tstring,\n\t\t| { enable(appName: string): Promise<EnableResult | null | undefined> }\n\t\t| undefined\n\t>;\n};\n\nconst isPolkadotInjected = (\n\tinjected: EnableResult | null | undefined,\n): injected is PolkadotInjected =>\n\ttypeof injected?.accounts?.get === \"function\" &&\n\ttypeof injected.accounts.subscribe === \"function\" &&\n\ttypeof injected.signer?.signPayload === \"function\" &&\n\ttypeof injected.signer.signRaw === \"function\";\n\n/**\n * The list each extension last reported: read when its connect was granted,\n * so the emission that first shows the wallet connected already lists it, and\n * updated by every `subscribe` callback, so an accounts stream that restarts\n * resumes from the current list rather than the connect-time one.\n */\nexport const latestAccounts = new WeakMap<\n\tPolkadotInjected,\n\tPolkadotInjectedAccount[]\n>();\n\ntype InjectedWeb3Entry = NonNullable<\n\tNonNullable<InjectedWeb3Window[\"injectedWeb3\"]>[string]\n>;\n\n/**\n * The connect each extension is still answering. An extension keeps its\n * prompt open after kheopskit abandons the attempt, and a second `enable()`\n * meanwhile fails (polkadot-js: \"Pending authorisation request already\n * exists\") or resolves unauthorised (Talisman), so a new attempt joins this\n * one instead.\n */\nconst pendingConnects = new WeakMap<\n\tInjectedWeb3Entry,\n\tPromise<PolkadotInjected>\n>();\n\nconst enableExtension = async (\n\tidentifier: string,\n\tentry: InjectedWeb3Entry,\n\tappName: string,\n) => {\n\tconst injected = await entry.enable(appName);\n\tif (!isPolkadotInjected(injected))\n\t\tthrow new Error(`Unsupported extension: \"${identifier}\"`);\n\tlatestAccounts.set(injected, await injected.accounts.get());\n\treturn injected;\n};\n\nconst connectExtension = (\n\tidentifier: string,\n\tappName: string,\n): Promise<PolkadotInjected> => {\n\tconst entry = (globalThis as InjectedWeb3Window).injectedWeb3?.[identifier];\n\tif (!entry)\n\t\treturn Promise.reject(new Error(`Unavailable extension: \"${identifier}\"`));\n\tconst pending = pendingConnects.get(entry);\n\tif (pending) return pending;\n\tconst connecting = enableExtension(identifier, entry, appName);\n\tpendingConnects.set(entry, connecting);\n\tconst settle = () => pendingConnects.delete(entry);\n\tconnecting.then(settle, settle);\n\treturn connecting;\n};\n\nconst getInjectedWalletsIds = () =>\n\ttypeof window === \"undefined\"\n\t\t? []\n\t\t: getInjectedExtensions().map((name) => getWalletId(\"polkadot\", name));\n\n// The shared WalletConnect connector is emitted once by core (see\n// `getWallets$`), not per platform — so this returns only injected wallets.\nexport const getPolkadotWallets$ = (\n\tstore: KheopskitStore,\n\tconfig: Pick<KheopskitConfig, \"appName\" | \"walletConnect\">,\n\tregistryReads$: Observable<void> = createRegistryReads$(),\n) =>\n\tcreateInjectedWallets$<WalletId, PolkadotInjectedWallet, PolkadotInjected>(\n\t\tstore,\n\t\t{\n\t\t\tsources$: registryReads$.pipe(\n\t\t\t\tmap(getInjectedWalletsIds),\n\t\t\t\tdistinctUntilChanged<WalletId[]>(isEqual),\n\t\t\t),\n\t\t\tgetWalletId: (walletId) => walletId,\n\t\t\tconnect: (walletId) =>\n\t\t\t\tconnectExtension(\n\t\t\t\t\tparseWalletId(walletId).identifier,\n\t\t\t\t\tconfig.appName ||\n\t\t\t\t\t\tconfig.walletConnect?.metadata.name ||\n\t\t\t\t\t\twindow.location.hostname,\n\t\t\t\t),\n\t\t\tisUserRejection: isRefusalMessage,\n\t\t\tbuildWallet: ({\n\t\t\t\twalletId,\n\t\t\t\thandle,\n\t\t\t\tstatus,\n\t\t\t\terror,\n\t\t\t\tisConnected,\n\t\t\t\tconnect,\n\t\t\t\tdisconnect,\n\t\t\t}) => {\n\t\t\t\tconst { identifier } = parseWalletId(walletId);\n\t\t\t\tconst extInfo = POLKADOT_EXTENSIONS[identifier];\n\n\t\t\t\treturn {\n\t\t\t\t\tid: walletId,\n\t\t\t\t\ttype: \"injected\",\n\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\tname: extInfo?.name ?? identifier,\n\t\t\t\t\ticon: extInfo?.icon ?? \"\",\n\t\t\t\t\tsourceId: identifier,\n\t\t\t\t\textension: handle,\n\t\t\t\t\tstatus,\n\t\t\t\t\terror,\n\t\t\t\t\tisConnected,\n\t\t\t\t\tconnect,\n\t\t\t\t\tdisconnect,\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t);\n","import { hex } from \"@scure/base\";\nimport type {\n\tKeypairType,\n\tSignPayload,\n\tSignRaw,\n} from \"polkadot-api/pjs-signer\";\nimport * as pjs from \"polkadot-api/pjs-signer\";\nimport { Observable, of } from \"rxjs\";\nimport { getWalletAccountId } from \"../../utils\";\nimport { KheopskitError } from \"../errors\";\nimport {\n\tcreatePlatformAccounts$,\n\tgetCaip10Addresses,\n\tgetSessionCaip10s,\n\tgetWalletConnectSessionAccounts$,\n\ttype LiveWalletConnectWallet,\n} from \"../platformAccounts\";\nimport type {\n\tAppKitInstance,\n\tPolkadotAccountType,\n\tWalletConnectProvider,\n\tWalletConnectWallet,\n} from \"../types\";\nimport type {\n\tPolkadotAccount,\n\tPolkadotInjectedAccount,\n\tPolkadotInjectedWallet,\n\tPolkadotSignRawType,\n\tPolkadotWallet,\n} from \"./types\";\nimport { latestAccounts } from \"./wallets\";\n\ntype RawSignature = `0x${string}`;\n\nconst encodeRawData = (\n\tdata: string | Uint8Array,\n\ttype?: PolkadotSignRawType,\n): { data: string; type: PolkadotSignRawType } =>\n\ttypeof data === \"string\"\n\t\t? { data, type: type ?? \"payload\" }\n\t\t: { data: `0x${hex.encode(data)}`, type: type ?? \"bytes\" };\n\n/**\n * pjs-signer's signature-type map knows ed25519, sr25519 and ecdsa only, so an\n * `ethereum` type would get a 64-byte mock signature where ecdsa needs 65.\n */\nconst toSignerType = (type: PolkadotAccountType): KeypairType =>\n\ttype === \"ethereum\" ? \"ecdsa\" : type;\n\nconst getInjectedWalletAccounts$ = (\n\twallet: PolkadotInjectedWallet,\n): Observable<PolkadotAccount[]> => {\n\tconst injected = wallet.extension;\n\tif (!wallet.isConnected || !injected) return of([]);\n\n\treturn new Observable<PolkadotAccount[]>((subscriber) => {\n\t\tconst signPayload = injected.signer.signPayload.bind(injected.signer);\n\t\tconst signRaw = injected.signer.signRaw.bind(injected.signer);\n\t\tconst { field, factory } = getPjsSignerField();\n\n\t\tconst toAccount = (account: PolkadotInjectedAccount): PolkadotAccount => {\n\t\t\tconst { address } = account;\n\t\t\tconst type = account.type ?? \"sr25519\";\n\t\t\treturn {\n\t\t\t\t...account,\n\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\ttype,\n\t\t\t\tplatform: \"polkadot\",\n\t\t\t\twalletName: wallet.name,\n\t\t\t\twalletId: wallet.id,\n\t\t\t\t[field]: factory(address, signPayload, signRaw, toSignerType(type)),\n\t\t\t\tsignRaw: async (data, options) =>\n\t\t\t\t\t(await signRaw({ address, ...encodeRawData(data, options?.type) }))\n\t\t\t\t\t\t.signature,\n\t\t\t} as Exclude<PolkadotAccount, { isPlaceholder: true }>;\n\t\t};\n\n\t\tconst toAccounts = (accounts: PolkadotInjectedAccount[]) =>\n\t\t\taccounts.flatMap((account) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn [toAccount(account)];\n\t\t\t\t} catch {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t});\n\n\t\tconst emit = (accounts: PolkadotInjectedAccount[]) => {\n\t\t\tlatestAccounts.set(injected, accounts);\n\t\t\tsubscriber.next(toAccounts(accounts));\n\t\t};\n\n\t\temit(latestAccounts.get(injected) ?? []);\n\t\treturn injected.accounts.subscribe(emit);\n\t});\n};\n\n/**\n * polkadot-api v2's `getPolkadotSignerFromPjs` takes three parameters and\n * ignores the fourth at runtime.\n */\ntype PjsSignerFactory = (\n\taddress: string,\n\tsignPayload: SignPayload,\n\tsignRaw: SignRaw,\n\ttype?: KeypairType,\n) => unknown;\n\ntype PjsSignerModule = {\n\tgetTxCreatorFromPjs?: PjsSignerFactory;\n\tgetPolkadotSignerFromPjs?: PjsSignerFactory;\n};\n\n/**\n * polkadot-api v3 replaced `polkadotSigner` (PolkadotSigner) with `txCreator`\n * (TxCreator). Which one the app's installed version provides is detected at\n * runtime so a single @kheopskit/core release supports both.\n */\nconst getPjsSignerField = (): {\n\tfield: \"txCreator\" | \"polkadotSigner\";\n\tfactory: PjsSignerFactory;\n} => {\n\tconst module = pjs as PjsSignerModule;\n\tif (module.getTxCreatorFromPjs)\n\t\treturn { field: \"txCreator\", factory: module.getTxCreatorFromPjs };\n\tif (module.getPolkadotSignerFromPjs)\n\t\treturn {\n\t\t\tfield: \"polkadotSigner\",\n\t\t\tfactory: module.getPolkadotSignerFromPjs,\n\t\t};\n\tthrow new KheopskitError(\n\t\t\"UNSUPPORTED_VERSION\",\n\t\t\"Unsupported polkadot-api/pjs-signer version\",\n\t);\n};\n\nconst requestSignMessage = (\n\tappKit: AppKitInstance,\n\tprovider: WalletConnectProvider,\n\taddress: string,\n\tmessage: string,\n) => {\n\tif (!provider.session)\n\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\tconst chainId = appKit.getCaipNetworks(\"polkadot\")[0]?.caipNetworkId;\n\tif (!chainId)\n\t\tthrow new KheopskitError(\n\t\t\t\"NO_SESSION\",\n\t\t\t\"No CAIP network available for polkadot\",\n\t\t);\n\n\treturn provider.client.request<{ signature: RawSignature }>({\n\t\ttopic: provider.session.topic,\n\t\tchainId,\n\t\trequest: {\n\t\t\tmethod: \"polkadot_signMessage\",\n\t\t\tparams: { address, message },\n\t\t},\n\t});\n};\n\nconst getAppKitPolkadotSigning = (appKit: AppKitInstance, address: string) => {\n\tconst provider = appKit.getProvider(\"polkadot\");\n\tif (!provider) throw new KheopskitError(\"NO_PROVIDER\", \"No provider found\");\n\tif (!provider.session)\n\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\n\tconst signMessage = (message: string) =>\n\t\trequestSignMessage(appKit, provider, address, message);\n\n\tconst { field, factory } = getPjsSignerField();\n\n\tconst signer = factory(\n\t\taddress,\n\t\t(transactionPayload) => {\n\t\t\tif (!provider.session)\n\t\t\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\n\t\t\treturn provider.client.request({\n\t\t\t\ttopic: provider.session.topic,\n\t\t\t\tchainId: `polkadot:${transactionPayload.genesisHash.substring(2, 34)}`,\n\t\t\t\trequest: {\n\t\t\t\t\tmethod: \"polkadot_signTransaction\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\ttransactionPayload,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tasync ({ data }) => ({\n\t\t\tid: 0,\n\t\t\tsignature: (await signMessage(data)).signature,\n\t\t}),\n\t\t\"sr25519\",\n\t);\n\n\tconst signRaw: PolkadotAccount[\"signRaw\"] = async (data) =>\n\t\t(await signMessage(encodeRawData(data).data)).signature;\n\n\treturn { [field]: signer, signRaw };\n};\n\nconst getWalletConnectAccounts$ = (\n\twallet: LiveWalletConnectWallet,\n): Observable<PolkadotAccount[]> =>\n\tgetWalletConnectSessionAccounts$({\n\t\twallet,\n\t\tplatform: \"polkadot\",\n\t\tnamespace: \"polkadot\",\n\t\tcacheKey: `accounts:${wallet.id}:polkadot:`,\n\t\tbuildAccounts: (provider) => {\n\t\t\tconst session = provider.session;\n\t\t\tif (!session) return [];\n\n\t\t\tconst addresses = getCaip10Addresses(\n\t\t\t\tgetSessionCaip10s(session, \"polkadot\"),\n\t\t\t);\n\n\t\t\treturn addresses.map(\n\t\t\t\t(address) =>\n\t\t\t\t\t({\n\t\t\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\t...getAppKitPolkadotSigning(wallet.appKit, address),\n\t\t\t\t\t\tgenesisHash: null,\n\t\t\t\t\t\tname: `${wallet.name} Polkadot`,\n\t\t\t\t\t\t// WalletConnect (Reown AppKit) doesn't expose account key type;\n\t\t\t\t\t\t// default to sr25519, which is the most common Polkadot key type.\n\t\t\t\t\t\ttype: \"sr25519\",\n\t\t\t\t\t}) as PolkadotAccount,\n\t\t\t);\n\t\t},\n\t});\n\nexport const getPolkadotAccounts$ = (\n\tpolkadotWallets$: Observable<(PolkadotWallet | WalletConnectWallet)[]>,\n\tpolkadotAccountTypes: PolkadotAccountType[],\n) => {\n\tif (polkadotAccountTypes.length === 0) {\n\t\tconsole.warn(\n\t\t\t\"[kheopskit] polkadot({ accountTypes }) is empty; all Polkadot accounts will be filtered out.\",\n\t\t);\n\t}\n\n\treturn createPlatformAccounts$({\n\t\twallets$: polkadotWallets$,\n\t\tgetInjectedAccounts$: getInjectedWalletAccounts$,\n\t\tgetWalletConnectAccounts$,\n\t\tmapAccounts: (accounts) =>\n\t\t\taccounts.filter((account) => polkadotAccountTypes.includes(account.type)),\n\t});\n};\n","import type {\n\tKheopskitPlatform,\n\tPlatformContext,\n\tPolkadotAccountType,\n} from \"../types\";\nimport { getPolkadotAccounts$ } from \"./accounts\";\nimport type { PolkadotAccount, PolkadotWallet } from \"./types\";\nimport { getPolkadotWallets$ } from \"./wallets\";\n\nconst DEFAULT_ACCOUNT_TYPES: PolkadotAccountType[] = [\n\t\"sr25519\",\n\t\"ed25519\",\n\t\"ecdsa\",\n];\n\nconst VALID_ACCOUNT_TYPES = new Set<string>([\n\t\"sr25519\",\n\t\"ed25519\",\n\t\"ecdsa\",\n\t\"ethereum\",\n]);\n\nexport type PolkadotPluginOptions = {\n\t/**\n\t * Allowed Polkadot account key types. Accounts with other key types are\n\t * filtered out from kheopskit state.\n\t *\n\t * @default [\"sr25519\", \"ed25519\", \"ecdsa\"]\n\t */\n\taccountTypes?: PolkadotAccountType[];\n};\n\n/**\n * Polkadot platform plugin. Pass to `getKheopskit$({ platforms: [polkadot()] })`.\n *\n * @example\n * ```ts\n * import { polkadot } from \"@kheopskit/core/polkadot\";\n * polkadot({ accountTypes: [\"sr25519\", \"ed25519\", \"ecdsa\"] });\n * ```\n */\nexport const polkadot = (\n\toptions: PolkadotPluginOptions = {},\n): KheopskitPlatform<\"polkadot\", PolkadotWallet, PolkadotAccount> => {\n\tconst accountTypes = options.accountTypes ?? DEFAULT_ACCOUNT_TYPES;\n\n\tconst invalid = accountTypes.filter((t) => !VALID_ACCOUNT_TYPES.has(t));\n\tif (invalid.length > 0) {\n\t\tconsole.warn(\n\t\t\t`[kheopskit] Unknown polkadot accountTypes: ${JSON.stringify(invalid)}. Valid values: \"sr25519\", \"ed25519\", \"ecdsa\", \"ethereum\".`,\n\t\t);\n\t}\n\n\treturn {\n\t\tplatform: \"polkadot\",\n\t\tgetWallets$: (ctx: PlatformContext) =>\n\t\t\tgetPolkadotWallets$(ctx.store, ctx.config, ctx.registryReads$),\n\t\tgetAccounts$: (wallets$) => getPolkadotAccounts$(wallets$, accountTypes),\n\t\tacceptsCachedAccount: (cached) =>\n\t\t\taccountTypes.includes(cached.polkadotAccountType ?? \"sr25519\"),\n\t};\n};\n"],"mappings":"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"}
|
package/dist/polkadot.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { f as parseWalletId, n as isWalletConnectWallet, o as isRefusalMessage, r as KheopskitError, t as isInjectedWallet, u as getWalletId } from "./types-Yor672md.mjs";
|
|
2
2
|
import { a as getWalletConnectSessionAccounts$, i as getSessionCaip10s, l as isSs58Address, o as getWalletAccountId, r as getCaip10Addresses, t as createPlatformAccounts$ } from "./platformAccounts-yyRUrnel.mjs";
|
|
3
3
|
import { t as POLKADOT_EXTENSIONS } from "./polkadotExtensions-BoVKhNU_.mjs";
|
|
4
|
-
import { t as
|
|
4
|
+
import { t as createRegistryReads$ } from "./registryReads-BvtznSo3.mjs";
|
|
5
5
|
import { t as createInjectedWallets$ } from "./injectedWallets-48L-AL1I.mjs";
|
|
6
6
|
import { hex } from "@scure/base";
|
|
7
|
-
import { Observable, distinctUntilChanged,
|
|
7
|
+
import { Observable, distinctUntilChanged, map, of } from "rxjs";
|
|
8
8
|
import { isEqual } from "lodash-es";
|
|
9
9
|
import * as pjs from "polkadot-api/pjs-signer";
|
|
10
10
|
import { getInjectedExtensions } from "polkadot-api/pjs-signer";
|
|
@@ -43,42 +43,8 @@ const connectExtension = (identifier, appName) => {
|
|
|
43
43
|
return connecting;
|
|
44
44
|
};
|
|
45
45
|
const getInjectedWalletsIds = () => typeof window === "undefined" ? [] : getInjectedExtensions().map((name) => getWalletId("polkadot", name));
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
subscriber.next(getInjectedWalletsIds());
|
|
49
|
-
const intervals = [
|
|
50
|
-
100,
|
|
51
|
-
200,
|
|
52
|
-
300,
|
|
53
|
-
500
|
|
54
|
-
];
|
|
55
|
-
let index = 0;
|
|
56
|
-
let timer;
|
|
57
|
-
const poll = () => {
|
|
58
|
-
subscriber.next(getInjectedWalletsIds());
|
|
59
|
-
if (index < intervals.length) {
|
|
60
|
-
const delay = intervals[index++];
|
|
61
|
-
timer = setTimeout(poll, delay);
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
if (intervals.length > 0) timer = setTimeout(poll, intervals[index++] ?? 100);
|
|
65
|
-
let loadTimer;
|
|
66
|
-
const loadSub = pageLoaded$.pipe(skip(1)).subscribe(() => {
|
|
67
|
-
loadTimer = setTimeout(() => subscriber.next(getInjectedWalletsIds()), 100);
|
|
68
|
-
subscriber.next(getInjectedWalletsIds());
|
|
69
|
-
});
|
|
70
|
-
return () => {
|
|
71
|
-
if (timer !== void 0) clearTimeout(timer);
|
|
72
|
-
clearTimeout(loadTimer);
|
|
73
|
-
loadSub.unsubscribe();
|
|
74
|
-
};
|
|
75
|
-
}).pipe(distinctUntilChanged(isEqual), shareReplay({
|
|
76
|
-
refCount: true,
|
|
77
|
-
bufferSize: 1
|
|
78
|
-
}));
|
|
79
|
-
};
|
|
80
|
-
const getPolkadotWallets$ = (store, config) => createInjectedWallets$(store, {
|
|
81
|
-
sources$: createWalletIdsPoller$(),
|
|
46
|
+
const getPolkadotWallets$ = (store, config, registryReads$ = createRegistryReads$()) => createInjectedWallets$(store, {
|
|
47
|
+
sources$: registryReads$.pipe(map(getInjectedWalletsIds), distinctUntilChanged(isEqual)),
|
|
82
48
|
getWalletId: (walletId) => walletId,
|
|
83
49
|
connect: (walletId) => connectExtension(parseWalletId(walletId).identifier, config.appName || config.walletConnect?.metadata.name || window.location.hostname),
|
|
84
50
|
isUserRejection: isRefusalMessage,
|
|
@@ -274,7 +240,7 @@ const polkadot = (options = {}) => {
|
|
|
274
240
|
if (invalid.length > 0) console.warn(`[kheopskit] Unknown polkadot accountTypes: ${JSON.stringify(invalid)}. Valid values: "sr25519", "ed25519", "ecdsa", "ethereum".`);
|
|
275
241
|
return {
|
|
276
242
|
platform: "polkadot",
|
|
277
|
-
getWallets$: (ctx) => getPolkadotWallets$(ctx.store, ctx.config),
|
|
243
|
+
getWallets$: (ctx) => getPolkadotWallets$(ctx.store, ctx.config, ctx.registryReads$),
|
|
278
244
|
getAccounts$: (wallets$) => getPolkadotAccounts$(wallets$, accountTypes),
|
|
279
245
|
acceptsCachedAccount: (cached) => accountTypes.includes(cached.polkadotAccountType ?? "sr25519")
|
|
280
246
|
};
|
package/dist/polkadot.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polkadot.mjs","names":[],"sources":["../src/api/polkadot/wallets.ts","../src/api/polkadot/accounts.ts","../src/api/polkadot/plugin.ts"],"sourcesContent":["import { isEqual } from \"lodash-es\";\nimport { getInjectedExtensions } from \"polkadot-api/pjs-signer\";\nimport { distinctUntilChanged, Observable, shareReplay, skip } from \"rxjs\";\nimport { pageLoaded$ } from \"../../utils/pageLoad\";\nimport { POLKADOT_EXTENSIONS } from \"../../utils/polkadotExtensions\";\nimport {\n\tgetWalletId,\n\tparseWalletId,\n\ttype WalletId,\n} from \"../../utils/WalletId\";\nimport { isRefusalMessage } from \"../errors\";\nimport { createInjectedWallets$ } from \"../injectedWallets\";\nimport type { KheopskitStore } from \"../store\";\nimport type { KheopskitConfig } from \"../types\";\nimport type {\n\tPolkadotInjected,\n\tPolkadotInjectedAccount,\n\tPolkadotInjectedWallet,\n} from \"./types\";\n\ntype EnableResult = {\n\taccounts?: Partial<PolkadotInjected[\"accounts\"]>;\n\tsigner?: Partial<PolkadotInjected[\"signer\"]>;\n\tmetadata?: unknown;\n\tprovider?: unknown;\n};\n\ntype InjectedWeb3Window = {\n\tinjectedWeb3?: Record<\n\t\tstring,\n\t\t| { enable(appName: string): Promise<EnableResult | null | undefined> }\n\t\t| undefined\n\t>;\n};\n\nconst isPolkadotInjected = (\n\tinjected: EnableResult | null | undefined,\n): injected is PolkadotInjected =>\n\ttypeof injected?.accounts?.get === \"function\" &&\n\ttypeof injected.accounts.subscribe === \"function\" &&\n\ttypeof injected.signer?.signPayload === \"function\" &&\n\ttypeof injected.signer.signRaw === \"function\";\n\n/**\n * The list each extension last reported: read when its connect was granted,\n * so the emission that first shows the wallet connected already lists it, and\n * updated by every `subscribe` callback, so an accounts stream that restarts\n * resumes from the current list rather than the connect-time one.\n */\nexport const latestAccounts = new WeakMap<\n\tPolkadotInjected,\n\tPolkadotInjectedAccount[]\n>();\n\ntype InjectedWeb3Entry = NonNullable<\n\tNonNullable<InjectedWeb3Window[\"injectedWeb3\"]>[string]\n>;\n\n/**\n * The connect each extension is still answering. An extension keeps its\n * prompt open after kheopskit abandons the attempt, and a second `enable()`\n * meanwhile fails (polkadot-js: \"Pending authorisation request already\n * exists\") or resolves unauthorised (Talisman), so a new attempt joins this\n * one instead.\n */\nconst pendingConnects = new WeakMap<\n\tInjectedWeb3Entry,\n\tPromise<PolkadotInjected>\n>();\n\nconst enableExtension = async (\n\tidentifier: string,\n\tentry: InjectedWeb3Entry,\n\tappName: string,\n) => {\n\tconst injected = await entry.enable(appName);\n\tif (!isPolkadotInjected(injected))\n\t\tthrow new Error(`Unsupported extension: \"${identifier}\"`);\n\tlatestAccounts.set(injected, await injected.accounts.get());\n\treturn injected;\n};\n\nconst connectExtension = (\n\tidentifier: string,\n\tappName: string,\n): Promise<PolkadotInjected> => {\n\tconst entry = (globalThis as InjectedWeb3Window).injectedWeb3?.[identifier];\n\tif (!entry)\n\t\treturn Promise.reject(new Error(`Unavailable extension: \"${identifier}\"`));\n\tconst pending = pendingConnects.get(entry);\n\tif (pending) return pending;\n\tconst connecting = enableExtension(identifier, entry, appName);\n\tpendingConnects.set(entry, connecting);\n\tconst settle = () => pendingConnects.delete(entry);\n\tconnecting.then(settle, settle);\n\treturn connecting;\n};\n\nconst getInjectedWalletsIds = () =>\n\ttypeof window === \"undefined\"\n\t\t? []\n\t\t: getInjectedExtensions().map((name) => getWalletId(\"polkadot\", name));\n\n// Create a polling observable that starts immediately and polls at intervals\nconst createWalletIdsPoller$ = () => {\n\treturn new Observable<WalletId[]>((subscriber) => {\n\t\t// Emit immediately on subscribe\n\t\tsubscriber.next(getInjectedWalletsIds());\n\n\t\t// Poll at shorter intervals initially, then slow down\n\t\tconst intervals = [100, 200, 300, 500];\n\t\tlet index = 0;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\n\t\tconst poll = () => {\n\t\t\tsubscriber.next(getInjectedWalletsIds());\n\t\t\tif (index < intervals.length) {\n\t\t\t\tconst delay = intervals[index++];\n\t\t\t\ttimer = setTimeout(poll, delay);\n\t\t\t}\n\t\t};\n\n\t\t// Start polling after first immediate emission\n\t\tif (intervals.length > 0) {\n\t\t\ttimer = setTimeout(poll, intervals[index++] ?? 100);\n\t\t}\n\n\t\tlet loadTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst loadSub = pageLoaded$.pipe(skip(1)).subscribe(() => {\n\t\t\tloadTimer = setTimeout(\n\t\t\t\t() => subscriber.next(getInjectedWalletsIds()),\n\t\t\t\t100,\n\t\t\t);\n\t\t\tsubscriber.next(getInjectedWalletsIds());\n\t\t});\n\n\t\treturn () => {\n\t\t\t// Cancel any pending poll so it can't fire after unsubscribe.\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\tclearTimeout(loadTimer);\n\t\t\tloadSub.unsubscribe();\n\t\t};\n\t}).pipe(\n\t\tdistinctUntilChanged<WalletId[]>(isEqual),\n\t\tshareReplay({ refCount: true, bufferSize: 1 }),\n\t);\n};\n\n// The shared WalletConnect connector is emitted once by core (see\n// `getWallets$`), not per platform — so this returns only injected wallets.\nexport const getPolkadotWallets$ = (\n\tstore: KheopskitStore,\n\tconfig: Pick<KheopskitConfig, \"appName\" | \"walletConnect\">,\n) =>\n\tcreateInjectedWallets$<WalletId, PolkadotInjectedWallet, PolkadotInjected>(\n\t\tstore,\n\t\t{\n\t\t\tsources$: createWalletIdsPoller$(),\n\t\t\tgetWalletId: (walletId) => walletId,\n\t\t\tconnect: (walletId) =>\n\t\t\t\tconnectExtension(\n\t\t\t\t\tparseWalletId(walletId).identifier,\n\t\t\t\t\tconfig.appName ||\n\t\t\t\t\t\tconfig.walletConnect?.metadata.name ||\n\t\t\t\t\t\twindow.location.hostname,\n\t\t\t\t),\n\t\t\tisUserRejection: isRefusalMessage,\n\t\t\tbuildWallet: ({\n\t\t\t\twalletId,\n\t\t\t\thandle,\n\t\t\t\tstatus,\n\t\t\t\terror,\n\t\t\t\tisConnected,\n\t\t\t\tconnect,\n\t\t\t\tdisconnect,\n\t\t\t}) => {\n\t\t\t\tconst { identifier } = parseWalletId(walletId);\n\t\t\t\tconst extInfo = POLKADOT_EXTENSIONS[identifier];\n\n\t\t\t\treturn {\n\t\t\t\t\tid: walletId,\n\t\t\t\t\ttype: \"injected\",\n\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\tname: extInfo?.name ?? identifier,\n\t\t\t\t\ticon: extInfo?.icon ?? \"\",\n\t\t\t\t\tsourceId: identifier,\n\t\t\t\t\textension: handle,\n\t\t\t\t\tstatus,\n\t\t\t\t\terror,\n\t\t\t\t\tisConnected,\n\t\t\t\t\tconnect,\n\t\t\t\t\tdisconnect,\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t);\n","import { hex } from \"@scure/base\";\nimport type {\n\tKeypairType,\n\tSignPayload,\n\tSignRaw,\n} from \"polkadot-api/pjs-signer\";\nimport * as pjs from \"polkadot-api/pjs-signer\";\nimport { Observable, of } from \"rxjs\";\nimport { getWalletAccountId } from \"../../utils\";\nimport { KheopskitError } from \"../errors\";\nimport {\n\tcreatePlatformAccounts$,\n\tgetCaip10Addresses,\n\tgetSessionCaip10s,\n\tgetWalletConnectSessionAccounts$,\n\ttype LiveWalletConnectWallet,\n} from \"../platformAccounts\";\nimport type {\n\tAppKitInstance,\n\tPolkadotAccountType,\n\tWalletConnectProvider,\n\tWalletConnectWallet,\n} from \"../types\";\nimport type {\n\tPolkadotAccount,\n\tPolkadotInjectedAccount,\n\tPolkadotInjectedWallet,\n\tPolkadotSignRawType,\n\tPolkadotWallet,\n} from \"./types\";\nimport { latestAccounts } from \"./wallets\";\n\ntype RawSignature = `0x${string}`;\n\nconst encodeRawData = (\n\tdata: string | Uint8Array,\n\ttype?: PolkadotSignRawType,\n): { data: string; type: PolkadotSignRawType } =>\n\ttypeof data === \"string\"\n\t\t? { data, type: type ?? \"payload\" }\n\t\t: { data: `0x${hex.encode(data)}`, type: type ?? \"bytes\" };\n\n/**\n * pjs-signer's signature-type map knows ed25519, sr25519 and ecdsa only, so an\n * `ethereum` type would get a 64-byte mock signature where ecdsa needs 65.\n */\nconst toSignerType = (type: PolkadotAccountType): KeypairType =>\n\ttype === \"ethereum\" ? \"ecdsa\" : type;\n\nconst getInjectedWalletAccounts$ = (\n\twallet: PolkadotInjectedWallet,\n): Observable<PolkadotAccount[]> => {\n\tconst injected = wallet.extension;\n\tif (!wallet.isConnected || !injected) return of([]);\n\n\treturn new Observable<PolkadotAccount[]>((subscriber) => {\n\t\tconst signPayload = injected.signer.signPayload.bind(injected.signer);\n\t\tconst signRaw = injected.signer.signRaw.bind(injected.signer);\n\t\tconst { field, factory } = getPjsSignerField();\n\n\t\tconst toAccount = (account: PolkadotInjectedAccount): PolkadotAccount => {\n\t\t\tconst { address } = account;\n\t\t\tconst type = account.type ?? \"sr25519\";\n\t\t\treturn {\n\t\t\t\t...account,\n\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\ttype,\n\t\t\t\tplatform: \"polkadot\",\n\t\t\t\twalletName: wallet.name,\n\t\t\t\twalletId: wallet.id,\n\t\t\t\t[field]: factory(address, signPayload, signRaw, toSignerType(type)),\n\t\t\t\tsignRaw: async (data, options) =>\n\t\t\t\t\t(await signRaw({ address, ...encodeRawData(data, options?.type) }))\n\t\t\t\t\t\t.signature,\n\t\t\t} as Exclude<PolkadotAccount, { isPlaceholder: true }>;\n\t\t};\n\n\t\tconst toAccounts = (accounts: PolkadotInjectedAccount[]) =>\n\t\t\taccounts.flatMap((account) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn [toAccount(account)];\n\t\t\t\t} catch {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t});\n\n\t\tconst emit = (accounts: PolkadotInjectedAccount[]) => {\n\t\t\tlatestAccounts.set(injected, accounts);\n\t\t\tsubscriber.next(toAccounts(accounts));\n\t\t};\n\n\t\temit(latestAccounts.get(injected) ?? []);\n\t\treturn injected.accounts.subscribe(emit);\n\t});\n};\n\n/**\n * polkadot-api v2's `getPolkadotSignerFromPjs` takes three parameters and\n * ignores the fourth at runtime.\n */\ntype PjsSignerFactory = (\n\taddress: string,\n\tsignPayload: SignPayload,\n\tsignRaw: SignRaw,\n\ttype?: KeypairType,\n) => unknown;\n\ntype PjsSignerModule = {\n\tgetTxCreatorFromPjs?: PjsSignerFactory;\n\tgetPolkadotSignerFromPjs?: PjsSignerFactory;\n};\n\n/**\n * polkadot-api v3 replaced `polkadotSigner` (PolkadotSigner) with `txCreator`\n * (TxCreator). Which one the app's installed version provides is detected at\n * runtime so a single @kheopskit/core release supports both.\n */\nconst getPjsSignerField = (): {\n\tfield: \"txCreator\" | \"polkadotSigner\";\n\tfactory: PjsSignerFactory;\n} => {\n\tconst module = pjs as PjsSignerModule;\n\tif (module.getTxCreatorFromPjs)\n\t\treturn { field: \"txCreator\", factory: module.getTxCreatorFromPjs };\n\tif (module.getPolkadotSignerFromPjs)\n\t\treturn {\n\t\t\tfield: \"polkadotSigner\",\n\t\t\tfactory: module.getPolkadotSignerFromPjs,\n\t\t};\n\tthrow new KheopskitError(\n\t\t\"UNSUPPORTED_VERSION\",\n\t\t\"Unsupported polkadot-api/pjs-signer version\",\n\t);\n};\n\nconst requestSignMessage = (\n\tappKit: AppKitInstance,\n\tprovider: WalletConnectProvider,\n\taddress: string,\n\tmessage: string,\n) => {\n\tif (!provider.session)\n\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\tconst chainId = appKit.getCaipNetworks(\"polkadot\")[0]?.caipNetworkId;\n\tif (!chainId)\n\t\tthrow new KheopskitError(\n\t\t\t\"NO_SESSION\",\n\t\t\t\"No CAIP network available for polkadot\",\n\t\t);\n\n\treturn provider.client.request<{ signature: RawSignature }>({\n\t\ttopic: provider.session.topic,\n\t\tchainId,\n\t\trequest: {\n\t\t\tmethod: \"polkadot_signMessage\",\n\t\t\tparams: { address, message },\n\t\t},\n\t});\n};\n\nconst getAppKitPolkadotSigning = (appKit: AppKitInstance, address: string) => {\n\tconst provider = appKit.getProvider(\"polkadot\");\n\tif (!provider) throw new KheopskitError(\"NO_PROVIDER\", \"No provider found\");\n\tif (!provider.session)\n\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\n\tconst signMessage = (message: string) =>\n\t\trequestSignMessage(appKit, provider, address, message);\n\n\tconst { field, factory } = getPjsSignerField();\n\n\tconst signer = factory(\n\t\taddress,\n\t\t(transactionPayload) => {\n\t\t\tif (!provider.session)\n\t\t\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\n\t\t\treturn provider.client.request({\n\t\t\t\ttopic: provider.session.topic,\n\t\t\t\tchainId: `polkadot:${transactionPayload.genesisHash.substring(2, 34)}`,\n\t\t\t\trequest: {\n\t\t\t\t\tmethod: \"polkadot_signTransaction\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\ttransactionPayload,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tasync ({ data }) => ({\n\t\t\tid: 0,\n\t\t\tsignature: (await signMessage(data)).signature,\n\t\t}),\n\t\t\"sr25519\",\n\t);\n\n\tconst signRaw: PolkadotAccount[\"signRaw\"] = async (data) =>\n\t\t(await signMessage(encodeRawData(data).data)).signature;\n\n\treturn { [field]: signer, signRaw };\n};\n\nconst getWalletConnectAccounts$ = (\n\twallet: LiveWalletConnectWallet,\n): Observable<PolkadotAccount[]> =>\n\tgetWalletConnectSessionAccounts$({\n\t\twallet,\n\t\tplatform: \"polkadot\",\n\t\tnamespace: \"polkadot\",\n\t\tcacheKey: `accounts:${wallet.id}:polkadot:`,\n\t\tbuildAccounts: (provider) => {\n\t\t\tconst session = provider.session;\n\t\t\tif (!session) return [];\n\n\t\t\tconst addresses = getCaip10Addresses(\n\t\t\t\tgetSessionCaip10s(session, \"polkadot\"),\n\t\t\t);\n\n\t\t\treturn addresses.map(\n\t\t\t\t(address) =>\n\t\t\t\t\t({\n\t\t\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\t...getAppKitPolkadotSigning(wallet.appKit, address),\n\t\t\t\t\t\tgenesisHash: null,\n\t\t\t\t\t\tname: `${wallet.name} Polkadot`,\n\t\t\t\t\t\t// WalletConnect (Reown AppKit) doesn't expose account key type;\n\t\t\t\t\t\t// default to sr25519, which is the most common Polkadot key type.\n\t\t\t\t\t\ttype: \"sr25519\",\n\t\t\t\t\t}) as PolkadotAccount,\n\t\t\t);\n\t\t},\n\t});\n\nexport const getPolkadotAccounts$ = (\n\tpolkadotWallets$: Observable<(PolkadotWallet | WalletConnectWallet)[]>,\n\tpolkadotAccountTypes: PolkadotAccountType[],\n) => {\n\tif (polkadotAccountTypes.length === 0) {\n\t\tconsole.warn(\n\t\t\t\"[kheopskit] polkadot({ accountTypes }) is empty; all Polkadot accounts will be filtered out.\",\n\t\t);\n\t}\n\n\treturn createPlatformAccounts$({\n\t\twallets$: polkadotWallets$,\n\t\tgetInjectedAccounts$: getInjectedWalletAccounts$,\n\t\tgetWalletConnectAccounts$,\n\t\tmapAccounts: (accounts) =>\n\t\t\taccounts.filter((account) => polkadotAccountTypes.includes(account.type)),\n\t});\n};\n","import type {\n\tKheopskitPlatform,\n\tPlatformContext,\n\tPolkadotAccountType,\n} from \"../types\";\nimport { getPolkadotAccounts$ } from \"./accounts\";\nimport type { PolkadotAccount, PolkadotWallet } from \"./types\";\nimport { getPolkadotWallets$ } from \"./wallets\";\n\nconst DEFAULT_ACCOUNT_TYPES: PolkadotAccountType[] = [\n\t\"sr25519\",\n\t\"ed25519\",\n\t\"ecdsa\",\n];\n\nconst VALID_ACCOUNT_TYPES = new Set<string>([\n\t\"sr25519\",\n\t\"ed25519\",\n\t\"ecdsa\",\n\t\"ethereum\",\n]);\n\nexport type PolkadotPluginOptions = {\n\t/**\n\t * Allowed Polkadot account key types. Accounts with other key types are\n\t * filtered out from kheopskit state.\n\t *\n\t * @default [\"sr25519\", \"ed25519\", \"ecdsa\"]\n\t */\n\taccountTypes?: PolkadotAccountType[];\n};\n\n/**\n * Polkadot platform plugin. Pass to `getKheopskit$({ platforms: [polkadot()] })`.\n *\n * @example\n * ```ts\n * import { polkadot } from \"@kheopskit/core/polkadot\";\n * polkadot({ accountTypes: [\"sr25519\", \"ed25519\", \"ecdsa\"] });\n * ```\n */\nexport const polkadot = (\n\toptions: PolkadotPluginOptions = {},\n): KheopskitPlatform<\"polkadot\", PolkadotWallet, PolkadotAccount> => {\n\tconst accountTypes = options.accountTypes ?? DEFAULT_ACCOUNT_TYPES;\n\n\tconst invalid = accountTypes.filter((t) => !VALID_ACCOUNT_TYPES.has(t));\n\tif (invalid.length > 0) {\n\t\tconsole.warn(\n\t\t\t`[kheopskit] Unknown polkadot accountTypes: ${JSON.stringify(invalid)}. Valid values: \"sr25519\", \"ed25519\", \"ecdsa\", \"ethereum\".`,\n\t\t);\n\t}\n\n\treturn {\n\t\tplatform: \"polkadot\",\n\t\tgetWallets$: (ctx: PlatformContext) =>\n\t\t\tgetPolkadotWallets$(ctx.store, ctx.config),\n\t\tgetAccounts$: (wallets$) => getPolkadotAccounts$(wallets$, accountTypes),\n\t\tacceptsCachedAccount: (cached) =>\n\t\t\taccountTypes.includes(cached.polkadotAccountType ?? \"sr25519\"),\n\t};\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"polkadot.mjs","names":[],"sources":["../src/api/polkadot/wallets.ts","../src/api/polkadot/accounts.ts","../src/api/polkadot/plugin.ts"],"sourcesContent":["import { isEqual } from \"lodash-es\";\nimport { getInjectedExtensions } from \"polkadot-api/pjs-signer\";\nimport { distinctUntilChanged, map, type Observable } from \"rxjs\";\nimport { POLKADOT_EXTENSIONS } from \"../../utils/polkadotExtensions\";\nimport { createRegistryReads$ } from \"../../utils/registryReads\";\nimport {\n\tgetWalletId,\n\tparseWalletId,\n\ttype WalletId,\n} from \"../../utils/WalletId\";\nimport { isRefusalMessage } from \"../errors\";\nimport { createInjectedWallets$ } from \"../injectedWallets\";\nimport type { KheopskitStore } from \"../store\";\nimport type { KheopskitConfig } from \"../types\";\nimport type {\n\tPolkadotInjected,\n\tPolkadotInjectedAccount,\n\tPolkadotInjectedWallet,\n} from \"./types\";\n\ntype EnableResult = {\n\taccounts?: Partial<PolkadotInjected[\"accounts\"]>;\n\tsigner?: Partial<PolkadotInjected[\"signer\"]>;\n\tmetadata?: unknown;\n\tprovider?: unknown;\n};\n\ntype InjectedWeb3Window = {\n\tinjectedWeb3?: Record<\n\t\tstring,\n\t\t| { enable(appName: string): Promise<EnableResult | null | undefined> }\n\t\t| undefined\n\t>;\n};\n\nconst isPolkadotInjected = (\n\tinjected: EnableResult | null | undefined,\n): injected is PolkadotInjected =>\n\ttypeof injected?.accounts?.get === \"function\" &&\n\ttypeof injected.accounts.subscribe === \"function\" &&\n\ttypeof injected.signer?.signPayload === \"function\" &&\n\ttypeof injected.signer.signRaw === \"function\";\n\n/**\n * The list each extension last reported: read when its connect was granted,\n * so the emission that first shows the wallet connected already lists it, and\n * updated by every `subscribe` callback, so an accounts stream that restarts\n * resumes from the current list rather than the connect-time one.\n */\nexport const latestAccounts = new WeakMap<\n\tPolkadotInjected,\n\tPolkadotInjectedAccount[]\n>();\n\ntype InjectedWeb3Entry = NonNullable<\n\tNonNullable<InjectedWeb3Window[\"injectedWeb3\"]>[string]\n>;\n\n/**\n * The connect each extension is still answering. An extension keeps its\n * prompt open after kheopskit abandons the attempt, and a second `enable()`\n * meanwhile fails (polkadot-js: \"Pending authorisation request already\n * exists\") or resolves unauthorised (Talisman), so a new attempt joins this\n * one instead.\n */\nconst pendingConnects = new WeakMap<\n\tInjectedWeb3Entry,\n\tPromise<PolkadotInjected>\n>();\n\nconst enableExtension = async (\n\tidentifier: string,\n\tentry: InjectedWeb3Entry,\n\tappName: string,\n) => {\n\tconst injected = await entry.enable(appName);\n\tif (!isPolkadotInjected(injected))\n\t\tthrow new Error(`Unsupported extension: \"${identifier}\"`);\n\tlatestAccounts.set(injected, await injected.accounts.get());\n\treturn injected;\n};\n\nconst connectExtension = (\n\tidentifier: string,\n\tappName: string,\n): Promise<PolkadotInjected> => {\n\tconst entry = (globalThis as InjectedWeb3Window).injectedWeb3?.[identifier];\n\tif (!entry)\n\t\treturn Promise.reject(new Error(`Unavailable extension: \"${identifier}\"`));\n\tconst pending = pendingConnects.get(entry);\n\tif (pending) return pending;\n\tconst connecting = enableExtension(identifier, entry, appName);\n\tpendingConnects.set(entry, connecting);\n\tconst settle = () => pendingConnects.delete(entry);\n\tconnecting.then(settle, settle);\n\treturn connecting;\n};\n\nconst getInjectedWalletsIds = () =>\n\ttypeof window === \"undefined\"\n\t\t? []\n\t\t: getInjectedExtensions().map((name) => getWalletId(\"polkadot\", name));\n\n// The shared WalletConnect connector is emitted once by core (see\n// `getWallets$`), not per platform — so this returns only injected wallets.\nexport const getPolkadotWallets$ = (\n\tstore: KheopskitStore,\n\tconfig: Pick<KheopskitConfig, \"appName\" | \"walletConnect\">,\n\tregistryReads$: Observable<void> = createRegistryReads$(),\n) =>\n\tcreateInjectedWallets$<WalletId, PolkadotInjectedWallet, PolkadotInjected>(\n\t\tstore,\n\t\t{\n\t\t\tsources$: registryReads$.pipe(\n\t\t\t\tmap(getInjectedWalletsIds),\n\t\t\t\tdistinctUntilChanged<WalletId[]>(isEqual),\n\t\t\t),\n\t\t\tgetWalletId: (walletId) => walletId,\n\t\t\tconnect: (walletId) =>\n\t\t\t\tconnectExtension(\n\t\t\t\t\tparseWalletId(walletId).identifier,\n\t\t\t\t\tconfig.appName ||\n\t\t\t\t\t\tconfig.walletConnect?.metadata.name ||\n\t\t\t\t\t\twindow.location.hostname,\n\t\t\t\t),\n\t\t\tisUserRejection: isRefusalMessage,\n\t\t\tbuildWallet: ({\n\t\t\t\twalletId,\n\t\t\t\thandle,\n\t\t\t\tstatus,\n\t\t\t\terror,\n\t\t\t\tisConnected,\n\t\t\t\tconnect,\n\t\t\t\tdisconnect,\n\t\t\t}) => {\n\t\t\t\tconst { identifier } = parseWalletId(walletId);\n\t\t\t\tconst extInfo = POLKADOT_EXTENSIONS[identifier];\n\n\t\t\t\treturn {\n\t\t\t\t\tid: walletId,\n\t\t\t\t\ttype: \"injected\",\n\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\tname: extInfo?.name ?? identifier,\n\t\t\t\t\ticon: extInfo?.icon ?? \"\",\n\t\t\t\t\tsourceId: identifier,\n\t\t\t\t\textension: handle,\n\t\t\t\t\tstatus,\n\t\t\t\t\terror,\n\t\t\t\t\tisConnected,\n\t\t\t\t\tconnect,\n\t\t\t\t\tdisconnect,\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t);\n","import { hex } from \"@scure/base\";\nimport type {\n\tKeypairType,\n\tSignPayload,\n\tSignRaw,\n} from \"polkadot-api/pjs-signer\";\nimport * as pjs from \"polkadot-api/pjs-signer\";\nimport { Observable, of } from \"rxjs\";\nimport { getWalletAccountId } from \"../../utils\";\nimport { KheopskitError } from \"../errors\";\nimport {\n\tcreatePlatformAccounts$,\n\tgetCaip10Addresses,\n\tgetSessionCaip10s,\n\tgetWalletConnectSessionAccounts$,\n\ttype LiveWalletConnectWallet,\n} from \"../platformAccounts\";\nimport type {\n\tAppKitInstance,\n\tPolkadotAccountType,\n\tWalletConnectProvider,\n\tWalletConnectWallet,\n} from \"../types\";\nimport type {\n\tPolkadotAccount,\n\tPolkadotInjectedAccount,\n\tPolkadotInjectedWallet,\n\tPolkadotSignRawType,\n\tPolkadotWallet,\n} from \"./types\";\nimport { latestAccounts } from \"./wallets\";\n\ntype RawSignature = `0x${string}`;\n\nconst encodeRawData = (\n\tdata: string | Uint8Array,\n\ttype?: PolkadotSignRawType,\n): { data: string; type: PolkadotSignRawType } =>\n\ttypeof data === \"string\"\n\t\t? { data, type: type ?? \"payload\" }\n\t\t: { data: `0x${hex.encode(data)}`, type: type ?? \"bytes\" };\n\n/**\n * pjs-signer's signature-type map knows ed25519, sr25519 and ecdsa only, so an\n * `ethereum` type would get a 64-byte mock signature where ecdsa needs 65.\n */\nconst toSignerType = (type: PolkadotAccountType): KeypairType =>\n\ttype === \"ethereum\" ? \"ecdsa\" : type;\n\nconst getInjectedWalletAccounts$ = (\n\twallet: PolkadotInjectedWallet,\n): Observable<PolkadotAccount[]> => {\n\tconst injected = wallet.extension;\n\tif (!wallet.isConnected || !injected) return of([]);\n\n\treturn new Observable<PolkadotAccount[]>((subscriber) => {\n\t\tconst signPayload = injected.signer.signPayload.bind(injected.signer);\n\t\tconst signRaw = injected.signer.signRaw.bind(injected.signer);\n\t\tconst { field, factory } = getPjsSignerField();\n\n\t\tconst toAccount = (account: PolkadotInjectedAccount): PolkadotAccount => {\n\t\t\tconst { address } = account;\n\t\t\tconst type = account.type ?? \"sr25519\";\n\t\t\treturn {\n\t\t\t\t...account,\n\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\ttype,\n\t\t\t\tplatform: \"polkadot\",\n\t\t\t\twalletName: wallet.name,\n\t\t\t\twalletId: wallet.id,\n\t\t\t\t[field]: factory(address, signPayload, signRaw, toSignerType(type)),\n\t\t\t\tsignRaw: async (data, options) =>\n\t\t\t\t\t(await signRaw({ address, ...encodeRawData(data, options?.type) }))\n\t\t\t\t\t\t.signature,\n\t\t\t} as Exclude<PolkadotAccount, { isPlaceholder: true }>;\n\t\t};\n\n\t\tconst toAccounts = (accounts: PolkadotInjectedAccount[]) =>\n\t\t\taccounts.flatMap((account) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn [toAccount(account)];\n\t\t\t\t} catch {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t});\n\n\t\tconst emit = (accounts: PolkadotInjectedAccount[]) => {\n\t\t\tlatestAccounts.set(injected, accounts);\n\t\t\tsubscriber.next(toAccounts(accounts));\n\t\t};\n\n\t\temit(latestAccounts.get(injected) ?? []);\n\t\treturn injected.accounts.subscribe(emit);\n\t});\n};\n\n/**\n * polkadot-api v2's `getPolkadotSignerFromPjs` takes three parameters and\n * ignores the fourth at runtime.\n */\ntype PjsSignerFactory = (\n\taddress: string,\n\tsignPayload: SignPayload,\n\tsignRaw: SignRaw,\n\ttype?: KeypairType,\n) => unknown;\n\ntype PjsSignerModule = {\n\tgetTxCreatorFromPjs?: PjsSignerFactory;\n\tgetPolkadotSignerFromPjs?: PjsSignerFactory;\n};\n\n/**\n * polkadot-api v3 replaced `polkadotSigner` (PolkadotSigner) with `txCreator`\n * (TxCreator). Which one the app's installed version provides is detected at\n * runtime so a single @kheopskit/core release supports both.\n */\nconst getPjsSignerField = (): {\n\tfield: \"txCreator\" | \"polkadotSigner\";\n\tfactory: PjsSignerFactory;\n} => {\n\tconst module = pjs as PjsSignerModule;\n\tif (module.getTxCreatorFromPjs)\n\t\treturn { field: \"txCreator\", factory: module.getTxCreatorFromPjs };\n\tif (module.getPolkadotSignerFromPjs)\n\t\treturn {\n\t\t\tfield: \"polkadotSigner\",\n\t\t\tfactory: module.getPolkadotSignerFromPjs,\n\t\t};\n\tthrow new KheopskitError(\n\t\t\"UNSUPPORTED_VERSION\",\n\t\t\"Unsupported polkadot-api/pjs-signer version\",\n\t);\n};\n\nconst requestSignMessage = (\n\tappKit: AppKitInstance,\n\tprovider: WalletConnectProvider,\n\taddress: string,\n\tmessage: string,\n) => {\n\tif (!provider.session)\n\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\tconst chainId = appKit.getCaipNetworks(\"polkadot\")[0]?.caipNetworkId;\n\tif (!chainId)\n\t\tthrow new KheopskitError(\n\t\t\t\"NO_SESSION\",\n\t\t\t\"No CAIP network available for polkadot\",\n\t\t);\n\n\treturn provider.client.request<{ signature: RawSignature }>({\n\t\ttopic: provider.session.topic,\n\t\tchainId,\n\t\trequest: {\n\t\t\tmethod: \"polkadot_signMessage\",\n\t\t\tparams: { address, message },\n\t\t},\n\t});\n};\n\nconst getAppKitPolkadotSigning = (appKit: AppKitInstance, address: string) => {\n\tconst provider = appKit.getProvider(\"polkadot\");\n\tif (!provider) throw new KheopskitError(\"NO_PROVIDER\", \"No provider found\");\n\tif (!provider.session)\n\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\n\tconst signMessage = (message: string) =>\n\t\trequestSignMessage(appKit, provider, address, message);\n\n\tconst { field, factory } = getPjsSignerField();\n\n\tconst signer = factory(\n\t\taddress,\n\t\t(transactionPayload) => {\n\t\t\tif (!provider.session)\n\t\t\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\n\t\t\treturn provider.client.request({\n\t\t\t\ttopic: provider.session.topic,\n\t\t\t\tchainId: `polkadot:${transactionPayload.genesisHash.substring(2, 34)}`,\n\t\t\t\trequest: {\n\t\t\t\t\tmethod: \"polkadot_signTransaction\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\ttransactionPayload,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tasync ({ data }) => ({\n\t\t\tid: 0,\n\t\t\tsignature: (await signMessage(data)).signature,\n\t\t}),\n\t\t\"sr25519\",\n\t);\n\n\tconst signRaw: PolkadotAccount[\"signRaw\"] = async (data) =>\n\t\t(await signMessage(encodeRawData(data).data)).signature;\n\n\treturn { [field]: signer, signRaw };\n};\n\nconst getWalletConnectAccounts$ = (\n\twallet: LiveWalletConnectWallet,\n): Observable<PolkadotAccount[]> =>\n\tgetWalletConnectSessionAccounts$({\n\t\twallet,\n\t\tplatform: \"polkadot\",\n\t\tnamespace: \"polkadot\",\n\t\tcacheKey: `accounts:${wallet.id}:polkadot:`,\n\t\tbuildAccounts: (provider) => {\n\t\t\tconst session = provider.session;\n\t\t\tif (!session) return [];\n\n\t\t\tconst addresses = getCaip10Addresses(\n\t\t\t\tgetSessionCaip10s(session, \"polkadot\"),\n\t\t\t);\n\n\t\t\treturn addresses.map(\n\t\t\t\t(address) =>\n\t\t\t\t\t({\n\t\t\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\t...getAppKitPolkadotSigning(wallet.appKit, address),\n\t\t\t\t\t\tgenesisHash: null,\n\t\t\t\t\t\tname: `${wallet.name} Polkadot`,\n\t\t\t\t\t\t// WalletConnect (Reown AppKit) doesn't expose account key type;\n\t\t\t\t\t\t// default to sr25519, which is the most common Polkadot key type.\n\t\t\t\t\t\ttype: \"sr25519\",\n\t\t\t\t\t}) as PolkadotAccount,\n\t\t\t);\n\t\t},\n\t});\n\nexport const getPolkadotAccounts$ = (\n\tpolkadotWallets$: Observable<(PolkadotWallet | WalletConnectWallet)[]>,\n\tpolkadotAccountTypes: PolkadotAccountType[],\n) => {\n\tif (polkadotAccountTypes.length === 0) {\n\t\tconsole.warn(\n\t\t\t\"[kheopskit] polkadot({ accountTypes }) is empty; all Polkadot accounts will be filtered out.\",\n\t\t);\n\t}\n\n\treturn createPlatformAccounts$({\n\t\twallets$: polkadotWallets$,\n\t\tgetInjectedAccounts$: getInjectedWalletAccounts$,\n\t\tgetWalletConnectAccounts$,\n\t\tmapAccounts: (accounts) =>\n\t\t\taccounts.filter((account) => polkadotAccountTypes.includes(account.type)),\n\t});\n};\n","import type {\n\tKheopskitPlatform,\n\tPlatformContext,\n\tPolkadotAccountType,\n} from \"../types\";\nimport { getPolkadotAccounts$ } from \"./accounts\";\nimport type { PolkadotAccount, PolkadotWallet } from \"./types\";\nimport { getPolkadotWallets$ } from \"./wallets\";\n\nconst DEFAULT_ACCOUNT_TYPES: PolkadotAccountType[] = [\n\t\"sr25519\",\n\t\"ed25519\",\n\t\"ecdsa\",\n];\n\nconst VALID_ACCOUNT_TYPES = new Set<string>([\n\t\"sr25519\",\n\t\"ed25519\",\n\t\"ecdsa\",\n\t\"ethereum\",\n]);\n\nexport type PolkadotPluginOptions = {\n\t/**\n\t * Allowed Polkadot account key types. Accounts with other key types are\n\t * filtered out from kheopskit state.\n\t *\n\t * @default [\"sr25519\", \"ed25519\", \"ecdsa\"]\n\t */\n\taccountTypes?: PolkadotAccountType[];\n};\n\n/**\n * Polkadot platform plugin. Pass to `getKheopskit$({ platforms: [polkadot()] })`.\n *\n * @example\n * ```ts\n * import { polkadot } from \"@kheopskit/core/polkadot\";\n * polkadot({ accountTypes: [\"sr25519\", \"ed25519\", \"ecdsa\"] });\n * ```\n */\nexport const polkadot = (\n\toptions: PolkadotPluginOptions = {},\n): KheopskitPlatform<\"polkadot\", PolkadotWallet, PolkadotAccount> => {\n\tconst accountTypes = options.accountTypes ?? DEFAULT_ACCOUNT_TYPES;\n\n\tconst invalid = accountTypes.filter((t) => !VALID_ACCOUNT_TYPES.has(t));\n\tif (invalid.length > 0) {\n\t\tconsole.warn(\n\t\t\t`[kheopskit] Unknown polkadot accountTypes: ${JSON.stringify(invalid)}. Valid values: \"sr25519\", \"ed25519\", \"ecdsa\", \"ethereum\".`,\n\t\t);\n\t}\n\n\treturn {\n\t\tplatform: \"polkadot\",\n\t\tgetWallets$: (ctx: PlatformContext) =>\n\t\t\tgetPolkadotWallets$(ctx.store, ctx.config, ctx.registryReads$),\n\t\tgetAccounts$: (wallets$) => getPolkadotAccounts$(wallets$, accountTypes),\n\t\tacceptsCachedAccount: (cached) =>\n\t\t\taccountTypes.includes(cached.polkadotAccountType ?? \"sr25519\"),\n\t};\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
let rxjs = require("rxjs");
|
|
2
|
+
//#region src/utils/pageLoad.ts
|
|
3
|
+
const pageLoaded$ = new rxjs.Observable((subscriber) => {
|
|
4
|
+
if (typeof document === "undefined") {
|
|
5
|
+
subscriber.next(false);
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
if (document.readyState === "complete") {
|
|
9
|
+
subscriber.next(true);
|
|
10
|
+
subscriber.complete();
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
subscriber.next(false);
|
|
14
|
+
const onLoad = () => {
|
|
15
|
+
subscriber.next(true);
|
|
16
|
+
subscriber.complete();
|
|
17
|
+
};
|
|
18
|
+
window.addEventListener("load", onLoad, { once: true });
|
|
19
|
+
return () => window.removeEventListener("load", onLoad);
|
|
20
|
+
});
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/utils/registryReads.ts
|
|
23
|
+
const tail$ = (0, rxjs.merge)((0, rxjs.of)(void 0), ...[
|
|
24
|
+
100,
|
|
25
|
+
300,
|
|
26
|
+
600,
|
|
27
|
+
1100
|
|
28
|
+
].map((ms) => (0, rxjs.timer)(ms))).pipe((0, rxjs.map)(() => void 0));
|
|
29
|
+
const createRegistryReads$ = () => typeof window === "undefined" ? (0, rxjs.concat)((0, rxjs.of)(void 0), rxjs.NEVER) : pageLoaded$.pipe((0, rxjs.switchMap)(() => tail$));
|
|
30
|
+
//#endregion
|
|
31
|
+
Object.defineProperty(exports, "createRegistryReads$", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
get: function() {
|
|
34
|
+
return createRegistryReads$;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=registryReads-BpHsWLd7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registryReads-BpHsWLd7.js","names":["Observable","merge","of","timer","map","concat","NEVER","switchMap"],"sources":["../src/utils/pageLoad.ts","../src/utils/registryReads.ts"],"sourcesContent":["import { Observable } from \"rxjs\";\n\nexport const pageLoaded$ = new Observable<boolean>((subscriber) => {\n\tif (typeof document === \"undefined\") {\n\t\tsubscriber.next(false);\n\t\treturn;\n\t}\n\n\tif (document.readyState === \"complete\") {\n\t\tsubscriber.next(true);\n\t\tsubscriber.complete();\n\t\treturn;\n\t}\n\n\tsubscriber.next(false);\n\n\tconst onLoad = () => {\n\t\tsubscriber.next(true);\n\t\tsubscriber.complete();\n\t};\n\twindow.addEventListener(\"load\", onLoad, { once: true });\n\n\treturn () => window.removeEventListener(\"load\", onLoad);\n});\n","import {\n\tconcat,\n\tmap,\n\tmerge,\n\tNEVER,\n\ttype Observable,\n\tof,\n\tswitchMap,\n\ttimer,\n} from \"rxjs\";\nimport { pageLoaded$ } from \"./pageLoad\";\n\nconst READ_TAIL_MS = [100, 300, 600, 1100];\n\nconst tail$: Observable<void> = merge(\n\tof(undefined),\n\t...READ_TAIL_MS.map((ms) => timer(ms)),\n).pipe(map(() => undefined));\n\nexport const createRegistryReads$ = (): Observable<void> =>\n\ttypeof window === \"undefined\"\n\t\t? concat(of(undefined), NEVER)\n\t\t: pageLoaded$.pipe(switchMap(() => tail$));\n"],"mappings":";;AAEA,MAAa,cAAc,IAAIA,KAAAA,YAAqB,eAAe;CAClE,IAAI,OAAO,aAAa,aAAa;EACpC,WAAW,KAAK,KAAK;EACrB;CACD;CAEA,IAAI,SAAS,eAAe,YAAY;EACvC,WAAW,KAAK,IAAI;EACpB,WAAW,SAAS;EACpB;CACD;CAEA,WAAW,KAAK,KAAK;CAErB,MAAM,eAAe;EACpB,WAAW,KAAK,IAAI;EACpB,WAAW,SAAS;CACrB;CACA,OAAO,iBAAiB,QAAQ,QAAQ,EAAE,MAAM,KAAK,CAAC;CAEtD,aAAa,OAAO,oBAAoB,QAAQ,MAAM;AACvD,CAAC;;;ACTD,MAAM,SAAA,GAA0BC,KAAAA,MAAAA,EAAAA,GAC/BC,KAAAA,GAAAA,CAAG,KAAA,CAAS,GACZ,GAAG;CAJkB;CAAK;CAAK;CAAK;AAItB,CAAC,CAAC,KAAK,QAAA,GAAOC,KAAAA,MAAAA,CAAM,EAAE,CAAC,CACtC,CAAC,CAAC,MAAA,GAAKC,KAAAA,IAAAA,OAAU,KAAA,CAAS,CAAC;AAE3B,MAAa,6BACZ,OAAO,WAAW,eAAA,GACfC,KAAAA,OAAAA,EAAAA,GAAOH,KAAAA,GAAAA,CAAG,KAAA,CAAS,GAAGI,KAAAA,KAAK,IAC3B,YAAY,MAAA,GAAKC,KAAAA,UAAAA,OAAgB,KAAK,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Observable } from "rxjs";
|
|
1
|
+
import { NEVER, Observable, concat, map, merge, of, switchMap, timer } from "rxjs";
|
|
2
2
|
//#region src/utils/pageLoad.ts
|
|
3
3
|
const pageLoaded$ = new Observable((subscriber) => {
|
|
4
4
|
if (typeof document === "undefined") {
|
|
@@ -19,6 +19,15 @@ const pageLoaded$ = new Observable((subscriber) => {
|
|
|
19
19
|
return () => window.removeEventListener("load", onLoad);
|
|
20
20
|
});
|
|
21
21
|
//#endregion
|
|
22
|
-
|
|
22
|
+
//#region src/utils/registryReads.ts
|
|
23
|
+
const tail$ = merge(of(void 0), ...[
|
|
24
|
+
100,
|
|
25
|
+
300,
|
|
26
|
+
600,
|
|
27
|
+
1100
|
|
28
|
+
].map((ms) => timer(ms))).pipe(map(() => void 0));
|
|
29
|
+
const createRegistryReads$ = () => typeof window === "undefined" ? concat(of(void 0), NEVER) : pageLoaded$.pipe(switchMap(() => tail$));
|
|
30
|
+
//#endregion
|
|
31
|
+
export { createRegistryReads$ as t };
|
|
23
32
|
|
|
24
|
-
//# sourceMappingURL=
|
|
33
|
+
//# sourceMappingURL=registryReads-BvtznSo3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registryReads-BvtznSo3.mjs","names":[],"sources":["../src/utils/pageLoad.ts","../src/utils/registryReads.ts"],"sourcesContent":["import { Observable } from \"rxjs\";\n\nexport const pageLoaded$ = new Observable<boolean>((subscriber) => {\n\tif (typeof document === \"undefined\") {\n\t\tsubscriber.next(false);\n\t\treturn;\n\t}\n\n\tif (document.readyState === \"complete\") {\n\t\tsubscriber.next(true);\n\t\tsubscriber.complete();\n\t\treturn;\n\t}\n\n\tsubscriber.next(false);\n\n\tconst onLoad = () => {\n\t\tsubscriber.next(true);\n\t\tsubscriber.complete();\n\t};\n\twindow.addEventListener(\"load\", onLoad, { once: true });\n\n\treturn () => window.removeEventListener(\"load\", onLoad);\n});\n","import {\n\tconcat,\n\tmap,\n\tmerge,\n\tNEVER,\n\ttype Observable,\n\tof,\n\tswitchMap,\n\ttimer,\n} from \"rxjs\";\nimport { pageLoaded$ } from \"./pageLoad\";\n\nconst READ_TAIL_MS = [100, 300, 600, 1100];\n\nconst tail$: Observable<void> = merge(\n\tof(undefined),\n\t...READ_TAIL_MS.map((ms) => timer(ms)),\n).pipe(map(() => undefined));\n\nexport const createRegistryReads$ = (): Observable<void> =>\n\ttypeof window === \"undefined\"\n\t\t? concat(of(undefined), NEVER)\n\t\t: pageLoaded$.pipe(switchMap(() => tail$));\n"],"mappings":";;AAEA,MAAa,cAAc,IAAI,YAAqB,eAAe;CAClE,IAAI,OAAO,aAAa,aAAa;EACpC,WAAW,KAAK,KAAK;EACrB;CACD;CAEA,IAAI,SAAS,eAAe,YAAY;EACvC,WAAW,KAAK,IAAI;EACpB,WAAW,SAAS;EACpB;CACD;CAEA,WAAW,KAAK,KAAK;CAErB,MAAM,eAAe;EACpB,WAAW,KAAK,IAAI;EACpB,WAAW,SAAS;CACrB;CACA,OAAO,iBAAiB,QAAQ,QAAQ,EAAE,MAAM,KAAK,CAAC;CAEtD,aAAa,OAAO,oBAAoB,QAAQ,MAAM;AACvD,CAAC;;;ACTD,MAAM,QAA0B,MAC/B,GAAG,KAAA,CAAS,GACZ,GAAG;CAJkB;CAAK;CAAK;CAAK;AAItB,CAAC,CAAC,KAAK,OAAO,MAAM,EAAE,CAAC,CACtC,CAAC,CAAC,KAAK,UAAU,KAAA,CAAS,CAAC;AAE3B,MAAa,6BACZ,OAAO,WAAW,cACf,OAAO,GAAG,KAAA,CAAS,GAAG,KAAK,IAC3B,YAAY,KAAK,gBAAgB,KAAK,CAAC"}
|
package/dist/solana.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { E as isWalletConnectWallet, N as WalletAccountId, T as isInjectedWallet, b as WalletConnectWallet, k as WalletId, l as KheopskitPlatform, m as PlaceholderWallet, p as Placeholder, r as BaseWallet } from "./types-
|
|
1
|
+
import { E as isWalletConnectWallet, N as WalletAccountId, T as isInjectedWallet, b as WalletConnectWallet, k as WalletId, l as KheopskitPlatform, m as PlaceholderWallet, p as Placeholder, r as BaseWallet } from "./types-DCaL9bIc.mjs";
|
|
2
2
|
import { MessageModifyingSigner, TransactionModifyingSigner, TransactionSendingSigner } from "@solana/kit";
|
|
3
3
|
import { Wallet } from "@wallet-standard/base";
|
|
4
4
|
//#region src/utils/isSolanaAddress.d.ts
|
|
@@ -76,6 +76,7 @@ type LiveSolanaAccount = {
|
|
|
76
76
|
signer: SolanaSigner;
|
|
77
77
|
/** Returns a signer bound to an arbitrary cluster. */
|
|
78
78
|
getSigner: (chain: SolanaChainId) => SolanaSigner;
|
|
79
|
+
name?: string;
|
|
79
80
|
walletName: string;
|
|
80
81
|
walletId: WalletId;
|
|
81
82
|
};
|
package/dist/solana.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { E as isWalletConnectWallet, N as WalletAccountId, T as isInjectedWallet, b as WalletConnectWallet, k as WalletId, l as KheopskitPlatform, m as PlaceholderWallet, p as Placeholder, r as BaseWallet } from "./types-
|
|
1
|
+
import { E as isWalletConnectWallet, N as WalletAccountId, T as isInjectedWallet, b as WalletConnectWallet, k as WalletId, l as KheopskitPlatform, m as PlaceholderWallet, p as Placeholder, r as BaseWallet } from "./types-DCaL9bIc.js";
|
|
2
2
|
import { MessageModifyingSigner, TransactionModifyingSigner, TransactionSendingSigner } from "@solana/kit";
|
|
3
3
|
import { Wallet } from "@wallet-standard/base";
|
|
4
4
|
//#region src/utils/isSolanaAddress.d.ts
|
|
@@ -76,6 +76,7 @@ type LiveSolanaAccount = {
|
|
|
76
76
|
signer: SolanaSigner;
|
|
77
77
|
/** Returns a signer bound to an arbitrary cluster. */
|
|
78
78
|
getSigner: (chain: SolanaChainId) => SolanaSigner;
|
|
79
|
+
name?: string;
|
|
79
80
|
walletName: string;
|
|
80
81
|
walletId: WalletId;
|
|
81
82
|
};
|
package/dist/solana.js
CHANGED
|
@@ -206,6 +206,7 @@ const getInjectedWalletAccounts$ = (wallet, chain) => {
|
|
|
206
206
|
chains: wallet.chains,
|
|
207
207
|
signer: createInjectedSolanaSigner(standardWallet, account, chain),
|
|
208
208
|
getSigner: (c) => createInjectedSolanaSigner(standardWallet, account, c),
|
|
209
|
+
name: account.label,
|
|
209
210
|
walletName: wallet.name,
|
|
210
211
|
walletId: wallet.id
|
|
211
212
|
}));
|
package/dist/solana.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solana.js","names":["KheopskitError","KheopskitError","address","getTransactionEncoder","getTransactionDecoder","getBase58Decoder","getBase58Encoder","getBase64Decoder","getBase64Encoder","of","getCachedObservable$","Observable","getWalletAccountId","shareReplay","getWalletConnectSessionAccounts$","getSessionCaip10s","getCaip10Addresses","createPlatformAccounts$","Observable","getWallets","shareReplay","createInjectedWallets$","getWalletId","KheopskitError","isEip1193UserRejection","isRefusalMessage","clearCachedObservablesByPrefix"],"sources":["../src/api/solana/chains.ts","../src/api/solana/signer.ts","../src/api/solana/accounts.ts","../src/api/solana/wallets.ts","../src/api/solana/plugin.ts"],"sourcesContent":["import { KheopskitError } from \"../errors\";\n\n/**\n * Wallet Standard chain identifiers for Solana clusters.\n *\n * These are the values wallets advertise in their `chains` arrays and the\n * values kheopskit accepts in `solana({ chain })`.\n *\n * @see https://github.com/anza-xyz/wallet-standard\n */\nexport type SolanaChainId =\n\t| \"solana:mainnet\"\n\t| \"solana:devnet\"\n\t| \"solana:testnet\"\n\t| \"solana:localnet\";\n\nexport const DEFAULT_SOLANA_CHAIN: SolanaChainId = \"solana:mainnet\";\n\nconst SOLANA_CHAIN_IDS = [\n\t\"solana:mainnet\",\n\t\"solana:devnet\",\n\t\"solana:testnet\",\n\t\"solana:localnet\",\n] as const satisfies SolanaChainId[];\n\nexport const isSolanaChainId = (value: unknown): value is SolanaChainId =>\n\ttypeof value === \"string\" &&\n\t(SOLANA_CHAIN_IDS as readonly string[]).includes(value);\n\n/**\n * Maps Wallet Standard chain ids to the CAIP-2 chain ids used by WalletConnect.\n *\n * CAIP-2 ids use the first 32 characters of the cluster's genesis hash as the\n * reference. The values below match `@reown/appkit/networks` (solana,\n * solanaDevnet, solanaTestnet), which is what AppKit puts in session namespaces.\n *\n * `localnet` has no canonical CAIP-2 id and cannot be used over WalletConnect.\n */\nconst SOLANA_CHAIN_TO_CAIP2 = {\n\t\"solana:mainnet\": \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n\t\"solana:devnet\": \"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\",\n\t\"solana:testnet\": \"solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z\",\n} as const satisfies Partial<Record<SolanaChainId, string>>;\n\n/**\n * Returns the CAIP-2 chain id for a Solana chain, for use in WalletConnect\n * requests and when reading WalletConnect session namespaces.\n *\n * @throws if the chain has no canonical CAIP-2 id (e.g. localnet)\n */\nexport const getSolanaCaip2 = (chain: SolanaChainId): string => {\n\tconst caip2 = (SOLANA_CHAIN_TO_CAIP2 as Record<string, string | undefined>)[\n\t\tchain\n\t];\n\tif (!caip2)\n\t\tthrow new KheopskitError(\n\t\t\t\"UNSUPPORTED_CHAIN\",\n\t\t\t`Solana chain \"${chain}\" cannot be used over WalletConnect (no CAIP-2 id).`,\n\t\t);\n\treturn caip2;\n};\n\n/**\n * AppKit's *deprecated* CAIP-2 cluster ids (its `deprecatedCaipNetworkId`\n * values). Some wallets still place accounts in the WC session under these, so\n * map them back to a {@link SolanaChainId} instead of silently falling back to\n * the configured chain. Requests always use the current ids from\n * {@link SOLANA_CHAIN_TO_CAIP2}; testnet has no deprecated id.\n */\nconst DEPRECATED_CAIP2_TO_SOLANA_CHAIN: Record<string, SolanaChainId> = {\n\t\"solana:4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ\": \"solana:mainnet\",\n\t\"solana:8E9rvCKLFQia2Y35HXjjpWzj8weVo44K\": \"solana:devnet\",\n};\n\nconst CAIP2_TO_SOLANA_CHAIN: Record<string, SolanaChainId> = {\n\t...Object.fromEntries(\n\t\tObject.entries(SOLANA_CHAIN_TO_CAIP2).map(([chain, caip2]) => [\n\t\t\tcaip2,\n\t\t\tchain as SolanaChainId,\n\t\t]),\n\t),\n\t...DEPRECATED_CAIP2_TO_SOLANA_CHAIN,\n};\n\n/**\n * Maps a CAIP-2 chain id (as found in WalletConnect session namespaces) back to\n * its {@link SolanaChainId}, or `undefined` if it isn't a recognised cluster.\n */\nexport const getSolanaChainIdFromCaip2 = (\n\tcaip2: string,\n): SolanaChainId | undefined => CAIP2_TO_SOLANA_CHAIN[caip2];\n","import {\n\taddress,\n\tgetBase58Decoder,\n\tgetBase58Encoder,\n\tgetBase64Decoder,\n\tgetBase64Encoder,\n\tgetTransactionDecoder,\n\tgetTransactionEncoder,\n\ttype SignableMessage,\n\ttype SignatureBytes,\n\ttype TransactionModifyingSigner,\n} from \"@solana/kit\";\nimport type {\n\tSolanaSignAndSendTransactionFeature,\n\tSolanaSignMessageFeature,\n\tSolanaSignTransactionFeature,\n} from \"@solana/wallet-standard-features\";\nimport type {\n\tWalletAccount,\n\tWallet as WalletStandardWallet,\n} from \"@wallet-standard/base\";\nimport { KheopskitError } from \"../errors\";\nimport type { WalletConnectProvider } from \"../types\";\nimport { getSolanaCaip2, type SolanaChainId } from \"./chains\";\nimport type { SolanaSigner } from \"./types\";\n\nconst SOLANA_SIGN_MESSAGE = \"solana:signMessage\";\nconst SOLANA_SIGN_TRANSACTION = \"solana:signTransaction\";\nconst SOLANA_SIGN_AND_SEND_TRANSACTION = \"solana:signAndSendTransaction\";\n\ntype SignMessageApi = SolanaSignMessageFeature[typeof SOLANA_SIGN_MESSAGE];\ntype SignTransactionApi =\n\tSolanaSignTransactionFeature[typeof SOLANA_SIGN_TRANSACTION];\ntype SignAndSendApi =\n\tSolanaSignAndSendTransactionFeature[typeof SOLANA_SIGN_AND_SEND_TRANSACTION];\n\n/** The branded array type expected back from a transaction-modifying signer. */\ntype SignedTransactions = Awaited<\n\tReturnType<TransactionModifyingSigner[\"modifyAndSignTransactions\"]>\n>;\n\nconst requireFeature = <T>(wallet: WalletStandardWallet, name: string): T => {\n\tconst feature = (wallet.features as Record<string, unknown>)[name];\n\tif (!feature)\n\t\tthrow new KheopskitError(\n\t\t\t\"FEATURE_NOT_SUPPORTED\",\n\t\t\t`wallet \"${wallet.name}\" does not support ${name}`,\n\t\t);\n\treturn feature as T;\n};\n\n/**\n * Builds a {@link SolanaSigner} backed by a Wallet Standard wallet's\n * `solana:*` features (injected wallets).\n *\n * Transactions are exchanged as wire bytes; messages and signatures as raw\n * bytes. Calling a method whose feature the wallet does not advertise throws.\n */\nexport const createInjectedSolanaSigner = (\n\twallet: WalletStandardWallet,\n\taccount: WalletAccount,\n\tchain: SolanaChainId,\n): SolanaSigner => {\n\tconst signerAddress = address(account.address);\n\n\treturn {\n\t\taddress: signerAddress,\n\t\tmodifyAndSignMessages: async (messages) => {\n\t\t\tconst feature = requireFeature<SignMessageApi>(\n\t\t\t\twallet,\n\t\t\t\tSOLANA_SIGN_MESSAGE,\n\t\t\t);\n\t\t\tconst outputs = await feature.signMessage(\n\t\t\t\t...messages.map((m) => ({ account, message: m.content })),\n\t\t\t);\n\t\t\treturn messages.map((m, i) => {\n\t\t\t\tconst output = outputs[i];\n\t\t\t\tif (!output) throw new Error(\"[kheopskit] missing signMessage output\");\n\t\t\t\treturn {\n\t\t\t\t\tcontent: output.signedMessage,\n\t\t\t\t\tsignatures: {\n\t\t\t\t\t\t...m.signatures,\n\t\t\t\t\t\t[signerAddress]: output.signature as SignatureBytes,\n\t\t\t\t\t},\n\t\t\t\t} satisfies SignableMessage;\n\t\t\t});\n\t\t},\n\t\tmodifyAndSignTransactions: async (transactions) => {\n\t\t\tconst feature = requireFeature<SignTransactionApi>(\n\t\t\t\twallet,\n\t\t\t\tSOLANA_SIGN_TRANSACTION,\n\t\t\t);\n\t\t\tconst encoder = getTransactionEncoder();\n\t\t\tconst decoder = getTransactionDecoder();\n\t\t\tconst outputs = await feature.signTransaction(\n\t\t\t\t...transactions.map((tx) => ({\n\t\t\t\t\taccount,\n\t\t\t\t\ttransaction: new Uint8Array(encoder.encode(tx)),\n\t\t\t\t\tchain,\n\t\t\t\t})),\n\t\t\t);\n\t\t\treturn transactions.map((_tx, i) => {\n\t\t\t\tconst output = outputs[i];\n\t\t\t\tif (!output)\n\t\t\t\t\tthrow new Error(\"[kheopskit] missing signTransaction output\");\n\t\t\t\treturn decoder.decode(output.signedTransaction);\n\t\t\t}) as unknown as SignedTransactions;\n\t\t},\n\t\tsignAndSendTransactions: async (transactions) => {\n\t\t\tconst feature = requireFeature<SignAndSendApi>(\n\t\t\t\twallet,\n\t\t\t\tSOLANA_SIGN_AND_SEND_TRANSACTION,\n\t\t\t);\n\t\t\tconst encoder = getTransactionEncoder();\n\t\t\tconst outputs = await feature.signAndSendTransaction(\n\t\t\t\t...transactions.map((tx) => ({\n\t\t\t\t\taccount,\n\t\t\t\t\ttransaction: new Uint8Array(encoder.encode(tx)),\n\t\t\t\t\tchain,\n\t\t\t\t})),\n\t\t\t);\n\t\t\treturn outputs.map((output) => output.signature as SignatureBytes);\n\t\t},\n\t};\n};\n\n/**\n * Builds a {@link SolanaSigner} backed by a WalletConnect session, adapting the\n * `solana_*` RPC methods to the same interface as the injected signer.\n *\n * The CAIP-2 chain id is derived from {@link SolanaChainId}; transactions are\n * base64-encoded and messages/signatures base58-encoded, per the WalletConnect\n * Solana spec.\n */\nexport const createWalletConnectSolanaSigner = (\n\tprovider: WalletConnectProvider,\n\taccountAddress: string,\n\tchain: SolanaChainId,\n): SolanaSigner => {\n\tconst signerAddress = address(accountAddress);\n\n\tconst request = <T>(method: string, params: unknown): Promise<T> => {\n\t\tif (!provider.session)\n\t\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\t\t// Resolved lazily (not at signer construction) so building a signer for a\n\t\t// cluster without a CAIP-2 id (e.g. localnet) doesn't throw until a request\n\t\t// is actually attempted.\n\t\treturn provider.client.request<T>({\n\t\t\ttopic: provider.session.topic,\n\t\t\tchainId: getSolanaCaip2(chain),\n\t\t\trequest: { method, params },\n\t\t});\n\t};\n\n\treturn {\n\t\taddress: signerAddress,\n\t\tmodifyAndSignMessages: async (messages) => {\n\t\t\t// @solana/kit naming is the inverse of the value direction here: a\n\t\t\t// Decoder turns bytes -> string (so `toBase58` produces a base58 string),\n\t\t\t// an Encoder turns string -> bytes (so `fromBase58` parses one).\n\t\t\tconst toBase58 = getBase58Decoder();\n\t\t\tconst fromBase58 = getBase58Encoder();\n\t\t\treturn Promise.all(\n\t\t\t\tmessages.map(async (m) => {\n\t\t\t\t\tconst { signature } = await request<{ signature: string }>(\n\t\t\t\t\t\t\"solana_signMessage\",\n\t\t\t\t\t\t{ pubkey: accountAddress, message: toBase58.decode(m.content) },\n\t\t\t\t\t);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: m.content,\n\t\t\t\t\t\tsignatures: {\n\t\t\t\t\t\t\t...m.signatures,\n\t\t\t\t\t\t\t[signerAddress]: fromBase58.encode(signature) as SignatureBytes,\n\t\t\t\t\t\t},\n\t\t\t\t\t} satisfies SignableMessage;\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tmodifyAndSignTransactions: async (transactions) => {\n\t\t\tconst encoder = getTransactionEncoder();\n\t\t\tconst decoder = getTransactionDecoder();\n\t\t\tconst toBase64 = getBase64Decoder();\n\t\t\tconst fromBase64 = getBase64Encoder();\n\t\t\tconst fromBase58 = getBase58Encoder();\n\t\t\tconst signed = await Promise.all(\n\t\t\t\ttransactions.map(async (tx) => {\n\t\t\t\t\tconst result = await request<{\n\t\t\t\t\t\ttransaction?: string;\n\t\t\t\t\t\tsignature?: string;\n\t\t\t\t\t}>(\"solana_signTransaction\", {\n\t\t\t\t\t\ttransaction: toBase64.decode(encoder.encode(tx)),\n\t\t\t\t\t});\n\t\t\t\t\t// Wallets may return either the full signed transaction (base64)\n\t\t\t\t\t// or just the signature (base58) to merge into the original.\n\t\t\t\t\tif (result.transaction)\n\t\t\t\t\t\treturn decoder.decode(fromBase64.encode(result.transaction));\n\t\t\t\t\tif (result.signature)\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...tx,\n\t\t\t\t\t\t\tsignatures: {\n\t\t\t\t\t\t\t\t...tx.signatures,\n\t\t\t\t\t\t\t\t[signerAddress]: fromBase58.encode(\n\t\t\t\t\t\t\t\t\tresult.signature,\n\t\t\t\t\t\t\t\t) as SignatureBytes,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"[kheopskit] solana_signTransaction returned no transaction or signature\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t);\n\t\t\treturn signed as unknown as SignedTransactions;\n\t\t},\n\t\tsignAndSendTransactions: async (transactions) => {\n\t\t\tconst encoder = getTransactionEncoder();\n\t\t\tconst toBase64 = getBase64Decoder();\n\t\t\tconst fromBase58 = getBase58Encoder();\n\t\t\treturn Promise.all(\n\t\t\t\ttransactions.map(async (tx) => {\n\t\t\t\t\tconst { signature } = await request<{ signature: string }>(\n\t\t\t\t\t\t\"solana_signAndSendTransaction\",\n\t\t\t\t\t\t{ transaction: toBase64.decode(encoder.encode(tx)) },\n\t\t\t\t\t);\n\t\t\t\t\treturn fromBase58.encode(signature) as SignatureBytes;\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t};\n};\n","import type { StandardEventsFeature } from \"@wallet-standard/features\";\nimport { Observable, of, shareReplay } from \"rxjs\";\nimport { getWalletAccountId } from \"../../utils\";\nimport { getCachedObservable$ } from \"../../utils/getCachedObservable\";\nimport {\n\tcreatePlatformAccounts$,\n\tgetCaip10Addresses,\n\tgetSessionCaip10s,\n\tgetWalletConnectSessionAccounts$,\n\ttype LiveWalletConnectWallet,\n} from \"../platformAccounts\";\nimport type { WalletConnectWallet } from \"../types\";\nimport { getSolanaChainIdFromCaip2, type SolanaChainId } from \"./chains\";\nimport {\n\tcreateInjectedSolanaSigner,\n\tcreateWalletConnectSolanaSigner,\n} from \"./signer\";\nimport type {\n\tSolanaAccount,\n\tSolanaInjectedWallet,\n\tSolanaWallet,\n} from \"./types\";\n\ntype StandardEventsApi = StandardEventsFeature[\"standard:events\"];\n\nconst getInjectedWalletAccounts$ = (\n\twallet: SolanaInjectedWallet,\n\tchain: SolanaChainId,\n): Observable<SolanaAccount[]> => {\n\tif (!wallet.isConnected) return of([]);\n\n\treturn getCachedObservable$(`accounts:${wallet.id}:${chain}`, () =>\n\t\tnew Observable<SolanaAccount[]>((subscriber) => {\n\t\t\tconst standardWallet = wallet.wallet;\n\n\t\t\tconst buildAccounts = (): SolanaAccount[] =>\n\t\t\t\tstandardWallet.accounts.map(\n\t\t\t\t\t(account): SolanaAccount => ({\n\t\t\t\t\t\tid: getWalletAccountId(wallet.id, account.address),\n\t\t\t\t\t\tplatform: \"solana\",\n\t\t\t\t\t\taddress: account.address,\n\t\t\t\t\t\tchains: wallet.chains,\n\t\t\t\t\t\tsigner: createInjectedSolanaSigner(standardWallet, account, chain),\n\t\t\t\t\t\tgetSigner: (c) =>\n\t\t\t\t\t\t\tcreateInjectedSolanaSigner(standardWallet, account, c),\n\t\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\tsubscriber.next(buildAccounts());\n\n\t\t\t// Re-emit when the wallet's authorized accounts change.\n\t\t\tconst eventsFeature = (\n\t\t\t\tstandardWallet.features as Record<string, unknown>\n\t\t\t)[\"standard:events\"] as StandardEventsApi | undefined;\n\t\t\tconst off = eventsFeature?.on(\"change\", () =>\n\t\t\t\tsubscriber.next(buildAccounts()),\n\t\t\t);\n\n\t\t\treturn () => {\n\t\t\t\toff?.();\n\t\t\t};\n\t\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 })),\n\t);\n};\n\nconst getWalletConnectAccounts$ = (\n\twallet: LiveWalletConnectWallet,\n\tchain: SolanaChainId,\n): Observable<SolanaAccount[]> =>\n\tgetWalletConnectSessionAccounts$({\n\t\twallet,\n\t\tplatform: \"solana\",\n\t\tnamespace: \"solana\",\n\t\tcacheKey: `accounts:${wallet.id}:solana:${chain}`,\n\t\tbuildAccounts: (provider) => {\n\t\t\tconst session = provider.session;\n\t\t\tif (!session) return [];\n\n\t\t\tconst solanaCaip10s = getSessionCaip10s(session, \"solana\");\n\t\t\tconst addresses = getCaip10Addresses(solanaCaip10s);\n\n\t\t\t// Clusters the session actually advertises (\"solana:<chainRef>\" from\n\t\t\t// each CAIP-10 entry), mapped back to SolanaChainId. Falls back to the\n\t\t\t// configured chain when none are recognised.\n\t\t\tconst advertisedChains = [\n\t\t\t\t...new Set(\n\t\t\t\t\tsolanaCaip10s\n\t\t\t\t\t\t.map((account) => account.split(\":\").slice(0, 2).join(\":\"))\n\t\t\t\t\t\t.map(getSolanaChainIdFromCaip2)\n\t\t\t\t\t\t.filter((c): c is SolanaChainId => !!c),\n\t\t\t\t),\n\t\t\t];\n\t\t\tconst chains = advertisedChains.length ? advertisedChains : [chain];\n\n\t\t\treturn addresses.map(\n\t\t\t\t(accountAddress): SolanaAccount => ({\n\t\t\t\t\tid: getWalletAccountId(wallet.id, accountAddress),\n\t\t\t\t\tplatform: \"solana\",\n\t\t\t\t\taddress: accountAddress,\n\t\t\t\t\tchains,\n\t\t\t\t\tsigner: createWalletConnectSolanaSigner(\n\t\t\t\t\t\tprovider,\n\t\t\t\t\t\taccountAddress,\n\t\t\t\t\t\tchain,\n\t\t\t\t\t),\n\t\t\t\t\tgetSigner: (c) =>\n\t\t\t\t\t\tcreateWalletConnectSolanaSigner(provider, accountAddress, c),\n\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t});\n\nexport const getSolanaAccounts$ = (\n\tsolanaWallets$: Observable<(SolanaWallet | WalletConnectWallet)[]>,\n\tsolanaChain: SolanaChainId,\n) =>\n\tcreatePlatformAccounts$({\n\t\twallets$: solanaWallets$,\n\t\tgetInjectedAccounts$: (wallet) =>\n\t\t\tgetInjectedWalletAccounts$(wallet, solanaChain),\n\t\tgetWalletConnectAccounts$: (wallet) =>\n\t\t\tgetWalletConnectAccounts$(wallet, solanaChain),\n\t\t// Re-emit when the advertised clusters change, not just on id changes.\n\t\taccountChangeKey: (account) => `${account.id}|${account.chains.join(\",\")}`,\n\t});\n","import { getWallets } from \"@wallet-standard/app\";\nimport type { Wallet as WalletStandardWallet } from \"@wallet-standard/base\";\nimport type {\n\tStandardConnectFeature,\n\tStandardDisconnectFeature,\n} from \"@wallet-standard/features\";\nimport { Observable, shareReplay } from \"rxjs\";\nimport { clearCachedObservablesByPrefix } from \"../../utils/getCachedObservable\";\nimport { getWalletId } from \"../../utils/WalletId\";\nimport {\n\tisEip1193UserRejection,\n\tisRefusalMessage,\n\tKheopskitError,\n} from \"../errors\";\nimport { createInjectedWallets$ } from \"../injectedWallets\";\nimport type { KheopskitStore } from \"../store\";\nimport { isSolanaChainId, type SolanaChainId } from \"./chains\";\nimport type { SolanaInjectedWallet } from \"./types\";\n\ntype ConnectApi = StandardConnectFeature[\"standard:connect\"];\ntype DisconnectApi = StandardDisconnectFeature[\"standard:disconnect\"];\n\nconst SOLANA_NAMESPACE_PREFIX = \"solana:\";\n\n/** A Wallet Standard wallet is Solana-capable if it advertises a solana chain or feature. */\nconst isSolanaWallet = (wallet: WalletStandardWallet): boolean =>\n\twallet.chains.some((chain) => chain.startsWith(SOLANA_NAMESPACE_PREFIX)) ||\n\tObject.keys(wallet.features).some((feature) =>\n\t\tfeature.startsWith(SOLANA_NAMESPACE_PREFIX),\n\t);\n\nconst getSolanaChains = (wallet: WalletStandardWallet): SolanaChainId[] =>\n\twallet.chains.filter((chain): chain is SolanaChainId =>\n\t\tisSolanaChainId(chain),\n\t);\n\n/**\n * Observable of Solana-capable Wallet Standard wallets, updated as wallets\n * register/unregister. Returns an empty array during SSR.\n */\nconst walletStandardWallets$ = new Observable<readonly WalletStandardWallet[]>(\n\t(subscriber) => {\n\t\t// Guard against SSR - the Wallet Standard registry requires browser APIs\n\t\tif (typeof window === \"undefined\") {\n\t\t\tsubscriber.next([]);\n\t\t\treturn () => {};\n\t\t}\n\n\t\tconst { get, on } = getWallets();\n\t\tconst emit = () => subscriber.next(get().filter(isSolanaWallet));\n\n\t\temit();\n\n\t\tconst offRegister = on(\"register\", emit);\n\t\tconst offUnregister = on(\"unregister\", emit);\n\n\t\treturn () => {\n\t\t\toffRegister();\n\t\t\toffUnregister();\n\t\t};\n\t},\n).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n\n// The shared WalletConnect connector is emitted once by core (see\n// `getWallets$`), not per platform — so this returns only injected wallets.\nexport const getSolanaWallets$ = (store: KheopskitStore) =>\n\tcreateInjectedWallets$<WalletStandardWallet, SolanaInjectedWallet>(store, {\n\t\tsources$: walletStandardWallets$,\n\t\tgetWalletId: (wallet) => getWalletId(\"solana\", wallet.name),\n\t\tconnect: async (wallet, walletId) => {\n\t\t\tconst feature = (wallet.features as Record<string, unknown>)[\n\t\t\t\t\"standard:connect\"\n\t\t\t] as ConnectApi | undefined;\n\t\t\tif (!feature)\n\t\t\t\tthrow new KheopskitError(\n\t\t\t\t\t\"FEATURE_NOT_SUPPORTED\",\n\t\t\t\t\t`wallet ${walletId} does not support standard:connect`,\n\t\t\t\t\t{ walletId },\n\t\t\t\t);\n\n\t\t\tawait feature.connect();\n\t\t},\n\t\tisUserRejection: (error) =>\n\t\t\tisEip1193UserRejection(error) || isRefusalMessage(error),\n\t\t// standard:disconnect is an optional feature. Await it when present so a\n\t\t// failed disconnect rejects the returned promise; if absent we still\n\t\t// clear local state.\n\t\tdisconnect: async (wallet) => {\n\t\t\tconst feature = (wallet.features as Record<string, unknown>)[\n\t\t\t\t\"standard:disconnect\"\n\t\t\t] as DisconnectApi | undefined;\n\t\t\tawait feature?.disconnect();\n\t\t},\n\t\t// Drop cached account observables for this wallet so a later reconnect\n\t\t// rebuilds them against the current wallet handle, not a stale closure.\n\t\tonDisconnected: (walletId) =>\n\t\t\tclearCachedObservablesByPrefix(`accounts:${walletId}:`),\n\t\tbuildWallet: ({\n\t\t\tsource: wallet,\n\t\t\twalletId,\n\t\t\tstatus,\n\t\t\terror,\n\t\t\tisConnected,\n\t\t\tconnect,\n\t\t\tdisconnect,\n\t\t}) => ({\n\t\t\tplatform: \"solana\",\n\t\t\ttype: \"injected\",\n\t\t\tid: walletId,\n\t\t\tsourceId: wallet.name,\n\t\t\twallet,\n\t\t\tchains: getSolanaChains(wallet),\n\t\t\tname: wallet.name,\n\t\t\ticon: wallet.icon,\n\t\t\tstatus,\n\t\t\terror,\n\t\t\tisConnected,\n\t\t\tconnect,\n\t\t\tdisconnect,\n\t\t}),\n\t});\n","import type { KheopskitPlatform, PlatformContext } from \"../types\";\nimport { getSolanaAccounts$ } from \"./accounts\";\nimport {\n\tDEFAULT_SOLANA_CHAIN,\n\tisSolanaChainId,\n\ttype SolanaChainId,\n} from \"./chains\";\nimport type { SolanaAccount, SolanaWallet } from \"./types\";\nimport { getSolanaWallets$ } from \"./wallets\";\n\nexport type SolanaPluginOptions = {\n\t/**\n\t * Solana cluster that account signers target. Each account also exposes a\n\t * `getSigner(chain)` factory for targeting another cluster.\n\t *\n\t * @default \"solana:mainnet\"\n\t */\n\tchain?: SolanaChainId;\n};\n\n/**\n * Solana platform plugin. Pass to `getKheopskit$({ platforms: [solana()] })`.\n *\n * @example\n * ```ts\n * import { solana } from \"@kheopskit/core/solana\";\n * solana({ chain: \"solana:mainnet\" });\n * ```\n */\nexport const solana = (\n\toptions: SolanaPluginOptions = {},\n): KheopskitPlatform<\"solana\", SolanaWallet, SolanaAccount> => {\n\tconst chain = options.chain ?? DEFAULT_SOLANA_CHAIN;\n\n\tif (!isSolanaChainId(chain)) {\n\t\tconsole.warn(\n\t\t\t`[kheopskit] Unknown solana chain: ${JSON.stringify(chain)}. Valid values: \"solana:mainnet\", \"solana:devnet\", \"solana:testnet\", \"solana:localnet\".`,\n\t\t);\n\t}\n\n\treturn {\n\t\tplatform: \"solana\",\n\t\tgetWallets$: (ctx: PlatformContext) => getSolanaWallets$(ctx.store),\n\t\tgetAccounts$: (wallets$) => getSolanaAccounts$(wallets$, chain),\n\t};\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"solana.js","names":["KheopskitError","KheopskitError","address","getTransactionEncoder","getTransactionDecoder","getBase58Decoder","getBase58Encoder","getBase64Decoder","getBase64Encoder","of","getCachedObservable$","Observable","getWalletAccountId","shareReplay","getWalletConnectSessionAccounts$","getSessionCaip10s","getCaip10Addresses","createPlatformAccounts$","Observable","getWallets","shareReplay","createInjectedWallets$","getWalletId","KheopskitError","isEip1193UserRejection","isRefusalMessage","clearCachedObservablesByPrefix"],"sources":["../src/api/solana/chains.ts","../src/api/solana/signer.ts","../src/api/solana/accounts.ts","../src/api/solana/wallets.ts","../src/api/solana/plugin.ts"],"sourcesContent":["import { KheopskitError } from \"../errors\";\n\n/**\n * Wallet Standard chain identifiers for Solana clusters.\n *\n * These are the values wallets advertise in their `chains` arrays and the\n * values kheopskit accepts in `solana({ chain })`.\n *\n * @see https://github.com/anza-xyz/wallet-standard\n */\nexport type SolanaChainId =\n\t| \"solana:mainnet\"\n\t| \"solana:devnet\"\n\t| \"solana:testnet\"\n\t| \"solana:localnet\";\n\nexport const DEFAULT_SOLANA_CHAIN: SolanaChainId = \"solana:mainnet\";\n\nconst SOLANA_CHAIN_IDS = [\n\t\"solana:mainnet\",\n\t\"solana:devnet\",\n\t\"solana:testnet\",\n\t\"solana:localnet\",\n] as const satisfies SolanaChainId[];\n\nexport const isSolanaChainId = (value: unknown): value is SolanaChainId =>\n\ttypeof value === \"string\" &&\n\t(SOLANA_CHAIN_IDS as readonly string[]).includes(value);\n\n/**\n * Maps Wallet Standard chain ids to the CAIP-2 chain ids used by WalletConnect.\n *\n * CAIP-2 ids use the first 32 characters of the cluster's genesis hash as the\n * reference. The values below match `@reown/appkit/networks` (solana,\n * solanaDevnet, solanaTestnet), which is what AppKit puts in session namespaces.\n *\n * `localnet` has no canonical CAIP-2 id and cannot be used over WalletConnect.\n */\nconst SOLANA_CHAIN_TO_CAIP2 = {\n\t\"solana:mainnet\": \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n\t\"solana:devnet\": \"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\",\n\t\"solana:testnet\": \"solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z\",\n} as const satisfies Partial<Record<SolanaChainId, string>>;\n\n/**\n * Returns the CAIP-2 chain id for a Solana chain, for use in WalletConnect\n * requests and when reading WalletConnect session namespaces.\n *\n * @throws if the chain has no canonical CAIP-2 id (e.g. localnet)\n */\nexport const getSolanaCaip2 = (chain: SolanaChainId): string => {\n\tconst caip2 = (SOLANA_CHAIN_TO_CAIP2 as Record<string, string | undefined>)[\n\t\tchain\n\t];\n\tif (!caip2)\n\t\tthrow new KheopskitError(\n\t\t\t\"UNSUPPORTED_CHAIN\",\n\t\t\t`Solana chain \"${chain}\" cannot be used over WalletConnect (no CAIP-2 id).`,\n\t\t);\n\treturn caip2;\n};\n\n/**\n * AppKit's *deprecated* CAIP-2 cluster ids (its `deprecatedCaipNetworkId`\n * values). Some wallets still place accounts in the WC session under these, so\n * map them back to a {@link SolanaChainId} instead of silently falling back to\n * the configured chain. Requests always use the current ids from\n * {@link SOLANA_CHAIN_TO_CAIP2}; testnet has no deprecated id.\n */\nconst DEPRECATED_CAIP2_TO_SOLANA_CHAIN: Record<string, SolanaChainId> = {\n\t\"solana:4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ\": \"solana:mainnet\",\n\t\"solana:8E9rvCKLFQia2Y35HXjjpWzj8weVo44K\": \"solana:devnet\",\n};\n\nconst CAIP2_TO_SOLANA_CHAIN: Record<string, SolanaChainId> = {\n\t...Object.fromEntries(\n\t\tObject.entries(SOLANA_CHAIN_TO_CAIP2).map(([chain, caip2]) => [\n\t\t\tcaip2,\n\t\t\tchain as SolanaChainId,\n\t\t]),\n\t),\n\t...DEPRECATED_CAIP2_TO_SOLANA_CHAIN,\n};\n\n/**\n * Maps a CAIP-2 chain id (as found in WalletConnect session namespaces) back to\n * its {@link SolanaChainId}, or `undefined` if it isn't a recognised cluster.\n */\nexport const getSolanaChainIdFromCaip2 = (\n\tcaip2: string,\n): SolanaChainId | undefined => CAIP2_TO_SOLANA_CHAIN[caip2];\n","import {\n\taddress,\n\tgetBase58Decoder,\n\tgetBase58Encoder,\n\tgetBase64Decoder,\n\tgetBase64Encoder,\n\tgetTransactionDecoder,\n\tgetTransactionEncoder,\n\ttype SignableMessage,\n\ttype SignatureBytes,\n\ttype TransactionModifyingSigner,\n} from \"@solana/kit\";\nimport type {\n\tSolanaSignAndSendTransactionFeature,\n\tSolanaSignMessageFeature,\n\tSolanaSignTransactionFeature,\n} from \"@solana/wallet-standard-features\";\nimport type {\n\tWalletAccount,\n\tWallet as WalletStandardWallet,\n} from \"@wallet-standard/base\";\nimport { KheopskitError } from \"../errors\";\nimport type { WalletConnectProvider } from \"../types\";\nimport { getSolanaCaip2, type SolanaChainId } from \"./chains\";\nimport type { SolanaSigner } from \"./types\";\n\nconst SOLANA_SIGN_MESSAGE = \"solana:signMessage\";\nconst SOLANA_SIGN_TRANSACTION = \"solana:signTransaction\";\nconst SOLANA_SIGN_AND_SEND_TRANSACTION = \"solana:signAndSendTransaction\";\n\ntype SignMessageApi = SolanaSignMessageFeature[typeof SOLANA_SIGN_MESSAGE];\ntype SignTransactionApi =\n\tSolanaSignTransactionFeature[typeof SOLANA_SIGN_TRANSACTION];\ntype SignAndSendApi =\n\tSolanaSignAndSendTransactionFeature[typeof SOLANA_SIGN_AND_SEND_TRANSACTION];\n\n/** The branded array type expected back from a transaction-modifying signer. */\ntype SignedTransactions = Awaited<\n\tReturnType<TransactionModifyingSigner[\"modifyAndSignTransactions\"]>\n>;\n\nconst requireFeature = <T>(wallet: WalletStandardWallet, name: string): T => {\n\tconst feature = (wallet.features as Record<string, unknown>)[name];\n\tif (!feature)\n\t\tthrow new KheopskitError(\n\t\t\t\"FEATURE_NOT_SUPPORTED\",\n\t\t\t`wallet \"${wallet.name}\" does not support ${name}`,\n\t\t);\n\treturn feature as T;\n};\n\n/**\n * Builds a {@link SolanaSigner} backed by a Wallet Standard wallet's\n * `solana:*` features (injected wallets).\n *\n * Transactions are exchanged as wire bytes; messages and signatures as raw\n * bytes. Calling a method whose feature the wallet does not advertise throws.\n */\nexport const createInjectedSolanaSigner = (\n\twallet: WalletStandardWallet,\n\taccount: WalletAccount,\n\tchain: SolanaChainId,\n): SolanaSigner => {\n\tconst signerAddress = address(account.address);\n\n\treturn {\n\t\taddress: signerAddress,\n\t\tmodifyAndSignMessages: async (messages) => {\n\t\t\tconst feature = requireFeature<SignMessageApi>(\n\t\t\t\twallet,\n\t\t\t\tSOLANA_SIGN_MESSAGE,\n\t\t\t);\n\t\t\tconst outputs = await feature.signMessage(\n\t\t\t\t...messages.map((m) => ({ account, message: m.content })),\n\t\t\t);\n\t\t\treturn messages.map((m, i) => {\n\t\t\t\tconst output = outputs[i];\n\t\t\t\tif (!output) throw new Error(\"[kheopskit] missing signMessage output\");\n\t\t\t\treturn {\n\t\t\t\t\tcontent: output.signedMessage,\n\t\t\t\t\tsignatures: {\n\t\t\t\t\t\t...m.signatures,\n\t\t\t\t\t\t[signerAddress]: output.signature as SignatureBytes,\n\t\t\t\t\t},\n\t\t\t\t} satisfies SignableMessage;\n\t\t\t});\n\t\t},\n\t\tmodifyAndSignTransactions: async (transactions) => {\n\t\t\tconst feature = requireFeature<SignTransactionApi>(\n\t\t\t\twallet,\n\t\t\t\tSOLANA_SIGN_TRANSACTION,\n\t\t\t);\n\t\t\tconst encoder = getTransactionEncoder();\n\t\t\tconst decoder = getTransactionDecoder();\n\t\t\tconst outputs = await feature.signTransaction(\n\t\t\t\t...transactions.map((tx) => ({\n\t\t\t\t\taccount,\n\t\t\t\t\ttransaction: new Uint8Array(encoder.encode(tx)),\n\t\t\t\t\tchain,\n\t\t\t\t})),\n\t\t\t);\n\t\t\treturn transactions.map((_tx, i) => {\n\t\t\t\tconst output = outputs[i];\n\t\t\t\tif (!output)\n\t\t\t\t\tthrow new Error(\"[kheopskit] missing signTransaction output\");\n\t\t\t\treturn decoder.decode(output.signedTransaction);\n\t\t\t}) as unknown as SignedTransactions;\n\t\t},\n\t\tsignAndSendTransactions: async (transactions) => {\n\t\t\tconst feature = requireFeature<SignAndSendApi>(\n\t\t\t\twallet,\n\t\t\t\tSOLANA_SIGN_AND_SEND_TRANSACTION,\n\t\t\t);\n\t\t\tconst encoder = getTransactionEncoder();\n\t\t\tconst outputs = await feature.signAndSendTransaction(\n\t\t\t\t...transactions.map((tx) => ({\n\t\t\t\t\taccount,\n\t\t\t\t\ttransaction: new Uint8Array(encoder.encode(tx)),\n\t\t\t\t\tchain,\n\t\t\t\t})),\n\t\t\t);\n\t\t\treturn outputs.map((output) => output.signature as SignatureBytes);\n\t\t},\n\t};\n};\n\n/**\n * Builds a {@link SolanaSigner} backed by a WalletConnect session, adapting the\n * `solana_*` RPC methods to the same interface as the injected signer.\n *\n * The CAIP-2 chain id is derived from {@link SolanaChainId}; transactions are\n * base64-encoded and messages/signatures base58-encoded, per the WalletConnect\n * Solana spec.\n */\nexport const createWalletConnectSolanaSigner = (\n\tprovider: WalletConnectProvider,\n\taccountAddress: string,\n\tchain: SolanaChainId,\n): SolanaSigner => {\n\tconst signerAddress = address(accountAddress);\n\n\tconst request = <T>(method: string, params: unknown): Promise<T> => {\n\t\tif (!provider.session)\n\t\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\t\t// Resolved lazily (not at signer construction) so building a signer for a\n\t\t// cluster without a CAIP-2 id (e.g. localnet) doesn't throw until a request\n\t\t// is actually attempted.\n\t\treturn provider.client.request<T>({\n\t\t\ttopic: provider.session.topic,\n\t\t\tchainId: getSolanaCaip2(chain),\n\t\t\trequest: { method, params },\n\t\t});\n\t};\n\n\treturn {\n\t\taddress: signerAddress,\n\t\tmodifyAndSignMessages: async (messages) => {\n\t\t\t// @solana/kit naming is the inverse of the value direction here: a\n\t\t\t// Decoder turns bytes -> string (so `toBase58` produces a base58 string),\n\t\t\t// an Encoder turns string -> bytes (so `fromBase58` parses one).\n\t\t\tconst toBase58 = getBase58Decoder();\n\t\t\tconst fromBase58 = getBase58Encoder();\n\t\t\treturn Promise.all(\n\t\t\t\tmessages.map(async (m) => {\n\t\t\t\t\tconst { signature } = await request<{ signature: string }>(\n\t\t\t\t\t\t\"solana_signMessage\",\n\t\t\t\t\t\t{ pubkey: accountAddress, message: toBase58.decode(m.content) },\n\t\t\t\t\t);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: m.content,\n\t\t\t\t\t\tsignatures: {\n\t\t\t\t\t\t\t...m.signatures,\n\t\t\t\t\t\t\t[signerAddress]: fromBase58.encode(signature) as SignatureBytes,\n\t\t\t\t\t\t},\n\t\t\t\t\t} satisfies SignableMessage;\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tmodifyAndSignTransactions: async (transactions) => {\n\t\t\tconst encoder = getTransactionEncoder();\n\t\t\tconst decoder = getTransactionDecoder();\n\t\t\tconst toBase64 = getBase64Decoder();\n\t\t\tconst fromBase64 = getBase64Encoder();\n\t\t\tconst fromBase58 = getBase58Encoder();\n\t\t\tconst signed = await Promise.all(\n\t\t\t\ttransactions.map(async (tx) => {\n\t\t\t\t\tconst result = await request<{\n\t\t\t\t\t\ttransaction?: string;\n\t\t\t\t\t\tsignature?: string;\n\t\t\t\t\t}>(\"solana_signTransaction\", {\n\t\t\t\t\t\ttransaction: toBase64.decode(encoder.encode(tx)),\n\t\t\t\t\t});\n\t\t\t\t\t// Wallets may return either the full signed transaction (base64)\n\t\t\t\t\t// or just the signature (base58) to merge into the original.\n\t\t\t\t\tif (result.transaction)\n\t\t\t\t\t\treturn decoder.decode(fromBase64.encode(result.transaction));\n\t\t\t\t\tif (result.signature)\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...tx,\n\t\t\t\t\t\t\tsignatures: {\n\t\t\t\t\t\t\t\t...tx.signatures,\n\t\t\t\t\t\t\t\t[signerAddress]: fromBase58.encode(\n\t\t\t\t\t\t\t\t\tresult.signature,\n\t\t\t\t\t\t\t\t) as SignatureBytes,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"[kheopskit] solana_signTransaction returned no transaction or signature\",\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t);\n\t\t\treturn signed as unknown as SignedTransactions;\n\t\t},\n\t\tsignAndSendTransactions: async (transactions) => {\n\t\t\tconst encoder = getTransactionEncoder();\n\t\t\tconst toBase64 = getBase64Decoder();\n\t\t\tconst fromBase58 = getBase58Encoder();\n\t\t\treturn Promise.all(\n\t\t\t\ttransactions.map(async (tx) => {\n\t\t\t\t\tconst { signature } = await request<{ signature: string }>(\n\t\t\t\t\t\t\"solana_signAndSendTransaction\",\n\t\t\t\t\t\t{ transaction: toBase64.decode(encoder.encode(tx)) },\n\t\t\t\t\t);\n\t\t\t\t\treturn fromBase58.encode(signature) as SignatureBytes;\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t};\n};\n","import type { StandardEventsFeature } from \"@wallet-standard/features\";\nimport { Observable, of, shareReplay } from \"rxjs\";\nimport { getWalletAccountId } from \"../../utils\";\nimport { getCachedObservable$ } from \"../../utils/getCachedObservable\";\nimport {\n\tcreatePlatformAccounts$,\n\tgetCaip10Addresses,\n\tgetSessionCaip10s,\n\tgetWalletConnectSessionAccounts$,\n\ttype LiveWalletConnectWallet,\n} from \"../platformAccounts\";\nimport type { WalletConnectWallet } from \"../types\";\nimport { getSolanaChainIdFromCaip2, type SolanaChainId } from \"./chains\";\nimport {\n\tcreateInjectedSolanaSigner,\n\tcreateWalletConnectSolanaSigner,\n} from \"./signer\";\nimport type {\n\tSolanaAccount,\n\tSolanaInjectedWallet,\n\tSolanaWallet,\n} from \"./types\";\n\ntype StandardEventsApi = StandardEventsFeature[\"standard:events\"];\n\nconst getInjectedWalletAccounts$ = (\n\twallet: SolanaInjectedWallet,\n\tchain: SolanaChainId,\n): Observable<SolanaAccount[]> => {\n\tif (!wallet.isConnected) return of([]);\n\n\treturn getCachedObservable$(`accounts:${wallet.id}:${chain}`, () =>\n\t\tnew Observable<SolanaAccount[]>((subscriber) => {\n\t\t\tconst standardWallet = wallet.wallet;\n\n\t\t\tconst buildAccounts = (): SolanaAccount[] =>\n\t\t\t\tstandardWallet.accounts.map(\n\t\t\t\t\t(account): SolanaAccount => ({\n\t\t\t\t\t\tid: getWalletAccountId(wallet.id, account.address),\n\t\t\t\t\t\tplatform: \"solana\",\n\t\t\t\t\t\taddress: account.address,\n\t\t\t\t\t\tchains: wallet.chains,\n\t\t\t\t\t\tsigner: createInjectedSolanaSigner(standardWallet, account, chain),\n\t\t\t\t\t\tgetSigner: (c) =>\n\t\t\t\t\t\t\tcreateInjectedSolanaSigner(standardWallet, account, c),\n\t\t\t\t\t\tname: account.label,\n\t\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\tsubscriber.next(buildAccounts());\n\n\t\t\t// Re-emit when the wallet's authorized accounts change.\n\t\t\tconst eventsFeature = (\n\t\t\t\tstandardWallet.features as Record<string, unknown>\n\t\t\t)[\"standard:events\"] as StandardEventsApi | undefined;\n\t\t\tconst off = eventsFeature?.on(\"change\", () =>\n\t\t\t\tsubscriber.next(buildAccounts()),\n\t\t\t);\n\n\t\t\treturn () => {\n\t\t\t\toff?.();\n\t\t\t};\n\t\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 })),\n\t);\n};\n\nconst getWalletConnectAccounts$ = (\n\twallet: LiveWalletConnectWallet,\n\tchain: SolanaChainId,\n): Observable<SolanaAccount[]> =>\n\tgetWalletConnectSessionAccounts$({\n\t\twallet,\n\t\tplatform: \"solana\",\n\t\tnamespace: \"solana\",\n\t\tcacheKey: `accounts:${wallet.id}:solana:${chain}`,\n\t\tbuildAccounts: (provider) => {\n\t\t\tconst session = provider.session;\n\t\t\tif (!session) return [];\n\n\t\t\tconst solanaCaip10s = getSessionCaip10s(session, \"solana\");\n\t\t\tconst addresses = getCaip10Addresses(solanaCaip10s);\n\n\t\t\t// Clusters the session actually advertises (\"solana:<chainRef>\" from\n\t\t\t// each CAIP-10 entry), mapped back to SolanaChainId. Falls back to the\n\t\t\t// configured chain when none are recognised.\n\t\t\tconst advertisedChains = [\n\t\t\t\t...new Set(\n\t\t\t\t\tsolanaCaip10s\n\t\t\t\t\t\t.map((account) => account.split(\":\").slice(0, 2).join(\":\"))\n\t\t\t\t\t\t.map(getSolanaChainIdFromCaip2)\n\t\t\t\t\t\t.filter((c): c is SolanaChainId => !!c),\n\t\t\t\t),\n\t\t\t];\n\t\t\tconst chains = advertisedChains.length ? advertisedChains : [chain];\n\n\t\t\treturn addresses.map(\n\t\t\t\t(accountAddress): SolanaAccount => ({\n\t\t\t\t\tid: getWalletAccountId(wallet.id, accountAddress),\n\t\t\t\t\tplatform: \"solana\",\n\t\t\t\t\taddress: accountAddress,\n\t\t\t\t\tchains,\n\t\t\t\t\tsigner: createWalletConnectSolanaSigner(\n\t\t\t\t\t\tprovider,\n\t\t\t\t\t\taccountAddress,\n\t\t\t\t\t\tchain,\n\t\t\t\t\t),\n\t\t\t\t\tgetSigner: (c) =>\n\t\t\t\t\t\tcreateWalletConnectSolanaSigner(provider, accountAddress, c),\n\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t});\n\nexport const getSolanaAccounts$ = (\n\tsolanaWallets$: Observable<(SolanaWallet | WalletConnectWallet)[]>,\n\tsolanaChain: SolanaChainId,\n) =>\n\tcreatePlatformAccounts$({\n\t\twallets$: solanaWallets$,\n\t\tgetInjectedAccounts$: (wallet) =>\n\t\t\tgetInjectedWalletAccounts$(wallet, solanaChain),\n\t\tgetWalletConnectAccounts$: (wallet) =>\n\t\t\tgetWalletConnectAccounts$(wallet, solanaChain),\n\t\t// Re-emit when the advertised clusters change, not just on id changes.\n\t\taccountChangeKey: (account) => `${account.id}|${account.chains.join(\",\")}`,\n\t});\n","import { getWallets } from \"@wallet-standard/app\";\nimport type { Wallet as WalletStandardWallet } from \"@wallet-standard/base\";\nimport type {\n\tStandardConnectFeature,\n\tStandardDisconnectFeature,\n} from \"@wallet-standard/features\";\nimport { Observable, shareReplay } from \"rxjs\";\nimport { clearCachedObservablesByPrefix } from \"../../utils/getCachedObservable\";\nimport { getWalletId } from \"../../utils/WalletId\";\nimport {\n\tisEip1193UserRejection,\n\tisRefusalMessage,\n\tKheopskitError,\n} from \"../errors\";\nimport { createInjectedWallets$ } from \"../injectedWallets\";\nimport type { KheopskitStore } from \"../store\";\nimport { isSolanaChainId, type SolanaChainId } from \"./chains\";\nimport type { SolanaInjectedWallet } from \"./types\";\n\ntype ConnectApi = StandardConnectFeature[\"standard:connect\"];\ntype DisconnectApi = StandardDisconnectFeature[\"standard:disconnect\"];\n\nconst SOLANA_NAMESPACE_PREFIX = \"solana:\";\n\n/** A Wallet Standard wallet is Solana-capable if it advertises a solana chain or feature. */\nconst isSolanaWallet = (wallet: WalletStandardWallet): boolean =>\n\twallet.chains.some((chain) => chain.startsWith(SOLANA_NAMESPACE_PREFIX)) ||\n\tObject.keys(wallet.features).some((feature) =>\n\t\tfeature.startsWith(SOLANA_NAMESPACE_PREFIX),\n\t);\n\nconst getSolanaChains = (wallet: WalletStandardWallet): SolanaChainId[] =>\n\twallet.chains.filter((chain): chain is SolanaChainId =>\n\t\tisSolanaChainId(chain),\n\t);\n\n/**\n * Observable of Solana-capable Wallet Standard wallets, updated as wallets\n * register/unregister. Returns an empty array during SSR.\n */\nconst walletStandardWallets$ = new Observable<readonly WalletStandardWallet[]>(\n\t(subscriber) => {\n\t\t// Guard against SSR - the Wallet Standard registry requires browser APIs\n\t\tif (typeof window === \"undefined\") {\n\t\t\tsubscriber.next([]);\n\t\t\treturn () => {};\n\t\t}\n\n\t\tconst { get, on } = getWallets();\n\t\tconst emit = () => subscriber.next(get().filter(isSolanaWallet));\n\n\t\temit();\n\n\t\tconst offRegister = on(\"register\", emit);\n\t\tconst offUnregister = on(\"unregister\", emit);\n\n\t\treturn () => {\n\t\t\toffRegister();\n\t\t\toffUnregister();\n\t\t};\n\t},\n).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n\n// The shared WalletConnect connector is emitted once by core (see\n// `getWallets$`), not per platform — so this returns only injected wallets.\nexport const getSolanaWallets$ = (store: KheopskitStore) =>\n\tcreateInjectedWallets$<WalletStandardWallet, SolanaInjectedWallet>(store, {\n\t\tsources$: walletStandardWallets$,\n\t\tgetWalletId: (wallet) => getWalletId(\"solana\", wallet.name),\n\t\tconnect: async (wallet, walletId) => {\n\t\t\tconst feature = (wallet.features as Record<string, unknown>)[\n\t\t\t\t\"standard:connect\"\n\t\t\t] as ConnectApi | undefined;\n\t\t\tif (!feature)\n\t\t\t\tthrow new KheopskitError(\n\t\t\t\t\t\"FEATURE_NOT_SUPPORTED\",\n\t\t\t\t\t`wallet ${walletId} does not support standard:connect`,\n\t\t\t\t\t{ walletId },\n\t\t\t\t);\n\n\t\t\tawait feature.connect();\n\t\t},\n\t\tisUserRejection: (error) =>\n\t\t\tisEip1193UserRejection(error) || isRefusalMessage(error),\n\t\t// standard:disconnect is an optional feature. Await it when present so a\n\t\t// failed disconnect rejects the returned promise; if absent we still\n\t\t// clear local state.\n\t\tdisconnect: async (wallet) => {\n\t\t\tconst feature = (wallet.features as Record<string, unknown>)[\n\t\t\t\t\"standard:disconnect\"\n\t\t\t] as DisconnectApi | undefined;\n\t\t\tawait feature?.disconnect();\n\t\t},\n\t\t// Drop cached account observables for this wallet so a later reconnect\n\t\t// rebuilds them against the current wallet handle, not a stale closure.\n\t\tonDisconnected: (walletId) =>\n\t\t\tclearCachedObservablesByPrefix(`accounts:${walletId}:`),\n\t\tbuildWallet: ({\n\t\t\tsource: wallet,\n\t\t\twalletId,\n\t\t\tstatus,\n\t\t\terror,\n\t\t\tisConnected,\n\t\t\tconnect,\n\t\t\tdisconnect,\n\t\t}) => ({\n\t\t\tplatform: \"solana\",\n\t\t\ttype: \"injected\",\n\t\t\tid: walletId,\n\t\t\tsourceId: wallet.name,\n\t\t\twallet,\n\t\t\tchains: getSolanaChains(wallet),\n\t\t\tname: wallet.name,\n\t\t\ticon: wallet.icon,\n\t\t\tstatus,\n\t\t\terror,\n\t\t\tisConnected,\n\t\t\tconnect,\n\t\t\tdisconnect,\n\t\t}),\n\t});\n","import type { KheopskitPlatform, PlatformContext } from \"../types\";\nimport { getSolanaAccounts$ } from \"./accounts\";\nimport {\n\tDEFAULT_SOLANA_CHAIN,\n\tisSolanaChainId,\n\ttype SolanaChainId,\n} from \"./chains\";\nimport type { SolanaAccount, SolanaWallet } from \"./types\";\nimport { getSolanaWallets$ } from \"./wallets\";\n\nexport type SolanaPluginOptions = {\n\t/**\n\t * Solana cluster that account signers target. Each account also exposes a\n\t * `getSigner(chain)` factory for targeting another cluster.\n\t *\n\t * @default \"solana:mainnet\"\n\t */\n\tchain?: SolanaChainId;\n};\n\n/**\n * Solana platform plugin. Pass to `getKheopskit$({ platforms: [solana()] })`.\n *\n * @example\n * ```ts\n * import { solana } from \"@kheopskit/core/solana\";\n * solana({ chain: \"solana:mainnet\" });\n * ```\n */\nexport const solana = (\n\toptions: SolanaPluginOptions = {},\n): KheopskitPlatform<\"solana\", SolanaWallet, SolanaAccount> => {\n\tconst chain = options.chain ?? DEFAULT_SOLANA_CHAIN;\n\n\tif (!isSolanaChainId(chain)) {\n\t\tconsole.warn(\n\t\t\t`[kheopskit] Unknown solana chain: ${JSON.stringify(chain)}. Valid values: \"solana:mainnet\", \"solana:devnet\", \"solana:testnet\", \"solana:localnet\".`,\n\t\t);\n\t}\n\n\treturn {\n\t\tplatform: \"solana\",\n\t\tgetWallets$: (ctx: PlatformContext) => getSolanaWallets$(ctx.store),\n\t\tgetAccounts$: (wallets$) => getSolanaAccounts$(wallets$, chain),\n\t};\n};\n"],"mappings":";;;;;;;;AAgBA,MAAa,uBAAsC;AAEnD,MAAM,mBAAmB;CACxB;CACA;CACA;CACA;AACD;AAEA,MAAa,mBAAmB,UAC/B,OAAO,UAAU,YAChB,iBAAuC,SAAS,KAAK;;;;;;;;;;AAWvD,MAAM,wBAAwB;CAC7B,kBAAkB;CAClB,iBAAiB;CACjB,kBAAkB;AACnB;;;;;;;AAQA,MAAa,kBAAkB,UAAiC;CAC/D,MAAM,QAAS,sBACd;CAED,IAAI,CAAC,OACJ,MAAM,IAAIA,cAAAA,eACT,qBACA,iBAAiB,MAAM,oDACxB;CACD,OAAO;AACR;;;;;;;;AASA,MAAM,mCAAkE;CACvE,2CAA2C;CAC3C,2CAA2C;AAC5C;AAEA,MAAM,wBAAuD;CAC5D,GAAG,OAAO,YACT,OAAO,QAAQ,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAC7D,OACA,KACD,CAAC,CACF;CACA,GAAG;AACJ;;;;;AAMA,MAAa,6BACZ,UAC+B,sBAAsB;;;AChEtD,MAAM,sBAAsB;AAC5B,MAAM,0BAA0B;AAChC,MAAM,mCAAmC;AAazC,MAAM,kBAAqB,QAA8B,SAAoB;CAC5E,MAAM,UAAW,OAAO,SAAqC;CAC7D,IAAI,CAAC,SACJ,MAAM,IAAIC,cAAAA,eACT,yBACA,WAAW,OAAO,KAAK,qBAAqB,MAC7C;CACD,OAAO;AACR;;;;;;;;AASA,MAAa,8BACZ,QACA,SACA,UACkB;CAClB,MAAM,iBAAA,GAAgBC,YAAAA,QAAAA,CAAQ,QAAQ,OAAO;CAE7C,OAAO;EACN,SAAS;EACT,uBAAuB,OAAO,aAAa;GAK1C,MAAM,UAAU,MAJA,eACf,QACA,mBAE2B,CAAC,CAAC,YAC7B,GAAG,SAAS,KAAK,OAAO;IAAE;IAAS,SAAS,EAAE;GAAQ,EAAE,CACzD;GACA,OAAO,SAAS,KAAK,GAAG,MAAM;IAC7B,MAAM,SAAS,QAAQ;IACvB,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,wCAAwC;IACrE,OAAO;KACN,SAAS,OAAO;KAChB,YAAY;MACX,GAAG,EAAE;OACJ,gBAAgB,OAAO;KACzB;IACD;GACD,CAAC;EACF;EACA,2BAA2B,OAAO,iBAAiB;GAClD,MAAM,UAAU,eACf,QACA,uBACD;GACA,MAAM,WAAA,GAAUC,YAAAA,sBAAAA,CAAsB;GACtC,MAAM,WAAA,GAAUC,YAAAA,sBAAAA,CAAsB;GACtC,MAAM,UAAU,MAAM,QAAQ,gBAC7B,GAAG,aAAa,KAAK,QAAQ;IAC5B;IACA,aAAa,IAAI,WAAW,QAAQ,OAAO,EAAE,CAAC;IAC9C;GACD,EAAE,CACH;GACA,OAAO,aAAa,KAAK,KAAK,MAAM;IACnC,MAAM,SAAS,QAAQ;IACvB,IAAI,CAAC,QACJ,MAAM,IAAI,MAAM,4CAA4C;IAC7D,OAAO,QAAQ,OAAO,OAAO,iBAAiB;GAC/C,CAAC;EACF;EACA,yBAAyB,OAAO,iBAAiB;GAChD,MAAM,UAAU,eACf,QACA,gCACD;GACA,MAAM,WAAA,GAAUD,YAAAA,sBAAAA,CAAsB;GAQtC,QAAO,MAPe,QAAQ,uBAC7B,GAAG,aAAa,KAAK,QAAQ;IAC5B;IACA,aAAa,IAAI,WAAW,QAAQ,OAAO,EAAE,CAAC;IAC9C;GACD,EAAE,CACH,EAAA,CACe,KAAK,WAAW,OAAO,SAA2B;EAClE;CACD;AACD;;;;;;;;;AAUA,MAAa,mCACZ,UACA,gBACA,UACkB;CAClB,MAAM,iBAAA,GAAgBD,YAAAA,QAAAA,CAAQ,cAAc;CAE5C,MAAM,WAAc,QAAgB,WAAgC;EACnE,IAAI,CAAC,SAAS,SACb,MAAM,IAAID,cAAAA,eAAe,cAAc,kBAAkB;EAI1D,OAAO,SAAS,OAAO,QAAW;GACjC,OAAO,SAAS,QAAQ;GACxB,SAAS,eAAe,KAAK;GAC7B,SAAS;IAAE;IAAQ;GAAO;EAC3B,CAAC;CACF;CAEA,OAAO;EACN,SAAS;EACT,uBAAuB,OAAO,aAAa;GAI1C,MAAM,YAAA,GAAWI,YAAAA,iBAAAA,CAAiB;GAClC,MAAM,cAAA,GAAaC,YAAAA,iBAAAA,CAAiB;GACpC,OAAO,QAAQ,IACd,SAAS,IAAI,OAAO,MAAM;IACzB,MAAM,EAAE,cAAc,MAAM,QAC3B,sBACA;KAAE,QAAQ;KAAgB,SAAS,SAAS,OAAO,EAAE,OAAO;IAAE,CAC/D;IACA,OAAO;KACN,SAAS,EAAE;KACX,YAAY;MACX,GAAG,EAAE;OACJ,gBAAgB,WAAW,OAAO,SAAS;KAC7C;IACD;GACD,CAAC,CACF;EACD;EACA,2BAA2B,OAAO,iBAAiB;GAClD,MAAM,WAAA,GAAUH,YAAAA,sBAAAA,CAAsB;GACtC,MAAM,WAAA,GAAUC,YAAAA,sBAAAA,CAAsB;GACtC,MAAM,YAAA,GAAWG,YAAAA,iBAAAA,CAAiB;GAClC,MAAM,cAAA,GAAaC,YAAAA,iBAAAA,CAAiB;GACpC,MAAM,cAAA,GAAaF,YAAAA,iBAAAA,CAAiB;GA4BpC,OAAO,MA3Bc,QAAQ,IAC5B,aAAa,IAAI,OAAO,OAAO;IAC9B,MAAM,SAAS,MAAM,QAGlB,0BAA0B,EAC5B,aAAa,SAAS,OAAO,QAAQ,OAAO,EAAE,CAAC,EAChD,CAAC;IAGD,IAAI,OAAO,aACV,OAAO,QAAQ,OAAO,WAAW,OAAO,OAAO,WAAW,CAAC;IAC5D,IAAI,OAAO,WACV,OAAO;KACN,GAAG;KACH,YAAY;MACX,GAAG,GAAG;OACL,gBAAgB,WAAW,OAC3B,OAAO,SACR;KACD;IACD;IACD,MAAM,IAAI,MACT,yEACD;GACD,CAAC,CACF;EAED;EACA,yBAAyB,OAAO,iBAAiB;GAChD,MAAM,WAAA,GAAUH,YAAAA,sBAAAA,CAAsB;GACtC,MAAM,YAAA,GAAWI,YAAAA,iBAAAA,CAAiB;GAClC,MAAM,cAAA,GAAaD,YAAAA,iBAAAA,CAAiB;GACpC,OAAO,QAAQ,IACd,aAAa,IAAI,OAAO,OAAO;IAC9B,MAAM,EAAE,cAAc,MAAM,QAC3B,iCACA,EAAE,aAAa,SAAS,OAAO,QAAQ,OAAO,EAAE,CAAC,EAAE,CACpD;IACA,OAAO,WAAW,OAAO,SAAS;GACnC,CAAC,CACF;EACD;CACD;AACD;;;AC3MA,MAAM,8BACL,QACA,UACiC;CACjC,IAAI,CAAC,OAAO,aAAa,QAAA,GAAOG,KAAAA,GAAAA,CAAG,CAAC,CAAC;CAErC,OAAOC,cAAAA,qBAAqB,YAAY,OAAO,GAAG,GAAG,eACpD,IAAIC,KAAAA,YAA6B,eAAe;EAC/C,MAAM,iBAAiB,OAAO;EAE9B,MAAM,sBACL,eAAe,SAAS,KACtB,aAA4B;GAC5B,IAAIC,yBAAAA,mBAAmB,OAAO,IAAI,QAAQ,OAAO;GACjD,UAAU;GACV,SAAS,QAAQ;GACjB,QAAQ,OAAO;GACf,QAAQ,2BAA2B,gBAAgB,SAAS,KAAK;GACjE,YAAY,MACX,2BAA2B,gBAAgB,SAAS,CAAC;GACtD,MAAM,QAAQ;GACd,YAAY,OAAO;GACnB,UAAU,OAAO;EAClB,EACD;EAED,WAAW,KAAK,cAAc,CAAC;EAM/B,MAAM,MAFL,eAAe,SACd,kBACuB,EAAE,GAAG,gBAC7B,WAAW,KAAK,cAAc,CAAC,CAChC;EAEA,aAAa;GACZ,MAAM;EACP;CACD,CAAC,CAAC,CAAC,MAAA,GAAKC,KAAAA,YAAAA,CAAY;EAAE,UAAU;EAAM,YAAY;CAAE,CAAC,CAAC,CACvD;AACD;AAEA,MAAM,6BACL,QACA,UAEAC,yBAAAA,iCAAiC;CAChC;CACA,UAAU;CACV,WAAW;CACX,UAAU,YAAY,OAAO,GAAG,UAAU;CAC1C,gBAAgB,aAAa;EAC5B,MAAM,UAAU,SAAS;EACzB,IAAI,CAAC,SAAS,OAAO,CAAC;EAEtB,MAAM,gBAAgBC,yBAAAA,kBAAkB,SAAS,QAAQ;EACzD,MAAM,YAAYC,yBAAAA,mBAAmB,aAAa;EAKlD,MAAM,mBAAmB,CACxB,GAAG,IAAI,IACN,cACE,KAAK,YAAY,QAAQ,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAC1D,IAAI,yBAAyB,CAAC,CAC9B,QAAQ,MAA0B,CAAC,CAAC,CAAC,CACxC,CACD;EACA,MAAM,SAAS,iBAAiB,SAAS,mBAAmB,CAAC,KAAK;EAElE,OAAO,UAAU,KACf,oBAAmC;GACnC,IAAIJ,yBAAAA,mBAAmB,OAAO,IAAI,cAAc;GAChD,UAAU;GACV,SAAS;GACT;GACA,QAAQ,gCACP,UACA,gBACA,KACD;GACA,YAAY,MACX,gCAAgC,UAAU,gBAAgB,CAAC;GAC5D,YAAY,OAAO;GACnB,UAAU,OAAO;EAClB,EACD;CACD;AACD,CAAC;AAEF,MAAa,sBACZ,gBACA,gBAEAK,yBAAAA,wBAAwB;CACvB,UAAU;CACV,uBAAuB,WACtB,2BAA2B,QAAQ,WAAW;CAC/C,4BAA4B,WAC3B,0BAA0B,QAAQ,WAAW;CAE9C,mBAAmB,YAAY,GAAG,QAAQ,GAAG,GAAG,QAAQ,OAAO,KAAK,GAAG;AACxE,CAAC;;;AC3GF,MAAM,0BAA0B;;AAGhC,MAAM,kBAAkB,WACvB,OAAO,OAAO,MAAM,UAAU,MAAM,WAAW,uBAAuB,CAAC,KACvE,OAAO,KAAK,OAAO,QAAQ,CAAC,CAAC,MAAM,YAClC,QAAQ,WAAW,uBAAuB,CAC3C;AAED,MAAM,mBAAmB,WACxB,OAAO,OAAO,QAAQ,UACrB,gBAAgB,KAAK,CACtB;;;;;AAMD,MAAM,yBAAyB,IAAIC,KAAAA,YACjC,eAAe;CAEf,IAAI,OAAO,WAAW,aAAa;EAClC,WAAW,KAAK,CAAC,CAAC;EAClB,aAAa,CAAC;CACf;CAEA,MAAM,EAAE,KAAK,QAAA,GAAOC,qBAAAA,WAAAA,CAAW;CAC/B,MAAM,aAAa,WAAW,KAAK,IAAI,CAAC,CAAC,OAAO,cAAc,CAAC;CAE/D,KAAK;CAEL,MAAM,cAAc,GAAG,YAAY,IAAI;CACvC,MAAM,gBAAgB,GAAG,cAAc,IAAI;CAE3C,aAAa;EACZ,YAAY;EACZ,cAAc;CACf;AACD,CACD,CAAC,CAAC,MAAA,GAAKC,KAAAA,YAAAA,CAAY;CAAE,UAAU;CAAM,YAAY;AAAE,CAAC,CAAC;AAIrD,MAAa,qBAAqB,UACjCC,wBAAAA,uBAAmE,OAAO;CACzE,UAAU;CACV,cAAc,WAAWC,cAAAA,YAAY,UAAU,OAAO,IAAI;CAC1D,SAAS,OAAO,QAAQ,aAAa;EACpC,MAAM,UAAW,OAAO,SACvB;EAED,IAAI,CAAC,SACJ,MAAM,IAAIC,cAAAA,eACT,yBACA,UAAU,SAAS,qCACnB,EAAE,SAAS,CACZ;EAED,MAAM,QAAQ,QAAQ;CACvB;CACA,kBAAkB,UACjBC,cAAAA,uBAAuB,KAAK,KAAKC,cAAAA,iBAAiB,KAAK;CAIxD,YAAY,OAAO,WAAW;EAI7B,MAHiB,OAAO,SACvB,sBAEY,EAAE,WAAW;CAC3B;CAGA,iBAAiB,aAChBC,cAAAA,+BAA+B,YAAY,SAAS,EAAE;CACvD,cAAc,EACb,QAAQ,QACR,UACA,QACA,OACA,aACA,SACA,kBACM;EACN,UAAU;EACV,MAAM;EACN,IAAI;EACJ,UAAU,OAAO;EACjB;EACA,QAAQ,gBAAgB,MAAM;EAC9B,MAAM,OAAO;EACb,MAAM,OAAO;EACb;EACA;EACA;EACA;EACA;CACD;AACD,CAAC;;;;;;;;;;;;AC3FF,MAAa,UACZ,UAA+B,CAAC,MAC8B;CAC9D,MAAM,QAAQ,QAAQ,SAAA;CAEtB,IAAI,CAAC,gBAAgB,KAAK,GACzB,QAAQ,KACP,qCAAqC,KAAK,UAAU,KAAK,EAAE,wFAC5D;CAGD,OAAO;EACN,UAAU;EACV,cAAc,QAAyB,kBAAkB,IAAI,KAAK;EAClE,eAAe,aAAa,mBAAmB,UAAU,KAAK;CAC/D;AACD"}
|
package/dist/solana.mjs
CHANGED
|
@@ -205,6 +205,7 @@ const getInjectedWalletAccounts$ = (wallet, chain) => {
|
|
|
205
205
|
chains: wallet.chains,
|
|
206
206
|
signer: createInjectedSolanaSigner(standardWallet, account, chain),
|
|
207
207
|
getSigner: (c) => createInjectedSolanaSigner(standardWallet, account, c),
|
|
208
|
+
name: account.label,
|
|
208
209
|
walletName: wallet.name,
|
|
209
210
|
walletId: wallet.id
|
|
210
211
|
}));
|