UNPKG

@pushchain/ui-kit

Version:

Push Chain is a true universal L1 that is 100% EVM compatible. It allows developers to deploy once and make their apps instantly compatible with users from all other L1s (Ethereum, Solana, etc) with zero on-chain code change.

197 lines 7.66 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ZerionProvider = void 0; const ethers_1 = require("ethers"); const viem_1 = require("viem"); const BaseWalletProvider_1 = require("../BaseWalletProvider"); const wallet_types_1 = require("../../../types/wallet.types"); const chains_1 = require("./chains"); const eip6963_1 = require("../utils/eip6963"); const signAuthorization_1 = require("./signAuthorization"); class ZerionProvider extends BaseWalletProvider_1.BaseWalletProvider { constructor() { super('Zerion', 'https://zerion.io/favicon.ico', [ wallet_types_1.ChainType.ETHEREUM, wallet_types_1.ChainType.ARBITRUM, wallet_types_1.ChainType.BASE, wallet_types_1.ChainType.BINANCE, wallet_types_1.ChainType.PUSH_WALLET, ]); } isInstalled = async () => { try { return !!this.getProvider(); } catch { return false; } }; getProvider = () => { const provider = (0, eip6963_1.getEIP6963ProviderByRdns)('io.zerion.wallet'); if (!provider) { throw new Error('Zerion provider not found via EIP-6963'); } return provider; }; getSigner = async () => { const provider = this.getProvider(); const browserProvider = new ethers_1.BrowserProvider(provider); return await browserProvider.getSigner(); }; getChainId = async () => { const provider = this.getProvider(); const hexChainId = await provider.request({ method: 'eth_chainId', params: [], }); return parseInt(hexChainId.toString(), 16); }; connect = async (chainType) => { const provider = this.getProvider(); const accounts = (await provider.request({ method: 'eth_requestAccounts', params: [], })); if (!accounts || accounts.length === 0) { throw new Error('No Zerion account returned'); } const checksumAddress = (0, ethers_1.getAddress)(accounts[0]); await this.switchNetwork(chainType); const chainId = await this.getChainId(); const caipAddress = this.formatAddress(checksumAddress, wallet_types_1.ChainType.ETHEREUM, chainId); return caipAddress; }; switchNetwork = async (chainName) => { const network = chains_1.chains[chainName]; const provider = this.getProvider(); const hexNetworkId = (0, viem_1.toHex)(network.id); try { await provider.request({ method: 'wallet_switchEthereumChain', params: [{ chainId: hexNetworkId }], }); } catch (err) { const msg = String(err?.message ?? ''); const needAdd = err?.code === 4902 || err?.code === -32603 || msg.includes('Unrecognized chain ID'); if (!needAdd) { console.error('Zerion: error switching network:', err); throw err; } try { await provider.request({ method: 'wallet_addEthereumChain', params: [ { chainId: hexNetworkId, chainName: network.name, rpcUrls: network.rpcUrls.default.http, nativeCurrency: network.nativeCurrency, blockExplorerUrls: network.blockExplorers?.default?.url ? [network.blockExplorers.default.url] : [], }, ], }); await provider.request({ method: 'wallet_switchEthereumChain', params: [{ chainId: hexNetworkId }], }); } catch (addError) { console.error('Zerion: error adding network:', addError); throw addError; } } }; signAndSendTransaction = async (txn) => { const provider = this.getProvider(); const accounts = (await provider.request({ method: 'eth_accounts', })); if (!accounts || accounts.length === 0) { throw new Error('No connected Zerion account'); } const hex = (0, viem_1.bytesToHex)(txn); const parsed = (0, viem_1.parseTransaction)(hex); const txParams = { from: accounts[0], to: parsed.to, value: parsed.value ? '0x' + parsed.value.toString(16) : undefined, data: parsed.data, gas: parsed.gas ? '0x' + parsed.gas.toString(16) : undefined, maxPriorityFeePerGas: parsed.maxPriorityFeePerGas ? '0x' + parsed.maxPriorityFeePerGas.toString(16) : undefined, maxFeePerGas: parsed.maxFeePerGas ? '0x' + parsed.maxFeePerGas.toString(16) : undefined, }; const txHash = await provider.request({ method: 'eth_sendTransaction', params: [txParams], }); return (0, viem_1.hexToBytes)(txHash); }; signMessage = async (message) => { const provider = this.getProvider(); const accounts = (await provider.request({ method: 'eth_accounts', })); if (!accounts || accounts.length === 0) { throw new Error('No connected Zerion account'); } const hexMessage = (0, viem_1.bytesToHex)(message); const signature = await provider.request({ method: 'personal_sign', params: [hexMessage, accounts[0]], }); return (0, viem_1.hexToBytes)(signature); }; signTypedData = async (typedData) => { const provider = this.getProvider(); const accounts = (await provider.request({ method: 'eth_accounts', })); if (!accounts || accounts.length === 0) { throw new Error('No connected Zerion account'); } typedData.types = { EIP712Domain: [ { name: 'version', type: 'string' }, { name: 'chainId', type: 'uint256' }, { name: 'verifyingContract', type: 'address' }, ], ...(typedData.primaryType === 'MigrationPayload' ? { MigrationPayload: typedData.types['MigrationPayload'] } : { UniversalPayload: typedData.types['UniversalPayload'] }), }; const safeTypedData = JSON.parse(JSON.stringify(typedData, (_key, value) => typeof value === 'bigint' ? value.toString() : value)); const signature = await provider.request({ method: 'eth_signTypedData_v4', params: [accounts[0], JSON.stringify(safeTypedData)], }); return (0, viem_1.hexToBytes)(signature); }; signAuthorization = async (params) => { const signer = await this.getSigner(); return (0, signAuthorization_1.signAuthorizationWithEthersSigner)(signer, params); }; disconnect = async () => { const provider = (0, eip6963_1.getEIP6963ProviderByRdns)('io.zerion.wallet'); if (!provider) return; await provider.request({ method: 'wallet_revokePermissions', params: [ { eth_accounts: {}, }, ], }); }; } exports.ZerionProvider = ZerionProvider; //# sourceMappingURL=zerion.js.map