UNPKG

@opendatalabs/vana-sdk

Version:

A TypeScript library for interacting with Vana Network smart contracts.

45 lines 1.52 kB
import { sha256 } from "@noble/hashes/sha2"; import { bytesToHex } from "viem"; import { toBase64 } from "../utils/encoding.js"; const EMPTY_BODY_HASH = "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; const DEFAULT_TTL_SECONDS = 300; function base64urlEncode(input) { return toBase64(input).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); } function computeBodyHash(body) { if (!body || body.length === 0) { return EMPTY_BODY_HASH; } const digest = sha256(body); return `sha256:${bytesToHex(digest).slice(2)}`; } async function buildWeb3SignedHeader(params) { const now = Math.floor(Date.now() / 1e3); const iat = params.iat ?? now; const exp = params.exp ?? iat + DEFAULT_TTL_SECONDS; const payload = { aud: params.aud, bodyHash: params.bodyHash ?? computeBodyHash(params.body), exp, iat, method: params.method, uri: params.uri }; if (params.grantId !== void 0) { payload["grantId"] = params.grantId; } const sortedPayload = Object.keys(payload).sort().reduce((acc, key) => { acc[key] = payload[key]; return acc; }, {}); const payloadJson = JSON.stringify(sortedPayload); const payloadBytes = new TextEncoder().encode(payloadJson); const payloadBase64 = base64urlEncode(payloadBytes); const signature = await params.signMessage(payloadBase64); return `Web3Signed ${payloadBase64}.${signature}`; } export { buildWeb3SignedHeader, computeBodyHash }; //# sourceMappingURL=web3-signed-builder.js.map