{"version":3,"file":"delegate-signer.cjs","names":["Near","isPrivateKey","readSessionHandle","generateNearKeyPair","startDeviceLogin","openInBrowser"],"sources":["../src/delegate-signer.ts"],"sourcesContent":["import { isPrivateKey, Near, type PrivateKey } from \"near-kit\";\nimport { openInBrowser, startDeviceLogin } from \"./auth-login\";\nimport { type DelegateKeyRecord, readSessionHandle, updateSessionHandle } from \"./auth-session\";\nimport type { NetworkId } from \"./fastkv\";\nimport { generateNearKeyPair } from \"./near-cli\";\n\nexport interface RelayResult {\n  success: true;\n  txHash?: string;\n}\n\nexport interface DelegateSubmitOptions {\n  account: string;\n  contract: string;\n  network: NetworkId;\n  args: Record<string, string>;\n  delegatePrivateKey: string;\n  relayEndpoint: string;\n  apiKey: string;\n  gas?: string;\n}\n\nfunction relayErrorMessage(message: string): string {\n  return message.replace(/\\n/g, \" \");\n}\n\nexport async function submitRegistryWriteDelegated(\n  opts: DelegateSubmitOptions,\n): Promise<RelayResult> {\n  const near = new Near({\n    network: opts.network,\n    defaultSignerId: opts.account,\n    privateKey: assertPrivateKey(opts.delegatePrivateKey),\n  });\n\n  const delegate = await near\n    .transaction(opts.account)\n    .functionCall(opts.contract, \"__fastdata_kv\", opts.args, {\n      gas: \"300 Tgas\",\n      attachedDeposit: \"0 yocto\",\n    })\n    .delegate({ receiverId: opts.contract, blockHeightOffset: 200 });\n\n  const response = await fetch(opts.relayEndpoint, {\n    method: \"POST\",\n    headers: {\n      \"x-api-key\": opts.apiKey,\n      \"content-type\": \"application/json\",\n    },\n    body: JSON.stringify({ payload: delegate.payload }),\n  });\n\n  if (!response.ok) {\n    let detail = `Relay rejected the transaction (HTTP ${response.status})`;\n    try {\n      const body = (await response.json()) as { message?: string; error?: string };\n      const relayMessage = body.message ?? body.error;\n      if (relayMessage) {\n        detail = `${detail}: ${relayErrorMessage(relayMessage)}`;\n      }\n    } catch {\n      // keep the generic message\n    }\n    throw new Error(detail);\n  }\n\n  const body = (await response.json()) as { txHash?: string };\n  return { success: true, txHash: body.txHash };\n}\n\nfunction assertPrivateKey(key: string): PrivateKey {\n  if (!isPrivateKey(key)) {\n    throw new Error(\"Invalid delegate key format (expected ed25519:…)\");\n  }\n  return key as PrivateKey;\n}\n\nexport interface EnsureDelegateKeyOptions {\n  configDir: string;\n  account: string;\n  contract: string;\n  network: NetworkId;\n  siteUrl: string;\n}\n\nexport async function ensureDelegateKey(\n  opts: EnsureDelegateKeyOptions,\n): Promise<DelegateKeyRecord> {\n  const existing = readSessionHandle(opts.configDir)?.delegateKey;\n  if (\n    existing &&\n    existing.accountId === opts.account &&\n    existing.contract === opts.contract &&\n    existing.network === opts.network\n  ) {\n    return existing;\n  }\n\n  const keyPair = generateNearKeyPair();\n\n  const login = await startDeviceLogin({\n    siteUrl: opts.siteUrl,\n    delegate: {\n      pubKey: keyPair.publicKey,\n      contract: opts.contract,\n      network: opts.network,\n    },\n    account: opts.account,\n  });\n\n  console.log(`  One-time code: ${login.userCode}`);\n  await openInBrowser(login.verificationUrl).catch((error: unknown) => {\n    console.log(`  ⚠ ${(error as Error).message}`);\n  });\n  console.log(`  Waiting for delegate-key approval at ${login.verificationUrl}…`);\n\n  await login.waitForApproval();\n\n  const record: DelegateKeyRecord = {\n    publicKey: keyPair.publicKey,\n    privateKey: keyPair.privateKey,\n    accountId: opts.account,\n    network: opts.network,\n    contract: opts.contract,\n    mintedAt: new Date().toISOString(),\n  };\n  updateSessionHandle(opts.configDir, (current) => ({ ...current, delegateKey: record }));\n  return record;\n}\n"],"mappings":";;;;;;AAsBA,SAAS,kBAAkB,SAAyB;CAClD,OAAO,QAAQ,QAAQ,OAAO,GAAG;AACnC;AAEA,eAAsB,6BACpB,MACsB;CAOtB,MAAM,WAAW,MAAM,IANNA,cAAK;EACpB,SAAS,KAAK;EACd,iBAAiB,KAAK;EACtB,YAAY,iBAAiB,KAAK,kBAAkB;CACtD,CAE0B,CAAC,CACxB,YAAY,KAAK,OAAO,CAAC,CACzB,aAAa,KAAK,UAAU,iBAAiB,KAAK,MAAM;EACvD,KAAK;EACL,iBAAiB;CACnB,CAAC,CAAC,CACD,SAAS;EAAE,YAAY,KAAK;EAAU,mBAAmB;CAAI,CAAC;CAEjE,MAAM,WAAW,MAAM,MAAM,KAAK,eAAe;EAC/C,QAAQ;EACR,SAAS;GACP,aAAa,KAAK;GAClB,gBAAgB;EAClB;EACA,MAAM,KAAK,UAAU,EAAE,SAAS,SAAS,QAAQ,CAAC;CACpD,CAAC;CAED,IAAI,CAAC,SAAS,IAAI;EAChB,IAAI,SAAS,wCAAwC,SAAS,OAAO;EACrE,IAAI;GACF,MAAM,OAAQ,MAAM,SAAS,KAAK;GAClC,MAAM,eAAe,KAAK,WAAW,KAAK;GAC1C,IAAI,cACF,SAAS,GAAG,OAAO,IAAI,kBAAkB,YAAY;EAEzD,QAAQ,CAER;EACA,MAAM,IAAI,MAAM,MAAM;CACxB;CAGA,OAAO;EAAE,SAAS;EAAM,SAAQ,MADZ,SAAS,KAAK,EACE,CAAC;CAAO;AAC9C;AAEA,SAAS,iBAAiB,KAAyB;CACjD,IAAI,KAACC,uBAAa,GAAG,GACnB,MAAM,IAAI,MAAM,kDAAkD;CAEpE,OAAO;AACT;AAUA,eAAsB,kBACpB,MAC4B;CAC5B,MAAM,WAAWC,uCAAkB,KAAK,SAAS,CAAC,EAAE;CACpD,IACE,YACA,SAAS,cAAc,KAAK,WAC5B,SAAS,aAAa,KAAK,YAC3B,SAAS,YAAY,KAAK,SAE1B,OAAO;CAGT,MAAM,UAAUC,qCAAoB;CAEpC,MAAM,QAAQ,MAAMC,oCAAiB;EACnC,SAAS,KAAK;EACd,UAAU;GACR,QAAQ,QAAQ;GAChB,UAAU,KAAK;GACf,SAAS,KAAK;EAChB;EACA,SAAS,KAAK;CAChB,CAAC;CAED,QAAQ,IAAI,oBAAoB,MAAM,UAAU;CAChD,MAAMC,iCAAc,MAAM,eAAe,CAAC,CAAC,OAAO,UAAmB;EACnE,QAAQ,IAAI,OAAQ,MAAgB,SAAS;CAC/C,CAAC;CACD,QAAQ,IAAI,0CAA0C,MAAM,gBAAgB,EAAE;CAE9E,MAAM,MAAM,gBAAgB;CAE5B,MAAM,SAA4B;EAChC,WAAW,QAAQ;EACnB,YAAY,QAAQ;EACpB,WAAW,KAAK;EAChB,SAAS,KAAK;EACd,UAAU,KAAK;EACf,2BAAU,IAAI,KAAK,EAAC,CAAC,YAAY;CACnC;CACA,yCAAoB,KAAK,YAAY,aAAa;EAAE,GAAG;EAAS,aAAa;CAAO,EAAE;CACtF,OAAO;AACT"}