Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions x/btcbridge/types/bitcoin.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package types
import (
"lukechampine.com/uint128"

"github.com/btcsuite/btcd/blockchain"
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/btcutil/psbt"
"github.com/btcsuite/btcd/chaincfg/chainhash"
Expand All @@ -20,6 +21,9 @@ const (
// default minimum relay fee
MinRelayFee = 1000

// default maximum allowed transaction weight
MaxTransactionWeight = 400000

// default sig hash type
DefaultSigHashType = txscript.SigHashDefault
)
Expand Down Expand Up @@ -185,6 +189,10 @@ func BuildUnsignedTransaction(utxos []*UTXO, txOuts []*wire.TxOut, paymentUTXOIt
return nil, nil, nil, err
}

if err := CheckTransactionWeight(tx); err != nil {
return nil, nil, nil, err
}

var changeUTXO *UTXO
if len(tx.TxOut) > len(txOuts) {
changeUTXO = GetChangeUTXO(tx, change.EncodeAddress())
Expand Down Expand Up @@ -344,6 +352,16 @@ func CheckOutputAmount(address string, amount int64) error {
return nil
}

// CheckTransactionWeight checks if the weight of the given tx exceeds the allowed maximum weight
func CheckTransactionWeight(tx *wire.MsgTx) error {
weight := blockchain.GetTransactionWeight(btcutil.NewTx(tx))
if weight > MaxTransactionWeight {
return ErrMaxTransactionWeightExceeded
}

return nil
}

// IsOpReturnOutput returns true if the script of the given out starts with OP_RETURN
func IsOpReturnOutput(out *wire.TxOut) bool {
return len(out.PkScript) > 0 && out.PkScript[0] == txscript.OP_RETURN
Expand Down
21 changes: 11 additions & 10 deletions x/btcbridge/types/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,17 @@ var (
ErrInvalidDepositTransaction = errorsmod.Register(ModuleName, 2108, "invalid deposit transaction")
ErrInvalidDepositAmount = errorsmod.Register(ModuleName, 2109, "invalid deposit amount")

ErrInvalidAmount = errorsmod.Register(ModuleName, 3100, "invalid amount")
ErrInvalidFeeRate = errorsmod.Register(ModuleName, 3101, "invalid fee rate")
ErrAssetNotSupported = errorsmod.Register(ModuleName, 3102, "asset not supported")
ErrInvalidWithdrawAmount = errorsmod.Register(ModuleName, 3103, "invalid withdrawal amount")
ErrDustOutput = errorsmod.Register(ModuleName, 3104, "too small output amount")
ErrInsufficientUTXOs = errorsmod.Register(ModuleName, 3105, "insufficient utxos")
ErrFailToSerializePsbt = errorsmod.Register(ModuleName, 3106, "failed to serialize psbt")
ErrInvalidSignatures = errorsmod.Register(ModuleName, 3107, "invalid signatures")
ErrWithdrawRequestNotExist = errorsmod.Register(ModuleName, 3108, "withdrawal request does not exist")
ErrWithdrawRequestConfirmed = errorsmod.Register(ModuleName, 3109, "withdrawal request has been confirmed")
ErrInvalidAmount = errorsmod.Register(ModuleName, 3100, "invalid amount")
ErrInvalidFeeRate = errorsmod.Register(ModuleName, 3101, "invalid fee rate")
ErrAssetNotSupported = errorsmod.Register(ModuleName, 3102, "asset not supported")
ErrInvalidWithdrawAmount = errorsmod.Register(ModuleName, 3103, "invalid withdrawal amount")
ErrDustOutput = errorsmod.Register(ModuleName, 3104, "too small output amount")
ErrInsufficientUTXOs = errorsmod.Register(ModuleName, 3105, "insufficient utxos")
ErrMaxTransactionWeightExceeded = errorsmod.Register(ModuleName, 3106, "maximum transaction weight exceeded")
ErrFailToSerializePsbt = errorsmod.Register(ModuleName, 3107, "failed to serialize psbt")
ErrInvalidSignatures = errorsmod.Register(ModuleName, 3108, "invalid signatures")
ErrWithdrawRequestNotExist = errorsmod.Register(ModuleName, 3109, "withdrawal request does not exist")
ErrWithdrawRequestConfirmed = errorsmod.Register(ModuleName, 3110, "withdrawal request has been confirmed")

ErrUTXODoesNotExist = errorsmod.Register(ModuleName, 4100, "utxo does not exist")
ErrUTXOLocked = errorsmod.Register(ModuleName, 4101, "utxo locked")
Expand Down