@farcaster/frame-sdk 0.0.39 → 0.0.41

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,19 +37,21 @@ 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>>;
43
- };
44
- experimental: {
45
45
  viewToken: ViewToken.ViewToken;
46
46
  sendToken: SendToken.SendToken;
47
47
  swapToken: SwapToken.SwapToken;
48
- solanaProvider?: SolanaWalletProvider;
48
+ };
49
+ experimental: {
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.39",
3
+ "version": "0.0.41",
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.35"
25
+ "@farcaster/frame-core": "0.0.36"
26
26
  },
27
27
  "scripts": {
28
28
  "clean": "rm -rf dist",
@@ -1,6 +1,7 @@
1
1
  import type {
2
2
  EthProviderWireEvent,
3
3
  FrameClientEvent,
4
+ MiniAppHostCapability,
4
5
  } from '@farcaster/frame-core'
5
6
  import type {
6
7
  AnnounceProviderParameters,
@@ -44,7 +45,7 @@ function toProviderRpcError({
44
45
  }
45
46
  }
46
47
 
47
- export const provider: Provider.Provider = Provider.from({
48
+ export const evmProvider: Provider.Provider = Provider.from({
48
49
  ...emitter,
49
50
  async request(args) {
50
51
  // @ts-expect-error
@@ -83,7 +84,21 @@ export const provider: Provider.Provider = Provider.from({
83
84
  },
84
85
  })
85
86
 
86
- function announceProvider(
87
+ export async function getEvmProvider(): Promise<Provider.Provider | undefined> {
88
+ try {
89
+ const capabilities = await frameHost.getCapabilities()
90
+ if (!capabilities.includes('wallet.getEvmProvider')) {
91
+ return undefined
92
+ }
93
+ return evmProvider
94
+ } catch {
95
+ // If this is an old frame host that doesn't support getCapabilities,
96
+ // getEvmProvider will assume that it's supported
97
+ return evmProvider
98
+ }
99
+ }
100
+
101
+ function announceEvmProvider(
87
102
  detail: AnnounceProviderParameters,
88
103
  ): AnnounceProviderReturnType {
89
104
  const event: CustomEvent<EIP6963ProviderDetail> = new CustomEvent(
@@ -118,9 +133,9 @@ if (typeof document !== 'undefined') {
118
133
  if (event instanceof MessageEvent) {
119
134
  const frameEvent = event.data as FrameClientEvent
120
135
  if (frameEvent.event === 'eip6963:announceProvider') {
121
- announceProvider({
136
+ announceEvmProvider({
122
137
  info: frameEvent.info,
123
- provider: provider as EIP1193Provider,
138
+ provider: evmProvider as EIP1193Provider,
124
139
  })
125
140
  }
126
141
  }
@@ -150,9 +165,9 @@ if (typeof window !== 'undefined') {
150
165
  if (event.data.type === 'frameEvent') {
151
166
  const frameEvent = event.data.event as FrameClientEvent
152
167
  if (frameEvent.event === 'eip6963:announceProvider') {
153
- announceProvider({
168
+ announceEvmProvider({
154
169
  info: frameEvent.info,
155
- provider: provider as EIP1193Provider,
170
+ provider: evmProvider as EIP1193Provider,
156
171
  })
157
172
  }
158
173
  }
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,38 +121,21 @@ 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
  },
124
- },
125
- experimental: {
126
129
  viewToken: frameHost.viewToken.bind(frameHost),
127
130
  sendToken: frameHost.sendToken.bind(frameHost),
128
131
  swapToken: frameHost.swapToken.bind(frameHost),
129
- solanaProvider: frameHost.solanaProviderRequest
130
- ? createSolanaWalletProvider(
131
- frameHost.solanaProviderRequest as unknown as SolanaRequestFn,
132
- )
133
- : undefined,
132
+ },
133
+ experimental: {
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,33 @@
1
+ import {
2
+ type MiniAppHostCapability,
3
+ type SolanaWalletProvider,
4
+ type SolanaWireRequestFn,
5
+ createSolanaWalletProvider,
6
+ unwrapSolanaProviderRequest,
7
+ } from '@farcaster/frame-core'
8
+
9
+ import { frameHost } from './frameHost'
10
+
11
+ const { solanaProviderRequest } = frameHost
12
+
13
+ let solanaProvider: SolanaWalletProvider | undefined
14
+ if (solanaProviderRequest) {
15
+ solanaProvider = createSolanaWalletProvider(
16
+ unwrapSolanaProviderRequest(
17
+ solanaProviderRequest as unknown as SolanaWireRequestFn,
18
+ ),
19
+ )
20
+ }
21
+
22
+ async function getSolanaProvider(): Promise<SolanaWalletProvider | undefined> {
23
+ let capabilities: MiniAppHostCapability[] | undefined
24
+ try {
25
+ capabilities = await frameHost.getCapabilities()
26
+ } catch {}
27
+ if (!capabilities?.includes('wallet.getSolanaProvider')) {
28
+ return undefined
29
+ }
30
+ return solanaProvider
31
+ }
32
+
33
+ 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,20 +61,24 @@ 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>(
66
70
  options?: ComposeCast.Options<close>,
67
71
  ) => Promise<ComposeCast.Result<close>>
68
- }
69
- experimental: {
70
72
  viewToken: ViewToken.ViewToken
71
73
  sendToken: SendToken.SendToken
72
74
  swapToken: SwapToken.SwapToken
73
- solanaProvider?: SolanaWalletProvider
75
+ }
76
+ experimental: {
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;