UNPKG

@safe-global/protocol-kit

Version:

SDK that facilitates the interaction with Safe Smart Accounts

1,337 lines (1,319 loc) 341 kB
var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __decorateClass = (decorators, target, key, kind) => { var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target; for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result; if (kind && result) __defProp(target, key, result); return result; }; // src/Safe.ts import { OperationType as OperationType3, SigningMethod as SigningMethod2 } from "@safe-global/types-kit"; // src/contracts/utils.ts import { concat as concat2, getContractAddress, isAddress as isAddress4, keccak256 as keccak2562, pad, parseAbi as parseAbi3, toHex as toHex3, toEventHash, decodeEventLog } from "viem"; import { waitForTransactionReceipt } from "viem/actions"; // src/contracts/config.ts import { getCompatibilityFallbackHandlerDeployments, getCreateCallDeployments, getExtensibleFallbackHandlerDeployments, getMultiSendCallOnlyDeployments, getMultiSendDeployments, getProxyFactoryDeployments, getSafeL2SingletonDeployments, getSafeSingletonDeployments, getSignMessageLibDeployments, getSimulateTxAccessorDeployments } from "@safe-global/safe-deployments"; import { getSafeWebAuthnSignerFactoryDeployment, getSafeWebAuthnShareSignerDeployment } from "@safe-global/safe-modules-deployments"; var DEFAULT_SAFE_VERSION = "1.4.1"; var safeDeploymentsVersions = { "1.5.0": { safeSingletonVersion: "1.5.0", safeSingletonL2Version: "1.5.0", safeProxyFactoryVersion: "1.5.0", compatibilityFallbackHandler: "1.5.0", extensibleFallbackHandler: "1.5.0", multiSendVersion: "1.5.0", multiSendCallOnlyVersion: "1.5.0", signMessageLibVersion: "1.5.0", createCallVersion: "1.5.0", simulateTxAccessorVersion: "1.5.0", safeWebAuthnSignerFactoryVersion: "0.2.1", safeWebAuthnSharedSignerVersion: "0.2.1" }, "1.4.1": { safeSingletonVersion: "1.4.1", safeSingletonL2Version: "1.4.1", safeProxyFactoryVersion: "1.4.1", compatibilityFallbackHandler: "1.4.1", multiSendVersion: "1.4.1", multiSendCallOnlyVersion: "1.4.1", signMessageLibVersion: "1.4.1", createCallVersion: "1.4.1", simulateTxAccessorVersion: "1.4.1", safeWebAuthnSignerFactoryVersion: "0.2.1", safeWebAuthnSharedSignerVersion: "0.2.1" }, "1.3.0": { safeSingletonVersion: "1.3.0", safeSingletonL2Version: "1.3.0", safeProxyFactoryVersion: "1.3.0", compatibilityFallbackHandler: "1.3.0", multiSendVersion: "1.3.0", multiSendCallOnlyVersion: "1.3.0", signMessageLibVersion: "1.3.0", createCallVersion: "1.3.0", simulateTxAccessorVersion: "1.3.0", safeWebAuthnSignerFactoryVersion: "0.2.1", safeWebAuthnSharedSignerVersion: "0.2.1" }, "1.2.0": { safeSingletonVersion: "1.2.0", safeSingletonL2Version: void 0, safeProxyFactoryVersion: "1.1.1", compatibilityFallbackHandler: "1.3.0", multiSendVersion: "1.1.1", multiSendCallOnlyVersion: "1.3.0", signMessageLibVersion: "1.3.0", createCallVersion: "1.3.0", safeWebAuthnSignerFactoryVersion: void 0, safeWebAuthnSharedSignerVersion: void 0 }, "1.1.1": { safeSingletonVersion: "1.1.1", safeSingletonL2Version: void 0, safeProxyFactoryVersion: "1.1.1", compatibilityFallbackHandler: "1.3.0", multiSendVersion: "1.1.1", multiSendCallOnlyVersion: "1.3.0", signMessageLibVersion: "1.3.0", createCallVersion: "1.3.0", safeWebAuthnSignerFactoryVersion: void 0, safeWebAuthnSharedSignerVersion: void 0 }, "1.0.0": { safeSingletonVersion: "1.0.0", safeSingletonL2Version: void 0, safeProxyFactoryVersion: "1.0.0", compatibilityFallbackHandler: "1.3.0", multiSendVersion: "1.1.1", multiSendCallOnlyVersion: "1.3.0", signMessageLibVersion: "1.3.0", createCallVersion: "1.3.0", safeWebAuthnSignerFactoryVersion: void 0, safeWebAuthnSharedSignerVersion: void 0 } }; var safeDeploymentsL1ChainIds = [ 1n // Ethereum Mainnet ]; var contractFunctions = { safeSingletonVersion: getSafeSingletonDeployments, safeSingletonL2Version: getSafeL2SingletonDeployments, safeProxyFactoryVersion: getProxyFactoryDeployments, compatibilityFallbackHandler: getCompatibilityFallbackHandlerDeployments, extensibleFallbackHandler: getExtensibleFallbackHandlerDeployments, multiSendVersion: getMultiSendDeployments, multiSendCallOnlyVersion: getMultiSendCallOnlyDeployments, signMessageLibVersion: getSignMessageLibDeployments, createCallVersion: getCreateCallDeployments, simulateTxAccessorVersion: getSimulateTxAccessorDeployments, safeWebAuthnSignerFactoryVersion: getSafeWebAuthnSignerFactoryDeployment, safeWebAuthnSharedSignerVersion: getSafeWebAuthnShareSignerDeployment }; function getContractDeployment(safeVersion, chainId, contractName3) { const contractVersion = safeDeploymentsVersions[safeVersion][contractName3]; const filters = { version: contractVersion, network: chainId.toString(), released: true }; const deployment = contractFunctions[contractName3](filters); return deployment; } function getContractInfo(contractAddress) { for (const [safeVersion, contracts] of Object.entries(safeDeploymentsVersions)) { for (const [contractName3, contractVersion] of Object.entries(contracts)) { const filters = { version: contractVersion, released: true }; const deployment = contractFunctions[contractName3]( filters ); if (deployment && deployment.networkAddresses) { for (const [, addresses] of Object.entries(deployment.networkAddresses)) { if (Array.isArray(addresses) && addresses.find((a) => a.toLowerCase() === contractAddress.toLowerCase()) || typeof addresses === "string" && addresses.toLowerCase() === contractAddress.toLowerCase()) { const types = Object.keys(deployment.deployments); const type = types.find( (t) => deployment.deployments[t]?.address.toLowerCase() === contractAddress.toLowerCase() ); if (type) { return { version: safeVersion, type, contractName: contractName3 }; } } } } } } return void 0; } // src/utils/constants.ts import { zeroAddress } from "viem"; var ZERO_ADDRESS = zeroAddress; var EMPTY_DATA = "0x"; var SENTINEL_ADDRESS = "0x0000000000000000000000000000000000000001"; // src/utils/address.ts function sameString(str1, str2) { return !!str1 && !!str2 && str1.toLowerCase() === str2.toLowerCase(); } function isZeroAddress(address) { return sameString(address, ZERO_ADDRESS); } function isSentinelAddress(address) { return sameString(address, SENTINEL_ADDRESS); } function isRestrictedAddress(address) { return isZeroAddress(address) || isSentinelAddress(address); } // src/utils/eip-3770/index.ts import { isAddress } from "viem"; // src/utils/eip-3770/config.ts var networks = [ { chainId: 1n, shortName: "eth" }, { chainId: 3n, shortName: "rop" }, { chainId: 4n, shortName: "rin" }, { chainId: 5n, shortName: "gor" }, { chainId: 10n, shortName: "oeth" }, { chainId: 11n, shortName: "meta" }, { chainId: 12n, shortName: "kal" }, { chainId: 14n, shortName: "flr" }, { chainId: 16n, shortName: "cflr" }, { chainId: 18n, shortName: "tst" }, { chainId: 19n, shortName: "sgb" }, { chainId: 25n, shortName: "cro" }, { chainId: 28n, shortName: "bobarinkeby" }, { chainId: 30n, shortName: "rsk" }, { chainId: 31n, shortName: "trsk" }, { chainId: 39n, shortName: "u2u" }, { chainId: 40n, shortName: "telosevm" }, { chainId: 41n, shortName: "telosevmtestnet" }, { chainId: 42n, shortName: "lukso" }, { chainId: 43n, shortName: "pangolin" }, { chainId: 44n, shortName: "crab" }, { chainId: 46n, shortName: "darwinia" }, { chainId: 50n, shortName: "xdc" }, { chainId: 51n, shortName: "txdc" }, { chainId: 56n, shortName: "bnb" }, { chainId: 57n, shortName: "sys" }, { chainId: 61n, shortName: "etc" }, { chainId: 63n, shortName: "metc" }, { chainId: 69n, shortName: "okov" }, { chainId: 71n, shortName: "cfxtest" }, { chainId: 81n, shortName: "joc" }, { chainId: 82n, shortName: "meter" }, { chainId: 83n, shortName: "meter-test" }, { chainId: 88n, shortName: "vic" }, { chainId: 96n, shortName: "bkc" }, { chainId: 97n, shortName: "bnbt" }, { chainId: 98n, shortName: "six" }, { chainId: 100n, shortName: "gno" }, { chainId: 106n, shortName: "vlx" }, { chainId: 108n, shortName: "tt" }, { chainId: 109n, shortName: "shibariumecosystem" }, { chainId: 111n, shortName: "etl" }, { chainId: 114n, shortName: "c2flr" }, { chainId: 122n, shortName: "fuse" }, { chainId: 123n, shortName: "spark" }, { chainId: 130n, shortName: "unichain" }, { chainId: 133n, shortName: "HSKT" }, { chainId: 137n, shortName: "matic" }, { chainId: 143n, shortName: "mon" }, { chainId: 146n, shortName: "sonic" }, { chainId: 148n, shortName: "shimmerevm" }, { chainId: 150n, shortName: "sixt" }, { chainId: 151n, shortName: "rbn" }, { chainId: 153n, shortName: "rbn-testnet" }, { chainId: 155n, shortName: "tenet-testnet" }, { chainId: 169n, shortName: "manta" }, { chainId: 173n, shortName: "eni" }, { chainId: 177n, shortName: "hsk" }, { chainId: 179n, shortName: "abey" }, { chainId: 181n, shortName: "water" }, { chainId: 185n, shortName: "mint" }, { chainId: 195n, shortName: "tokb" }, { chainId: 196n, shortName: "okb" }, { chainId: 204n, shortName: "opbnb" }, { chainId: 228n, shortName: "fhe" }, { chainId: 232n, shortName: "lens" }, { chainId: 239n, shortName: "tacchain" }, { chainId: 240n, shortName: "zkTCRO" }, { chainId: 246n, shortName: "ewt" }, { chainId: 250n, shortName: "ftm" }, { chainId: 252n, shortName: "fraxtal" }, { chainId: 255n, shortName: "kroma" }, { chainId: 274n, shortName: "lachain" }, { chainId: 280n, shortName: "zksync-goerli" }, { chainId: 282n, shortName: "deprecated-zkTCRO" }, { chainId: 288n, shortName: "boba" }, { chainId: 291n, shortName: "orderly" }, { chainId: 295n, shortName: "hedera-mainnet" }, { chainId: 296n, shortName: "hedera-testnet" }, { chainId: 300n, shortName: "zksync-sepolia" }, { chainId: 314n, shortName: "filecoin" }, { chainId: 321n, shortName: "kcs" }, { chainId: 322n, shortName: "kcst" }, { chainId: 324n, shortName: "zksync" }, { chainId: 336n, shortName: "sdn" }, { chainId: 338n, shortName: "tcro" }, { chainId: 360n, shortName: "shape" }, { chainId: 369n, shortName: "pls" }, { chainId: 388n, shortName: "zkCRO" }, { chainId: 418n, shortName: "latestnet" }, { chainId: 420n, shortName: "ogor" }, { chainId: 424n, shortName: "PGN" }, { chainId: 466n, shortName: "appchain" }, { chainId: 478n, shortName: "formnetwork" }, { chainId: 480n, shortName: "wc" }, { chainId: 530n, shortName: "pundiai" }, { chainId: 545n, shortName: "flow-testnet" }, { chainId: 570n, shortName: "sys-rollux" }, { chainId: 588n, shortName: "metis-stardust" }, { chainId: 592n, shortName: "astr" }, { chainId: 595n, shortName: "maca" }, { chainId: 599n, shortName: "metis-goerli" }, { chainId: 648n, shortName: "ace" }, { chainId: 686n, shortName: "kar" }, { chainId: 690n, shortName: "redstone" }, { chainId: 698n, shortName: "Matchain" }, { chainId: 747n, shortName: "flow-mainnet" }, { chainId: 756n, shortName: "capx-testnet" }, { chainId: 757n, shortName: "capx" }, { chainId: 787n, shortName: "aca" }, { chainId: 841n, shortName: "tara" }, { chainId: 842n, shortName: "taratest" }, { chainId: 870n, shortName: "AMN" }, { chainId: 919n, shortName: "modesep" }, { chainId: 938n, shortName: "haust" }, { chainId: 943n, shortName: "t4pls" }, { chainId: 964n, shortName: "bittensor-evm-mainnet" }, { chainId: 970n, shortName: "ccn" }, { chainId: 988n, shortName: "stable" }, { chainId: 995n, shortName: "5ire" }, { chainId: 999n, shortName: "hyper_evm" }, { chainId: 1001n, shortName: "kaia-kairos" }, { chainId: 1008n, shortName: "eun" }, { chainId: 1030n, shortName: "cfx" }, { chainId: 1088n, shortName: "metis-andromeda" }, { chainId: 1101n, shortName: "zkevm" }, { chainId: 1111n, shortName: "wemix" }, { chainId: 1112n, shortName: "twemix" }, { chainId: 1114n, shortName: "tcore2" }, { chainId: 1115n, shortName: "tcore" }, { chainId: 1116n, shortName: "core" }, { chainId: 1125n, shortName: "taker" }, { chainId: 1135n, shortName: "lisk" }, { chainId: 1230n, shortName: "UltronTestnet" }, { chainId: 1231n, shortName: "UltronMainnet" }, { chainId: 1284n, shortName: "mbeam" }, { chainId: 1285n, shortName: "mriver" }, { chainId: 1287n, shortName: "mbase" }, { chainId: 1294n, shortName: "bobabeam" }, { chainId: 1301n, shortName: "unichain-sep" }, { chainId: 1315n, shortName: "story-aeneid" }, { chainId: 1328n, shortName: "sei-testnet" }, { chainId: 1329n, shortName: "sei" }, { chainId: 1337n, shortName: "geth" }, { chainId: 1424n, shortName: "perennial" }, { chainId: 1439n, shortName: "injective-testnet" }, { chainId: 1442n, shortName: "testnet-zkEVM-mango" }, { chainId: 1480n, shortName: "vana" }, { chainId: 1513n, shortName: "Story" }, { chainId: 1514n, shortName: "sty" }, { chainId: 1516n, shortName: "story-testnet" }, { chainId: 1559n, shortName: "tenet" }, { chainId: 1625n, shortName: "gravity" }, { chainId: 1663n, shortName: "Gobi" }, { chainId: 1672n, shortName: "pharos" }, { chainId: 1729n, shortName: "reya" }, { chainId: 1740n, shortName: "metall2-testnet" }, { chainId: 1750n, shortName: "metall2" }, { chainId: 1776n, shortName: "injective" }, { chainId: 1807n, shortName: "rana" }, { chainId: 1811n, shortName: "lif3-testnet" }, { chainId: 1868n, shortName: "soneium" }, { chainId: 1890n, shortName: "lightlink_phoenix" }, { chainId: 1891n, shortName: "lightlink_pegasus" }, { chainId: 1923n, shortName: "swellchain" }, { chainId: 1924n, shortName: "swellchain-sep" }, { chainId: 1946n, shortName: "soneium-minato" }, { chainId: 1984n, shortName: "euntest" }, { chainId: 1995n, shortName: "edxt" }, { chainId: 1998n, shortName: "kyoto-testnet" }, { chainId: 2000n, shortName: "dc" }, { chainId: 2001n, shortName: "milkada" }, { chainId: 2002n, shortName: "milkalgo" }, { chainId: 2008n, shortName: "cloudwalk_testnet" }, { chainId: 2019n, shortName: "pmint_test" }, { chainId: 2020n, shortName: "pmint" }, { chainId: 2021n, shortName: "edg" }, { chainId: 2039n, shortName: "aleph" }, { chainId: 2187n, shortName: "g7" }, { chainId: 2192n, shortName: "snax" }, { chainId: 2201n, shortName: "stable-testnet" }, { chainId: 2221n, shortName: "tkava" }, { chainId: 2222n, shortName: "kava" }, { chainId: 2331n, shortName: "rss3-testnet" }, { chainId: 2345n, shortName: "goat" }, { chainId: 2358n, shortName: "kroma-sepolia" }, { chainId: 2390n, shortName: "tacchain_2390-1" }, { chainId: 2391n, shortName: "tacchain_2391-1" }, { chainId: 2424n, shortName: "inevm-testnet" }, { chainId: 2442n, shortName: "zkevm-testnet-cardona" }, { chainId: 2522n, shortName: "fraxtal-testnet" }, { chainId: 2741n, shortName: "abstract" }, { chainId: 2787n, shortName: "creator-chain-mainnet" }, { chainId: 2810n, shortName: "hmorph" }, { chainId: 2818n, shortName: "morph" }, { chainId: 2910n, shortName: "morph-hoodi-testnet" }, { chainId: 3068n, shortName: "bfc" }, { chainId: 3111n, shortName: "alpha" }, { chainId: 3338n, shortName: "PEAQ" }, { chainId: 3501n, shortName: "JFIN" }, { chainId: 3636n, shortName: "BTNXt" }, { chainId: 3637n, shortName: "BTNX" }, { chainId: 3737n, shortName: "csb" }, { chainId: 3776n, shortName: "astrzk" }, { chainId: 4002n, shortName: "tftm" }, { chainId: 4061n, shortName: "Nahmii3Mainnet" }, { chainId: 4062n, shortName: "Nahmii3Testnet" }, { chainId: 4078n, shortName: "muster" }, { chainId: 4153n, shortName: "rise" }, { chainId: 4157n, shortName: "crossfi-testnet" }, { chainId: 4158n, shortName: "crossfi" }, { chainId: 4162n, shortName: "SXR" }, { chainId: 4202n, shortName: "lisksep" }, { chainId: 4217n, shortName: "tempo" }, { chainId: 4326n, shortName: "megaeth" }, { chainId: 4337n, shortName: "beam" }, { chainId: 4460n, shortName: "orderlyl2" }, { chainId: 4488n, shortName: "HYDRA" }, { chainId: 4509n, shortName: "SC" }, { chainId: 4653n, shortName: "gold" }, { chainId: 4661n, shortName: "appchaintestnet" }, { chainId: 4689n, shortName: "iotex-mainnet" }, { chainId: 4801n, shortName: "wcsep" }, { chainId: 4918n, shortName: "txvm" }, { chainId: 4919n, shortName: "xvm" }, { chainId: 5000n, shortName: "mantle" }, { chainId: 5001n, shortName: "mantle-testnet" }, { chainId: 5003n, shortName: "mnt-sep" }, { chainId: 5031n, shortName: "Somnia" }, { chainId: 5115n, shortName: "citrea-testnet" }, { chainId: 5165n, shortName: "ftn" }, { chainId: 5330n, shortName: "sseed" }, { chainId: 5464n, shortName: "saga" }, { chainId: 5611n, shortName: "obnbt" }, { chainId: 5700n, shortName: "tsys" }, { chainId: 5851n, shortName: "OntologyTestnet" }, { chainId: 5887n, shortName: "dukong" }, { chainId: 5888n, shortName: "mantrachain" }, { chainId: 6001n, shortName: "bouncebit-mainnet" }, { chainId: 6102n, shortName: "cascadia" }, { chainId: 6321n, shortName: "eaura" }, { chainId: 6322n, shortName: "aura" }, { chainId: 6342n, shortName: "megatest" }, { chainId: 6398n, shortName: "connext-sepolia" }, { chainId: 6688n, shortName: "iris" }, { chainId: 6880n, shortName: "mtt-network" }, { chainId: 6900n, shortName: "cataclysm-1" }, { chainId: 6911n, shortName: "nibiru-testnet-2" }, { chainId: 6942n, shortName: "laika" }, { chainId: 7000n, shortName: "zetachain-mainnet" }, { chainId: 7001n, shortName: "zetachain-testnet" }, { chainId: 7070n, shortName: "planq" }, { chainId: 7171n, shortName: "bitrock" }, { chainId: 7200n, shortName: "xsat" }, { chainId: 7208n, shortName: "nxra-mainnet" }, { chainId: 7332n, shortName: "EON" }, { chainId: 7336n, shortName: "pruvtestnet" }, { chainId: 7337n, shortName: "pruvmainnet" }, { chainId: 7341n, shortName: "shyft" }, { chainId: 7560n, shortName: "cyeth" }, { chainId: 7700n, shortName: "canto" }, { chainId: 7771n, shortName: "tbitrock" }, { chainId: 7897n, shortName: "arena-z" }, { chainId: 7979n, shortName: "dos" }, { chainId: 8008n, shortName: "polynomial" }, { chainId: 8150n, shortName: "alpen" }, { chainId: 8192n, shortName: "tqf" }, { chainId: 8194n, shortName: "ttqf" }, { chainId: 8217n, shortName: "kaia-mainnet" }, { chainId: 8329n, shortName: "lrz" }, { chainId: 8333n, shortName: "b3" }, { chainId: 8408n, shortName: "zentest" }, { chainId: 8453n, shortName: "base" }, { chainId: 8700n, shortName: "ACN" }, { chainId: 8765n, shortName: "ward" }, { chainId: 8801n, shortName: "okto-testnet" }, { chainId: 8822n, shortName: "iotaevm" }, { chainId: 8844n, shortName: "THYDRA" }, { chainId: 9000n, shortName: "evmos-testnet" }, { chainId: 9001n, shortName: "evmos" }, { chainId: 9069n, shortName: "AP3X" }, { chainId: 9070n, shortName: "tAP3X" }, { chainId: 9369n, shortName: "z" }, { chainId: 9700n, shortName: "MainnetDev" }, { chainId: 9728n, shortName: "boba-testnet" }, { chainId: 9745n, shortName: "plasma" }, { chainId: 9746n, shortName: "plasma-testnet" }, { chainId: 10000n, shortName: "smartbch" }, { chainId: 10001n, shortName: "smartbchtest" }, { chainId: 10081n, shortName: "joct" }, { chainId: 10143n, shortName: "mon-testnet" }, { chainId: 10200n, shortName: "chi" }, { chainId: 10242n, shortName: "aa" }, { chainId: 10243n, shortName: "aat" }, { chainId: 10849n, shortName: "lamina1" }, { chainId: 10888n, shortName: "gameswift-chain-testnet" }, { chainId: 11011n, shortName: "shapesep" }, { chainId: 11111n, shortName: "WAGMI" }, { chainId: 11124n, shortName: "abstract-sepolia" }, { chainId: 11235n, shortName: "islm" }, { chainId: 11417n, shortName: "anq-testnet" }, { chainId: 11437n, shortName: "shyftt" }, { chainId: 11501n, shortName: "bevm" }, { chainId: 11503n, shortName: "bevm-test" }, { chainId: 11820n, shortName: "artela-mainnet" }, { chainId: 11891n, shortName: "Arianee" }, { chainId: 12324n, shortName: "l3x" }, { chainId: 12325n, shortName: "l3x-testnet" }, { chainId: 12357n, shortName: "rei-testnet" }, { chainId: 12553n, shortName: "rss3" }, { chainId: 13337n, shortName: "beam-testnet" }, { chainId: 13371n, shortName: "imx" }, { chainId: 13441n, shortName: "bridgeless" }, { chainId: 13473n, shortName: "imx-testnet" }, { chainId: 13505n, shortName: "gravitysep" }, { chainId: 13746n, shortName: "g7t" }, { chainId: 14601n, shortName: "sonic-testnet" }, { chainId: 14800n, shortName: "vana-moksha" }, { chainId: 16661n, shortName: "0g" }, { chainId: 17000n, shortName: "holesky" }, { chainId: 17069n, shortName: "garnet" }, { chainId: 17172n, shortName: "eclipse" }, { chainId: 18231n, shortName: "unreal-old" }, { chainId: 18233n, shortName: "unreal" }, { chainId: 18880n, shortName: "expchain" }, { chainId: 20994n, shortName: "fluent-testnet" }, { chainId: 22776n, shortName: "mapo" }, { chainId: 23294n, shortName: "sapphire" }, { chainId: 23295n, shortName: "sapphire-testnet" }, { chainId: 24101n, shortName: "incentiv" }, { chainId: 25327n, shortName: "Everclear" }, { chainId: 25363n, shortName: "fluent" }, { chainId: 26888n, shortName: "tABCore" }, { chainId: 28802n, shortName: "tcent" }, { chainId: 28882n, shortName: "BobaSepolia" }, { chainId: 28979n, shortName: "kimbonet-testnet" }, { chainId: 30303n, shortName: "Ethiq" }, { chainId: 31611n, shortName: "mezo-testnet" }, { chainId: 31612n, shortName: "mezo" }, { chainId: 32323n, shortName: "basedai" }, { chainId: 32380n, shortName: "paix" }, { chainId: 32769n, shortName: "zil" }, { chainId: 32770n, shortName: "zq2-proto-mainnet" }, { chainId: 33101n, shortName: "zil-testnet" }, { chainId: 33111n, shortName: "curtis" }, { chainId: 33139n, shortName: "apechain" }, { chainId: 33401n, shortName: "slingshot" }, { chainId: 34443n, shortName: "mode" }, { chainId: 35441n, shortName: "q" }, { chainId: 35443n, shortName: "q-testnet" }, { chainId: 36888n, shortName: "abcore" }, { chainId: 36900n, shortName: "adi" }, { chainId: 37111n, shortName: "lens-sepolia" }, { chainId: 41455n, shortName: "aleph-zero" }, { chainId: 41923n, shortName: "edu-chain" }, { chainId: 42161n, shortName: "arb1" }, { chainId: 42170n, shortName: "arb-nova" }, { chainId: 42220n, shortName: "celo" }, { chainId: 42421n, shortName: "rwa" }, { chainId: 42431n, shortName: "tempo-moderato" }, { chainId: 42793n, shortName: "etlk" }, { chainId: 43111n, shortName: "hemi" }, { chainId: 43113n, shortName: "fuji" }, { chainId: 43114n, shortName: "avax" }, { chainId: 43288n, shortName: "boba-avax" }, { chainId: 43419n, shortName: "gunz-mainnet" }, { chainId: 44787n, shortName: "alfa" }, { chainId: 45000n, shortName: "autobahnnetwork" }, { chainId: 47763n, shortName: "neox-mainnet" }, { chainId: 47805n, shortName: "rei" }, { chainId: 48898n, shortName: "zircuit-garfield-testnet" }, { chainId: 48899n, shortName: "zircuit-testnet" }, { chainId: 48900n, shortName: "zircuit-mainnet" }, { chainId: 49088n, shortName: "tbfc" }, { chainId: 49321n, shortName: "Stork" }, { chainId: 50104n, shortName: "sophon" }, { chainId: 50312n, shortName: "SomniaTestnet" }, { chainId: 52924n, shortName: "lazai" }, { chainId: 53302n, shortName: "seedsep" }, { chainId: 53456n, shortName: "birdlayer" }, { chainId: 53457n, shortName: "dodochain" }, { chainId: 54211n, shortName: "islmt" }, { chainId: 55244n, shortName: "spn" }, { chainId: 56288n, shortName: "boba-bnb" }, { chainId: 57000n, shortName: "tsys-rollux" }, { chainId: 57054n, shortName: "blaze" }, { chainId: 57073n, shortName: "ink" }, { chainId: 58008n, shortName: "sepPGN" }, { chainId: 59140n, shortName: "linea-goerli" }, { chainId: 59141n, shortName: "linea-sepolia" }, { chainId: 59144n, shortName: "linea" }, { chainId: 59902n, shortName: "metis-sepolia" }, { chainId: 60808n, shortName: "bob" }, { chainId: 61166n, shortName: "treasure" }, { chainId: 66665n, shortName: "ceth" }, { chainId: 71401n, shortName: "gw-testnet-v1" }, { chainId: 71402n, shortName: "gw-mainnet-v1" }, { chainId: 72080n, shortName: "nxra-testnet" }, { chainId: 73799n, shortName: "vt" }, { chainId: 80001n, shortName: "maticmum" }, { chainId: 80002n, shortName: "polygonamoy" }, { chainId: 80069n, shortName: "berachain-bepolia" }, { chainId: 80084n, shortName: "berachainbArtio" }, { chainId: 80085n, shortName: "berachainArtio" }, { chainId: 80094n, shortName: "berachain" }, { chainId: 81224n, shortName: "Codex" }, { chainId: 81457n, shortName: "blastmainnet" }, { chainId: 83291n, shortName: "lrz-testnet" }, { chainId: 84531n, shortName: "basegor" }, { chainId: 84532n, shortName: "basesep" }, { chainId: 88811n, shortName: "unit0-mainnet" }, { chainId: 88817n, shortName: "unit0-testnet" }, { chainId: 88882n, shortName: "chzspicy" }, { chainId: 88888n, shortName: "chiliz" }, { chainId: 90001n, shortName: "dhobyghaut" }, { chainId: 91342n, shortName: "giwasepolia" }, { chainId: 97435n, shortName: "sling" }, { chainId: 98864n, shortName: "plume-devnet" }, { chainId: 98865n, shortName: "plume" }, { chainId: 98866n, shortName: "plume-mainnet" }, { chainId: 98867n, shortName: "plume-testnet" }, { chainId: 98875n, shortName: "nil" }, { chainId: 98985n, shortName: "superposition-testnet" }, { chainId: 102030n, shortName: "ctc" }, { chainId: 103454n, shortName: "masatest" }, { chainId: 105105n, shortName: "stratis" }, { chainId: 111188n, shortName: "re-al" }, { chainId: 127823n, shortName: "etls" }, { chainId: 128123n, shortName: "etlt" }, { chainId: 167000n, shortName: "tko-mainnet" }, { chainId: 167008n, shortName: "tko-katla" }, { chainId: 167009n, shortName: "tko-hekla" }, { chainId: 167013n, shortName: "tko-hoodi" }, { chainId: 175188n, shortName: "lpy" }, { chainId: 181228n, shortName: "hpp-sepolia" }, { chainId: 190415n, shortName: "hpp-mainnet" }, { chainId: 200101n, shortName: "milktada" }, { chainId: 200202n, shortName: "milktalgo" }, { chainId: 200810n, shortName: "btrt" }, { chainId: 200901n, shortName: "btr" }, { chainId: 205205n, shortName: "auroria" }, { chainId: 210425n, shortName: "platon" }, { chainId: 222888n, shortName: "mocat" }, { chainId: 278701n, shortName: "creator-chain-testnet" }, { chainId: 314159n, shortName: "filecoin-calibration" }, { chainId: 325000n, shortName: "CampV2" }, { chainId: 328527n, shortName: "nal" }, { chainId: 333999n, shortName: "olympus" }, { chainId: 369369n, shortName: "den-mainnet" }, { chainId: 381931n, shortName: "metal" }, { chainId: 421611n, shortName: "arb-rinkeby" }, { chainId: 421613n, shortName: "arb-goerli" }, { chainId: 421614n, shortName: "arb-sep" }, { chainId: 444444n, shortName: "syndr" }, { chainId: 490000n, shortName: "ATN" }, { chainId: 511111n, shortName: "alpha-testnet" }, { chainId: 534351n, shortName: "scr-sepolia" }, { chainId: 534352n, shortName: "scr" }, { chainId: 534353n, shortName: "scr-alpha" }, { chainId: 543210n, shortName: "zero-network" }, { chainId: 555666n, shortName: "eclipset" }, { chainId: 560048n, shortName: "hoe" }, { chainId: 622277n, shortName: "rth" }, { chainId: 656476n, shortName: "open-campus-codex" }, { chainId: 657468n, shortName: "ethereal-testnet" }, { chainId: 660279n, shortName: "xai" }, { chainId: 668668n, shortName: "cnw" }, { chainId: 688688n, shortName: "pharos-testnet" }, { chainId: 688689n, shortName: "pharos-atlantic" }, { chainId: 695569n, shortName: "pyrope" }, { chainId: 713715n, shortName: "sei-devnet" }, { chainId: 743111n, shortName: "hemi-sep" }, { chainId: 747474n, shortName: "katana" }, { chainId: 763373n, shortName: "inksepolia" }, { chainId: 763375n, shortName: "surge-testnet" }, { chainId: 764984n, shortName: "lamina1test" }, { chainId: 808813n, shortName: "bob-sepolia" }, { chainId: 810180n, shortName: "zklink-nova" }, { chainId: 839999n, shortName: "txsat" }, { chainId: 853211n, shortName: "haqq-testethiq" }, { chainId: 978657n, shortName: "treasure-ruby" }, { chainId: 984122n, shortName: "forma" }, { chainId: 1000101n, shortName: "xo" }, { chainId: 1440000n, shortName: "xrplevm" }, { chainId: 1449000n, shortName: "xrplevmtestnet" }, { chainId: 1501869n, shortName: "water9" }, { chainId: 2206132n, shortName: "platondev2" }, { chainId: 2632500n, shortName: "coti" }, { chainId: 3441006n, shortName: "mantaSepoliaTestnet" }, { chainId: 4457845n, shortName: "zero-sepolia" }, { chainId: 5042002n, shortName: "arc-testnet" }, { chainId: 5064014n, shortName: "ethereal" }, { chainId: 6038361n, shortName: "azkyt" }, { chainId: 6281971n, shortName: "dogeos-chykyu" }, { chainId: 6985385n, shortName: "hp" }, { chainId: 7225878n, shortName: "saakuru" }, { chainId: 7777777n, shortName: "zora" }, { chainId: 9999999n, shortName: "fluence" }, { chainId: 11142220n, shortName: "celo-sep" }, { chainId: 11155111n, shortName: "sep" }, { chainId: 11155420n, shortName: "opsep" }, { chainId: 11155931n, shortName: "rise-testnet" }, { chainId: 12227332n, shortName: "neox-t4" }, { chainId: 13374202n, shortName: "ethereal-testnet-0" }, { chainId: 13863860n, shortName: "sis" }, { chainId: 20250407n, shortName: "platondev3" }, { chainId: 21000000n, shortName: "corn" }, { chainId: 52164803n, shortName: "fluence-testnet" }, { chainId: 65100004n, shortName: "piccadilly-04" }, { chainId: 94204209n, shortName: "polygon-blackberry" }, { chainId: 111557560n, shortName: "cysep" }, { chainId: 123420111n, shortName: "opcelestia-raspberry" }, { chainId: 161221135n, shortName: "plume-testnet-legacy" }, { chainId: 168587773n, shortName: "blastsepolia" }, { chainId: 222000222n, shortName: "kanazawa" }, { chainId: 245022926n, shortName: "neonevm-devnet" }, { chainId: 245022934n, shortName: "neonevm-mainnet" }, { chainId: 253368190n, shortName: "flame" }, { chainId: 328527624n, shortName: "nalsep" }, { chainId: 333000333n, shortName: "meld" }, { chainId: 476462898n, shortName: "Skopje" }, { chainId: 531050104n, shortName: "sophon-testnet" }, { chainId: 531050204n, shortName: "sophon-os-testnet" }, { chainId: 666666666n, shortName: "degen-chain" }, { chainId: 888888888n, shortName: "ancient8" }, { chainId: 994873017n, shortName: "lumia-mainnet" }, { chainId: 999999999n, shortName: "zsep" }, { chainId: 1313161554n, shortName: "aurora" }, { chainId: 1313161555n, shortName: "aurora-testnet" }, { chainId: 1417429182n, shortName: "zephyr" }, { chainId: 1511670449n, shortName: "GPT" }, { chainId: 1570754601n, shortName: "hst-test" }, { chainId: 1660990954n, shortName: "sn-sepolia" }, { chainId: 1666600000n, shortName: "hmy-s0" }, { chainId: 1666700000n, shortName: "hmy-b-s0" }, { chainId: 1952959480n, shortName: "lumiatestnet" }, { chainId: 2030232745n, shortName: "lumia-beam-testnet" }, { chainId: 3735928814n, shortName: "edent" }, { chainId: 11297108099n, shortName: "tpalm" }, { chainId: 11297108109n, shortName: "palm" }, { chainId: 30143370385n, shortName: "BUB" }, { chainId: 37714555429n, shortName: "xaitestnet" }, { chainId: 88153591557n, shortName: "arb-blueberry" }, { chainId: 123420000220n, shortName: "fluence-stage" }, { chainId: 920637907288165n, shortName: "kkrt-starknet-sepolia" } ]; try { if (process.env.TEST_NETWORK === "hardhat") { networks.push({ shortName: "local", chainId: 31337n }); } } catch { } // src/utils/eip-3770/index.ts function parseEip3770Address(fullAddress) { const parts = fullAddress.split(":"); const address = parts.length > 1 ? parts[1] : parts[0]; const prefix = parts.length > 1 ? parts[0] : ""; return { prefix, address }; } function getEip3770NetworkPrefixFromChainId(chainId) { const network = networks.find((network2) => chainId === network2.chainId); if (!network) { throw new Error("No network prefix supported for the current chainId"); } return network.shortName; } function getChainIdFromEip3770NetworkPrefix(prefix) { const network = networks.find(({ shortName }) => shortName === prefix); if (!network) { throw new Error("No chainId found for the given network prefix"); } return network.chainId; } function isValidEip3770NetworkPrefix(prefix) { return networks.some(({ shortName }) => shortName === prefix); } function validateEip3770NetworkPrefix(prefix, currentChainId) { const isCurrentNetworkPrefix = prefix === getEip3770NetworkPrefixFromChainId(currentChainId); if (!isValidEip3770NetworkPrefix(prefix) || !isCurrentNetworkPrefix) { throw new Error("The network prefix must match the current network"); } } function validateEthereumAddress(address) { if (!isAddress(address)) { throw new Error(`Invalid Ethereum address ${address}`); } } function validateEip3770Address(fullAddress, currentChainId) { const { address, prefix } = parseEip3770Address(fullAddress); validateEthereumAddress(address); if (prefix) { validateEip3770NetworkPrefix(prefix, currentChainId); } return { address, prefix }; } // src/utils/eip-712/index.ts import { hashMessage as performMessageHash } from "viem"; import semverSatisfies from "semver/functions/satisfies.js"; // src/utils/eip-712/encode.ts import { keccak256, concat, encodeAbiParameters, getTypesForEIP712Domain, validateTypedData, hashDomain, toHex } from "viem"; // src/utils/types.ts import { isHex, defineChain, etherUnits } from "viem"; import * as allChains from "viem/chains"; function isSafeConfigWithPredictedSafe(config) { return config.predictedSafe !== void 0; } function asHash(hash) { return hash; } function asHex(hex) { return isHex(hex) ? hex : `0x${hex}`; } function getChainById(chainId) { const chain = Object.values(allChains).find((chain2) => chain2.id === Number(chainId)); if (chain) { return chain; } else { return defineChain({ id: Number(chainId), name: "Custom", nativeCurrency: { decimals: etherUnits.wei, name: "Ether", symbol: "ETH" }, rpcUrls: { default: { http: [], webSocket: [] } } }); } } // src/utils/eip-712/encode.ts function encodeField({ types, name, type, value }) { if (types[type] !== void 0) { return [{ type: "bytes32" }, keccak256(encodeData({ data: value, primaryType: type, types }))]; } if (type === "bytes") { const prepend = value.length % 2 ? "0" : ""; value = `0x${prepend + value.slice(2)}`; return [{ type: "bytes32" }, keccak256(value)]; } if (type === "string") return [{ type: "bytes32" }, keccak256(toHex(value))]; if (type.lastIndexOf("]") === type.length - 1) { const parsedType = type.slice(0, type.lastIndexOf("[")); const typeValuePairs = value.map( (item) => encodeField({ name, type: parsedType, types, value: item }) ); return [ { type: "bytes32" }, keccak256( encodeAbiParameters( typeValuePairs.map(([t]) => t), typeValuePairs.map(([, v]) => v) ) ) ]; } return [{ type }, value]; } function findTypeDependencies({ primaryType: primaryType_, types }, results = /* @__PURE__ */ new Set()) { const match = primaryType_.match(/^\w*/u); const primaryType = match?.[0] || ""; if (results.has(primaryType) || types[primaryType] === void 0) { return results; } results.add(primaryType); for (const field of types[primaryType]) { findTypeDependencies({ primaryType: field.type, types }, results); } return results; } function encodeType({ primaryType, types }) { let result = ""; const unsortedDeps = findTypeDependencies({ primaryType, types }); unsortedDeps.delete(primaryType); const deps = [primaryType, ...Array.from(unsortedDeps).sort()]; for (const type of deps) { result += `${type}(${types[type].map(({ name, type: t }) => `${t} ${name}`).join(",")})`; } return result; } function hashType({ primaryType, types }) { const encodedHashType = toHex(encodeType({ primaryType, types })); return keccak256(encodedHashType); } function encodeData({ data, primaryType, types }) { const encodedTypes = [{ type: "bytes32" }]; const encodedValues = [hashType({ primaryType, types })]; for (const field of types[primaryType]) { const [type, value] = encodeField({ types, name: field.name, type: field.type, value: data[field.name] }); encodedTypes.push(type); encodedValues.push(value); } return encodeAbiParameters(encodedTypes, encodedValues); } function hashStruct({ data, primaryType, types }) { const encoded = encodeData({ data, primaryType, types }); return keccak256(encoded); } function deducePrimaryType(types) { return Object.keys(types)[0]; } function hashTypedData(typedData) { const data = encodeTypedData(typedData); return keccak256(asHex(data)); } function encodeTypedData(typedData) { typedData.primaryType = !typedData?.primaryType ? deducePrimaryType(typedData.types) : typedData?.primaryType; const { domain = {}, message, primaryType } = typedData; const types = { EIP712Domain: getTypesForEIP712Domain({ domain }), ...typedData.types }; validateTypedData({ domain, message, primaryType, types }); const parts = ["0x1901"]; if (domain) parts.push( hashDomain({ domain, types }) ); if (primaryType !== "EIP712Domain") parts.push( hashStruct({ data: message, primaryType, types }) ); return concat(parts); } // src/utils/eip-712/index.ts var EQ_OR_GT_1_3_0 = ">=1.3.0"; var EIP712_DOMAIN_BEFORE_V130 = [ { type: "address", name: "verifyingContract" } ]; var EIP712_DOMAIN = [ { type: "uint256", name: "chainId" }, { type: "address", name: "verifyingContract" } ]; function getEip712TxTypes(safeVersion) { const eip712WithChainId = semverSatisfies(safeVersion, EQ_OR_GT_1_3_0); return { EIP712Domain: eip712WithChainId ? EIP712_DOMAIN : EIP712_DOMAIN_BEFORE_V130, SafeTx: [ { type: "address", name: "to" }, { type: "uint256", name: "value" }, { type: "bytes", name: "data" }, { type: "uint8", name: "operation" }, { type: "uint256", name: "safeTxGas" }, { type: "uint256", name: "baseGas" }, { type: "uint256", name: "gasPrice" }, { type: "address", name: "gasToken" }, { type: "address", name: "refundReceiver" }, { type: "uint256", name: "nonce" } ] }; } function getEip712MessageTypes(safeVersion) { const eip712WithChainId = semverSatisfies(safeVersion, EQ_OR_GT_1_3_0); return { EIP712Domain: eip712WithChainId ? EIP712_DOMAIN : EIP712_DOMAIN_BEFORE_V130, SafeMessage: [{ type: "bytes", name: "message" }] }; } var hashTypedData2 = (typedData) => { return hashTypedData(typedData); }; var hashMessage = (message) => { return performMessageHash(message); }; var hashSafeMessage = (message) => { return typeof message === "string" ? hashMessage(message) : hashTypedData2(message); }; function generateTypedData({ safeAddress, safeVersion, chainId, data }) { const isSafeTransactionDataType = data.hasOwnProperty("to"); const eip712WithChainId = semverSatisfies(safeVersion, EQ_OR_GT_1_3_0); let typedData; if (isSafeTransactionDataType) { const txData = data; typedData = { types: getEip712TxTypes(safeVersion), domain: { verifyingContract: safeAddress }, primaryType: "SafeTx", message: { ...txData, value: txData.value, safeTxGas: txData.safeTxGas, baseGas: txData.baseGas, gasPrice: txData.gasPrice, nonce: txData.nonce } }; } else { const message = data; typedData = { types: getEip712MessageTypes(safeVersion), domain: { verifyingContract: safeAddress }, primaryType: "SafeMessage", message: { message: hashSafeMessage(message) } }; } if (eip712WithChainId) { typedData.domain.chainId = Number(chainId); } return typedData; } // src/utils/safeVersions.ts import semverSatisfies2 from "semver/functions/satisfies.js"; var SafeFeature = /* @__PURE__ */ ((SafeFeature2) => { SafeFeature2["SAFE_TX_GAS_OPTIONAL"] = "SAFE_TX_GAS_OPTIONAL"; SafeFeature2["SAFE_TX_GUARDS"] = "SAFE_TX_GUARDS"; SafeFeature2["SAFE_FALLBACK_HANDLER"] = "SAFE_FALLBACK_HANDLER"; SafeFeature2["ETH_SIGN"] = "ETH_SIGN"; SafeFeature2["ACCOUNT_ABSTRACTION"] = "ACCOUNT_ABSTRACTION"; SafeFeature2["REQUIRED_TXGAS"] = "REQUIRED_TXGAS"; SafeFeature2["SIMULATE_AND_REVERT"] = "SIMULATE_AND_REVERT"; SafeFeature2["PASSKEY_SIGNER"] = "PASSKEY_SIGNER"; SafeFeature2["SAFE_L2_CONTRACTS"] = "SAFE_L2_CONTRACTS"; SafeFeature2["SAFE_MODULE_GUARD"] = "SAFE_MODULE_GUARD"; return SafeFeature2; })(SafeFeature || {}); var SAFE_FEATURES_BY_VERSION = { ["SAFE_TX_GAS_OPTIONAL" /* SAFE_TX_GAS_OPTIONAL */]: ">=1.3.0", ["SAFE_TX_GUARDS" /* SAFE_TX_GUARDS */]: ">=1.3.0", ["SAFE_FALLBACK_HANDLER" /* SAFE_FALLBACK_HANDLER */]: ">=1.1.1", ["ETH_SIGN" /* ETH_SIGN */]: ">=1.1.0", ["ACCOUNT_ABSTRACTION" /* ACCOUNT_ABSTRACTION */]: ">=1.3.0", ["REQUIRED_TXGAS" /* REQUIRED_TXGAS */]: "<=1.2.0", ["SIMULATE_AND_REVERT" /* SIMULATE_AND_REVERT */]: ">=1.3.0", ["PASSKEY_SIGNER" /* PASSKEY_SIGNER */]: ">=1.3.0", ["SAFE_L2_CONTRACTS" /* SAFE_L2_CONTRACTS */]: ">=1.3.0", ["SAFE_MODULE_GUARD" /* SAFE_MODULE_GUARD */]: ">=1.5.0" }; var hasSafeFeature = (feature, version) => { if (!(feature in SAFE_FEATURES_BY_VERSION)) { return false; } return semverSatisfies2(version, SAFE_FEATURES_BY_VERSION[feature]); }; async function isSafeContractCompatibleWithRequiredTxGas(safeContract) { const safeVersion = safeContract.safeVersion; if (!hasSafeFeature("REQUIRED_TXGAS" /* REQUIRED_TXGAS */, safeVersion)) { throw new Error("Current version of the Safe does not support the requiredTxGas functionality"); } return safeContract; } async function isSafeContractCompatibleWithSimulateAndRevert(safeContract) { const safeVersion = safeContract.safeVersion; if (!hasSafeFeature("SIMULATE_AND_REVERT" /* SIMULATE_AND_REVERT */, safeVersion)) { throw new Error( "Current version of the Safe does not support the simulateAndRevert functionality" ); } return safeContract; } // src/utils/signatures/SafeSignature.ts var EthSafeSignature = class { /** * Creates an instance of a Safe signature. * * @param signer - Ethers signer * @param signature - The Safe signature * @returns The Safe signature instance */ constructor(signer, signature, isContractSignature = false) { this.signer = signer; this.data = signature; this.isContractSignature = isContractSignature; } /** * Returns the static part of the Safe signature. * * @returns The static part of the Safe signature */ staticPart(dynamicOffset) { if (this.isContractSignature) { return `${this.signer.slice(2).padStart(64, "0")}${dynamicOffset || ""}00`; } return this.data; } /** * Returns the dynamic part of the Safe signature. * * @returns The dynamic part of the Safe signature */ dynamicPart() { if (this.isContractSignature) { const dynamicPartLength = (this.data.slice(2).length / 2).toString(16).padStart(64, "0"); return `${dynamicPartLength}${this.data.slice(2)}`; } return ""; } }; // src/utils/signatures/utils.ts import { recoverAddress } from "viem"; import { SigningMethod } from "@safe-global/types-kit"; import semverSatisfies3 from "semver/functions/satisfies.js"; function generatePreValidatedSignature(ownerAddress) { const signature = "0x000000000000000000000000" + ownerAddress.slice(2) + "000000000000000000000000000000000000000000000000000000000000000001"; return new EthSafeSignature(ownerAddress, signature); } async function isTxHashSignedWithPrefix(txHash, signature, ownerAddress) { let hasPrefix; try { const recoveredAddress = await recoverAddress({ hash: asHash(txHash), signature: asHex(signature) }); hasPrefix = !sameString(recoveredAddress, ownerAddress); } catch (e) { hasPrefix = true; } return hasPrefix; } var adjustVInSignature = async (signingMethod, signature, safeTxHash, signerAddress) => { const ETHEREUM_V_VALUES = [0, 1, 27, 28]; const MIN_VALID_V_VALUE_FOR_SAFE_ECDSA = 27; let signatureV = parseInt(signature.slice(-2), 16); if (!ETHEREUM_V_VALUES.includes(signatureV)) { throw new Error("Invalid signature"); } if (signingMethod === SigningMethod.ETH_SIGN) { if (signatureV < MIN_VALID_V_VALUE_FOR_SAFE_ECDSA) { signatureV += MIN_VALID_V_VALUE_FOR_SAFE_ECDSA; } const adjustedSignature = signature.slice(0, -2) + signatureV.toString(16); const signatureHasPrefix = await isTxHashSignedWithPrefix( safeTxHash, adjustedSignature, signerAddress ); if (signatureHasPrefix) { signatureV += 4; } } if (signingMethod === SigningMethod.ETH_SIGN_TYPED_DATA) { if (signatureV < MIN_VALID_V_VALUE_FOR_SAFE_ECDSA) { signatureV += MIN_VALID_V_VALUE_FOR_SAFE_ECDSA; } } signature = signature.slice(0, -2) + signatureV.toString(16); return signature; }; async function generateSignature(safeProvider, hash) { const signerAddress = await safeProvider.getSignerAddress(); if (!signerAddress) { throw new Error("SafeProvider must be initialized with a signer to use this method"); } let signature = await safeProvider.signMessage(hash); signature = await adjustVInSignature(SigningMethod.ETH_SIGN, signature, hash, signerAddress); return new EthSafeSignature(signerAddress, signature); } async function generateEIP712Signature(safeProvider, safeEIP712Args, methodVersion) { const signerAddress = await safeProvider.getSignerAddress(); if (!signerAddress) { throw new Error("SafeProvider must be initialized with a signer to use this method"); } let signature = await safeProvider.signTypedData(safeEIP712Args, methodVersion); signature = await adjustVInSignature(SigningMethod.ETH_SIGN_TYPED_DATA, signature); return new EthSafeSignature(signerAddress, signature); } var buildContractSignature = async (signatures, signerSafeAddress) => { const contractSignature = new EthSafeSignature( signerSafeAddress, buildSignatureBytes(signatures), true ); return contractSignature; }; var buildSignatureBytes = (signatures) => { const SIGNATURE_LENGTH_BYTES = 65; signatures.sort( (left, right) => left.signer.toLowerCase().localeCompare(right.signer.toLowerCase()) ); let signatureBytes = EMPTY_DATA; let dynamicBytes = ""; for (const signature of signatures) { if (signature.isContractSignature) { const dynamicPartPosition = (signatures.length * SIGNATURE_LENGTH_BYTES + dynamicBytes.length / 2).toString(16).padStart(64, "0"); signatureBytes += signature.staticPart(dynamicPartPosition); dynamicBytes += signature.dynamicPart(); } else { signatureBytes += signature.data.slice(2); } } return signatureBytes + dynamicBytes; }; var preimageSafeTransactionHash = (safeAddress, safeTx, safeVersion, chainId) => { const safeTxTypes = getEip712TxTypes(safeVersion); const message = safeTx; return encodeTypedData({ domain: { verifyingContract: safeAddress, chainId: Number(chainId) }, types: { SafeTx: safeTxTypes.SafeTx }, message }); }; var preimageSafeMessageHash = (safeAddress, message, safeVersion, chainId) => { const safeMessageTypes = getEip712MessageTypes(safeVersion); return encodeTypedData({ domain: { verifyingContract: safeAddress, chainId: Number(chainId) }, types: { SafeMessage: safeMessageTypes.SafeMessage }, message: { message } }); }; var EQ_OR_GT_1_3_02 = ">=1.3.0"; var calculateSafeTransactionHash = (safeAddress, safeTx, safeVersion, chainId) => { const safeTxTypes = getEip712TxTypes(safeVersion); const domain = { verifyingContract: safeAddress }; if (semverSatisfies3(safeVersion, EQ_OR_GT_1_3_02)) { domain.chainId = Number(chainId); } const message = safeTx; return hashTypedData2({ domain, types: { SafeTx: safeTxTypes.SafeTx }, message }); }; var calculateSafeMessageHash = (safeAddress, message, safeVersion, chainId) => { const safeMessageTypes = getEip712MessageTypes(safeVersion); return hashTypedData2({ domain: { verifyingContract: safeAddress, chainId: Number(chainId) }, types: { SafeMessage: safeMessageTypes.SafeMessage }, message: { message } }); }; // src/utils/transactions/gas.ts import { BaseError } from "viem"; import { OperationType } from "@safe-global/types-kit"; import semverSatisfies4 from "semver/functions/satisfies.js"; // src/contracts/BaseContract.ts import { encodeFunctionData } from "viem"; import { estimateContractGas, getTransactionReceipt } from "viem/actions"; var BaseContract = class { /** * @constructor * Constructs an instance of BaseContract. * * @param contractName - The contract name. * @param chainId - The chain ID of the contract. * @param safeProvider - An instance of SafeProvider. * @param defaultAbi - The default