diff --git a/btp/btp.go b/btp/btp.go index ecd5c912..a3732d66 100644 --- a/btp/btp.go +++ b/btp/btp.go @@ -448,6 +448,8 @@ func (b *BTP) updateResult(rm *chain.RelayMessage, segment *chain.Segment) (err segment.GetResultParam = nil case chain.BMCRevertUnauthorized: segment.GetResultParam = nil + case chain.ICONSkipTransaction: + segment.GetResultParam = nil default: b.log.Panicf("fail to GetResult GetResultParam:%v ErrorCoder:%+v", segment.GetResultParam, ec) } diff --git a/chain/error.go b/chain/error.go index 58a16547..805ece78 100644 --- a/chain/error.go +++ b/chain/error.go @@ -31,11 +31,12 @@ var ( ) const ( - CodeBTP errors.Code = 0 - CodeBMC errors.Code = 10 - CodeBMV errors.Code = 25 - CodeBSH errors.Code = 40 - CodeReserved errors.Code = 55 + CodeBTP errors.Code = 0 + CodeBMC errors.Code = 10 + CodeBMV errors.Code = 25 + CodeBSH errors.Code = 40 + CodeReserved errors.Code = 55 + CodeRetryable errors.Code = 1000 ) const ( @@ -100,6 +101,31 @@ var ( } ) +const ( + GenericRetryable = CodeRetryable + iota + ICONSkipTransaction +) + +var ( + RetrybleCodeNames = map[errors.Code]string{ + GenericRetryable: "GenericRetryable", + ICONSkipTransaction: "ICONSkipTransaction", + } +) + +func NewRetryable(code int) error { + c := errors.Code(code) + if c >= CodeRetryable { + var msg string + var ok bool + if msg, ok = RetrybleCodeNames[c]; !ok { + msg = fmt.Sprintf("Retryable[%d]", c) + } + return errors.NewBase(c, msg) + } + return nil +} + func NewRevertError(code int) error { c := errors.Code(code) if c >= CodeBTP { diff --git a/chain/icon/sender.go b/chain/icon/sender.go index 5aa8e839..a6bfd84f 100644 --- a/chain/icon/sender.go +++ b/chain/icon/sender.go @@ -351,8 +351,6 @@ func (s *sender) sendFragmentations(tps []*TransactionParam, idxs []int) (chain. if err != nil { s.l.Panicf("sendFragmentations: fails result %+v error%+v", grp, err) } - // TODO use (finalizelatency * blockinterval / appropriateratio) * time.Second - time.Sleep(time.Duration(s.FinalizeLatency()) * time.Second) } s.l.Tracef("sendFragmentations: end") @@ -602,6 +600,8 @@ func mapErrorWithTransactionResult(txr *TransactionResult, err error) error { if fc < ResultStatusFailureCodeRevert || fc > ResultStatusFailureCodeEnd { err = fmt.Errorf("failure with code:%s, message:%s", txr.Failure.CodeValue, txr.Failure.MessageValue) + } else if fc == ResultStatusSkipTransaction { + err = chain.NewRetryable(int(chain.ICONSkipTransaction)) } else { err = chain.NewRevertError(int(fc - ResultStatusFailureCodeRevert)) } diff --git a/chain/icon/type.go b/chain/icon/type.go index 1e926851..e562838b 100644 --- a/chain/icon/type.go +++ b/chain/icon/type.go @@ -58,6 +58,7 @@ const ( const ( ResultStatusSuccess = "0x1" + ResultStatusSkipTransaction = 14 ResultStatusFailureCodeRevert = 32 ResultStatusFailureCodeEnd = 99 )