everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
84 lines (82 loc) • 2.74 kB
JavaScript
import { readSessionHandle, updateSessionHandle } from "./auth-session.mjs";
import { openInBrowser, startDeviceLogin } from "./auth-login.mjs";
import { generateNearKeyPair } from "./near-cli.mjs";
import { Near, isPrivateKey } from "near-kit";
//#region src/delegate-signer.ts
function relayErrorMessage(message) {
return message.replace(/\n/g, " ");
}
async function submitRegistryWriteDelegated(opts) {
const delegate = await new Near({
network: opts.network,
defaultSignerId: opts.account,
privateKey: assertPrivateKey(opts.delegatePrivateKey)
}).transaction(opts.account).functionCall(opts.contract, "__fastdata_kv", opts.args, {
gas: "300 Tgas",
attachedDeposit: "0 yocto"
}).delegate({
receiverId: opts.contract,
blockHeightOffset: 200
});
const response = await fetch(opts.relayEndpoint, {
method: "POST",
headers: {
"x-api-key": opts.apiKey,
"content-type": "application/json"
},
body: JSON.stringify({ payload: delegate.payload })
});
if (!response.ok) {
let detail = `Relay rejected the transaction (HTTP ${response.status})`;
try {
const body = await response.json();
const relayMessage = body.message ?? body.error;
if (relayMessage) detail = `${detail}: ${relayErrorMessage(relayMessage)}`;
} catch {}
throw new Error(detail);
}
return {
success: true,
txHash: (await response.json()).txHash
};
}
function assertPrivateKey(key) {
if (!isPrivateKey(key)) throw new Error("Invalid delegate key format (expected ed25519:…)");
return key;
}
async function ensureDelegateKey(opts) {
const existing = readSessionHandle(opts.configDir)?.delegateKey;
if (existing && existing.accountId === opts.account && existing.contract === opts.contract && existing.network === opts.network) return existing;
const keyPair = generateNearKeyPair();
const login = await startDeviceLogin({
siteUrl: opts.siteUrl,
delegate: {
pubKey: keyPair.publicKey,
contract: opts.contract,
network: opts.network
},
account: opts.account
});
console.log(` One-time code: ${login.userCode}`);
await openInBrowser(login.verificationUrl).catch((error) => {
console.log(` ⚠ ${error.message}`);
});
console.log(` Waiting for delegate-key approval at ${login.verificationUrl}…`);
await login.waitForApproval();
const record = {
publicKey: keyPair.publicKey,
privateKey: keyPair.privateKey,
accountId: opts.account,
network: opts.network,
contract: opts.contract,
mintedAt: (/* @__PURE__ */ new Date()).toISOString()
};
updateSessionHandle(opts.configDir, (current) => ({
...current,
delegateKey: record
}));
return record;
}
//#endregion
export { ensureDelegateKey, submitRegistryWriteDelegated };
//# sourceMappingURL=delegate-signer.mjs.map