package store import ( "math/big" "time" "github.com/Secured-Finance/dione/lib" "github.com/Secured-Finance/dione/rpcclient" "github.com/Secured-Finance/dione/types" "github.com/ethereum/go-ethereum/common" validation "github.com/go-ozzo/ozzo-validation" ) type DioneStakeInfo struct { ID int MinerStake *big.Int TotalStake *big.Int MinerWallet string MinerEthWallet string Timestamp time.Time Ethereum *rpcclient.EthereumClient } func NewDioneStakeInfo(minerStake, totalStake *big.Int, minerWallet, minerEthWallet string, ethereumClient *rpcclient.EthereumClient) *DioneStakeInfo { return &DioneStakeInfo{ MinerStake: minerStake, TotalStake: totalStake, MinerWallet: minerWallet, MinerEthWallet: minerEthWallet, Ethereum: ethereumClient, } } func (d *DioneStakeInfo) UpdateMinerStake(minerEthAddress common.Address) error { minerStake, err := d.Ethereum.GetMinerStake(minerEthAddress) if err != nil { return err } d.MinerStake = minerStake return nil } func (d *DioneStakeInfo) UpdateTotalStake() error { totalStake, err := d.Ethereum.GetTotalStake() if err != nil { return err } d.TotalStake = totalStake return nil } // Put miner's staking information into the database func (s *Store) CreateDioneStakeInfo(stakeStore *DioneStakeInfo) error { if err := stakeStore.Validate(); err != nil { return err } now := lib.Clock.Now() return s.db.QueryRow( "INSERT INTO staking (miner_stake, total_stake, miner_wallet, miner_eth_wallet, timestamp) VALUES ($1, $2, $3, $4, $5) RETURNING id", stakeStore.MinerStake, stakeStore.TotalStake, stakeStore.MinerWallet, stakeStore.MinerEthWallet, now, ).Scan(&stakeStore.ID) } func (s *Store) GetLastStakeInfo(wallet, ethWallet string) (*DioneStakeInfo, error) { var stake *DioneStakeInfo if err := s.db.Select(&stake, `SELECT miner_stake, total_stake, miner_wallet, miner_eth_wallet, timestamp FROM staking ORDER BY TIMESTAMP DESC LIMIT 1 WHERE miner_wallet=$1, miner_eth_wallet=$2`, wallet, ethWallet, ); err != nil { return nil, err } return stake, nil } // Before puting the data into the database validating all required fields func (s *DioneStakeInfo) Validate() error { return validation.ValidateStruct( s, validation.Field(&s.MinerStake, validation.Required, validation.By(types.ValidateBigInt(s.MinerStake))), validation.Field(&s.TotalStake, validation.Required, validation.By(types.ValidateBigInt(s.TotalStake))), validation.Field(&s.MinerWallet, validation.Required), validation.Field(&s.MinerEthWallet, validation.Required), ) }