-
Notifications
You must be signed in to change notification settings - Fork 157
/
state_snapshot.go
89 lines (75 loc) · 1.89 KB
/
state_snapshot.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
package core
import (
"errors"
"github.com/NethermindEth/juno/core/felt"
"github.com/NethermindEth/juno/db"
)
type stateSnapshot struct {
blockNumber uint64
state StateHistoryReader
}
func NewStateSnapshot(state StateHistoryReader, blockNumber uint64) StateReader {
return &stateSnapshot{
blockNumber: blockNumber,
state: state,
}
}
func (s *stateSnapshot) ContractClassHash(addr *felt.Felt) (*felt.Felt, error) {
if err := s.checkDeployed(addr); err != nil {
return nil, err
}
val, err := s.state.ContractClassHashAt(addr, s.blockNumber)
if err != nil {
if errors.Is(err, ErrCheckHeadState) {
return s.state.ContractClassHash(addr)
}
return nil, err
}
return val, nil
}
func (s *stateSnapshot) ContractNonce(addr *felt.Felt) (*felt.Felt, error) {
if err := s.checkDeployed(addr); err != nil {
return nil, err
}
val, err := s.state.ContractNonceAt(addr, s.blockNumber)
if err != nil {
if errors.Is(err, ErrCheckHeadState) {
return s.state.ContractNonce(addr)
}
return nil, err
}
return val, nil
}
func (s *stateSnapshot) ContractStorage(addr, key *felt.Felt) (*felt.Felt, error) {
if err := s.checkDeployed(addr); err != nil {
return nil, err
}
val, err := s.state.ContractStorageAt(addr, key, s.blockNumber)
if err != nil {
if errors.Is(err, ErrCheckHeadState) {
return s.state.ContractStorage(addr, key)
}
return nil, err
}
return val, nil
}
func (s *stateSnapshot) checkDeployed(addr *felt.Felt) error {
isDeployed, err := s.state.ContractIsAlreadyDeployedAt(addr, s.blockNumber)
if err != nil {
return err
}
if !isDeployed {
return db.ErrKeyNotFound
}
return nil
}
func (s *stateSnapshot) Class(classHash *felt.Felt) (*DeclaredClass, error) {
declaredClass, err := s.state.Class(classHash)
if err != nil {
return nil, err
}
if s.blockNumber < declaredClass.At {
return nil, db.ErrKeyNotFound
}
return declaredClass, nil
}