github.com/DxChainNetwork/dxc@v0.8.1-0.20220824085222-1162e304b6e7/consensus/dpos/systemcontract/proposals.go (about) 1 package systemcontract 2 3 import ( 4 "errors" 5 "github.com/DxChainNetwork/dxc/accounts/abi" 6 "github.com/DxChainNetwork/dxc/common" 7 "github.com/DxChainNetwork/dxc/common/hexutil" 8 "github.com/DxChainNetwork/dxc/consensus/dpos/vmcaller" 9 "github.com/DxChainNetwork/dxc/core" 10 "github.com/DxChainNetwork/dxc/core/state" 11 "github.com/DxChainNetwork/dxc/core/types" 12 "github.com/DxChainNetwork/dxc/log" 13 "github.com/DxChainNetwork/dxc/params" 14 "math" 15 "math/big" 16 ) 17 18 type Proposals struct { 19 abi abi.ABI 20 contractAddr common.Address 21 } 22 23 type ProposalInfo struct { 24 Id [4]byte 25 Proposer common.Address 26 PType uint8 27 Deposit *big.Int 28 Rate uint8 29 Name string 30 Details string 31 InitBlock *big.Int 32 Guarantee common.Address 33 UpdateBlock *big.Int 34 Status uint8 35 } 36 37 // NewProposals return Proposals contract instance 38 func NewProposals() *Proposals { 39 return &Proposals{ 40 abi: abiMap[ValidatorProposalsContractName], 41 contractAddr: ValidatorProposalsContractAddr, 42 } 43 } 44 45 // AddressProposalSets function AddressProposalSets 46 func (p *Proposals) AddressProposalSets(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig, addr common.Address, page *big.Int, size *big.Int) ([][4]byte, error) { 47 method := "addressProposalSets" 48 data, err := p.abi.Pack(method, addr, page, size) 49 50 if err != nil { 51 log.Error("can't pack Proposals contract method", "method", method) 52 return [][4]byte{}, err 53 } 54 55 msg := vmcaller.NewLegacyMessage(header.Coinbase, &p.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false) 56 result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config) 57 if err != nil { 58 log.Error("AddressProposalSets result", "error", err) 59 return [][4]byte{}, err 60 } 61 62 ret, err := p.abi.Unpack(method, result) 63 if err != nil { 64 return [][4]byte{}, err 65 } 66 if proposalIds, ok := ret[0].([][4]byte); !ok { 67 return [][4]byte{}, errors.New("invalid AddressProposalSets result format") 68 } else { 69 return proposalIds, nil 70 } 71 } 72 73 // AllProposalSets function AllProposalSets 74 func (p *Proposals) AllProposalSets(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig, page *big.Int, size *big.Int) ([][4]byte, error) { 75 method := "allProposalSets" 76 data, err := p.abi.Pack(method, page, size) 77 78 if err != nil { 79 log.Error("can't pack Proposals contract method", "method", method) 80 return [][4]byte{}, err 81 } 82 83 msg := vmcaller.NewLegacyMessage(header.Coinbase, &p.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false) 84 result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config) 85 if err != nil { 86 log.Error("AllProposalSets result", "error", err) 87 return [][4]byte{}, err 88 } 89 90 ret, err := p.abi.Unpack(method, result) 91 if err != nil { 92 return [][4]byte{}, err 93 } 94 if proposalIds, ok := ret[0].([][4]byte); !ok { 95 return [][4]byte{}, errors.New("invalid AddressProposalSets result format") 96 } else { 97 return proposalIds, nil 98 } 99 } 100 101 // AddressProposals function AddressProposals 102 func (p *Proposals) AddressProposals(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig, addr common.Address, page *big.Int, size *big.Int) ([]ProposalInfo, error) { 103 method := "addressProposals" 104 data, err := p.abi.Pack(method, addr, page, size) 105 106 if err != nil { 107 log.Error("can't pack Proposals contract method", "method", method) 108 return []ProposalInfo{}, err 109 } 110 111 msg := vmcaller.NewLegacyMessage(header.Coinbase, &p.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false) 112 result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config) 113 if err != nil { 114 log.Error("AddressProposals result", "error", err) 115 return []ProposalInfo{}, err 116 } 117 var proposalInfo []ProposalInfo 118 err = p.abi.UnpackIntoInterface(&proposalInfo, method, result) 119 if err != nil { 120 log.Error("AddressProposals Unpack", "error", err) 121 return []ProposalInfo{}, err 122 } 123 return proposalInfo, nil 124 } 125 126 // AllProposals function AllProposals 127 func (p *Proposals) AllProposals(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig, page *big.Int, size *big.Int) ([]ProposalInfo, error) { 128 method := "allProposals" 129 data, err := p.abi.Pack(method, page, size) 130 131 if err != nil { 132 log.Error("can't pack Proposals contract method", "method", method) 133 return []ProposalInfo{}, err 134 } 135 136 msg := vmcaller.NewLegacyMessage(header.Coinbase, &p.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false) 137 result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config) 138 if err != nil { 139 log.Error("AllProposals result", "error", err) 140 return []ProposalInfo{}, err 141 } 142 var proposalInfo []ProposalInfo 143 err = p.abi.UnpackIntoInterface(&proposalInfo, method, result) 144 if err != nil { 145 log.Error("AllProposals Unpack", "error", err) 146 return []ProposalInfo{}, err 147 } 148 return proposalInfo, nil 149 } 150 151 // AddressProposalCount function AddressProposalCount 152 func (p *Proposals) AddressProposalCount(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig, addr common.Address) (*big.Int, error) { 153 method := "addressProposalCount" 154 data, err := p.abi.Pack(method, addr) 155 156 if err != nil { 157 log.Error("can't pack Proposals contract method", "method", method) 158 return big.NewInt(0), err 159 } 160 161 msg := vmcaller.NewLegacyMessage(header.Coinbase, &p.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false) 162 result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config) 163 if err != nil { 164 log.Error("AddressProposalCount result", "error", err) 165 return big.NewInt(0), err 166 } 167 168 ret, err := p.abi.Unpack(method, result) 169 if err != nil { 170 return big.NewInt(0), err 171 } 172 if count, ok := ret[0].(*big.Int); !ok { 173 return big.NewInt(0), errors.New("invalid AddressProposalCount result format") 174 } else { 175 return count, nil 176 } 177 } 178 179 // ProposalCount function ProposalCount 180 func (p *Proposals) ProposalCount(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig) (*big.Int, error) { 181 method := "proposalCount" 182 data, err := p.abi.Pack(method) 183 184 if err != nil { 185 log.Error("can't pack Proposals contract method", "method", method) 186 return big.NewInt(0), err 187 } 188 189 msg := vmcaller.NewLegacyMessage(header.Coinbase, &p.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false) 190 result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config) 191 if err != nil { 192 log.Error("AllProposalSets result", "error", err) 193 return big.NewInt(0), err 194 } 195 196 ret, err := p.abi.Unpack(method, result) 197 if err != nil { 198 return big.NewInt(0), err 199 } 200 if count, ok := ret[0].(*big.Int); !ok { 201 return big.NewInt(0), errors.New("invalid AddressProposalSets result format") 202 } else { 203 return count, nil 204 } 205 } 206 207 // GetProposal function GetProposal 208 func (p *Proposals) GetProposal(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig, id string) (*ProposalInfo, error) { 209 method := "proposalInfos" 210 idBytes, err := hexutil.Decode(id) 211 if err != nil { 212 return &ProposalInfo{}, err 213 } 214 var idByte4 [4]byte 215 copy(idByte4[:], idBytes[:4]) 216 data, err := p.abi.Pack(method, idByte4) 217 218 if err != nil { 219 log.Error("can't pack Proposals contract method", "method", method) 220 return &ProposalInfo{}, err 221 } 222 223 msg := vmcaller.NewLegacyMessage(header.Coinbase, &p.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false) 224 result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config) 225 if err != nil { 226 log.Error("GetProposal result", "error", err) 227 return &ProposalInfo{}, err 228 } 229 proposalInfo := &ProposalInfo{} 230 err = p.abi.UnpackIntoInterface(proposalInfo, method, result) 231 if err != nil { 232 log.Error("GetProposal Unpack", "error", err) 233 return &ProposalInfo{}, err 234 } 235 return proposalInfo, nil 236 }