@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/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 -18
- 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 -5
- package/package.json +2 -2
- package/src/{provider.ts → evmProvider.ts} +14 -6
- package/src/sdk.ts +34 -21
- package/src/solanaProvider.ts +29 -0
- package/src/types.ts +13 -5
- 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,18 +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>;
|
|
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.
|
|
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,7 +1,14 @@
|
|
|
1
|
-
import {
|
|
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 {
|
|
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:
|
|
100
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
package/dist/provider.d.ts
DELETED