@farcaster/frame-sdk 0.0.39 → 0.0.40

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.40",
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",
@@ -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,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,29 @@
1
+ import {
2
+ type SolanaWalletProvider,
3
+ type SolanaWireRequestFn,
4
+ createSolanaWalletProvider,
5
+ unwrapSolanaProviderRequest,
6
+ } from '@farcaster/frame-core'
7
+
8
+ import { frameHost } from './frameHost'
9
+
10
+ const { solanaProviderRequest } = frameHost
11
+
12
+ let solanaProvider: SolanaWalletProvider | undefined
13
+ if (solanaProviderRequest) {
14
+ solanaProvider = createSolanaWalletProvider(
15
+ unwrapSolanaProviderRequest(
16
+ solanaProviderRequest as unknown as SolanaWireRequestFn,
17
+ ),
18
+ )
19
+ }
20
+
21
+ async function getSolanaProvider(): Promise<SolanaWalletProvider | undefined> {
22
+ const capabilities = await frameHost.getCapabilities()
23
+ if (!capabilities.includes('wallet.getSolanaProvider')) {
24
+ return undefined
25
+ }
26
+ return solanaProvider
27
+ }
28
+
29
+ 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;