forked from TrueCloudLab/frostfs-contract
7fbf6d73b0
Proxy contract used by notary contract as a main tx payment provider. `Verify` function verifies if main tx contains multisig of 5\7 inner ring nodes. If so, then contract pays for transaction. This is easier than support multisig wallet with GAS assets, because inner ring can change, therefore multisig wallet can change periodically. Signed-off-by: Alex Vanin <alexey@nspcc.ru>
58 lines
1.7 KiB
Go
58 lines
1.7 KiB
Go
package common
|
|
|
|
import (
|
|
"github.com/nspcc-dev/neo-go/pkg/interop"
|
|
"github.com/nspcc-dev/neo-go/pkg/interop/contract"
|
|
"github.com/nspcc-dev/neo-go/pkg/interop/runtime"
|
|
"github.com/nspcc-dev/neo-go/pkg/interop/storage"
|
|
)
|
|
|
|
const (
|
|
irListMethod = "innerRingList"
|
|
multiaddrMethod = "multiaddress"
|
|
)
|
|
|
|
type IRNode struct {
|
|
PublicKey []byte
|
|
}
|
|
|
|
// InnerRingInvoker returns public key of inner ring node that invoked contract.
|
|
func InnerRingInvoker(ir []IRNode) []byte {
|
|
for i := 0; i < len(ir); i++ {
|
|
node := ir[i]
|
|
if runtime.CheckWitness(node.PublicKey) {
|
|
return node.PublicKey
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// InnerRingList returns list of inner ring nodes through calling
|
|
// "innerRingList" method of smart contract.
|
|
//
|
|
// Address of smart contract is received from storage by key.
|
|
func InnerRingListViaStorage(ctx storage.Context, key interface{}) []IRNode {
|
|
sc := storage.Get(ctx, key).([]byte)
|
|
return InnerRingList(sc)
|
|
}
|
|
|
|
// InnerRingList gets list of inner ring through
|
|
// calling "innerRingList" method of smart contract.
|
|
func InnerRingList(sc interop.Hash160) []IRNode {
|
|
return contract.Call(sc, irListMethod, contract.ReadOnly).([]IRNode)
|
|
}
|
|
|
|
// InnerRingMultiAddressViaStorage returns multiaddress of inner ring public
|
|
// keys by invoking netmap contract, which scripthash stored in the contract
|
|
// storage by the key `key`.
|
|
func InnerRingMultiAddressViaStorage(ctx storage.Context, key interface{}) []byte {
|
|
sc := storage.Get(ctx, key).([]byte)
|
|
return InnerRingMultiAddress(sc)
|
|
}
|
|
|
|
// InnerRingMultiAddress returns multiaddress of inner ring public keys by
|
|
// invoking netmap contract.
|
|
func InnerRingMultiAddress(sc interop.Hash160) []byte {
|
|
return contract.Call(sc, multiaddrMethod, contract.ReadOnly).([]byte)
|
|
}
|