{"version":3,"file":"near-cli.cjs","names":["Data","generateKeyPairSync","Effect"],"sources":["../src/near-cli.ts"],"sourcesContent":["import { generateKeyPairSync } from \"node:crypto\";\nimport { Data, Effect } from \"effect\";\nimport { execa } from \"execa\";\n\nexport interface NearKeyPair {\n  publicKey: string;\n  privateKey: string;\n}\n\nexport interface KeychainTransactionConfig {\n  account: string;\n  contract: string;\n  method: string;\n  args: Record<string, string>;\n  network: \"mainnet\" | \"testnet\";\n  verbose?: boolean;\n}\n\nexport interface KeychainTransactionResult {\n  success: true;\n  txHash?: string;\n}\n\nexport interface FunctionCallAccessKeyConfig {\n  account: string;\n  contract: string;\n  allowance: string;\n  functionNames: string[];\n  network?: \"mainnet\" | \"testnet\";\n  keyPair?: NearKeyPair;\n}\n\nconst NEAR_CLI_VERSION = \"0.23.5\";\nconst INSTALLER_URL = `https://github.com/near/near-cli-rs/releases/download/v${NEAR_CLI_VERSION}/near-cli-rs-installer.sh`;\nconst BASE58_ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n\nexport class NearCliNotFoundError extends Data.TaggedError(\"NearCliNotFoundError\")<{\n  readonly detail?: string;\n}> {\n  override get message() {\n    return \"NEAR CLI not found\";\n  }\n}\n\nexport class NearTransactionError extends Data.TaggedError(\"NearTransactionError\")<{\n  readonly detail: string;\n}> {\n  constructor(detail: string) {\n    super({ detail });\n  }\n\n  override get message() {\n    return this.detail;\n  }\n}\n\nfunction base64UrlToBytes(input: string): Uint8Array {\n  const normalized = input.replace(/-/g, \"+\").replace(/_/g, \"/\");\n  return new Uint8Array(Buffer.from(normalized, \"base64\"));\n}\n\nfunction base58Encode(input: Uint8Array): string {\n  if (input.length === 0) return \"\";\n\n  const digits: number[] = [0];\n  for (const byte of input) {\n    let carry = byte;\n    for (let i = 0; i < digits.length; i++) {\n      carry += digits[i]! << 8;\n      digits[i] = carry % 58;\n      carry = Math.floor(carry / 58);\n    }\n    while (carry > 0) {\n      digits.push(carry % 58);\n      carry = Math.floor(carry / 58);\n    }\n  }\n\n  let output = \"\";\n  for (const byte of input) {\n    if (byte === 0) output += BASE58_ALPHABET[0];\n    else break;\n  }\n\n  for (let i = digits.length - 1; i >= 0; i--) {\n    output += BASE58_ALPHABET[digits[i]!]!;\n  }\n\n  return output;\n}\n\nexport function generateNearKeyPair(): NearKeyPair {\n  const { publicKey, privateKey } = generateKeyPairSync(\"ed25519\");\n  const publicJwk = publicKey.export({ format: \"jwk\" }) as JsonWebKey;\n  const privateJwk = privateKey.export({ format: \"jwk\" }) as JsonWebKey;\n\n  if (!publicJwk.x || !privateJwk.d) {\n    throw new Error(\"Failed to generate NEAR keypair\");\n  }\n\n  const publicBytes = base64UrlToBytes(publicJwk.x);\n  const privateSeed = base64UrlToBytes(privateJwk.d);\n  const secretBytes = new Uint8Array(privateSeed.length + publicBytes.length);\n  secretBytes.set(privateSeed, 0);\n  secretBytes.set(publicBytes, privateSeed.length);\n\n  return {\n    publicKey: `ed25519:${base58Encode(publicBytes)}`,\n    privateKey: `ed25519:${base58Encode(secretBytes)}`,\n  };\n}\n\nexport async function isNearCliInstalled(): Promise<boolean> {\n  try {\n    await execa(\"near\", [\"--version\"], { stdio: \"pipe\" });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nfunction combineNearOutput(stdout?: string, stderr?: string): string {\n  return [stdout, stderr].filter((value) => value && value.trim().length > 0).join(\"\\n\");\n}\n\nfunction extractTransactionHash(output: string): string | undefined {\n  const match = output.match(/Transaction ID:\\s*([A-Za-z0-9]+)/i);\n  return match?.[1];\n}\n\nexport async function executeKeychainTransaction(\n  config: KeychainTransactionConfig,\n): Promise<KeychainTransactionResult> {\n  if (!process.stdin.isTTY) {\n    throw new NearTransactionError(\n      \"No TTY available for keychain signing. Set NEAR_PRIVATE_KEY environment variable to sign locally.\",\n    );\n  }\n\n  const gas = \"300Tgas\";\n  const deposit = \"0NEAR\";\n  const argsBase64 = Buffer.from(JSON.stringify(config.args)).toString(\"base64\");\n\n  const args = [\n    \"contract\",\n    \"call-function\",\n    \"as-transaction\",\n    config.contract,\n    config.method,\n    \"base64-args\",\n    argsBase64,\n    \"prepaid-gas\",\n    gas,\n    \"attached-deposit\",\n    deposit,\n    \"sign-as\",\n    config.account,\n    \"network-config\",\n    config.network,\n    \"sign-with-keychain\",\n    \"send\",\n  ];\n\n  const result = await execa(\"near\", args, {\n    stdin: \"inherit\",\n    stdout: \"pipe\",\n    stderr: \"pipe\",\n    reject: false,\n    timeout: 5 * 60 * 1000,\n  });\n\n  const combined = combineNearOutput(result.stdout, result.stderr);\n  const txHash = extractTransactionHash(combined);\n  const hasCodeDoesNotExist = /CodeDoesNotExist/i.test(combined);\n\n  if (result.exitCode === 0 || hasCodeDoesNotExist) {\n    return { success: true, txHash };\n  }\n\n  throw new NearTransactionError(combined || `Transaction failed with code ${result.exitCode}`);\n}\n\nasync function runNearCommand(args: string[]): Promise<void> {\n  if (!process.stdin.isTTY) {\n    throw new NearTransactionError(\n      \"No TTY available for keychain signing. Set NEAR_PRIVATE_KEY environment variable to sign locally.\",\n    );\n  }\n\n  await execa(\"near\", args, { stdin: \"inherit\", stdout: \"inherit\", stderr: \"inherit\" });\n}\n\nexport const ensureNearCli = Effect.gen(function* () {\n  const isInstalled = yield* Effect.promise(() => isNearCliInstalled());\n  if (isInstalled) return;\n\n  yield* Effect.log(\"\");\n  yield* Effect.log(\"  NEAR CLI not found\");\n  yield* Effect.log(\"\");\n  yield* Effect.log(\n    `  To install manually: curl --proto '=https' --tlsv1.2 -LsSf ${INSTALLER_URL} | sh`,\n  );\n  yield* Effect.log(\"\");\n  return yield* new NearCliNotFoundError({});\n});\n\nexport async function listPublishKeys(config: {\n  account: string;\n  contract: string;\n  network: \"mainnet\" | \"testnet\";\n}): Promise<string[]> {\n  const listResult = await execa(\n    \"near\",\n    [\"account\", \"list-keys\", config.account, \"network-config\", config.network, \"now\"],\n    { stdout: \"pipe\", stderr: \"pipe\", reject: false },\n  );\n\n  if (listResult.exitCode !== 0) {\n    throw new NearTransactionError(\n      `Failed to list account keys: ${listResult.stderr || listResult.stdout || \"unknown error\"}`,\n    );\n  }\n\n  const output = listResult.stdout ?? \"\";\n  const oldKeys: string[] = [];\n\n  for (const line of output.split(\"\\n\")) {\n    if (line.includes(config.contract) && line.includes(\"__fastdata_kv\")) {\n      const match = line.match(/ed25519:[A-Za-z0-9]+/);\n      if (match) {\n        oldKeys.push(match[0]);\n      }\n    }\n  }\n\n  return oldKeys;\n}\n\nexport async function deleteAccessKeys(\n  account: string,\n  publicKeys: string[],\n  network: \"mainnet\" | \"testnet\",\n): Promise<void> {\n  const args = [\n    \"account\",\n    \"delete-keys\",\n    account,\n    \"public-keys\",\n    publicKeys.join(\",\"),\n    \"network-config\",\n    network,\n    \"sign-with-keychain\",\n    \"send\",\n  ];\n  await runNearCommand(args);\n}\n\nexport async function addFunctionCallAccessKey(\n  config: FunctionCallAccessKeyConfig,\n): Promise<NearKeyPair> {\n  const keyPair = config.keyPair ?? generateNearKeyPair();\n  const args = [\n    \"account\",\n    \"add-key\",\n    config.account,\n    \"grant-function-call-access\",\n    \"--allowance\",\n    config.allowance,\n    \"--contract-account-id\",\n    config.contract,\n    \"--function-names\",\n    config.functionNames.join(\", \"),\n    \"use-manually-provided-public-key\",\n    keyPair.publicKey,\n    \"network-config\",\n    config.network || (config.account.endsWith(\".testnet\") ? \"testnet\" : \"mainnet\"),\n    \"sign-with-keychain\",\n    \"send\",\n  ];\n\n  await runNearCommand(args);\n  return keyPair;\n}\n"],"mappings":"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"}