diff --git a/api/service/staking/service.go b/api/service/staking/service.go index 745d9226e..1f1da0e22 100644 --- a/api/service/staking/service.go +++ b/api/service/staking/service.go @@ -2,7 +2,9 @@ package staking import ( "crypto/ecdsa" + "github.com/ethereum/go-ethereum/accounts/abi" "math/big" + "os" "time" "github.com/ethereum/go-ethereum/common" @@ -98,6 +100,14 @@ func (s *Service) IsStaked() bool { // DoService does staking. func (s *Service) DoService() { utils.GetLogInstance().Info("Trying to send a staking transaction.") + abi, err := s.getStakeLockContractABI() + if err != nil { + utils.GetLogInstance().Error("Failed to generate staking contract's ABI", "error", err) + } else { + utils.GetLogInstance().Info("Generated staking contract's ABI", "abi", abi) + } + // TODO: use abi to generate staking transaction. + if s.beaconChain == nil { utils.GetLogInstance().Info("Can not send a staking transaction because of nil beacon chain.") return @@ -110,6 +120,17 @@ func (s *Service) DoService() { } } +func (s *Service) getStakeLockContractABI() (abi.ABI, error) { + f, err := os.Open("./contracts/StakeLockContract.json") + if err != nil { + if os.IsNotExist(err) { + return abi.ABI{}, err + } + } + defer f.Close() + return abi.JSON(f) +} + func (s *Service) getStakingInfo() *proto.StakingContractInfoResponse { address := crypto.PubkeyToAddress(s.accountKey.PublicKey) state, err := s.beaconChain.State() diff --git a/contracts/StakeLockContract.json b/contracts/StakeLockContract.json new file mode 100644 index 000000000..f2ebd1d6f --- /dev/null +++ b/contracts/StakeLockContract.json @@ -0,0 +1,143 @@ +[ + { + "constant": true, + "inputs": [], + "name": "listLockedAddresses", + "outputs": [ + { + "name": "lockedAddresses", + "type": "address[]" + }, + { + "name": "blockNums", + "type": "uint256[]" + }, + { + "name": "lockPeriodCounts", + "type": "uint256[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_of", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "currentEpoch", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "unlock", + "outputs": [ + { + "name": "unlockableTokens", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_of", + "type": "address" + } + ], + "name": "getUnlockableTokens", + "outputs": [ + { + "name": "unlockableTokens", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "lock", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "_of", + "type": "address" + }, + { + "indexed": false, + "name": "_amount", + "type": "uint256" + }, + { + "indexed": false, + "name": "_epoch", + "type": "uint256" + } + ], + "name": "Locked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "account", + "type": "address" + }, + { + "indexed": false, + "name": "index", + "type": "uint256" + } + ], + "name": "Unlocked", + "type": "event" + } +]