-
Notifications
You must be signed in to change notification settings - Fork 17
/
vesting.go
86 lines (79 loc) · 2.39 KB
/
vesting.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
package migrations
import (
"context"
"github.com/baking-bad/bcdhub/internal/config"
"github.com/baking-bad/bcdhub/internal/models/account"
"github.com/baking-bad/bcdhub/internal/models/migration"
"github.com/baking-bad/bcdhub/internal/models/operation"
"github.com/baking-bad/bcdhub/internal/models/protocol"
"github.com/baking-bad/bcdhub/internal/models/types"
"github.com/baking-bad/bcdhub/internal/noderpc"
"github.com/baking-bad/bcdhub/internal/parsers"
"github.com/baking-bad/bcdhub/internal/parsers/contract"
)
// VestingParser -
type VestingParser struct {
parser contract.Parser
protocol protocol.Protocol
}
// NewVestingParser -
func NewVestingParser(ctx *config.Context, contractParser contract.Parser, proto protocol.Protocol) *VestingParser {
return &VestingParser{
parser: contractParser,
protocol: proto,
}
}
// Parse -
func (p *VestingParser) Parse(ctx context.Context, data noderpc.ContractData, head noderpc.Header, address string, store parsers.Store) error {
vestingOperation := &operation.Operation{
ProtocolID: p.protocol.ID,
Status: types.OperationStatusApplied,
Kind: types.OperationKindOrigination,
Amount: data.Balance,
Counter: data.Counter,
Source: account.Account{
Address: data.Manager,
Type: types.NewAccountType(data.Manager),
Level: head.Level,
LastAction: head.Timestamp,
},
Destination: account.Account{
Address: address,
Type: types.NewAccountType(address),
Level: head.Level,
LastAction: head.Timestamp,
MigrationsCount: 1,
},
Delegate: account.Account{
Address: data.Delegate.Value,
Type: types.NewAccountType(data.Delegate.Value),
Level: head.Level,
LastAction: head.Timestamp,
},
Level: head.Level,
Timestamp: head.Timestamp,
Script: data.RawScript,
}
if err := p.parser.Parse(ctx, vestingOperation, store); err != nil {
return err
}
contracts := store.ListContracts()
for i := range contracts {
if contracts[i].Account.Address == address {
store.AddMigrations(&migration.Migration{
Level: head.Level,
ProtocolID: p.protocol.ID,
Timestamp: head.Timestamp,
Kind: types.MigrationKindBootstrap,
Contract: *contracts[i],
})
store.AddAccounts(
vestingOperation.Source,
vestingOperation.Destination,
vestingOperation.Delegate,
)
break
}
}
return nil
}