convex-lisp

Tài liệu tham khảo ngôn ngữ Convex Lisp — quy ước CVM, gọi mã thư viện, định nghĩa actor, mã juice và lỗi. Sử dụng khi viết hoặc gỡ lỗi mã nguồn CVM cho…

npx skills add https://github.com/convex-dev/convex --skill convex-lisp

Convex Lisp

Shared conventions for all CVM source. The query, transact, deploy, token and transfer skills assume what is written here.

Units and Notation

  • Coin amounts are in copper. 1 CVM coin = 1,000,000,000 copper (10^9). Convert for display: report "1.5 CVM", not "1500000000".
  • Account addresses take a # prefix: #13, #1337.
  • CNS names take an @ prefix when resolved in source: @convex.fungible.

Calling Library Code

Resolve libraries through CNS rather than hardcoding addresses:

(@convex.fungible/balance #128 #13)

This is the idiom used throughout the codebase — match it. A let-bound address also works ((let [f @convex.fungible] (f/balance …))) and is occasionally tidier for repeated calls, but is rare in practice.

Never use import in query or transaction source. It mutates the account environment and costs extra juice on every transaction that carries it. Use the @name/fn form instead.

Library and actor bodies are different: they are deployed once, so an import at the top of a .cvx library resolves once and is idiomatic — the core libraries do it, for instance convex/trust/monitors.cvx. Do not "fix" those.

Actors

Actors are on-chain accounts with their own address, balance and state.

(deploy
  '(do
     (def counter 0)

     (defn ^:callable increment []
       (set! counter (+ counter 1))
       counter)))
  • ^:callable is the only export mechanism. There is no export form. The map form ^{:callable true} is equivalent and equally common in the core libraries.
  • defs in the actor body that are not ^:callable are private state. Update them from inside with set!.
  • deploy returns the new address. deploy also accepts a vector of code forms, which is how library builders are composed: (deploy [(build-token …) (add-mint …)]).
  • (set-controller #ADDR) sets who may upgrade the actor.

Juice and Memory

Transactions consume juice, paid in copper by the origin account, and consume memory allowance if they grow the state. Queries are free — they execute against current state and are discarded, so prefer a query whenever you only need to read.

See the juice skill for execution costs and memory for storage — including how to minimise and reclaim on-chain storage, which is worth reading before designing an actor that stores anything.

Error Codes

Errors surface as keywords. The ones you will actually hit:

CodeMeaning
:UNDECLAREDSymbol does not exist — usually a wrong function name
:CASTWrong type passed to a function
:ARGUMENTRight type, invalid value
:ARITYWrong number of arguments
:STATEOperation invalid for current state (e.g. missing callable)
:TRUSTCaller lacks rights for the operation
:FUNDSInsufficient coin balance
:JUICERan out of juice — transaction too expensive
:MEMORYInsufficient memory allowance
:NOBODYTarget account does not exist
:COMPILESource did not compile

:UNDECLARED on a library call almost always means the function name is wrong. Check the library source in convex-core/src/main/cvx/ rather than guessing — several plausible names (quantity, supply) do not exist.

Protocol Version

Write against protocol version 1 semantics — see the protocol-versions skill. Several core behaviours are fixed there rather than at genesis, so a network still at version 0 differs:

  • update and update-in drop an argument in their variadic (5+ arg) arities
  • quasiquote of a set or map containing an unquote yields a call form, ~false does not unquote, define evaluates its value twice, and call with too many arguments silently does nothing
  • dotimes, for, for-loop and switch can capture user variables in their expansions (#602) — v1 rebinds them hygienically
  • gensym, cat and splice do not exist (:UNDECLARED), and char? fails :CAST rather than :UNDECLARED — it is installed but version-gated, so do not read its pre-v1 failure as a missing function

If you hit one of these, it is a known genesis gap fixed by v1 — not something to work around in new code.

Thêm skills từ convex-dev

ecosystem
convex-dev
Định hướng trong hệ sinh thái Convex — thứ gì nằm trong repository nào, specs và docs ở đâu, và những thư viện client nào tồn tại. Sử dụng khi bạn cần ngữ cảnh…
local-network
convex-dev
Chạy mạng thử nghiệm Convex cục bộ để phát triển. Sử dụng khi kiểm tra các thay đổi với mạng trực tiếp, tái hiện sự cố của đồng nghiệp, hoặc khi không có mạng từ xa…
protocol-versions
convex-dev
Các phiên bản giao thức, di chuyển và nâng cấp v1 — nên viết theo ngữ nghĩa nào, và cách thay đổi hành vi CVM mà không fork mạng. Sử dụng khi…
etch
convex-dev
Kiểm tra và bảo trì một cửa hàng Etch — cơ sở dữ liệu định địa chỉ theo nội dung của Convex. Sử dụng khi kiểm tra bộ nhớ ngang hàng, chẩn đoán hỏng hóc, thu gom rác, hoặc…
juice
convex-dev
Hạch toán Juice — chi phí tính toán và băng thông trên CVM. Sử dụng khi phân tích chi phí thực thi giao dịch, chẩn đoán lỗi :JUICE, hoặc…
trust
convex-dev
Trust monitors — mô hình ủy quyền trên chuỗi có thể kết hợp của Convex. Sử dụng khi viết kiểm soát truy cập, hạn chế chức năng của tác nhân, xác định ai có thể mint hoặc…
memory
convex-dev
Kế toán và hạn mức bộ nhớ — chi phí lưu trữ trên chuỗi, và cách giảm thiểu cũng như thu hồi nó. Sử dụng khi suy luận về sự tăng trưởng trạng thái, chẩn đoán một…
peer
convex-dev
Vận hành một peer Convex — tạo, khởi động, liệt kê, sao lưu hoặc khởi tạo genesis mạng. Sử dụng khi chạy một peer với mạng hoặc thiết lập một mạng mới.