From f8190f7a91a7a86a2f0dde85bcbc26d6c360cab8 Mon Sep 17 00:00:00 2001
From: Alex Vanin <alexey@nspcc.ru>
Date: Thu, 12 Nov 2020 16:52:14 +0300
Subject: [PATCH] [#19] alphabet: Add vote method

Alphabet contracts are holders of NEO token in sidechain.
Inner ring nodes control sidechain validators list through
voting of alphabet contracts.

Signed-off-by: Alex Vanin <alexey@nspcc.ru>
---
 alphabet/alphabet.tpl                | 13 +++++++++++++
 alphabet/az/az_contract.go           | 13 +++++++++++++
 alphabet/buky/buky_contract.go       | 13 +++++++++++++
 alphabet/dobro/dobro_contract.go     | 13 +++++++++++++
 alphabet/glagoli/glagoli_contract.go | 13 +++++++++++++
 alphabet/jest/jest_contract.go       | 13 +++++++++++++
 alphabet/vedi/vedi_contract.go       | 13 +++++++++++++
 alphabet/zhivete/zhivete_contract.go | 13 +++++++++++++
 8 files changed, 104 insertions(+)

diff --git a/alphabet/alphabet.tpl b/alphabet/alphabet.tpl
index f27365c..3ababbc 100644
--- a/alphabet/alphabet.tpl
+++ b/alphabet/alphabet.tpl
@@ -111,6 +111,19 @@ func Emit() bool {
 	return true
 }
 
+func Vote(candidate []byte) {
+	innerRingKeys := irList()
+	if !checkPermission(innerRingKeys) {
+		panic("invalid invoker")
+	}
+
+	address := runtime.GetExecutingScriptHash()
+
+	_ = engine.AppCall([]byte(neoHash), "vote", address, candidate)
+
+	return
+}
+
 func Name() string {
 	return name
 }
diff --git a/alphabet/az/az_contract.go b/alphabet/az/az_contract.go
index f2475af..34bf7e2 100644
--- a/alphabet/az/az_contract.go
+++ b/alphabet/az/az_contract.go
@@ -111,6 +111,19 @@ func Emit() bool {
 	return true
 }
 
+func Vote(candidate []byte) {
+	innerRingKeys := irList()
+	if !checkPermission(innerRingKeys) {
+		panic("invalid invoker")
+	}
+
+	address := runtime.GetExecutingScriptHash()
+
+	_ = engine.AppCall([]byte(neoHash), "vote", address, candidate)
+
+	return
+}
+
 func Name() string {
 	return name
 }
diff --git a/alphabet/buky/buky_contract.go b/alphabet/buky/buky_contract.go
index e8b3539..a4d549c 100644
--- a/alphabet/buky/buky_contract.go
+++ b/alphabet/buky/buky_contract.go
@@ -111,6 +111,19 @@ func Emit() bool {
 	return true
 }
 
+func Vote(candidate []byte) {
+	innerRingKeys := irList()
+	if !checkPermission(innerRingKeys) {
+		panic("invalid invoker")
+	}
+
+	address := runtime.GetExecutingScriptHash()
+
+	_ = engine.AppCall([]byte(neoHash), "vote", address, candidate)
+
+	return
+}
+
 func Name() string {
 	return name
 }
diff --git a/alphabet/dobro/dobro_contract.go b/alphabet/dobro/dobro_contract.go
index 4fb8999..537b5fd 100644
--- a/alphabet/dobro/dobro_contract.go
+++ b/alphabet/dobro/dobro_contract.go
@@ -111,6 +111,19 @@ func Emit() bool {
 	return true
 }
 
+func Vote(candidate []byte) {
+	innerRingKeys := irList()
+	if !checkPermission(innerRingKeys) {
+		panic("invalid invoker")
+	}
+
+	address := runtime.GetExecutingScriptHash()
+
+	_ = engine.AppCall([]byte(neoHash), "vote", address, candidate)
+
+	return
+}
+
 func Name() string {
 	return name
 }
diff --git a/alphabet/glagoli/glagoli_contract.go b/alphabet/glagoli/glagoli_contract.go
index 043a00f..4c57cf2 100644
--- a/alphabet/glagoli/glagoli_contract.go
+++ b/alphabet/glagoli/glagoli_contract.go
@@ -111,6 +111,19 @@ func Emit() bool {
 	return true
 }
 
+func Vote(candidate []byte) {
+	innerRingKeys := irList()
+	if !checkPermission(innerRingKeys) {
+		panic("invalid invoker")
+	}
+
+	address := runtime.GetExecutingScriptHash()
+
+	_ = engine.AppCall([]byte(neoHash), "vote", address, candidate)
+
+	return
+}
+
 func Name() string {
 	return name
 }
diff --git a/alphabet/jest/jest_contract.go b/alphabet/jest/jest_contract.go
index ed0f695..e0cf34b 100644
--- a/alphabet/jest/jest_contract.go
+++ b/alphabet/jest/jest_contract.go
@@ -111,6 +111,19 @@ func Emit() bool {
 	return true
 }
 
+func Vote(candidate []byte) {
+	innerRingKeys := irList()
+	if !checkPermission(innerRingKeys) {
+		panic("invalid invoker")
+	}
+
+	address := runtime.GetExecutingScriptHash()
+
+	_ = engine.AppCall([]byte(neoHash), "vote", address, candidate)
+
+	return
+}
+
 func Name() string {
 	return name
 }
diff --git a/alphabet/vedi/vedi_contract.go b/alphabet/vedi/vedi_contract.go
index 9cd53a9..286534c 100644
--- a/alphabet/vedi/vedi_contract.go
+++ b/alphabet/vedi/vedi_contract.go
@@ -111,6 +111,19 @@ func Emit() bool {
 	return true
 }
 
+func Vote(candidate []byte) {
+	innerRingKeys := irList()
+	if !checkPermission(innerRingKeys) {
+		panic("invalid invoker")
+	}
+
+	address := runtime.GetExecutingScriptHash()
+
+	_ = engine.AppCall([]byte(neoHash), "vote", address, candidate)
+
+	return
+}
+
 func Name() string {
 	return name
 }
diff --git a/alphabet/zhivete/zhivete_contract.go b/alphabet/zhivete/zhivete_contract.go
index 236af74..2a53709 100644
--- a/alphabet/zhivete/zhivete_contract.go
+++ b/alphabet/zhivete/zhivete_contract.go
@@ -111,6 +111,19 @@ func Emit() bool {
 	return true
 }
 
+func Vote(candidate []byte) {
+	innerRingKeys := irList()
+	if !checkPermission(innerRingKeys) {
+		panic("invalid invoker")
+	}
+
+	address := runtime.GetExecutingScriptHash()
+
+	_ = engine.AppCall([]byte(neoHash), "vote", address, candidate)
+
+	return
+}
+
 func Name() string {
 	return name
 }