/
worker_updater.go
40 lines (37 loc) · 1.49 KB
/
worker_updater.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
package pillar
import (
"github.com/zenon-network/go-zenon/chain"
"github.com/zenon-network/go-zenon/chain/nom"
"github.com/zenon-network/go-zenon/chain/store"
"github.com/zenon-network/go-zenon/common/types"
"github.com/zenon-network/go-zenon/vm/constants"
"github.com/zenon-network/go-zenon/vm/embedded/definition"
"github.com/zenon-network/go-zenon/vm/embedded/implementation"
"github.com/zenon-network/go-zenon/vm/vm_context"
)
func canPerformEmbeddedUpdate(momentumStore store.Momentum, pool chain.AccountPool, contract types.Address) error {
store := pool.GetFrontierAccountStore(contract)
context := vm_context.NewAccountContext(momentumStore, store, nil)
return implementation.CanPerformUpdate(context)
}
func (w *worker) updateContracts(momentumStore store.Momentum) error {
for _, address := range types.EmbeddedWUpdate {
if err := canPerformEmbeddedUpdate(momentumStore, w.chain, address); err == nil {
w.log.Info("producing block to update embedded-contract", "contract-address", address)
if block, err := w.supervisor.GenerateFromTemplate(&nom.AccountBlock{
BlockType: nom.BlockTypeUserSend,
Address: w.coinbase.Address,
ToAddress: address,
Data: definition.ABICommon.PackMethodPanic(definition.UpdateMethodName),
}, w.coinbase.Signer); err != nil {
return err
} else {
w.broadcaster.CreateAccountBlock(block)
}
} else if err == constants.ErrUpdateTooRecent || err == constants.ErrContractMethodNotFound {
} else {
return err
}
}
return nil
}