Skip to content

Commit

Permalink
Make SafeProvider.init options an object
Browse files Browse the repository at this point in the history
  • Loading branch information
yagopv committed Sep 24, 2024
1 parent 5c8d944 commit aa9c1e6
Show file tree
Hide file tree
Showing 9 changed files with 72 additions and 45 deletions.
24 changes: 10 additions & 14 deletions packages/protocol-kit/src/Safe.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,15 +124,13 @@ class Safe {
async #initializeProtocolKit(config: SafeConfig) {
const { provider, signer, isL1SafeSingleton, contractNetworks, predictedSafe } = config

this.#safeProvider = await SafeProvider.init(
this.#safeProvider = await SafeProvider.init({
provider,
signer,
DEFAULT_SAFE_VERSION,
safeVersion: DEFAULT_SAFE_VERSION,
contractNetworks,
undefined,
undefined,
predictedSafe?.safeDeploymentConfig?.deploymentType
)
deploymentType: predictedSafe?.safeDeploymentConfig?.deploymentType
})

if (isSafeConfigWithPredictedSafe(config)) {
this.#predictedSafe = config.predictedSafe
Expand All @@ -158,15 +156,13 @@ class Safe {
}

const safeVersion = await this.getContractVersion()
this.#safeProvider = await SafeProvider.init(
this.#safeProvider = await SafeProvider.init({
provider,
signer,
safeVersion,
contractNetworks,
undefined,
undefined,
this.#safeProvider.deploymentType
)
deploymentType: this.#safeProvider.deploymentType
})

this.#ownerManager = new OwnerManager(this.#safeProvider, this.#contractManager.safeContract)
this.#moduleManager = new ModuleManager(this.#safeProvider, this.#contractManager.safeContract)
Expand All @@ -180,15 +176,15 @@ 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,
this.#safeProvider.deploymentType
)
deploymentType: this.#safeProvider.deploymentType
})
}
}

Expand Down
7 changes: 6 additions & 1 deletion packages/protocol-kit/src/SafeFactory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
30 changes: 16 additions & 14 deletions packages/protocol-kit/src/SafeProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ import {
EIP712TypedDataMessage,
EIP712TypedDataTx,
Eip3770Address,
SafeEIP712Args,
SafeVersion
SafeEIP712Args
} from '@safe-global/types-kit'
import {
getCompatibilityFallbackHandlerContractInstance,
Expand All @@ -32,14 +31,13 @@ import {
SafeProviderTransaction,
GetContractProps,
SafeProviderConfig,
SafeProviderInitOptions,
ExternalClient,
ExternalSigner,
Eip1193Provider,
HttpTransport,
SocketTransport,
SafeSigner,
SafeConfig,
ContractNetworksConfig,
PasskeyArgType,
PasskeyClient,
DeploymentType
Expand Down Expand Up @@ -114,22 +112,26 @@ class SafeProvider {

this.provider = provider
this.signer = signer
this.deploymentType = deploymentType
this.#deploymentType = deploymentType
}

get deploymentType(): DeploymentType | undefined {
return this.#deploymentType
}

getExternalProvider(): ExternalClient {
return this.#externalProvider
}

static async init(
provider: SafeConfig['provider'],
signer?: SafeConfig['signer'],
safeVersion: SafeVersion = DEFAULT_SAFE_VERSION,
contractNetworks?: ContractNetworksConfig,
safeAddress?: string,
owners?: string[],
deploymentType?: DeploymentType
): Promise<SafeProvider> {
static async init({
provider,
signer,
safeVersion = DEFAULT_SAFE_VERSION,
contractNetworks,
safeAddress,
owners,
deploymentType
}: SafeProviderInitOptions): Promise<SafeProvider> {
const isPasskeySigner = signer && typeof signer !== 'string'

if (isPasskeySigner) {
Expand Down
12 changes: 12 additions & 0 deletions packages/protocol-kit/src/types/safeProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import {
WalletActions,
Hex
} from 'viem'
import { SafeVersion } from '@safe-global/types-kit'
import { SafeConfig, DeploymentType, ContractNetworksConfig } from '@safe-global/protocol-kit/types'

export type RequestArguments = {
readonly method: string
Expand Down Expand Up @@ -56,6 +58,16 @@ export type SafeProviderConfig = {
signer?: HexAddress | PrivateKey | PasskeyArgType | PasskeyClient
}

export type SafeProviderInitOptions = {
provider: SafeConfig['provider']
signer?: SafeConfig['signer']
safeVersion?: SafeVersion
contractNetworks?: ContractNetworksConfig
safeAddress?: string
owners?: string[]
deploymentType?: DeploymentType
}

export type SafeProviderTransaction = {
to: string
from: string
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@ 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,
safe.getSafeProvider().deploymentType
)
deploymentType: safe.getSafeProvider().deploymentType
})

const passkeySigner = (await safePasskeyProvider.getExternalSigner()) as PasskeyClient
const passkeyAddress = passkeySigner!.account.address
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down
16 changes: 13 additions & 3 deletions packages/protocol-kit/tests/e2e/passkey.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand All @@ -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()
Expand Down
4 changes: 3 additions & 1 deletion packages/protocol-kit/tests/e2e/safeProvider.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ describe('Safe contracts', () => {
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'
)
Expand Down
2 changes: 1 addition & 1 deletion packages/relay-kit/src/packs/safe-4337/Safe4337Pack.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit aa9c1e6

Please sign in to comment.