diff --git a/autopilot/contractor.go b/autopilot/contractor.go index 82ea4e619..2ac481ee3 100644 --- a/autopilot/contractor.go +++ b/autopilot/contractor.go @@ -1436,6 +1436,8 @@ func (c *contractor) renewContract(ctx context.Context, w Worker, ci contractInf ) if utils.IsErr(err, wallet.ErrInsufficientBalance) && !worker.IsErrHost(err) { return api.ContractMetadata{}, false, err + } else if isNonexistentSiacoinOutputErr(err) { + return api.ContractMetadata{}, false, err } return api.ContractMetadata{}, true, err } @@ -1515,6 +1517,8 @@ func (c *contractor) refreshContract(ctx context.Context, w Worker, ci contractI c.logger.Errorw("refresh failed", zap.Error(err), "hk", hk, "fcid", fcid) if utils.IsErr(err, wallet.ErrInsufficientBalance) && !worker.IsErrHost(err) { return api.ContractMetadata{}, false, err + } else if isNonexistentSiacoinOutputErr(err) { + return api.ContractMetadata{}, false, err } return api.ContractMetadata{}, true, err } @@ -1579,6 +1583,8 @@ func (c *contractor) formContract(ctx context.Context, w Worker, host hostdb.Hos c.logger.Errorw(fmt.Sprintf("contract formation failed, err: %v", err), "hk", hk) if strings.Contains(err.Error(), wallet.ErrInsufficientBalance.Error()) { return api.ContractMetadata{}, false, err + } else if isNonexistentSiacoinOutputErr(err) { + return api.ContractMetadata{}, false, err } return api.ContractMetadata{}, true, err } @@ -1690,6 +1696,11 @@ func initialContractFundingMinMax(cfg api.AutopilotConfig) (min types.Currency, return } +func isNonexistentSiacoinOutputErr(err error) bool { + return utils.IsErr(err, errors.New("transaction spends a nonexisting siacoin output")) || + utils.IsErr(err, errors.New("spends nonexistent siacoin output")) +} + func refreshPriceTable(ctx context.Context, w Worker, host *hostdb.Host) error { // return early if the host's pricetable is not expired yet if time.Now().Before(host.PriceTable.Expiry) {