Skip to content

Commit

Permalink
Merge a49ac76 into aba2190
Browse files Browse the repository at this point in the history
  • Loading branch information
mauricio1802 committed Dec 13, 2019
2 parents aba2190 + a49ac76 commit 03260ad
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 13 deletions.
23 changes: 12 additions & 11 deletions src/coin/skycoin/models/wallet.go
Original file line number Diff line number Diff line change
Expand Up @@ -1135,15 +1135,13 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe
walletDir := filepath.Join(wlt.WalletDir, wlt.Id)
skyWlt, err := wallet.Load(walletDir)
var originalInputs []api.CreatedTransactionInput

if err != nil {
logWallet.WithError(err).Warn("Couldn't load api client")
return nil, err
}
rTxn, isReadableTxn := txn.(skytypes.ReadableTxn)
if isReadableTxn {
// Readable tranasctions should not need extra API calls

cTxn, err := rTxn.ToCreatedTransaction()
if err != nil {
logWallet.WithError(err).Warn("Failed to convert to readable transaction")
Expand Down Expand Up @@ -1220,7 +1218,6 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe
}
} else {
// Raw transaction

unTxn, ok := txn.(*SkycoinUninjectedTransaction)
if !ok {
logWallet.WithError(err).Warn("Couldn't load transaction un injected")
Expand Down Expand Up @@ -1291,41 +1288,45 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe
if len(skyTxn.Sigs) == 0 {
skyTxn.Sigs = make([]cipher.Sig, len(skyTxn.In))
}

signedTxn, err := wallet.SignTransaction(skyWlt, skyTxn, index, uxouts)

if err != nil {
logWallet.WithError(err).Warn("Couldn't sign transaction using local wallet")
return nil, err
}

if isReadableTxn {
vins := make([]visor.TransactionInput, 0)
for _, ux := range uxouts {
vin, err := visor.NewTransactionInput(ux, 0)
for i, ux := range uxouts {
calCh, err := util.GetCoinValue(originalInputs[i].CalculatedHours, CoinHour)
if err != nil {
return nil, err
}
vin := visor.TransactionInput{
UxOut: ux,
CalculatedHours: calCh,
}
if err != nil {
logWallet.WithError(err).Warn("Couldn't create a transaction input")
return nil, err
}
vins = append(vins, vin)
}

crtTxn, err := api.NewCreatedTransaction(signedTxn, vins)
if err != nil {
return nil, err
}
crtTxn.In = originalInputs

if err != nil {
logWallet.WithError(err).Warn("Couldn't create an un SkycoinCreatedTransaction")
return nil, err
}

resultTxn = NewSkycoinCreatedTransaction(*crtTxn)
} else {
resultTxn, err = NewUninjectedTransaction(signedTxn, txnFee)
if err != nil {
return nil, err
}
}

return resultTxn, nil

}
Expand Down
54 changes: 52 additions & 2 deletions src/coin/skycoin/models/wallet_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"strconv"
"strings"
"testing"
"time"

"github.com/SkycoinProject/skycoin/src/visor"

Expand Down Expand Up @@ -1210,6 +1211,57 @@ func TestLocalWalletSpend(t *testing.T) {
require.Equal(t, crtTxn.Transaction.TxID, ret.GetId())
}

func TestLocalWalletSignSkycoinTxn(t *testing.T) {
CleanGlobalMock()

//Test skycoinCreatedTransaction
txn, keyData, uxs, _ := makeTransactionMultipleInputs(t, 1)
require.Equal(t, txn.In[0], uxs[0].Hash())
vins := make([]visor.TransactionInput, 0)
for _, un := range uxs {
vin, err := visor.NewTransactionInput(un, uint64(time.Now().Unix()))
require.Nil(t, err)
vins = append(vins, vin)
}
txn.Sigs = []cipher.Sig{}
crtTxn, err := api.NewCreatedTransaction(&txn, vins)
require.Nil(t, err)
require.NotNil(t, crtTxn)

wlts := makeLocalWalletsFromKeyData(t, keyData)
wlt := wlts[0]
pwd := func(string, core.KeyValueStore) (string, error) {
return "", nil
}

skyTxn := NewSkycoinCreatedTransaction(*crtTxn)
sig, err := util.LookupSignServiceForWallet(wlt, core.UID(""))
require.Nil(t, err)
signed, err := wlt.Sign(skyTxn, sig, pwd, nil)
require.Nil(t, err)

ok, err := signed.IsFullySigned()
require.Nil(t, err)
require.True(t, ok)

//Test that calculated hours were calculated ok
txn.Out[0].Hours = 1000
txn.UpdateHeader()
crtTxn, err = api.NewCreatedTransaction(&txn, vins)
require.Nil(t, err)
require.NotNil(t, crtTxn)
skyTxn = NewSkycoinCreatedTransaction(*crtTxn)
sig, err = util.LookupSignServiceForWallet(wlt, core.UID(""))
require.Nil(t, err)
signed, err = wlt.Sign(skyTxn, sig, pwd, nil)
require.Nil(t, err)

ok, err = signed.IsFullySigned()
require.Nil(t, err)
require.True(t, ok)

}

func TestSkycoinWalletTypes(t *testing.T) {
var wltSet core.WalletSet = &SkycoinRemoteWallet{}
require.Equal(t, wallet.WalletTypeBip44, wltSet.DefaultWalletType())
Expand Down Expand Up @@ -1509,13 +1561,11 @@ func TestSkycoinSignServiceSign(t *testing.T) {
require.NotNil(t, apiCreTxn)
require.Equal(t, apiCreTxn.InnerHash, txn.HashInner().Hex())
skyCreTxn := NewSkycoinCreatedTransaction(*apiCreTxn)

signedTxn, err := signer.Sign(skyCreTxn, isds, pwdReader)
require.NoError(t, err)
require.NotNil(t, signedTxn)
err = signedTxn.VerifySigned()
require.NoError(t, err)
// require.Equal(t, txn.Hash().String(), signedTxn.GetId())

// SkycoinUninjectedTransaction
txn.Sigs = []cipher.Sig{}
Expand Down

0 comments on commit 03260ad

Please sign in to comment.