Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Filecoin Implementation #129

Open
wants to merge 18 commits into
base: master
Choose a base branch
from
Open
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
845 changes: 0 additions & 845 deletions Gopkg.lock

This file was deleted.

126 changes: 0 additions & 126 deletions Gopkg.toml

This file was deleted.

55 changes: 29 additions & 26 deletions bitcoin/sign.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import (

"github.com/btcsuite/btcd/chaincfg"

"github.com/OpenBazaar/spvwallet"
wi "github.com/OpenBazaar/wallet-interface"
"github.com/btcsuite/btcd/blockchain"
"github.com/btcsuite/btcd/btcec"
Expand Down Expand Up @@ -255,32 +254,36 @@ func newUnsignedTransaction(outputs []*wire.TxOut, feePerKb btc.Amount, fetchInp
}
}

func (w *BitcoinWallet) bumpFee(txid chainhash.Hash) (*chainhash.Hash, error) {
func (w *BitcoinWallet) bumpFee(txid string) (string, error) {
txn, err := w.db.Txns().Get(txid)
if err != nil {
return nil, err
return "", err
}
if txn.Height > 0 {
return nil, spvwallet.BumpFeeAlreadyConfirmedError
return "", util.BumpFeeAlreadyConfirmedError
}
if txn.Height < 0 {
return nil, spvwallet.BumpFeeTransactionDeadError
return "", util.BumpFeeTransactionDeadError
}
chTxid, err := chainhash.NewHashFromStr(txid)
if err != nil {
return "", err
}
// Check utxos for CPFP
utxos, _ := w.db.Utxos().GetAll()
for _, u := range utxos {
if u.Op.Hash.IsEqual(&txid) && u.AtHeight == 0 {
if u.Op.Hash.IsEqual(chTxid) && u.AtHeight == 0 {
addr, err := w.ScriptToAddress(u.ScriptPubkey)
if err != nil {
return nil, err
return "", err
}
key, err := w.km.GetKeyForScript(addr.ScriptAddress())
if err != nil {
return nil, err
return "", err
}
h, err := hex.DecodeString(u.Op.Hash.String())
if err != nil {
return nil, err
return "", err
}
n := new(big.Int)
n, _ = n.SetString(u.Value, 10)
Expand All @@ -292,15 +295,15 @@ func (w *BitcoinWallet) bumpFee(txid chainhash.Hash) (*chainhash.Hash, error) {
}
transactionID, err := w.sweepAddress([]wi.TransactionInput{in}, nil, key, nil, wi.FEE_BUMP)
if err != nil {
return nil, err
return "", err
}
return transactionID, nil
}
}
return nil, spvwallet.BumpFeeNotFoundError
return "", util.BumpFeeNotFoundError
}

func (w *BitcoinWallet) sweepAddress(ins []wi.TransactionInput, address *btc.Address, key *hd.ExtendedKey, redeemScript *[]byte, feeLevel wi.FeeLevel) (*chainhash.Hash, error) {
func (w *BitcoinWallet) sweepAddress(ins []wi.TransactionInput, address *btc.Address, key *hd.ExtendedKey, redeemScript *[]byte, feeLevel wi.FeeLevel) (string, error) {
var internalAddr btc.Address
if address != nil {
internalAddr = *address
Expand All @@ -309,7 +312,7 @@ func (w *BitcoinWallet) sweepAddress(ins []wi.TransactionInput, address *btc.Add
}
script, err := txscript.PayToAddrScript(internalAddr)
if err != nil {
return nil, err
return "", err
}

var val int64
Expand All @@ -319,11 +322,11 @@ func (w *BitcoinWallet) sweepAddress(ins []wi.TransactionInput, address *btc.Add
val += in.Value.Int64()
ch, err := chainhash.NewHashFromStr(hex.EncodeToString(in.OutpointHash))
if err != nil {
return nil, err
return "", err
}
script, err := txscript.PayToAddrScript(in.LinkedAddress)
if err != nil {
return nil, err
return "", err
}
outpoint := wire.NewOutPoint(ch, in.OutpointIndex)
input := wire.NewTxIn(outpoint, []byte{}, [][]byte{})
Expand All @@ -335,7 +338,7 @@ func (w *BitcoinWallet) sweepAddress(ins []wi.TransactionInput, address *btc.Add
txType := P2PKH
if redeemScript != nil {
txType = P2SH_1of2_Multisig
_, err := spvwallet.LockTimeFromRedeemScript(*redeemScript)
_, err := util.LockTimeFromRedeemScript(*redeemScript)
if err == nil {
txType = P2SH_Multisig_Timelock_1Sig
}
Expand Down Expand Up @@ -366,12 +369,12 @@ func (w *BitcoinWallet) sweepAddress(ins []wi.TransactionInput, address *btc.Add
// Sign tx
privKey, err := key.ECPrivKey()
if err != nil {
return nil, fmt.Errorf("retrieving private key: %s", err.Error())
return "", fmt.Errorf("retrieving private key: %s", err.Error())
}
pk := privKey.PubKey().SerializeCompressed()
addressPub, err := btc.NewAddressPubKey(pk, w.params)
if err != nil {
return nil, fmt.Errorf("generating address pub key: %s", err.Error())
return "", fmt.Errorf("generating address pub key: %s", err.Error())
}

getKey := txscript.KeyClosure(func(addr btc.Address) (*btcec.PrivateKey, bool, error) {
Expand Down Expand Up @@ -399,9 +402,9 @@ func (w *BitcoinWallet) sweepAddress(ins []wi.TransactionInput, address *btc.Add
timeLocked = true
tx.Version = 2
for _, txIn := range tx.TxIn {
locktime, err := spvwallet.LockTimeFromRedeemScript(*redeemScript)
locktime, err := util.LockTimeFromRedeemScript(*redeemScript)
if err != nil {
return nil, err
return "", err
}
txIn.Sequence = locktime
}
Expand All @@ -416,13 +419,13 @@ func (w *BitcoinWallet) sweepAddress(ins []wi.TransactionInput, address *btc.Add
tx, i, prevOutScript, txscript.SigHashAll, getKey,
getScript, txIn.SignatureScript)
if err != nil {
return nil, errors.New("Failed to sign transaction")
return "", errors.New("Failed to sign transaction")
}
txIn.SignatureScript = script
} else {
sig, err := txscript.RawTxInWitnessSignature(tx, hashes, i, ins[i].Value.Int64(), *redeemScript, txscript.SigHashAll, privKey)
if err != nil {
return nil, err
return "", err
}
var witness wire.TxWitness
if timeLocked {
Expand All @@ -437,10 +440,10 @@ func (w *BitcoinWallet) sweepAddress(ins []wi.TransactionInput, address *btc.Add

// broadcast
if err := w.Broadcast(tx); err != nil {
return nil, err
return "", err
}
txid := tx.TxHash()
return &txid, nil
return txid.String(), nil
}

func (w *BitcoinWallet) createMultisigSignature(ins []wi.TransactionInput, outs []wi.TransactionOutput, key *hd.ExtendedKey, redeemScript []byte, feePerByte uint64) ([]wi.Signature, error) {
Expand All @@ -466,7 +469,7 @@ func (w *BitcoinWallet) createMultisigSignature(ins []wi.TransactionInput, outs

// Subtract fee
txType := P2SH_2of3_Multisig
_, err := spvwallet.LockTimeFromRedeemScript(redeemScript)
_, err := util.LockTimeFromRedeemScript(redeemScript)
if err == nil {
txType = P2SH_Multisig_Timelock_2Sigs
}
Expand Down Expand Up @@ -521,7 +524,7 @@ func (w *BitcoinWallet) multisign(ins []wi.TransactionInput, outs []wi.Transacti

// Subtract fee
txType := P2SH_2of3_Multisig
_, err := spvwallet.LockTimeFromRedeemScript(redeemScript)
_, err := util.LockTimeFromRedeemScript(redeemScript)
if err == nil {
txType = P2SH_Multisig_Timelock_2Sigs
}
Expand Down
3 changes: 1 addition & 2 deletions bitcoin/sign_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import (
"github.com/OpenBazaar/multiwallet/keys"
"github.com/OpenBazaar/multiwallet/model/mock"
"github.com/OpenBazaar/multiwallet/service"
"github.com/OpenBazaar/spvwallet"
"github.com/OpenBazaar/wallet-interface"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcd/chaincfg/chainhash"
Expand Down Expand Up @@ -51,7 +50,7 @@ func newMockWallet() (*BitcoinWallet, error) {
return nil, err
}

fp := spvwallet.NewFeeProvider(2000, 300, 200, 100, "", nil)
fp := util.NewFeeProvider(2000, 300, 200, 100, 50, nil)

bw := &BitcoinWallet{
params: params,
Expand Down
Loading