@farcaster/frame-sdk 0.0.0-canary-20250511031627 → 0.0.0-canary-20250512194707

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { AddFrame, ComposeCast, Context, FrameNotificationDetails, Ready, SendToken, SetPrimaryButtonOptions, SignIn, SolanaWalletProvider, SwapToken, ViewProfile, ViewToken } from '@farcaster/frame-core';
1
+ import type { AddMiniApp, ComposeCast, Context, FrameNotificationDetails, GetCapabilities, Ready, SendToken, SetPrimaryButtonOptions, SignIn, SolanaWalletProvider, SwapToken, ViewProfile, ViewToken } from '@farcaster/frame-core';
2
2
  import type { EventEmitter } from 'eventemitter3';
3
3
  import type * as Provider from 'ox/Provider';
4
4
  declare global {
@@ -18,7 +18,7 @@ export type EventMap = {
18
18
  notificationDetails?: FrameNotificationDetails;
19
19
  }) => void;
20
20
  frameAddRejected: ({ reason, }: {
21
- reason: AddFrame.AddFrameRejectedReason;
21
+ reason: AddMiniApp.AddMiniAppRejectedReason;
22
22
  }) => void;
23
23
  frameRemoved: () => void;
24
24
  notificationsEnabled: ({ notificationDetails, }: {
@@ -29,6 +29,7 @@ export type EventMap = {
29
29
  export type Emitter = Compute<EventEmitter<EventMap>>;
30
30
  type SetPrimaryButton = (options: SetPrimaryButtonOptions) => Promise<void>;
31
31
  export type FrameSDK = {
32
+ getCapabilities: GetCapabilities;
32
33
  isInMiniApp: () => Promise<boolean>;
33
34
  context: Promise<Context.FrameContext>;
34
35
  actions: {
@@ -36,7 +37,8 @@ export type FrameSDK = {
36
37
  openUrl: (url: string) => Promise<void>;
37
38
  close: () => Promise<void>;
38
39
  setPrimaryButton: SetPrimaryButton;
39
- addFrame: AddFrame.AddFrame;
40
+ addFrame: AddMiniApp.AddMiniApp;
41
+ addMiniApp: AddMiniApp.AddMiniApp;
40
42
  signIn: SignIn.SignIn;
41
43
  viewProfile: ViewProfile.ViewProfile;
42
44
  composeCast: <close extends boolean | undefined = undefined>(options?: ComposeCast.Options<close>) => Promise<ComposeCast.Result<close>>;
@@ -45,10 +47,11 @@ export type FrameSDK = {
45
47
  viewToken: ViewToken.ViewToken;
46
48
  sendToken: SendToken.SendToken;
47
49
  swapToken: SwapToken.SwapToken;
48
- solanaProvider?: SolanaWalletProvider;
50
+ getSolanaProvider: () => Promise<SolanaWalletProvider | undefined>;
49
51
  };
50
52
  wallet: {
51
53
  ethProvider: Provider.Provider;
54
+ getEvmProvider: () => Promise<Provider.Provider | undefined>;
52
55
  };
53
56
  } & Emitter;
54
57
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farcaster/frame-sdk",
3
- "version": "0.0.0-canary-20250511031627",
3
+ "version": "0.0.0-canary-20250512194707",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -22,7 +22,7 @@
22
22
  "comlink": "^4.4.2",
23
23
  "eventemitter3": "^5.0.1",
24
24
  "ox": "^0.4.4",
25
- "@farcaster/frame-core": "0.0.0-canary-20250511031627"
25
+ "@farcaster/frame-core": "0.0.0-canary-20250512194707"
26
26
  },
27
27
  "scripts": {
28
28
  "clean": "rm -rf dist",
@@ -44,7 +44,7 @@ function toProviderRpcError({
44
44
  }
45
45
  }
46
46
 
47
- export const provider: Provider.Provider = Provider.from({
47
+ export const evmProvider: Provider.Provider = Provider.from({
48
48
  ...emitter,
49
49
  async request(args) {
50
50
  // @ts-expect-error
@@ -83,7 +83,15 @@ export const provider: Provider.Provider = Provider.from({
83
83
  },
84
84
  })
85
85
 
86
- function announceProvider(
86
+ export async function getEvmProvider(): Promise<Provider.Provider | undefined> {
87
+ const capabilities = await frameHost.getCapabilities()
88
+ if (!capabilities.includes('wallet.getEvmProvider')) {
89
+ return undefined
90
+ }
91
+ return evmProvider
92
+ }
93
+
94
+ function announceEvmProvider(
87
95
  detail: AnnounceProviderParameters,
88
96
  ): AnnounceProviderReturnType {
89
97
  const event: CustomEvent<EIP6963ProviderDetail> = new CustomEvent(
@@ -118,9 +126,9 @@ if (typeof document !== 'undefined') {
118
126
  if (event instanceof MessageEvent) {
119
127
  const frameEvent = event.data as FrameClientEvent
120
128
  if (frameEvent.event === 'eip6963:announceProvider') {
121
- announceProvider({
129
+ announceEvmProvider({
122
130
  info: frameEvent.info,
123
- provider: provider as EIP1193Provider,
131
+ provider: evmProvider as EIP1193Provider,
124
132
  })
125
133
  }
126
134
  }
@@ -150,9 +158,9 @@ if (typeof window !== 'undefined') {
150
158
  if (event.data.type === 'frameEvent') {
151
159
  const frameEvent = event.data.event as FrameClientEvent
152
160
  if (frameEvent.event === 'eip6963:announceProvider') {
153
- announceProvider({
161
+ announceEvmProvider({
154
162
  info: frameEvent.info,
155
- provider: provider as EIP1193Provider,
163
+ provider: evmProvider as EIP1193Provider,
156
164
  })
157
165
  }
158
166
  }
package/src/sdk.ts CHANGED
@@ -1,13 +1,14 @@
1
1
  import {
2
- AddFrame,
2
+ AddMiniApp,
3
3
  type FrameClientEvent,
4
4
  SignIn,
5
5
  type SolanaRequestFn,
6
6
  createSolanaWalletProvider,
7
7
  } from '@farcaster/frame-core'
8
8
  import { EventEmitter } from 'eventemitter3'
9
+ import { evmProvider, getEvmProvider } from './evmProvider'
9
10
  import { frameHost } from './frameHost'
10
- import { provider } from './provider'
11
+ import { getSolanaProvider } from './solanaProvider'
11
12
  import type { Emitter, EventMap, FrameSDK } from './types'
12
13
 
13
14
  export function createEmitter(): Emitter {
@@ -77,8 +78,26 @@ async function isInMiniApp(timeoutMs = 50): Promise<boolean> {
77
78
  return isInMiniApp
78
79
  }
79
80
 
81
+ const addMiniApp = async () => {
82
+ const response = await frameHost.addFrame()
83
+ if (response.result) {
84
+ return response.result
85
+ }
86
+
87
+ if (response.error.type === 'invalid_domain_manifest') {
88
+ throw new AddMiniApp.InvalidDomainManifest()
89
+ }
90
+
91
+ if (response.error.type === 'rejected_by_user') {
92
+ throw new AddMiniApp.RejectedByUser()
93
+ }
94
+
95
+ throw new Error('Unreachable')
96
+ }
97
+
80
98
  export const sdk: FrameSDK = {
81
99
  ...emitter,
100
+ getCapabilities: frameHost.getCapabilities,
82
101
  isInMiniApp,
83
102
  context: frameHost.context,
84
103
  actions: {
@@ -102,22 +121,8 @@ export const sdk: FrameSDK = {
102
121
  const url = typeof urlArg === 'string' ? urlArg : urlArg.url
103
122
  return frameHost.openUrl(url.trim())
104
123
  },
105
- addFrame: async () => {
106
- const response = await frameHost.addFrame()
107
- if (response.result) {
108
- return response.result
109
- }
110
-
111
- if (response.error.type === 'invalid_domain_manifest') {
112
- throw new AddFrame.InvalidDomainManifest()
113
- }
114
-
115
- if (response.error.type === 'rejected_by_user') {
116
- throw new AddFrame.RejectedByUser()
117
- }
118
-
119
- throw new Error('Unreachable')
120
- },
124
+ addFrame: addMiniApp,
125
+ addMiniApp,
121
126
  composeCast(options = {}) {
122
127
  return frameHost.composeCast(options) as never
123
128
  },
@@ -126,14 +131,11 @@ export const sdk: FrameSDK = {
126
131
  viewToken: frameHost.viewToken.bind(frameHost),
127
132
  sendToken: frameHost.sendToken.bind(frameHost),
128
133
  swapToken: frameHost.swapToken.bind(frameHost),
129
- solanaProvider: frameHost.solanaProviderRequest
130
- ? createSolanaWalletProvider(
131
- frameHost.solanaProviderRequest as unknown as SolanaRequestFn,
132
- )
133
- : undefined,
134
+ getSolanaProvider,
134
135
  },
135
136
  wallet: {
136
- ethProvider: provider,
137
+ ethProvider: evmProvider,
138
+ getEvmProvider: getEvmProvider,
137
139
  },
138
140
  }
139
141
 
@@ -0,0 +1,21 @@
1
+ import {
2
+ type SolanaRequestFn,
3
+ type SolanaWalletProvider,
4
+ createSolanaWalletProvider,
5
+ } from '@farcaster/frame-core'
6
+
7
+ import { frameHost } from './frameHost'
8
+
9
+ const solanaProvider = createSolanaWalletProvider(
10
+ frameHost.solanaProviderRequest as unknown as SolanaRequestFn,
11
+ )
12
+
13
+ async function getSolanaProvider(): Promise<SolanaWalletProvider | undefined> {
14
+ const capabilities = await frameHost.getCapabilities()
15
+ if (!capabilities.includes('wallet.getSolanaProvider')) {
16
+ return undefined
17
+ }
18
+ return solanaProvider
19
+ }
20
+
21
+ export { getSolanaProvider }
package/src/types.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import type {
2
- AddFrame,
2
+ AddMiniApp,
3
3
  ComposeCast,
4
4
  Context,
5
5
  FrameNotificationDetails,
6
+ GetCapabilities,
6
7
  Ready,
7
8
  SendToken,
8
9
  SetPrimaryButtonOptions,
@@ -37,7 +38,7 @@ export type EventMap = {
37
38
  }) => void
38
39
  frameAddRejected: ({
39
40
  reason,
40
- }: { reason: AddFrame.AddFrameRejectedReason }) => void
41
+ }: { reason: AddMiniApp.AddMiniAppRejectedReason }) => void
41
42
  frameRemoved: () => void
42
43
  notificationsEnabled: ({
43
44
  notificationDetails,
@@ -52,6 +53,7 @@ export type Emitter = Compute<EventEmitter<EventMap>>
52
53
  type SetPrimaryButton = (options: SetPrimaryButtonOptions) => Promise<void>
53
54
 
54
55
  export type FrameSDK = {
56
+ getCapabilities: GetCapabilities
55
57
  isInMiniApp: () => Promise<boolean>
56
58
  context: Promise<Context.FrameContext>
57
59
  actions: {
@@ -59,7 +61,9 @@ export type FrameSDK = {
59
61
  openUrl: (url: string) => Promise<void>
60
62
  close: () => Promise<void>
61
63
  setPrimaryButton: SetPrimaryButton
62
- addFrame: AddFrame.AddFrame
64
+ // Deprecated in favor of addMiniApp
65
+ addFrame: AddMiniApp.AddMiniApp
66
+ addMiniApp: AddMiniApp.AddMiniApp
63
67
  signIn: SignIn.SignIn
64
68
  viewProfile: ViewProfile.ViewProfile
65
69
  composeCast: <close extends boolean | undefined = undefined>(
@@ -70,9 +74,11 @@ export type FrameSDK = {
70
74
  viewToken: ViewToken.ViewToken
71
75
  sendToken: SendToken.SendToken
72
76
  swapToken: SwapToken.SwapToken
73
- solanaProvider?: SolanaWalletProvider
77
+ getSolanaProvider: () => Promise<SolanaWalletProvider | undefined>
74
78
  }
75
79
  wallet: {
80
+ // Deprecated in favor of getEvmProvider
76
81
  ethProvider: Provider.Provider
82
+ getEvmProvider: () => Promise<Provider.Provider | undefined>
77
83
  }
78
84
  } & Emitter
@@ -1,2 +0,0 @@
1
- import * as Provider from 'ox/Provider';
2
- export declare const provider: Provider.Provider;