@dynamic-labs-sdk/wallet-connect 1.12.2 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{SessionClosedUnexpectedlyError-cmC-hUPm.esm.js → SessionClosedUnexpectedlyError-Az0CPLXv.esm.js} +2 -2
- package/dist/{SessionClosedUnexpectedlyError-cmC-hUPm.esm.js.map → SessionClosedUnexpectedlyError-Az0CPLXv.esm.js.map} +1 -1
- package/dist/{SessionClosedUnexpectedlyError-B_wDe2ia.cjs → SessionClosedUnexpectedlyError-KMeogkb4.cjs} +2 -2
- package/dist/{SessionClosedUnexpectedlyError-B_wDe2ia.cjs.map → SessionClosedUnexpectedlyError-KMeogkb4.cjs.map} +1 -1
- package/dist/appendWalletConnectUriToDeepLink/appendWalletConnectUriToDeepLink.d.ts +1 -1
- package/dist/core.cjs +8 -8
- package/dist/core.cjs.map +1 -1
- package/dist/core.esm.js +8 -8
- package/dist/core.esm.js.map +1 -1
- package/dist/createWalletAccountsForWalletConnectWalletProvider/createWalletAccountsForWalletConnectWalletProvider.d.ts +1 -1
- package/dist/createWalletAccountsForWalletConnectWalletProvider/createWalletAccountsForWalletConnectWalletProvider.d.ts.map +1 -1
- package/dist/createWalletConnectSessionEventEmitter/createWalletConnectSessionEventEmitter.d.ts +1 -1
- package/dist/getPreferredWalletDeepLink/getPreferredWalletDeepLink.d.ts +1 -1
- package/dist/importWalletConnectAuthResponse/importWalletConnectAuthResponse.d.ts +1 -1
- package/dist/importWalletConnectAuthResponse/verifyWalletConnectAuths/verifyWalletConnectAuths.d.ts +1 -1
- package/dist/importWalletConnectAuthResponse/verifyWalletConnectAuths/verifyWalletConnectAuths.d.ts.map +1 -1
- package/dist/importWalletConnectSession/importWalletConnectSession.d.ts +1 -1
- package/dist/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +4 -4
- package/dist/index.esm.js.map +1 -1
- package/dist/isWalletConnectWalletProvider/isWalletConnectWalletProvider.d.ts +1 -1
- package/dist/isWalletConnectWalletProvider/isWalletConnectWalletProvider.d.ts.map +1 -1
- package/dist/signClient/getSignClient/createSignClient/createSignClient.d.ts +1 -1
- package/dist/signClient/getSignClient/createSignClient/createSignClient.d.ts.map +1 -1
- package/dist/splitCaip10Token/splitCaip10Token.d.ts +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -2,7 +2,7 @@ import { BaseError } from "@dynamic-labs-sdk/client";
|
|
|
2
2
|
|
|
3
3
|
//#region package.json
|
|
4
4
|
var name = "@dynamic-labs-sdk/wallet-connect";
|
|
5
|
-
var version = "1.
|
|
5
|
+
var version = "1.14.0";
|
|
6
6
|
|
|
7
7
|
//#endregion
|
|
8
8
|
//#region src/errors/SessionClosedUnexpectedlyError.ts
|
|
@@ -20,4 +20,4 @@ var SessionClosedUnexpectedlyError = class extends BaseError {
|
|
|
20
20
|
|
|
21
21
|
//#endregion
|
|
22
22
|
export { name as n, version as r, SessionClosedUnexpectedlyError as t };
|
|
23
|
-
//# sourceMappingURL=SessionClosedUnexpectedlyError-
|
|
23
|
+
//# sourceMappingURL=SessionClosedUnexpectedlyError-Az0CPLXv.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionClosedUnexpectedlyError-
|
|
1
|
+
{"version":3,"file":"SessionClosedUnexpectedlyError-Az0CPLXv.esm.js","names":[],"sources":["../package.json","../src/errors/SessionClosedUnexpectedlyError.ts"],"sourcesContent":["","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype SessionClosedUnexpectedlyErrorParams = {\n /**\n * The topic of the session that closed unexpectedly.\n */\n sessionTopic: string;\n\n /**\n * The display name of the wallet that was associated with the session that closed unexpectedly.\n */\n walletDisplayName: string | null | undefined;\n};\n\nexport class SessionClosedUnexpectedlyError extends BaseError {\n constructor({\n sessionTopic,\n walletDisplayName,\n }: SessionClosedUnexpectedlyErrorParams) {\n super({\n cause: null,\n code: 'session_closed_unexpectedly_error',\n docsUrl: null,\n name: 'SessionClosedUnexpectedlyError',\n shortMessage: walletDisplayName\n ? `WalletConnect session ${sessionTopic} closed unexpectedly. Associated wallet was ${walletDisplayName}`\n : `WalletConnect session ${sessionTopic} closed unexpectedly`,\n });\n }\n}\n"],"mappings":";;;;;;;;ACcA,IAAa,iCAAb,cAAoD,UAAU;CAC5D,YAAY,EACV,cACA,qBACuC;AACvC,QAAM;GACJ,OAAO;GACP,MAAM;GACN,SAAS;GACT,MAAM;GACN,cAAc,oBACV,yBAAyB,aAAa,8CAA8C,sBACpF,yBAAyB,aAAa;GAC3C,CAAC"}
|
|
@@ -3,7 +3,7 @@ let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
|
|
|
3
3
|
|
|
4
4
|
//#region package.json
|
|
5
5
|
var name = "@dynamic-labs-sdk/wallet-connect";
|
|
6
|
-
var version = "1.
|
|
6
|
+
var version = "1.14.0";
|
|
7
7
|
|
|
8
8
|
//#endregion
|
|
9
9
|
//#region src/errors/SessionClosedUnexpectedlyError.ts
|
|
@@ -38,4 +38,4 @@ Object.defineProperty(exports, 'version', {
|
|
|
38
38
|
return version;
|
|
39
39
|
}
|
|
40
40
|
});
|
|
41
|
-
//# sourceMappingURL=SessionClosedUnexpectedlyError-
|
|
41
|
+
//# sourceMappingURL=SessionClosedUnexpectedlyError-KMeogkb4.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionClosedUnexpectedlyError-
|
|
1
|
+
{"version":3,"file":"SessionClosedUnexpectedlyError-KMeogkb4.cjs","names":["BaseError"],"sources":["../package.json","../src/errors/SessionClosedUnexpectedlyError.ts"],"sourcesContent":["","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype SessionClosedUnexpectedlyErrorParams = {\n /**\n * The topic of the session that closed unexpectedly.\n */\n sessionTopic: string;\n\n /**\n * The display name of the wallet that was associated with the session that closed unexpectedly.\n */\n walletDisplayName: string | null | undefined;\n};\n\nexport class SessionClosedUnexpectedlyError extends BaseError {\n constructor({\n sessionTopic,\n walletDisplayName,\n }: SessionClosedUnexpectedlyErrorParams) {\n super({\n cause: null,\n code: 'session_closed_unexpectedly_error',\n docsUrl: null,\n name: 'SessionClosedUnexpectedlyError',\n shortMessage: walletDisplayName\n ? `WalletConnect session ${sessionTopic} closed unexpectedly. Associated wallet was ${walletDisplayName}`\n : `WalletConnect session ${sessionTopic} closed unexpectedly`,\n });\n }\n}\n"],"mappings":";;;;;;;;;ACcA,IAAa,iCAAb,cAAoDA,mCAAU;CAC5D,YAAY,EACV,cACA,qBACuC;AACvC,QAAM;GACJ,OAAO;GACP,MAAM;GACN,SAAS;GACT,MAAM;GACN,cAAc,oBACV,yBAAyB,aAAa,8CAA8C,sBACpF,yBAAyB,aAAa;GAC3C,CAAC"}
|
|
@@ -12,7 +12,7 @@ type AppendWalletConnectUriToDeepLinkParams = {
|
|
|
12
12
|
* @param params.deepLinkUrl - The base deeplink URL.
|
|
13
13
|
* @param params.walletConnectUri - The WalletConnect pairing URI to append.
|
|
14
14
|
* @returns The deeplink URL with the WalletConnect URI appended as a query parameter.
|
|
15
|
-
* @
|
|
15
|
+
* @notInstrumented
|
|
16
16
|
*/
|
|
17
17
|
export declare const appendWalletConnectUriToDeepLink: ({ deepLinkUrl, walletConnectUri, }: AppendWalletConnectUriToDeepLinkParams) => string;
|
|
18
18
|
export {};
|
package/dist/core.cjs
CHANGED
|
@@ -25,7 +25,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
25
25
|
}) : target, mod));
|
|
26
26
|
|
|
27
27
|
//#endregion
|
|
28
|
-
const require_SessionClosedUnexpectedlyError = require('./SessionClosedUnexpectedlyError-
|
|
28
|
+
const require_SessionClosedUnexpectedlyError = require('./SessionClosedUnexpectedlyError-KMeogkb4.cjs');
|
|
29
29
|
let _dynamic_labs_sdk_assert_package_version = require("@dynamic-labs-sdk/assert-package-version");
|
|
30
30
|
let _walletconnect_utils = require("@walletconnect/utils");
|
|
31
31
|
let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
|
|
@@ -49,7 +49,7 @@ _walletconnect_sign_client = __toESM(_walletconnect_sign_client);
|
|
|
49
49
|
* See docs: https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-10.md
|
|
50
50
|
*
|
|
51
51
|
* @returns An object with the address, namespace key, and network id
|
|
52
|
-
* @
|
|
52
|
+
* @notInstrumented
|
|
53
53
|
*/
|
|
54
54
|
const splitCaip10Token = (caip10Token) => {
|
|
55
55
|
const [namespaceKey, networkId, address] = caip10Token.split(":");
|
|
@@ -73,7 +73,7 @@ const splitCaip10Token = (caip10Token) => {
|
|
|
73
73
|
* @param params.signClient - The WalletConnect sign client instance
|
|
74
74
|
* @param params.formatAddress - Optional function to format addresses (e.g., EIP-55 for EVM)
|
|
75
75
|
* @returns An object with cleanupEventEmitter and getEventEmitter functions
|
|
76
|
-
* @
|
|
76
|
+
* @notInstrumented
|
|
77
77
|
*/
|
|
78
78
|
const createWalletConnectSessionEventEmitter = ({ formatAddress, getSession, namespaceKey, sessionTopic, signClient }) => {
|
|
79
79
|
return (0, _dynamic_labs_sdk_client_core.createWalletProviderEventEmitter)({
|
|
@@ -110,7 +110,7 @@ const createWalletConnectSessionEventEmitter = ({ formatAddress, getSession, nam
|
|
|
110
110
|
|
|
111
111
|
//#endregion
|
|
112
112
|
//#region src/createWalletAccountsForWalletConnectWalletProvider/createWalletAccountsForWalletConnectWalletProvider.ts
|
|
113
|
-
/** @
|
|
113
|
+
/** @notInstrumented */
|
|
114
114
|
const createWalletAccountsForWalletConnectWalletProvider = ({ walletProvider }) => {
|
|
115
115
|
/**
|
|
116
116
|
* Since each session can have multiple namespaces, we need to find the namespace
|
|
@@ -149,7 +149,7 @@ const createWalletAccountsForWalletConnectWalletProvider = ({ walletProvider })
|
|
|
149
149
|
* @param addToDynamicWalletAccounts - Whether to add the wallet accounts to the dynamic's wallet accounts.
|
|
150
150
|
* @param client - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
151
151
|
* @returns The wallet accounts.
|
|
152
|
-
* @
|
|
152
|
+
* @notInstrumented
|
|
153
153
|
*/
|
|
154
154
|
const importWalletConnectSession = async ({ addToDynamicWalletAccounts = true, sessionTopic, walletProviderBuilder }, client) => {
|
|
155
155
|
/**
|
|
@@ -200,7 +200,7 @@ const importWalletConnectSession = async ({ addToDynamicWalletAccounts = true, s
|
|
|
200
200
|
//#endregion
|
|
201
201
|
//#region src/importWalletConnectAuthResponse/verifyWalletConnectAuths/verifyWalletConnectAuths.ts
|
|
202
202
|
const getAddressFromIss = (iss) => iss.split(":")[4];
|
|
203
|
-
/** @
|
|
203
|
+
/** @notInstrumented */
|
|
204
204
|
const verifyWalletConnectAuths = async ({ auths, chain, walletDisplayName }, client) => {
|
|
205
205
|
/**
|
|
206
206
|
* The only differences between each auth object will be the signature (auth.s.s)
|
|
@@ -260,7 +260,7 @@ const verifyWalletConnectAuths = async ({ auths, chain, walletDisplayName }, cli
|
|
|
260
260
|
* @see WalletConnect's docs on [session authentication](https://docs.reown.com/advanced/api/sign/dapp-usage#session-authenticate-with-recaps)
|
|
261
261
|
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
262
262
|
* @returns A promise that resolves to the connected and verified wallet account.
|
|
263
|
-
* @
|
|
263
|
+
* @notInstrumented
|
|
264
264
|
*/
|
|
265
265
|
const importWalletConnectAuthResponse = async ({ authResponse, chain, walletProviderBuilder }, client) => {
|
|
266
266
|
const { session, auths } = authResponse;
|
|
@@ -297,7 +297,7 @@ const importWalletConnectAuthResponse = async ({ authResponse, chain, walletProv
|
|
|
297
297
|
|
|
298
298
|
//#endregion
|
|
299
299
|
//#region src/signClient/getSignClient/createSignClient/createSignClient.ts
|
|
300
|
-
/** @
|
|
300
|
+
/** @notInstrumented */
|
|
301
301
|
const createSignClient = async (client) => {
|
|
302
302
|
const core = (0, _dynamic_labs_sdk_client_core.getCore)(client);
|
|
303
303
|
(0, _dynamic_labs_sdk_client_core.assertDefined)(client.projectSettings, "Project settings not available");
|
package/dist/core.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.cjs","names":["WalletProviderPriority","lastResponse: VerifyResponse | undefined","WalletProviderEnum","walletAccounts","SignClient","name","version"],"sources":["../src/splitCaip10Token/splitCaip10Token.ts","../src/createWalletConnectSessionEventEmitter/createWalletConnectSessionEventEmitter.ts","../src/createWalletAccountsForWalletConnectWalletProvider/createWalletAccountsForWalletConnectWalletProvider.ts","../src/importWalletConnectSession/importWalletConnectSession.ts","../src/importWalletConnectAuthResponse/verifyWalletConnectAuths/verifyWalletConnectAuths.ts","../src/importWalletConnectAuthResponse/importWalletConnectAuthResponse.ts","../src/signClient/getSignClient/createSignClient/createSignClient.ts","../src/signClient/getSignClient/getSignClient.ts","../src/exports/core.ts"],"sourcesContent":["/**\n * An account in WalletConnect follows the CAIP-10 standard\n * and is formatted as follows:\n *\n * `<namespace>:<chain>:<address>`\n *\n * Where:\n * - `<namespace>` is the namespace key (e.g. \"eip155\")\n * - `<chain>` is what we refer to as a network ID (e.g. \"1\")\n * - `<address>` is the address of the account (e.g. \"0x1234567890\")\n *\n * See docs: https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-10.md\n *\n * @returns An object with the address, namespace key, and network id\n * @not-instrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const splitCaip10Token = (caip10Token: string) => {\n const [namespaceKey, networkId, address] = caip10Token.split(':');\n return { address, namespaceKey, networkId };\n};\n","import {\n createWalletProviderEventEmitter,\n filterDuplicates,\n} from '@dynamic-labs-sdk/client/core';\nimport type SignClient from '@walletconnect/sign-client';\nimport type { SessionTypes } from '@walletconnect/types';\n\nimport { splitCaip10Token } from '../splitCaip10Token';\n\ntype CreateWalletConnectSessionEventEmitterParams = {\n /**\n * Optional function to format addresses. If not provided, addresses are used as-is.\n */\n formatAddress?: (address: string) => string;\n getSession: () => SessionTypes.Struct;\n namespaceKey: string;\n sessionTopic: string;\n signClient: SignClient;\n};\n\ntype SessionEventPayload = {\n params: {\n event: {\n data: unknown;\n name: string;\n };\n };\n topic: string;\n};\n\n/**\n * Creates a WalletConnect session event emitter with common event handling logic.\n *\n * Handles chainChanged, accountsChanged, and disconnected events from WalletConnect sessions.\n *\n * @param params.getSession - Function to get the current session\n * @param params.namespaceKey - The WalletConnect namespace key (e.g., 'eip155', 'solana')\n * @param params.sessionTopic - The session topic to listen for events\n * @param params.signClient - The WalletConnect sign client instance\n * @param params.formatAddress - Optional function to format addresses (e.g., EIP-55 for EVM)\n * @returns An object with cleanupEventEmitter and getEventEmitter functions\n * @not-instrumented\n */\nexport const createWalletConnectSessionEventEmitter = ({\n formatAddress,\n getSession,\n namespaceKey,\n sessionTopic,\n signClient,\n}: CreateWalletConnectSessionEventEmitterParams) => {\n return createWalletProviderEventEmitter<(event: SessionEventPayload) => void>(\n {\n removeEventListeners: ({ setupReturnValue: handleSessionEvent }) => {\n signClient.off('session_event', handleSessionEvent);\n },\n\n setupEventListeners: ({\n handleAccountsChanged,\n handleDisconnected,\n handleNetworkChanged,\n }) => {\n const handleSessionEvent = ({\n params: { event },\n topic,\n }: SessionEventPayload) => {\n if (topic !== sessionTopic) {\n return;\n }\n\n if (event.name === 'chainChanged') {\n const networkParam = event.data as string;\n\n // Handle potentially CAIP-2 format\n const networkId = networkParam.startsWith(`${namespaceKey}:`)\n ? networkParam.split(':')[1]\n : networkParam;\n\n handleNetworkChanged({ networkId });\n\n return;\n }\n\n if (event.name === 'accountsChanged') {\n const accountsParam = event.data as string[];\n\n const addresses = filterDuplicates(\n accountsParam.map((account) => {\n // Handle potentially CAIP-10 format\n if (account.startsWith(`${namespaceKey}:`)) {\n return splitCaip10Token(account).address;\n }\n\n return account;\n })\n ).map((address) =>\n formatAddress ? formatAddress(address) : address\n );\n\n handleAccountsChanged({ addresses });\n\n return;\n }\n\n if (event.name === 'disconnected') {\n handleDisconnected();\n\n return;\n }\n };\n\n // Assert the session is still valid\n getSession();\n\n signClient.on('session_event', handleSessionEvent);\n\n return handleSessionEvent;\n },\n }\n );\n};\n","import { type WalletAccount } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n filterDuplicates,\n formatWalletAccountId,\n} from '@dynamic-labs-sdk/client/core';\n\nimport type { WalletConnectWalletProvider } from '../walletConnectWalletProvider.types';\nimport { splitCaip10Token } from '../splitCaip10Token';\n\ntype CreateWalletAccountsForWalletConnectWalletProviderParams = {\n walletProvider: WalletConnectWalletProvider;\n};\n\n/** @not-instrumented */\nexport const createWalletAccountsForWalletConnectWalletProvider = ({\n walletProvider,\n}: CreateWalletAccountsForWalletConnectWalletProviderParams): WalletAccount[] => {\n /**\n * Since each session can have multiple namespaces, we need to find the namespace\n * that corresponds to this specific wallet provider.\n *\n * A WalletConnect namespace is the equivalent of what we refer to as a chain in the SDK,\n * and they have attributed to them the methods, events and networks that are expected\n * to be supported by the wallet application, as well as which accounts are connected.\n */\n const session = walletProvider.getSession();\n\n const namespace = session.namespaces[walletProvider.namespaceKey];\n\n assertDefined(\n namespace,\n `Namespace key ${walletProvider.namespaceKey} of wallet provider ${walletProvider.key} not found in its session ${session.topic}`\n );\n\n const accountAddresses = filterDuplicates(\n namespace.accounts.map((account) => splitCaip10Token(account).address)\n );\n\n const formatAddress =\n walletProvider.formatWalletAddress ?? (({ address }) => address);\n\n return accountAddresses.map((address) => ({\n address: formatAddress({ address }),\n chain: walletProvider.chain,\n id: formatWalletAccountId({\n address,\n chain: walletProvider.chain,\n walletProviderKey: walletProvider.key,\n }),\n lastSelectedAt: null,\n verifiedCredentialId: null,\n walletProviderKey: walletProvider.key,\n }));\n};\n","import type { DynamicClient, WalletAccount } from '@dynamic-labs-sdk/client';\nimport {\n WalletProviderPriority,\n getWalletProviderRegistry,\n reconcileWalletAccountsAgainstClient,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { createWalletAccountsForWalletConnectWalletProvider } from '../createWalletAccountsForWalletConnectWalletProvider';\nimport type { WalletProviderBuilder } from '../walletConnectWalletProvider.types';\n\ntype ImportWalletConnectSessionParams = {\n /**\n * Whether this session's wallet accounts should be added to the dynamic's wallet accounts.\n */\n addToDynamicWalletAccounts?: boolean;\n\n /**\n * The session topic of the WalletConnect session.\n */\n sessionTopic: string;\n\n /**\n * The function that builds the wallet provider for the session.\n */\n walletProviderBuilder: WalletProviderBuilder;\n};\n\n/**\n * This is a lower level function that is used to connect a WalletConnect session to the Dynamic SDK.\n * It will generate the wallet providers and wallet accounts for all accounts in the session.\n *\n * @param sessionTopic - The session topic of the WalletConnect session.\n * @param addToDynamicWalletAccounts - Whether to add the wallet accounts to the dynamic's wallet accounts.\n * @param client - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns The wallet accounts.\n * @not-instrumented\n */\nexport const importWalletConnectSession = async (\n {\n addToDynamicWalletAccounts = true,\n sessionTopic,\n walletProviderBuilder,\n }: ImportWalletConnectSessionParams,\n client: DynamicClient\n): Promise<{ walletAccounts: WalletAccount[] }> => {\n /**\n * You would normally get the session from the signClient.connect method. It takes the optionalNamespaces as an argument.\n *\n * Each chain should build its own \"connectWithWalletConnect<chain-name>\" function.\n * Understand how to build the optionalNamespaces object:\n *\n * The namespace configurations are used at the time a wallet application receives the connection URI.\n * It will use the configurations we supply to understand which methods, events and networks it should provide.\n *\n * The wallet application will then accept the connection request and, in the session`object, provide its own namespace object\n * in return, which will contain the methods, events and networks it does in fact support, as well as\n * which accounts are available.\n *\n * WalletConnect expects namespaces defined in the following format:\n * ```typescript\n * {\n * <namespaceKey>: {\n * \"accounts\": [\"<account1>\", \"<account2>\", \"<account3>\", ...],\n * \"events\": [\"accountsChanged\", \"chainChanged\", \"disconnected\"],\n * \"methods\": [\"personal_sign\", \"eth_sendTransaction\", \"eth_accounts\", ...],\n * \"chains\": [\"<chain1>\", \"<chain2>\", \"<chain3>\", ...]\n * },\n * ...\n * }\n * ```\n *\n * Where each account is a CAIP-10 formatted string, for example: \"eip155:1:0x1234567890\"\n * — see docs: https://chainagnostic.org/CAIPs/caip-10\n *\n * Where each chain is a CAIP-2 formatted string, for example: \"eip155:1\"\n * — see docs: https://chainagnostic.org/CAIPs/caip-2\n */\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n const walletProvider = await walletProviderBuilder({ sessionTopic }, client);\n\n walletProviderRegistry.register({\n priority: WalletProviderPriority.WALLET_SDK,\n walletProvider,\n });\n\n const walletAccounts = createWalletAccountsForWalletConnectWalletProvider({\n walletProvider,\n });\n\n const reconciledWalletAccounts = reconcileWalletAccountsAgainstClient(\n {\n addToDynamicWalletAccounts,\n walletAccounts,\n walletProviderKey: walletProvider.key,\n },\n client\n );\n\n return { walletAccounts: reconciledWalletAccounts };\n};\n","import type {\n Chain,\n DynamicClient,\n VerifyResponse,\n} from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n updateAuthFromVerifyResponse,\n verifyMessageSignatureOwnership,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport type { AuthTypes } from '@walletconnect/types';\nimport { formatMessage } from '@walletconnect/utils';\n\nconst getAddressFromIss = (iss: string) => iss.split(':')[4];\n\ntype VerifyWalletConnectAuthsParams = {\n auths: AuthTypes.Cacao[];\n chain: Chain;\n walletDisplayName: string;\n};\n\n/** @not-instrumented */\n \nexport const verifyWalletConnectAuths = async (\n { auths, chain, walletDisplayName }: VerifyWalletConnectAuthsParams,\n client: DynamicClient\n) => {\n /**\n * The only differences between each auth object will be the signature (auth.s.s)\n * and the iss (auth.p.iss).\n *\n * The iss is comprised of 2 WC fields that are irrelevant to us and then the CAIP-10 token\n * of the address, where the first 2 fields are also split by the \":\" character.\n *\n * Usually, there will be multiple auths if the wallet app bundles signatures for multiple\n * networks at once, so the only field that will change among auth iss will be the networkId under iss.\n *\n * Docs on Cacao: https://chainagnostic.org/CAIPs/caip-74\n */\n const visitedAddresses = new Set<string>();\n\n const authsFilteredByAddress = auths.filter((auth) => {\n const address = getAddressFromIss(auth.p.iss);\n\n if (!address || visitedAddresses.has(address)) {\n return false;\n }\n\n visitedAddresses.add(address);\n\n return true;\n });\n\n let lastResponse: VerifyResponse | undefined = undefined;\n\n /**\n * WalletConnect's auth object is what they call a \"Cacao\" object, with data on the SIWE message\n * and the signature itself.\n * By consulting how they implemented their \"validateSignedCacao\" function,\n * we are able to reconstruct the original message which can be used to verify the signature\n * in our backend.\n */\n for (const auth of authsFilteredByAddress) {\n const publicWalletAddress = getAddressFromIss(auth.p.iss);\n\n assertDefined(\n publicWalletAddress,\n `Unable to get public wallet address from WalletConnect Cacao object iss: ${auth.p.iss}`\n );\n\n const messageToSign = formatMessage(auth.p, auth.p.iss);\n\n const signature = auth.s.s;\n\n lastResponse = await verifyMessageSignatureOwnership(\n {\n chain,\n messageToSign,\n signature,\n walletAddress: publicWalletAddress,\n walletDisplayName,\n walletProviderType: WalletProviderEnum.WalletConnect,\n },\n client\n );\n }\n\n if (!lastResponse) {\n return;\n }\n\n /**\n * Adds the user with the new wallet verified credentials\n * This will add the new verified wallet accounts to the client`s state\n */\n updateAuthFromVerifyResponse({ response: lastResponse }, client);\n};\n","import type { Chain, DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n type WalletAccount,\n verifyWalletAccount,\n} from '@dynamic-labs-sdk/client';\nimport type { AuthTypes } from '@walletconnect/types';\n\nimport type { WalletProviderBuilder } from '../walletConnectWalletProvider.types';\nimport { importWalletConnectSession } from '../importWalletConnectSession';\nimport { verifyWalletConnectAuths } from './verifyWalletConnectAuths';\n\ntype ImportWalletConnectAuthResponseParams = {\n /**\n * The response from the WalletConnect authenticate method.\n */\n authResponse: AuthTypes.AuthenticateResponseResult;\n\n /**\n * The chain with which the wallet account is associated.\n */\n chain: Chain;\n\n /**\n * The function that builds the wallet provider for the session.\n */\n walletProviderBuilder: WalletProviderBuilder;\n};\n\n/**\n * A low level function that is used to connect a WalletConnect authenticate response to the Dynamic SDK.\n * It will generate the wallet providers and wallet accounts for all accounts in the session.\n *\n * @see WalletConnect's docs on [session authentication](https://docs.reown.com/advanced/api/sign/dapp-usage#session-authenticate-with-recaps)\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns A promise that resolves to the connected and verified wallet account.\n * @not-instrumented\n */\nexport const importWalletConnectAuthResponse = async (\n {\n authResponse,\n chain,\n walletProviderBuilder,\n }: ImportWalletConnectAuthResponseParams,\n client: DynamicClient\n): Promise<{ walletAccounts: WalletAccount[] }> => {\n const { session, auths } = authResponse;\n\n /**\n * Some wallets do not support WC's authenticate method (such as Rainbow).\n * For these wallets, the authenticate method will act as a regular connect method.\n * Therefore we must call verify individually.\n */\n if (!auths || auths.length === 0) {\n const { walletAccounts } = await importWalletConnectSession(\n {\n /**\n * Don't add the wallet accounts to the dynamic's wallet accounts while we are still verifying them.\n */\n addToDynamicWalletAccounts: false,\n sessionTopic: session.topic,\n walletProviderBuilder,\n },\n client\n );\n\n // This should not be concurrent because the first will be a verify and the rest will be a link\n for (const walletAccount of walletAccounts) {\n await verifyWalletAccount({ walletAccount }, client);\n }\n\n return { walletAccounts };\n }\n\n /**\n * This reconstructs the message that was signed by the wallet and verifies the signature\n * in the backend. It will update the user with the new verified credentials.\n */\n await verifyWalletConnectAuths(\n {\n auths,\n chain,\n walletDisplayName: session.peer.metadata.name,\n },\n client\n );\n\n const { walletAccounts } = await importWalletConnectSession(\n {\n addToDynamicWalletAccounts: true,\n sessionTopic: session.topic,\n walletProviderBuilder,\n },\n client\n );\n\n return { walletAccounts };\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n getAppMetadata,\n getCore,\n} from '@dynamic-labs-sdk/client/core';\nimport SignClient from '@walletconnect/sign-client';\n\n/** @not-instrumented */\nexport const createSignClient = async (client: DynamicClient) => {\n const core = getCore(client);\n\n assertDefined(client.projectSettings, 'Project settings not available');\n\n const projectId = client.projectSettings.sdk.walletConnect?.projectId;\n\n assertDefined(\n projectId,\n 'Please configure a project ID for WalletConnect in dashboard'\n );\n\n const { appName, appLogoUrl, appNativeLink, appUniversalLink } =\n getAppMetadata(client);\n\n assertDefined(\n appName,\n 'Please configure an app name in dashboard or DynamicClient metadata to use WalletConnect'\n );\n\n const customStoragePrefix = `dynamic_${core.environmentId}_walletconnect`;\n\n return SignClient.init({\n customStoragePrefix,\n metadata: {\n description: '',\n icons: appLogoUrl ? [appLogoUrl] : [],\n name: appName,\n redirect: {\n native: appNativeLink,\n universal: appUniversalLink,\n },\n url: appUniversalLink ?? '',\n },\n projectId,\n });\n};\n","import { createRuntimeServiceAccessKey } from '@dynamic-labs-sdk/client/core';\n\nimport { createSignClient } from './createSignClient';\n\nexport const getSignClient = createRuntimeServiceAccessKey(\n 'walletConnectSignClient',\n (client) => createSignClient(client)\n);\n","import { assertPackageVersion } from '@dynamic-labs-sdk/assert-package-version';\n\nimport { name, version } from '../../package.json';\n\nassertPackageVersion(name, version);\n\nexport { createWalletConnectSessionEventEmitter } from '../createWalletConnectSessionEventEmitter';\nexport { SessionClosedUnexpectedlyError } from '../errors/SessionClosedUnexpectedlyError';\nexport { importWalletConnectAuthResponse } from '../importWalletConnectAuthResponse';\nexport { importWalletConnectSession } from '../importWalletConnectSession';\nexport { getSignClient } from '../signClient/getSignClient';\nexport { splitCaip10Token } from '../splitCaip10Token';\nexport type { WalletProviderBuilder } from '../walletConnectWalletProvider.types';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core.cjs","names":["WalletProviderPriority","lastResponse: VerifyResponse | undefined","WalletProviderEnum","walletAccounts","SignClient","name","version"],"sources":["../src/splitCaip10Token/splitCaip10Token.ts","../src/createWalletConnectSessionEventEmitter/createWalletConnectSessionEventEmitter.ts","../src/createWalletAccountsForWalletConnectWalletProvider/createWalletAccountsForWalletConnectWalletProvider.ts","../src/importWalletConnectSession/importWalletConnectSession.ts","../src/importWalletConnectAuthResponse/verifyWalletConnectAuths/verifyWalletConnectAuths.ts","../src/importWalletConnectAuthResponse/importWalletConnectAuthResponse.ts","../src/signClient/getSignClient/createSignClient/createSignClient.ts","../src/signClient/getSignClient/getSignClient.ts","../src/exports/core.ts"],"sourcesContent":["/**\n * An account in WalletConnect follows the CAIP-10 standard\n * and is formatted as follows:\n *\n * `<namespace>:<chain>:<address>`\n *\n * Where:\n * - `<namespace>` is the namespace key (e.g. \"eip155\")\n * - `<chain>` is what we refer to as a network ID (e.g. \"1\")\n * - `<address>` is the address of the account (e.g. \"0x1234567890\")\n *\n * See docs: https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-10.md\n *\n * @returns An object with the address, namespace key, and network id\n * @notInstrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const splitCaip10Token = (caip10Token: string) => {\n const [namespaceKey, networkId, address] = caip10Token.split(':');\n return { address, namespaceKey, networkId };\n};\n","import {\n createWalletProviderEventEmitter,\n filterDuplicates,\n} from '@dynamic-labs-sdk/client/core';\nimport type SignClient from '@walletconnect/sign-client';\nimport type { SessionTypes } from '@walletconnect/types';\n\nimport { splitCaip10Token } from '../splitCaip10Token';\n\ntype CreateWalletConnectSessionEventEmitterParams = {\n /**\n * Optional function to format addresses. If not provided, addresses are used as-is.\n */\n formatAddress?: (address: string) => string;\n getSession: () => SessionTypes.Struct;\n namespaceKey: string;\n sessionTopic: string;\n signClient: SignClient;\n};\n\ntype SessionEventPayload = {\n params: {\n event: {\n data: unknown;\n name: string;\n };\n };\n topic: string;\n};\n\n/**\n * Creates a WalletConnect session event emitter with common event handling logic.\n *\n * Handles chainChanged, accountsChanged, and disconnected events from WalletConnect sessions.\n *\n * @param params.getSession - Function to get the current session\n * @param params.namespaceKey - The WalletConnect namespace key (e.g., 'eip155', 'solana')\n * @param params.sessionTopic - The session topic to listen for events\n * @param params.signClient - The WalletConnect sign client instance\n * @param params.formatAddress - Optional function to format addresses (e.g., EIP-55 for EVM)\n * @returns An object with cleanupEventEmitter and getEventEmitter functions\n * @notInstrumented\n */\nexport const createWalletConnectSessionEventEmitter = ({\n formatAddress,\n getSession,\n namespaceKey,\n sessionTopic,\n signClient,\n}: CreateWalletConnectSessionEventEmitterParams) => {\n return createWalletProviderEventEmitter<(event: SessionEventPayload) => void>(\n {\n removeEventListeners: ({ setupReturnValue: handleSessionEvent }) => {\n signClient.off('session_event', handleSessionEvent);\n },\n\n setupEventListeners: ({\n handleAccountsChanged,\n handleDisconnected,\n handleNetworkChanged,\n }) => {\n const handleSessionEvent = ({\n params: { event },\n topic,\n }: SessionEventPayload) => {\n if (topic !== sessionTopic) {\n return;\n }\n\n if (event.name === 'chainChanged') {\n const networkParam = event.data as string;\n\n // Handle potentially CAIP-2 format\n const networkId = networkParam.startsWith(`${namespaceKey}:`)\n ? networkParam.split(':')[1]\n : networkParam;\n\n handleNetworkChanged({ networkId });\n\n return;\n }\n\n if (event.name === 'accountsChanged') {\n const accountsParam = event.data as string[];\n\n const addresses = filterDuplicates(\n accountsParam.map((account) => {\n // Handle potentially CAIP-10 format\n if (account.startsWith(`${namespaceKey}:`)) {\n return splitCaip10Token(account).address;\n }\n\n return account;\n })\n ).map((address) =>\n formatAddress ? formatAddress(address) : address\n );\n\n handleAccountsChanged({ addresses });\n\n return;\n }\n\n if (event.name === 'disconnected') {\n handleDisconnected();\n\n return;\n }\n };\n\n // Assert the session is still valid\n getSession();\n\n signClient.on('session_event', handleSessionEvent);\n\n return handleSessionEvent;\n },\n }\n );\n};\n","import { type WalletAccount } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n filterDuplicates,\n formatWalletAccountId,\n} from '@dynamic-labs-sdk/client/core';\n\nimport type { WalletConnectWalletProvider } from '../walletConnectWalletProvider.types';\nimport { splitCaip10Token } from '../splitCaip10Token';\n\ntype CreateWalletAccountsForWalletConnectWalletProviderParams = {\n walletProvider: WalletConnectWalletProvider;\n};\n\n/** @notInstrumented */\nexport const createWalletAccountsForWalletConnectWalletProvider = ({\n walletProvider,\n}: CreateWalletAccountsForWalletConnectWalletProviderParams): WalletAccount[] => {\n /**\n * Since each session can have multiple namespaces, we need to find the namespace\n * that corresponds to this specific wallet provider.\n *\n * A WalletConnect namespace is the equivalent of what we refer to as a chain in the SDK,\n * and they have attributed to them the methods, events and networks that are expected\n * to be supported by the wallet application, as well as which accounts are connected.\n */\n const session = walletProvider.getSession();\n\n const namespace = session.namespaces[walletProvider.namespaceKey];\n\n assertDefined(\n namespace,\n `Namespace key ${walletProvider.namespaceKey} of wallet provider ${walletProvider.key} not found in its session ${session.topic}`\n );\n\n const accountAddresses = filterDuplicates(\n namespace.accounts.map((account) => splitCaip10Token(account).address)\n );\n\n const formatAddress =\n walletProvider.formatWalletAddress ?? (({ address }) => address);\n\n return accountAddresses.map((address) => ({\n address: formatAddress({ address }),\n chain: walletProvider.chain,\n id: formatWalletAccountId({\n address,\n chain: walletProvider.chain,\n walletProviderKey: walletProvider.key,\n }),\n lastSelectedAt: null,\n verifiedCredentialId: null,\n walletProviderKey: walletProvider.key,\n }));\n};\n","import type { DynamicClient, WalletAccount } from '@dynamic-labs-sdk/client';\nimport {\n WalletProviderPriority,\n getWalletProviderRegistry,\n reconcileWalletAccountsAgainstClient,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { createWalletAccountsForWalletConnectWalletProvider } from '../createWalletAccountsForWalletConnectWalletProvider';\nimport type { WalletProviderBuilder } from '../walletConnectWalletProvider.types';\n\ntype ImportWalletConnectSessionParams = {\n /**\n * Whether this session's wallet accounts should be added to the dynamic's wallet accounts.\n */\n addToDynamicWalletAccounts?: boolean;\n\n /**\n * The session topic of the WalletConnect session.\n */\n sessionTopic: string;\n\n /**\n * The function that builds the wallet provider for the session.\n */\n walletProviderBuilder: WalletProviderBuilder;\n};\n\n/**\n * This is a lower level function that is used to connect a WalletConnect session to the Dynamic SDK.\n * It will generate the wallet providers and wallet accounts for all accounts in the session.\n *\n * @param sessionTopic - The session topic of the WalletConnect session.\n * @param addToDynamicWalletAccounts - Whether to add the wallet accounts to the dynamic's wallet accounts.\n * @param client - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns The wallet accounts.\n * @notInstrumented\n */\nexport const importWalletConnectSession = async (\n {\n addToDynamicWalletAccounts = true,\n sessionTopic,\n walletProviderBuilder,\n }: ImportWalletConnectSessionParams,\n client: DynamicClient\n): Promise<{ walletAccounts: WalletAccount[] }> => {\n /**\n * You would normally get the session from the signClient.connect method. It takes the optionalNamespaces as an argument.\n *\n * Each chain should build its own \"connectWithWalletConnect<chain-name>\" function.\n * Understand how to build the optionalNamespaces object:\n *\n * The namespace configurations are used at the time a wallet application receives the connection URI.\n * It will use the configurations we supply to understand which methods, events and networks it should provide.\n *\n * The wallet application will then accept the connection request and, in the session`object, provide its own namespace object\n * in return, which will contain the methods, events and networks it does in fact support, as well as\n * which accounts are available.\n *\n * WalletConnect expects namespaces defined in the following format:\n * ```typescript\n * {\n * <namespaceKey>: {\n * \"accounts\": [\"<account1>\", \"<account2>\", \"<account3>\", ...],\n * \"events\": [\"accountsChanged\", \"chainChanged\", \"disconnected\"],\n * \"methods\": [\"personal_sign\", \"eth_sendTransaction\", \"eth_accounts\", ...],\n * \"chains\": [\"<chain1>\", \"<chain2>\", \"<chain3>\", ...]\n * },\n * ...\n * }\n * ```\n *\n * Where each account is a CAIP-10 formatted string, for example: \"eip155:1:0x1234567890\"\n * — see docs: https://chainagnostic.org/CAIPs/caip-10\n *\n * Where each chain is a CAIP-2 formatted string, for example: \"eip155:1\"\n * — see docs: https://chainagnostic.org/CAIPs/caip-2\n */\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n const walletProvider = await walletProviderBuilder({ sessionTopic }, client);\n\n walletProviderRegistry.register({\n priority: WalletProviderPriority.WALLET_SDK,\n walletProvider,\n });\n\n const walletAccounts = createWalletAccountsForWalletConnectWalletProvider({\n walletProvider,\n });\n\n const reconciledWalletAccounts = reconcileWalletAccountsAgainstClient(\n {\n addToDynamicWalletAccounts,\n walletAccounts,\n walletProviderKey: walletProvider.key,\n },\n client\n );\n\n return { walletAccounts: reconciledWalletAccounts };\n};\n","import type {\n Chain,\n DynamicClient,\n VerifyResponse,\n} from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n updateAuthFromVerifyResponse,\n verifyMessageSignatureOwnership,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport type { AuthTypes } from '@walletconnect/types';\nimport { formatMessage } from '@walletconnect/utils';\n\nconst getAddressFromIss = (iss: string) => iss.split(':')[4];\n\ntype VerifyWalletConnectAuthsParams = {\n auths: AuthTypes.Cacao[];\n chain: Chain;\n walletDisplayName: string;\n};\n\n/** @notInstrumented */\n \nexport const verifyWalletConnectAuths = async (\n { auths, chain, walletDisplayName }: VerifyWalletConnectAuthsParams,\n client: DynamicClient\n) => {\n /**\n * The only differences between each auth object will be the signature (auth.s.s)\n * and the iss (auth.p.iss).\n *\n * The iss is comprised of 2 WC fields that are irrelevant to us and then the CAIP-10 token\n * of the address, where the first 2 fields are also split by the \":\" character.\n *\n * Usually, there will be multiple auths if the wallet app bundles signatures for multiple\n * networks at once, so the only field that will change among auth iss will be the networkId under iss.\n *\n * Docs on Cacao: https://chainagnostic.org/CAIPs/caip-74\n */\n const visitedAddresses = new Set<string>();\n\n const authsFilteredByAddress = auths.filter((auth) => {\n const address = getAddressFromIss(auth.p.iss);\n\n if (!address || visitedAddresses.has(address)) {\n return false;\n }\n\n visitedAddresses.add(address);\n\n return true;\n });\n\n let lastResponse: VerifyResponse | undefined = undefined;\n\n /**\n * WalletConnect's auth object is what they call a \"Cacao\" object, with data on the SIWE message\n * and the signature itself.\n * By consulting how they implemented their \"validateSignedCacao\" function,\n * we are able to reconstruct the original message which can be used to verify the signature\n * in our backend.\n */\n for (const auth of authsFilteredByAddress) {\n const publicWalletAddress = getAddressFromIss(auth.p.iss);\n\n assertDefined(\n publicWalletAddress,\n `Unable to get public wallet address from WalletConnect Cacao object iss: ${auth.p.iss}`\n );\n\n const messageToSign = formatMessage(auth.p, auth.p.iss);\n\n const signature = auth.s.s;\n\n lastResponse = await verifyMessageSignatureOwnership(\n {\n chain,\n messageToSign,\n signature,\n walletAddress: publicWalletAddress,\n walletDisplayName,\n walletProviderType: WalletProviderEnum.WalletConnect,\n },\n client\n );\n }\n\n if (!lastResponse) {\n return;\n }\n\n /**\n * Adds the user with the new wallet verified credentials\n * This will add the new verified wallet accounts to the client`s state\n */\n updateAuthFromVerifyResponse({ response: lastResponse }, client);\n};\n","import type { Chain, DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n type WalletAccount,\n verifyWalletAccount,\n} from '@dynamic-labs-sdk/client';\nimport type { AuthTypes } from '@walletconnect/types';\n\nimport type { WalletProviderBuilder } from '../walletConnectWalletProvider.types';\nimport { importWalletConnectSession } from '../importWalletConnectSession';\nimport { verifyWalletConnectAuths } from './verifyWalletConnectAuths';\n\ntype ImportWalletConnectAuthResponseParams = {\n /**\n * The response from the WalletConnect authenticate method.\n */\n authResponse: AuthTypes.AuthenticateResponseResult;\n\n /**\n * The chain with which the wallet account is associated.\n */\n chain: Chain;\n\n /**\n * The function that builds the wallet provider for the session.\n */\n walletProviderBuilder: WalletProviderBuilder;\n};\n\n/**\n * A low level function that is used to connect a WalletConnect authenticate response to the Dynamic SDK.\n * It will generate the wallet providers and wallet accounts for all accounts in the session.\n *\n * @see WalletConnect's docs on [session authentication](https://docs.reown.com/advanced/api/sign/dapp-usage#session-authenticate-with-recaps)\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns A promise that resolves to the connected and verified wallet account.\n * @notInstrumented\n */\nexport const importWalletConnectAuthResponse = async (\n {\n authResponse,\n chain,\n walletProviderBuilder,\n }: ImportWalletConnectAuthResponseParams,\n client: DynamicClient\n): Promise<{ walletAccounts: WalletAccount[] }> => {\n const { session, auths } = authResponse;\n\n /**\n * Some wallets do not support WC's authenticate method (such as Rainbow).\n * For these wallets, the authenticate method will act as a regular connect method.\n * Therefore we must call verify individually.\n */\n if (!auths || auths.length === 0) {\n const { walletAccounts } = await importWalletConnectSession(\n {\n /**\n * Don't add the wallet accounts to the dynamic's wallet accounts while we are still verifying them.\n */\n addToDynamicWalletAccounts: false,\n sessionTopic: session.topic,\n walletProviderBuilder,\n },\n client\n );\n\n // This should not be concurrent because the first will be a verify and the rest will be a link\n for (const walletAccount of walletAccounts) {\n await verifyWalletAccount({ walletAccount }, client);\n }\n\n return { walletAccounts };\n }\n\n /**\n * This reconstructs the message that was signed by the wallet and verifies the signature\n * in the backend. It will update the user with the new verified credentials.\n */\n await verifyWalletConnectAuths(\n {\n auths,\n chain,\n walletDisplayName: session.peer.metadata.name,\n },\n client\n );\n\n const { walletAccounts } = await importWalletConnectSession(\n {\n addToDynamicWalletAccounts: true,\n sessionTopic: session.topic,\n walletProviderBuilder,\n },\n client\n );\n\n return { walletAccounts };\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n getAppMetadata,\n getCore,\n} from '@dynamic-labs-sdk/client/core';\nimport SignClient from '@walletconnect/sign-client';\n\n/** @notInstrumented */\nexport const createSignClient = async (client: DynamicClient) => {\n const core = getCore(client);\n\n assertDefined(client.projectSettings, 'Project settings not available');\n\n const projectId = client.projectSettings.sdk.walletConnect?.projectId;\n\n assertDefined(\n projectId,\n 'Please configure a project ID for WalletConnect in dashboard'\n );\n\n const { appName, appLogoUrl, appNativeLink, appUniversalLink } =\n getAppMetadata(client);\n\n assertDefined(\n appName,\n 'Please configure an app name in dashboard or DynamicClient metadata to use WalletConnect'\n );\n\n const customStoragePrefix = `dynamic_${core.environmentId}_walletconnect`;\n\n return SignClient.init({\n customStoragePrefix,\n metadata: {\n description: '',\n icons: appLogoUrl ? [appLogoUrl] : [],\n name: appName,\n redirect: {\n native: appNativeLink,\n universal: appUniversalLink,\n },\n url: appUniversalLink ?? '',\n },\n projectId,\n });\n};\n","import { createRuntimeServiceAccessKey } from '@dynamic-labs-sdk/client/core';\n\nimport { createSignClient } from './createSignClient';\n\nexport const getSignClient = createRuntimeServiceAccessKey(\n 'walletConnectSignClient',\n (client) => createSignClient(client)\n);\n","import { assertPackageVersion } from '@dynamic-labs-sdk/assert-package-version';\n\nimport { name, version } from '../../package.json';\n\nassertPackageVersion(name, version);\n\nexport { createWalletConnectSessionEventEmitter } from '../createWalletConnectSessionEventEmitter';\nexport { SessionClosedUnexpectedlyError } from '../errors/SessionClosedUnexpectedlyError';\nexport { importWalletConnectAuthResponse } from '../importWalletConnectAuthResponse';\nexport { importWalletConnectSession } from '../importWalletConnectSession';\nexport { getSignClient } from '../signClient/getSignClient';\nexport { splitCaip10Token } from '../splitCaip10Token';\nexport type { WalletProviderBuilder } from '../walletConnectWalletProvider.types';\n"],"mappings":"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"}
|
package/dist/core.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as name, r as version, t as SessionClosedUnexpectedlyError } from "./SessionClosedUnexpectedlyError-
|
|
1
|
+
import { n as name, r as version, t as SessionClosedUnexpectedlyError } from "./SessionClosedUnexpectedlyError-Az0CPLXv.esm.js";
|
|
2
2
|
import { assertPackageVersion } from "@dynamic-labs-sdk/assert-package-version";
|
|
3
3
|
import { formatMessage } from "@walletconnect/utils";
|
|
4
4
|
import { verifyWalletAccount } from "@dynamic-labs-sdk/client";
|
|
@@ -21,7 +21,7 @@ import SignClient from "@walletconnect/sign-client";
|
|
|
21
21
|
* See docs: https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-10.md
|
|
22
22
|
*
|
|
23
23
|
* @returns An object with the address, namespace key, and network id
|
|
24
|
-
* @
|
|
24
|
+
* @notInstrumented
|
|
25
25
|
*/
|
|
26
26
|
const splitCaip10Token = (caip10Token) => {
|
|
27
27
|
const [namespaceKey, networkId, address] = caip10Token.split(":");
|
|
@@ -45,7 +45,7 @@ const splitCaip10Token = (caip10Token) => {
|
|
|
45
45
|
* @param params.signClient - The WalletConnect sign client instance
|
|
46
46
|
* @param params.formatAddress - Optional function to format addresses (e.g., EIP-55 for EVM)
|
|
47
47
|
* @returns An object with cleanupEventEmitter and getEventEmitter functions
|
|
48
|
-
* @
|
|
48
|
+
* @notInstrumented
|
|
49
49
|
*/
|
|
50
50
|
const createWalletConnectSessionEventEmitter = ({ formatAddress, getSession, namespaceKey, sessionTopic, signClient }) => {
|
|
51
51
|
return createWalletProviderEventEmitter({
|
|
@@ -82,7 +82,7 @@ const createWalletConnectSessionEventEmitter = ({ formatAddress, getSession, nam
|
|
|
82
82
|
|
|
83
83
|
//#endregion
|
|
84
84
|
//#region src/createWalletAccountsForWalletConnectWalletProvider/createWalletAccountsForWalletConnectWalletProvider.ts
|
|
85
|
-
/** @
|
|
85
|
+
/** @notInstrumented */
|
|
86
86
|
const createWalletAccountsForWalletConnectWalletProvider = ({ walletProvider }) => {
|
|
87
87
|
/**
|
|
88
88
|
* Since each session can have multiple namespaces, we need to find the namespace
|
|
@@ -121,7 +121,7 @@ const createWalletAccountsForWalletConnectWalletProvider = ({ walletProvider })
|
|
|
121
121
|
* @param addToDynamicWalletAccounts - Whether to add the wallet accounts to the dynamic's wallet accounts.
|
|
122
122
|
* @param client - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
123
123
|
* @returns The wallet accounts.
|
|
124
|
-
* @
|
|
124
|
+
* @notInstrumented
|
|
125
125
|
*/
|
|
126
126
|
const importWalletConnectSession = async ({ addToDynamicWalletAccounts = true, sessionTopic, walletProviderBuilder }, client) => {
|
|
127
127
|
/**
|
|
@@ -172,7 +172,7 @@ const importWalletConnectSession = async ({ addToDynamicWalletAccounts = true, s
|
|
|
172
172
|
//#endregion
|
|
173
173
|
//#region src/importWalletConnectAuthResponse/verifyWalletConnectAuths/verifyWalletConnectAuths.ts
|
|
174
174
|
const getAddressFromIss = (iss) => iss.split(":")[4];
|
|
175
|
-
/** @
|
|
175
|
+
/** @notInstrumented */
|
|
176
176
|
const verifyWalletConnectAuths = async ({ auths, chain, walletDisplayName }, client) => {
|
|
177
177
|
/**
|
|
178
178
|
* The only differences between each auth object will be the signature (auth.s.s)
|
|
@@ -232,7 +232,7 @@ const verifyWalletConnectAuths = async ({ auths, chain, walletDisplayName }, cli
|
|
|
232
232
|
* @see WalletConnect's docs on [session authentication](https://docs.reown.com/advanced/api/sign/dapp-usage#session-authenticate-with-recaps)
|
|
233
233
|
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
234
234
|
* @returns A promise that resolves to the connected and verified wallet account.
|
|
235
|
-
* @
|
|
235
|
+
* @notInstrumented
|
|
236
236
|
*/
|
|
237
237
|
const importWalletConnectAuthResponse = async ({ authResponse, chain, walletProviderBuilder }, client) => {
|
|
238
238
|
const { session, auths } = authResponse;
|
|
@@ -269,7 +269,7 @@ const importWalletConnectAuthResponse = async ({ authResponse, chain, walletProv
|
|
|
269
269
|
|
|
270
270
|
//#endregion
|
|
271
271
|
//#region src/signClient/getSignClient/createSignClient/createSignClient.ts
|
|
272
|
-
/** @
|
|
272
|
+
/** @notInstrumented */
|
|
273
273
|
const createSignClient = async (client) => {
|
|
274
274
|
const core = getCore(client);
|
|
275
275
|
assertDefined(client.projectSettings, "Project settings not available");
|
package/dist/core.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.esm.js","names":["lastResponse: VerifyResponse | undefined","walletAccounts"],"sources":["../src/splitCaip10Token/splitCaip10Token.ts","../src/createWalletConnectSessionEventEmitter/createWalletConnectSessionEventEmitter.ts","../src/createWalletAccountsForWalletConnectWalletProvider/createWalletAccountsForWalletConnectWalletProvider.ts","../src/importWalletConnectSession/importWalletConnectSession.ts","../src/importWalletConnectAuthResponse/verifyWalletConnectAuths/verifyWalletConnectAuths.ts","../src/importWalletConnectAuthResponse/importWalletConnectAuthResponse.ts","../src/signClient/getSignClient/createSignClient/createSignClient.ts","../src/signClient/getSignClient/getSignClient.ts","../src/exports/core.ts"],"sourcesContent":["/**\n * An account in WalletConnect follows the CAIP-10 standard\n * and is formatted as follows:\n *\n * `<namespace>:<chain>:<address>`\n *\n * Where:\n * - `<namespace>` is the namespace key (e.g. \"eip155\")\n * - `<chain>` is what we refer to as a network ID (e.g. \"1\")\n * - `<address>` is the address of the account (e.g. \"0x1234567890\")\n *\n * See docs: https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-10.md\n *\n * @returns An object with the address, namespace key, and network id\n * @not-instrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const splitCaip10Token = (caip10Token: string) => {\n const [namespaceKey, networkId, address] = caip10Token.split(':');\n return { address, namespaceKey, networkId };\n};\n","import {\n createWalletProviderEventEmitter,\n filterDuplicates,\n} from '@dynamic-labs-sdk/client/core';\nimport type SignClient from '@walletconnect/sign-client';\nimport type { SessionTypes } from '@walletconnect/types';\n\nimport { splitCaip10Token } from '../splitCaip10Token';\n\ntype CreateWalletConnectSessionEventEmitterParams = {\n /**\n * Optional function to format addresses. If not provided, addresses are used as-is.\n */\n formatAddress?: (address: string) => string;\n getSession: () => SessionTypes.Struct;\n namespaceKey: string;\n sessionTopic: string;\n signClient: SignClient;\n};\n\ntype SessionEventPayload = {\n params: {\n event: {\n data: unknown;\n name: string;\n };\n };\n topic: string;\n};\n\n/**\n * Creates a WalletConnect session event emitter with common event handling logic.\n *\n * Handles chainChanged, accountsChanged, and disconnected events from WalletConnect sessions.\n *\n * @param params.getSession - Function to get the current session\n * @param params.namespaceKey - The WalletConnect namespace key (e.g., 'eip155', 'solana')\n * @param params.sessionTopic - The session topic to listen for events\n * @param params.signClient - The WalletConnect sign client instance\n * @param params.formatAddress - Optional function to format addresses (e.g., EIP-55 for EVM)\n * @returns An object with cleanupEventEmitter and getEventEmitter functions\n * @not-instrumented\n */\nexport const createWalletConnectSessionEventEmitter = ({\n formatAddress,\n getSession,\n namespaceKey,\n sessionTopic,\n signClient,\n}: CreateWalletConnectSessionEventEmitterParams) => {\n return createWalletProviderEventEmitter<(event: SessionEventPayload) => void>(\n {\n removeEventListeners: ({ setupReturnValue: handleSessionEvent }) => {\n signClient.off('session_event', handleSessionEvent);\n },\n\n setupEventListeners: ({\n handleAccountsChanged,\n handleDisconnected,\n handleNetworkChanged,\n }) => {\n const handleSessionEvent = ({\n params: { event },\n topic,\n }: SessionEventPayload) => {\n if (topic !== sessionTopic) {\n return;\n }\n\n if (event.name === 'chainChanged') {\n const networkParam = event.data as string;\n\n // Handle potentially CAIP-2 format\n const networkId = networkParam.startsWith(`${namespaceKey}:`)\n ? networkParam.split(':')[1]\n : networkParam;\n\n handleNetworkChanged({ networkId });\n\n return;\n }\n\n if (event.name === 'accountsChanged') {\n const accountsParam = event.data as string[];\n\n const addresses = filterDuplicates(\n accountsParam.map((account) => {\n // Handle potentially CAIP-10 format\n if (account.startsWith(`${namespaceKey}:`)) {\n return splitCaip10Token(account).address;\n }\n\n return account;\n })\n ).map((address) =>\n formatAddress ? formatAddress(address) : address\n );\n\n handleAccountsChanged({ addresses });\n\n return;\n }\n\n if (event.name === 'disconnected') {\n handleDisconnected();\n\n return;\n }\n };\n\n // Assert the session is still valid\n getSession();\n\n signClient.on('session_event', handleSessionEvent);\n\n return handleSessionEvent;\n },\n }\n );\n};\n","import { type WalletAccount } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n filterDuplicates,\n formatWalletAccountId,\n} from '@dynamic-labs-sdk/client/core';\n\nimport type { WalletConnectWalletProvider } from '../walletConnectWalletProvider.types';\nimport { splitCaip10Token } from '../splitCaip10Token';\n\ntype CreateWalletAccountsForWalletConnectWalletProviderParams = {\n walletProvider: WalletConnectWalletProvider;\n};\n\n/** @not-instrumented */\nexport const createWalletAccountsForWalletConnectWalletProvider = ({\n walletProvider,\n}: CreateWalletAccountsForWalletConnectWalletProviderParams): WalletAccount[] => {\n /**\n * Since each session can have multiple namespaces, we need to find the namespace\n * that corresponds to this specific wallet provider.\n *\n * A WalletConnect namespace is the equivalent of what we refer to as a chain in the SDK,\n * and they have attributed to them the methods, events and networks that are expected\n * to be supported by the wallet application, as well as which accounts are connected.\n */\n const session = walletProvider.getSession();\n\n const namespace = session.namespaces[walletProvider.namespaceKey];\n\n assertDefined(\n namespace,\n `Namespace key ${walletProvider.namespaceKey} of wallet provider ${walletProvider.key} not found in its session ${session.topic}`\n );\n\n const accountAddresses = filterDuplicates(\n namespace.accounts.map((account) => splitCaip10Token(account).address)\n );\n\n const formatAddress =\n walletProvider.formatWalletAddress ?? (({ address }) => address);\n\n return accountAddresses.map((address) => ({\n address: formatAddress({ address }),\n chain: walletProvider.chain,\n id: formatWalletAccountId({\n address,\n chain: walletProvider.chain,\n walletProviderKey: walletProvider.key,\n }),\n lastSelectedAt: null,\n verifiedCredentialId: null,\n walletProviderKey: walletProvider.key,\n }));\n};\n","import type { DynamicClient, WalletAccount } from '@dynamic-labs-sdk/client';\nimport {\n WalletProviderPriority,\n getWalletProviderRegistry,\n reconcileWalletAccountsAgainstClient,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { createWalletAccountsForWalletConnectWalletProvider } from '../createWalletAccountsForWalletConnectWalletProvider';\nimport type { WalletProviderBuilder } from '../walletConnectWalletProvider.types';\n\ntype ImportWalletConnectSessionParams = {\n /**\n * Whether this session's wallet accounts should be added to the dynamic's wallet accounts.\n */\n addToDynamicWalletAccounts?: boolean;\n\n /**\n * The session topic of the WalletConnect session.\n */\n sessionTopic: string;\n\n /**\n * The function that builds the wallet provider for the session.\n */\n walletProviderBuilder: WalletProviderBuilder;\n};\n\n/**\n * This is a lower level function that is used to connect a WalletConnect session to the Dynamic SDK.\n * It will generate the wallet providers and wallet accounts for all accounts in the session.\n *\n * @param sessionTopic - The session topic of the WalletConnect session.\n * @param addToDynamicWalletAccounts - Whether to add the wallet accounts to the dynamic's wallet accounts.\n * @param client - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns The wallet accounts.\n * @not-instrumented\n */\nexport const importWalletConnectSession = async (\n {\n addToDynamicWalletAccounts = true,\n sessionTopic,\n walletProviderBuilder,\n }: ImportWalletConnectSessionParams,\n client: DynamicClient\n): Promise<{ walletAccounts: WalletAccount[] }> => {\n /**\n * You would normally get the session from the signClient.connect method. It takes the optionalNamespaces as an argument.\n *\n * Each chain should build its own \"connectWithWalletConnect<chain-name>\" function.\n * Understand how to build the optionalNamespaces object:\n *\n * The namespace configurations are used at the time a wallet application receives the connection URI.\n * It will use the configurations we supply to understand which methods, events and networks it should provide.\n *\n * The wallet application will then accept the connection request and, in the session`object, provide its own namespace object\n * in return, which will contain the methods, events and networks it does in fact support, as well as\n * which accounts are available.\n *\n * WalletConnect expects namespaces defined in the following format:\n * ```typescript\n * {\n * <namespaceKey>: {\n * \"accounts\": [\"<account1>\", \"<account2>\", \"<account3>\", ...],\n * \"events\": [\"accountsChanged\", \"chainChanged\", \"disconnected\"],\n * \"methods\": [\"personal_sign\", \"eth_sendTransaction\", \"eth_accounts\", ...],\n * \"chains\": [\"<chain1>\", \"<chain2>\", \"<chain3>\", ...]\n * },\n * ...\n * }\n * ```\n *\n * Where each account is a CAIP-10 formatted string, for example: \"eip155:1:0x1234567890\"\n * — see docs: https://chainagnostic.org/CAIPs/caip-10\n *\n * Where each chain is a CAIP-2 formatted string, for example: \"eip155:1\"\n * — see docs: https://chainagnostic.org/CAIPs/caip-2\n */\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n const walletProvider = await walletProviderBuilder({ sessionTopic }, client);\n\n walletProviderRegistry.register({\n priority: WalletProviderPriority.WALLET_SDK,\n walletProvider,\n });\n\n const walletAccounts = createWalletAccountsForWalletConnectWalletProvider({\n walletProvider,\n });\n\n const reconciledWalletAccounts = reconcileWalletAccountsAgainstClient(\n {\n addToDynamicWalletAccounts,\n walletAccounts,\n walletProviderKey: walletProvider.key,\n },\n client\n );\n\n return { walletAccounts: reconciledWalletAccounts };\n};\n","import type {\n Chain,\n DynamicClient,\n VerifyResponse,\n} from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n updateAuthFromVerifyResponse,\n verifyMessageSignatureOwnership,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport type { AuthTypes } from '@walletconnect/types';\nimport { formatMessage } from '@walletconnect/utils';\n\nconst getAddressFromIss = (iss: string) => iss.split(':')[4];\n\ntype VerifyWalletConnectAuthsParams = {\n auths: AuthTypes.Cacao[];\n chain: Chain;\n walletDisplayName: string;\n};\n\n/** @not-instrumented */\n \nexport const verifyWalletConnectAuths = async (\n { auths, chain, walletDisplayName }: VerifyWalletConnectAuthsParams,\n client: DynamicClient\n) => {\n /**\n * The only differences between each auth object will be the signature (auth.s.s)\n * and the iss (auth.p.iss).\n *\n * The iss is comprised of 2 WC fields that are irrelevant to us and then the CAIP-10 token\n * of the address, where the first 2 fields are also split by the \":\" character.\n *\n * Usually, there will be multiple auths if the wallet app bundles signatures for multiple\n * networks at once, so the only field that will change among auth iss will be the networkId under iss.\n *\n * Docs on Cacao: https://chainagnostic.org/CAIPs/caip-74\n */\n const visitedAddresses = new Set<string>();\n\n const authsFilteredByAddress = auths.filter((auth) => {\n const address = getAddressFromIss(auth.p.iss);\n\n if (!address || visitedAddresses.has(address)) {\n return false;\n }\n\n visitedAddresses.add(address);\n\n return true;\n });\n\n let lastResponse: VerifyResponse | undefined = undefined;\n\n /**\n * WalletConnect's auth object is what they call a \"Cacao\" object, with data on the SIWE message\n * and the signature itself.\n * By consulting how they implemented their \"validateSignedCacao\" function,\n * we are able to reconstruct the original message which can be used to verify the signature\n * in our backend.\n */\n for (const auth of authsFilteredByAddress) {\n const publicWalletAddress = getAddressFromIss(auth.p.iss);\n\n assertDefined(\n publicWalletAddress,\n `Unable to get public wallet address from WalletConnect Cacao object iss: ${auth.p.iss}`\n );\n\n const messageToSign = formatMessage(auth.p, auth.p.iss);\n\n const signature = auth.s.s;\n\n lastResponse = await verifyMessageSignatureOwnership(\n {\n chain,\n messageToSign,\n signature,\n walletAddress: publicWalletAddress,\n walletDisplayName,\n walletProviderType: WalletProviderEnum.WalletConnect,\n },\n client\n );\n }\n\n if (!lastResponse) {\n return;\n }\n\n /**\n * Adds the user with the new wallet verified credentials\n * This will add the new verified wallet accounts to the client`s state\n */\n updateAuthFromVerifyResponse({ response: lastResponse }, client);\n};\n","import type { Chain, DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n type WalletAccount,\n verifyWalletAccount,\n} from '@dynamic-labs-sdk/client';\nimport type { AuthTypes } from '@walletconnect/types';\n\nimport type { WalletProviderBuilder } from '../walletConnectWalletProvider.types';\nimport { importWalletConnectSession } from '../importWalletConnectSession';\nimport { verifyWalletConnectAuths } from './verifyWalletConnectAuths';\n\ntype ImportWalletConnectAuthResponseParams = {\n /**\n * The response from the WalletConnect authenticate method.\n */\n authResponse: AuthTypes.AuthenticateResponseResult;\n\n /**\n * The chain with which the wallet account is associated.\n */\n chain: Chain;\n\n /**\n * The function that builds the wallet provider for the session.\n */\n walletProviderBuilder: WalletProviderBuilder;\n};\n\n/**\n * A low level function that is used to connect a WalletConnect authenticate response to the Dynamic SDK.\n * It will generate the wallet providers and wallet accounts for all accounts in the session.\n *\n * @see WalletConnect's docs on [session authentication](https://docs.reown.com/advanced/api/sign/dapp-usage#session-authenticate-with-recaps)\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns A promise that resolves to the connected and verified wallet account.\n * @not-instrumented\n */\nexport const importWalletConnectAuthResponse = async (\n {\n authResponse,\n chain,\n walletProviderBuilder,\n }: ImportWalletConnectAuthResponseParams,\n client: DynamicClient\n): Promise<{ walletAccounts: WalletAccount[] }> => {\n const { session, auths } = authResponse;\n\n /**\n * Some wallets do not support WC's authenticate method (such as Rainbow).\n * For these wallets, the authenticate method will act as a regular connect method.\n * Therefore we must call verify individually.\n */\n if (!auths || auths.length === 0) {\n const { walletAccounts } = await importWalletConnectSession(\n {\n /**\n * Don't add the wallet accounts to the dynamic's wallet accounts while we are still verifying them.\n */\n addToDynamicWalletAccounts: false,\n sessionTopic: session.topic,\n walletProviderBuilder,\n },\n client\n );\n\n // This should not be concurrent because the first will be a verify and the rest will be a link\n for (const walletAccount of walletAccounts) {\n await verifyWalletAccount({ walletAccount }, client);\n }\n\n return { walletAccounts };\n }\n\n /**\n * This reconstructs the message that was signed by the wallet and verifies the signature\n * in the backend. It will update the user with the new verified credentials.\n */\n await verifyWalletConnectAuths(\n {\n auths,\n chain,\n walletDisplayName: session.peer.metadata.name,\n },\n client\n );\n\n const { walletAccounts } = await importWalletConnectSession(\n {\n addToDynamicWalletAccounts: true,\n sessionTopic: session.topic,\n walletProviderBuilder,\n },\n client\n );\n\n return { walletAccounts };\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n getAppMetadata,\n getCore,\n} from '@dynamic-labs-sdk/client/core';\nimport SignClient from '@walletconnect/sign-client';\n\n/** @not-instrumented */\nexport const createSignClient = async (client: DynamicClient) => {\n const core = getCore(client);\n\n assertDefined(client.projectSettings, 'Project settings not available');\n\n const projectId = client.projectSettings.sdk.walletConnect?.projectId;\n\n assertDefined(\n projectId,\n 'Please configure a project ID for WalletConnect in dashboard'\n );\n\n const { appName, appLogoUrl, appNativeLink, appUniversalLink } =\n getAppMetadata(client);\n\n assertDefined(\n appName,\n 'Please configure an app name in dashboard or DynamicClient metadata to use WalletConnect'\n );\n\n const customStoragePrefix = `dynamic_${core.environmentId}_walletconnect`;\n\n return SignClient.init({\n customStoragePrefix,\n metadata: {\n description: '',\n icons: appLogoUrl ? [appLogoUrl] : [],\n name: appName,\n redirect: {\n native: appNativeLink,\n universal: appUniversalLink,\n },\n url: appUniversalLink ?? '',\n },\n projectId,\n });\n};\n","import { createRuntimeServiceAccessKey } from '@dynamic-labs-sdk/client/core';\n\nimport { createSignClient } from './createSignClient';\n\nexport const getSignClient = createRuntimeServiceAccessKey(\n 'walletConnectSignClient',\n (client) => createSignClient(client)\n);\n","import { assertPackageVersion } from '@dynamic-labs-sdk/assert-package-version';\n\nimport { name, version } from '../../package.json';\n\nassertPackageVersion(name, version);\n\nexport { createWalletConnectSessionEventEmitter } from '../createWalletConnectSessionEventEmitter';\nexport { SessionClosedUnexpectedlyError } from '../errors/SessionClosedUnexpectedlyError';\nexport { importWalletConnectAuthResponse } from '../importWalletConnectAuthResponse';\nexport { importWalletConnectSession } from '../importWalletConnectSession';\nexport { getSignClient } from '../signClient/getSignClient';\nexport { splitCaip10Token } from '../splitCaip10Token';\nexport type { WalletProviderBuilder } from '../walletConnectWalletProvider.types';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core.esm.js","names":["lastResponse: VerifyResponse | undefined","walletAccounts"],"sources":["../src/splitCaip10Token/splitCaip10Token.ts","../src/createWalletConnectSessionEventEmitter/createWalletConnectSessionEventEmitter.ts","../src/createWalletAccountsForWalletConnectWalletProvider/createWalletAccountsForWalletConnectWalletProvider.ts","../src/importWalletConnectSession/importWalletConnectSession.ts","../src/importWalletConnectAuthResponse/verifyWalletConnectAuths/verifyWalletConnectAuths.ts","../src/importWalletConnectAuthResponse/importWalletConnectAuthResponse.ts","../src/signClient/getSignClient/createSignClient/createSignClient.ts","../src/signClient/getSignClient/getSignClient.ts","../src/exports/core.ts"],"sourcesContent":["/**\n * An account in WalletConnect follows the CAIP-10 standard\n * and is formatted as follows:\n *\n * `<namespace>:<chain>:<address>`\n *\n * Where:\n * - `<namespace>` is the namespace key (e.g. \"eip155\")\n * - `<chain>` is what we refer to as a network ID (e.g. \"1\")\n * - `<address>` is the address of the account (e.g. \"0x1234567890\")\n *\n * See docs: https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-10.md\n *\n * @returns An object with the address, namespace key, and network id\n * @notInstrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const splitCaip10Token = (caip10Token: string) => {\n const [namespaceKey, networkId, address] = caip10Token.split(':');\n return { address, namespaceKey, networkId };\n};\n","import {\n createWalletProviderEventEmitter,\n filterDuplicates,\n} from '@dynamic-labs-sdk/client/core';\nimport type SignClient from '@walletconnect/sign-client';\nimport type { SessionTypes } from '@walletconnect/types';\n\nimport { splitCaip10Token } from '../splitCaip10Token';\n\ntype CreateWalletConnectSessionEventEmitterParams = {\n /**\n * Optional function to format addresses. If not provided, addresses are used as-is.\n */\n formatAddress?: (address: string) => string;\n getSession: () => SessionTypes.Struct;\n namespaceKey: string;\n sessionTopic: string;\n signClient: SignClient;\n};\n\ntype SessionEventPayload = {\n params: {\n event: {\n data: unknown;\n name: string;\n };\n };\n topic: string;\n};\n\n/**\n * Creates a WalletConnect session event emitter with common event handling logic.\n *\n * Handles chainChanged, accountsChanged, and disconnected events from WalletConnect sessions.\n *\n * @param params.getSession - Function to get the current session\n * @param params.namespaceKey - The WalletConnect namespace key (e.g., 'eip155', 'solana')\n * @param params.sessionTopic - The session topic to listen for events\n * @param params.signClient - The WalletConnect sign client instance\n * @param params.formatAddress - Optional function to format addresses (e.g., EIP-55 for EVM)\n * @returns An object with cleanupEventEmitter and getEventEmitter functions\n * @notInstrumented\n */\nexport const createWalletConnectSessionEventEmitter = ({\n formatAddress,\n getSession,\n namespaceKey,\n sessionTopic,\n signClient,\n}: CreateWalletConnectSessionEventEmitterParams) => {\n return createWalletProviderEventEmitter<(event: SessionEventPayload) => void>(\n {\n removeEventListeners: ({ setupReturnValue: handleSessionEvent }) => {\n signClient.off('session_event', handleSessionEvent);\n },\n\n setupEventListeners: ({\n handleAccountsChanged,\n handleDisconnected,\n handleNetworkChanged,\n }) => {\n const handleSessionEvent = ({\n params: { event },\n topic,\n }: SessionEventPayload) => {\n if (topic !== sessionTopic) {\n return;\n }\n\n if (event.name === 'chainChanged') {\n const networkParam = event.data as string;\n\n // Handle potentially CAIP-2 format\n const networkId = networkParam.startsWith(`${namespaceKey}:`)\n ? networkParam.split(':')[1]\n : networkParam;\n\n handleNetworkChanged({ networkId });\n\n return;\n }\n\n if (event.name === 'accountsChanged') {\n const accountsParam = event.data as string[];\n\n const addresses = filterDuplicates(\n accountsParam.map((account) => {\n // Handle potentially CAIP-10 format\n if (account.startsWith(`${namespaceKey}:`)) {\n return splitCaip10Token(account).address;\n }\n\n return account;\n })\n ).map((address) =>\n formatAddress ? formatAddress(address) : address\n );\n\n handleAccountsChanged({ addresses });\n\n return;\n }\n\n if (event.name === 'disconnected') {\n handleDisconnected();\n\n return;\n }\n };\n\n // Assert the session is still valid\n getSession();\n\n signClient.on('session_event', handleSessionEvent);\n\n return handleSessionEvent;\n },\n }\n );\n};\n","import { type WalletAccount } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n filterDuplicates,\n formatWalletAccountId,\n} from '@dynamic-labs-sdk/client/core';\n\nimport type { WalletConnectWalletProvider } from '../walletConnectWalletProvider.types';\nimport { splitCaip10Token } from '../splitCaip10Token';\n\ntype CreateWalletAccountsForWalletConnectWalletProviderParams = {\n walletProvider: WalletConnectWalletProvider;\n};\n\n/** @notInstrumented */\nexport const createWalletAccountsForWalletConnectWalletProvider = ({\n walletProvider,\n}: CreateWalletAccountsForWalletConnectWalletProviderParams): WalletAccount[] => {\n /**\n * Since each session can have multiple namespaces, we need to find the namespace\n * that corresponds to this specific wallet provider.\n *\n * A WalletConnect namespace is the equivalent of what we refer to as a chain in the SDK,\n * and they have attributed to them the methods, events and networks that are expected\n * to be supported by the wallet application, as well as which accounts are connected.\n */\n const session = walletProvider.getSession();\n\n const namespace = session.namespaces[walletProvider.namespaceKey];\n\n assertDefined(\n namespace,\n `Namespace key ${walletProvider.namespaceKey} of wallet provider ${walletProvider.key} not found in its session ${session.topic}`\n );\n\n const accountAddresses = filterDuplicates(\n namespace.accounts.map((account) => splitCaip10Token(account).address)\n );\n\n const formatAddress =\n walletProvider.formatWalletAddress ?? (({ address }) => address);\n\n return accountAddresses.map((address) => ({\n address: formatAddress({ address }),\n chain: walletProvider.chain,\n id: formatWalletAccountId({\n address,\n chain: walletProvider.chain,\n walletProviderKey: walletProvider.key,\n }),\n lastSelectedAt: null,\n verifiedCredentialId: null,\n walletProviderKey: walletProvider.key,\n }));\n};\n","import type { DynamicClient, WalletAccount } from '@dynamic-labs-sdk/client';\nimport {\n WalletProviderPriority,\n getWalletProviderRegistry,\n reconcileWalletAccountsAgainstClient,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { createWalletAccountsForWalletConnectWalletProvider } from '../createWalletAccountsForWalletConnectWalletProvider';\nimport type { WalletProviderBuilder } from '../walletConnectWalletProvider.types';\n\ntype ImportWalletConnectSessionParams = {\n /**\n * Whether this session's wallet accounts should be added to the dynamic's wallet accounts.\n */\n addToDynamicWalletAccounts?: boolean;\n\n /**\n * The session topic of the WalletConnect session.\n */\n sessionTopic: string;\n\n /**\n * The function that builds the wallet provider for the session.\n */\n walletProviderBuilder: WalletProviderBuilder;\n};\n\n/**\n * This is a lower level function that is used to connect a WalletConnect session to the Dynamic SDK.\n * It will generate the wallet providers and wallet accounts for all accounts in the session.\n *\n * @param sessionTopic - The session topic of the WalletConnect session.\n * @param addToDynamicWalletAccounts - Whether to add the wallet accounts to the dynamic's wallet accounts.\n * @param client - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns The wallet accounts.\n * @notInstrumented\n */\nexport const importWalletConnectSession = async (\n {\n addToDynamicWalletAccounts = true,\n sessionTopic,\n walletProviderBuilder,\n }: ImportWalletConnectSessionParams,\n client: DynamicClient\n): Promise<{ walletAccounts: WalletAccount[] }> => {\n /**\n * You would normally get the session from the signClient.connect method. It takes the optionalNamespaces as an argument.\n *\n * Each chain should build its own \"connectWithWalletConnect<chain-name>\" function.\n * Understand how to build the optionalNamespaces object:\n *\n * The namespace configurations are used at the time a wallet application receives the connection URI.\n * It will use the configurations we supply to understand which methods, events and networks it should provide.\n *\n * The wallet application will then accept the connection request and, in the session`object, provide its own namespace object\n * in return, which will contain the methods, events and networks it does in fact support, as well as\n * which accounts are available.\n *\n * WalletConnect expects namespaces defined in the following format:\n * ```typescript\n * {\n * <namespaceKey>: {\n * \"accounts\": [\"<account1>\", \"<account2>\", \"<account3>\", ...],\n * \"events\": [\"accountsChanged\", \"chainChanged\", \"disconnected\"],\n * \"methods\": [\"personal_sign\", \"eth_sendTransaction\", \"eth_accounts\", ...],\n * \"chains\": [\"<chain1>\", \"<chain2>\", \"<chain3>\", ...]\n * },\n * ...\n * }\n * ```\n *\n * Where each account is a CAIP-10 formatted string, for example: \"eip155:1:0x1234567890\"\n * — see docs: https://chainagnostic.org/CAIPs/caip-10\n *\n * Where each chain is a CAIP-2 formatted string, for example: \"eip155:1\"\n * — see docs: https://chainagnostic.org/CAIPs/caip-2\n */\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n const walletProvider = await walletProviderBuilder({ sessionTopic }, client);\n\n walletProviderRegistry.register({\n priority: WalletProviderPriority.WALLET_SDK,\n walletProvider,\n });\n\n const walletAccounts = createWalletAccountsForWalletConnectWalletProvider({\n walletProvider,\n });\n\n const reconciledWalletAccounts = reconcileWalletAccountsAgainstClient(\n {\n addToDynamicWalletAccounts,\n walletAccounts,\n walletProviderKey: walletProvider.key,\n },\n client\n );\n\n return { walletAccounts: reconciledWalletAccounts };\n};\n","import type {\n Chain,\n DynamicClient,\n VerifyResponse,\n} from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n updateAuthFromVerifyResponse,\n verifyMessageSignatureOwnership,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport type { AuthTypes } from '@walletconnect/types';\nimport { formatMessage } from '@walletconnect/utils';\n\nconst getAddressFromIss = (iss: string) => iss.split(':')[4];\n\ntype VerifyWalletConnectAuthsParams = {\n auths: AuthTypes.Cacao[];\n chain: Chain;\n walletDisplayName: string;\n};\n\n/** @notInstrumented */\n \nexport const verifyWalletConnectAuths = async (\n { auths, chain, walletDisplayName }: VerifyWalletConnectAuthsParams,\n client: DynamicClient\n) => {\n /**\n * The only differences between each auth object will be the signature (auth.s.s)\n * and the iss (auth.p.iss).\n *\n * The iss is comprised of 2 WC fields that are irrelevant to us and then the CAIP-10 token\n * of the address, where the first 2 fields are also split by the \":\" character.\n *\n * Usually, there will be multiple auths if the wallet app bundles signatures for multiple\n * networks at once, so the only field that will change among auth iss will be the networkId under iss.\n *\n * Docs on Cacao: https://chainagnostic.org/CAIPs/caip-74\n */\n const visitedAddresses = new Set<string>();\n\n const authsFilteredByAddress = auths.filter((auth) => {\n const address = getAddressFromIss(auth.p.iss);\n\n if (!address || visitedAddresses.has(address)) {\n return false;\n }\n\n visitedAddresses.add(address);\n\n return true;\n });\n\n let lastResponse: VerifyResponse | undefined = undefined;\n\n /**\n * WalletConnect's auth object is what they call a \"Cacao\" object, with data on the SIWE message\n * and the signature itself.\n * By consulting how they implemented their \"validateSignedCacao\" function,\n * we are able to reconstruct the original message which can be used to verify the signature\n * in our backend.\n */\n for (const auth of authsFilteredByAddress) {\n const publicWalletAddress = getAddressFromIss(auth.p.iss);\n\n assertDefined(\n publicWalletAddress,\n `Unable to get public wallet address from WalletConnect Cacao object iss: ${auth.p.iss}`\n );\n\n const messageToSign = formatMessage(auth.p, auth.p.iss);\n\n const signature = auth.s.s;\n\n lastResponse = await verifyMessageSignatureOwnership(\n {\n chain,\n messageToSign,\n signature,\n walletAddress: publicWalletAddress,\n walletDisplayName,\n walletProviderType: WalletProviderEnum.WalletConnect,\n },\n client\n );\n }\n\n if (!lastResponse) {\n return;\n }\n\n /**\n * Adds the user with the new wallet verified credentials\n * This will add the new verified wallet accounts to the client`s state\n */\n updateAuthFromVerifyResponse({ response: lastResponse }, client);\n};\n","import type { Chain, DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n type WalletAccount,\n verifyWalletAccount,\n} from '@dynamic-labs-sdk/client';\nimport type { AuthTypes } from '@walletconnect/types';\n\nimport type { WalletProviderBuilder } from '../walletConnectWalletProvider.types';\nimport { importWalletConnectSession } from '../importWalletConnectSession';\nimport { verifyWalletConnectAuths } from './verifyWalletConnectAuths';\n\ntype ImportWalletConnectAuthResponseParams = {\n /**\n * The response from the WalletConnect authenticate method.\n */\n authResponse: AuthTypes.AuthenticateResponseResult;\n\n /**\n * The chain with which the wallet account is associated.\n */\n chain: Chain;\n\n /**\n * The function that builds the wallet provider for the session.\n */\n walletProviderBuilder: WalletProviderBuilder;\n};\n\n/**\n * A low level function that is used to connect a WalletConnect authenticate response to the Dynamic SDK.\n * It will generate the wallet providers and wallet accounts for all accounts in the session.\n *\n * @see WalletConnect's docs on [session authentication](https://docs.reown.com/advanced/api/sign/dapp-usage#session-authenticate-with-recaps)\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns A promise that resolves to the connected and verified wallet account.\n * @notInstrumented\n */\nexport const importWalletConnectAuthResponse = async (\n {\n authResponse,\n chain,\n walletProviderBuilder,\n }: ImportWalletConnectAuthResponseParams,\n client: DynamicClient\n): Promise<{ walletAccounts: WalletAccount[] }> => {\n const { session, auths } = authResponse;\n\n /**\n * Some wallets do not support WC's authenticate method (such as Rainbow).\n * For these wallets, the authenticate method will act as a regular connect method.\n * Therefore we must call verify individually.\n */\n if (!auths || auths.length === 0) {\n const { walletAccounts } = await importWalletConnectSession(\n {\n /**\n * Don't add the wallet accounts to the dynamic's wallet accounts while we are still verifying them.\n */\n addToDynamicWalletAccounts: false,\n sessionTopic: session.topic,\n walletProviderBuilder,\n },\n client\n );\n\n // This should not be concurrent because the first will be a verify and the rest will be a link\n for (const walletAccount of walletAccounts) {\n await verifyWalletAccount({ walletAccount }, client);\n }\n\n return { walletAccounts };\n }\n\n /**\n * This reconstructs the message that was signed by the wallet and verifies the signature\n * in the backend. It will update the user with the new verified credentials.\n */\n await verifyWalletConnectAuths(\n {\n auths,\n chain,\n walletDisplayName: session.peer.metadata.name,\n },\n client\n );\n\n const { walletAccounts } = await importWalletConnectSession(\n {\n addToDynamicWalletAccounts: true,\n sessionTopic: session.topic,\n walletProviderBuilder,\n },\n client\n );\n\n return { walletAccounts };\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n getAppMetadata,\n getCore,\n} from '@dynamic-labs-sdk/client/core';\nimport SignClient from '@walletconnect/sign-client';\n\n/** @notInstrumented */\nexport const createSignClient = async (client: DynamicClient) => {\n const core = getCore(client);\n\n assertDefined(client.projectSettings, 'Project settings not available');\n\n const projectId = client.projectSettings.sdk.walletConnect?.projectId;\n\n assertDefined(\n projectId,\n 'Please configure a project ID for WalletConnect in dashboard'\n );\n\n const { appName, appLogoUrl, appNativeLink, appUniversalLink } =\n getAppMetadata(client);\n\n assertDefined(\n appName,\n 'Please configure an app name in dashboard or DynamicClient metadata to use WalletConnect'\n );\n\n const customStoragePrefix = `dynamic_${core.environmentId}_walletconnect`;\n\n return SignClient.init({\n customStoragePrefix,\n metadata: {\n description: '',\n icons: appLogoUrl ? [appLogoUrl] : [],\n name: appName,\n redirect: {\n native: appNativeLink,\n universal: appUniversalLink,\n },\n url: appUniversalLink ?? '',\n },\n projectId,\n });\n};\n","import { createRuntimeServiceAccessKey } from '@dynamic-labs-sdk/client/core';\n\nimport { createSignClient } from './createSignClient';\n\nexport const getSignClient = createRuntimeServiceAccessKey(\n 'walletConnectSignClient',\n (client) => createSignClient(client)\n);\n","import { assertPackageVersion } from '@dynamic-labs-sdk/assert-package-version';\n\nimport { name, version } from '../../package.json';\n\nassertPackageVersion(name, version);\n\nexport { createWalletConnectSessionEventEmitter } from '../createWalletConnectSessionEventEmitter';\nexport { SessionClosedUnexpectedlyError } from '../errors/SessionClosedUnexpectedlyError';\nexport { importWalletConnectAuthResponse } from '../importWalletConnectAuthResponse';\nexport { importWalletConnectSession } from '../importWalletConnectSession';\nexport { getSignClient } from '../signClient/getSignClient';\nexport { splitCaip10Token } from '../splitCaip10Token';\nexport type { WalletProviderBuilder } from '../walletConnectWalletProvider.types';\n"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import type { WalletConnectWalletProvider } from '../walletConnectWalletProvider
|
|
|
3
3
|
type CreateWalletAccountsForWalletConnectWalletProviderParams = {
|
|
4
4
|
walletProvider: WalletConnectWalletProvider;
|
|
5
5
|
};
|
|
6
|
-
/** @
|
|
6
|
+
/** @notInstrumented */
|
|
7
7
|
export declare const createWalletAccountsForWalletConnectWalletProvider: ({ walletProvider, }: CreateWalletAccountsForWalletConnectWalletProviderParams) => WalletAccount[];
|
|
8
8
|
export {};
|
|
9
9
|
//# sourceMappingURL=createWalletAccountsForWalletConnectWalletProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createWalletAccountsForWalletConnectWalletProvider.d.ts","sourceRoot":"","sources":["../../src/createWalletAccountsForWalletConnectWalletProvider/createWalletAccountsForWalletConnectWalletProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAO9D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAGxF,KAAK,wDAAwD,GAAG;IAC9D,cAAc,EAAE,2BAA2B,CAAC;CAC7C,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"createWalletAccountsForWalletConnectWalletProvider.d.ts","sourceRoot":"","sources":["../../src/createWalletAccountsForWalletConnectWalletProvider/createWalletAccountsForWalletConnectWalletProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAO9D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAGxF,KAAK,wDAAwD,GAAG;IAC9D,cAAc,EAAE,2BAA2B,CAAC;CAC7C,CAAC;AAEF,uBAAuB;AACvB,eAAO,MAAM,kDAAkD,wBAE5D,wDAAwD,KAAG,aAAa,EAqC1E,CAAC"}
|
package/dist/createWalletConnectSessionEventEmitter/createWalletConnectSessionEventEmitter.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ type CreateWalletConnectSessionEventEmitterParams = {
|
|
|
21
21
|
* @param params.signClient - The WalletConnect sign client instance
|
|
22
22
|
* @param params.formatAddress - Optional function to format addresses (e.g., EIP-55 for EVM)
|
|
23
23
|
* @returns An object with cleanupEventEmitter and getEventEmitter functions
|
|
24
|
-
* @
|
|
24
|
+
* @notInstrumented
|
|
25
25
|
*/
|
|
26
26
|
export declare const createWalletConnectSessionEventEmitter: ({ formatAddress, getSession, namespaceKey, sessionTopic, signClient, }: CreateWalletConnectSessionEventEmitterParams) => {
|
|
27
27
|
cleanupEventEmitter: () => void;
|
|
@@ -17,7 +17,7 @@ type GetPreferredWalletDeepLinkParams = {
|
|
|
17
17
|
*
|
|
18
18
|
* @param params.deeplinks - The deep link variants for a wallet (typically `WalletConnectCatalogWallet.deeplinks`).
|
|
19
19
|
* @returns The preferred deep link URL, or `undefined` if neither variant is available.
|
|
20
|
-
* @
|
|
20
|
+
* @notInstrumented
|
|
21
21
|
*/
|
|
22
22
|
export declare const getPreferredWalletDeepLink: ({ deeplinks, }: GetPreferredWalletDeepLinkParams) => string | undefined;
|
|
23
23
|
export {};
|
|
@@ -23,7 +23,7 @@ type ImportWalletConnectAuthResponseParams = {
|
|
|
23
23
|
* @see WalletConnect's docs on [session authentication](https://docs.reown.com/advanced/api/sign/dapp-usage#session-authenticate-with-recaps)
|
|
24
24
|
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
25
25
|
* @returns A promise that resolves to the connected and verified wallet account.
|
|
26
|
-
* @
|
|
26
|
+
* @notInstrumented
|
|
27
27
|
*/
|
|
28
28
|
export declare const importWalletConnectAuthResponse: ({ authResponse, chain, walletProviderBuilder, }: ImportWalletConnectAuthResponseParams, client: DynamicClient) => Promise<{
|
|
29
29
|
walletAccounts: WalletAccount[];
|
package/dist/importWalletConnectAuthResponse/verifyWalletConnectAuths/verifyWalletConnectAuths.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ type VerifyWalletConnectAuthsParams = {
|
|
|
5
5
|
chain: Chain;
|
|
6
6
|
walletDisplayName: string;
|
|
7
7
|
};
|
|
8
|
-
/** @
|
|
8
|
+
/** @notInstrumented */
|
|
9
9
|
export declare const verifyWalletConnectAuths: ({ auths, chain, walletDisplayName }: VerifyWalletConnectAuthsParams, client: DynamicClient) => Promise<void>;
|
|
10
10
|
export {};
|
|
11
11
|
//# sourceMappingURL=verifyWalletConnectAuths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyWalletConnectAuths.d.ts","sourceRoot":"","sources":["../../../src/importWalletConnectAuthResponse/verifyWalletConnectAuths/verifyWalletConnectAuths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EAEd,MAAM,0BAA0B,CAAC;AAOlC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKtD,KAAK,8BAA8B,GAAG;IACpC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"verifyWalletConnectAuths.d.ts","sourceRoot":"","sources":["../../../src/importWalletConnectAuthResponse/verifyWalletConnectAuths/verifyWalletConnectAuths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EAEd,MAAM,0BAA0B,CAAC;AAOlC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKtD,KAAK,8BAA8B,GAAG;IACpC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,uBAAuB;AAEvB,eAAO,MAAM,wBAAwB,wCACE,8BAA8B,UAC3D,aAAa,kBAuEtB,CAAC"}
|
|
@@ -22,7 +22,7 @@ type ImportWalletConnectSessionParams = {
|
|
|
22
22
|
* @param addToDynamicWalletAccounts - Whether to add the wallet accounts to the dynamic's wallet accounts.
|
|
23
23
|
* @param client - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
24
24
|
* @returns The wallet accounts.
|
|
25
|
-
* @
|
|
25
|
+
* @notInstrumented
|
|
26
26
|
*/
|
|
27
27
|
export declare const importWalletConnectSession: ({ addToDynamicWalletAccounts, sessionTopic, walletProviderBuilder, }: ImportWalletConnectSessionParams, client: DynamicClient) => Promise<{
|
|
28
28
|
walletAccounts: WalletAccount[];
|
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_SessionClosedUnexpectedlyError = require('./SessionClosedUnexpectedlyError-
|
|
1
|
+
const require_SessionClosedUnexpectedlyError = require('./SessionClosedUnexpectedlyError-KMeogkb4.cjs');
|
|
2
2
|
const require_core = require('./core.cjs');
|
|
3
3
|
let _dynamic_labs_sdk_assert_package_version = require("@dynamic-labs-sdk/assert-package-version");
|
|
4
4
|
let _walletconnect_utils = require("@walletconnect/utils");
|
|
@@ -16,7 +16,7 @@ let _dynamic_labs_sdk_api_core = require("@dynamic-labs/sdk-api-core");
|
|
|
16
16
|
* @param params.deepLinkUrl - The base deeplink URL.
|
|
17
17
|
* @param params.walletConnectUri - The WalletConnect pairing URI to append.
|
|
18
18
|
* @returns The deeplink URL with the WalletConnect URI appended as a query parameter.
|
|
19
|
-
* @
|
|
19
|
+
* @notInstrumented
|
|
20
20
|
*/
|
|
21
21
|
const appendWalletConnectUriToDeepLink = ({ deepLinkUrl, walletConnectUri }) => (0, _dynamic_labs_sdk_client.appendConnectionUriToDeeplink)({
|
|
22
22
|
connectionUri: walletConnectUri,
|
|
@@ -40,7 +40,7 @@ const appendWalletConnectUriToDeepLink = ({ deepLinkUrl, walletConnectUri }) =>
|
|
|
40
40
|
*
|
|
41
41
|
* @param params.deeplinks - The deep link variants for a wallet (typically `WalletConnectCatalogWallet.deeplinks`).
|
|
42
42
|
* @returns The preferred deep link URL, or `undefined` if neither variant is available.
|
|
43
|
-
* @
|
|
43
|
+
* @notInstrumented
|
|
44
44
|
*/
|
|
45
45
|
const getPreferredWalletDeepLink = ({ deeplinks }) => {
|
|
46
46
|
const { native, universal } = deeplinks;
|
|
@@ -50,7 +50,7 @@ const getPreferredWalletDeepLink = ({ deeplinks }) => {
|
|
|
50
50
|
|
|
51
51
|
//#endregion
|
|
52
52
|
//#region src/isWalletConnectWalletProvider/isWalletConnectWalletProvider.ts
|
|
53
|
-
/** @
|
|
53
|
+
/** @notInstrumented */
|
|
54
54
|
const isWalletConnectWalletProvider = (walletProvider) => {
|
|
55
55
|
return walletProvider.walletProviderType === _dynamic_labs_sdk_api_core.WalletProviderEnum.WalletConnect;
|
|
56
56
|
};
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["WalletProviderEnum","name","version"],"sources":["../src/appendWalletConnectUriToDeepLink/appendWalletConnectUriToDeepLink.ts","../src/getPreferredWalletDeepLink/getPreferredWalletDeepLink.ts","../src/isWalletConnectWalletProvider/isWalletConnectWalletProvider.ts","../src/exports/index.ts"],"sourcesContent":["import { appendConnectionUriToDeeplink } from '@dynamic-labs-sdk/client';\n\ntype AppendWalletConnectUriToDeepLinkParams = {\n deepLinkUrl: string;\n walletConnectUri: string;\n};\n\n/**\n * Appends a WalletConnect URI to a deeplink URL.\n *\n * @deprecated Use {@link appendConnectionUriToDeeplink} instead. This helper\n * was renamed to be generic across all URI-deeplink connection options\n * (WalletConnect, MetaMask SDK URI, …).\n *\n * @param params.deepLinkUrl - The base deeplink URL.\n * @param params.walletConnectUri - The WalletConnect pairing URI to append.\n * @returns The deeplink URL with the WalletConnect URI appended as a query parameter.\n * @
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["WalletProviderEnum","name","version"],"sources":["../src/appendWalletConnectUriToDeepLink/appendWalletConnectUriToDeepLink.ts","../src/getPreferredWalletDeepLink/getPreferredWalletDeepLink.ts","../src/isWalletConnectWalletProvider/isWalletConnectWalletProvider.ts","../src/exports/index.ts"],"sourcesContent":["import { appendConnectionUriToDeeplink } from '@dynamic-labs-sdk/client';\n\ntype AppendWalletConnectUriToDeepLinkParams = {\n deepLinkUrl: string;\n walletConnectUri: string;\n};\n\n/**\n * Appends a WalletConnect URI to a deeplink URL.\n *\n * @deprecated Use {@link appendConnectionUriToDeeplink} instead. This helper\n * was renamed to be generic across all URI-deeplink connection options\n * (WalletConnect, MetaMask SDK URI, …).\n *\n * @param params.deepLinkUrl - The base deeplink URL.\n * @param params.walletConnectUri - The WalletConnect pairing URI to append.\n * @returns The deeplink URL with the WalletConnect URI appended as a query parameter.\n * @notInstrumented\n */\nexport const appendWalletConnectUriToDeepLink = ({\n deepLinkUrl,\n walletConnectUri,\n}: AppendWalletConnectUriToDeepLinkParams): string =>\n appendConnectionUriToDeeplink({\n connectionUri: walletConnectUri,\n deeplinkUrl: deepLinkUrl,\n });\n","import type { WalletConnectCatalogDeepLinks } from '@dynamic-labs-sdk/client';\nimport { isMobile } from '@dynamic-labs-sdk/client';\n\ntype GetPreferredWalletDeepLinkParams = {\n deeplinks: WalletConnectCatalogDeepLinks;\n};\n\n/**\n * Picks the most appropriate deep link variant for the current platform.\n *\n * Mobile (Android, iOS, tablets) prefers `native` because the OS treats\n * custom URL schemes as first-class app links and gives the wallet a faster\n * round-trip back to the dApp. Desktop prefers `universal` because browsers\n * cannot resolve mobile-only custom schemes and need an `https://` link\n * that opens the wallet's web flow.\n *\n * In either case, the alternative is used as a fallback when the preferred\n * variant is missing. Returns `undefined` only when both variants are\n * absent.\n *\n * @param params.deeplinks - The deep link variants for a wallet (typically `WalletConnectCatalogWallet.deeplinks`).\n * @returns The preferred deep link URL, or `undefined` if neither variant is available.\n * @notInstrumented\n */\nexport const getPreferredWalletDeepLink = ({\n deeplinks,\n}: GetPreferredWalletDeepLinkParams): string | undefined => {\n const { native, universal } = deeplinks;\n\n if (isMobile()) {\n return native ?? universal;\n }\n\n return universal ?? native;\n};\n","import type { WalletProvider } from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\n\nimport type { WalletConnectWalletProvider } from '../walletConnectWalletProvider.types';\n\n/** @notInstrumented */\nexport const isWalletConnectWalletProvider = (\n walletProvider: WalletProvider\n): walletProvider is WalletConnectWalletProvider => {\n return walletProvider.walletProviderType === WalletProviderEnum.WalletConnect;\n};\n","/* eslint-disable import/no-unassigned-import */\nimport { assertPackageVersion } from '@dynamic-labs-sdk/assert-package-version';\n\nimport { name, version } from '../../package.json';\n\nassertPackageVersion(name, version);\n\nimport '../events';\n\nexport { SDK_ERRORS as WC_ERRORS } from '@walletconnect/utils';\n\nexport { appendWalletConnectUriToDeepLink } from '../appendWalletConnectUriToDeepLink';\nexport { SessionClosedUnexpectedlyError } from '../errors/SessionClosedUnexpectedlyError';\nexport { getPreferredWalletDeepLink } from '../getPreferredWalletDeepLink';\nexport { isWalletConnectWalletProvider } from '../isWalletConnectWalletProvider';\nexport type {\n WalletConnectConnectionResult,\n WalletConnectWalletProvider,\n} from '../walletConnectWalletProvider.types';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmBA,MAAa,oCAAoC,EAC/C,aACA,mFAE8B;CAC5B,eAAe;CACf,aAAa;CACd,CAAC;;;;;;;;;;;;;;;;;;;;;ACFJ,MAAa,8BAA8B,EACzC,gBAC0D;CAC1D,MAAM,EAAE,QAAQ,cAAc;AAE9B,6CAAc,CACZ,QAAO,UAAU;AAGnB,QAAO,aAAa;;;;;;AC3BtB,MAAa,iCACX,mBACkD;AAClD,QAAO,eAAe,uBAAuBA,8CAAmB;;;;;mECJ7CC,6CAAMC,+CAAQ"}
|
package/dist/index.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as name, r as version, t as SessionClosedUnexpectedlyError } from "./SessionClosedUnexpectedlyError-
|
|
1
|
+
import { n as name, r as version, t as SessionClosedUnexpectedlyError } from "./SessionClosedUnexpectedlyError-Az0CPLXv.esm.js";
|
|
2
2
|
import { assertPackageVersion } from "@dynamic-labs-sdk/assert-package-version";
|
|
3
3
|
import { SDK_ERRORS as WC_ERRORS } from "@walletconnect/utils";
|
|
4
4
|
import { appendConnectionUriToDeeplink, isMobile } from "@dynamic-labs-sdk/client";
|
|
@@ -15,7 +15,7 @@ import { WalletProviderEnum } from "@dynamic-labs/sdk-api-core";
|
|
|
15
15
|
* @param params.deepLinkUrl - The base deeplink URL.
|
|
16
16
|
* @param params.walletConnectUri - The WalletConnect pairing URI to append.
|
|
17
17
|
* @returns The deeplink URL with the WalletConnect URI appended as a query parameter.
|
|
18
|
-
* @
|
|
18
|
+
* @notInstrumented
|
|
19
19
|
*/
|
|
20
20
|
const appendWalletConnectUriToDeepLink = ({ deepLinkUrl, walletConnectUri }) => appendConnectionUriToDeeplink({
|
|
21
21
|
connectionUri: walletConnectUri,
|
|
@@ -39,7 +39,7 @@ const appendWalletConnectUriToDeepLink = ({ deepLinkUrl, walletConnectUri }) =>
|
|
|
39
39
|
*
|
|
40
40
|
* @param params.deeplinks - The deep link variants for a wallet (typically `WalletConnectCatalogWallet.deeplinks`).
|
|
41
41
|
* @returns The preferred deep link URL, or `undefined` if neither variant is available.
|
|
42
|
-
* @
|
|
42
|
+
* @notInstrumented
|
|
43
43
|
*/
|
|
44
44
|
const getPreferredWalletDeepLink = ({ deeplinks }) => {
|
|
45
45
|
const { native, universal } = deeplinks;
|
|
@@ -49,7 +49,7 @@ const getPreferredWalletDeepLink = ({ deeplinks }) => {
|
|
|
49
49
|
|
|
50
50
|
//#endregion
|
|
51
51
|
//#region src/isWalletConnectWalletProvider/isWalletConnectWalletProvider.ts
|
|
52
|
-
/** @
|
|
52
|
+
/** @notInstrumented */
|
|
53
53
|
const isWalletConnectWalletProvider = (walletProvider) => {
|
|
54
54
|
return walletProvider.walletProviderType === WalletProviderEnum.WalletConnect;
|
|
55
55
|
};
|