UNPKG

@pushchain/ui-kit

Version:
222 lines 9.45 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MetamaskProvider = void 0; const tslib_1 = require("tslib"); 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 viem_2 = require("viem"); class MetamaskProvider extends BaseWalletProvider_1.BaseWalletProvider { constructor() { super('MetaMask', 'https://metamask.io/images/metamask-fox.svg', [ wallet_types_1.ChainType.ETHEREUM, wallet_types_1.ChainType.ARBITRUM, wallet_types_1.ChainType.AVALANCHE, wallet_types_1.ChainType.BINANCE, wallet_types_1.ChainType.PUSH_WALLET, ]); this.isInstalled = () => tslib_1.__awaiter(this, void 0, void 0, function* () { const provider = this.sdk.getProvider(); return !!provider; }); this.getProvider = () => { return this.sdk.getProvider(); }; this.getSigner = () => tslib_1.__awaiter(this, void 0, void 0, function* () { const sdkProvider = this.sdk.getProvider(); if (!sdkProvider) { throw new Error('Provider is undefined'); } const browserProvider = new ethers_1.BrowserProvider(sdkProvider); return yield browserProvider.getSigner(); }); this.getChainId = () => tslib_1.__awaiter(this, void 0, void 0, function* () { const provider = this.getProvider(); if (!provider) { throw new Error('Provider is undefined'); } const hexChainId = (yield provider.request({ method: 'eth_chainId', params: [], })); const chainId = parseInt(hexChainId.toString(), 16); return chainId; }); this.switchNetwork = (chainName) => tslib_1.__awaiter(this, void 0, void 0, function* () { var _a; 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_2.toHex)(network.id); try { // Try to switch to the network yield 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 { yield provider.request({ method: 'wallet_addEthereumChain', params: [ { chainId: hexNetworkId, chainName: network.name, rpcUrls: network.rpcUrls.default.http, nativeCurrency: network.nativeCurrency, blockExplorerUrls: (_a = network.blockExplorers) === null || _a === void 0 ? void 0 : _a.default.url, }, ], }); } catch (addError) { console.error('Error adding network:', addError); throw addError; } } else { console.error('Error switching network:', err); throw err; } } }); this.signAndSendTransaction = (txn) => tslib_1.__awaiter(this, void 0, void 0, function* () { try { const provider = this.getProvider(); if (!provider) { throw new Error('Provider is undefined'); } const accounts = (yield 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_2.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 = yield provider.request({ method: 'eth_sendTransaction', params: [txParams], }); return (0, viem_1.hexToBytes)(signature); } catch (error) { console.error('MetaMask signing error:', error); throw error; } }); this.signMessage = (message) => tslib_1.__awaiter(this, void 0, void 0, function* () { try { const provider = this.getProvider(); if (!provider) { throw new Error('Provider is undefined'); } const accounts = (yield 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 = yield 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; } }); this.signTypedData = (typedData) => tslib_1.__awaiter(this, void 0, void 0, function* () { try { const provider = this.getProvider(); if (!provider) { throw new Error('Provider is undefined'); } const accounts = (yield 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' }, ], UniversalPayload: typedData.types['UniversalPayload'], }; const signature = yield provider.request({ method: 'eth_signTypedData_v4', params: [accounts[0], JSON.stringify(typedData)], }); return (0, viem_1.hexToBytes)(signature); } catch (error) { console.error('MetaMask signing error:', error); throw error; } }); this.disconnect = () => tslib_1.__awaiter(this, void 0, void 0, function* () { const provider = this.getProvider(); if (!provider) { throw new Error('Provider is undefined'); } yield provider.request({ method: 'wallet_revokePermissions', params: [ { eth_accounts: {}, }, ], }); }); this.sdk = new sdk_1.MetaMaskSDK({ dappMetadata: { url: 'https://push.org/', } }); } connect(chainType) { return tslib_1.__awaiter(this, void 0, void 0, function* () { try { const accounts = yield this.sdk.connect(); const rawAddress = accounts[0]; const checksumAddress = (0, ethers_1.getAddress)(rawAddress); yield this.switchNetwork(chainType); const chainId = yield 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; } }); } } exports.MetamaskProvider = MetamaskProvider; //# sourceMappingURL=metamask.js.map