Authenticate with LiberFi and manage your session.
See bootstrap.md for CLI installation and connectivity verification.
Generates a P-256 key pair on first use; on subsequent calls, the existing key is reused. No user interaction required — suitable for automated and agent environments.
bash
lfi login key --role AGENT --name "MyAgent" --json
Flow:
~/.liberfi/keys/default.json or generates a new key pair.Date.now() (Unix ms string) with the local private key (SHA-256 + ECDSA P-256).POST /v1/auth/key with { publicKeyHex, uncompressedPublicKeyHex, timestampMs, signature }.~/.liberfi/session.json.Token refresh:
POST /v1/auth/key.401 response, the CLI attempts one automatic refresh before propagating the error.Two steps: send OTP, then verify.
Step 1 — Send OTP:
bash
lfi login user@example.com --json
Expected output:
json
{
"ok": true,
"otpId": "uuid-here",
"message": "Verification code sent to user@example.com. It expires in 5 minutes."
}
Step 2 — Verify OTP:
bash
lfi verify <otpId> <6-digit-code> --json
Expected output:
json
{
"ok": true,
"userId": "...",
"role": "HUMAN",
"evmAddress": "0x...",
"solAddress": "...",
"isNewUser": true,
"message": "Email verified. Authenticated as ..."
}
Notes:
lfi status --json#Shows current authentication state without a network call.
json
{
"ok": true,
"authenticated": true,
"userId": "...",
"role": "HUMAN",
"evmAddress": "0x...",
"solAddress": "...",
"expiresInSecs": 82340,
"expired": false
}
lfi whoami --json#Fetches the current user's profile from the server (requires valid token).
json
{
"userId": "...",
"role": "HUMAN",
"displayName": "",
"email": "user@example.com",
"evmAddress": "0x...",
"solAddress": "..."
}
lfi logout --json#Clears ~/.liberfi/session.json. The JWT is not revoked server-side.
Run this sequence at the start of any operation that requires authentication:
bash
# 1. Connectivity
lfi ping --json
# 2. Check session state
lfi status --json
Decision tree based on lfi status output:
authenticated``expiredActiontrue``falseProceed — session is validtrue``trueRe-authenticate (token expired)falseanyAuthenticate (no session)
Agent environment (automated):
bash
lfi login key --role AGENT --name "AgentName" --json
lfi whoami --json
Human user (interactive):
bash
lfi login user@example.com --json
# → prompt user to enter the 6-digit OTP code
lfi verify <otpId> <otp> --json
lfi whoami --json
FileContents~/.liberfi/session.jsonJWT, wallet addresses, key material for refresh~/.liberfi/keys/default.jsonP-256 key pair (permanent identity)~/.liberfi/keys/otp-pending.jsonTemporary key pair during email OTP flow
These files are created with mode 0600 (owner read/write only).
Never share or transmit these files.
After authentication, the user is assigned two server-owned TEE wallets:
WalletFieldDescriptionEVMevmAddressEthereum-compatible wallet (used for EVM swap operations)SolanasolAddressSolana wallet (used for SVM swap operations)
These wallets are managed by LiberFi's backend. The user's local P-256 private key is never used for on-chain signing.
Users who log in via the LiberFi website (social login) can exchange their identity token for a LiberFi JWT using:
text
POST /v1/auth/exchange
{ "identityToken": "<identity-token>" }
This is handled transparently by the website's auth handler — CLI users do not need to interact with this endpoint.
ErrorMeaningRecovery"signature verification failed"Invalid key or tampered timestampRe-generate key pair with lfi login key``"timestamp is outside the ±300s window"System clock skewSync system clock"OTP expired or not found"OTP TTL elapsed (5 min)Re-run lfi login <email>``"incorrect OTP code"Wrong 6-digit codeRe-enter code or re-run lfi login <email>``"invalid or expired token" on /auth/meJWT expired, refresh failedRe-authenticate401 on swap/tx commandsSession expiredRun lfi status then re-authenticate
See security-policy.md for global rules.
Skill-specific rules:
~/.liberfi/keys/default.json) must be kept secret.
Never log, display, or transmit its contents.ensureSession() is called before each API request.