{"version":3,"file":"near-signer.cjs","names":["isPrivateKey","NearTransactionError","FileKeyStore","isNearCliInstalled","Near","executeKeychainTransaction"],"sources":["../src/near-signer.ts"],"sourcesContent":["import { isPrivateKey, Near, type PrivateKey } from \"near-kit\";\nimport { FileKeyStore } from \"near-kit/keys/file\";\n\nimport type { NetworkId } from \"./fastkv\";\nimport { executeKeychainTransaction, isNearCliInstalled, NearTransactionError } from \"./near-cli\";\n\nexport type SigningKeySource = \"provided\" | \"credentials-file\";\n\nexport interface ResolvedSigningKey {\n  source: SigningKeySource;\n  privateKey: string;\n}\n\nexport interface RegistryWriteRequest {\n  account: string;\n  contract: string;\n  method: string;\n  args: Record<string, string>;\n  network: NetworkId;\n  privateKey?: string;\n}\n\nexport type SigningStrategy =\n  | { strategy: \"near-kit\"; privateKey: string; source: SigningKeySource }\n  | { strategy: \"near-cli-keychain\" };\n\nexport interface NearTransactionResult {\n  success: true;\n  txHash?: string;\n  signedWith: \"env\" | \"credentials-file\" | \"near-cli-keychain\";\n}\n\nfunction assertPrivateKey(key: string): PrivateKey {\n  if (!isPrivateKey(key)) {\n    throw new NearTransactionError(\n      `Invalid private key format: must start with \"ed25519:\" or \"secp256k1:\" (got a ${key.length}-character value).`,\n    );\n  }\n  return key as PrivateKey;\n}\n\nexport async function resolveSigningKey(opts: {\n  privateKey?: string;\n  account: string;\n  network: NetworkId;\n}): Promise<ResolvedSigningKey> {\n  const explicitKey =\n    opts.privateKey || process.env.NEAR_PRIVATE_KEY || process.env.BOS_NEAR_PRIVATE_KEY;\n  if (explicitKey) {\n    return { source: \"provided\", privateKey: explicitKey };\n  }\n\n  const keyStore = new FileKeyStore(\"~/.near-credentials\", opts.network);\n  const keyPair = await keyStore.get(opts.account);\n  if (keyPair?.secretKey) {\n    return { source: \"credentials-file\", privateKey: keyPair.secretKey };\n  }\n\n  throw new NearTransactionError(\"No signing key available\");\n}\n\nexport async function resolveSigningStrategy(opts: {\n  privateKey?: string;\n  account: string;\n  network: NetworkId;\n}): Promise<SigningStrategy> {\n  try {\n    const resolved = await resolveSigningKey(opts);\n    return { strategy: \"near-kit\", privateKey: resolved.privateKey, source: resolved.source };\n  } catch {\n    // fall through to the near-cli-rs keychain\n  }\n\n  if (process.stdin.isTTY && (await isNearCliInstalled())) {\n    return { strategy: \"near-cli-keychain\" };\n  }\n\n  throw new NearTransactionError(\n    `No signing key available for ${opts.account} on ${opts.network}. ` +\n      `Set NEAR_PRIVATE_KEY (or BOS_NEAR_PRIVATE_KEY), store credentials at ` +\n      `~/.near-credentials/${opts.network}/${opts.account}.json, or sign with the ` +\n      `near-cli-rs keychain (install it, then retry from an interactive terminal). ` +\n      `Generate a publish key with: bos key generate`,\n  );\n}\n\nexport function describeSigningStrategy(strategy: SigningStrategy): string {\n  if (strategy.strategy === \"near-cli-keychain\") {\n    return \"near-cli-rs keychain\";\n  }\n  return strategy.source === \"provided\"\n    ? \"the environment or --private-key flag\"\n    : `~/.near-credentials`;\n}\n\nasync function submitWithNearKit(\n  tx: RegistryWriteRequest,\n  privateKey: string,\n): Promise<NearTransactionResult> {\n  const near = new Near({\n    network: tx.network,\n    defaultSignerId: tx.account,\n    privateKey: assertPrivateKey(privateKey),\n  });\n\n  const outcome = await near\n    .transaction(tx.account)\n    .functionCall(tx.contract, tx.method, tx.args, {\n      gas: \"300 Tgas\",\n      attachedDeposit: \"0 yocto\",\n    })\n    .send({ waitUntil: \"NONE\" });\n\n  return { success: true, txHash: outcome?.transaction?.hash, signedWith: \"env\" };\n}\n\nexport async function submitRegistryWrite(\n  tx: RegistryWriteRequest,\n  strategy?: SigningStrategy,\n): Promise<NearTransactionResult> {\n  const resolved = strategy ?? (await resolveSigningStrategy(tx));\n\n  if (resolved.strategy === \"near-cli-keychain\") {\n    const result = await executeKeychainTransaction({\n      account: tx.account,\n      contract: tx.contract,\n      method: tx.method,\n      args: tx.args,\n      network: tx.network,\n    });\n    return { ...result, signedWith: \"near-cli-keychain\" };\n  }\n\n  return submitWithNearKit(tx, resolved.privateKey);\n}\n"],"mappings":";;;;;AAgCA,SAAS,iBAAiB,KAAyB;CACjD,IAAI,KAACA,uBAAa,GAAG,GACnB,MAAM,IAAIC,sCACR,iFAAiF,IAAI,OAAO,mBAC9F;CAEF,OAAO;AACT;AAEA,eAAsB,kBAAkB,MAIR;CAC9B,MAAM,cACJ,KAAK,cAAc,QAAQ,IAAI,oBAAoB,QAAQ,IAAI;CACjE,IAAI,aACF,OAAO;EAAE,QAAQ;EAAY,YAAY;CAAY;CAIvD,MAAM,UAAU,MAAM,IADDC,gCAAa,uBAAuB,KAAK,OACjC,CAAC,CAAC,IAAI,KAAK,OAAO;CAC/C,IAAI,SAAS,WACX,OAAO;EAAE,QAAQ;EAAoB,YAAY,QAAQ;CAAU;CAGrE,MAAM,IAAID,sCAAqB,0BAA0B;AAC3D;AAEA,eAAsB,uBAAuB,MAIhB;CAC3B,IAAI;EACF,MAAM,WAAW,MAAM,kBAAkB,IAAI;EAC7C,OAAO;GAAE,UAAU;GAAY,YAAY,SAAS;GAAY,QAAQ,SAAS;EAAO;CAC1F,QAAQ,CAER;CAEA,IAAI,QAAQ,MAAM,SAAU,MAAME,oCAAmB,GACnD,OAAO,EAAE,UAAU,oBAAoB;CAGzC,MAAM,IAAIF,sCACR,gCAAgC,KAAK,QAAQ,MAAM,KAAK,QAAQ,6FAEvC,KAAK,QAAQ,GAAG,KAAK,QAAQ,kJAGxD;AACF;AAEA,SAAgB,wBAAwB,UAAmC;CACzE,IAAI,SAAS,aAAa,qBACxB,OAAO;CAET,OAAO,SAAS,WAAW,aACvB,0CACA;AACN;AAEA,eAAe,kBACb,IACA,YACgC;CAehC,OAAO;EAAE,SAAS;EAAM,SAAQ,MARV,IANLG,cAAK;GACpB,SAAS,GAAG;GACZ,iBAAiB,GAAG;GACpB,YAAY,iBAAiB,UAAU;EACzC,CAEyB,CAAC,CACvB,YAAY,GAAG,OAAO,CAAC,CACvB,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM;GAC7C,KAAK;GACL,iBAAiB;EACnB,CAAC,CAAC,CACD,KAAK,EAAE,WAAW,OAAO,CAAC,EAEU,EAAE,aAAa;EAAM,YAAY;CAAM;AAChF;AAEA,eAAsB,oBACpB,IACA,UACgC;CAChC,MAAM,WAAW,YAAa,MAAM,uBAAuB,EAAE;CAE7D,IAAI,SAAS,aAAa,qBAQxB,OAAO;EAAE,GAAG,MAPSC,4CAA2B;GAC9C,SAAS,GAAG;GACZ,UAAU,GAAG;GACb,QAAQ,GAAG;GACX,MAAM,GAAG;GACT,SAAS,GAAG;EACd,CAAC;EACmB,YAAY;CAAoB;CAGtD,OAAO,kBAAkB,IAAI,SAAS,UAAU;AAClD"}