diff --git a/demo/nextjs-ssr-app/components/Main.tsx b/demo/nextjs-ssr-app/components/Main.tsx
index d8e69aad4..5465858b6 100644
--- a/demo/nextjs-ssr-app/components/Main.tsx
+++ b/demo/nextjs-ssr-app/components/Main.tsx
@@ -3,7 +3,7 @@
import {
useCheckout,
useEnableMFA,
- useIdentityToken,
+ useAuthTokenInfo,
useManageMFA,
useWalletConnectScanner,
useWalletUI,
@@ -31,7 +31,7 @@ const Main = () => {
const { showCheckout, loading: isCheckoutLoading, error: checkoutError } = useCheckout();
const { showWalletConnectScanner, loading: isWalletConnectScannerLoading, error: walletConnectScannerError } = useWalletConnectScanner();
const { showWalletUI, loading: isWalletUILoading, error: walletUIError } = useWalletUI();
- const { token, loading: isUserTokenLoading, error: userTokenError, getIdentityToken } = useIdentityToken();
+ const { token, loading: isUserTokenLoading, error: userTokenError, getAuthTokenInfo } = useAuthTokenInfo();
console.log("isConnected", isConnected, balance);
@@ -59,7 +59,7 @@ const Main = () => {
{isUserTokenLoading ? (
Authenticating...
) : (
-
-
+
Get ID Token
diff --git a/demo/vue-app-new/package-lock.json b/demo/vue-app-new/package-lock.json
index 908e9a491..31952c82d 100644
--- a/demo/vue-app-new/package-lock.json
+++ b/demo/vue-app-new/package-lock.json
@@ -23,6 +23,7 @@
"@web3auth/sign-in-with-web3": "^6.1.0",
"@web3auth/ws-embed": "file:../../web3auth-ws-embed-5.6.5.tgz",
"ethers": "^6.16.0",
+ "ox": "^0.11.3",
"petite-vue-i18n": "^11.3.0",
"react": "^19.2.4",
"react-dom": "^19.2.4",
@@ -51,7 +52,7 @@
"version": "10.15.0",
"dependencies": {
"@hcaptcha/react-hcaptcha": "^2.0.2",
- "@toruslabs/base-controllers": "^9.4.1",
+ "@toruslabs/base-controllers": "^9.5.0",
"@toruslabs/http-helpers": "^9.0.0",
"@web3auth/auth": "^11.4.2",
"@web3auth/no-modal": "^10.15.0",
@@ -143,21 +144,22 @@
"@solana/client": "^1.7.0",
"@solana/kit": "^6.5.0",
"@solana/wallet-standard-features": "^1.3.0",
- "@toruslabs/base-controllers": "^9.4.1",
+ "@toruslabs/base-controllers": "^9.5.0",
"@toruslabs/constants": "^16.1.1",
"@toruslabs/eccrypto": "^7.0.0",
- "@toruslabs/ethereum-controllers": "^9.4.1",
+ "@toruslabs/ethereum-controllers": "^9.5.0",
"@toruslabs/http-helpers": "^9.0.0",
"@toruslabs/loglevel-sentry": "^9.0.0",
"@toruslabs/metadata-helpers": "^8.2.0",
"@toruslabs/secure-pub-sub": "4.3.0",
+ "@toruslabs/session-manager": "^5.6.0",
"@wallet-standard/app": "^1.1.0",
"@wallet-standard/base": "^1.1.0",
"@wallet-standard/features": "^1.1.0",
"@walletconnect/sign-client": "^2.23.8",
"@walletconnect/types": "^2.23.8",
"@walletconnect/utils": "^2.23.8",
- "@web3auth/auth": "^11.4.2",
+ "@web3auth/auth": "^11.4.3",
"@web3auth/ws-embed": "file:../../web3auth-ws-embed-5.6.5.tgz",
"bignumber.js": "~9.3.1",
"deepmerge": "^4.3.1",
@@ -8777,8 +8779,6 @@
}
],
"license": "MIT",
- "optional": true,
- "peer": true,
"dependencies": {
"@adraffy/ens-normalize": "^1.11.0",
"@noble/ciphers": "^1.3.0",
@@ -8802,17 +8802,13 @@
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz",
"integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==",
- "license": "MIT",
- "optional": true,
- "peer": true
+ "license": "MIT"
},
"node_modules/ox/node_modules/@noble/curves": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz",
"integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==",
"license": "MIT",
- "optional": true,
- "peer": true,
"dependencies": {
"@noble/hashes": "1.8.0"
},
diff --git a/demo/vue-app-new/package.json b/demo/vue-app-new/package.json
index 60e6f8fc6..b421357f7 100644
--- a/demo/vue-app-new/package.json
+++ b/demo/vue-app-new/package.json
@@ -25,6 +25,7 @@
"@web3auth/sign-in-with-web3": "^6.1.0",
"@web3auth/ws-embed": "file:../../web3auth-ws-embed-5.6.5.tgz",
"ethers": "^6.16.0",
+ "ox": "^0.11.3",
"petite-vue-i18n": "^11.3.0",
"react": "^19.2.4",
"react-dom": "^19.2.4",
diff --git a/demo/vue-app-new/src/MainView.vue b/demo/vue-app-new/src/MainView.vue
index 252b96138..751f35788 100644
--- a/demo/vue-app-new/src/MainView.vue
+++ b/demo/vue-app-new/src/MainView.vue
@@ -20,7 +20,7 @@ import { WagmiProvider } from "@web3auth/modal/vue/wagmi";
import { coinbaseConnector } from "@web3auth/no-modal/connectors/coinbase-connector";
import { computed, onBeforeMount, ref, watch } from "vue";
-import { BUILD_ENV } from "@web3auth/auth";
+import { BUILD_ENV, CookieStorage, LocalStorageAdapter, MemoryStorage, SessionStorageAdapter, type StorageConfig } from "@web3auth/auth";
import AppDashboard from "./components/AppDashboard.vue";
import AppHeader from "./components/AppHeader.vue";
import AppSettings from "./components/AppSettings.vue";
@@ -34,6 +34,22 @@ const formData = formDataStore;
const externalConnectors = ref([]);
+function buildStorageConfig(): StorageConfig | undefined {
+ const type = formData.tokenStorage;
+ if (type === "default") return undefined;
+
+ const adapter =
+ type === "session"
+ ? new SessionStorageAdapter()
+ : type === "cookies"
+ ? new CookieStorage({ maxAge: 7 * 86400 })
+ : type === "memory"
+ ? new MemoryStorage()
+ : new LocalStorageAdapter();
+
+ return { sessionId: adapter, accessToken: adapter, refreshToken: adapter, idToken: adapter };
+}
+
const showAAProviderSettings = computed(() => formData.chainNamespaces.includes(CHAIN_NAMESPACES.EIP155));
// Options for reinitializing the web3Auth object
@@ -122,11 +138,7 @@ const options = computed((): Web3AuthOptions => {
uiConfig,
accountAbstractionConfig,
useAAWithExternalWallet: formData.useAAWithExternalWallet,
- // TODO: Add more options
- // enableLogging?: boolean;
- // storageType?: "session" | "local";
- // sessionTime?: number;
- // useSFAKey?: boolean;
+ storage: buildStorageConfig(),
chains,
defaultChainId: formData.defaultChainId,
enableLogging: true,
@@ -213,6 +225,7 @@ onBeforeMount(() => {
formData.defaultChainId = json.defaultChainId;
formData.initialAuthenticationMode = json.initialAuthenticationMode;
formData.externalWalletOnly = json.externalWalletOnly || false;
+ formData.tokenStorage = json.tokenStorage || "default";
}
} catch (error) {}
}
diff --git a/demo/vue-app-new/src/components/AppDashboard.vue b/demo/vue-app-new/src/components/AppDashboard.vue
index 3f0275a69..53e268789 100644
--- a/demo/vue-app-new/src/components/AppDashboard.vue
+++ b/demo/vue-app-new/src/components/AppDashboard.vue
@@ -6,7 +6,7 @@ import {
useFunding,
useReceive,
useEnableMFA,
- useIdentityToken,
+ useAuthTokenInfo,
useManageMFA,
useWalletConnectScanner,
useWalletUI,
@@ -55,7 +55,7 @@ const { showWalletConnectScanner, loading: showWalletConnectScannerLoading } = u
const { showCheckout, loading: showCheckoutLoading } = useCheckout();
const { showFunding, loading: showFundingLoading } = useFunding();
const { showReceive, loading: showReceiveLoading } = useReceive();
-const { getIdentityToken, loading: getIdentityTokenLoading } = useIdentityToken();
+const { getAuthTokenInfo, loading: getAuthTokenInfoLoading } = useAuthTokenInfo();
const { status, address } = useConnection();
const { mutateAsync: signTypedDataAsync } = useSignTypedData();
const { mutateAsync: signMessageAsync } = useSignMessage();
@@ -162,8 +162,8 @@ const onGetUserInfo = async () => {
printToConsole("User Info", userInfo.value);
};
-const ongetIdentityToken = async () => {
- const idToken = await getIdentityToken();
+const onGetAuthTokenInfo = async () => {
+ const idToken = await getAuthTokenInfo();
printToConsole("id token", idToken);
};
@@ -492,7 +492,7 @@ const onSwitchChain = async () => {
{{ t("app.buttons.btnSignPersonalMsg") }}
- Get id token
+ Get id token
EIP-5792
@@ -522,7 +522,7 @@ const onSwitchChain = async () => {
{{ t("app.buttons.btnSignTransaction") }}
- Get id token
+ Get id token
{
:label-enabled="$t('app.externalWalletOnly')"
class="mb-2"
/>
+
;
+ tokenStorage: "default" | "local" | "session" | "cookies" | "memory";
widget?: WidgetType;
targetId?: string;
};
diff --git a/demo/vue-app-new/src/store/form.ts b/demo/vue-app-new/src/store/form.ts
index c8e9c8acc..064d7616b 100644
--- a/demo/vue-app-new/src/store/form.ts
+++ b/demo/vue-app-new/src/store/form.ts
@@ -31,6 +31,7 @@ export const formDataStore = reactive({
smartAccountType: "metamask", // default smart account type to safe
smartAccountChains: [],
smartAccountChainsConfig: {},
+ tokenStorage: "default",
widget: WIDGET_TYPE.MODAL,
targetId: "w3a-parent-test-container",
});
diff --git a/demo/wagmi-react-app/src/components/Main.tsx b/demo/wagmi-react-app/src/components/Main.tsx
index b57e83f70..c7664dc00 100644
--- a/demo/wagmi-react-app/src/components/Main.tsx
+++ b/demo/wagmi-react-app/src/components/Main.tsx
@@ -3,7 +3,7 @@ import {
useChain,
useCheckout,
useEnableMFA,
- useIdentityToken,
+ useAuthTokenInfo,
useManageMFA,
useSwitchChain as useWeb3AuthSwitchChain,
useWalletConnectScanner,
@@ -48,7 +48,7 @@ const Main = () => {
const { showCheckout, loading: isCheckoutLoading, error: checkoutError } = useCheckout();
const { showWalletConnectScanner, loading: isWalletConnectScannerLoading, error: walletConnectScannerError } = useWalletConnectScanner();
const { showWalletUI, loading: isWalletUILoading, error: walletUIError } = useWalletUI();
- const { token, loading: isUserTokenLoading, error: userTokenError, getIdentityToken } = useIdentityToken();
+ const { token, loading: isUserTokenLoading, error: userTokenError, getAuthTokenInfo } = useAuthTokenInfo();
const { switchChainAsync } = useSwitchChain();
const chains = useChains();
const { switchChain: switchWeb3AuthChain } = useWeb3AuthSwitchChain();
@@ -116,7 +116,7 @@ const Main = () => {
{isUserTokenLoading ? (
Authenticating...
) : (
- getIdentityToken()} className={styles.card}>
+ getAuthTokenInfo()} className={styles.card}>
Authenticate User
)}
diff --git a/package-lock.json b/package-lock.json
index fc8856804..a9cdcd990 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2988,6 +2988,8 @@
},
"node_modules/@metamask/7715-permission-types": {
"version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@metamask/7715-permission-types/-/7715-permission-types-0.5.0.tgz",
+ "integrity": "sha512-UTlAXhfVM83/dCtghIqZiPqJmeGa4KI2HhkKYjmeP0oFtwzsgDwFfNakdICC4VX82338AiyVVtbEFyx6t7SE1w==",
"license": "(MIT-0 OR Apache-2.0)",
"engines": {
"node": "^18.18 || >=20"
@@ -2995,6 +2997,8 @@
},
"node_modules/@metamask/abi-utils": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@metamask/abi-utils/-/abi-utils-3.0.0.tgz",
+ "integrity": "sha512-a/l0DiSIr7+CBYVpHygUa3ztSlYLFCQMsklLna+t6qmNY9+eIO5TedNxhyIyvaJ+4cN7TLy0NQFbp9FV3X2ktg==",
"license": "(Apache-2.0 AND MIT)",
"dependencies": {
"@metamask/superstruct": "^3.1.0",
@@ -3005,14 +3009,18 @@
}
},
"node_modules/@metamask/delegation-abis": {
- "version": "0.12.0-beta.0",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@metamask/delegation-abis/-/delegation-abis-1.0.0.tgz",
+ "integrity": "sha512-AkrtrXD27yYCu0t0wHrY/Jburlc4HleMVGNlp4DPMljCJOoOg55TIDicAuxZp0QKVtffZ+49DZ8Ww6RBqM+gdQ==",
"license": "(MIT-0 OR Apache-2.0)",
"engines": {
"node": "^18.18 || >=20"
}
},
"node_modules/@metamask/delegation-core": {
- "version": "0.4.0",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@metamask/delegation-core/-/delegation-core-1.0.0.tgz",
+ "integrity": "sha512-ULcSnAxUZC+HdnkteZ53IVDmbvBsjP0E8agF0iqFPbYirJLHvnnNWX/R1XmjqDgeA3G7kBfSP7IqvDRwD6jF4w==",
"license": "(MIT-0 OR Apache-2.0)",
"dependencies": {
"@metamask/abi-utils": "^3.0.0",
@@ -3024,7 +3032,9 @@
}
},
"node_modules/@metamask/delegation-deployments": {
- "version": "0.17.0",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@metamask/delegation-deployments/-/delegation-deployments-1.0.0.tgz",
+ "integrity": "sha512-V3QpZcVv608HyOcLCc5o5meqpAQZKun4vsY3goxRjAJqF2SzxxzEJeggxNNkT75aHHwz3EANqlGaRfoOmpEx+w==",
"license": "(MIT-0 OR Apache-2.0)",
"engines": {
"node": "^18.18 || >=20"
@@ -3069,15 +3079,17 @@
}
},
"node_modules/@metamask/smart-accounts-kit": {
- "version": "0.4.0-beta.2",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@metamask/smart-accounts-kit/-/smart-accounts-kit-1.0.0.tgz",
+ "integrity": "sha512-RL05BGlGWd0LzzYchyPU1wbPmNl76GEroWQ7Xwt+8vQ6qFtVnvBDPmxGCdVJeEvUbEBpIP6HGGQTmV97cUeyRg==",
"license": "(MIT-0 OR Apache-2.0)",
"dependencies": {
"@metamask/7715-permission-types": "^0.5.0",
- "@metamask/delegation-abis": "^0.12.0-beta.0",
- "@metamask/delegation-core": "^0.4.0",
- "@metamask/delegation-deployments": "^0.17.0",
+ "@metamask/delegation-abis": "^1.0.0",
+ "@metamask/delegation-core": "^1.0.0",
+ "@metamask/delegation-deployments": "^1.0.0",
"buffer": "^6.0.3",
- "webauthn-p256": "^0.0.10"
+ "ox": "0.8.1"
},
"engines": {
"node": "^18.18 || >=20"
@@ -3086,8 +3098,31 @@
"viem": "^2.31.4"
}
},
+ "node_modules/@metamask/smart-accounts-kit/node_modules/@adraffy/ens-normalize": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz",
+ "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==",
+ "license": "MIT"
+ },
+ "node_modules/@metamask/smart-accounts-kit/node_modules/@noble/curves": {
+ "version": "1.9.7",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz",
+ "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/hashes": "1.8.0"
+ },
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
"node_modules/@metamask/smart-accounts-kit/node_modules/buffer": {
"version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
"funding": [
{
"type": "github",
@@ -3108,6 +3143,42 @@
"ieee754": "^1.2.1"
}
},
+ "node_modules/@metamask/smart-accounts-kit/node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "license": "MIT"
+ },
+ "node_modules/@metamask/smart-accounts-kit/node_modules/ox": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/ox/-/ox-0.8.1.tgz",
+ "integrity": "sha512-e+z5epnzV+Zuz91YYujecW8cF01mzmrUtWotJ0oEPym/G82uccs7q0WDHTYL3eiONbTUEvcZrptAKLgTBD3u2A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/wevm"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@adraffy/ens-normalize": "^1.11.0",
+ "@noble/ciphers": "^1.3.0",
+ "@noble/curves": "^1.9.1",
+ "@noble/hashes": "^1.8.0",
+ "@scure/bip32": "^1.7.0",
+ "@scure/bip39": "^1.6.0",
+ "abitype": "^1.0.8",
+ "eventemitter3": "5.0.1"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@metamask/superstruct": {
"version": "3.2.1",
"license": "MIT",
@@ -3117,6 +3188,8 @@
},
"node_modules/@metamask/utils": {
"version": "11.10.0",
+ "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-11.10.0.tgz",
+ "integrity": "sha512-+bWmTOANx1MbBW6RFM8Se4ZoigFYGXiuIrkhjj4XnG5Aez8uWaTSZ76yn9srKKClv+PoEVoAuVtcUOogFEMUNA==",
"license": "ISC",
"dependencies": {
"@ethereumjs/tx": "^4.2.0",
@@ -3137,6 +3210,8 @@
},
"node_modules/@metamask/utils/node_modules/semver": {
"version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -3147,6 +3222,8 @@
},
"node_modules/@metamask/utils/node_modules/uuid": {
"version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
@@ -9189,14 +9266,16 @@
}
},
"node_modules/@toruslabs/ethereum-controllers": {
- "version": "9.4.1",
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/@toruslabs/ethereum-controllers/-/ethereum-controllers-9.5.0.tgz",
+ "integrity": "sha512-CyKAik/ceQy9Q2UVzWVuet/HbpZkhRSP6yKUi9H+cWo7OwXLefgMaIrIPCjOCvpIyRXHglqNDz90fGdBG18vMw==",
"license": "ISC",
"dependencies": {
- "@metamask/smart-accounts-kit": "~0.4.0-beta.2",
- "@toruslabs/base-controllers": "^9.4.1",
+ "@metamask/smart-accounts-kit": "~1.0.0",
+ "@toruslabs/base-controllers": "^9.5.0",
"@toruslabs/http-helpers": "^9.0.0",
"@toruslabs/metadata-helpers": "^8.2.0",
- "@web3auth/auth": "^11.4.2",
+ "@web3auth/auth": "^11.4.3",
"async-mutex": "^0.5.0",
"bignumber.js": "^9.3.1",
"deepmerge": "^4.3.1",
@@ -9217,6 +9296,161 @@
"viem": ">=2.45.0"
}
},
+ "node_modules/@toruslabs/ethereum-controllers/node_modules/@toruslabs/base-controllers": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/@toruslabs/base-controllers/-/base-controllers-9.5.0.tgz",
+ "integrity": "sha512-8wBA9hSN9tSfy7WgADDGi7kbFMZvwUofogUxhsV2vmr3rLl4jQ8beUy5fF78BDM7U6N5VanVh0IBw5fvypDzrw==",
+ "license": "ISC",
+ "dependencies": {
+ "@toruslabs/broadcast-channel": "^13.3.0",
+ "@toruslabs/http-helpers": "^9.0.0",
+ "@toruslabs/metadata-helpers": "^8.2.0",
+ "@web3auth/auth": "^11.4.3",
+ "async-mutex": "^0.5.0",
+ "bowser": "^2.14.1",
+ "events": "^3.3.0",
+ "jwt-decode": "^4.0.0",
+ "loglevel": "^1.9.2",
+ "viem": "^2.47.6"
+ },
+ "engines": {
+ "node": ">=22.x",
+ "npm": ">=10.x"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "7.x"
+ }
+ },
+ "node_modules/@toruslabs/ethereum-controllers/node_modules/@toruslabs/customauth": {
+ "version": "22.3.3",
+ "resolved": "https://registry.npmjs.org/@toruslabs/customauth/-/customauth-22.3.3.tgz",
+ "integrity": "sha512-BlH6ENqg3mqCSrPXj442XK4xFpE0aorIm3vQtSKEZZcO7POAWTbcPQ9+oqnvlTrUODqJeymgEITGi4KSfv0xHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@chaitanyapotti/register-service-worker": "^1.7.4",
+ "@toruslabs/broadcast-channel": "^13.3.0",
+ "@toruslabs/constants": "^16.1.1",
+ "@toruslabs/eccrypto": "^7.0.0",
+ "@toruslabs/fetch-node-details": "^16.1.1",
+ "@toruslabs/http-helpers": "^9.0.0",
+ "@toruslabs/metadata-helpers": "^8.2.0",
+ "@toruslabs/session-manager": "^5.6.0",
+ "@toruslabs/torus.js": "^17.2.3",
+ "bowser": "^2.14.1",
+ "deepmerge": "^4.3.1",
+ "events": "^3.3.0",
+ "loglevel": "^1.9.2"
+ },
+ "engines": {
+ "node": ">=22.x",
+ "npm": ">=10.x"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "^7.x",
+ "@sentry/core": "^10.x"
+ },
+ "peerDependenciesMeta": {
+ "@sentry/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@toruslabs/ethereum-controllers/node_modules/@toruslabs/torus.js": {
+ "version": "17.2.3",
+ "resolved": "https://registry.npmjs.org/@toruslabs/torus.js/-/torus.js-17.2.3.tgz",
+ "integrity": "sha512-CmE2xm3LRZh36UySDXNZOeO/pqf7hbvuT5KRUzmgJI4r+Q//HrJ1xOW2zJ9UZl9bym1Il0031r+Mv+N1krbWpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@toruslabs/constants": "^16.1.1",
+ "@toruslabs/eccrypto": "^7.0.0",
+ "@toruslabs/http-helpers": "^9.0.0",
+ "@toruslabs/metadata-helpers": "^8.2.0",
+ "ethereum-cryptography": "^3.2.0",
+ "json-stable-stringify": "^1.3.0",
+ "loglevel": "^1.9.2"
+ },
+ "engines": {
+ "node": ">=22.x",
+ "npm": ">=10.x"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "7.x"
+ }
+ },
+ "node_modules/@toruslabs/ethereum-controllers/node_modules/@web3auth/auth": {
+ "version": "11.4.3",
+ "resolved": "https://registry.npmjs.org/@web3auth/auth/-/auth-11.4.3.tgz",
+ "integrity": "sha512-uy7Ypen0+NqHf7BH4NQihKzIVDvDtOapGu+vc60gqN25SIffB76WRBwfcYOokj+GuUXOOyfLiPLWmXHAb/GVCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@toruslabs/constants": "^16.1.1",
+ "@toruslabs/customauth": "^22.3.3",
+ "@toruslabs/ffjavascript": "^6.0.0",
+ "@toruslabs/metadata-helpers": "^8.2.0",
+ "@toruslabs/secure-pub-sub": "^4.3.0",
+ "@toruslabs/session-manager": "^5.6.0",
+ "deep-freeze-strict": "^1.1.1",
+ "events": "^3.3.0",
+ "json-stable-stringify": "^1.3.0",
+ "klona": "^2.0.6",
+ "loglevel": "^1.9.2",
+ "once": "^1.4.0",
+ "readable-stream": "^4.7.0",
+ "typed-emitter": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=22.x",
+ "npm": ">=10.x"
+ },
+ "optionalDependencies": {
+ "@nx/nx-linux-x64-gnu": "^22.6.1",
+ "@rollup/rollup-linux-x64-gnu": "^4.60.0"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "7.x",
+ "color": "^5.x"
+ }
+ },
+ "node_modules/@toruslabs/ethereum-controllers/node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "node_modules/@toruslabs/ethereum-controllers/node_modules/readable-stream": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
+ "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
+ "license": "MIT",
+ "dependencies": {
+ "abort-controller": "^3.0.0",
+ "buffer": "^6.0.3",
+ "events": "^3.3.0",
+ "process": "^0.11.10",
+ "string_decoder": "^1.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
"node_modules/@toruslabs/fetch-node-details": {
"version": "16.1.1",
"license": "MIT",
@@ -9587,6 +9821,8 @@
},
"node_modules/@types/lodash": {
"version": "4.17.24",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz",
+ "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==",
"license": "MIT"
},
"node_modules/@types/minimist": {
@@ -22667,6 +22903,8 @@
},
"node_modules/permissionless": {
"version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/permissionless/-/permissionless-0.3.4.tgz",
+ "integrity": "sha512-pml3Do0e/AMoAq89tzpXlhhxmVdOigQCCoC+df/kRCVFiJ9pQTgzKQKhxYTWWB2xW/AOgwBwGzLBfqFZrDpFiA==",
"license": "MIT",
"peerDependencies": {
"ox": "^0.11.3",
@@ -28508,33 +28746,6 @@
"defaults": "^1.0.3"
}
},
- "node_modules/webauthn-p256": {
- "version": "0.0.10",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/wevm"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@noble/curves": "^1.4.0",
- "@noble/hashes": "^1.4.0"
- }
- },
- "node_modules/webauthn-p256/node_modules/@noble/curves": {
- "version": "1.9.7",
- "license": "MIT",
- "dependencies": {
- "@noble/hashes": "1.8.0"
- },
- "engines": {
- "node": "^14.21.3 || >=16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/webidl-conversions": {
"version": "3.0.1",
"license": "BSD-2-Clause"
@@ -29609,7 +29820,7 @@
"version": "10.15.0",
"dependencies": {
"@hcaptcha/react-hcaptcha": "^2.0.2",
- "@toruslabs/base-controllers": "^9.4.1",
+ "@toruslabs/base-controllers": "^9.5.0",
"@toruslabs/http-helpers": "^9.0.0",
"@web3auth/auth": "^11.4.2",
"@web3auth/no-modal": "^10.15.0",
@@ -29691,14 +29902,159 @@
}
}
},
- "packages/modal/node_modules/react": {
- "version": "19.2.4",
- "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
- "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
- "dev": true,
+ "packages/modal/node_modules/@toruslabs/base-controllers": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/@toruslabs/base-controllers/-/base-controllers-9.5.0.tgz",
+ "integrity": "sha512-8wBA9hSN9tSfy7WgADDGi7kbFMZvwUofogUxhsV2vmr3rLl4jQ8beUy5fF78BDM7U6N5VanVh0IBw5fvypDzrw==",
+ "license": "ISC",
+ "dependencies": {
+ "@toruslabs/broadcast-channel": "^13.3.0",
+ "@toruslabs/http-helpers": "^9.0.0",
+ "@toruslabs/metadata-helpers": "^8.2.0",
+ "@web3auth/auth": "^11.4.3",
+ "async-mutex": "^0.5.0",
+ "bowser": "^2.14.1",
+ "events": "^3.3.0",
+ "jwt-decode": "^4.0.0",
+ "loglevel": "^1.9.2",
+ "viem": "^2.47.6"
+ },
+ "engines": {
+ "node": ">=22.x",
+ "npm": ">=10.x"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "7.x"
+ }
+ },
+ "packages/modal/node_modules/@toruslabs/customauth": {
+ "version": "22.3.3",
+ "resolved": "https://registry.npmjs.org/@toruslabs/customauth/-/customauth-22.3.3.tgz",
+ "integrity": "sha512-BlH6ENqg3mqCSrPXj442XK4xFpE0aorIm3vQtSKEZZcO7POAWTbcPQ9+oqnvlTrUODqJeymgEITGi4KSfv0xHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@chaitanyapotti/register-service-worker": "^1.7.4",
+ "@toruslabs/broadcast-channel": "^13.3.0",
+ "@toruslabs/constants": "^16.1.1",
+ "@toruslabs/eccrypto": "^7.0.0",
+ "@toruslabs/fetch-node-details": "^16.1.1",
+ "@toruslabs/http-helpers": "^9.0.0",
+ "@toruslabs/metadata-helpers": "^8.2.0",
+ "@toruslabs/session-manager": "^5.6.0",
+ "@toruslabs/torus.js": "^17.2.3",
+ "bowser": "^2.14.1",
+ "deepmerge": "^4.3.1",
+ "events": "^3.3.0",
+ "loglevel": "^1.9.2"
+ },
+ "engines": {
+ "node": ">=22.x",
+ "npm": ">=10.x"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "^7.x",
+ "@sentry/core": "^10.x"
+ },
+ "peerDependenciesMeta": {
+ "@sentry/core": {
+ "optional": true
+ }
+ }
+ },
+ "packages/modal/node_modules/@toruslabs/torus.js": {
+ "version": "17.2.3",
+ "resolved": "https://registry.npmjs.org/@toruslabs/torus.js/-/torus.js-17.2.3.tgz",
+ "integrity": "sha512-CmE2xm3LRZh36UySDXNZOeO/pqf7hbvuT5KRUzmgJI4r+Q//HrJ1xOW2zJ9UZl9bym1Il0031r+Mv+N1krbWpQ==",
"license": "MIT",
+ "dependencies": {
+ "@toruslabs/constants": "^16.1.1",
+ "@toruslabs/eccrypto": "^7.0.0",
+ "@toruslabs/http-helpers": "^9.0.0",
+ "@toruslabs/metadata-helpers": "^8.2.0",
+ "ethereum-cryptography": "^3.2.0",
+ "json-stable-stringify": "^1.3.0",
+ "loglevel": "^1.9.2"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=22.x",
+ "npm": ">=10.x"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "7.x"
+ }
+ },
+ "packages/modal/node_modules/@web3auth/auth": {
+ "version": "11.4.3",
+ "resolved": "https://registry.npmjs.org/@web3auth/auth/-/auth-11.4.3.tgz",
+ "integrity": "sha512-uy7Ypen0+NqHf7BH4NQihKzIVDvDtOapGu+vc60gqN25SIffB76WRBwfcYOokj+GuUXOOyfLiPLWmXHAb/GVCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@toruslabs/constants": "^16.1.1",
+ "@toruslabs/customauth": "^22.3.3",
+ "@toruslabs/ffjavascript": "^6.0.0",
+ "@toruslabs/metadata-helpers": "^8.2.0",
+ "@toruslabs/secure-pub-sub": "^4.3.0",
+ "@toruslabs/session-manager": "^5.6.0",
+ "deep-freeze-strict": "^1.1.1",
+ "events": "^3.3.0",
+ "json-stable-stringify": "^1.3.0",
+ "klona": "^2.0.6",
+ "loglevel": "^1.9.2",
+ "once": "^1.4.0",
+ "readable-stream": "^4.7.0",
+ "typed-emitter": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=22.x",
+ "npm": ">=10.x"
+ },
+ "optionalDependencies": {
+ "@nx/nx-linux-x64-gnu": "^22.6.1",
+ "@rollup/rollup-linux-x64-gnu": "^4.60.0"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "7.x",
+ "color": "^5.x"
+ }
+ },
+ "packages/modal/node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "packages/modal/node_modules/readable-stream": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
+ "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
+ "license": "MIT",
+ "dependencies": {
+ "abort-controller": "^3.0.0",
+ "buffer": "^6.0.3",
+ "events": "^3.3.0",
+ "process": "^0.11.10",
+ "string_decoder": "^1.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"packages/no-modal": {
@@ -29711,21 +30067,22 @@
"@solana/client": "^1.7.0",
"@solana/kit": "^6.5.0",
"@solana/wallet-standard-features": "^1.3.0",
- "@toruslabs/base-controllers": "^9.4.1",
+ "@toruslabs/base-controllers": "^9.5.0",
"@toruslabs/constants": "^16.1.1",
"@toruslabs/eccrypto": "^7.0.0",
- "@toruslabs/ethereum-controllers": "^9.4.1",
+ "@toruslabs/ethereum-controllers": "^9.5.0",
"@toruslabs/http-helpers": "^9.0.0",
"@toruslabs/loglevel-sentry": "^9.0.0",
"@toruslabs/metadata-helpers": "^8.2.0",
"@toruslabs/secure-pub-sub": "4.3.0",
+ "@toruslabs/session-manager": "^5.6.0",
"@wallet-standard/app": "^1.1.0",
"@wallet-standard/base": "^1.1.0",
"@wallet-standard/features": "^1.1.0",
"@walletconnect/sign-client": "^2.23.8",
"@walletconnect/types": "^2.23.8",
"@walletconnect/utils": "^2.23.8",
- "@web3auth/auth": "^11.4.2",
+ "@web3auth/auth": "^11.4.3",
"@web3auth/ws-embed": "file:../../web3auth-ws-embed-5.6.5.tgz",
"bignumber.js": "~9.3.1",
"deepmerge": "^4.3.1",
@@ -29935,6 +30292,161 @@
"uuid": "dist/bin/uuid"
}
},
+ "packages/no-modal/node_modules/@toruslabs/base-controllers": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/@toruslabs/base-controllers/-/base-controllers-9.5.0.tgz",
+ "integrity": "sha512-8wBA9hSN9tSfy7WgADDGi7kbFMZvwUofogUxhsV2vmr3rLl4jQ8beUy5fF78BDM7U6N5VanVh0IBw5fvypDzrw==",
+ "license": "ISC",
+ "dependencies": {
+ "@toruslabs/broadcast-channel": "^13.3.0",
+ "@toruslabs/http-helpers": "^9.0.0",
+ "@toruslabs/metadata-helpers": "^8.2.0",
+ "@web3auth/auth": "^11.4.3",
+ "async-mutex": "^0.5.0",
+ "bowser": "^2.14.1",
+ "events": "^3.3.0",
+ "jwt-decode": "^4.0.0",
+ "loglevel": "^1.9.2",
+ "viem": "^2.47.6"
+ },
+ "engines": {
+ "node": ">=22.x",
+ "npm": ">=10.x"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "7.x"
+ }
+ },
+ "packages/no-modal/node_modules/@toruslabs/customauth": {
+ "version": "22.3.3",
+ "resolved": "https://registry.npmjs.org/@toruslabs/customauth/-/customauth-22.3.3.tgz",
+ "integrity": "sha512-BlH6ENqg3mqCSrPXj442XK4xFpE0aorIm3vQtSKEZZcO7POAWTbcPQ9+oqnvlTrUODqJeymgEITGi4KSfv0xHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@chaitanyapotti/register-service-worker": "^1.7.4",
+ "@toruslabs/broadcast-channel": "^13.3.0",
+ "@toruslabs/constants": "^16.1.1",
+ "@toruslabs/eccrypto": "^7.0.0",
+ "@toruslabs/fetch-node-details": "^16.1.1",
+ "@toruslabs/http-helpers": "^9.0.0",
+ "@toruslabs/metadata-helpers": "^8.2.0",
+ "@toruslabs/session-manager": "^5.6.0",
+ "@toruslabs/torus.js": "^17.2.3",
+ "bowser": "^2.14.1",
+ "deepmerge": "^4.3.1",
+ "events": "^3.3.0",
+ "loglevel": "^1.9.2"
+ },
+ "engines": {
+ "node": ">=22.x",
+ "npm": ">=10.x"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "^7.x",
+ "@sentry/core": "^10.x"
+ },
+ "peerDependenciesMeta": {
+ "@sentry/core": {
+ "optional": true
+ }
+ }
+ },
+ "packages/no-modal/node_modules/@toruslabs/torus.js": {
+ "version": "17.2.3",
+ "resolved": "https://registry.npmjs.org/@toruslabs/torus.js/-/torus.js-17.2.3.tgz",
+ "integrity": "sha512-CmE2xm3LRZh36UySDXNZOeO/pqf7hbvuT5KRUzmgJI4r+Q//HrJ1xOW2zJ9UZl9bym1Il0031r+Mv+N1krbWpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@toruslabs/constants": "^16.1.1",
+ "@toruslabs/eccrypto": "^7.0.0",
+ "@toruslabs/http-helpers": "^9.0.0",
+ "@toruslabs/metadata-helpers": "^8.2.0",
+ "ethereum-cryptography": "^3.2.0",
+ "json-stable-stringify": "^1.3.0",
+ "loglevel": "^1.9.2"
+ },
+ "engines": {
+ "node": ">=22.x",
+ "npm": ">=10.x"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "7.x"
+ }
+ },
+ "packages/no-modal/node_modules/@web3auth/auth": {
+ "version": "11.4.3",
+ "resolved": "https://registry.npmjs.org/@web3auth/auth/-/auth-11.4.3.tgz",
+ "integrity": "sha512-uy7Ypen0+NqHf7BH4NQihKzIVDvDtOapGu+vc60gqN25SIffB76WRBwfcYOokj+GuUXOOyfLiPLWmXHAb/GVCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@toruslabs/constants": "^16.1.1",
+ "@toruslabs/customauth": "^22.3.3",
+ "@toruslabs/ffjavascript": "^6.0.0",
+ "@toruslabs/metadata-helpers": "^8.2.0",
+ "@toruslabs/secure-pub-sub": "^4.3.0",
+ "@toruslabs/session-manager": "^5.6.0",
+ "deep-freeze-strict": "^1.1.1",
+ "events": "^3.3.0",
+ "json-stable-stringify": "^1.3.0",
+ "klona": "^2.0.6",
+ "loglevel": "^1.9.2",
+ "once": "^1.4.0",
+ "readable-stream": "^4.7.0",
+ "typed-emitter": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=22.x",
+ "npm": ">=10.x"
+ },
+ "optionalDependencies": {
+ "@nx/nx-linux-x64-gnu": "^22.6.1",
+ "@rollup/rollup-linux-x64-gnu": "^4.60.0"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "7.x",
+ "color": "^5.x"
+ }
+ },
+ "packages/no-modal/node_modules/@web3auth/auth/node_modules/readable-stream": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
+ "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
+ "license": "MIT",
+ "dependencies": {
+ "abort-controller": "^3.0.0",
+ "buffer": "^6.0.3",
+ "events": "^3.3.0",
+ "process": "^0.11.10",
+ "string_decoder": "^1.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "packages/no-modal/node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
"packages/no-modal/node_modules/debug": {
"version": "4.3.4",
"license": "MIT",
@@ -29965,16 +30477,6 @@
"version": "2.1.2",
"license": "MIT"
},
- "packages/no-modal/node_modules/react": {
- "version": "19.2.4",
- "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
- "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"packages/no-modal/node_modules/semver": {
"version": "7.7.4",
"license": "ISC",
diff --git a/packages/modal/package.json b/packages/modal/package.json
index 8ab57c231..8ee979ab5 100644
--- a/packages/modal/package.json
+++ b/packages/modal/package.json
@@ -96,7 +96,7 @@
},
"dependencies": {
"@hcaptcha/react-hcaptcha": "^2.0.2",
- "@toruslabs/base-controllers": "^9.4.1",
+ "@toruslabs/base-controllers": "^9.5.0",
"@toruslabs/http-helpers": "^9.0.0",
"@web3auth/auth": "^11.4.2",
"@web3auth/no-modal": "^10.15.0",
diff --git a/packages/modal/src/modalManager.ts b/packages/modal/src/modalManager.ts
index 75973511a..9eb24a672 100644
--- a/packages/modal/src/modalManager.ts
+++ b/packages/modal/src/modalManager.ts
@@ -534,7 +534,7 @@ export class Web3Auth extends Web3AuthNoModal implements IWeb3AuthModal {
await connector.init({
autoConnect,
chainId: initialChain.chainId,
- getIdentityToken: this.options.initialAuthenticationMode === CONNECTOR_INITIAL_AUTHENTICATION_MODE.CONNECT_AND_SIGN,
+ getAuthTokenInfo: this.options.initialAuthenticationMode === CONNECTOR_INITIAL_AUTHENTICATION_MODE.CONNECT_AND_SIGN,
});
// note: not adding cachedWallet to modal if it is external wallet.
@@ -584,7 +584,7 @@ export class Web3Auth extends Web3AuthNoModal implements IWeb3AuthModal {
await connector.init({
autoConnect: this.cachedConnector === connectorName,
chainId: initialChain.chainId,
- getIdentityToken: this.options.initialAuthenticationMode === CONNECTOR_INITIAL_AUTHENTICATION_MODE.CONNECT_AND_SIGN,
+ getAuthTokenInfo: this.options.initialAuthenticationMode === CONNECTOR_INITIAL_AUTHENTICATION_MODE.CONNECT_AND_SIGN,
});
} catch (error) {
log.error(error, "error while initializing connector", connectorName);
@@ -690,7 +690,7 @@ export class Web3Auth extends Web3AuthNoModal implements IWeb3AuthModal {
private onMobileVerifyConnect = async (params: { connector: WALLET_CONNECTOR_TYPE }): Promise => {
try {
const connector = this.getConnector(params.connector);
- await connector.getIdentityToken();
+ await connector.getAuthTokenInfo();
} catch (error) {
log.error(`Error while connecting to connector: ${params.connector}`, error);
}
diff --git a/packages/modal/src/react/hooks/index.ts b/packages/modal/src/react/hooks/index.ts
index e14ac8e2a..8d641ee71 100644
--- a/packages/modal/src/react/hooks/index.ts
+++ b/packages/modal/src/react/hooks/index.ts
@@ -1,8 +1,8 @@
+export * from "./useAuthTokenInfo";
export * from "./useChain";
export * from "./useCheckout";
export * from "./useEnableMFA";
export * from "./useFunding";
-export * from "./useIdentityToken";
export * from "./useManageMFA";
export * from "./useReceive";
export * from "./useSwap";
diff --git a/packages/modal/src/react/hooks/useIdentityToken.ts b/packages/modal/src/react/hooks/useAuthTokenInfo.ts
similarity index 77%
rename from packages/modal/src/react/hooks/useIdentityToken.ts
rename to packages/modal/src/react/hooks/useAuthTokenInfo.ts
index bb6c9641d..e2dfab797 100644
--- a/packages/modal/src/react/hooks/useIdentityToken.ts
+++ b/packages/modal/src/react/hooks/useAuthTokenInfo.ts
@@ -3,25 +3,25 @@ import { useCallback, useEffect, useState } from "react";
import { useWeb3AuthInner } from "./useWeb3AuthInner";
-export interface IUseIdentityToken {
+export interface IUseAuthTokenInfo {
loading: boolean;
error: Web3AuthError | null;
token: string | null;
- getIdentityToken: () => Promise;
+ getAuthTokenInfo: () => Promise;
}
-export const useIdentityToken = () => {
+export const useAuthTokenInfo = () => {
const { web3Auth, isAuthorized } = useWeb3AuthInner();
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const [token, setToken] = useState(null);
- const getIdentityToken = useCallback(async () => {
+ const getAuthTokenInfo = useCallback(async () => {
setLoading(true);
setError(null);
try {
- const userAuthInfo = await web3Auth.getIdentityToken();
+ const userAuthInfo = await web3Auth.getAuthTokenInfo();
if (userAuthInfo?.idToken) {
setToken(userAuthInfo.idToken);
}
@@ -43,5 +43,5 @@ export const useIdentityToken = () => {
}
}, [isAuthorized, token, web3Auth]);
- return { loading, error, token, getIdentityToken };
+ return { loading, error, token, getAuthTokenInfo };
};
diff --git a/packages/modal/src/vue/composables/index.ts b/packages/modal/src/vue/composables/index.ts
index e14ac8e2a..8d641ee71 100644
--- a/packages/modal/src/vue/composables/index.ts
+++ b/packages/modal/src/vue/composables/index.ts
@@ -1,8 +1,8 @@
+export * from "./useAuthTokenInfo";
export * from "./useChain";
export * from "./useCheckout";
export * from "./useEnableMFA";
export * from "./useFunding";
-export * from "./useIdentityToken";
export * from "./useManageMFA";
export * from "./useReceive";
export * from "./useSwap";
diff --git a/packages/modal/src/vue/composables/useIdentityToken.ts b/packages/modal/src/vue/composables/useAuthTokenInfo.ts
similarity index 78%
rename from packages/modal/src/vue/composables/useIdentityToken.ts
rename to packages/modal/src/vue/composables/useAuthTokenInfo.ts
index 8fa5a52bb..3604c1dce 100644
--- a/packages/modal/src/vue/composables/useIdentityToken.ts
+++ b/packages/modal/src/vue/composables/useAuthTokenInfo.ts
@@ -3,31 +3,31 @@ import { Ref, ref, watch } from "vue";
import { useWeb3AuthInner } from "./useWeb3AuthInner";
-export interface IUseIdentityToken {
+export interface IUseAuthTokenInfo {
loading: Ref;
error: Ref;
token: Ref;
- getIdentityToken: () => Promise;
+ getAuthTokenInfo: () => Promise;
}
-export const useIdentityToken = (): IUseIdentityToken => {
+export const useAuthTokenInfo = (): IUseAuthTokenInfo => {
const { web3Auth, isAuthorized } = useWeb3AuthInner();
const loading = ref(false);
const error = ref(null);
const token = ref(null);
- const getIdentityToken = async () => {
+ const getAuthTokenInfo = async () => {
try {
if (!web3Auth.value) throw WalletInitializationError.notReady();
error.value = null;
loading.value = true;
- const result = await web3Auth.value.getIdentityToken();
+ const result = await web3Auth.value.getAuthTokenInfo();
if (result?.idToken) {
token.value = result.idToken;
}
return result?.idToken;
} catch (err) {
- log.error("Error getting identity token", err);
+ log.error("Error getting auth token info", err);
error.value = err as Web3AuthError;
} finally {
loading.value = false;
@@ -52,6 +52,6 @@ export const useIdentityToken = (): IUseIdentityToken => {
loading,
error,
token,
- getIdentityToken,
+ getAuthTokenInfo,
};
};
diff --git a/packages/no-modal/package.json b/packages/no-modal/package.json
index 3eb61bbe0..d8e369d55 100644
--- a/packages/no-modal/package.json
+++ b/packages/no-modal/package.json
@@ -64,21 +64,22 @@
"@solana/client": "^1.7.0",
"@solana/kit": "^6.5.0",
"@solana/wallet-standard-features": "^1.3.0",
- "@toruslabs/base-controllers": "^9.4.1",
+ "@toruslabs/base-controllers": "^9.5.0",
"@toruslabs/constants": "^16.1.1",
"@toruslabs/eccrypto": "^7.0.0",
- "@toruslabs/ethereum-controllers": "^9.4.1",
+ "@toruslabs/ethereum-controllers": "^9.5.0",
"@toruslabs/http-helpers": "^9.0.0",
"@toruslabs/loglevel-sentry": "^9.0.0",
"@toruslabs/metadata-helpers": "^8.2.0",
"@toruslabs/secure-pub-sub": "4.3.0",
+ "@toruslabs/session-manager": "^5.6.0",
"@wallet-standard/app": "^1.1.0",
"@wallet-standard/base": "^1.1.0",
"@wallet-standard/features": "^1.1.0",
"@walletconnect/sign-client": "^2.23.8",
"@walletconnect/types": "^2.23.8",
"@walletconnect/utils": "^2.23.8",
- "@web3auth/auth": "^11.4.2",
+ "@web3auth/auth": "^11.4.3",
"@web3auth/ws-embed": "file:../../web3auth-ws-embed-5.6.5.tgz",
"bignumber.js": "~9.3.1",
"deepmerge": "^4.3.1",
diff --git a/packages/no-modal/src/base/connector/baseConnector.ts b/packages/no-modal/src/base/connector/baseConnector.ts
index 2cc56e578..8bcd45654 100644
--- a/packages/no-modal/src/base/connector/baseConnector.ts
+++ b/packages/no-modal/src/base/connector/baseConnector.ts
@@ -1,12 +1,17 @@
+import { getDeviceInfo, type SiwwTokens, verifySignedChallenge } from "@toruslabs/base-controllers";
+import { AuthSessionManager } from "@toruslabs/session-manager";
import type { Wallet } from "@wallet-standard/base";
import { SafeEventEmitter } from "@web3auth/auth";
-import { CHAIN_NAMESPACES, CONNECTOR_NAMESPACES, ConnectorNamespaceType, CustomChainConfig } from "../chain/IChainInterface";
+import { CHAIN_NAMESPACES, type ChainNamespaceType, CONNECTOR_NAMESPACES, ConnectorNamespaceType, CustomChainConfig } from "../chain/IChainInterface";
import { WalletInitializationError, WalletLoginError } from "../errors";
+import { log } from "../loglevel";
+import { citadelServerUrl } from "../utils";
import { WALLET_CONNECTOR_TYPE, WALLET_CONNECTORS } from "../wallet";
import { CAN_AUTHORIZE_STATUSES, CONNECTED_STATUSES } from "./connectorStatus";
import { CONNECTOR_EVENTS, CONNECTOR_STATUS } from "./constants";
import type {
+ AuthTokenInfo,
BaseConnectorLoginParams,
BaseConnectorSettings,
Connection,
@@ -15,10 +20,10 @@ import type {
ConnectorEvents,
ConnectorInitOptions,
IConnector,
- IdentityTokenInfo,
IProvider,
UserInfo,
} from "./interfaces";
+import { checkIfTokenIsExpired } from "./utils";
export abstract class BaseConnector extends SafeEventEmitter implements IConnector {
public connectorData?: unknown = {};
@@ -31,6 +36,8 @@ export abstract class BaseConnector extends SafeEventEmitter
protected rehydrated = false;
+ protected authSessionManager: AuthSessionManager | null = null;
+
public abstract connectorNamespace: ConnectorNamespaceType;
public abstract type: CONNECTOR_CATEGORY_TYPE;
@@ -108,12 +115,102 @@ export abstract class BaseConnector extends SafeEventEmitter
this.emit(CONNECTOR_EVENTS.CONNECTOR_DATA_UPDATED, { connectorName: this.name, data });
}
+ protected initSessionManager(address: string): void {
+ this.authSessionManager = new AuthSessionManager({
+ storageKeyPrefix: `w3a:siww:${this.name}:${address.toLowerCase()}`,
+ apiClientConfig: { baseURL: citadelServerUrl(this.coreOptions.authBuildEnv) },
+ storage: this.coreOptions.storage,
+ cookieOptions: this.coreOptions.cookieOptions,
+ });
+ }
+
+ protected async getCachedAuthTokenInfo(): Promise {
+ if (!this.authSessionManager) return null;
+
+ const idToken = await this.authSessionManager.getIdToken();
+ if (!idToken || checkIfTokenIsExpired(idToken)) return null;
+
+ let [accessToken, refreshToken] = await Promise.all([this.authSessionManager.getAccessToken(), this.authSessionManager.getRefreshToken()]);
+
+ if ((!accessToken || checkIfTokenIsExpired(accessToken)) && refreshToken) {
+ try {
+ const response = await this.authSessionManager.ensureRefresh();
+ accessToken = response.access_token || (await this.authSessionManager.getAccessToken());
+ refreshToken = response.refresh_token || refreshToken;
+ } catch {
+ // access token refresh failed; still return the valid idToken
+ log.error("Access token refresh failed");
+ }
+ }
+
+ return { idToken, accessToken: accessToken ?? undefined, refreshToken: refreshToken ?? undefined };
+ }
+
+ protected async saveAuthTokenInfo(tokens: SiwwTokens): Promise {
+ if (!this.authSessionManager) return;
+ await this.authSessionManager.setTokens({
+ idToken: tokens.idToken,
+ accessToken: tokens.accessToken,
+ refreshToken: tokens.refreshToken,
+ });
+ }
+
+ protected async getCachedOrNullAuthTokenInfo(account: string): Promise {
+ this.initSessionManager(account);
+ const cached = await this.getCachedAuthTokenInfo();
+ if (cached) {
+ this.status = CONNECTOR_STATUS.AUTHORIZED;
+ this.emit(CONNECTOR_EVENTS.AUTHORIZED, { connector: this.name as WALLET_CONNECTOR_TYPE, authTokenInfo: cached });
+ }
+ return cached;
+ }
+
+ protected async verifyAndAuthorize(params: {
+ chainNamespace: ChainNamespaceType;
+ signedMessage: string;
+ challenge: string;
+ authServer: string;
+ }): Promise {
+ const tokens = await verifySignedChallenge({
+ chainNamespace: params.chainNamespace,
+ signedMessage: params.signedMessage,
+ challenge: params.challenge,
+ connector: this.name,
+ authServer: params.authServer,
+ web3AuthClientId: this.coreOptions.clientId,
+ web3AuthNetwork: this.coreOptions.web3AuthNetwork,
+ sessionTimeout: this.coreOptions.sessionTime,
+ deviceInfo: getDeviceInfo(),
+ });
+ await this.saveAuthTokenInfo(tokens);
+ const tokenInfo: AuthTokenInfo = { idToken: tokens.idToken, accessToken: tokens.accessToken, refreshToken: tokens.refreshToken };
+ this.status = CONNECTOR_STATUS.AUTHORIZED;
+ this.emit(CONNECTOR_EVENTS.AUTHORIZED, { connector: this.name as WALLET_CONNECTOR_TYPE, authTokenInfo: tokenInfo });
+ return tokenInfo;
+ }
+
+ protected async clearWalletSession(): Promise {
+ if (!this.authSessionManager) return;
+ try {
+ await this.authSessionManager.logout();
+ } catch {
+ try {
+ await this.authSessionManager.clearSessionData();
+ } catch {
+ // best-effort cleanup; don't block disconnect
+ log.error("Failed to clear wallet session");
+ }
+ } finally {
+ this.authSessionManager = null;
+ }
+ }
+
abstract init(options?: ConnectorInitOptions): Promise;
abstract connect(params: T & BaseConnectorLoginParams): Promise;
abstract disconnect(): Promise;
abstract getUserInfo(): Promise>;
abstract enableMFA(params?: T): Promise;
abstract manageMFA(params?: T): Promise;
- abstract getIdentityToken(): Promise;
+ abstract getAuthTokenInfo(): Promise;
abstract switchChain(params: { chainId: string }): Promise;
}
diff --git a/packages/no-modal/src/base/connector/interfaces.ts b/packages/no-modal/src/base/connector/interfaces.ts
index 71d4d302b..7bc46e597 100644
--- a/packages/no-modal/src/base/connector/interfaces.ts
+++ b/packages/no-modal/src/base/connector/interfaces.ts
@@ -40,14 +40,14 @@ export interface ConnectorInitOptions {
*/
chainId: string;
/**
- * Whether to get the identity token
+ * Whether to fetch auth token info (id / access / refresh tokens)
*/
- getIdentityToken?: boolean;
+ getAuthTokenInfo?: boolean;
}
export type CONNECTOR_STATUS_TYPE = (typeof CONNECTOR_STATUS)[keyof typeof CONNECTOR_STATUS];
-export type IdentityTokenInfo = { idToken: string };
+export type AuthTokenInfo = { idToken: string; accessToken?: string; refreshToken?: string };
export interface BaseConnectorSettings {
coreOptions: IWeb3AuthCoreOptions;
@@ -95,7 +95,7 @@ export interface IConnector extends SafeEventEmitter {
enableMFA(params?: T): Promise;
manageMFA(params?: T): Promise;
switchChain(params: { chainId: string }): Promise;
- getIdentityToken(): Promise;
+ getAuthTokenInfo(): Promise;
cleanup?(): Promise;
}
@@ -107,19 +107,18 @@ export type ConnectorParams = {
export type BaseConnectorLoginParams = {
chainId: string;
- getIdentityToken: boolean;
+ getAuthTokenInfo: boolean;
};
export type ConnectorFn = (params: ConnectorParams) => IConnector;
export type CONNECTED_EVENT_DATA = Connection & {
reconnected: boolean;
- identityTokenInfo?: IdentityTokenInfo;
};
export type AUTHORIZED_EVENT_DATA = {
connector: WALLET_CONNECTOR_TYPE | string;
- identityTokenInfo: IdentityTokenInfo;
+ authTokenInfo: AuthTokenInfo;
};
export interface IConnectorDataEvent {
diff --git a/packages/no-modal/src/base/connector/utils.ts b/packages/no-modal/src/base/connector/utils.ts
index 5b2ba5abb..e7673c55a 100644
--- a/packages/no-modal/src/base/connector/utils.ts
+++ b/packages/no-modal/src/base/connector/utils.ts
@@ -42,24 +42,3 @@ export const checkIfTokenIsExpired = (token: string) => {
}
return false;
};
-
-export const getSavedToken = (userAddress: string, issuer: string) => {
- if (storageAvailable("localStorage")) {
- return localStorage.getItem(`${userAddress.toLowerCase()}_${issuer}`);
- }
- return null;
-};
-
-export const saveToken = (userAddress: string, issuer: string, token: string) => {
- if (storageAvailable("localStorage")) {
- return localStorage.setItem(`${userAddress.toLowerCase()}_${issuer}`, token);
- }
- return null;
-};
-
-export const clearToken = (userAddress: string, issuer: string) => {
- if (storageAvailable("localStorage")) {
- return localStorage.removeItem(`${userAddress.toLowerCase()}_${issuer}`);
- }
- return null;
-};
diff --git a/packages/no-modal/src/base/core/IWeb3Auth.ts b/packages/no-modal/src/base/core/IWeb3Auth.ts
index c96286aad..5c79969ee 100644
--- a/packages/no-modal/src/base/core/IWeb3Auth.ts
+++ b/packages/no-modal/src/base/core/IWeb3Auth.ts
@@ -1,10 +1,12 @@
import { type AccountAbstractionMultiChainConfig } from "@toruslabs/ethereum-controllers";
import {
type BUILD_ENV_TYPE,
+ type CookieOptions,
type LoginParams,
MfaLevelType,
MfaSettings,
SafeEventEmitter,
+ type StorageConfig,
UX_MODE_TYPE,
type WhiteLabelData,
} from "@web3auth/auth";
@@ -12,6 +14,7 @@ import { type WsEmbedParams } from "@web3auth/ws-embed";
import { type ChainNamespaceType, type CustomChainConfig } from "../chain/IChainInterface";
import {
+ type AuthTokenInfo,
CONNECTED_EVENT_DATA,
type Connection,
CONNECTOR_EVENTS,
@@ -21,7 +24,6 @@ import {
type ConnectorFn,
type IBaseProvider,
type IConnector,
- type IdentityTokenInfo,
type UserInfo,
type WEB3AUTH_NETWORK_TYPE,
} from "../connector";
@@ -91,13 +93,17 @@ export interface IWeb3AuthCoreOptions {
* @defaultValue false
*/
enableLogging?: boolean;
+
/**
- * setting to "local" will persist social login session across browser tabs.
- *
- * @defaultValue "local"
+ * Custom storage adapters for auth tokens (sessionId, accessToken, refreshToken, idToken).
+ * @defaultValue localStorage-based adapters
+ */
+ storage?: StorageConfig;
+
+ /**
+ * Cookie configuration used when storage adapters are cookie-based.
*/
- // TODO: rename this to match customauth, sfa
- storageType?: "session" | "local" | "cookies";
+ cookieOptions?: CookieOptions;
/**
* sessionTime (in seconds) for idToken issued by Web3Auth for server side verification.
@@ -208,7 +214,7 @@ export interface IWeb3AuthCore extends SafeEventEmitter {
getPlugin(pluginName: string): IPlugin | null;
logout(options?: { cleanup: boolean }): Promise;
getUserInfo(): Promise>;
- getIdentityToken(): Promise;
+ getAuthTokenInfo(): Promise>;
switchChain(params: { chainId: string }): Promise;
}
diff --git a/packages/no-modal/src/base/interfaces.ts b/packages/no-modal/src/base/interfaces.ts
index ec6451356..45e463c32 100644
--- a/packages/no-modal/src/base/interfaces.ts
+++ b/packages/no-modal/src/base/interfaces.ts
@@ -16,6 +16,8 @@ export interface IWeb3AuthState {
connectedConnectorName: WALLET_CONNECTOR_TYPE | null;
currentChainId: string;
idToken: string | null;
+ accessToken: string | null;
+ refreshToken: string | null;
}
export type ChainsConfig = CustomChainConfig[];
diff --git a/packages/no-modal/src/base/utils.ts b/packages/no-modal/src/base/utils.ts
index 694df41c5..cf6f4771b 100644
--- a/packages/no-modal/src/base/utils.ts
+++ b/packages/no-modal/src/base/utils.ts
@@ -1,8 +1,8 @@
import { CHAIN_NAMESPACES, cloneDeep } from "@toruslabs/base-controllers";
-import { DASHBOARD_PUBLIC_API_MAP } from "@toruslabs/constants";
+import { CITADEL_SERVER_MAP, DASHBOARD_PUBLIC_API_MAP } from "@toruslabs/constants";
import { type AccountAbstractionMultiChainConfig } from "@toruslabs/ethereum-controllers";
import { get } from "@toruslabs/http-helpers";
-import { type BUILD_ENV_TYPE } from "@web3auth/auth";
+import { BUILD_ENV, type BUILD_ENV_TYPE } from "@web3auth/auth";
import { type Chain } from "viem";
import { type CustomChainConfig } from "./chain/IChainInterface";
@@ -20,6 +20,10 @@ export const dashboardPublicApiUrl = (buildEnv: BUILD_ENV_TYPE) => {
return DASHBOARD_PUBLIC_API_MAP[buildEnv];
};
+export const citadelServerUrl = (buildEnv?: BUILD_ENV_TYPE): string => {
+ return CITADEL_SERVER_MAP[buildEnv || BUILD_ENV.PRODUCTION];
+};
+
export const fetchProjectConfig = async ({
clientId,
web3AuthNetwork,
diff --git a/packages/no-modal/src/connectors/auth-connector/authConnector.ts b/packages/no-modal/src/connectors/auth-connector/authConnector.ts
index 747b8db08..20e5af588 100644
--- a/packages/no-modal/src/connectors/auth-connector/authConnector.ts
+++ b/packages/no-modal/src/connectors/auth-connector/authConnector.ts
@@ -23,6 +23,7 @@ import deepmerge from "deepmerge";
import {
AuthLoginParams,
+ AuthTokenInfo,
BaseConnector,
BaseConnectorLoginParams,
CHAIN_NAMESPACES,
@@ -40,7 +41,6 @@ import {
ConnectorInitOptions,
ConnectorNamespaceType,
ConnectorParams,
- IdentityTokenInfo,
IProvider,
log,
UserInfo,
@@ -198,7 +198,7 @@ class AuthConnector extends BaseConnector {
// connect only if it is redirect result or if connect (connector is cached/already connected in same session) is true
if (sessionId && (options.autoConnect || isRedirectResult)) {
this.rehydrated = true;
- await this.connect({ chainId: options.chainId, getIdentityToken: options.getIdentityToken });
+ await this.connect({ chainId: options.chainId, getAuthTokenInfo: options.getAuthTokenInfo });
} else if (!sessionId && options.autoConnect) {
// if here, this means that the connector is cached but the sessionId is not available.
// this can happen if the sessionId has expired.
@@ -282,14 +282,25 @@ class AuthConnector extends BaseConnector {
this.emit(CONNECTOR_EVENTS.DISCONNECTED);
}
- async getIdentityToken(): Promise<{ idToken: string }> {
+ async getAuthTokenInfo(): Promise {
if (!this.canAuthorize) throw WalletLoginError.notConnectedError("Not connected with wallet, Please login/connect first");
this.status = CONNECTOR_STATUS.AUTHORIZING;
this.emit(CONNECTOR_EVENTS.AUTHORIZING, { connector: WALLET_CONNECTORS.AUTH });
const userInfo = await this.getUserInfo();
this.status = CONNECTOR_STATUS.AUTHORIZED;
- this.emit(CONNECTOR_EVENTS.AUTHORIZED, { connector: WALLET_CONNECTORS.AUTH, identityTokenInfo: { idToken: userInfo.idToken as string } });
- return { idToken: userInfo.idToken as string };
+ const [accessToken, refreshToken] = await Promise.all([
+ this.authInstance.authSessionManager.getAccessToken(),
+ this.authInstance.authSessionManager.getRefreshToken(),
+ ]);
+ this.emit(CONNECTOR_EVENTS.AUTHORIZED, {
+ connector: WALLET_CONNECTORS.AUTH,
+ authTokenInfo: {
+ idToken: userInfo.idToken as string,
+ accessToken,
+ refreshToken,
+ },
+ });
+ return { idToken: userInfo.idToken as string, accessToken, refreshToken };
}
async getUserInfo(): Promise> {
@@ -434,20 +445,18 @@ class AuthConnector extends BaseConnector {
// Setup Solana wallet only when current chain is solana
// TODO: remove this condition when wallet services support multiple namespaces at the same time
if (chainNamespace === CHAIN_NAMESPACES.SOLANA) await this.setupSolanaWallet();
- // if getIdentityToken is true, then get the identity token
- // No need to get the identity token for auth connector as it is already handled
- let identityTokenInfo: IdentityTokenInfo | undefined;
+ // if getAuthTokenInfo is true, then get auth token info
+ // No need to get auth token info for auth connector as it is already handled
this.status = CONNECTOR_STATUS.CONNECTED;
this.emit(CONNECTOR_EVENTS.CONNECTED, {
connectorName: WALLET_CONNECTORS.AUTH,
reconnected: this.rehydrated,
ethereumProvider: this.provider,
solanaWallet: this._solanaWallet,
- identityTokenInfo,
} as CONNECTED_EVENT_DATA);
- if (params.getIdentityToken) {
- identityTokenInfo = await this.getIdentityToken();
+ if (params.getAuthTokenInfo) {
+ await this.getAuthTokenInfo();
}
// handle disconnect from ws embed
this.wsEmbedInstance?.provider.on("accountsChanged", (accounts: unknown[] = []) => {
diff --git a/packages/no-modal/src/connectors/base-evm-connector/baseEvmConnector.ts b/packages/no-modal/src/connectors/base-evm-connector/baseEvmConnector.ts
index a900d0704..4447059d1 100644
--- a/packages/no-modal/src/connectors/base-evm-connector/baseEvmConnector.ts
+++ b/packages/no-modal/src/connectors/base-evm-connector/baseEvmConnector.ts
@@ -1,16 +1,13 @@
-import { signChallenge, verifySignedChallenge } from "@toruslabs/base-controllers";
+import { signChallenge } from "@toruslabs/base-controllers";
import { EVM_METHOD_TYPES } from "@web3auth/ws-embed";
import {
+ AuthTokenInfo,
BaseConnector,
- checkIfTokenIsExpired,
- clearToken,
+ citadelServerUrl,
CONNECTOR_EVENTS,
CONNECTOR_STATUS,
ConnectorInitOptions,
- getSavedToken,
- IdentityTokenInfo,
- saveToken,
WALLET_CONNECTOR_TYPE,
WalletInitializationError,
WalletLoginError,
@@ -19,27 +16,21 @@ import {
export abstract class BaseEvmConnector extends BaseConnector {
async init(_?: ConnectorInitOptions): Promise {}
- async getIdentityToken(): Promise {
+ async getAuthTokenInfo(): Promise {
if (!this.provider || !this.canAuthorize) throw WalletLoginError.notConnectedError();
if (!this.coreOptions) throw WalletInitializationError.invalidParams("Please initialize Web3Auth with valid options");
this.status = CONNECTOR_STATUS.AUTHORIZING;
this.emit(CONNECTOR_EVENTS.AUTHORIZING, { connector: this.name as WALLET_CONNECTOR_TYPE });
const accounts = await this.provider.request({ method: EVM_METHOD_TYPES.GET_ACCOUNTS });
if (accounts && accounts.length > 0) {
- const existingToken = getSavedToken(accounts[0] as string, this.name);
- if (existingToken) {
- const isExpired = checkIfTokenIsExpired(existingToken);
- if (!isExpired) {
- this.status = CONNECTOR_STATUS.AUTHORIZED;
- this.emit(CONNECTOR_EVENTS.AUTHORIZED, { connector: this.name as WALLET_CONNECTOR_TYPE, identityTokenInfo: { idToken: existingToken } });
- return { idToken: existingToken };
- }
- }
+ const cached = await this.getCachedOrNullAuthTokenInfo(accounts[0] as string);
+ if (cached) return cached;
const chainId = await this.provider.request({ method: "eth_chainId" });
const currentChainConfig = this.coreOptions.chains.find((x) => x.chainId === chainId);
if (!currentChainConfig) throw WalletInitializationError.invalidParams("chainConfig is required before authentication");
const { chainNamespace } = currentChainConfig;
+ const authServer = citadelServerUrl(this.coreOptions.authBuildEnv);
const payload = {
domain: window.location.origin,
uri: window.location.href,
@@ -50,7 +41,7 @@ export abstract class BaseEvmConnector extends BaseConnector {
issuedAt: new Date().toISOString(),
};
- const challenge = await signChallenge(payload, chainNamespace);
+ const challenge = await signChallenge(payload, chainNamespace, authServer);
const hexChallenge = `0x${Buffer.from(challenge, "utf8").toString("hex")}`;
const signedMessage = await this.provider.request<[string, string], string>({
@@ -58,29 +49,14 @@ export abstract class BaseEvmConnector extends BaseConnector {
params: [hexChallenge, accounts[0]],
});
- const idToken = await verifySignedChallenge(
- chainNamespace,
- signedMessage as string,
- challenge,
- this.name,
- this.coreOptions.sessionTime,
- this.coreOptions.clientId,
- this.coreOptions.web3AuthNetwork
- );
- saveToken(accounts[0] as string, this.name, idToken);
- this.status = CONNECTOR_STATUS.AUTHORIZED;
- this.emit(CONNECTOR_EVENTS.AUTHORIZED, { connector: this.name as WALLET_CONNECTOR_TYPE, identityTokenInfo: { idToken } });
- return { idToken };
+ return this.verifyAndAuthorize({ chainNamespace, signedMessage, challenge, authServer });
}
throw WalletLoginError.notConnectedError("Not connected with wallet, Please login/connect first");
}
async disconnectSession(): Promise {
super.checkDisconnectionRequirements();
- const accounts = await this.provider.request({ method: "eth_accounts" });
- if (accounts && accounts.length > 0) {
- clearToken(accounts[0], this.name);
- }
+ await this.clearWalletSession();
}
async disconnect(): Promise {
diff --git a/packages/no-modal/src/connectors/base-solana-connector/baseSolanaConnector.ts b/packages/no-modal/src/connectors/base-solana-connector/baseSolanaConnector.ts
index bec379916..3d4df3ec2 100644
--- a/packages/no-modal/src/connectors/base-solana-connector/baseSolanaConnector.ts
+++ b/packages/no-modal/src/connectors/base-solana-connector/baseSolanaConnector.ts
@@ -1,17 +1,14 @@
-import { signChallenge, verifySignedChallenge } from "@toruslabs/base-controllers";
+import { signChallenge } from "@toruslabs/base-controllers";
import {
+ AuthTokenInfo,
BaseConnector,
CHAIN_NAMESPACES,
- checkIfTokenIsExpired,
- clearToken,
+ citadelServerUrl,
CONNECTOR_EVENTS,
CONNECTOR_STATUS,
ConnectorInitOptions,
- getSavedToken,
getSolanaChainByChainConfig,
- IdentityTokenInfo,
- saveToken,
WALLET_CONNECTOR_TYPE,
WalletInitializationError,
WalletLoginError,
@@ -21,7 +18,7 @@ import {
export abstract class BaseSolanaConnector extends BaseConnector {
async init(_?: ConnectorInitOptions): Promise {}
- async getIdentityToken(): Promise {
+ async getAuthTokenInfo(): Promise {
if (!this.solanaWallet || !this.canAuthorize) throw WalletLoginError.notConnectedError();
if (!this.coreOptions) throw WalletInitializationError.invalidParams("Please initialize Web3Auth with a valid options");
@@ -30,15 +27,8 @@ export abstract class BaseSolanaConnector extends BaseConnector {
const accounts = this.solanaWallet.accounts.map((a) => a.address);
if (accounts.length > 0) {
- const existingToken = getSavedToken(accounts[0], this.name);
- if (existingToken) {
- const isExpired = checkIfTokenIsExpired(existingToken);
- if (!isExpired) {
- this.status = CONNECTOR_STATUS.AUTHORIZED;
- this.emit(CONNECTOR_EVENTS.AUTHORIZED, { connector: this.name as WALLET_CONNECTOR_TYPE, identityTokenInfo: { idToken: existingToken } });
- return { idToken: existingToken };
- }
- }
+ const cached = await this.getCachedOrNullAuthTokenInfo(accounts[0]);
+ if (cached) return cached;
const walletChains = new Set(this.solanaWallet.chains);
const currentChainConfig = this.coreOptions.chains.find((c) => {
@@ -50,6 +40,7 @@ export abstract class BaseSolanaConnector extends BaseConnector {
throw WalletInitializationError.invalidParams("No Solana chain in common between the connected wallet and Web3Auth chain configuration");
}
const { chainId, chainNamespace } = currentChainConfig;
+ const authServer = citadelServerUrl(this.coreOptions.authBuildEnv);
const payload = {
domain: window.location.origin,
@@ -61,31 +52,16 @@ export abstract class BaseSolanaConnector extends BaseConnector {
issuedAt: new Date().toISOString(),
};
- const challenge = await signChallenge(payload, chainNamespace);
+ const challenge = await signChallenge(payload, chainNamespace, authServer);
const signedMessage = await walletSignMessage(this.solanaWallet, challenge, accounts[0]);
- const idToken = await verifySignedChallenge(
- chainNamespace,
- signedMessage,
- challenge,
- this.name,
- this.coreOptions.sessionTime,
- this.coreOptions.clientId,
- this.coreOptions.web3AuthNetwork
- );
- saveToken(accounts[0], this.name, idToken);
- this.status = CONNECTOR_STATUS.AUTHORIZED;
- this.emit(CONNECTOR_EVENTS.AUTHORIZED, { connector: this.name as WALLET_CONNECTOR_TYPE, identityTokenInfo: { idToken } });
- return { idToken };
+ return this.verifyAndAuthorize({ chainNamespace, signedMessage, challenge, authServer });
}
throw WalletLoginError.notConnectedError("Not connected with wallet, Please login/connect first");
}
async disconnectSession(): Promise {
super.checkDisconnectionRequirements();
- const accounts = this.solanaWallet?.accounts.map((a) => a.address) ?? [];
- if (accounts.length > 0) {
- clearToken(accounts[0], this.name);
- }
+ await this.clearWalletSession();
}
async disconnect(): Promise {
diff --git a/packages/no-modal/src/connectors/coinbase-connector/coinbaseConnector.ts b/packages/no-modal/src/connectors/coinbase-connector/coinbaseConnector.ts
index 3780ce64d..bb7f4c2aa 100644
--- a/packages/no-modal/src/connectors/coinbase-connector/coinbaseConnector.ts
+++ b/packages/no-modal/src/connectors/coinbase-connector/coinbaseConnector.ts
@@ -18,7 +18,6 @@ import {
ConnectorInitOptions,
ConnectorNamespaceType,
ConnectorParams,
- IdentityTokenInfo,
IProvider,
UserInfo,
WALLET_CONNECTOR_TYPE,
@@ -83,7 +82,7 @@ class CoinbaseConnector extends BaseEvmConnector {
try {
if (options.autoConnect) {
this.rehydrated = true;
- const connection = await this.connect({ chainId: options.chainId, getIdentityToken: options.getIdentityToken });
+ const connection = await this.connect({ chainId: options.chainId, getAuthTokenInfo: options.getAuthTokenInfo });
// the connect function could fail silently as well.
if (!connection) {
this.rehydrated = false;
@@ -95,7 +94,7 @@ class CoinbaseConnector extends BaseEvmConnector {
}
}
- async connect({ chainId, getIdentityToken }: BaseConnectorLoginParams): Promise {
+ async connect({ chainId, getAuthTokenInfo }: BaseConnectorLoginParams): Promise {
super.checkConnectionRequirements();
if (!this.coinbaseProvider) throw WalletLoginError.notConnectedError("Connector is not initialized");
this.status = CONNECTOR_STATUS.CONNECTING;
@@ -116,18 +115,15 @@ class CoinbaseConnector extends BaseEvmConnector {
this.disconnect();
});
- let identityTokenInfo: IdentityTokenInfo | undefined;
-
this.emit(CONNECTOR_EVENTS.CONNECTED, {
connectorName: WALLET_CONNECTORS.COINBASE,
reconnected: this.rehydrated,
ethereumProvider: this.provider,
solanaWallet: null,
- identityTokenInfo,
} as CONNECTED_EVENT_DATA);
- if (getIdentityToken) {
- identityTokenInfo = await this.getIdentityToken();
+ if (getAuthTokenInfo) {
+ await this.getAuthTokenInfo();
}
return { ethereumProvider: this.provider, solanaWallet: null, connectorName: this.name };
diff --git a/packages/no-modal/src/connectors/injected-evm-connector/injectedEvmConnector.ts b/packages/no-modal/src/connectors/injected-evm-connector/injectedEvmConnector.ts
index 1302d1980..cab1b62b3 100644
--- a/packages/no-modal/src/connectors/injected-evm-connector/injectedEvmConnector.ts
+++ b/packages/no-modal/src/connectors/injected-evm-connector/injectedEvmConnector.ts
@@ -19,7 +19,6 @@ import {
ConnectorNamespaceType,
ConnectorParams,
CustomChainConfig,
- IdentityTokenInfo,
IProvider,
log,
normalizeWalletName,
@@ -72,7 +71,7 @@ class InjectedEvmConnector extends BaseEvmConnector {
log.debug(`initializing ${this.name} injected connector`);
if (options.autoConnect) {
this.rehydrated = true;
- const connection = await this.connect({ chainId: options.chainId, getIdentityToken: options.getIdentityToken });
+ const connection = await this.connect({ chainId: options.chainId, getAuthTokenInfo: options.getAuthTokenInfo });
if (!connection) {
this.rehydrated = false;
throw WalletLoginError.connectionError("Failed to rehydrate.");
@@ -83,7 +82,7 @@ class InjectedEvmConnector extends BaseEvmConnector {
}
}
- async connect({ chainId, getIdentityToken }: BaseConnectorLoginParams): Promise {
+ async connect({ chainId, getAuthTokenInfo }: BaseConnectorLoginParams): Promise {
super.checkConnectionRequirements();
if (!this.injectedProvider) throw WalletLoginError.connectionError("Injected provider is not available");
const chainConfig = this.coreOptions.chains.find((x) => x.chainId === chainId);
@@ -110,18 +109,15 @@ class InjectedEvmConnector extends BaseEvmConnector {
}
};
this.injectedProvider.on("accountsChanged", accountDisconnectHandler);
- let identityTokenInfo: IdentityTokenInfo | undefined;
-
this.emit(CONNECTOR_EVENTS.CONNECTED, {
connectorName: this.name,
reconnected: this.rehydrated,
ethereumProvider: this.injectedProvider,
solanaWallet: null,
- identityTokenInfo,
} as CONNECTED_EVENT_DATA);
- if (getIdentityToken) {
- identityTokenInfo = await this.getIdentityToken();
+ if (getAuthTokenInfo) {
+ await this.getAuthTokenInfo();
}
return { ethereumProvider: this.injectedProvider, solanaWallet: null, connectorName: this.name };
diff --git a/packages/no-modal/src/connectors/injected-solana-connector/walletStandardConnector.ts b/packages/no-modal/src/connectors/injected-solana-connector/walletStandardConnector.ts
index 144134bfa..00d687181 100644
--- a/packages/no-modal/src/connectors/injected-solana-connector/walletStandardConnector.ts
+++ b/packages/no-modal/src/connectors/injected-solana-connector/walletStandardConnector.ts
@@ -39,7 +39,6 @@ import {
ConnectorNamespaceType,
ConnectorParams,
getSolanaChainByChainConfig,
- IdentityTokenInfo,
log,
normalizeWalletName,
UserInfo,
@@ -93,7 +92,7 @@ export class WalletStandardConnector extends BaseSolanaConnector {
log.debug("initializing solana injected connector");
if (options.autoConnect) {
this.rehydrated = true;
- const connection = await this.connect({ chainId: options.chainId, getIdentityToken: options.getIdentityToken });
+ const connection = await this.connect({ chainId: options.chainId, getAuthTokenInfo: options.getAuthTokenInfo });
if (!connection) {
this.rehydrated = false;
throw WalletLoginError.connectionError("Failed to rehydrate.");
@@ -104,7 +103,7 @@ export class WalletStandardConnector extends BaseSolanaConnector {
}
}
- async connect({ chainId, getIdentityToken }: BaseConnectorLoginParams): Promise {
+ async connect({ chainId, getAuthTokenInfo }: BaseConnectorLoginParams): Promise {
try {
super.checkConnectionRequirements();
const chainConfig = this.coreOptions.chains.find((x) => x.chainId === chainId);
@@ -123,18 +122,15 @@ export class WalletStandardConnector extends BaseSolanaConnector {
if (this.wallet.accounts.length === 0) throw WalletLoginError.connectionError();
this.status = CONNECTOR_STATUS.CONNECTED;
- let identityTokenInfo: IdentityTokenInfo | undefined;
-
this.emit(CONNECTOR_EVENTS.CONNECTED, {
connectorName: this.name,
reconnected: this.rehydrated,
ethereumProvider: null,
solanaWallet: this.solanaWallet,
- identityTokenInfo,
} as CONNECTED_EVENT_DATA);
- if (getIdentityToken) {
- identityTokenInfo = await this.getIdentityToken();
+ if (getAuthTokenInfo) {
+ await this.getAuthTokenInfo();
}
return { ethereumProvider: null, solanaWallet: this.solanaWallet, connectorName: this.name };
diff --git a/packages/no-modal/src/connectors/metamask-connector/metamaskConnector.ts b/packages/no-modal/src/connectors/metamask-connector/metamaskConnector.ts
index 621421c4e..8acd1cf86 100644
--- a/packages/no-modal/src/connectors/metamask-connector/metamaskConnector.ts
+++ b/packages/no-modal/src/connectors/metamask-connector/metamaskConnector.ts
@@ -24,7 +24,6 @@ import {
type ConnectorParams,
type CustomChainConfig,
getCaipChainId,
- IdentityTokenInfo,
type IProvider,
type MetaMaskConnectorData,
type UserInfo,
@@ -106,7 +105,7 @@ class MetaMaskConnector extends BaseEvmConnector {
try {
if (options.autoConnect) {
this.rehydrated = true;
- const connection = await this.connect({ chainId: options.chainId, getIdentityToken: options.getIdentityToken });
+ const connection = await this.connect({ chainId: options.chainId, getAuthTokenInfo: options.getAuthTokenInfo });
if (!connection) {
this.rehydrated = false;
throw WalletLoginError.connectionError("Failed to rehydrate.");
@@ -117,7 +116,7 @@ class MetaMaskConnector extends BaseEvmConnector {
}
}
- async connect({ chainId, getIdentityToken }: BaseConnectorLoginParams): Promise {
+ async connect({ chainId, getAuthTokenInfo }: BaseConnectorLoginParams): Promise {
super.checkConnectionRequirements();
if (!this.metamaskSDK) throw WalletLoginError.notConnectedError("Connector is not initialized");
const chainConfig = this.coreOptions.chains.find((x) => x.chainId === chainId);
@@ -179,18 +178,15 @@ class MetaMaskConnector extends BaseEvmConnector {
});
}
- let identityTokenInfo: IdentityTokenInfo | undefined;
-
this.emit(CONNECTOR_EVENTS.CONNECTED, {
connectorName: WALLET_CONNECTORS.METAMASK,
reconnected: this.rehydrated,
ethereumProvider: this.metamaskProvider,
solanaWallet: null,
- identityTokenInfo,
} as CONNECTED_EVENT_DATA);
- if (getIdentityToken) {
- identityTokenInfo = await this.getIdentityToken();
+ if (getAuthTokenInfo) {
+ await this.getAuthTokenInfo();
}
return { ethereumProvider: this.metamaskProvider, solanaWallet: null, connectorName: this.name };
diff --git a/packages/no-modal/src/connectors/wallet-connect-v2-connector/walletConnectV2Connector.ts b/packages/no-modal/src/connectors/wallet-connect-v2-connector/walletConnectV2Connector.ts
index 79a1cdae8..81ebcb996 100644
--- a/packages/no-modal/src/connectors/wallet-connect-v2-connector/walletConnectV2Connector.ts
+++ b/packages/no-modal/src/connectors/wallet-connect-v2-connector/walletConnectV2Connector.ts
@@ -1,4 +1,4 @@
-import { getErrorAnalyticsProperties, signChallenge, verifySignedChallenge } from "@toruslabs/base-controllers";
+import { getErrorAnalyticsProperties, signChallenge } from "@toruslabs/base-controllers";
import type { Wallet } from "@wallet-standard/base";
import Client from "@walletconnect/sign-client";
import { SessionTypes } from "@walletconnect/types";
@@ -9,11 +9,12 @@ import deepmerge from "deepmerge";
import {
type Analytics,
ANALYTICS_EVENTS,
+ AuthTokenInfo,
BaseConnector,
BaseConnectorLoginParams,
CHAIN_NAMESPACES,
ChainNamespaceType,
- checkIfTokenIsExpired,
+ citadelServerUrl,
CONNECTED_EVENT_DATA,
type Connection,
CONNECTOR_CATEGORY,
@@ -28,11 +29,8 @@ import {
ConnectorParams,
CustomChainConfig,
getCaipChainId,
- getSavedToken,
- IdentityTokenInfo,
IProvider,
log,
- saveToken,
SOLANA_CAIP_CHAIN_MAP,
UserInfo,
WALLET_CONNECTOR_TYPE,
@@ -151,7 +149,7 @@ class WalletConnectV2Connector extends BaseConnector {
if (this.connected) {
this.rehydrated = true;
try {
- await this.onConnectHandler({ chain: chainConfig, getIdentityToken: options.getIdentityToken });
+ await this.onConnectHandler({ chain: chainConfig, getAuthTokenInfo: options.getAuthTokenInfo });
} catch (error) {
log.error("wallet auto connect", error);
this.emit(CONNECTOR_EVENTS.REHYDRATION_ERROR, error as Web3AuthError);
@@ -163,7 +161,7 @@ class WalletConnectV2Connector extends BaseConnector {
}
}
- async connect({ chainId, getIdentityToken }: BaseConnectorLoginParams): Promise {
+ async connect({ chainId, getAuthTokenInfo }: BaseConnectorLoginParams): Promise {
super.checkConnectionRequirements();
const chainConfig = this.coreOptions.chains.find((x) => x.chainId === chainId);
if (!chainConfig) throw WalletLoginError.connectionError("Chain config is not available");
@@ -207,12 +205,12 @@ class WalletConnectV2Connector extends BaseConnector {
// if already connected
if (this.connected) {
- await this.onConnectHandler({ chain: chainConfig, getIdentityToken });
+ await this.onConnectHandler({ chain: chainConfig, getAuthTokenInfo });
return { ethereumProvider: this.provider, solanaWallet: this._solanaWallet, connectorName: this.name };
}
if (this.status !== CONNECTOR_STATUS.CONNECTING) {
- await this.createNewSession({ chainConfig, trackCompletionEvents, getIdentityToken });
+ await this.createNewSession({ chainConfig, trackCompletionEvents, getAuthTokenInfo });
}
return { ethereumProvider: this.provider, solanaWallet: this._solanaWallet, connectorName: this.name };
@@ -272,6 +270,7 @@ class WalletConnectV2Connector extends BaseConnector {
if (!this.connector || !this.connected || !this.activeSession?.topic) throw WalletLoginError.notConnectedError("Not connected with wallet");
if (!options.sessionRemovedByWallet)
await this.connector.disconnect({ topic: this.activeSession?.topic, reason: getSdkError("USER_DISCONNECTED") });
+ await this.clearWalletSession();
this.rehydrated = false;
this._solanaWallet = null;
if (cleanup) {
@@ -286,7 +285,7 @@ class WalletConnectV2Connector extends BaseConnector {
this.emit(CONNECTOR_EVENTS.DISCONNECTED);
}
- async getIdentityToken(): Promise {
+ async getAuthTokenInfo(): Promise {
if (!this.provider || !this.canAuthorize) throw WalletLoginError.notConnectedError();
this.status = CONNECTOR_STATUS.AUTHORIZING;
this.emit(CONNECTOR_EVENTS.AUTHORIZING, { connector: WALLET_CONNECTORS.WALLET_CONNECT_V2 });
@@ -300,15 +299,8 @@ class WalletConnectV2Connector extends BaseConnector {
? this._solanaWallet.accounts.map((a) => a.address)
: await this.provider.request({ method: EVM_METHOD_TYPES.GET_ACCOUNTS });
if (accounts && accounts.length > 0) {
- const existingToken = getSavedToken(accounts[0] as string, this.name);
- if (existingToken) {
- const isExpired = checkIfTokenIsExpired(existingToken);
- if (!isExpired) {
- this.status = CONNECTOR_STATUS.AUTHORIZED;
- this.emit(CONNECTOR_EVENTS.AUTHORIZED, { connector: WALLET_CONNECTORS.WALLET_CONNECT_V2, identityTokenInfo: { idToken: existingToken } });
- return { idToken: existingToken };
- }
- }
+ const cached = await this.getCachedOrNullAuthTokenInfo(accounts[0] as string);
+ if (cached) return cached;
const payload = {
domain: window.location.origin,
@@ -320,22 +312,10 @@ class WalletConnectV2Connector extends BaseConnector {
issuedAt: new Date().toISOString(),
};
- const challenge = await signChallenge(payload, chainNamespace);
+ const authServer = citadelServerUrl(this.coreOptions.authBuildEnv);
+ const challenge = await signChallenge(payload, chainNamespace, authServer);
const signedMessage = await this._getSignedMessage(challenge, accounts, chainNamespace);
-
- const idToken = await verifySignedChallenge(
- chainNamespace,
- signedMessage as string,
- challenge,
- this.name,
- this.coreOptions.sessionTime,
- this.coreOptions.clientId,
- this.coreOptions.web3AuthNetwork
- );
- saveToken(accounts[0] as string, this.name, idToken);
- this.status = CONNECTOR_STATUS.AUTHORIZED;
- this.emit(CONNECTOR_EVENTS.AUTHORIZED, { connector: WALLET_CONNECTORS.WALLET_CONNECT_V2, identityTokenInfo: { idToken } });
- return { idToken };
+ return this.verifyAndAuthorize({ chainNamespace, signedMessage: signedMessage as string, challenge, authServer });
}
throw WalletLoginError.notConnectedError("Not connected with wallet, Please login/connect first");
}
@@ -374,12 +354,12 @@ class WalletConnectV2Connector extends BaseConnector {
forceNewSession = false,
chainConfig,
trackCompletionEvents,
- getIdentityToken,
+ getAuthTokenInfo,
}: {
forceNewSession?: boolean;
chainConfig: CustomChainConfig;
trackCompletionEvents?: () => void;
- getIdentityToken?: boolean;
+ getAuthTokenInfo?: boolean;
}): Promise {
try {
if (!this.connector) throw WalletInitializationError.notReady("Wallet connector is not ready yet");
@@ -418,7 +398,7 @@ class WalletConnectV2Connector extends BaseConnector {
const session = await approval();
this.activeSession = session;
// Handle the returned session (e.g. update UI to "connected" state).
- await this.onConnectHandler({ chain: chainConfig, trackCompletionEvents, getIdentityToken });
+ await this.onConnectHandler({ chain: chainConfig, trackCompletionEvents, getAuthTokenInfo });
if (qrcodeModal) {
qrcodeModal.closeModal();
}
@@ -428,7 +408,7 @@ class WalletConnectV2Connector extends BaseConnector {
log.info("current connector status: ", this.status);
if (this.status === CONNECTOR_STATUS.CONNECTING) {
log.info("retrying to create new wallet connect session since proposal expired");
- return this.createNewSession({ forceNewSession: true, chainConfig, getIdentityToken });
+ return this.createNewSession({ forceNewSession: true, chainConfig, getAuthTokenInfo });
}
if (this.status === CONNECTOR_STATUS.READY) {
log.info("ignoring proposal expired error since some other connector is connected");
@@ -444,11 +424,11 @@ class WalletConnectV2Connector extends BaseConnector {
private async onConnectHandler({
chain,
trackCompletionEvents,
- getIdentityToken,
+ getAuthTokenInfo,
}: {
chain: CustomChainConfig;
trackCompletionEvents?: () => void;
- getIdentityToken?: boolean;
+ getAuthTokenInfo?: boolean;
}) {
if (!this.connector || !this.wcProvider) throw WalletInitializationError.notReady("Wallet connect connector is not ready yet");
this.subscribeEvents();
@@ -477,17 +457,15 @@ class WalletConnectV2Connector extends BaseConnector {
// track connection events
if (trackCompletionEvents) trackCompletionEvents();
- let identityTokenInfo: IdentityTokenInfo | undefined;
this.emit(CONNECTOR_EVENTS.CONNECTED, {
connectorName: WALLET_CONNECTORS.WALLET_CONNECT_V2,
reconnected: this.rehydrated,
ethereumProvider: this.provider,
solanaWallet: this._solanaWallet,
- identityTokenInfo,
} as CONNECTED_EVENT_DATA);
- if (getIdentityToken) {
- identityTokenInfo = await this.getIdentityToken();
+ if (getAuthTokenInfo) {
+ await this.getAuthTokenInfo();
}
}
diff --git a/packages/no-modal/src/noModal.ts b/packages/no-modal/src/noModal.ts
index 75d6cb2f0..3b8b272e9 100644
--- a/packages/no-modal/src/noModal.ts
+++ b/packages/no-modal/src/noModal.ts
@@ -13,7 +13,6 @@ import {
SafeEventEmitter,
type SafeEventEmitterProvider,
serializeError,
- SessionStorageAdapter,
UX_MODE,
} from "@web3auth/auth";
import { WsEmbedParams } from "@web3auth/ws-embed";
@@ -26,6 +25,7 @@ import {
ANALYTICS_SDK_TYPE,
AuthLoginParams,
AUTHORIZED_EVENT_DATA,
+ type AuthTokenInfo,
CAN_AUTHORIZE_STATUSES,
CHAIN_NAMESPACES,
type ChainNamespaceType,
@@ -47,7 +47,6 @@ import {
getWhitelabelAnalyticsProperties,
type IBaseProvider,
type IConnector,
- type IdentityTokenInfo,
type IPlugin,
type IProvider,
isBrowser,
@@ -106,6 +105,8 @@ export class Web3AuthNoModal extends SafeEventEmitter imp
cachedConnector: null,
currentChainId: null,
idToken: null,
+ accessToken: null,
+ refreshToken: null,
};
private loginMode: LoginModeType = LOGIN_MODE.NO_MODAL;
@@ -115,7 +116,6 @@ export class Web3AuthNoModal extends SafeEventEmitter imp
if (!options.clientId) throw WalletInitializationError.invalidParams("Please provide a valid clientId in constructor");
if (options.enableLogging) log.enableAll();
else log.setLevel("error");
- if (!options.storageType) options.storageType = "local";
if (!options.initialAuthenticationMode) options.initialAuthenticationMode = CONNECTOR_INITIAL_AUTHENTICATION_MODE.CONNECT_AND_SIGN;
this.coreOptions = options;
@@ -292,6 +292,8 @@ export class Web3AuthNoModal extends SafeEventEmitter imp
cachedConnector: null,
currentChainId: null,
idToken: null,
+ accessToken: null,
+ refreshToken: null,
});
}
@@ -347,7 +349,7 @@ export class Web3AuthNoModal extends SafeEventEmitter imp
const finalLoginParams = {
...loginParams,
chainId: initialChain.chainId,
- getIdentityToken: this.coreOptions.initialAuthenticationMode === CONNECTOR_INITIAL_AUTHENTICATION_MODE.CONNECT_AND_SIGN,
+ getAuthTokenInfo: this.coreOptions.initialAuthenticationMode === CONNECTOR_INITIAL_AUTHENTICATION_MODE.CONNECT_AND_SIGN,
};
// track connection started event
@@ -405,7 +407,7 @@ export class Web3AuthNoModal extends SafeEventEmitter imp
const checkCompletion = async () => {
// In CONNECT_AND_SIGN mode, wait for both connected event and authorized event
- if (finalLoginParams.getIdentityToken) {
+ if (finalLoginParams.getAuthTokenInfo) {
if (connectedEventCompleted && authorizedEventReceived) {
await completeConnection();
}
@@ -456,7 +458,7 @@ export class Web3AuthNoModal extends SafeEventEmitter imp
};
this.once(CONNECTOR_EVENTS.CONNECTED, onConnected);
- if (finalLoginParams.getIdentityToken) {
+ if (finalLoginParams.getAuthTokenInfo) {
this.once(CONNECTOR_EVENTS.AUTHORIZED, onAuthorized);
}
this.once(CONNECTOR_EVENTS.ERRORED, onErrored);
@@ -515,15 +517,15 @@ export class Web3AuthNoModal extends SafeEventEmitter imp
}
}
- async getIdentityToken(): Promise {
+ async getAuthTokenInfo(): Promise> {
if (!CAN_AUTHORIZE_STATUSES.includes(this.status) || !this.connectedConnector) throw WalletLoginError.notConnectedError(`No wallet is connected`);
const trackData = { connector: this.connectedConnector.name };
try {
this.analytics.track(ANALYTICS_EVENTS.IDENTITY_TOKEN_STARTED, trackData);
- const identityToken = await this.connectedConnector.getIdentityToken();
+ const authTokenInfo = await this.connectedConnector.getAuthTokenInfo();
this.analytics.track(ANALYTICS_EVENTS.IDENTITY_TOKEN_COMPLETED, trackData);
- return identityToken;
+ return { idToken: authTokenInfo.idToken };
} catch (error) {
this.analytics.track(ANALYTICS_EVENTS.IDENTITY_TOKEN_FAILED, {
...trackData,
@@ -740,7 +742,7 @@ export class Web3AuthNoModal extends SafeEventEmitter imp
default_chain_id: defaultChain ? getCaipChainId(defaultChain) : undefined,
default_chain_name: defaultChain?.displayName,
logging_enabled: this.coreOptions.enableLogging,
- storage_type: this.coreOptions.storageType,
+ custom_storage: Boolean(this.coreOptions.storage),
session_time: this.coreOptions.sessionTime,
sfa_key_enabled: this.coreOptions.useSFAKey,
mipd_enabled: this.coreOptions.multiInjectedProviderDiscovery,
@@ -779,7 +781,7 @@ export class Web3AuthNoModal extends SafeEventEmitter imp
await connector.init({
autoConnect,
chainId: initialChain.chainId,
- getIdentityToken: this.coreOptions.initialAuthenticationMode === CONNECTOR_INITIAL_AUTHENTICATION_MODE.CONNECT_AND_SIGN,
+ getAuthTokenInfo: this.coreOptions.initialAuthenticationMode === CONNECTOR_INITIAL_AUTHENTICATION_MODE.CONNECT_AND_SIGN,
});
} catch (e) {
log.error(e, connector.name);
@@ -880,19 +882,17 @@ export class Web3AuthNoModal extends SafeEventEmitter imp
protected subscribeToConnectorEvents(connector: IConnector): void {
connector.on(CONNECTOR_EVENTS.CONNECTED, async (data: CONNECTED_EVENT_DATA) => {
if (!this.commonJRPCProvider) throw WalletInitializationError.notFound(`CommonJrpcProvider not found`);
- const { ethereumProvider, solanaWallet, identityTokenInfo } = data;
-
- if (identityTokenInfo) {
- await this.setState({ idToken: identityTokenInfo.idToken });
- }
+ const { ethereumProvider, solanaWallet } = data;
// when ssr is enabled, we need to get the idToken from the connector.
if (this.coreOptions.ssr) {
try {
- const data = await connector.getIdentityToken();
+ const data = await connector.getAuthTokenInfo();
if (!data.idToken) throw WalletLoginError.connectionError("No idToken found");
await this.setState({
idToken: data.idToken,
+ accessToken: data.accessToken ?? null,
+ refreshToken: data.refreshToken ?? null,
});
} catch (error) {
log.error(error);
@@ -1029,7 +1029,11 @@ export class Web3AuthNoModal extends SafeEventEmitter imp
});
connector.on(CONNECTOR_EVENTS.AUTHORIZED, async (data: AUTHORIZED_EVENT_DATA) => {
this.status = CONNECTOR_STATUS.AUTHORIZED;
- await this.setState({ idToken: data.identityTokenInfo.idToken });
+ await this.setState({
+ idToken: data.authTokenInfo.idToken,
+ accessToken: data.authTokenInfo.accessToken ?? null,
+ refreshToken: data.authTokenInfo.refreshToken ?? null,
+ });
this.emit(CONNECTOR_EVENTS.AUTHORIZED, data);
log.debug("authorized", this.status, this.connectedConnectorName);
});
@@ -1112,9 +1116,9 @@ export class Web3AuthNoModal extends SafeEventEmitter imp
}
private getStorageMethod(): IStorageAdapter {
- if (this.coreOptions.ssr || this.coreOptions.storageType === "cookies") return new CookieStorage({ maxAge: this.coreOptions.sessionTime });
- if (this.coreOptions.storageType === "session" && storageAvailable("sessionStorage")) return new SessionStorageAdapter();
- if (this.coreOptions.storageType === "local" && storageAvailable("localStorage")) return new LocalStorageAdapter();
+ if (this.coreOptions.storage?.sessionId) return this.coreOptions.storage.sessionId;
+ if (this.coreOptions.ssr) return new CookieStorage({ maxAge: this.coreOptions.sessionTime });
+ if (storageAvailable("localStorage")) return new LocalStorageAdapter();
return new MemoryStorage();
}
}
diff --git a/packages/no-modal/src/react/hooks/index.ts b/packages/no-modal/src/react/hooks/index.ts
index e14ac8e2a..8d641ee71 100644
--- a/packages/no-modal/src/react/hooks/index.ts
+++ b/packages/no-modal/src/react/hooks/index.ts
@@ -1,8 +1,8 @@
+export * from "./useAuthTokenInfo";
export * from "./useChain";
export * from "./useCheckout";
export * from "./useEnableMFA";
export * from "./useFunding";
-export * from "./useIdentityToken";
export * from "./useManageMFA";
export * from "./useReceive";
export * from "./useSwap";
diff --git a/packages/no-modal/src/react/hooks/useIdentityToken.ts b/packages/no-modal/src/react/hooks/useAuthTokenInfo.ts
similarity index 77%
rename from packages/no-modal/src/react/hooks/useIdentityToken.ts
rename to packages/no-modal/src/react/hooks/useAuthTokenInfo.ts
index d19137342..67fa32051 100644
--- a/packages/no-modal/src/react/hooks/useIdentityToken.ts
+++ b/packages/no-modal/src/react/hooks/useAuthTokenInfo.ts
@@ -3,25 +3,25 @@ import { useCallback, useEffect, useState } from "react";
import { Web3AuthError } from "../../base";
import { useWeb3AuthInner } from "./useWeb3AuthInner";
-export interface IUseIdentityToken {
+export interface IUseAuthTokenInfo {
loading: boolean;
error: Web3AuthError | null;
token: string | null;
- getIdentityToken: () => Promise;
+ getAuthTokenInfo: () => Promise;
}
-export const useIdentityToken = () => {
+export const useAuthTokenInfo = () => {
const { web3Auth, isConnected, isAuthorized } = useWeb3AuthInner();
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const [token, setToken] = useState(null);
- const getIdentityToken = useCallback(async () => {
+ const getAuthTokenInfo = useCallback(async () => {
setLoading(true);
setError(null);
try {
- const userAuthInfo = await web3Auth.getIdentityToken();
+ const userAuthInfo = await web3Auth.getAuthTokenInfo();
if (userAuthInfo?.idToken) {
setToken(userAuthInfo.idToken);
}
@@ -43,5 +43,5 @@ export const useIdentityToken = () => {
}
}, [isConnected, isAuthorized, token]);
- return { loading, error, token, getIdentityToken };
+ return { loading, error, token, getAuthTokenInfo };
};
diff --git a/packages/no-modal/src/vue/composables/index.ts b/packages/no-modal/src/vue/composables/index.ts
index e14ac8e2a..8d641ee71 100644
--- a/packages/no-modal/src/vue/composables/index.ts
+++ b/packages/no-modal/src/vue/composables/index.ts
@@ -1,8 +1,8 @@
+export * from "./useAuthTokenInfo";
export * from "./useChain";
export * from "./useCheckout";
export * from "./useEnableMFA";
export * from "./useFunding";
-export * from "./useIdentityToken";
export * from "./useManageMFA";
export * from "./useReceive";
export * from "./useSwap";
diff --git a/packages/no-modal/src/vue/composables/useIdentityToken.ts b/packages/no-modal/src/vue/composables/useAuthTokenInfo.ts
similarity index 78%
rename from packages/no-modal/src/vue/composables/useIdentityToken.ts
rename to packages/no-modal/src/vue/composables/useAuthTokenInfo.ts
index 5595fb622..b9fdd2802 100644
--- a/packages/no-modal/src/vue/composables/useIdentityToken.ts
+++ b/packages/no-modal/src/vue/composables/useAuthTokenInfo.ts
@@ -3,31 +3,31 @@ import { Ref, ref, watch } from "vue";
import { log, WalletInitializationError, Web3AuthError } from "../../base";
import { useWeb3AuthInner } from "./useWeb3AuthInner";
-export interface IUseIdentityToken {
+export interface IUseAuthTokenInfo {
loading: Ref;
error: Ref;
token: Ref;
- getIdentityToken: () => Promise;
+ getAuthTokenInfo: () => Promise;
}
-export const useIdentityToken = (): IUseIdentityToken => {
+export const useAuthTokenInfo = (): IUseAuthTokenInfo => {
const { web3Auth, isAuthorized } = useWeb3AuthInner();
const loading = ref(false);
const error = ref(null);
const token = ref(null);
- const getIdentityToken = async () => {
+ const getAuthTokenInfo = async () => {
try {
if (!web3Auth.value) throw WalletInitializationError.notReady();
error.value = null;
loading.value = true;
- const result = await web3Auth.value.getIdentityToken();
+ const result = await web3Auth.value.getAuthTokenInfo();
if (result?.idToken) {
token.value = result.idToken;
}
return result?.idToken;
} catch (err) {
- log.error("Error getting identity token", err);
+ log.error("Error getting auth token info", err);
error.value = err as Web3AuthError;
} finally {
loading.value = false;
@@ -52,6 +52,6 @@ export const useIdentityToken = (): IUseIdentityToken => {
loading,
error,
token,
- getIdentityToken,
+ getAuthTokenInfo,
};
};