Distribution
The Distribution contract provides a comprehensive process for project owners to create and manage distributions...
The Distribution
contract provides a comprehensive process for project owners to create and manage distributions, while also offering interfaces for users to participate in distributions and claim earnings.
Contract Functions
The Distribution
contract, as an extension of the Target contract, provides functionalities including creating distributions, user participation in distributions, cancelling distributions, liquidating distributions, users claiming dividends and distribution tokens. Distribution is a method for project owners to raise funds and allocate tokens through smart contracts.
Contract Structure
The Distribution
contract inherits from the Target
contract and utilizes the SafeMath library
to ensure the security of numerical operations.
Important Variables
distributionIndex
:
Index ID for distributions, starting from 1.distributions
:
Mapping storing details of each distribution.distribution2Owner
:
Records the owner of each distribution.distribution2Funding
:
Records the funding amount for each distribution.distribution2Shares
:
Records the number of shares for each distribution.distribution2TargetId
:
Associates distribution IDs with target IDs.userDistributions
:
Records the list of distributions in which users participate.user2disPending
:
Records the amount of tokens pending for users in distributions.user2disHarvest
:
Records the amount of tokens harvested by users.dis2EndTime
:
Records the end time of distributions.
The Functions:
Events
NewDistributionCreated
:
Triggered when a new distribution is created.NewJoin
:
Triggered when a user participates in a distribution.HarvestDividends
:
Triggered when a user harvests dividends.HarvestDisToken
:
Triggered when a user harvests distribution tokens.
Distribution Management
createDistribution
:
Creates a new distribution, subject to specific conditions such as project status and user permissions.cancelDistribution
:
Allows the owner to cancel a distribution, transitioning its status to310
.ownerLiquidation
:
Allows the owner to liquidate a distribution after it fails, transitioning its status to330
.
User Participation
userJoin
:
Allows users to participate in a distribution using native tokens, recording the participation amount and token quantity.
Claiming Dividends and Tokens
pendingDividends
:
Checks the dividends available for a user to claim.harvestDividends
:
Allows a user to claim their dividends.pendingDisToken
:
Checks the distribution tokens available for a user to claim.harvestDisToken
:
Allows a user to claim their distribution tokens.
Project Payment
payToken
:
Allows the project owner to make a payment, transferring assets to the contract and updating the status to250
.
Whitelist Management
setCheckWhitelist
:
Allows the distribution owner to set whitelist addresses.
Query Functions
getUserDisIds
:
Retrieves a list of all distribution IDs in which a user has participated.getDis2WhiteList
:
Retrieves the whitelist status of a user in a specific distribution.getDisPrice
:
Calculates the premium for a distribution.
Logic
The creator of a distribution must be a Contractor of the project, and the project status needs to be valid.
Users can participate in a distribution using the
userJoin
function with Native Token, earning corresponding token shares based on distribution rules.Distribution owners can cancel a distribution or perform liquidation under certain conditions.
Users can claim dividends and distribution tokens after a successful distribution.
Interface
pragma solidity >=0.8.12;
pragma experimental ABIEncoderV2;
interface IDistribution {
/**
@dev Create a distribution
@param user User address
@param distributionId Distribution ID
*/
event NewDistributionCreated(address indexed user, uint256 distributionId);
/**
@dev User participation event
@param user User address
@param distributionId Distribution ID
@param targetID Corresponding target ID
@param amount Participation amount
*/
event NewJoin(
address indexed user,
uint256 distributionId,
uint256 targetID,
uint256 amount
);
/**
@dev User harvest dividends event
@param user User address
@param amount Amount involved
*/
event HarvestDividends(address indexed user, uint256 amount);
struct DistributionStruct {
uint256 indexer1; // Bytecode 1
uint256 indexer2; // Bytecode 2
address payAddr; // Payment address, project party's fund payment address
address tokenAddr; // Token contract address
}
/**
@dev Get the total number of distributions
*/
function distributionIndex() external view returns (uint256);
/**
@dev Get distribution details by ID
@param _distributionId Distribution ID
@return _disStruct Distribution structure
*/
function distributions(
uint256 _distributionId
) external view returns (DistributionStruct memory _disStruct);
/**
@dev Get the owner of a distribution by ID
@param _distributionId Distribution ID
@return _owner Owner address
*/
function distribution2Owner(uint256 _distributionId) external view returns (address _owner);
/**
@dev Get the funding amount of a distribution by ID
@param _distributionId Distribution ID
@return _funding Funding amount
*/
function distribution2Funding(uint256 _distributionId) external view returns (uint256 _funding);
/**
@dev Create a distribution, only contractors can do this
@param _indexer1 Indexer code 1
@param _indexer2 Indexer code 2
@param _payAddr Payment address, project party's fund payment address
@param _tokenAddr Token contract address
*/
function createDistribution(
uint256 _indexer1,
uint256 _indexer2,
address _payAddr,
address _tokenAddr
) external;
/**
@dev User participates using ETH
@notice msg.value carries the participation amount
@param _distributionId Distribution ID
*/
function userJoin(uint256 _distributionId) external payable;
/**
@dev User views their pending dividends
@param _user User address
@return _amount Pending dividend amount
*/
function pendingDividends(
address _user
) external view returns (uint256 _amount);
/**
@dev User harvests their dividends
*/
function harvestDividends() external;
/**
@dev Project party makes a payment, transferring all assets
@param _distributionId Distribution ID
*/
function payToken(uint256 _distributionId) external;
/**
@dev Get the target ID from distribution data
@param _data Data
@return _targetId Target ID
*/
function getTargetIdFromDis(uint256 _data) external pure returns (uint256 _targetId);
/**
@dev Check if an address is on the whitelist for a distribution
@param _user User address
@param _distributionId Distribution ID
@return _isBool Status
*/
function distribution2WhiteList(
uint256 _user,
uint256 _distributionId
) external view returns (bool _isBool);
/**
@dev Get the target ID of a distribution by ID
@param _distributionId Distribution ID
@return _targetId Target ID
*/
function distribution2TargetId(
uint256 _distributionId
) external view returns (uint256 _targetId);
/**
@dev Get aggregate information of a distribution by ID
@param _user User address
@param _distributionId Distribution ID
@return _disStruct Distribution structure
@return _owner Owner address
@return _funding Current funding amount
@return _targetId Corresponding target ID
@return _joinAmount User's participation amount in the current distribution
*/
function getArgInfo2DisId(
address _user,
uint256 _distributionId
)
external
view
returns (
DistributionStruct memory _disStruct,
address _owner,
uint256 _funding,
uint256 _targetId,
uint256 _joinAmount
);
/**
@dev Set whitelist, only the distribution owner can set
@param _distributionId Distribution ID
@param _whiteList List of whitelist addresses
@param _isBool Status list
*/
function setCheckWhitelist(
uint256 _distributionId,
address[] memory _whiteList,
bool[] memory _isBool
) external;
/**
@dev Get all distributions of a user
@param _user User address
@return _distributions List of distributions
@return _length Number of distributions
*/
function getUserAllDis(
address _user
) external view returns (DistributionStruct[] memory _distributions, uint256 _length);
/**
@dev Get all distribution IDs of a user
@param _user User address
@return _ids List of distribution IDs
*/
function getUserDisIds(
address _user
) external view returns (uint256[] memory _ids);
/**
@dev Check if an address is on the whitelist for a distribution
@param _user User address
@param _id Distribution ID
@return _isBool Status
*/
function getDis2WhiteList(address _user, uint256 _id) external view returns (bool _isBool);
/**
@dev Cancel a distribution, only the distribution owner can do this
@param _distributionId Distribution ID
*/
function cancelDistribution(uint256 _distributionId) external;
}
Last updated