Skip to content

Commit ae388d0

Browse files
committed
enhance redemption tx validation
1 parent a0d29d5 commit ae388d0

File tree

2 files changed

+44
-34
lines changed

2 files changed

+44
-34
lines changed

x/lending/keeper/msg_server_loan.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,16 @@ func (m msgServer) Redeem(goCtx context.Context, msg *types.MsgRedeem) (*types.M
314314
internalKey, _ := hex.DecodeString(dlcMeta.InternalKey)
315315
script, controlBlock, _ := types.UnwrapLeafScript(dlcMeta.RepaymentScript)
316316

317+
witnessSize := types.GetCetWitnessSize(types.CetType_REPAYMENT, script, controlBlock)
318+
319+
if err := types.CheckCetFeeRate(p, witnessSize, 0, 0); err != nil {
320+
return nil, err
321+
}
322+
323+
if err := types.CheckTransactionWeight(p.UnsignedTx, witnessSize); err != nil {
324+
return nil, err
325+
}
326+
317327
sigHashes := []string{}
318328

319329
for i, ti := range p.UnsignedTx.TxIn {

x/lending/types/dlc.go

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@ func VerifyLiquidationCet(dlcMeta *DLCMeta, depositTxs []*psbt.Packet, vaultPkSc
128128
return err
129129
}
130130

131-
witnessSize := getCetWitnessSize(CetType_LIQUIDATION, script, controlBlock)
131+
witnessSize := GetCetWitnessSize(CetType_LIQUIDATION, script, controlBlock)
132132

133-
if err := checkCetFeeRate(p, witnessSize, currentFeeRate, maxFeeRateMultiplier); err != nil {
133+
if err := CheckCetFeeRate(p, witnessSize, currentFeeRate, maxFeeRateMultiplier); err != nil {
134134
return err
135135
}
136136

@@ -221,9 +221,9 @@ func VerifyRepaymentCet(dlcMeta *DLCMeta, depositTxs []*psbt.Packet, vaultPkScri
221221
return err
222222
}
223223

224-
witnessSize := getCetWitnessSize(CetType_REPAYMENT, script, controlBlock)
224+
witnessSize := GetCetWitnessSize(CetType_REPAYMENT, script, controlBlock)
225225

226-
if err := checkCetFeeRate(p, witnessSize, 0, 0); err != nil {
226+
if err := CheckCetFeeRate(p, witnessSize, 0, 0); err != nil {
227227
return err
228228
}
229229

@@ -524,6 +524,36 @@ func UnwrapLeafScript(leafScript LeafScript) ([]byte, []byte, error) {
524524
return script, controlBlock, nil
525525
}
526526

527+
// CheckCetFeeRate checks the fee rate of the given cet
528+
func CheckCetFeeRate(p *psbt.Packet, witnessSize int, currentFeeRate int64, maxFeeRateMultiplier int64) error {
529+
virtualSize := GetTxVirtualSize(p.UnsignedTx, witnessSize)
530+
531+
fee, err := p.GetTxFee()
532+
if err != nil {
533+
return errorsmod.Wrapf(ErrInvalidCET, "failed to get tx fee: %v", err)
534+
}
535+
536+
if int64(fee) < virtualSize {
537+
return errorsmod.Wrap(ErrInvalidCET, "too low fee rate")
538+
}
539+
540+
if maxFeeRateMultiplier > 0 && int64(fee) > virtualSize*currentFeeRate*maxFeeRateMultiplier {
541+
return errorsmod.Wrap(ErrInvalidCET, "too high fee rate")
542+
}
543+
544+
return nil
545+
}
546+
547+
// GetCetWitnessSize gets the cet witness size according to the given params
548+
// NOTE: The final signature is 64 bytes due to that the sig hash type is SigHashDefault currently.
549+
func GetCetWitnessSize(cetType CetType, script []byte, controlBlock []byte) int {
550+
switch cetType {
551+
default:
552+
// dcm signature(64) + borrower signature(64) + len(script) + len(control block)
553+
return 64 + 64 + len(script) + len(controlBlock)
554+
}
555+
}
556+
527557
// ParseDepositTxs parses the given deposit txs
528558
// Assume that the given deposit txs are valid psbts
529559
func ParseDepositTxs(depositTxs []string, vaultPkScript []byte) ([]*psbt.Packet, []string, sdkmath.Int, error) {
@@ -597,33 +627,3 @@ func getVaultUtxosFromDepositTx(depositTx *psbt.Packet, vaultPkScript []byte) ([
597627

598628
return utxos, nil
599629
}
600-
601-
// checkCetFeeRate checks the fee rate of the given cet
602-
func checkCetFeeRate(p *psbt.Packet, witnessSize int, currentFeeRate int64, maxFeeRateMultiplier int64) error {
603-
virtualSize := GetTxVirtualSize(p.UnsignedTx, witnessSize)
604-
605-
fee, err := p.GetTxFee()
606-
if err != nil {
607-
return errorsmod.Wrapf(ErrInvalidCET, "failed to get tx fee: %v", err)
608-
}
609-
610-
if int64(fee) < virtualSize {
611-
return errorsmod.Wrap(ErrInvalidCET, "too low fee rate")
612-
}
613-
614-
if maxFeeRateMultiplier > 0 && int64(fee) > virtualSize*currentFeeRate*maxFeeRateMultiplier {
615-
return errorsmod.Wrap(ErrInvalidCET, "too high fee rate")
616-
}
617-
618-
return nil
619-
}
620-
621-
// getCetWitnessSize gets the cet witness size according to the given params
622-
// NOTE: The final signature is 64 bytes due to that the sig hash type is SigHashDefault currently.
623-
func getCetWitnessSize(cetType CetType, script []byte, controlBlock []byte) int {
624-
switch cetType {
625-
default:
626-
// dcm signature(64) + borrower signature(64) + len(script) + len(control block)
627-
return 64 + 64 + len(script) + len(controlBlock)
628-
}
629-
}

0 commit comments

Comments
 (0)