Quickstart
Integrate Revibase into a web app (Next.js, Remix, Vite).
2
Generate client keys
node -e '
(async () => {
const toBase64 = str => Buffer.from(str).toString("base64");
const keyPair = await crypto.subtle.generateKey(
{ name: "Ed25519" },
true,
["sign", "verify"]
);
const [pub, priv] = await Promise.all([
crypto.subtle.exportKey("jwk", keyPair.publicKey),
crypto.subtle.exportKey("jwk", keyPair.privateKey)
]);
const publicKeyJSON = `{"alg":"EdDSA","crv":"Ed25519","kty":"OKP","x":"${pub.x}"}`;
const privateKeyJSON = `{"alg":"EdDSA","crv":"Ed25519","d":"${priv.d}","kty":"OKP","x":"${priv.x}"}`;
console.log({
publicKey: toBase64(publicKeyJSON),
privateKey: toBase64(privateKeyJSON)
});
})();
'3
4
Backend callback (/api/clientAuthorization)
/api/clientAuthorization)import {
processClientAuthCallback,
type DeviceSignature,
type StartMessageRequest,
type StartTransactionRequest,
} from "@revibase/lite";
export async function POST(req: Request) {
try {
const { request, device, channelId } = (await req.json()) as {
request: StartMessageRequest | StartTransactionRequest;
device?: DeviceSignature;
channelId?: string;
};
const result = await processClientAuthCallback({
request,
privateKey: process.env.PRIVATE_KEY!,
signal: req.signal,
device,
channelId,
});
return Response.json(result);
} catch (e) {
const msg = e instanceof Error ? e.message : String(e);
return Response.json({ error: msg }, { status: 500 });
}
}5
Frontend flows
Sign in
import { RevibaseProvider, signIn } from "@revibase/lite";
const provider = new RevibaseProvider();
const { user } = await signIn(provider);Pay (token transfer)
import { RevibaseProvider, signIn, transferTokens } from "@revibase/lite";
const provider = new RevibaseProvider();
// Option A: pay without an explicit connect step
const { txSig, user } = await transferTokens(provider, {
amount: 100_000_000n,
destination: "DESTINATION_WALLET_ADDRESS",
});
// Option B: connect first, then pay as that user
// const { user } = await signIn(provider);
// const { txSig } = await transferTokens(provider, { amount, destination, signer: user });Confirm on-chain (recommended)
Custom transactions (executeTransaction)
executeTransaction)import { RevibaseProvider, signIn, executeTransaction } from "@revibase/lite";
const provider = new RevibaseProvider({
rpcEndpoint: "https://api.mainnet-beta.solana.com",
});
const { user } = await signIn(provider);
const { txSig } = await executeTransaction(provider, {
instructions: [], // your instructions
signer: user,
});Two-device approvals (channels)
Security notes
Next
Last updated