Commit cdd14fd3 authored by liuyuhang's avatar liuyuhang

modify test and transfer

parent a2bd1eb4
...@@ -20,7 +20,7 @@ type subConfig struct { ...@@ -20,7 +20,7 @@ type subConfig struct {
var ( var (
alog = log.New("module", "execs.autonomy") alog = log.New("module", "execs.autonomy")
driverName = auty.AutonomyX driverName = auty.AutonomyX
autonomyAddr = address.ExecAddress("autonomy") autonomyAddr = address.ExecAddress(auty.AutonomyX)
cfg subConfig cfg subConfig
) )
......
...@@ -112,9 +112,9 @@ func (a *action) propBoard(prob *auty.ProposalBoard) (*types.Receipt, error) { ...@@ -112,9 +112,9 @@ func (a *action) propBoard(prob *auty.ProposalBoard) (*types.Receipt, error) {
return nil, err return nil, err
} }
receipt, err := a.coinsAccount.Transfer(a.fromaddr, a.execaddr, rule.ProposalAmount) receipt, err := a.coinsAccount.ExecFrozen(a.fromaddr, a.execaddr, rule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("propBoard ", "addr", a.fromaddr, "execaddr", a.execaddr, "Transfer amount", rule.ProposalAmount) alog.Error("propBoard ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecFrozen amount", rule.ProposalAmount)
return nil, err return nil, err
} }
...@@ -179,9 +179,9 @@ func (a *action) rvkPropBoard(rvkProb *auty.RevokeProposalBoard) (*types.Receipt ...@@ -179,9 +179,9 @@ func (a *action) rvkPropBoard(rvkProb *auty.RevokeProposalBoard) (*types.Receipt
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
receipt, err := a.coinsAccount.Transfer(a.execaddr, a.fromaddr, cur.CurRule.ProposalAmount) receipt, err := a.coinsAccount.ExecActive(a.fromaddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("rvkPropBoard ", "addr", a.fromaddr, "execaddr", a.execaddr, "Transfer amount", cur.CurRule.ProposalAmount, "err", err) alog.Error("rvkPropBoard ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecActive amount", cur.CurRule.ProposalAmount, "err", err)
return nil, err return nil, err
} }
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
...@@ -282,6 +282,17 @@ func (a *action) votePropBoard(voteProb *auty.VoteProposalBoard) (*types.Receipt ...@@ -282,6 +282,17 @@ func (a *action) votePropBoard(voteProb *auty.VoteProposalBoard) (*types.Receipt
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
// 首次进入投票期,即将提案金转入自治系统地址
if cur.Status == auty.AutonomyStatusProposalBoard {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, a.execaddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil {
alog.Error("votePropBoard ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
if cur.VoteResult.TotalVotes != 0 && if cur.VoteResult.TotalVotes != 0 &&
cur.VoteResult.ApproveVotes+cur.VoteResult.OpposeVotes != 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+cur.VoteResult.OpposeVotes)/float32(cur.VoteResult.TotalVotes) > float32(pubAttendRatio)/100.0 &&
...@@ -364,6 +375,17 @@ func (a *action) tmintPropBoard(tmintProb *auty.TerminateProposalBoard) (*types. ...@@ -364,6 +375,17 @@ func (a *action) tmintPropBoard(tmintProb *auty.TerminateProposalBoard) (*types.
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
// 未进行投票情况下,符合提案关闭的也需要扣除提案费用
if cur.Status == auty.AutonomyStatusProposalBoard {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, a.execaddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil {
alog.Error("votePropBoard ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
cur.Status = auty.AutonomyStatusTmintPropBoard cur.Status = auty.AutonomyStatusTmintPropBoard
kv = append(kv, &types.KeyValue{Key: propBoardID(tmintProb.ProposalID), Value: types.Encode(cur)}) kv = append(kv, &types.KeyValue{Key: propBoardID(tmintProb.ProposalID), Value: types.Encode(cur)})
......
...@@ -10,7 +10,6 @@ import ( ...@@ -10,7 +10,6 @@ import (
"github.com/33cn/chain33/account" "github.com/33cn/chain33/account"
apimock "github.com/33cn/chain33/client/mocks" apimock "github.com/33cn/chain33/client/mocks"
"github.com/33cn/chain33/common" "github.com/33cn/chain33/common"
"github.com/33cn/chain33/common/address"
"github.com/33cn/chain33/common/crypto" "github.com/33cn/chain33/common/crypto"
dbm "github.com/33cn/chain33/common/db" dbm "github.com/33cn/chain33/common/db"
dbmock "github.com/33cn/chain33/common/db/mocks" dbmock "github.com/33cn/chain33/common/db/mocks"
...@@ -157,7 +156,7 @@ func InitEnv() (*ExecEnv, drivers.Driver, dbm.KV, dbm.KVDB) { ...@@ -157,7 +156,7 @@ func InitEnv() (*ExecEnv, drivers.Driver, dbm.KV, dbm.KVDB) {
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
accCoin.SaveAccount(&accountA) accCoin.SaveAccount(&accountA)
accCoin.SaveExecAccount(address.ExecAddress(auty.AutonomyX), &accountA) accCoin.SaveExecAccount(autonomyAddr, &accountA)
accCoin.SaveAccount(&accountB) accCoin.SaveAccount(&accountB)
accCoin.SaveAccount(&accountC) accCoin.SaveAccount(&accountC)
accCoin.SaveAccount(&accountD) accCoin.SaveAccount(&accountD)
...@@ -321,8 +320,8 @@ func testPropBoard(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB dbm. ...@@ -321,8 +320,8 @@ func testPropBoard(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB dbm.
// check // check
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, proposalAmount, account.Balance) assert.Equal(t, proposalAmount, account.Frozen)
} }
func propBoardTx(parm *auty.ProposalBoard) (*types.Transaction, error) { func propBoardTx(parm *auty.ProposalBoard) (*types.Transaction, error) {
...@@ -371,8 +370,8 @@ func revokeProposalBoard(t *testing.T, env *ExecEnv, exec drivers.Driver, stateD ...@@ -371,8 +370,8 @@ func revokeProposalBoard(t *testing.T, env *ExecEnv, exec drivers.Driver, stateD
// check // check
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, int64(0), account.Balance) assert.Equal(t, int64(0), account.Frozen)
} }
func revokeProposalBoardTx(parm *auty.RevokeProposalBoard) (*types.Transaction, error) { func revokeProposalBoardTx(parm *auty.RevokeProposalBoard) (*types.Transaction, error) {
...@@ -477,9 +476,9 @@ func voteProposalBoard(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB ...@@ -477,9 +476,9 @@ func voteProposalBoard(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB
// balance // balance
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(AddrA) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, total-proposalAmount, account.Balance) assert.Equal(t, int64(0), account.Frozen)
account = accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account = accCoin.LoadExecAccount(autonomyAddr, autonomyAddr)
assert.Equal(t, proposalAmount, account.Balance) assert.Equal(t, proposalAmount, account.Balance)
// status // status
value, err := stateDB.Get(propBoardID(proposalID)) value, err := stateDB.Get(propBoardID(proposalID))
...@@ -554,10 +553,10 @@ func terminateProposalBoard(t *testing.T, env *ExecEnv, exec drivers.Driver, sta ...@@ -554,10 +553,10 @@ func terminateProposalBoard(t *testing.T, env *ExecEnv, exec drivers.Driver, sta
// check // check
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(AddrA) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, total-proposalAmount, account.Balance) assert.Equal(t, int64(0), account.Frozen)
account = accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account = accCoin.LoadExecAccount(autonomyAddr, autonomyAddr)
assert.Equal(t, proposalAmount, account.Balance) assert.Equal(t, int64(0), account.Frozen)
} }
func terminateProposalBoardTx(parm *auty.TerminateProposalBoard) (*types.Transaction, error) { func terminateProposalBoardTx(parm *auty.TerminateProposalBoard) (*types.Transaction, error) {
......
...@@ -44,9 +44,9 @@ func (a *action) propChange(prob *auty.ProposalChange) (*types.Receipt, error) { ...@@ -44,9 +44,9 @@ func (a *action) propChange(prob *auty.ProposalChange) (*types.Receipt, error) {
return nil, err return nil, err
} }
receipt, err := a.coinsAccount.Transfer(a.fromaddr, a.execaddr, rule.ProposalAmount) receipt, err := a.coinsAccount.ExecFrozen(a.fromaddr, a.execaddr, rule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("propChange ", "addr", a.fromaddr, "execaddr", a.execaddr, "Transfer amount", rule.ProposalAmount) alog.Error("propChange ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecFrozen amount", rule.ProposalAmount)
return nil, err return nil, err
} }
...@@ -113,9 +113,9 @@ func (a *action) rvkPropChange(rvkProb *auty.RevokeProposalChange) (*types.Recei ...@@ -113,9 +113,9 @@ func (a *action) rvkPropChange(rvkProb *auty.RevokeProposalChange) (*types.Recei
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
receipt, err := a.coinsAccount.Transfer(a.execaddr, a.fromaddr, cur.CurRule.ProposalAmount) receipt, err := a.coinsAccount.ExecActive(a.fromaddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("rvkPropChange ", "addr", a.fromaddr, "execaddr", a.execaddr, "Transfer amount", cur.CurRule.ProposalAmount, "err", err) alog.Error("rvkPropChange ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecActive amount", cur.CurRule.ProposalAmount, "err", err)
return nil, err return nil, err
} }
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
...@@ -178,6 +178,17 @@ func (a *action) votePropChange(voteProb *auty.VoteProposalChange) (*types.Recei ...@@ -178,6 +178,17 @@ func (a *action) votePropChange(voteProb *auty.VoteProposalChange) (*types.Recei
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
// 首次进入投票期,即将提案金转入自治系统地址
if cur.Status == auty.AutonomyStatusProposalChange {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, a.execaddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil {
alog.Error("votePropChange ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
if cur.VoteResult.TotalVotes != 0 && if cur.VoteResult.TotalVotes != 0 &&
float32(cur.VoteResult.ApproveVotes)/float32(cur.VoteResult.TotalVotes) > float32(cur.CurRule.BoardApproveRatio)/100.0 { float32(cur.VoteResult.ApproveVotes)/float32(cur.VoteResult.TotalVotes) > float32(cur.CurRule.BoardApproveRatio)/100.0 {
cur.VoteResult.Pass = true cur.VoteResult.Pass = true
...@@ -247,6 +258,18 @@ func (a *action) tmintPropChange(tmintProb *auty.TerminateProposalChange) (*type ...@@ -247,6 +258,18 @@ func (a *action) tmintPropChange(tmintProb *auty.TerminateProposalChange) (*type
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
// 未进行投票情况下,符合提案关闭的也需要扣除提案费用
if cur.Status == auty.AutonomyStatusProposalChange {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, a.execaddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil {
alog.Error("votePropChange ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
cur.Status = auty.AutonomyStatusTmintPropChange cur.Status = auty.AutonomyStatusTmintPropChange
kv = append(kv, &types.KeyValue{Key: propChangeID(tmintProb.ProposalID), Value: types.Encode(cur)}) kv = append(kv, &types.KeyValue{Key: propChangeID(tmintProb.ProposalID), Value: types.Encode(cur)})
......
...@@ -10,7 +10,6 @@ import ( ...@@ -10,7 +10,6 @@ import (
"github.com/33cn/chain33/account" "github.com/33cn/chain33/account"
apimock "github.com/33cn/chain33/client/mocks" apimock "github.com/33cn/chain33/client/mocks"
"github.com/33cn/chain33/common" "github.com/33cn/chain33/common"
"github.com/33cn/chain33/common/address"
dbm "github.com/33cn/chain33/common/db" dbm "github.com/33cn/chain33/common/db"
_ "github.com/33cn/chain33/system" _ "github.com/33cn/chain33/system"
drivers "github.com/33cn/chain33/system/dapp" drivers "github.com/33cn/chain33/system/dapp"
...@@ -99,8 +98,8 @@ func testPropChange(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB dbm ...@@ -99,8 +98,8 @@ func testPropChange(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB dbm
// check // check
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, proposalAmount, account.Balance) assert.Equal(t, proposalAmount, account.Frozen)
} }
func propChangeTx(parm *auty.ProposalChange) (*types.Transaction, error) { func propChangeTx(parm *auty.ProposalChange) (*types.Transaction, error) {
...@@ -149,8 +148,8 @@ func revokeProposalChange(t *testing.T, env *ExecEnv, exec drivers.Driver, state ...@@ -149,8 +148,8 @@ func revokeProposalChange(t *testing.T, env *ExecEnv, exec drivers.Driver, state
// check // check
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, int64(0), account.Balance) assert.Equal(t, int64(0), account.Frozen)
} }
func revokeProposalChangeTx(parm *auty.RevokeProposalChange) (*types.Transaction, error) { func revokeProposalChangeTx(parm *auty.RevokeProposalChange) (*types.Transaction, error) {
...@@ -262,9 +261,9 @@ func voteProposalChange(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB ...@@ -262,9 +261,9 @@ func voteProposalChange(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB
// balance // balance
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(AddrA) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, total-proposalAmount, account.Balance) assert.Equal(t, int64(0), account.Frozen)
account = accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account = accCoin.LoadExecAccount(autonomyAddr, autonomyAddr)
assert.Equal(t, proposalAmount, account.Balance) assert.Equal(t, proposalAmount, account.Balance)
// status // status
value, err := stateDB.Get(propChangeID(proposalID)) value, err := stateDB.Get(propChangeID(proposalID))
...@@ -347,10 +346,10 @@ func terminateProposalChange(t *testing.T, env *ExecEnv, exec drivers.Driver, st ...@@ -347,10 +346,10 @@ func terminateProposalChange(t *testing.T, env *ExecEnv, exec drivers.Driver, st
// check // check
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(AddrA) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, total-proposalAmount, account.Balance) assert.Equal(t, int64(0), account.Frozen)
account = accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account = accCoin.LoadExecAccount(autonomyAddr, autonomyAddr)
assert.Equal(t, proposalAmount, account.Balance) assert.Equal(t, int64(0), account.Frozen)
} }
func terminateProposalChangeTx(parm *auty.TerminateProposalChange) (*types.Transaction, error) { func terminateProposalChangeTx(parm *auty.TerminateProposalChange) (*types.Transaction, error) {
......
...@@ -68,10 +68,10 @@ func (a *action) propProject(prob *auty.ProposalProject) (*types.Receipt, error) ...@@ -68,10 +68,10 @@ func (a *action) propProject(prob *auty.ProposalProject) (*types.Receipt, error)
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
// 提案金 // 冻结提案金
receipt, err := a.coinsAccount.Transfer(a.fromaddr, a.execaddr, rule.ProposalAmount) receipt, err := a.coinsAccount.ExecFrozen(a.fromaddr, a.execaddr, rule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("propProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "Transfer proposal amount", rule.ProposalAmount, "error", err) alog.Error("propProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecFrozen proposal amount", rule.ProposalAmount, "error", err)
return nil, err return nil, err
} }
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
...@@ -138,10 +138,10 @@ func (a *action) rvkPropProject(rvkProb *auty.RevokeProposalProject) (*types.Rec ...@@ -138,10 +138,10 @@ func (a *action) rvkPropProject(rvkProb *auty.RevokeProposalProject) (*types.Rec
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
// 提案金 // 解冻提案金
receipt, err := a.coinsAccount.Transfer(a.execaddr, a.fromaddr, cur.CurRule.ProposalAmount) receipt, err := a.coinsAccount.ExecActive(a.fromaddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("rvkPropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "Transfer amount", cur.CurRule.ProposalAmount, "err", err) alog.Error("rvkPropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecActive amount", cur.CurRule.ProposalAmount, "err", err)
return nil, err return nil, err
} }
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
...@@ -221,6 +221,17 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec ...@@ -221,6 +221,17 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
// 首次进入投票期,即将提案金转入自治系统地址
if cur.Status == auty.AutonomyStatusProposalProject {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, a.execaddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil {
alog.Error("votePropProject ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
if cur.BoardVoteRes.TotalVotes != 0 && if cur.BoardVoteRes.TotalVotes != 0 &&
float32(cur.BoardVoteRes.ApproveVotes)/float32(cur.BoardVoteRes.TotalVotes) >= 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.BoardVoteRes.Pass = true
...@@ -237,11 +248,22 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec ...@@ -237,11 +248,22 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec
} else { } else {
cur.Status = auty.AutonomyStatusTmintPropProject cur.Status = auty.AutonomyStatusTmintPropProject
// 提案通过,将工程金额从基金付款给承包商 // 提案通过,将工程金额从基金付款给承包商
receipt, err := a.coinsAccount.Transfer(a.execaddr, cur.PropProject.ToAddr, cur.PropProject.Amount) var receipt *types.Receipt
acc := a.coinsAccount.LoadExecAccount(a.execaddr, a.execaddr)
if acc != nil && acc.Balance > cur.PropProject.Amount { // 先从合约的合约地址扣除
receipt, err = a.coinsAccount.ExecTransfer(a.execaddr, cur.PropProject.ToAddr, a.execaddr, cur.PropProject.Amount)
if err != nil {
alog.Error("votePropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "Transfer amount", cur.PropProject.Amount)
return nil, err
}
} else {
receipt, err = a.coinsAccount.ExecDeposit(a.execaddr, cur.PropProject.ToAddr, cur.PropProject.Amount)
if err != nil { if err != nil {
alog.Error("votePropProject ", "addr", cur.Address, "execaddr", a.execaddr, "Transfer to contractor project amount fail", err) alog.Error("votePropProject ", "addr", cur.Address, "execaddr", a.execaddr, "Transfer to contractor project amount fail", err)
return nil, err return nil, err
} }
}
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...) kv = append(kv, receipt.KV...)
// 需要更新该董事会的累计审批金 // 需要更新该董事会的累计审批金
...@@ -441,14 +463,36 @@ func (a *action) tmintPropProject(tmintProb *auty.TerminateProposalProject) (*ty ...@@ -441,14 +463,36 @@ func (a *action) tmintPropProject(tmintProb *auty.TerminateProposalProject) (*ty
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
// 如果为提案状态,则判断是否需要扣除提案费
if cur.Status == auty.AutonomyStatusProposalProject && a.height > end {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, a.execaddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil {
alog.Error("tmintPropProject ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
if (cur.PubVote.Publicity && cur.PubVote.PubPass) || // 需要公示且公示通过 if (cur.PubVote.Publicity && cur.PubVote.PubPass) || // 需要公示且公示通过
(!cur.PubVote.Publicity && cur.BoardVoteRes.Pass) { // 不需要公示且董事会通过 (!cur.PubVote.Publicity && cur.BoardVoteRes.Pass) { // 不需要公示且董事会通过
// 提案通过,将工程金额从基金付款给承包商 // 提案通过,将工程金额从基金付款给承包商
receipt, err := a.coinsAccount.Transfer(a.execaddr, cur.PropProject.ToAddr, cur.PropProject.Amount) var receipt *types.Receipt
acc := a.coinsAccount.LoadExecAccount(a.execaddr, a.execaddr)
if acc != nil && acc.Balance > cur.PropProject.Amount { // 先从合约的合约地址扣除
receipt, err = a.coinsAccount.ExecTransfer(a.execaddr, cur.PropProject.ToAddr, a.execaddr, cur.PropProject.Amount)
if err != nil {
alog.Error("tmintPropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "Transfer amount", cur.PropProject.Amount)
return nil, err
}
} else {
receipt, err = a.coinsAccount.ExecDeposit(a.execaddr, cur.PropProject.ToAddr, cur.PropProject.Amount)
if err != nil { if err != nil {
alog.Error("tmintPropProject ", "addr", cur.Address, "execaddr", a.execaddr, "Transfer to contractor project amount fail", err) alog.Error("tmintPropProject ", "addr", cur.Address, "execaddr", a.execaddr, "Transfer to contractor project amount fail", err)
return nil, err return nil, err
} }
}
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...) kv = append(kv, receipt.KV...)
// 需要更新该董事会的累计审批金 // 需要更新该董事会的累计审批金
......
...@@ -10,7 +10,6 @@ import ( ...@@ -10,7 +10,6 @@ import (
"github.com/33cn/chain33/account" "github.com/33cn/chain33/account"
apimock "github.com/33cn/chain33/client/mocks" apimock "github.com/33cn/chain33/client/mocks"
"github.com/33cn/chain33/common" "github.com/33cn/chain33/common"
"github.com/33cn/chain33/common/address"
dbm "github.com/33cn/chain33/common/db" dbm "github.com/33cn/chain33/common/db"
_ "github.com/33cn/chain33/system" _ "github.com/33cn/chain33/system"
drivers "github.com/33cn/chain33/system/dapp" drivers "github.com/33cn/chain33/system/dapp"
...@@ -254,8 +253,8 @@ func testPropProject(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB db ...@@ -254,8 +253,8 @@ func testPropProject(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB db
// check // check
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, proposalAmount+testFundAmount, account.Balance) assert.Equal(t, proposalAmount, account.Frozen)
} }
func propProjectTx(parm *auty.ProposalProject) (*types.Transaction, error) { func propProjectTx(parm *auty.ProposalProject) (*types.Transaction, error) {
...@@ -305,8 +304,8 @@ func revokeProposalProject(t *testing.T, env *ExecEnv, exec drivers.Driver, stat ...@@ -305,8 +304,8 @@ func revokeProposalProject(t *testing.T, env *ExecEnv, exec drivers.Driver, stat
// check // check
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, testFundAmount, account.Balance) assert.Equal(t, int64(0), account.Frozen)
// check Project // check Project
au := &Autonomy{ au := &Autonomy{
drivers.DriverBase{}, drivers.DriverBase{},
...@@ -446,12 +445,12 @@ func checkVoteProposalProjectResult(t *testing.T, stateDB dbm.KV, proposalID str ...@@ -446,12 +445,12 @@ func checkVoteProposalProjectResult(t *testing.T, stateDB dbm.KV, proposalID str
// balance // balance
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(AddrA) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, total-proposalAmount, account.Balance) assert.Equal(t, int64(0), account.Frozen)
account = accCoin.LoadAccount(AddrD) account = accCoin.LoadExecAccount(autonomyAddr, autonomyAddr)
assert.Equal(t, total+testProjectAmount, account.Balance) assert.Equal(t, proposalAmount - testProjectAmount, account.Balance)
account = accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account = accCoin.LoadExecAccount(AddrD, autonomyAddr)
assert.Equal(t, testFundAmount+proposalAmount-testProjectAmount, account.Balance) assert.Equal(t, testProjectAmount, account.Balance)
// 更新董事会累计审批金 // 更新董事会累计审批金
value, err = stateDB.Get(activeBoardID()) value, err = stateDB.Get(activeBoardID())
assert.NoError(t, err) assert.NoError(t, err)
...@@ -563,12 +562,12 @@ func checkPubVoteProposalProjectResult(t *testing.T, stateDB dbm.KV, proposalID ...@@ -563,12 +562,12 @@ func checkPubVoteProposalProjectResult(t *testing.T, stateDB dbm.KV, proposalID
// balance // balance
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(AddrA) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, total-proposalAmount, account.Balance) assert.Equal(t, int64(0), account.Frozen)
account = accCoin.LoadAccount(AddrD) account = accCoin.LoadExecAccount(AddrD, autonomyAddr)
assert.Equal(t, total, account.Balance) assert.Equal(t, int64(0), account.Balance)
account = accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account = accCoin.LoadExecAccount(autonomyAddr, autonomyAddr)
assert.Equal(t, testFundAmount+proposalAmount, account.Balance) assert.Equal(t, proposalAmount, account.Balance)
// 更新董事会累计审批金 // 更新董事会累计审批金
value, err = stateDB.Get(activeBoardID()) value, err = stateDB.Get(activeBoardID())
...@@ -641,10 +640,8 @@ func terminateProposalProject(t *testing.T, env *ExecEnv, exec drivers.Driver, s ...@@ -641,10 +640,8 @@ func terminateProposalProject(t *testing.T, env *ExecEnv, exec drivers.Driver, s
// check // check
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(AddrA) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, total-proposalAmount, account.Balance) assert.Equal(t, int64(0), account.Frozen)
account = accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX))
assert.Equal(t, testFundAmount+proposalAmount, account.Balance)
// check Project // check Project
au := &Autonomy{ au := &Autonomy{
......
...@@ -66,9 +66,9 @@ func (a *action) propRule(prob *auty.ProposalRule) (*types.Receipt, error) { ...@@ -66,9 +66,9 @@ func (a *action) propRule(prob *auty.ProposalRule) (*types.Receipt, error) {
return nil, err return nil, err
} }
receipt, err := a.coinsAccount.Transfer(a.fromaddr, a.execaddr, rule.ProposalAmount) receipt, err := a.coinsAccount.ExecFrozen(a.fromaddr, a.execaddr, rule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("propRule ", "addr", a.fromaddr, "execaddr", a.execaddr, "Transfer amount", rule.ProposalAmount) alog.Error("propRule ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecFrozen amount", rule.ProposalAmount)
return nil, err return nil, err
} }
...@@ -134,9 +134,9 @@ func (a *action) rvkPropRule(rvkProb *auty.RevokeProposalRule) (*types.Receipt, ...@@ -134,9 +134,9 @@ func (a *action) rvkPropRule(rvkProb *auty.RevokeProposalRule) (*types.Receipt,
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
receipt, err := a.coinsAccount.Transfer(a.execaddr, a.fromaddr, cur.CurRule.ProposalAmount) receipt, err := a.coinsAccount.ExecActive(a.fromaddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("rvkPropRule ", "addr", a.fromaddr, "execaddr", a.execaddr, "Transfer amount", cur.CurRule.ProposalAmount, "err", err) alog.Error("rvkPropRule ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecActive amount", cur.CurRule.ProposalAmount, "err", err)
return nil, err return nil, err
} }
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
...@@ -238,6 +238,17 @@ func (a *action) votePropRule(voteProb *auty.VoteProposalRule) (*types.Receipt, ...@@ -238,6 +238,17 @@ func (a *action) votePropRule(voteProb *auty.VoteProposalRule) (*types.Receipt,
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
// 首次进入投票期,即将提案金转入自治系统地址
if cur.Status == auty.AutonomyStatusProposalRule {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, a.execaddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil {
alog.Error("votePropRule ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
if cur.VoteResult.TotalVotes != 0 && if cur.VoteResult.TotalVotes != 0 &&
cur.VoteResult.ApproveVotes+cur.VoteResult.OpposeVotes != 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+cur.VoteResult.OpposeVotes)/float32(cur.VoteResult.TotalVotes) > float32(pubAttendRatio)/100.0 &&
...@@ -319,6 +330,18 @@ func (a *action) tmintPropRule(tmintProb *auty.TerminateProposalRule) (*types.Re ...@@ -319,6 +330,18 @@ func (a *action) tmintPropRule(tmintProb *auty.TerminateProposalRule) (*types.Re
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
// 未进行投票情况下,符合提案关闭的也需要扣除提案费用
if cur.Status == auty.AutonomyStatusProposalRule {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, a.execaddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil {
alog.Error("votePropRule ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
cur.Status = auty.AutonomyStatusTmintPropRule cur.Status = auty.AutonomyStatusTmintPropRule
kv = append(kv, &types.KeyValue{Key: propRuleID(tmintProb.ProposalID), Value: types.Encode(cur)}) kv = append(kv, &types.KeyValue{Key: propRuleID(tmintProb.ProposalID), Value: types.Encode(cur)})
...@@ -343,7 +366,7 @@ func (a *action) transfer(tf *auty.TransferFund) (*types.Receipt, error) { ...@@ -343,7 +366,7 @@ func (a *action) transfer(tf *auty.TransferFund) (*types.Receipt, error) {
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
receipt, err := a.coinsAccount.Transfer(a.fromaddr, autonomyAddr, tf.Amount) receipt, err := a.coinsAccount.ExecTransfer(a.fromaddr, autonomyAddr, autonomyAddr, tf.Amount)
if err != nil { if err != nil {
alog.Error("autonomy transfer ", "addr", a.fromaddr, "amount", tf.Amount, "ExecTransfer fail", err) alog.Error("autonomy transfer ", "addr", a.fromaddr, "amount", tf.Amount, "ExecTransfer fail", err)
return nil, err return nil, err
......
...@@ -10,7 +10,6 @@ import ( ...@@ -10,7 +10,6 @@ import (
"github.com/33cn/chain33/account" "github.com/33cn/chain33/account"
apimock "github.com/33cn/chain33/client/mocks" apimock "github.com/33cn/chain33/client/mocks"
"github.com/33cn/chain33/common" "github.com/33cn/chain33/common"
"github.com/33cn/chain33/common/address"
dbm "github.com/33cn/chain33/common/db" dbm "github.com/33cn/chain33/common/db"
_ "github.com/33cn/chain33/system" _ "github.com/33cn/chain33/system"
drivers "github.com/33cn/chain33/system/dapp" drivers "github.com/33cn/chain33/system/dapp"
...@@ -186,8 +185,8 @@ func testPropRule(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB dbm.K ...@@ -186,8 +185,8 @@ func testPropRule(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB dbm.K
// check // check
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, proposalAmount, account.Balance) assert.Equal(t, proposalAmount, account.Frozen)
} }
func propRuleTx(parm *auty.ProposalRule) (*types.Transaction, error) { func propRuleTx(parm *auty.ProposalRule) (*types.Transaction, error) {
...@@ -236,8 +235,8 @@ func revokeProposalRule(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB ...@@ -236,8 +235,8 @@ func revokeProposalRule(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB
// check // check
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, int64(0), account.Balance) assert.Equal(t, int64(0), account.Frozen)
// check rule // check rule
au := &Autonomy{ au := &Autonomy{
drivers.DriverBase{}, drivers.DriverBase{},
...@@ -356,9 +355,9 @@ func voteProposalRule(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB d ...@@ -356,9 +355,9 @@ func voteProposalRule(t *testing.T, env *ExecEnv, exec drivers.Driver, stateDB d
// balance // balance
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(AddrA) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, total-proposalAmount, account.Balance) assert.Equal(t, int64(0), account.Frozen)
account = accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account = accCoin.LoadExecAccount(autonomyAddr, autonomyAddr)
assert.Equal(t, proposalAmount, account.Balance) assert.Equal(t, proposalAmount, account.Balance)
// status // status
value, err := stateDB.Get(propRuleID(proposalID)) value, err := stateDB.Get(propRuleID(proposalID))
...@@ -447,9 +446,9 @@ func terminateProposalRule(t *testing.T, env *ExecEnv, exec drivers.Driver, stat ...@@ -447,9 +446,9 @@ func terminateProposalRule(t *testing.T, env *ExecEnv, exec drivers.Driver, stat
// check // check
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(AddrA) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, total-proposalAmount, account.Balance) assert.Equal(t, int64(0), account.Frozen)
account = accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account = accCoin.LoadExecAccount(autonomyAddr, autonomyAddr)
assert.Equal(t, proposalAmount, account.Balance) assert.Equal(t, proposalAmount, account.Balance)
// check rule // check rule
...@@ -591,9 +590,9 @@ func TestTransfer(t *testing.T) { ...@@ -591,9 +590,9 @@ func TestTransfer(t *testing.T) {
// check // check
accCoin := account.NewCoinsAccount() accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadAccount(AddrA) account := accCoin.LoadExecAccount(AddrA, autonomyAddr)
assert.Equal(t, total-types.Coin*190, account.Balance) assert.Equal(t, total-types.Coin*190, account.Balance)
account = accCoin.LoadAccount(address.ExecAddress(auty.AutonomyX)) account = accCoin.LoadExecAccount(autonomyAddr, autonomyAddr)
assert.Equal(t, types.Coin*190, account.Balance) assert.Equal(t, types.Coin*190, account.Balance)
} }
......
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