aboutsummaryrefslogtreecommitdiffstats
path: root/core/vm/governance.go
diff options
context:
space:
mode:
Diffstat (limited to 'core/vm/governance.go')
-rw-r--r--core/vm/governance.go118
1 files changed, 110 insertions, 8 deletions
diff --git a/core/vm/governance.go b/core/vm/governance.go
index 46effcc29..3361be671 100644
--- a/core/vm/governance.go
+++ b/core/vm/governance.go
@@ -127,6 +127,22 @@ const abiJSON = `
{
"name": "staked",
"type": "uint256"
+ },
+ {
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "name": "email",
+ "type": "string"
+ },
+ {
+ "name": "location",
+ "type": "string"
+ },
+ {
+ "name": "url",
+ "type": "string"
}
],
"payable": false,
@@ -568,6 +584,22 @@ const abiJSON = `
{
"name": "PublicKey",
"type": "bytes"
+ },
+ {
+ "name": "Name",
+ "type": "string"
+ },
+ {
+ "name": "Email",
+ "type": "string"
+ },
+ {
+ "name": "Location",
+ "type": "string"
+ },
+ {
+ "name": "Url",
+ "type": "string"
}
],
"name": "stake",
@@ -692,11 +724,17 @@ func RunGovernanceContract(evm *EVM, input []byte, contract *Contract) (
}
return g.proposeCRS(args.Round, args.SignedCRS)
case "stake":
- var publicKey []byte
- if err := method.Inputs.Unpack(&publicKey, arguments); err != nil {
+ args := struct {
+ PublicKey []byte
+ Name string
+ Email string
+ Location string
+ Url string
+ }{}
+ if err := method.Inputs.Unpack(&args, arguments); err != nil {
return nil, errExecutionReverted
}
- return g.stake(publicKey)
+ return g.stake(args.PublicKey, args.Name, args.Email, args.Location, args.Url)
case "snapshotRound":
args := struct {
Round *big.Int
@@ -844,7 +882,9 @@ func RunGovernanceContract(evm *EVM, input []byte, contract *Contract) (
return nil, errExecutionReverted
}
info := g.state.Node(index)
- res, err := method.Outputs.Pack(info.Owner, info.PublicKey, info.Staked)
+ res, err := method.Outputs.Pack(
+ info.Owner, info.PublicKey, info.Staked,
+ info.Name, info.Email, info.Location, info.Url)
if err != nil {
return nil, errExecutionReverted
}
@@ -1080,6 +1120,10 @@ func (s *GovernanceStateHelper) PushRoundHeight(height *big.Int) {
// address owner;
// bytes publicKey;
// uint256 staked;
+// string name;
+// string email;
+// string location;
+// string url;
// }
//
// Node[] nodes;
@@ -1088,8 +1132,14 @@ type nodeInfo struct {
Owner common.Address
PublicKey []byte
Staked *big.Int
+ Name string
+ Email string
+ Location string
+ Url string
}
+const nodesInfoSize = 7
+
func (s *GovernanceStateHelper) NodesLength() *big.Int {
return s.getStateBigInt(big.NewInt(nodesLoc))
}
@@ -1097,7 +1147,8 @@ func (s *GovernanceStateHelper) Node(index *big.Int) *nodeInfo {
node := new(nodeInfo)
arrayBaseLoc := s.getSlotLoc(big.NewInt(nodesLoc))
- elementBaseLoc := new(big.Int).Add(arrayBaseLoc, new(big.Int).Mul(index, big.NewInt(3)))
+ elementBaseLoc := new(big.Int).Add(arrayBaseLoc,
+ new(big.Int).Mul(index, big.NewInt(nodesInfoSize)))
// owner.
loc := elementBaseLoc
@@ -1111,6 +1162,22 @@ func (s *GovernanceStateHelper) Node(index *big.Int) *nodeInfo {
loc = new(big.Int).Add(elementBaseLoc, big.NewInt(2))
node.Staked = s.getStateBigInt(loc)
+ // name.
+ loc = new(big.Int).Add(elementBaseLoc, big.NewInt(3))
+ node.Name = string(s.readBytes(loc))
+
+ // email.
+ loc = new(big.Int).Add(elementBaseLoc, big.NewInt(4))
+ node.Email = string(s.readBytes(loc))
+
+ // location.
+ loc = new(big.Int).Add(elementBaseLoc, big.NewInt(5))
+ node.Location = string(s.readBytes(loc))
+
+ // url.
+ loc = new(big.Int).Add(elementBaseLoc, big.NewInt(6))
+ node.Url = string(s.readBytes(loc))
+
return node
}
func (s *GovernanceStateHelper) PushNode(n *nodeInfo) {
@@ -1122,7 +1189,8 @@ func (s *GovernanceStateHelper) PushNode(n *nodeInfo) {
}
func (s *GovernanceStateHelper) UpdateNode(index *big.Int, n *nodeInfo) {
arrayBaseLoc := s.getSlotLoc(big.NewInt(nodesLoc))
- elementBaseLoc := new(big.Int).Add(arrayBaseLoc, new(big.Int).Mul(index, big.NewInt(3)))
+ elementBaseLoc := new(big.Int).Add(arrayBaseLoc,
+ new(big.Int).Mul(index, big.NewInt(nodesInfoSize)))
// owner.
loc := elementBaseLoc
@@ -1135,6 +1203,22 @@ func (s *GovernanceStateHelper) UpdateNode(index *big.Int, n *nodeInfo) {
// staked.
loc = new(big.Int).Add(elementBaseLoc, big.NewInt(2))
s.setStateBigInt(loc, n.Staked)
+
+ // name.
+ loc = new(big.Int).Add(elementBaseLoc, big.NewInt(3))
+ s.writeBytes(loc, []byte(n.Name))
+
+ // email.
+ loc = new(big.Int).Add(elementBaseLoc, big.NewInt(4))
+ s.writeBytes(loc, []byte(n.Email))
+
+ // location.
+ loc = new(big.Int).Add(elementBaseLoc, big.NewInt(5))
+ s.writeBytes(loc, []byte(n.Location))
+
+ // url.
+ loc = new(big.Int).Add(elementBaseLoc, big.NewInt(6))
+ s.writeBytes(loc, []byte(n.Url))
}
func (s *GovernanceStateHelper) Nodes() []*nodeInfo {
var nodes []*nodeInfo
@@ -1298,12 +1382,18 @@ func (s *GovernanceStateHelper) MinBlockInterval() *big.Int {
}
// Stake is a helper function for creating genesis state.
-func (s *GovernanceStateHelper) Stake(addr common.Address, publicKey []byte, staked *big.Int) {
+func (s *GovernanceStateHelper) Stake(
+ addr common.Address, publicKey []byte, staked *big.Int,
+ name, email, location, url string) {
offset := s.NodesLength()
s.PushNode(&nodeInfo{
Owner: addr,
PublicKey: publicKey,
Staked: staked,
+ Name: name,
+ Email: email,
+ Location: location,
+ Url: url,
})
s.PutOffset(addr, offset)
}
@@ -1530,7 +1620,15 @@ func (g *GovernanceContract) updateConfiguration(config *params.DexconConfig) ([
return nil, nil
}
-func (g *GovernanceContract) stake(publicKey []byte) ([]byte, error) {
+func (g *GovernanceContract) stake(
+ publicKey []byte, name, email, location, url string) ([]byte, error) {
+
+ // Reject invalid inputs.
+ if len(name) >= 32 || len(email) >= 32 || len(location) >= 32 || len(url) >= 128 {
+ g.penalize()
+ return nil, errExecutionReverted
+ }
+
caller := g.contract.Caller()
offset := g.state.Offset(caller)
@@ -1545,6 +1643,10 @@ func (g *GovernanceContract) stake(publicKey []byte) ([]byte, error) {
Owner: caller,
PublicKey: publicKey,
Staked: g.contract.Value(),
+ Name: name,
+ Email: email,
+ Location: location,
+ Url: url,
})
g.state.PutOffset(caller, offset)