@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
JavaScript
"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