iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Web 3

Web3 X 公共財系列 第 19

Day 19 細看BaseStrategy .sol -> QVbase.sol -> QVsimple.sol

  • 分享至 

  • xImage
  •  

BaseStrategy .sol

扣回BaseStrategy重點功能

External Functions

increasePoolAmount: 允許Allo合約增加池的金額。
registerRecipient: 註冊接收者的應用程序並更新其狀態。
allocate: 根據提供的數據為接收者分配代幣。
distribute: 根據提供的數據向接收者分發代幣。
getPayouts: 檢索接收者和數據對的支付摘要。
isValidAllocator: 驗證地址是否為有效的分配器。

Internal Functions

_setPoolActive: 設置池的活動狀態。
_isPoolActive: 檢查池是否目前處於活動狀態。
_isValidAllocator: 驗證地址為有效的分配器。
_registerRecipient: 註冊接收者的應用程序並更新其狀態。
_allocate: 根據提供的數據為接收者分配代幣。
_distribute: 根據提供的數據向接收者分發代幣。
_getPayout: 檢索接收者和數據對的支付摘要。
_getRecipientStatus: 檢索接收者的狀態。策略可以選擇擁有其狀態,只要它返回IStrategy.Status。

QVbase.sol

https://ithelp.ithome.com.tw/upload/images/20231004/20103331qGlBpZ6hB5.png

有根據不同角色做更多的定義:

Recipient受款項目

totalVotesReceived (uint256):接收者收到的總票數
useRegistryAnchor (bool):接收者是否使用註冊Anchor合約
recipientAddress (address):接收者的地址
recipientStatus (InternalRecipientStatus):接收者的狀態
metadata (Metadata):元數據詳細信息

Allocator分配者

voiceCredits (uint256):分配者的總聲量點數
voiceCreditsCastToRecipient (mapping(address => uint256)):分配者向接收者投放的聲量點數

 function _qv_allocate(
        Allocator storage _allocator,
        Recipient storage _recipient,
        address _recipientId,
        uint256 _voiceCreditsToAllocate,
        address _sender
    ) internal onlyActiveAllocation {
        // check the `_voiceCreditsToAllocate` is > 0
        if (_voiceCreditsToAllocate == 0) revert INVALID();

        // get the previous values
        uint256 creditsCastToRecipient = _allocator.voiceCreditsCastToRecipient[_recipientId];
        uint256 votesCastToRecipient = _allocator.votesCastToRecipient[_recipientId];

        // get the total credits and calculate the vote result
        uint256 totalCredits = _voiceCreditsToAllocate + creditsCastToRecipient;
        uint256 voteResult = _sqrt(totalCredits * 1e18);

        // update the values
        voteResult -= votesCastToRecipient;
        totalRecipientVotes += voteResult;
        _recipient.totalVotesReceived += voteResult;

        _allocator.voiceCreditsCastToRecipient[_recipientId] += totalCredits;
        _allocator.votesCastToRecipient[_recipientId] += voteResult;

        // emit the event with the vote results
        emit Allocated(_recipientId, voteResult, _sender);
    }
    
    function _sqrt(uint256 x) internal pure returns (uint256 y) {
        uint256 z = (x + 1) / 2;
        y = x;
        while (z < y) {
            y = z;
            z = (x / z + z) / 2;
        }
    }

QVsimple.sol

有針對QV機制更多的參數,例如

  • 限制點數上現 maxVoiceCreditsPerAllocator (uint256): Maximum voice credits that can be allocated by a single allocator

使用情境

  • 分配者管理
    pool manager可以添加或刪除分配者,使他們能夠為接收項目分配聲量點數。
    添加分配者允許他們參與分配過程。
    刪除分配者將撤銷他們分配聲量點數的能力。

  • 投票分配
    分配者可以根據平方投票算法為特定接收者分配聲量點數。
    maxVoiceCreditsPerAllocator限制了分配者可以分配的聲量點數總數。
    聲量點數用於影響接收者的累積投票。

  • 接收者接受
    接收者必須根據內部狀態被接受才有資格進行投票分配。
    合約在允許分配之前檢查接收者的狀態是否被接受。


上一篇
Day 18 - Strategies
下一篇
Day 20 - 回看Allo.sol + 學習solidity 紀錄
系列文
Web3 X 公共財30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言