{"version":3,"file":"near-cli.cjs","names":["Effect","colors"],"sources":["../src/near-cli.ts"],"sourcesContent":["import { generateKeyPairSync } from \"node:crypto\";\nimport { Effect } from \"effect\";\nimport { execa } from \"execa\";\nimport { colors } from \"./utils/theme\";\n\nexport interface NearTransactionConfig {\n  account: string;\n  contract: string;\n  method: string;\n  argsBase64: string;\n  network?: \"mainnet\" | \"testnet\";\n  privateKey?: string;\n  gas?: string;\n  deposit?: string;\n  verbose?: boolean;\n}\n\nexport interface NearTransactionResult {\n  success: true;\n  txHash?: string;\n  output?: string;\n}\n\nexport interface NearKeyPair {\n  publicKey: string;\n  privateKey: string;\n}\n\nexport interface FunctionCallAccessKeyConfig {\n  account: string;\n  contract: string;\n  allowance: string;\n  functionNames: string[];\n  network?: \"mainnet\" | \"testnet\";\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 Error {\n  readonly _tag = \"NearCliNotFoundError\";\n  constructor() {\n    super(\"NEAR CLI not found\");\n  }\n}\n\nexport class NearTransactionError extends Error {\n  readonly _tag = \"NearTransactionError\";\n}\n\nexport type NearSigningMode =\n  | { _tag: \"privateKey\"; privateKey: string }\n  | { _tag: \"interactiveKeychain\" };\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\nconst checkNearCliInstalled = Effect.tryPromise({\n  try: async () => {\n    try {\n      await execa(\"near\", [\"--version\"], { stdio: \"pipe\" });\n      return true;\n    } catch {\n      return false;\n    }\n  },\n  catch: () => new Error(\"Failed to check NEAR CLI\"),\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 function resolveNearSigningMode(privateKey?: string): NearSigningMode {\n  if (privateKey) {\n    return { _tag: \"privateKey\", privateKey };\n  }\n\n  if (!process.stdin.isTTY) {\n    throw new NearTransactionError(\n      \"No private key provided and no TTY available for keychain signing. Set NEAR_PRIVATE_KEY environment variable to sign locally.\",\n    );\n  }\n\n  console.log(\n    colors.yellow(\n      \"  Warning: No NEAR_PRIVATE_KEY set — falling back to interactive keychain signing.\",\n    ),\n  );\n  return { _tag: \"interactiveKeychain\" };\n}\n\nexport const ensureNearCli = Effect.gen(function* () {\n  const isInstalled = yield* checkNearCliInstalled;\n  if (isInstalled) return;\n\n  console.log();\n  console.log(\"  NEAR CLI not found\");\n\n  console.log();\n  console.log(`  To install manually: curl --proto '=https' --tlsv1.2 -LsSf ${INSTALLER_URL} | sh`);\n  console.log();\n  yield* Effect.fail(new NearCliNotFoundError());\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 const executeTransaction = (\n  config: NearTransactionConfig,\n  signingMode?: NearSigningMode,\n): Effect.Effect<NearTransactionResult, Error> =>\n  Effect.gen(function* () {\n    const resolvedSigningMode = signingMode ?? resolveNearSigningMode(config.privateKey);\n    const gas = (config.gas || \"300Tgas\").replace(/\\s+/g, \"\");\n    const deposit = (config.deposit || \"0NEAR\").replace(/\\s+/g, \"\");\n    const network = config.network || (config.account.endsWith(\".testnet\") ? \"testnet\" : \"mainnet\");\n\n    const args = [\n      \"contract\",\n      \"call-function\",\n      \"as-transaction\",\n      config.contract,\n      config.method,\n      \"base64-args\",\n      config.argsBase64,\n      \"prepaid-gas\",\n      gas,\n      \"attached-deposit\",\n      deposit,\n      \"sign-as\",\n      config.account,\n      \"network-config\",\n      network,\n    ];\n\n    if (resolvedSigningMode._tag === \"privateKey\") {\n      args.push(\"sign-with-plaintext-private-key\", resolvedSigningMode.privateKey, \"send\");\n    } else {\n      args.push(\"sign-with-keychain\", \"send\");\n    }\n\n    const output = yield* Effect.tryPromise({\n      try: async () => {\n        const isPrivateKeyMode = resolvedSigningMode._tag === \"privateKey\";\n        const verbose = config.verbose ?? false;\n\n        const proc = execa(\"near\", args, {\n          stdin: isPrivateKeyMode ? \"ignore\" : \"inherit\",\n          stdout: \"pipe\",\n          stderr: \"pipe\",\n          reject: false,\n          timeout: 5 * 60 * 1000,\n        });\n\n        proc.stdout?.on(\"data\", (chunk: Buffer) => {\n          if (verbose) {\n            process.stdout.write(chunk);\n          }\n        });\n\n        proc.stderr?.on(\"data\", (chunk: Buffer) => {\n          if (verbose) {\n            process.stderr.write(chunk);\n          }\n        });\n\n        const result = await proc;\n        const stdoutStr = result.stdout ?? \"\";\n        const stderrStr = result.stderr ?? \"\";\n        const combined = combineNearOutput(stdoutStr, stderrStr);\n        const txHash = extractTransactionHash(combined);\n        const hasCodeDoesNotExist = /CodeDoesNotExist/i.test(combined);\n\n        if (result.exitCode === 0 || hasCodeDoesNotExist) {\n          if (hasCodeDoesNotExist) {\n            console.log(\n              `  ${colors.green(\"✓\")} Transaction confirmed${txHash ? ` ${colors.dim(txHash)}` : \"\"}`,\n            );\n          }\n          return {\n            success: true,\n            txHash,\n            output: combined || undefined,\n          };\n        }\n\n        throw new NearTransactionError(\n          combined || `Transaction failed with code ${result.exitCode}`,\n        );\n      },\n      catch: (error) => error as Error,\n    });\n\n    return {\n      success: true,\n      txHash: output.txHash,\n      output: output.output,\n    };\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 = 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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"}