diff --git a/pkg/morph/client/notary.go b/pkg/morph/client/notary.go index 858ca374..bf30b101 100644 --- a/pkg/morph/client/notary.go +++ b/pkg/morph/client/notary.go @@ -186,7 +186,15 @@ func (c *Client) DepositNotary(amount fixedn.Fixed8, delta uint32) (res util.Uin nil, ) if err != nil { - return util.Uint256{}, fmt.Errorf("can't make notary deposit: %w", err) + if !tillShouldNotBeLessError(err) { + return util.Uint256{}, fmt.Errorf("can't make notary deposit: %w", err) + } + + c.logger.Debug("notary deposit invoke failed due to low `till` value", + zap.Int64("amount", int64(amount)), + zap.Uint32("till", bc+delta)) + + return util.Uint256{}, nil } c.logger.Debug("notary deposit invoke", @@ -704,8 +712,6 @@ func WithProxyContract(h util.Uint160) NotaryOption { } } -const alreadyOnChainErrorMessage = "already on chain" - // Neo RPC node can return `core.ErrInvalidAttribute` error with // `conflicting transaction <> is already on chain` message. This // error is expected and ignored. As soon as main tx persisted on @@ -713,9 +719,24 @@ const alreadyOnChainErrorMessage = "already on chain" // requires 5 out of 7 signatures to send main tx, thus last two // notary requests may be processed after main tx appeared on chain. func alreadyOnChainError(err error) bool { + const alreadyOnChainErrorMessage = "already on chain" + return strings.Contains(err.Error(), alreadyOnChainErrorMessage) } +// Neo RPC node can return "`till` shouldn't be less then the +// previous value <>" message. This error is expected and ignored. +// This happens because previous `till` value could be bigger +// than the current one due to significant epoch duration decrease. +// Theoretically, balance should not run out so fast and such +// errors are ignored(at least for now; there is #910 issue +// for it). +func tillShouldNotBeLessError(err error) bool { + const tillTooLowErrorMessage = "less then the previous value" + + return strings.Contains(err.Error(), tillTooLowErrorMessage) +} + // CalculateNotaryDepositAmount calculates notary deposit amount // using the rule: // IF notaryBalance < gasBalance * gasMul {