aboutsummaryrefslogtreecommitdiffstats
path: root/core/vm/oracle_contracts.go
diff options
context:
space:
mode:
authorWei-Ning Huang <w@dexon.org>2019-04-26 19:05:48 +0800
committerWei-Ning Huang <w@dexon.org>2019-04-26 19:06:13 +0800
commit90ce80a741cdc296d4f3badf665d0fe7bacb0ecb (patch)
treec085fc1b7bb38ee572455113f42a5f92fb576ac5 /core/vm/oracle_contracts.go
parentdc3ecc26059103d45f948e227c1ac2fc48c8a5a3 (diff)
downloaddexon-90ce80a741cdc296d4f3badf665d0fe7bacb0ecb.tar
dexon-90ce80a741cdc296d4f3badf665d0fe7bacb0ecb.tar.gz
dexon-90ce80a741cdc296d4f3badf665d0fe7bacb0ecb.tar.bz2
dexon-90ce80a741cdc296d4f3badf665d0fe7bacb0ecb.tar.lz
dexon-90ce80a741cdc296d4f3badf665d0fe7bacb0ecb.tar.xz
dexon-90ce80a741cdc296d4f3badf665d0fe7bacb0ecb.tar.zst
dexon-90ce80a741cdc296d4f3badf665d0fe7bacb0ecb.zip
core: vm: implement transferNodeOwnershipByFoundation (#399)v1.0.1
Diffstat (limited to 'core/vm/oracle_contracts.go')
-rw-r--r--core/vm/oracle_contracts.go41
1 files changed, 41 insertions, 0 deletions
diff --git a/core/vm/oracle_contracts.go b/core/vm/oracle_contracts.go
index 35a9e5861..3a84015b5 100644
--- a/core/vm/oracle_contracts.go
+++ b/core/vm/oracle_contracts.go
@@ -2302,6 +2302,15 @@ func (g *GovernanceContract) Run(evm *EVM, input []byte, contract *Contract) (re
return nil, errExecutionReverted
}
return g.transferNodeOwnership(newOwner)
+ case "transferNodeOwnershipByFoundation":
+ args := struct {
+ OldOwner common.Address
+ NewOwner common.Address
+ }{}
+ if err := method.Inputs.Unpack(&args, arguments); err != nil {
+ return nil, errExecutionReverted
+ }
+ return g.transferNodeOwnershipByFoundation(args.OldOwner, args.NewOwner)
case "unstake":
amount := new(big.Int)
if err := method.Inputs.Unpack(&amount, arguments); err != nil {
@@ -2681,6 +2690,38 @@ func (g *GovernanceContract) transferNodeOwnership(newOwner common.Address) ([]b
return nil, nil
}
+func (g *GovernanceContract) transferNodeOwnershipByFoundation(oldOwner, newOwner common.Address) ([]byte, error) {
+ // Only owner can update configuration.
+ if g.contract.Caller() != g.state.Owner() {
+ return nil, errExecutionReverted
+ }
+
+ if newOwner == (common.Address{}) {
+ return nil, errExecutionReverted
+ }
+
+ offset := g.state.NodesOffsetByAddress(oldOwner)
+ if offset.Cmp(big.NewInt(0)) < 0 {
+ return nil, errExecutionReverted
+ }
+
+ newOffset := g.state.NodesOffsetByAddress(newOwner)
+ if newOffset.Cmp(big.NewInt(0)) >= 0 {
+ return nil, errExecutionReverted
+ }
+
+ node := g.state.Node(offset)
+ g.state.DeleteNodeOffsets(node)
+
+ node.Owner = newOwner
+ g.state.PutNodeOffsets(node, offset)
+ g.state.UpdateNode(offset, node)
+
+ g.state.emitNodeOwnershipTransfered(oldOwner, newOwner)
+
+ return nil, nil
+}
+
func (g *GovernanceContract) replaceNodePublicKey(newPublicKey []byte) ([]byte, error) {
caller := g.contract.Caller()