Treasury is a DAO that holds XTZ and FA2 tokens and lets its users decide how to spend its XTZ and tokens. Its extra storage data is a unit value and thus contains no data.
Its proposal_metadata contains proposal types:
- Transfer proposal that includes:
- a list of transfer instructions. Each item in this list can be either of an Xtz transfer, an FA2 token transfer or an FA1.2 token transfer. These alternatives are represented by the type,
(or (pair %xtz_transfer_type (mutez %amount) (address %recipient)) (or (pair %token_transfer_type (address %contract_address) (list %transfer_list (pair (address %from_) (list %txs (pair (address %to_) (nat %token_id) (nat %amount)))))) (pair %legacy_token_transfer_type (address %contract_address) (pair %transfer (address %from) (pair %target (address %to) (nat %value)))))) nat %agoraPostIDis used to refer to an Agora post explaining the proposed transfer and motivation for it.
- a list of transfer instructions. Each item in this list can be either of an Xtz transfer, an FA2 token transfer or an FA1.2 token transfer. These alternatives are represented by the type,
- Proposal to update the guardian address in the BaseDAO contract.
- This proposal takes an address parameter and use it to update the guardian address in the storage.
- Proposal to update the contract delegate.
- This proposal takes a
keyhashoptionparameter and usees it to update the delegate address of the contract. Please note that this different from theUpdate_delegateentrypoint which updates the delegates of an account.
- This proposal takes a
The proposer must lock frozen_scale_value * s + frozen_extra_value tokens where s = size(proposal_metadata).
I. e. s is total size of the transfers and post ID.
It should naturally prohibit spam proposals and too big proposals (unless frozen_scale_value is 0).
Additionally, we require s < max_proposal_size as a safety measure because too large proposals can be too costly to deal with in terms of gas.
max_proposal_size, frozen_scale_value and frozen_extra_value are parameters of the contract specified by the DAO creator.
Note that by setting frozen_scale_value to 0 it's possible to require a constant number of tokens to be locked.
For XTZ transfers their amount must be in range [min_xtz_amount .. max_xtz_amount].
max_proposal_size, frozen_scale_value, frozen_extra_value, min_xtz_amount and max_xtz_amount are parameters of the contract specified by the DAO creator.
Additionally, for XTZ transfers CONTRACT unit instruction must pass for the recipient address, i. e. this address must be an implicit account or refer to an entrypoint of the unit type.
When a proposal is rejected, the amount of tokens to slash is computed as
slash_scale_value * frozen / slash_division_value, just like in Registry DAO.
For the Transfer proposal, it makes all requested transfers one by one.
- In case of insufficient balance the decision callback can fail.
- For XTZ transfers it sends
amountto therecepientaddress withunitparameter. I. e. it returns a singleTRANSFER_TOKENSoperation. - For FA2 transfers it calls
transferentrypoint of thefa2contract with given argument. - For FA1.2 transfers it calls
transferentrypoint of thefa1.2contract with given argument.
- For XTZ transfers it sends
For the Update guardian proposal, it updates the guardian address in the storage.
Here is a summary of all the strings used as error messages thrown by proposal_check.
| Error | Description |
|---|---|
ZERO_MUTEZ |
Xtz transfer amount cannot be 0 |
LOW_XTZ |
Xtz transfer amount cannot be smaller than 'min_xtz_amount' |
HIGH_XTZ |
Xtz transfer amount cannot be bigger than 'max_xtz_amount' |
WRONG_TOKEN_AMOUNT |
Incorrect token amounts locked |
LARGE_PROPOSAL |
Proposal size is bigger than 'max_proposal_size' |
Treasury DAO does not contain any custom entrypoints and its custom entrypoint type is unit.