跳转到主要内容

合约信息

属性
地址每个代币独立(在 kas.fun 代币社区页面查看)
网络Kasplex(见合约地址
每个毕业代币都有自己的 Council 合约地址。地址不是全局的——请在代币的社区页面查询。

选举函数

startElection

发起 Council 选举。需要平台 EIP-712 签名。
function startElection(address token, bytes signature) external

voteElection

为候选人投票。代币在选举结束前锁定。
function voteElection(address token, ElectionVoteEntry[] votes) external
ElectionVoteEntry:
字段类型说明
candidateaddress候选人地址
amountuint256分配的代币数量 (wei)

claimElectionTokens

选举结束后领回锁定代币。第一个调用者触发结算。
function claimElectionTokens(address token) external

选举读函数

getElectionState

function getElectionState(address token) external view returns (ElectionState)
返回:
字段类型说明
activebool选举是否进行中
endTimeuint256结束时间戳(unix 秒)
lastElectionEnduint256上次选举结束时间
finalizedbool结果是否已结算
councilSizeuint256席位数
epochuint256选举届期计数器

getCouncilMembers

function getCouncilMembers(address token) external view returns (address[])

isCouncilMember

function isCouncilMember(address token, address account) external view returns (bool)

getTop20Candidates

function getTop20Candidates(address token) external view returns (address[] candidates, uint256[] voteAmounts)
返回按得票数降序排列的候选人。空位用 address(0) 填充。

getCandidateVotes

function getCandidateVotes(address token, address candidate) external view returns (uint256)

治理函数

startGovernance

开启治理周期。仅合约 owner/manager 可调用。
function startGovernance(address token, uint256 proposalPhaseEnd, uint256 votingPhaseEnd) external

createProposal

创建提案。需要平台 EIP-712 签名。
function createProposal(
    address token,
    bytes32 nonce,
    bytes signature,
    uint256[] optionCodes,
    uint256 endTime,
    uint8 proposalType
) external
参数类型说明
tokenaddress代币地址
noncebytes32唯一 nonce
signaturebytes平台签名
optionCodesuint256[]选项标识符
endTimeuint256投票结束时间戳
proposalTypeuint80 = 通用, 1 = 税费

voteProposal

通过锁定代币对提案投票。
function voteProposal(address token, uint256 proposalId, VoteEntry[] votes) external
VoteEntry:
字段类型说明
targetaddress通用提案用 address(0)
optionIndexuint8要投票的选项索引
amountuint256分配的代币数量 (wei)

finalizeProposal

投票结束后结算提案。
function finalizeProposal(address token, uint256 proposalId) external

claimProposalTokens

提案结束后领回锁定代币。第一个调用者触发结算。
function claimProposalTokens(address token, uint256 proposalId) external

治理读函数

getCouncilState

function getCouncilState(address token) external view returns (CouncilState)
返回:
字段类型说明
currentProposalIduint256最新提案 ID
treasuryBalanceuint256国库余额 (wei)
governancePhaseuint80 = 空闲, 1 = 提案, 2 = 投票
proposalPhaseEnduint256提案阶段截止时间戳
votingPhaseEnduint256投票阶段截止时间戳
roundFirstProposalIduint256当前轮次第一个提案 ID

getProposal

function getProposal(address token, uint256 proposalId) external view returns (Proposal)
返回:
字段类型说明
startTimeuint256开始时间戳
endTimeuint256结束时间戳
finalizedbool是否已结算
executedbool是否已执行
proposalTypeuint80 = 通用, 1 = 税费
noncebytes32唯一 nonce
optionCountuint256选项数量
winningOptionuint256胜出选项索引
optionCodesuint256[]选项代码标识符

getProposalOptionVotes

function getProposalOptionVotes(address token, uint256 proposalId) external view returns (uint256[])
返回每个选项的得票数(数组索引 = 选项索引)。

getVoterOptionVotes

function getVoterOptionVotes(address token, uint256 proposalId, address voter) external view returns (uint256[])
返回投票者分配给每个选项的代币数量。

getVoterLockedAmount

function getVoterLockedAmount(address token, uint256 proposalId, address voter) external view returns (uint256)
返回投票者在提案中锁定的代币总量。提案结束后可领回。

税费函数

setTaxConfig

function setTaxConfig(address token, uint256 rate, uint8 purpose, address target) external
仅 owner/manager 可调用。Purpose: 0=无, 1=销毁, 2=转账, 3=国库。

getTaxConfig

function getTaxConfig(address token) external view returns (TaxConfig)
返回:
字段类型说明
rateuint256税率(基点)
purposeuint80=无, 1=销毁, 2=转账, 3=国库
targetaddress税收接收地址

isTaxExempt

function isTaxExempt(address token, address account) external view returns (bool)

事件

选举事件

event ElectionStarted(address indexed token, uint256 endTime, uint256 councilSize)
event ElectionVoted(address indexed token, address indexed voter, uint256 totalLocked, address[] candidates, uint256[] amounts)
event ElectionFinalized(address indexed token, address[] councilMembers)
event ElectionTokensClaimed(address indexed token, address indexed voter, uint256 amount)

提案事件

event ProposalCreated(address indexed token, uint256 indexed proposalId, bytes32 indexed nonce, address proposer, uint8 proposalType, uint256[] optionCodes, uint256 endTime)
event ProposalFinalized(address indexed token, uint256 indexed proposalId, uint256 winningOption, uint256 winningVotes)

完整 ABI (JSON)

[
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "councilSize", "type": "uint256"}, {"internalType": "uint256", "name": "minInterval", "type": "uint256"}, {"internalType": "uint256", "name": "duration", "type": "uint256"}], "name": "initElectionConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "signature", "type": "bytes"}], "name": "startElection", "outputs": [], "stateMutability": "nonpayable", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"components": [{"internalType": "address", "name": "candidate", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "internalType": "struct ICouncil.ElectionVoteEntry[]", "name": "votes", "type": "tuple[]"}], "name": "voteElection", "outputs": [], "stateMutability": "nonpayable", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}], "name": "claimElectionTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "proposalPhaseEnd", "type": "uint256"}, {"internalType": "uint256", "name": "votingPhaseEnd", "type": "uint256"}], "name": "startGovernance", "outputs": [], "stateMutability": "nonpayable", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"internalType": "bytes32", "name": "nonce", "type": "bytes32"}, {"internalType": "bytes", "name": "signature", "type": "bytes"}, {"internalType": "uint256[]", "name": "optionCodes", "type": "uint256[]"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}, {"internalType": "uint8", "name": "proposalType", "type": "uint8"}], "name": "createProposal", "outputs": [], "stateMutability": "nonpayable", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "proposalId", "type": "uint256"}, {"components": [{"internalType": "address", "name": "target", "type": "address"}, {"internalType": "uint8", "name": "optionIndex", "type": "uint8"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "internalType": "struct ICouncil.VoteEntry[]", "name": "votes", "type": "tuple[]"}], "name": "voteProposal", "outputs": [], "stateMutability": "nonpayable", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "proposalId", "type": "uint256"}], "name": "finalizeProposal", "outputs": [], "stateMutability": "nonpayable", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "proposalId", "type": "uint256"}], "name": "claimProposalTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "rate", "type": "uint256"}, {"internalType": "uint8", "name": "purpose", "type": "uint8"}, {"internalType": "address", "name": "target", "type": "address"}], "name": "setTaxConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}], "name": "getElectionState", "outputs": [{"components": [{"internalType": "bool", "name": "active", "type": "bool"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}, {"internalType": "uint256", "name": "lastElectionEnd", "type": "uint256"}, {"internalType": "bool", "name": "finalized", "type": "bool"}, {"internalType": "uint256", "name": "councilSize", "type": "uint256"}, {"internalType": "uint256", "name": "epoch", "type": "uint256"}], "internalType": "struct ICouncil.ElectionState", "name": "", "type": "tuple"}], "stateMutability": "view", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}], "name": "getCouncilMembers", "outputs": [{"internalType": "address[]", "name": "", "type": "address[]"}], "stateMutability": "view", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"internalType": "address", "name": "account", "type": "address"}], "name": "isCouncilMember", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}], "name": "getTop20Candidates", "outputs": [{"internalType": "address[]", "name": "candidates", "type": "address[]"}, {"internalType": "uint256[]", "name": "voteAmounts", "type": "uint256[]"}], "stateMutability": "view", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"internalType": "address", "name": "candidate", "type": "address"}], "name": "getCandidateVotes", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}], "name": "getCouncilState", "outputs": [{"components": [{"internalType": "uint256", "name": "currentProposalId", "type": "uint256"}, {"internalType": "uint256", "name": "treasuryBalance", "type": "uint256"}, {"internalType": "uint8", "name": "governancePhase", "type": "uint8"}, {"internalType": "uint256", "name": "proposalPhaseEnd", "type": "uint256"}, {"internalType": "uint256", "name": "votingPhaseEnd", "type": "uint256"}, {"internalType": "uint256", "name": "roundFirstProposalId", "type": "uint256"}], "internalType": "struct ICouncil.CouncilState", "name": "", "type": "tuple"}], "stateMutability": "view", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "proposalId", "type": "uint256"}], "name": "getProposal", "outputs": [{"components": [{"internalType": "uint256", "name": "startTime", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}, {"internalType": "bool", "name": "finalized", "type": "bool"}, {"internalType": "bool", "name": "executed", "type": "bool"}, {"internalType": "uint8", "name": "proposalType", "type": "uint8"}, {"internalType": "bytes32", "name": "nonce", "type": "bytes32"}, {"internalType": "uint256", "name": "optionCount", "type": "uint256"}, {"internalType": "uint256", "name": "winningOption", "type": "uint256"}, {"internalType": "uint256[]", "name": "optionCodes", "type": "uint256[]"}], "internalType": "struct ICouncil.Proposal", "name": "", "type": "tuple"}], "stateMutability": "view", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "proposalId", "type": "uint256"}], "name": "getProposalOptionVotes", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "proposalId", "type": "uint256"}, {"internalType": "address", "name": "voter", "type": "address"}], "name": "getVoterOptionVotes", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "proposalId", "type": "uint256"}, {"internalType": "address", "name": "voter", "type": "address"}], "name": "getVoterLockedAmount", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}], "name": "getTaxConfig", "outputs": [{"components": [{"internalType": "uint256", "name": "rate", "type": "uint256"}, {"internalType": "uint8", "name": "purpose", "type": "uint8"}, {"internalType": "address", "name": "target", "type": "address"}], "internalType": "struct ICouncil.TaxConfig", "name": "", "type": "tuple"}], "stateMutability": "view", "type": "function"},
  {"inputs": [{"internalType": "address", "name": "token", "type": "address"}, {"internalType": "address", "name": "account", "type": "address"}], "name": "isTaxExempt", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"},
  {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "token", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "councilSize", "type": "uint256"}], "name": "ElectionStarted", "type": "event"},
  {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "token", "type": "address"}, {"indexed": false, "internalType": "address[]", "name": "councilMembers", "type": "address[]"}], "name": "ElectionFinalized", "type": "event"},
  {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "token", "type": "address"}, {"indexed": true, "internalType": "address", "name": "voter", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "totalLocked", "type": "uint256"}, {"indexed": false, "internalType": "address[]", "name": "candidates", "type": "address[]"}, {"indexed": false, "internalType": "uint256[]", "name": "amounts", "type": "uint256[]"}], "name": "ElectionVoted", "type": "event"},
  {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "token", "type": "address"}, {"indexed": true, "internalType": "address", "name": "voter", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "ElectionTokensClaimed", "type": "event"},
  {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "token", "type": "address"}, {"indexed": true, "internalType": "uint256", "name": "proposalId", "type": "uint256"}, {"indexed": true, "internalType": "bytes32", "name": "nonce", "type": "bytes32"}, {"indexed": false, "internalType": "address", "name": "proposer", "type": "address"}, {"indexed": false, "internalType": "uint8", "name": "proposalType", "type": "uint8"}, {"indexed": false, "internalType": "uint256[]", "name": "optionCodes", "type": "uint256[]"}, {"indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "ProposalCreated", "type": "event"},
  {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "token", "type": "address"}, {"indexed": true, "internalType": "uint256", "name": "proposalId", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "winningOption", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "winningVotes", "type": "uint256"}], "name": "ProposalFinalized", "type": "event"}
]