UNPKG

@pushchain/ui-kit

Version:
183 lines 7.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WalletConnectProvider = void 0; const tslib_1 = require("tslib"); const ethereum_provider_1 = require("@walletconnect/ethereum-provider"); const ethers_1 = require("ethers"); const BaseWalletProvider_1 = require("../BaseWalletProvider"); const wallet_types_1 = require("../../../types/wallet.types"); const chains = tslib_1.__importStar(require("viem/chains")); const viem_1 = require("viem"); class WalletConnectProvider extends BaseWalletProvider_1.BaseWalletProvider { constructor() { super('WalletConnect', 'https://walletconnect.com/walletconnect-logo.svg', [ wallet_types_1.ChainType.WALLET_CONNECT, ]); this.provider = null; this.isInstalled = () => tslib_1.__awaiter(this, void 0, void 0, function* () { return true; // WalletConnect doesn't require installation }); this.getProvider = () => { if (!this.provider) { throw new Error('WalletConnect provider not initialized'); } return this.provider; }; 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.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_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 = 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 && typeof provider.disconnect === 'function') { yield provider.disconnect(); } this.provider = null; }); } initProvider(chainId) { return tslib_1.__awaiter(this, void 0, void 0, function* () { console.log('Provder >>', this.provider); if (this.provider) { return; } this.provider = yield ethereum_provider_1.EthereumProvider.init({ projectId: '575a3e339ad56f54669c32264c133172', chains: [chainId], methods: ['eth_sendTransaction', 'personal_sign', 'eth_signTypedData_v4', 'eth_requestAccounts', 'eth_chainId', 'eth_accounts'], showQrModal: true, rpcMap: { '11155111': 'https://sepolia.gateway.tenderly.co/', }, optionalChains: [], }); yield this.provider.enable(); }); } connect() { return tslib_1.__awaiter(this, void 0, void 0, function* () { try { const chain = chains['sepolia']; const chainId = chain.id; yield this.initProvider(chainId); const accounts = (yield this.provider.request({ method: 'eth_requestAccounts', })); if (!accounts || accounts.length === 0) { throw new Error('No connected account'); } const rawAddress = accounts[0]; const checksumAddress = (0, ethers_1.getAddress)(rawAddress); const caipAddress = this.formatAddress(checksumAddress, wallet_types_1.ChainType.ETHEREUM, chainId); return caipAddress; } catch (error) { console.error('Failed to connect to MetaMask:', error); throw error; } }); } } exports.WalletConnectProvider = WalletConnectProvider; //# sourceMappingURL=walletConnect.js.map