From 282d89b8d80e79b6e04d612562ae4ec97395c7fd Mon Sep 17 00:00:00 2001 From: TheRealRajdeep Date: Fri, 29 May 2026 19:19:44 +0530 Subject: [PATCH 1/2] fix: select access key before computing MPP channel authorizedSigner --- .vscode/settings.json | 2 +- examples/fee-payer-and-webauthn/package.json | 2 +- examples/fee-payer/package.json | 2 +- src/core/Provider.ts | 25 +++++++++++++++----- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index f0db651c..e2dff056 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,6 @@ { "editor.tabSize": 2, - "editor.hover.enabled": true, + "editor.hover.enabled": "on", "typescript.validate.enable": true, "javascript.validate.enable": true, "editor.defaultFormatter": "oxc.oxc-vscode", diff --git a/examples/fee-payer-and-webauthn/package.json b/examples/fee-payer-and-webauthn/package.json index 8708f4db..a0c6f606 100644 --- a/examples/fee-payer-and-webauthn/package.json +++ b/examples/fee-payer-and-webauthn/package.json @@ -7,7 +7,7 @@ "check:types": "tsc -b --noEmit", "dev": "vp dev", "gen:types": "wrangler types", - "postinstall": "[ -f .env ] || cp .env.example .env && wrangler types", + "postinstall": "node -e \"const fs=require('fs');if(!fs.existsSync('.env'))fs.copyFileSync('.env.example','.env')\" && wrangler types", "build": "tsc -b && vp build", "preview": "vp preview" }, diff --git a/examples/fee-payer/package.json b/examples/fee-payer/package.json index 52f3cf23..a6cdcd48 100644 --- a/examples/fee-payer/package.json +++ b/examples/fee-payer/package.json @@ -7,7 +7,7 @@ "check:types": "tsc -b --noEmit", "dev": "vp dev", "gen:types": "wrangler types", - "postinstall": "[ -f .env ] || cp .env.example .env && wrangler types", + "postinstall": "node -e \"const fs=require('fs');if(!fs.existsSync('.env'))fs.copyFileSync('.env.example','.env')\" && wrangler types", "build": "tsc -b && vp build", "preview": "vp preview" }, diff --git a/src/core/Provider.ts b/src/core/Provider.ts index 9c5ba12b..b945f32c 100644 --- a/src/core/Provider.ts +++ b/src/core/Provider.ts @@ -1048,15 +1048,28 @@ export function create(options: create.Options = {}): create.ReturnType { // Skip polyfill on runtimes where `globalThis.fetch` is read-only (e.g. // Cloudflare Workers). Caller can also explicitly opt out via `mpp.polyfill`. const polyfill = polyfill_option ?? isFetchWritable() - const getClient = ({ chainId }: { chainId?: number | undefined }) => { + const getClient = async ({ chainId }: { chainId?: number | undefined }) => { const client = provider.getClient({ chainId }) - const account = store.getState().accounts[store.getState().activeAccount] + const state = store.getState() + const account = state.accounts[state.activeAccount] if (!account) throw new ox_Provider.DisconnectedError({ message: 'No active account.' }) + const resolvedChainId = chainId ?? state.chainId + const accessKey = await AccessKey.select({ + account: account.address, + chainId: resolvedChainId, + store, + }) return Object.assign(client, { - account: { - address: account.address, - type: 'json-rpc' as const, - }, + account: accessKey + ? { + address: account.address, + accessKeyAddress: accessKey.address, + type: 'json-rpc' as const, + } + : { + address: account.address, + type: 'json-rpc' as const, + }, }) } Mppx.create({ From 84272648e4056c0b646cf4c1054dfb0b193199da Mon Sep 17 00:00:00 2001 From: TheRealRajdeep Date: Fri, 29 May 2026 19:26:55 +0530 Subject: [PATCH 2/2] test: add mppx localnet test for access key authorizedSigner selection --- src/core/mppx.localnet.test.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/core/mppx.localnet.test.ts b/src/core/mppx.localnet.test.ts index e33d3871..13811b52 100644 --- a/src/core/mppx.localnet.test.ts +++ b/src/core/mppx.localnet.test.ts @@ -138,6 +138,27 @@ describe('mppx integration', () => { } }) + test('mpp client uses access key address as authorizedSigner', async () => { + const provider = Provider.create({ + adapter: headlessWebAuthn(), + chains: [chain], + mpp: { mode: 'push' }, + }) + const address = await connect(provider) + await fund(address) + + await provider.request({ + method: 'wallet_authorizeAccessKey', + params: [{ expiry: Expiry.days(1) }], + }) + + const key = provider.store.getState().accessKeys[0]! + expect(key).toBeDefined() + + const res = await fetch(`${server.url}/fortune`) + expect(res.status).toBe(200) + }) + test('push mode publishes pending access key authorization', async () => { const provider = Provider.create({ adapter: headlessWebAuthn(),