UNPKG

@tevm/whatsabi

Version:
342 lines (337 loc) 16.6 kB
'use strict'; var chains = require('viem/chains'); var whatsabi = require('@shazow/whatsabi'); var utils = require('@tevm/utils'); var viem = require('viem'); var actions = require('viem/actions'); function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; } }); } }); } n.default = e; return Object.freeze(n); } var chains__namespace = /*#__PURE__*/_interopNamespace(chains); // src/contractUriPattern.js var contractUriPattern = /^evm:\/\/(?<chainId>\d+)\/(?<address>0x[a-fA-F0-9]{40})(\?(?<query>.+))?$/; var knownChains = { [chains__namespace.mainnet.id]: chains__namespace.mainnet, [chains__namespace.optimism.id]: chains__namespace.optimism, [chains__namespace.optimismSepolia.id]: chains__namespace.optimismSepolia, [chains__namespace.arbitrum.id]: chains__namespace.arbitrum, [chains__namespace.base.id]: chains__namespace.base, [chains__namespace.baseSepolia.id]: chains__namespace.baseSepolia, [chains__namespace.polygon.id]: chains__namespace.polygon, [chains__namespace.zora.id]: chains__namespace.zora, [chains__namespace.sepolia.id]: chains__namespace.sepolia, [chains__namespace.fuseSparknet.id]: chains__namespace.fuseSparknet, [chains__namespace.funkiMainnet.id]: chains__namespace.funkiMainnet, [chains__namespace.funkiSepolia.id]: chains__namespace.funkiSepolia, [chains__namespace.flareTestnet.id]: chains__namespace.flareTestnet, [chains__namespace.evmosTestnet.id]: chains__namespace.evmosTestnet, [chains__namespace.defichainEvm.id]: chains__namespace.defichainEvm, [chains__namespace.cyberTestnet.id]: chains__namespace.cyberTestnet, [chains__namespace.blastSepolia.id]: chains__namespace.blastSepolia, [chains__namespace.areonNetwork.id]: chains__namespace.areonNetwork, [chains__namespace.arbitrumNova.id]: chains__namespace.arbitrumNova, [chains__namespace.zoraTestnet.id]: chains__namespace.zoraTestnet, [chains__namespace.zoraSepolia.id]: chains__namespace.zoraSepolia, [chains__namespace.yooldoVerse.id]: chains__namespace.yooldoVerse, [chains__namespace.taikoJolnir.id]: chains__namespace.taikoJolnir, [chains__namespace.skaleNebula.id]: chains__namespace.skaleNebula, [chains__namespace.skaleExorde.id]: chains__namespace.skaleExorde, [chains__namespace.skaleEuropa.id]: chains__namespace.skaleEuropa, [chains__namespace.rss3Sepolia.id]: chains__namespace.rss3Sepolia, [chains__namespace.rootPorcini.id]: chains__namespace.rootPorcini, [chains__namespace.reyaNetwork.id]: chains__namespace.reyaNetwork, [chains__namespace.polygonAmoy.id]: chains__namespace.polygonAmoy, [chains__namespace.palmTestnet.id]: chains__namespace.palmTestnet, [chains__namespace.neonMainnet.id]: chains__namespace.neonMainnet, [chains__namespace.moonbeamDev.id]: chains__namespace.moonbeamDev, [chains__namespace.modeTestnet.id]: chains__namespace.modeTestnet, [chains__namespace.metisGoerli.id]: chains__namespace.metisGoerli, [chains__namespace.liskSepolia.id]: chains__namespace.liskSepolia, [chains__namespace.lineaGoerli.id]: chains__namespace.lineaGoerli, [chains__namespace.kavaTestnet.id]: chains__namespace.kavaTestnet, [chains__namespace.haqqMainnet.id]: chains__namespace.haqqMainnet, [chains__namespace.flowTestnet.id]: chains__namespace.flowTestnet, [chains__namespace.flowMainnet.id]: chains__namespace.flowMainnet, [chains__namespace.ektaTestnet.id]: chains__namespace.ektaTestnet, [chains__namespace.bobaSepolia.id]: chains__namespace.bobaSepolia, [chains__namespace.bevmMainnet.id]: chains__namespace.bevmMainnet, [chains__namespace.beamTestnet.id]: chains__namespace.beamTestnet, [chains__namespace.astarZkyoto.id]: chains__namespace.astarZkyoto, [chains__namespace.apexTestnet.id]: chains__namespace.apexTestnet, [chains__namespace.zkLinkNovaSepoliaTestnet.id]: chains__namespace.zkLinkNovaSepoliaTestnet, [chains__namespace.xdcTestnet.id]: chains__namespace.xdcTestnet, [chains__namespace.xaiTestnet.id]: chains__namespace.xaiTestnet, [chains__namespace.taikoKatla.id]: chains__namespace.taikoKatla, [chains__namespace.taikoHekla.id]: chains__namespace.taikoHekla, [chains__namespace.skaleTitan.id]: chains__namespace.skaleTitan, [chains__namespace.skaleRazor.id]: chains__namespace.skaleRazor, [chains__namespace.seiTestnet.id]: chains__namespace.seiTestnet, [chains__namespace.pulsechain.id]: chains__namespace.pulsechain, [chains__namespace.pgnTestnet.id]: chains__namespace.pgnTestnet, [chains__namespace.otimDevnet.id]: chains__namespace.otimDevnet, [chains__namespace.neonDevnet.id]: chains__namespace.neonDevnet, [chains__namespace.mevTestnet.id]: chains__namespace.mevTestnet, [chains__namespace.l3xTestnet.id]: chains__namespace.l3xTestnet, [chains__namespace.jbcTestnet.id]: chains__namespace.jbcTestnet, [chains__namespace.harmonyOne.id]: chains__namespace.harmonyOne, [chains__namespace.eosTestnet.id]: chains__namespace.eosTestnet, [chains__namespace.bxnTestnet.id]: chains__namespace.bxnTestnet, [chains__namespace.btrTestnet.id]: chains__namespace.btrTestnet, [chains__namespace.bscTestnet.id]: chains__namespace.bscTestnet, [chains__namespace.bitTorrent.id]: chains__namespace.bitTorrent, [chains__namespace.baseGoerli.id]: chains__namespace.baseGoerli, [chains__namespace.astarZkEVM.id]: chains__namespace.astarZkEVM, [chains__namespace.zetachain.id]: chains__namespace.zetachain, [chains__namespace.xrSepolia.id]: chains__namespace.xrSepolia, [chains__namespace.x1Testnet.id]: chains__namespace.x1Testnet, [chains__namespace.thaiChain.id]: chains__namespace.thaiChain, [chains__namespace.shibarium.id]: chains__namespace.shibarium, [chains__namespace.seiDevnet.id]: chains__namespace.seiDevnet, [chains__namespace.satoshiVM.id]: chains__namespace.satoshiVM, [chains__namespace.rootstock.id]: chains__namespace.rootstock, [chains__namespace.moonriver.id]: chains__namespace.moonriver, [chains__namespace.metachain.id]: chains__namespace.metachain, [chains__namespace.localhost.id]: chains__namespace.localhost, [chains__namespace.etherlink.id]: chains__namespace.etherlink, [chains__namespace.dogechain.id]: chains__namespace.dogechain, [chains__namespace.crossbell.id]: chains__namespace.crossbell, [chains__namespace.avalanche.id]: chains__namespace.avalanche, [chains__namespace.zhejiang.id]: chains__namespace.zhejiang, [chains__namespace.wanchain.id]: chains__namespace.wanchain, [chains__namespace.songbird.id]: chains__namespace.songbird, [chains__namespace.sapphire.id]: chains__namespace.sapphire, [chains__namespace.redstone.id]: chains__namespace.redstone, [chains__namespace.qTestnet.id]: chains__namespace.qTestnet, [chains__namespace.qMainnet.id]: chains__namespace.qMainnet, [chains__namespace.nautilus.id]: chains__namespace.nautilus, [chains__namespace.filecoin.id]: chains__namespace.filecoin, [chains__namespace.edgeware.id]: chains__namespace.edgeware, [chains__namespace.edgeless.id]: chains__namespace.edgeless, [chains__namespace.darwinia.id]: chains__namespace.darwinia, [chains__namespace.ancient8.id]: chains__namespace.ancient8, [chains__namespace.zilliqa.id]: chains__namespace.zilliqa, [chains__namespace.vechain.id]: chains__namespace.vechain, [chains__namespace.syscoin.id]: chains__namespace.syscoin, [chains__namespace.stratis.id]: chains__namespace.stratis, [chains__namespace.shimmer.id]: chains__namespace.shimmer, [chains__namespace.phoenix.id]: chains__namespace.phoenix, [chains__namespace.nexilix.id]: chains__namespace.nexilix, [chains__namespace.metalL2.id]: chains__namespace.metalL2, [chains__namespace.mandala.id]: chains__namespace.mandala, [chains__namespace.holesky.id]: chains__namespace.holesky, [chains__namespace.hardhat.id]: chains__namespace.hardhat, [chains__namespace.fraxtal.id]: chains__namespace.fraxtal, [chains__namespace.coreDao.id]: chains__namespace.coreDao, [chains__namespace.classic.id]: chains__namespace.classic, [chains__namespace.bahamut.id]: chains__namespace.bahamut, [chains__namespace.auroria.id]: chains__namespace.auroria, [chains__namespace.zkSync.id]: chains__namespace.zkSync, [chains__namespace.zkFair.id]: chains__namespace.zkFair, [chains__namespace.xLayer.id]: chains__namespace.xLayer, [chains__namespace.unreal.id]: chains__namespace.unreal, [chains__namespace.taraxa.id]: chains__namespace.taraxa, [chains__namespace.scroll.id]: chains__namespace.scroll, [chains__namespace.rollux.id]: chains__namespace.rollux, [chains__namespace.plinga.id]: chains__namespace.plinga, [chains__namespace.merlin.id]: chains__namespace.merlin, [chains__namespace.mantle.id]: chains__namespace.mantle, [chains__namespace.klaytn.id]: chains__namespace.klaytn, [chains__namespace.karura.id]: chains__namespace.karura, [chains__namespace.hedera.id]: chains__namespace.hedera, [chains__namespace.goerli.id]: chains__namespace.goerli, [chains__namespace.gnosis.id]: chains__namespace.gnosis, [chains__namespace.fantom.id]: chains__namespace.fantom, [chains__namespace.dchain.id]: chains__namespace.dchain, [chains__namespace.cronos.id]: chains__namespace.cronos, [chains__namespace.chiliz.id]: chains__namespace.chiliz, [chains__namespace.bronos.id]: chains__namespace.bronos, [chains__namespace.bitkub.id]: chains__namespace.bitkub, [chains__namespace.aurora.id]: chains__namespace.aurora, [chains__namespace.wemix.id]: chains__namespace.wemix, [chains__namespace.tenet.id]: chains__namespace.tenet, [chains__namespace.taiko.id]: chains__namespace.taiko, [chains__namespace.spicy.id]: chains__namespace.spicy, [chains__namespace.ronin.id]: chains__namespace.ronin, [chains__namespace.opBNB.id]: chains__namespace.opBNB, [chains__namespace.oasys.id]: chains__namespace.oasys, [chains__namespace.metis.id]: chains__namespace.metis, [chains__namespace.meter.id]: chains__namespace.meter, [chains__namespace.manta.id]: chains__namespace.manta, [chains__namespace.lycan.id]: chains__namespace.lycan, [chains__namespace.lukso.id]: chains__namespace.lukso, [chains__namespace.linea.id]: chains__namespace.linea, [chains__namespace.kroma.id]: chains__namespace.kroma, [chains__namespace.iotex.id]: chains__namespace.iotex, [chains__namespace.inEVM.id]: chains__namespace.inEVM, [chains__namespace.flare.id]: chains__namespace.flare, [chains__namespace.evmos.id]: chains__namespace.evmos, [chains__namespace.degen.id]: chains__namespace.degen, [chains__namespace.cyber.id]: chains__namespace.cyber, [chains__namespace.canto.id]: chains__namespace.canto, [chains__namespace.blast.id]: chains__namespace.blast, [chains__namespace.astar.id]: chains__namespace.astar, [chains__namespace.acala.id]: chains__namespace.acala, [chains__namespace.rss3.id]: chains__namespace.rss3, [chains__namespace.root.id]: chains__namespace.root, [chains__namespace.real.id]: chains__namespace.real, [chains__namespace.palm.id]: chains__namespace.palm, [chains__namespace.nexi.id]: chains__namespace.nexi, [chains__namespace.mode.id]: chains__namespace.mode, [chains__namespace.lyra.id]: chains__namespace.lyra, [chains__namespace.lisk.id]: chains__namespace.lisk, [chains__namespace.kava.id]: chains__namespace.kava, [chains__namespace.gobi.id]: chains__namespace.gobi, [chains__namespace.fuse.id]: chains__namespace.fuse, [chains__namespace.fibo.id]: chains__namespace.fibo, [chains__namespace.ekta.id]: chains__namespace.ekta, [chains__namespace.crab.id]: chains__namespace.crab, [chains__namespace.celo.id]: chains__namespace.celo, [chains__namespace.boba.id]: chains__namespace.boba, [chains__namespace.beam.id]: chains__namespace.beam, [chains__namespace.xdc.id]: chains__namespace.xdc, [chains__namespace.xai.id]: chains__namespace.xai, [chains__namespace.sei.id]: chains__namespace.sei, [chains__namespace.pgn.id]: chains__namespace.pgn, [chains__namespace.okc.id]: chains__namespace.okc, [chains__namespace.mev.id]: chains__namespace.mev, [chains__namespace.l3x.id]: chains__namespace.l3x, [chains__namespace.koi.id]: chains__namespace.koi, [chains__namespace.kcc.id]: chains__namespace.kcc, [chains__namespace.jbc.id]: chains__namespace.jbc, [chains__namespace.bsc.id]: chains__namespace.bsc, [chains__namespace.ham.id]: chains__namespace.ham, [chains__namespace.eos.id]: chains__namespace.eos, [chains__namespace.eon.id]: chains__namespace.eon, [chains__namespace.dfk.id]: chains__namespace.dfk, [chains__namespace.bxn.id]: chains__namespace.bxn, [chains__namespace.btr.id]: chains__namespace.btr, [chains__namespace.bob.id]: chains__namespace.bob }; var loadAbi = async ({ address, client, explorerUrl, followProxies, etherscanApiKey }) => { var _a; return whatsabi.whatsabi.autoload(address, { provider: client, followProxies, abiLoader: new whatsabi.loaders.MultiABILoader([ new whatsabi.loaders.SourcifyABILoader({ chainId: ((_a = client.chain) == null ? void 0 : _a.id) ?? 1 }), ...explorerUrl !== void 0 ? [ new whatsabi.loaders.EtherscanABILoader({ baseURL: explorerUrl, ...etherscanApiKey !== void 0 ? { apiKey: etherscanApiKey } : {} }) ] : [] ]) }); }; var parseUri = (uri) => { var _a, _b, _c; const match = contractUriPattern.exec(uri); if (!match) { return void 0; } const chainId = Number.parseInt(((_a = match.groups) == null ? void 0 : _a["chainId"]) ?? "1", 10); const address = utils.getAddress( /** @type {string}*/ (_b = match.groups) == null ? void 0 : _b["address"] ); const query = (_c = match.groups) == null ? void 0 : _c["query"]; const params = new URLSearchParams(query || ""); return { chainId: ( /** @type {import('./KnownChainIds.js').KnownChainIds}*/ chainId ), address, rpcUrl: params.get("rpcUrl") || void 0, etherscanApiKey: params.get("etherscanApiKey") || void 0, etherscanBaseUrl: params.get("etherscanBaseUrl") || void 0, followProxies: params.get("followProxies") === "true" || void 0 }; }; var UnknownChainError = class extends Error { /** * @type {'UnknownChainError'} * @override */ name = "UnknownChainError"; /** * @type {'UnknownChainError'} */ _tag = "UnknownChainError"; /** * @param {number} chainId */ constructor(chainId) { super( `Unknown chain ID: ${chainId}. No default rpc known. Please pass in a valid rpc url as a query string \`?rpcUrl=\${rpcUrl}\` or open a pr to viem to add your chain to viem/chains` ); } }; var resolveContractUri = async (contractUri, config) => { var _a; console.log("todo config", config); const parsedUri = parseUri(contractUri); if (!parsedUri) { return void 0; } const chain = knownChains[parsedUri.chainId]; if (!chain && !parsedUri.rpcUrl) { throw new UnknownChainError(parsedUri.chainId); } const client = viem.createClient({ transport: viem.http(parsedUri.rpcUrl), chain }); const explorerUrl = parsedUri.etherscanBaseUrl ?? ((_a = chain.blockExplorers) == null ? void 0 : _a.default.url); const whatsabiResult = await loadAbi({ client, explorerUrl, address: parsedUri.address, followProxies: parsedUri.followProxies ?? true, etherscanApiKey: parsedUri.etherscanApiKey }); const deployedBytecode = await actions.getCode(client, { address: ( /** @type {import('@tevm/utils').Address}*/ whatsabiResult.address ) }); if (!deployedBytecode) { throw new Error("Could not fetch deployed bytecode"); } return { abi: ( /** @type {any}*/ whatsabiResult.abi ), address: parsedUri.address, deployedBytecode // TODO we want to represent proxies in some way like listing the resolved addy // ...{resolvedAddress: whatsabiResult.address}, // TODO if we can get a verified contract we should compile it with solc and return solc output too }; }; exports.UnknownChainError = UnknownChainError; exports.contractUriPattern = contractUriPattern; exports.knownChains = knownChains; exports.loadAbi = loadAbi; exports.parseUri = parseUri; exports.resolveContractUri = resolveContractUri; //# sourceMappingURL=index.cjs.map //# sourceMappingURL=index.cjs.map