mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-11-26 09:42:22 +00:00
chore: change CompareBytes to EqualBytes (CityOfZion/neo-storm#22)
* chore: change CompareBytes to EqualBytes * chore: remove trailing spaces * chore: rename EqualBytes to Equals Imported from CityOfZion/neo-storm (da16e967d9631e132488731a42966bccb5ad7f30).
This commit is contained in:
parent
f14833893c
commit
df173c295d
5 changed files with 6 additions and 120 deletions
|
@ -4,6 +4,7 @@ import (
|
||||||
"github.com/CityOfZion/neo-storm/interop/engine"
|
"github.com/CityOfZion/neo-storm/interop/engine"
|
||||||
"github.com/CityOfZion/neo-storm/interop/runtime"
|
"github.com/CityOfZion/neo-storm/interop/runtime"
|
||||||
"github.com/CityOfZion/neo-storm/interop/storage"
|
"github.com/CityOfZion/neo-storm/interop/storage"
|
||||||
|
"github.com/CityOfZion/neo-storm/interop/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Token holds all token info
|
// Token holds all token info
|
||||||
|
@ -85,28 +86,10 @@ func IsUsableAddress(addr []byte) bool {
|
||||||
|
|
||||||
// Check if a smart contract is calling scripthash
|
// Check if a smart contract is calling scripthash
|
||||||
callingScriptHash := engine.GetCallingScriptHash()
|
callingScriptHash := engine.GetCallingScriptHash()
|
||||||
if EqualAddresses(callingScriptHash, addr) {
|
if util.Equals(callingScriptHash, addr) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// EqualAddresses compares two addresses if they're equal
|
|
||||||
// also returns false if one of the two - or both - aren't actual addresses
|
|
||||||
func EqualAddresses(a []byte, b []byte) bool {
|
|
||||||
aLen := len(a)
|
|
||||||
bLen := len(b)
|
|
||||||
if aLen != bLen || aLen != 20 || bLen != 20 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < aLen; i++ {
|
|
||||||
if a[i] != b[i] {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,97 +0,0 @@
|
||||||
package token
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/CityOfZion/neo-storm/interop/engine"
|
|
||||||
"github.com/CityOfZion/neo-storm/interop/runtime"
|
|
||||||
"github.com/CityOfZion/neo-storm/interop/storage"
|
|
||||||
"github.com/CityOfZion/neo-storm/interop/util"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Token holds all token info
|
|
||||||
type Token struct {
|
|
||||||
// Token name
|
|
||||||
Name string
|
|
||||||
// Ticker symbol
|
|
||||||
Symbol string
|
|
||||||
// Amount of decimals
|
|
||||||
Decimals int
|
|
||||||
// Token owner address
|
|
||||||
Owner []byte
|
|
||||||
// Total tokens * multiplier
|
|
||||||
TotalSupply int
|
|
||||||
// Storage key for circulation value
|
|
||||||
CirculationKey string
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Transfer event
|
|
||||||
// DoTransfer := action.RegisterAction("transfer", "from", "to", "amount")
|
|
||||||
|
|
||||||
// GetSupply gets the token totalSupply value from VM storage
|
|
||||||
func (t Token) GetSupply(ctx storage.Context) interface{} {
|
|
||||||
return storage.Get(ctx, t.CirculationKey)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BalanceOf gets the token balance of a specific address
|
|
||||||
func (t Token) BalanceOf(ctx storage.Context, hodler []byte) interface{} {
|
|
||||||
return storage.Get(ctx, hodler)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transfer token from one user to another
|
|
||||||
func (t Token) Transfer(ctx storage.Context, from []byte, to []byte, amount int) bool {
|
|
||||||
amountFrom := t.CanTransfer(ctx, from, to, amount)
|
|
||||||
if amountFrom == -1 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
if amountFrom == 0 {
|
|
||||||
storage.Delete(ctx, from)
|
|
||||||
}
|
|
||||||
|
|
||||||
if amountFrom > 0 {
|
|
||||||
diff := amountFrom - amount
|
|
||||||
storage.Put(ctx, from, diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
amountTo := storage.Get(ctx, to).(int)
|
|
||||||
totalAmountTo := amountTo + amount
|
|
||||||
storage.Put(ctx, to, totalAmountTo)
|
|
||||||
// DoTransfer(from, to, amount)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// CanTransfer returns the amount it can transfer
|
|
||||||
func (t Token) CanTransfer(ctx storage.Context, from []byte, to []byte, amount int) int {
|
|
||||||
if len(to) != 20 && !IsUsableAddress(from) {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
|
|
||||||
amountFrom := storage.Get(ctx, from).(int)
|
|
||||||
if amountFrom < amount {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tell Transfer the result is equal - special case since it uses Delete
|
|
||||||
if amountFrom == amount {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// return amountFrom value back to Transfer, reduces extra Get
|
|
||||||
return amountFrom
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsUsableAddress checks if the sender is either the correct NEO address or SC address
|
|
||||||
func IsUsableAddress(addr []byte) bool {
|
|
||||||
if len(addr) == 20 {
|
|
||||||
if runtime.CheckWitness(addr) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if a smart contract is calling scripthash
|
|
||||||
callingScriptHash := engine.GetCallingScriptHash()
|
|
||||||
if util.CompareBytes(callingScriptHash, addr) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
|
@ -5,8 +5,8 @@ func FromAddress(address string) []byte {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CompareBytes compares a with b and will return true whether a and b
|
// Equals compares a with b and will return true whether a and b
|
||||||
// are equal.
|
// are equal.
|
||||||
func CompareBytes(a, b []byte) bool {
|
func Equals(a, b interface{}) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ var (
|
||||||
builtinFuncs = []string{
|
builtinFuncs = []string{
|
||||||
"len", "append", "SHA256",
|
"len", "append", "SHA256",
|
||||||
"SHA1", "Hash256", "Hash160",
|
"SHA1", "Hash256", "Hash160",
|
||||||
"FromAddress", "CompareBytes",
|
"FromAddress", "Equals",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -571,7 +571,7 @@ func (c *codegen) convertBuiltin(expr *ast.CallExpr) {
|
||||||
emitOpcode(c.prog, vm.HASH256)
|
emitOpcode(c.prog, vm.HASH256)
|
||||||
case "Hash160":
|
case "Hash160":
|
||||||
emitOpcode(c.prog, vm.HASH160)
|
emitOpcode(c.prog, vm.HASH160)
|
||||||
case "CompareBytes":
|
case "Equals":
|
||||||
emitOpcode(c.prog, vm.EQUAL)
|
emitOpcode(c.prog, vm.EQUAL)
|
||||||
case "FromAddress":
|
case "FromAddress":
|
||||||
// We can be sure that this is a ast.BasicLit just containing a simple
|
// We can be sure that this is a ast.BasicLit just containing a simple
|
||||||
|
|
Loading…
Reference in a new issue