@pushchain/ui-kit
Version:
## Overview
183 lines • 7.9 kB
JavaScript
;
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