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.

226 lines 8.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MetamaskProvider = void 0; const sdk_1 = require("@metamask/sdk"); const BaseWalletProvider_1 = require("../BaseWalletProvider"); const wallet_types_1 = require("../../../types/wallet.types"); const ethers_1 = require("ethers"); const chains_1 = require("./chains"); const viem_1 = require("viem"); const signAuthorization_1 = require("./signAuthorization"); class MetamaskProvider extends BaseWalletProvider_1.BaseWalletProvider { sdk; constructor() { super('MetaMask', 'https://metamask.io/images/metamask-fox.svg', [ 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, ]); this.sdk = new sdk_1.MetaMaskSDK({ dappMetadata: { url: 'https://push.org/', } }); } isInstalled = async () => { const provider = this.sdk.getProvider(); return !!provider; }; getProvider = () => { return this.sdk.getProvider(); }; getSigner = async () => { const sdkProvider = this.sdk.getProvider(); if (!sdkProvider) { throw new Error('Provider is undefined'); } const browserProvider = new ethers_1.BrowserProvider(sdkProvider); return await browserProvider.getSigner(); }; async connect(chainType) { try { const accounts = await this.sdk.connect(); const rawAddress = accounts[0]; const checksumAddress = (0, ethers_1.getAddress)(rawAddress); await this.switchNetwork(chainType); const chainId = await this.getChainId(); const addressincaip = this.formatAddress(checksumAddress, wallet_types_1.ChainType.ETHEREUM, chainId); return addressincaip; } catch (error) { console.error('Failed to connect to MetaMask:', error); throw error; } } getChainId = async () => { const provider = this.getProvider(); if (!provider) { throw new Error('Provider is undefined'); } const hexChainId = (await provider.request({ method: 'eth_chainId', params: [], })); const chainId = parseInt(hexChainId.toString(), 16); return chainId; }; switchNetwork = async (chainName) => { const network = chains_1.chains[chainName]; const provider = this.getProvider(); if (!provider) throw new Error('Provider not found while switching network'); const hexNetworkId = (0, viem_1.toHex)(network.id); try { // Try to switch to the network await provider.request({ method: 'wallet_switchEthereumChain', params: [{ chainId: hexNetworkId }], }); } catch (err) { // If the error code is 4902, the network needs to be added if (err.code === 4902) { 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, }, ], }); } catch (addError) { console.error('Error adding network:', addError); throw addError; } } else { console.error('Error switching network:', err); throw err; } } }; signAndSendTransaction = async (txn) => { try { const provider = this.getProvider(); if (!provider) { throw new Error('Provider is undefined'); } const accounts = (await provider.request({ method: 'eth_accounts', })); if (!accounts || accounts.length === 0) { throw new Error('No connected 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 signature = await provider.request({ method: 'eth_sendTransaction', params: [txParams], }); return (0, viem_1.hexToBytes)(signature); } catch (error) { console.error('MetaMask signing error:', error); throw error; } }; signMessage = async (message) => { try { const provider = this.getProvider(); if (!provider) { throw new Error('Provider is undefined'); } const accounts = (await provider.request({ method: 'eth_accounts', })); if (!accounts || accounts.length === 0) { throw new Error('No connected 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); } catch (error) { console.error('MetaMask signing error:', error); throw error; } }; signTypedData = async (typedData) => { try { const provider = this.getProvider(); if (!provider) { throw new Error('Provider is undefined'); } const accounts = (await provider.request({ method: 'eth_accounts', })); if (!accounts || accounts.length === 0) { throw new Error('No connected 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); } catch (error) { console.error('MetaMask signing error:', error); throw error; } }; signAuthorization = async (params) => { const signer = await this.getSigner(); return (0, signAuthorization_1.signAuthorizationWithEthersSigner)(signer, params); }; disconnect = async () => { const provider = this.getProvider(); if (!provider) { throw new Error('Provider is undefined'); } await provider.request({ method: 'wallet_revokePermissions', params: [ { eth_accounts: {}, }, ], }); }; } exports.MetamaskProvider = MetamaskProvider; //# sourceMappingURL=metamask.js.map