@farcaster/frame-sdk 0.0.38 → 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, 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,18 +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
48
  };
49
+ experimental: {
50
+ getSolanaProvider: () => Promise<SolanaWalletProvider | undefined>;
51
+ };
49
52
  wallet: {
50
53
  ethProvider: Provider.Provider;
54
+ getEvmProvider: () => Promise<Provider.Provider | undefined>;
51
55
  };
52
56
  } & Emitter;
53
57
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farcaster/frame-sdk",
3
- "version": "0.0.38",
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.34"
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,7 +1,14 @@
1
- import { AddFrame, type FrameClientEvent, SignIn } from '@farcaster/frame-core'
1
+ import {
2
+ AddMiniApp,
3
+ type FrameClientEvent,
4
+ SignIn,
5
+ type SolanaRequestFn,
6
+ createSolanaWalletProvider,
7
+ } from '@farcaster/frame-core'
2
8
  import { EventEmitter } from 'eventemitter3'
9
+ import { evmProvider, getEvmProvider } from './evmProvider'
3
10
  import { frameHost } from './frameHost'
4
- import { provider } from './provider'
11
+ import { getSolanaProvider } from './solanaProvider'
5
12
  import type { Emitter, EventMap, FrameSDK } from './types'
6
13
 
7
14
  export function createEmitter(): Emitter {
@@ -71,8 +78,26 @@ async function isInMiniApp(timeoutMs = 50): Promise<boolean> {
71
78
  return isInMiniApp
72
79
  }
73
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
+
74
98
  export const sdk: FrameSDK = {
75
99
  ...emitter,
100
+ getCapabilities: frameHost.getCapabilities,
76
101
  isInMiniApp,
77
102
  context: frameHost.context,
78
103
  actions: {
@@ -96,33 +121,21 @@ export const sdk: FrameSDK = {
96
121
  const url = typeof urlArg === 'string' ? urlArg : urlArg.url
97
122
  return frameHost.openUrl(url.trim())
98
123
  },
99
- addFrame: async () => {
100
- const response = await frameHost.addFrame()
101
- if (response.result) {
102
- return response.result
103
- }
104
-
105
- if (response.error.type === 'invalid_domain_manifest') {
106
- throw new AddFrame.InvalidDomainManifest()
107
- }
108
-
109
- if (response.error.type === 'rejected_by_user') {
110
- throw new AddFrame.RejectedByUser()
111
- }
112
-
113
- throw new Error('Unreachable')
114
- },
124
+ addFrame: addMiniApp,
125
+ addMiniApp,
115
126
  composeCast(options = {}) {
116
127
  return frameHost.composeCast(options) as never
117
128
  },
118
- },
119
- experimental: {
120
129
  viewToken: frameHost.viewToken.bind(frameHost),
121
130
  sendToken: frameHost.sendToken.bind(frameHost),
122
131
  swapToken: frameHost.swapToken.bind(frameHost),
123
132
  },
133
+ experimental: {
134
+ getSolanaProvider,
135
+ },
124
136
  wallet: {
125
- ethProvider: provider,
137
+ ethProvider: evmProvider,
138
+ getEvmProvider: getEvmProvider,
126
139
  },
127
140
  }
128
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,12 +1,14 @@
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,
9
10
  SignIn,
11
+ SolanaWalletProvider,
10
12
  SwapToken,
11
13
  ViewProfile,
12
14
  ViewToken,
@@ -36,7 +38,7 @@ export type EventMap = {
36
38
  }) => void
37
39
  frameAddRejected: ({
38
40
  reason,
39
- }: { reason: AddFrame.AddFrameRejectedReason }) => void
41
+ }: { reason: AddMiniApp.AddMiniAppRejectedReason }) => void
40
42
  frameRemoved: () => void
41
43
  notificationsEnabled: ({
42
44
  notificationDetails,
@@ -51,6 +53,7 @@ export type Emitter = Compute<EventEmitter<EventMap>>
51
53
  type SetPrimaryButton = (options: SetPrimaryButtonOptions) => Promise<void>
52
54
 
53
55
  export type FrameSDK = {
56
+ getCapabilities: GetCapabilities
54
57
  isInMiniApp: () => Promise<boolean>
55
58
  context: Promise<Context.FrameContext>
56
59
  actions: {
@@ -58,19 +61,24 @@ export type FrameSDK = {
58
61
  openUrl: (url: string) => Promise<void>
59
62
  close: () => Promise<void>
60
63
  setPrimaryButton: SetPrimaryButton
61
- addFrame: AddFrame.AddFrame
64
+ // Deprecated in favor of addMiniApp
65
+ addFrame: AddMiniApp.AddMiniApp
66
+ addMiniApp: AddMiniApp.AddMiniApp
62
67
  signIn: SignIn.SignIn
63
68
  viewProfile: ViewProfile.ViewProfile
64
69
  composeCast: <close extends boolean | undefined = undefined>(
65
70
  options?: ComposeCast.Options<close>,
66
71
  ) => Promise<ComposeCast.Result<close>>
67
- }
68
- experimental: {
69
72
  viewToken: ViewToken.ViewToken
70
73
  sendToken: SendToken.SendToken
71
74
  swapToken: SwapToken.SwapToken
72
75
  }
76
+ experimental: {
77
+ getSolanaProvider: () => Promise<SolanaWalletProvider | undefined>
78
+ }
73
79
  wallet: {
80
+ // Deprecated in favor of getEvmProvider
74
81
  ethProvider: Provider.Provider
82
+ getEvmProvider: () => Promise<Provider.Provider | undefined>
75
83
  }
76
84
  } & Emitter
@@ -1,2 +0,0 @@
1
- import * as Provider from 'ox/Provider';
2
- export declare const provider: Provider.Provider;