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  }