@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.
197 lines • 7.66 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ZerionProvider = void 0;
const ethers_1 = require("ethers");
const viem_1 = require("viem");
const BaseWalletProvider_1 = require("../BaseWalletProvider");
const wallet_types_1 = require("../../../types/wallet.types");
const chains_1 = require("./chains");
const eip6963_1 = require("../utils/eip6963");
const signAuthorization_1 = require("./signAuthorization");
class ZerionProvider extends BaseWalletProvider_1.BaseWalletProvider {
constructor() {
super('Zerion', 'https://zerion.io/favicon.ico', [
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,
]);
}
isInstalled = async () => {
try {
return !!this.getProvider();
}
catch {
return false;
}
};
getProvider = () => {
const provider = (0, eip6963_1.getEIP6963ProviderByRdns)('io.zerion.wallet');
if (!provider) {
throw new Error('Zerion provider not found via EIP-6963');
}
return provider;
};
getSigner = async () => {
const provider = this.getProvider();
const browserProvider = new ethers_1.BrowserProvider(provider);
return await browserProvider.getSigner();
};
getChainId = async () => {
const provider = this.getProvider();
const hexChainId = await provider.request({
method: 'eth_chainId',
params: [],
});
return parseInt(hexChainId.toString(), 16);
};
connect = async (chainType) => {
const provider = this.getProvider();
const accounts = (await provider.request({
method: 'eth_requestAccounts',
params: [],
}));
if (!accounts || accounts.length === 0) {
throw new Error('No Zerion account returned');
}
const checksumAddress = (0, ethers_1.getAddress)(accounts[0]);
await this.switchNetwork(chainType);
const chainId = await this.getChainId();
const caipAddress = this.formatAddress(checksumAddress, wallet_types_1.ChainType.ETHEREUM, chainId);
return caipAddress;
};
switchNetwork = async (chainName) => {
const network = chains_1.chains[chainName];
const provider = this.getProvider();
const hexNetworkId = (0, viem_1.toHex)(network.id);
try {
await provider.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId: hexNetworkId }],
});
}
catch (err) {
const msg = String(err?.message ?? '');
const needAdd = err?.code === 4902 ||
err?.code === -32603 ||
msg.includes('Unrecognized chain ID');
if (!needAdd) {
console.error('Zerion: error switching network:', err);
throw err;
}
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
? [network.blockExplorers.default.url]
: [],
},
],
});
await provider.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId: hexNetworkId }],
});
}
catch (addError) {
console.error('Zerion: error adding network:', addError);
throw addError;
}
}
};
signAndSendTransaction = async (txn) => {
const provider = this.getProvider();
const accounts = (await provider.request({
method: 'eth_accounts',
}));
if (!accounts || accounts.length === 0) {
throw new Error('No connected Zerion 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 txHash = await provider.request({
method: 'eth_sendTransaction',
params: [txParams],
});
return (0, viem_1.hexToBytes)(txHash);
};
signMessage = async (message) => {
const provider = this.getProvider();
const accounts = (await provider.request({
method: 'eth_accounts',
}));
if (!accounts || accounts.length === 0) {
throw new Error('No connected Zerion 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);
};
signTypedData = async (typedData) => {
const provider = this.getProvider();
const accounts = (await provider.request({
method: 'eth_accounts',
}));
if (!accounts || accounts.length === 0) {
throw new Error('No connected Zerion 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);
};
signAuthorization = async (params) => {
const signer = await this.getSigner();
return (0, signAuthorization_1.signAuthorizationWithEthersSigner)(signer, params);
};
disconnect = async () => {
const provider = (0, eip6963_1.getEIP6963ProviderByRdns)('io.zerion.wallet');
if (!provider)
return;
await provider.request({
method: 'wallet_revokePermissions',
params: [
{
eth_accounts: {},
},
],
});
};
}
exports.ZerionProvider = ZerionProvider;
//# sourceMappingURL=zerion.js.map