@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/evmProvider.d.ts +3 -0
- package/dist/{provider.js → evmProvider.js} +20 -6
- package/dist/index.min.js +164 -2
- package/dist/index.min.js.map +4 -4
- package/dist/sdk.js +24 -21
- package/dist/solanaProvider.d.ts +3 -0
- package/dist/solanaProvider.js +19 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +9 -6
- package/package.json +2 -2
- package/src/{provider.ts → evmProvider.ts} +21 -6
- package/src/sdk.ts +28 -26
- package/src/solanaProvider.ts +33 -0
- package/src/types.ts +12 -6
- package/dist/provider.d.ts +0 -2
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
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:
|
|
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:
|
|
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>;
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
136
|
+
announceEvmProvider({
|
|
122
137
|
info: frameEvent.info,
|
|
123
|
-
provider:
|
|
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
|
-
|
|
168
|
+
announceEvmProvider({
|
|
154
169
|
info: frameEvent.info,
|
|
155
|
-
provider:
|
|
170
|
+
provider: evmProvider as EIP1193Provider,
|
|
156
171
|
})
|
|
157
172
|
}
|
|
158
173
|
}
|
package/src/sdk.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
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 {
|
|
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:
|
|
106
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
)
|
|
133
|
-
: undefined,
|
|
132
|
+
},
|
|
133
|
+
experimental: {
|
|
134
|
+
getSolanaProvider,
|
|
134
135
|
},
|
|
135
136
|
wallet: {
|
|
136
|
-
ethProvider:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
package/dist/provider.d.ts
DELETED