From 15488fdb40688a8c68cd1684ffb22ca2d6e6fa98 Mon Sep 17 00:00:00 2001 From: Bobo Date: Wed, 22 Oct 2025 13:53:58 +0200 Subject: [PATCH] Support paid RPC through config --- .../testapp/src/context/EIP1193ProviderContextProvider.tsx | 7 ++++++- examples/testapp/src/store/config.ts | 1 + packages/app-sdk/src/core/provider/interface.ts | 1 + .../src/interface/builder/core/createBaseAccountSDK.ts | 2 ++ packages/app-sdk/src/sign/app-sdk/Signer.ts | 5 +++-- packages/app-sdk/src/store/store.ts | 3 ++- 6 files changed, 15 insertions(+), 4 deletions(-) diff --git a/examples/testapp/src/context/EIP1193ProviderContextProvider.tsx b/examples/testapp/src/context/EIP1193ProviderContextProvider.tsx index 79f98551..67f0b0b1 100644 --- a/examples/testapp/src/context/EIP1193ProviderContextProvider.tsx +++ b/examples/testapp/src/context/EIP1193ProviderContextProvider.tsx @@ -7,6 +7,7 @@ import { useMemo, useState, } from 'react' +import { soneium, soneiumMinato } from 'viem/chains' import { DisconnectedAlert } from '../components/alerts/DisconnectedAlert' import { useEventListeners } from '../hooks/useEventListeners' import { useSpyOnDisconnectedError } from '../hooks/useSpyOnDisconnectedError' @@ -48,7 +49,7 @@ export function EIP1193ProviderContextProvider({ const sdkParams = { appName: 'Startale app SDK Playground', appLogoUrl: 'https://startale.com/image/symbol.png', - appChainIds: [1946, 1868], + appChainIds: [soneiumMinato.id, soneium.id], preference: { attribution: config.attribution, walletUrl: scwUrl ?? scwUrls[0], @@ -58,6 +59,10 @@ export function EIP1193ProviderContextProvider({ paymasterId, paymasterApiKey, bundlerApiKey, + rpcUrls: { + [soneium.id]: process.env.NEXT_PUBLIC_SONEIUM_RPC_URL, + [soneiumMinato.id]: process.env.NEXT_PUBLIC_MINATO_RPC_URL, + }, } const sdk = createBaseAccountSDKHEAD(sdkParams) diff --git a/examples/testapp/src/store/config.ts b/examples/testapp/src/store/config.ts index a3b07200..3d9b38af 100644 --- a/examples/testapp/src/store/config.ts +++ b/examples/testapp/src/store/config.ts @@ -8,5 +8,6 @@ export const SELECTED_SCW_URL_KEY = 'scw_url' export const scwUrls = [ 'https://deploy-sub-account-poc-for-yoake-sa-228.d3qb16qon2uoic.amplifyapp.com', 'http://localhost:3000/', + 'https://keys.coinbase.com/connect' ] as const export type ScwUrlType = (typeof scwUrls)[number] diff --git a/packages/app-sdk/src/core/provider/interface.ts b/packages/app-sdk/src/core/provider/interface.ts index 9712142b..3bb6a48d 100644 --- a/packages/app-sdk/src/core/provider/interface.ts +++ b/packages/app-sdk/src/core/provider/interface.ts @@ -112,4 +112,5 @@ export interface ConstructorOptions { metadata: AppMetadata preference: Preference paymasterUrls?: Record + rpcUrls?: Record } diff --git a/packages/app-sdk/src/interface/builder/core/createBaseAccountSDK.ts b/packages/app-sdk/src/interface/builder/core/createBaseAccountSDK.ts index 62890ca2..28a7712e 100644 --- a/packages/app-sdk/src/interface/builder/core/createBaseAccountSDK.ts +++ b/packages/app-sdk/src/interface/builder/core/createBaseAccountSDK.ts @@ -24,6 +24,7 @@ export type CreateProviderOptions = Partial & { preference?: Preference subAccounts?: Omit paymasterUrls?: Record + rpcUrls?: Record } /** @@ -40,6 +41,7 @@ export function createBaseAccountSDK(params: CreateProviderOptions) { }, preference: params.preference ?? {}, paymasterUrls: params.paymasterUrls, + rpcUrls: params.rpcUrls, } // ==================================================================== diff --git a/packages/app-sdk/src/sign/app-sdk/Signer.ts b/packages/app-sdk/src/sign/app-sdk/Signer.ts index 1e4633dd..df068668 100644 --- a/packages/app-sdk/src/sign/app-sdk/Signer.ts +++ b/packages/app-sdk/src/sign/app-sdk/Signer.ts @@ -49,7 +49,7 @@ import { getClient, } from ':store/chain-clients/utils.js' import { correlationIds } from ':store/correlation-ids/store.js' -import { spendPermissions, store } from ':store/store.js' +import { config, spendPermissions, store } from ':store/store.js' import { assertArrayPresence, assertPresence } from ':util/assertPresence.js' import { assertSubAccount } from ':util/assertSubAccount.js' import { @@ -621,12 +621,13 @@ export class Signer { const availableChains = response.data?.chains if (availableChains) { const nativeCurrencies = response.data?.nativeCurrencies + const rpcUrls = config.get().rpcUrls const chains: SDKChain[] = Object.entries(availableChains).map( ([id, rpcUrl]) => { const nativeCurrency = nativeCurrencies?.[Number(id)] return { id: Number(id), - rpcUrl, + rpcUrl: rpcUrls?.[Number(id)] ?? rpcUrl, ...(nativeCurrency ? { nativeCurrency } : {}), } }, diff --git a/packages/app-sdk/src/store/store.ts b/packages/app-sdk/src/store/store.ts index def07292..6582e8cd 100644 --- a/packages/app-sdk/src/store/store.ts +++ b/packages/app-sdk/src/store/store.ts @@ -46,6 +46,7 @@ type Config = { version: string deviceId?: string paymasterUrls?: Record + rpcUrls?: Record } type ChainSlice = { @@ -193,7 +194,7 @@ export const sdkstore = createStore( ...createUserInfoSlice(...args), }), { - name: 'base-acc-sdk.store', + name: 'startale-app-sdk.store', storage: createJSONStorage(() => localStorage), partialize: (state) => { // Explicitly select only the data properties we want to persist