@abstract-foundation/agw-web
Version:
Abstract Global Wallet for the web (generic EIP-6963 provider)
71 lines (61 loc) • 1.84 kB
text/typescript
import { transformEIP1193Provider } from '@abstract-foundation/agw-client';
import { toPrivyWalletProvider } from '@privy-io/cross-app-connect';
import { type EIP1193Provider, http } from 'viem';
import abstractIcon from './abstract-icon.js';
import type {
AnnounceProviderParameters,
AnnounceProviderReturnType,
EIP6963ProviderDetail,
EIP6963ProviderInfo,
} from './types.js';
class EIP6963AnnounceProviderEvent extends CustomEvent<EIP6963ProviderDetail> {
constructor(detail: EIP6963ProviderDetail) {
super('eip6963:announceProvider', { detail });
}
}
const eip6963info: EIP6963ProviderInfo = {
uuid: '2306fd26-fcfb-4f9e-87da-0d1e237e917c',
name: 'Abstract Global Wallet',
icon: abstractIcon,
rdns: 'xyz.abs.privy',
};
export function announceProvider({
chain,
transport,
customPaymasterHandler,
}: AnnounceProviderParameters): AnnounceProviderReturnType {
if (typeof window === 'undefined') {
return () => void 0;
}
const privyProvider = toPrivyWalletProvider({
chainId: chain.id,
providerAppId: 'cm04asygd041fmry9zmcyn5o5',
chains: [chain],
transports: {
[chain.id]:
transport ??
http(undefined, {
batch: true,
}),
},
}) as EIP1193Provider;
const abstractProvider = transformEIP1193Provider({
provider: privyProvider,
chain,
transport:
transport ??
http(undefined, {
batch: true,
}),
isPrivyCrossApp: true,
customPaymasterHandler,
});
const event = new EIP6963AnnounceProviderEvent({
info: eip6963info,
provider: abstractProvider,
});
window.dispatchEvent(event);
const handler = () => window.dispatchEvent(event);
window.addEventListener('eip6963:requestProvider', handler);
return () => window.removeEventListener('eip6963:requestProvider', handler);
}