Commit c1016c12 authored by liuyuhang's avatar liuyuhang

修改 change提案

parent 83b88f85
......@@ -14,7 +14,6 @@ import (
auty "github.com/33cn/plugin/plugin/dapp/autonomy/types"
"github.com/33cn/chain33/common/address"
"syscall"
ticket "github.com/33cn/plugin/plugin/dapp/ticket/executor"
ticketTy "github.com/33cn/plugin/plugin/dapp/ticket/types"
)
......@@ -464,7 +463,6 @@ func (a *action) getActiveRule() (*auty.RuleConfig, error) {
return nil, err
}
} else { // 载入系统默认值
rule.BoardAttendRatio = boardAttendRatio
rule.BoardApproveRatio = boardApproveRatio
rule.PubOpposeRatio = pubOpposeRatio
rule.ProposalAmount = proposalAmount
......
......@@ -29,6 +29,13 @@ func (a *action) propChange(prob *auty.ProposalChange) (*types.Receipt, error) {
alog.Error("propChange ", "addr", a.fromaddr, "execaddr", a.execaddr, "getActiveBoard failed", err)
return nil, err
}
// 检查是否符合提案修改
new, err := a.checkChangeable(act, prob.Changes)
if err != nil {
alog.Error("propChange ", "addr", a.fromaddr, "execaddr", a.execaddr, "checkChangeable failed", err)
return nil, err
}
// 获取当前生效提案规则,并且将不修改的规则补齐
rule, err := a.getActiveRule()
if err != nil {
......@@ -51,7 +58,8 @@ func (a *action) propChange(prob *auty.ProposalChange) (*types.Receipt, error) {
cur := &auty.AutonomyProposalChange{
PropChange: prob,
CurRule: rule,
VoteResult: &auty.VoteResult{},
Board: new,
VoteResult: &auty.VoteResult{TotalVotes:int32(len(act.Boards))},
Status: auty.AutonomyStatusProposalChange,
Address: a.fromaddr,
Height: a.height,
......@@ -104,9 +112,9 @@ func (a *action) rvkPropChange(rvkProb *auty.RevokeProposalChange) (*types.Recei
var logs []*types.ReceiptLog
var kv []*types.KeyValue
receipt, err := a.coinsAccount.ExecActive(a.fromaddr, a.execaddr, cur.CurChange.ProposalAmount)
receipt, err := a.coinsAccount.ExecActive(a.fromaddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil {
alog.Error("rvkPropChange ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecActive amount", cur.CurChange.ProposalAmount, "err", err)
alog.Error("rvkPropChange ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecActive amount", cur.CurRule.ProposalAmount, "err", err)
return nil, err
}
logs = append(logs, receipt.Logs...)
......@@ -160,14 +168,6 @@ func (a *action) votePropChange(voteProb *auty.VoteProposalChange) (*types.Recei
// 更新投票记录
votes.Address = append(votes.Address, a.fromaddr)
if cur.GetVoteResult().TotalVotes == 0 { //需要统计票数
vtCouts, err := a.getTotalVotes(start)
if err != nil {
return nil, err
}
cur.VoteResult.TotalVotes = vtCouts
}
// 获取可投票数
vtCouts, err := a.getAddressVotes(a.fromaddr, start)
if err != nil {
......@@ -184,7 +184,7 @@ func (a *action) votePropChange(voteProb *auty.VoteProposalChange) (*types.Recei
// 首次进入投票期,即将提案金转入自治系统地址
if cur.Status == auty.AutonomyStatusProposalChange {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyFundAddr, a.execaddr, cur.CurChange.ProposalAmount)
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyFundAddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil {
alog.Error("votePropChange ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
......@@ -194,9 +194,7 @@ func (a *action) votePropChange(voteProb *auty.VoteProposalChange) (*types.Recei
}
if cur.VoteResult.TotalVotes != 0 &&
cur.VoteResult.ApproveVotes+cur.VoteResult.OpposeVotes != 0 &&
float32(cur.VoteResult.ApproveVotes+cur.VoteResult.OpposeVotes)/float32(cur.VoteResult.TotalVotes) > float32(pubAttendRatio)/100.0 &&
float32(cur.VoteResult.ApproveVotes)/float32(cur.VoteResult.ApproveVotes+cur.VoteResult.OpposeVotes) > float32(pubApproveRatio)/100.0 {
float32(cur.VoteResult.ApproveVotes)/float32(cur.VoteResult.TotalVotes) > float32(cur.CurRule.BoardApproveRatio)/100.0 {
cur.VoteResult.Pass = true
cur.PropChange.RealEndBlockHeight = a.height
}
......@@ -211,10 +209,9 @@ func (a *action) votePropChange(voteProb *auty.VoteProposalChange) (*types.Recei
// 更新VotesRecord
kv = append(kv, &types.KeyValue{Key: votesRecord(voteProb.ProposalID), Value: types.Encode(votes)})
// 更新系统规则
// 更新activeBoard
if cur.VoteResult.Pass {
upChange := upgradeChange(cur.CurChange, cur.PropChange.ChangeCfg)
kv = append(kv, &types.KeyValue{Key: activeChangeID(), Value: types.Encode(upChange)})
kv = append(kv, &types.KeyValue{Key: activeBoardID(), Value: types.Encode(cur.Board)})
}
ty := auty.TyLogVotePropChange
......@@ -246,7 +243,6 @@ func (a *action) tmintPropChange(tmintProb *auty.TerminateProposalChange) (*type
return nil, err
}
start := cur.GetPropChange().StartBlockHeight
end := cur.GetPropChange().EndBlockHeight
if a.height < end && !cur.VoteResult.Pass {
err := auty.ErrTerminatePeriod
......@@ -255,16 +251,8 @@ func (a *action) tmintPropChange(tmintProb *auty.TerminateProposalChange) (*type
return nil, err
}
if cur.GetVoteResult().TotalVotes == 0 { //需要统计票数
vtCouts, err := a.getTotalVotes(start)
if err != nil {
return nil, err
}
cur.VoteResult.TotalVotes = vtCouts
}
if float32(cur.VoteResult.ApproveVotes+cur.VoteResult.OpposeVotes)/float32(cur.VoteResult.TotalVotes) > float32(pubAttendRatio)/100.0 &&
float32(cur.VoteResult.ApproveVotes)/float32(cur.VoteResult.ApproveVotes+cur.VoteResult.OpposeVotes) > float32(pubApproveRatio)/100.0 {
if cur.VoteResult.TotalVotes != 0 &&
float32(cur.VoteResult.ApproveVotes)/float32(cur.VoteResult.TotalVotes) > float32(cur.CurRule.BoardApproveRatio)/100.0 {
cur.VoteResult.Pass = true
} else {
cur.VoteResult.Pass = false
......@@ -276,7 +264,7 @@ func (a *action) tmintPropChange(tmintProb *auty.TerminateProposalChange) (*type
// 未进行投票情况下,符合提案关闭的也需要扣除提案费用
if cur.Status == auty.AutonomyStatusProposalChange {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyFundAddr, a.execaddr, cur.CurChange.ProposalAmount)
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyFundAddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil {
alog.Error("votePropChange ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
......@@ -292,8 +280,7 @@ func (a *action) tmintPropChange(tmintProb *auty.TerminateProposalChange) (*type
// 更新系统规则
if cur.VoteResult.Pass {
upChange := upgradeChange(cur.CurChange, cur.PropChange.ChangeCfg)
kv = append(kv, &types.KeyValue{Key: activeChangeID(), Value: types.Encode(upChange)})
kv = append(kv, &types.KeyValue{Key: activeBoardID(), Value: types.Encode(cur.Board)})
}
receiptLog := getChangeReceiptLog(pre, cur, auty.TyLogTmintPropChange)
logs = append(logs, receiptLog)
......@@ -314,6 +301,48 @@ func (a *action) getProposalChange(ID string) (*auty.AutonomyProposalChange, err
return cur, nil
}
func (a *action) checkChangeable(act *auty.ActiveBoard, change []*auty.Change) (*auty.ActiveBoard, error) {
mpBd := make(map[string]struct{})
mpRbd := make(map[string]struct{})
for _, b := range act.Boards {
mpBd[b] = struct{}{}
}
for _, b := range act.Revboards {
mpRbd[b] = struct{}{}
}
for _, ch := range change {
if ch.Cancel {
if _, ok := mpBd[ch.Addr]; !ok {
return nil, auty.ErrChangeBoardAddr
}
// 将删除的加入对端
delete(mpBd, ch.Addr)
mpRbd[ch.Addr] = struct{}{}
} else {
if _, ok := mpRbd[ch.Addr]; !ok {
return nil, auty.ErrChangeBoardAddr
}
// 将删除的加入对端
delete(mpRbd, ch.Addr)
mpBd[ch.Addr] = struct{}{}
}
}
if len(mpBd) > maxBoards || len(mpBd) < minBoards {
return nil, auty.ErrBoardNumber
}
new := &auty.ActiveBoard{
Amount: act.Amount,
StartHeight: act.StartHeight,
}
for k := range mpBd {
new.Boards = append(new.Boards, k)
}
for k := range mpRbd {
new.Revboards = append(new.Revboards, k)
}
return new, nil
}
// getReceiptLog 根据提案信息获取log
// 状态变化:
func getChangeReceiptLog(pre, cur *auty.AutonomyProposalChange, ty int32) *types.ReceiptLog {
......@@ -332,14 +361,21 @@ func copyAutonomyProposalChange(cur *auty.AutonomyProposalChange) *auty.Autonomy
if cur.PropChange != nil {
newPropChange := *cur.GetPropChange()
newAut.PropChange = &newPropChange
if cur.PropChange.ChangeCfg != nil {
cfg := *cur.GetPropChange().GetChangeCfg()
newAut.PropChange.ChangeCfg = &cfg
if cur.PropChange.Changes != nil {
chs := cur.GetPropChange().GetChanges()
for _, ch := range chs {
newch := *ch
newAut.PropChange.Changes = append(newAut.PropChange.Changes, &newch)
}
}
}
if cur.CurChange != nil {
newChange := *cur.GetCurChange()
newAut.CurChange = &newChange
if cur.CurRule != nil {
newChange := *cur.GetCurRule()
newAut.CurRule = &newChange
}
if cur.Board != nil {
newBoard := *cur.GetBoard()
newAut.Board = &newBoard
}
if cur.VoteResult != nil {
newRes := *cur.GetVoteResult()
......@@ -347,29 +383,3 @@ func copyAutonomyProposalChange(cur *auty.AutonomyProposalChange) *auty.Autonomy
}
return &newAut
}
func upgradeChange(cur, modify *auty.ChangeConfig) *auty.ChangeConfig {
if cur == nil || modify == nil {
return nil
}
new := *cur
if modify.BoardAttendRatio > 0 {
new.BoardAttendRatio = modify.BoardAttendRatio
}
if modify.BoardApproveRatio > 0 {
new.BoardApproveRatio = modify.BoardApproveRatio
}
if modify.PubOpposeRatio > 0 {
new.PubOpposeRatio = modify.PubOpposeRatio
}
if modify.ProposalAmount > 0 {
new.ProposalAmount = modify.ProposalAmount
}
if modify.LargeProjectAmount > 0 {
new.LargeProjectAmount = modify.LargeProjectAmount
}
if modify.PublicPeriod > 0 {
new.PublicPeriod = modify.PublicPeriod
}
return &new
}
......@@ -70,3 +70,12 @@ func calcCommentHeight(ID, heightindex string) []byte {
key := fmt.Sprintf(localCommentPrefix+"%s-"+"%s", ID, heightindex)
return []byte(key)
}
var (
// change
changePrefix = idPrefix + "change" + "-"
)
func propChangeID(txHash string) []byte {
return []byte(fmt.Sprintf("%s%s", changePrefix, txHash))
}
\ No newline at end of file
......@@ -13,7 +13,7 @@ import (
)
const (
maxBoardPeriodAmount = types.Coin * 10000 * 300 // 每个时期董事会审批最大额度200万
maxBoardPeriodAmount = types.Coin * 10000 * 300 // 每个时期董事会审批最大额度300万
boardPeriod = 17280 * 30 * 1 // 时期为一个月
)
......@@ -242,9 +242,7 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec
}
if cur.BoardVoteRes.TotalVotes != 0 &&
cur.BoardVoteRes.ApproveVotes+cur.BoardVoteRes.OpposeVotes != 0 &&
float32(cur.BoardVoteRes.ApproveVotes+cur.BoardVoteRes.OpposeVotes)/float32(cur.BoardVoteRes.TotalVotes) >= float32(cur.CurRule.BoardAttendRatio)/100.0 &&
float32(cur.BoardVoteRes.ApproveVotes)/float32(cur.BoardVoteRes.ApproveVotes+cur.BoardVoteRes.OpposeVotes) >= float32(cur.CurRule.BoardApproveRatio)/100.0 {
float32(cur.BoardVoteRes.ApproveVotes)/float32(cur.BoardVoteRes.TotalVotes) >= float32(cur.CurRule.BoardApproveRatio)/100.0 {
cur.BoardVoteRes.Pass = true
cur.PropProject.RealEndBlockHeight = a.height
}
......@@ -447,16 +445,14 @@ func (a *action) tmintPropProject(tmintProb *auty.TerminateProposalProject) (*ty
}
if cur.BoardVoteRes.TotalVotes != 0 &&
cur.BoardVoteRes.ApproveVotes+cur.BoardVoteRes.OpposeVotes != 0 &&
float32(cur.BoardVoteRes.ApproveVotes+cur.BoardVoteRes.OpposeVotes)/float32(cur.BoardVoteRes.TotalVotes) >= float32(cur.CurRule.BoardAttendRatio)/100.0 &&
float32(cur.BoardVoteRes.ApproveVotes)/float32(cur.BoardVoteRes.ApproveVotes+cur.BoardVoteRes.OpposeVotes) >= float32(cur.CurRule.BoardApproveRatio)/100.0 {
float32(cur.BoardVoteRes.ApproveVotes)/float32(cur.BoardVoteRes.TotalVotes) >= float32(cur.CurRule.BoardApproveRatio)/100.0 {
cur.BoardVoteRes.Pass = true
} else {
cur.BoardVoteRes.Pass = false
}
if cur.PubVote.Publicity {
if cur.GetBoardVoteRes().TotalVotes == 0 { //需要统计总票数
if cur.PubVote.TotalVotes == 0 { //需要统计总票数
vtCouts, err := a.getTotalVotes(start)
if err != nil {
return nil, err
......
......@@ -29,15 +29,14 @@ const (
func (a *action) propRule(prob *auty.ProposalRule) (*types.Receipt, error) {
//如果全小于等于0,则说明该提案规则参数不正确
if prob.RuleCfg == nil || prob.RuleCfg.BoardAttendRatio < minBoardAttendRatio && prob.RuleCfg.BoardApproveRatio < minBoardApproveRatio &&
prob.RuleCfg.PubOpposeRatio <= minPubOpposeRatio && prob.RuleCfg.ProposalAmount <= 0 && prob.RuleCfg.LargeProjectAmount <= 0 &&
prob.RuleCfg.PublicPeriod <= 0 {
if prob.RuleCfg == nil || prob.RuleCfg.BoardApproveRatio < minBoardApproveRatio && prob.RuleCfg.PubOpposeRatio <= minPubOpposeRatio &&
prob.RuleCfg.ProposalAmount <= 0 && prob.RuleCfg.LargeProjectAmount <= 0 && prob.RuleCfg.PublicPeriod <= 0 {
alog.Error("propRule ", "ProposalRule RuleCfg invaild or have no modify param", prob.RuleCfg)
return nil, types.ErrInvalidParam
}
if prob.RuleCfg.BoardAttendRatio > MaxBoardAttendRatio || prob.RuleCfg.BoardApproveRatio > maxBoardApproveRatio || prob.RuleCfg.PubOpposeRatio > maxPubOpposeRatio {
alog.Error("propRule RuleCfg invaild", "BoardAttendRatio", prob.RuleCfg.BoardAttendRatio, "BoardApproveRatio",
prob.RuleCfg.BoardApproveRatio, "PubOpposeRatio", prob.RuleCfg.PubOpposeRatio)
if prob.RuleCfg.BoardApproveRatio > maxBoardApproveRatio || prob.RuleCfg.PubOpposeRatio > maxPubOpposeRatio {
alog.Error("propRule RuleCfg invaild", "BoardApproveRatio", prob.RuleCfg.BoardApproveRatio,
"PubOpposeRatio", prob.RuleCfg.PubOpposeRatio)
return nil, types.ErrInvalidParam
}
if prob.StartBlockHeight < a.height || prob.EndBlockHeight < a.height {
......@@ -431,9 +430,6 @@ func upgradeRule(cur, modify *auty.RuleConfig) *auty.RuleConfig {
return nil
}
new := *cur
if modify.BoardAttendRatio > 0 {
new.BoardAttendRatio = modify.BoardAttendRatio
}
if modify.BoardApproveRatio > 0 {
new.BoardApproveRatio = modify.BoardApproveRatio
}
......
......@@ -13,14 +13,16 @@ message AutonomyProposalChange {
ProposalChange propChange = 1;
// 投票该提案的规则
RuleConfig curRule = 2;
// 投票董事会
ActiveBoard board = 3;
// 全体持票人投票结果
VoteResult voteResult = 3;
VoteResult voteResult = 4;
// 状态
int32 status = 4;
string address = 5;
int64 height = 6;
int32 index = 7;
string proposalID = 8;
int32 status = 5;
string address = 6;
int64 height = 7;
int32 index = 8;
string proposalID = 9;
}
// action
......
......@@ -33,18 +33,16 @@ message VotesRecord {
}
message RuleConfig {
// 董事会成员参与率,以%为单位,只保留整数部分
int32 boardAttendRatio = 1;
// 董事会成员赞成率
int32 boardApproveRatio = 2;
// 董事会成员赞成率,以%为单位,只保留整数部分
int32 boardApproveRatio = 1;
// 全体持票人否决率
int32 pubOpposeRatio = 3;
int32 pubOpposeRatio = 2;
// 提案金额
int64 proposalAmount = 4;
int64 proposalAmount = 3;
// 重大项目公示金额阈值
int64 largeProjectAmount = 5;
int64 largeProjectAmount = 4;
// 重大项目公示时间(以区块数为单位)
int32 publicPeriod = 6;
int32 publicPeriod = 5;
}
message ActiveBoard {
......
......@@ -16,14 +16,16 @@ type AutonomyProposalChange struct {
PropChange *ProposalChange `protobuf:"bytes,1,opt,name=propChange" json:"propChange,omitempty"`
// 投票该提案的规则
CurRule *RuleConfig `protobuf:"bytes,2,opt,name=curRule" json:"curRule,omitempty"`
// 投票董事会
Board *ActiveBoard `protobuf:"bytes,3,opt,name=board" json:"board,omitempty"`
// 全体持票人投票结果
VoteResult *VoteResult `protobuf:"bytes,3,opt,name=voteResult" json:"voteResult,omitempty"`
VoteResult *VoteResult `protobuf:"bytes,4,opt,name=voteResult" json:"voteResult,omitempty"`
// 状态
Status int32 `protobuf:"varint,4,opt,name=status" json:"status,omitempty"`
Address string `protobuf:"bytes,5,opt,name=address" json:"address,omitempty"`
Height int64 `protobuf:"varint,6,opt,name=height" json:"height,omitempty"`
Index int32 `protobuf:"varint,7,opt,name=index" json:"index,omitempty"`
ProposalID string `protobuf:"bytes,8,opt,name=proposalID" json:"proposalID,omitempty"`
Status int32 `protobuf:"varint,5,opt,name=status" json:"status,omitempty"`
Address string `protobuf:"bytes,6,opt,name=address" json:"address,omitempty"`
Height int64 `protobuf:"varint,7,opt,name=height" json:"height,omitempty"`
Index int32 `protobuf:"varint,8,opt,name=index" json:"index,omitempty"`
ProposalID string `protobuf:"bytes,9,opt,name=proposalID" json:"proposalID,omitempty"`
}
func (m *AutonomyProposalChange) Reset() { *m = AutonomyProposalChange{} }
......@@ -45,6 +47,13 @@ func (m *AutonomyProposalChange) GetCurRule() *RuleConfig {
return nil
}
func (m *AutonomyProposalChange) GetBoard() *ActiveBoard {
if m != nil {
return m.Board
}
return nil
}
func (m *AutonomyProposalChange) GetVoteResult() *VoteResult {
if m != nil {
return m.VoteResult
......@@ -374,41 +383,43 @@ func init() {
func init() { proto.RegisterFile("change.proto", fileDescriptor2) }
var fileDescriptor2 = []byte{
// 571 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xcf, 0x6f, 0xd3, 0x30,
0x14, 0x56, 0x9a, 0x26, 0x6d, 0x5f, 0xd9, 0x34, 0xcc, 0x56, 0xac, 0x09, 0x50, 0x95, 0x03, 0x44,
0x20, 0x55, 0xda, 0xf8, 0x25, 0x4e, 0x88, 0x0d, 0x24, 0x90, 0x10, 0x02, 0x0b, 0x71, 0xe1, 0x64,
0x92, 0x47, 0x1b, 0x2d, 0xb5, 0x83, 0xe3, 0x54, 0xf4, 0xcc, 0xff, 0xc2, 0x95, 0xbf, 0x8f, 0x1b,
0xb2, 0xe3, 0xae, 0x69, 0x1b, 0x69, 0xec, 0xe6, 0xef, 0xf9, 0x7b, 0x4f, 0xfe, 0x3e, 0xfb, 0x33,
0xdc, 0x48, 0x66, 0x5c, 0x4c, 0x71, 0x52, 0x28, 0xa9, 0x25, 0x09, 0xf4, 0xb2, 0xc0, 0xf2, 0x78,
0x2f, 0x4f, 0xe4, 0x7c, 0x2e, 0x45, 0x5d, 0x8d, 0xfe, 0x74, 0x60, 0xf4, 0xaa, 0xd2, 0x52, 0xc8,
0xf9, 0xf2, 0xa3, 0x92, 0x85, 0x2c, 0x79, 0x7e, 0x6e, 0xdb, 0xc8, 0x53, 0x80, 0x42, 0xc9, 0xa2,
0x46, 0xd4, 0x1b, 0x7b, 0xf1, 0xf0, 0xf4, 0x68, 0x62, 0xa7, 0x4c, 0x36, 0xa9, 0xac, 0x41, 0x24,
0x8f, 0xa0, 0x97, 0x54, 0x8a, 0x55, 0x39, 0xd2, 0x8e, 0xed, 0xb9, 0xe9, 0x7a, 0x4c, 0xe9, 0x5c,
0x8a, 0xef, 0xd9, 0x94, 0xad, 0x18, 0xe4, 0x04, 0x60, 0x21, 0x35, 0x32, 0x2c, 0xab, 0x5c, 0x53,
0x7f, 0x83, 0xff, 0xe5, 0x72, 0x83, 0x35, 0x48, 0x64, 0x04, 0x61, 0xa9, 0xb9, 0xae, 0x4a, 0xda,
0x1d, 0x7b, 0x71, 0xc0, 0x1c, 0x22, 0x14, 0x7a, 0x3c, 0x4d, 0x15, 0x96, 0x25, 0x0d, 0xc6, 0x5e,
0x3c, 0x60, 0x2b, 0x68, 0x3a, 0x66, 0x98, 0x4d, 0x67, 0x9a, 0x86, 0x63, 0x2f, 0xf6, 0x99, 0x43,
0xe4, 0x10, 0x82, 0x4c, 0xa4, 0xf8, 0x93, 0xf6, 0xec, 0xa0, 0x1a, 0x90, 0x7b, 0xb5, 0x6c, 0xa3,
0xee, 0xdd, 0x6b, 0xda, 0xb7, 0xa3, 0x1a, 0x95, 0xe8, 0xaf, 0x07, 0xfb, 0x5b, 0x4e, 0x11, 0xe8,
0x2e, 0x91, 0x2b, 0xeb, 0x51, 0xc0, 0xec, 0xda, 0x0c, 0x9f, 0x4b, 0xa1, 0x67, 0xd6, 0x84, 0x80,
0xd5, 0x80, 0x1c, 0x80, 0x9f, 0xf2, 0xa5, 0x15, 0x1a, 0x30, 0xb3, 0x24, 0x0f, 0xa0, 0x57, 0x4f,
0x31, 0x7a, 0xfc, 0x78, 0x78, 0xba, 0xe7, 0xe4, 0x3b, 0x6b, 0x57, 0xbb, 0xe4, 0x21, 0x1c, 0x94,
0x9a, 0x2b, 0x7d, 0x96, 0xcb, 0xe4, 0xe2, 0x6d, 0xad, 0x27, 0xb0, 0x7a, 0x76, 0xea, 0xe4, 0x3e,
0xec, 0xa3, 0x48, 0x9b, 0xcc, 0x5a, 0xf9, 0x56, 0x95, 0x4c, 0x80, 0x28, 0xe4, 0xf9, 0x9b, 0x4d,
0x6e, 0xcf, 0x72, 0x5b, 0x76, 0xa2, 0x27, 0x10, 0x3a, 0xc9, 0x23, 0x08, 0x13, 0x2e, 0x12, 0xcc,
0xad, 0xe8, 0x3e, 0x73, 0xc8, 0x58, 0x61, 0x6c, 0xb7, 0xaa, 0x07, 0xcc, 0xae, 0xa3, 0x67, 0x70,
0xc8, 0x70, 0x21, 0x2f, 0x70, 0xcb, 0xb6, 0x4d, 0xa7, 0xbd, 0x1d, 0xa7, 0x3f, 0x00, 0x31, 0x6f,
0xe0, 0x7a, 0x5d, 0xf6, 0x1d, 0x14, 0x85, 0x92, 0x8b, 0xfa, 0xfd, 0xf5, 0xd9, 0x0a, 0x46, 0x2f,
0xe0, 0xf6, 0x67, 0x54, 0xf3, 0x4c, 0xf0, 0xeb, 0x0e, 0x8d, 0x7e, 0x79, 0x70, 0xc4, 0x30, 0xc1,
0xac, 0xd0, 0x5b, 0x9d, 0x27, 0xd0, 0x2d, 0x14, 0x2e, 0x5c, 0x3e, 0xee, 0xba, 0xcb, 0x6b, 0x8f,
0x14, 0xb3, 0x54, 0xf2, 0xdc, 0x26, 0x44, 0xa1, 0xd0, 0x2e, 0x21, 0x57, 0x74, 0xad, 0xd8, 0xd1,
0x0c, 0x6e, 0xbd, 0x97, 0x09, 0xcf, 0x77, 0x82, 0x1a, 0x9a, 0xa3, 0x9e, 0xa5, 0xff, 0x77, 0x08,
0x47, 0x26, 0xc7, 0xd0, 0x37, 0x5f, 0x01, 0x0a, 0x5d, 0xd2, 0xce, 0xd8, 0x8f, 0x07, 0xec, 0x12,
0x47, 0xbf, 0x3d, 0x18, 0x31, 0xfc, 0xf1, 0xa9, 0x42, 0xb5, 0xfd, 0x2d, 0xac, 0xf3, 0xe7, 0x6d,
0xe4, 0xaf, 0xe5, 0xe6, 0x4d, 0x08, 0x12, 0x59, 0x09, 0xed, 0x1e, 0x7c, 0x0d, 0xc8, 0x1d, 0x18,
0xa4, 0x99, 0xc2, 0x44, 0x67, 0x52, 0xb8, 0x10, 0xaf, 0x0b, 0x8d, 0xb4, 0x06, 0xed, 0x69, 0x0d,
0x1b, 0x69, 0x8d, 0xbe, 0x02, 0x65, 0x58, 0xe4, 0xcb, 0xb6, 0x93, 0xbe, 0x84, 0xe1, 0xfa, 0x5f,
0x32, 0xc7, 0xf5, 0xaf, 0x36, 0xa7, 0xd9, 0xf1, 0x2d, 0xb4, 0x7f, 0xe4, 0xe3, 0x7f, 0x01, 0x00,
0x00, 0xff, 0xff, 0xcc, 0xf2, 0x32, 0x04, 0x49, 0x05, 0x00, 0x00,
// 596 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x4d, 0x6f, 0xd4, 0x30,
0x10, 0x55, 0x9a, 0x4d, 0x76, 0x77, 0x4a, 0xab, 0x62, 0xda, 0xc5, 0xaa, 0x00, 0x45, 0x39, 0x40,
0x04, 0xd2, 0x4a, 0x2d, 0x5f, 0xe2, 0x84, 0xda, 0x82, 0x04, 0x12, 0x42, 0x60, 0x21, 0x2e, 0x9c,
0xdc, 0x64, 0xe8, 0x46, 0xcd, 0xda, 0xc1, 0x71, 0x56, 0xec, 0x99, 0xff, 0xc2, 0x7f, 0xe2, 0xa7,
0x70, 0x43, 0x76, 0x9c, 0x6e, 0xf6, 0x43, 0x2a, 0xbd, 0xf9, 0x8d, 0xdf, 0x8c, 0x3c, 0xcf, 0xf3,
0x06, 0x6e, 0xa5, 0x13, 0x2e, 0x2e, 0x70, 0x5c, 0x2a, 0xa9, 0x25, 0x09, 0xf4, 0xbc, 0xc4, 0xea,
0x70, 0xa7, 0x48, 0xe5, 0x74, 0x2a, 0x45, 0x13, 0x8d, 0xff, 0x6c, 0xc1, 0xe8, 0xa4, 0xd6, 0x52,
0xc8, 0xe9, 0xfc, 0x93, 0x92, 0xa5, 0xac, 0x78, 0x71, 0x66, 0xd3, 0xc8, 0x73, 0x80, 0x52, 0xc9,
0xb2, 0x41, 0xd4, 0x8b, 0xbc, 0x64, 0xfb, 0xf8, 0x60, 0x6c, 0xab, 0x8c, 0x97, 0xa9, 0xac, 0x43,
0x24, 0x4f, 0xa0, 0x9f, 0xd6, 0x8a, 0xd5, 0x05, 0xd2, 0x2d, 0x9b, 0x73, 0xdb, 0xe5, 0x98, 0xd0,
0x99, 0x14, 0xdf, 0xf3, 0x0b, 0xd6, 0x32, 0x48, 0x02, 0xc1, 0xb9, 0xe4, 0x2a, 0xa3, 0xbe, 0xa5,
0x12, 0x47, 0x3d, 0x49, 0x75, 0x3e, 0xc3, 0x53, 0x73, 0xc3, 0x1a, 0x02, 0x39, 0x02, 0x98, 0x49,
0x8d, 0x0c, 0xab, 0xba, 0xd0, 0xb4, 0xb7, 0x54, 0xf9, 0xeb, 0xd5, 0x05, 0xeb, 0x90, 0xc8, 0x08,
0xc2, 0x4a, 0x73, 0x5d, 0x57, 0x34, 0x88, 0xbc, 0x24, 0x60, 0x0e, 0x11, 0x0a, 0x7d, 0x9e, 0x65,
0x0a, 0xab, 0x8a, 0x86, 0x91, 0x97, 0x0c, 0x59, 0x0b, 0x4d, 0xc6, 0x04, 0xf3, 0x8b, 0x89, 0xa6,
0xfd, 0xc8, 0x4b, 0x7c, 0xe6, 0x10, 0xd9, 0x87, 0x20, 0x17, 0x19, 0xfe, 0xa4, 0x03, 0x5b, 0xa8,
0x01, 0xe4, 0x41, 0x23, 0x90, 0xd1, 0xe1, 0xfd, 0x1b, 0x3a, 0xb4, 0xa5, 0x3a, 0x91, 0xf8, 0xaf,
0x07, 0xbb, 0x2b, 0x9a, 0x12, 0xe8, 0xcd, 0x91, 0x2b, 0xab, 0x66, 0xc0, 0xec, 0xd9, 0x14, 0x9f,
0x4a, 0xa1, 0x27, 0x56, 0xae, 0x80, 0x35, 0x80, 0xec, 0x81, 0x9f, 0xf1, 0xb9, 0xd5, 0x25, 0x60,
0xe6, 0x48, 0x1e, 0x41, 0xbf, 0xa9, 0x52, 0xd1, 0x5e, 0xe4, 0x27, 0xdb, 0xc7, 0x3b, 0xae, 0x7d,
0xf7, 0x09, 0xed, 0x2d, 0x79, 0x0c, 0x7b, 0x95, 0xe6, 0x4a, 0x9f, 0x16, 0x32, 0xbd, 0x7c, 0xd7,
0xf4, 0x13, 0xd8, 0x7e, 0xd6, 0xe2, 0xe4, 0x21, 0xec, 0xa2, 0xc8, 0xba, 0xcc, 0xd0, 0x32, 0x57,
0xa2, 0x64, 0x0c, 0x44, 0x21, 0x2f, 0xde, 0x2e, 0x73, 0x1b, 0x95, 0x36, 0xdc, 0xc4, 0xcf, 0x20,
0x74, 0x2d, 0x8f, 0x20, 0x4c, 0xb9, 0x48, 0xb1, 0xb0, 0x4d, 0x0f, 0x98, 0x43, 0x46, 0x0a, 0x23,
0xbb, 0xed, 0x7a, 0xc8, 0xec, 0x39, 0x7e, 0x01, 0xfb, 0x0c, 0x67, 0xf2, 0x12, 0x57, 0x64, 0x5b,
0x56, 0xda, 0x5b, 0x53, 0xfa, 0x23, 0x10, 0x33, 0x03, 0x37, 0xcb, 0xb2, 0x73, 0x50, 0x96, 0x4a,
0xce, 0x9a, 0x49, 0x1d, 0xb0, 0x16, 0xc6, 0xaf, 0xe0, 0xee, 0x17, 0x54, 0xd3, 0x5c, 0xf0, 0x9b,
0x16, 0x8d, 0x7f, 0x79, 0x70, 0xc0, 0x30, 0xc5, 0xbc, 0xd4, 0x2b, 0x99, 0x47, 0xd0, 0x2b, 0x15,
0xce, 0x9c, 0x93, 0xee, 0xb7, 0xa3, 0xbe, 0xd1, 0x7c, 0xcc, 0x52, 0xc9, 0x4b, 0xeb, 0x25, 0x85,
0x42, 0x3b, 0x2f, 0x5d, 0x93, 0xd5, 0xb2, 0xe3, 0x09, 0xdc, 0xf9, 0x20, 0x53, 0x5e, 0xac, 0x59,
0x3a, 0x34, 0x4f, 0x3d, 0xcd, 0xfe, 0xef, 0x11, 0x8e, 0x4c, 0x0e, 0x61, 0x60, 0x96, 0x06, 0x0a,
0x5d, 0xd1, 0xad, 0xc8, 0x4f, 0x86, 0xec, 0x0a, 0xc7, 0xbf, 0x3d, 0x18, 0x31, 0xfc, 0xf1, 0xb9,
0x46, 0xb5, 0xba, 0x40, 0x16, 0xfe, 0xf3, 0x96, 0xfc, 0xb7, 0xe1, 0xe7, 0x8d, 0x09, 0x52, 0x59,
0x0b, 0xed, 0x06, 0xbe, 0x01, 0xe4, 0x1e, 0x0c, 0xb3, 0x5c, 0x61, 0xaa, 0x73, 0x29, 0xac, 0xe7,
0x03, 0xb6, 0x08, 0x74, 0xdc, 0x1a, 0x6c, 0x76, 0x6b, 0xd8, 0x71, 0x6b, 0xfc, 0x0d, 0x28, 0xc3,
0xb2, 0x98, 0x6f, 0x7a, 0xe9, 0x6b, 0xd8, 0x5e, 0x6c, 0x30, 0xf3, 0x5c, 0xff, 0x7a, 0x71, 0xba,
0x19, 0xe7, 0xa1, 0xdd, 0xa6, 0x4f, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x96, 0x4a, 0x21, 0x4d,
0x73, 0x05, 0x00, 0x00,
}
......@@ -25,6 +25,11 @@ const (
AutonomyActionTransfer
AutonomyActionCommentProp
AutonomyActionPropChange
AutonomyActionRvkPropChange
AutonomyActionVotePropChange
AutonomyActionTmintPropChange
//log for autonomy
TyLogPropBoard = 2101
TyLogRvkPropBoard = 2102
......@@ -42,7 +47,12 @@ const (
TyLogVotePropRule = 2123
TyLogTmintPropRule = 2124
TyLogCommentProp = 2131
TyLogCommentProp = 2131
TyLogPropChange = 2141
TyLogRvkPropChange = 2142
TyLogVotePropChange = 2143
TyLogTmintPropChange = 2144
)
// Board status
......@@ -70,6 +80,16 @@ const (
AutonomyStatusTmintPropRule
)
// Change status
const (
AutonomyStatusProposalChange = iota + 1
AutonomyStatusRvkPropChange
AutonomyStatusVotePropChange
AutonomyStatusTmintPropChange
)
const (
// GetProposalBoard 用于在cmd里面的区分不同的查询
GetProposalBoard = "GetProposalBoard"
......@@ -85,6 +105,8 @@ const (
ListProposalRule = "ListProposalRule"
// ListProposalComment 查询多个
ListProposalComment = "ListProposalComment"
// GetProposalChange 用于在cmd里面的区分不同的查询
GetProposalChange = "GetProposalChange"
)
//包的名字可以通过配置文件来配置
......
......@@ -29,4 +29,8 @@ var (
ErrMinerAddr = errors.New("ErrMinerAddr")
// ErrBindAddr 无效绑定地址
ErrBindAddr = errors.New("ErrBindAddr")
// ErrChangeBoardAddr 无效修改董事会成员地址
ErrChangeBoardAddr = errors.New("ErrChangeBoardAddr")
// ErrBoardNumber 董事会成员数错误
ErrBoardNumber = errors.New("ErrBoardNumber")
)
......@@ -117,18 +117,16 @@ func (m *VotesRecord) GetAddress() []string {
}
type RuleConfig struct {
// 董事会成员参与率,以%为单位,只保留整数部分
BoardAttendRatio int32 `protobuf:"varint,1,opt,name=boardAttendRatio" json:"boardAttendRatio,omitempty"`
// 董事会成员赞成率
BoardApproveRatio int32 `protobuf:"varint,2,opt,name=boardApproveRatio" json:"boardApproveRatio,omitempty"`
// 董事会成员赞成率,以%为单位,只保留整数部分
BoardApproveRatio int32 `protobuf:"varint,1,opt,name=boardApproveRatio" json:"boardApproveRatio,omitempty"`
// 全体持票人否决率
PubOpposeRatio int32 `protobuf:"varint,3,opt,name=pubOpposeRatio" json:"pubOpposeRatio,omitempty"`
PubOpposeRatio int32 `protobuf:"varint,2,opt,name=pubOpposeRatio" json:"pubOpposeRatio,omitempty"`
// 提案金额
ProposalAmount int64 `protobuf:"varint,4,opt,name=proposalAmount" json:"proposalAmount,omitempty"`
ProposalAmount int64 `protobuf:"varint,3,opt,name=proposalAmount" json:"proposalAmount,omitempty"`
// 重大项目公示金额阈值
LargeProjectAmount int64 `protobuf:"varint,5,opt,name=largeProjectAmount" json:"largeProjectAmount,omitempty"`
LargeProjectAmount int64 `protobuf:"varint,4,opt,name=largeProjectAmount" json:"largeProjectAmount,omitempty"`
// 重大项目公示时间(以区块数为单位)
PublicPeriod int32 `protobuf:"varint,6,opt,name=publicPeriod" json:"publicPeriod,omitempty"`
PublicPeriod int32 `protobuf:"varint,5,opt,name=publicPeriod" json:"publicPeriod,omitempty"`
}
func (m *RuleConfig) Reset() { *m = RuleConfig{} }
......@@ -136,13 +134,6 @@ func (m *RuleConfig) String() string { return proto.CompactTextString
func (*RuleConfig) ProtoMessage() {}
func (*RuleConfig) Descriptor() ([]byte, []int) { return fileDescriptor3, []int{3} }
func (m *RuleConfig) GetBoardAttendRatio() int32 {
if m != nil {
return m.BoardAttendRatio
}
return 0
}
func (m *RuleConfig) GetBoardApproveRatio() int32 {
if m != nil {
return m.BoardApproveRatio
......@@ -229,28 +220,27 @@ func init() {
func init() { proto.RegisterFile("lcommon.proto", fileDescriptor3) }
var fileDescriptor3 = []byte{
// 368 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xb1, 0x6e, 0xdb, 0x30,
0x10, 0x86, 0x21, 0xc9, 0x76, 0xed, 0x73, 0x5b, 0xb4, 0x1c, 0x0a, 0x0d, 0x45, 0x61, 0x68, 0x68,
0x8d, 0xa2, 0xf0, 0xd2, 0x27, 0x70, 0xb2, 0x64, 0x8b, 0xc0, 0x21, 0x3b, 0x25, 0x31, 0x8e, 0x02,
0x59, 0x47, 0x90, 0x27, 0x03, 0x1e, 0xb2, 0x66, 0xc8, 0x53, 0x07, 0x3c, 0x4a, 0xb0, 0x62, 0x07,
0xc8, 0xa6, 0xfb, 0xee, 0x13, 0xf0, 0xdf, 0x1d, 0xe1, 0x4b, 0x53, 0xe2, 0x7e, 0x8f, 0xed, 0xc6,
0x58, 0x24, 0x14, 0x53, 0x3a, 0x1a, 0xed, 0xb2, 0xe7, 0x08, 0xe0, 0x0e, 0x49, 0x4b, 0xed, 0xba,
0x86, 0xc4, 0x2f, 0x00, 0x42, 0x52, 0x8d, 0x47, 0x2e, 0x8d, 0x56, 0xd1, 0x7a, 0x2a, 0x47, 0x44,
0x64, 0xf0, 0x59, 0x19, 0x63, 0xf1, 0xa0, 0x83, 0x11, 0xb3, 0xf1, 0x86, 0x89, 0x15, 0x2c, 0xd1,
0x18, 0x74, 0xbd, 0x92, 0xb0, 0x32, 0x46, 0x42, 0xc0, 0xc4, 0x28, 0xe7, 0xd2, 0xc9, 0x2a, 0x5a,
0xcf, 0x25, 0x7f, 0x73, 0x90, 0xbc, 0x2b, 0x9a, 0xba, 0xf4, 0x8e, 0xf8, 0x09, 0x0b, 0xc3, 0x55,
0x4d, 0x47, 0xce, 0x31, 0x97, 0x27, 0x70, 0x16, 0x33, 0xbe, 0x88, 0xf9, 0x71, 0x84, 0x14, 0x3e,
0x99, 0xae, 0xc8, 0x4f, 0x29, 0x86, 0x32, 0xfb, 0x03, 0x4b, 0x56, 0xa4, 0x2e, 0xd1, 0x56, 0x5e,
0x54, 0x55, 0x65, 0xb5, 0xf3, 0xeb, 0x48, 0xd6, 0x0b, 0x39, 0x94, 0xd9, 0x4b, 0x0c, 0x20, 0xbb,
0x46, 0x5f, 0x63, 0x7b, 0x5f, 0xef, 0xc4, 0x5f, 0xf8, 0x56, 0xa0, 0xb2, 0xd5, 0x96, 0x48, 0xb7,
0x95, 0x54, 0x54, 0x63, 0xbf, 0xc0, 0x0b, 0x2e, 0xfe, 0xc1, 0xf7, 0xc0, 0xc2, 0xde, 0x82, 0x1c,
0xc6, 0xb8, 0x6c, 0x88, 0xdf, 0xf0, 0xd5, 0x74, 0xc5, 0x2d, 0xa7, 0x0f, 0x6a, 0x18, 0xe8, 0x8c,
0xb2, 0x67, 0xd1, 0xa0, 0x53, 0xcd, 0x76, 0x8f, 0x5d, 0x4b, 0x3c, 0x5a, 0x22, 0xcf, 0xa8, 0xd8,
0x80, 0x68, 0x94, 0xdd, 0xe9, 0xdc, 0xe2, 0xa3, 0x2e, 0xa9, 0x77, 0xa7, 0xec, 0xbe, 0xd3, 0xf1,
0x47, 0x0f, 0xab, 0xcf, 0xb5, 0xad, 0xb1, 0x4a, 0x67, 0xe1, 0xe8, 0x63, 0x96, 0x3d, 0xc1, 0x72,
0x5b, 0x52, 0x7d, 0xd0, 0x57, 0x3e, 0xbe, 0xf8, 0x01, 0x33, 0x9e, 0x63, 0x58, 0x5a, 0x5f, 0xf9,
0xb3, 0x5a, 0x7d, 0xe8, 0x5b, 0x31, 0xb7, 0x4e, 0xc0, 0xff, 0xa5, 0x42, 0x98, 0x84, 0xc3, 0xf4,
0x95, 0x3f, 0xa7, 0x23, 0x65, 0xe9, 0x46, 0xd7, 0xbb, 0x87, 0x61, 0xaa, 0x31, 0x2a, 0x66, 0xfc,
0xa8, 0xff, 0xbf, 0x06, 0x00, 0x00, 0xff, 0xff, 0xbb, 0xdc, 0x0b, 0x33, 0xe5, 0x02, 0x00, 0x00,
// 352 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xbf, 0x4e, 0xe3, 0x40,
0x10, 0x87, 0xe5, 0xfc, 0xbb, 0x64, 0x72, 0x77, 0xd2, 0x6d, 0x71, 0x72, 0x81, 0x50, 0xe4, 0x02,
0x52, 0xa0, 0x34, 0x3c, 0x41, 0xa0, 0xa1, 0xc3, 0xda, 0x82, 0x7e, 0x6d, 0x2f, 0x61, 0xd1, 0x26,
0xb3, 0xda, 0x1d, 0x47, 0x4a, 0x41, 0xcb, 0x63, 0xf2, 0x2c, 0x68, 0xc7, 0xb6, 0x62, 0x12, 0x24,
0x3a, 0xcf, 0x6f, 0x3e, 0x4b, 0xdf, 0xcc, 0x2c, 0xfc, 0xb1, 0x25, 0x6e, 0xb7, 0xb8, 0x5b, 0x39,
0x8f, 0x84, 0x62, 0x4c, 0x07, 0xa7, 0x43, 0xf6, 0x9e, 0x00, 0x3c, 0x21, 0x69, 0xa9, 0x43, 0x6d,
0x49, 0x5c, 0x02, 0x10, 0x92, 0xb2, 0x31, 0x0a, 0x69, 0xb2, 0x48, 0x96, 0x63, 0xd9, 0x4b, 0x44,
0x06, 0xbf, 0x95, 0x73, 0x1e, 0xf7, 0xba, 0x21, 0x06, 0x4c, 0x7c, 0xc9, 0xc4, 0x02, 0xe6, 0xe8,
0x1c, 0x86, 0x16, 0x19, 0x32, 0xd2, 0x8f, 0x84, 0x80, 0x91, 0x53, 0x21, 0xa4, 0xa3, 0x45, 0xb2,
0x9c, 0x4a, 0xfe, 0x66, 0x91, 0xbc, 0x2e, 0xac, 0x29, 0x23, 0x23, 0x2e, 0x60, 0xe6, 0xb8, 0x32,
0x74, 0x60, 0x8f, 0xa9, 0x3c, 0x06, 0x27, 0x9a, 0x83, 0x33, 0xcd, 0x9f, 0x15, 0x52, 0xf8, 0xe5,
0xea, 0x22, 0x3f, 0x5a, 0x74, 0x65, 0x76, 0x0d, 0x73, 0x46, 0xa4, 0x2e, 0xd1, 0x57, 0x11, 0x54,
0x55, 0xe5, 0x75, 0x88, 0xeb, 0x18, 0x2e, 0x67, 0xb2, 0x2b, 0xb3, 0x8f, 0x04, 0x40, 0xd6, 0x56,
0xdf, 0xe3, 0xee, 0xd9, 0x6c, 0xc4, 0x0d, 0xfc, 0x2b, 0x50, 0xf9, 0x6a, 0xdd, 0xec, 0x42, 0x2a,
0x32, 0xd8, 0x6e, 0xf0, 0xbc, 0x21, 0xae, 0xe0, 0xaf, 0xab, 0x8b, 0x47, 0x36, 0x6a, 0xd0, 0x66,
0x8a, 0x93, 0x94, 0x39, 0x8f, 0x0e, 0x83, 0xb2, 0xeb, 0x2d, 0xd6, 0x3b, 0xe2, 0x61, 0x86, 0xf2,
0x24, 0x15, 0x2b, 0x10, 0x56, 0xf9, 0x8d, 0xce, 0x3d, 0xbe, 0xea, 0x92, 0x5a, 0x76, 0xc4, 0xec,
0x37, 0x9d, 0x78, 0xc8, 0x66, 0x9d, 0xb9, 0xf6, 0x06, 0xab, 0x74, 0xdc, 0x1c, 0xb2, 0x9f, 0x65,
0x6f, 0x30, 0x5f, 0x97, 0x64, 0xf6, 0xfa, 0x2e, 0xea, 0x8b, 0xff, 0x30, 0xe1, 0x39, 0xba, 0x45,
0xb4, 0x55, 0x3c, 0x95, 0xd7, 0xfb, 0xb6, 0x35, 0xe0, 0xd6, 0x31, 0x88, 0x7f, 0xa9, 0xbe, 0x78,
0x5b, 0xc5, 0x13, 0x05, 0x52, 0x9e, 0x1e, 0xb4, 0xd9, 0xbc, 0x74, 0xa6, 0xfd, 0xa8, 0x98, 0xf0,
0x43, 0xbd, 0xfd, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xaf, 0xca, 0x0f, 0x60, 0xb9, 0x02, 0x00, 0x00,
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment