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