better-near-auth 1.5.0 → 1.6.2
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/client.d.ts +11 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +160 -60
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +239 -43
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +59 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +16 -14
- package/skills/client/SKILL.md +1 -1
- package/skills/relay/SKILL.md +1 -1
- package/skills/siwn/SKILL.md +1 -1
- package/skills/tanstack/SKILL.md +2 -2
package/dist/client.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { Near as NearType } from "near-kit";
|
|
|
3
3
|
import type { BetterAuthClientPlugin, BetterAuthClientOptions, BetterFetch, BetterFetchResponse, ClientStore } from "better-auth/client";
|
|
4
4
|
import { atom } from "nanostores";
|
|
5
5
|
import type { siwn } from "./index.js";
|
|
6
|
-
import { type AccountId, type NonceRequestT, type NonceResponseT, type ProfileResponseT, type VerifyRequestT, type VerifyResponseT, type RelayResponseT, type RelayStatusResponseT, type ListAccountsResponseT, type SetPrimaryAccountRequestT, type SetPrimaryAccountResponseT, type ViewContractRequestT, type ViewContractResponseT, type RelayerInfo, type RelayHistoryResponseT } from "./types.js";
|
|
6
|
+
import { type AccountId, type DualNetworkConfig, type NonceRequestT, type NonceResponseT, type ProfileResponseT, type VerifyRequestT, type VerifyResponseT, type RelayResponseT, type RelayStatusResponseT, type ListAccountsResponseT, type SetPrimaryAccountRequestT, type SetPrimaryAccountResponseT, type ViewContractRequestT, type ViewContractResponseT, type RelayerInfo, type RelayHistoryResponseT, type GetRelayerInfoRequestT, type CreateSubAccountRequestT, type CreateSubAccountResponseT, type CheckSubAccountAvailabilityRequestT, type CheckSubAccountAvailabilityResponseT } from "./types.js";
|
|
7
7
|
export interface AuthCallbacks {
|
|
8
8
|
onSuccess?: () => void;
|
|
9
9
|
onError?: (error: Error & {
|
|
@@ -12,7 +12,8 @@ export interface AuthCallbacks {
|
|
|
12
12
|
}) => void;
|
|
13
13
|
}
|
|
14
14
|
export interface SIWNClientConfig {
|
|
15
|
-
recipient
|
|
15
|
+
recipient?: string;
|
|
16
|
+
recipients?: DualNetworkConfig<string>;
|
|
16
17
|
networkId?: "mainnet" | "testnet";
|
|
17
18
|
cspNonce?: string;
|
|
18
19
|
}
|
|
@@ -46,10 +47,16 @@ export interface SIWNClientActions {
|
|
|
46
47
|
payload: string;
|
|
47
48
|
}) => Promise<BetterFetchResponse<RelayResponseT>>;
|
|
48
49
|
getRelayStatus: (txHash: string) => Promise<BetterFetchResponse<RelayStatusResponseT>>;
|
|
49
|
-
getRelayerInfo: () => Promise<BetterFetchResponse<RelayerInfo & {
|
|
50
|
+
getRelayerInfo: (params?: GetRelayerInfoRequestT) => Promise<BetterFetchResponse<RelayerInfo & {
|
|
50
51
|
enabled: boolean;
|
|
51
52
|
}>>;
|
|
52
53
|
relayHistory: () => Promise<BetterFetchResponse<RelayHistoryResponseT>>;
|
|
54
|
+
createSubAccount: (params: CreateSubAccountRequestT) => Promise<BetterFetchResponse<CreateSubAccountResponseT>>;
|
|
55
|
+
checkSubAccountAvailability: (params: CheckSubAccountAvailabilityRequestT) => Promise<BetterFetchResponse<CheckSubAccountAvailabilityResponseT>>;
|
|
56
|
+
setNetwork: (network: "mainnet" | "testnet") => void;
|
|
57
|
+
getNetwork: () => "mainnet" | "testnet";
|
|
58
|
+
getSupportedNetworks: () => ("mainnet" | "testnet")[];
|
|
59
|
+
getRecipient: (network?: "mainnet" | "testnet") => string;
|
|
53
60
|
client: NearType;
|
|
54
61
|
};
|
|
55
62
|
signIn: {
|
|
@@ -66,6 +73,7 @@ export interface SIWNClientPlugin extends BetterAuthClientPlugin {
|
|
|
66
73
|
networkId: string;
|
|
67
74
|
} | null>>;
|
|
68
75
|
walletConnected: ReturnType<typeof atom<boolean>>;
|
|
76
|
+
activeNetwork: ReturnType<typeof atom<"mainnet" | "testnet">>;
|
|
69
77
|
};
|
|
70
78
|
getActions: ($fetch: BetterFetch, $store: ClientStore, options: BetterAuthClientOptions | undefined) => SIWNClientActions;
|
|
71
79
|
}
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACpF,OAAO,KAAK,EAAE,IAAI,IAAI,QAAQ,EAAiB,MAAM,UAAU,CAAC;AAGhE,OAAO,KAAK,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,WAAW,EAAqB,mBAAmB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5J,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAoB,KAAK,qBAAqB,EAAE,KAAK,yBAAyB,EAAE,KAAK,0BAA0B,EAAE,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,KAAK,WAAW,EAAE,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACpF,OAAO,KAAK,EAAE,IAAI,IAAI,QAAQ,EAAiB,MAAM,UAAU,CAAC;AAGhE,OAAO,KAAK,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,WAAW,EAAqB,mBAAmB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5J,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAoB,KAAK,qBAAqB,EAAE,KAAK,yBAAyB,EAAE,KAAK,0BAA0B,EAAE,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,KAAK,WAAW,EAAE,KAAK,qBAAqB,EAAE,KAAK,sBAAsB,EAAE,KAAK,wBAAwB,EAAE,KAAK,yBAAyB,EAAE,KAAK,mCAAmC,EAAE,KAAK,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAEpmB,MAAM,WAAW,aAAa;IAC7B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACtE;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AASD,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE;QACL,KAAK,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC;QAC/E,MAAM,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC;QAClF,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE,SAAS,KAAK,OAAO,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACtF,IAAI,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,OAAO,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC5F,YAAY,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;QAClC,QAAQ,EAAE,MAAM;YAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QACjG,iBAAiB,EAAE,MAAM,OAAO,CAAC;QACjC,eAAe,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QACxC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,MAAM,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;SAAE,KAAK,OAAO,CAAC,mBAAmB,CAAC;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC,CAAC;QAChJ,YAAY,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACxE,iBAAiB,EAAE,CAAC,MAAM,EAAE,yBAAyB,KAAK,OAAO,CAAC,mBAAmB,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACnH,yBAAyB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,KAAK,kBAAkB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1J,gBAAgB,EAAE,CAAC,MAAM,EAAE;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC;QAChG,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACvF,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,sBAAsB,KAAK,OAAO,CAAC,mBAAmB,CAAC,WAAW,GAAG;YAAE,OAAO,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC,CAAC;QACtH,YAAY,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACxE,gBAAgB,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,OAAO,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAChH,2BAA2B,EAAE,CAAC,MAAM,EAAE,mCAAmC,KAAK,OAAO,CAAC,mBAAmB,CAAC,oCAAoC,CAAC,CAAC,CAAC;QACjJ,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,KAAK,IAAI,CAAC;QACrD,UAAU,EAAE,MAAM,SAAS,GAAG,SAAS,CAAC;QACxC,oBAAoB,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,EAAE,CAAC;QACtD,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,KAAK,MAAM,CAAC;QAC1D,MAAM,EAAE,QAAQ,CAAC;KACjB,CAAC;IACF,MAAM,EAAE;QACP,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACnD,CAAC;CACF;AAED,MAAM,WAAW,gBAAiB,SAAQ,sBAAsB;IAC/D,EAAE,EAAE,MAAM,CAAC;IACX,kBAAkB,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;IAC5C,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK;QAClC,SAAS,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC;YAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACrH,eAAe,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAClD,aAAa,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC;KAC9D,CAAC;IACF,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,GAAG,SAAS,KAAK,iBAAiB,CAAC;CAC1H;AAED,eAAO,MAAM,UAAU,GAAI,QAAQ,gBAAgB,KAAG,gBA4hBrD,CAAC"}
|
package/dist/client.js
CHANGED
|
@@ -115,48 +115,82 @@ const RelayedTransactionSchema = z.object({
|
|
|
115
115
|
updatedAt: z.string().optional()
|
|
116
116
|
});
|
|
117
117
|
z.object({ transactions: z.array(RelayedTransactionSchema) });
|
|
118
|
+
z.object({ network: z.enum(["mainnet", "testnet"]).optional() });
|
|
119
|
+
z.object({
|
|
120
|
+
subAccountName: z.string().regex(/^[a-z0-9]+$/, "Must be lowercase alphanumeric characters only"),
|
|
121
|
+
network: z.enum(["mainnet", "testnet"]).optional(),
|
|
122
|
+
publicKey: z.string()
|
|
123
|
+
});
|
|
124
|
+
z.object({
|
|
125
|
+
success: z.literal(true),
|
|
126
|
+
accountId: z.string(),
|
|
127
|
+
network: z.enum(["mainnet", "testnet"]),
|
|
128
|
+
publicKey: z.string(),
|
|
129
|
+
message: z.string()
|
|
130
|
+
});
|
|
131
|
+
z.object({
|
|
132
|
+
subAccountName: z.string().regex(/^[a-z0-9]+$/),
|
|
133
|
+
network: z.enum(["mainnet", "testnet"]).optional()
|
|
134
|
+
});
|
|
135
|
+
z.object({
|
|
136
|
+
available: z.boolean(),
|
|
137
|
+
accountId: z.string()
|
|
138
|
+
});
|
|
118
139
|
//#endregion
|
|
119
140
|
//#region src/client.ts
|
|
120
141
|
const siwnClient = (config) => {
|
|
121
142
|
const nearState = atom(null);
|
|
122
143
|
const walletConnected = atom(false);
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
144
|
+
const activeNetwork = atom(config.networkId || "mainnet");
|
|
145
|
+
const getRecipient = (network) => {
|
|
146
|
+
const net = network || activeNetwork.get();
|
|
147
|
+
if (config.recipients) return config.recipients[net];
|
|
148
|
+
return config.recipient ?? "";
|
|
149
|
+
};
|
|
150
|
+
const getSupportedNetworks = () => {
|
|
151
|
+
if (config.recipients) return ["mainnet", "testnet"];
|
|
152
|
+
if (config.recipient) return [config.recipient.endsWith(".testnet") ? "testnet" : "mainnet"];
|
|
153
|
+
return ["mainnet"];
|
|
154
|
+
};
|
|
155
|
+
let connectors = /* @__PURE__ */ new Map();
|
|
156
|
+
let nearClients = /* @__PURE__ */ new Map();
|
|
157
|
+
let initializedNetworks = /* @__PURE__ */ new Set();
|
|
127
158
|
let connectorModulePromise = null;
|
|
128
|
-
let
|
|
159
|
+
let initPromises = /* @__PURE__ */ new Map();
|
|
129
160
|
const loadConnector = async () => {
|
|
130
161
|
connectorModulePromise ??= import("./build.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1));
|
|
131
162
|
const { NearConnector } = await connectorModulePromise;
|
|
132
163
|
return NearConnector;
|
|
133
164
|
};
|
|
134
|
-
const handleAccountConnection = async (accountId, publicKey) => {
|
|
165
|
+
const handleAccountConnection = async (accountId, publicKey, network) => {
|
|
135
166
|
if (!accountId) return;
|
|
167
|
+
const net = network || activeNetwork.get();
|
|
136
168
|
nearState.set({
|
|
137
169
|
accountId,
|
|
138
170
|
publicKey: publicKey || null,
|
|
139
|
-
networkId:
|
|
171
|
+
networkId: net
|
|
140
172
|
});
|
|
141
173
|
walletConnected.set(true);
|
|
142
174
|
};
|
|
143
|
-
const
|
|
144
|
-
if (
|
|
145
|
-
if (
|
|
175
|
+
const initClientForNetwork = async (network, $fetch) => {
|
|
176
|
+
if (initializedNetworks.has(network)) return true;
|
|
177
|
+
if (initPromises.has(network)) return initPromises.get(network);
|
|
146
178
|
if (typeof globalThis.window === "undefined") return false;
|
|
147
|
-
|
|
148
|
-
connector = new (await (loadConnector()))({
|
|
179
|
+
const initPromise = (async () => {
|
|
180
|
+
const connector = new (await (loadConnector()))({
|
|
149
181
|
network,
|
|
150
182
|
cspNonce: config.cspNonce
|
|
151
183
|
});
|
|
152
|
-
|
|
184
|
+
connectors.set(network, connector);
|
|
185
|
+
const near = new Near({
|
|
153
186
|
network,
|
|
154
187
|
wallet: fromNearConnect(connector)
|
|
155
188
|
});
|
|
189
|
+
nearClients.set(network, near);
|
|
156
190
|
connector.on("wallet:signIn", async (data) => {
|
|
157
191
|
const accountId = data.accounts?.[0]?.accountId;
|
|
158
192
|
const publicKey = data.accounts?.[0]?.publicKey;
|
|
159
|
-
if (accountId) await handleAccountConnection(accountId, publicKey);
|
|
193
|
+
if (accountId) await handleAccountConnection(accountId, publicKey, network);
|
|
160
194
|
});
|
|
161
195
|
connector.on("wallet:signOut", () => {
|
|
162
196
|
walletConnected.set(false);
|
|
@@ -169,23 +203,28 @@ const siwnClient = (config) => {
|
|
|
169
203
|
});
|
|
170
204
|
connector.getConnectedWallet().then(({ accounts }) => {
|
|
171
205
|
const account = accounts?.[0];
|
|
206
|
+
const net = activeNetwork.get();
|
|
172
207
|
if (account?.accountId && !nearState.get()) nearState.set({
|
|
173
208
|
accountId: account.accountId,
|
|
174
209
|
publicKey: account.publicKey ?? null,
|
|
175
|
-
networkId:
|
|
210
|
+
networkId: net
|
|
176
211
|
});
|
|
177
212
|
if (account?.accountId) walletConnected.set(true);
|
|
178
213
|
}).catch(() => {});
|
|
214
|
+
initializedNetworks.add(network);
|
|
179
215
|
if ($fetch) restoreFromSession($fetch);
|
|
180
|
-
clientInitialized = true;
|
|
181
216
|
return true;
|
|
182
217
|
})();
|
|
218
|
+
initPromises.set(network, initPromise);
|
|
183
219
|
try {
|
|
184
|
-
return await
|
|
220
|
+
return await initPromise;
|
|
185
221
|
} finally {
|
|
186
|
-
|
|
222
|
+
initPromises.delete(network);
|
|
187
223
|
}
|
|
188
224
|
};
|
|
225
|
+
const initClient = async ($fetch) => {
|
|
226
|
+
return initClientForNetwork(activeNetwork.get(), $fetch);
|
|
227
|
+
};
|
|
189
228
|
let sessionRestored = false;
|
|
190
229
|
const restoreFromSession = async ($fetch) => {
|
|
191
230
|
if (sessionRestored) return;
|
|
@@ -198,25 +237,34 @@ const siwnClient = (config) => {
|
|
|
198
237
|
const accounts = res.data?.accounts;
|
|
199
238
|
if (accounts?.length) {
|
|
200
239
|
const primary = res.data?.activeAccount || accounts.find((a) => a.isPrimary) || accounts[0];
|
|
201
|
-
if (primary)
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
240
|
+
if (primary) {
|
|
241
|
+
nearState.set({
|
|
242
|
+
accountId: primary.accountId,
|
|
243
|
+
publicKey: primary.publicKey ?? null,
|
|
244
|
+
networkId: primary.network
|
|
245
|
+
});
|
|
246
|
+
activeNetwork.set(primary.network);
|
|
247
|
+
}
|
|
206
248
|
}
|
|
207
249
|
} catch {}
|
|
208
250
|
sessionRestored = true;
|
|
209
251
|
};
|
|
210
|
-
const requireConnector = async () => {
|
|
211
|
-
|
|
252
|
+
const requireConnector = async (network) => {
|
|
253
|
+
const net = network || activeNetwork.get();
|
|
254
|
+
await initClientForNetwork(net);
|
|
255
|
+
const connector = connectors.get(net);
|
|
256
|
+
if (!connector) throw new Error(`Wallet not initialized for ${net} — this operation requires a browser environment`);
|
|
212
257
|
return connector;
|
|
213
258
|
};
|
|
214
|
-
const requireNear = () => {
|
|
215
|
-
|
|
216
|
-
|
|
259
|
+
const requireNear = (network) => {
|
|
260
|
+
const net = network || activeNetwork.get();
|
|
261
|
+
const client = nearClients.get(net);
|
|
262
|
+
if (!client) throw new Error(`Wallet not initialized for ${net} — this operation requires a browser environment`);
|
|
263
|
+
return client;
|
|
217
264
|
};
|
|
218
|
-
const ensureWalletConnected = async () => {
|
|
219
|
-
const
|
|
265
|
+
const ensureWalletConnected = async (network) => {
|
|
266
|
+
const net = network || activeNetwork.get();
|
|
267
|
+
const conn = await requireConnector(net);
|
|
220
268
|
if (walletConnected.get()) try {
|
|
221
269
|
const { accounts } = await conn.getConnectedWallet();
|
|
222
270
|
if (accounts?.length) return true;
|
|
@@ -226,7 +274,7 @@ const siwnClient = (config) => {
|
|
|
226
274
|
const accountId = data.accounts?.[0]?.accountId;
|
|
227
275
|
const publicKey = data.accounts?.[0]?.publicKey;
|
|
228
276
|
if (accountId) {
|
|
229
|
-
handleAccountConnection(accountId, publicKey);
|
|
277
|
+
handleAccountConnection(accountId, publicKey, net);
|
|
230
278
|
resolve(true);
|
|
231
279
|
}
|
|
232
280
|
};
|
|
@@ -238,19 +286,25 @@ const siwnClient = (config) => {
|
|
|
238
286
|
});
|
|
239
287
|
};
|
|
240
288
|
const signWithWallet = async () => {
|
|
241
|
-
const
|
|
242
|
-
const
|
|
289
|
+
const net = activeNetwork.get();
|
|
290
|
+
const conn = await requireConnector(net);
|
|
291
|
+
const nearClient = requireNear(net);
|
|
292
|
+
const recipient = getRecipient(net);
|
|
243
293
|
const nonceBytes = generateNonce();
|
|
244
294
|
const nonceHex = hex.encode(nonceBytes);
|
|
245
|
-
const message = `Sign in to ${
|
|
295
|
+
const message = `Sign in to ${recipient}`;
|
|
246
296
|
let connectedWallet = null;
|
|
247
297
|
try {
|
|
248
298
|
connectedWallet = await conn.getConnectedWallet();
|
|
249
299
|
} catch {}
|
|
300
|
+
if (connectedWallet?.accounts?.length) {
|
|
301
|
+
const isTestnetAccount = connectedWallet.accounts[0].accountId.endsWith(".testnet");
|
|
302
|
+
if (!(net === "testnet" === isTestnetAccount)) connectedWallet = null;
|
|
303
|
+
}
|
|
250
304
|
if (connectedWallet?.accounts?.length) {
|
|
251
305
|
const signedMessage = await nearClient.signMessage({
|
|
252
306
|
message,
|
|
253
|
-
recipient
|
|
307
|
+
recipient,
|
|
254
308
|
nonce: nonceBytes
|
|
255
309
|
});
|
|
256
310
|
if (!signedMessage?.accountId) throw new Error("Wallet sign-in was cancelled or failed");
|
|
@@ -274,7 +328,7 @@ const siwnClient = (config) => {
|
|
|
274
328
|
try {
|
|
275
329
|
await conn.connect({ signMessageParams: {
|
|
276
330
|
message,
|
|
277
|
-
recipient
|
|
331
|
+
recipient,
|
|
278
332
|
nonce: nonceBytes
|
|
279
333
|
} });
|
|
280
334
|
} finally {
|
|
@@ -289,12 +343,13 @@ const siwnClient = (config) => {
|
|
|
289
343
|
};
|
|
290
344
|
};
|
|
291
345
|
const buildSignedDelegateActionInternal = async (receiverId, buildActions) => {
|
|
346
|
+
const net = activeNetwork.get();
|
|
292
347
|
const state = nearState.get();
|
|
293
348
|
if (!state?.accountId) throw new Error("No NEAR account found — please sign in with your NEAR wallet");
|
|
294
349
|
if (!walletConnected.get()) {
|
|
295
|
-
if (!await ensureWalletConnected()) throw new Error("Wallet connection required — please approve the connection to sign");
|
|
350
|
+
if (!await ensureWalletConnected(net)) throw new Error("Wallet connection required — please approve the connection to sign");
|
|
296
351
|
}
|
|
297
|
-
const { payload } = await buildActions(requireNear().transaction(state.accountId), receiverId).delegate();
|
|
352
|
+
const { payload } = await buildActions(requireNear(net).transaction(state.accountId), receiverId).delegate();
|
|
298
353
|
return payload;
|
|
299
354
|
};
|
|
300
355
|
return {
|
|
@@ -302,7 +357,8 @@ const siwnClient = (config) => {
|
|
|
302
357
|
$InferServerPlugin: {},
|
|
303
358
|
getAtoms: (_$fetch) => ({
|
|
304
359
|
nearState,
|
|
305
|
-
walletConnected
|
|
360
|
+
walletConnected,
|
|
361
|
+
activeNetwork
|
|
306
362
|
}),
|
|
307
363
|
getActions: ($fetch, _$store, _options) => {
|
|
308
364
|
initClient($fetch);
|
|
@@ -342,33 +398,41 @@ const siwnClient = (config) => {
|
|
|
342
398
|
getState: () => nearState.get(),
|
|
343
399
|
isWalletConnected: () => walletConnected.get(),
|
|
344
400
|
ensureConnected: async () => {
|
|
345
|
-
|
|
346
|
-
|
|
401
|
+
const net = activeNetwork.get();
|
|
402
|
+
if (!initializedNetworks.has(net)) {
|
|
403
|
+
if (!await initClientForNetwork(net)) return false;
|
|
347
404
|
}
|
|
348
405
|
if (walletConnected.get()) try {
|
|
349
|
-
const
|
|
350
|
-
if (
|
|
406
|
+
const conn = connectors.get(net);
|
|
407
|
+
if (conn) {
|
|
408
|
+
const { accounts } = await conn.getConnectedWallet();
|
|
409
|
+
if (accounts?.length) return true;
|
|
410
|
+
}
|
|
351
411
|
} catch (err) {
|
|
352
412
|
console.error("[siwn] restoreFromSession failed:", err instanceof Error ? err.message : err);
|
|
353
413
|
}
|
|
354
|
-
return ensureWalletConnected();
|
|
414
|
+
return ensureWalletConnected(net);
|
|
355
415
|
},
|
|
356
416
|
disconnect: async () => {
|
|
357
|
-
|
|
417
|
+
for (const [_net, conn] of connectors) if (conn) try {
|
|
418
|
+
await conn.disconnect();
|
|
419
|
+
} catch {}
|
|
358
420
|
walletConnected.set(false);
|
|
359
421
|
nearState.set(null);
|
|
360
422
|
},
|
|
361
423
|
link: async (callbacks) => {
|
|
424
|
+
const net = activeNetwork.get();
|
|
425
|
+
const recipient = getRecipient(net);
|
|
362
426
|
try {
|
|
363
427
|
const { signedMessage, accountId, nonceHex } = await signWithWallet();
|
|
364
|
-
const message = `Sign in to ${
|
|
365
|
-
await handleAccountConnection(accountId, signedMessage.publicKey);
|
|
428
|
+
const message = `Sign in to ${recipient}`;
|
|
429
|
+
await handleAccountConnection(accountId, signedMessage.publicKey, net);
|
|
366
430
|
const linkResponse = await $fetch("/near/link-account", {
|
|
367
431
|
method: "POST",
|
|
368
432
|
body: {
|
|
369
433
|
signedMessage,
|
|
370
434
|
message,
|
|
371
|
-
recipient
|
|
435
|
+
recipient,
|
|
372
436
|
nonce: nonceHex,
|
|
373
437
|
accountId
|
|
374
438
|
}
|
|
@@ -397,11 +461,14 @@ const siwnClient = (config) => {
|
|
|
397
461
|
body: params
|
|
398
462
|
});
|
|
399
463
|
const activeAccount = response.data?.activeAccount;
|
|
400
|
-
if (activeAccount)
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
464
|
+
if (activeAccount) {
|
|
465
|
+
nearState.set({
|
|
466
|
+
accountId: activeAccount.accountId,
|
|
467
|
+
publicKey: activeAccount.publicKey ?? null,
|
|
468
|
+
networkId: activeAccount.network
|
|
469
|
+
});
|
|
470
|
+
activeNetwork.set(activeAccount.network);
|
|
471
|
+
}
|
|
405
472
|
return response;
|
|
406
473
|
},
|
|
407
474
|
buildSignedDelegateAction: async (receiverId, buildActions) => {
|
|
@@ -416,28 +483,61 @@ const siwnClient = (config) => {
|
|
|
416
483
|
getRelayStatus: async (txHash) => {
|
|
417
484
|
return await $fetch(`/near/relay-status/${txHash}`, { method: "GET" });
|
|
418
485
|
},
|
|
419
|
-
getRelayerInfo: async () => {
|
|
420
|
-
return await $fetch("/near/relayer-info", {
|
|
486
|
+
getRelayerInfo: async (params) => {
|
|
487
|
+
return await $fetch("/near/relayer-info", {
|
|
488
|
+
method: "POST",
|
|
489
|
+
body: params ?? {}
|
|
490
|
+
});
|
|
421
491
|
},
|
|
422
492
|
relayHistory: async () => {
|
|
423
493
|
return await $fetch("/near/relay-history", { method: "GET" });
|
|
424
494
|
},
|
|
495
|
+
createSubAccount: async (params) => {
|
|
496
|
+
return await $fetch("/near/create-sub-account", {
|
|
497
|
+
method: "POST",
|
|
498
|
+
body: params
|
|
499
|
+
});
|
|
500
|
+
},
|
|
501
|
+
checkSubAccountAvailability: async (params) => {
|
|
502
|
+
return await $fetch("/near/check-sub-account-availability", {
|
|
503
|
+
method: "POST",
|
|
504
|
+
body: params
|
|
505
|
+
});
|
|
506
|
+
},
|
|
507
|
+
setNetwork: (network) => {
|
|
508
|
+
const prev = activeNetwork.get();
|
|
509
|
+
if (prev !== network) {
|
|
510
|
+
const oldConn = connectors.get(prev);
|
|
511
|
+
if (oldConn) oldConn.disconnect().catch(() => {});
|
|
512
|
+
walletConnected.set(false);
|
|
513
|
+
nearState.set(null);
|
|
514
|
+
}
|
|
515
|
+
activeNetwork.set(network);
|
|
516
|
+
initClientForNetwork(network);
|
|
517
|
+
},
|
|
518
|
+
getNetwork: () => activeNetwork.get(),
|
|
519
|
+
getSupportedNetworks: () => getSupportedNetworks(),
|
|
520
|
+
getRecipient: (network) => getRecipient(network),
|
|
425
521
|
get client() {
|
|
426
|
-
|
|
427
|
-
|
|
522
|
+
const net = activeNetwork.get();
|
|
523
|
+
const client = nearClients.get(net);
|
|
524
|
+
if (!client) throw new Error(`Wallet not initialized for ${net} — this operation requires a browser environment`);
|
|
525
|
+
return client;
|
|
428
526
|
}
|
|
429
527
|
},
|
|
430
528
|
signIn: { near: async (callbacks) => {
|
|
431
529
|
try {
|
|
432
530
|
const { signedMessage, accountId, nonceHex } = await signWithWallet();
|
|
433
|
-
const
|
|
434
|
-
|
|
531
|
+
const net = activeNetwork.get();
|
|
532
|
+
const recipient = getRecipient(net);
|
|
533
|
+
const message = `Sign in to ${recipient}`;
|
|
534
|
+
await handleAccountConnection(accountId, signedMessage.publicKey, net);
|
|
435
535
|
const verifyResponse = await $fetch("/near/verify", {
|
|
436
536
|
method: "POST",
|
|
437
537
|
body: {
|
|
438
538
|
signedMessage,
|
|
439
539
|
message,
|
|
440
|
-
recipient
|
|
540
|
+
recipient,
|
|
441
541
|
nonce: nonceHex,
|
|
442
542
|
accountId
|
|
443
543
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":[],"sources":["../src/types.ts","../src/client.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { AccountIdSchema, type AccountId } from \"near-kit/schemas\";\nimport type { AccountState } from \"near-kit\";\n\nexport type { AccountId };\n\nexport interface NearAccount {\n\tid: string;\n\tuserId: string;\n\taccountId: string;\n\tnetwork: \"mainnet\" | \"testnet\";\n\tpublicKey: string;\n\tisPrimary: boolean;\n\tcreatedAt: Date;\n}\n\nexport interface ListedNearAccount extends NearAccount {\n\tproviderId: \"siwn\";\n\tisActive: boolean;\n\tisAvailable: boolean;\n}\n\nexport interface ListAccountsResponseT {\n\taccounts: ListedNearAccount[];\n\tactiveAccount: ListedNearAccount | null;\n\tavailableAccounts: ListedNearAccount[];\n}\n\nexport interface SetPrimaryAccountResponseT extends ListAccountsResponseT {\n\tsuccess: boolean;\n\taccountId: string;\n\tnetwork: \"mainnet\" | \"testnet\";\n\tmessage: string;\n}\n\nexport const socialImageSchema = z.object({\n\turl: z.string().optional(),\n\tipfs_cid: z.string().optional(),\n});\n\nexport const profileSchema = z.object({\n\tname: z.string().optional(),\n\tdescription: z.string().optional(),\n\timage: socialImageSchema.optional(),\n\tbackgroundImage: socialImageSchema.optional(),\n\tlinktree: z.record(z.string(), z.string()).optional(),\n});\n\nexport type SocialImage = z.infer<typeof socialImageSchema>;\nexport type Profile = z.infer<typeof profileSchema>;\n\nconst signedMessageSchema = z.object({\n\taccountId: z.string(),\n\tpublicKey: z.string(),\n\tsignature: z.string(),\n\tstate: z.string().optional(),\n});\n\nexport const LinkAccountRequest = z.object({\n\tsignedMessage: signedMessageSchema,\n\tmessage: z.string(),\n\trecipient: z.string(),\n\tnonce: z.string(),\n\taccountId: AccountIdSchema,\n});\n\nexport const SetPrimaryAccountRequest = z.object({\n\taccountId: AccountIdSchema,\n\tnetwork: z.enum([\"mainnet\", \"testnet\"]).optional(),\n});\n\nexport const NonceRequest = z.object({\n\taccountId: AccountIdSchema,\n\tnetworkId: z.union([z.literal(\"mainnet\"), z.literal(\"testnet\")])\n});\n\nexport const VerifyRequest = z.object({\n\tsignedMessage: signedMessageSchema,\n\tmessage: z.string(),\n\trecipient: z.string(),\n\tnonce: z.string(),\n\taccountId: AccountIdSchema,\n});\n\nexport const RelayRequest = z.object({\n\tpayload: z.string(),\n});\nexport type RelayRequestT = z.infer<typeof RelayRequest>;\n\nexport const RelayResponse = z.object({\n\ttxHash: z.string(),\n\tstatus: z.enum([\"pending\", \"completed\", \"failed\"]),\n});\nexport type RelayResponseT = z.infer<typeof RelayResponse>;\n\nexport const RelayStatusResponse = z.object({\n\tstatus: z.enum([\"pending\", \"completed\", \"failed\"]),\n\tgasUsed: z.string().optional(),\n\toutcome: z.unknown().optional(),\n});\nexport type RelayStatusResponseT = z.infer<typeof RelayStatusResponse>;\n\nexport const ViewContractRequest = z.object({\n\tcontractId: z.string(),\n\tmethodName: z.string(),\n\targs: z.record(z.string(), z.any()).optional(),\n});\nexport type ViewContractRequestT = z.infer<typeof ViewContractRequest>;\n\nexport const NonceResponse = z.object({ nonce: z.string() });\nexport const VerifyResponse = z.object({\n\ttoken: z.string(),\n\tsuccess: z.literal(true),\n\tuser: z.object({\n\t\tid: z.string(),\n\t\taccountId: AccountIdSchema,\n\t\tnetwork: z.union([z.literal(\"mainnet\"), z.literal(\"testnet\")]),\n\t}),\n});\nexport const ProfileResponse = profileSchema.nullable();\nexport const ViewContractResponse = z.object({ result: z.unknown() });\n\nexport const ProfileRequest = z.object({\n\taccountId: AccountIdSchema.optional(),\n});\nexport type ProfileRequestT = z.infer<typeof ProfileRequest>;\n\nexport type NonceRequestT = z.infer<typeof NonceRequest>;\nexport type NonceResponseT = z.infer<typeof NonceResponse>;\nexport type SetPrimaryAccountRequestT = z.infer<typeof SetPrimaryAccountRequest>;\nexport type VerifyRequestT = z.infer<typeof VerifyRequest>;\nexport type VerifyResponseT = z.infer<typeof VerifyResponse>;\nexport type ProfileResponseT = z.infer<typeof ProfileResponse>;\nexport type ViewContractResponseT = z.infer<typeof ViewContractResponse>;\n\nexport const RelayedTransactionSchema = z.object({\n\tid: z.string(),\n\tuserId: z.string(),\n\ttxHash: z.string(),\n\tsenderId: z.string(),\n\treceiverId: z.string(),\n\tnetwork: z.string(),\n\tstatus: z.string(),\n\tgasUsed: z.string().optional(),\n\tcreatedAt: z.string(),\n\tupdatedAt: z.string().optional(),\n});\nexport type RelayedTransactionT = z.infer<typeof RelayedTransactionSchema>;\n\nexport const RelayHistoryResponse = z.object({\n\ttransactions: z.array(RelayedTransactionSchema),\n});\nexport type RelayHistoryResponseT = z.infer<typeof RelayHistoryResponse>;\n\nexport interface RelayedTransactionRecord {\n\tid: string;\n\tuserId: string;\n\ttxHash: string;\n\tsenderId: string;\n\treceiverId: string;\n\tnetwork: \"mainnet\" | \"testnet\";\n\tstatus: string;\n\tgasUsed?: string;\n\tcreatedAt: Date;\n\tupdatedAt: Date;\n}\n\nexport interface RelayerInfo extends AccountState {\n\taccountId: string;\n\tmode: \"ephemeral\" | \"explicit\";\n\tnetwork: \"mainnet\" | \"testnet\";\n\thasKey: boolean;\n\tcreatedAt?: Date;\n\tlastUsedAt?: Date;\n}\n","import { Near, fromNearConnect, generateNonce, TransactionBuilder } from \"near-kit\";\nimport type { Near as NearType, SignedMessage } from \"near-kit\";\nimport type { EventMap } from \"@hot-labs/near-connect\";\nimport { hex } from \"@scure/base\";\nimport type { BetterAuthClientPlugin, BetterAuthClientOptions, BetterFetch, BetterFetchOption, BetterFetchResponse, ClientStore } from \"better-auth/client\";\nimport { atom } from \"nanostores\";\nimport type { siwn } from \"./index.js\";\nimport { type AccountId, type NonceRequestT, type NonceResponseT, type ProfileResponseT, type VerifyRequestT, type VerifyResponseT, type RelayResponseT, type RelayStatusResponseT, type NearAccount, type ListAccountsResponseT, type SetPrimaryAccountRequestT, type SetPrimaryAccountResponseT, type ViewContractRequestT, type ViewContractResponseT, type RelayerInfo, type RelayHistoryResponseT } from \"./types.js\";\n\nexport interface AuthCallbacks {\n\tonSuccess?: () => void;\n\tonError?: (error: Error & { status?: number; code?: string }) => void;\n}\n\nexport interface SIWNClientConfig {\n\trecipient: string;\n\tnetworkId?: \"mainnet\" | \"testnet\";\n\tcspNonce?: string;\n}\n\ninterface SignWithWalletResult {\n\tsignedMessage: SignedMessage;\n\taccountId: string;\n\tpublicKey: string;\n\tnonceHex: string;\n}\n\nexport interface SIWNClientActions {\n\tnear: {\n\t\tnonce: (params: NonceRequestT) => Promise<BetterFetchResponse<NonceResponseT>>;\n\t\tverify: (params: VerifyRequestT) => Promise<BetterFetchResponse<VerifyResponseT>>;\n\t\tgetProfile: (accountId?: AccountId) => Promise<BetterFetchResponse<ProfileResponseT>>;\n\t\tview: (params: ViewContractRequestT) => Promise<BetterFetchResponse<ViewContractResponseT>>;\n\t\tgetAccountId: () => string | null;\n\t\tgetState: () => { accountId: string | null; publicKey: string | null; networkId: string } | null;\n\t\tisWalletConnected: () => boolean;\n\t\tensureConnected: () => Promise<boolean>;\n\t\tdisconnect: () => Promise<void>;\n\t\tlink: (callbacks?: AuthCallbacks) => Promise<void>;\n\t\tunlink: (params: { accountId: string; network?: \"mainnet\" | \"testnet\" }) => Promise<BetterFetchResponse<{ success: boolean; message: string }>>;\n\t\tlistAccounts: () => Promise<BetterFetchResponse<ListAccountsResponseT>>;\n\t\tsetPrimaryAccount: (params: SetPrimaryAccountRequestT) => Promise<BetterFetchResponse<SetPrimaryAccountResponseT>>;\n\t\tbuildSignedDelegateAction: (receiverId: string, buildActions: (builder: TransactionBuilder, receiverId: string) => TransactionBuilder) => Promise<string>;\n\t\trelayTransaction: (params: { payload: string }) => Promise<BetterFetchResponse<RelayResponseT>>;\n\t\tgetRelayStatus: (txHash: string) => Promise<BetterFetchResponse<RelayStatusResponseT>>;\n\t\tgetRelayerInfo: () => Promise<BetterFetchResponse<RelayerInfo & { enabled: boolean }>>;\n\t\trelayHistory: () => Promise<BetterFetchResponse<RelayHistoryResponseT>>;\n\t\tclient: NearType;\n\t};\n\tsignIn: {\n\t\tnear: (callbacks?: AuthCallbacks) => Promise<void>;\n\t};\n}\n\nexport interface SIWNClientPlugin extends BetterAuthClientPlugin {\n\tid: \"siwn\";\n\t$InferServerPlugin: ReturnType<typeof siwn>;\n\tgetAtoms: ($fetch: BetterFetch) => {\n\t\tnearState: ReturnType<typeof atom<{ accountId: string | null; publicKey: string | null; networkId: string } | null>>;\n\t\twalletConnected: ReturnType<typeof atom<boolean>>;\n\t};\n\tgetActions: ($fetch: BetterFetch, $store: ClientStore, options: BetterAuthClientOptions | undefined) => SIWNClientActions;\n}\n\nexport const siwnClient = (config: SIWNClientConfig): SIWNClientPlugin => {\n\tconst nearState = atom<{ accountId: string | null; publicKey: string | null; networkId: string } | null>(null);\n\tconst walletConnected = atom<boolean>(false);\n\n\tconst network = config.networkId || \"mainnet\";\n\n\tlet connector: InstanceType<typeof import(\"@hot-labs/near-connect\").NearConnector> | null = null;\n\tlet near: Near | null = null;\n\tlet clientInitialized = false;\n\tlet connectorModulePromise: Promise<typeof import(\"@hot-labs/near-connect\")> | null = null;\n\tlet initClientPromise: Promise<boolean> | null = null;\n\n\tconst loadConnector = async () => {\n\t\tconnectorModulePromise ??= import(\"@hot-labs/near-connect\");\n\t\tconst { NearConnector } = await connectorModulePromise;\n\t\treturn NearConnector;\n\t};\n\n\tconst handleAccountConnection = async (accountId: string, publicKey?: string | null) => {\n\t\tif (!accountId) return;\n\t\tnearState.set({\n\t\t\taccountId,\n\t\t\tpublicKey: publicKey || null,\n\t\t\tnetworkId: network,\n\t\t});\n\t\twalletConnected.set(true);\n\t};\n\n\tconst initClient = async ($fetch?: BetterFetch): Promise<boolean> => {\n\t\tif (clientInitialized) return true;\n\t\tif (initClientPromise) return initClientPromise;\n\t\tif (typeof (globalThis as any).window === \"undefined\") return false;\n\n\t\tinitClientPromise = (async () => {\n\t\t\tconst NearConnector = await loadConnector();\n\t\t\tconnector = new NearConnector({ network, cspNonce: config.cspNonce });\n\t\t\tnear = new Near({\n\t\t\t\tnetwork,\n\t\t\t\twallet: fromNearConnect(connector),\n\t\t\t});\n\n\t\t\tconnector.on(\"wallet:signIn\", async (data: EventMap[\"wallet:signIn\"]) => {\n\t\t\t\tconst accountId = data.accounts?.[0]?.accountId;\n\t\t\t\tconst publicKey = data.accounts?.[0]?.publicKey;\n\t\t\t\tif (accountId) {\n\t\t\t\t\tawait handleAccountConnection(accountId, publicKey);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconnector.on(\"wallet:signOut\", () => {\n\t\t\t\twalletConnected.set(false);\n\t\t\t\tconst state = nearState.get();\n\t\t\t\tif (state) {\n\t\t\t\t\tnearState.set({ accountId: state.accountId, publicKey: null, networkId: state.networkId });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvoid connector.getConnectedWallet().then(({ accounts }) => {\n\t\t\t\tconst account = accounts?.[0];\n\t\t\t\tif (account?.accountId && !nearState.get()) {\n\t\t\t\t\tnearState.set({\n\t\t\t\t\t\taccountId: account.accountId,\n\t\t\t\t\t\tpublicKey: account.publicKey ?? null,\n\t\t\t\t\t\tnetworkId: network,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (account?.accountId) {\n\t\t\t\t\twalletConnected.set(true);\n\t\t\t\t}\n\t\t\t}).catch(() => {});\n\n\t\t\tif ($fetch) {\n\t\t\t\tvoid restoreFromSession($fetch);\n\t\t\t}\n\n\t\t\tclientInitialized = true;\n\t\t\treturn true;\n\t\t})();\n\n\t\ttry {\n\t\t\treturn await initClientPromise;\n\t\t} finally {\n\t\t\tif (!clientInitialized) {\n\t\t\t\tinitClientPromise = null;\n\t\t\t}\n\t\t}\n\t};\n\n\tlet sessionRestored = false;\n\n\tconst restoreFromSession = async ($fetch: BetterFetch) => {\n\t\tif (sessionRestored) return;\n\t\tconst state = nearState.get();\n\t\tif (state?.accountId) {\n\t\t\tsessionRestored = true;\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst res = await $fetch<ListAccountsResponseT>(\"/near/list-accounts\", { method: \"GET\" });\n\t\t\tconst accounts = res.data?.accounts;\n\t\t\tif (accounts?.length) {\n\t\t\t\tconst primary = res.data?.activeAccount || accounts.find((a: NearAccount) => a.isPrimary) || accounts[0];\n\t\t\t\tif (primary) {\n\t\t\t\t\tnearState.set({\n\t\t\t\t\t\taccountId: primary.accountId,\n\t\t\t\t\t\tpublicKey: primary.publicKey ?? null,\n\t\t\t\t\t\tnetworkId: primary.network as \"mainnet\" | \"testnet\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t\tsessionRestored = true;\n\t};\n\n\tconst requireConnector = async () => {\n\t\tif (!connector) throw new Error(\"Wallet not initialized — this operation requires a browser environment\");\n\t\treturn connector;\n\t};\n\n\tconst requireNear = (): Near => {\n\t\tif (!near) throw new Error(\"Wallet not initialized — this operation requires a browser environment\");\n\t\treturn near;\n\t};\n\n\tconst ensureWalletConnected = async (): Promise<boolean> => {\n\t\tconst conn = await requireConnector();\n\t\tif (walletConnected.get()) {\n\t\t\ttry {\n\t\t\t\tconst { accounts } = await conn.getConnectedWallet();\n\t\t\t\tif (accounts?.length) return true;\n\t\t\t} catch {}\n\t\t}\n\n\t\treturn new Promise<boolean>((resolve) => {\n\t\t\tconst signInHandler = (data: EventMap[\"wallet:signIn\"]) => {\n\t\t\t\tconst accountId = data.accounts?.[0]?.accountId;\n\t\t\t\tconst publicKey = data.accounts?.[0]?.publicKey;\n\t\t\t\tif (accountId) {\n\t\t\t\t\thandleAccountConnection(accountId, publicKey);\n\t\t\t\t\tresolve(true);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconn.on(\"wallet:signIn\", signInHandler);\n\n\t\t\tconn.connect().catch(() => {}).finally(() => {\n\t\t\t\tconn.off(\"wallet:signIn\", signInHandler);\n\t\t\t\tif (!walletConnected.get()) {\n\t\t\t\t\tresolve(false);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t};\n\n\tconst signWithWallet = async (): Promise<SignWithWalletResult> => {\n\t\tconst conn = await requireConnector();\n\t\tconst nearClient = requireNear();\n\n\t\tconst nonceBytes = generateNonce();\n\t\tconst nonceHex = hex.encode(nonceBytes);\n\t\tconst message = `Sign in to ${config.recipient}`;\n\n\t\tlet connectedWallet: Awaited<ReturnType<typeof conn.getConnectedWallet>> | null = null;\n\t\ttry {\n\t\t\tconnectedWallet = await conn.getConnectedWallet();\n\t\t} catch {}\n\n\t\tif (connectedWallet?.accounts?.length) {\n\t\t\tconst signedMessage = await nearClient.signMessage({\n\t\t\t\tmessage,\n\t\t\t\trecipient: config.recipient,\n\t\t\t\tnonce: nonceBytes,\n\t\t\t});\n\n\t\t\tif (!signedMessage?.accountId) {\n\t\t\t\tthrow new Error(\"Wallet sign-in was cancelled or failed\");\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsignedMessage,\n\t\t\t\taccountId: signedMessage.accountId,\n\t\t\t\tpublicKey: signedMessage.publicKey,\n\t\t\t\tnonceHex,\n\t\t\t};\n\t\t}\n\n\t\tconst result: { value: { signedMessage: SignedMessage; accountId: string; publicKey: string } | null } = { value: null };\n\t\tconst handler = (data: EventMap[\"wallet:signInAndSignMessage\"]) => {\n\t\t\tconst account = data.accounts?.[0];\n\t\t\tif (account?.signedMessage) {\n\t\t\t\tresult.value = {\n\t\t\t\t\tsignedMessage: account.signedMessage,\n\t\t\t\t\taccountId: account.accountId,\n\t\t\t\t\tpublicKey: account.signedMessage.publicKey,\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\n\t\tconn.on(\"wallet:signInAndSignMessage\", handler);\n\n\t\ttry {\n\t\t\tawait conn.connect({\n\t\t\t\tsignMessageParams: {\n\t\t\t\t\tmessage,\n\t\t\t\t\trecipient: config.recipient,\n\t\t\t\t\tnonce: nonceBytes,\n\t\t\t\t},\n\t\t\t});\n\t\t} finally {\n\t\t\tconn.off(\"wallet:signInAndSignMessage\", handler);\n\t\t}\n\n\t\tif (!result.value) {\n\t\t\tthrow new Error(\"Wallet sign-in was cancelled or failed\");\n\t\t}\n\n\t\treturn {\n\t\t\tsignedMessage: result.value.signedMessage,\n\t\t\taccountId: result.value.accountId,\n\t\t\tpublicKey: result.value.publicKey,\n\t\t\tnonceHex,\n\t\t};\n\t};\n\n\tconst buildSignedDelegateActionInternal = async (\n\t\treceiverId: string,\n\t\tbuildActions: (builder: TransactionBuilder, receiverId: string) => TransactionBuilder,\n\t): Promise<string> => {\n\t\tconst state = nearState.get();\n\t\tif (!state?.accountId) {\n\t\t\tthrow new Error(\"No NEAR account found — please sign in with your NEAR wallet\");\n\t\t}\n\n\t\tif (!walletConnected.get()) {\n\t\t\tconst reconnected = await ensureWalletConnected();\n\t\t\tif (!reconnected) {\n\t\t\t\tthrow new Error(\"Wallet connection required — please approve the connection to sign\");\n\t\t\t}\n\t\t}\n\n\t\tconst nearClient = requireNear();\n\t\tconst builder = buildActions(nearClient.transaction(state.accountId), receiverId);\n\n\t\tconst { payload } = await builder.delegate();\n\t\treturn payload;\n\t};\n\n\treturn {\n\t\tid: \"siwn\",\n\t\t$InferServerPlugin: {} as ReturnType<typeof siwn>,\n\n\t\tgetAtoms: (_$fetch) => ({\n\t\t\tnearState,\n\t\t\twalletConnected,\n\t\t}),\n\n\t\tgetActions: ($fetch: BetterFetch, _$store: ClientStore, _options: BetterAuthClientOptions | undefined): SIWNClientActions => {\n\t\t\tvoid initClient($fetch);\n\n\t\t\treturn {\n\t\t\t\tnear: {\n\t\t\t\t\tnonce: async (params: NonceRequestT, fetchOptions?: BetterFetchOption): Promise<BetterFetchResponse<NonceResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/nonce\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: params,\n\t\t\t\t\t\t\t...fetchOptions\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tverify: async (params: VerifyRequestT, fetchOptions?: BetterFetchOption): Promise<BetterFetchResponse<VerifyResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/verify\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: params,\n\t\t\t\t\t\t\t...fetchOptions\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tgetProfile: async (accountId?: AccountId, fetchOptions?: BetterFetchOption): Promise<BetterFetchResponse<ProfileResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/profile\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: { accountId },\n\t\t\t\t\t\t\t...fetchOptions\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tview: async (params: ViewContractRequestT, fetchOptions?: BetterFetchOption): Promise<BetterFetchResponse<ViewContractResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/view\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: params,\n\t\t\t\t\t\t\t...fetchOptions\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tgetAccountId: () => {\n\t\t\t\t\t\tconst state = nearState.get();\n\t\t\t\t\t\treturn state?.accountId || null;\n\t\t\t\t\t},\n\t\t\t\t\tgetState: () => nearState.get(),\n\t\t\t\t\tisWalletConnected: () => walletConnected.get(),\n\t\t\t\t\tensureConnected: async () => {\n\t\t\t\t\t\tif (!clientInitialized) {\n\t\t\t\t\t\t\tif (!(await initClient())) return false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (walletConnected.get()) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst { accounts } = await (await requireConnector()).getConnectedWallet();\n\t\t\t\t\t\t\t\tif (accounts?.length) return true;\n\t\t} catch (err) {\n\t\t\tconsole.error(\"[siwn] restoreFromSession failed:\", err instanceof Error ? err.message : err);\n\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn ensureWalletConnected();\n\t\t\t\t\t},\n\t\t\t\t\tdisconnect: async () => {\n\t\t\t\t\t\tif (connector) await connector.disconnect();\n\t\t\t\t\t\twalletConnected.set(false);\n\t\t\t\t\t\tnearState.set(null);\n\t\t\t\t\t},\n\t\t\t\t\tlink: async (\n\t\t\t\t\t\tcallbacks?: AuthCallbacks\n\t\t\t\t\t): Promise<void> => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst { signedMessage, accountId, nonceHex } = await signWithWallet();\n\t\t\t\t\t\t\tconst message = `Sign in to ${config.recipient}`;\n\n\t\t\t\t\t\t\tawait handleAccountConnection(accountId, signedMessage.publicKey);\n\n\t\t\t\t\t\t\tconst linkResponse = await $fetch<{ success: boolean; accountId: string; network: string; message: string }>(\"/near/link-account\", {\n\t\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\tsignedMessage,\n\t\t\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\t\t\trecipient: config.recipient,\n\t\t\t\t\t\t\t\t\tnonce: nonceHex,\n\t\t\t\t\t\t\t\t\taccountId,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (linkResponse.error) {\n\t\t\t\t\t\t\t\tthrow new Error(linkResponse.error.message || \"Failed to link NEAR account\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!linkResponse?.data?.success) {\n\t\t\t\t\t\t\t\tthrow new Error(\"Account linking failed\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcallbacks?.onSuccess?.();\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\t\t\tcallbacks?.onError?.(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tunlink: async (\n\t\t\t\t\t\tparams: { accountId: string; network?: \"mainnet\" | \"testnet\" },\n\t\t\t\t\t\tfetchOptions?: BetterFetchOption\n\t\t\t\t\t): Promise<BetterFetchResponse<{ success: boolean; message: string }>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/unlink-account\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: params,\n\t\t\t\t\t\t\t...fetchOptions\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tlistAccounts: async (): Promise<BetterFetchResponse<ListAccountsResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/list-accounts\", { method: \"GET\" });\n\t\t\t\t\t},\n\t\t\t\t\tsetPrimaryAccount: async (\n\t\t\t\t\t\tparams: SetPrimaryAccountRequestT\n\t\t\t\t\t): Promise<BetterFetchResponse<SetPrimaryAccountResponseT>> => {\n\t\t\t\t\t\tconst response = await $fetch<SetPrimaryAccountResponseT>(\"/near/set-primary-account\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: params,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst activeAccount = response.data?.activeAccount;\n\t\t\t\t\t\tif (activeAccount) {\n\t\t\t\t\t\t\tnearState.set({\n\t\t\t\t\t\t\t\taccountId: activeAccount.accountId,\n\t\t\t\t\t\t\t\tpublicKey: activeAccount.publicKey ?? null,\n\t\t\t\t\t\t\t\tnetworkId: activeAccount.network,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn response;\n\t\t\t\t\t},\n\t\t\t\t\tbuildSignedDelegateAction: async (\n\t\t\t\t\t\treceiverId: string,\n\t\t\t\t\t\tbuildActions: (builder: TransactionBuilder, receiverId: string) => TransactionBuilder,\n\t\t\t\t\t): Promise<string> => {\n\t\t\t\t\t\treturn buildSignedDelegateActionInternal(receiverId, buildActions);\n\t\t\t\t\t},\n\t\t\t\t\trelayTransaction: async (params: {\n\t\t\t\t\t\tpayload: string;\n\t\t\t\t\t}): Promise<BetterFetchResponse<RelayResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/relay\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: params,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tgetRelayStatus: async (txHash: string): Promise<BetterFetchResponse<RelayStatusResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(`/near/relay-status/${txHash}`, {\n\t\t\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tgetRelayerInfo: async (): Promise<BetterFetchResponse<RelayerInfo & { enabled: boolean }>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/relayer-info\", {\n\t\t\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\trelayHistory: async (): Promise<BetterFetchResponse<RelayHistoryResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/relay-history\", {\n\t\t\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tget client(): NearType {\n\t\t\t\t\t\tif (!near) throw new Error(\"Wallet not initialized — this operation requires a browser environment\");\n\t\t\t\t\t\treturn near;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsignIn: {\n\t\t\t\t\tnear: async (\n\t\t\t\t\t\tcallbacks?: AuthCallbacks\n\t\t\t\t\t): Promise<void> => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst { signedMessage, accountId, nonceHex } = await signWithWallet();\n\t\t\t\t\t\t\tconst message = `Sign in to ${config.recipient}`;\n\n\t\t\t\t\t\t\tawait handleAccountConnection(accountId, signedMessage.publicKey);\n\n\t\t\t\t\t\t\tconst verifyResponse: BetterFetchResponse<VerifyResponseT> = await $fetch(\"/near/verify\", {\n\t\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\tsignedMessage,\n\t\t\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\t\t\trecipient: config.recipient,\n\t\t\t\t\t\t\t\t\tnonce: nonceHex,\n\t\t\t\t\t\t\t\t\taccountId,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (verifyResponse.error) {\n\t\t\t\t\t\t\t\tthrow new Error(verifyResponse.error.message || \"Failed to verify signature\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!verifyResponse?.data?.success) {\n\t\t\t\t\t\t\t\tthrow new Error(\"Authentication verification failed\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcallbacks?.onSuccess?.();\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\t\t\tcallbacks?.onError?.(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t} satisfies BetterAuthClientPlugin;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":[],"sources":["../src/types.ts","../src/client.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { AccountIdSchema, type AccountId } from \"near-kit/schemas\";\nimport type { AccountState } from \"near-kit\";\n\nexport type { AccountId };\n\nexport interface NearAccount {\n\tid: string;\n\tuserId: string;\n\taccountId: string;\n\tnetwork: \"mainnet\" | \"testnet\";\n\tpublicKey: string;\n\tisPrimary: boolean;\n\tcreatedAt: Date;\n}\n\nexport interface ListedNearAccount extends NearAccount {\n\tproviderId: \"siwn\";\n\tisActive: boolean;\n\tisAvailable: boolean;\n}\n\nexport interface ListAccountsResponseT {\n\taccounts: ListedNearAccount[];\n\tactiveAccount: ListedNearAccount | null;\n\tavailableAccounts: ListedNearAccount[];\n}\n\nexport interface SetPrimaryAccountResponseT extends ListAccountsResponseT {\n\tsuccess: boolean;\n\taccountId: string;\n\tnetwork: \"mainnet\" | \"testnet\";\n\tmessage: string;\n}\n\nexport const socialImageSchema = z.object({\n\turl: z.string().optional(),\n\tipfs_cid: z.string().optional(),\n});\n\nexport const profileSchema = z.object({\n\tname: z.string().optional(),\n\tdescription: z.string().optional(),\n\timage: socialImageSchema.optional(),\n\tbackgroundImage: socialImageSchema.optional(),\n\tlinktree: z.record(z.string(), z.string()).optional(),\n});\n\nexport type SocialImage = z.infer<typeof socialImageSchema>;\nexport type Profile = z.infer<typeof profileSchema>;\n\nconst signedMessageSchema = z.object({\n\taccountId: z.string(),\n\tpublicKey: z.string(),\n\tsignature: z.string(),\n\tstate: z.string().optional(),\n});\n\nexport const LinkAccountRequest = z.object({\n\tsignedMessage: signedMessageSchema,\n\tmessage: z.string(),\n\trecipient: z.string(),\n\tnonce: z.string(),\n\taccountId: AccountIdSchema,\n});\n\nexport const SetPrimaryAccountRequest = z.object({\n\taccountId: AccountIdSchema,\n\tnetwork: z.enum([\"mainnet\", \"testnet\"]).optional(),\n});\n\nexport const NonceRequest = z.object({\n\taccountId: AccountIdSchema,\n\tnetworkId: z.union([z.literal(\"mainnet\"), z.literal(\"testnet\")])\n});\n\nexport const VerifyRequest = z.object({\n\tsignedMessage: signedMessageSchema,\n\tmessage: z.string(),\n\trecipient: z.string(),\n\tnonce: z.string(),\n\taccountId: AccountIdSchema,\n});\n\nexport const RelayRequest = z.object({\n\tpayload: z.string(),\n});\nexport type RelayRequestT = z.infer<typeof RelayRequest>;\n\nexport const RelayResponse = z.object({\n\ttxHash: z.string(),\n\tstatus: z.enum([\"pending\", \"completed\", \"failed\"]),\n});\nexport type RelayResponseT = z.infer<typeof RelayResponse>;\n\nexport const RelayStatusResponse = z.object({\n\tstatus: z.enum([\"pending\", \"completed\", \"failed\"]),\n\tgasUsed: z.string().optional(),\n\toutcome: z.unknown().optional(),\n});\nexport type RelayStatusResponseT = z.infer<typeof RelayStatusResponse>;\n\nexport const ViewContractRequest = z.object({\n\tcontractId: z.string(),\n\tmethodName: z.string(),\n\targs: z.record(z.string(), z.any()).optional(),\n});\nexport type ViewContractRequestT = z.infer<typeof ViewContractRequest>;\n\nexport const NonceResponse = z.object({ nonce: z.string() });\nexport const VerifyResponse = z.object({\n\ttoken: z.string(),\n\tsuccess: z.literal(true),\n\tuser: z.object({\n\t\tid: z.string(),\n\t\taccountId: AccountIdSchema,\n\t\tnetwork: z.union([z.literal(\"mainnet\"), z.literal(\"testnet\")]),\n\t}),\n});\nexport const ProfileResponse = profileSchema.nullable();\nexport const ViewContractResponse = z.object({ result: z.unknown() });\n\nexport const ProfileRequest = z.object({\n\taccountId: AccountIdSchema.optional(),\n});\nexport type ProfileRequestT = z.infer<typeof ProfileRequest>;\n\nexport type NonceRequestT = z.infer<typeof NonceRequest>;\nexport type NonceResponseT = z.infer<typeof NonceResponse>;\nexport type SetPrimaryAccountRequestT = z.infer<typeof SetPrimaryAccountRequest>;\nexport type VerifyRequestT = z.infer<typeof VerifyRequest>;\nexport type VerifyResponseT = z.infer<typeof VerifyResponse>;\nexport type ProfileResponseT = z.infer<typeof ProfileResponse>;\nexport type ViewContractResponseT = z.infer<typeof ViewContractResponse>;\n\nexport const RelayedTransactionSchema = z.object({\n\tid: z.string(),\n\tuserId: z.string(),\n\ttxHash: z.string(),\n\tsenderId: z.string(),\n\treceiverId: z.string(),\n\tnetwork: z.string(),\n\tstatus: z.string(),\n\tgasUsed: z.string().optional(),\n\tcreatedAt: z.string(),\n\tupdatedAt: z.string().optional(),\n});\nexport type RelayedTransactionT = z.infer<typeof RelayedTransactionSchema>;\n\nexport const RelayHistoryResponse = z.object({\n\ttransactions: z.array(RelayedTransactionSchema),\n});\nexport type RelayHistoryResponseT = z.infer<typeof RelayHistoryResponse>;\n\nexport interface RelayedTransactionRecord {\n\tid: string;\n\tuserId: string;\n\ttxHash: string;\n\tsenderId: string;\n\treceiverId: string;\n\tnetwork: \"mainnet\" | \"testnet\";\n\tstatus: string;\n\tgasUsed?: string;\n\tcreatedAt: Date;\n\tupdatedAt: Date;\n}\n\nexport interface RelayerInfo extends AccountState {\n\taccountId: string;\n\tmode: \"ephemeral\" | \"explicit\";\n\tnetwork: \"mainnet\" | \"testnet\";\n\tpublicKey: string;\n\thasKey: boolean;\n\tcreatedAt?: Date;\n\tlastUsedAt?: Date;\n\tparentAccount?: string;\n\tsubAccountAvailable?: boolean;\n}\n\nexport interface DualNetworkConfig<T> {\n\tmainnet: T;\n\ttestnet: T;\n}\n\nexport const GetRelayerInfoRequest = z.object({\n\tnetwork: z.enum([\"mainnet\", \"testnet\"]).optional(),\n});\nexport type GetRelayerInfoRequestT = z.infer<typeof GetRelayerInfoRequest>;\n\nexport interface SubAccountRelayerFCAKConfig {\n\treceiverId: string;\n\tmethodNames?: string[];\n\tallowance?: string;\n}\n\nexport interface SubAccountConfig {\n\tparentAccount?: string;\n\tparentKey?: string;\n\tminDeposit?: string;\n\taddRelayerFCAK?: boolean;\n\trelayerFCAK?: SubAccountRelayerFCAKConfig;\n}\n\nexport const CreateSubAccountRequest = z.object({\n\tsubAccountName: z.string().regex(/^[a-z0-9]+$/, \"Must be lowercase alphanumeric characters only\"),\n\tnetwork: z.enum([\"mainnet\", \"testnet\"]).optional(),\n\tpublicKey: z.string(),\n});\nexport type CreateSubAccountRequestT = z.infer<typeof CreateSubAccountRequest>;\n\nexport const CreateSubAccountResponse = z.object({\n\tsuccess: z.literal(true),\n\taccountId: z.string(),\n\tnetwork: z.enum([\"mainnet\", \"testnet\"]),\n\tpublicKey: z.string(),\n\tmessage: z.string(),\n});\nexport type CreateSubAccountResponseT = z.infer<typeof CreateSubAccountResponse>;\n\nexport const CheckSubAccountAvailabilityRequest = z.object({\n\tsubAccountName: z.string().regex(/^[a-z0-9]+$/),\n\tnetwork: z.enum([\"mainnet\", \"testnet\"]).optional(),\n});\nexport type CheckSubAccountAvailabilityRequestT = z.infer<typeof CheckSubAccountAvailabilityRequest>;\n\nexport const CheckSubAccountAvailabilityResponse = z.object({\n\tavailable: z.boolean(),\n\taccountId: z.string(),\n});\nexport type CheckSubAccountAvailabilityResponseT = z.infer<typeof CheckSubAccountAvailabilityResponse>;\n","import { Near, fromNearConnect, generateNonce, TransactionBuilder } from \"near-kit\";\nimport type { Near as NearType, SignedMessage } from \"near-kit\";\nimport type { EventMap } from \"@hot-labs/near-connect\";\nimport { hex } from \"@scure/base\";\nimport type { BetterAuthClientPlugin, BetterAuthClientOptions, BetterFetch, BetterFetchOption, BetterFetchResponse, ClientStore } from \"better-auth/client\";\nimport { atom } from \"nanostores\";\nimport type { siwn } from \"./index.js\";\nimport { type AccountId, type DualNetworkConfig, type NonceRequestT, type NonceResponseT, type ProfileResponseT, type VerifyRequestT, type VerifyResponseT, type RelayResponseT, type RelayStatusResponseT, type NearAccount, type ListAccountsResponseT, type SetPrimaryAccountRequestT, type SetPrimaryAccountResponseT, type ViewContractRequestT, type ViewContractResponseT, type RelayerInfo, type RelayHistoryResponseT, type GetRelayerInfoRequestT, type CreateSubAccountRequestT, type CreateSubAccountResponseT, type CheckSubAccountAvailabilityRequestT, type CheckSubAccountAvailabilityResponseT } from \"./types.js\";\n\nexport interface AuthCallbacks {\n\tonSuccess?: () => void;\n\tonError?: (error: Error & { status?: number; code?: string }) => void;\n}\n\nexport interface SIWNClientConfig {\n\trecipient?: string;\n\trecipients?: DualNetworkConfig<string>;\n\tnetworkId?: \"mainnet\" | \"testnet\";\n\tcspNonce?: string;\n}\n\ninterface SignWithWalletResult {\n\tsignedMessage: SignedMessage;\n\taccountId: string;\n\tpublicKey: string;\n\tnonceHex: string;\n}\n\nexport interface SIWNClientActions {\n\tnear: {\n\t\tnonce: (params: NonceRequestT) => Promise<BetterFetchResponse<NonceResponseT>>;\n\t\tverify: (params: VerifyRequestT) => Promise<BetterFetchResponse<VerifyResponseT>>;\n\t\tgetProfile: (accountId?: AccountId) => Promise<BetterFetchResponse<ProfileResponseT>>;\n\t\tview: (params: ViewContractRequestT) => Promise<BetterFetchResponse<ViewContractResponseT>>;\n\t\tgetAccountId: () => string | null;\n\t\tgetState: () => { accountId: string | null; publicKey: string | null; networkId: string } | null;\n\t\tisWalletConnected: () => boolean;\n\t\tensureConnected: () => Promise<boolean>;\n\t\tdisconnect: () => Promise<void>;\n\t\tlink: (callbacks?: AuthCallbacks) => Promise<void>;\n\t\tunlink: (params: { accountId: string; network?: \"mainnet\" | \"testnet\" }) => Promise<BetterFetchResponse<{ success: boolean; message: string }>>;\n\t\tlistAccounts: () => Promise<BetterFetchResponse<ListAccountsResponseT>>;\n\t\tsetPrimaryAccount: (params: SetPrimaryAccountRequestT) => Promise<BetterFetchResponse<SetPrimaryAccountResponseT>>;\n\t\tbuildSignedDelegateAction: (receiverId: string, buildActions: (builder: TransactionBuilder, receiverId: string) => TransactionBuilder) => Promise<string>;\n\t\trelayTransaction: (params: { payload: string }) => Promise<BetterFetchResponse<RelayResponseT>>;\n\t\tgetRelayStatus: (txHash: string) => Promise<BetterFetchResponse<RelayStatusResponseT>>;\n\t\tgetRelayerInfo: (params?: GetRelayerInfoRequestT) => Promise<BetterFetchResponse<RelayerInfo & { enabled: boolean }>>;\n\t\trelayHistory: () => Promise<BetterFetchResponse<RelayHistoryResponseT>>;\n\t\tcreateSubAccount: (params: CreateSubAccountRequestT) => Promise<BetterFetchResponse<CreateSubAccountResponseT>>;\n\t\tcheckSubAccountAvailability: (params: CheckSubAccountAvailabilityRequestT) => Promise<BetterFetchResponse<CheckSubAccountAvailabilityResponseT>>;\n\t\tsetNetwork: (network: \"mainnet\" | \"testnet\") => void;\n\t\tgetNetwork: () => \"mainnet\" | \"testnet\";\n\t\tgetSupportedNetworks: () => (\"mainnet\" | \"testnet\")[];\n\t\tgetRecipient: (network?: \"mainnet\" | \"testnet\") => string;\n\t\tclient: NearType;\n\t};\n\tsignIn: {\n\t\tnear: (callbacks?: AuthCallbacks) => Promise<void>;\n\t};\n}\n\nexport interface SIWNClientPlugin extends BetterAuthClientPlugin {\n\tid: \"siwn\";\n\t$InferServerPlugin: ReturnType<typeof siwn>;\n\tgetAtoms: ($fetch: BetterFetch) => {\n\t\tnearState: ReturnType<typeof atom<{ accountId: string | null; publicKey: string | null; networkId: string } | null>>;\n\t\twalletConnected: ReturnType<typeof atom<boolean>>;\n\t\tactiveNetwork: ReturnType<typeof atom<\"mainnet\" | \"testnet\">>;\n\t};\n\tgetActions: ($fetch: BetterFetch, $store: ClientStore, options: BetterAuthClientOptions | undefined) => SIWNClientActions;\n}\n\nexport const siwnClient = (config: SIWNClientConfig): SIWNClientPlugin => {\n\tconst nearState = atom<{ accountId: string | null; publicKey: string | null; networkId: string } | null>(null);\n\tconst walletConnected = atom<boolean>(false);\n\tconst activeNetwork = atom<\"mainnet\" | \"testnet\">(config.networkId || \"mainnet\");\n\n\tconst getRecipient = (network?: \"mainnet\" | \"testnet\"): string => {\n\t\tconst net = network || activeNetwork.get();\n\t\tif (config.recipients) return config.recipients[net];\n\t\treturn config.recipient ?? \"\";\n\t};\n\n\tconst getSupportedNetworks = (): (\"mainnet\" | \"testnet\")[] => {\n\t\tif (config.recipients) return [\"mainnet\", \"testnet\"];\n\t\tif (config.recipient) return [config.recipient.endsWith(\".testnet\") ? \"testnet\" : \"mainnet\"];\n\t\treturn [\"mainnet\"];\n\t};\n\n\tlet connectors = new Map<\"mainnet\" | \"testnet\", InstanceType<typeof import(\"@hot-labs/near-connect\").NearConnector>>();\n\tlet nearClients = new Map<\"mainnet\" | \"testnet\", Near>();\n\tlet initializedNetworks = new Set<\"mainnet\" | \"testnet\">();\n\tlet connectorModulePromise: Promise<typeof import(\"@hot-labs/near-connect\")> | null = null;\n\tlet initPromises = new Map<\"mainnet\" | \"testnet\", Promise<boolean>>();\n\n\tconst loadConnector = async () => {\n\t\tconnectorModulePromise ??= import(\"@hot-labs/near-connect\");\n\t\tconst { NearConnector } = await connectorModulePromise;\n\t\treturn NearConnector;\n\t};\n\n\tconst handleAccountConnection = async (accountId: string, publicKey?: string | null, network?: \"mainnet\" | \"testnet\") => {\n\t\tif (!accountId) return;\n\t\tconst net = network || activeNetwork.get();\n\t\tnearState.set({\n\t\t\taccountId,\n\t\t\tpublicKey: publicKey || null,\n\t\t\tnetworkId: net,\n\t\t});\n\t\twalletConnected.set(true);\n\t};\n\n\tconst initClientForNetwork = async (network: \"mainnet\" | \"testnet\", $fetch?: BetterFetch): Promise<boolean> => {\n\t\tif (initializedNetworks.has(network)) return true;\n\t\tif (initPromises.has(network)) return initPromises.get(network)!;\n\t\tif (typeof (globalThis as any).window === \"undefined\") return false;\n\n\t\tconst initPromise = (async () => {\n\t\t\tconst NearConnector = await loadConnector();\n\t\t\tconst connector = new NearConnector({ network, cspNonce: config.cspNonce });\n\t\t\tconnectors.set(network, connector);\n\n\t\t\tconst near = new Near({\n\t\t\t\tnetwork,\n\t\t\t\twallet: fromNearConnect(connector),\n\t\t\t});\n\t\t\tnearClients.set(network, near);\n\n\t\t\tconnector.on(\"wallet:signIn\", async (data: EventMap[\"wallet:signIn\"]) => {\n\t\t\t\tconst accountId = data.accounts?.[0]?.accountId;\n\t\t\t\tconst publicKey = data.accounts?.[0]?.publicKey;\n\t\t\t\tif (accountId) {\n\t\t\t\t\tawait handleAccountConnection(accountId, publicKey, network);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconnector.on(\"wallet:signOut\", () => {\n\t\t\t\twalletConnected.set(false);\n\t\t\t\tconst state = nearState.get();\n\t\t\t\tif (state) {\n\t\t\t\t\tnearState.set({ accountId: state.accountId, publicKey: null, networkId: state.networkId });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvoid connector.getConnectedWallet().then(({ accounts }) => {\n\t\t\t\tconst account = accounts?.[0];\n\t\t\t\tconst net = activeNetwork.get();\n\t\t\t\tif (account?.accountId && !nearState.get()) {\n\t\t\t\t\tnearState.set({\n\t\t\t\t\t\taccountId: account.accountId,\n\t\t\t\t\t\tpublicKey: account.publicKey ?? null,\n\t\t\t\t\t\tnetworkId: net,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (account?.accountId) {\n\t\t\t\t\twalletConnected.set(true);\n\t\t\t\t}\n\t\t\t}).catch(() => {});\n\n\t\t\tinitializedNetworks.add(network);\n\n\t\t\tif ($fetch) {\n\t\t\t\tvoid restoreFromSession($fetch);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t})();\n\n\t\tinitPromises.set(network, initPromise);\n\n\t\ttry {\n\t\t\treturn await initPromise;\n\t\t} finally {\n\t\t\tinitPromises.delete(network);\n\t\t}\n\t};\n\n\tconst initClient = async ($fetch?: BetterFetch): Promise<boolean> => {\n\t\tconst network = activeNetwork.get();\n\t\treturn initClientForNetwork(network, $fetch);\n\t};\n\n\tlet sessionRestored = false;\n\n\tconst restoreFromSession = async ($fetch: BetterFetch) => {\n\t\tif (sessionRestored) return;\n\t\tconst state = nearState.get();\n\t\tif (state?.accountId) {\n\t\t\tsessionRestored = true;\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst res = await $fetch<ListAccountsResponseT>(\"/near/list-accounts\", { method: \"GET\" });\n\t\t\tconst accounts = res.data?.accounts;\n\t\t\tif (accounts?.length) {\n\t\t\t\tconst primary = res.data?.activeAccount || accounts.find((a: NearAccount) => a.isPrimary) || accounts[0];\n\t\t\t\tif (primary) {\n\t\t\t\t\tnearState.set({\n\t\t\t\t\t\taccountId: primary.accountId,\n\t\t\t\t\t\tpublicKey: primary.publicKey ?? null,\n\t\t\t\t\t\tnetworkId: primary.network as \"mainnet\" | \"testnet\",\n\t\t\t\t\t});\n\t\t\t\t\tactiveNetwork.set(primary.network as \"mainnet\" | \"testnet\");\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t\tsessionRestored = true;\n\t};\n\n\tconst requireConnector = async (network?: \"mainnet\" | \"testnet\") => {\n\t\tconst net = network || activeNetwork.get();\n\t\tawait initClientForNetwork(net);\n\t\tconst connector = connectors.get(net);\n\t\tif (!connector) throw new Error(`Wallet not initialized for ${net} — this operation requires a browser environment`);\n\t\treturn connector;\n\t};\n\n\tconst requireNear = (network?: \"mainnet\" | \"testnet\"): Near => {\n\t\tconst net = network || activeNetwork.get();\n\t\tconst client = nearClients.get(net);\n\t\tif (!client) throw new Error(`Wallet not initialized for ${net} — this operation requires a browser environment`);\n\t\treturn client;\n\t};\n\n\tconst ensureWalletConnected = async (network?: \"mainnet\" | \"testnet\"): Promise<boolean> => {\n\t\tconst net = network || activeNetwork.get();\n\t\tconst conn = await requireConnector(net);\n\t\tif (walletConnected.get()) {\n\t\t\ttry {\n\t\t\t\tconst { accounts } = await conn.getConnectedWallet();\n\t\t\t\tif (accounts?.length) return true;\n\t\t\t} catch {}\n\t\t}\n\n\t\treturn new Promise<boolean>((resolve) => {\n\t\t\tconst signInHandler = (data: EventMap[\"wallet:signIn\"]) => {\n\t\t\t\tconst accountId = data.accounts?.[0]?.accountId;\n\t\t\t\tconst publicKey = data.accounts?.[0]?.publicKey;\n\t\t\t\tif (accountId) {\n\t\t\t\t\thandleAccountConnection(accountId, publicKey, net);\n\t\t\t\t\tresolve(true);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconn.on(\"wallet:signIn\", signInHandler);\n\n\t\t\tconn.connect().catch(() => {}).finally(() => {\n\t\t\t\tconn.off(\"wallet:signIn\", signInHandler);\n\t\t\t\tif (!walletConnected.get()) {\n\t\t\t\t\tresolve(false);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t};\n\n\tconst signWithWallet = async (): Promise<SignWithWalletResult> => {\n\t\tconst net = activeNetwork.get();\n\t\tconst conn = await requireConnector(net);\n\t\tconst nearClient = requireNear(net);\n\t\tconst recipient = getRecipient(net);\n\n\t\tconst nonceBytes = generateNonce();\n\t\tconst nonceHex = hex.encode(nonceBytes);\n\t\tconst message = `Sign in to ${recipient}`;\n\n\t\tlet connectedWallet: Awaited<ReturnType<typeof conn.getConnectedWallet>> | null = null;\n\t\ttry {\n\t\t\tconnectedWallet = await conn.getConnectedWallet();\n\t\t} catch {}\n\n\t\tif (connectedWallet?.accounts?.length) {\n\t\t\tconst accountId: string = connectedWallet.accounts[0]!.accountId;\n\t\t\tconst isTestnetAccount = accountId.endsWith(\".testnet\");\n\t\t\tconst isExpectedNetwork = (net === \"testnet\") === isTestnetAccount;\n\t\t\tif (!isExpectedNetwork) {\n\t\t\t\tconnectedWallet = null;\n\t\t\t}\n\t\t}\n\n\t\tif (connectedWallet?.accounts?.length) {\n\t\t\tconst signedMessage = await nearClient.signMessage({\n\t\t\t\tmessage,\n\t\t\t\trecipient,\n\t\t\t\tnonce: nonceBytes,\n\t\t\t});\n\n\t\t\tif (!signedMessage?.accountId) {\n\t\t\t\tthrow new Error(\"Wallet sign-in was cancelled or failed\");\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsignedMessage,\n\t\t\t\taccountId: signedMessage.accountId,\n\t\t\t\tpublicKey: signedMessage.publicKey,\n\t\t\t\tnonceHex,\n\t\t\t};\n\t\t}\n\n\t\tconst result: { value: { signedMessage: SignedMessage; accountId: string; publicKey: string } | null } = { value: null };\n\t\tconst handler = (data: EventMap[\"wallet:signInAndSignMessage\"]) => {\n\t\t\tconst account = data.accounts?.[0];\n\t\t\tif (account?.signedMessage) {\n\t\t\t\tresult.value = {\n\t\t\t\t\tsignedMessage: account.signedMessage,\n\t\t\t\t\taccountId: account.accountId,\n\t\t\t\t\tpublicKey: account.signedMessage.publicKey,\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\n\t\tconn.on(\"wallet:signInAndSignMessage\", handler);\n\n\t\ttry {\n\t\t\tawait conn.connect({\n\t\t\t\tsignMessageParams: {\n\t\t\t\t\tmessage,\n\t\t\t\t\trecipient,\n\t\t\t\t\tnonce: nonceBytes,\n\t\t\t\t},\n\t\t\t});\n\t\t} finally {\n\t\t\tconn.off(\"wallet:signInAndSignMessage\", handler);\n\t\t}\n\n\t\tif (!result.value) {\n\t\t\tthrow new Error(\"Wallet sign-in was cancelled or failed\");\n\t\t}\n\n\t\treturn {\n\t\t\tsignedMessage: result.value.signedMessage,\n\t\t\taccountId: result.value.accountId,\n\t\t\tpublicKey: result.value.publicKey,\n\t\t\tnonceHex,\n\t\t};\n\t};\n\n\tconst buildSignedDelegateActionInternal = async (\n\t\treceiverId: string,\n\t\tbuildActions: (builder: TransactionBuilder, receiverId: string) => TransactionBuilder,\n\t): Promise<string> => {\n\t\tconst net = activeNetwork.get();\n\t\tconst state = nearState.get();\n\t\tif (!state?.accountId) {\n\t\t\tthrow new Error(\"No NEAR account found — please sign in with your NEAR wallet\");\n\t\t}\n\n\t\tif (!walletConnected.get()) {\n\t\t\tconst reconnected = await ensureWalletConnected(net);\n\t\t\tif (!reconnected) {\n\t\t\t\tthrow new Error(\"Wallet connection required — please approve the connection to sign\");\n\t\t\t}\n\t\t}\n\n\t\tconst nearClient = requireNear(net);\n\t\tconst builder = buildActions(nearClient.transaction(state.accountId), receiverId);\n\n\t\tconst { payload } = await builder.delegate();\n\t\treturn payload;\n\t};\n\n\tconst plugin: SIWNClientPlugin = {\n\t\tid: \"siwn\",\n\t\t$InferServerPlugin: {} as ReturnType<typeof siwn>,\n\n\t\tgetAtoms: (_$fetch) => ({\n\t\t\tnearState,\n\t\t\twalletConnected,\n\t\t\tactiveNetwork,\n\t\t}),\n\n\t\tgetActions: ($fetch: BetterFetch, _$store: ClientStore, _options: BetterAuthClientOptions | undefined): SIWNClientActions => {\n\t\t\tvoid initClient($fetch);\n\n\t\t\treturn {\n\t\t\t\tnear: {\n\t\t\t\t\tnonce: async (params: NonceRequestT, fetchOptions?: BetterFetchOption): Promise<BetterFetchResponse<NonceResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/nonce\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: params,\n\t\t\t\t\t\t\t...fetchOptions\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tverify: async (params: VerifyRequestT, fetchOptions?: BetterFetchOption): Promise<BetterFetchResponse<VerifyResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/verify\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: params,\n\t\t\t\t\t\t\t...fetchOptions\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tgetProfile: async (accountId?: AccountId, fetchOptions?: BetterFetchOption): Promise<BetterFetchResponse<ProfileResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/profile\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: { accountId },\n\t\t\t\t\t\t\t...fetchOptions\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tview: async (params: ViewContractRequestT, fetchOptions?: BetterFetchOption): Promise<BetterFetchResponse<ViewContractResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/view\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: params,\n\t\t\t\t\t\t\t...fetchOptions\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tgetAccountId: () => {\n\t\t\t\t\t\tconst state = nearState.get();\n\t\t\t\t\t\treturn state?.accountId || null;\n\t\t\t\t\t},\n\t\t\t\t\tgetState: () => nearState.get(),\n\t\t\t\t\tisWalletConnected: () => walletConnected.get(),\n\t\t\t\t\tensureConnected: async () => {\n\t\t\t\t\t\tconst net = activeNetwork.get();\n\t\t\t\t\t\tif (!initializedNetworks.has(net)) {\n\t\t\t\t\t\t\tif (!(await initClientForNetwork(net))) return false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (walletConnected.get()) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst conn = connectors.get(net);\n\t\t\t\t\t\t\t\tif (conn) {\n\t\t\t\t\t\t\t\t\tconst { accounts } = await conn.getConnectedWallet();\n\t\t\t\t\t\t\t\t\tif (accounts?.length) return true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\tconsole.error(\"[siwn] restoreFromSession failed:\", err instanceof Error ? err.message : err);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn ensureWalletConnected(net);\n\t\t\t\t\t},\n\t\t\t\t\tdisconnect: async () => {\n\t\t\t\t\t\tfor (const [_net, conn] of connectors) {\n\t\t\t\t\t\t\tif (conn) {\n\t\t\t\t\t\t\t\ttry { await conn.disconnect(); } catch {}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\twalletConnected.set(false);\n\t\t\t\t\t\tnearState.set(null);\n\t\t\t\t\t},\n\t\t\t\t\tlink: async (\n\t\t\t\t\t\tcallbacks?: AuthCallbacks\n\t\t\t\t\t): Promise<void> => {\n\t\t\t\t\t\tconst net = activeNetwork.get();\n\t\t\t\t\t\tconst recipient = getRecipient(net);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst { signedMessage, accountId, nonceHex } = await signWithWallet();\n\t\t\t\t\t\t\tconst message = `Sign in to ${recipient}`;\n\n\t\t\t\t\t\t\tawait handleAccountConnection(accountId, signedMessage.publicKey, net);\n\n\t\t\t\t\t\t\tconst linkResponse = await $fetch<{ success: boolean; accountId: string; network: string; message: string }>(\"/near/link-account\", {\n\t\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\tsignedMessage,\n\t\t\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\t\t\trecipient,\n\t\t\t\t\t\t\t\t\tnonce: nonceHex,\n\t\t\t\t\t\t\t\t\taccountId,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (linkResponse.error) {\n\t\t\t\t\t\t\t\tthrow new Error(linkResponse.error.message || \"Failed to link NEAR account\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!linkResponse?.data?.success) {\n\t\t\t\t\t\t\t\tthrow new Error(\"Account linking failed\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcallbacks?.onSuccess?.();\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\t\t\tcallbacks?.onError?.(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tunlink: async (\n\t\t\t\t\t\tparams: { accountId: string; network?: \"mainnet\" | \"testnet\" },\n\t\t\t\t\t\tfetchOptions?: BetterFetchOption\n\t\t\t\t\t): Promise<BetterFetchResponse<{ success: boolean; message: string }>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/unlink-account\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: params,\n\t\t\t\t\t\t\t...fetchOptions\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tlistAccounts: async (): Promise<BetterFetchResponse<ListAccountsResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/list-accounts\", { method: \"GET\" });\n\t\t\t\t\t},\n\t\t\t\t\tsetPrimaryAccount: async (\n\t\t\t\t\t\tparams: SetPrimaryAccountRequestT\n\t\t\t\t\t): Promise<BetterFetchResponse<SetPrimaryAccountResponseT>> => {\n\t\t\t\t\t\tconst response = await $fetch<SetPrimaryAccountResponseT>(\"/near/set-primary-account\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: params,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst activeAccount = response.data?.activeAccount;\n\t\t\t\t\t\tif (activeAccount) {\n\t\t\t\t\t\t\tnearState.set({\n\t\t\t\t\t\t\t\taccountId: activeAccount.accountId,\n\t\t\t\t\t\t\t\tpublicKey: activeAccount.publicKey ?? null,\n\t\t\t\t\t\t\t\tnetworkId: activeAccount.network,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tactiveNetwork.set(activeAccount.network as \"mainnet\" | \"testnet\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn response;\n\t\t\t\t\t},\n\t\t\t\t\tbuildSignedDelegateAction: async (\n\t\t\t\t\t\treceiverId: string,\n\t\t\t\t\t\tbuildActions: (builder: TransactionBuilder, receiverId: string) => TransactionBuilder,\n\t\t\t\t\t): Promise<string> => {\n\t\t\t\t\t\treturn buildSignedDelegateActionInternal(receiverId, buildActions);\n\t\t\t\t\t},\n\t\t\t\t\trelayTransaction: async (params: {\n\t\t\t\t\t\tpayload: string;\n\t\t\t\t\t}): Promise<BetterFetchResponse<RelayResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/relay\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: params,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tgetRelayStatus: async (txHash: string): Promise<BetterFetchResponse<RelayStatusResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(`/near/relay-status/${txHash}`, {\n\t\t\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tgetRelayerInfo: async (params?: GetRelayerInfoRequestT): Promise<BetterFetchResponse<RelayerInfo & { enabled: boolean }>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/relayer-info\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: params ?? {},\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\trelayHistory: async (): Promise<BetterFetchResponse<RelayHistoryResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/relay-history\", {\n\t\t\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tcreateSubAccount: async (params: CreateSubAccountRequestT): Promise<BetterFetchResponse<CreateSubAccountResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/create-sub-account\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: params,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tcheckSubAccountAvailability: async (params: CheckSubAccountAvailabilityRequestT): Promise<BetterFetchResponse<CheckSubAccountAvailabilityResponseT>> => {\n\t\t\t\t\t\treturn await $fetch(\"/near/check-sub-account-availability\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: params,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tsetNetwork: (network: \"mainnet\" | \"testnet\") => {\n\t\t\t\t\t\tconst prev = activeNetwork.get();\n\t\t\t\t\t\tif (prev !== network) {\n\t\t\t\t\t\t\tconst oldConn = connectors.get(prev);\n\t\t\t\t\t\t\tif (oldConn) {\n\t\t\t\t\t\t\t\tvoid oldConn.disconnect().catch(() => {});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\twalletConnected.set(false);\n\t\t\t\t\t\t\tnearState.set(null);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tactiveNetwork.set(network);\n\t\t\t\t\t\tvoid initClientForNetwork(network);\n\t\t\t\t\t},\n\t\t\t\t\tgetNetwork: () => activeNetwork.get(),\n\t\t\t\t\tgetSupportedNetworks: () => getSupportedNetworks(),\n\t\t\t\t\tgetRecipient: (network?: \"mainnet\" | \"testnet\") => getRecipient(network),\n\t\t\t\t\tget client(): NearType {\n\t\t\t\t\t\tconst net = activeNetwork.get();\n\t\t\t\t\t\tconst client = nearClients.get(net);\n\t\t\t\t\t\tif (!client) throw new Error(`Wallet not initialized for ${net} — this operation requires a browser environment`);\n\t\t\t\t\t\treturn client;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsignIn: {\n\t\t\t\t\tnear: async (\n\t\t\t\t\t\tcallbacks?: AuthCallbacks\n\t\t\t\t\t): Promise<void> => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst { signedMessage, accountId, nonceHex } = await signWithWallet();\n\t\t\t\t\t\t\tconst net = activeNetwork.get();\n\t\t\t\t\t\t\tconst recipient = getRecipient(net);\n\t\t\t\t\t\t\tconst message = `Sign in to ${recipient}`;\n\n\t\t\t\t\t\t\tawait handleAccountConnection(accountId, signedMessage.publicKey, net);\n\n\t\t\t\t\t\t\tconst verifyResponse: BetterFetchResponse<VerifyResponseT> = await $fetch(\"/near/verify\", {\n\t\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\tsignedMessage,\n\t\t\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\t\t\trecipient,\n\t\t\t\t\t\t\t\t\tnonce: nonceHex,\n\t\t\t\t\t\t\t\t\taccountId,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (verifyResponse.error) {\n\t\t\t\t\t\t\t\tthrow new Error(verifyResponse.error.message || \"Failed to verify signature\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!verifyResponse?.data?.success) {\n\t\t\t\t\t\t\t\tthrow new Error(\"Authentication verification failed\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcallbacks?.onSuccess?.();\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\t\t\tcallbacks?.onError?.(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n\n\treturn plugin;\n};\n"],"mappings":"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"}
|