code.vegaprotocol.io/vega@v0.79.0/core/limits/snapshot.go (about) 1 // Copyright (C) 2023 Gobalsky Labs Limited 2 // 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU Affero General Public License as 5 // published by the Free Software Foundation, either version 3 of the 6 // License, or (at your option) any later version. 7 // 8 // This program is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU Affero General Public License for more details. 12 // 13 // You should have received a copy of the GNU Affero General Public License 14 // along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 package limits 17 18 import ( 19 "context" 20 21 "code.vegaprotocol.io/vega/core/types" 22 "code.vegaprotocol.io/vega/libs/proto" 23 ) 24 25 var ( 26 allKey = (&types.PayloadLimitState{}).Key() 27 28 hashKeys = []string{ 29 allKey, 30 } 31 ) 32 33 type limitsSnapshotState struct { 34 serialised []byte 35 } 36 37 // serialiseLimits returns the engine's limit data as marshalled bytes. 38 func (e *Engine) serialiseLimits() ([]byte, error) { 39 pl := types.Payload{ 40 Data: &types.PayloadLimitState{ 41 LimitState: &types.LimitState{ 42 CanProposeMarket: e.canProposeMarket, 43 CanProposeAsset: e.canProposeAsset, 44 GenesisLoaded: e.genesisLoaded, 45 ProposeMarketEnabled: e.proposeMarketEnabled, 46 ProposeSpotMarketEnabled: e.proposeSpotMarketEnabled, 47 ProposePerpsMarketEnabled: e.proposePerpsMarketEnabled, 48 ProposeAssetEnabled: e.proposeAssetEnabled, 49 ProposeMarketEnabledFrom: e.proposeMarketEnabledFrom, 50 ProposeAssetEnabledFrom: e.proposeAssetEnabledFrom, 51 CanUseAMMEnabled: e.useAMMEnabled, 52 }, 53 }, 54 } 55 return proto.Marshal(pl.IntoProto()) 56 } 57 58 // get the serialised form of the given key. 59 func (e *Engine) serialise(k string) ([]byte, error) { 60 if k != allKey { 61 return nil, types.ErrSnapshotKeyDoesNotExist 62 } 63 64 data, err := e.serialiseLimits() 65 if err != nil { 66 return nil, err 67 } 68 69 e.lss.serialised = data 70 return data, nil 71 } 72 73 func (e *Engine) Namespace() types.SnapshotNamespace { 74 return types.LimitSnapshot 75 } 76 77 func (e *Engine) Keys() []string { 78 return hashKeys 79 } 80 81 func (e *Engine) Stopped() bool { 82 return false 83 } 84 85 func (e *Engine) GetState(k string) ([]byte, []types.StateProvider, error) { 86 data, err := e.serialise(k) 87 return data, nil, err 88 } 89 90 func (e *Engine) LoadState(ctx context.Context, payload *types.Payload) ([]types.StateProvider, error) { 91 if e.Namespace() != payload.Data.Namespace() { 92 return nil, types.ErrInvalidSnapshotNamespace 93 } 94 95 switch pl := payload.Data.(type) { 96 case *types.PayloadLimitState: 97 return nil, e.restoreLimits(ctx, pl.LimitState, payload) 98 default: 99 return nil, types.ErrUnknownSnapshotType 100 } 101 } 102 103 func (e *Engine) restoreLimits(ctx context.Context, l *types.LimitState, p *types.Payload) error { 104 e.canProposeAsset = l.CanProposeAsset 105 e.canProposeMarket = l.CanProposeMarket 106 e.genesisLoaded = l.GenesisLoaded 107 e.proposeMarketEnabled = l.ProposeMarketEnabled 108 e.proposeAssetEnabled = l.ProposeAssetEnabled 109 e.proposeMarketEnabledFrom = l.ProposeMarketEnabledFrom 110 e.proposeAssetEnabledFrom = l.ProposeAssetEnabledFrom 111 e.proposeSpotMarketEnabled = l.ProposeSpotMarketEnabled 112 e.proposePerpsMarketEnabled = l.ProposePerpsMarketEnabled 113 e.useAMMEnabled = l.CanUseAMMEnabled 114 115 e.sendEvent(ctx) 116 var err error 117 e.lss.serialised, err = proto.Marshal(p.IntoProto()) 118 return err 119 }