Function Attributes
Ursus uses attributes to control function behavior, visibility, code generation, and verification. Attributes are specified using the #[...] syntax before function definitions.
Syntax
#[attribute1, attribute2, ...]
Ursus Definition functionName (args): UExpression RetType panicFlag.
Visibility Attributes
#[public]
Makes function callable from outside the contract.
Example:
#[public]
Ursus Definition transfer (to: address) (amount: uint256):
UExpression boolean false.
Generated code:
function transfer(address to, uint256 amount) public returns (bool) {
...
}
#[external]
Function can only be called externally (not internally).
Example:
#[external]
Ursus Definition deposit: UExpression unit false.
Generated code:
function deposit() external {
...
}
#[internal]
Function can only be called internally.
Example:
#[internal]
Ursus Definition _validateAmount (amount: uint256): UExpression boolean false.
Generated code:
function _validateAmount(uint256 amount) internal returns (bool) {
...
}
#[private]
Function is private to the contract.
Example:
#[private]
Ursus Definition _calculateFee (amount: uint256): UExpression uint256 false.
Generated code:
function _calculateFee(uint256 amount) private returns (uint256) {
...
}
State Mutability Attributes
#[pure]
Function doesn't read or modify state.
Example:
#[pure]
Ursus Definition add (a b: uint256): UExpression uint256 false.
{
::// _result := a + b |.
}
return.
Defined.
Generated code:
function add(uint256 a, uint256 b) public pure returns (uint256) {
return a + b;
}
#[view]
Function reads but doesn't modify state.
Example:
#[view]
Ursus Definition balanceOf (account: address): UExpression uint256 false.
{
::// _result := balances[[account]] |.
}
return.
Defined.
Generated code:
function balanceOf(address account) public view returns (uint256) {
return balances[account];
}
#[payable]
Function can receive Ether/tokens.
Example:
#[payable]
Ursus Definition deposit: UExpression unit false.
{
::// balance := balance + msg->value |.
}
return.
Defined.
Generated code:
function deposit() public payable {
balance += msg.value;
}
#[nonpayable]
Function cannot receive Ether/tokens (default).
Example:
#[nonpayable]
Ursus Definition withdraw (amount: uint256): UExpression unit false.
Code Generation Attributes
#[translation = on]
Enable code generation for this function.
Example:
#[translation = on]
Ursus Definition transfer (to: address) (amount: uint256):
UExpression boolean false.
#[translation = off]
Disable code generation (proof-only function).
Example:
#[translation = off]
Ursus Definition helper_lemma: UExpression unit false.
#[language = solidity]
Generate Solidity code.
Example:
#[language = solidity]
Contract ERC20 ;
#[language = cpp]
Generate C++ code for TON.
Example:
#[language = cpp]
Contract TONToken ;
#[language = rust]
Generate Rust code.
Example:
#[language = rust]
Contract RustToken ;
Return Value Attributes
#[returns = varName]
Use named return variable.
Example:
#[returns = result]
Ursus Definition calculate (x: uint256): UExpression uint256 false.
{
::// result := x * {2} |.
}
return.
Defined.
Generated code:
function calculate(uint256 x) public returns (uint256 result) {
result = x * 2;
}
Parameter Attributes
#[write = arg]
Parameter is mutable (passed by reference).
Example:
#[write = balance]
Ursus Definition updateBalance (balance: uint256) (delta: uint256):
UExpression unit false.
{
::// balance := balance + delta |.
}
return.
Defined.
Interface Attributes
#[no_body]
Function declaration without implementation (interface).
Example:
#[no_body]
Ursus Definition transfer (to: address) (amount: uint256):
UExpression boolean false.
Generated code:
function transfer(address to, uint256 amount) external returns (bool);
Inheritance Attributes
#[override]
Function overrides parent implementation.
Example:
#[override]
Ursus Definition transfer (to: address) (amount: uint256):
UExpression boolean false.
Generated code:
function transfer(address to, uint256 amount) public override returns (bool) {
...
}
#[virtual]
Function can be overridden by children.
Example:
#[virtual]
Ursus Definition _beforeTransfer (from to: address) (amount: uint256):
UExpression unit false.
Generated code:
function _beforeTransfer(address from, address to, uint256 amount)
internal virtual {
...
}
Verification Attributes
#[quickchick = on]
Enable QuickChick testing for this function.
Example:
#[quickchick = on]
Ursus Definition transfer (to: address) (amount: uint256):
UExpression boolean false.
#[verified]
Mark function as formally verified.
Example:
#[verified]
Ursus Definition transfer (to: address) (amount: uint256):
UExpression boolean false.
Combining Attributes
Multiple attributes can be combined:
Example:
#[public, view, translation = on]
Ursus Definition balanceOf (account: address): UExpression uint256 false.
{
::// _result := balances[[account]] |.
}
return.
Defined.
Generated code:
function balanceOf(address account) public view returns (uint256) {
return balances[account];
}
Common Attribute Combinations
Public View Function
#[public, view]
Ursus Definition getBalance: UExpression uint256 false.
Payable External Function
#[external, payable]
Ursus Definition receive: UExpression unit false.
Internal Pure Helper
#[internal, pure]
Ursus Definition _min (a b: uint256): UExpression uint256 false.
Override Virtual Function
#[public, override, virtual]
Ursus Definition transfer (to: address) (amount: uint256):
UExpression boolean false.
See Also
- Writing Functions - Function development guide
- Contract Structure - Contract organization
- Code Generation - Compilation process