llms.txt Content
> ## Documentation Index
> Fetch the complete documentation index at: https://kamino.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.
> Complete documentation for Kamino Finance: Earn yield with automated vaults, Borrow and Lend, Multiply for leveraged positions, and concentrated liquidity on Solana. Developer Buildkit with REST API and TypeScript SDK. Curator tools for vault creation and management.
# Docs
export const ContactForm = () => {
const BUSINESS_TOPICS = ["Custom loan or yield solution", "Become a curator"];
const TOPICS = ["Custom loan or yield solution", "Become a curator", "API / SDK developer support", "Rust Crate developer support", "Report a bug", "Feature request", "Other"];
const TIMELINES = ["ASAP", "1-3 months", "3-6 months", "Just exploring"];
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
const EMPTY = {
fullname: "",
email: "",
topic: "",
company: "",
jobtitle: "",
timeline: "",
message: ""
};
const [values, setValues] = useState(EMPTY);
const [errors, setErrors] = useState({});
const [submitError, setSubmitError] = useState("");
const isBusiness = BUSINESS_TOPICS.includes(values.topic);
const setField = name => e => {
const value = e.target.value;
setValues(prev => ({
...prev,
[name]: value
}));
setErrors(prev => ({
...prev,
[name]: undefined
}));
};
const validate = () => {
const next = {};
if (!values.fullname.trim()) next.fullname = "Please enter your name.";
if (!EMAIL_RE.test(values.email.trim())) next.email = "Please enter a valid email address.";
if (!values.topic) next.topic = "Please select a topic.";
if (isBusiness && !values.company.trim()) next.company = "Please enter your company name.";
if (!values.message.trim()) next.message = "Please tell us what you have in mind.";
setErrors(next);
return Object.keys(next).length === 0;
};
const handleSubmit = e =