From dc602ed126cc210048b278b2372c0979ee4be62b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yago=20P=C3=A9rez=20V=C3=A1zquez?= Date: Thu, 26 Sep 2024 16:55:51 +0200 Subject: [PATCH] feat(protocol-kit): Predict Safe address improvements (#982) --- packages/protocol-kit/src/Safe.ts | 27 +++-- packages/protocol-kit/src/SafeFactory.ts | 7 +- packages/protocol-kit/src/SafeProvider.ts | 22 ++-- .../src/contracts/BaseContract.ts | 47 ++++++-- ...ompatibilityFallbackHandlerBaseContract.ts | 8 +- ...atibilityFallbackHandlerContract_v1_3_0.ts | 15 ++- ...atibilityFallbackHandlerContract_v1_4_1.ts | 15 ++- .../CreateCall/CreateCallBaseContract.ts | 8 +- .../v1.3.0/CreateCallContract_v1_3_0.ts | 15 ++- .../v1.4.1/CreateCallContract_v1_4_1.ts | 15 ++- .../MultiSend/MultiSendBaseContract.ts | 8 +- .../MultiSendCallOnlyBaseContract.ts | 8 +- .../v1.1.1/MultiSendContract_v1_1_1.ts | 15 ++- .../MultiSendCallOnlyContract_v1_3_0.ts | 15 ++- .../v1.3.0/MultiSendContract_v1_3_0.ts | 15 ++- .../MultiSendCallOnlyContract_v1_4_1.ts | 15 ++- .../v1.4.1/MultiSendContract_v1_4_1.ts | 15 ++- .../src/contracts/Safe/SafeBaseContract.ts | 8 +- .../Safe/v1.0.0/SafeContract_v1_0_0.ts | 8 +- .../Safe/v1.1.1/SafeContract_v1_1_1.ts | 8 +- .../Safe/v1.2.0/SafeContract_v1_2_0.ts | 8 +- .../Safe/v1.3.0/SafeContract_v1_3_0.ts | 8 +- .../Safe/v1.4.1/SafeContract_v1_4_1.ts | 8 +- .../SafeProxyFactoryBaseContract.ts | 8 +- .../v1.0.0/SafeProxyFactoryContract_v1_0_0.ts | 15 ++- .../v1.1.1/SafeProxyFactoryContract_v1_1_1.ts | 15 ++- .../v1.3.0/SafeProxyFactoryContract_v1_3_0.ts | 15 ++- .../v1.4.1/SafeProxyFactoryContract_v1_4_1.ts | 15 ++- .../SafeWebAuthnSharedSignerBaseContract.ts | 8 +- ...SafeWebAuthnSharedSignerContract_v0_2_1.ts | 15 ++- .../SafeWebAuthnSignerFactoryBaseContract.ts | 8 +- ...afeWebAuthnSignerFactoryContract_v0_2_1.ts | 15 ++- .../SignMessageLibBaseContract.ts | 8 +- .../v1.3.0/SignMessageLibContract_v1_3_0.ts | 15 ++- .../v1.4.1/SignMessageLibContract_v1_4_1.ts | 15 ++- .../SimulateTxAccessorBaseContract.ts | 8 +- .../SimulateTxAccessorContract_v1_3_0.ts | 15 ++- .../SimulateTxAccessorContract_v1_4_1.ts | 15 ++- packages/protocol-kit/src/contracts/config.ts | 91 ++++++++++++---- .../src/contracts/contractInstances.ts | 103 ++++++++++++------ .../src/contracts/safeDeploymentContracts.ts | 20 +++- packages/protocol-kit/src/contracts/utils.ts | 71 ++++++++---- packages/protocol-kit/src/types/safeConfig.ts | 3 + .../protocol-kit/src/types/safeProvider.ts | 11 ++ .../createPasskeyDeploymentTransaction.ts | 10 +- .../utils/passkeys/getPasskeyOwnerAddress.ts | 10 +- .../tests/e2e/contractInfo.test.ts | 99 +++++++++++++++++ .../protocol-kit/tests/e2e/passkey.test.ts | 16 ++- .../tests/e2e/safeContracts.test.ts | 2 +- .../tests/e2e/safeProvider.test.ts | 18 +-- .../tests/e2e/utilsContracts.test.ts | 82 ++++++++++++++ .../src/packs/safe-4337/Safe4337Pack.ts | 2 +- 52 files changed, 850 insertions(+), 196 deletions(-) create mode 100644 packages/protocol-kit/tests/e2e/contractInfo.test.ts diff --git a/packages/protocol-kit/src/Safe.ts b/packages/protocol-kit/src/Safe.ts index 95fb91fae..3c5bcca8b 100644 --- a/packages/protocol-kit/src/Safe.ts +++ b/packages/protocol-kit/src/Safe.ts @@ -21,7 +21,7 @@ import { getPredictedSafeAddressInitCode, predictSafeAddress } from './contracts/utils' -import { DEFAULT_SAFE_VERSION } from './contracts/config' +import { ContractInfo, DEFAULT_SAFE_VERSION, getContractInfo } from './contracts/config' import ContractManager from './managers/contractManager' import FallbackHandlerManager from './managers/fallbackHandlerManager' import GuardManager from './managers/guardManager' @@ -124,12 +124,12 @@ class Safe { async #initializeProtocolKit(config: SafeConfig) { const { provider, signer, isL1SafeSingleton, contractNetworks } = config - this.#safeProvider = await SafeProvider.init( + this.#safeProvider = await SafeProvider.init({ provider, signer, - DEFAULT_SAFE_VERSION, + safeVersion: DEFAULT_SAFE_VERSION, contractNetworks - ) + }) if (isSafeConfigWithPredictedSafe(config)) { this.#predictedSafe = config.predictedSafe @@ -155,7 +155,12 @@ class Safe { } const safeVersion = this.getContractVersion() - this.#safeProvider = await SafeProvider.init(provider, signer, safeVersion, contractNetworks) + this.#safeProvider = await SafeProvider.init({ + provider, + signer, + safeVersion, + contractNetworks + }) this.#ownerManager = new OwnerManager(this.#safeProvider, this.#contractManager.safeContract) this.#moduleManager = new ModuleManager(this.#safeProvider, this.#contractManager.safeContract) @@ -169,14 +174,14 @@ class Safe { if (isPasskeySigner) { const safeAddress = await this.getAddress() const owners = await this.getOwners() - this.#safeProvider = await SafeProvider.init( + this.#safeProvider = await SafeProvider.init({ provider, signer, safeVersion, contractNetworks, safeAddress, owners - ) + }) } } @@ -1636,6 +1641,14 @@ class Safe { return false } } + + getContractInfo = ({ + contractAddress + }: { + contractAddress: string + }): ContractInfo | undefined => { + return getContractInfo(contractAddress) + } } export default Safe diff --git a/packages/protocol-kit/src/SafeFactory.ts b/packages/protocol-kit/src/SafeFactory.ts index 482e65d55..a6dc93c2a 100644 --- a/packages/protocol-kit/src/SafeFactory.ts +++ b/packages/protocol-kit/src/SafeFactory.ts @@ -62,7 +62,12 @@ class SafeFactory { }: SafeFactoryInitConfig) { this.#provider = provider this.#signer = signer - this.#safeProvider = await SafeProvider.init(provider, signer, safeVersion, contractNetworks) + this.#safeProvider = await SafeProvider.init({ + provider, + signer, + safeVersion, + contractNetworks + }) this.#safeVersion = safeVersion this.#isL1SafeSingleton = isL1SafeSingleton this.#contractNetworks = contractNetworks diff --git a/packages/protocol-kit/src/SafeProvider.ts b/packages/protocol-kit/src/SafeProvider.ts index 1613188e0..84b727822 100644 --- a/packages/protocol-kit/src/SafeProvider.ts +++ b/packages/protocol-kit/src/SafeProvider.ts @@ -17,20 +17,18 @@ import { EIP712TypedDataMessage, EIP712TypedDataTx, Eip3770Address, - SafeEIP712Args, - SafeVersion + SafeEIP712Args } from '@safe-global/types-kit' import { SafeProviderTransaction, SafeProviderConfig, + SafeProviderInitOptions, ExternalClient, ExternalSigner, Eip1193Provider, HttpTransport, SocketTransport, SafeSigner, - SafeConfig, - ContractNetworksConfig, PasskeyArgType, PasskeyClient } from '@safe-global/protocol-kit/types' @@ -102,14 +100,14 @@ class SafeProvider { return this.#externalProvider } - static async init( - provider: SafeConfig['provider'], - signer?: SafeConfig['signer'], - safeVersion: SafeVersion = DEFAULT_SAFE_VERSION, - contractNetworks?: ContractNetworksConfig, - safeAddress?: string, - owners?: string[] - ): Promise { + static async init({ + provider, + signer, + safeVersion = DEFAULT_SAFE_VERSION, + contractNetworks, + safeAddress, + owners + }: SafeProviderInitOptions): Promise { const isPasskeySigner = signer && typeof signer !== 'string' if (isPasskeySigner) { diff --git a/packages/protocol-kit/src/contracts/BaseContract.ts b/packages/protocol-kit/src/contracts/BaseContract.ts index 698a9159c..82f42cc72 100644 --- a/packages/protocol-kit/src/contracts/BaseContract.ts +++ b/packages/protocol-kit/src/contracts/BaseContract.ts @@ -9,7 +9,9 @@ import { Chain } from 'viem' import { estimateContractGas, getTransactionReceipt } from 'viem/actions' +import { SingletonDeployment } from '@safe-global/safe-deployments' import { contractName, getContractDeployment } from '@safe-global/protocol-kit/contracts/config' +import { DeploymentType } from '@safe-global/protocol-kit/types' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' import { EncodeFunction, @@ -62,6 +64,7 @@ class BaseContract { * @param safeVersion - The version of the Safe contract. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the ABI is derived from the Safe deployments or the defaultAbi is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( contractName: contractName, @@ -70,24 +73,27 @@ class BaseContract { defaultAbi: ContractAbiType, safeVersion: SafeVersion, customContractAddress?: string, - customContractAbi?: ContractAbiType + customContractAbi?: ContractAbiType, + deploymentType?: DeploymentType ) { const deployment = getContractDeployment(safeVersion, chainId, contractName) - const contractAddress = - customContractAddress || deployment?.networkAddresses[chainId.toString()] + const resolvedAddress = + customContractAddress ?? + this.#resolveAddress( + deployment?.networkAddresses[chainId.toString()], + deployment, + deploymentType + ) - if (!contractAddress) { + if (!resolvedAddress) { throw new Error(`Invalid ${contractName.replace('Version', '')} contract address`) } this.chainId = chainId this.contractName = contractName this.safeVersion = safeVersion - this.contractAddress = - Array.isArray(contractAddress) && contractAddress.length - ? contractAddress[0] - : contractAddress.toString() + this.contractAddress = resolvedAddress this.contractAbi = customContractAbi || (deployment?.abi as unknown as ContractAbiType) || // this cast is required because abi is set as any[] in safe-deployments @@ -97,6 +103,31 @@ class BaseContract { this.safeProvider = safeProvider } + #resolveAddress( + networkAddresses: string | string[] | undefined, + deployment: SingletonDeployment, + deploymentType?: DeploymentType + ): string | undefined { + if (!networkAddresses) { + return undefined + } + + if (typeof networkAddresses === 'string') { + return networkAddresses + } + + if (deploymentType) { + const customDeploymentTypeAddress = deployment.deployments[deploymentType]?.address + + return ( + networkAddresses.find((address) => address === customDeploymentTypeAddress) ?? + networkAddresses[0] + ) + } + + return networkAddresses[0] + } + async init() { this.wallet = await this.safeProvider.getExternalSigner() } diff --git a/packages/protocol-kit/src/contracts/CompatibilityFallbackHandler/CompatibilityFallbackHandlerBaseContract.ts b/packages/protocol-kit/src/contracts/CompatibilityFallbackHandler/CompatibilityFallbackHandlerBaseContract.ts index fa0b2368b..5f1589677 100644 --- a/packages/protocol-kit/src/contracts/CompatibilityFallbackHandler/CompatibilityFallbackHandlerBaseContract.ts +++ b/packages/protocol-kit/src/contracts/CompatibilityFallbackHandler/CompatibilityFallbackHandlerBaseContract.ts @@ -2,6 +2,7 @@ import { Abi } from 'abitype' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' import BaseContract from '@safe-global/protocol-kit/contracts/BaseContract' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeVersion } from '@safe-global/types-kit' import { contractName } from '@safe-global/protocol-kit/contracts/config' @@ -33,6 +34,7 @@ abstract class CompatibilityFallbackHandlerBaseContract< * @param safeVersion - The version of the Safe contract. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the ABI is derived from the Safe deployments or the defaultAbi is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, @@ -40,7 +42,8 @@ abstract class CompatibilityFallbackHandlerBaseContract< defaultAbi: CompatibilityFallbackHandlerContractAbiType, safeVersion: SafeVersion, customContractAddress?: string, - customContractAbi?: CompatibilityFallbackHandlerContractAbiType + customContractAbi?: CompatibilityFallbackHandlerContractAbiType, + deploymentType?: DeploymentType ) { const contractName = 'compatibilityFallbackHandler' @@ -51,7 +54,8 @@ abstract class CompatibilityFallbackHandlerBaseContract< defaultAbi, safeVersion, customContractAddress, - customContractAbi + customContractAbi, + deploymentType ) this.contractName = contractName diff --git a/packages/protocol-kit/src/contracts/CompatibilityFallbackHandler/v1.3.0/CompatibilityFallbackHandlerContract_v1_3_0.ts b/packages/protocol-kit/src/contracts/CompatibilityFallbackHandler/v1.3.0/CompatibilityFallbackHandlerContract_v1_3_0.ts index 9dfe13fb6..9d5862840 100644 --- a/packages/protocol-kit/src/contracts/CompatibilityFallbackHandler/v1.3.0/CompatibilityFallbackHandlerContract_v1_3_0.ts +++ b/packages/protocol-kit/src/contracts/CompatibilityFallbackHandler/v1.3.0/CompatibilityFallbackHandlerContract_v1_3_0.ts @@ -1,5 +1,6 @@ import CompatibilityFallbackHandlerBaseContract from '@safe-global/protocol-kit/contracts/CompatibilityFallbackHandler/CompatibilityFallbackHandlerBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { CompatibilityFallbackHandlerContract_v1_3_0_Abi, CompatibilityFallbackHandlerContract_v1_3_0_Contract, @@ -25,17 +26,27 @@ class CompatibilityFallbackHandlerContract_v1_3_0 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the CompatibilityFallbackHandler deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.3.0 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: CompatibilityFallbackHandlerContract_v1_3_0_Abi + customContractAbi?: CompatibilityFallbackHandlerContract_v1_3_0_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.3.0' const defaultAbi = compatibilityFallbackHandler_1_3_0_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } } diff --git a/packages/protocol-kit/src/contracts/CompatibilityFallbackHandler/v1.4.1/CompatibilityFallbackHandlerContract_v1_4_1.ts b/packages/protocol-kit/src/contracts/CompatibilityFallbackHandler/v1.4.1/CompatibilityFallbackHandlerContract_v1_4_1.ts index 315259df0..79798e60b 100644 --- a/packages/protocol-kit/src/contracts/CompatibilityFallbackHandler/v1.4.1/CompatibilityFallbackHandlerContract_v1_4_1.ts +++ b/packages/protocol-kit/src/contracts/CompatibilityFallbackHandler/v1.4.1/CompatibilityFallbackHandlerContract_v1_4_1.ts @@ -1,5 +1,6 @@ import CompatibilityFallbackHandlerBaseContract from '@safe-global/protocol-kit/contracts/CompatibilityFallbackHandler/CompatibilityFallbackHandlerBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { compatibilityFallbackHandler_1_4_1_ContractArtifacts, CompatibilityFallbackHandlerContract_v1_4_1_Abi, @@ -25,17 +26,27 @@ class CompatibilityFallbackHandlerContract_v1_4_1 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the CompatibilityFallbackHandler deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.4.1 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: CompatibilityFallbackHandlerContract_v1_4_1_Abi + customContractAbi?: CompatibilityFallbackHandlerContract_v1_4_1_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.4.1' const defaultAbi = compatibilityFallbackHandler_1_4_1_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } } diff --git a/packages/protocol-kit/src/contracts/CreateCall/CreateCallBaseContract.ts b/packages/protocol-kit/src/contracts/CreateCall/CreateCallBaseContract.ts index 9cf41695b..4fb718ff3 100644 --- a/packages/protocol-kit/src/contracts/CreateCall/CreateCallBaseContract.ts +++ b/packages/protocol-kit/src/contracts/CreateCall/CreateCallBaseContract.ts @@ -1,6 +1,7 @@ import { Abi } from 'abitype' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import BaseContract from '@safe-global/protocol-kit/contracts/BaseContract' import { SafeVersion } from '@safe-global/types-kit' import { contractName } from '@safe-global/protocol-kit/contracts/config' @@ -33,6 +34,7 @@ abstract class CreateCallBaseContract< * @param safeVersion - The version of the Safe contract. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the ABI is derived from the Safe deployments or the defaultAbi is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, @@ -40,7 +42,8 @@ abstract class CreateCallBaseContract< defaultAbi: CreateCallContractAbiType, safeVersion: SafeVersion, customContractAddress?: string, - customContractAbi?: CreateCallContractAbiType + customContractAbi?: CreateCallContractAbiType, + deploymentType?: DeploymentType ) { const contractName = 'createCallVersion' @@ -51,7 +54,8 @@ abstract class CreateCallBaseContract< defaultAbi, safeVersion, customContractAddress, - customContractAbi + customContractAbi, + deploymentType ) this.contractName = contractName diff --git a/packages/protocol-kit/src/contracts/CreateCall/v1.3.0/CreateCallContract_v1_3_0.ts b/packages/protocol-kit/src/contracts/CreateCall/v1.3.0/CreateCallContract_v1_3_0.ts index b78c60eba..2d04d3fdb 100644 --- a/packages/protocol-kit/src/contracts/CreateCall/v1.3.0/CreateCallContract_v1_3_0.ts +++ b/packages/protocol-kit/src/contracts/CreateCall/v1.3.0/CreateCallContract_v1_3_0.ts @@ -7,6 +7,7 @@ import { } from '@safe-global/types-kit' import { toTxResult } from '@safe-global/protocol-kit/contracts/utils' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' /** * CreateCallContract_v1_3_0 is the implementation specific to the CreateCall contract version 1.3.0. @@ -27,17 +28,27 @@ class CreateCallContract_v1_3_0 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the CreateCall deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.3.0 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: CreateCallContract_v1_3_0_Abi + customContractAbi?: CreateCallContract_v1_3_0_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.3.0' const defaultAbi = createCall_1_3_0_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } /** diff --git a/packages/protocol-kit/src/contracts/CreateCall/v1.4.1/CreateCallContract_v1_4_1.ts b/packages/protocol-kit/src/contracts/CreateCall/v1.4.1/CreateCallContract_v1_4_1.ts index 4a92db4f6..08343b790 100644 --- a/packages/protocol-kit/src/contracts/CreateCall/v1.4.1/CreateCallContract_v1_4_1.ts +++ b/packages/protocol-kit/src/contracts/CreateCall/v1.4.1/CreateCallContract_v1_4_1.ts @@ -1,5 +1,6 @@ import CreateCallBaseContract from '@safe-global/protocol-kit/contracts/CreateCall/CreateCallBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { CreateCallContract_v1_4_1_Abi, CreateCallContract_v1_4_1_Contract, @@ -27,17 +28,27 @@ class CreateCallContract_v1_4_1 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the CreateCall deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.4.1 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: CreateCallContract_v1_4_1_Abi + customContractAbi?: CreateCallContract_v1_4_1_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.4.1' const defaultAbi = createCall_1_4_1_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } /** diff --git a/packages/protocol-kit/src/contracts/MultiSend/MultiSendBaseContract.ts b/packages/protocol-kit/src/contracts/MultiSend/MultiSendBaseContract.ts index 21933c2cf..fbef219a1 100644 --- a/packages/protocol-kit/src/contracts/MultiSend/MultiSendBaseContract.ts +++ b/packages/protocol-kit/src/contracts/MultiSend/MultiSendBaseContract.ts @@ -1,6 +1,7 @@ import { Abi } from 'abitype' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeVersion } from '@safe-global/types-kit' import BaseContract from '@safe-global/protocol-kit/contracts/BaseContract' import { contractName } from '@safe-global/protocol-kit/contracts/config' @@ -33,6 +34,7 @@ abstract class MultiSendBaseContract< * @param safeVersion - The version of the MultiSend contract. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the MultiSend deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the ABI is derived from the MultiSend deployments or the defaultAbi is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, @@ -40,7 +42,8 @@ abstract class MultiSendBaseContract< defaultAbi: MultiSendContractAbiType, safeVersion: SafeVersion, customContractAddress?: string, - customContractAbi?: MultiSendContractAbiType + customContractAbi?: MultiSendContractAbiType, + deploymentType?: DeploymentType ) { const contractName = 'multiSendVersion' @@ -51,7 +54,8 @@ abstract class MultiSendBaseContract< defaultAbi, safeVersion, customContractAddress, - customContractAbi + customContractAbi, + deploymentType ) this.contractName = contractName diff --git a/packages/protocol-kit/src/contracts/MultiSend/MultiSendCallOnlyBaseContract.ts b/packages/protocol-kit/src/contracts/MultiSend/MultiSendCallOnlyBaseContract.ts index f180b748b..db6025f24 100644 --- a/packages/protocol-kit/src/contracts/MultiSend/MultiSendCallOnlyBaseContract.ts +++ b/packages/protocol-kit/src/contracts/MultiSend/MultiSendCallOnlyBaseContract.ts @@ -1,6 +1,7 @@ import { Abi } from 'abitype' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeVersion } from '@safe-global/types-kit' import BaseContract from '@safe-global/protocol-kit/contracts/BaseContract' import { contractName } from '@safe-global/protocol-kit/contracts/config' @@ -33,6 +34,7 @@ abstract class MultiSendCallOnlyBaseContract< * @param safeVersion - The version of the MultiSendCallOnly contract. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the MultiSendCallOnly deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the ABI is derived from the MultiSendCallOnly deployments or the defaultAbi is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, @@ -40,7 +42,8 @@ abstract class MultiSendCallOnlyBaseContract< defaultAbi: MultiSendCallOnlyContractAbiType, safeVersion: SafeVersion, customContractAddress?: string, - customContractAbi?: MultiSendCallOnlyContractAbiType + customContractAbi?: MultiSendCallOnlyContractAbiType, + deploymentType?: DeploymentType ) { const contractName = 'multiSendCallOnlyVersion' @@ -51,7 +54,8 @@ abstract class MultiSendCallOnlyBaseContract< defaultAbi, safeVersion, customContractAddress, - customContractAbi + customContractAbi, + deploymentType ) this.contractName = contractName diff --git a/packages/protocol-kit/src/contracts/MultiSend/v1.1.1/MultiSendContract_v1_1_1.ts b/packages/protocol-kit/src/contracts/MultiSend/v1.1.1/MultiSendContract_v1_1_1.ts index 48c5052b4..28daa6244 100644 --- a/packages/protocol-kit/src/contracts/MultiSend/v1.1.1/MultiSendContract_v1_1_1.ts +++ b/packages/protocol-kit/src/contracts/MultiSend/v1.1.1/MultiSendContract_v1_1_1.ts @@ -1,5 +1,6 @@ import MultiSendBaseContract from '@safe-global/protocol-kit/contracts/MultiSend/MultiSendBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { multisend_1_1_1_ContractArtifacts, MultiSendContract_v1_1_1_Abi, @@ -25,17 +26,27 @@ class MultiSendContract_v1_1_1 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the MultiSend deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.1.1 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: MultiSendContract_v1_1_1_Abi + customContractAbi?: MultiSendContract_v1_1_1_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.1.1' const defaultAbi = multisend_1_1_1_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } } diff --git a/packages/protocol-kit/src/contracts/MultiSend/v1.3.0/MultiSendCallOnlyContract_v1_3_0.ts b/packages/protocol-kit/src/contracts/MultiSend/v1.3.0/MultiSendCallOnlyContract_v1_3_0.ts index 634c4c755..e76eb2b33 100644 --- a/packages/protocol-kit/src/contracts/MultiSend/v1.3.0/MultiSendCallOnlyContract_v1_3_0.ts +++ b/packages/protocol-kit/src/contracts/MultiSend/v1.3.0/MultiSendCallOnlyContract_v1_3_0.ts @@ -1,5 +1,6 @@ import MultiSendCallOnlyBaseContract from '@safe-global/protocol-kit/contracts/MultiSend/MultiSendCallOnlyBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { MultiSendCallOnlyContract_v1_3_0_Abi, MultiSendCallOnlyContract_v1_3_0_Contract, @@ -25,17 +26,27 @@ class MultiSendCallOnlyContract_v1_3_0 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the MultiSendCallOnly deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.3.0 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: MultiSendCallOnlyContract_v1_3_0_Abi + customContractAbi?: MultiSendCallOnlyContract_v1_3_0_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.3.0' const defaultAbi = multiSendCallOnly_1_3_0_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } } diff --git a/packages/protocol-kit/src/contracts/MultiSend/v1.3.0/MultiSendContract_v1_3_0.ts b/packages/protocol-kit/src/contracts/MultiSend/v1.3.0/MultiSendContract_v1_3_0.ts index eca4a188d..88aad598c 100644 --- a/packages/protocol-kit/src/contracts/MultiSend/v1.3.0/MultiSendContract_v1_3_0.ts +++ b/packages/protocol-kit/src/contracts/MultiSend/v1.3.0/MultiSendContract_v1_3_0.ts @@ -1,5 +1,6 @@ import MultiSendBaseContract from '@safe-global/protocol-kit/contracts/MultiSend/MultiSendBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { multisend_1_3_0_ContractArtifacts, MultiSendContract_v1_3_0_Abi, @@ -25,17 +26,27 @@ class MultiSendContract_v1_3_0 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the MultiSend deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.3.0 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: MultiSendContract_v1_3_0_Abi + customContractAbi?: MultiSendContract_v1_3_0_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.3.0' const defaultAbi = multisend_1_3_0_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } } diff --git a/packages/protocol-kit/src/contracts/MultiSend/v1.4.1/MultiSendCallOnlyContract_v1_4_1.ts b/packages/protocol-kit/src/contracts/MultiSend/v1.4.1/MultiSendCallOnlyContract_v1_4_1.ts index 6abd66a94..91e3ab5c6 100644 --- a/packages/protocol-kit/src/contracts/MultiSend/v1.4.1/MultiSendCallOnlyContract_v1_4_1.ts +++ b/packages/protocol-kit/src/contracts/MultiSend/v1.4.1/MultiSendCallOnlyContract_v1_4_1.ts @@ -1,5 +1,6 @@ import MultiSendCallOnlyBaseContract from '@safe-global/protocol-kit/contracts/MultiSend/MultiSendCallOnlyBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { multiSendCallOnly_1_4_1_ContractArtifacts, MultiSendCallOnlyContract_v1_4_1_Abi, @@ -25,17 +26,27 @@ class MultiSendCallOnlyContract_v1_4_1 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the MultiSendCallOnly deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.4.1 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: MultiSendCallOnlyContract_v1_4_1_Abi + customContractAbi?: MultiSendCallOnlyContract_v1_4_1_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.4.1' const defaultAbi = multiSendCallOnly_1_4_1_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } } diff --git a/packages/protocol-kit/src/contracts/MultiSend/v1.4.1/MultiSendContract_v1_4_1.ts b/packages/protocol-kit/src/contracts/MultiSend/v1.4.1/MultiSendContract_v1_4_1.ts index fdc63719d..b8af54fc4 100644 --- a/packages/protocol-kit/src/contracts/MultiSend/v1.4.1/MultiSendContract_v1_4_1.ts +++ b/packages/protocol-kit/src/contracts/MultiSend/v1.4.1/MultiSendContract_v1_4_1.ts @@ -1,5 +1,6 @@ import MultiSendBaseContract from '@safe-global/protocol-kit/contracts/MultiSend/MultiSendBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { MultiSendContract_v1_4_1_Abi, MultiSendContract_v1_4_1_Contract, @@ -25,17 +26,27 @@ class MultiSendContract_v1_4_1 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the MultiSend deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.4.1 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: MultiSendContract_v1_4_1_Abi + customContractAbi?: MultiSendContract_v1_4_1_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.4.1' const defaultAbi = multisend_1_4_1_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } } diff --git a/packages/protocol-kit/src/contracts/Safe/SafeBaseContract.ts b/packages/protocol-kit/src/contracts/Safe/SafeBaseContract.ts index 5a7a096e3..7634d5f0f 100644 --- a/packages/protocol-kit/src/contracts/Safe/SafeBaseContract.ts +++ b/packages/protocol-kit/src/contracts/Safe/SafeBaseContract.ts @@ -4,6 +4,7 @@ import SafeProvider from '@safe-global/protocol-kit/SafeProvider' import { SafeVersion } from '@safe-global/types-kit' import BaseContract from '@safe-global/protocol-kit/contracts/BaseContract' import { contractName, safeDeploymentsL1ChainIds } from '@safe-global/protocol-kit/contracts/config' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SAFE_FEATURES, hasSafeFeature } from '@safe-global/protocol-kit/utils' /** @@ -38,6 +39,7 @@ abstract class SafeBaseContract< * @param isL1SafeSingleton - A flag indicating if the contract is a L1 Safe Singleton. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the ABI is derived from the Safe deployments or the defaultAbi is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, @@ -46,7 +48,8 @@ abstract class SafeBaseContract< safeVersion: SafeVersion, isL1SafeSingleton = false, customContractAddress?: string, - customContractAbi?: SafeContractAbiType + customContractAbi?: SafeContractAbiType, + deploymentType?: DeploymentType ) { const isL1Contract = safeDeploymentsL1ChainIds.includes(chainId) || @@ -62,7 +65,8 @@ abstract class SafeBaseContract< defaultAbi, safeVersion, customContractAddress, - customContractAbi + customContractAbi, + deploymentType ) this.contractName = contractName diff --git a/packages/protocol-kit/src/contracts/Safe/v1.0.0/SafeContract_v1_0_0.ts b/packages/protocol-kit/src/contracts/Safe/v1.0.0/SafeContract_v1_0_0.ts index 994c6b114..b3ee89a94 100644 --- a/packages/protocol-kit/src/contracts/Safe/v1.0.0/SafeContract_v1_0_0.ts +++ b/packages/protocol-kit/src/contracts/Safe/v1.0.0/SafeContract_v1_0_0.ts @@ -4,6 +4,7 @@ import SafeBaseContract from '@safe-global/protocol-kit/contracts/Safe/SafeBaseC import SafeProvider from '@safe-global/protocol-kit/SafeProvider' import { toTxResult } from '@safe-global/protocol-kit/contracts/utils' import { sameString, isSentinelAddress } from '@safe-global/protocol-kit/utils' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeContract_v1_0_0_Abi, SafeContract_v1_0_0_Function, @@ -36,13 +37,15 @@ class SafeContract_v1_0_0 * @param isL1SafeSingleton - A flag indicating if the contract is a L1 Safe Singleton. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.0.0 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, isL1SafeSingleton = false, customContractAddress?: string, - customContractAbi?: SafeContract_v1_0_0_Abi + customContractAbi?: SafeContract_v1_0_0_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.0.0' const defaultAbi = safe_1_0_0_ContractArtifacts.abi @@ -54,7 +57,8 @@ class SafeContract_v1_0_0 safeVersion, isL1SafeSingleton, customContractAddress, - customContractAbi + customContractAbi, + deploymentType ) } diff --git a/packages/protocol-kit/src/contracts/Safe/v1.1.1/SafeContract_v1_1_1.ts b/packages/protocol-kit/src/contracts/Safe/v1.1.1/SafeContract_v1_1_1.ts index 932eb7d34..7b59e5b50 100644 --- a/packages/protocol-kit/src/contracts/Safe/v1.1.1/SafeContract_v1_1_1.ts +++ b/packages/protocol-kit/src/contracts/Safe/v1.1.1/SafeContract_v1_1_1.ts @@ -3,6 +3,7 @@ import SafeBaseContract from '@safe-global/protocol-kit/contracts/Safe/SafeBaseC import SafeProvider from '@safe-global/protocol-kit/SafeProvider' import { toTxResult } from '@safe-global/protocol-kit/contracts/utils' import { sameString } from '@safe-global/protocol-kit/utils' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeContract_v1_1_1_Abi, SafeContract_v1_1_1_Contract, @@ -35,13 +36,15 @@ class SafeContract_v1_1_1 * @param isL1SafeSingleton - A flag indicating if the contract is a L1 Safe Singleton. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.1.1 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, isL1SafeSingleton = false, customContractAddress?: string, - customContractAbi?: SafeContract_v1_1_1_Abi + customContractAbi?: SafeContract_v1_1_1_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.1.1' const defaultAbi = safe_1_1_1_ContractArtifacts.abi @@ -53,7 +56,8 @@ class SafeContract_v1_1_1 safeVersion, isL1SafeSingleton, customContractAddress, - customContractAbi + customContractAbi, + deploymentType ) } diff --git a/packages/protocol-kit/src/contracts/Safe/v1.2.0/SafeContract_v1_2_0.ts b/packages/protocol-kit/src/contracts/Safe/v1.2.0/SafeContract_v1_2_0.ts index 090875676..82f96a5e5 100644 --- a/packages/protocol-kit/src/contracts/Safe/v1.2.0/SafeContract_v1_2_0.ts +++ b/packages/protocol-kit/src/contracts/Safe/v1.2.0/SafeContract_v1_2_0.ts @@ -2,6 +2,7 @@ import { simulateContract } from 'viem/actions' import SafeBaseContract from '@safe-global/protocol-kit/contracts/Safe/SafeBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' import { toTxResult } from '@safe-global/protocol-kit/contracts/utils' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeContract_v1_2_0_Abi, SafeContract_v1_2_0_Contract, @@ -34,13 +35,15 @@ class SafeContract_v1_2_0 * @param isL1SafeSingleton - A flag indicating if the contract is a L1 Safe Singleton. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.2.0 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, isL1SafeSingleton = false, customContractAddress?: string, - customContractAbi?: SafeContract_v1_2_0_Abi + customContractAbi?: SafeContract_v1_2_0_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.2.0' const defaultAbi = safe_1_2_0_ContractArtifacts.abi @@ -52,7 +55,8 @@ class SafeContract_v1_2_0 safeVersion, isL1SafeSingleton, customContractAddress, - customContractAbi + customContractAbi, + deploymentType ) } diff --git a/packages/protocol-kit/src/contracts/Safe/v1.3.0/SafeContract_v1_3_0.ts b/packages/protocol-kit/src/contracts/Safe/v1.3.0/SafeContract_v1_3_0.ts index 5d61663df..f6976edee 100644 --- a/packages/protocol-kit/src/contracts/Safe/v1.3.0/SafeContract_v1_3_0.ts +++ b/packages/protocol-kit/src/contracts/Safe/v1.3.0/SafeContract_v1_3_0.ts @@ -3,6 +3,7 @@ import SafeBaseContract from '@safe-global/protocol-kit/contracts/Safe/SafeBaseC import SafeProvider from '@safe-global/protocol-kit/SafeProvider' import { toTxResult } from '@safe-global/protocol-kit/contracts/utils' import { SENTINEL_ADDRESS } from '@safe-global/protocol-kit/utils/constants' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeContract_v1_3_0_Abi, SafeContract_v1_3_0_Contract, @@ -35,13 +36,15 @@ class SafeContract_v1_3_0 * @param isL1SafeSingleton - A flag indicating if the contract is a L1 Safe Singleton. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.3.0 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, isL1SafeSingleton = false, customContractAddress?: string, - customContractAbi?: SafeContract_v1_3_0_Abi + customContractAbi?: SafeContract_v1_3_0_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.3.0' const defaultAbi = safe_1_3_0_ContractArtifacts.abi @@ -53,7 +56,8 @@ class SafeContract_v1_3_0 safeVersion, isL1SafeSingleton, customContractAddress, - customContractAbi + customContractAbi, + deploymentType ) } diff --git a/packages/protocol-kit/src/contracts/Safe/v1.4.1/SafeContract_v1_4_1.ts b/packages/protocol-kit/src/contracts/Safe/v1.4.1/SafeContract_v1_4_1.ts index b985db6e3..279786f05 100644 --- a/packages/protocol-kit/src/contracts/Safe/v1.4.1/SafeContract_v1_4_1.ts +++ b/packages/protocol-kit/src/contracts/Safe/v1.4.1/SafeContract_v1_4_1.ts @@ -3,6 +3,7 @@ import SafeBaseContract from '@safe-global/protocol-kit/contracts/Safe/SafeBaseC import SafeProvider from '@safe-global/protocol-kit/SafeProvider' import { toTxResult } from '@safe-global/protocol-kit/contracts/utils' import { SENTINEL_ADDRESS } from '@safe-global/protocol-kit/utils/constants' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeContract_v1_4_1_Abi, SafeContract_v1_4_1_Contract, @@ -35,13 +36,15 @@ class SafeContract_v1_4_1 * @param isL1SafeSingleton - A flag indicating if the contract is a L1 Safe Singleton. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.4.1 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, isL1SafeSingleton = false, customContractAddress?: string, - customContractAbi?: SafeContract_v1_4_1_Abi + customContractAbi?: SafeContract_v1_4_1_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.4.1' const defaultAbi = safe_1_4_1_ContractArtifacts.abi @@ -53,7 +56,8 @@ class SafeContract_v1_4_1 safeVersion, isL1SafeSingleton, customContractAddress, - customContractAbi + customContractAbi, + deploymentType ) } diff --git a/packages/protocol-kit/src/contracts/SafeProxyFactory/SafeProxyFactoryBaseContract.ts b/packages/protocol-kit/src/contracts/SafeProxyFactory/SafeProxyFactoryBaseContract.ts index a0bade9f8..d95988ef8 100644 --- a/packages/protocol-kit/src/contracts/SafeProxyFactory/SafeProxyFactoryBaseContract.ts +++ b/packages/protocol-kit/src/contracts/SafeProxyFactory/SafeProxyFactoryBaseContract.ts @@ -1,6 +1,7 @@ import { Abi } from 'abitype' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' import BaseContract from '@safe-global/protocol-kit/contracts/BaseContract' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeVersion, TransactionOptions, @@ -43,6 +44,7 @@ abstract class SafeProxyFactoryBaseContract< * @param safeVersion - The version of the Safe contract. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the ABI is derived from the Safe deployments or the defaultAbi is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, @@ -50,7 +52,8 @@ abstract class SafeProxyFactoryBaseContract< defaultAbi: SafeProxyFactoryContractAbiType, safeVersion: SafeVersion, customContractAddress?: string, - customContractAbi?: SafeProxyFactoryContractAbiType + customContractAbi?: SafeProxyFactoryContractAbiType, + deploymentType?: DeploymentType ) { const contractName = 'safeProxyFactoryVersion' @@ -61,7 +64,8 @@ abstract class SafeProxyFactoryBaseContract< defaultAbi, safeVersion, customContractAddress, - customContractAbi + customContractAbi, + deploymentType ) this.contractName = contractName diff --git a/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.0.0/SafeProxyFactoryContract_v1_0_0.ts b/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.0.0/SafeProxyFactoryContract_v1_0_0.ts index 5029ad6f8..f0b349f84 100644 --- a/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.0.0/SafeProxyFactoryContract_v1_0_0.ts +++ b/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.0.0/SafeProxyFactoryContract_v1_0_0.ts @@ -3,6 +3,7 @@ import SafeProxyFactoryBaseContract, { CreateProxyProps } from '@safe-global/protocol-kit/contracts/SafeProxyFactory/SafeProxyFactoryBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeProxyFactoryContract_v1_0_0_Abi, SafeProxyFactoryContract_v1_0_0_Contract, @@ -31,17 +32,27 @@ class SafeProxyFactoryContract_v1_0_0 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.0.0 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: SafeProxyFactoryContract_v1_0_0_Abi + customContractAbi?: SafeProxyFactoryContract_v1_0_0_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.0.0' const defaultAbi = safeProxyFactory_1_0_0_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } /** diff --git a/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.1.1/SafeProxyFactoryContract_v1_1_1.ts b/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.1.1/SafeProxyFactoryContract_v1_1_1.ts index 8aecdbd62..7e948b397 100644 --- a/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.1.1/SafeProxyFactoryContract_v1_1_1.ts +++ b/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.1.1/SafeProxyFactoryContract_v1_1_1.ts @@ -3,6 +3,7 @@ import SafeProxyFactoryBaseContract, { CreateProxyProps } from '@safe-global/protocol-kit/contracts/SafeProxyFactory/SafeProxyFactoryBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeProxyFactoryContract_v1_1_1_Abi, SafeProxyFactoryContract_v1_1_1_Contract, @@ -31,17 +32,27 @@ class SafeProxyFactoryContract_v1_1_1 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.1.1 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: SafeProxyFactoryContract_v1_1_1_Abi + customContractAbi?: SafeProxyFactoryContract_v1_1_1_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.1.1' const defaultAbi = safeProxyFactory_1_1_1_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } /** diff --git a/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.3.0/SafeProxyFactoryContract_v1_3_0.ts b/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.3.0/SafeProxyFactoryContract_v1_3_0.ts index 098c5e21a..59d8128f4 100644 --- a/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.3.0/SafeProxyFactoryContract_v1_3_0.ts +++ b/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.3.0/SafeProxyFactoryContract_v1_3_0.ts @@ -3,6 +3,7 @@ import SafeProxyFactoryBaseContract, { CreateProxyProps } from '@safe-global/protocol-kit/contracts/SafeProxyFactory/SafeProxyFactoryBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeProxyFactoryContract_v1_3_0_Abi, SafeProxyFactoryContract_v1_3_0_Contract, @@ -31,17 +32,27 @@ class SafeProxyFactoryContract_v1_3_0 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.3.0 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: SafeProxyFactoryContract_v1_3_0_Abi + customContractAbi?: SafeProxyFactoryContract_v1_3_0_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.3.0' const defaultAbi = safeProxyFactory_1_3_0_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } /** diff --git a/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.4.1/SafeProxyFactoryContract_v1_4_1.ts b/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.4.1/SafeProxyFactoryContract_v1_4_1.ts index d77ab61b6..336502a60 100644 --- a/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.4.1/SafeProxyFactoryContract_v1_4_1.ts +++ b/packages/protocol-kit/src/contracts/SafeProxyFactory/v1.4.1/SafeProxyFactoryContract_v1_4_1.ts @@ -2,6 +2,7 @@ import { parseEventLogs } from 'viem' import SafeProxyFactoryBaseContract, { CreateProxyProps } from '@safe-global/protocol-kit/contracts/SafeProxyFactory/SafeProxyFactoryBaseContract' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeProxyFactoryContract_v1_4_1_Abi, SafeProxyFactoryContract_v1_4_1_Contract, @@ -31,17 +32,27 @@ class SafeProxyFactoryContract_v1_4_1 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.4.1 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: SafeProxyFactoryContract_v1_4_1_Abi + customContractAbi?: SafeProxyFactoryContract_v1_4_1_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.4.1' const defaultAbi = safeProxyFactory_1_4_1_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } /** diff --git a/packages/protocol-kit/src/contracts/SafeWebAuthnSharedSigner/SafeWebAuthnSharedSignerBaseContract.ts b/packages/protocol-kit/src/contracts/SafeWebAuthnSharedSigner/SafeWebAuthnSharedSignerBaseContract.ts index e97fb5949..b9c138e2d 100644 --- a/packages/protocol-kit/src/contracts/SafeWebAuthnSharedSigner/SafeWebAuthnSharedSignerBaseContract.ts +++ b/packages/protocol-kit/src/contracts/SafeWebAuthnSharedSigner/SafeWebAuthnSharedSignerBaseContract.ts @@ -1,5 +1,6 @@ import { Abi } from 'abitype' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import BaseContract from '@safe-global/protocol-kit/contracts/BaseContract' import { SafeVersion, @@ -39,6 +40,7 @@ abstract class SafeWebAuthnSharedSignerBaseContract< * @param safeVersion - The version of the Safe contract. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the ABI is derived from the Safe deployments or the defaultAbi is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, @@ -46,7 +48,8 @@ abstract class SafeWebAuthnSharedSignerBaseContract< defaultAbi: SafeWebAuthnSharedSignerContractAbiType, safeVersion: SafeVersion, customContractAddress?: string, - customContractAbi?: SafeWebAuthnSharedSignerContractAbiType + customContractAbi?: SafeWebAuthnSharedSignerContractAbiType, + deploymentType?: DeploymentType ) { const contractName = 'safeWebAuthnSharedSignerVersion' @@ -57,7 +60,8 @@ abstract class SafeWebAuthnSharedSignerBaseContract< defaultAbi, safeVersion, customContractAddress, - customContractAbi + customContractAbi, + deploymentType ) this.contractName = contractName diff --git a/packages/protocol-kit/src/contracts/SafeWebAuthnSharedSigner/v0.2.1/SafeWebAuthnSharedSignerContract_v0_2_1.ts b/packages/protocol-kit/src/contracts/SafeWebAuthnSharedSigner/v0.2.1/SafeWebAuthnSharedSignerContract_v0_2_1.ts index 23df3f184..0f48f922a 100644 --- a/packages/protocol-kit/src/contracts/SafeWebAuthnSharedSigner/v0.2.1/SafeWebAuthnSharedSignerContract_v0_2_1.ts +++ b/packages/protocol-kit/src/contracts/SafeWebAuthnSharedSigner/v0.2.1/SafeWebAuthnSharedSignerContract_v0_2_1.ts @@ -7,6 +7,7 @@ import { SafeWebAuthnSharedSigner_0_2_1_ContractArtifacts } from '@safe-global/types-kit' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' /** * SafeWebAuthnSharedSignerContract_v0_2_1 is the implementation specific to the SafeWebAuthnSharedSigner contract version 0.2.1. @@ -28,17 +29,27 @@ class SafeWebAuthnSharedSignerContract_v0_2_1 * @param safeVersion - The version of the Safe contract. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 0.2.1 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, safeVersion: SafeVersion, customContractAddress?: string, - customContractAbi?: SafeWebAuthnSharedSignerContract_v0_2_1_Abi + customContractAbi?: SafeWebAuthnSharedSignerContract_v0_2_1_Abi, + deploymentType?: DeploymentType ) { const defaultAbi = SafeWebAuthnSharedSigner_0_2_1_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } /** diff --git a/packages/protocol-kit/src/contracts/SafeWebAuthnSignerFactory/SafeWebAuthnSignerFactoryBaseContract.ts b/packages/protocol-kit/src/contracts/SafeWebAuthnSignerFactory/SafeWebAuthnSignerFactoryBaseContract.ts index defdc2558..b5c63f4fb 100644 --- a/packages/protocol-kit/src/contracts/SafeWebAuthnSignerFactory/SafeWebAuthnSignerFactoryBaseContract.ts +++ b/packages/protocol-kit/src/contracts/SafeWebAuthnSignerFactory/SafeWebAuthnSignerFactoryBaseContract.ts @@ -1,5 +1,6 @@ import { Abi } from 'abitype' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import BaseContract from '@safe-global/protocol-kit/contracts/BaseContract' import { SafeVersion, @@ -39,6 +40,7 @@ abstract class SafeWebAuthnSignerFactoryBaseContract< * @param safeVersion - The version of the Safe contract. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the ABI is derived from the Safe deployments or the defaultAbi is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, @@ -46,7 +48,8 @@ abstract class SafeWebAuthnSignerFactoryBaseContract< defaultAbi: SafeWebAuthnSignerFactoryContractAbiType, safeVersion: SafeVersion, customContractAddress?: string, - customContractAbi?: SafeWebAuthnSignerFactoryContractAbiType + customContractAbi?: SafeWebAuthnSignerFactoryContractAbiType, + deploymentType?: DeploymentType ) { const contractName = 'safeWebAuthnSignerFactoryVersion' @@ -57,7 +60,8 @@ abstract class SafeWebAuthnSignerFactoryBaseContract< defaultAbi, safeVersion, customContractAddress, - customContractAbi + customContractAbi, + deploymentType ) this.contractName = contractName diff --git a/packages/protocol-kit/src/contracts/SafeWebAuthnSignerFactory/v0.2.1/SafeWebAuthnSignerFactoryContract_v0_2_1.ts b/packages/protocol-kit/src/contracts/SafeWebAuthnSignerFactory/v0.2.1/SafeWebAuthnSignerFactoryContract_v0_2_1.ts index 44c9ac03c..de671e062 100644 --- a/packages/protocol-kit/src/contracts/SafeWebAuthnSignerFactory/v0.2.1/SafeWebAuthnSignerFactoryContract_v0_2_1.ts +++ b/packages/protocol-kit/src/contracts/SafeWebAuthnSignerFactory/v0.2.1/SafeWebAuthnSignerFactoryContract_v0_2_1.ts @@ -7,6 +7,7 @@ import { SafeWebAuthnSignerFactory_0_2_1_ContractArtifacts } from '@safe-global/types-kit' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' /** * SafeWebAuthnSignerFactoryContract_v0_2_1 is the implementation specific to the SafeWebAuthnSigner Factory contract version 0.2.1. @@ -28,17 +29,27 @@ class SafeWebAuthnSignerFactoryContract_v0_2_1 * @param safeVersion - The version of the Safe contract. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 0.2.1 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, safeVersion: SafeVersion, customContractAddress?: string, - customContractAbi?: SafeWebAuthnSignerFactoryContract_v0_2_1_Abi + customContractAbi?: SafeWebAuthnSignerFactoryContract_v0_2_1_Abi, + deploymentType?: DeploymentType ) { const defaultAbi = SafeWebAuthnSignerFactory_0_2_1_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } /** diff --git a/packages/protocol-kit/src/contracts/SignMessageLib/SignMessageLibBaseContract.ts b/packages/protocol-kit/src/contracts/SignMessageLib/SignMessageLibBaseContract.ts index f1fe03193..639952ce2 100644 --- a/packages/protocol-kit/src/contracts/SignMessageLib/SignMessageLibBaseContract.ts +++ b/packages/protocol-kit/src/contracts/SignMessageLib/SignMessageLibBaseContract.ts @@ -1,6 +1,7 @@ import { Abi } from 'abitype' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeVersion } from '@safe-global/types-kit' import BaseContract from '@safe-global/protocol-kit/contracts/BaseContract' import { contractName } from '@safe-global/protocol-kit/contracts/config' @@ -33,6 +34,7 @@ abstract class SignMessageLibBaseContract< * @param safeVersion - The version of the SignMessageLib contract. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the SignMessageLib deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the ABI is derived from the SignMessageLib deployments or the defaultAbi is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, @@ -40,7 +42,8 @@ abstract class SignMessageLibBaseContract< defaultAbi: SignMessageLibContractAbiType, safeVersion: SafeVersion, customContractAddress?: string, - customContractAbi?: SignMessageLibContractAbiType + customContractAbi?: SignMessageLibContractAbiType, + deploymentType?: DeploymentType ) { const contractName = 'signMessageLibVersion' @@ -51,7 +54,8 @@ abstract class SignMessageLibBaseContract< defaultAbi, safeVersion, customContractAddress, - customContractAbi + customContractAbi, + deploymentType ) this.contractName = contractName diff --git a/packages/protocol-kit/src/contracts/SignMessageLib/v1.3.0/SignMessageLibContract_v1_3_0.ts b/packages/protocol-kit/src/contracts/SignMessageLib/v1.3.0/SignMessageLibContract_v1_3_0.ts index d02dfb02d..88850c558 100644 --- a/packages/protocol-kit/src/contracts/SignMessageLib/v1.3.0/SignMessageLibContract_v1_3_0.ts +++ b/packages/protocol-kit/src/contracts/SignMessageLib/v1.3.0/SignMessageLibContract_v1_3_0.ts @@ -1,6 +1,7 @@ import { toTxResult } from '@safe-global/protocol-kit/contracts/utils' import SignMessageLibBaseContract from '@safe-global/protocol-kit/contracts/SignMessageLib/SignMessageLibBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeContractFunction, SignMessageLibContract_v1_3_0_Abi, @@ -28,17 +29,27 @@ class SignMessageLibContract_v1_3_0 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the SignMessageLib deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.3.0 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: SignMessageLibContract_v1_3_0_Abi + customContractAbi?: SignMessageLibContract_v1_3_0_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.3.0' const defaultAbi = signMessageLib_1_3_0_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } /** * @param args - Array[message] diff --git a/packages/protocol-kit/src/contracts/SignMessageLib/v1.4.1/SignMessageLibContract_v1_4_1.ts b/packages/protocol-kit/src/contracts/SignMessageLib/v1.4.1/SignMessageLibContract_v1_4_1.ts index 8a7290cee..3fbdefb31 100644 --- a/packages/protocol-kit/src/contracts/SignMessageLib/v1.4.1/SignMessageLibContract_v1_4_1.ts +++ b/packages/protocol-kit/src/contracts/SignMessageLib/v1.4.1/SignMessageLibContract_v1_4_1.ts @@ -1,6 +1,7 @@ import { toTxResult } from '@safe-global/protocol-kit/contracts/utils' import SignMessageLibBaseContract from '@safe-global/protocol-kit/contracts/SignMessageLib/SignMessageLibBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeContractFunction, SignMessageLibContract_v1_4_1_Abi, @@ -28,17 +29,27 @@ class SignMessageLibContract_v1_4_1 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the SignMessageLib deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.4.1 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: SignMessageLibContract_v1_4_1_Abi + customContractAbi?: SignMessageLibContract_v1_4_1_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.4.1' const defaultAbi = signMessageLib_1_4_1_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } /** diff --git a/packages/protocol-kit/src/contracts/SimulateTxAccessor/SimulateTxAccessorBaseContract.ts b/packages/protocol-kit/src/contracts/SimulateTxAccessor/SimulateTxAccessorBaseContract.ts index d9fdea151..d43fc1c7a 100644 --- a/packages/protocol-kit/src/contracts/SimulateTxAccessor/SimulateTxAccessorBaseContract.ts +++ b/packages/protocol-kit/src/contracts/SimulateTxAccessor/SimulateTxAccessorBaseContract.ts @@ -2,6 +2,7 @@ import { Abi } from 'abitype' import BaseContract from '@safe-global/protocol-kit/contracts/BaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeVersion } from '@safe-global/types-kit' import { contractName } from '@safe-global/protocol-kit/contracts/config' @@ -33,6 +34,7 @@ abstract class SimulateTxAccessorBaseContract< * @param safeVersion - The version of the Safe contract. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the Safe deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the ABI is derived from the Safe deployments or the defaultAbi is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, @@ -40,7 +42,8 @@ abstract class SimulateTxAccessorBaseContract< defaultAbi: SimulateTxAccessorContractAbiType, safeVersion: SafeVersion, customContractAddress?: string, - customContractAbi?: SimulateTxAccessorContractAbiType + customContractAbi?: SimulateTxAccessorContractAbiType, + deploymentType?: DeploymentType ) { const contractName = 'simulateTxAccessorVersion' @@ -51,7 +54,8 @@ abstract class SimulateTxAccessorBaseContract< defaultAbi, safeVersion, customContractAddress, - customContractAbi + customContractAbi, + deploymentType ) this.contractName = contractName diff --git a/packages/protocol-kit/src/contracts/SimulateTxAccessor/v1.3.0/SimulateTxAccessorContract_v1_3_0.ts b/packages/protocol-kit/src/contracts/SimulateTxAccessor/v1.3.0/SimulateTxAccessorContract_v1_3_0.ts index e20f3ceb6..f8fbf2cd3 100644 --- a/packages/protocol-kit/src/contracts/SimulateTxAccessor/v1.3.0/SimulateTxAccessorContract_v1_3_0.ts +++ b/packages/protocol-kit/src/contracts/SimulateTxAccessor/v1.3.0/SimulateTxAccessorContract_v1_3_0.ts @@ -1,5 +1,6 @@ import SimulateTxAccessorBaseContract from '@safe-global/protocol-kit/contracts/SimulateTxAccessor/SimulateTxAccessorBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { simulateTxAccessor_1_3_0_ContractArtifacts, SimulateTxAccessorContract_v1_3_0_Abi, @@ -28,17 +29,27 @@ class SimulateTxAccessorContract_v1_3_0 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the SimulateTxAccessor deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.3.0 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: SimulateTxAccessorContract_v1_3_0_Abi + customContractAbi?: SimulateTxAccessorContract_v1_3_0_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.3.0' const defaultAbi = simulateTxAccessor_1_3_0_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } /** diff --git a/packages/protocol-kit/src/contracts/SimulateTxAccessor/v1.4.1/SimulateTxAccessorContract_v1_4_1.ts b/packages/protocol-kit/src/contracts/SimulateTxAccessor/v1.4.1/SimulateTxAccessorContract_v1_4_1.ts index cd8ac2ba3..c92eeb1fe 100644 --- a/packages/protocol-kit/src/contracts/SimulateTxAccessor/v1.4.1/SimulateTxAccessorContract_v1_4_1.ts +++ b/packages/protocol-kit/src/contracts/SimulateTxAccessor/v1.4.1/SimulateTxAccessorContract_v1_4_1.ts @@ -1,5 +1,6 @@ import SimulateTxAccessorBaseContract from '@safe-global/protocol-kit/contracts/SimulateTxAccessor/SimulateTxAccessorBaseContract' import SafeProvider from '@safe-global/protocol-kit/SafeProvider' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { simulateTxAccessor_1_4_1_ContractArtifacts, SimulateTxAccessorContract_v1_4_1_Abi, @@ -26,17 +27,27 @@ class SimulateTxAccessorContract_v1_4_1 * @param safeProvider - An instance of SafeProvider. * @param customContractAddress - Optional custom address for the contract. If not provided, the address is derived from the SimulateTxAccessor deployments based on the chainId and safeVersion. * @param customContractAbi - Optional custom ABI for the contract. If not provided, the default ABI for version 1.4.1 is used. + * @param deploymentType - Optional deployment type for the contract. If not provided, the first deployment retrieved from the safe-deployments array will be used. */ constructor( chainId: bigint, safeProvider: SafeProvider, customContractAddress?: string, - customContractAbi?: SimulateTxAccessorContract_v1_4_1_Abi + customContractAbi?: SimulateTxAccessorContract_v1_4_1_Abi, + deploymentType?: DeploymentType ) { const safeVersion = '1.4.1' const defaultAbi = simulateTxAccessor_1_4_1_ContractArtifacts.abi - super(chainId, safeProvider, defaultAbi, safeVersion, customContractAddress, customContractAbi) + super( + chainId, + safeProvider, + defaultAbi, + safeVersion, + customContractAddress, + customContractAbi, + deploymentType + ) } /** diff --git a/packages/protocol-kit/src/contracts/config.ts b/packages/protocol-kit/src/contracts/config.ts index 11c80da1e..115dfe7be 100644 --- a/packages/protocol-kit/src/contracts/config.ts +++ b/packages/protocol-kit/src/contracts/config.ts @@ -1,15 +1,16 @@ import { DeploymentFilter, SingletonDeployment, - getCompatibilityFallbackHandlerDeployment, - getCreateCallDeployment, - getMultiSendCallOnlyDeployment, - getMultiSendDeployment, - getProxyFactoryDeployment, - getSafeL2SingletonDeployment, - getSafeSingletonDeployment, - getSignMessageLibDeployment, - getSimulateTxAccessorDeployment + SingletonDeploymentV2, + getCompatibilityFallbackHandlerDeployments, + getCreateCallDeployments, + getMultiSendCallOnlyDeployments, + getMultiSendDeployments, + getProxyFactoryDeployments, + getSafeL2SingletonDeployments, + getSafeSingletonDeployments, + getSignMessageLibDeployments, + getSimulateTxAccessorDeployments } from '@safe-global/safe-deployments' import { Deployment, @@ -17,6 +18,7 @@ import { getSafeWebAuthnShareSignerDeployment } from '@safe-global/safe-modules-deployments' import { SafeVersion } from '@safe-global/types-kit' +import { DeploymentType } from '../types' export const DEFAULT_SAFE_VERSION: SafeVersion = '1.3.0' export const SAFE_BASE_VERSION: SafeVersion = '1.0.0' @@ -39,6 +41,12 @@ type SafeDeploymentsVersions = Record export type contractName = keyof contractNames +export type ContractInfo = { + version: string + type: DeploymentType + contractName: contractName +} + export const safeDeploymentsVersions: SafeDeploymentsVersions = { '1.4.1': { safeSingletonVersion: '1.4.1', @@ -110,17 +118,19 @@ export const safeDeploymentsL1ChainIds = [ const contractFunctions: Record< contractName, - (filter?: DeploymentFilter) => SingletonDeployment | undefined | Deployment + ( + filter?: DeploymentFilter + ) => SingletonDeployment | SingletonDeploymentV2 | undefined | Deployment > = { - safeSingletonVersion: getSafeSingletonDeployment, - safeSingletonL2Version: getSafeL2SingletonDeployment, - safeProxyFactoryVersion: getProxyFactoryDeployment, - compatibilityFallbackHandler: getCompatibilityFallbackHandlerDeployment, - multiSendVersion: getMultiSendDeployment, - multiSendCallOnlyVersion: getMultiSendCallOnlyDeployment, - signMessageLibVersion: getSignMessageLibDeployment, - createCallVersion: getCreateCallDeployment, - simulateTxAccessorVersion: getSimulateTxAccessorDeployment, + safeSingletonVersion: getSafeSingletonDeployments, + safeSingletonL2Version: getSafeL2SingletonDeployments, + safeProxyFactoryVersion: getProxyFactoryDeployments, + compatibilityFallbackHandler: getCompatibilityFallbackHandlerDeployments, + multiSendVersion: getMultiSendDeployments, + multiSendCallOnlyVersion: getMultiSendCallOnlyDeployments, + signMessageLibVersion: getSignMessageLibDeployments, + createCallVersion: getCreateCallDeployments, + simulateTxAccessorVersion: getSimulateTxAccessorDeployments, safeWebAuthnSignerFactoryVersion: getSafeWebAuthnSignerFactoryDeployment, safeWebAuthnSharedSignerVersion: getSafeWebAuthnShareSignerDeployment } @@ -142,3 +152,46 @@ export function getContractDeployment( return deployment } + +export function getContractInfo(contractAddress: string): ContractInfo | undefined { + for (const [safeVersion, contracts] of Object.entries(safeDeploymentsVersions)) { + for (const [contractName, contractVersion] of Object.entries(contracts)) { + const filters: DeploymentFilter = { + version: contractVersion, + released: true + } + + const deployment = contractFunctions[contractName as contractName]( + filters + ) as SingletonDeployment + + 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) as DeploymentType[] + + const type = types.find( + (t) => + deployment.deployments[t]?.address.toLowerCase() === contractAddress.toLowerCase() + ) + + if (type) { + return { + version: safeVersion, + type, + contractName: contractName as contractName + } + } + } + } + } + } + } + + return undefined +} diff --git a/packages/protocol-kit/src/contracts/contractInstances.ts b/packages/protocol-kit/src/contracts/contractInstances.ts index 9d28b9d59..7f25efb85 100644 --- a/packages/protocol-kit/src/contracts/contractInstances.ts +++ b/packages/protocol-kit/src/contracts/contractInstances.ts @@ -1,4 +1,5 @@ import { Abi } from 'viem' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeVersion, SafeContract_v1_3_0_Abi, @@ -57,7 +58,8 @@ export async function getSafeContractInstance( safeProvider: SafeProvider, contractAddress?: string, customContractAbi?: Abi, - isL1SafeSingleton?: boolean + isL1SafeSingleton?: boolean, + deploymentType?: DeploymentType ): Promise< | SafeContract_v1_4_1 | SafeContract_v1_3_0 @@ -75,7 +77,8 @@ export async function getSafeContractInstance( safeProvider, isL1SafeSingleton, contractAddress, - customContractAbi as SafeContract_v1_4_1_Abi + customContractAbi as SafeContract_v1_4_1_Abi, + deploymentType ) break case '1.3.0': @@ -84,7 +87,8 @@ export async function getSafeContractInstance( safeProvider, isL1SafeSingleton, contractAddress, - customContractAbi as SafeContract_v1_3_0_Abi + customContractAbi as SafeContract_v1_3_0_Abi, + deploymentType ) break case '1.2.0': @@ -93,7 +97,8 @@ export async function getSafeContractInstance( safeProvider, isL1SafeSingleton, contractAddress, - customContractAbi as SafeContract_v1_2_0_Abi + customContractAbi as SafeContract_v1_2_0_Abi, + deploymentType ) break case '1.1.1': @@ -102,7 +107,8 @@ export async function getSafeContractInstance( safeProvider, isL1SafeSingleton, contractAddress, - customContractAbi as SafeContract_v1_1_1_Abi + customContractAbi as SafeContract_v1_1_1_Abi, + deploymentType ) break case '1.0.0': @@ -111,7 +117,8 @@ export async function getSafeContractInstance( safeProvider, isL1SafeSingleton, contractAddress, - customContractAbi as SafeContract_v1_0_0_Abi + customContractAbi as SafeContract_v1_0_0_Abi, + deploymentType ) break default: @@ -127,7 +134,8 @@ export async function getCompatibilityFallbackHandlerContractInstance( safeVersion: SafeVersion, safeProvider: SafeProvider, contractAddress?: string, - customContractAbi?: Abi + customContractAbi?: Abi, + deploymentType?: DeploymentType ): Promise< CompatibilityFallbackHandlerContract_v1_4_1 | CompatibilityFallbackHandlerContract_v1_3_0 > { @@ -140,7 +148,8 @@ export async function getCompatibilityFallbackHandlerContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as CompatibilityFallbackHandlerContract_v1_4_1_Abi + customContractAbi as CompatibilityFallbackHandlerContract_v1_4_1_Abi, + deploymentType ) break case '1.3.0': @@ -150,7 +159,8 @@ export async function getCompatibilityFallbackHandlerContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as CompatibilityFallbackHandlerContract_v1_3_0_Abi + customContractAbi as CompatibilityFallbackHandlerContract_v1_3_0_Abi, + deploymentType ) break default: @@ -166,7 +176,8 @@ export async function getMultiSendContractInstance( safeVersion: SafeVersion, safeProvider: SafeProvider, contractAddress?: string, - customContractAbi?: Abi + customContractAbi?: Abi, + deploymentType?: DeploymentType ): Promise { const chainId = await safeProvider.getChainId() let multiSendContractInstance @@ -177,7 +188,8 @@ export async function getMultiSendContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as MultiSendContract_v1_4_1_Abi + customContractAbi as MultiSendContract_v1_4_1_Abi, + deploymentType ) break case '1.3.0': @@ -185,7 +197,8 @@ export async function getMultiSendContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as MultiSendContract_v1_3_0_Abi + customContractAbi as MultiSendContract_v1_3_0_Abi, + deploymentType ) break case '1.2.0': @@ -195,7 +208,8 @@ export async function getMultiSendContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as MultiSendContract_v1_1_1_Abi + customContractAbi as MultiSendContract_v1_1_1_Abi, + deploymentType ) break default: @@ -211,7 +225,8 @@ export async function getMultiSendCallOnlyContractInstance( safeVersion: SafeVersion, safeProvider: SafeProvider, contractAddress?: string, - customContractAbi?: Abi + customContractAbi?: Abi, + deploymentType?: DeploymentType ): Promise { const chainId = await safeProvider.getChainId() let multiSendCallOnlyContractInstance @@ -222,7 +237,8 @@ export async function getMultiSendCallOnlyContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as MultiSendCallOnlyContract_v1_4_1_Abi + customContractAbi as MultiSendCallOnlyContract_v1_4_1_Abi, + deploymentType ) break case '1.3.0': @@ -233,7 +249,8 @@ export async function getMultiSendCallOnlyContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as MultiSendCallOnlyContract_v1_3_0_Abi + customContractAbi as MultiSendCallOnlyContract_v1_3_0_Abi, + deploymentType ) break default: @@ -249,7 +266,8 @@ export async function getSafeProxyFactoryContractInstance( safeVersion: SafeVersion, safeProvider: SafeProvider, contractAddress?: string, - customContractAbi?: Abi + customContractAbi?: Abi, + deploymentType?: DeploymentType ): Promise< | SafeProxyFactoryContract_v1_4_1 | SafeProxyFactoryContract_v1_3_0 @@ -265,7 +283,8 @@ export async function getSafeProxyFactoryContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as SafeProxyFactoryContract_v1_4_1_Abi + customContractAbi as SafeProxyFactoryContract_v1_4_1_Abi, + deploymentType ) break case '1.3.0': @@ -273,7 +292,8 @@ export async function getSafeProxyFactoryContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as SafeProxyFactoryContract_v1_3_0_Abi + customContractAbi as SafeProxyFactoryContract_v1_3_0_Abi, + deploymentType ) break case '1.2.0': @@ -282,7 +302,8 @@ export async function getSafeProxyFactoryContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as SafeProxyFactoryContract_v1_1_1_Abi + customContractAbi as SafeProxyFactoryContract_v1_1_1_Abi, + deploymentType ) break case '1.0.0': @@ -290,7 +311,8 @@ export async function getSafeProxyFactoryContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as SafeProxyFactoryContract_v1_0_0_Abi + customContractAbi as SafeProxyFactoryContract_v1_0_0_Abi, + deploymentType ) break default: @@ -306,7 +328,8 @@ export async function getSignMessageLibContractInstance( safeVersion: SafeVersion, safeProvider: SafeProvider, contractAddress?: string, - customContractAbi?: Abi + customContractAbi?: Abi, + deploymentType?: DeploymentType ): Promise { const chainId = await safeProvider.getChainId() let signMessageLibContractInstance @@ -317,7 +340,8 @@ export async function getSignMessageLibContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as SignMessageLibContract_v1_4_1_Abi + customContractAbi as SignMessageLibContract_v1_4_1_Abi, + deploymentType ) break case '1.3.0': @@ -325,7 +349,8 @@ export async function getSignMessageLibContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as SignMessageLibContract_v1_3_0_Abi + customContractAbi as SignMessageLibContract_v1_3_0_Abi, + deploymentType ) break default: @@ -341,7 +366,8 @@ export async function getCreateCallContractInstance( safeVersion: SafeVersion, safeProvider: SafeProvider, contractAddress?: string, - customContractAbi?: Abi + customContractAbi?: Abi, + deploymentType?: DeploymentType ): Promise { const chainId = await safeProvider.getChainId() let createCallContractInstance @@ -352,7 +378,8 @@ export async function getCreateCallContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as CreateCallContract_v1_4_1_Abi + customContractAbi as CreateCallContract_v1_4_1_Abi, + deploymentType ) break case '1.3.0': @@ -363,7 +390,8 @@ export async function getCreateCallContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as CreateCallContract_v1_3_0_Abi + customContractAbi as CreateCallContract_v1_3_0_Abi, + deploymentType ) break default: @@ -379,7 +407,8 @@ export async function getSimulateTxAccessorContractInstance( safeVersion: SafeVersion, safeProvider: SafeProvider, contractAddress?: string, - customContractAbi?: Abi + customContractAbi?: Abi, + deploymentType?: DeploymentType ): Promise { const chainId = await safeProvider.getChainId() let simulateTxAccessorContractInstance @@ -390,7 +419,8 @@ export async function getSimulateTxAccessorContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as SimulateTxAccessorContract_v1_4_1_Abi + customContractAbi as SimulateTxAccessorContract_v1_4_1_Abi, + deploymentType ) break case '1.3.0': @@ -398,7 +428,8 @@ export async function getSimulateTxAccessorContractInstance( chainId, safeProvider, contractAddress, - customContractAbi as SimulateTxAccessorContract_v1_3_0_Abi + customContractAbi as SimulateTxAccessorContract_v1_3_0_Abi, + deploymentType ) break default: @@ -414,7 +445,8 @@ export async function getSafeWebAuthnSignerFactoryContractInstance( safeVersion: SafeVersion, safeProvider: SafeProvider, contractAddress?: string, - customContractAbi?: Abi + customContractAbi?: Abi, + deploymentType?: DeploymentType ): Promise { const chainId = await safeProvider.getChainId() @@ -427,7 +459,8 @@ export async function getSafeWebAuthnSignerFactoryContractInstance( safeProvider, safeVersion, contractAddress, - customContractAbi as SafeWebAuthnSignerFactoryContract_v0_2_1_Abi + customContractAbi as SafeWebAuthnSignerFactoryContract_v0_2_1_Abi, + deploymentType ) await safeWebAuthnSignerFactoryContractInstance.init() @@ -443,7 +476,8 @@ export async function getSafeWebAuthnSharedSignerContractInstance( safeVersion: SafeVersion, safeProvider: SafeProvider, contractAddress?: string, - customContractAbi?: Abi + customContractAbi?: Abi, + deploymentType?: DeploymentType ): Promise { const chainId = await safeProvider.getChainId() @@ -455,7 +489,8 @@ export async function getSafeWebAuthnSharedSignerContractInstance( safeProvider, safeVersion, contractAddress, - customContractAbi as SafeWebAuthnSharedSignerContract_v0_2_1_Abi + customContractAbi as SafeWebAuthnSharedSignerContract_v0_2_1_Abi, + deploymentType ) await safeWebAuthnSharedSignerContractInstance.init() diff --git a/packages/protocol-kit/src/contracts/safeDeploymentContracts.ts b/packages/protocol-kit/src/contracts/safeDeploymentContracts.ts index 073b38c07..9e2685c42 100644 --- a/packages/protocol-kit/src/contracts/safeDeploymentContracts.ts +++ b/packages/protocol-kit/src/contracts/safeDeploymentContracts.ts @@ -15,6 +15,7 @@ import { CompatibilityFallbackHandlerContractImplementationType, ContractNetworkConfig, CreateCallContractImplementationType, + DeploymentType, MultiSendCallOnlyContractImplementationType, MultiSendContractImplementationType, SafeContractImplementationType, @@ -30,6 +31,7 @@ export interface GetContractInstanceProps { safeProvider: SafeProvider safeVersion: SafeVersion customContracts?: ContractNetworkConfig + deploymentType?: DeploymentType } export interface GetSafeContractInstanceProps extends GetContractInstanceProps { @@ -42,14 +44,16 @@ export async function getSafeContract({ safeVersion, customSafeAddress, isL1SafeSingleton, - customContracts + customContracts, + deploymentType }: GetSafeContractInstanceProps): Promise { const safeContract = await getSafeContractInstance( safeVersion, safeProvider, customSafeAddress ?? customContracts?.safeSingletonAddress, customContracts?.safeSingletonAbi, - isL1SafeSingleton + isL1SafeSingleton, + deploymentType ) const isContractDeployed = await safeProvider.isContractDeployed(safeContract.getAddress()) @@ -62,13 +66,15 @@ export async function getSafeContract({ export async function getSafeProxyFactoryContract({ safeProvider, safeVersion, - customContracts + customContracts, + deploymentType }: GetContractInstanceProps): Promise { const safeProxyFactoryContract = await getSafeProxyFactoryContractInstance( safeVersion, safeProvider, customContracts?.safeProxyFactoryAddress, - customContracts?.safeProxyFactoryAbi + customContracts?.safeProxyFactoryAbi, + deploymentType ) const isContractDeployed = await safeProvider.isContractDeployed( @@ -83,13 +89,15 @@ export async function getSafeProxyFactoryContract({ export async function getCompatibilityFallbackHandlerContract({ safeProvider, safeVersion, - customContracts + customContracts, + deploymentType }: GetContractInstanceProps): Promise { const fallbackHandlerContract = await getCompatibilityFallbackHandlerContractInstance( safeVersion, safeProvider, customContracts?.fallbackHandlerAddress, - customContracts?.fallbackHandlerAbi + customContracts?.fallbackHandlerAbi, + deploymentType ) const isContractDeployed = await safeProvider.isContractDeployed( diff --git a/packages/protocol-kit/src/contracts/utils.ts b/packages/protocol-kit/src/contracts/utils.ts index fc0074ed3..12e30903d 100644 --- a/packages/protocol-kit/src/contracts/utils.ts +++ b/packages/protocol-kit/src/contracts/utils.ts @@ -15,6 +15,7 @@ import { waitForTransactionReceipt } from 'viem/actions' import { DEFAULT_SAFE_VERSION } from '@safe-global/protocol-kit/contracts/config' import { EMPTY_DATA, ZERO_ADDRESS } from '@safe-global/protocol-kit/utils/constants' import { createMemoizedFunction } from '@safe-global/protocol-kit/utils/memoized' +import { DeploymentType } from '@safe-global/protocol-kit/types' import { SafeProxyFactoryContractType, SafeVersion, @@ -79,6 +80,7 @@ export interface encodeSetupCallDataProps { safeContract: SafeContractImplementationType customContracts?: ContractNetworkConfig customSafeVersion?: SafeVersion + deploymentType?: DeploymentType } export function encodeCreateProxyWithNonce( @@ -103,7 +105,8 @@ export async function encodeSetupCallData({ safeAccountConfig, safeContract, customContracts, - customSafeVersion + customSafeVersion, + deploymentType }: encodeSetupCallDataProps): Promise { const { owners, @@ -136,7 +139,8 @@ export async function encodeSetupCallData({ const fallbackHandlerContract = await memoizedGetCompatibilityFallbackHandlerContract({ safeProvider, safeVersion, - customContracts + customContracts, + deploymentType }) fallbackHandlerAddress = fallbackHandlerContract.getAddress() @@ -155,12 +159,23 @@ export async function encodeSetupCallData({ } // we need to include the chainId as string to prevent memoization issues see: https://github.com/safe-global/safe-core-sdk/issues/598 -type MemoizedGetProxyFactoryContractProps = GetContractInstanceProps & { chainId: string } -type MemoizedGetSafeContractInstanceProps = GetSafeContractInstanceProps & { chainId: string } +type MemoizedGetProxyFactoryContractProps = GetContractInstanceProps & { + chainId: string + deploymentType?: DeploymentType +} +type MemoizedGetSafeContractInstanceProps = GetSafeContractInstanceProps & { + chainId: string + deploymentType?: DeploymentType +} const memoizedGetProxyFactoryContract = createMemoizedFunction( - ({ safeProvider, safeVersion, customContracts }: MemoizedGetProxyFactoryContractProps) => - getSafeProxyFactoryContract({ safeProvider, safeVersion, customContracts }) + ({ + safeProvider, + safeVersion, + customContracts, + deploymentType + }: MemoizedGetProxyFactoryContractProps) => + getSafeProxyFactoryContract({ safeProvider, safeVersion, customContracts, deploymentType }) ) const memoizedGetProxyCreationCode = createMemoizedFunction( @@ -168,13 +183,15 @@ const memoizedGetProxyCreationCode = createMemoizedFunction( safeProvider, safeVersion, customContracts, - chainId + chainId, + deploymentType }: MemoizedGetProxyFactoryContractProps) => { const safeProxyFactoryContract = await memoizedGetProxyFactoryContract({ safeProvider, safeVersion, customContracts, - chainId + chainId, + deploymentType }) return safeProxyFactoryContract.proxyCreationCode() @@ -186,9 +203,16 @@ const memoizedGetSafeContract = createMemoizedFunction( safeProvider, safeVersion, isL1SafeSingleton, - customContracts + customContracts, + deploymentType }: MemoizedGetSafeContractInstanceProps) => - getSafeContract({ safeProvider, safeVersion, isL1SafeSingleton, customContracts }) + getSafeContract({ + safeProvider, + safeVersion, + isL1SafeSingleton, + customContracts, + deploymentType + }) ) /** @@ -235,14 +259,16 @@ export async function getPredictedSafeAddressInitCode({ const { safeVersion = DEFAULT_SAFE_VERSION, - saltNonce = getChainSpecificDefaultSaltNonce(chainId) + saltNonce = getChainSpecificDefaultSaltNonce(chainId), + deploymentType } = safeDeploymentConfig const safeProxyFactoryContract = await memoizedGetProxyFactoryContract({ safeProvider, safeVersion, customContracts, - chainId: chainId.toString() + chainId: chainId.toString(), + deploymentType }) const safeContract = await memoizedGetSafeContract({ @@ -250,7 +276,8 @@ export async function getPredictedSafeAddressInitCode({ safeVersion, isL1SafeSingleton, customContracts, - chainId: chainId.toString() + chainId: chainId.toString(), + deploymentType }) const initializer = await encodeSetupCallData({ @@ -258,7 +285,8 @@ export async function getPredictedSafeAddressInitCode({ safeAccountConfig, safeContract, customContracts, - customSafeVersion: safeVersion // it is more efficient if we provide the safeVersion manually + customSafeVersion: safeVersion, // it is more efficient if we provide the safeVersion manually + deploymentType }) const encodedNonce = safeProvider.encodeParameters('uint256', [saltNonce]) @@ -291,21 +319,24 @@ export async function predictSafeAddress({ const { safeVersion = DEFAULT_SAFE_VERSION, - saltNonce = getChainSpecificDefaultSaltNonce(chainId) + saltNonce = getChainSpecificDefaultSaltNonce(chainId), + deploymentType } = safeDeploymentConfig const safeProxyFactoryContract = await memoizedGetProxyFactoryContract({ safeProvider, safeVersion, customContracts, - chainId: chainId.toString() + chainId: chainId.toString(), + deploymentType }) const [proxyCreationCode] = await memoizedGetProxyCreationCode({ safeProvider, safeVersion, customContracts, - chainId: chainId.toString() + chainId: chainId.toString(), + deploymentType }) const safeContract = await memoizedGetSafeContract({ @@ -313,7 +344,8 @@ export async function predictSafeAddress({ safeVersion, isL1SafeSingleton, customContracts, - chainId: chainId.toString() + chainId: chainId.toString(), + deploymentType }) const initializer = await encodeSetupCallData({ @@ -321,7 +353,8 @@ export async function predictSafeAddress({ safeAccountConfig, safeContract, customContracts, - customSafeVersion: safeVersion // it is more efficient if we provide the safeVersion manually + customSafeVersion: safeVersion, // it is more efficient if we provide the safeVersion manuall + deploymentType }) const initializerHash = keccak256(asHex(initializer)) diff --git a/packages/protocol-kit/src/types/safeConfig.ts b/packages/protocol-kit/src/types/safeConfig.ts index 767cf770b..11d606ab9 100644 --- a/packages/protocol-kit/src/types/safeConfig.ts +++ b/packages/protocol-kit/src/types/safeConfig.ts @@ -14,9 +14,12 @@ export type SafeAccountConfig = { paymentReceiver?: string } +export type DeploymentType = 'canonical' | 'eip155' | 'zksync' + export type SafeDeploymentConfig = { saltNonce?: string safeVersion?: SafeVersion + deploymentType?: DeploymentType } export type PredictedSafeProps = { diff --git a/packages/protocol-kit/src/types/safeProvider.ts b/packages/protocol-kit/src/types/safeProvider.ts index 02ca734b8..6e5c40a6e 100644 --- a/packages/protocol-kit/src/types/safeProvider.ts +++ b/packages/protocol-kit/src/types/safeProvider.ts @@ -10,6 +10,8 @@ import { WalletActions, Hex } from 'viem' +import { SafeVersion } from '@safe-global/types-kit' +import { ContractNetworksConfig } from '@safe-global/protocol-kit/types' export type RequestArguments = { readonly method: string @@ -56,6 +58,15 @@ export type SafeProviderConfig = { signer?: HexAddress | PrivateKey | PasskeyArgType | PasskeyClient } +export type SafeProviderInitOptions = { + provider: SafeProviderConfig['provider'] + signer?: SafeProviderConfig['signer'] + safeVersion?: SafeVersion + contractNetworks?: ContractNetworksConfig + safeAddress?: string + owners?: string[] +} + export type SafeProviderTransaction = { to: string from: string diff --git a/packages/protocol-kit/src/utils/passkeys/createPasskeyDeploymentTransaction.ts b/packages/protocol-kit/src/utils/passkeys/createPasskeyDeploymentTransaction.ts index 7212ba557..5200bae86 100644 --- a/packages/protocol-kit/src/utils/passkeys/createPasskeyDeploymentTransaction.ts +++ b/packages/protocol-kit/src/utils/passkeys/createPasskeyDeploymentTransaction.ts @@ -19,14 +19,14 @@ async function createPasskeyDeploymentTransaction( const safeAddress = await safe.getAddress() const owners = await safe.getOwners() - const safePasskeyProvider = await SafeProvider.init( - safe.getSafeProvider().provider, - passkey, + const safePasskeyProvider = await SafeProvider.init({ + provider: safe.getSafeProvider().provider, + signer: passkey, safeVersion, - safe.getContractManager().contractNetworks, + contractNetworks: safe.getContractManager().contractNetworks, safeAddress, owners - ) + }) const passkeySigner = (await safePasskeyProvider.getExternalSigner()) as PasskeyClient const passkeyAddress = passkeySigner!.account.address diff --git a/packages/protocol-kit/src/utils/passkeys/getPasskeyOwnerAddress.ts b/packages/protocol-kit/src/utils/passkeys/getPasskeyOwnerAddress.ts index a44e71545..80fd6184c 100644 --- a/packages/protocol-kit/src/utils/passkeys/getPasskeyOwnerAddress.ts +++ b/packages/protocol-kit/src/utils/passkeys/getPasskeyOwnerAddress.ts @@ -14,14 +14,14 @@ async function getPasskeyOwnerAddress(safe: Safe, passkey: PasskeyArgType): Prom const safeAddress = await safe.getAddress() const owners = await safe.getOwners() - const safePasskeyProvider = await SafeProvider.init( - safe.getSafeProvider().provider, - passkey, + const safePasskeyProvider = await SafeProvider.init({ + provider: safe.getSafeProvider().provider, + signer: passkey, safeVersion, - safe.getContractManager().contractNetworks, + contractNetworks: safe.getContractManager().contractNetworks, safeAddress, owners - ) + }) const passkeySigner = await safePasskeyProvider.getExternalSigner() diff --git a/packages/protocol-kit/tests/e2e/contractInfo.test.ts b/packages/protocol-kit/tests/e2e/contractInfo.test.ts new file mode 100644 index 000000000..8d94c4119 --- /dev/null +++ b/packages/protocol-kit/tests/e2e/contractInfo.test.ts @@ -0,0 +1,99 @@ +import { setupTests } from '@safe-global/testing-kit' +import Safe from '@safe-global/protocol-kit/index' +import chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { getEip1193Provider } from './utils/setupProvider' + +chai.use(chaiAsPromised) + +describe('Contract Info', () => { + const provider = getEip1193Provider() + let protocolKit: Safe + + before(async () => { + const { safe, contractNetworks } = await setupTests() + const safeAddress = safe.address + + protocolKit = await Safe.init({ + provider, + safeAddress, + contractNetworks + }) + }) + + describe('create', async () => { + it('should return undefined for a contract address not related to Safe', async () => { + chai.expect( + protocolKit.getContractInfo({ + contractAddress: '0x1234567890123456789012345678901234567890' + }) + ).to.be.undefined + }) + + it('should return the contract info for SafeSingleton contracts', async () => { + chai + .expect( + protocolKit.getContractInfo({ + contractAddress: '0x69f4D1788e39c87893C980c06EdF4b7f686e2938' + }) + ) + .to.be.deep.equal({ + contractName: 'safeSingletonVersion', + type: 'eip155', + version: '1.3.0' + }) + + chai + .expect( + protocolKit.getContractInfo({ + contractAddress: '0xb6029EA3B2c51D09a50B53CA8012FeEB05bDa35A' + }) + ) + .to.be.deep.equal({ + contractName: 'safeSingletonVersion', + type: 'canonical', + version: '1.0.0' + }) + + chai + .expect( + protocolKit.getContractInfo({ + contractAddress: '0xB00ce5CCcdEf57e539ddcEd01DF43a13855d9910' + }) + ) + .to.be.deep.equal({ + contractName: 'safeSingletonVersion', + type: 'zksync', + version: '1.3.0' + }) + }) + + it('should return the contract info for a CompatibilityFallbackHandler contracts', async () => { + chai + .expect( + protocolKit.getContractInfo({ + contractAddress: '0xfd0732Dc9E303f09fCEf3a7388Ad10A83459Ec99' + }) + ) + .to.be.deep.equal({ + contractName: 'compatibilityFallbackHandler', + type: 'canonical', + version: '1.4.1' + }) + }) + + it('should return the contract info for a SignMessageLib contracts', async () => { + chai + .expect( + protocolKit.getContractInfo({ + contractAddress: '0xd53cd0aB83D845Ac265BE939c57F53AD838012c9' + }) + ) + .to.be.deep.equal({ + contractName: 'signMessageLibVersion', + type: 'canonical', + version: '1.4.1' + }) + }) + }) +}) diff --git a/packages/protocol-kit/tests/e2e/passkey.test.ts b/packages/protocol-kit/tests/e2e/passkey.test.ts index 8e04b77d1..a8ba67645 100644 --- a/packages/protocol-kit/tests/e2e/passkey.test.ts +++ b/packages/protocol-kit/tests/e2e/passkey.test.ts @@ -55,7 +55,7 @@ describe('Passkey', () => { const passkey2 = { ...(await createMockPasskey('brucelee')), customVerifierAddress } const provider = getEip1193Provider() - const safeProvider = await SafeProvider.init(provider) + const safeProvider = await SafeProvider.init({ provider }) const customContracts = contractNetworks?.[chainId.toString()] const safeWebAuthnSignerFactoryContract = await getSafeWebAuthnSignerFactoryContract({ @@ -70,8 +70,18 @@ describe('Passkey', () => { customContracts }) - const safeProvider1 = await SafeProvider.init(provider, passkey1, '1.4.1', contractNetworks) - const safeProvider2 = await SafeProvider.init(provider, passkey2, '1.4.1', contractNetworks) + const safeProvider1 = await SafeProvider.init({ + provider, + signer: passkey1, + safeVersion: '1.4.1', + contractNetworks + }) + const safeProvider2 = await SafeProvider.init({ + provider, + signer: passkey2, + safeVersion: '1.4.1', + contractNetworks + }) const passkeySigner1 = await safeProvider1.getExternalSigner() const passkeySigner2 = await safeProvider2.getExternalSigner() diff --git a/packages/protocol-kit/tests/e2e/safeContracts.test.ts b/packages/protocol-kit/tests/e2e/safeContracts.test.ts index c12a207b4..591d46e7f 100644 --- a/packages/protocol-kit/tests/e2e/safeContracts.test.ts +++ b/packages/protocol-kit/tests/e2e/safeContracts.test.ts @@ -33,7 +33,7 @@ import { chai.use(chaiAsPromised) -describe.only('Safe contracts', () => { +describe('Safe contracts', () => { const provider = getEip1193Provider() describe('getSafeContract', async () => { diff --git a/packages/protocol-kit/tests/e2e/safeProvider.test.ts b/packages/protocol-kit/tests/e2e/safeProvider.test.ts index ec58f7452..089b01ac4 100644 --- a/packages/protocol-kit/tests/e2e/safeProvider.test.ts +++ b/packages/protocol-kit/tests/e2e/safeProvider.test.ts @@ -37,7 +37,9 @@ describe('Safe provider', () => { const passKeySigner = await createMockPasskey('aName') chai - .expect(SafeProvider.init(provider, passKeySigner, safeVersionDeployed)) + .expect( + SafeProvider.init({ provider, signer: passKeySigner, safeVersion: safeVersionDeployed }) + ) .to.be.rejectedWith( 'Current version of the Safe does not support the Passkey signer functionality' ) @@ -45,24 +47,26 @@ describe('Safe provider', () => { ) it('should return an external provider (PublicClient) and signer (WalletClient) when using an EIP1193 provider', async () => { - const safeProvider = await SafeProvider.init(provider) + const safeProvider = await SafeProvider.init({ provider }) chai.expect(safeProvider.getExternalProvider()).to.deep.include(publicActions) chai.expect(await safeProvider.getExternalSigner()).to.deep.include(walletActions) }) it('should return an external provider (PublicClient) and signer (WalletClient) when using a private key', async () => { - const safeProvider = await SafeProvider.init( - 'https://sepolia.gateway.tenderly.co', - '4ff03ace1395691975678c93449d552dc83df6b773a8024d4c368b39042a7610' - ) + const safeProvider = await SafeProvider.init({ + provider: 'https://sepolia.gateway.tenderly.co', + signer: '4ff03ace1395691975678c93449d552dc83df6b773a8024d4c368b39042a7610' + }) chai.expect(safeProvider.getExternalProvider()).to.deep.include(publicActions) chai.expect(await safeProvider.getExternalSigner()).to.deep.include(walletActions) }) it('should return an undefined signer when using an RPC without signer', async () => { - const safeProvider = await SafeProvider.init('https://sepolia.gateway.tenderly.co') + const safeProvider = await SafeProvider.init({ + provider: 'https://sepolia.gateway.tenderly.co' + }) chai.expect(safeProvider.getExternalProvider()).to.deep.include(publicActions) chai.expect(await safeProvider.getExternalSigner()).to.be.undefined diff --git a/packages/protocol-kit/tests/e2e/utilsContracts.test.ts b/packages/protocol-kit/tests/e2e/utilsContracts.test.ts index f60263336..9e2b3d45b 100644 --- a/packages/protocol-kit/tests/e2e/utilsContracts.test.ts +++ b/packages/protocol-kit/tests/e2e/utilsContracts.test.ts @@ -1,4 +1,5 @@ import chai from 'chai' +import { polygon, optimism, bsc, gnosis, base, avalanche } from 'viem/chains' import { getEip1193Provider, getSafeProviderFromNetwork } from './utils/setupProvider' import { PREDETERMINED_SALT_NONCE, @@ -651,5 +652,86 @@ describe('Contract utils', () => { chai.expect(mainnetPredictedSafeAddress).to.be.equal(expectedMainnetSafeAddress) } ) + + itif(safeVersionDeployed >= '1.3.0')( + 'returns the same predicted address based on the deploymentType for different chains', + async () => { + const { accounts } = await setupTests() + const [owner] = accounts + const safeVersion = safeVersionDeployed + + const safeAccountConfig: SafeAccountConfig = { + owners: [owner.address], + threshold: 1 + } + + const safeDeploymentConfig: SafeDeploymentConfig = { + safeVersion, + saltNonce: PREDETERMINED_SALT_NONCE, + deploymentType: 'canonical' + } + + const protocolKitPolygonMainnet = await Safe.init({ + provider: polygon.rpcUrls.default.http[0], + predictedSafe: { + safeAccountConfig, + safeDeploymentConfig + } + }) + + const protocolKitGnosis = await Safe.init({ + provider: gnosis.rpcUrls.default.http[0], + predictedSafe: { + safeAccountConfig, + safeDeploymentConfig + } + }) + + const protocolKitBNB = await Safe.init({ + provider: bsc.rpcUrls.default.http[0], + predictedSafe: { + safeAccountConfig, + safeDeploymentConfig + } + }) + + const protocolKitOptimism = await Safe.init({ + provider: optimism.rpcUrls.default.http[0], + predictedSafe: { + safeAccountConfig, + safeDeploymentConfig + } + }) + + const protocolKitBase = await Safe.init({ + provider: base.rpcUrls.default.http[0], + predictedSafe: { + safeAccountConfig, + safeDeploymentConfig + } + }) + + const protocolKitAvalanche = await Safe.init({ + provider: avalanche.rpcUrls.default.http[0], + predictedSafe: { + safeAccountConfig, + safeDeploymentConfig + } + }) + + const gnosisChainPredictedAddress = await protocolKitGnosis.getAddress() + const polygonChainPredictedAddress = await protocolKitPolygonMainnet.getAddress() + const bnbChainPredictedAddress = await protocolKitBNB.getAddress() + const optimismChainPredictedAddress = await protocolKitOptimism.getAddress() + const baseChainPredictedAddress = await protocolKitBase.getAddress() + const avalancheChainPredictedAddress = await protocolKitAvalanche.getAddress() + + chai.expect(gnosisChainPredictedAddress).to.be.equal(polygonChainPredictedAddress) + chai.expect(polygonChainPredictedAddress).to.be.equal(bnbChainPredictedAddress) + chai.expect(bnbChainPredictedAddress).to.be.equal(optimismChainPredictedAddress) + chai.expect(optimismChainPredictedAddress).to.be.equal(baseChainPredictedAddress) + chai.expect(baseChainPredictedAddress).to.be.equal(avalancheChainPredictedAddress) + } + ) }) }) diff --git a/packages/relay-kit/src/packs/safe-4337/Safe4337Pack.ts b/packages/relay-kit/src/packs/safe-4337/Safe4337Pack.ts index 1d09c2613..41e56cfa0 100644 --- a/packages/relay-kit/src/packs/safe-4337/Safe4337Pack.ts +++ b/packages/relay-kit/src/packs/safe-4337/Safe4337Pack.ts @@ -248,7 +248,7 @@ export class Safe4337Pack extends RelayKitBasePack<{ setupTransactions.push(approveToPaymasterTransaction) } - const safeProvider = await SafeProvider.init(provider, signer, safeVersion) + const safeProvider = await SafeProvider.init({ provider, signer, safeVersion }) // third transaction: passkey support via shared signer SafeWebAuthnSharedSigner // see: https://github.com/safe-global/safe-modules/blob/main/modules/passkey/contracts/4337/experimental/README.md