@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/evmProvider.d.ts +3 -0
- package/dist/{provider.js → evmProvider.js} +13 -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 +15 -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} +14 -6
- package/src/sdk.ts +28 -26
- package/src/solanaProvider.ts +29 -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.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.
|
|
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
|
|
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
|
|
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
|
-
|
|
129
|
+
announceEvmProvider({
|
|
122
130
|
info: frameEvent.info,
|
|
123
|
-
provider:
|
|
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
|
-
|
|
161
|
+
announceEvmProvider({
|
|
154
162
|
info: frameEvent.info,
|
|
155
|
-
provider:
|
|
163
|
+
provider: evmProvider as EIP1193Provider,
|
|
156
164
|
})
|
|
157
165
|
}
|
|
158
166
|
}
|
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,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
|
-
|
|
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