package proxy import ( "git.frostfs.info/TrueCloudLab/frostfs-contract/common" "github.com/nspcc-dev/neo-go/pkg/interop" "github.com/nspcc-dev/neo-go/pkg/interop/native/gas" "github.com/nspcc-dev/neo-go/pkg/interop/native/management" "github.com/nspcc-dev/neo-go/pkg/interop/runtime" "github.com/nspcc-dev/neo-go/pkg/interop/storage" "github.com/nspcc-dev/neo-go/pkg/interop/util" ) const accountKeyPrefix = 'a' // OnNEP17Payment is a callback for NEP-17 compatible native GAS contract. func OnNEP17Payment(from interop.Hash160, amount int, data any) { caller := runtime.GetCallingScriptHash() if !common.BytesEqual(caller, []byte(gas.Hash)) { common.AbortWithMessage("proxy contract accepts GAS only") } } func _deploy(data any, isUpdate bool) { if isUpdate { args := data.([]any) common.CheckVersion(args[len(args)-1].(int)) return } runtime.Log("proxy contract initialized") } // Update method updates contract source code and manifest. It can be invoked // only by committee. func Update(script []byte, manifest []byte, data any) { if !common.HasUpdateAccess() { panic("only committee can update contract") } management.UpdateWithData(script, manifest, common.AppendVersion(data)) runtime.Log("proxy contract updated") } // Verify method returns true if transaction contains valid multisignature of // Alphabet nodes of the Inner Ring. func Verify(addr interop.Hash160) bool { common.CheckWitness(addr) ctx := storage.GetReadOnlyContext() if storage.Get(ctx, append([]byte{accountKeyPrefix}, addr...)) != nil { return true } if util.Equals(addr, common.CommitteeAddress()) { return true } if util.Equals(addr, common.AlphabetAddress()) { return true } return false } // Version returns the version of the contract. func Version() int { return common.Version } func AddAccount(addr interop.Hash160) { common.CheckWitness(common.CommitteeAddress()) ctx := storage.GetContext() storage.Put(ctx, append([]byte{accountKeyPrefix}, addr...), []byte{1}) } func RemoveAccount(addr interop.Hash160) { common.CheckWitness(common.CommitteeAddress()) ctx := storage.GetContext() storage.Delete(ctx, append([]byte{accountKeyPrefix}, addr...)) }