@0xfutbol/id
Version:
React component library with shared providers for 0xFutbol ID
79 lines (78 loc) • 3.3 kB
JavaScript
import {bc as saveSession,bd as disconnectWalletConnectSession,be as getSessions}from'./index-BJCJzM2_.js';import'react';import'react/jsx-runtime';import'@0xfutbol/id-sign';import'react-use';import'@0xfutbol/constants';import'thirdweb';import'@matchain/matchid-sdk-react';import'@tanstack/react-query';import'@matchain/matchid-sdk-react/index.css';import'react-dom';/**
* @internal
*/
async function onSessionProposal(options) {
const { wallet, walletConnectClient, event, chains, onConnect } = options;
const account = wallet.getAccount();
if (!account) {
throw new Error("No account connected to provided wallet");
}
const origin = event.verifyContext?.verified?.origin;
if (origin) {
await disconnectExistingSessions({ origin, walletConnectClient });
}
const session = await acceptSessionProposal({
account,
walletConnectClient,
sessionProposal: event,
chains,
});
await saveSession(session);
wallet.subscribe("disconnect", () => {
disconnectWalletConnectSession({ session, walletConnectClient });
});
onConnect?.(session);
}
/**
* @internal
*/
async function disconnectExistingSessions({ walletConnectClient, origin, }) {
const sessions = await getSessions();
for (const session of sessions) {
if (session.origin === origin) {
await disconnectWalletConnectSession({ session, walletConnectClient });
}
}
}
/**
* @internal
*/
async function acceptSessionProposal({ account, walletConnectClient, sessionProposal, chains, }) {
if (!sessionProposal.params.requiredNamespaces?.eip155 &&
!sessionProposal.params.optionalNamespaces?.eip155) {
throw new Error("No EIP155 namespace found in Wallet Connect session proposal");
}
const namespaces = {
chains: [
...Array.from(new Set([
...(sessionProposal.params.requiredNamespaces?.eip155?.chains?.map((chain) => `${chain}:${account.address}`) ?? []),
...(sessionProposal.params.optionalNamespaces?.eip155?.chains?.map((chain) => `${chain}:${account.address}`) ?? []),
...(chains?.map((chain) => `eip155:${chain.id}:${account.address}`) ??
[]),
])),
],
methods: [
...(sessionProposal.params.requiredNamespaces?.eip155?.methods ?? []),
...(sessionProposal.params.optionalNamespaces?.eip155?.methods ?? []),
],
events: [
...(sessionProposal.params.requiredNamespaces?.eip155?.events ?? []),
...(sessionProposal.params.optionalNamespaces?.eip155?.events ?? []),
],
};
const approval = await walletConnectClient.approve({
id: sessionProposal.id,
namespaces: {
eip155: {
accounts: namespaces.chains,
methods: namespaces.methods,
events: namespaces.events,
},
},
});
const session = await approval.acknowledged();
return {
topic: session.topic,
origin: sessionProposal.verifyContext?.verified?.origin || "Unknown origin",
};
}export{acceptSessionProposal,disconnectExistingSessions,onSessionProposal};//# sourceMappingURL=session-proposal-DDEsuxjs.js.map