better-near-auth 1.6.5 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +20 -3
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +152 -35
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +37 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/skills/auth-plugin/SKILL.md +190 -0
- package/skills/client/SKILL.md +60 -1
- package/skills/relay/SKILL.md +1 -1
- package/skills/siwn/SKILL.md +139 -1
- package/skills/subaccount/SKILL.md +410 -0
- package/skills/tanstack/SKILL.md +1 -1
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACpF,OAAO,KAAK,EAAE,IAAI,IAAI,QAAQ,EAAiB,MAAM,UAAU,CAAC;AAGhE,OAAO,KAAK,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,WAAW,EAAqB,mBAAmB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5J,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAoB,KAAK,qBAAqB,EAAE,KAAK,yBAAyB,EAAE,KAAK,0BAA0B,EAAE,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,KAAK,WAAW,EAAE,KAAK,qBAAqB,EAAE,KAAK,sBAAsB,EAAE,KAAK,wBAAwB,EAAE,KAAK,yBAAyB,EAAE,KAAK,mCAAmC,EAAE,KAAK,oCAAoC,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -118,8 +118,10 @@ const RelayedTransactionSchema = z.object({
|
|
|
118
118
|
});
|
|
119
119
|
z.object({ transactions: z.array(RelayedTransactionSchema) });
|
|
120
120
|
z.object({ network: z.enum(["mainnet", "testnet"]).optional() });
|
|
121
|
+
const SUB_ACCOUNT_LABEL_REGEX = /^([a-z\d]+[-_])*[a-z\d]+$/;
|
|
122
|
+
const SubAccountNameSchema = z.string().min(2, "Sub-account name must be at least 2 characters").max(64, "Sub-account name must be at most 64 characters").regex(SUB_ACCOUNT_LABEL_REGEX, "Sub-account name must contain only lowercase alphanumeric characters, hyphens, and underscores (no leading/trailing hyphens or underscores)");
|
|
121
123
|
z.object({
|
|
122
|
-
subAccountName:
|
|
124
|
+
subAccountName: SubAccountNameSchema,
|
|
123
125
|
network: z.enum(["mainnet", "testnet"]).optional(),
|
|
124
126
|
publicKey: z.string()
|
|
125
127
|
});
|
|
@@ -131,12 +133,19 @@ z.object({
|
|
|
131
133
|
message: z.string()
|
|
132
134
|
});
|
|
133
135
|
z.object({
|
|
134
|
-
subAccountName:
|
|
136
|
+
subAccountName: SubAccountNameSchema,
|
|
135
137
|
network: z.enum(["mainnet", "testnet"]).optional()
|
|
136
138
|
});
|
|
137
139
|
z.object({
|
|
138
140
|
available: z.boolean(),
|
|
139
|
-
accountId: z.string()
|
|
141
|
+
accountId: z.string(),
|
|
142
|
+
parentAccount: z.string().optional(),
|
|
143
|
+
reason: z.enum([
|
|
144
|
+
"taken",
|
|
145
|
+
"invalid",
|
|
146
|
+
"too-long",
|
|
147
|
+
"not-configured"
|
|
148
|
+
]).optional()
|
|
140
149
|
});
|
|
141
150
|
//#endregion
|
|
142
151
|
//#region src/client.ts
|
|
@@ -501,6 +510,14 @@ const siwnClient = (config) => {
|
|
|
501
510
|
});
|
|
502
511
|
},
|
|
503
512
|
checkSubAccountAvailability: async (params) => {
|
|
513
|
+
if (!SUB_ACCOUNT_LABEL_REGEX.test(params.subAccountName) || params.subAccountName.length < 2) return {
|
|
514
|
+
data: {
|
|
515
|
+
available: false,
|
|
516
|
+
accountId: "",
|
|
517
|
+
reason: "invalid"
|
|
518
|
+
},
|
|
519
|
+
error: null
|
|
520
|
+
};
|
|
504
521
|
return await $fetch("/near/check-sub-account-availability", {
|
|
505
522
|
method: "POST",
|
|
506
523
|
body: params
|
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\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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"}
|
|
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, Near, TransactionBuilder } 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 SubAccountTxCtx {\n\tnewAccountId: string;\n\tparentAccount: string;\n\tuserPublicKey: string;\n\tuserAccountId: string;\n\tuserId: string;\n\tnetwork: \"mainnet\" | \"testnet\";\n}\n\nexport interface SubAccountLifecycleCtx extends SubAccountTxCtx {\n\tnear: Near;\n}\n\nexport interface SubAccountConfig {\n\tparentAccount?: string;\n\tminDeposit?: string;\n\tparentHasFullAccess?: boolean;\n\tdeploy?:\n\t\t| { wasm: Uint8Array }\n\t\t| { fromPublished: { accountId?: string; codeHash?: string } };\n\tinit?: {\n\t\tmethodName: string;\n\t\targs: object | ((ctx: SubAccountTxCtx) => object);\n\t};\n\textendTx?: (tx: TransactionBuilder, ctx: SubAccountTxCtx) => TransactionBuilder;\n\tonCreated?: (ctx: SubAccountLifecycleCtx) => Promise<void>;\n\tonRollback?: (ctx: SubAccountLifecycleCtx) => Promise<void>;\n\taddRelayerFCAK?: boolean;\n\trelayerFCAK?: SubAccountRelayerFCAKConfig;\n}\n\nexport const SUB_ACCOUNT_LABEL_REGEX = /^([a-z\\d]+[-_])*[a-z\\d]+$/;\n\nexport const SubAccountNameSchema = z\n\t.string()\n\t.min(2, \"Sub-account name must be at least 2 characters\")\n\t.max(64, \"Sub-account name must be at most 64 characters\")\n\t.regex(SUB_ACCOUNT_LABEL_REGEX, \"Sub-account name must contain only lowercase alphanumeric characters, hyphens, and underscores (no leading/trailing hyphens or underscores)\");\n\nexport const CreateSubAccountRequest = z.object({\n\tsubAccountName: SubAccountNameSchema,\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: SubAccountNameSchema,\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\tparentAccount: z.string().optional(),\n\treason: z.enum([\"taken\", \"invalid\", \"too-long\", \"not-configured\"]).optional(),\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, SUB_ACCOUNT_LABEL_REGEX } 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\tcheckSubAccountAvailability: async (params: CheckSubAccountAvailabilityRequestT) => {\n\t\t\t\t\tif (!SUB_ACCOUNT_LABEL_REGEX.test(params.subAccountName) || params.subAccountName.length < 2) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tdata: { available: false, accountId: \"\", reason: \"invalid\" as const },\n\t\t\t\t\t\t\terror: null,\n\t\t\t\t\t\t} as BetterFetchResponse<CheckSubAccountAvailabilityResponseT>;\n\t\t\t\t\t}\n\t\t\t\t\treturn await $fetch(\"/near/check-sub-account-availability\", {\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\tbody: params,\n\t\t\t\t\t});\n\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
|
@@ -24,6 +24,9 @@ export interface SIWNPluginOptions {
|
|
|
24
24
|
apiKey?: string;
|
|
25
25
|
rpcUrl?: string | DualNetworkConfig<string>;
|
|
26
26
|
relayer?: RelayerConfig | DualNetworkConfig<RelayerConfig>;
|
|
27
|
+
secrets?: {
|
|
28
|
+
parentKey?: string | DualNetworkConfig<string>;
|
|
29
|
+
};
|
|
27
30
|
subAccount?: SubAccountConfig | DualNetworkConfig<SubAccountConfig>;
|
|
28
31
|
}
|
|
29
32
|
export declare const siwn: (options: SIWNPluginOptions) => {
|
|
@@ -734,9 +737,34 @@ export declare const siwn: (options: SIWNPluginOptions) => {
|
|
|
734
737
|
testnet: "testnet";
|
|
735
738
|
}>>;
|
|
736
739
|
}, z.z.core.$strip>;
|
|
740
|
+
use: ((inputContext: import("better-call").MiddlewareInputContext<import("better-call").MiddlewareOptions>) => Promise<{
|
|
741
|
+
session: {
|
|
742
|
+
session: Record<string, any> & {
|
|
743
|
+
id: string;
|
|
744
|
+
createdAt: Date;
|
|
745
|
+
updatedAt: Date;
|
|
746
|
+
userId: string;
|
|
747
|
+
expiresAt: Date;
|
|
748
|
+
token: string;
|
|
749
|
+
ipAddress?: string | null | undefined;
|
|
750
|
+
userAgent?: string | null | undefined;
|
|
751
|
+
};
|
|
752
|
+
user: Record<string, any> & {
|
|
753
|
+
id: string;
|
|
754
|
+
createdAt: Date;
|
|
755
|
+
updatedAt: Date;
|
|
756
|
+
email: string;
|
|
757
|
+
emailVerified: boolean;
|
|
758
|
+
name: string;
|
|
759
|
+
image?: string | null | undefined;
|
|
760
|
+
};
|
|
761
|
+
};
|
|
762
|
+
}>)[];
|
|
737
763
|
}, {
|
|
738
764
|
available: boolean;
|
|
739
765
|
accountId: string;
|
|
766
|
+
parentAccount?: string | undefined;
|
|
767
|
+
reason?: "taken" | "invalid" | "too-long" | "not-configured" | undefined;
|
|
740
768
|
}>;
|
|
741
769
|
};
|
|
742
770
|
};
|
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,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -248,8 +248,10 @@ const RelayedTransactionSchema = z.object({
|
|
|
248
248
|
});
|
|
249
249
|
const RelayHistoryResponse = z.object({ transactions: z.array(RelayedTransactionSchema) });
|
|
250
250
|
const GetRelayerInfoRequest = z.object({ network: z.enum(["mainnet", "testnet"]).optional() });
|
|
251
|
+
const SUB_ACCOUNT_LABEL_REGEX = /^([a-z\d]+[-_])*[a-z\d]+$/;
|
|
252
|
+
const SubAccountNameSchema = z.string().min(2, "Sub-account name must be at least 2 characters").max(64, "Sub-account name must be at most 64 characters").regex(SUB_ACCOUNT_LABEL_REGEX, "Sub-account name must contain only lowercase alphanumeric characters, hyphens, and underscores (no leading/trailing hyphens or underscores)");
|
|
251
253
|
const CreateSubAccountRequest = z.object({
|
|
252
|
-
subAccountName:
|
|
254
|
+
subAccountName: SubAccountNameSchema,
|
|
253
255
|
network: z.enum(["mainnet", "testnet"]).optional(),
|
|
254
256
|
publicKey: z.string()
|
|
255
257
|
});
|
|
@@ -261,12 +263,19 @@ const CreateSubAccountResponse = z.object({
|
|
|
261
263
|
message: z.string()
|
|
262
264
|
});
|
|
263
265
|
const CheckSubAccountAvailabilityRequest = z.object({
|
|
264
|
-
subAccountName:
|
|
266
|
+
subAccountName: SubAccountNameSchema,
|
|
265
267
|
network: z.enum(["mainnet", "testnet"]).optional()
|
|
266
268
|
});
|
|
267
269
|
const CheckSubAccountAvailabilityResponse = z.object({
|
|
268
270
|
available: z.boolean(),
|
|
269
|
-
accountId: z.string()
|
|
271
|
+
accountId: z.string(),
|
|
272
|
+
parentAccount: z.string().optional(),
|
|
273
|
+
reason: z.enum([
|
|
274
|
+
"taken",
|
|
275
|
+
"invalid",
|
|
276
|
+
"too-long",
|
|
277
|
+
"not-configured"
|
|
278
|
+
]).optional()
|
|
270
279
|
});
|
|
271
280
|
//#endregion
|
|
272
281
|
//#region src/utils.ts
|
|
@@ -456,13 +465,13 @@ async function defaultValidateLimitedAccessKey(accountId, publicKey, recipient,
|
|
|
456
465
|
function isImplicitAccount(accountId) {
|
|
457
466
|
return /^[0-9a-f]{64}$/.test(accountId);
|
|
458
467
|
}
|
|
459
|
-
function resolveParentAccount(subAccountCfg, rState) {
|
|
460
|
-
|
|
468
|
+
function resolveParentAccount(subAccountCfg, parentKey, rState) {
|
|
469
|
+
const parent = subAccountCfg?.parentAccount ?? rState?.accountId;
|
|
470
|
+
if (!parent || isImplicitAccount(parent)) return {
|
|
461
471
|
parentAccount: null,
|
|
462
472
|
subAccountAvailable: false
|
|
463
473
|
};
|
|
464
|
-
|
|
465
|
-
if (!parent || isImplicitAccount(parent)) return {
|
|
474
|
+
if (!rState && !parentKey) return {
|
|
466
475
|
parentAccount: null,
|
|
467
476
|
subAccountAvailable: false
|
|
468
477
|
};
|
|
@@ -498,6 +507,18 @@ const siwn = (options) => {
|
|
|
498
507
|
if ("mainnet" in options.subAccount && typeof options.subAccount.mainnet === "object") return options.subAccount[network];
|
|
499
508
|
return options.subAccount;
|
|
500
509
|
};
|
|
510
|
+
const getParentKey = (network) => {
|
|
511
|
+
if (!options.secrets?.parentKey) return void 0;
|
|
512
|
+
if (typeof options.secrets.parentKey === "object") return options.secrets.parentKey[network];
|
|
513
|
+
return options.secrets.parentKey;
|
|
514
|
+
};
|
|
515
|
+
const getRawParentKey = (network) => {
|
|
516
|
+
const fromSecrets = getParentKey(network);
|
|
517
|
+
if (fromSecrets) return fromSecrets;
|
|
518
|
+
const relayerCfg = getRelayerConfig(network);
|
|
519
|
+
const parent = getSubAccountConfig(network)?.parentAccount ?? relayerCfg?.accountId;
|
|
520
|
+
if (parent && parent === relayerCfg?.accountId) return relayerCfg.privateKey ?? relayerCfg.privateKeys?.[0];
|
|
521
|
+
};
|
|
501
522
|
const primaryNetwork = getSupportedNetworks()[0];
|
|
502
523
|
const relayerStates = /* @__PURE__ */ new Map();
|
|
503
524
|
const relayerInitPromises = /* @__PURE__ */ new Map();
|
|
@@ -1256,7 +1277,7 @@ const siwn = (options) => {
|
|
|
1256
1277
|
enabled: false,
|
|
1257
1278
|
subAccountAvailable: false
|
|
1258
1279
|
});
|
|
1259
|
-
const { parentAccount, subAccountAvailable } = resolveParentAccount(getSubAccountConfig(targetNetwork), rState);
|
|
1280
|
+
const { parentAccount, subAccountAvailable } = resolveParentAccount(getSubAccountConfig(targetNetwork), getParentKey(targetNetwork), rState);
|
|
1260
1281
|
const near = getNear(rState.network);
|
|
1261
1282
|
let account;
|
|
1262
1283
|
try {
|
|
@@ -1379,29 +1400,41 @@ const siwn = (options) => {
|
|
|
1379
1400
|
});
|
|
1380
1401
|
const network = providedNetwork || nearAccount?.network || primaryNetwork;
|
|
1381
1402
|
const subAccountCfg = getSubAccountConfig(network);
|
|
1403
|
+
const userAccountId = nearAccount?.accountId ?? "";
|
|
1404
|
+
const parentKey = getParentKey(network);
|
|
1382
1405
|
const rState = await ensureRelayer(ctx.context.adapter, ctx.context.secret, network);
|
|
1383
|
-
|
|
1384
|
-
message: "Relayer not configured — sub-account creation requires a funded relayer",
|
|
1385
|
-
status: 503
|
|
1386
|
-
});
|
|
1387
|
-
const { parentAccount, subAccountAvailable } = resolveParentAccount(subAccountCfg, rState);
|
|
1406
|
+
const { parentAccount, subAccountAvailable } = resolveParentAccount(subAccountCfg, parentKey, rState);
|
|
1388
1407
|
if (!subAccountAvailable || !parentAccount) throw new APIError("SERVICE_UNAVAILABLE", {
|
|
1389
1408
|
message: "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.",
|
|
1390
1409
|
status: 503
|
|
1391
1410
|
});
|
|
1392
|
-
|
|
1393
|
-
|
|
1411
|
+
const effectiveParentKey = getRawParentKey(network);
|
|
1412
|
+
if (parentAccount !== rState?.accountId && !effectiveParentKey) throw new APIError("SERVICE_UNAVAILABLE", {
|
|
1413
|
+
message: "Sub-account parent differs from relayer account. Provide secrets.parentKey to sign as the parent account.",
|
|
1394
1414
|
status: 503
|
|
1395
1415
|
});
|
|
1396
1416
|
const newAccountId = `${subAccountName}.${parentAccount}`;
|
|
1397
1417
|
const minDeposit = subAccountCfg?.minDeposit || "0.1 NEAR";
|
|
1398
|
-
|
|
1418
|
+
const near = getNear(network);
|
|
1419
|
+
if (await near.accountExists(newAccountId)) throw new APIError("CONFLICT", {
|
|
1399
1420
|
message: `Account ${newAccountId} already exists on ${network}`,
|
|
1400
1421
|
status: 409
|
|
1401
1422
|
});
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1423
|
+
const txCtx = {
|
|
1424
|
+
newAccountId,
|
|
1425
|
+
parentAccount,
|
|
1426
|
+
userPublicKey: publicKey,
|
|
1427
|
+
userAccountId,
|
|
1428
|
+
userId: session.user.id,
|
|
1429
|
+
network
|
|
1430
|
+
};
|
|
1431
|
+
const signingNear = rState?.near ?? near;
|
|
1432
|
+
let txBuilder = signingNear.transaction(parentAccount).createAccount(newAccountId).addKey(publicKey, { type: "fullAccess" });
|
|
1433
|
+
if (subAccountCfg?.parentHasFullAccess) {
|
|
1434
|
+
const parentPublicKey = parentAccount === rState?.accountId ? rState.publicKey : parseKey(effectiveParentKey).publicKey.toString();
|
|
1435
|
+
txBuilder = txBuilder.addKey(parentPublicKey, { type: "fullAccess" });
|
|
1436
|
+
}
|
|
1437
|
+
if (subAccountCfg?.addRelayerFCAK !== false && subAccountCfg?.relayerFCAK && rState) {
|
|
1405
1438
|
const fcakPermission = {
|
|
1406
1439
|
type: "functionCall",
|
|
1407
1440
|
receiverId: subAccountCfg.relayerFCAK.receiverId
|
|
@@ -1411,8 +1444,52 @@ const siwn = (options) => {
|
|
|
1411
1444
|
txBuilder.addKey(rState.publicKey, fcakPermission);
|
|
1412
1445
|
}
|
|
1413
1446
|
txBuilder.transfer(newAccountId, minDeposit);
|
|
1447
|
+
if (subAccountCfg?.deploy) {
|
|
1448
|
+
if ("wasm" in subAccountCfg.deploy) txBuilder = txBuilder.deployContract(newAccountId, subAccountCfg.deploy.wasm);
|
|
1449
|
+
else if ("fromPublished" in subAccountCfg.deploy) txBuilder = txBuilder.deployFromPublished(subAccountCfg.deploy.fromPublished);
|
|
1450
|
+
}
|
|
1451
|
+
if (subAccountCfg?.init) {
|
|
1452
|
+
const initArgs = typeof subAccountCfg.init.args === "function" ? subAccountCfg.init.args(txCtx) : subAccountCfg.init.args;
|
|
1453
|
+
txBuilder = txBuilder.functionCall(newAccountId, subAccountCfg.init.methodName, initArgs);
|
|
1454
|
+
}
|
|
1455
|
+
if (subAccountCfg?.extendTx) txBuilder = subAccountCfg.extendTx(txBuilder, txCtx);
|
|
1456
|
+
if (effectiveParentKey) txBuilder = txBuilder.signWith(effectiveParentKey);
|
|
1457
|
+
const cleanupDb = async () => {
|
|
1458
|
+
try {
|
|
1459
|
+
const existing = await ctx.context.adapter.findOne({
|
|
1460
|
+
model: "nearAccount",
|
|
1461
|
+
where: [{
|
|
1462
|
+
field: "accountId",
|
|
1463
|
+
operator: "eq",
|
|
1464
|
+
value: newAccountId
|
|
1465
|
+
}]
|
|
1466
|
+
});
|
|
1467
|
+
if (existing) await ctx.context.adapter.delete({
|
|
1468
|
+
model: "nearAccount",
|
|
1469
|
+
where: [{
|
|
1470
|
+
field: "id",
|
|
1471
|
+
operator: "eq",
|
|
1472
|
+
value: existing.id
|
|
1473
|
+
}]
|
|
1474
|
+
});
|
|
1475
|
+
} catch {}
|
|
1476
|
+
try {
|
|
1477
|
+
await ctx.context.internalAdapter.deleteAccount(`${newAccountId}:${network}`);
|
|
1478
|
+
} catch {}
|
|
1479
|
+
};
|
|
1480
|
+
const lifecycleCtx = {
|
|
1481
|
+
...txCtx,
|
|
1482
|
+
near: signingNear
|
|
1483
|
+
};
|
|
1414
1484
|
try {
|
|
1415
1485
|
await txBuilder.send({ waitUntil: "EXECUTED" });
|
|
1486
|
+
} catch (error) {
|
|
1487
|
+
throw new APIError("INTERNAL_SERVER_ERROR", {
|
|
1488
|
+
message: `Failed to create sub-account: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
1489
|
+
status: 500
|
|
1490
|
+
});
|
|
1491
|
+
}
|
|
1492
|
+
try {
|
|
1416
1493
|
await ctx.context.adapter.create({
|
|
1417
1494
|
model: "nearAccount",
|
|
1418
1495
|
data: {
|
|
@@ -1431,42 +1508,82 @@ const siwn = (options) => {
|
|
|
1431
1508
|
createdAt: /* @__PURE__ */ new Date(),
|
|
1432
1509
|
updatedAt: /* @__PURE__ */ new Date()
|
|
1433
1510
|
});
|
|
1434
|
-
|
|
1435
|
-
success: true,
|
|
1436
|
-
accountId: newAccountId,
|
|
1437
|
-
network,
|
|
1438
|
-
publicKey,
|
|
1439
|
-
message: `Sub-account ${newAccountId} created on ${network}`
|
|
1440
|
-
}));
|
|
1511
|
+
if (subAccountCfg?.onCreated) await subAccountCfg.onCreated(lifecycleCtx);
|
|
1441
1512
|
} catch (error) {
|
|
1513
|
+
await cleanupDb();
|
|
1514
|
+
if (subAccountCfg?.onRollback) try {
|
|
1515
|
+
await subAccountCfg.onRollback(lifecycleCtx);
|
|
1516
|
+
} catch {}
|
|
1517
|
+
else try {
|
|
1518
|
+
const key = getRawParentKey(network);
|
|
1519
|
+
if (key) await getNear(network).transaction(newAccountId).deleteAccount({ beneficiary: parentAccount }).signWith(key).send({ waitUntil: "EXECUTED" });
|
|
1520
|
+
} catch {}
|
|
1442
1521
|
throw new APIError("INTERNAL_SERVER_ERROR", {
|
|
1443
|
-
message: `
|
|
1522
|
+
message: `Sub-account created but post-creation failed: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
1444
1523
|
status: 500
|
|
1445
1524
|
});
|
|
1446
1525
|
}
|
|
1526
|
+
return ctx.json(CreateSubAccountResponse.parse({
|
|
1527
|
+
success: true,
|
|
1528
|
+
accountId: newAccountId,
|
|
1529
|
+
network,
|
|
1530
|
+
publicKey,
|
|
1531
|
+
message: `Sub-account ${newAccountId} created on ${network}`
|
|
1532
|
+
}));
|
|
1447
1533
|
}),
|
|
1448
1534
|
checkSubAccountAvailability: createAuthEndpoint("/near/check-sub-account-availability", {
|
|
1449
1535
|
method: "POST",
|
|
1450
|
-
body: CheckSubAccountAvailabilityRequest
|
|
1536
|
+
body: CheckSubAccountAvailabilityRequest,
|
|
1537
|
+
use: [sessionMiddleware]
|
|
1451
1538
|
}, async (ctx) => {
|
|
1452
1539
|
const { subAccountName, network: providedNetwork } = ctx.body;
|
|
1453
|
-
const
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
status: 503
|
|
1540
|
+
const session = ctx.context.session;
|
|
1541
|
+
if (!session) throw new APIError("UNAUTHORIZED", {
|
|
1542
|
+
message: "Must be authenticated to check sub-account availability",
|
|
1543
|
+
status: 401
|
|
1458
1544
|
});
|
|
1545
|
+
const nearAccount = await ctx.context.adapter.findOne({
|
|
1546
|
+
model: "nearAccount",
|
|
1547
|
+
where: [{
|
|
1548
|
+
field: "userId",
|
|
1549
|
+
operator: "eq",
|
|
1550
|
+
value: session.user.id
|
|
1551
|
+
}, {
|
|
1552
|
+
field: "isPrimary",
|
|
1553
|
+
operator: "eq",
|
|
1554
|
+
value: true
|
|
1555
|
+
}]
|
|
1556
|
+
});
|
|
1557
|
+
if (!nearAccount) throw new APIError("UNAUTHORIZED", {
|
|
1558
|
+
message: "Must have a linked NEAR wallet to check sub-account availability",
|
|
1559
|
+
status: 401
|
|
1560
|
+
});
|
|
1561
|
+
const network = providedNetwork || nearAccount.network || primaryNetwork;
|
|
1562
|
+
const parentAccount = getSubAccountConfig(network)?.parentAccount ?? null;
|
|
1563
|
+
if (!parentAccount || isImplicitAccount(parentAccount)) return ctx.json(CheckSubAccountAvailabilityResponse.parse({
|
|
1564
|
+
available: false,
|
|
1565
|
+
accountId: "",
|
|
1566
|
+
reason: "not-configured"
|
|
1567
|
+
}));
|
|
1459
1568
|
const accountId = `${subAccountName}.${parentAccount}`;
|
|
1569
|
+
if (accountId.length > 64) return ctx.json(CheckSubAccountAvailabilityResponse.parse({
|
|
1570
|
+
available: false,
|
|
1571
|
+
accountId,
|
|
1572
|
+
parentAccount,
|
|
1573
|
+
reason: "too-long"
|
|
1574
|
+
}));
|
|
1460
1575
|
const exists = await getNear(network).accountExists(accountId);
|
|
1461
1576
|
return ctx.json(CheckSubAccountAvailabilityResponse.parse({
|
|
1462
1577
|
available: !exists,
|
|
1463
|
-
accountId
|
|
1578
|
+
accountId,
|
|
1579
|
+
parentAccount,
|
|
1580
|
+
reason: exists ? "taken" : void 0
|
|
1464
1581
|
}));
|
|
1465
1582
|
})
|
|
1466
1583
|
}
|
|
1467
1584
|
};
|
|
1468
1585
|
};
|
|
1469
1586
|
//#endregion
|
|
1470
|
-
export { CheckSubAccountAvailabilityRequest, CheckSubAccountAvailabilityResponse, CreateSubAccountRequest, CreateSubAccountResponse, GetRelayerInfoRequest, LinkAccountRequest, NonceRequest, NonceResponse, ProfileRequest, ProfileResponse, RelayHistoryResponse, RelayRequest, RelayResponse, RelayStatusResponse, RelayedTransactionSchema, SetPrimaryAccountRequest, VerifyRequest, VerifyResponse, ViewContractRequest, ViewContractResponse, profileSchema, siwn, socialImageSchema };
|
|
1587
|
+
export { CheckSubAccountAvailabilityRequest, CheckSubAccountAvailabilityResponse, CreateSubAccountRequest, CreateSubAccountResponse, GetRelayerInfoRequest, LinkAccountRequest, NonceRequest, NonceResponse, ProfileRequest, ProfileResponse, RelayHistoryResponse, RelayRequest, RelayResponse, RelayStatusResponse, RelayedTransactionSchema, SUB_ACCOUNT_LABEL_REGEX, SetPrimaryAccountRequest, SubAccountNameSchema, VerifyRequest, VerifyResponse, ViewContractRequest, ViewContractResponse, profileSchema, siwn, socialImageSchema };
|
|
1471
1588
|
|
|
1472
1589
|
//# sourceMappingURL=index.js.map
|