better-near-auth 1.6.4 → 1.6.5
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.js +4 -2
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -6
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/skills/client/SKILL.md +5 -4
- package/skills/relay/SKILL.md +4 -3
- package/skills/siwn/SKILL.md +4 -3
- package/skills/tanstack/SKILL.md +4 -3
package/dist/client.js
CHANGED
|
@@ -49,7 +49,8 @@ z.object({
|
|
|
49
49
|
message: z.string(),
|
|
50
50
|
recipient: z.string(),
|
|
51
51
|
nonce: z.string(),
|
|
52
|
-
accountId: AccountIdSchema
|
|
52
|
+
accountId: AccountIdSchema,
|
|
53
|
+
callbackUrl: z.string().optional()
|
|
53
54
|
});
|
|
54
55
|
z.object({
|
|
55
56
|
accountId: AccountIdSchema,
|
|
@@ -64,7 +65,8 @@ z.object({
|
|
|
64
65
|
message: z.string(),
|
|
65
66
|
recipient: z.string(),
|
|
66
67
|
nonce: z.string(),
|
|
67
|
-
accountId: AccountIdSchema
|
|
68
|
+
accountId: AccountIdSchema,
|
|
69
|
+
callbackUrl: z.string().optional()
|
|
68
70
|
});
|
|
69
71
|
z.object({ payload: z.string() });
|
|
70
72
|
z.object({
|
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\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<NearState>>;\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\ntype NearState = { accountId: string | null; publicKey: string | null; networkId: string } | null;\n\nexport const siwnClient = (config: SIWNClientConfig): SIWNClientPlugin => {\n\tconst nearState = atom<NearState>(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,\n\t\t\t\t\t});\n\t\t\t\t\tactiveNetwork.set(primary.network);\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) => {\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) => {\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) => {\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) => {\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 (callbacks?: AuthCallbacks) => {\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) => {\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 (params: SetPrimaryAccountRequestT) => {\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);\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: { payload: string }) => {\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) => {\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) => {\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 () => {\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) => {\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) => {\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 (callbacks?: AuthCallbacks) => {\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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"}
|
|
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\tcallbackUrl: z.string().optional(),\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\tcallbackUrl: z.string().optional(),\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<NearState>>;\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\ntype NearState = { accountId: string | null; publicKey: string | null; networkId: string } | null;\n\nexport const siwnClient = (config: SIWNClientConfig): SIWNClientPlugin => {\n\tconst nearState = atom<NearState>(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,\n\t\t\t\t\t});\n\t\t\t\t\tactiveNetwork.set(primary.network);\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) => {\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) => {\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) => {\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) => {\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 (callbacks?: AuthCallbacks) => {\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) => {\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 (params: SetPrimaryAccountRequestT) => {\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);\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: { payload: string }) => {\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) => {\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) => {\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 () => {\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) => {\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) => {\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 (callbacks?: AuthCallbacks) => {\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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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -287,6 +287,7 @@ export declare const siwn: (options: SIWNPluginOptions) => {
|
|
|
287
287
|
recipient: z.ZodString;
|
|
288
288
|
nonce: z.ZodString;
|
|
289
289
|
accountId: z.ZodString;
|
|
290
|
+
callbackUrl: z.ZodOptional<z.ZodString>;
|
|
290
291
|
}, z.z.core.$strip>;
|
|
291
292
|
use: ((inputContext: import("better-call").MiddlewareInputContext<import("better-call").MiddlewareOptions>) => Promise<{
|
|
292
293
|
session: {
|
|
@@ -486,6 +487,7 @@ export declare const siwn: (options: SIWNPluginOptions) => {
|
|
|
486
487
|
recipient: z.ZodString;
|
|
487
488
|
nonce: z.ZodString;
|
|
488
489
|
accountId: z.ZodString;
|
|
490
|
+
callbackUrl: z.ZodOptional<z.ZodString>;
|
|
489
491
|
}, z.z.core.$strip>;
|
|
490
492
|
requireRequest: true;
|
|
491
493
|
}, {
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,mBAAmB,CAAC;AASlE,OAAO,CAAC,MAAM,KAAK,CAAC;AAGpB,OAAO,EACN,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EAEtB,KAAK,OAAO,EAGZ,KAAK,gBAAgB,EAmBrB,MAAM,YAAY,CAAC;AACpB,cAAc,YAAY,CAAC;AA8D3B,MAAM,WAAW,aAAa;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;CAClC;AA2LD,MAAM,WAAW,iBAAiB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACvC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC/D,wBAAwB,CAAC,EAAE,CAAC,IAAI,EAAE;QACjC,SAAS,EAAE,SAAS,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,aAAa,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAC3D,UAAU,CAAC,EAAE,gBAAgB,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;CACpE;AAED,eAAO,MAAM,IAAI,GAAI,SAAS,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAuFvB;gBAAE,IAAI,CAAC,EAAE,MAAM,CAAC;gBAAC,MAAM,CAAC,EAAE,MAAM,CAAA;aAAE;;;;;;;;;2DAvNc,CAAC;;;;4CACa,CAAC;;;;;;;;;;;qCAOzE,CAAC;qCAEG,CAAC;;;;;;;;;iCAYlB,CAAD;;;;;;;;;;;qCAMQ,CAAC;qCAA8C,CAAC;;;;;;;;;iCAOlC,CAAC;;;;;;;;;;;qCAaX,CAAC;qCAA8C,CAAC;;;;;;;;;iCAMT,CAAC;;;;;;;;;;;;;;6EAgCvC,CAAC;;;;;;;;;;;;;;4BAeV,CAAC;;;;;;;;;;;;;;;;;;;mCAgBO,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,mBAAmB,CAAC;AASlE,OAAO,CAAC,MAAM,KAAK,CAAC;AAGpB,OAAO,EACN,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EAEtB,KAAK,OAAO,EAGZ,KAAK,gBAAgB,EAmBrB,MAAM,YAAY,CAAC;AACpB,cAAc,YAAY,CAAC;AA8D3B,MAAM,WAAW,aAAa;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;CAClC;AA2LD,MAAM,WAAW,iBAAiB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACvC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC/D,wBAAwB,CAAC,EAAE,CAAC,IAAI,EAAE;QACjC,SAAS,EAAE,SAAS,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,aAAa,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAC3D,UAAU,CAAC,EAAE,gBAAgB,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;CACpE;AAED,eAAO,MAAM,IAAI,GAAI,SAAS,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAuFvB;gBAAE,IAAI,CAAC,EAAE,MAAM,CAAC;gBAAC,MAAM,CAAC,EAAE,MAAM,CAAA;aAAE;;;;;;;;;2DAvNc,CAAC;;;;4CACa,CAAC;;;;;;;;;;;qCAOzE,CAAC;qCAEG,CAAC;;;;;;;;;iCAYlB,CAAD;;;;;;;;;;;qCAMQ,CAAC;qCAA8C,CAAC;;;;;;;;;iCAOlC,CAAC;;;;;;;;;;;qCAaX,CAAC;qCAA8C,CAAC;;;;;;;;;iCAMT,CAAC;;;;;;;;;;;;;;6EAgCvC,CAAC;;;;;;;;;;;;;;4BAeV,CAAC;;;;;;;;;;;;;;;;;;;mCAgBO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCA7OJ,CAAC;iCAGV,CAAC;;;;;;;;;6BAMsC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAT/B,CAAC;iCAGV,CAAC;;;;;;;;;6BAMsC,CAAC;;;;;;;;;;;;;;;;;;;;;iCAT/B,CAAC;iCAGV,CAAC;;;;;;;;;6BAMsC,CAAC;;;;;;;;;;;;;;;;;;;;;;;iCAT/B,CAAC;iCAGV,CAAC;;;;;;;;;6BAMsC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAT/B,CAAC;iCAGV,CAAC;;;;;;;;;6BAMsC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAT/B,CAAC;iCAGV,CAAC;;;;;;;;;6BAMsC,CAAC;;;;;;;;;;;;;;;;;;;iCAT/B,CAAC;iCAGV,CAAC;;;;;;;;;6BAMsC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;iCAT/B,CAAC;iCAGV,CAAC;;;;;;;;;6BAMsC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAT/B,CAAC;iCAGV,CAAC;;;;;;;;;6BAMsC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAT/B,CAAC;iCAGV,CAAC;;;;;;;;;6BAMsC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;iCAT/B,CAAC;iCAGV,CAAC;;;;;;;;;6BAMsC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CA25CvC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -179,7 +179,8 @@ const LinkAccountRequest = z.object({
|
|
|
179
179
|
message: z.string(),
|
|
180
180
|
recipient: z.string(),
|
|
181
181
|
nonce: z.string(),
|
|
182
|
-
accountId: AccountIdSchema
|
|
182
|
+
accountId: AccountIdSchema,
|
|
183
|
+
callbackUrl: z.string().optional()
|
|
183
184
|
});
|
|
184
185
|
const SetPrimaryAccountRequest = z.object({
|
|
185
186
|
accountId: AccountIdSchema,
|
|
@@ -194,7 +195,8 @@ const VerifyRequest = z.object({
|
|
|
194
195
|
message: z.string(),
|
|
195
196
|
recipient: z.string(),
|
|
196
197
|
nonce: z.string(),
|
|
197
|
-
accountId: AccountIdSchema
|
|
198
|
+
accountId: AccountIdSchema,
|
|
199
|
+
callbackUrl: z.string().optional()
|
|
198
200
|
});
|
|
199
201
|
const RelayRequest = z.object({ payload: z.string() });
|
|
200
202
|
const RelayResponse = z.object({
|
|
@@ -568,7 +570,7 @@ const siwn = (options) => {
|
|
|
568
570
|
use: [sessionMiddleware],
|
|
569
571
|
requireRequest: true
|
|
570
572
|
}, async (ctx) => {
|
|
571
|
-
const { signedMessage, message, recipient, nonce, accountId } = ctx.body;
|
|
573
|
+
const { signedMessage, message, recipient, nonce, accountId, callbackUrl } = ctx.body;
|
|
572
574
|
const network = getNetworkFromAccountId(accountId);
|
|
573
575
|
const session = ctx.context.session;
|
|
574
576
|
if (!session) throw new APIError("UNAUTHORIZED", {
|
|
@@ -580,7 +582,8 @@ const siwn = (options) => {
|
|
|
580
582
|
if (!await verifyNep413Signature(signedMessage, {
|
|
581
583
|
message,
|
|
582
584
|
recipient,
|
|
583
|
-
nonce: hex.decode(nonce)
|
|
585
|
+
nonce: hex.decode(nonce),
|
|
586
|
+
callbackUrl
|
|
584
587
|
}, {
|
|
585
588
|
near,
|
|
586
589
|
maxAge: 900 * 1e3
|
|
@@ -926,7 +929,7 @@ const siwn = (options) => {
|
|
|
926
929
|
body: VerifyRequest,
|
|
927
930
|
requireRequest: true
|
|
928
931
|
}, async (ctx) => {
|
|
929
|
-
const { signedMessage, message, recipient, nonce, accountId } = ctx.body;
|
|
932
|
+
const { signedMessage, message, recipient, nonce, accountId, callbackUrl } = ctx.body;
|
|
930
933
|
const network = getNetworkFromAccountId(accountId);
|
|
931
934
|
try {
|
|
932
935
|
const near = getNear(network);
|
|
@@ -934,7 +937,8 @@ const siwn = (options) => {
|
|
|
934
937
|
if (!await verifyNep413Signature(signedMessage, {
|
|
935
938
|
message,
|
|
936
939
|
recipient,
|
|
937
|
-
nonce: nonceBytes
|
|
940
|
+
nonce: nonceBytes,
|
|
941
|
+
callbackUrl
|
|
938
942
|
}, {
|
|
939
943
|
near,
|
|
940
944
|
maxAge: 900 * 1e3
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["z"],"sources":["../src/profile.ts","../src/schema.ts","../src/types.ts","../src/utils.ts","../src/index.ts"],"sourcesContent":["import type { AccountId, Profile, SocialImage } from \"./types.js\";\n\nconst FALLBACK_URL =\n\t\"https://ipfs.near.social/ipfs/bafkreidn5fb2oygegqaldx7ycdmhu4owcrmoxd7ekbzfmeakkobz2ja7qy\";\n\nfunction getNetworkFromAccountId(accountId: string): \"mainnet\" | \"testnet\" {\n\treturn accountId.endsWith('.testnet') ? 'testnet' : 'mainnet';\n}\n\nfunction getImageUrl(\n\timage: SocialImage | undefined,\n\tfallback?: string,\n): string {\n\tif (image?.url) return image.url;\n\tif (image?.ipfs_cid) return `https://ipfs.near.social/ipfs/${image.ipfs_cid}`;\n\treturn fallback || FALLBACK_URL;\n}\n\ninterface SocialApiResponse {\n\t[accountId: string]: {\n\t\tprofile?: Profile;\n\t};\n}\n\ninterface KvEntry {\n\tvalue: Record<string, unknown> | string;\n\tblock_height?: number;\n\tblock_hash?: string;\n\ttimestamp_nanosec?: string;\n}\n\ninterface KvResponse {\n\tentries: KvEntry[];\n}\n\nasync function defaultGetProfile(accountId: AccountId, apiKey?: string): Promise<Profile | null> {\n\tconst network = getNetworkFromAccountId(accountId);\n\n\ttry {\n\t\tconst kvUrl = network === \"testnet\"\n\t\t\t? \"https://kv.test.fastnear.com\"\n\t\t\t: \"https://kv.main.fastnear.com\";\n\n\t\tconst effectiveApiKey = apiKey || process.env.FASTNEAR_API_KEY;\n\t\tconst headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n\t\tif (effectiveApiKey) {\n\t\t\theaders[\"Authorization\"] = `Bearer ${effectiveApiKey}`;\n\t\t}\n\n\t\tconst response = await fetch(\n\t\t\t`${kvUrl}/v0/latest/social.near/${accountId}/profile/**`,\n\t\t\t{ headers },\n\t\t);\n\n\t\tif (response.ok) {\n\t\t\tconst data = await response.json() as KvResponse;\n\t\t\tconst entry = data?.entries?.[0];\n\t\t\tif (entry?.value) {\n\t\t\t\ttry {\n\t\t\t\t\tconst profile = typeof entry.value === \"string\"\n\t\t\t\t\t\t? JSON.parse(entry.value)\n\t\t\t\t\t\t: entry.value;\n\t\t\t\t\tif (profile?.name || profile?.description || profile?.image) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tname: profile.name,\n\t\t\t\t\t\t\tdescription: profile.description,\n\t\t\t\t\t\t\timage: profile.image,\n\t\t\t\t\t\t\tbackgroundImage: profile.backgroundImage,\n\t\t\t\t\t\t\tlinktree: profile.linktree,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t}\n\n\t\tconst apiBase = {\n\t\t\tmainnet: \"https://api.near.social\",\n\t\t\ttestnet: \"https://test.api.near.social\",\n\t\t}[network];\n\n\t\tconst keys = [`${accountId}/profile/**`];\n\n\t\tconst fallbackResponse = await fetch(`${apiBase}/get`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\tbody: JSON.stringify({ keys })\n\t\t});\n\n\t\tif (!fallbackResponse.ok) {\n\t\t\tthrow new Error(`HTTP error! status: ${fallbackResponse.status}`);\n\t\t}\n\n\t\tconst fallbackData = await fallbackResponse.json() as SocialApiResponse;\n\t\tconst profile: Profile | undefined = fallbackData?.[accountId]?.profile;\n\n\t\tif (profile) {\n\t\t\treturn {\n\t\t\t\tname: profile.name,\n\t\t\t\tdescription: profile.description,\n\t\t\t\timage: profile.image,\n\t\t\t\tbackgroundImage: profile.backgroundImage,\n\t\t\t\tlinktree: profile.linktree\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t} catch (error) {\n\t\treturn null;\n\t}\n}\n\nexport { defaultGetProfile, getImageUrl, getNetworkFromAccountId };\n","import type { BetterAuthPluginDBSchema } from \"better-auth/db\";\n\nexport const schema = {\n\tnearAccount: {\n\t\tfields: {\n\t\t\tuserId: {\n\t\t\t\ttype: \"string\",\n\t\t\t\treferences: {\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tfield: \"id\",\n\t\t\t\t},\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\taccountId: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tnetwork: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tpublicKey: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tisPrimary: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\tdefaultValue: false,\n\t\t\t},\n\t\t\tcreatedAt: {\n\t\t\t\ttype: \"date\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t},\n\t},\n\trelayedTransaction: {\n\t\tfields: {\n\t\t\tuserId: {\n\t\t\t\ttype: \"string\",\n\t\t\t\treferences: {\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tfield: \"id\",\n\t\t\t\t},\n\t\t\t},\n\t\t\ttxHash: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tsenderId: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\treceiverId: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tnetwork: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tstatus: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tgasUsed: {\n\t\t\t\ttype: \"string\",\n\t\t\t},\n\t\t\tcreatedAt: {\n\t\t\t\ttype: \"date\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tupdatedAt: {\n\t\t\t\ttype: \"date\",\n\t\t\t},\n\t\t},\n\t},\n\trelayerKey: {\n\t\tfields: {\n\t\t\taccountId: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tencryptedPrivateKey: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tiv: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tpublicKey: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tnetwork: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tcreatedAt: {\n\t\t\t\ttype: \"date\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tlastUsedAt: {\n\t\t\t\ttype: \"date\",\n\t\t\t},\n\t\t},\n\t},\n} satisfies BetterAuthPluginDBSchema;\n","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","export function bytesToBase64(bytes: Uint8Array): string {\n\treturn btoa(String.fromCharCode(...bytes));\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n\treturn Uint8Array.from(atob(base64), c => c.charCodeAt(0));\n}\n\nexport function bytesToHex(bytes: Uint8Array): string {\n\treturn Array.from(bytes).map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n\tconst bytes = new Uint8Array(hex.length / 2);\n\tfor (let i = 0; i < hex.length; i += 2) {\n\t\tbytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);\n\t}\n\treturn bytes;\n}\n\nasync function deriveAesKey(secret: string): Promise<CryptoKey> {\n\tconst keyMaterial = await crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tnew TextEncoder().encode(secret),\n\t\t{ name: \"HKDF\" },\n\t\tfalse,\n\t\t[\"deriveKey\"],\n\t);\n\treturn crypto.subtle.deriveKey(\n\t\t{\n\t\t\tname: \"HKDF\",\n\t\t\thash: \"SHA-256\",\n\t\t\tsalt: new TextEncoder().encode(\"better-near-auth-relayer\"),\n\t\t\tinfo: new Uint8Array(0),\n\t\t},\n\t\tkeyMaterial,\n\t\t{ name: \"AES-GCM\", length: 256 },\n\t\tfalse,\n\t\t[\"encrypt\", \"decrypt\"],\n\t);\n}\n\nexport async function encryptPrivateKey(\n\tprivateKey: Uint8Array,\n\tsecret: string,\n): Promise<{ encrypted: string; iv: string }> {\n\tconst aesKey = await deriveAesKey(secret);\n\tconst iv = crypto.getRandomValues(new Uint8Array(12));\n\tconst encrypted = await crypto.subtle.encrypt(\n\t\t{ name: \"AES-GCM\", iv },\n\t\taesKey,\n\t\tprivateKey as Uint8Array<ArrayBuffer>,\n\t);\n\treturn {\n\t\tencrypted: bytesToBase64(new Uint8Array(encrypted)),\n\t\tiv: bytesToBase64(iv),\n\t};\n}\n\nexport async function decryptPrivateKey(\n\tencrypted: string,\n\tiv: string,\n\tsecret: string,\n): Promise<Uint8Array> {\n\tconst aesKey = await deriveAesKey(secret);\n\tconst decrypted = await crypto.subtle.decrypt(\n\t\t{ name: \"AES-GCM\", iv: base64ToBytes(iv) as Uint8Array<ArrayBuffer> },\n\t\taesKey,\n\t\tbase64ToBytes(encrypted) as Uint8Array<ArrayBuffer>,\n\t);\n\treturn new Uint8Array(decrypted);\n}\n","import { APIError, createAuthEndpoint, createAuthMiddleware, sessionMiddleware } from \"better-auth/api\";\nimport { setSessionCookie } from \"better-auth/cookies\";\nimport type { Account, User, DBAdapter } from \"better-auth/types\";\n// Explicit type imports for declaration emit\nimport type {} from \"@better-auth/core/env\";\nimport type {} from \"@better-auth/core/oauth2\";\nimport type {} from \"better-call\";\n\nimport { Near, generateNonce, generateKey, parseKey, verifyNep413Signature, decodeSignedDelegateAction, InMemoryKeyStore, RotatingKeyStore } from \"near-kit\";\nimport type { SignedDelegateAction, PrivateKey } from \"near-kit\";\nimport { hex, base58 } from \"@scure/base\";\nimport z from \"zod\";\nimport { defaultGetProfile, getImageUrl, getNetworkFromAccountId } from \"./profile.js\";\nimport { schema } from \"./schema.js\";\nimport {\n\ttype AccountId,\n\ttype DualNetworkConfig,\n\ttype ListAccountsResponseT,\n\ttype ListedNearAccount,\n\ttype NearAccount,\n\ttype Profile,\n\ttype RelayerInfo,\n\ttype RelayedTransactionRecord,\n\ttype SubAccountConfig,\n\tLinkAccountRequest,\n\tNonceRequest,\n\tNonceResponse,\n\tProfileRequest,\n\tProfileResponse,\n\tVerifyRequest,\n\tVerifyResponse,\n\tRelayRequest,\n\tRelayResponse,\n\tRelayStatusResponse,\n\tSetPrimaryAccountRequest,\n\tViewContractRequest,\n\tViewContractResponse,\n\tGetRelayerInfoRequest,\n\tCreateSubAccountRequest,\n\tCreateSubAccountResponse,\n\tCheckSubAccountAvailabilityRequest,\n\tCheckSubAccountAvailabilityResponse,\n} from \"./types.js\";\nexport * from \"./types.js\";\nimport {\n\tbytesToHex,\n\tencryptPrivateKey,\n\tdecryptPrivateKey,\n} from \"./utils.js\";\n\nasync function hashNonce(nonce: Uint8Array): Promise<string> {\n\tconst data = new TextEncoder().encode(hex.encode(nonce));\n\tconst hashBuffer = await crypto.subtle.digest('SHA-256', data);\n\treturn hex.encode(new Uint8Array(hashBuffer));\n}\n\nfunction deriveEmail(accountId: string, recipient: string): string {\n\tif (accountId.endsWith(\".near\")) {\n\t\tconst localPart = accountId.slice(0, -5);\n\t\tif (!localPart.includes(\".\")) {\n\t\t\treturn `${localPart}@near.email`;\n\t\t}\n\t}\n\tconst randomId = crypto.randomUUID().slice(0, 8);\n\treturn `temp-${randomId}@${recipient}`;\n}\n\nfunction nearAccountKey(account: Pick<NearAccount, \"accountId\" | \"network\">): string {\n\treturn `${account.accountId}:${account.network}`;\n}\n\nfunction getCreatedAtTime(account: NearAccount): number {\n\treturn account.createdAt instanceof Date\n\t\t? account.createdAt.getTime()\n\t\t: new Date(account.createdAt).getTime();\n}\n\nfunction buildListAccountsResponse(nearAccounts: NearAccount[]): ListAccountsResponseT {\n\tconst activeAccount = nearAccounts.find((account) => account.isPrimary) ?? nearAccounts[0] ?? null;\n\tconst activeKey = activeAccount ? nearAccountKey(activeAccount) : null;\n\tconst accounts: ListedNearAccount[] = nearAccounts\n\t\t.map((account) => {\n\t\t\tconst isActive = activeKey === nearAccountKey(account);\n\t\t\treturn {\n\t\t\t\t...account,\n\t\t\t\tproviderId: \"siwn\" as const,\n\t\t\t\tisActive,\n\t\t\t\tisAvailable: !isActive,\n\t\t\t};\n\t\t})\n\t\t.sort((a, b) => {\n\t\t\tif (a.isActive !== b.isActive) return a.isActive ? -1 : 1;\n\t\t\treturn getCreatedAtTime(a) - getCreatedAtTime(b);\n\t\t});\n\tconst listedActiveAccount = accounts.find((account) => account.isActive) ?? null;\n\n\treturn {\n\t\taccounts,\n\t\tactiveAccount: listedActiveAccount ? { ...listedActiveAccount } : null,\n\t\tavailableAccounts: accounts\n\t\t\t.filter((account) => account.isAvailable)\n\t\t\t.map((account) => ({ ...account })),\n\t};\n}\n\nexport interface RelayerConfig {\n\taccountId?: string;\n\tprivateKey?: string;\n\tprivateKeys?: string[];\n\twhitelistedContracts?: string[];\n\tmaxGasPerTransaction?: string;\n\tmaxDepositPerTransaction?: string;\n}\n\ninterface RelayerState {\n\tnear: Near;\n\taccountId: string;\n\tnetwork: \"mainnet\" | \"testnet\";\n\tmode: \"ephemeral\" | \"explicit\";\n\tpublicKey: string;\n\tcreatedAt?: Date;\n\tlastUsedAt?: Date;\n}\n\nfunction createNear(\n\tnetwork: \"mainnet\" | \"testnet\",\n\theaders: Record<string, string>,\n\trpcUrl?: string,\n\tkeyStore?: InMemoryKeyStore | RotatingKeyStore,\n): Near {\n\tconst config: ConstructorParameters<typeof Near>[0] = { headers };\n\tif (rpcUrl) {\n\t\tconfig.network = { rpcUrl, networkId: network };\n\t} else {\n\t\tconfig.network = network;\n\t}\n\tif (keyStore) {\n\t\tconfig.keyStore = keyStore;\n\t}\n\treturn new Near(config);\n}\n\nasync function initRelayer(\n\trelayerConfig: RelayerConfig | undefined,\n\tnetwork: \"mainnet\" | \"testnet\",\n\tadapter: DBAdapter,\n\tsecret: string | undefined,\n\tapiKey?: string,\n\trpcUrl?: string,\n): Promise<RelayerState | null> {\n\tif (!relayerConfig) return null;\n\n\tconst headers: Record<string, string> = {};\n\tif (apiKey) {\n\t\theaders[\"Authorization\"] = `Bearer ${apiKey}`;\n\t}\n\n\tif (relayerConfig.accountId && (relayerConfig.privateKey || relayerConfig.privateKeys)) {\n\t\tconst keys = relayerConfig.privateKeys ?? (relayerConfig.privateKey ? [relayerConfig.privateKey] : []);\n\t\tlet keyStore: InMemoryKeyStore | RotatingKeyStore;\n\n\t\tif (keys.length === 1) {\n\t\t\tkeyStore = new InMemoryKeyStore({\n\t\t\t\t[relayerConfig.accountId]: keys[0]!,\n\t\t\t});\n\t\t} else {\n\t\t\tkeyStore = new RotatingKeyStore({\n\t\t\t\t[relayerConfig.accountId]: keys as string[],\n\t\t\t});\n\t\t}\n\n\t\tconst near = createNear(network, headers, rpcUrl, keyStore);\n\t\tconst explicitPublicKey = parseKey(keys[0]!);\n\t\treturn {\n\t\t\tnear,\n\t\t\taccountId: relayerConfig.accountId,\n\t\t\tnetwork,\n\t\t\tmode: \"explicit\",\n\t\t\tpublicKey: explicitPublicKey.publicKey.toString(),\n\t\t};\n\t}\n\n\tconst existing = await adapter.findOne<{ encryptedPrivateKey: string; iv: string; createdAt: Date; lastUsedAt: Date }>({\n\t\tmodel: \"relayerKey\",\n\t\twhere: [{ field: \"network\", operator: \"eq\", value: network }],\n\t});\n\n\tif (existing) {\n\t\tif (!secret) throw new Error(\"BETTER_AUTH_SECRET required for relayer key decryption\");\n\t\tconst privateKeyBytes = await decryptPrivateKey(existing.encryptedPrivateKey, existing.iv, secret);\n\t\tconst keyPair = parseKey(`ed25519:${base58.encode(privateKeyBytes)}`);\n\t\tconst accountId = bytesToHex(keyPair.publicKey.data);\n\n\t\tconsole.log(`[siwn] Relayer recovered: ${accountId} (${network})`);\n\n\t\tconst keyStore = new InMemoryKeyStore();\n\t\tawait keyStore.add(accountId, keyPair);\n\n\t\tconst near = createNear(network, headers, rpcUrl, keyStore);\n\t\treturn {\n\t\t\tnear,\n\t\t\taccountId,\n\t\t\tnetwork,\n\t\t\tmode: \"ephemeral\",\n\t\t\tpublicKey: keyPair.publicKey.toString(),\n\t\t\tcreatedAt: existing.createdAt,\n\t\t\tlastUsedAt: existing.lastUsedAt,\n\t\t};\n\t}\n\n\tconst keyPair = generateKey();\n\tif (!secret) throw new Error(\"BETTER_AUTH_SECRET required for relayer key encryption\");\n\tconst privateKeyBytes = keyPair.secretKey.startsWith(\"ed25519:\")\n\t\t? base58.decode(keyPair.secretKey.slice(8))\n\t\t: new Uint8Array(0);\n\n\tconst publicKeyBase58 = keyPair.publicKey.toString().replace(\"ed25519:\", \"\");\n\tconst accountId = bytesToHex(keyPair.publicKey.data);\n\tconst createdAt = new Date();\n\n\tconst { encrypted, iv } = await encryptPrivateKey(privateKeyBytes, secret);\n\n\tawait adapter.create({\n\t\t\tmodel: \"relayerKey\",\n\t\t\tdata: {\n\t\t\t\taccountId,\n\t\t\t\tencryptedPrivateKey: encrypted,\n\t\t\t\tiv,\n\t\t\t\tpublicKey: `ed25519:${publicKeyBase58}`,\n\t\t\t\tnetwork,\n\t\t\t\tcreatedAt,\n\t\t\t\tlastUsedAt: createdAt,\n\t\t\t},\n\t\t});\n\n\tconsole.log(`[siwn] Relayer created in EPHEMERAL mode: ${accountId} (${network})`);\n\tconsole.log(`[siwn] Fund this account with NEAR to enable gasless relay`);\n\tconsole.log(`[siwn] Private key is encrypted in DB — persists across restarts`);\n\n\tconst keyStore = new InMemoryKeyStore();\n\tawait keyStore.add(accountId, keyPair);\n\n\tconst near = createNear(network, headers, rpcUrl, keyStore);\n\treturn {\n\t\tnear,\n\t\taccountId,\n\t\tnetwork,\n\t\tmode: \"ephemeral\",\n\t\tpublicKey: keyPair.publicKey.toString(),\n\t\tcreatedAt,\n\t\tlastUsedAt: createdAt,\n\t};\n}\n\nasync function relayOnChain(\n\tpayload: string,\n\trelayerState: RelayerState,\n): Promise<{ txHash: string }> {\n\tconst userAction = decodeSignedDelegateAction(payload);\n\n\tconst result = await relayerState.near\n\t\t.transaction(relayerState.accountId)\n\t\t.signedDelegateAction(userAction)\n\t\t.send({ waitUntil: \"EXECUTED\" });\n\n\treturn { txHash: result.transaction.hash };\n}\n\nasync function defaultValidateLimitedAccessKey(\n\taccountId: string,\n\tpublicKey: string,\n\trecipient: string,\n\tnear: Near,\n): Promise<boolean> {\n\tconst key = await near.getAccessKey(accountId, publicKey);\n\tif (!key) return false;\n\tif (key.permission === \"FullAccess\") return true;\n\tif (\"FunctionCall\" in key.permission) {\n\t\treturn key.permission.FunctionCall.receiver_id === recipient;\n\t}\n\treturn false;\n}\n\nfunction isImplicitAccount(accountId: string): boolean {\n\treturn /^[0-9a-f]{64}$/.test(accountId);\n}\n\nfunction resolveParentAccount(\n\tsubAccountCfg: SubAccountConfig | undefined,\n\trState: RelayerState | null,\n): { parentAccount: string | null; subAccountAvailable: boolean } {\n\tif (!rState) return { parentAccount: null, subAccountAvailable: false };\n\tconst parent = subAccountCfg?.parentAccount ?? rState.accountId;\n\tif (!parent || isImplicitAccount(parent)) {\n\t\treturn { parentAccount: null, subAccountAvailable: false };\n\t}\n\treturn { parentAccount: parent, subAccountAvailable: true };\n}\n\nexport interface SIWNPluginOptions {\n\trecipient?: string;\n\trecipients?: DualNetworkConfig<string>;\n\trequireFullAccessKey?: boolean;\n\tgetNonce?: () => Promise<Uint8Array>;\n\tgetProfile?: (accountId: AccountId) => Promise<Profile | null>;\n\tvalidateLimitedAccessKey?: (args: {\n\t\taccountId: AccountId;\n\t\tpublicKey: string;\n\t\trecipient?: string;\n\t}) => Promise<boolean>;\n\tapiKey?: string;\n\trpcUrl?: string | DualNetworkConfig<string>;\n\trelayer?: RelayerConfig | DualNetworkConfig<RelayerConfig>;\n\tsubAccount?: SubAccountConfig | DualNetworkConfig<SubAccountConfig>;\n}\n\nexport const siwn = (options: SIWNPluginOptions) => {\n\tif (!options.recipient && !options.recipients) {\n\t\tthrow new Error(\"Either 'recipient' or 'recipients' must be provided to siwn plugin\");\n\t}\n\n\tconst apiKey = options.apiKey;\n\n\tconst getRecipient = (network: \"mainnet\" | \"testnet\"): string => {\n\t\tif (options.recipients) return options.recipients[network];\n\t\treturn options.recipient!;\n\t};\n\n\tconst getSupportedNetworks = (): (\"mainnet\" | \"testnet\")[] => {\n\t\tif (options.recipients) return [\"mainnet\", \"testnet\"];\n\t\tif (options.recipient) return [getNetworkFromAccountId(options.recipient)];\n\t\treturn [\"mainnet\"];\n\t};\n\n\tconst getRelayerConfig = (network: \"mainnet\" | \"testnet\"): RelayerConfig | undefined => {\n\t\tif (!options.relayer) return undefined;\n\t\tif (\"mainnet\" in options.relayer && typeof options.relayer.mainnet === \"object\") {\n\t\t\treturn (options.relayer as DualNetworkConfig<RelayerConfig>)[network];\n\t\t}\n\t\treturn options.relayer as RelayerConfig;\n\t};\n\n\tconst getRpcUrl = (network: \"mainnet\" | \"testnet\"): string | undefined => {\n\t\tif (!options.rpcUrl) return undefined;\n\t\tif (typeof options.rpcUrl === \"object\") return (options.rpcUrl as DualNetworkConfig<string>)[network];\n\t\treturn options.rpcUrl as string;\n\t};\n\n\tconst getSubAccountConfig = (network: \"mainnet\" | \"testnet\"): SubAccountConfig | undefined => {\n\t\tif (!options.subAccount) return undefined;\n\t\tif (\"mainnet\" in options.subAccount && typeof options.subAccount.mainnet === \"object\") {\n\t\t\treturn (options.subAccount as DualNetworkConfig<SubAccountConfig>)[network];\n\t\t}\n\t\treturn options.subAccount as SubAccountConfig;\n\t};\n\n\tconst primaryNetwork = getSupportedNetworks()[0];\n\tconst relayerStates = new Map<\"mainnet\" | \"testnet\", RelayerState | null>();\n\tconst relayerInitPromises = new Map<\"mainnet\" | \"testnet\", Promise<RelayerState | null>>();\n\n\tconst headers: Record<string, string> = {};\n\tif (apiKey) {\n\t\theaders[\"Authorization\"] = `Bearer ${apiKey}`;\n\t}\n\n\tconst ensureRelayer = async (adapter: DBAdapter, secret: string | undefined, network: \"mainnet\" | \"testnet\") => {\n\t\tif (relayerStates.has(network)) return relayerStates.get(network) ?? null;\n\n\t\tconst existingInit = relayerInitPromises.get(network);\n\t\tif (existingInit) return existingInit;\n\n\t\tconst relayerCfg = getRelayerConfig(network);\n\t\tconst networkRpcUrl = getRpcUrl(network);\n\n\t\tconst initPromise = initRelayer(relayerCfg, network, adapter, secret, apiKey, networkRpcUrl)\n\t\t\t.then((state) => {\n\t\t\t\trelayerStates.set(network, state);\n\t\t\t\trelayerInitPromises.delete(network);\n\t\t\t\treturn state;\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\trelayerInitPromises.delete(network);\n\t\t\t\tthrow error;\n\t\t\t});\n\n\t\trelayerInitPromises.set(network, initPromise);\n\t\treturn initPromise;\n\t};\n\n\tconst getNear = (network: \"mainnet\" | \"testnet\") => {\n\t\tconst networkRpcUrl = getRpcUrl(network);\n\t\tif (networkRpcUrl) {\n\t\t\treturn new Near({ network: { rpcUrl: networkRpcUrl, networkId: network }, headers: apiKey ? { Authorization: `Bearer ${apiKey}` } : undefined });\n\t\t}\n\t\treturn new Near({ network, headers: apiKey ? { Authorization: `Bearer ${apiKey}` } : undefined });\n\t};\n\n\treturn ({\n\t\tid: \"siwn\",\n\t\tschema,\n\t\thooks: {\n\t\t\tafter: [\n\t\t\t\t{\n\t\t\t\t\tmatcher: (context: { path?: string; method?: string }) => context.path === \"/auth/session\" && context.method === \"GET\",\n\t\t\t\t\thandler: createAuthMiddleware(async (ctx) => {\n\t\t\t\t\t\tconst session = ctx.context.session;\n\t\t\t\t\t\tif (session) {\n\t\t\t\t\t\t\tconst nearAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t\t\t{ field: \"isPrimary\", operator: \"eq\", value: true },\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 (nearAccount) {\n\t\t\t\t\t\t\t\tctx.context.session = {\n\t\t\t\t\t\t\t\t\t...session,\n\t\t\t\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t\t\t\t...session.user,\n\t\t\t\t\t\t\t\t\t\tnearAccount: nearAccount\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn { context: ctx };\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tendpoints: {\n\t\t\tlinkNearAccount: createAuthEndpoint(\n\t\t\t\t\"/near/link-account\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: LinkAccountRequest,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t\trequireRequest: true,\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { signedMessage, message, recipient, nonce, accountId } = ctx.body;\n\t\t\t\t\tconst network = getNetworkFromAccountId(accountId);\n\t\t\t\t\tconst session = ctx.context.session;\n\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Must be logged in to link NEAR account\",\n\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst near = getNear(network);\n\t\t\t\t\t\tconst nonceBytes = hex.decode(nonce);\n\n\t\t\t\t\t\tconst isValid = await verifyNep413Signature(\n\t\t\t\t\t\tsignedMessage,\n\t\t\t\t\t\t{ message, recipient, nonce: nonceBytes },\n\t\t\t\t\t\t\t{ near, maxAge: 15 * 60 * 1000 },\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Unauthorized: Invalid signature\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (signedMessage.accountId !== accountId) {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Unauthorized: Account ID mismatch\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst publicKey = signedMessage.publicKey;\n\n\t\t\t\t\t\tif (!options.requireFullAccessKey && options.validateLimitedAccessKey) {\n\t\t\t\t\t\t\tconst isValidKey = await options.validateLimitedAccessKey({\n\t\t\t\t\t\t\t\taccountId: accountId,\n\t\t\t\t\t\t\t\tpublicKey: publicKey,\n\t\t\t\t\t\t\t\trecipient: options.recipient\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (!isValidKey) {\n\t\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\t\tmessage: \"Unauthorized: Invalid function call access key\",\n\t\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst existingNearAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"eq\", value: accountId },\n\t\t\t\t\t\t\t\t{ field: \"network\", operator: \"eq\", value: network },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (existingNearAccount) {\n\t\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\t\tmessage: \"This NEAR account is already linked to another user\",\n\t\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst existingPrimaryAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t\t{ field: \"isPrimary\", operator: \"eq\", value: true },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait ctx.context.adapter.create({\n\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tuserId: session.user.id,\n\t\t\t\t\t\t\t\taccountId,\n\t\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\t\tpublicKey: publicKey,\n\t\t\t\t\t\t\t\tisPrimary: !existingPrimaryAccount,\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait ctx.context.internalAdapter.createAccount({\n\t\t\t\t\t\t\tuserId: session.user.id,\n\t\t\t\t\t\t\tproviderId: \"siwn\",\n\t\t\t\t\t\t\taccountId: `${accountId}:${network}`,\n\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t\taccountId,\n\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\tmessage: \"NEAR account successfully linked\"\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\tif (error instanceof APIError) throw error;\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Something went wrong. Please try again later.\",\n\t\t\t\t\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t\t\t\t\t\tstatus: 401,\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\tunlinkNearAccount: createAuthEndpoint(\n\t\t\t\t\"/near/unlink-account\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\taccountId: z.string(),\n\t\t\t\t\t\tnetwork: z.enum([\"mainnet\", \"testnet\"]).optional(),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { accountId, network: providedNetwork } = ctx.body;\n\t\t\t\t\tconst session = ctx.context.session;\n\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Must be logged in to unlink NEAR account\",\n\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst network = providedNetwork || getNetworkFromAccountId(accountId);\n\n\t\t\t\t\tconst nearAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"eq\", value: accountId },\n\t\t\t\t\t\t\t{ field: \"network\", operator: \"eq\", value: network },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!nearAccount) {\n\t\t\t\t\t\tthrow new APIError(\"NOT_FOUND\", {\n\t\t\t\t\t\t\tmessage: \"NEAR account not found or not linked to your user\",\n\t\t\t\t\t\t\tstatus: 404,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst accounts = await ctx.context.adapter.findMany({\n\t\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\t\twhere: [{ field: \"userId\", operator: \"eq\", value: session.user.id }],\n\t\t\t\t\t});\n\n\t\t\t\t\tif (accounts.length <= 1) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Cannot unlink last authentication method. Link another account first.\",\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (nearAccount.isPrimary) {\n\t\t\t\t\t\tconst otherNearAccounts: NearAccount[] = await ctx.context.adapter.findMany({\n\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"ne\", value: accountId },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (otherNearAccounts.length > 0) {\n\t\t\t\t\t\t\tawait ctx.context.adapter.update({\n\t\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t{ field: \"id\", operator: \"eq\", value: otherNearAccounts[0]!.id },\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tupdate: { isPrimary: true },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tawait ctx.context.adapter.delete({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"eq\", value: accountId },\n\t\t\t\t\t\t\t{ field: \"network\", operator: \"eq\", value: network },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tconst accountToDelete: Account | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t{ field: \"providerId\", operator: \"eq\", value: \"siwn\" },\n\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"eq\", value: `${accountId}:${network}` },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tif (accountToDelete) {\n\t\t\t\t\t\tawait ctx.context.internalAdapter.deleteAccount(accountToDelete.id);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\taccountId,\n\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\tmessage: \"NEAR account successfully unlinked\"\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tlistNearAccounts: createAuthEndpoint(\n\t\t\t\t\"/near/list-accounts\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst session = ctx.context.session;\n\n\t\t\t\t\tconst nearAccounts: NearAccount[] = await ctx.context.adapter.findMany({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [{ field: \"userId\", operator: \"eq\", value: session.user.id }],\n\t\t\t\t\t});\n\n\t\t\t\t\treturn ctx.json(buildListAccountsResponse(nearAccounts));\n\t\t\t\t},\n\t\t\t),\n\t\t\tsetPrimaryNearAccount: createAuthEndpoint(\n\t\t\t\t\"/near/set-primary-account\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: SetPrimaryAccountRequest,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { accountId, network: providedNetwork } = ctx.body;\n\t\t\t\t\tconst session = ctx.context.session;\n\t\t\t\t\tconst network = providedNetwork || getNetworkFromAccountId(accountId);\n\n\t\t\t\t\tconst targetAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"eq\", value: accountId },\n\t\t\t\t\t\t\t{ field: \"network\", operator: \"eq\", value: network },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!targetAccount) {\n\t\t\t\t\t\tthrow new APIError(\"NOT_FOUND\", {\n\t\t\t\t\t\t\tmessage: \"NEAR account not found or not linked to your user\",\n\t\t\t\t\t\t\tstatus: 404,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst nearAccounts: NearAccount[] = await ctx.context.adapter.findMany({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [{ field: \"userId\", operator: \"eq\", value: session.user.id }],\n\t\t\t\t\t});\n\n\t\t\t\t\tawait Promise.all(nearAccounts.map((account) => ctx.context.adapter.update({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [{ field: \"id\", operator: \"eq\", value: account.id }],\n\t\t\t\t\t\tupdate: { isPrimary: nearAccountKey(account) === nearAccountKey(targetAccount) },\n\t\t\t\t\t})));\n\n\t\t\t\t\tconst updatedNearAccounts: NearAccount[] = await ctx.context.adapter.findMany({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [{ field: \"userId\", operator: \"eq\", value: session.user.id }],\n\t\t\t\t\t});\n\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\taccountId,\n\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\tmessage: \"Primary NEAR account updated\",\n\t\t\t\t\t\t...buildListAccountsResponse(updatedNearAccounts),\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tgetSiwnNonce: createAuthEndpoint(\n\t\t\t\t\"/near/nonce\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: NonceRequest,\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { accountId, networkId } = ctx.body;\n\t\t\t\t\tconst network = getNetworkFromAccountId(accountId);\n\n\t\t\t\t\tif (networkId !== network) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Network ID mismatch with account ID\",\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst near = getNear(network);\n\t\t\t\t\tconst exists = await near.accountExists(accountId);\n\t\t\t\t\tif (!exists) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Account does not exist on-chain\",\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst nonce = options.getNonce ? await options.getNonce() : generateNonce();\n\n\t\t\t\t\tconst nonceString = hex.encode(nonce);\n\n\t\t\t\t\tawait ctx.context.internalAdapter.createVerificationValue({\n\t\t\t\t\t\tidentifier: `siwn:${accountId}:${network}`,\n\t\t\t\t\t\tvalue: nonceString,\n\t\t\t\t\t\texpiresAt: new Date(Date.now() + 15 * 60 * 1000),\n\t\t\t\t\t});\n\n\t\t\t\t\treturn ctx.json(NonceResponse.parse({ nonce: nonceString }));\n\t\t\t\t},\n\t\t\t),\n\t\t\tgetSiwnProfile: createAuthEndpoint(\n\t\t\t\t\"/near/profile\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: ProfileRequest,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { accountId } = ctx.body;\n\t\t\t\t\tlet targetAccountId = accountId;\n\n\t\t\t\t\tif (!targetAccountId) {\n\t\t\t\t\t\tconst session = ctx.context.session;\n\t\t\t\t\t\tif (!session) {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Session required when no accountId provided\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst nearAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t\t{ field: \"isPrimary\", operator: \"eq\", value: true },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!nearAccount) {\n\t\t\t\t\t\t\tthrow new APIError(\"NOT_FOUND\", {\n\t\t\t\t\t\t\t\tmessage: \"No NEAR account found for user\",\n\t\t\t\t\t\t\t\tstatus: 404,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetAccountId = nearAccount.accountId;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst profile = await (options.getProfile || ((id: AccountId) => defaultGetProfile(id, apiKey)))(targetAccountId);\n\t\t\t\t\treturn ctx.json(ProfileResponse.parse(profile));\n\t\t\t\t},\n\t\t\t),\n\t\t\tverifySiwnMessage: createAuthEndpoint(\n\t\t\t\t\"/near/verify\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: VerifyRequest,\n\t\t\t\t\trequireRequest: true,\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tsignedMessage,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\trecipient,\n\t\t\t\t\t\tnonce,\n\t\t\t\t\t\taccountId,\n\t\t\t\t\t} = ctx.body;\n\t\t\t\t\tconst network = getNetworkFromAccountId(accountId);\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst near = getNear(network);\n\t\t\t\t\t\tconst nonceBytes = hex.decode(nonce);\n\n\t\t\t\t\t\tconst isValid = await verifyNep413Signature(\n\t\t\t\t\t\tsignedMessage,\n\t\t\t\t\t\t{ message, recipient, nonce: nonceBytes },\n\t\t\t\t\t\t\t{ near, maxAge: 15 * 60 * 1000 },\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Unauthorized: Invalid signature\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (signedMessage.accountId !== accountId) {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Unauthorized: Account ID mismatch\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst publicKey = signedMessage.publicKey;\n\n\t\t\t\t\t\tconst nonceHash = await hashNonce(nonceBytes);\n\n\t\t\t\t\t\tconst existingNonce = await ctx.context.internalAdapter.findVerificationValue(\n\t\t\t\t\t\t\t`siwn-nonce:${nonceHash}`\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (existingNonce) {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Unauthorized: Nonce already used (replay attack detected)\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t\tcode: \"UNAUTHORIZED_NONCE_REPLAY\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait ctx.context.internalAdapter.createVerificationValue({\n\t\t\t\t\t\t\tidentifier: `siwn-nonce:${nonceHash}`,\n\t\t\t\t\t\t\tvalue: \"used\",\n\t\t\t\t\t\t\texpiresAt: new Date(Date.now() + 15 * 60 * 1000),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!options.requireFullAccessKey) {\n\t\t\t\t\t\t\tconst validateKey = options.validateLimitedAccessKey\n\t\t\t\t\t\t\t\t|| ((args: { accountId: string; publicKey: string; recipient?: string }) =>\n\t\t\t\t\t\t\t\t\tdefaultValidateLimitedAccessKey(args.accountId, args.publicKey, args.recipient || getRecipient(network), near));\n\n\t\t\t\t\t\t\tconst isValidKey = await validateKey({\n\t\t\t\t\t\t\t\taccountId: accountId,\n\t\t\t\t\t\t\t\tpublicKey: publicKey,\n\t\t\t\t\t\t\t\trecipient: options.recipient\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (!isValidKey) {\n\t\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\t\tmessage: \"Unauthorized: Invalid function call access key\",\n\t\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet user: User | null = null;\n\n\t\t\t\t\t\tconst existingNearAccount: NearAccount | null =\n\t\t\t\t\t\t\tawait ctx.context.adapter.findOne({\n\t\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"eq\", value: accountId },\n\t\t\t\t\t\t\t\t\t{ field: \"network\", operator: \"eq\", value: network },\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (existingNearAccount) {\n\t\t\t\t\t\t\tuser = await ctx.context.adapter.findOne({\n\t\t\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t\t\t\toperator: \"eq\",\n\t\t\t\t\t\t\t\t\t\tvalue: existingNearAccount.userId,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst anyNearAccount: NearAccount | null =\n\t\t\t\t\t\t\t\tawait ctx.context.adapter.findOne({\n\t\t\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"eq\", value: accountId },\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (anyNearAccount) {\n\t\t\t\t\t\t\t\tuser = await ctx.context.adapter.findOne({\n\t\t\t\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t\t\t\t\toperator: \"eq\",\n\t\t\t\t\t\t\t\t\t\t\tvalue: anyNearAccount.userId,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!user) {\n\t\t\t\t\t\t\tconst userEmail = deriveEmail(accountId, getRecipient(network));\n\n\t\t\t\t\t\t\tconst profile = await (options.getProfile || ((id: AccountId) => defaultGetProfile(id, apiKey)))(accountId);\n\n\t\t\t\t\t\t\tuser = await ctx.context.internalAdapter.createUser({\n\t\t\t\t\t\t\t\tname: profile?.name ?? accountId,\n\t\t\t\t\t\t\t\temail: userEmail,\n\t\t\t\t\t\t\t\timage: profile?.image ? getImageUrl(profile.image) : \"\",\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tawait ctx.context.adapter.create({\n\t\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t\t\t\t\taccountId,\n\t\t\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\t\t\tpublicKey: publicKey,\n\t\t\t\t\t\t\t\t\tisPrimary: true,\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(),\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\tawait ctx.context.internalAdapter.createAccount({\n\t\t\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t\t\t\tproviderId: \"siwn\",\n\t\t\t\t\t\t\t\taccountId: `${accountId}:${network}`,\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (!existingNearAccount) {\n\t\t\t\t\t\t\t\tawait ctx.context.adapter.create({\n\t\t\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t\t\t\t\t\taccountId,\n\t\t\t\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\t\t\t\tpublicKey: publicKey,\n\t\t\t\t\t\t\t\t\t\tisPrimary: false,\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tawait ctx.context.internalAdapter.createAccount({\n\t\t\t\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t\t\t\t\tproviderId: \"siwn\",\n\t\t\t\t\t\t\t\t\taccountId: `${accountId}:${network}`,\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait ensureRelayer(ctx.context.adapter, ctx.context.secret, network);\n\n\t\t\t\t\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\t\tuser.id\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!session) {\n\t\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\t\tmessage: \"Internal Server Error\",\n\t\t\t\t\t\t\t\tstatus: 500,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait setSessionCookie(ctx, { session, user });\n\n\t\t\t\t\t\treturn ctx.json(VerifyResponse.parse({\n\t\t\t\t\t\t\ttoken: session.token,\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t\tid: user.id,\n\t\t\t\t\t\t\t\taccountId,\n\t\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}));\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\tif (error instanceof APIError) throw error;\n\t\t\t\t\t\tconst msg = error instanceof Error ? error.message : \"Unknown error\";\n\t\t\t\t\t\tconst at = error instanceof Error && error.stack ? error.stack.split(\"\\n\").slice(1, 3).map(s => s.trim()).join(\" <- \") : \"\";\n\t\t\t\t\t\tconsole.error(`[siwn] Verify error: ${msg}${at ? ` (${at})` : \"\"}`);\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Something went wrong. Please try again later.\",\n\t\t\t\t\t\t\terror: msg,\n\t\t\t\t\t\t\tstatus: 401,\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\trelayNearTransaction: createAuthEndpoint(\n\t\t\t\t\"/near/relay\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: RelayRequest,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { payload } = ctx.body;\n\t\t\t\t\tconst session = ctx.context.session;\n\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Must be authenticated to relay transactions\",\n\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst nearAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t{ field: \"isPrimary\", operator: \"eq\", value: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!nearAccount) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"No NEAR account linked to session\",\n\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst network = nearAccount.network as \"mainnet\" | \"testnet\";\n\t\t\t\t\tconst rState = await ensureRelayer(ctx.context.adapter, ctx.context.secret, network);\n\n\t\t\t\t\tif (!rState) {\n\t\t\t\t\t\tthrow new APIError(\"SERVICE_UNAVAILABLE\", {\n\t\t\t\t\t\t\tmessage: \"Relayer not configured\",\n\t\t\t\t\t\t\tstatus: 503,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst decoded: SignedDelegateAction = decodeSignedDelegateAction(payload);\n\t\t\t\t\t\tconst delegateAction = decoded.signedDelegate.delegateAction;\n\n\t\t\t\t\t\tif (delegateAction.senderId !== nearAccount.accountId) {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Delegate action sender does not match session account\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst relayerConfigForNetwork = getRelayerConfig(network);\n\t\t\t\t\t\tif (relayerConfigForNetwork?.whitelistedContracts?.length) {\n\t\t\t\t\t\t\tif (!relayerConfigForNetwork.whitelistedContracts.includes(delegateAction.receiverId)) {\n\t\t\t\t\t\t\t\tthrow new APIError(\"FORBIDDEN\", {\n\t\t\t\t\t\t\t\t\tmessage: `Contract ${delegateAction.receiverId} is not whitelisted for relay`,\n\t\t\t\t\t\t\t\t\tstatus: 403,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (relayerConfigForNetwork?.maxGasPerTransaction) {\n\t\t\t\t\t\t\tconst totalGas = delegateAction.actions.reduce((sum: bigint, a) => {\n\t\t\t\t\t\t\t\treturn sum + (\"functionCall\" in a ? a.functionCall.gas : 0n);\n\t\t\t\t\t\t\t}, 0n);\n\t\t\t\t\t\t\tif (totalGas > BigInt(relayerConfigForNetwork.maxGasPerTransaction)) {\n\t\t\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\t\t\tmessage: `Transaction gas (${totalGas}) exceeds relayer limit (${relayerConfigForNetwork.maxGasPerTransaction})`,\n\t\t\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (relayerConfigForNetwork?.maxDepositPerTransaction) {\n\t\t\t\t\t\t\tconst totalDeposit = delegateAction.actions.reduce((sum: bigint, a) => {\n\t\t\t\t\t\t\t\tif (\"functionCall\" in a) return sum + a.functionCall.deposit;\n\t\t\t\t\t\t\t\tif (\"transfer\" in a) return sum + a.transfer.deposit;\n\t\t\t\t\t\t\t\treturn sum;\n\t\t\t\t\t\t\t}, 0n);\n\t\t\t\t\t\t\tif (totalDeposit > BigInt(relayerConfigForNetwork.maxDepositPerTransaction)) {\n\t\t\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\t\t\tmessage: `Transaction deposit (${totalDeposit}) exceeds relayer limit (${relayerConfigForNetwork.maxDepositPerTransaction})`,\n\t\t\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst result = await relayOnChain(payload, rState);\n\n\t\t\t\t\t\tawait ctx.context.adapter.create({\n\t\t\t\t\t\t\tmodel: \"relayedTransaction\",\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tuserId: session.user.id,\n\t\t\t\t\t\t\t\ttxHash: result.txHash,\n\t\t\t\t\t\t\t\tsenderId: delegateAction.senderId,\n\t\t\t\t\t\t\t\treceiverId: delegateAction.receiverId,\n\t\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\t\tstatus: \"pending\",\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\n\t\t\t\t\tif (rState.mode === \"ephemeral\") {\n\t\t\t\t\t\tawait ctx.context.adapter.update({\n\t\t\t\t\t\t\tmodel: \"relayerKey\",\n\t\t\t\t\t\t\twhere: [{ field: \"network\", operator: \"eq\", value: network }],\n\t\t\t\t\t\t\tupdate: { lastUsedAt: new Date() },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t\treturn ctx.json(RelayResponse.parse({\n\t\t\t\t\t\t\ttxHash: result.txHash,\n\t\t\t\t\t\t\tstatus: \"pending\",\n\t\t\t\t\t\t}));\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\tif (error instanceof APIError) throw error;\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: error instanceof Error ? error.message : \"Relay failed\",\n\t\t\t\t\t\t\tstatus: 500,\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\tgetRelayStatus: createAuthEndpoint(\n\t\t\t\t\"/near/relay-status/:txHash\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst txHash = (ctx.params as Record<string, string>)?.txHash;\n\t\t\t\t\tif (!txHash) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Transaction hash required\",\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst session = ctx.context.session;\n\n\t\t\t\t\tconst relayedTx = await ctx.context.adapter.findOne<RelayedTransactionRecord>({\n\t\t\t\t\t\tmodel: \"relayedTransaction\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"txHash\", operator: \"eq\", value: txHash },\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!relayedTx) {\n\t\t\t\t\t\tthrow new APIError(\"NOT_FOUND\", {\n\t\t\t\t\t\t\tmessage: \"Transaction not found or not owned by this user\",\n\t\t\t\t\t\t\tstatus: 404,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst network = relayedTx.network;\n\t\t\t\t\tconst senderId = relayedTx.senderId;\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst near = getNear(network);\n\t\t\t\t\t\tconst txResult = await near.getTransactionStatus(txHash, senderId);\n\n\t\t\t\t\t\tconst txStatus = txResult.status;\n\t\t\t\t\t\tif (txStatus && typeof txStatus === \"object\") {\n\t\t\t\t\t\t\tconst hasSuccess = \"SuccessValue\" in txStatus || \"SuccessReceiptId\" in txStatus;\n\t\t\t\t\t\t\tconst hasFailure = \"Failure\" in txStatus;\n\t\t\t\t\t\t\tconst status = hasSuccess ? \"completed\" : hasFailure ? \"failed\" : \"pending\";\n\n\t\t\t\t\t\t\tif (status !== \"pending\") {\n\t\t\t\t\t\t\t\tawait ctx.context.adapter.update({\n\t\t\t\t\t\t\t\t\tmodel: \"relayedTransaction\",\n\t\t\t\t\t\t\t\t\twhere: [{ field: \"txHash\", operator: \"eq\", value: txHash }],\n\t\t\t\t\t\t\t\t\tupdate: { status },\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\tconst gasUsed = txResult.transaction_outcome?.outcome?.gas_burnt?.toString();\n\n\t\t\t\t\t\t\treturn ctx.json(RelayStatusResponse.parse({\n\t\t\t\t\t\t\t\tstatus,\n\t\t\t\t\t\t\t\tgasUsed,\n\t\t\t\t\t\t\t\toutcome: txResult,\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn ctx.json(RelayStatusResponse.parse({ status: \"pending\" }));\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\treturn ctx.json(RelayStatusResponse.parse({ status: \"pending\" }));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t\tgetRelayerInfo: createAuthEndpoint(\n\t\t\t\t\"/near/relayer-info\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: GetRelayerInfoRequest,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { network: requestedNetwork } = ctx.body;\n\t\t\t\t\tconst targetNetwork = (requestedNetwork ?? primaryNetwork) as \"mainnet\" | \"testnet\";\n\t\t\t\t\tconst rState = await ensureRelayer(ctx.context.adapter, ctx.context.secret, targetNetwork);\n\n\t\t\t\t\tif (!rState) {\n\t\t\t\t\t\treturn ctx.json({ enabled: false, subAccountAvailable: false } satisfies Partial<RelayerInfo> & { enabled: boolean });\n\t\t\t\t\t}\n\n\t\t\t\t\tconst subAccountCfg = getSubAccountConfig(targetNetwork);\n\t\t\t\t\tconst { parentAccount, subAccountAvailable } = resolveParentAccount(subAccountCfg, rState);\n\n\t\t\t\t\tconst near = getNear(rState.network);\n\t\t\t\t\tlet account;\n\t\t\t\t\ttry {\n\t\t\t\t\t\taccount = await near.getAccount(rState.accountId);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\taccount = {\n\t\t\t\t\t\t\tbalance: \"0\",\n\t\t\t\t\t\t\tavailable: \"0\",\n\t\t\t\t\t\t\tstaked: \"0\",\n\t\t\t\t\t\t\tstorageUsage: \"0\",\n\t\t\t\t\t\t\tstorageBytes: 0,\n\t\t\t\t\t\t\thasContract: false,\n\t\t\t\t\t\t\tcodeHash: \"\",\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\taccountId: rState.accountId,\n\t\t\t\t\t\tmode: rState.mode,\n\t\t\t\t\t\tnetwork: rState.network,\n\t\t\t\t\t\tpublicKey: rState.publicKey,\n\t\t\t\t\t\tbalance: account.balance,\n\t\t\t\t\t\tavailable: account.available,\n\t\t\t\t\t\tstaked: account.staked,\n\t\t\t\t\t\tstorageUsage: account.storageUsage,\n\t\t\t\t\t\tstorageBytes: account.storageBytes,\n\t\t\t\t\t\thasContract: account.hasContract,\n\t\t\t\t\t\thasKey: true,\n\t\t\t\t\t\tcreatedAt: rState.createdAt,\n\t\t\t\t\t\tlastUsedAt: rState.lastUsedAt,\n\t\t\t\t\t\tparentAccount: parentAccount ?? undefined,\n\t\t\t\t\t\tsubAccountAvailable,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tgetRelayHistory: createAuthEndpoint(\n\t\t\t\t\"/near/relay-history\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst session = ctx.context.session;\n\n\t\t\t\t\tlet transactions: RelayedTransactionRecord[] = [];\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await ctx.context.adapter.findMany<RelayedTransactionRecord>({\n\t\t\t\t\t\t\tmodel: \"relayedTransaction\",\n\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t});\n\t\t\t\t\t\ttransactions = result || [];\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconsole.error(\"relay-history findMany error:\", err);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst sorted = transactions.sort((a, b) => {\n\t\t\t\t\t\tconst aTime = a.createdAt instanceof Date ? a.createdAt.getTime() : new Date(a.createdAt ?? 0).getTime();\n\t\t\t\t\t\tconst bTime = b.createdAt instanceof Date ? b.createdAt.getTime() : new Date(b.createdAt ?? 0).getTime();\n\t\t\t\t\t\treturn bTime - aTime;\n\t\t\t\t\t});\n\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\ttransactions: sorted.map((tx) => ({\n\t\t\t\t\t\t\tid: String(tx.id ?? \"\"),\n\t\t\t\t\t\t\tuserId: String(tx.userId ?? \"\"),\n\t\t\t\t\t\t\ttxHash: String(tx.txHash ?? \"\"),\n\t\t\t\t\t\t\tsenderId: String(tx.senderId ?? \"\"),\n\t\t\t\t\t\t\treceiverId: String(tx.receiverId ?? \"\"),\n\t\t\t\t\t\t\tnetwork: String(tx.network ?? \"mainnet\"),\n\t\t\t\t\t\t\tstatus: String(tx.status ?? \"pending\"),\n\t\t\t\t\t\t\tgasUsed: tx.gasUsed ? String(tx.gasUsed) : undefined,\n\t\t\t\t\t\t\tcreatedAt: tx.createdAt instanceof Date ? tx.createdAt.toISOString() : tx.createdAt ? String(tx.createdAt) : new Date().toISOString(),\n\t\t\t\t\t\t\tupdatedAt: tx.updatedAt instanceof Date ? tx.updatedAt.toISOString() : tx.updatedAt ? String(tx.updatedAt) : undefined,\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\tviewContract: createAuthEndpoint(\n\t\t\t\t\"/near/view\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: ViewContractRequest,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { contractId, methodName, args } = ctx.body;\n\t\t\t\t\tconst session = ctx.context.session;\n\t\t\t\t\tconst nearAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t{ field: \"isPrimary\", operator: \"eq\", value: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tconst network = (nearAccount?.network || primaryNetwork) as \"mainnet\" | \"testnet\";\n\t\t\t\t\tconst near = getNear(network);\n\t\t\t\t\tlet result: unknown;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tresult = await near.view(contractId, methodName, args ?? {});\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\tif (error instanceof APIError) throw error;\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: error instanceof Error ? error.message : \"Unknown error\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn ctx.json(ViewContractResponse.parse({ result }));\n\t\t\t\t},\n\t\t\t),\n\t\t\tcreateSubAccount: createAuthEndpoint(\n\t\t\t\t\"/near/create-sub-account\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: CreateSubAccountRequest,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { subAccountName, network: providedNetwork, publicKey } = ctx.body;\n\t\t\t\t\tconst session = ctx.context.session;\n\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Must be authenticated to create a sub-account\",\n\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst nearAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t{ field: \"isPrimary\", operator: \"eq\", value: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tconst network = (providedNetwork || nearAccount?.network || primaryNetwork) as \"mainnet\" | \"testnet\";\n\t\t\t\t\tconst subAccountCfg = getSubAccountConfig(network);\n\t\t\t\t\tconst rState = await ensureRelayer(ctx.context.adapter, ctx.context.secret, network);\n\n\t\t\t\t\tif (!rState) {\n\t\t\t\t\t\tthrow new APIError(\"SERVICE_UNAVAILABLE\", {\n\t\t\t\t\t\t\tmessage: \"Relayer not configured — sub-account creation requires a funded relayer\",\n\t\t\t\t\t\t\tstatus: 503,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { parentAccount, subAccountAvailable } = resolveParentAccount(subAccountCfg, rState);\n\n\t\t\t\t\tif (!subAccountAvailable || !parentAccount) {\n\t\t\t\t\t\tthrow new APIError(\"SERVICE_UNAVAILABLE\", {\n\t\t\t\t\t\t\tmessage: \"Sub-account creation requires a named parent account. Configure subAccount.parentAccount in your SIWN plugin options, or use an explicit relayer with a named account.\",\n\t\t\t\t\t\t\tstatus: 503,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (parentAccount !== rState.accountId && !subAccountCfg?.parentKey) {\n\t\t\t\t\t\tthrow new APIError(\"SERVICE_UNAVAILABLE\", {\n\t\t\t\t\t\t\tmessage: \"Sub-account parent differs from relayer account. Configure subAccount.parentKey to enable signing as the parent account.\",\n\t\t\t\t\t\t\tstatus: 503,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst newAccountId = `${subAccountName}.${parentAccount}`;\n\t\t\t\t\tconst minDeposit = subAccountCfg?.minDeposit || \"0.1 NEAR\";\n\n\t\t\t\t\tconst near = getNear(network);\n\t\t\t\t\tconst exists = await near.accountExists(newAccountId);\n\t\t\t\t\tif (exists) {\n\t\t\t\t\t\tthrow new APIError(\"CONFLICT\", {\n\t\t\t\t\t\t\tmessage: `Account ${newAccountId} already exists on ${network}`,\n\t\t\t\t\t\t\tstatus: 409,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlet txBuilder = rState.near\n\t\t\t\t\t\t.transaction(parentAccount)\n\t\t\t\t\t\t.createAccount(newAccountId)\n\t\t\t\t\t\t.addKey(publicKey, { type: \"fullAccess\" });\n\n\t\t\t\t\tif (subAccountCfg?.parentKey) {\n\t\t\t\t\t\ttxBuilder = txBuilder.signWith(subAccountCfg.parentKey as PrivateKey);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (subAccountCfg?.addRelayerFCAK !== false && subAccountCfg?.relayerFCAK) {\n\t\t\t\t\t\tconst fcakPermission: { type: \"functionCall\"; receiverId: string; methodNames?: string[]; allowance?: string } = {\n\t\t\t\t\t\t\ttype: \"functionCall\",\n\t\t\t\t\t\t\treceiverId: subAccountCfg.relayerFCAK.receiverId,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (subAccountCfg.relayerFCAK.methodNames) {\n\t\t\t\t\t\t\tfcakPermission.methodNames = subAccountCfg.relayerFCAK.methodNames;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (subAccountCfg.relayerFCAK.allowance) {\n\t\t\t\t\t\t\tfcakPermission.allowance = subAccountCfg.relayerFCAK.allowance as `${number} NEAR` | `${bigint} yocto`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttxBuilder.addKey(rState.publicKey, fcakPermission as any);\n\t\t\t\t\t}\n\n\t\t\t\t\ttxBuilder.transfer(newAccountId, minDeposit as `${number} NEAR`);\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait txBuilder.send({ waitUntil: \"EXECUTED\" });\n\n\t\t\t\t\t\tawait ctx.context.adapter.create({\n\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tuserId: session.user.id,\n\t\t\t\t\t\t\t\taccountId: newAccountId,\n\t\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\t\tpublicKey,\n\t\t\t\t\t\t\t\tisPrimary: false,\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait ctx.context.internalAdapter.createAccount({\n\t\t\t\t\t\t\tuserId: session.user.id,\n\t\t\t\t\t\t\tproviderId: \"siwn\",\n\t\t\t\t\t\t\taccountId: `${newAccountId}:${network}`,\n\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn ctx.json(CreateSubAccountResponse.parse({\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t\taccountId: newAccountId,\n\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\tpublicKey,\n\t\t\t\t\t\t\tmessage: `Sub-account ${newAccountId} created on ${network}`,\n\t\t\t\t\t\t}));\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\tconst msg = error instanceof Error ? error.message : \"Unknown error\";\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: `Failed to create sub-account: ${msg}`,\n\t\t\t\t\t\t\tstatus: 500,\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\tcheckSubAccountAvailability: createAuthEndpoint(\n\t\t\t\t\"/near/check-sub-account-availability\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: CheckSubAccountAvailabilityRequest,\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { subAccountName, network: providedNetwork } = ctx.body;\n\n\t\t\t\t\tconst network = (providedNetwork || primaryNetwork) as \"mainnet\" | \"testnet\";\n\t\t\t\t\tconst subAccountCfg = getSubAccountConfig(network);\n\t\t\t\t\tconst rState = await ensureRelayer(ctx.context.adapter, ctx.context.secret, network);\n\n\t\t\t\t\tconst { parentAccount, subAccountAvailable } = resolveParentAccount(subAccountCfg, rState);\n\n\t\t\t\t\tif (!subAccountAvailable || !parentAccount) {\n\t\t\t\t\t\tthrow new APIError(\"SERVICE_UNAVAILABLE\", {\n\t\t\t\t\t\t\tmessage: \"Sub-account creation requires a named parent account. Configure subAccount.parentAccount in your SIWN plugin options, or use an explicit relayer with a named account.\",\n\t\t\t\t\t\t\tstatus: 503,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst accountId = `${subAccountName}.${parentAccount}`;\n\n\t\t\t\t\tconst near = getNear(network);\n\t\t\t\t\tconst exists = await near.accountExists(accountId);\n\n\t\t\t\t\treturn ctx.json(CheckSubAccountAvailabilityResponse.parse({\n\t\t\t\t\t\tavailable: !exists,\n\t\t\t\t\t\taccountId,\n\t\t\t\t\t}));\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t});\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["z"],"sources":["../src/profile.ts","../src/schema.ts","../src/types.ts","../src/utils.ts","../src/index.ts"],"sourcesContent":["import type { AccountId, Profile, SocialImage } from \"./types.js\";\n\nconst FALLBACK_URL =\n\t\"https://ipfs.near.social/ipfs/bafkreidn5fb2oygegqaldx7ycdmhu4owcrmoxd7ekbzfmeakkobz2ja7qy\";\n\nfunction getNetworkFromAccountId(accountId: string): \"mainnet\" | \"testnet\" {\n\treturn accountId.endsWith('.testnet') ? 'testnet' : 'mainnet';\n}\n\nfunction getImageUrl(\n\timage: SocialImage | undefined,\n\tfallback?: string,\n): string {\n\tif (image?.url) return image.url;\n\tif (image?.ipfs_cid) return `https://ipfs.near.social/ipfs/${image.ipfs_cid}`;\n\treturn fallback || FALLBACK_URL;\n}\n\ninterface SocialApiResponse {\n\t[accountId: string]: {\n\t\tprofile?: Profile;\n\t};\n}\n\ninterface KvEntry {\n\tvalue: Record<string, unknown> | string;\n\tblock_height?: number;\n\tblock_hash?: string;\n\ttimestamp_nanosec?: string;\n}\n\ninterface KvResponse {\n\tentries: KvEntry[];\n}\n\nasync function defaultGetProfile(accountId: AccountId, apiKey?: string): Promise<Profile | null> {\n\tconst network = getNetworkFromAccountId(accountId);\n\n\ttry {\n\t\tconst kvUrl = network === \"testnet\"\n\t\t\t? \"https://kv.test.fastnear.com\"\n\t\t\t: \"https://kv.main.fastnear.com\";\n\n\t\tconst effectiveApiKey = apiKey || process.env.FASTNEAR_API_KEY;\n\t\tconst headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n\t\tif (effectiveApiKey) {\n\t\t\theaders[\"Authorization\"] = `Bearer ${effectiveApiKey}`;\n\t\t}\n\n\t\tconst response = await fetch(\n\t\t\t`${kvUrl}/v0/latest/social.near/${accountId}/profile/**`,\n\t\t\t{ headers },\n\t\t);\n\n\t\tif (response.ok) {\n\t\t\tconst data = await response.json() as KvResponse;\n\t\t\tconst entry = data?.entries?.[0];\n\t\t\tif (entry?.value) {\n\t\t\t\ttry {\n\t\t\t\t\tconst profile = typeof entry.value === \"string\"\n\t\t\t\t\t\t? JSON.parse(entry.value)\n\t\t\t\t\t\t: entry.value;\n\t\t\t\t\tif (profile?.name || profile?.description || profile?.image) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tname: profile.name,\n\t\t\t\t\t\t\tdescription: profile.description,\n\t\t\t\t\t\t\timage: profile.image,\n\t\t\t\t\t\t\tbackgroundImage: profile.backgroundImage,\n\t\t\t\t\t\t\tlinktree: profile.linktree,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t}\n\n\t\tconst apiBase = {\n\t\t\tmainnet: \"https://api.near.social\",\n\t\t\ttestnet: \"https://test.api.near.social\",\n\t\t}[network];\n\n\t\tconst keys = [`${accountId}/profile/**`];\n\n\t\tconst fallbackResponse = await fetch(`${apiBase}/get`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\tbody: JSON.stringify({ keys })\n\t\t});\n\n\t\tif (!fallbackResponse.ok) {\n\t\t\tthrow new Error(`HTTP error! status: ${fallbackResponse.status}`);\n\t\t}\n\n\t\tconst fallbackData = await fallbackResponse.json() as SocialApiResponse;\n\t\tconst profile: Profile | undefined = fallbackData?.[accountId]?.profile;\n\n\t\tif (profile) {\n\t\t\treturn {\n\t\t\t\tname: profile.name,\n\t\t\t\tdescription: profile.description,\n\t\t\t\timage: profile.image,\n\t\t\t\tbackgroundImage: profile.backgroundImage,\n\t\t\t\tlinktree: profile.linktree\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t} catch (error) {\n\t\treturn null;\n\t}\n}\n\nexport { defaultGetProfile, getImageUrl, getNetworkFromAccountId };\n","import type { BetterAuthPluginDBSchema } from \"better-auth/db\";\n\nexport const schema = {\n\tnearAccount: {\n\t\tfields: {\n\t\t\tuserId: {\n\t\t\t\ttype: \"string\",\n\t\t\t\treferences: {\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tfield: \"id\",\n\t\t\t\t},\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\taccountId: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tnetwork: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tpublicKey: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tisPrimary: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\tdefaultValue: false,\n\t\t\t},\n\t\t\tcreatedAt: {\n\t\t\t\ttype: \"date\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t},\n\t},\n\trelayedTransaction: {\n\t\tfields: {\n\t\t\tuserId: {\n\t\t\t\ttype: \"string\",\n\t\t\t\treferences: {\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\tfield: \"id\",\n\t\t\t\t},\n\t\t\t},\n\t\t\ttxHash: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tsenderId: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\treceiverId: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tnetwork: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tstatus: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tgasUsed: {\n\t\t\t\ttype: \"string\",\n\t\t\t},\n\t\t\tcreatedAt: {\n\t\t\t\ttype: \"date\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tupdatedAt: {\n\t\t\t\ttype: \"date\",\n\t\t\t},\n\t\t},\n\t},\n\trelayerKey: {\n\t\tfields: {\n\t\t\taccountId: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tencryptedPrivateKey: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tiv: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tpublicKey: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tnetwork: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tcreatedAt: {\n\t\t\t\ttype: \"date\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tlastUsedAt: {\n\t\t\t\ttype: \"date\",\n\t\t\t},\n\t\t},\n\t},\n} satisfies BetterAuthPluginDBSchema;\n","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\tcallbackUrl: z.string().optional(),\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\tcallbackUrl: z.string().optional(),\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","export function bytesToBase64(bytes: Uint8Array): string {\n\treturn btoa(String.fromCharCode(...bytes));\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n\treturn Uint8Array.from(atob(base64), c => c.charCodeAt(0));\n}\n\nexport function bytesToHex(bytes: Uint8Array): string {\n\treturn Array.from(bytes).map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n\tconst bytes = new Uint8Array(hex.length / 2);\n\tfor (let i = 0; i < hex.length; i += 2) {\n\t\tbytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);\n\t}\n\treturn bytes;\n}\n\nasync function deriveAesKey(secret: string): Promise<CryptoKey> {\n\tconst keyMaterial = await crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tnew TextEncoder().encode(secret),\n\t\t{ name: \"HKDF\" },\n\t\tfalse,\n\t\t[\"deriveKey\"],\n\t);\n\treturn crypto.subtle.deriveKey(\n\t\t{\n\t\t\tname: \"HKDF\",\n\t\t\thash: \"SHA-256\",\n\t\t\tsalt: new TextEncoder().encode(\"better-near-auth-relayer\"),\n\t\t\tinfo: new Uint8Array(0),\n\t\t},\n\t\tkeyMaterial,\n\t\t{ name: \"AES-GCM\", length: 256 },\n\t\tfalse,\n\t\t[\"encrypt\", \"decrypt\"],\n\t);\n}\n\nexport async function encryptPrivateKey(\n\tprivateKey: Uint8Array,\n\tsecret: string,\n): Promise<{ encrypted: string; iv: string }> {\n\tconst aesKey = await deriveAesKey(secret);\n\tconst iv = crypto.getRandomValues(new Uint8Array(12));\n\tconst encrypted = await crypto.subtle.encrypt(\n\t\t{ name: \"AES-GCM\", iv },\n\t\taesKey,\n\t\tprivateKey as Uint8Array<ArrayBuffer>,\n\t);\n\treturn {\n\t\tencrypted: bytesToBase64(new Uint8Array(encrypted)),\n\t\tiv: bytesToBase64(iv),\n\t};\n}\n\nexport async function decryptPrivateKey(\n\tencrypted: string,\n\tiv: string,\n\tsecret: string,\n): Promise<Uint8Array> {\n\tconst aesKey = await deriveAesKey(secret);\n\tconst decrypted = await crypto.subtle.decrypt(\n\t\t{ name: \"AES-GCM\", iv: base64ToBytes(iv) as Uint8Array<ArrayBuffer> },\n\t\taesKey,\n\t\tbase64ToBytes(encrypted) as Uint8Array<ArrayBuffer>,\n\t);\n\treturn new Uint8Array(decrypted);\n}\n","import { APIError, createAuthEndpoint, createAuthMiddleware, sessionMiddleware } from \"better-auth/api\";\nimport { setSessionCookie } from \"better-auth/cookies\";\nimport type { Account, User, DBAdapter } from \"better-auth/types\";\n// Explicit type imports for declaration emit\nimport type {} from \"@better-auth/core/env\";\nimport type {} from \"@better-auth/core/oauth2\";\nimport type {} from \"better-call\";\n\nimport { Near, generateNonce, generateKey, parseKey, verifyNep413Signature, decodeSignedDelegateAction, InMemoryKeyStore, RotatingKeyStore } from \"near-kit\";\nimport type { SignedDelegateAction, PrivateKey } from \"near-kit\";\nimport { hex, base58 } from \"@scure/base\";\nimport z from \"zod\";\nimport { defaultGetProfile, getImageUrl, getNetworkFromAccountId } from \"./profile.js\";\nimport { schema } from \"./schema.js\";\nimport {\n\ttype AccountId,\n\ttype DualNetworkConfig,\n\ttype ListAccountsResponseT,\n\ttype ListedNearAccount,\n\ttype NearAccount,\n\ttype Profile,\n\ttype RelayerInfo,\n\ttype RelayedTransactionRecord,\n\ttype SubAccountConfig,\n\tLinkAccountRequest,\n\tNonceRequest,\n\tNonceResponse,\n\tProfileRequest,\n\tProfileResponse,\n\tVerifyRequest,\n\tVerifyResponse,\n\tRelayRequest,\n\tRelayResponse,\n\tRelayStatusResponse,\n\tSetPrimaryAccountRequest,\n\tViewContractRequest,\n\tViewContractResponse,\n\tGetRelayerInfoRequest,\n\tCreateSubAccountRequest,\n\tCreateSubAccountResponse,\n\tCheckSubAccountAvailabilityRequest,\n\tCheckSubAccountAvailabilityResponse,\n} from \"./types.js\";\nexport * from \"./types.js\";\nimport {\n\tbytesToHex,\n\tencryptPrivateKey,\n\tdecryptPrivateKey,\n} from \"./utils.js\";\n\nasync function hashNonce(nonce: Uint8Array): Promise<string> {\n\tconst data = new TextEncoder().encode(hex.encode(nonce));\n\tconst hashBuffer = await crypto.subtle.digest('SHA-256', data);\n\treturn hex.encode(new Uint8Array(hashBuffer));\n}\n\nfunction deriveEmail(accountId: string, recipient: string): string {\n\tif (accountId.endsWith(\".near\")) {\n\t\tconst localPart = accountId.slice(0, -5);\n\t\tif (!localPart.includes(\".\")) {\n\t\t\treturn `${localPart}@near.email`;\n\t\t}\n\t}\n\tconst randomId = crypto.randomUUID().slice(0, 8);\n\treturn `temp-${randomId}@${recipient}`;\n}\n\nfunction nearAccountKey(account: Pick<NearAccount, \"accountId\" | \"network\">): string {\n\treturn `${account.accountId}:${account.network}`;\n}\n\nfunction getCreatedAtTime(account: NearAccount): number {\n\treturn account.createdAt instanceof Date\n\t\t? account.createdAt.getTime()\n\t\t: new Date(account.createdAt).getTime();\n}\n\nfunction buildListAccountsResponse(nearAccounts: NearAccount[]): ListAccountsResponseT {\n\tconst activeAccount = nearAccounts.find((account) => account.isPrimary) ?? nearAccounts[0] ?? null;\n\tconst activeKey = activeAccount ? nearAccountKey(activeAccount) : null;\n\tconst accounts: ListedNearAccount[] = nearAccounts\n\t\t.map((account) => {\n\t\t\tconst isActive = activeKey === nearAccountKey(account);\n\t\t\treturn {\n\t\t\t\t...account,\n\t\t\t\tproviderId: \"siwn\" as const,\n\t\t\t\tisActive,\n\t\t\t\tisAvailable: !isActive,\n\t\t\t};\n\t\t})\n\t\t.sort((a, b) => {\n\t\t\tif (a.isActive !== b.isActive) return a.isActive ? -1 : 1;\n\t\t\treturn getCreatedAtTime(a) - getCreatedAtTime(b);\n\t\t});\n\tconst listedActiveAccount = accounts.find((account) => account.isActive) ?? null;\n\n\treturn {\n\t\taccounts,\n\t\tactiveAccount: listedActiveAccount ? { ...listedActiveAccount } : null,\n\t\tavailableAccounts: accounts\n\t\t\t.filter((account) => account.isAvailable)\n\t\t\t.map((account) => ({ ...account })),\n\t};\n}\n\nexport interface RelayerConfig {\n\taccountId?: string;\n\tprivateKey?: string;\n\tprivateKeys?: string[];\n\twhitelistedContracts?: string[];\n\tmaxGasPerTransaction?: string;\n\tmaxDepositPerTransaction?: string;\n}\n\ninterface RelayerState {\n\tnear: Near;\n\taccountId: string;\n\tnetwork: \"mainnet\" | \"testnet\";\n\tmode: \"ephemeral\" | \"explicit\";\n\tpublicKey: string;\n\tcreatedAt?: Date;\n\tlastUsedAt?: Date;\n}\n\nfunction createNear(\n\tnetwork: \"mainnet\" | \"testnet\",\n\theaders: Record<string, string>,\n\trpcUrl?: string,\n\tkeyStore?: InMemoryKeyStore | RotatingKeyStore,\n): Near {\n\tconst config: ConstructorParameters<typeof Near>[0] = { headers };\n\tif (rpcUrl) {\n\t\tconfig.network = { rpcUrl, networkId: network };\n\t} else {\n\t\tconfig.network = network;\n\t}\n\tif (keyStore) {\n\t\tconfig.keyStore = keyStore;\n\t}\n\treturn new Near(config);\n}\n\nasync function initRelayer(\n\trelayerConfig: RelayerConfig | undefined,\n\tnetwork: \"mainnet\" | \"testnet\",\n\tadapter: DBAdapter,\n\tsecret: string | undefined,\n\tapiKey?: string,\n\trpcUrl?: string,\n): Promise<RelayerState | null> {\n\tif (!relayerConfig) return null;\n\n\tconst headers: Record<string, string> = {};\n\tif (apiKey) {\n\t\theaders[\"Authorization\"] = `Bearer ${apiKey}`;\n\t}\n\n\tif (relayerConfig.accountId && (relayerConfig.privateKey || relayerConfig.privateKeys)) {\n\t\tconst keys = relayerConfig.privateKeys ?? (relayerConfig.privateKey ? [relayerConfig.privateKey] : []);\n\t\tlet keyStore: InMemoryKeyStore | RotatingKeyStore;\n\n\t\tif (keys.length === 1) {\n\t\t\tkeyStore = new InMemoryKeyStore({\n\t\t\t\t[relayerConfig.accountId]: keys[0]!,\n\t\t\t});\n\t\t} else {\n\t\t\tkeyStore = new RotatingKeyStore({\n\t\t\t\t[relayerConfig.accountId]: keys as string[],\n\t\t\t});\n\t\t}\n\n\t\tconst near = createNear(network, headers, rpcUrl, keyStore);\n\t\tconst explicitPublicKey = parseKey(keys[0]!);\n\t\treturn {\n\t\t\tnear,\n\t\t\taccountId: relayerConfig.accountId,\n\t\t\tnetwork,\n\t\t\tmode: \"explicit\",\n\t\t\tpublicKey: explicitPublicKey.publicKey.toString(),\n\t\t};\n\t}\n\n\tconst existing = await adapter.findOne<{ encryptedPrivateKey: string; iv: string; createdAt: Date; lastUsedAt: Date }>({\n\t\tmodel: \"relayerKey\",\n\t\twhere: [{ field: \"network\", operator: \"eq\", value: network }],\n\t});\n\n\tif (existing) {\n\t\tif (!secret) throw new Error(\"BETTER_AUTH_SECRET required for relayer key decryption\");\n\t\tconst privateKeyBytes = await decryptPrivateKey(existing.encryptedPrivateKey, existing.iv, secret);\n\t\tconst keyPair = parseKey(`ed25519:${base58.encode(privateKeyBytes)}`);\n\t\tconst accountId = bytesToHex(keyPair.publicKey.data);\n\n\t\tconsole.log(`[siwn] Relayer recovered: ${accountId} (${network})`);\n\n\t\tconst keyStore = new InMemoryKeyStore();\n\t\tawait keyStore.add(accountId, keyPair);\n\n\t\tconst near = createNear(network, headers, rpcUrl, keyStore);\n\t\treturn {\n\t\t\tnear,\n\t\t\taccountId,\n\t\t\tnetwork,\n\t\t\tmode: \"ephemeral\",\n\t\t\tpublicKey: keyPair.publicKey.toString(),\n\t\t\tcreatedAt: existing.createdAt,\n\t\t\tlastUsedAt: existing.lastUsedAt,\n\t\t};\n\t}\n\n\tconst keyPair = generateKey();\n\tif (!secret) throw new Error(\"BETTER_AUTH_SECRET required for relayer key encryption\");\n\tconst privateKeyBytes = keyPair.secretKey.startsWith(\"ed25519:\")\n\t\t? base58.decode(keyPair.secretKey.slice(8))\n\t\t: new Uint8Array(0);\n\n\tconst publicKeyBase58 = keyPair.publicKey.toString().replace(\"ed25519:\", \"\");\n\tconst accountId = bytesToHex(keyPair.publicKey.data);\n\tconst createdAt = new Date();\n\n\tconst { encrypted, iv } = await encryptPrivateKey(privateKeyBytes, secret);\n\n\tawait adapter.create({\n\t\t\tmodel: \"relayerKey\",\n\t\t\tdata: {\n\t\t\t\taccountId,\n\t\t\t\tencryptedPrivateKey: encrypted,\n\t\t\t\tiv,\n\t\t\t\tpublicKey: `ed25519:${publicKeyBase58}`,\n\t\t\t\tnetwork,\n\t\t\t\tcreatedAt,\n\t\t\t\tlastUsedAt: createdAt,\n\t\t\t},\n\t\t});\n\n\tconsole.log(`[siwn] Relayer created in EPHEMERAL mode: ${accountId} (${network})`);\n\tconsole.log(`[siwn] Fund this account with NEAR to enable gasless relay`);\n\tconsole.log(`[siwn] Private key is encrypted in DB — persists across restarts`);\n\n\tconst keyStore = new InMemoryKeyStore();\n\tawait keyStore.add(accountId, keyPair);\n\n\tconst near = createNear(network, headers, rpcUrl, keyStore);\n\treturn {\n\t\tnear,\n\t\taccountId,\n\t\tnetwork,\n\t\tmode: \"ephemeral\",\n\t\tpublicKey: keyPair.publicKey.toString(),\n\t\tcreatedAt,\n\t\tlastUsedAt: createdAt,\n\t};\n}\n\nasync function relayOnChain(\n\tpayload: string,\n\trelayerState: RelayerState,\n): Promise<{ txHash: string }> {\n\tconst userAction = decodeSignedDelegateAction(payload);\n\n\tconst result = await relayerState.near\n\t\t.transaction(relayerState.accountId)\n\t\t.signedDelegateAction(userAction)\n\t\t.send({ waitUntil: \"EXECUTED\" });\n\n\treturn { txHash: result.transaction.hash };\n}\n\nasync function defaultValidateLimitedAccessKey(\n\taccountId: string,\n\tpublicKey: string,\n\trecipient: string,\n\tnear: Near,\n): Promise<boolean> {\n\tconst key = await near.getAccessKey(accountId, publicKey);\n\tif (!key) return false;\n\tif (key.permission === \"FullAccess\") return true;\n\tif (\"FunctionCall\" in key.permission) {\n\t\treturn key.permission.FunctionCall.receiver_id === recipient;\n\t}\n\treturn false;\n}\n\nfunction isImplicitAccount(accountId: string): boolean {\n\treturn /^[0-9a-f]{64}$/.test(accountId);\n}\n\nfunction resolveParentAccount(\n\tsubAccountCfg: SubAccountConfig | undefined,\n\trState: RelayerState | null,\n): { parentAccount: string | null; subAccountAvailable: boolean } {\n\tif (!rState) return { parentAccount: null, subAccountAvailable: false };\n\tconst parent = subAccountCfg?.parentAccount ?? rState.accountId;\n\tif (!parent || isImplicitAccount(parent)) {\n\t\treturn { parentAccount: null, subAccountAvailable: false };\n\t}\n\treturn { parentAccount: parent, subAccountAvailable: true };\n}\n\nexport interface SIWNPluginOptions {\n\trecipient?: string;\n\trecipients?: DualNetworkConfig<string>;\n\trequireFullAccessKey?: boolean;\n\tgetNonce?: () => Promise<Uint8Array>;\n\tgetProfile?: (accountId: AccountId) => Promise<Profile | null>;\n\tvalidateLimitedAccessKey?: (args: {\n\t\taccountId: AccountId;\n\t\tpublicKey: string;\n\t\trecipient?: string;\n\t}) => Promise<boolean>;\n\tapiKey?: string;\n\trpcUrl?: string | DualNetworkConfig<string>;\n\trelayer?: RelayerConfig | DualNetworkConfig<RelayerConfig>;\n\tsubAccount?: SubAccountConfig | DualNetworkConfig<SubAccountConfig>;\n}\n\nexport const siwn = (options: SIWNPluginOptions) => {\n\tif (!options.recipient && !options.recipients) {\n\t\tthrow new Error(\"Either 'recipient' or 'recipients' must be provided to siwn plugin\");\n\t}\n\n\tconst apiKey = options.apiKey;\n\n\tconst getRecipient = (network: \"mainnet\" | \"testnet\"): string => {\n\t\tif (options.recipients) return options.recipients[network];\n\t\treturn options.recipient!;\n\t};\n\n\tconst getSupportedNetworks = (): (\"mainnet\" | \"testnet\")[] => {\n\t\tif (options.recipients) return [\"mainnet\", \"testnet\"];\n\t\tif (options.recipient) return [getNetworkFromAccountId(options.recipient)];\n\t\treturn [\"mainnet\"];\n\t};\n\n\tconst getRelayerConfig = (network: \"mainnet\" | \"testnet\"): RelayerConfig | undefined => {\n\t\tif (!options.relayer) return undefined;\n\t\tif (\"mainnet\" in options.relayer && typeof options.relayer.mainnet === \"object\") {\n\t\t\treturn (options.relayer as DualNetworkConfig<RelayerConfig>)[network];\n\t\t}\n\t\treturn options.relayer as RelayerConfig;\n\t};\n\n\tconst getRpcUrl = (network: \"mainnet\" | \"testnet\"): string | undefined => {\n\t\tif (!options.rpcUrl) return undefined;\n\t\tif (typeof options.rpcUrl === \"object\") return (options.rpcUrl as DualNetworkConfig<string>)[network];\n\t\treturn options.rpcUrl as string;\n\t};\n\n\tconst getSubAccountConfig = (network: \"mainnet\" | \"testnet\"): SubAccountConfig | undefined => {\n\t\tif (!options.subAccount) return undefined;\n\t\tif (\"mainnet\" in options.subAccount && typeof options.subAccount.mainnet === \"object\") {\n\t\t\treturn (options.subAccount as DualNetworkConfig<SubAccountConfig>)[network];\n\t\t}\n\t\treturn options.subAccount as SubAccountConfig;\n\t};\n\n\tconst primaryNetwork = getSupportedNetworks()[0];\n\tconst relayerStates = new Map<\"mainnet\" | \"testnet\", RelayerState | null>();\n\tconst relayerInitPromises = new Map<\"mainnet\" | \"testnet\", Promise<RelayerState | null>>();\n\n\tconst headers: Record<string, string> = {};\n\tif (apiKey) {\n\t\theaders[\"Authorization\"] = `Bearer ${apiKey}`;\n\t}\n\n\tconst ensureRelayer = async (adapter: DBAdapter, secret: string | undefined, network: \"mainnet\" | \"testnet\") => {\n\t\tif (relayerStates.has(network)) return relayerStates.get(network) ?? null;\n\n\t\tconst existingInit = relayerInitPromises.get(network);\n\t\tif (existingInit) return existingInit;\n\n\t\tconst relayerCfg = getRelayerConfig(network);\n\t\tconst networkRpcUrl = getRpcUrl(network);\n\n\t\tconst initPromise = initRelayer(relayerCfg, network, adapter, secret, apiKey, networkRpcUrl)\n\t\t\t.then((state) => {\n\t\t\t\trelayerStates.set(network, state);\n\t\t\t\trelayerInitPromises.delete(network);\n\t\t\t\treturn state;\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\trelayerInitPromises.delete(network);\n\t\t\t\tthrow error;\n\t\t\t});\n\n\t\trelayerInitPromises.set(network, initPromise);\n\t\treturn initPromise;\n\t};\n\n\tconst getNear = (network: \"mainnet\" | \"testnet\") => {\n\t\tconst networkRpcUrl = getRpcUrl(network);\n\t\tif (networkRpcUrl) {\n\t\t\treturn new Near({ network: { rpcUrl: networkRpcUrl, networkId: network }, headers: apiKey ? { Authorization: `Bearer ${apiKey}` } : undefined });\n\t\t}\n\t\treturn new Near({ network, headers: apiKey ? { Authorization: `Bearer ${apiKey}` } : undefined });\n\t};\n\n\treturn ({\n\t\tid: \"siwn\",\n\t\tschema,\n\t\thooks: {\n\t\t\tafter: [\n\t\t\t\t{\n\t\t\t\t\tmatcher: (context: { path?: string; method?: string }) => context.path === \"/auth/session\" && context.method === \"GET\",\n\t\t\t\t\thandler: createAuthMiddleware(async (ctx) => {\n\t\t\t\t\t\tconst session = ctx.context.session;\n\t\t\t\t\t\tif (session) {\n\t\t\t\t\t\t\tconst nearAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t\t\t{ field: \"isPrimary\", operator: \"eq\", value: true },\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 (nearAccount) {\n\t\t\t\t\t\t\t\tctx.context.session = {\n\t\t\t\t\t\t\t\t\t...session,\n\t\t\t\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t\t\t\t...session.user,\n\t\t\t\t\t\t\t\t\t\tnearAccount: nearAccount\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn { context: ctx };\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tendpoints: {\n\t\t\tlinkNearAccount: createAuthEndpoint(\n\t\t\t\t\"/near/link-account\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: LinkAccountRequest,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t\trequireRequest: true,\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { signedMessage, message, recipient, nonce, accountId, callbackUrl } = ctx.body;\n\t\t\t\t\tconst network = getNetworkFromAccountId(accountId);\n\t\t\t\t\tconst session = ctx.context.session;\n\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Must be logged in to link NEAR account\",\n\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst near = getNear(network);\n\t\t\t\t\t\tconst nonceBytes = hex.decode(nonce);\n\n\t\t\t\t\t\tconst isValid = await verifyNep413Signature(\n\t\t\t\t\t\tsignedMessage,\n\t\t\t\t\t\t{ message, recipient, nonce: nonceBytes, callbackUrl },\n\t\t\t\t\t\t\t{ near, maxAge: 15 * 60 * 1000 },\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Unauthorized: Invalid signature\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (signedMessage.accountId !== accountId) {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Unauthorized: Account ID mismatch\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst publicKey = signedMessage.publicKey;\n\n\t\t\t\t\t\tif (!options.requireFullAccessKey && options.validateLimitedAccessKey) {\n\t\t\t\t\t\t\tconst isValidKey = await options.validateLimitedAccessKey({\n\t\t\t\t\t\t\t\taccountId: accountId,\n\t\t\t\t\t\t\t\tpublicKey: publicKey,\n\t\t\t\t\t\t\t\trecipient: options.recipient\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (!isValidKey) {\n\t\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\t\tmessage: \"Unauthorized: Invalid function call access key\",\n\t\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst existingNearAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"eq\", value: accountId },\n\t\t\t\t\t\t\t\t{ field: \"network\", operator: \"eq\", value: network },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (existingNearAccount) {\n\t\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\t\tmessage: \"This NEAR account is already linked to another user\",\n\t\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst existingPrimaryAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t\t{ field: \"isPrimary\", operator: \"eq\", value: true },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait ctx.context.adapter.create({\n\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tuserId: session.user.id,\n\t\t\t\t\t\t\t\taccountId,\n\t\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\t\tpublicKey: publicKey,\n\t\t\t\t\t\t\t\tisPrimary: !existingPrimaryAccount,\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait ctx.context.internalAdapter.createAccount({\n\t\t\t\t\t\t\tuserId: session.user.id,\n\t\t\t\t\t\t\tproviderId: \"siwn\",\n\t\t\t\t\t\t\taccountId: `${accountId}:${network}`,\n\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t\taccountId,\n\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\tmessage: \"NEAR account successfully linked\"\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\tif (error instanceof APIError) throw error;\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Something went wrong. Please try again later.\",\n\t\t\t\t\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t\t\t\t\t\tstatus: 401,\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\tunlinkNearAccount: createAuthEndpoint(\n\t\t\t\t\"/near/unlink-account\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\taccountId: z.string(),\n\t\t\t\t\t\tnetwork: z.enum([\"mainnet\", \"testnet\"]).optional(),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { accountId, network: providedNetwork } = ctx.body;\n\t\t\t\t\tconst session = ctx.context.session;\n\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Must be logged in to unlink NEAR account\",\n\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst network = providedNetwork || getNetworkFromAccountId(accountId);\n\n\t\t\t\t\tconst nearAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"eq\", value: accountId },\n\t\t\t\t\t\t\t{ field: \"network\", operator: \"eq\", value: network },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!nearAccount) {\n\t\t\t\t\t\tthrow new APIError(\"NOT_FOUND\", {\n\t\t\t\t\t\t\tmessage: \"NEAR account not found or not linked to your user\",\n\t\t\t\t\t\t\tstatus: 404,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst accounts = await ctx.context.adapter.findMany({\n\t\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\t\twhere: [{ field: \"userId\", operator: \"eq\", value: session.user.id }],\n\t\t\t\t\t});\n\n\t\t\t\t\tif (accounts.length <= 1) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Cannot unlink last authentication method. Link another account first.\",\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (nearAccount.isPrimary) {\n\t\t\t\t\t\tconst otherNearAccounts: NearAccount[] = await ctx.context.adapter.findMany({\n\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"ne\", value: accountId },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (otherNearAccounts.length > 0) {\n\t\t\t\t\t\t\tawait ctx.context.adapter.update({\n\t\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t{ field: \"id\", operator: \"eq\", value: otherNearAccounts[0]!.id },\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tupdate: { isPrimary: true },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tawait ctx.context.adapter.delete({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"eq\", value: accountId },\n\t\t\t\t\t\t\t{ field: \"network\", operator: \"eq\", value: network },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tconst accountToDelete: Account | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t{ field: \"providerId\", operator: \"eq\", value: \"siwn\" },\n\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"eq\", value: `${accountId}:${network}` },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tif (accountToDelete) {\n\t\t\t\t\t\tawait ctx.context.internalAdapter.deleteAccount(accountToDelete.id);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\taccountId,\n\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\tmessage: \"NEAR account successfully unlinked\"\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tlistNearAccounts: createAuthEndpoint(\n\t\t\t\t\"/near/list-accounts\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst session = ctx.context.session;\n\n\t\t\t\t\tconst nearAccounts: NearAccount[] = await ctx.context.adapter.findMany({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [{ field: \"userId\", operator: \"eq\", value: session.user.id }],\n\t\t\t\t\t});\n\n\t\t\t\t\treturn ctx.json(buildListAccountsResponse(nearAccounts));\n\t\t\t\t},\n\t\t\t),\n\t\t\tsetPrimaryNearAccount: createAuthEndpoint(\n\t\t\t\t\"/near/set-primary-account\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: SetPrimaryAccountRequest,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { accountId, network: providedNetwork } = ctx.body;\n\t\t\t\t\tconst session = ctx.context.session;\n\t\t\t\t\tconst network = providedNetwork || getNetworkFromAccountId(accountId);\n\n\t\t\t\t\tconst targetAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"eq\", value: accountId },\n\t\t\t\t\t\t\t{ field: \"network\", operator: \"eq\", value: network },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!targetAccount) {\n\t\t\t\t\t\tthrow new APIError(\"NOT_FOUND\", {\n\t\t\t\t\t\t\tmessage: \"NEAR account not found or not linked to your user\",\n\t\t\t\t\t\t\tstatus: 404,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst nearAccounts: NearAccount[] = await ctx.context.adapter.findMany({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [{ field: \"userId\", operator: \"eq\", value: session.user.id }],\n\t\t\t\t\t});\n\n\t\t\t\t\tawait Promise.all(nearAccounts.map((account) => ctx.context.adapter.update({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [{ field: \"id\", operator: \"eq\", value: account.id }],\n\t\t\t\t\t\tupdate: { isPrimary: nearAccountKey(account) === nearAccountKey(targetAccount) },\n\t\t\t\t\t})));\n\n\t\t\t\t\tconst updatedNearAccounts: NearAccount[] = await ctx.context.adapter.findMany({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [{ field: \"userId\", operator: \"eq\", value: session.user.id }],\n\t\t\t\t\t});\n\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\taccountId,\n\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\tmessage: \"Primary NEAR account updated\",\n\t\t\t\t\t\t...buildListAccountsResponse(updatedNearAccounts),\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tgetSiwnNonce: createAuthEndpoint(\n\t\t\t\t\"/near/nonce\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: NonceRequest,\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { accountId, networkId } = ctx.body;\n\t\t\t\t\tconst network = getNetworkFromAccountId(accountId);\n\n\t\t\t\t\tif (networkId !== network) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Network ID mismatch with account ID\",\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst near = getNear(network);\n\t\t\t\t\tconst exists = await near.accountExists(accountId);\n\t\t\t\t\tif (!exists) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Account does not exist on-chain\",\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst nonce = options.getNonce ? await options.getNonce() : generateNonce();\n\n\t\t\t\t\tconst nonceString = hex.encode(nonce);\n\n\t\t\t\t\tawait ctx.context.internalAdapter.createVerificationValue({\n\t\t\t\t\t\tidentifier: `siwn:${accountId}:${network}`,\n\t\t\t\t\t\tvalue: nonceString,\n\t\t\t\t\t\texpiresAt: new Date(Date.now() + 15 * 60 * 1000),\n\t\t\t\t\t});\n\n\t\t\t\t\treturn ctx.json(NonceResponse.parse({ nonce: nonceString }));\n\t\t\t\t},\n\t\t\t),\n\t\t\tgetSiwnProfile: createAuthEndpoint(\n\t\t\t\t\"/near/profile\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: ProfileRequest,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { accountId } = ctx.body;\n\t\t\t\t\tlet targetAccountId = accountId;\n\n\t\t\t\t\tif (!targetAccountId) {\n\t\t\t\t\t\tconst session = ctx.context.session;\n\t\t\t\t\t\tif (!session) {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Session required when no accountId provided\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst nearAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t\t{ field: \"isPrimary\", operator: \"eq\", value: true },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!nearAccount) {\n\t\t\t\t\t\t\tthrow new APIError(\"NOT_FOUND\", {\n\t\t\t\t\t\t\t\tmessage: \"No NEAR account found for user\",\n\t\t\t\t\t\t\t\tstatus: 404,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetAccountId = nearAccount.accountId;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst profile = await (options.getProfile || ((id: AccountId) => defaultGetProfile(id, apiKey)))(targetAccountId);\n\t\t\t\t\treturn ctx.json(ProfileResponse.parse(profile));\n\t\t\t\t},\n\t\t\t),\n\t\t\tverifySiwnMessage: createAuthEndpoint(\n\t\t\t\t\"/near/verify\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: VerifyRequest,\n\t\t\t\t\trequireRequest: true,\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tsignedMessage,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\trecipient,\n\t\t\t\t\t\tnonce,\n\t\t\t\t\t\taccountId,\n\t\t\t\t\t\tcallbackUrl,\n\t\t\t\t\t} = ctx.body;\n\t\t\t\t\tconst network = getNetworkFromAccountId(accountId);\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst near = getNear(network);\n\t\t\t\t\t\tconst nonceBytes = hex.decode(nonce);\n\n\t\t\t\t\t\tconst isValid = await verifyNep413Signature(\n\t\t\t\t\t\tsignedMessage,\n\t\t\t\t\t\t{ message, recipient, nonce: nonceBytes, callbackUrl },\n\t\t\t\t\t\t\t{ near, maxAge: 15 * 60 * 1000 },\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Unauthorized: Invalid signature\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (signedMessage.accountId !== accountId) {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Unauthorized: Account ID mismatch\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst publicKey = signedMessage.publicKey;\n\n\t\t\t\t\t\tconst nonceHash = await hashNonce(nonceBytes);\n\n\t\t\t\t\t\tconst existingNonce = await ctx.context.internalAdapter.findVerificationValue(\n\t\t\t\t\t\t\t`siwn-nonce:${nonceHash}`\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (existingNonce) {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Unauthorized: Nonce already used (replay attack detected)\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t\tcode: \"UNAUTHORIZED_NONCE_REPLAY\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait ctx.context.internalAdapter.createVerificationValue({\n\t\t\t\t\t\t\tidentifier: `siwn-nonce:${nonceHash}`,\n\t\t\t\t\t\t\tvalue: \"used\",\n\t\t\t\t\t\t\texpiresAt: new Date(Date.now() + 15 * 60 * 1000),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!options.requireFullAccessKey) {\n\t\t\t\t\t\t\tconst validateKey = options.validateLimitedAccessKey\n\t\t\t\t\t\t\t\t|| ((args: { accountId: string; publicKey: string; recipient?: string }) =>\n\t\t\t\t\t\t\t\t\tdefaultValidateLimitedAccessKey(args.accountId, args.publicKey, args.recipient || getRecipient(network), near));\n\n\t\t\t\t\t\t\tconst isValidKey = await validateKey({\n\t\t\t\t\t\t\t\taccountId: accountId,\n\t\t\t\t\t\t\t\tpublicKey: publicKey,\n\t\t\t\t\t\t\t\trecipient: options.recipient\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (!isValidKey) {\n\t\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\t\tmessage: \"Unauthorized: Invalid function call access key\",\n\t\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet user: User | null = null;\n\n\t\t\t\t\t\tconst existingNearAccount: NearAccount | null =\n\t\t\t\t\t\t\tawait ctx.context.adapter.findOne({\n\t\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"eq\", value: accountId },\n\t\t\t\t\t\t\t\t\t{ field: \"network\", operator: \"eq\", value: network },\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (existingNearAccount) {\n\t\t\t\t\t\t\tuser = await ctx.context.adapter.findOne({\n\t\t\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t\t\t\toperator: \"eq\",\n\t\t\t\t\t\t\t\t\t\tvalue: existingNearAccount.userId,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst anyNearAccount: NearAccount | null =\n\t\t\t\t\t\t\t\tawait ctx.context.adapter.findOne({\n\t\t\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t\t{ field: \"accountId\", operator: \"eq\", value: accountId },\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (anyNearAccount) {\n\t\t\t\t\t\t\t\tuser = await ctx.context.adapter.findOne({\n\t\t\t\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t\t\t\t\toperator: \"eq\",\n\t\t\t\t\t\t\t\t\t\t\tvalue: anyNearAccount.userId,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!user) {\n\t\t\t\t\t\t\tconst userEmail = deriveEmail(accountId, getRecipient(network));\n\n\t\t\t\t\t\t\tconst profile = await (options.getProfile || ((id: AccountId) => defaultGetProfile(id, apiKey)))(accountId);\n\n\t\t\t\t\t\t\tuser = await ctx.context.internalAdapter.createUser({\n\t\t\t\t\t\t\t\tname: profile?.name ?? accountId,\n\t\t\t\t\t\t\t\temail: userEmail,\n\t\t\t\t\t\t\t\timage: profile?.image ? getImageUrl(profile.image) : \"\",\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tawait ctx.context.adapter.create({\n\t\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t\t\t\t\taccountId,\n\t\t\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\t\t\tpublicKey: publicKey,\n\t\t\t\t\t\t\t\t\tisPrimary: true,\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(),\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\tawait ctx.context.internalAdapter.createAccount({\n\t\t\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t\t\t\tproviderId: \"siwn\",\n\t\t\t\t\t\t\t\taccountId: `${accountId}:${network}`,\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (!existingNearAccount) {\n\t\t\t\t\t\t\t\tawait ctx.context.adapter.create({\n\t\t\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t\t\t\t\t\taccountId,\n\t\t\t\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\t\t\t\tpublicKey: publicKey,\n\t\t\t\t\t\t\t\t\t\tisPrimary: false,\n\t\t\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tawait ctx.context.internalAdapter.createAccount({\n\t\t\t\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t\t\t\t\tproviderId: \"siwn\",\n\t\t\t\t\t\t\t\t\taccountId: `${accountId}:${network}`,\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait ensureRelayer(ctx.context.adapter, ctx.context.secret, network);\n\n\t\t\t\t\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\t\tuser.id\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!session) {\n\t\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\t\tmessage: \"Internal Server Error\",\n\t\t\t\t\t\t\t\tstatus: 500,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait setSessionCookie(ctx, { session, user });\n\n\t\t\t\t\t\treturn ctx.json(VerifyResponse.parse({\n\t\t\t\t\t\t\ttoken: session.token,\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t\tid: user.id,\n\t\t\t\t\t\t\t\taccountId,\n\t\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}));\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\tif (error instanceof APIError) throw error;\n\t\t\t\t\t\tconst msg = error instanceof Error ? error.message : \"Unknown error\";\n\t\t\t\t\t\tconst at = error instanceof Error && error.stack ? error.stack.split(\"\\n\").slice(1, 3).map(s => s.trim()).join(\" <- \") : \"\";\n\t\t\t\t\t\tconsole.error(`[siwn] Verify error: ${msg}${at ? ` (${at})` : \"\"}`);\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Something went wrong. Please try again later.\",\n\t\t\t\t\t\t\terror: msg,\n\t\t\t\t\t\t\tstatus: 401,\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\trelayNearTransaction: createAuthEndpoint(\n\t\t\t\t\"/near/relay\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: RelayRequest,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { payload } = ctx.body;\n\t\t\t\t\tconst session = ctx.context.session;\n\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Must be authenticated to relay transactions\",\n\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst nearAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t{ field: \"isPrimary\", operator: \"eq\", value: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!nearAccount) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"No NEAR account linked to session\",\n\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst network = nearAccount.network as \"mainnet\" | \"testnet\";\n\t\t\t\t\tconst rState = await ensureRelayer(ctx.context.adapter, ctx.context.secret, network);\n\n\t\t\t\t\tif (!rState) {\n\t\t\t\t\t\tthrow new APIError(\"SERVICE_UNAVAILABLE\", {\n\t\t\t\t\t\t\tmessage: \"Relayer not configured\",\n\t\t\t\t\t\t\tstatus: 503,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst decoded: SignedDelegateAction = decodeSignedDelegateAction(payload);\n\t\t\t\t\t\tconst delegateAction = decoded.signedDelegate.delegateAction;\n\n\t\t\t\t\t\tif (delegateAction.senderId !== nearAccount.accountId) {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Delegate action sender does not match session account\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst relayerConfigForNetwork = getRelayerConfig(network);\n\t\t\t\t\t\tif (relayerConfigForNetwork?.whitelistedContracts?.length) {\n\t\t\t\t\t\t\tif (!relayerConfigForNetwork.whitelistedContracts.includes(delegateAction.receiverId)) {\n\t\t\t\t\t\t\t\tthrow new APIError(\"FORBIDDEN\", {\n\t\t\t\t\t\t\t\t\tmessage: `Contract ${delegateAction.receiverId} is not whitelisted for relay`,\n\t\t\t\t\t\t\t\t\tstatus: 403,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (relayerConfigForNetwork?.maxGasPerTransaction) {\n\t\t\t\t\t\t\tconst totalGas = delegateAction.actions.reduce((sum: bigint, a) => {\n\t\t\t\t\t\t\t\treturn sum + (\"functionCall\" in a ? a.functionCall.gas : 0n);\n\t\t\t\t\t\t\t}, 0n);\n\t\t\t\t\t\t\tif (totalGas > BigInt(relayerConfigForNetwork.maxGasPerTransaction)) {\n\t\t\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\t\t\tmessage: `Transaction gas (${totalGas}) exceeds relayer limit (${relayerConfigForNetwork.maxGasPerTransaction})`,\n\t\t\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (relayerConfigForNetwork?.maxDepositPerTransaction) {\n\t\t\t\t\t\t\tconst totalDeposit = delegateAction.actions.reduce((sum: bigint, a) => {\n\t\t\t\t\t\t\t\tif (\"functionCall\" in a) return sum + a.functionCall.deposit;\n\t\t\t\t\t\t\t\tif (\"transfer\" in a) return sum + a.transfer.deposit;\n\t\t\t\t\t\t\t\treturn sum;\n\t\t\t\t\t\t\t}, 0n);\n\t\t\t\t\t\t\tif (totalDeposit > BigInt(relayerConfigForNetwork.maxDepositPerTransaction)) {\n\t\t\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\t\t\tmessage: `Transaction deposit (${totalDeposit}) exceeds relayer limit (${relayerConfigForNetwork.maxDepositPerTransaction})`,\n\t\t\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst result = await relayOnChain(payload, rState);\n\n\t\t\t\t\t\tawait ctx.context.adapter.create({\n\t\t\t\t\t\t\tmodel: \"relayedTransaction\",\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tuserId: session.user.id,\n\t\t\t\t\t\t\t\ttxHash: result.txHash,\n\t\t\t\t\t\t\t\tsenderId: delegateAction.senderId,\n\t\t\t\t\t\t\t\treceiverId: delegateAction.receiverId,\n\t\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\t\tstatus: \"pending\",\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\n\t\t\t\t\tif (rState.mode === \"ephemeral\") {\n\t\t\t\t\t\tawait ctx.context.adapter.update({\n\t\t\t\t\t\t\tmodel: \"relayerKey\",\n\t\t\t\t\t\t\twhere: [{ field: \"network\", operator: \"eq\", value: network }],\n\t\t\t\t\t\t\tupdate: { lastUsedAt: new Date() },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t\treturn ctx.json(RelayResponse.parse({\n\t\t\t\t\t\t\ttxHash: result.txHash,\n\t\t\t\t\t\t\tstatus: \"pending\",\n\t\t\t\t\t\t}));\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\tif (error instanceof APIError) throw error;\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: error instanceof Error ? error.message : \"Relay failed\",\n\t\t\t\t\t\t\tstatus: 500,\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\tgetRelayStatus: createAuthEndpoint(\n\t\t\t\t\"/near/relay-status/:txHash\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst txHash = (ctx.params as Record<string, string>)?.txHash;\n\t\t\t\t\tif (!txHash) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Transaction hash required\",\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst session = ctx.context.session;\n\n\t\t\t\t\tconst relayedTx = await ctx.context.adapter.findOne<RelayedTransactionRecord>({\n\t\t\t\t\t\tmodel: \"relayedTransaction\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"txHash\", operator: \"eq\", value: txHash },\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!relayedTx) {\n\t\t\t\t\t\tthrow new APIError(\"NOT_FOUND\", {\n\t\t\t\t\t\t\tmessage: \"Transaction not found or not owned by this user\",\n\t\t\t\t\t\t\tstatus: 404,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst network = relayedTx.network;\n\t\t\t\t\tconst senderId = relayedTx.senderId;\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst near = getNear(network);\n\t\t\t\t\t\tconst txResult = await near.getTransactionStatus(txHash, senderId);\n\n\t\t\t\t\t\tconst txStatus = txResult.status;\n\t\t\t\t\t\tif (txStatus && typeof txStatus === \"object\") {\n\t\t\t\t\t\t\tconst hasSuccess = \"SuccessValue\" in txStatus || \"SuccessReceiptId\" in txStatus;\n\t\t\t\t\t\t\tconst hasFailure = \"Failure\" in txStatus;\n\t\t\t\t\t\t\tconst status = hasSuccess ? \"completed\" : hasFailure ? \"failed\" : \"pending\";\n\n\t\t\t\t\t\t\tif (status !== \"pending\") {\n\t\t\t\t\t\t\t\tawait ctx.context.adapter.update({\n\t\t\t\t\t\t\t\t\tmodel: \"relayedTransaction\",\n\t\t\t\t\t\t\t\t\twhere: [{ field: \"txHash\", operator: \"eq\", value: txHash }],\n\t\t\t\t\t\t\t\t\tupdate: { status },\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\tconst gasUsed = txResult.transaction_outcome?.outcome?.gas_burnt?.toString();\n\n\t\t\t\t\t\t\treturn ctx.json(RelayStatusResponse.parse({\n\t\t\t\t\t\t\t\tstatus,\n\t\t\t\t\t\t\t\tgasUsed,\n\t\t\t\t\t\t\t\toutcome: txResult,\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn ctx.json(RelayStatusResponse.parse({ status: \"pending\" }));\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\treturn ctx.json(RelayStatusResponse.parse({ status: \"pending\" }));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t\tgetRelayerInfo: createAuthEndpoint(\n\t\t\t\t\"/near/relayer-info\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: GetRelayerInfoRequest,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { network: requestedNetwork } = ctx.body;\n\t\t\t\t\tconst targetNetwork = (requestedNetwork ?? primaryNetwork) as \"mainnet\" | \"testnet\";\n\t\t\t\t\tconst rState = await ensureRelayer(ctx.context.adapter, ctx.context.secret, targetNetwork);\n\n\t\t\t\t\tif (!rState) {\n\t\t\t\t\t\treturn ctx.json({ enabled: false, subAccountAvailable: false } satisfies Partial<RelayerInfo> & { enabled: boolean });\n\t\t\t\t\t}\n\n\t\t\t\t\tconst subAccountCfg = getSubAccountConfig(targetNetwork);\n\t\t\t\t\tconst { parentAccount, subAccountAvailable } = resolveParentAccount(subAccountCfg, rState);\n\n\t\t\t\t\tconst near = getNear(rState.network);\n\t\t\t\t\tlet account;\n\t\t\t\t\ttry {\n\t\t\t\t\t\taccount = await near.getAccount(rState.accountId);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\taccount = {\n\t\t\t\t\t\t\tbalance: \"0\",\n\t\t\t\t\t\t\tavailable: \"0\",\n\t\t\t\t\t\t\tstaked: \"0\",\n\t\t\t\t\t\t\tstorageUsage: \"0\",\n\t\t\t\t\t\t\tstorageBytes: 0,\n\t\t\t\t\t\t\thasContract: false,\n\t\t\t\t\t\t\tcodeHash: \"\",\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\taccountId: rState.accountId,\n\t\t\t\t\t\tmode: rState.mode,\n\t\t\t\t\t\tnetwork: rState.network,\n\t\t\t\t\t\tpublicKey: rState.publicKey,\n\t\t\t\t\t\tbalance: account.balance,\n\t\t\t\t\t\tavailable: account.available,\n\t\t\t\t\t\tstaked: account.staked,\n\t\t\t\t\t\tstorageUsage: account.storageUsage,\n\t\t\t\t\t\tstorageBytes: account.storageBytes,\n\t\t\t\t\t\thasContract: account.hasContract,\n\t\t\t\t\t\thasKey: true,\n\t\t\t\t\t\tcreatedAt: rState.createdAt,\n\t\t\t\t\t\tlastUsedAt: rState.lastUsedAt,\n\t\t\t\t\t\tparentAccount: parentAccount ?? undefined,\n\t\t\t\t\t\tsubAccountAvailable,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tgetRelayHistory: createAuthEndpoint(\n\t\t\t\t\"/near/relay-history\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst session = ctx.context.session;\n\n\t\t\t\t\tlet transactions: RelayedTransactionRecord[] = [];\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await ctx.context.adapter.findMany<RelayedTransactionRecord>({\n\t\t\t\t\t\t\tmodel: \"relayedTransaction\",\n\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t});\n\t\t\t\t\t\ttransactions = result || [];\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconsole.error(\"relay-history findMany error:\", err);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst sorted = transactions.sort((a, b) => {\n\t\t\t\t\t\tconst aTime = a.createdAt instanceof Date ? a.createdAt.getTime() : new Date(a.createdAt ?? 0).getTime();\n\t\t\t\t\t\tconst bTime = b.createdAt instanceof Date ? b.createdAt.getTime() : new Date(b.createdAt ?? 0).getTime();\n\t\t\t\t\t\treturn bTime - aTime;\n\t\t\t\t\t});\n\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\ttransactions: sorted.map((tx) => ({\n\t\t\t\t\t\t\tid: String(tx.id ?? \"\"),\n\t\t\t\t\t\t\tuserId: String(tx.userId ?? \"\"),\n\t\t\t\t\t\t\ttxHash: String(tx.txHash ?? \"\"),\n\t\t\t\t\t\t\tsenderId: String(tx.senderId ?? \"\"),\n\t\t\t\t\t\t\treceiverId: String(tx.receiverId ?? \"\"),\n\t\t\t\t\t\t\tnetwork: String(tx.network ?? \"mainnet\"),\n\t\t\t\t\t\t\tstatus: String(tx.status ?? \"pending\"),\n\t\t\t\t\t\t\tgasUsed: tx.gasUsed ? String(tx.gasUsed) : undefined,\n\t\t\t\t\t\t\tcreatedAt: tx.createdAt instanceof Date ? tx.createdAt.toISOString() : tx.createdAt ? String(tx.createdAt) : new Date().toISOString(),\n\t\t\t\t\t\t\tupdatedAt: tx.updatedAt instanceof Date ? tx.updatedAt.toISOString() : tx.updatedAt ? String(tx.updatedAt) : undefined,\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\tviewContract: createAuthEndpoint(\n\t\t\t\t\"/near/view\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: ViewContractRequest,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { contractId, methodName, args } = ctx.body;\n\t\t\t\t\tconst session = ctx.context.session;\n\t\t\t\t\tconst nearAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t{ field: \"isPrimary\", operator: \"eq\", value: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tconst network = (nearAccount?.network || primaryNetwork) as \"mainnet\" | \"testnet\";\n\t\t\t\t\tconst near = getNear(network);\n\t\t\t\t\tlet result: unknown;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tresult = await near.view(contractId, methodName, args ?? {});\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\tif (error instanceof APIError) throw error;\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: error instanceof Error ? error.message : \"Unknown error\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn ctx.json(ViewContractResponse.parse({ result }));\n\t\t\t\t},\n\t\t\t),\n\t\t\tcreateSubAccount: createAuthEndpoint(\n\t\t\t\t\"/near/create-sub-account\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: CreateSubAccountRequest,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { subAccountName, network: providedNetwork, publicKey } = ctx.body;\n\t\t\t\t\tconst session = ctx.context.session;\n\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Must be authenticated to create a sub-account\",\n\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst nearAccount: NearAccount | null = await ctx.context.adapter.findOne({\n\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{ field: \"userId\", operator: \"eq\", value: session.user.id },\n\t\t\t\t\t\t\t{ field: \"isPrimary\", operator: \"eq\", value: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tconst network = (providedNetwork || nearAccount?.network || primaryNetwork) as \"mainnet\" | \"testnet\";\n\t\t\t\t\tconst subAccountCfg = getSubAccountConfig(network);\n\t\t\t\t\tconst rState = await ensureRelayer(ctx.context.adapter, ctx.context.secret, network);\n\n\t\t\t\t\tif (!rState) {\n\t\t\t\t\t\tthrow new APIError(\"SERVICE_UNAVAILABLE\", {\n\t\t\t\t\t\t\tmessage: \"Relayer not configured — sub-account creation requires a funded relayer\",\n\t\t\t\t\t\t\tstatus: 503,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { parentAccount, subAccountAvailable } = resolveParentAccount(subAccountCfg, rState);\n\n\t\t\t\t\tif (!subAccountAvailable || !parentAccount) {\n\t\t\t\t\t\tthrow new APIError(\"SERVICE_UNAVAILABLE\", {\n\t\t\t\t\t\t\tmessage: \"Sub-account creation requires a named parent account. Configure subAccount.parentAccount in your SIWN plugin options, or use an explicit relayer with a named account.\",\n\t\t\t\t\t\t\tstatus: 503,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (parentAccount !== rState.accountId && !subAccountCfg?.parentKey) {\n\t\t\t\t\t\tthrow new APIError(\"SERVICE_UNAVAILABLE\", {\n\t\t\t\t\t\t\tmessage: \"Sub-account parent differs from relayer account. Configure subAccount.parentKey to enable signing as the parent account.\",\n\t\t\t\t\t\t\tstatus: 503,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst newAccountId = `${subAccountName}.${parentAccount}`;\n\t\t\t\t\tconst minDeposit = subAccountCfg?.minDeposit || \"0.1 NEAR\";\n\n\t\t\t\t\tconst near = getNear(network);\n\t\t\t\t\tconst exists = await near.accountExists(newAccountId);\n\t\t\t\t\tif (exists) {\n\t\t\t\t\t\tthrow new APIError(\"CONFLICT\", {\n\t\t\t\t\t\t\tmessage: `Account ${newAccountId} already exists on ${network}`,\n\t\t\t\t\t\t\tstatus: 409,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlet txBuilder = rState.near\n\t\t\t\t\t\t.transaction(parentAccount)\n\t\t\t\t\t\t.createAccount(newAccountId)\n\t\t\t\t\t\t.addKey(publicKey, { type: \"fullAccess\" });\n\n\t\t\t\t\tif (subAccountCfg?.parentKey) {\n\t\t\t\t\t\ttxBuilder = txBuilder.signWith(subAccountCfg.parentKey as PrivateKey);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (subAccountCfg?.addRelayerFCAK !== false && subAccountCfg?.relayerFCAK) {\n\t\t\t\t\t\tconst fcakPermission: { type: \"functionCall\"; receiverId: string; methodNames?: string[]; allowance?: string } = {\n\t\t\t\t\t\t\ttype: \"functionCall\",\n\t\t\t\t\t\t\treceiverId: subAccountCfg.relayerFCAK.receiverId,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (subAccountCfg.relayerFCAK.methodNames) {\n\t\t\t\t\t\t\tfcakPermission.methodNames = subAccountCfg.relayerFCAK.methodNames;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (subAccountCfg.relayerFCAK.allowance) {\n\t\t\t\t\t\t\tfcakPermission.allowance = subAccountCfg.relayerFCAK.allowance as `${number} NEAR` | `${bigint} yocto`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttxBuilder.addKey(rState.publicKey, fcakPermission as any);\n\t\t\t\t\t}\n\n\t\t\t\t\ttxBuilder.transfer(newAccountId, minDeposit as `${number} NEAR`);\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait txBuilder.send({ waitUntil: \"EXECUTED\" });\n\n\t\t\t\t\t\tawait ctx.context.adapter.create({\n\t\t\t\t\t\t\tmodel: \"nearAccount\",\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tuserId: session.user.id,\n\t\t\t\t\t\t\t\taccountId: newAccountId,\n\t\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\t\tpublicKey,\n\t\t\t\t\t\t\t\tisPrimary: false,\n\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait ctx.context.internalAdapter.createAccount({\n\t\t\t\t\t\t\tuserId: session.user.id,\n\t\t\t\t\t\t\tproviderId: \"siwn\",\n\t\t\t\t\t\t\taccountId: `${newAccountId}:${network}`,\n\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn ctx.json(CreateSubAccountResponse.parse({\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t\taccountId: newAccountId,\n\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\tpublicKey,\n\t\t\t\t\t\t\tmessage: `Sub-account ${newAccountId} created on ${network}`,\n\t\t\t\t\t\t}));\n\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\tconst msg = error instanceof Error ? error.message : \"Unknown error\";\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: `Failed to create sub-account: ${msg}`,\n\t\t\t\t\t\t\tstatus: 500,\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\tcheckSubAccountAvailability: createAuthEndpoint(\n\t\t\t\t\"/near/check-sub-account-availability\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: CheckSubAccountAvailabilityRequest,\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { subAccountName, network: providedNetwork } = ctx.body;\n\n\t\t\t\t\tconst network = (providedNetwork || primaryNetwork) as \"mainnet\" | \"testnet\";\n\t\t\t\t\tconst subAccountCfg = getSubAccountConfig(network);\n\t\t\t\t\tconst rState = await ensureRelayer(ctx.context.adapter, ctx.context.secret, network);\n\n\t\t\t\t\tconst { parentAccount, subAccountAvailable } = resolveParentAccount(subAccountCfg, rState);\n\n\t\t\t\t\tif (!subAccountAvailable || !parentAccount) {\n\t\t\t\t\t\tthrow new APIError(\"SERVICE_UNAVAILABLE\", {\n\t\t\t\t\t\t\tmessage: \"Sub-account creation requires a named parent account. Configure subAccount.parentAccount in your SIWN plugin options, or use an explicit relayer with a named account.\",\n\t\t\t\t\t\t\tstatus: 503,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst accountId = `${subAccountName}.${parentAccount}`;\n\n\t\t\t\t\tconst near = getNear(network);\n\t\t\t\t\tconst exists = await near.accountExists(accountId);\n\n\t\t\t\t\treturn ctx.json(CheckSubAccountAvailabilityResponse.parse({\n\t\t\t\t\t\tavailable: !exists,\n\t\t\t\t\t\taccountId,\n\t\t\t\t\t}));\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t});\n};\n"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -57,6 +57,7 @@ export declare const LinkAccountRequest: z.ZodObject<{
|
|
|
57
57
|
recipient: z.ZodString;
|
|
58
58
|
nonce: z.ZodString;
|
|
59
59
|
accountId: z.ZodString;
|
|
60
|
+
callbackUrl: z.ZodOptional<z.ZodString>;
|
|
60
61
|
}, z.core.$strip>;
|
|
61
62
|
export declare const SetPrimaryAccountRequest: z.ZodObject<{
|
|
62
63
|
accountId: z.ZodString;
|
|
@@ -80,6 +81,7 @@ export declare const VerifyRequest: z.ZodObject<{
|
|
|
80
81
|
recipient: z.ZodString;
|
|
81
82
|
nonce: z.ZodString;
|
|
82
83
|
accountId: z.ZodString;
|
|
84
|
+
callbackUrl: z.ZodOptional<z.ZodString>;
|
|
83
85
|
}, z.core.$strip>;
|
|
84
86
|
export declare const RelayRequest: z.ZodObject<{
|
|
85
87
|
payload: z.ZodString;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,aAAa,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACxC,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,0BAA2B,SAAQ,qBAAqB;IACxE,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,iBAAiB;;;iBAG5B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;iBAMxB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AASpD,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/skills/client/SKILL.md
CHANGED
|
@@ -5,10 +5,11 @@ description: >
|
|
|
5
5
|
connection via NearConnect, use authClient.near actions for sign-in, profile
|
|
6
6
|
lookup, account management, delegate action building with TransactionBuilder,
|
|
7
7
|
and relay submission. Load when implementing NEAR wallet sign-in on the client,
|
|
8
|
-
using authClient.near.* methods,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
using authClient.near.* methods, or building delegate actions for gasless relay.
|
|
9
|
+
metadata:
|
|
10
|
+
type: core
|
|
11
|
+
library: better-near-auth
|
|
12
|
+
library_version: "1.6.5"
|
|
12
13
|
sources:
|
|
13
14
|
- "elliotBraem/better-near-auth:src/client.ts"
|
|
14
15
|
- "elliotBraem/better-near-auth:src/types.ts"
|
package/skills/relay/SKILL.md
CHANGED
|
@@ -6,9 +6,10 @@ description: >
|
|
|
6
6
|
gas/deposit limits, check relay status and history, and use the contract view
|
|
7
7
|
endpoint. Load when setting up relayer config, debugging relay failures, or
|
|
8
8
|
configuring RotatingKeyStore for high-throughput relay.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
metadata:
|
|
10
|
+
type: core
|
|
11
|
+
library: better-near-auth
|
|
12
|
+
library_version: "1.6.5"
|
|
12
13
|
sources:
|
|
13
14
|
- "elliotBraem/better-near-auth:src/index.ts"
|
|
14
15
|
- "elliotBraem/better-near-auth:src/utils.ts"
|
package/skills/siwn/SKILL.md
CHANGED
|
@@ -6,9 +6,10 @@ description: >
|
|
|
6
6
|
account linking and unlinking, and NEAR profile lookup. Load when adding
|
|
7
7
|
NEAR wallet sign-in to a Better Auth server, configuring siwn() plugin options,
|
|
8
8
|
or debugging NEP-413 verify or nonce issues.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
metadata:
|
|
10
|
+
type: core
|
|
11
|
+
library: better-near-auth
|
|
12
|
+
library_version: "1.6.5"
|
|
12
13
|
sources:
|
|
13
14
|
- "elliotBraem/better-near-auth:src/index.ts"
|
|
14
15
|
- "elliotBraem/better-near-auth:src/profile.ts"
|
package/skills/tanstack/SKILL.md
CHANGED
|
@@ -7,12 +7,13 @@ description: >
|
|
|
7
7
|
Load when scaffolding a new TanStack Router app with better-near-auth,
|
|
8
8
|
wiring auth into router context, or debugging wallet state loss after
|
|
9
9
|
sign-in in SSR/CSR TanStack apps.
|
|
10
|
-
type: framework
|
|
11
10
|
requires:
|
|
12
11
|
- client
|
|
13
12
|
- siwn
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
metadata:
|
|
14
|
+
type: framework
|
|
15
|
+
library: better-near-auth
|
|
16
|
+
library_version: "1.6.5"
|
|
16
17
|
sources:
|
|
17
18
|
- "elliotBraem/better-near-auth:src/client.ts"
|
|
18
19
|
- "elliotBraem/better-near-auth:examples/auth.everything.dev/ui/src/lib/auth.ts"
|