From 201490766074d9c0ffdff74e35e16a2f3f66064b Mon Sep 17 00:00:00 2001 From: Jan-Felix Date: Wed, 2 Oct 2024 20:34:40 +0200 Subject: [PATCH 1/5] prefetch safe info to not run into timeouts web3onboard enforces a 200ms timeout and we wanna make sure we stay below that --- extension/src/bridge/SafeAppBridge.ts | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/extension/src/bridge/SafeAppBridge.ts b/extension/src/bridge/SafeAppBridge.ts index 4fd43a41..4cb83597 100644 --- a/extension/src/bridge/SafeAppBridge.ts +++ b/extension/src/bridge/SafeAppBridge.ts @@ -20,6 +20,7 @@ import { ChainId } from 'ser-kit' import { getBalances, getSafeInfo, + SafeInfo, TransactionDetails, } from '@safe-global/safe-gateway-typescript-sdk' import { CHAIN_CURRENCY, CHAIN_NAME, CHAIN_PREFIX } from '../chains' @@ -56,10 +57,16 @@ export default class SafeAppBridge { private provider: Eip1193Provider private connection: LegacyConnection private connectedOrigin: string | undefined + private safeInfoPromise: Promise constructor(provider: Eip1193Provider, connection: LegacyConnection) { this.provider = provider this.connection = connection + + this.safeInfoPromise = getSafeInfo( + CHAIN_PREFIX[this.connection.chainId], + getAddress(this.connection.avatarAddress) + ) } setProvider = (provider: Eip1193Provider) => { @@ -71,6 +78,11 @@ export default class SafeAppBridge { connection.avatarAddress !== this.connection.avatarAddress || connection.chainId !== this.connection.chainId + this.safeInfoPromise = getSafeInfo( + CHAIN_PREFIX[this.connection.chainId], + getAddress(this.connection.avatarAddress) + ) + this.connection = connection const href = await requestIframeHref() const currentOrigin = href && new URL(href).origin @@ -110,10 +122,13 @@ export default class SafeAppBridge { | undefined if (!handler) return - console.debug('SAFE_APP_MESSAGE', msg.data) + const responseState = { pending: true } as any + console.debug('SAFE_APP_MESSAGE', msg.data, responseState) try { const response = await handler(msg.data.params, msg.data.id, msg.data.env) if (typeof response !== 'undefined') { + delete responseState.pending + responseState.response = response this.postResponse(msg.source, response, msg.data.id) } else { throw new Error('No response returned from handler') @@ -174,10 +189,7 @@ export default class SafeAppBridge { }), [Methods.getSafeInfo]: async () => { - const info = await getSafeInfo( - CHAIN_PREFIX[this.connection.chainId], - getAddress(this.connection.avatarAddress) - ) + const info = await this.safeInfoPromise return { safeAddress: getAddress(this.connection.avatarAddress), chainId: this.connection.chainId, From d883565d88e443008a48145b42ff89e5de5f3926 Mon Sep 17 00:00:00 2001 From: Jan-Felix Date: Wed, 2 Oct 2024 20:36:48 +0200 Subject: [PATCH 2/5] improve logging --- extension/src/bridge/SafeAppBridge.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/extension/src/bridge/SafeAppBridge.ts b/extension/src/bridge/SafeAppBridge.ts index 4cb83597..0dc3d438 100644 --- a/extension/src/bridge/SafeAppBridge.ts +++ b/extension/src/bridge/SafeAppBridge.ts @@ -122,13 +122,12 @@ export default class SafeAppBridge { | undefined if (!handler) return - const responseState = { pending: true } as any - console.debug('SAFE_APP_MESSAGE', msg.data, responseState) + const logDetails = { data: msg.data, response: '⏳' } as any + console.debug('SAFE_APP_MESSAGE', logDetails) try { const response = await handler(msg.data.params, msg.data.id, msg.data.env) if (typeof response !== 'undefined') { - delete responseState.pending - responseState.response = response + logDetails.response = response this.postResponse(msg.source, response, msg.data.id) } else { throw new Error('No response returned from handler') From bcb5a4f73b21dcbb9132d620991ff293a1f3f20d Mon Sep 17 00:00:00 2001 From: Jan-Felix Date: Wed, 2 Oct 2024 21:27:22 +0200 Subject: [PATCH 3/5] enable safe apps bridge for v2.nexusmutual.io --- extension/src/bridge/SafeAppBridge.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/extension/src/bridge/SafeAppBridge.ts b/extension/src/bridge/SafeAppBridge.ts index 0dc3d438..59bae6a8 100644 --- a/extension/src/bridge/SafeAppBridge.ts +++ b/extension/src/bridge/SafeAppBridge.ts @@ -51,6 +51,7 @@ export const SAFE_APP_WHITELIST = [ 'https://app.spark.fi', 'https://community.safe.global', 'https://app.nexusmutual.io', + 'https://v2.nexusmutual.io', ] export default class SafeAppBridge { From d0d5bd74dce9464a47afc47cb3b1a9883d1ac900 Mon Sep 17 00:00:00 2001 From: Jan-Felix Date: Thu, 3 Oct 2024 14:53:44 +0200 Subject: [PATCH 4/5] add example response as comment --- extension/src/bridge/SafeAppBridge.ts | 30 +++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/extension/src/bridge/SafeAppBridge.ts b/extension/src/bridge/SafeAppBridge.ts index 59bae6a8..68b4999f 100644 --- a/extension/src/bridge/SafeAppBridge.ts +++ b/extension/src/bridge/SafeAppBridge.ts @@ -199,6 +199,36 @@ export default class SafeAppBridge { network: LEGACY_CHAIN_NAME[this.connection.chainId] || CHAIN_NAME[this.connection.chainId].toUpperCase(), + + // below is an example response as set within Safe{Wallet}: + // chainId: 1, + // fallbackHandler: '0xf48f2B2d2a534e402487b3ee7C18c33Aec0Fe5e4', + // guard: null, + // implementation: '0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552', + // isReadOnly: true, + // modules: [ + // '0x27d8bb2e33Bc38A9CE93fdD90C80677b8436aFfb', + // '0x1cFB0CD7B1111bf2054615C7C491a15C4A3303cc', + // '0x0DA0C3e52C977Ed3cBc641fF02DD271c3ED55aFe', + // ], + // network: 'MAINNET', + // nonce: 2324, + // owners: [ + // '0x1B0C638616Ed79dB430Edbf549ad9512FF4a8ed1', + // '0x507A7777E6DbF4680951E63fB3753a20F2c37706', + // '0xa3a3456BC0c8ce4e0a0415B619803ee96509Ce30', + // '0xe9eB7DA58f6B5CE5b0a6cFD778A2fa726203AAD5', + // '0xFcf00B0fEdBc8f2F35a3B8d4B858d5805f2Bb05D', + // '0xE4Df0cdC9eF7e388eA906226010bBD1B9A6fFeD9', + // '0xD68f1A882f3F9ffddaBd4D30c4F8Dfca1f9e51Ba', + // '0xA1cf7F847eCD82459ce05a218EaA38a9D92E7b6b', + // '0x8fd960F1B9D68BAD2B97bD232FB75CC1f186B064', + // '0x5eD64f02588C8B75582f2f8eFd7A5521e3F897CC', + // '0x0DA0C3e52C977Ed3cBc641fF02DD271c3ED55aFe', + // ], + // safeAddress: '0x849D52316331967b6fF1198e5E32A0eB168D039d', + // threshold: 3, + // version: '1.3.0', } }, From 8e4d708ea0bc100934574963edd305852ea0c69e Mon Sep 17 00:00:00 2001 From: Jan-Felix Date: Fri, 4 Oct 2024 15:32:18 +0200 Subject: [PATCH 5/5] cleanup --- extension/src/providers/ForkProvider.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/extension/src/providers/ForkProvider.ts b/extension/src/providers/ForkProvider.ts index 8bb991d8..423ee5d0 100644 --- a/extension/src/providers/ForkProvider.ts +++ b/extension/src/providers/ForkProvider.ts @@ -220,7 +220,6 @@ class ForkProvider extends EventEmitter { this.ownerAddress === ZeroAddress ? undefined : this.ownerAddress const isSafe = await this.isSafePromise - console.log(this.moduleAddress, ownerAddress) if (!isSafe && (this.moduleAddress || ownerAddress)) { throw new Error( 'moduleAddress or ownerAddress is only supported for Safes as avatar'