Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Address: 0x5ef79995FE8a89e0812330E4378eB2660ceDe699
B3TR is the incentive token of VeBetterDAO. Its functions include:
General incentive token for VeBetterDAO, including DAO Treasury Management
Value carrier and monetization mechanism for active participants and innovative enterprise models
Incentive token for sustainability applications
Back VOT3 tokens 1:1, the token required for VeBetterDAO governance
The total supply of B3TR is capped at 1,000,000,000 tokens, with a weekly issuance schedule carried out over 12 years.
Address: 0x76Ca782B59C74d088C7D2Cce2f211BC00836c602
VOT3 is the governance token of the VeBetterDAO. Its functions include:
Required to take part in governance
Convertible, 1:1 between B3TR and VOT3
You can convert back and forth between B3TR and VOT3 whenever you want, with the only limitation that you cannot convert VOT3 tokens sent to you by other wallets into B3TR, just the amount you originally converted.
The Treasury is the beating heart of any DAO, representing the store of wealth and source of funds for the ecosystem. Adhering to the core principles of Web3, the VeBetterDAO Treasury will be transparent, fiscally efficient, and auditable.
Treasury management follows the rules and protocols defined in VeBetterDAO Governance. The uncompromising principle of the Treasury Pool is that tokens will only be used for expanding and building the VeBetterDAO ecosystem, making the world better in the process.
Treasury will hold all assets belonging to the DAO. Such assets include VET
, VTHO
, B3TR
, VOT3
and any other ERC-20
or ERC-721
tokens that have been transferred to the Treasury contract address.
Tokens can only be transferred from the Treasury to another address via a governance proposal. The same goes for converting to B3TR
/ VOT3
.
Token balances can be viewed by anyone by calling one of the balance functions.
In the case that the Treasury needs to stop all transactions, the smart contract can be paused.
This contract cannot transfer tokens out that are non-native or non ERC-721 or ERC-20.
Function
Access Control
Description
pause()
Contract Admin
Pause contract so no transfers can be carried out
upgradeToAndCall()
Upgrader Role
Upgrade implementation contract
transferVTHO()
Governance
Withdraw VTHO from treasury
transferB3TR()
Governance
Withdraw B3TR from treasury
transferVOT3()
Governance
Withdraw VOT3 from treasury
transferVET()
Governance
Withdraw VET from treasury
transferTokens()
Governance
Withdraw any erc-20 token from treasury, address needs to be passed in so that contract can be interacted with
transferNFT()
Governance
Withdraw any NFT from treasury address needs to be passed in so that contract can be interacted with
convertB3TR()
Governance
Converts B3TR for VOT3
convertVOT3()
Governance
Converts VOT3 to B3TR
Each token has a transfer limit in place to avoid moving huge sums of money in a single operation. Those limits can be updated by governance and are token-specific.
Current limits are:
200,000 VET
200,000 B3TR
3,000,000 VTHO
50,000 VOT3
B3TR tokens are emitted weekly to three pools based on the schedule outlined in the next section. A smart contract is required to control these emissions.
B3TR token has ~1 billion total supply, that will be emitted weekly over a period of 634 weeks or 12 years.
N.B. We will use the term cycle instead of week when referring to the emissions schedule.
The Emissions smart contract contains parameters for the emissions scheduling.
Emissions need some sort of trigger, as it is not possible for a smart contract to invoke itself. There is a public function that can be triggered by any account. In addition to this, the foundation automatically triggers the emissions, if this operation fails, any other user can trigger it.
The pool’s purpose is to finance sustainable apps that join the VeBetter ecosystem. The purpose of the apps is to use those tokens to reward and incentivize sustainable actions through their applications.
Distribution of B3TR from the x-allocation pool to the apps happens in cycles, which we will refer to from now on as rounds. Each round will last 1 week, and funds will be distributed once the round ends.
Apps receive B3TR tokens based on the support that they receive from the VOT3 holders through voting.
All unallocated funds of that round are sent to the Treasury contract.
Voting Token: The token used for voting is VOT3.
Voting Frequency: Each round of voting lasts one week, though this period could change in the future.
Votes Snapshot: The VOT3 holdings and better action are snapshotted at the start of each round. VOT3 tokens acquired and better action done after that moment won't be considered when casting the vote.
Voting Flexibility: Within each round, users can vote only once but have the flexibility to allocate their votes among multiple apps. For example, a user with 100 VOT3 might assign 30 VOT3 to app #1, 20 VOT3 to app #2, and 50 VOT3 to app #3.
Resetting Votes: At the beginning of each round, all previous votes are reset, requiring users to cast their votes again. This design encourages the community to return and vote regularly, hence the introduction of a "vote-2-earn" mechanism, where users are rewarded for voting.
Allocation Shares: At the end of each round, the smart contract calculates the ranking and determines the distribution of funds among the apps.
Quorum Requirements: To ensure broad community involvement, each round must meet a specific quorum to validate the results. If the quorum is not reached, the distribution still occurs but is based on the percentages from the last valid round.
Each emission distribution starts a new allocation round for x2earn applications.
At the start of each round, a snapshot of the VOT3 holdings is made.
There can be only two possible outcomes of a round: it succeeds or fails. To succeed the only requirement is that the quorum, which is currently 1% of total VOT3 supply, is reached.
A user can cast his votes only when the round is active and only one time per round, by passing an array of x-application IDs and the fraction of votes he wants to allocate to each.
Allocation Structure: The distribution from the X-Allocation Pool to the apps is divided into two parts:
30% is evenly distributed among all qualified applications, ensuring a base level of funding for each app.
70% is distributed based on the percentage of votes each app receives.
Cap on Allocation: To prevent any one project from dominating, there's a cap on how much each app can receive from the 70% pool. This cap ensures that at least six projects participate in the voting each week.
Redistribution: Any leftover funds from the X-Allocation Pool will be sent to the Treasury and can be redistributed through DAO voting.
Both the minimum and maximum caps can be changed by the governance.
When the quorum is not reached during an allocation voting round, it can impact the distribution process. Let's assume we have 2 rounds, where the first one succeeded and the second one did not, here is how it would work:
Total Funding for Current Round: The total amount for distribution is derived from the current round, regardless of what happened in previous rounds.
Example: If Round 1 had 90,000 B3TR to distribute, but Round 2 had 80,000, the allocations in Round 2 will use the 80,000 units as the funding pool.
Base Allocation: Every application in the current round receives a minimum allocation from the total funding pool, even if the quorum isn't met. This is calculated based on the current round's funding amount.
Variable Allocation: This additional funding is determined by the voting results from the last successful round (e.g., if Round 1 succeeded, the votes from that round influence allocations in Round 2).
If quorum fails in the current round, variable allocations calculation will rely on the last successful round votes.
New applications in a failed round, with no previous votes to draw from, will only receive the base allocation.
Distributions are not automatically sent by the contract but need to be triggered. The claim
function is public and anyone can claim the allocation for the apps. The VeBetterDAO team however created a scheduler service to execute this action at the start of each new round.
Quadratic Funding (QF) is a mechanism used by VeBetter DAO to amplify available resources and democratize fund allocation.
In this system, the proportion of the emissions pool allocated to each project is calculated by squaring the sum of the square roots of individual votes for the project and then normalizing this by the square of the total votes across all projects
where j indexes the voters for each project
where j indexes the voters, and k indexes all projects considered in the QF model for the round.
This formula ensures that the allocation is heavily influenced by the number of distinct supporters rather than the sum of their votes alone. As a result, projects that have broader community support, regardless of the size of individual votes, receive a more significant portion of the emissions pool.
This funding model emphasizes community consensus, ensuring that projects with the widest appeal, rather than those with the most concentrated VOT3 backing, receive the greatest B3TR allocation.
By default, QF is enabled for all voting rounds. However, admins have the option to disable QF. If QF is disabled, linear voting will be used, where the allocation is directly proportional to the number of votes received.
Important Note: If QF is disabled by an admin in the middle of a round, the change will only take effect starting from the following round.
The following properties can be updated by the governance:
Voting Period: currently this equals Emission's cycles, and can never be higher than it.
Quorum: percentage of VOT3 / Total supply participating in allocation voting.
Base Allocation Percentage: percentage of round allocations to be divided among the apps each round, currently set at 30%.
Allocation Cap: the maximum amount of votes (in percentage) that an app can receive, currently set at 20%.
Voting Eligibility: To be able to vote, users must be verified as real persons. Each user needs to prove they have completed 3 better actions within the last 12 rounds. These actions are subject to A "better action" is defined as receiving a reward from an app for performing a sustainability-related activity.
Pool
% of total supply
Initial emissions
Decay Rate
X-Allocations
53%
2,000,000
4% every 12 cycles
Vote2earn
27%
Follows the X-Allocation emissions but with an additional decay rate applied
20% of x-allocations emissions every 50 cycles
Treasury
20%
25% of total allocation for X-Allocations and Vote2earn
No decay as pegged to the other emission
Param
Value
Upgradeable
X-Allocations address
0x4191776F05f4bE4848d3f4d587345078B439C7d3
Yes
Vote2earn address
0x838A33AF756a6366f93e201423E1425f67eC0Fa7
Yes
Treasury address
0xD5903BCc66e439c753e525F8AF2FeC7be2429593
Yes
Total supply
1B
No
Emissions frequency (cycle length)
1 week
Yes
X-Allocations decay rate
4%
Yes
X-Allocations decay frequency
every 12 cycles
Yes
Vote2earn decay rate
20%
Yes
Vote2earn decay frequency
every 50 cycles
Yes
Treasury % allocation
25% of total emissions for the cycle
Yes
The ‘X’ in X-2-Earn refers to the mathematical concept of the unknown variable. ‘X’ can be applied to any kind of sustainability ecosystem with an earn mechanism. For example, ‘Plant-2-Earn', for an ecosystem that rewards tree planting. Sweat-2-Earn, for dApps that reward working out, and so on. B3TR tokens distributed to X-2-Earn dApps are, in part, intended as a source of incentivization for users. They may serve other purposes, such as encouraging builders, or for marketing and sponsorships etc. B3TR reward distribution plans are at the discretion of projects and the voting community who will approve or disapprove of a project’s reward proposals through voting.
As of the beginning of November, VeBetter DAO allows apps to join the ecosystem through the endorsement of VeChain node holders. This shift from admin-controlled app selection to vechain community-based endorsement reflects the DAO’s commitment to decentralization.
Background Check and Creator NFT Requirement: XApp creators begin by filling out a form on the VeBetter DAO platform to initiate the process. If they pass the screening, they are minted a Creator NFT, which verifies them for participation in the endorsement process.
On-Chain XApp Submission: Once they have received the Creator NFT, XApp creators can submit their XApp on-chain for endorsement consideration. This submission officially registers the XApp on the VeBetter DAO platform, pending endorsements from VeChain node holders.
Connecting with Endorsers: After receiving the Creator NFT, XApp creators gain access to the VeBetter DAO Discord server, where they can connect with VeChain node holders who may endorse their XApp. This community platform allows them to build relationships with potential endorsers and formally submit their XApp for consideration on the VeBetter DAO platform.
XApp Endorsement: XApps must accumulate an endorsement score of 100 to become eligible for allocation rounds. Achieving this threshold enables an XApp to participate in weekly rounds to receive a share of the B3TR allocation pool.
VeChain node holders are key decision-makers in the X2Earn endorsement process. Each type of VeChain node, represented by an NFT in the holder’s wallet, has an assigned endorsement score based on its level. These scores determine the impact each endorsement has on an XApp’s eligibility.
Strength
2
Thunder
13
Mjolnir
50
VeThorX
3
StrengthX
9
ThunderX
35
MjolnirX
100
A wallet can only hold one of these VeChain Node NFTs at a time, and to obtain a node, users must maintain a specific amount of VET in their wallet (see vechain nodes for more info). The cumulative endorsement scores from nodes determine an XApp’s eligibility to join VeBetter DAO and participate in allocation rounds.
Once an XApp is endorsed, reaching a cumulative endorsement score of 100, it becomes eligible to receive funds in the allocation rounds. This eligibility can be adjusted by VeChain node holders based on the app's performance and compliance.
An XApp is officially considered endorsed when it accumulates an endorsement score of 100. This score is the sum of all VeChain node endorsements for the app. Upon reaching this threshold, the XApp automatically qualifies for the next XAllocation Voting round and will continue participating in future rounds as long as its score remains at or above 100.
Endorsement Limitations: Each VeChain Node NFT can endorse only one XApp at a time. Similarly, each account can endorse only one XApp unless it leverages the NodeManagement contract to delegate multiple VeChain nodes.
Endorsement Cap: Once an XApp reaches the endorsed status with a score of 100, it cannot receive additional endorsements from other nodes.
Node holders have the authority to withdraw their endorsement if they no longer wish to support a specific XApp. If an XApp’s score falls below the 100-point threshold, it enters a grace period. During this time, the XApp has a limited opportunity to regain endorsements and restore its score to 100. If it fails to meet this requirement before the grace period ends, it will be removed from the XAllocation voting round.
Retention of Past Allocations: Although the XApp is removed from future allocation rounds, it still retains any allocations received from previous rounds. The XApp may rejoin allocation rounds if it regains the necessary endorsement score of 100.
To ensure the consistency and validity of endorsements, VeBetter DAO conducts periodic checks on endorsing nodes.
When your app is submitted to the contract an appId
is generated by hashing the app name. This id cannot be updated in the future, even if you change the name of your app.
Authorized apps can report addresses they have banned, such as looters, bots or scammers. This helps VeBetterDAO and other apps detect and defend against harmful activity across the ecosystem.
If an address is flagged by mistake, VeBetterDAO or selected app admins can review the case and reset its signal counter.
Community Dashboard: https://vechain-energy.github.io/vebetterdao-signal-admin/ Build by the community, this dashboard shows all signaled wallets.
When an app is added the following information is saved on-chain:
name: the name of the app, cannot change once it's added.
app ID: is the hash of the name of the app (from the previous point) and it's used as a unique identifier across all the smart contracts; once the app is added and this ID is generated it cannot be updated.
receiver address: this is the address where the app will receive the allocation funds, also addressed to as "Treasury address".
creation timestamp: the timestamp when the app was added.
metadata URI: the IPFS CID containing all the information of the app, which will be used by the frontend to display the app details.
moderators: a list of addresses that can update the metadataURI of an app.
admin: this address can add/remove moderators, change the receiver address, transfer ownership to another admin, and update the metadata URI of the app.
The metadata URI needs to follow the following standard:
The B3TR contract was verified on Sourcify and can be reviewed at the following URL: https://repo.sourcify.dev/100009/0x5ef79995FE8a89e0812330E4378eB2660ceDe699
More contracts were verified on Sourcify, so just search on Sourcify the contract address you want to audit.
Anyone holding VOT3 is a member of the DAO and can take part in voting events. VOT3 is the VeBetterDAO’s governance token, required to vote, and obtained by swapping from B3TR at a 1:1 ratio. All members can vote on proposals, participate in governance discussions, and access the Treasury, with the only minimum requirement of holding at least 1 VOT3 token. This ensures we can foster an inclusive, engaging environment for everyone.
At launch, VeBetterDAO will adhere to an initial set of governance rules until it has run for one year without any technical interruptions. The Stabilization Period is critical for ensuring the long-term efficacy and viability of VeBetterDAO. To prevent exploits during the Stabilization Period, VeChain Foundation maintains the ability to pause & restart B3TR token minting, only in the case of an exploit or other major issue. Once the requirements of the Stabilization Period have been met, community stakeholders can maintain or deprecate this functionality through governance.
Proposals are the backbone of any DAO, and the community is a key part of the proposal process. VeBetterDAO will maintain a forum for proposal submission, discussion, and voting. The forum will feature a dashboard detailing voting results, historical records, and proposal details. For a proposal to reach the final stages and be implemented, it must go through a predefined process, including initial forum-based community discussion, and a community ‘temperature check,’ before on-chain voting and implementation.
Every time a proposal is created, a deposit threshold of VOT3 tokens, calculated upon the total supply of B3TR, is calculated and must be met for the proposal to become active.
This deposit functions as a temperature check—if the community believes the proposal is worth considering, they can contribute a certain amount of VOT3. If enough VOT3 is deposited (reaching the threshold) before the end of the waiting period, the proposal becomes active; otherwise, it is automatically canceled.
Users can withdraw their VOT3 deposits once the proposal is canceled or the voting period starts.
While tokens are locked for supporting the proposal they cannot be used to vote in allocation rounds or other proposals. This means that if we are in Round #2 and you support a proposal that will start in Round #4 you won't be able to access those tokens/vote in Round #3 and Round #4.
The governance process is the following: propose → vote → execute if succeeded.
Let's break it down:
Everyone can create a proposal. When creating a proposal the user specifies a description and an action to be performed on proposal success. The action can be: - Call the function x() of the contract with address 0x00000 with the following parameters. - Call multiple functions of different contracts with different parameters in a specific order. - Do nothing. E.g.: “Let’s add feature X”. Even if the outcome is “YES” there is no on-chain action to perform immediately because it needs off-chain developers' involvement. When the proposal is created a snapshot of the total supply of VOT3 tokens and balances of each VOT3 holder is taken and used to calculate individual voting power. Proposals are aligned with the allocation rounds voting periods, so the proposer must also specify the round when the proposal should become active.
After the proposal is created there is a waiting period before the proposal becomes active (can receive votes). During this waiting period, there is a temperature check and the community must fund the proposal with VOT3 tokens. Each proposal has a deposit threshold to reach, and if this threshold is not reached then the proposal gets automatically canceled. During this waiting period, the proposal can be canceled by the user who created it or by an admin of the DAO.
Once the proposal is active VOT3 holders can vote AGAINST/YES/ABSTAIN for that proposal. Each proposal will remain active for the duration of the round. When you cast your vote all 100% of your voting power will be used.
Once the voting period is over, if the quorum is reached and the majority voted in favor, the proposal is considered successful and can proceed to be executed. A Timelock is used for this operation, which adds a delay to proposal execution.
Quorum is 30% of the total supply of VOT3. All types of votes (yes, no and abstain) are considered when calculating if quorum is reached.
Voting rewards are distributed regardless of what type of vote was cast.
If a quorum is not reached then the proposal is considered defeated.
If a quorum is reached then "yes" and "no" votes are counted, if "yes" votes are more than "no" votes then the proposal is considered succeeded.
Voting rewards are distributed regardless of the vote outcome.
The VeBetterDAO's Governance contract can execute actions on all contracts deployed on the vechain blockchain, provided the respective contracts permit those actions.
We added a timelock to governance decisions, this allows users to exit the system if they disagree with a decision before it is executed. We are using OpenZeppelin’s TimelockController in combination with the GovernorTimelockControl module to achieve this. To execute a proposal it first needs to be queued to Timelock contract and wait a specified amount of time before being able to execute it.
Initially only selected admins will be able to execute proposals.
For DAOs that use the Governor contract (as we do), only delegated tokens can participate in voting. What does this mean for you, a token holder?
You must set up delegation if you want to participate in governance votes. This includes delegating to others or voting yourself.
If you wish to vote on proposals directly, delegate your voting power to your own address. Or, you can delegate your voting power to another community member and let them vote on your behalf.
Currently, we have an auto-delegation feature in our smart contract that will automatically delegate to you when you convert B3TR to VOT3 or someone sends you VOT3 tokens. However this auto-delegation feature is not enabled for smart contracts, so if you are writing a smart contract that wants to receive VOT3 tokens and participate in governance you will need to manually delegate. This needs to be done only once.
🚨 Note: QV is currently disabled starting from Round 12 onwards. Linear voting is now in effect (see details below).
Quadratic Voting (QV) is a method used to re-calibrate voting power within the VeBetter DAO, specifically for the B3TR Governance
model. Unlike traditional voting mechanisms that may disproportionately empower large token holders, QV modifies this by determining voting power based on the square root of the number of VOT3 tokens held. This approach ensures that while voting power increases with more tokens, it does so at a diminishing rate.
The formula shown below reduces the influence larger stakeholders might have, promoting a more balanced and fair decision-making process.
Each voter casts their vote as FOR, AGAINST, or ABSTAIN on proposals, with the effective weight of these votes directly linked to their recalculated voting power. This structure not only aligns with standard quadratic voting practices but also ensures governance is more reflective of the wider community preferences.
By default, QV is enabled for all voting rounds. However, governance and admins can choose to disable QV, switching to linear voting. In linear voting, voting power is directly proportional to the number of VOT3 tokens a user holds.
Important Note: If QV is disabled by an admin during an ongoing round, the change will only take effect starting from the next round.
The following parameters can be updated by governance:
Quorum: currently set at 30% of total VOT3 supply
Deposit Threshold: percentage of the total supply of B3TR tokens that need to be deposited in VOT3 to create a proposal, currently set at 2%
Voting Threshold: the minimum amount of tokens needed to cast a vote, currently set at 1
Minimum Voting Delay: the minimum delay a proposal must be in a PENDING state before voting can start, currently set at 3 days
Timelock Minimum Delay: time to wait before a proposal can be executed after it was queued
Voting Period: the duration of the proposal; it is not possible however change this on the governance contract itself since it's aligned with the Emissions cycles, so the cycle duration should be updated to see the same changes in governance.
Enable / Disable Functions Restrictions: if disabled there isn't any restriction on what contracts and functions can be called when creating a proposal
Whitelist Functions: if function restrictions are enabled then whitelist a target and function
List and description of all smart contracts of VeBetterDAO.
Putting it all together we get a picture of the connections of all smart contracts with hierarchies and usages between each other.
The following is the list of all smart contracts listed alphabetically:
This contract governs the issuance and management of B3TR fungible tokens within the VeBetter ecosystem, allowing for minting under a capped total supply.
Extends ERC20 Token Standard with capping, pausing, and access control functionalities to manage B3TR tokens in the VeBetter ecosystem.
Address: 0x5ef79995FE8a89e0812330E4378eB2660ceDe699
This contract implements an upgradeable proxy for all of our upgradeable contracts. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.
Forked from Openzeppelin.
This contract is the main governance contract for the VeBetterDAO ecosystem. Anyone can create a proposal to both change the state of the contract, to execute a transaction on the timelock or to ask for a vote from the community without performing any on-chain action. In order for the proposal to become active, the community needs to deposit a certain amount of VOT3 tokens. This is used as a heath check for the proposal, and funds are returned to the depositors after vote is concluded. Votes for proposals start periodically, based on the allocation rounds (see xAllocationVoting contract), and the round in which the proposal should be active is specified by the proposer during the proposal creation.
A minimum amount of voting power is required in order to vote on a proposal. The voting power is calculated through the quadratic vote formula based on the amount of VOT3 tokens held by the voter at the block when the proposal becomes active.
Once a proposal succeeds, it can be executed by the timelock contract.
The contract is upgradeable and uses the UUPS pattern.
Manages the governance process for the VeBetterDAO ecosystem, allowing users to create and vote on proposals with VOT3 token deposits. This contract leverages OpenZeppelin's AccessControl and UUPSUpgradeable libraries for role-based access control and upgradeability. The core functionality, including proposal management, voting mechanisms, quorum calculations, and deposit logic, is modularly organized in external libraries, ensuring maintainability, flexibility, and ease of upgrades.
Address: 0x1c65C25fABe2fc1bCb82f253fA0C916a322f777C
This contract is responsible for the scheduled distribution of emissions based on predefined cycles and decay settings.
Manages the periodic distribution of B3TR tokens to XAllocation, Vote2Earn, and Treasury allocations. This contract leverages openzeppelin's AccessControl, ReentrancyGuard, and UUPSUpgradeable libraries for access control, reentrancy protection, and upgradability.
Address: 0xDf94739bd169C84fe6478D8420Bb807F1f47b135
This contract manages the unique assets owned by users within the Galaxy Member ecosystem.
Extends ERC721 Non-Fungible Token Standard basic implementation with upgradeable pattern, burnable, pausable, and access control functionalities.
Address: 0x93B8cD34A7Fc4f53271b9011161F7A2B5fEA9D1F
This contract acts as a proxy between Vechain Node Contracts and VeBetter DAO, enabling node holders to delegate and manage multiple nodes within a single account.
Address: 0xB0EF9D89C6b49CbA6BBF86Bf2FDf0Eee4968c6AB
This contract is used to perform the actions of the B3TRGovernor contract with a time delay. The proposers and executors roles should be assigned only to the B3TRGovernor contract.
Address: 0x7B7EaF620d88E38782c6491D7Ce0B8D8cF3227e4
This contract is designed to manage all assets owned by the VeBetter DAO
This contract handles the receiving and transferring of assets, leveraging upgradeable, pausable, and access control features.
Address: 0xD5903BCc66e439c753e525F8AF2FeC7be2429593
This contract governs the issuance and management of VOT3 tokens, which are the tokens used for voting in the VeBetter DAO Ecosystem.
Extends ERC20 Fungible Token Standard basic implementation with upgradeability, pausability, ability for gasless transactions and governance capabilities.
Address: 0x76Ca782B59C74d088C7D2Cce2f211BC00836c602
This contract handles the rewards for voters in the VeBetterDAO ecosystem. It calculates the rewards for voters based on their voting power and the level of their Galaxy Member NFT.
The contract is
upgradeable using UUPSUpgradeable.
using AccessControl to handle the admin and upgrader roles.
using ReentrancyGuard to prevent reentrancy attacks.
using Initializable to initialize the contract.
following the ERC-7201 standard for storage layout.
Address: 0x838A33AF756a6366f93e201423E1425f67eC0Fa7
This contract handles the x-2-earn applications of the VeBetterDAO ecosystem. The contract allows the insert, management, and eligibility of apps for the B3TR allocation rounds.
The contract is using AccessControl to handle the admin and upgrader roles. Only users with the DEFAULT_ADMIN_ROLE can add new apps, set the base URI, and set the voting eligibility for an app. Admins can also control the app metadata and management. Each app has a set of admins and moderators (built without using AccessControl) that can manage the app metadata and management.
Address: 0x8392B7CCc763dB03b47afcD8E8f5e24F9cf0554D
This contract is designed to manage new XApp submissions within VeBetter DAO, ensuring only verified creators can enter the ecosystem. This contract supports Creator NFTs, non-transferable ERC721 tokens, to grant creators access to the endorsement process.
Extends ERC721 Non-Fungible Token Standard basic implementation with upgradeable pattern, pausable, and access control functionalities.
Address: 0xe8e96a768ffd00417d4bd985bec9EcfC6F732a7f
This contract is used by x2Earn apps to reward users that performed sustainable actions. The XAllocationPool contract or other contracts/users can deposit funds into this contract by specifying the app that can access the funds.
Admins of x2Earn apps can withdraw funds from the rewards pool, which are sent to the team wallet address. The contract is upgradeable through the UUPS proxy pattern and UPGRADER_ROLE can authorize the upgrade.
Address: 0x6Bee7DDab6c99d5B2Af0554EaEA484CE18F52631
This contract receives B3TR tokens from the Emissions contract and distributes them to the rewards pool contract and x2earn apps based on the allocation round outcome. Funds can be claimed at the end of each allocation round.
Interacts with the Emissions contract to get the amount of B3TR available for distribution in each round, and the x2EarnApps contract to check app existence and receiver address. The contract is using AccessControl to handle roles for upgrading the contract and external contract addresses.
Address: 0x4191776F05f4bE4848d3f4d587345078B439C7d3
This contract handles the voting for the most supported x2Earn applications through periodic allocation rounds. The user's voting power is calculated on his VOT3 holdings at the start of each round, using a "Quadratic Funding" formula.
Rounds are started by the Emissions contract. Interacts with the X2EarnApps contract to get the app data (eg: app IDs, app existence, eligible apps for each round). Interacts with the VotingRewards contract to save the user from casting a vote. The contract is using AccessControl to handle roles for admin, governance, and round-starting operations.
Address: 0x89A00Bb0947a30FF95BEeF77a66AEdE3842Fe5B7
The B3TR Multisig contract facilitates multisignature operations for enhanced security and collaborative management of the wallet. This contract requires approvals from multiple stakeholders before any transaction can be executed, ensuring that all actions are transparent and consensual.
This contract is not upgradable.
Some contracts (eg: B3TRGovernor) store their logic inside libraries to optimize the contract size. The following is the list of libraries we created and the addresses they are deployed to.
Library for managing the clock logic as specified in EIP-6372, with fallback to block numbers.
This library interacts with the IVOT3 interface to get the clock time or mode.
Library for managing the configuration of a Governor contract.
This library provides functions to set and get various configuration parameters and contracts used by the Governor contract.
Library for managing deposits related to proposals in the Governor contract.
This library provides functions to deposit and withdraw tokens for proposals, and to get deposit-related information.
Library for managing function restrictions within the Governor contract.
This library provides functions to whitelist or restrict functions that can be called by proposals.
Library for managing proposals in the Governor contract.
This library provides functions to create, cancel, execute, and validate proposals.
Library for managing quorum numerators using checkpointed data structures.
Library for Governor state logic, managing the state transitions and validations of governance proposals.
Library for handling voting logic in the Governor contract.
In B3TRGovernor
we are utilizing libraries inside some of the modules. To upgrade the functionalities inside these libraries the following steps must be done.
Update library
Deploy new library
Deploy new implementation contract connecting updated library with new library address
Upgrade the proxy to use this new implementation smart contract using the upgradeToAndCall
function .
B3TR tokens will be sent weekly to the Vote2Earn pool. The purpose of these funds and this pool is to incentivize people to engage in the platform by voting on proposals and allocation rounds. B3TR tokens will be rewarded to users who have voted in the previous voting cycle, both in general governance proposals and allocation rounds.
All funds received by the Vote2Earn pool as part of the B3TR emissions will be used as voter rewards.
VeBetter DAO utilizes an upgradeable NFT system, the Galaxy Member (GM) NFT, to determine user privilege and reward levels. The higher your GM NFT level, the greater the B3TR token rewards you can earn during governance and xallocation voting participation.
There are two ways to upgrade your GM NFT:
Using B3TR Tokens:
Donate the required B3TR tokens to upgrade your GM NFT level.
Each level requires progressively more B3TR to unlock.
For Free (Node Holders):
Maximized Rewards:
Higher levels provide greater multipliers for governance rewards.
Flexibility:
Use B3TR for upgrades or enjoy free upgrades as a VeChain Node holder.
Dynamic Participation:
Contribute actively to the ecosystem with enhanced rewards.
By participating in governance and upgrading your GM NFT, you can maximize your rewards and actively contribute to the growth of the VeBetter DAO ecosystem.
1) First calculate the weighted vote for a single user:
Where:
t is the amount of VOT3 tokens held by the user at the snapshot
NFTMultiplier is the level multiplier percentage for the voter's Galaxy Member NFT level
2) Then, calculate the total weighted votes for the cycle (by summing votes from all users):
3) Finally, calculate the reward:
Given:
Total participants: 1,000 voters
Emissions (E): 1,000,000 B3TR
Voter's votes (V): 10,000
Level multiplier (M): 10%
Total weighted votes from all participants: 5,300,000
Calculation:
This means out of 1,000 participants, this voter's 11,000 weighted votes represent about 0.2075% of all weighted votes, earning them 2,075 B3TR from the emission pool.
Quadratic Rewarding (QR) in VeBetterDAO is the approach used for distributing voting rewards. Under QR approach, the rewards a user receives will be determined by the square root of their VOT3 token holdings. This method ensures that while users with more tokens still receive higher rewards, the rate of increase in rewards does not grow linearly with the number of tokens held. Instead, it rises at a decreasing rate, promoting a fairer distribution of rewards and helping to close the wealth gap within our community.
QR divides rewards into two categories based on the type of voting: X Allocation and General Governance. Both types incorporate an NFT Multiplier to adjust the influence of a user’s tokens based on their GM NFT level, promoting active and sustained participation.
where:
where:
VeBetterDAO is a decentralized organization fostering sustainability through the B3TR token. VOT3 governs the DAO, allowing community-driven decisions.
B3TR Token: The incentive ERC-20 token with a 1 billion cap, used within the ecosystem for rewards and governance.
Governance System:
B3TRGovernor: Facilitates decentralized governance where any community member can create proposals. Proposals require a deposit of VOT3
tokens to become active, and successful proposals are executed via the TimeLock
contract.
TimeLock: Ensures a time delay in the execution of governance decisions for security and transparency.
Incentive Mechanisms:
Emissions: Manages the periodic distribution of B3TR
tokens to various allocations including XAllocation
, Vote2Earn
, and Treasury.
VoterRewards: Rewards voters based on their voting power and Galaxy Member
NFT level.
X2Earn Apps and Rewards: Supports x-2-earn applications by managing the insertion, management, and eligibility of apps for B3TR
allocation rounds. Rewards users for sustainable actions within these apps through the X2EarnRewardsPool
.
User Privileges and Rewards:
GalaxyMember: An upgradeable NFT system that determines user privileges and B3TR
token rewards based on the NFT level.
Asset Management:
Treasury: Holds all DAO assets, including various ERC-20 and ERC-721 tokens. Asset transfers are governed by community proposals.
Voting and Allocation:
XAllocationPool: Distributes weekly B3TR
emissions for x2earn apps.
XAllocationVoting: Manages voting for x2Earn application support, using a "Quadratic Funding" formula to calculate voting power based on VOT3
holdings.
VeBetterDAO leverages these contracts to create a robust and democratic ecosystem where community members can actively participate in governance, earn rewards, and contribute to the platform's growth.
Contracts have been deployed on the vechain mainnet at the following addresses.
Roles define the permissions and access levels across different contracts and modules. This page outlines the structure of roles, their functions, and the path toward full decentralization.
To maintain a secure and flexible smart contract system, we leverage roles to manage administrative tasks and define who has the authority to perform specific actions. These roles control everything from minting tokens to upgrading contracts, pausing operations, and setting governance parameters.
The central goal of this structure is to gradually decentralize power from individual wallets to the DAO (the B3TRGovernor governance contract).
This document categorizes roles and outlines their functionalities, detailing what permissions each role grants. Here's a quick summary of some common roles and what they do:
DEFAULT_ADMIN_ROLE: The superuser role with the ability to grant, revoke, and renounce roles.
PAUSER_ROLE: Controls the ability to pause and unpause contract functionality.
MINTER_ROLE: Allows for token minting.
UPGRADER_ROLE: Permits contract upgrades and modifications.
CONTRACTS_ADDRESS_MANAGER_ROLE: Manages critical contract addresses.
DECAY_SETTINGS_MANAGER_ROLE: Manages parameters surrounding cycle lengths, allocation percentages and decay rates in the Emission contract.
GOVERNANCE_ROLE: Involved in governance decisions, proposal management, and voting.
All roles have in common the following functionality: they can renounce that role.
Once there isn’t any address that has the DEFAULT_ADMIN_ROLE then it won’t be possible to grant or revoke any role. If some contract is upgradeable and the DAO has the UPGRADER_ROLE then the DAO could decide to upgrade the contract and assign the role to whoever they want.
The ultimate aim is to create a self-governing system where no single entity holds absolute control. This section of the page provides a detailed plan for achieving this goal, outlining the steps for transitioning roles to the B3TRGovernor contract, removing direct admin control, and enabling decentralized governance.
Follow the outlined steps to understand the current state of role assignments and the specific actions required to achieve a more autonomous system. Through this journey, we aim to establish a resilient and community-driven ecosystem where the power of decision-making rests in the hands of the DAO and its stakeholders.
NB: This contract will be upgraded to handle app endorsement, so the “Add app” functionality triggered by a GOVERNANCE_ROLE could be removed in a future release
Contracts can be found at the following repository:
The VeBetterDAO smart contracts have undergone a comprehensive audit by .
We are using UUPS proxy for our upgradeable contracts. You can read more about it here:.
If you are a VeChain Node holder, you can upgrade your GM NFT for free up to a specific level based on your node type. Refer to the for details.
After a successful DAO proposal (read more here: ) the rewards earned by participating in VeBetterDAO governance are linear (instead of quadratic) starting from round 23, which means that you earn rewards proportionally to your VOT3 holdings at the time of the snapshot.
X Allocation Reward for user
is the total VOT3 tokens used by the user in XAllocation Voting.
enhances the voting power based on the user's GM NFT level.
Governance Reward for user
represents the VOT3 tokens delegated to a user for a given voting round
enhances the voting power based on the user's GM NFT level.
represents the number of proposals voted on in the voting round
Total reward weight for user
Total rewarded B3TR to user for a round is thus calculated as follows:
Where the sum is taken over all users participating in the voting
VeBetterDAO is a decentralized autonomous organization (DAO) platform built on that empowers its community through a suite of smart contracts designed for governance, incentive distribution, and asset management. The key components of the platform include:
You can find the smart contracts repository at this Use that repo to generate ABIs and Typechain Types to interact with the contracts.
Read more about our smart contracts and what they do in the section.
Contract
Upgradable
Authoriser
B3TR
No
B3TRProxy
No
B3TRGovernor
Yes
Governance OR DEFAULT_ADMIN
Emissions
Yes
UPGRADER_ROLE
GalaxyMember
Yes
UPGRADER_ROLE
NodeManagement
Yes
UPGRADER_ROLE
Timelock
Yes
UPGRADER_ROLE
Treasury
Yes
UPGRADER_ROLE
VOT3
Yes
UPGRADER_ROLE
VoterRewards
Yes
UPGRADER_ROLE
X2EarnApps
Yes
UPGRADER_ROLE
X2EarnCreators
Yes
UPGRADER_ROLE
X2EarnRewardsPool
Yes
UPGRADER_ROLE
XAllocationPool
Yes
UPGRADER_ROLE
XAllocationVoting
Yes
UPGRADER_ROLE
B3TR Multisig
No
Level
Name
B3TR Required
Multiplier
2
Moon
10,000 B3TR
1.1x
3
Mercury
25,000 B3TR
1.2x
4
Venus
50,000 B3TR
1.5x
5
Mars
100,000 B3TR
2x
6
Jupiter
250,000 B3TR
2.5x
7
Saturn
500,000 B3TR
3x
8
Uranus
2,500,000 B3TR
5x
9
Neptune
5,000,000 B3TR
10x
10
Galaxy
25,000,000 B3TR
25x
B3TR
0x5ef79995FE8a89e0812330E4378eB2660ceDe699
B3TRGovernor
0x1c65C25fABe2fc1bCb82f253fA0C916a322f777C
Emissions
0xDf94739bd169C84fe6478D8420Bb807F1f47b135
GalaxyMember
0x93B8cD34A7Fc4f53271b9011161F7A2B5fEA9D1F
TimeLock
0x7B7EaF620d88E38782c6491D7Ce0B8D8cF3227e4
Treasury
0xD5903BCc66e439c753e525F8AF2FeC7be2429593
VOT3
0x76Ca782B59C74d088C7D2Cce2f211BC00836c602
VoterRewards
0x838A33AF756a6366f93e201423E1425f67eC0Fa7
X2EarnApps
0x8392B7CCc763dB03b47afcD8E8f5e24F9cf0554D
X2EarnRewardsPool
0x6Bee7DDab6c99d5B2Af0554EaEA484CE18F52631
XAllocationPool
0x4191776F05f4bE4848d3f4d587345078B439C7d3
XAllocationVoting
0x89A00Bb0947a30FF95BEeF77a66AEdE3842Fe5B7
VeBetter Passport
0x35a267671d8EDD607B2056A9a13E7ba7CF53c8b3
X2EarnCreator
0xe8e96a768ffd00417d4bd985bec9EcfC6F732a7f
NodeManagement
0xB0EF9D89C6b49CbA6BBF86Bf2FDf0Eee4968c6AB
Role Name
Functions
Function Descriptions
Initial Assignees
DEFAULT_ADMIN_ROLE
grantRole, revokeRole, renounceRole
Grants or revokes roles; allows renunciation of its role
Admin Multi Signature
PAUSER_ROLE
Pause, Unpause
Pauses or unpauses contract operations
Admin Wallet
MINTER_ROLE
Mint
Mints new tokens
Admin Wallet, Emissions Contract
Role Name
Functions
Function Descriptions
Initial Assignees
DEFAULT_ADMIN_ROLE
grantRole, revokeRole, renounceRole, cancel,
_authorizeUpgrade, relay, setDepositThreshold, setVotingThreshold, setMinVotingDelay, updateQuorumNumerator
Grants or revokes roles; allows renunciation of its role; cancel pending proposals;
Admin Wallet
PROPOSAL_EXECUTOR_ROLE
Execute
Executes queued proposals
Admin Wallet
PAUSER_ROLE
Pause, Unpause
Pauses or unpauses contract (no proposal creation, queuing, or execution)
Admin Wallet
GOVERNOR_FUNCTIONS_SETTINGS_ROLE
setWhitelistFunction, setWhitelistFunctions, setIsFunctionRestrictionEnabled
Whitelist function that people can trigger in their proposals, or disable this check.
Admin Wallet, BTRGovernor
CONTRACTS_ADDRESS_MANAGER_ROLE
setVoterRewards, setXAllocationVoting, updateTimelock
Manages contract addresses
Admin Wallet, BTRGovernor
Role Name
Functions
Function Descriptions
Initial Assignees
MINTER_ROLE
Bootstrap, Start, renounceRole
Allows minting of tokens, initializing processes
Admin Wallet
DEFAULT_ADMIN_ROLE
grantRole, revokeRole, renounceRole
Manages roles and contract parameters
Admin multisig contract
DECAY_SETTINGS_MANAGER_ROLE
setCycleDuration, setXAllocationsDecay, setVote2EarnDecay
Sets emission cycle durations and related parameters
Admin Wallet
setXAllocationsDecayPeriod, setVote2EarnDecayPeriod
Sets decay periods for various emission-related settings
setTreasuryPercentage, setScalingFactor, setMaxVote2EarnDecay
Configures emission scaling factors and treasury settings
CONTRACTS_ADDRESS_MANAGER_ROLE
setXAllocationAddress, setVote2EarnAddress, setTreasuryAddress, setXAllocationsGovernorAddress
Configures addresses for key contracts
Admin Wallet
UPGRADER_ROLE
upgrade, renounceRole
Allows contract upgrades
Admin Wallet
Role Name
Functions
Function Descriptions
Initial Assignees
DEFAULT_ADMIN_ROLE
setMaxLevel, setMaxMintableLevels, setBaseURI, setB3TRtoUpgradeToLevel, setIsPublicMintingPaused
Sets contract parameters for levels, minting, and URI, Controls public minting
Admin Wallet
UPGRADER_ROLE
Upgrade
Allows contract upgrades
Admin Wallet
PAUSER_ROLE
Pause, Unpause
Pauses and unpauses the contract
Admin Wallet
MINTER_ROLE
Mint
Mint tokens for migration purposes
Admin Wallet
CONTRACTS_ADDRESS_MANAGER_ROLE
setXAllocationsGovernorAddress, setB3trGovernorAddress
Configures critical contract addresses
Admin Wallet
Role Name
Functions
Function Descriptions
Initial Assignees
DEFAULT_ADMIN_ROLE
grantRole, revokeRole, renounceRole
Grants or revokes roles; allows renunciation of its own role
Admin Wallet, Timelock contract
Proposer
schedule, cancel
Proposes, schedules, and cancels transactions
B3TRGovernor
Executor
Execute
Executes approved proposals and transactions
B3TRGovernor
UPGRADER_ROLE
upgrade
Allows contract upgrades
Admin Wallet
Role Name
Functions
Function Descriptions
Initial Assignees
DEFAULT_ADMIN_ROLE
grantRole, revokeRole, renounceRole
Grants/revokes roles; can renounce its own role
Admin Wallet
GOVERNANCE_ROLE
transferVTHO, transferB3TR, transferVOT3, transferVET
Manages VOT3, B3TR, VET and VTHO transfers
B3TRGovernor
transferTokens, transferNFT
Manages NFT and ERC20 token transfers
stakeB3TR, unstakeB3TR
Manages staking and unstaking
PAUSER_ROLE
Pause, Unpause
Pauses and unpauses contract operations
Admin Wallet
UPGRADER_ROLE
Upgrade
Allows contract upgrades
Admin Wallet
Role Name
Functions
Function Descriptions
Initial Assignees
DEFAULT_ADMIN_ROLE
grantRole, revokeRole, renounceRole
Grants or revokes roles; allows renunciation of its role
Admin Wallet
UPGRADER_ROLE
Upgrade
Allows contract upgrades
Admin Wallet
PAUSER_ROLE
Pause, Unpause
Pauses or unpauses contract operations
Admin Wallet
Role Name
Functions
Function Descriptions
Initial Assignees
DEFAULT_ADMIN_ROLE
setLevelToMultiplier, setScalingFactor
Sets reward scaling factors and levels
Admin Wallet
UPGRADER_ROLE
Upgrade
Allows contract upgrades
Admin Wallet
VOTE_REGISTRAR_ROLE
registerVote
Registers user votes for rewards
XAllocationVoting, B3TRGovernor
setVoteRegistrarRole
Assigns who has permission to register votes
CONTRACTS_ADDRESS_MANAGER_ROLE
setEmissions, setGalaxyMember
Sets key contract addresses
Admin Wallet
Role Name
Functions
Function Descriptions
Initial Assignees
DEFAULT_ADMIN_ROLE
setBaseURI, UpdateAppMetadata
Configures base URI and updates app metadata
Admin Wallet
Update receiver address/ app admin
Sets or updates app receiver address and admin
Add/Remove app moderators
Manages app moderators
UPGRADER_ROLE
Upgrade
Allows contract upgrades
Admin Wallet
GOVERNANCE_ROLE
Add app, setVotingEligibility
Adds new apps and defines voting eligibility
Admin Wallet
Role Name
Functions
Function Descriptions
Initial Assignees
DEFAULT_ADMIN_ROLE
Admin Wallet
UPGRADER_ROLE
Upgrade
Allows contract upgrades
Admin Wallet
CONTRACTS_ADDRESS_MANAGER_ROLE
setX2EarnApps
Update the contract address of X2EarnApps
Admin Wallet
Role Name
Functions
Function Descriptions
Initial Assignees
DEFAULT_ADMIN_ROLE
grantRole, revokeRole, renounceRole
Grants, revokes, or renounces roles
Admin Wallet
UPGRADER_ROLE
Upgrade
Allows contract upgrades
Admin Wallet
CONTRACTS_ADDRESS_MANAGER_ROLE
setXAllocationVotingAddress, setEmissionsAddress, setTreasuryAddress, setX2EarnAppsAddress
Manages key contract addresses
Admin Wallet
Role Name
Functions
Function Descriptions
Initial Assignees
DEFAULT_ADMIN_ROLE
grantRole, revokeRole, renounceRole
Grants, revokes, or renounces roles
Admin Wallet
UPGRADER_ROLE
Upgrade
Allows contract upgrades
Admin Wallet
ROUND_STARTER_ROLE
startNewRound
Initiates a new voting round
Emissions Contract
GOVERNANCE_ROLE
setVotingThreshold, setAppSharesCap
Sets parameters for voting
Admin Wallet, B3TRGovernor
setBaseAllocationPercentage, setVotingPeriod
Establishes voting periods and percentages
updateQuorumNumerator
Updates quorum requirements
CONTRACTS_ADDRESS_MANAGER_ROLE
setX2EarnAppsAddress, setEmissionsAddress, setVoterRewardsAddress
Manages key contract addresses
Admin Wallet
Setup a lambda function or an endpoint that will send the B3TR tokens to the user, providing also a proof and impacts of the rewarding action.
We will use @vechain/sdk-network and @vechain/vebetterdao-contracts to interact with VeBetterDAO's X2EarnRewardsPool
contract to distribute the rewards.
Run the following command to install the packages:
To distribute the rewards you will need 2 information:
Node URL
Your APP_ID
on VeBetterDAO: create app here to obtain the APP_ID.
Now you can distribute the reward like this:
Read more about the proof standard and how we expect you to provide it in the Sustainability Proofs and Impacts section.
The parameters related to emissions are adjustable; however, modifying them without careful consideration could negatively impact the overall emissions. It is crucial to maintain these settings as stable as possible.
Our DAO has multiple roles, each with its admin powers, which presents a potential vector for attack. We acknowledge this risk and have implemented best practices for securing the private keys associated with these roles. These measures are crucial in protecting our system from unauthorized access and potential security breaches.
We are committed to gradually transitioning to a fully decentralized system. This transition aims to reduce the reliance on centralized admin powers, thereby enhancing the security and robustness of our governance structure. The move towards decentralization is a deliberate process to ensure stability and maintain trust as we shift control from centralized figures to the DAO members.
X2Earn dApps should consider implementing necessary security measures to guard against farmers unfairly obtaining b3tr tokens.
Single Person, Single Wallet -> In this scenario the attacker is a single person using a single wallet address. They try to repeat the same claim for b3tr rewards multiple times for the same wallet address. If the dApp is using AI for image validation, they could attempt to use a fake image over and over again.
Single Person, Multiple Wallets -> In this scenario the attacker is a single person but now using multiple wallet addresses. For example they might submit a claim for a reward, then logout of the dApp then login with a different wallet address in VeWorld and repeat the same claim. The attacker then repeats this exercise switching between different accounts to make multiple claims for rewards.
Scripts (aka Bots) -> This is where the attacker has coded a script that submits a claim for rewards. The script might try a single wallet or use multiple wallets to submit the claim for a reward. If the dApp is using AI for image verification, the script might generate a new image or adjust a previously created image.
Multiple Collaborating People, Multiple Wallets -> In this scenario a group of attackers are collaborating together, they may share the same wallet, share social login details. As they are collaborating together they are collecting rewards for the group, which they can share between the group later.
Exploiting Vulnerabilities -> In this scenario the attacker exploits vulnerabilities in smart contracts or back-end API services to create Bots or manually bypass the front-end of the dApp.
Certificate based authentication -> For example if there is a /account
endpoint this should be secured with the signed certificate the user signs in VeWorld. The back-end can then validate the certificate, and use the signed address in from the certificate to identify the users wallet.
Captcha verification -> For example if there is a /claim
endpoint this should be secured with a ReCaptcha. This is to protect against scripted/bot attacks, as it ensures that the back-end APIs can only be used from the front-end of the dApp.
CORS domains -> This is to ensure that the back-end API's can only be called with a request from the same domain. For example if the API is running at api.myapp.com
and a request to it is made from api.fakeapp.com
, it will be rejected.
Rate limiting -> Depending on the design of the dApp a user will only be allowed to make a limited number of claims for rewards per day, per week. There are different strategies here, for example:
Inspecting the date-time when the users address last received a reward, and not allowing more claims for a time period after that. For example a user can't make another claim until 24hrs after their previously paid reward. This can be implemented in the back-end database or by reading the last reward event on-chain.
Determining the current round (week) and how many claims the user has submitted in that timeframe. Thus limiting the user to a fixed number of claims per week.
Using device identification techniques to uniquely identify the mobile device the user is using, and limiting the number of claims for rewards not just on address but also on device.
AI based validation -> The prompts used to validate an image should be thoroughly tested to ensure that the AI is validating as expected. If the AI is used to extract data out of an image (e.g. A receipt) it should be tested to ensure that hallucinations are not occurring. The AI should be asked to produce a confidence score, if that is below a threshold the image could be flagged for manual verification.
No unique identifier -> To verify a sustainable action there should be some indisputable evidence of it. For example a social media post, data from an external system, a receipt as proof of purchase or a date-time stamp. In the case of AI image verification, the AI should be prompted to recognise relevant data in the image that can be used for a uniqueness check.
dApps should have the means to identify suspicious behaviour within their dApp, for example rewards being paid every 10 seconds to accounts that have no other transaction history. DApps should have the means to ban accounts or entire devices from using their service.
The distributor account private key should be secure within the dApp and not be able to be sniffed in the traffic the dApp generates. If the dApp is using back-end contracts or APIs to sign the reward transaction these should have a secure way of storing the private keys.
Farmers might attempt to install VeWorld (or your native app), multiple times on the same device, and use a different wallet per instance of the app. This is especially true of Android devices, where software exists to allow multiple instances of an app to be installed. A dApp should consider using tools such as FingerprintJS (or its paid version), to identify a users device, and ban the device rather than just the users account(s). If developing a native dApp, protections against multiple installs should be built into the dApp.
Management of funds -> The allocation the dApp receives from the DAO on a weekly basis is at risk if there are vulnerabilities within the dApp. The dApp owner if concerned about farmers should reduce the b3tr balance of the dApp by withdrawing funds to their treasury account and drip feeding it back to the dapp when needed. Once the concerns are alleviated this strategy can end. The dApp owner can also mitigate this risk by setting a portion of the weekly allocation for distribution and another portion as treasury funds. Treasury funds can be withdrawn at any time.
Identify verification -> DApps can also offer login methods other to VeWorld, for example Google, Facebook, Twitter. In these cases dApp owners should consider validation of the users social media profiles, for example does the facebook profile have a complete profile, was the google account created in last 30mins. DApps could also consider sending verification emails.
Progressive unlocking -> A new account in the dApp might have tigher rate limits and lower rewards. As the user continues to use the dApp they progressively unlock higher rate limits and higher rewards. This means an attacker has to spend more efforts to reach the higher rewards slowing their progress.
Scaling Rewards by Demand -> This is a strategy to scale down user rewards in peek demands and scale them back up at quiet times. The goal is to make the weekly allocation a dApp received last the full week, but also guard against spikes in users (or bots) claiming rewards. One way to do this is to compute the average rewards per second since the start of the week, and project it forward to the end of the week, and see if above/below the dApps weekly budget. If above budget, the dApp can then scale down users rewards until back on track.
Stopping farmers is a difficult task and in some scenarios very difficult to achieve without impacting genuine users. Often the approach is to slow the farmers progress so that their effort/reward ratio is no longer worth it.
The proof will be stored on-chain in the form of an emitted event and will have the following JSON format:
You will provide this proof as a parameter when calling the distribute rewards function in the X2EarnRewardsPool
contract.
proofTypes: an array with the proof types that you are providing. Eg:
["link", "image"]
proofValues: an array with the values of the types provided in the previous array. Eg: ["https://twitter.com/tweet/1233121231", "https://whatever.com/image.png"]
impactCodes: an array with the codes of impacts you are providing. Eg:
["water", "timber"]
impactValues: an array with the values of the impacts provided in the previous array. Eg:
[1000, 23]
description: you can attach also a description to your action, it's optional.
When calling this function it is mandatory to provide at least proof or impact, if none of them is provided then the transaction will revert.
The transaction will revert also if something is wrong with the data you pass.
To provide proofs and impacts you need to distribute the rewards through the X2EarnRewardsPool contract with the following function:
You can attach proof of the user's sustainable action when you distribute the reward. The proof can be a link, video, photo, and text. You can provide more than one proof (eg: a photo and a link).
The current proof types supported are:
Determining the environmental impact of each sustainable action will require the development of a set of criteria and metrics for each type of action.
Warning: the impact values MUST be a number and the unit is considered the default minimum (so milliliters, grams, wh, etc.). So if you saved 1 litter of water then you should put it as an impact of "water" : "1000"
.
Carbon Footprint Reduction
Key: carbon
Description: Measures the decrease in greenhouse gas emissions.
Metric: Grams (g) of CO2 equivalent reduced or removed.
Resource Conservation
Key: water
(for water conservation), energy
(for electricity conservation)
Description: Assesses the reduction in the use of natural resources like water, electricity, and raw materials.
Metric: Milliliters (ml) of water saved, watt-hours (Wh) of electricity saved.
Waste Reduction
Key: waste_mass
Description: Evaluates the decrease in waste generated and improves waste management.
Metric: Grams (g) of waste diverted from landfills, number of items recycled.
Timber Conservation
Key: timber
Description: Measures the reduction in the use or waste of timber resources.
Metric: Grams (g) of timber saved.
Plastic Reduction
Key: plastic
Description: Evaluates the decrease in the use or waste of plastic materials.
Metric: Grams (g) of plastic saved or reduced.
Education Time
Key: education_time
Description: Measures the amount of time a user spends learning about a sustainability topic.
Metric: Seconds spent learning.
Trees Planted
Key: trees_planted
Description: Tracks the number of trees planted as part of sustainability efforts.
Metric: Number of trees planted.
Calories Burned
Key: calories_burned
Description: Measures the energy expenditure from physical activity or exercise, promoting health and sustainability.
Metric: Calories (kcal) burned.
Sleep Quality
Key: sleep_quality_percentage
Description: Assesses the quality of sleep as a percentage, encouraging better health and productivity.
Metric: Percentage (%) of sleep quality improvement.
Clean Energy Production
Key: clean_energy_production_wh
Description: Measures the amount of clean energy produced, contributing to sustainable energy solutions.
Metric: Watt-hours (Wh) of clean energy generated.
The following are the impact codes you will need to use:
If no "version" field is found in the the json proof then you should consider it as version 1.
Deprecated impacts:
If you want to store additional data beyond impacts or proofs, you might consider using the reward metadata function, which allows you to include other meaningful extra information. Go to Reward Metadata Docs
The X2Earn Creator NFTs are integral to VeBetter DAO’s process for managing and validating new XApp submissions. These NFTs serve as an access key for creators, enabling them to submit their applications on-chain and engage with the VeBetter DAO endorsement process through VeChain node holders.
Purpose: X2Earn Creator NFTs are used within VeBetter DAO to authorize new XApp submissions and provide access to the endorsers (VeChain node holders). These NFTs ensure that only vetted and verified creators can submit apps for consideration.
Standard: Creator NFTs are non-transferable tokens compliant with the ERC721 standard, implemented using the OpenZeppelin (OZ) library.
Minting Authority: Only the X2Earn App Review Panel has the authority to mint Creator NFTs. The panel grants these NFTs if they deem the app suitable, legitimate, and ready for the endorsement process within VeBetter DAO.
Non-Transferability: Creator NFTs are non-transferable, meaning they cannot be sold or transferred to another user, ensuring that only the verified creator retains access.
Submission Access: Once an app creator is granted a Creator NFT, they can submit their XApp on-chain for endorsement. This submission formally registers the app within the VeBetter DAO ecosystem, allowing it to seek endorsements from node holders.
Additional NFTs for Team Members: After the initial on-chain submission, the XApp admin (creator) can mint up to two additional Creator NFTs for other team members. This provides extended access for specific collaborators without the need to undergo the entire verification process.
Single NFT Limit: A user can hold only one Creator NFT at any time. However, if they are involved in multiple XApps, they only need one Creator NFT to submit additional XApps; a new NFT is not required for each project.
Blacklisting Policy: If an XApp is blacklisted for any reason, and the creator is not associated with any other active XApp, their Creator NFT will be burned. This prevents creators of non-compliant or blacklisted apps from submitting new projects without re-approval.
NFT Burn: The burning mechanism ensures that blacklisted creators cannot bypass VeBetter DAO’s review process by holding onto their Creator NFT. This policy enhances the integrity of the ecosystem by holding creators accountable for their submissions.
Token Standard: ERC721 (non-transferable)
Minting Authority: X2Earn App Review Panel
Max NFTs per User: One NFT per user, regardless of the number of XApps
Additional NFTs: Admins can mint up to two extra NFTs for team members
Burn Policy: Creator NFT is burned if the associated XApp is blacklisted and the user has no other active XApps
Ownership of a GM NFT with a level above Earth should be sufficient to prove personhood. The capital outlay to achieve these NFTs should be enough to discourage their usage in Sybil attacks and prove the investment deployed for better action to VeBetter DAO.
The GM ownership is snapshotted at the beginning of each round to prevent potential attacks.
You have two testing environments: testnet and an instance of the blockchain running locally (a solo node).
Testing your app on testnet is more straightforward since all contracts are already deployed by us and you can use our testnet dApp to add apps, interact with smart contracts, and manage reward distribution.
Testing on solo will be a bit more complicated because you will need to deploy some mocked VeBetterDAO contracts by yourself, but we tried to make that easy as well.
Use our testnet environment, running on vechain testnet network, to create apps, interact with smart contracts, and manage reward distribution.
Add an app
Now you will need to get some B3TR tokens: claim them from the Faucet
Deposit the B3TR tokens to your app balance so you can distribute them: go to your managed app page, and click "Deposit" in the app balance section
To allow your contract to distribute the rewards you need to click the cogs icon to enter the Settings section of your app and add the address of your contract (that will call the distributeReward
function) as a "Reward Distributor".
That's it, you are all set and can distribute rewards through your backend or smart contract.
If you need to simulate allocation rounds, go to the Admin section and press the "Start round" button. In testnet rounds last 10 minutes, but apart from this everything else is the same as mainnet.
Testnet contracts addresses:
Testing on the solo node (aka: local node running on your computer simulating VeChain blockchain) is a bit more complicated than testing on testnet, since you will need to deploy the VeBetterDAO contracts locally and interact with them to create your app, obtain the APP_ID, start an allocation round, vote, start round again, and add the reward distributor.
We recommend following the testnet path, but if you need to do it on the solo network you will need to mock a few VeBetterDAO contracts:
B3TR
token mock: you need a fake token to distribute
X2EarnApps
mock: you need a contract where to add your app, generate an APP_ID and add a reward distributor
X2EarnRewardsPool
mock: you need a contract to distribute the rewards
While the X2EarnRewardsPoolMock
contract can be the exact same contract deployed on mainnet and testnet, the other two can be customized in order to have only the essential logic needed for running tests.
You can take a look at the mocked contracts in the X-App-Template repository, under the contracts/mocks
folder.
After you added the mock contracts to your repository you should adjust the deploy script in a way that you will deploy and configure the mocked contracts only if you are deploying to the vechain_solo
network.
Your script should look something like this:
That's it, you can now deploy your contracts locally/run tests where you simulate the VeBetterDAO contracts, your app added to the ecosystem, and tokens distribution.
To enhance the transparency of the VeBetterDAO platform and x2earn apps, following also the "dApp Tracker" proposal, we have developed a centralized reward distributor contract. This contract must be used by the apps to ensure that every transfer of a B3TR token related to a sustainable action is publicly tracked and accessible to the community.
You need to call this contract to distribute the rewards.
In this example, we assume that you are building a smart contract where users can submit some sustainable action that is being approved/rejected by some moderator. If the action is approved the user can claim his rewards. No backend is involved.
Your contract should look like this:
The address of this contract must be set as a distributor of your APP in order to move funds from the X2EarnRewardsPool contract.
You can set this on the VeBetterDAO governance app.
Read more about the proof standard and how we expect you to provide it in the Sustainability Proofs and Impacts section.
If you want to create an x2earn app it needs to have the following features:
Be able to distribute B3TR tokens on the VeChain blockchain
Be able to submit a proof (in JSON format) of the sustainable action the user was rewarded for
Bonus:
Allow the user to connect with their wallet to your app
This guide provides instructions for setting up a project within the VeBetterDAO ecosystem. Your app will participate in weekly allocation rounds, receive B3TR tokens at the beginning of each round, and distribute these
Use our Test Environment to create a test app running in the VeBetterDAO ecosystem.
Now that you have your app running in testnet and have some B3TR tokens deposited in your app's rewards pool you can connect a smart contract or a backend and distribute those funds to your users.
Every time you reward a user you also need to specify the reason, the proof of the user's action and the sustainability impact it had.
Have doubts? Check our additional resources specifically picked for you to speed up your development.
When your app is ready submit it to VeBetterDAO and join the movement!
Before going live be sure to go through our Security Considerations and apply security measurs to your app, avoiding hacks and farmers.
As of the start of November the VeChain node holders, referred to as "endorsers," are serving as the primary decision-makers in determining which XApps are admitted to the VeBetter DAO ecosystem. Developers and innovators can engage with the ecosystem and submit their X2Earn applications through a structured process that includes community endorsement and voting.
To submit an app to the VeBetter DAO ecosystem, every project must first acquire a Creator NFT, which verifies the creator and allows them to participate in the endorsement process. Here’s how it works:
Acquiring the Creator NFT
Application Process: XApp creators begin by filling out a form on the VeBetter DAO platform, which initiates a background check to verify the team and the app’s legitimacy.
Alternative Paths: Creators can also apply for a grant through the VeChain Grants program. If successful, they will receive funding as well as a Creator NFT, which validates their project within the ecosystem.
On-Chain XApp Submission After receiving the Creator NFT, XApp creators can submit their app on-chain for endorsement consideration. This official submission registers the app on the VeBetter DAO platform, allowing it to seek endorsements from VeChain node holders.
Connecting with Endorsers Upon acquiring the Creator NFT, XApp creators gain access to the VeBetter DAO XApps Creators Discord server, where they can network with VeChain node holders who may endorse their app. This community platform provides opportunities for creators to present their app, build relationships with potential endorsers, and gain the necessary endorsement score to enter allocation rounds.
Endorsement and Funding Eligibility Once an app is submitted and endorsed with a cumulative score of 100, it will officially be added to the VeBetterDAO ecosystem. It will be eligible to be weekly funded with B3TR tokens as a result of the allocation rounds: you will compete against other apps to receive as many B3TR tokens as possible, with holders of the token that will vote for the app they think deserves it the most.
When asubmitting your app to VeBetterDAO you will need to provide 2 important information:
Treasury address: this is the address where B3TR tokens will be sent in case you will need to withdraw some tokens from the received weekly allocations (eg: you need some B3TR for marketing, team shares, etc.). This address can be a multi-sig or a simple EOA, it's up to you.
Admin address: this is the address that has superpowers for your app; it can update any details of the app, change the Treasury address, or move the ownership to another wallet. You can use the same wallet you use for the Treasury, another multi-sig, or a simple EOA as well.
Once your app is added you will obtain an APP_ID that VeBetterDAO and other projects will use to recognize your app. You will also need to use your Admin address to add a Reward Distributor to distribute your rewards to the users. This is a simple address and it should belong to the contract or wallet that you will use to distribute the rewards. Be aware that this address can also withdraw funds, so protect its access correctly.
You will receive your first B3TR tokens at least one week after joining VeBetterDAO, following the completion of at least one voting round. Therefore, you will need to address the scenario where people might see your app in VeBetterDAO and attempt to use it before you are able to distribute rewards.
Every app receives B3TR from weekly allocation rounds in a contract called X2EarnRewardsPool and those rewards are now configurable by the app admin. In fact, you can split allocated tokens between distributable rewards pool for your user and a treasury pool, withdrawal for operational needs. You also have the possibility to pause distribution anytime, this won't affect the reward pool unless you move funds to the app balance.
This dual-pool mechanism allows you to have more control over your distribution funds.
You can manage these configurations directly from the app admin dashboard in the VeBetterDAO app. Or by interacting with our X2EarnRewardsPool
contract.
Only the app admin can set this distributable rewards pool, by increasing/ decreasing the wished amount. If you are new to the DAO, note that this feature will be enabled by default. You will have to immediately refill your rewards pool, up to the amount you want to distribute.
To aid in the development process, we've created several valuable resources:
VePassport is a system that allows dApps on VeChain to determine whether a wallet belongs to a bot or a real person. The dApps using this technology include, first and foremost, VeBetter DAO, which verifies the authenticity of wallets during voting. Other dApps within the VeBetter DAO ecosystem, often facing issues with fake accounts and Sybil attacks, can also access this information.
This decentralized identification framework enables a secure, Sybil-resistant environment that drives participation and promotes a more transparent, sustainable ecosystem.
There are several modules that VePassport uses to determine if a wallet is a bot or if it belongs to a real user:
Proof of Participation in the VeBetterDAO Ecosystem
Proof of Investment
Proof of Identity
Whitelisting and Blacklisting
Bot Signaling
In the current implementation to determine if a wallet is legitimate, several factors are considered: whether it is on the whitelist or blacklisted, and the number of actions performed within a specific time range, while Proof of Investment and Identity will be integrated with the next releases.
Apps can interact with VePassport to check if a user is a person (now or in a specific block number) or can call each module separately to only get the participation score, or if the user is KYCed, or if it's whitelisted, blackilsted or signaled as a bot by other apps.
VePassport is designed to be expanded in the future with new modules.
Users need to complete 3 Better actions within a 12-week period to be considered a person. This requirement encourages greater participation in the ecosystem and ensures users are active contributors to the DAO.
An action is defined as a reward that you receive from an app (e.g., receiving a reward for drinking coffee in a sustainable cup with Mugshot).
Every time a user engages with an app and receives a reward their passport accumulates points. The amount of points is determined by the security level of the app he interacted with. An app with a low security score is worth 100 points, medium is 200, high is 400, and none is 0.
Another way to verify a wallet’s legitimacy is through the GM NFT level that the wallet holds. If the address holds a GM NFT with a level higher than 1 then it indicates that the owner has made a significant investment, since upgrading levels on that NFT is not free, suggesting that the wallet is more likely to be genuine.
X2earn apps can also flag a wallet as a bot or suspicious user. If a wallet receives enough signals to exceed a certain threshold, it will not be considered a real person.
Additionally, some authorized entities can blacklist or whitelist a wallet. Blacklisting might occur if a wallet is found to be part of a network of fake accounts. If a wallet is mistakenly blacklisted, it can request to be reinstated.
Similarly, a wallet can be added to the whitelist, especially if the user has completed a KYC (Know Your Customer) process, thereby ensuring that the account is legitimate.
Various levels of KYC (Know Your Customer) can be applied in the future, ranging from linking social profiles to full identity verification. This feature will remain optional, and will instantly provide layers of security and trust for user identities.
This proof is not implemented yet.
To better increase the interoperability across the VeBetterDAO and VeChain ecosystem, VePassport offers the possibility to delegate your passport to other addresses.
You can even customize your passport by attaching to it other accounts you own.
Every person and contract can interact with VePassport to check if an address can be considered a person. Additionally, modules can be called separately, allowing a certain amount of flexibility to implement custom personhood checks.
In the following pages, you can browse each module's endpoints and learn how the VePassport personhood check is performed.
Play with our Utilize our testnet environment to add apps to the ecosystem, interact with smart contracts, and manage reward distribution. Detailed information about the test environment can be found in its , providing you with a sandbox to refine and test your applications before going live.
: an all-in-one javascript library for building VeChain applications.
Read the and the sections to understand how to distribute B3TR tokens
X-App-Template () This template serves as a foundational guide to help you code your app and interact effectively with VBD. It's a demo of an app where you can scan grocery receipts and be rewarded if you buy sustainably.
Documentation of everything you need to know about vechain and blockchain technology to create a decentralized app.
A package containing all the smart contracts used in mainnet. You can also install this repository as a dependency in your project and use it to access the ABIs of the contracts and their addresses.
Contracts can be found at the following repository:
Mainnet Address: 0x35a267671d8EDD607B2056A9a13E7ba7CF53c8b3
The up-to-date interface of the VePassport contract can be found .
Authorized apps can signal addresses they ban on their platform (e.g., looters, bots, scammers), helping the DAO and other apps to recognize and protect against them.
VeBetterDAO or other selected apps can reset the signal counter if a user is wrongly identified as a bot.
Dashboard: https://vechain-energy.github.io/vebetterdao-signal-admin/
Other apps or contracts can interact with the Bot Signalling module through the following functions of the VePassport contract:
Any app can call the signaledCounter
function to get how many times a user was signalled and can decide on their own how to interpret that value.
When calling the isPerson
function though, the signalled counter will be compared to a threshold set in our contract, currently set to 2. For example, if the address was signalled more than 2 times, it will not pass the personhood check.
The following is a snippet of how to signal addresses by using the vechain SDK.
Reach us to obtain the permissions to bot signaling.
To better increase the interoperability across the VeBetterDAO ecosystem VePassport offers the possibility to link multiple addresses under a single passport. All sustainable actions performed with the linked accounts will help increment the score of the passport and better represent your onchain identity.
A passport is the primary identity of the user (often a user's main VeWorld Wallet), and entities are additional wallet addresses that a user can attach to their passport. Users can link multiple entities (e.g., hardware wallets, account abstraction wallets, regular wallets) to a single passport. Once an entity is attached, its interactions, scores, and other attributes (e.g. whitelisted, bot signals etc.) are aggregated into the passport, reflecting the combined activity.
Currently, there is a limitation of a maximum of 5 entities per passport.
When linking a wallet, the scores are not immediately transferred. Instead, once the link is established, all of the linker’s scores, from the time of the link, are credited to the linked account. After the wallet addresses are linked, only the main account — the passport address — retains the right to vote.
The following are the roles available in the VePassport contract, with their functionality and current assignees.
Role Name
Function Descriptions
Initial Assignees
DEFAULT_ADMIN_ROLE
Grants or revokes roles; Set decay rates for proof of participation and thresholds.
Admin Wallet
UPGRADER_ROLE
Update the contract implementation address
Admin Wallet
ROLE_GRANTER
Allow an address to signal users on behalf of an app. Grants or revokes roles;
Admin Wallet
SETTINGS_MANAGER_ROLE
Toggle personhood checks, update thresholds, and other personhood parameters.
Admin Wallet
WHITELISTER_ROLE
Whitelist or blacklist addresses
Admin Wallet
ACTION_REGISTRAR_ROLE
Register that a user performed an action
X2EarnRewardsPool contract
ACTION_SCORE_MANAGER_ROLE
Administrates the proof of participation settings
Admin Wallet
SIGNALER_ROLE
Signal users
Admin Wallet
As a VeChain Node holder, you have unique opportunities to enhance your participation in the ecosystem. By linking your VeChain Node to a Galaxy Member (GM) NFT, you can unlock additional rewards, boost your GM NFT level, and significantly increase your influence in governance.
This guide explains how VeChain Node holders can link their nodes to GM NFTs, the benefits of doing so, and the steps to get started.
Linking your VeChain Node to a GM NFT provides multiple advantages:
Unlock Free Level Upgrades:
Your node's type determines the free upgrade level of your GM NFT.
Higher levels increase your voter rewards which in return increases your influence in governance.
Boost Voter Rewards:
Higher GM NFT levels provide multipliers for voter rewards.
Multiplier percentages increase with GM NFT levels, enhancing the value of your votes.
Dynamic Benefits:
If your node level is upgraded, the GM NFT's level is also upgraded dynamically.
Nodes can be detached and reassigned as needed.
When you link a VeChain Node to a GM NFT, the NFT receives a free upgrade based on the node type:
None
1
Strength
2
Thunder
4
Mjolnir
6
VeThorX
2
StrengthX
4
ThunderX
6
MjolnirX
7
Note: If the free upgrade level exceeds the NFT's current maximum unlocked level, the level is capped.
Check Node Ownership:
Ensure you own the VeChain Node or it has been delegated to you.
Select a GM NFT:
Choose an NFT to link to your node. Use the VeBetter DAO interface to view your GM NFTs.
Link Your Node:
Use the Node Management feature in the VeBetter DAO platform to attach your node to the selected GM NFT.
Monitor Your GM NFT Level:
Check the NFT’s level after linking. Free upgrades are applied automatically.
Participate in Governance:
Use the linked GM NFT for voting in DAO proposals and XApp allocation to maximize rewards.
Single Linkage:
A node can only be linked to one GM NFT at a time.
Non-Transferable:
GM NFTs with attached nodes cannot be transferred or sold.
Ownership Alignment:
Free upgrades apply only if the GM NFT owner and the node owner (or delegatee) are the same.
Dynamic Adjustments:
Upgrading or downgrading a node updates the GM NFT’s level dynamically.
Higher GM NFT levels significantly increase your rewards during governance and x-allocatin voting participation. Here’s how the multiplier system works:
2
Moon
10%
1.1x
3
Mercury
20%
1.2x
4
Venus
50%
1.5x
5
Mars
100%
2x
6
Jupiter
150%
2.5x
7
Saturn
200%
3x
8
Uranus
400%
5x
9
Neptune
900%
10x
10
Galaxy
2400%
25x
Detachment Rules:
Only the node owner, delegatee, or GM NFT owner can detach the node.
Detaching a node resets the GM NFT’s level unless it was paid for using B3TR.
Reassigning Nodes:
After detaching, the node can be linked to another GM NFT for additional upgrades or governance participation.
Node Type: Thunder
GM NFT Initial Level: 1
Free Upgrade Level: 4 (Venus)
Outcome: The GM NFT is upgraded to Level 4 (Venus) for free.
Rewards Multiplier: 1.5x.
For 100 B3TR earned, the adjusted reward is:
Node Type: MjolnirX
GM NFT Initial Level: 5 (Mars)
Free Upgrade Level: 7 (Saturn)
Outcome: The GM NFT is upgraded to Level 7 (Saturn) for free. To reach Level 8 (Uranus), donate 2,500,000 B3TR.
At Level 7: 3x Rewards Multiplier.
For 100 B3TR earned: .
At Level 8: 5x Rewards Multiplier.
For 100 B3TR earned:
The Personhood Check refers to a function provided by the contract to determine whether a particular wallet belongs to a real person or not.
The contracts currently calling this function are those related to governance voting in VeBetter DAO, such as XallocationVoting
and B3TRGovernor
. When this function is called, the VePassport contract checks the following criteria:
If the address (representing the user) has delegated their passport, their personhood is not considered, meaning they will not be regarded as a person;
If the address is whitelisted, it will be considered a person;
If the address is blacklisted, they will not be considered a person;
If an address has been flagged multiple times by one or more apps as a bot or as an account involved in a Sybil attack, it will not be considered a person;
If the address has used apps enough in previous rounds, or in the current one, to exceed the participation threshold, they will be considered a person;
If the user holds a GM NFT with a level of 2 or higher, they will be considered a person;
If none of the above happens, the user will not be considered a person.
Not all of the previously listed checks are enabled. Those checks can be enabled or disabled as desired, and currently, only the delegation and Proof of Participation checks are enabled.
At the moment the checks can be enabled by the VeBetter DAO team, but in the future, this option will also be open to the DAO itself.
The rules governing how this method works can be adjusted over time.
In addition to determining whether a wallet is considered a person at the current moment, it is also possible to verify if a wallet is considered a person at a specific block in the past. This function is particularly used by the governance contracts of VeBetter DAO during voting, where it checks if a user was considered a person at the start of the round.
Not all checks support this functionality though. Currently only the Delegation and Proof of Investment support this. All other checks, such as whitelisting, blacklisting, bot signaling, and participation, are analyzed based on the current block.
As a VeChain node holder within the VeBetter DAO ecosystem, you play a vital role in selecting and supporting new XApps. Your endorsement not only enables promising applications to join the ecosystem but also allows you to influence the distribution of B3TR tokens through weekly allocation rounds. This guide will help you understand how endorsement works, the influence of your node type, and how you can manage endorsements effectively.
Endorsement is the process by which VeChain node holders support XApps (applications within the VeBetter DAO ecosystem) for inclusion and funding eligibility. Each node holder can endorse one XApp at a time, and each endorsement carries a score based on the type of node held. Once an XApp accumulates enough endorsement points, it qualifies to join the VeBetter DAO ecosystem and participate in weekly allocation rounds for B3TR tokens.
The influence of your endorsement depends on the type of VeChain node you hold. Each node type has a unique endorsement score, which contributes to an XApp’s cumulative endorsement score. Here is a breakdown of endorsement scores by node type:
VeChain Node Type
Endorsement Score
Strength
2
Thunder
13
Mjolnir
50
VeThorX
3
StrengthX
9
ThunderX
35
MjolnirX
100
Note: These scores determine the weight of your endorsement. For example, a MjolnirX node endorsement contributes 100 points towards an XApp’s endorsement total, while a Strength node contributes 2 points.
Choose an XApp: Review the list of submitted XApps within the VeBetter DAO platform. These XApps are seeking endorsements to qualify for entry into the ecosystem.
Endorse with Your Node: Select one XApp to endorse. Your endorsement adds the score of your node to the XApp’s cumulative endorsement score.
Qualification for Allocation Rounds: Once an XApp reaches a cumulative endorsement score of 100, it qualifies to join the VeBetter DAO ecosystem and participate in weekly allocation rounds. This threshold ensures that only well-supported XApps gain access to ecosystem resources.
Node Cooldown Period: From Round 26, after endorsing an XApp, your VeChain node will enter a cooldown period during which you cannot change or withdraw your endorsement.
For mainnet, the cooldown period is set to 1 round. For example, if you endorse an XApp in Round 23, you will only be able to change your endorsement in Round 24.
Weekly Allocation Rounds: Endorsed XApps can participate in weekly allocation rounds, where they compete to receive B3TR tokens based on community voting. As an endorser, your influence supports the XApp’s eligibility for these rewards.
Using the VeBetter DAO’s UI, you can easily manage your endorsements:
View Current Endorsements: Check which XApp you are currently endorsing and its current endorsement score.
Switch Endorsements: If you wish to change your endorsement, you can do so through the UI. Simply withdraw your current endorsement and select a new XApp to support.
Monitor XApp Progress: Track the cumulative endorsement scores of different XApps to see how close they are to reaching the 100-point threshold.
Track Cooldown Status: Monitor the cooldown status of your node through the UI to see when you will be eligible to make a new endorsement.
Single Endorsement Limit: Each node can endorse only one XApp at a time. If you wish to support another XApp, you must first remove your current endorsement.
Influence of Node Type: The endorsement score of your node directly impacts the XApp’s ability to qualify for the ecosystem. Higher-level nodes like MjolnirX provide more influence.
Endorsement Lock: Once an XApp reaches the 100-point threshold and joins the ecosystem, it cannot.
Node Cooldown Period: After endorsing an XApp, your node enters a cooldown period (1 round on mainnet). You cannot change or withdraw endorsements during this time. Within the cooldown period, app creators retain the ability to remove any node's endorsement from their XApp.
Delegation allows a user to delegate their passport personhood to another address to allow more versatility and app interoperability. A delegator can have only one delegatee, and a delegatee can have only one delegator.
When delegating your passport, the delegatee must accept the delegation first. When a delegatee accepts the delegation his passport will become unused, giving priority to the delegated passport, regardless of the personhood check outcome.
Since by delegating the passport, the personhood check will not work anymore for the original wallet, the delegator will also lose the eligibility to vote. However, he will still need to use X2Earn apps, upgrade his GM NFT, or do whatever is needed in order for his passport to be considered a person, allowing the delegatee to vote.
An example use case for using the delegation is VeDelegate: you can have your VeWorld that you use to interact with apps with a valid Passport, that you delegate to the TBA created by VeDelegate where you deposit your B3TR tokens and automatize voting.
To avoid users misusing this feature when voting in the VeBetterDAO governance contracts the delegation will be checked upon the block number when the round starts, so new delegations will be taken into account by the B3TR governance system only after the next round starts.
The black-and-white list functions provide the DAO, or other trusted projects, a mechanism to blacklist or whitelist certain accounts. For example, certain accounts may not have a way to prove they are legitimate other than being whitelisted. On the flip side we can use the blacklist to block all known Sybil accounts providing a strong deterrent for this type of behavior.
Other apps or contracts can interact with this module through the following functions of the VePassport contract:
Proof of Participation is a module of VePassport that allows tracking the amount of times an address has used the apps of VeBetter DAO. For every action, a score (from 0 to 400 based on the app security level) is attributed to the user interacting with the X2Earn App.
The points are then summed, generating a cumulative score for the user and if it exceeds a certain threshold, the wallet can be considered a person.
Only the X2EarnRewardsPool contract can call the registerAction
function, this means that if an app is not using the X2EarnRewardsPool contract to distribute their rewards then that action is never taken into account.
When an action is registered a score is being assigned to the user based on the security level of the app. The VeBetterDAO team will be responsible for initially analyzing apps and setting the security score for each app and will open this power to the entire DAO in the future.
There are 4 security levels:
NONE = 0 points
LOW = 100 points
MEDIUM = 200 points
HIGH = 400 points
Currently, all apps are assigned a security score of type "LOW", therefore, for any app used, a user will receive 100 points for each action.
Per each account, a score is calculated based on the points he gathered until now.
The formula to calculate the score takes into account 2 arguments:
Amount of rounds to use: currently set to 12, which means that the contract will sum all the points gathered during the last 12 weeks;
Decay percentage: currently set to 0, which reduces the points of previous rounds (eg: if set to 20%, the score calculated until the previous round will be reduced by 20% in the next, in a linear fashion).
This approach ensures that a person must continue to participate in the VeBetter DAO ecosystem and use the apps to maintain eligibility for voting.
The following is the current implemented formula to calculate the cumulative score of the user in the last t
amount of rounds:
The threshold an address must meet to be considered a person is 300 points accumulated during the last 12 rounds.
Other apps or contracts can interact with the Proof of Participation module through the following functions of the VePassport contract:
The Rewards Metadata feature allows applications to enrich reward distributions with additional contextual information. This is facilitated through the distributeRewardWithProofAndMetadata
function, which accepts a JSON-formatted string as metadata.
The provided metadata is then emitted via the RewardMetadata
event, enabling off-chain services to efficiently index, analyze, and utilize the data for tracking and reporting purposes.
To maintain consistency across applications, it's recommended to follow a standardized metadata structure. Below is an example of a JSON-formatted metadata string:
Keep in mind that including location metadata may require updating your privacy policy and terms of service.
To provide metadata you need to distribute the rewards through the X2EarnRewardsPool contract with the following function:
RewardMetadata
Upon successful execution of the distributeRewardWithProofAndMetadata
function, the RewardMetadata
event is emitted with the following parameters:
amount (uint256
): The distributed reward amount.
appId (bytes32
): The application identifier.
receiver (address
): The address receiving the reward.
metadata (string
): The JSON-formatted metadata string.
distributor (address
): The address initiating the distribution.
This event allows off-chain systems to listen for and process reward distributions along with their associated metadata.
Optional Usage: The metadata
is optional. If your application doesn't require additional context, you can continue using the existing distributeRewardWithProof
function.
Standardization: Adhere to the suggested metadata structure to ensure consistency and facilitate seamless data integration across the ecosystem.
Data Validation: Implement validation checks to ensure the metadata JSON is correctly formatted and contains relevant information before invoking the distribution function.
a
is the total scores, r
is the rate of decay, t
is number of rounds)The Node Management feature within VeBetter DAO empowers VeChain node holders with greater flexibility and control over their participation in the ecosystem. As a node holder, you can manage your nodes, delegate your endorsement rights to others, and even consolidate multiple nodes within a single account—all through an intuitive UI.
Delegation of Endorsement Rights As a VeChain node holder, you have the option to delegate your endorsement rights to another individual within VeBetter DAO. By doing so, you allow this delegatee to manage the endorsement of XApps on your behalf.
Control: You remain in control of your node’s delegation status and can revoke or assign endorsement rights as needed.
Flexibility: Delegation allows you to have someone else manage your endorsement activities if you are unavailable or prefer a more hands-off approach.
Managing Multiple Nodes If you hold more than one VeChain node, the Node Management feature allows you to manage all your nodes in one place. This simplifies the process of endorsing XApps, as you can easily allocate endorsements across multiple nodes without needing separate accounts.
Streamlined Management: Control multiple nodes through a single interface, allowing you to maximize your influence within the VeBetter DAO ecosystem.
Unified Dashboard: View and manage all nodes and endorsements from a centralized dashboard for easy oversight.
Revoking Delegation If you delegate your endorsement rights, you can revoke them at any time. This option allows you to reassert control over your node’s endorsement activities or reassign delegation to someone else as your needs change.
Immediate Control: Take back management rights instantly through the UI whenever you decide.
Adaptable Partnerships: Adjust delegation to fit your preferred level of involvement in VeBetter DAO at any time.
Transfer and Reassignment Protocol Should you decide to sell or transfer your VeChain node, the Node Management system makes the transition seamless. If your node is currently delegated, the new owner will need to revoke the existing delegation through the UI to assume full endorsement rights.
Clear Reassignment: Ensure the new owner can take full control, maintaining alignment with VeBetter DAO’s endorsement policies.
Transparent Process: The UI provides clear instructions for both the current owner and the new owner to manage the transition smoothly.