This repository has been archived by the owner on May 13, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 346
/
account.go
127 lines (111 loc) · 3.33 KB
/
account.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Copyright Monax Industries Limited
// SPDX-License-Identifier: Apache-2.0
package acm
import (
"bytes"
"fmt"
"reflect"
"github.com/gogo/protobuf/proto"
"github.com/hyperledger/burrow/binary"
"github.com/hyperledger/burrow/crypto"
"github.com/hyperledger/burrow/event/query"
"github.com/hyperledger/burrow/execution/errors"
"github.com/hyperledger/burrow/permission"
)
var GlobalPermissionsAddress = crypto.Address(binary.Zero160)
func NewAccount(pubKey crypto.PublicKey) *Account {
return &Account{
Address: pubKey.GetAddress(),
PublicKey: pubKey,
}
}
func NewAccountFromSecret(secret string) *Account {
return NewAccount(crypto.PrivateKeyFromSecret(secret, crypto.CurveTypeEd25519).GetPublicKey())
}
func (acc *Account) GetAddress() crypto.Address {
return acc.Address
}
func (acc *Account) AddToBalance(amount uint64) error {
if binary.IsUint64SumOverflow(acc.Balance, amount) {
return errors.Errorf(errors.Codes.IntegerOverflow,
"uint64 overflow: attempt to add %v to the balance of %s", amount, acc.Address)
}
acc.Balance += amount
return nil
}
func (acc *Account) SubtractFromBalance(amount uint64) error {
if amount > acc.Balance {
return errors.Errorf(errors.Codes.InsufficientBalance,
"insufficient funds: attempt to subtract %v from the balance of %s", amount, acc.Address)
}
acc.Balance -= amount
return nil
}
// Return bytes of any code-type value that is set. EVM, WASM, or native name
func (acc *Account) Code() []byte {
switch {
case len(acc.EVMCode) > 0:
return acc.EVMCode
case len(acc.WASMCode) > 0:
return acc.WASMCode
case acc.NativeName != "":
return []byte(acc.NativeName)
}
return nil
}
// Conversions
//
// Using the naming convention is this package of 'As<Type>' being
// a conversion from Account to <Type> and 'From<Type>' being conversion
// from <Type> to Account. Conversions are done by copying
// Creates an otherwise zeroed Account from an Addressable and returns it as MutableAccount
func FromAddressable(addressable crypto.Addressable) *Account {
return &Account{
Address: addressable.GetAddress(),
PublicKey: addressable.GetPublicKey(),
// Since nil slices and maps compare differently to empty ones
EVMCode: Bytecode{},
Permissions: permission.AccountPermissions{
Roles: []string{},
},
}
}
// Copies all mutable parts of account
func (acc *Account) Copy() *Account {
if acc == nil {
return nil
}
accCopy := *acc
accCopy.Permissions.Roles = make([]string, len(acc.Permissions.Roles))
copy(accCopy.Permissions.Roles, acc.Permissions.Roles)
return &accCopy
}
func (acc *Account) Equal(accOther *Account) bool {
buf := proto.NewBuffer(nil)
err := buf.Marshal(acc)
if err != nil {
return false
}
accEnc := buf.Bytes()
buf.Reset()
err = buf.Marshal(accOther)
if err != nil {
return false
}
accOtherEnc := buf.Bytes()
return bytes.Equal(accEnc, accOtherEnc)
}
func (acc Account) String() string {
return fmt.Sprintf("Account{Address: %s; Sequence: %v; PublicKey: %v Balance: %v; CodeLength: %v; Permissions: %v}",
acc.Address, acc.Sequence, acc.PublicKey, acc.Balance, len(acc.EVMCode), acc.Permissions)
}
func (acc *Account) Get(key string) (interface{}, bool) {
switch key {
case "Permissions":
return acc.Permissions.Base.ResultantPerms(), true
case "Roles":
return acc.Permissions.Roles, true
default:
return query.GetReflect(reflect.ValueOf(acc), key)
}
}