From 40c37d15fc2203bca78a272fe35a072c172826f1 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Wed, 30 Oct 2019 11:42:59 -0400 Subject: [PATCH 01/69] [core] refs #150 - Core API classes for blockchain API --- README.md | 2 +- src/core/blockchain.go | 31 +++++++++++++++++++++++++++++++ src/core/meta.go | 21 --------------------- src/core/wallet.go | 8 ++++++++ 4 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 src/core/blockchain.go delete mode 100644 src/core/meta.go diff --git a/README.md b/README.md index 62cb3f1c..89deebdd 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ Project files are organized as follows: - `./src/coin/skycoin/models` : Skycoin implementation of golang core interfaces. - `./src/coin/skycoin/blockchain` : Skycoin blockchain API. - `./src/coin/skycoin/sign` : Skycoin sign API. -- `vendor` : Project dependencies managed by `dep`. +- `./vendor` : Project dependencies managed by `dep`. ### Architecture diff --git a/src/core/blockchain.go b/src/core/blockchain.go new file mode 100644 index 00000000..ffaefd2d --- /dev/null +++ b/src/core/blockchain.go @@ -0,0 +1,31 @@ +package core + +// CoinValueMetric enumerates all possible values of blockchain metrics +type CoinValueMetric uint32 + +const ( + // CoinCurrentSupply to retrieve amount of coins distributed to tenants + CoinCurrentSupply CoinValueMetric = iota + // CoinTotalSupply to retrieve total amount of coins + CoinTotalSupply +) + +// BlockchainStatus measure blockchain metrics in real time +type BlockchainStatus interface { + // GeCoinValue retrieves value of a blockchain metric + GetCoinValue(coinvalue CoinValueMetric, ticker string) (uint64, error) + // GetLastBlock retrieves block at the tip of he block chain + GetLastBlock() (Block, error) + // GetNumberOfBlocks determine number of blocks in the blockchain + GetNumberOfBlocks() (uint64, error) +} + +// BlockchainAPI abstract interface for transactions management and utility functions for specific blockchain. +// The service should use the blockchain node to implement given interface. +type BlockchainAPI interface { + // Transfer instantiates a transaction to send funds from wallet to known address account owner + // If null address is specified for unspent wallet output then any wallet address may be chosen to build transaction + Transfer(uxOuts []WalletOutput, to, change Address, options KeyValueStorage) (Transaction, error) + // Spend instantiate a transaction that spends specific outputs to send to multiple destination addresses + Spend(unspent, new []WalletOutput, change Address, options KeyValueStorage) (Transaction, error) +} diff --git a/src/core/meta.go b/src/core/meta.go deleted file mode 100644 index 87acc092..00000000 --- a/src/core/meta.go +++ /dev/null @@ -1,21 +0,0 @@ -package core - -// CoinValueMetric enumerates all possible values of blockchain metrics -type CoinValueMetric uint32 - -const ( - // CoinCurrentSupply to retrieve amount of coins distributed to tenants - CoinCurrentSupply CoinValueMetric = iota - // CoinTotalSupply to retrieve total amount of coins - CoinTotalSupply -) - -// BlockchainStatus measure blockchain metrics in real time -type BlockchainStatus interface { - // GeCoinValue retrieves value of a blockchain metric - GetCoinValue(coinvalue CoinValueMetric, ticker string) (uint64, error) - // GetLastBlock retrieves block at the tip of he block chain - GetLastBlock() (Block, error) - // GetNumberOfBlocks determine number of blocks in the blockchain - GetNumberOfBlocks() (uint64, error) -} diff --git a/src/core/wallet.go b/src/core/wallet.go index 9543aa35..f883f1df 100644 --- a/src/core/wallet.go +++ b/src/core/wallet.go @@ -72,6 +72,14 @@ type Wallet interface { EnumerateSignServices() TxnSignerIterator } +// WalletOutput binds transaction output to originating wallet +type WalletOutput interface { + // GetWallet return wallet + GetWallet() Wallet + // GetOutput return transaction output. + GetOutput() TransactionOutput +} + // SeedGenerator establishes the contract for generating BIP39-compatible mnemonics type SeedGenerator interface { // GenerateMnemonic generates a valid BIP-39 mnemonic phrase From 27d27f85c12b622e7c3416a07017ba5b679bfa7b Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Wed, 30 Oct 2019 11:43:52 -0400 Subject: [PATCH 02/69] [util] refs #150 - Simple reusable wallet outputs --- src/util/wallet.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/util/wallet.go diff --git a/src/util/wallet.go b/src/util/wallet.go new file mode 100644 index 00000000..c4ca45f2 --- /dev/null +++ b/src/util/wallet.go @@ -0,0 +1,26 @@ +package util + +import ( + "github.com/fibercrypto/FiberCryptoWallet/src/core" +) + +// SimpleWalletOutput put together transacion output with riginating wallet +type SimpleWalletOutput struct { + Wallet core.Wallet + UxOut core.TransactionOutput +} + +// GetWallet return wallet +func (wo *SimpleWalletOutput) GetWallet() core.Wallet { + return wo.Wallet +} + +// GetOutput return transaction output. +func (wo *SimpleWalletOutput) GetOutput() core.TransactionOutput { + return wo.UxOut +} + +// Type assertions +var ( + _ core.WalletOutput = &SimpleWalletOutput{} +) From 85498bda7c9df6cb6b7c72802225eef9e50a6717 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Wed, 30 Oct 2019 11:57:32 -0400 Subject: [PATCH 03/69] [sky] refs #150 - Rename SkycoinBlockchainStatus => SkycoinBlockchain --- src/coin/skycoin/models/blockchain.go | 18 ++++---- src/coin/skycoin/models/blockchain_test.go | 48 +++++++++++----------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/coin/skycoin/models/blockchain.go b/src/coin/skycoin/models/blockchain.go index 6c592152..d7afccde 100644 --- a/src/coin/skycoin/models/blockchain.go +++ b/src/coin/skycoin/models/blockchain.go @@ -84,17 +84,17 @@ type SkycoinBlockchainInfo struct { NumberOfBlocks *readable.BlockchainProgress } -type SkycoinBlockchainStatus struct { //Implements BlockchainStatus interface +type SkycoinBlockchain struct { //Implements BlockchainStatus interface lastTimeStatusRequested uint64 //nolint structcheck TODO: Not used lastTimeSupplyRequested uint64 CacheTime uint64 cachedStatus *SkycoinBlockchainInfo } -func NewSkycoinBlockchainStatus(invalidCacheTime uint64) *SkycoinBlockchainStatus { - return &SkycoinBlockchainStatus{CacheTime: invalidCacheTime} +func NewSkycoinBlockchain(invalidCacheTime uint64) *SkycoinBlockchain { + return &SkycoinBlockchain{CacheTime: invalidCacheTime} } -func (ss *SkycoinBlockchainStatus) GetCoinValue(coinvalue core.CoinValueMetric, ticker string) (uint64, error) { +func (ss *SkycoinBlockchain) GetCoinValue(coinvalue core.CoinValueMetric, ticker string) (uint64, error) { logBlockchain.Info("Getting Coin value") elapsed := uint64(time.Now().UTC().UnixNano()) - ss.lastTimeSupplyRequested if elapsed > ss.CacheTime || ss.cachedStatus == nil { @@ -122,7 +122,7 @@ func (ss *SkycoinBlockchainStatus) GetCoinValue(coinvalue core.CoinValueMetric, } } -func (ss *SkycoinBlockchainStatus) GetLastBlock() (core.Block, error) { +func (ss *SkycoinBlockchain) GetLastBlock() (core.Block, error) { logBlockchain.Info("Getting last block") elapsed := uint64(time.Now().UTC().UnixNano()) - ss.lastTimeSupplyRequested if elapsed > ss.CacheTime || ss.cachedStatus == nil { @@ -136,7 +136,7 @@ func (ss *SkycoinBlockchainStatus) GetLastBlock() (core.Block, error) { return ss.cachedStatus.LastBlockInfo, nil } -func (ss *SkycoinBlockchainStatus) GetNumberOfBlocks() (uint64, error) { +func (ss *SkycoinBlockchain) GetNumberOfBlocks() (uint64, error) { logBlockchain.Info("Getting number of blocks") if ss.cachedStatus == nil { if ss.cachedStatus == nil { @@ -150,12 +150,12 @@ func (ss *SkycoinBlockchainStatus) GetNumberOfBlocks() (uint64, error) { return ss.cachedStatus.NumberOfBlocks.Current, nil } -func (ss *SkycoinBlockchainStatus) SetCacheTime(time uint64) { +func (ss *SkycoinBlockchain) SetCacheTime(time uint64) { logBlockchain.Info("Setting cache time") ss.CacheTime = time } -func (ss *SkycoinBlockchainStatus) requestSupplyInfo() error { +func (ss *SkycoinBlockchain) requestSupplyInfo() error { logBlockchain.Info("Requesting supply info") c, err := NewSkycoinApiClient(PoolSection) @@ -206,7 +206,7 @@ func (ss *SkycoinBlockchainStatus) requestSupplyInfo() error { return nil } -func (ss *SkycoinBlockchainStatus) requestStatusInfo() error { +func (ss *SkycoinBlockchain) requestStatusInfo() error { logBlockchain.Info("Requesting status information") c, err := NewSkycoinApiClient(PoolSection) if err != nil { diff --git a/src/coin/skycoin/models/blockchain_test.go b/src/coin/skycoin/models/blockchain_test.go index c972bb9a..0b986fd7 100644 --- a/src/coin/skycoin/models/blockchain_test.go +++ b/src/coin/skycoin/models/blockchain_test.go @@ -1,27 +1,27 @@ package skycoin -import( - "testing" +import ( "github.com/stretchr/testify/assert" + "testing" + "github.com/fibercrypto/FiberCryptoWallet/src/core" "github.com/skycoin/skycoin/src/api" "github.com/skycoin/skycoin/src/readable" - "github.com/fibercrypto/FiberCryptoWallet/src/core" ) -func TestSkycoinBlockchainStatusGetCoinValue(t *testing.T){ +func TestSkycoinBlockchainStatusGetCoinValue(t *testing.T) { global_mock.On("CoinSupply").Return( &api.CoinSupply{ - CurrentCoinHourSupply: "200", - TotalCoinHourSupply: "300", - CurrentSupply: "200.111111", - TotalSupply: "300", + CurrentCoinHourSupply: "200", + TotalCoinHourSupply: "300", + CurrentSupply: "200.111111", + TotalSupply: "300", }, nil, ) global_mock.On("BlockchainProgress").Return(&readable.BlockchainProgress{}, nil) - block := &SkycoinBlockchainStatus{CacheTime: 20} + block := &SkycoinBlockchain{CacheTime: 20} val, err := block.GetCoinValue(core.CoinCurrentSupply, Sky) assert.Nil(t, err) assert.Equal(t, val, uint64(200111111)) @@ -36,49 +36,49 @@ func TestSkycoinBlockchainStatusGetCoinValue(t *testing.T){ assert.Equal(t, val, uint64(300)) } -func TestSkycoinBlockchainStatusGetNumberOfBlocks(t *testing.T){ +func TestSkycoinBlockchainStatusGetNumberOfBlocks(t *testing.T) { CleanGlobalMock() global_mock.On("LastBlocks", uint64(1)).Return( &readable.Blocks{ Blocks: []readable.Block{ readable.Block{}, }, - }, + }, nil, ) global_mock.On("BlockchainProgress").Return( &readable.BlockchainProgress{ - Current: uint64(20), - Highest: uint64(42), - Peers: []readable.PeerBlockchainHeight{}, - }, + Current: uint64(20), + Highest: uint64(42), + Peers: []readable.PeerBlockchainHeight{}, + }, nil, ) - block := &SkycoinBlockchainStatus{CacheTime: 20} + block := &SkycoinBlockchain{CacheTime: 20} val, err := block.GetNumberOfBlocks() assert.Nil(t, err) - assert.Equal(t, val, uint64(20)) + assert.Equal(t, val, uint64(20)) } -func TestSkycoinBlockchainStatusGetLastBlock(t *testing.T){ +func TestSkycoinBlockchainStatusGetLastBlock(t *testing.T) { CleanGlobalMock() global_mock.On("LastBlocks", uint64(1)).Return( &readable.Blocks{ - Blocks: []readable.Block{ + Blocks: []readable.Block{ readable.Block{ - Head: readable.BlockHeader{Version: uint32(3)}, + Head: readable.BlockHeader{Version: uint32(3)}, }, }, - }, + }, nil, ) global_mock.On("BlockchainProgress").Return(&readable.BlockchainProgress{}, nil) - status := &SkycoinBlockchainStatus{CacheTime: 20} + status := &SkycoinBlockchain{CacheTime: 20} block, err := status.GetLastBlock() assert.Nil(t, err) val, err2 := block.GetVersion() assert.Nil(t, err2) - assert.Equal(t, val, uint32(3)) -} \ No newline at end of file + assert.Equal(t, val, uint32(3)) +} From 73b0966bd5438a2b252bb8f0f5424cc502e587c0 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Wed, 30 Oct 2019 16:18:34 -0400 Subject: [PATCH 04/69] [sky] refs #150 - Transaction building methods in SkycoinBlockchain type - skyAPICreateTxn factored out to reuse in SkycoinBlockchain methods - Add SimpleWalletAddress type - Add SimpleWalletOutput type --- src/coin/skycoin/models/blockchain.go | 23 +++++++++++++++++++ src/coin/skycoin/models/wallet.go | 32 ++++++++++++++------------- src/core/blockchain.go | 10 ++++----- src/core/wallet.go | 8 +++++++ src/util/wallet.go | 21 ++++++++++++++++-- 5 files changed, 72 insertions(+), 22 deletions(-) diff --git a/src/coin/skycoin/models/blockchain.go b/src/coin/skycoin/models/blockchain.go index d7afccde..f8a9935b 100644 --- a/src/coin/skycoin/models/blockchain.go +++ b/src/coin/skycoin/models/blockchain.go @@ -237,3 +237,26 @@ func (ss *SkycoinBlockchain) requestStatusInfo() error { return nil } + +// SendFromAddress instantiates a transaction to send funds from specific source addresses +// to multiple destination addresses +func (ss *SkycoinBlockchain) SendFromAddress(from []core.WalletAddress, to []core.TransactionOutput, change core.Address, options core.KeyValueStorage) (core.Transaction, error) { + logBlockchain.Info("Sending coins from addresses via blockchain API") + addresses := make([]core.Address, len(from)) + for i, wa := range from { + addresses[i] = wa.GetAddress() + } + createTxnFunc := skyAPICreateTxn + return createTransaction(addresses, to, nil, change, options, createTxnFunc) +} + +// Spend instantiates a transaction that spends specific outputs to send to multiple destination addresses +func (ss *SkycoinBlockchain) Spend(unspent []core.WalletOutput, new []core.TransactionOutput, change core.Address, options core.KeyValueStorage) (core.Transaction, error) { + logBlockchain.Info("Spending coins from outputs via blockchain API") + uxouts := make([]core.TransactionOutput, len(unspent)) + for i, wu := range unspent { + uxouts[i] = wu.GetOutput() + } + createTxnFunc := skyAPICreateTxn + return createTransaction(nil, new, uxouts, change, options, createTxnFunc) +} diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index 36e98a78..1e22c71f 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -1205,6 +1205,21 @@ func fromTxnResponse(txnResponse *api.CreateTransactionResponse) *SkycoinCreated return NewSkycoinCreatedTransaction(txnResponse.Transaction) } +func skyAPICreateTxn(txnReq *api.CreateTransactionRequest) (core.Transaction, error) { + client, err := NewSkycoinApiClient(PoolSection) + if err != nil { + logWallet.WithError(err).Warn("Couldn't load api client") + return nil, err + } + defer ReturnSkycoinClient(client) + txnR, err := client.CreateTransaction(*txnReq) + if err != nil { + logWallet.WithError(err).Warn("Couldn't create transaction") + return nil, err + } + return fromTxnResponse(txnR), nil +} + func (wlt *LocalWallet) Transfer(to core.Address, amount uint64, options core.KeyValueStorage) (core.Transaction, error) { logWallet.Info("Sending form local wallet") quotient, err := util.AltcoinQuotient(Sky) @@ -1227,23 +1242,10 @@ func (wlt *LocalWallet) Transfer(to core.Address, amount uint64, options core.Ke addresses = append(addresses, iterAddr.Value()) } - createTxnFunc := func(txnReq *api.CreateTransactionRequest) (core.Transaction, error) { - client, err := NewSkycoinApiClient(PoolSection) - if err != nil { - logWallet.WithError(err).Warn("Couldn't load api client") - return nil, err - } - defer ReturnSkycoinClient(client) - txnR, err := client.CreateTransaction(*txnReq) - if err != nil { - logWallet.WithError(err).Warn("Couldn't create transaction") - return nil, err - } - return fromTxnResponse(txnR), nil - } + createTxnFunc := skyAPICreateTxn return createTransaction(addresses, []core.TransactionOutput{&txnOutput}, nil, nil, options, createTxnFunc) - } + func (wlt LocalWallet) SendFromAddress(from []core.Address, to []core.TransactionOutput, change core.Address, options core.KeyValueStorage) (core.Transaction, error) { logWallet.Info("Sending from addresses in local wallet") createTxnFunc := func(txnReq *api.CreateTransactionRequest) (core.Transaction, error) { diff --git a/src/core/blockchain.go b/src/core/blockchain.go index ffaefd2d..d30ff8a1 100644 --- a/src/core/blockchain.go +++ b/src/core/blockchain.go @@ -22,10 +22,10 @@ type BlockchainStatus interface { // BlockchainAPI abstract interface for transactions management and utility functions for specific blockchain. // The service should use the blockchain node to implement given interface. -type BlockchainAPI interface { - // Transfer instantiates a transaction to send funds from wallet to known address account owner - // If null address is specified for unspent wallet output then any wallet address may be chosen to build transaction - Transfer(uxOuts []WalletOutput, to, change Address, options KeyValueStorage) (Transaction, error) +type BlockchainTransactionAPI interface { + // SendFromAddress instantiates a transaction to send funds from specific source addresses + // to multiple destination addresses + SendFromAddress(from []WalletAddress, to []TransactionOutput, change Address, options KeyValueStorage) (Transaction, error) // Spend instantiate a transaction that spends specific outputs to send to multiple destination addresses - Spend(unspent, new []WalletOutput, change Address, options KeyValueStorage) (Transaction, error) + Spend(unspent []WalletOutput, new []TransactionOutput, change Address, options KeyValueStorage) (Transaction, error) } diff --git a/src/core/wallet.go b/src/core/wallet.go index f883f1df..a537698c 100644 --- a/src/core/wallet.go +++ b/src/core/wallet.go @@ -80,6 +80,14 @@ type WalletOutput interface { GetOutput() TransactionOutput } +// WalletAddress aggregates address with originating wallet +type WalletAddress interface { + // GetWallet return wallet + GetWallet() Wallet + // GetOutput return transaction output. + GetAddress() Address +} + // SeedGenerator establishes the contract for generating BIP39-compatible mnemonics type SeedGenerator interface { // GenerateMnemonic generates a valid BIP-39 mnemonic phrase diff --git a/src/util/wallet.go b/src/util/wallet.go index c4ca45f2..02fb0dec 100644 --- a/src/util/wallet.go +++ b/src/util/wallet.go @@ -4,7 +4,7 @@ import ( "github.com/fibercrypto/FiberCryptoWallet/src/core" ) -// SimpleWalletOutput put together transacion output with riginating wallet +// SimpleWalletOutput put together transacion output with originating wallet type SimpleWalletOutput struct { Wallet core.Wallet UxOut core.TransactionOutput @@ -20,7 +20,24 @@ func (wo *SimpleWalletOutput) GetOutput() core.TransactionOutput { return wo.UxOut } +// SimpleWalletAddress put together address with owner wallet +type SimpleWalletAddress struct { + Wallet core.Wallet + UxOut core.Address +} + +// GetWallet return wallet +func (wa *SimpleWalletAddress) GetWallet() core.Wallet { + return wa.Wallet +} + +// GetAddress return address +func (wa *SimpleWalletAddress) GetAddress() core.Address { + return wa.UxOut +} + // Type assertions var ( - _ core.WalletOutput = &SimpleWalletOutput{} + _ core.WalletOutput = &SimpleWalletOutput{} + _ core.WalletAddress = &SimpleWalletAddress{} ) From 6396014ea034de051f9a42ab25f6b08d006aa8ef Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Wed, 30 Oct 2019 23:26:17 -0400 Subject: [PATCH 05/69] [core] refs #150 - Augment AltcoinPlugin interface with LoadTransactionAPI method --- src/core/main.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/main.go b/src/core/main.go index 375eac19..c02b584c 100644 --- a/src/core/main.go +++ b/src/core/main.go @@ -46,6 +46,8 @@ type AltcoinPlugin interface { LoadWalletEnvs() []WalletEnv // LoadPEX instantiates proxy object to interact with nodes nodes of the P2P network LoadPEX(netType string) (PEX, error) + // LoadTransactionAPI + LoadTransactionAPI(netType string) (BlockchainTransactionAPI, error) } // AltcoinManager defines the contract for altcoin repositories From 0633d60352ef31d5baaf283746b02b7fafca2d6b Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Wed, 30 Oct 2019 23:27:03 -0400 Subject: [PATCH 06/69] [sky] refs #150 - Implement LoadTransactionAPI entry point for SkyFiber altcoin plugin --- src/coin/skycoin/models/main.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/coin/skycoin/models/main.go b/src/coin/skycoin/models/main.go index 59102647..17c05c8e 100644 --- a/src/coin/skycoin/models/main.go +++ b/src/coin/skycoin/models/main.go @@ -71,14 +71,18 @@ func (p *SkyFiberPlugin) LoadWalletEnvs() []core.WalletEnv { } func (p *SkyFiberPlugin) LoadPEX(netType string) (core.PEX, error) { - var poolSection string - if netType == "MainNet" { - poolSection = PoolSection - } else { + if netType != "MainNet" { return nil, errors.New("Invalid netType") } - return NewSkycoinPEX(poolSection), nil + return NewSkycoinPEX(PoolSection), nil +} +func (p *SkyFiberPlugin) LoadTransactionAPI(netType string) (core.BlockchainTransactionAPI, error) { + if netType != "MainNet" { + return nil, errors.New("Invalid netType") + } + // FIXME: Invalidate timeout + return NewSkycoinBlockchain(1000), nil } func NewSkyFiberPlugin(params params.SkyFiberParams) core.AltcoinPlugin { @@ -86,3 +90,8 @@ func NewSkyFiberPlugin(params params.SkyFiberParams) core.AltcoinPlugin { Params: params, } } + +// Type assertions +var ( + _ core.AltcoinPlugin = &SkyFiberPlugin{} +) From a930686e3bcaf2d80e0b6c9d3d335147249761b7 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Thu, 31 Oct 2019 13:22:44 -0400 Subject: [PATCH 07/69] [sky] refs #150 - LoadTransactionAPI returns ErrInvalidNetworkType if netType is not MainNet --- src/coin/skycoin/models/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coin/skycoin/models/main.go b/src/coin/skycoin/models/main.go index 81f7eee8..f9d222ab 100644 --- a/src/coin/skycoin/models/main.go +++ b/src/coin/skycoin/models/main.go @@ -78,7 +78,7 @@ func (p *SkyFiberPlugin) LoadPEX(netType string) (core.PEX, error) { func (p *SkyFiberPlugin) LoadTransactionAPI(netType string) (core.BlockchainTransactionAPI, error) { if netType != "MainNet" { - return nil, errors.New("Invalid netType") + return nil, errors.ErrInvalidNetworkType } // FIXME: Invalidate timeout return NewSkycoinBlockchain(1000), nil From 3052c065230e861edbdf3be9bc92138136bfeddf Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Thu, 31 Oct 2019 17:56:25 -0400 Subject: [PATCH 08/69] [core] refs #150 - Add BlockchainSignService type --- src/core/sign.go | 17 +++++++++++++++++ src/core/wallet.go | 6 +++--- 2 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 src/core/sign.go diff --git a/src/core/sign.go b/src/core/sign.go new file mode 100644 index 00000000..d510592c --- /dev/null +++ b/src/core/sign.go @@ -0,0 +1,17 @@ +package core + +// InputSignDescriptor specifies how to sign a specific transaction input +type InputSignDescriptor struct { + // InputIndex absolute (e.g. UXID) input identifier or relative (e.g. array index) in transaction context + InputIndex string + // SignerID selects a given signing strategy. If empty, default strategy will be chosen + SignerID UID + // Wallet placeholder containing private keys to sign transaction input + Wallet Wallet +} + +// BlockchainSignService implement multi-wallet transaction signing for the blockchain +type BlockchainSignService interface { + // Sign creates a new transaction by (fully or partially) signing a given transaction + Sign(txn Transaction, signSpec []InputSignDescriptor, pwd PasswordReader) (Transaction, error) +} diff --git a/src/core/wallet.go b/src/core/wallet.go index a537698c..13973a4d 100644 --- a/src/core/wallet.go +++ b/src/core/wallet.go @@ -1,6 +1,6 @@ package core -// WalletIteratr iterates over sequences of wallets +// WalletIterator iterates over sequences of wallets type WalletIterator interface { // Value of wallet at iterator pointer position Value() Wallet @@ -62,7 +62,7 @@ type Wallet interface { GetCryptoAccount() CryptoAccount // GetLoadedAddresses iterates over wallet addresses discovered and known to have previous history and coins GetLoadedAddresses() (AddressIterator, error) - // Sign creates a new transaction by (fully or partially) choosing a strategy to sign another transaction + // Sign creates a new transaction by (fully or partially) choosing a strategy to sign given transaction Sign(txn Transaction, source UID, pwd PasswordReader, index []string) (Transaction, error) // AttachSignService binds a signing strategy to this wallet AttachSignService(TxnSigner) error @@ -96,7 +96,7 @@ type SeedGenerator interface { VerifyMnemonic(seed string) (bool, error) } -// WalletEnvironment is the entry point to manage wallets +// WalletEnv is the entry point to manage wallets type WalletEnv interface { // GetStorage provides access to wallet data store GetStorage() WalletStorage From ff9c2f72aedcdb856756e76f7d4be8945df0bbfb Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Thu, 31 Oct 2019 19:44:56 -0400 Subject: [PATCH 09/69] [coin] [util] refs #150 - Add SkycoinSignService ... and reusable function implementing generic strategy for trivial sign services --- src/coin/skycoin/models/sign.go | 19 +++++++++++++++++ src/util/sign.go | 36 +++++++++++++++++++++++++++++++++ src/util/util.go | 3 +++ 3 files changed, 58 insertions(+) create mode 100644 src/coin/skycoin/models/sign.go create mode 100644 src/util/sign.go diff --git a/src/coin/skycoin/models/sign.go b/src/coin/skycoin/models/sign.go new file mode 100644 index 00000000..3bd8ed69 --- /dev/null +++ b/src/coin/skycoin/models/sign.go @@ -0,0 +1,19 @@ +package skycoin + +import ( + "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/FiberCryptoWallet/src/util" +) + +// SkycoinSignService implements BlockchainSignService for multi-wallet transaction signing +type SkycoinSignService struct{} + +// Sign creates a new transaction by (fully or partially) signing a given transaction +func (sss *SkycoinSignService) Sign(txn core.Transaction, signSpec []core.InputSignDescriptor, pwd core.PasswordReader) (core.Transaction, error) { + return util.GenericMultiWalletSign(txn, signSpec, pwd) +} + +// Type assertions +var ( + _ core.BlockchainSignService = &SkycoinSignService{} +) diff --git a/src/util/sign.go b/src/util/sign.go new file mode 100644 index 00000000..cd3d39d2 --- /dev/null +++ b/src/util/sign.go @@ -0,0 +1,36 @@ +package util + +import ( + "github.com/fibercrypto/FiberCryptoWallet/src/core" +) + +type signingKeyPair struct { + wallet core.Wallet + signer core.UID +} + +// MultiWalletSign generic strategy for using multiple wallets to sign a transaction +func GenericMultiWalletSign(txn core.Transaction, signSpec []core.InputSignDescriptor, pwd core.PasswordReader) (signedTxn core.Transaction, err error) { + groups := make(map[signingKeyPair][]string) + // Aggregate inputs by wallet,signer combination + for _, descriptor := range signSpec { + key := signingKeyPair{ + wallet: descriptor.Wallet, + signer: descriptor.SignerID, + } + inputs, isNotEmpty := groups[key] + if !isNotEmpty { + inputs = []string{} + } + groups[key] = append(inputs, descriptor.InputIndex) + } + signedTxn = txn + for signPair, indices := range groups { + signedTxn, err = signPair.wallet.Sign(signedTxn, signPair.signer, pwd, indices) + if err != nil { + logUtil.WithError(err).Errorf("Error signing inputs %v of wallet %v with signer %s", indices, signPair.wallet, string(signPair.signer)) + return nil, err + } + } + return signedTxn, nil +} diff --git a/src/util/util.go b/src/util/util.go index c6d600ab..463c85d5 100644 --- a/src/util/util.go +++ b/src/util/util.go @@ -1,9 +1,12 @@ package util import ( + "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" "strconv" ) +var logUtil = logging.MustGetLogger("FiberCrypto util") + func Min(a, b int) int { if a <= b { return a From 054da1c11646e660570fff3c46d2444877d468bc Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Thu, 31 Oct 2019 20:12:26 -0400 Subject: [PATCH 10/69] [sky] refs #150 - Entry point for loading sign service. Implemented by SkyFiber plugin --- src/coin/skycoin/models/main.go | 14 ++++++++++++++ src/core/main.go | 4 +++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/coin/skycoin/models/main.go b/src/coin/skycoin/models/main.go index f9d222ab..729b54d7 100644 --- a/src/coin/skycoin/models/main.go +++ b/src/coin/skycoin/models/main.go @@ -7,10 +7,12 @@ import ( local "github.com/fibercrypto/FiberCryptoWallet/src/main" ) +// SkyFiberPlugin provide support for SkyFiber coins type SkyFiberPlugin struct { Params params.SkyFiberParams } +// ListSupportedAltcoins to enumerate supported assets and related metadata func (p *SkyFiberPlugin) ListSupportedAltcoins() []core.AltcoinMetadata { return []core.AltcoinMetadata{ core.AltcoinMetadata{ @@ -30,24 +32,29 @@ func (p *SkyFiberPlugin) ListSupportedAltcoins() []core.AltcoinMetadata { } } +// ListSupportedFamilies classifies similar cryptocurrencies into a family func (p *SkyFiberPlugin) ListSupportedFamilies() []string { return []string{SkycoinFamily} } +// RegisterTo boilerplate to register this plugin against an altcoin manager and enable it func (p *SkyFiberPlugin) RegisterTo(manager core.AltcoinManager) { for _, info := range p.ListSupportedAltcoins() { manager.RegisterAltcoin(info, p) } } +// GetName provides concise human-readable caption o identify this plugin func (p *SkyFiberPlugin) GetName() string { return "SkyFiber" } +// GetDescription describes plugin and its features func (p *SkyFiberPlugin) GetDescription() string { return "FiberCrypto wallet connector for Skycoin and SkyFiber altcoins" } +// LoadWalletEnvs loads wallet environments to lookup and create wallets func (p *SkyFiberPlugin) LoadWalletEnvs() []core.WalletEnv { config := local.GetConfigManager() @@ -69,6 +76,7 @@ func (p *SkyFiberPlugin) LoadWalletEnvs() []core.WalletEnv { return wltEnvs } +// LoadPEX instantiates proxy object to interact with nodes nodes of the P2P network func (p *SkyFiberPlugin) LoadPEX(netType string) (core.PEX, error) { if netType != "MainNet" { return nil, errors.ErrInvalidNetworkType @@ -76,6 +84,7 @@ func (p *SkyFiberPlugin) LoadPEX(netType string) (core.PEX, error) { return NewSkycoinPEX(PoolSection), nil } +// LoadTransactionAPI blockchain transaction API entry poiny func (p *SkyFiberPlugin) LoadTransactionAPI(netType string) (core.BlockchainTransactionAPI, error) { if netType != "MainNet" { return nil, errors.ErrInvalidNetworkType @@ -84,6 +93,11 @@ func (p *SkyFiberPlugin) LoadTransactionAPI(netType string) (core.BlockchainTran return NewSkycoinBlockchain(1000), nil } +// LoadSignService sign service entry point +func (p *SkyFiberPlugin) LoadSignService() (core.BlockchainSignService, error) { + return &SkycoinSignService{}, nil +} + func NewSkyFiberPlugin(params params.SkyFiberParams) core.AltcoinPlugin { return &SkyFiberPlugin{ Params: params, diff --git a/src/core/main.go b/src/core/main.go index c02b584c..ce6efa90 100644 --- a/src/core/main.go +++ b/src/core/main.go @@ -46,8 +46,10 @@ type AltcoinPlugin interface { LoadWalletEnvs() []WalletEnv // LoadPEX instantiates proxy object to interact with nodes nodes of the P2P network LoadPEX(netType string) (PEX, error) - // LoadTransactionAPI + // LoadTransactionAPI blockchain transaction API entry poiny LoadTransactionAPI(netType string) (BlockchainTransactionAPI, error) + // LoadSignService sign service entry point + LoadSignService() (BlockchainSignService, error) } // AltcoinManager defines the contract for altcoin repositories From 3b697ef58ce94112e6c26334b1428e6cac887be4 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 1 Nov 2019 13:12:20 -0400 Subject: [PATCH 11/69] [sky] refs #150 - Absolute () and relative (#) input indices for signing --- src/coin/skycoin/models/wallet.go | 54 ++++++++++++++++++++------ src/coin/skycoin/models/wallet_test.go | 32 +++++++++++---- src/errors/error.go | 4 ++ 3 files changed, 72 insertions(+), 18 deletions(-) diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index 2a9bbe77..eeab14b5 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -685,16 +685,50 @@ func (wlt *RemoteWallet) SignTransaction(txn core.Transaction, pwdReader core.Pa if strIdxs == nil { indices = nil } else { - indices = make([]int, len(strIdxs)) - for i, strIdx := range strIdxs { - indices[i], err = strconv.Atoi(strIdx) + indices, err = getHashIndices(txn.GetInputs(), strIdxs) + if err != nil { + logWallet.Error("Error parsing Skycoin transaction input indices array for signing") + return nil, err + } + } + signedTxn, err = wlt.signSkycoinTxn(txn, pwdReader, indices) + return +} + +func getHashIndices(ins []core.TransactionInput, strIdxs []string) (indices []int, err error) { + cache := make(map[string]int, len(ins)) + indices = make([]int, len(strIdxs)) + scanIdx := 0 + for i, strIdx := range strIdxs { + if strIdx[0] == '#' { + // Parse index + index, err := strconv.Atoi(strIdx[1:]) if err != nil { return nil, errors.ErrIntegerInputsRequired } + indices[i] = index + } else if index, isCached := cache[strIdx]; isCached { + // Found in previous scan + indices[i] = index + } else { + logWallet.Infof("Scanning inputs array looking for %s", strIdx) + // Continue scanning for UXID position in slice + notfound := true + for ; scanIdx < len(ins) && notfound; scanIdx++ { + uxID := ins[scanIdx].GetId() + logWallet.Infof("Scanning inputs array found %s", uxID) + cache[uxID] = scanIdx + if uxID == strIdx { + indices[i] = scanIdx + notfound = false + } + } + if notfound { + return nil, errors.ErrNotFound + } } } - signedTxn, err = wlt.signSkycoinTxn(txn, pwdReader, indices) - return + return indices, nil } func (wlt *RemoteWallet) GetSignerUID() core.UID { @@ -1400,12 +1434,10 @@ func (wlt *LocalWallet) SignTransaction(txn core.Transaction, pwdReader core.Pas if strIdxs == nil { indices = nil } else { - indices = make([]int, len(strIdxs)) - for i, strIdx := range strIdxs { - indices[i], err = strconv.Atoi(strIdx) - if err != nil { - return nil, errors.ErrIntegerInputsRequired - } + indices, err = getHashIndices(txn.GetInputs(), strIdxs) + if err != nil { + logWallet.Error("Error parsing Skycoin transaction input indices array for signing") + return nil, err } } signedTxn, err = wlt.signSkycoinTxn(txn, pwdReader, indices) diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index e6f8597f..155f6f4c 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -554,7 +554,7 @@ func TestTransactionSignInput(t *testing.T) { wallets := makeLocalWalletsFromKeyData(t, keysData) // Input is already signed - _, err = wallets[0].Sign(uiTxn, SignerIDLocalWallet, util.EmptyPassword, []string{"0"}) + _, err = wallets[0].Sign(uiTxn, SignerIDLocalWallet, util.EmptyPassword, []string{"#0"}) testutil.RequireError(t, err, "Transaction is fully signed") isFullySigned, err = uiTxn.IsFullySigned() require.NoError(t, err) @@ -565,7 +565,7 @@ func TestTransactionSignInput(t *testing.T) { isFullySigned, err = uiTxn.IsFullySigned() require.NoError(t, err) require.False(t, isFullySigned) - signedCoreTxn, err = wallets[1].Sign(uiTxn, SignerIDLocalWallet, nil, []string{"1"}) + signedCoreTxn, err = wallets[1].Sign(uiTxn, SignerIDLocalWallet, nil, []string{"#1"}) require.NoError(t, err) signedTxn, isUninjected := signedCoreTxn.(*SkycoinUninjectedTransaction) require.True(t, isUninjected) @@ -576,7 +576,25 @@ func TestTransactionSignInput(t *testing.T) { isFullySigned, err = signedTxn.IsFullySigned() require.NoError(t, err) require.True(t, isFullySigned) - _, err = wallets[1].Sign(signedTxn, SignerIDLocalWallet, nil, []string{"1"}) + _, err = wallets[1].Sign(signedTxn, SignerIDLocalWallet, nil, []string{"#1"}) + testutil.RequireError(t, err, "Transaction is fully signed") + // Repeat using UXID + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + uxId := txn.In[1].Hex() + signedCoreTxn, err = wallets[1].Sign(uiTxn, SignerIDLocalWallet, nil, []string{uxId}) + require.NoError(t, err) + signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) + require.True(t, isUninjected) + require.NotEqual(t, uiTxn.txn, signedTxn.txn) + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + isFullySigned, err = signedTxn.IsFullySigned() + require.NoError(t, err) + require.True(t, isFullySigned) + _, err = wallets[1].Sign(signedTxn, SignerIDLocalWallet, nil, []string{"#1"}) testutil.RequireError(t, err, "Transaction is fully signed") // Transaction has no sigs; sigs array is initialized @@ -584,7 +602,7 @@ func TestTransactionSignInput(t *testing.T) { isFullySigned, err = uiTxn.IsFullySigned() require.NoError(t, err) require.False(t, isFullySigned) - signedCoreTxn, err = wallets[2].Sign(uiTxn, SignerIDLocalWallet, nil, []string{"2"}) + signedCoreTxn, err = wallets[2].Sign(uiTxn, SignerIDLocalWallet, nil, []string{"#2"}) require.NoError(t, err) signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) require.True(t, isUninjected) @@ -598,14 +616,14 @@ func TestTransactionSignInput(t *testing.T) { require.False(t, signedTxn.txn.Sigs[2].Null()) // Signing the rest of the inputs individually works - signedCoreTxn, err = wallets[1].Sign(signedTxn, SignerIDLocalWallet, nil, []string{"1"}) + signedCoreTxn, err = wallets[1].Sign(signedTxn, SignerIDLocalWallet, nil, []string{"#1"}) require.NoError(t, err) signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) require.True(t, isUninjected) isFullySigned, err = signedTxn.IsFullySigned() require.NoError(t, err) require.False(t, isFullySigned) - signedCoreTxn, err = wallets[0].Sign(signedTxn, SignerIDLocalWallet, nil, []string{"0"}) + signedCoreTxn, err = wallets[0].Sign(signedTxn, SignerIDLocalWallet, nil, []string{"#0"}) require.NoError(t, err) signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) require.True(t, isUninjected) @@ -659,7 +677,7 @@ func TestTransactionSignInputs(t *testing.T) { // Valid signing h := txn.HashInner() - signedCoreTxn, err := wallet.Sign(uiTxn, SignerIDLocalWallet, util.EmptyPassword, []string{"0", "1"}) + signedCoreTxn, err := wallet.Sign(uiTxn, SignerIDLocalWallet, util.EmptyPassword, []string{"#0", "#1"}) require.NoError(t, err) signedTxn, isUninjected := signedCoreTxn.(*SkycoinUninjectedTransaction) require.True(t, isUninjected) diff --git a/src/errors/error.go b/src/errors/error.go index 1f1c0b2b..3d807e0f 100644 --- a/src/errors/error.go +++ b/src/errors/error.go @@ -31,8 +31,12 @@ var ( ErrInvalidNetworkType = errors.New("Invalid netType") // ErrInvalidID invalid ID ErrInvalidID = errors.New("Invalid Id") + // ErrNotFound target item not found in collection + ErrNotFound = errors.New("Item not found in collection") // ErrParseTxID invalid string value for transaction hash ID ErrParseTxID = errors.New("Error parsing transaction hash") + // ErrParseSHA256 invalid SHA256 hash + ErrParseSHA256 = errors.New("Error parsing SHA256 hash") // ErrParseTxnFee invalid string value for transaction fee ErrParseTxnFee = errors.New("Error parsing transaction fee") // ErrParseTxnCoins transaction coins can not be parsed From 40ee5140241deebf148bca705d893417c608ad48 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 1 Nov 2019 17:30:44 -0400 Subject: [PATCH 12/69] [sky] [models] [params] refs #150 - All tickers belong in SkycoinFamily. Global constant DataRefrenshTimeout --- :w | 110 ++++++++++++++++++++++++++++++ src/coin/skycoin/models/main.go | 6 +- src/coin/skycoin/models/params.go | 2 - src/coin/skycoin/params/params.go | 30 +++++--- src/models/blockchainModels.go | 5 +- src/params/params.go | 6 ++ 6 files changed, 141 insertions(+), 18 deletions(-) create mode 100644 :w create mode 100644 src/params/params.go diff --git a/:w b/:w new file mode 100644 index 00000000..399bf042 --- /dev/null +++ b/:w @@ -0,0 +1,110 @@ +package skycoin + +import ( + "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" + "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/FiberCryptoWallet/src/errors" + local "github.com/fibercrypto/FiberCryptoWallet/src/main" + appParams "github.com/fibercrypto/FiberCryptoWallet/src/params" +) + +// SkyFiberPlugin provide support for SkyFiber coins +type SkyFiberPlugin struct { + Params params.SkyFiberParams +} + +// ListSupportedAltcoins to enumerate supported assets and related metadata +func (p *SkyFiberPlugin) ListSupportedAltcoins() []core.AltcoinMetadata { + return []core.AltcoinMetadata{ + core.AltcoinMetadata{ + Name: SkycoinName, + Ticker: SkycoinTicker, + Family: SkycoinFamily, + HasBip44: false, + Accuracy: 6, + }, + core.AltcoinMetadata{ + Name: CoinHoursName, + Ticker: CoinHoursTicker, + Family: SkycoinFamily, + HasBip44: false, + Accuracy: 0, + }, + } +} + +// ListSupportedFamilies classifies similar cryptocurrencies into a family +func (p *SkyFiberPlugin) ListSupportedFamilies() []string { + return []string{SkycoinFamily} +} + +// RegisterTo boilerplate to register this plugin against an altcoin manager and enable it +func (p *SkyFiberPlugin) RegisterTo(manager core.AltcoinManager) { + for _, info := range p.ListSupportedAltcoins() { + manager.RegisterAltcoin(info, p) + } +} + +// GetName provides concise human-readable caption o identify this plugin +func (p *SkyFiberPlugin) GetName() string { + return "SkyFiber" +} + +// GetDescription describes plugin and its features +func (p *SkyFiberPlugin) GetDescription() string { + return "FiberCrypto wallet connector for Skycoin and SkyFiber altcoins" +} + +// LoadWalletEnvs loads wallet environments to lookup and create wallets +func (p *SkyFiberPlugin) LoadWalletEnvs() []core.WalletEnv { + + config := local.GetConfigManager() + wltSources := config.GetSources() + + wltEnvs := make([]core.WalletEnv, 0) + for _, wltS := range wltSources { + tp := wltS.GetType() + source := wltS.GetSource() + var wltEnv core.WalletEnv + if tp == local.LocalWallet { + wltEnv = &WalletDirectory{WalletDir: source} + } else if tp == local.RemoteWallet { + wltEnv = NewWalletNode(source) + } + wltEnvs = append(wltEnvs, wltEnv) + } + + return wltEnvs +} + +// LoadPEX instantiates proxy object to interact with nodes nodes of the P2P network +func (p *SkyFiberPlugin) LoadPEX(netType string) (core.PEX, error) { + if netType != "MainNet" { + return nil, errors.ErrInvalidNetworkType + } + return NewSkycoinPEX(PoolSection), nil +} + +// LoadTransactionAPI blockchain transaction API entry poiny +func (p *SkyFiberPlugin) LoadTransactionAPI(netType string) (core.BlockchainTransactionAPI, error) { + if netType != "MainNet" { + return nil, errors.ErrInvalidNetworkType + } + return NewSkycoinBlockchain(main.DataRefreshTimeout), nil +} + +// LoadSignService sign service entry point +func (p *SkyFiberPlugin) LoadSignService() (core.BlockchainSignService, error) { + return &SkycoinSignService{}, nil +} + +func NewSkyFiberPlugin(params params.SkyFiberParams) core.AltcoinPlugin { + return &SkyFiberPlugin{ + Params: params, + } +} + +// Type assertions +var ( + _ core.AltcoinPlugin = &SkyFiberPlugin{} +) diff --git a/src/coin/skycoin/models/main.go b/src/coin/skycoin/models/main.go index 729b54d7..1736c9e5 100644 --- a/src/coin/skycoin/models/main.go +++ b/src/coin/skycoin/models/main.go @@ -5,6 +5,7 @@ import ( "github.com/fibercrypto/FiberCryptoWallet/src/core" "github.com/fibercrypto/FiberCryptoWallet/src/errors" local "github.com/fibercrypto/FiberCryptoWallet/src/main" + appParams "github.com/fibercrypto/FiberCryptoWallet/src/params" ) // SkyFiberPlugin provide support for SkyFiber coins @@ -25,7 +26,7 @@ func (p *SkyFiberPlugin) ListSupportedAltcoins() []core.AltcoinMetadata { core.AltcoinMetadata{ Name: CoinHoursName, Ticker: CoinHoursTicker, - Family: CoinHoursFamily, + Family: SkycoinFamily, HasBip44: false, Accuracy: 0, }, @@ -89,8 +90,7 @@ func (p *SkyFiberPlugin) LoadTransactionAPI(netType string) (core.BlockchainTran if netType != "MainNet" { return nil, errors.ErrInvalidNetworkType } - // FIXME: Invalidate timeout - return NewSkycoinBlockchain(1000), nil + return NewSkycoinBlockchain(appParams.DataRefreshTimeout), nil } // LoadSignService sign service entry point diff --git a/src/coin/skycoin/models/params.go b/src/coin/skycoin/models/params.go index 1f52de3f..88826d65 100644 --- a/src/coin/skycoin/models/params.go +++ b/src/coin/skycoin/models/params.go @@ -18,10 +18,8 @@ const ( SkycoinDescription = params.SkycoinDescription CoinHoursTicker = params.CoinHoursTicker CoinHoursName = params.CoinHoursName - CoinHoursFamily = params.CoinHoursFamily CoinHoursDescription = params.CoinHoursDescription CalculatedHoursTicker = params.CalculatedHoursTicker CalculatedHoursName = params.CalculatedHoursName - CalculatedHoursFamily = params.CalculatedHoursFamily CalculatedHoursDescription = params.CalculatedHoursDescription ) diff --git a/src/coin/skycoin/params/params.go b/src/coin/skycoin/params/params.go index 3ecb12e4..c6cdf0cd 100644 --- a/src/coin/skycoin/params/params.go +++ b/src/coin/skycoin/params/params.go @@ -16,16 +16,24 @@ var ( // Constparams const ( - SkycoinTicker = "SKY" - SkycoinName = "Skycoin" - SkycoinFamily = "SkyFiber" - SkycoinDescription = "Skycoin is an entire cryptocurrency ecosystem aimed at eliminating mining rewards, developing energy-efficient custom hardware, speeding up transaction confirmation times, and the advancement of a more secure and private Internet" - CoinHoursTicker = "SKYCH" - CoinHoursName = "Coin Hours" - CoinHoursFamily = "SkyFiber" - CoinHoursDescription = "Coin Hours is the parallel asset used for transaction fee, for creating scarcity, and to increase transaction privacy" - CalculatedHoursTicker = "SKYCHC" - CalculatedHoursName = "Calculated Hours" - CalculatedHoursFamily = "SkyFiber" + // SkycoinTicker Skycoin coin identifier + SkycoinTicker = "SKY" + // SkycoinName human readable name associated to Skycoin + SkycoinName = "Skycoin" + // SkycoinFamily identifies Skyfiber coins + SkycoinFamily = "SkyFiber" + // SkycoinDescription verbose explanaitiion of Skycoin + SkycoinDescription = "Skycoin is an entire cryptocurrency ecosystem aimed at eliminating mining rewards, developing energy-efficient custom hardware, speeding up transaction confirmation times, and the advancement of a more secure and private Internet" + // CoinHoursTicker internal identifier to refer to Skycoin coin hours + CoinHoursTicker = "SKY#CH" + // CoinHoursName is the readable name for coin hours + CoinHoursName = "Coin Hours" + // CoinHoursDescription verbose explanaitiion of coin hours + CoinHoursDescription = "Coin Hours is the parallel asset used for transaction fee, for creating scarcity, and to increase transaction privacy" + // CoinHoursTicker internal identifier to refer to accumulated coin hours + CalculatedHoursTicker = "SKY#CHC" + // CoinHoursName is the readable name for accumulated coin hours + CalculatedHoursName = "Calculated Hours" + // CalculatedHoursDescription verbose explanaitiion of accumulated coin hours CalculatedHoursDescription = "Calculated Hours are Coin Hours calculated considering the time since an output was created" ) diff --git a/src/models/blockchainModels.go b/src/models/blockchainModels.go index 1e180125..376cdc88 100644 --- a/src/models/blockchainModels.go +++ b/src/models/blockchainModels.go @@ -6,6 +6,7 @@ import ( "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/models" //callable as skycoin "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/FiberCryptoWallet/src/params" "github.com/fibercrypto/FiberCryptoWallet/src/util" qtcore "github.com/therecipe/qt/core" @@ -42,7 +43,7 @@ func (blockchainStatus *BlockchainStatusModel) init() { blockchainStatus.SetCurrentCoinHoursSupplyDefault("0") blockchainStatus.SetTotalCoinHoursSupplyDefault("0") - blockchainStatus.infoRequester = skycoin.NewSkycoinBlockchainStatus(1000000) //FIXME: set correct value + blockchainStatus.infoRequester = skycoin.NewSkycoinBlockchain(params.DataRefreshTimeout) } func (blockchainStatus *BlockchainStatusModel) update() { @@ -68,7 +69,7 @@ func (blockchainStatus *BlockchainStatusModel) updateInfo() error { logBlockchain.WithError(err).Warn("Couldn't get the hash of the last block") return err } - numberOfBlocks,err := blockchainStatus.infoRequester.GetNumberOfBlocks() + numberOfBlocks, err := blockchainStatus.infoRequester.GetNumberOfBlocks() if err != nil { logBlockchain.WithError(err).Warn("Couldn't get the number of blocks") return err diff --git a/src/params/params.go b/src/params/params.go new file mode 100644 index 00000000..02d80422 --- /dev/null +++ b/src/params/params.go @@ -0,0 +1,6 @@ +package params + +const ( + // Default refresh timeout for API data + DataRefreshTimeout = 1000000 //FIXME: set correct value +) From 7a51446de3ebbb0918094589b0d9503ce55a8f5a Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 1 Nov 2019 17:33:08 -0400 Subject: [PATCH 13/69] Remove file accidentally commited in 40ee5140241deebf148bca705d893417c608ad48 --- :w | 110 ------------------------------------------------------------- 1 file changed, 110 deletions(-) delete mode 100644 :w diff --git a/:w b/:w deleted file mode 100644 index 399bf042..00000000 --- a/:w +++ /dev/null @@ -1,110 +0,0 @@ -package skycoin - -import ( - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/errors" - local "github.com/fibercrypto/FiberCryptoWallet/src/main" - appParams "github.com/fibercrypto/FiberCryptoWallet/src/params" -) - -// SkyFiberPlugin provide support for SkyFiber coins -type SkyFiberPlugin struct { - Params params.SkyFiberParams -} - -// ListSupportedAltcoins to enumerate supported assets and related metadata -func (p *SkyFiberPlugin) ListSupportedAltcoins() []core.AltcoinMetadata { - return []core.AltcoinMetadata{ - core.AltcoinMetadata{ - Name: SkycoinName, - Ticker: SkycoinTicker, - Family: SkycoinFamily, - HasBip44: false, - Accuracy: 6, - }, - core.AltcoinMetadata{ - Name: CoinHoursName, - Ticker: CoinHoursTicker, - Family: SkycoinFamily, - HasBip44: false, - Accuracy: 0, - }, - } -} - -// ListSupportedFamilies classifies similar cryptocurrencies into a family -func (p *SkyFiberPlugin) ListSupportedFamilies() []string { - return []string{SkycoinFamily} -} - -// RegisterTo boilerplate to register this plugin against an altcoin manager and enable it -func (p *SkyFiberPlugin) RegisterTo(manager core.AltcoinManager) { - for _, info := range p.ListSupportedAltcoins() { - manager.RegisterAltcoin(info, p) - } -} - -// GetName provides concise human-readable caption o identify this plugin -func (p *SkyFiberPlugin) GetName() string { - return "SkyFiber" -} - -// GetDescription describes plugin and its features -func (p *SkyFiberPlugin) GetDescription() string { - return "FiberCrypto wallet connector for Skycoin and SkyFiber altcoins" -} - -// LoadWalletEnvs loads wallet environments to lookup and create wallets -func (p *SkyFiberPlugin) LoadWalletEnvs() []core.WalletEnv { - - config := local.GetConfigManager() - wltSources := config.GetSources() - - wltEnvs := make([]core.WalletEnv, 0) - for _, wltS := range wltSources { - tp := wltS.GetType() - source := wltS.GetSource() - var wltEnv core.WalletEnv - if tp == local.LocalWallet { - wltEnv = &WalletDirectory{WalletDir: source} - } else if tp == local.RemoteWallet { - wltEnv = NewWalletNode(source) - } - wltEnvs = append(wltEnvs, wltEnv) - } - - return wltEnvs -} - -// LoadPEX instantiates proxy object to interact with nodes nodes of the P2P network -func (p *SkyFiberPlugin) LoadPEX(netType string) (core.PEX, error) { - if netType != "MainNet" { - return nil, errors.ErrInvalidNetworkType - } - return NewSkycoinPEX(PoolSection), nil -} - -// LoadTransactionAPI blockchain transaction API entry poiny -func (p *SkyFiberPlugin) LoadTransactionAPI(netType string) (core.BlockchainTransactionAPI, error) { - if netType != "MainNet" { - return nil, errors.ErrInvalidNetworkType - } - return NewSkycoinBlockchain(main.DataRefreshTimeout), nil -} - -// LoadSignService sign service entry point -func (p *SkyFiberPlugin) LoadSignService() (core.BlockchainSignService, error) { - return &SkycoinSignService{}, nil -} - -func NewSkyFiberPlugin(params params.SkyFiberParams) core.AltcoinPlugin { - return &SkyFiberPlugin{ - Params: params, - } -} - -// Type assertions -var ( - _ core.AltcoinPlugin = &SkyFiberPlugin{} -) From 9628fa5cedfd377162197f3d2351dd7e42821d79 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 1 Nov 2019 20:05:21 -0400 Subject: [PATCH 14/69] [sky] refs #150 - CalculatedHoursFamily => SkycoinFamily ... fixes error reported in https://travis-ci.org/fibercrypto/FiberCryptoWallet/jobs/606249453#L634-L638 --- src/coin/skycoin/models/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coin/skycoin/models/main.go b/src/coin/skycoin/models/main.go index 5aa45796..f34e1659 100644 --- a/src/coin/skycoin/models/main.go +++ b/src/coin/skycoin/models/main.go @@ -33,7 +33,7 @@ func (p *SkyFiberPlugin) ListSupportedAltcoins() []core.AltcoinMetadata { core.AltcoinMetadata{ Name: CalculatedHoursName, Ticker: CalculatedHoursTicker, - Family: CalculatedHoursFamily, + Family: SkycoinFamily, HasBip44: false, Accuracy: 0, }, From 5cd130575b5bd51190b3f1dc3fc3c014e3144f67 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 1 Nov 2019 20:57:14 -0400 Subject: [PATCH 15/69] refs #150 - Multi-wallet spending in CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e37d8670..180d7b91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Added +- Spend in single transaction coins owned by multiple wallets (same altcoin plugin) - Added logger for the app and proper error handling - Built-in support for SkyWallet hardware wallet as signer for Skycoin transactions - Built-in support iand GUI for applying operations upon SkyWallet hardware devices From 7d4b0bf0345d563adcdc6cc1719d6782ef795a73 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Thu, 14 Nov 2019 17:01:04 -0500 Subject: [PATCH 16/69] [wallets] Change Transfer method from LocalWallet to fit with the new method signature --- src/coin/skycoin/models/wallet.go | 9 +- src/coin/skycoin/models/wallet_test.go | 117 +++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 2 deletions(-) diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index b351084a..1b1edbdb 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -1278,17 +1278,22 @@ func skyAPICreateTxn(txnReq *api.CreateTransactionRequest) (core.Transaction, er return fromTxnResponse(txnR), nil } -func (wlt *LocalWallet) Transfer(to core.Address, amount uint64, options core.KeyValueStorage) (core.Transaction, error) { +func (wlt *LocalWallet) Transfer(to core.TransactionOutput, options core.KeyValueStorage) (core.Transaction, error) { logWallet.Info("Sending form local wallet") quotient, err := util.AltcoinQuotient(Sky) if err != nil { logWallet.WithError(err).Warn("Couldn't get skycoin quotient") return nil, err } + amount, err := to.GetCoins(params.SkycoinTicker) + if err != nil { + logWallet.WithError(err).Warnf("Couldn't get ticker %s from TransactionOutput", params.SkycoinTicker) + return nil, err + } strAmount := util.FormatCoins(amount, quotient) var txnOutput SkycoinTransactionOutput - txnOutput.skyOut.Address = to.String() + txnOutput.skyOut.Address = to.GetAddress().String() txnOutput.skyOut.Coins = strAmount addresses := make([]core.Address, 0) iterAddr, err := wlt.GetLoadedAddresses() diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index d029fafa..ece57bba 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -952,6 +952,10 @@ func makeLocalWallet(t *testing.T) core.Wallet { return wallet } +func makeSkycoinBlockchain(t *testing.T) core.BlockchainTransactionAPI { + return NewSkycoinBlockchain(0) +} + func TestLocalWalletTransfer(t *testing.T) { CleanGlobalMock() destinationAddress := testutil.MakeAddress() @@ -1172,3 +1176,116 @@ func TestLocalWalletSpend(t *testing.T) { require.Equal(t, uint64(sky), val) require.Equal(t, crtTxn.Transaction.TxID, ret.GetId()) } + +func makeSimpleWalletAddress(wallet core.Wallet, address core.Address) *util.SimpleWalletAddress { + return &util.SimpleWalletAddress{ + Wallet: wallet, + UxOut: address, + } +} + +func TestSkycoinBlockchainSendFromAddress(t *testing.T) { + CleanGlobalMock() + + startAddress1 := testutil.MakeAddress() + startAddress2 := testutil.MakeAddress() + + destinationAddress := testutil.MakeAddress() + changeAddress := (testutil.MakeAddress()).String() + sky := 500 + hash := testutil.RandSHA256(t) + + toAddr := &SkycoinTransactionOutput{ + skyOut: readable.TransactionOutput{ + Address: destinationAddress.String(), + Coins: strconv.Itoa(sky), + Hours: uint64(250), + }, + } + fromAddr := []*SkycoinAddress{ + &SkycoinAddress{ + address: startAddress1.String(), + }, + &SkycoinAddress{ + address: startAddress2.String(), + }, + } + chgAddr := &SkycoinAddress{ + address: changeAddress, + } + + opt1 := NewTransferOptions() + opt1.SetValue("BurnFactor", "0.5") + opt1.SetValue("CoinHoursSelectionType", "auto") + + req1 := api.CreateTransactionRequest{ + IgnoreUnconfirmed: false, + HoursSelection: api.HoursSelection{ + Type: "auto", + Mode: "share", + ShareFactor: "0.5", + }, + ChangeAddress: &changeAddress, + To: []api.Receiver{ + api.Receiver{ + Address: destinationAddress.String(), + Coins: strconv.Itoa(sky), + }, + }, + Addresses: []string{startAddress1.String(), startAddress2.String()}, + } + + req2 := api.CreateTransactionRequest{ + IgnoreUnconfirmed: false, + HoursSelection: api.HoursSelection{ + Type: "manual", + }, + ChangeAddress: &changeAddress, + To: []api.Receiver{ + api.Receiver{ + Address: destinationAddress.String(), + Coins: strconv.Itoa(sky), + Hours: "250", + }, + }, + Addresses: []string{startAddress1.String(), startAddress2.String()}, + } + + txn := &coin.Transaction{ + Length: 100, + Type: 0, + InnerHash: hash, + } + ctxnR, err := api.NewCreateTransactionResponse(txn, nil) + ctxnR.Transaction.Fee = strconv.Itoa(sky) + require.NoError(t, err) + + mockSkyApiCreateTransaction(global_mock, &req1, ctxnR) + mockSkyApiCreateTransaction(global_mock, &req2, ctxnR) + + bc := makeSkycoinBlockchain(t) + wlt := &LocalWallet{} + + //Testing Hours selection to auto + from := []core.WalletAddress{makeSimpleWalletAddress(wlt, fromAddr[0]), makeSimpleWalletAddress(wlt, fromAddr[1])} + to := []core.TransactionOutput{toAddr} + txnResult, err := bc.SendFromAddress(from, to, chgAddr, opt1) + require.NoError(t, err) + require.NotNil(t, txnResult) + val, err := txnResult.ComputeFee(params.CoinHoursTicker) + require.NoError(t, err) + require.Equal(t, util.FormatCoins(uint64(sky), 10), util.FormatCoins(uint64(val), 10)) + require.Equal(t, ctxnR.Transaction.TxID, txnResult.GetId()) + + //Testing Hours selection to manual + from := []core.WalletAddress{makeSimpleWalletAddress(wlt, fromAddr[0]), makeSimpleWalletAddress(wlt, fromAddr[1])} + to := []core.TransactionOutput{toAddr} + txnResult, err := bc.SendFromAddress(from, to, chgAddr, opt1) + require.NoError(t, err) + require.NotNil(t, txnResult) + val, err := txnResult.ComputeFee(params.CoinHoursTicker) + require.NoError(t, err) + require.Equal(t, util.FormatCoins(uint64(sky), 10), util.FormatCoins(uint64(val), 10)) + require.Equal(t, ctxnR.Transaction.TxID, txnResult.GetId()) + +} From ace67ea6887e7bd442687a2d772c507d4d8acd30 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Thu, 14 Nov 2019 17:05:18 -0500 Subject: [PATCH 17/69] [test] Add test for SendFromAddress method from SkycoinBlockchain --- src/coin/skycoin/models/wallet_test.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index ece57bba..5c94a824 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -1235,6 +1235,10 @@ func TestSkycoinBlockchainSendFromAddress(t *testing.T) { Addresses: []string{startAddress1.String(), startAddress2.String()}, } + opt2 := NewTransferOptions() + opt2.SetValue("BurnFactor", "0.5") + opt2.SetValue("CoinHoursSelectionType", "manual") + req2 := api.CreateTransactionRequest{ IgnoreUnconfirmed: false, HoursSelection: api.HoursSelection{ @@ -1278,12 +1282,12 @@ func TestSkycoinBlockchainSendFromAddress(t *testing.T) { require.Equal(t, ctxnR.Transaction.TxID, txnResult.GetId()) //Testing Hours selection to manual - from := []core.WalletAddress{makeSimpleWalletAddress(wlt, fromAddr[0]), makeSimpleWalletAddress(wlt, fromAddr[1])} - to := []core.TransactionOutput{toAddr} - txnResult, err := bc.SendFromAddress(from, to, chgAddr, opt1) + from = []core.WalletAddress{makeSimpleWalletAddress(wlt, fromAddr[0]), makeSimpleWalletAddress(wlt, fromAddr[1])} + to = []core.TransactionOutput{toAddr} + txnResult, err = bc.SendFromAddress(from, to, chgAddr, opt2) require.NoError(t, err) require.NotNil(t, txnResult) - val, err := txnResult.ComputeFee(params.CoinHoursTicker) + val, err = txnResult.ComputeFee(params.CoinHoursTicker) require.NoError(t, err) require.Equal(t, util.FormatCoins(uint64(sky), 10), util.FormatCoins(uint64(val), 10)) require.Equal(t, ctxnR.Transaction.TxID, txnResult.GetId()) From 700c9ec0dd2c15c65f74b2b9c9a2fb84669c6bda Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Thu, 14 Nov 2019 19:16:50 -0500 Subject: [PATCH 18/69] [test] Add test for Spend method from SkycoinBlockchain type --- src/coin/skycoin/models/sky_test.go | 16 +++ src/coin/skycoin/models/wallet.go | 2 +- src/coin/skycoin/models/wallet_test.go | 138 +++++++++++++++++++++++-- 3 files changed, 148 insertions(+), 8 deletions(-) diff --git a/src/coin/skycoin/models/sky_test.go b/src/coin/skycoin/models/sky_test.go index 4f711b3b..cb76394e 100644 --- a/src/coin/skycoin/models/sky_test.go +++ b/src/coin/skycoin/models/sky_test.go @@ -5,6 +5,8 @@ import ( "testing" "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/testsuite" + "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/FiberCryptoWallet/src/util" "github.com/skycoin/skycoin/src/cipher" skytestsuite "github.com/skycoin/skycoin/src/cipher/testsuite" "github.com/skycoin/skycoin/src/coin" @@ -177,3 +179,17 @@ func makeSpentOutput(uxout coin.UxOut, spentBkSeq uint64, spentTxId cipher.SHA25 rOut.SpentTxnID = spentTxId.Hex() return } + +func makeSimpleWalletAddress(wallet core.Wallet, address core.Address) core.WalletAddress { + return &util.SimpleWalletAddress{ + Wallet: wallet, + UxOut: address, + } +} + +func makeSimpleWalletOutput(wallet core.Wallet, out core.TransactionOutput) core.WalletOutput { + return &util.SimpleWalletOutput{ + Wallet: wallet, + UxOut: out, + } +} diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index 1b1edbdb..c791516a 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -473,7 +473,7 @@ func createTransaction(from []core.Address, to, uxOut []core.TransactionOutput, if uxOut != nil { uxOuts := make([]string, 0) for _, out := range uxOut { - uxOuts = append(uxOuts, out.GetAddress().String()) + uxOuts = append(uxOuts, out.GetId()) } req.UxOuts = uxOuts } diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index 5c94a824..6727039a 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -1177,13 +1177,6 @@ func TestLocalWalletSpend(t *testing.T) { require.Equal(t, crtTxn.Transaction.TxID, ret.GetId()) } -func makeSimpleWalletAddress(wallet core.Wallet, address core.Address) *util.SimpleWalletAddress { - return &util.SimpleWalletAddress{ - Wallet: wallet, - UxOut: address, - } -} - func TestSkycoinBlockchainSendFromAddress(t *testing.T) { CleanGlobalMock() @@ -1293,3 +1286,134 @@ func TestSkycoinBlockchainSendFromAddress(t *testing.T) { require.Equal(t, ctxnR.Transaction.TxID, txnResult.GetId()) } + +func TestSkycoinBlockchainSpend(t *testing.T) { + CleanGlobalMock() + + hash := testutil.RandSHA256(t) + sky := 500 + //chgAddr := + changeAddr := testutil.MakeAddress().String() + chgAddr := &SkycoinAddress{ + address: changeAddr, + poolSection: "", + } + destinationAddress := testutil.MakeAddress() + + toAddr := &SkycoinTransactionOutput{ + skyOut: readable.TransactionOutput{ + Address: destinationAddress.String(), + Coins: strconv.Itoa(sky), + Hours: uint64(250), + }, + } + + uxOuts := make([]coin.UxOut, 2) + for i := 0; i < 2; i++ { + ux, _, _ := makeUxOutWithSecret(t) + uxOuts[i] = ux + } + + skyOuts := make([]core.TransactionOutput, len(uxOuts)) + for i := 0; i < len(uxOuts); i++ { + ux := uxOuts[i] + quot, err := util.AltcoinQuotient(params.SkycoinTicker) + require.NoError(t, err) + sky := util.FormatCoins(ux.Body.Coins, quot) + skOut := SkycoinTransactionOutput{ + spent: false, + skyOut: readable.TransactionOutput{ + Address: ux.Body.Address.String(), + Hash: ux.Body.Hash().String(), + Coins: sky, + Hours: ux.Body.Hours, + }, + } + skyOuts[i] = &skOut + } + + wltOuts := make([]core.WalletOutput, len(uxOuts)) + for i := 0; i < len(uxOuts); i++ { + wltOuts[i] = makeSimpleWalletOutput(nil, skyOuts[i]) + } + + uxOutsStr := make([]string, len(uxOuts)) + for i := 0; i < len(uxOuts); i++ { + uxOutsStr[i] = uxOuts[i].Hash().String() + } + + opt1 := NewTransferOptions() + opt1.SetValue("BurnFactor", "0.5") + opt1.SetValue("CoinHoursSelectionType", "auto") + + req1 := api.CreateTransactionRequest{ + UxOuts: uxOutsStr, + IgnoreUnconfirmed: false, + To: []api.Receiver{ + api.Receiver{ + Address: destinationAddress.String(), + Coins: strconv.Itoa(sky), + }, + }, + HoursSelection: api.HoursSelection{ + Type: "auto", + Mode: "share", + ShareFactor: "0.5", + }, + ChangeAddress: &changeAddr, + } + + opt2 := NewTransferOptions() + opt2.SetValue("BurnFactor", "0.5") + opt2.SetValue("CoinHoursSelectionType", "manual") + + req2 := api.CreateTransactionRequest{ + UxOuts: uxOutsStr, + IgnoreUnconfirmed: false, + HoursSelection: api.HoursSelection{ + Type: "manual", + }, + ChangeAddress: &changeAddr, + To: []api.Receiver{ + api.Receiver{ + Address: destinationAddress.String(), + Coins: strconv.Itoa(sky), + Hours: "250", + }, + }, + } + + txn := coin.Transaction{ + InnerHash: hash, + Type: 0, + Length: 100, + } + + crtTxn, err := api.NewCreateTransactionResponse(&txn, nil) + require.NoError(t, err) + crtTxn.Transaction.Fee = strconv.Itoa(sky) + + mockSkyApiCreateTransaction(global_mock, &req1, crtTxn) + mockSkyApiCreateTransaction(global_mock, &req2, crtTxn) + + bc := makeSkycoinBlockchain(t) + + to := []core.TransactionOutput{toAddr} + //Testing Hours selection auto + txnR, err := bc.Spend(wltOuts, to, chgAddr, opt1) + require.NoError(t, err) + require.NotNil(t, txnR) + require.Equal(t, txnR.GetId(), crtTxn.Transaction.TxID) + val, err := txnR.ComputeFee(params.CoinHoursTicker) + require.NoError(t, err) + require.Equal(t, util.FormatCoins(uint64(sky), 10), util.FormatCoins(uint64(val), 10)) + + //Testing Hours selection manual + txnR2, err := bc.Spend(wltOuts, to, chgAddr, opt2) + require.NoError(t, err) + require.NotNil(t, txnR2) + require.Equal(t, txnR2.GetId(), crtTxn.Transaction.TxID) + val2, err := txnR2.ComputeFee(params.CoinHoursTicker) + require.NoError(t, err) + require.Equal(t, util.FormatCoins(uint64(sky), 10), util.FormatCoins(uint64(val2), 10)) +} From a0e50279cb4242ea84cc75df3ee6969d56ef882a Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Sat, 16 Nov 2019 17:41:55 -0500 Subject: [PATCH 19/69] [test] Create method generateRandomKeyData for generate random secKey, pubKey pairs from random mnemonics --- src/coin/skycoin/models/sky_test.go | 26 +++++++++++- src/coin/skycoin/models/wallet_test.go | 58 ++++++++++++++++++++++++++ src/coin/skycoin/testsuite/env.go | 1 + 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/src/coin/skycoin/models/sky_test.go b/src/coin/skycoin/models/sky_test.go index cb76394e..dcfe0d3b 100644 --- a/src/coin/skycoin/models/sky_test.go +++ b/src/coin/skycoin/models/sky_test.go @@ -4,6 +4,8 @@ import ( "path/filepath" "testing" + "github.com/skycoin/skycoin/src/cipher/bip39" + "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/testsuite" "github.com/fibercrypto/FiberCryptoWallet/src/core" "github.com/fibercrypto/FiberCryptoWallet/src/util" @@ -66,11 +68,33 @@ type KeyData struct { // generateTestKeyPair provides deterministic sequence of test keys // that can be recovered later inside a wallet + +func generateRandomKeyData(t *testing.T) (*KeyData, error) { + entropy, err := bip39.NewEntropy(128) + require.NoError(t, err) + mnemonic, err := bip39.NewMnemonic(entropy) + require.NoError(t, err) + seed, err := bip39.NewSeed(mnemonic, "") + require.NoError(t, err) + pubKey, secKey, err := cipher.GenerateDeterministicKeyPair(seed) + require.NoError(t, err) + + kd := &KeyData{ + AddressIndex: 0, + Entropy: entropy, + Mnemonic: mnemonic, + PubKey: pubKey, + SecKey: secKey, + } + + return kd, nil +} + func generateTestKeyPair(t *testing.T) (*KeyData, error) { var err error if seedEntropy == nil { // Load suite test data - fn := filepath.Join(testsuite.GetSkycoinCipherTestDataDir(), testsuite.ManyAddressesFilename) + fn := filepath.Join(testsuite.GetSkycoinCipherTestDataDir(), "seed-0000.golden") //testsuite.ManyAddressesFilename) var dataJSON skytestsuite.SeedTestDataJSON err := file.LoadJSON(fn, &dataJSON) diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index 6727039a..80e333ae 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -1,12 +1,15 @@ package skycoin import ( + "fmt" "io/ioutil" "math" "strconv" "strings" "testing" + "github.com/skycoin/skycoin/src/visor" + "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/testsuite" "github.com/fibercrypto/FiberCryptoWallet/src/core" @@ -956,6 +959,10 @@ func makeSkycoinBlockchain(t *testing.T) core.BlockchainTransactionAPI { return NewSkycoinBlockchain(0) } +func makeSkycoinSignService(t *testing.T) core.BlockchainSignService { + return &SkycoinSignService{} +} + func TestLocalWalletTransfer(t *testing.T) { CleanGlobalMock() destinationAddress := testutil.MakeAddress() @@ -1417,3 +1424,54 @@ func TestSkycoinBlockchainSpend(t *testing.T) { require.NoError(t, err) require.Equal(t, util.FormatCoins(uint64(sky), 10), util.FormatCoins(uint64(val2), 10)) } + +func TestSkycoinSignServiceSign(t *testing.T) { + CleanGlobalMock() + + txn, keyData, uxOuts, err := makeTransactionMultipleInputs(t, 3) + require.NoError(t, err) + + //require.Equal(t, keyData, "") + ins := make([]visor.TransactionInput, 0) + for _, out := range uxOuts { + in, err := visor.NewTransactionInput(out, out.Head.Time) + require.NoError(t, err) + + ins = append(ins, in) + } + + //SkycoinCreatedTransaction + sigs := txn.Sigs + txn.Sigs = []cipher.Sig{} + apiCreTxn, err := api.NewCreatedTransaction(&txn, ins) + txn.Sigs = sigs + apiCreTxn.Sigs = make([]string, 0) + require.NoError(t, err) + require.NotNil(t, apiCreTxn) + require.Equal(t, apiCreTxn.InnerHash, txn.HashInner().Hex()) + skyCreTxn := NewSkycoinCreatedTransaction(*apiCreTxn) + + signer := makeSkycoinSignService(t) + wallets := makeLocalWalletsFromKeyData(t, keyData) + + require.NotEqual(t, wallets[0], wallets[1]) + + isds := make([]core.InputSignDescriptor, 0) + for i, wlt := range wallets { + descriptor := core.InputSignDescriptor{ + InputIndex: fmt.Sprintf("#%d", i), + SignerID: SignerIDLocalWallet, + Wallet: wlt, + } + isds = append(isds, descriptor) + + } + + pwdReader := func(message string) (string, error) { + return "", nil + } + signedTxn, err := signer.Sign(skyCreTxn, isds, pwdReader) + require.NoError(t, err) + require.NotNil(t, signedTxn) + +} diff --git a/src/coin/skycoin/testsuite/env.go b/src/coin/skycoin/testsuite/env.go index d6eea6ce..1b7968ee 100644 --- a/src/coin/skycoin/testsuite/env.go +++ b/src/coin/skycoin/testsuite/env.go @@ -8,6 +8,7 @@ import ( const ( TestIDToken = "fibercryptotest" ManyAddressesFilename = "many-addresses.golden" + Seed0000Filename = "seed-0000.golden" ) func GetSkycoinCipherTestDataDir() string { From b3ba6516dd8928a7f74cc678328f564f43925fd6 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Sat, 16 Nov 2019 18:07:05 -0500 Subject: [PATCH 20/69] [test] Create makeTransactionFromMultipleWallets function --- src/coin/skycoin/models/sky_test.go | 43 ++++++++++++++++++++++++++ src/coin/skycoin/models/wallet_test.go | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/coin/skycoin/models/sky_test.go b/src/coin/skycoin/models/sky_test.go index dcfe0d3b..ab616b09 100644 --- a/src/coin/skycoin/models/sky_test.go +++ b/src/coin/skycoin/models/sky_test.go @@ -128,6 +128,19 @@ func generateTestKeyPair(t *testing.T) (*KeyData, error) { return &keytestData, nil } +func makeUxBodyWithRandomSecret(t *testing.T) (coin.UxBody, *KeyData, error) { + keydata, err := generateRandomKeyData(t) + if err != nil { + return coin.UxBody{}, nil, err + } + return coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(keydata.PubKey), + Coins: 1e6, + Hours: 100, + }, keydata, nil +} + func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, *KeyData, error) { keydata, err := generateTestKeyPair(t) if err != nil { @@ -141,6 +154,20 @@ func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, *KeyData, error) { }, keydata, nil } +func makeUxWithRandomSecret(t *testing.T) (coin.UxOut, *KeyData, error) { + body, kd, err := makeUxBodyWithRandomSecret(t) + if err != nil { + return coin.UxOut{}, nil, err + } + return coin.UxOut{ + Head: coin.UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + }, kd, nil +} + func makeUxOutWithSecret(t *testing.T) (coin.UxOut, *KeyData, error) { body, kd, err := makeUxBodyWithSecret(t) if err != nil { @@ -163,6 +190,22 @@ func makeTransaction(t *testing.T) (coin.Transaction, error) { return makeTransactionFromUxOut(t, ux, kd.SecKey), nil } +func makeTransactionFromMultipleWallets(t *testing.T, n int) (coin.Transaction, []KeyData, []coin.UxOut, error) { + uxs := make([]coin.UxOut, n) + keysdata := make([]KeyData, n) + secs := make([]cipher.SecKey, n) + + for i := 0; i < n; i++ { + ux, kd, err := makeUxWithRandomSecret(t) + require.NoError(t, err) + uxs[i] = ux + secs[i] = kd.SecKey + keysdata[i] = *kd + } + + return makeTransactionFromUxOuts(t, uxs, secs), keysdata, uxs, nil +} + func makeTransactionMultipleInputs(t *testing.T, n int) (coin.Transaction, []KeyData, []coin.UxOut, error) { uxs := make([]coin.UxOut, n) keysdata := make([]KeyData, n) diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index 80e333ae..60bb0759 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -1428,7 +1428,7 @@ func TestSkycoinBlockchainSpend(t *testing.T) { func TestSkycoinSignServiceSign(t *testing.T) { CleanGlobalMock() - txn, keyData, uxOuts, err := makeTransactionMultipleInputs(t, 3) + txn, keyData, uxOuts, err := makeTransactionFromMultipleWallets(t, 3) require.NoError(t, err) //require.Equal(t, keyData, "") From 795d7c1e66110653030e3a41723e20b9ca13d90d Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Sun, 17 Nov 2019 12:21:58 -0500 Subject: [PATCH 21/69] [txn] Change runtime type returned by LocalWallet::signSkycoinTxn method from UninjectedTransaction to CreatedTrasaction --- src/coin/skycoin/models/sky_test.go | 5 +-- src/coin/skycoin/models/wallet.go | 38 ++++++++++++++++--- src/coin/skycoin/models/wallet_test.go | 2 +- .../skycoin/skycoin/src/wallet/transaction.go | 2 +- 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/coin/skycoin/models/sky_test.go b/src/coin/skycoin/models/sky_test.go index ab616b09..1aec8f95 100644 --- a/src/coin/skycoin/models/sky_test.go +++ b/src/coin/skycoin/models/sky_test.go @@ -74,9 +74,8 @@ func generateRandomKeyData(t *testing.T) (*KeyData, error) { require.NoError(t, err) mnemonic, err := bip39.NewMnemonic(entropy) require.NoError(t, err) - seed, err := bip39.NewSeed(mnemonic, "") require.NoError(t, err) - pubKey, secKey, err := cipher.GenerateDeterministicKeyPair(seed) + pubKey, secKey, err := cipher.GenerateDeterministicKeyPair([]byte(mnemonic)) require.NoError(t, err) kd := &KeyData{ @@ -94,7 +93,7 @@ func generateTestKeyPair(t *testing.T) (*KeyData, error) { var err error if seedEntropy == nil { // Load suite test data - fn := filepath.Join(testsuite.GetSkycoinCipherTestDataDir(), "seed-0000.golden") //testsuite.ManyAddressesFilename) + fn := filepath.Join(testsuite.GetSkycoinCipherTestDataDir(), testsuite.ManyAddressesFilename) var dataJSON skytestsuite.SeedTestDataJSON err := file.LoadJSON(fn, &dataJSON) diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index c791516a..b4539a8b 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -9,6 +9,8 @@ import ( "strings" "time" + "github.com/skycoin/skycoin/src/visor" + "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/skytypes" "github.com/fibercrypto/FiberCryptoWallet/src/core" @@ -1073,8 +1075,8 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe var skyTxn *coin.Transaction var err error var uxouts []coin.UxOut - var txnFee uint64 - + //var txnFee uint64 + timeStamp := txn.GetTimestamp() walletDir := filepath.Join(wlt.WalletDir, wlt.Id) skyWlt, err := wallet.Load(walletDir) if err != nil { @@ -1083,6 +1085,8 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe } if rTxn, isReadableTxn := txn.(skytypes.ReadableTxn); isReadableTxn { // Readable tranasctions should not need extra API calls + //TO DELETE + logWallet.WithError(err).Warn("GOODDD") cTxn, err := rTxn.ToCreatedTransaction() if err != nil { return nil, err @@ -1117,7 +1121,7 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe logWallet.Errorf("Error parsing fee of TxID %s : %s", cTxn.TxID, cTxn.Fee) return nil, err } - txnFee = uint64(tmpInt64) + //txnFee = uint64(tmpInt64) for i, cIn := range cTxn.In { tmpInt64, err = util.GetCoinValue(cIn.Coins, params.SkycoinTicker) if err != nil { @@ -1152,6 +1156,9 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe } } else { // Raw transaction + //TO DELETE + logWallet.WithError(err).Warn("WRONGGGGG") + unTxn, ok := txn.(*SkycoinUninjectedTransaction) if !ok { logWallet.WithError(err).Warn("Couldn't load transaction un injected") @@ -1159,7 +1166,7 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe } // Uninjected transactions - txnFee = unTxn.fee + //txnFee = unTxn.fee skyTxn = copyTransaction(unTxn.txn) clt, err := NewSkycoinApiClient(PoolSection) if err != nil { @@ -1189,6 +1196,7 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe if err != nil { return nil, err } + addr, err := cipher.DecodeBase58Address(ux.OwnerAddress) if err != nil { return nil, err @@ -1216,17 +1224,35 @@ 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 } // FIXME: Return readable SkycoinCreatedTransaction since UX data is available - resultTxn, err := NewUninjectedTransaction(signedTxn, txnFee) + //resultTxn, err := NewUninjectedTransaction(signedTxn, txnFee) + vins := make([]visor.TransactionInput, 0) + for _, ux := range uxouts { + vin, err := visor.NewTransactionInput(ux, uint64(timeStamp)) + 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) + //TO DELETE + logWallet.WithError(err).Warnf("FEES %s", crtTxn.Fee) + if err != nil { - logWallet.WithError(err).Warn("Couldn't create an un injected transaction") + logWallet.WithError(err).Warn("Couldn't create an un SkycoinCreatedTransaction") return nil, err } + + resultTxn := NewSkycoinCreatedTransaction(*crtTxn) + return resultTxn, nil } diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index 60bb0759..c05db816 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -1431,7 +1431,6 @@ func TestSkycoinSignServiceSign(t *testing.T) { txn, keyData, uxOuts, err := makeTransactionFromMultipleWallets(t, 3) require.NoError(t, err) - //require.Equal(t, keyData, "") ins := make([]visor.TransactionInput, 0) for _, out := range uxOuts { in, err := visor.NewTransactionInput(out, out.Head.Time) @@ -1471,6 +1470,7 @@ func TestSkycoinSignServiceSign(t *testing.T) { return "", nil } signedTxn, err := signer.Sign(skyCreTxn, isds, pwdReader) + require.Equal(t, err.Error(), keyData) require.NoError(t, err) require.NotNil(t, signedTxn) diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/transaction.go b/vendor/github.com/skycoin/skycoin/src/wallet/transaction.go index a92cdccc..f35b68b0 100644 --- a/vendor/github.com/skycoin/skycoin/src/wallet/transaction.go +++ b/vendor/github.com/skycoin/skycoin/src/wallet/transaction.go @@ -140,7 +140,7 @@ func SignTransaction(w Wallet, txn *coin.Transaction, signIndexes []int, uxOuts } if len(toSign) != len(addrs) { - return nil, NewError(errors.New("Wallet cannot sign all requested inputs")) + return nil, NewError(errors.New(fmt.Sprintf("Wallet cannot sign %v %v all requested inputs %s Outs %v", addrs, toSign, w.GetEntries()[0].SkycoinAddress(), uxOuts))) } // Sign the selected inputs From ba318e16b364a381844afc7930477380dfe192bc Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Sun, 17 Nov 2019 22:29:38 -0500 Subject: [PATCH 22/69] [test] Change LocalWallet::signSkycoinTxn to return the same type that is received and Finish multisign test for createdTxn --- src/coin/skycoin/models/wallet.go | 59 ++++++++++++++------------ src/coin/skycoin/models/wallet_test.go | 5 ++- src/util/sign.go | 3 ++ 3 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index b4539a8b..c518cdc3 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -9,8 +9,6 @@ import ( "strings" "time" - "github.com/skycoin/skycoin/src/visor" - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/skytypes" "github.com/fibercrypto/FiberCryptoWallet/src/core" @@ -22,6 +20,7 @@ import ( "github.com/skycoin/skycoin/src/cipher/bip39" "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/readable" + "github.com/skycoin/skycoin/src/visor" "github.com/skycoin/skycoin/src/wallet" ) @@ -1075,22 +1074,24 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe var skyTxn *coin.Transaction var err error var uxouts []coin.UxOut - //var txnFee uint64 - timeStamp := txn.GetTimestamp() + var txnFee uint64 + var resultTxn core.Transaction 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 } - if rTxn, isReadableTxn := txn.(skytypes.ReadableTxn); isReadableTxn { + rTxn, isReadableTxn := txn.(skytypes.ReadableTxn) + if isReadableTxn { // Readable tranasctions should not need extra API calls //TO DELETE logWallet.WithError(err).Warn("GOODDD") + cTxn, err := rTxn.ToCreatedTransaction() - if err != nil { - return nil, err - } + originalInputs = cTxn.In if skyWlt.IsEncrypted() { pass, err := pwd("Type your password") @@ -1156,8 +1157,6 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe } } else { // Raw transaction - //TO DELETE - logWallet.WithError(err).Warn("WRONGGGGG") unTxn, ok := txn.(*SkycoinUninjectedTransaction) if !ok { @@ -1166,7 +1165,7 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe } // Uninjected transactions - //txnFee = unTxn.fee + txnFee = unTxn.fee skyTxn = copyTransaction(unTxn.txn) clt, err := NewSkycoinApiClient(PoolSection) if err != nil { @@ -1193,6 +1192,7 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe uxouts = make([]coin.UxOut, 0) for _, in := range unTxn.txn.In { ux, err := clt.UxOut(in.String()) + if err != nil { return nil, err } @@ -1226,33 +1226,36 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe } 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 } - // FIXME: Return readable SkycoinCreatedTransaction since UX data is available - //resultTxn, err := NewUninjectedTransaction(signedTxn, txnFee) - vins := make([]visor.TransactionInput, 0) - for _, ux := range uxouts { - vin, err := visor.NewTransactionInput(ux, uint64(timeStamp)) + + if isReadableTxn { + vins := make([]visor.TransactionInput, 0) + for _, ux := range uxouts { + vin, err := visor.NewTransactionInput(ux, 0) + 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) + crtTxn.In = originalInputs + if err != nil { - logWallet.WithError(err).Warn("Couldn't create a transaction input") + logWallet.WithError(err).Warn("Couldn't create an un SkycoinCreatedTransaction") return nil, err } - vins = append(vins, vin) - } - - crtTxn, err := api.NewCreatedTransaction(signedTxn, vins) - //TO DELETE - logWallet.WithError(err).Warnf("FEES %s", crtTxn.Fee) - 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) } - resultTxn := NewSkycoinCreatedTransaction(*crtTxn) - return resultTxn, nil } diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index c05db816..419c52ba 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -1430,6 +1430,9 @@ func TestSkycoinSignServiceSign(t *testing.T) { txn, keyData, uxOuts, err := makeTransactionFromMultipleWallets(t, 3) require.NoError(t, err) + for _, ux := range uxOuts { + mockSkyApiUxOut(global_mock, ux) + } ins := make([]visor.TransactionInput, 0) for _, out := range uxOuts { @@ -1469,8 +1472,8 @@ func TestSkycoinSignServiceSign(t *testing.T) { pwdReader := func(message string) (string, error) { return "", nil } + //require.Equal(t, "AQUI", "FIRMANDO TODAS") signedTxn, err := signer.Sign(skyCreTxn, isds, pwdReader) - require.Equal(t, err.Error(), keyData) require.NoError(t, err) require.NotNil(t, signedTxn) diff --git a/src/util/sign.go b/src/util/sign.go index cd3d39d2..1dac17a5 100644 --- a/src/util/sign.go +++ b/src/util/sign.go @@ -25,12 +25,15 @@ func GenericMultiWalletSign(txn core.Transaction, signSpec []core.InputSignDescr groups[key] = append(inputs, descriptor.InputIndex) } signedTxn = txn + for signPair, indices := range groups { + signedTxn, err = signPair.wallet.Sign(signedTxn, signPair.signer, pwd, indices) if err != nil { logUtil.WithError(err).Errorf("Error signing inputs %v of wallet %v with signer %s", indices, signPair.wallet, string(signPair.signer)) return nil, err } + } return signedTxn, nil } From 1ada0f62c9f3858fe9bca644852f08ed830b5ce9 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Wed, 20 Nov 2019 17:03:29 -0500 Subject: [PATCH 23/69] [test] Add SkycoinUninjectedTransction test in sign txns with inputs from multiple wallets --- src/coin/skycoin/models/wallet_test.go | 49 ++++++++++++++++++-------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index 419c52ba..dd2e0f46 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -1442,16 +1442,9 @@ func TestSkycoinSignServiceSign(t *testing.T) { ins = append(ins, in) } - //SkycoinCreatedTransaction - sigs := txn.Sigs - txn.Sigs = []cipher.Sig{} - apiCreTxn, err := api.NewCreatedTransaction(&txn, ins) - txn.Sigs = sigs - apiCreTxn.Sigs = make([]string, 0) - require.NoError(t, err) - require.NotNil(t, apiCreTxn) - require.Equal(t, apiCreTxn.InnerHash, txn.HashInner().Hex()) - skyCreTxn := NewSkycoinCreatedTransaction(*apiCreTxn) + pwdReader := func(message string) (string, error) { + return "", nil + } signer := makeSkycoinSignService(t) wallets := makeLocalWalletsFromKeyData(t, keyData) @@ -1469,12 +1462,40 @@ func TestSkycoinSignServiceSign(t *testing.T) { } - pwdReader := func(message string) (string, error) { - return "", nil - } - //require.Equal(t, "AQUI", "FIRMANDO TODAS") + //SkycoinCreatedTransaction + sigs := txn.Sigs + txn.Sigs = []cipher.Sig{} + apiCreTxn, err := api.NewCreatedTransaction(&txn, ins) + txn.Sigs = sigs + apiCreTxn.Sigs = make([]string, 0) + require.NoError(t, err) + 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 + sigs = txn.Sigs + txn.Sigs = []cipher.Sig{} + skyUninTxn := SkycoinUninjectedTransaction{ + txn: &txn, + fee: 300, + } + + signedTxn = nil + + signedTxn, err = signer.Sign(&skyUninTxn, isds, pwdReader) + require.NoError(t, err) + require.NotNil(t, signedTxn) + + signed, err := signedTxn.IsFullySigned() + require.NoError(t, err) + require.Equal(t, true, signed) } From ae9308222fefc79a1e3be33ff7c626d7ed5cbf2f Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Wed, 20 Nov 2019 17:44:18 -0500 Subject: [PATCH 24/69] [models] Add signer property to walletManager --- src/models/walletsManager.go | 64 ++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index 63726737..3a5d72f5 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -29,29 +29,31 @@ type WalletManager struct { addresseseByWallets map[string][]*QAddress outputsByAddress map[string][]*QOutput altManager core.AltcoinManager - _ func() `slot:"updateWalletEnvs"` - _ func(wltId, address string) `slot:"updateOutputs"` - _ func(string) `slot:"updateAddresses"` - _ func() `slot:"updateWallets"` - _ func() `constructor:"init"` - _ func(seed string, label string, password string, scanN int) *QWallet `slot:"createEncryptedWallet"` - _ func(seed string, label string, scanN int) *QWallet `slot:"createUnencryptedWallet"` - _ func(entropy int) string `slot:"getNewSeed"` - _ func(seed string) int `slot:"verifySeed"` - _ func(id string, n int, password string) `slot:"newWalletAddress"` - _ func(id string, password string) int `slot:"encryptWallet"` - _ func(id string, password string) int `slot:"decryptWallet"` - _ func() []*QWallet `slot:"getWallets"` - _ func(id string) []*QAddress `slot:"getAddresses"` - _ func(id string, source string, password string, index []int, qTxn *QTransaction) *QTransaction `slot:"signTxn"` - _ func(wltId string, destinationAddress string, amount string) *QTransaction `slot:"sendTo"` - _ func(id, label string) *QWallet `slot:"editWallet"` - _ func(wltId, address string) []*QOutput `slot:"getOutputs"` - _ func(txn *QTransaction) bool `slot:"broadcastTxn"` - _ func(wltId string, from, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction `slot:"sendFromAddresses"` - _ func(wltId string, outs, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction `slot:"sendFromOutputs"` - _ func() []*QAddress `slot:"getAllAddresses"` - _ func(wltId string) []*QOutput `slot:"getOutputsFromWallet"` + signer core.BlockchainSignService + + _ func() `slot:"updateWalletEnvs"` + _ func(wltId, address string) `slot:"updateOutputs"` + _ func(string) `slot:"updateAddresses"` + _ func() `slot:"updateWallets"` + _ func() `constructor:"init"` + _ func(seed string, label string, password string, scanN int) *QWallet `slot:"createEncryptedWallet"` + _ func(seed string, label string, scanN int) *QWallet `slot:"createUnencryptedWallet"` + _ func(entropy int) string `slot:"getNewSeed"` + _ func(seed string) int `slot:"verifySeed"` + _ func(id string, n int, password string) `slot:"newWalletAddress"` + _ func(id string, password string) int `slot:"encryptWallet"` + _ func(id string, password string) int `slot:"decryptWallet"` + _ func() []*QWallet `slot:"getWallets"` + _ func(id string) []*QAddress `slot:"getAddresses"` + _ func(id string, source string, password string, index []int, qTxn *QTransaction) *QTransaction `slot:"signTxn"` + _ func(wltId string, destinationAddress string, amount string) *QTransaction `slot:"sendTo"` + _ func(id, label string) *QWallet `slot:"editWallet"` + _ func(wltId, address string) []*QOutput `slot:"getOutputs"` + _ func(txn *QTransaction) bool `slot:"broadcastTxn"` + _ func(wltId string, from, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction `slot:"sendFromAddresses"` + _ func(wltId string, outs, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction `slot:"sendFromOutputs"` + _ func() []*QAddress `slot:"getAllAddresses"` + _ func(wltId string) []*QOutput `slot:"getOutputsFromWallet"` } func (walletM *WalletManager) init() { @@ -83,7 +85,6 @@ func (walletM *WalletManager) init() { walletM.addresseseByWallets = make(map[string][]*QAddress, 0) walletM.outputsByAddress = make(map[string][]*QOutput, 0) walletM.altManager = core.LoadAltcoinManager() - walletM.SeedGenerator = new(sky.SeedService) walletManager = walletM walletM.updateWalletEnvs() @@ -106,6 +107,21 @@ func GetWalletEnv() core.WalletEnv { func GetWalletManager() *WalletManager { return walletManager } + +func (walletM *WalletManager) updateSigner() { + logWalletManager.Info("Updating Signers") + signers := make([]core.BlockchainSignService, 0) + + for _, plug := range walletM.altManager.ListRegisteredPlugins() { + sing, err := plug.LoadSignService() + if err != nil { + logWalletManager.Errorf("Error loading signer from %s plugin", plug.GetName()) + } + signers = append(signers, sing) + } + + walletM.signer = signers[0] +} func (walletM *WalletManager) updateWalletEnvs() { logWalletManager.Info("Updating WalletEnvs") walletsEnvs := make([]core.WalletEnv, 0) From b47b2c9ebbdc7d5af480a0cc84afc16d71f5001d Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Thu, 21 Nov 2019 10:26:16 -0500 Subject: [PATCH 25/69] [models] Add TransactionAPI field to walletManger and updateTransactionAPI method for loading it --- src/coin/skycoin/models/wallet.go | 2 -- src/models/walletsManager.go | 18 +++++++++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index c518cdc3..8ad4afc4 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -1087,8 +1087,6 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe rTxn, isReadableTxn := txn.(skytypes.ReadableTxn) if isReadableTxn { // Readable tranasctions should not need extra API calls - //TO DELETE - logWallet.WithError(err).Warn("GOODDD") cTxn, err := rTxn.ToCreatedTransaction() originalInputs = cTxn.In diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index 3a5d72f5..a1c56000 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -30,6 +30,7 @@ type WalletManager struct { outputsByAddress map[string][]*QOutput altManager core.AltcoinManager signer core.BlockchainSignService + transactionAPI core.BlockchainTransactionAPI _ func() `slot:"updateWalletEnvs"` _ func(wltId, address string) `slot:"updateOutputs"` @@ -88,6 +89,8 @@ func (walletM *WalletManager) init() { walletM.SeedGenerator = new(sky.SeedService) walletManager = walletM walletM.updateWalletEnvs() + walletM.updateSigner() + walletM.updateTransactionAPI() }) walletM = walletManager @@ -115,13 +118,26 @@ func (walletM *WalletManager) updateSigner() { for _, plug := range walletM.altManager.ListRegisteredPlugins() { sing, err := plug.LoadSignService() if err != nil { - logWalletManager.Errorf("Error loading signer from %s plugin", plug.GetName()) + logWalletManager.WithError(err).Errorf("Error loading signer from %s plugin", plug.GetName()) } signers = append(signers, sing) } walletM.signer = signers[0] } + +func (walletM *WalletManager) updateTransactionAPI() { + logWalletManager.Info("Updating TransactionAPI") + txnAPIS := make([]core.BlockchainTransactionAPI, 0) + + for _, plug := range walletM.altManager.ListRegisteredPlugins() { + txnAPI, err := plug.LoadTransactionAPI() + if err != nil { + logWalletManager.WithError(err).Errorf("Error loading transaction API from %s plugin", plug.GetName()) + } + txnAPIS = append(txnAPIS, txnAPI) + } +} func (walletM *WalletManager) updateWalletEnvs() { logWalletManager.Info("Updating WalletEnvs") walletsEnvs := make([]core.WalletEnv, 0) From c3bf228078a7ddbb7dc2c523fcd25c72243504e5 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Thu, 21 Nov 2019 10:27:16 -0500 Subject: [PATCH 26/69] [models] Asign value to walletManager.TransactionAPI --- src/models/walletsManager.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index a1c56000..02ffa651 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -137,6 +137,8 @@ func (walletM *WalletManager) updateTransactionAPI() { } txnAPIS = append(txnAPIS, txnAPI) } + + walletM.transactionAPI = txnAPIS[0] } func (walletM *WalletManager) updateWalletEnvs() { logWalletManager.Info("Updating WalletEnvs") From 8b6f52ad17bf0bc32e1903295be316a21797b94a Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Thu, 21 Nov 2019 11:48:24 -0500 Subject: [PATCH 27/69] [models] Change walletManger methods SendFromAddresses and SendFromOutputs signature, modify QML to call these methods correctly --- src/models/walletsManager.go | 56 +++++++++++++++++----------------- src/ui/PageSend.qml | 18 +++++------ src/ui/SubPageSendAdvanced.qml | 25 +++++++++++---- 3 files changed, 56 insertions(+), 43 deletions(-) diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index 02ffa651..0f2df5f2 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -32,29 +32,29 @@ type WalletManager struct { signer core.BlockchainSignService transactionAPI core.BlockchainTransactionAPI - _ func() `slot:"updateWalletEnvs"` - _ func(wltId, address string) `slot:"updateOutputs"` - _ func(string) `slot:"updateAddresses"` - _ func() `slot:"updateWallets"` - _ func() `constructor:"init"` - _ func(seed string, label string, password string, scanN int) *QWallet `slot:"createEncryptedWallet"` - _ func(seed string, label string, scanN int) *QWallet `slot:"createUnencryptedWallet"` - _ func(entropy int) string `slot:"getNewSeed"` - _ func(seed string) int `slot:"verifySeed"` - _ func(id string, n int, password string) `slot:"newWalletAddress"` - _ func(id string, password string) int `slot:"encryptWallet"` - _ func(id string, password string) int `slot:"decryptWallet"` - _ func() []*QWallet `slot:"getWallets"` - _ func(id string) []*QAddress `slot:"getAddresses"` - _ func(id string, source string, password string, index []int, qTxn *QTransaction) *QTransaction `slot:"signTxn"` - _ func(wltId string, destinationAddress string, amount string) *QTransaction `slot:"sendTo"` - _ func(id, label string) *QWallet `slot:"editWallet"` - _ func(wltId, address string) []*QOutput `slot:"getOutputs"` - _ func(txn *QTransaction) bool `slot:"broadcastTxn"` - _ func(wltId string, from, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction `slot:"sendFromAddresses"` - _ func(wltId string, outs, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction `slot:"sendFromOutputs"` - _ func() []*QAddress `slot:"getAllAddresses"` - _ func(wltId string) []*QOutput `slot:"getOutputsFromWallet"` + _ func() `slot:"updateWalletEnvs"` + _ func(wltId, address string) `slot:"updateOutputs"` + _ func(string) `slot:"updateAddresses"` + _ func() `slot:"updateWallets"` + _ func() `constructor:"init"` + _ func(seed string, label string, password string, scanN int) *QWallet `slot:"createEncryptedWallet"` + _ func(seed string, label string, scanN int) *QWallet `slot:"createUnencryptedWallet"` + _ func(entropy int) string `slot:"getNewSeed"` + _ func(seed string) int `slot:"verifySeed"` + _ func(id string, n int, password string) `slot:"newWalletAddress"` + _ func(id string, password string) int `slot:"encryptWallet"` + _ func(id string, password string) int `slot:"decryptWallet"` + _ func() []*QWallet `slot:"getWallets"` + _ func(id string) []*QAddress `slot:"getAddresses"` + _ func(id string, source string, password string, index []int, qTxn *QTransaction) *QTransaction `slot:"signTxn"` + _ func(wltId string, destinationAddress string, amount string) *QTransaction `slot:"sendTo"` + _ func(id, label string) *QWallet `slot:"editWallet"` + _ func(wltId, address string) []*QOutput `slot:"getOutputs"` + _ func(txn *QTransaction) bool `slot:"broadcastTxn"` + _ func(wltIds, from, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction `slot:"sendFromAddresses"` + _ func(wltIds, outs, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction `slot:"sendFromOutputs"` + _ func() []*QAddress `slot:"getAllAddresses"` + _ func(wltId string) []*QOutput `slot:"getOutputsFromWallet"` } func (walletM *WalletManager) init() { @@ -131,7 +131,7 @@ func (walletM *WalletManager) updateTransactionAPI() { txnAPIS := make([]core.BlockchainTransactionAPI, 0) for _, plug := range walletM.altManager.ListRegisteredPlugins() { - txnAPI, err := plug.LoadTransactionAPI() + txnAPI, err := plug.LoadTransactionAPI("MainNet") if err != nil { logWalletManager.WithError(err).Errorf("Error loading transaction API from %s plugin", plug.GetName()) } @@ -323,9 +323,9 @@ func (walletM *WalletManager) broadcastTxn(txn *QTransaction) bool { return true } -func (walletM *WalletManager) sendFromOutputs(wltId string, from, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction { +func (walletM *WalletManager) sendFromOutputs(wltIds []string, from, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction { logWalletManager.Info("Creating transaction") - wlt := walletM.WalletEnv.GetWalletSet().GetWallet(wltId) + wlt := walletM.WalletEnv.GetWalletSet().GetWallet(wltIds[0]) if wlt == nil { logWalletManager.Warn("Couldn't load wallet to create transaction") return nil @@ -380,8 +380,8 @@ func (walletM *WalletManager) sendFromOutputs(wltId string, from, addrTo, skyTo, } return qTransaction } -func (walletM *WalletManager) sendFromAddresses(wltId string, from, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction { - wlt := walletM.WalletEnv.GetWalletSet().GetWallet(wltId) +func (walletM *WalletManager) sendFromAddresses(wltIds []string, from, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction { + wlt := walletM.WalletEnv.GetWalletSet().GetWallet(wltIds[0]) if wlt == nil { logWalletManager.Warn("Couldn't load wallet to create transaction") return nil diff --git a/src/ui/PageSend.qml b/src/ui/PageSend.qml index da60bc82..f1c3694d 100644 --- a/src/ui/PageSend.qml +++ b/src/ui/PageSend.qml @@ -35,23 +35,23 @@ Page { var isEncrypted var walletSelected + var walletSelecteds if (advancedMode){ - var outs = stackView.currentItem.advancedPage.getSelectedOutputs() - var addrs = stackView.currentItem.advancedPage.getSelectedAddresses() - walletSelected = stackView.currentItem.advancedPage.getSelectedWallet()[0] + var outs = stackView.currentItem.advancedPage.getSelectedOutputsWithWallets() + var addrs = stackView.currentItem.advancedPage.getSelectedAddressesWithWallets() + //walletSelecteds = stackView.currentItem.advancedPage.getSelectedWallet() var destinationSummary = stackView.currentItem.advancedPage.getDestinationsSummary() var changeAddress = stackView.currentItem.advancedPage.getChangeAddress() var automaticCoinHours = stackView.currentItem.advancedPage.getAutomaticCoinHours() var burnFactor = stackView.currentItem.advancedPage.getBurnFactor() - if (outs.length > 0){ + if (outs[0].length > 0){ console.log(outs) - txn = walletManager.sendFromOutputs(walletSelected, outs, destinationSummary[0], destinationSummary[1], destinationSummary[2], changeAddress, automaticCoinHours, burnFactor) + txn = walletManager.sendFromOutputs(outs[1], outs[0], destinationSummary[0], destinationSummary[1], destinationSummary[2], changeAddress, automaticCoinHours, burnFactor) } else { - if (addrs.length == 0){ - addrs = stackView.currentItem.advancedPage.getAllAddresses() - + if (addrs[0].length == 0){ + addrs = stackView.currentItem.advancedPage.getAllAddressesWithWallets() } - txn = walletManager.sendFromAddresses(walletSelected, addrs, destinationSummary[0], destinationSummary[1], destinationSummary[2], changeAddress, automaticCoinHours, burnFactor) + txn = walletManager.sendFromAddresses(addrs[1], addrs[0], destinationSummary[0], destinationSummary[1], destinationSummary[2], changeAddress, automaticCoinHours, burnFactor) } isEncrypted = stackView.currentItem.advancedPage.walletIsEncrypted()[0] diff --git a/src/ui/SubPageSendAdvanced.qml b/src/ui/SubPageSendAdvanced.qml index b2112c9a..97197901 100644 --- a/src/ui/SubPageSendAdvanced.qml +++ b/src/ui/SubPageSendAdvanced.qml @@ -15,20 +15,29 @@ import "Controls" // For quick UI development, switch back to resources when mak Page { id: subPageSendAdvanced - function getSelectedAddresses(){ + + function getSelectedAddressesWithWallets(){ var indexs = comboBoxWalletsAddressesSendFrom.getCheckedDelegates() var addresses = [] + addresses.push([]) + addresses.push([]) for (var i =0;i< indexs.length; i++){ - addresses.push(comboBoxWalletsAddressesSendFrom.model.addresses[indexs[i]].address) + addresses[0].push(comboBoxWalletsAddressesSendFrom.model.addresses[indexs[i]].address) + addresses[1].push(comboBoxWalletsAddressesSendFrom.model.addresses[indexs[i]].walletId) + //addresses.push(comboBoxWalletsAddressesSendFrom.model.addresses[indexs[i]].address) } return addresses } - function getSelectedOutputs(){ + function getSelectedOutputsWithWallets(){ var indexs = comboBoxWalletsUnspentOutputsSendFrom.getCheckedDelegates() var outputs = [] + outputs.push([]) + outputs.push([]) for (var i =0;i< indexs.length; i++){ - outputs.push(comboBoxWalletsUnspentOutputsSendFrom.model.outputs[indexs[i]].outputID) + outputs[0].push(comboBoxWalletsUnspentOutputsSendFrom.model.outputs[indexs[i]].outputID) + outputs[1].push(comboBoxWalletsUnspentOutputsSendFrom.model.outputs[indexs[i]].walletOwner) + //outputs.push(comboBoxWalletsUnspentOutputsSendFrom.model.outputs[indexs[i]].outputID) } return outputs } @@ -75,10 +84,14 @@ Page { return sliderCoinHoursShareFactor.value } - function getAllAddresses(){ + function getAllAddressesWithWallets(){ var addrs = [] + addrs.push([]) + addrs.push([]) for (var i = 0; i < listAddresses.count; i++){ - addrs.push(listAddresses.addresses[i].address) + addrs[0].push(listAddresses.addresses[i].address) + addrs[1].push(listAddresses.addresses[i].walletId) + //addrs.push(listAddresses.addresses[i].address) } return addrs } From 09e261e8fad9543f28c20e4acd4b273bca8c6a32 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Thu, 21 Nov 2019 01:10:42 -0500 Subject: [PATCH 28/69] [models] Change walletManager::SendFromAddresses method to work for txn spending outputs from multiple wallets --- src/models/walletsManager.go | 37 +++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index 0f2df5f2..a30f67ba 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -381,11 +381,21 @@ func (walletM *WalletManager) sendFromOutputs(wltIds []string, from, addrTo, sky return qTransaction } func (walletM *WalletManager) sendFromAddresses(wltIds []string, from, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction { - wlt := walletM.WalletEnv.GetWalletSet().GetWallet(wltIds[0]) - if wlt == nil { - logWalletManager.Warn("Couldn't load wallet to create transaction") - return nil + wltCache := make(map[string]core.Wallet, 0) + wlts := make([]core.Wallet, 0) + for _, wltId := range wltIds { + var wlt core.Wallet + wlt, exist := wltCache[wltId] + if !exist { + wlt = walletM.WalletEnv.GetWalletSet().GetWallet(wltId) + if wlt == nil { + logWalletManager.Warn("Couldn't load wallet to create transaction") + return nil + } + } + wlts = append(wlts, wlt) } + addrsFrom := make([]core.Address, 0) for _, addr := range from { @@ -402,13 +412,13 @@ func (walletM *WalletManager) sendFromAddresses(wltIds []string, from, addrTo, s // FIXME: Remove explicit reference to Skycoin err := out.PushCoins(sky.Sky, skyTo[i]) if err != nil { - logWalletManager.WithError(err).Warn("Error parsing value for %s", sky.Sky) + logWalletManager.WithError(err).Warnf("Error parsing value for %s", sky.Sky) return nil } // FIXME: Remove explicit reference to Skycoin err = out.PushCoins(sky.CoinHour, ch) if err != nil { - logWalletManager.WithError(err).Warn("Error parsing value for %s", sky.Sky) + logWalletManager.WithError(err).Warnf("Error parsing value for %s", sky.Sky) return nil } outputsTo = append(outputsTo, &out) @@ -422,8 +432,21 @@ func (walletM *WalletManager) sendFromAddresses(wltIds []string, from, addrTo, s } else { opt.SetValue("CoinHoursSelectionType", "manual") } + var txn core.Transaction + var err error + if len(wltCache) > 1 { + walletsAddresses := make([]core.WalletAddress, 0) + for i, wlt := range wlts { + walletsAddresses = append(walletsAddresses, &util.SimpleWalletAddress{ + Wallet: wlt, + UxOut: addrsFrom[i], + }) + } + txn, err = walletM.transactionAPI.SendFromAddress(walletsAddresses, outputsTo, changeAddr, opt) + } else { + txn, err = wlts[0].SendFromAddress(addrsFrom, outputsTo, changeAddr, opt) + } - txn, err := wlt.SendFromAddress(addrsFrom, outputsTo, changeAddr, opt) if err != nil { logWalletManager.WithError(err).Info("Error creating transaction") return nil From c4a82cd4d330b4be535591a54a981a9e82c62c0b Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Thu, 21 Nov 2019 01:19:14 -0500 Subject: [PATCH 29/69] [models] Change walletManager::sendFromOutputs to work for txns spending outputs from multiple wallets --- src/models/walletsManager.go | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index a30f67ba..103be201 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -325,11 +325,21 @@ func (walletM *WalletManager) broadcastTxn(txn *QTransaction) bool { func (walletM *WalletManager) sendFromOutputs(wltIds []string, from, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction { logWalletManager.Info("Creating transaction") - wlt := walletM.WalletEnv.GetWalletSet().GetWallet(wltIds[0]) - if wlt == nil { - logWalletManager.Warn("Couldn't load wallet to create transaction") - return nil + wltCache := make(map[string]core.Wallet, 0) + wlts := make([]core.Wallet, 0) + for _, wltId := range wltIds { + var wlt core.Wallet + wlt, exist := wltCache[wltId] + if !exist { + wlt = walletM.WalletEnv.GetWalletSet().GetWallet(wltId) + if wlt == nil { + logWalletManager.Warn("Couldn't load wallet to create transaction") + return nil + } + } + wlts = append(wlts, wlt) } + outputsFrom := make([]core.TransactionOutput, 0) for _, outAddr := range from { addr := util.NewGenericAddress(outAddr) @@ -366,8 +376,21 @@ func (walletM *WalletManager) sendFromOutputs(wltIds []string, from, addrTo, sky } else { opt.SetValue("CoinHoursSelectionType", "manual") } + var txn core.Transaction + var err error + if len(wltCache) > 1 { + walletsOutputs := make([]core.WalletOutput, 0) + for i, wlt := range wlts { + walletsOutputs = append(walletsOutputs, &util.SimpleWalletOutput{ + Wallet: wlt, + UxOut: outputsFrom[i], + }) + } + txn, err = walletM.transactionAPI.Spend(walletsOutputs, outputsTo, &changeAddr, opt) + } else { + txn, err = wlts[0].Spend(outputsFrom, outputsTo, &changeAddr, opt) + } - txn, err := wlt.Spend(outputsFrom, outputsTo, &changeAddr, opt) if err != nil { logWalletManager.WithError(err).Info("Error creating transaction") return nil From 5e83eee553e30923bf09f1bcc178e7f9b20e27eb Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Thu, 21 Nov 2019 05:22:14 -0500 Subject: [PATCH 30/69] [models] Fixed logic error in signinTxn --- src/models/walletsManager.go | 62 ++++++++++++++++++++++++++++++------ src/ui/PageSend.qml | 6 ++-- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index 103be201..a1666c9d 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -4,6 +4,8 @@ import ( "fmt" "sync" + "github.com/davecgh/go-spew/spew" + "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" "github.com/fibercrypto/FiberCryptoWallet/src/util" @@ -46,7 +48,7 @@ type WalletManager struct { _ func(id string, password string) int `slot:"decryptWallet"` _ func() []*QWallet `slot:"getWallets"` _ func(id string) []*QAddress `slot:"getAddresses"` - _ func(id string, source string, password string, index []int, qTxn *QTransaction) *QTransaction `slot:"signTxn"` + _ func(wltIds, addresses []string, source string, password string, index []int, qTxn *QTransaction) *QTransaction `slot:"signTxn"` _ func(wltId string, destinationAddress string, amount string) *QTransaction `slot:"sendTo"` _ func(id, label string) *QWallet `slot:"editWallet"` _ func(wltId, address string) []*QOutput `slot:"getOutputs"` @@ -404,6 +406,7 @@ func (walletM *WalletManager) sendFromOutputs(wltIds []string, from, addrTo, sky return qTransaction } func (walletM *WalletManager) sendFromAddresses(wltIds []string, from, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction { + fmt.Printf("WLTS %v\n", wltIds) wltCache := make(map[string]core.Wallet, 0) wlts := make([]core.Wallet, 0) for _, wltId := range wltIds { @@ -415,10 +418,12 @@ func (walletM *WalletManager) sendFromAddresses(wltIds []string, from, addrTo, s logWalletManager.Warn("Couldn't load wallet to create transaction") return nil } + wltCache[wltId] = wlt } wlts = append(wlts, wlt) } - + spew.Dump(wltCache) + fmt.Println(wlts) addrsFrom := make([]core.Address, 0) for _, addr := range from { @@ -465,8 +470,10 @@ func (walletM *WalletManager) sendFromAddresses(wltIds []string, from, addrTo, s UxOut: addrsFrom[i], }) } + fmt.Println("MULTIPLE TRANSACTION") txn, err = walletM.transactionAPI.SendFromAddress(walletsAddresses, outputsTo, changeAddr, opt) } else { + fmt.Println("SINGLE TRANSACTION") txn, err = wlts[0].SendFromAddress(addrsFrom, outputsTo, changeAddr, opt) } @@ -541,17 +548,54 @@ func (walletM *WalletManager) sendTo(wltId, destinationAddress, amount string) * } -func (walletM *WalletManager) signTxn(id, source, password string, index []int, qTxn *QTransaction) *QTransaction { +func (walletM *WalletManager) signTxn(wltIds, address []string, source, password string, index []int, qTxn *QTransaction) *QTransaction { logWalletManager.Info("Signig transaction") - // Get wallet - wlt := walletM.WalletEnv.GetWalletSet().GetWallet(id) - if wlt == nil { - logWalletManager.Warn("Couldn't load wallet to Sign transaction") + + if len(wltIds) != len(address) { + logWalletManager.Error("Wallets and addresses provided are incorrect") return nil } - txn, err := wlt.Sign(qTxn.txn, core.UID(source), func(message string) (string, error) { + + wltCache := make(map[string]core.Wallet) + wltByAddr := make(map[string]core.Wallet) + wlts := make([]core.Wallet, 0) + + pwd := func(message string) (string, error) { return password, nil - }, nil) // TODO Get index for sign specific txn indexes + } + + for i, wltId := range wltIds { + var wlt core.Wallet + wlt, exist := wltCache[wltId] + if !exist { + wlt = walletM.WalletEnv.GetWalletSet().GetWallet(wltId) + if wlt == nil { + logWalletManager.Warn("Couldn't load wallet to Sign transaction") + return nil + } + wltCache[wltId] = wlt + } + wltByAddr[address[i]] = wlt + wlts = append(wlts, wlt) + } + + var txn core.Transaction + var err error + if len(wltCache) > 1 { + signDescriptors := make([]core.InputSignDescriptor, 0) + for _, in := range qTxn.txn.GetInputs() { + sd := core.InputSignDescriptor{ + InputIndex: in.GetId(), + SignerID: core.UID(source), + Wallet: wltByAddr[in.GetSpentOutput().GetAddress().String()], + } + signDescriptors = append(signDescriptors, sd) + } + txn, err = walletM.signer.Sign(qTxn.txn, signDescriptors, pwd) + } else { + txn, err = wlts[0].Sign(qTxn.txn, core.UID(source), pwd, nil) + } + if err != nil { logWalletManager.WithError(err).Warn("Error signing txn") return nil diff --git a/src/ui/PageSend.qml b/src/ui/PageSend.qml index f1c3694d..8f8fae29 100644 --- a/src/ui/PageSend.qml +++ b/src/ui/PageSend.qml @@ -70,7 +70,7 @@ Page { dialogSendTransaction.previewtransactionID = txn.transactionId dialogSendTransaction.inputs = txn.inputs dialogSendTransaction.outputs = txn.outputs - dialogSendTransaction.wallet = walletSelected + dialogSendTransaction.walletsAddresses = addrs dialogSendTransaction.open() @@ -168,7 +168,7 @@ Page { DialogSendTransaction { id: dialogSendTransaction anchors.centerIn: Overlay.overlay - property string wallet + property var walletsAddresses readonly property real maxHeight: (expanded ? 490 : 340) + (showPasswordField ? 140 : 0) width: applicationWindow.width > 640 ? 640 - 40 : applicationWindow.width - 40 height: applicationWindow.height > maxHeight ? maxHeight - 40 : applicationWindow.height - 40 @@ -177,7 +177,7 @@ Page { modal: true focus: true onAccepted: { - var signedTxn = walletManager.signTxn(wallet,"", dialogSendTransaction.passwordText, [], txn) + var signedTxn = walletManager.signTxn(walletsAddresses[1], walletsAddresses[0],"", dialogSendTransaction.passwordText, [], txn) var injected = walletManager.broadcastTxn(signedTxn) } } From 451a1f4a1ffe4182114af9ad98a6440f58ccf998 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Thu, 21 Nov 2019 06:27:47 -0500 Subject: [PATCH 31/69] [models] Fix error creating genericOutputs in walletManager::sendFromOutputs --- src/models/walletsManager.go | 12 +++++++----- src/ui/PageSend.qml | 5 +++++ src/util/coin.go | 6 ++++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index a1666c9d..69cde2d5 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -338,14 +338,14 @@ func (walletM *WalletManager) sendFromOutputs(wltIds []string, from, addrTo, sky logWalletManager.Warn("Couldn't load wallet to create transaction") return nil } + wltCache[wltId] = wlt } wlts = append(wlts, wlt) } outputsFrom := make([]core.TransactionOutput, 0) for _, outAddr := range from { - addr := util.NewGenericAddress(outAddr) - out := util.NewGenericOutput(&addr) + out := util.NewGenericOutput(nil, outAddr) outputsFrom = append(outputsFrom, &out) } outputsTo := make([]core.TransactionOutput, 0) @@ -355,7 +355,7 @@ func (walletM *WalletManager) sendFromOutputs(wltIds []string, from, addrTo, sky ch = coinHoursTo[i] } addr := util.NewGenericAddress(addrTo[i]) - out := util.NewGenericOutput(&addr) + out := util.NewGenericOutput(&addr, "") // FIXME: Remove explicit reference to Skycoin err := out.PushCoins(sky.Sky, skyTo[i]) if err != nil { @@ -381,6 +381,7 @@ func (walletM *WalletManager) sendFromOutputs(wltIds []string, from, addrTo, sky var txn core.Transaction var err error if len(wltCache) > 1 { + fmt.Println("MULTI TXN") walletsOutputs := make([]core.WalletOutput, 0) for i, wlt := range wlts { walletsOutputs = append(walletsOutputs, &util.SimpleWalletOutput{ @@ -390,6 +391,7 @@ func (walletM *WalletManager) sendFromOutputs(wltIds []string, from, addrTo, sky } txn, err = walletM.transactionAPI.Spend(walletsOutputs, outputsTo, &changeAddr, opt) } else { + fmt.Println("SIMPLE TXN") txn, err = wlts[0].Spend(outputsFrom, outputsTo, &changeAddr, opt) } @@ -436,7 +438,7 @@ func (walletM *WalletManager) sendFromAddresses(wltIds []string, from, addrTo, s ch = coinHoursTo[i] } addr := util.NewGenericAddress(addrTo[i]) - out := util.NewGenericOutput(&addr) + out := util.NewGenericOutput(&addr, "") // FIXME: Remove explicit reference to Skycoin err := out.PushCoins(sky.Sky, skyTo[i]) if err != nil { @@ -526,7 +528,7 @@ func (walletM *WalletManager) sendTo(wltId, destinationAddress, amount string) * logWalletManager.Warn("Couldn't load wallet to create transaction") return nil } - txOut := util.NewGenericOutput(&addr) + txOut := util.NewGenericOutput(&addr, "") // FIXME: Remove explicit reference to Skycoin err := txOut.PushCoins(sky.Sky, amount) if err != nil { diff --git a/src/ui/PageSend.qml b/src/ui/PageSend.qml index 8f8fae29..2b4f7350 100644 --- a/src/ui/PageSend.qml +++ b/src/ui/PageSend.qml @@ -58,6 +58,11 @@ Page { } else{ walletSelected = stackView.currentItem.simplePage.getSelectedWallet() isEncrypted = stackView.currentItem.simplePage.walletIsEncrypted() + var addrs = [] + addrs.push([]) + addrs.push([]) + addrs[0].push(stackView.currentItem.simplePage.getDestinationAddress()) + addrs[1].push(walletSelected) txn = walletManager.sendTo(walletSelected, stackView.currentItem.simplePage.getDestinationAddress(), stackView.currentItem.simplePage.getAmount()) } console.log("HT "+txn.hoursTraspassed) diff --git a/src/util/coin.go b/src/util/coin.go index d0ad9dd2..c29baf12 100644 --- a/src/util/coin.go +++ b/src/util/coin.go @@ -5,9 +5,10 @@ import ( "github.com/fibercrypto/FiberCryptoWallet/src/errors" ) -func NewGenericOutput(addr core.Address) GenericOutput { +func NewGenericOutput(addr core.Address, id string) GenericOutput { return GenericOutput{ Address: addr, + id: id, Balance: make(map[string]uint64), } } @@ -16,11 +17,12 @@ func NewGenericOutput(addr core.Address) GenericOutput { type GenericOutput struct { Address core.Address Balance map[string]uint64 + id string } // GetId provides transaction output ID func (gOut *GenericOutput) GetId() string { - return "" + return gOut.id } // IsSpent determines whether there exists a confirmed transaction with an input spending this output From dafa926cb24892214b6575ddf12f93c924cda837 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 22 Nov 2019 15:49:12 -0500 Subject: [PATCH 32/69] [ci] refs #234 - In Github feature template merge implementation and description sections --- .github/ISSUE_TEMPLATE/feature_request.md | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 1693fa13..8855a2c8 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -7,26 +7,21 @@ assignees: '' --- -**Feature description** - -Describe the feature - **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context about the problem here. - -**Possible implementation** Preliminary ideas to get this done. If you have all details in mind then provide a checklist - [ ] Start with ... - [ ] When done do ... - [ ] Finally ... + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context about the problem here. From e18301bcbd5e89c9e43a62b8ae6027c847b2fb66 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 22 Nov 2019 16:49:06 -0500 Subject: [PATCH 33/69] [util] refs #150 - Lookup signer by ID in GenericMultiWalletSign --- src/util/sign.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/util/sign.go b/src/util/sign.go index f707f480..0b7f9c54 100644 --- a/src/util/sign.go +++ b/src/util/sign.go @@ -4,6 +4,7 @@ import ( "github.com/fibercrypto/FiberCryptoWallet/src/core" "github.com/fibercrypto/FiberCryptoWallet/src/errors" local "github.com/fibercrypto/FiberCryptoWallet/src/main" + "github.com/fibercrypto/FiberCryptoWallet/src/util" ) // AttachSignService registers a signing strategy for use by wallets @@ -86,7 +87,12 @@ func GenericMultiWalletSign(txn core.Transaction, signSpec []core.InputSignDescr for signPair, indices := range groups { - signedTxn, err = signPair.wallet.Sign(signedTxn, signPair.signer, pwd, indices) + signer := util.LookupSignService(signPair.signer) + if signer == nil { + logUtil.WithError(errors.ErrInvalidID).Errorf("Unknown signer %s specified for signing inputs %v of wallet %v", string(signPair.signer), indices, signPair.wallet) + return nil, errors.ErrInvalidID + } + signedTxn, err = signPair.wallet.Sign(signedTxn, signer, pwd, indices) if err != nil { logUtil.WithError(err).Errorf("Error signing inputs %v of wallet %v with signer %s", indices, signPair.wallet, string(signPair.signer)) return nil, err @@ -95,5 +101,3 @@ func GenericMultiWalletSign(txn core.Transaction, signSpec []core.InputSignDescr } return signedTxn, nil } - - From b17d0890d72b60d42841f4212a007f3a2180345e Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 22 Nov 2019 16:50:41 -0500 Subject: [PATCH 34/69] [util] refs #150 - Break import cycle in util package --- src/util/sign.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/util/sign.go b/src/util/sign.go index 0b7f9c54..a5ede9ed 100644 --- a/src/util/sign.go +++ b/src/util/sign.go @@ -4,7 +4,6 @@ import ( "github.com/fibercrypto/FiberCryptoWallet/src/core" "github.com/fibercrypto/FiberCryptoWallet/src/errors" local "github.com/fibercrypto/FiberCryptoWallet/src/main" - "github.com/fibercrypto/FiberCryptoWallet/src/util" ) // AttachSignService registers a signing strategy for use by wallets @@ -87,7 +86,7 @@ func GenericMultiWalletSign(txn core.Transaction, signSpec []core.InputSignDescr for signPair, indices := range groups { - signer := util.LookupSignService(signPair.signer) + signer := LookupSignService(signPair.signer) if signer == nil { logUtil.WithError(errors.ErrInvalidID).Errorf("Unknown signer %s specified for signing inputs %v of wallet %v", string(signPair.signer), indices, signPair.wallet) return nil, errors.ErrInvalidID From 9eb8bdac9f74bd454ccd0d3b07ca361670d2ce0a Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 22 Nov 2019 18:03:51 -0500 Subject: [PATCH 35/69] [sky] [errors] [util] refs #150 - Fix tests after merge - Lookup signer by UID during multi-wallet signing - Fallback to wallet if signer ID is empty - Fail if wallet can not sign transactions (e.g. distribution wallets) - Update test cases after changes for #234 in #254 --- src/coin/skycoin/models/sky_test.go | 7 +++++++ src/coin/skycoin/models/wallet_test.go | 20 ++++++++++---------- src/errors/error.go | 2 ++ src/util/sign.go | 12 +++++++++++- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/coin/skycoin/models/sky_test.go b/src/coin/skycoin/models/sky_test.go index 3c57fb86..41e30397 100644 --- a/src/coin/skycoin/models/sky_test.go +++ b/src/coin/skycoin/models/sky_test.go @@ -1,5 +1,12 @@ package skycoin +/** + * This file contains test code copied from github.com/skycoin/skycoin codebase + * for it is needed by test suite and functions not exported in upstream package. + * + * Please only add in here code copied from Skycoin codebase. Make sure it's strictly necessary. + */ + import ( "crypto/rand" "path/filepath" diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index 37521460..27181e90 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -834,7 +834,7 @@ func TestTransactionSignInput(t *testing.T) { wallets := makeLocalWalletsFromKeyData(t, keysData) // Input is already signed - _, err = wallets[0].Sign(uiTxn, nil, util.EmptyPassword, []string{"0"}) + _, err = wallets[0].Sign(uiTxn, nil, util.EmptyPassword, []string{"#0"}) testutil.RequireError(t, err, "Transaction is fully signed") isFullySigned, err = uiTxn.IsFullySigned() require.NoError(t, err) @@ -845,7 +845,7 @@ func TestTransactionSignInput(t *testing.T) { isFullySigned, err = uiTxn.IsFullySigned() require.NoError(t, err) require.False(t, isFullySigned) - signedCoreTxn, err = wallets[1].Sign(uiTxn, nil, nil, []string{"1"}) + signedCoreTxn, err = wallets[1].Sign(uiTxn, nil, nil, []string{"#1"}) require.NoError(t, err) signedTxn, isUninjected := signedCoreTxn.(*SkycoinUninjectedTransaction) require.True(t, isUninjected) @@ -856,14 +856,14 @@ func TestTransactionSignInput(t *testing.T) { isFullySigned, err = signedTxn.IsFullySigned() require.NoError(t, err) require.True(t, isFullySigned) - _, err = wallets[1].Sign(signedTxn, nil, nil, []string{"1"}) + _, err = wallets[1].Sign(signedTxn, nil, nil, []string{"#1"}) testutil.RequireError(t, err, "Transaction is fully signed") // Repeat using UXID isFullySigned, err = uiTxn.IsFullySigned() require.NoError(t, err) require.False(t, isFullySigned) uxId := txn.In[1].Hex() - signedCoreTxn, err = wallets[1].Sign(uiTxn, SignerIDLocalWallet, nil, []string{uxId}) + signedCoreTxn, err = wallets[1].Sign(uiTxn, nil, nil, []string{uxId}) require.NoError(t, err) signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) require.True(t, isUninjected) @@ -874,7 +874,7 @@ func TestTransactionSignInput(t *testing.T) { isFullySigned, err = signedTxn.IsFullySigned() require.NoError(t, err) require.True(t, isFullySigned) - _, err = wallets[1].Sign(signedTxn, SignerIDLocalWallet, nil, []string{"#1"}) + _, err = wallets[1].Sign(signedTxn, nil, nil, []string{"#1"}) testutil.RequireError(t, err, "Transaction is fully signed") // Transaction has no sigs; sigs array is initialized @@ -882,7 +882,7 @@ func TestTransactionSignInput(t *testing.T) { isFullySigned, err = uiTxn.IsFullySigned() require.NoError(t, err) require.False(t, isFullySigned) - signedCoreTxn, err = wallets[2].Sign(uiTxn, nil, nil, []string{"2"}) + signedCoreTxn, err = wallets[2].Sign(uiTxn, nil, nil, []string{"#2"}) require.NoError(t, err) signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) require.True(t, isUninjected) @@ -896,14 +896,14 @@ func TestTransactionSignInput(t *testing.T) { require.False(t, signedTxn.txn.Sigs[2].Null()) // Signing the rest of the inputs individually works - signedCoreTxn, err = wallets[1].Sign(signedTxn, nil, nil, []string{"1"}) + signedCoreTxn, err = wallets[1].Sign(signedTxn, nil, nil, []string{"#1"}) require.NoError(t, err) signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) require.True(t, isUninjected) isFullySigned, err = signedTxn.IsFullySigned() require.NoError(t, err) require.False(t, isFullySigned) - signedCoreTxn, err = wallets[0].Sign(signedTxn, nil, nil, []string{"0"}) + signedCoreTxn, err = wallets[0].Sign(signedTxn, nil, nil, []string{"#0"}) require.NoError(t, err) signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) require.True(t, isUninjected) @@ -957,7 +957,7 @@ func TestTransactionSignInputs(t *testing.T) { // Valid signing h := txn.HashInner() - signedCoreTxn, err := wallet.Sign(uiTxn, nil, util.EmptyPassword, []string{"0", "1"}) + signedCoreTxn, err := wallet.Sign(uiTxn, nil, util.EmptyPassword, []string{"#0", "#1"}) require.NoError(t, err) signedTxn, isUninjected := signedCoreTxn.(*SkycoinUninjectedTransaction) require.True(t, isUninjected) @@ -1491,7 +1491,7 @@ func TestSkycoinSignServiceSign(t *testing.T) { for i, wlt := range wallets { descriptor := core.InputSignDescriptor{ InputIndex: fmt.Sprintf("#%d", i), - SignerID: SignerIDLocalWallet, + SignerID: "", // Use wallet Wallet: wlt, } isds = append(isds, descriptor) diff --git a/src/errors/error.go b/src/errors/error.go index 3d807e0f..63e260f8 100644 --- a/src/errors/error.go +++ b/src/errors/error.go @@ -53,4 +53,6 @@ var ( ErrInvalidWalletEntropy = errors.New("Entropy must be 128 or 256") // ErrInvalidValue invalid value was supplied in to function ErrInvalidValue = errors.New("Value errors") + // ErrWalletCantSign wallet can not sign transactions + ErrWalletCantSign = errors.New("Wallet does not support transaction signing") ) diff --git a/src/util/sign.go b/src/util/sign.go index a5ede9ed..376ab3b6 100644 --- a/src/util/sign.go +++ b/src/util/sign.go @@ -86,7 +86,17 @@ func GenericMultiWalletSign(txn core.Transaction, signSpec []core.InputSignDescr for signPair, indices := range groups { - signer := LookupSignService(signPair.signer) + var signer core.TxnSigner + if signPair.signer == "" { + wltSigner, isTxnSigner := signPair.wallet.(core.TxnSigner) + if !isTxnSigner { + logUtil.WithError(errors.ErrInvalidID).Errorf("Unknown signer %s specified for signing inputs %v of wallet %v", string(signPair.signer), indices, signPair.wallet) + return nil, errors.ErrWalletCantSign + } + signer = wltSigner + } else { + signer = LookupSignService(signPair.signer) + } if signer == nil { logUtil.WithError(errors.ErrInvalidID).Errorf("Unknown signer %s specified for signing inputs %v of wallet %v", string(signPair.signer), indices, signPair.wallet) return nil, errors.ErrInvalidID From 8e363474eb234b27159be49019c0b0743d50971a Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 22 Nov 2019 18:34:32 -0500 Subject: [PATCH 36/69] [sky] refs #150 - Move test functions added for multi-wallet tests out of sky_test.go --- src/coin/skycoin/models/sky_test.go | 82 ------------------------- src/coin/skycoin/models/util_test.go | 91 ++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 82 deletions(-) create mode 100644 src/coin/skycoin/models/util_test.go diff --git a/src/coin/skycoin/models/sky_test.go b/src/coin/skycoin/models/sky_test.go index 41e30397..23b31e3a 100644 --- a/src/coin/skycoin/models/sky_test.go +++ b/src/coin/skycoin/models/sky_test.go @@ -12,11 +12,7 @@ import ( "path/filepath" "testing" - "github.com/skycoin/skycoin/src/cipher/bip39" - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/testsuite" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/util" "github.com/skycoin/skycoin/src/cipher" skytestsuite "github.com/skycoin/skycoin/src/cipher/testsuite" "github.com/skycoin/skycoin/src/coin" @@ -76,27 +72,6 @@ type KeyData struct { // generateTestKeyPair provides deterministic sequence of test keys // that can be recovered later inside a wallet - -func generateRandomKeyData(t *testing.T) (*KeyData, error) { - entropy, err := bip39.NewEntropy(128) - require.NoError(t, err) - mnemonic, err := bip39.NewMnemonic(entropy) - require.NoError(t, err) - require.NoError(t, err) - pubKey, secKey, err := cipher.GenerateDeterministicKeyPair([]byte(mnemonic)) - require.NoError(t, err) - - kd := &KeyData{ - AddressIndex: 0, - Entropy: entropy, - Mnemonic: mnemonic, - PubKey: pubKey, - SecKey: secKey, - } - - return kd, nil -} - func generateTestKeyPair(t *testing.T) (*KeyData, error) { var err error if seedEntropy == nil { @@ -135,19 +110,6 @@ func generateTestKeyPair(t *testing.T) (*KeyData, error) { return &keytestData, nil } -func makeUxBodyWithRandomSecret(t *testing.T) (coin.UxBody, *KeyData, error) { - keydata, err := generateRandomKeyData(t) - if err != nil { - return coin.UxBody{}, nil, err - } - return coin.UxBody{ - SrcTransaction: testutil.RandSHA256(t), - Address: cipher.AddressFromPubKey(keydata.PubKey), - Coins: 1e6, - Hours: 100, - }, keydata, nil -} - func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, *KeyData, error) { keydata, err := generateTestKeyPair(t) if err != nil { @@ -161,20 +123,6 @@ func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, *KeyData, error) { }, keydata, nil } -func makeUxWithRandomSecret(t *testing.T) (coin.UxOut, *KeyData, error) { - body, kd, err := makeUxBodyWithRandomSecret(t) - if err != nil { - return coin.UxOut{}, nil, err - } - return coin.UxOut{ - Head: coin.UxHead{ - Time: 100, - BkSeq: 2, - }, - Body: body, - }, kd, nil -} - func makeUxOutWithSecret(t *testing.T) (coin.UxOut, *KeyData, error) { body, kd, err := makeUxBodyWithSecret(t) if err != nil { @@ -197,22 +145,6 @@ func makeTransaction(t *testing.T) (coin.Transaction, error) { return makeTransactionFromUxOut(t, ux, kd.SecKey), nil } -func makeTransactionFromMultipleWallets(t *testing.T, n int) (coin.Transaction, []KeyData, []coin.UxOut, error) { - uxs := make([]coin.UxOut, n) - keysdata := make([]KeyData, n) - secs := make([]cipher.SecKey, n) - - for i := 0; i < n; i++ { - ux, kd, err := makeUxWithRandomSecret(t) - require.NoError(t, err) - uxs[i] = ux - secs[i] = kd.SecKey - keysdata[i] = *kd - } - - return makeTransactionFromUxOuts(t, uxs, secs), keysdata, uxs, nil -} - func makeTransactionMultipleInputs(t *testing.T, n int) (coin.Transaction, []KeyData, []coin.UxOut, error) { uxs := make([]coin.UxOut, n) keysdata := make([]KeyData, n) @@ -254,13 +186,6 @@ func makeSpentOutput(uxout coin.UxOut, spentBkSeq uint64, spentTxId cipher.SHA25 return } -func makeSimpleWalletAddress(wallet core.Wallet, address core.Address) core.WalletAddress { - return &util.SimpleWalletAddress{ - Wallet: wallet, - UxOut: address, - } -} - func randBytes(t *testing.T, n int) []byte { b := make([]byte, n) x, err := rand.Read(b) @@ -268,10 +193,3 @@ func randBytes(t *testing.T, n int) []byte { require.Nil(t, err) return b } - -func makeSimpleWalletOutput(wallet core.Wallet, out core.TransactionOutput) core.WalletOutput { - return &util.SimpleWalletOutput{ - Wallet: wallet, - UxOut: out, - } -} diff --git a/src/coin/skycoin/models/util_test.go b/src/coin/skycoin/models/util_test.go new file mode 100644 index 00000000..902b5400 --- /dev/null +++ b/src/coin/skycoin/models/util_test.go @@ -0,0 +1,91 @@ +package skycoin + +import ( + "testing" + + "github.com/skycoin/skycoin/src/cipher/bip39" + + "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/FiberCryptoWallet/src/util" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" + "github.com/stretchr/testify/require" +) + +func generateRandomKeyData(t *testing.T) (*KeyData, error) { + entropy, err := bip39.NewEntropy(128) + require.NoError(t, err) + mnemonic, err := bip39.NewMnemonic(entropy) + require.NoError(t, err) + require.NoError(t, err) + pubKey, secKey, err := cipher.GenerateDeterministicKeyPair([]byte(mnemonic)) + require.NoError(t, err) + + kd := &KeyData{ + AddressIndex: 0, + Entropy: entropy, + Mnemonic: mnemonic, + PubKey: pubKey, + SecKey: secKey, + } + + return kd, nil +} + +func makeUxBodyWithRandomSecret(t *testing.T) (coin.UxBody, *KeyData, error) { + keydata, err := generateRandomKeyData(t) + if err != nil { + return coin.UxBody{}, nil, err + } + return coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(keydata.PubKey), + Coins: 1e6, + Hours: 100, + }, keydata, nil +} + +func makeUxWithRandomSecret(t *testing.T) (coin.UxOut, *KeyData, error) { + body, kd, err := makeUxBodyWithRandomSecret(t) + if err != nil { + return coin.UxOut{}, nil, err + } + return coin.UxOut{ + Head: coin.UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + }, kd, nil +} + +func makeTransactionFromMultipleWallets(t *testing.T, n int) (coin.Transaction, []KeyData, []coin.UxOut, error) { + uxs := make([]coin.UxOut, n) + keysdata := make([]KeyData, n) + secs := make([]cipher.SecKey, n) + + for i := 0; i < n; i++ { + ux, kd, err := makeUxWithRandomSecret(t) + require.NoError(t, err) + uxs[i] = ux + secs[i] = kd.SecKey + keysdata[i] = *kd + } + + return makeTransactionFromUxOuts(t, uxs, secs), keysdata, uxs, nil +} + +func makeSimpleWalletAddress(wallet core.Wallet, address core.Address) core.WalletAddress { + return &util.SimpleWalletAddress{ + Wallet: wallet, + UxOut: address, + } +} + +func makeSimpleWalletOutput(wallet core.Wallet, out core.TransactionOutput) core.WalletOutput { + return &util.SimpleWalletOutput{ + Wallet: wallet, + UxOut: out, + } +} From 20a2e5f1b71f8c67debe70c0446e45f9ad2887fc Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 22 Nov 2019 20:09:18 -0500 Subject: [PATCH 37/69] [util] [models] refs #150 - Add LookupSignServiceForWallet to lookup signer but fall back to wallet if ID empty - Use it in WalletManager.signTxn to fix error reported in https://travis-ci.org/fibercrypto/FiberCryptoWallet/jobs/615798117#L722-L727 - Replace similar implementation in GenericMultiWalletSign --- src/models/walletsManager.go | 7 ++++++- src/util/sign.go | 32 +++++++++++++++++++------------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index 10e79ffb..fe835248 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -596,7 +596,12 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source, password } txn, err = walletM.signer.Sign(qTxn.txn, signDescriptors, pwd) } else { - txn, err = wlts[0].Sign(qTxn.txn, core.UID(source), pwd, nil) + signer, err := util.LookupSignServiceForWallet(wlts[0], core.UID(source)) + if err != nil { + logWalletManager.WithError(err).Warn("No signer %s for wallet %v", source, wlts[0]) + return nil + } + txn, err = wlts[0].Sign(qTxn.txn, signer, pwd, nil) } if err != nil { diff --git a/src/util/sign.go b/src/util/sign.go index 376ab3b6..5740139d 100644 --- a/src/util/sign.go +++ b/src/util/sign.go @@ -62,6 +62,22 @@ func GetSignerDescription(signerID core.UID) (string, error) { return signer.GetSignerDescription(), nil } +// LookupSignServiceForWallet instantiate signing straegy identified by UID. Fall back to wallet if empty +func LookupSignServiceForWallet(wlt core.Wallet, signerID core.UID) (core.TxnSigner, error) { + if signerID == "" { + wltSigner, isTxnSigner := wlt.(core.TxnSigner) + if !isTxnSigner { + logUtil.WithError(errors.ErrInvalidID).Errorf("Wallet %v can not sign transactions", wlt) + return nil, errors.ErrWalletCantSign + } + return wltSigner, nil + } + if signer := LookupSignService(signerID); signer != nil { + return signer, nil + } + return nil, errors.ErrInvalidID +} + type signingKeyPair struct { wallet core.Wallet signer core.UID @@ -86,19 +102,9 @@ func GenericMultiWalletSign(txn core.Transaction, signSpec []core.InputSignDescr for signPair, indices := range groups { - var signer core.TxnSigner - if signPair.signer == "" { - wltSigner, isTxnSigner := signPair.wallet.(core.TxnSigner) - if !isTxnSigner { - logUtil.WithError(errors.ErrInvalidID).Errorf("Unknown signer %s specified for signing inputs %v of wallet %v", string(signPair.signer), indices, signPair.wallet) - return nil, errors.ErrWalletCantSign - } - signer = wltSigner - } else { - signer = LookupSignService(signPair.signer) - } - if signer == nil { - logUtil.WithError(errors.ErrInvalidID).Errorf("Unknown signer %s specified for signing inputs %v of wallet %v", string(signPair.signer), indices, signPair.wallet) + signer, err := LookupSignServiceForWallet(signPair.wallet, signPair.signer) + if err != nil { + logUtil.WithError(err).Errorf("Unknown signer %s specified for signing inputs %v of wallet %v", string(signPair.signer), indices, signPair.wallet) return nil, errors.ErrInvalidID } signedTxn, err = signPair.wallet.Sign(signedTxn, signer, pwd, indices) From 0b900c7c4edb97eef6a11b4100cf083ea35d30bb Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 22 Nov 2019 20:26:51 -0500 Subject: [PATCH 38/69] [sky] refs #150 - Fix linter errors ... reported in https://travis-ci.org/fibercrypto/FiberCryptoWallet/jobs/615808298#L642-L672 --- src/coin/skycoin/models/wallet.go | 9 ++++++++- src/coin/skycoin/models/wallet_test.go | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index 180f879f..6209ddf6 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -1063,6 +1063,10 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe // 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") + return nil, err + } originalInputs = cTxn.In if skyWlt.IsEncrypted() { @@ -1094,7 +1098,7 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe logWallet.Errorf("Error parsing fee of TxID %s : %s", cTxn.TxID, cTxn.Fee) return nil, err } - //txnFee = uint64(tmpInt64) + txnFee = uint64(tmpInt64) for i, cIn := range cTxn.In { tmpInt64, err = util.GetCoinValue(cIn.Coins, params.SkycoinTicker) if err != nil { @@ -1226,6 +1230,9 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe resultTxn = NewSkycoinCreatedTransaction(*crtTxn) } else { resultTxn, err = NewUninjectedTransaction(signedTxn, txnFee) + if err != nil { + return nil, err + } } return resultTxn, nil diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index 27181e90..e88b7958 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -1353,7 +1353,8 @@ func TestSkycoinBlockchainSpend(t *testing.T) { uxOuts := make([]coin.UxOut, 2) for i := 0; i < 2; i++ { - ux, _, _ := makeUxOutWithSecret(t) + ux, _, err := makeUxOutWithSecret(t) + require.NoError(t, err) uxOuts[i] = ux } @@ -1517,7 +1518,6 @@ func TestSkycoinSignServiceSign(t *testing.T) { //require.Equal(t, txn.Hash().String(), signedTxn.GetId()) //SkycoinUninjectedTransaction - sigs = txn.Sigs txn.Sigs = []cipher.Sig{} skyUninTxn := SkycoinUninjectedTransaction{ txn: &txn, From c8c943a0cd2c1e702907e634783096635820becb Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 22 Nov 2019 21:16:59 -0500 Subject: [PATCH 39/69] [sky] refs #150 - Fix linter errors in test code ... reported in https://travis-ci.org/fibercrypto/FiberCryptoWallet/jobs/615842606#L642-L658 --- src/coin/skycoin/models/util_test.go | 29 ++++++++++---------------- src/coin/skycoin/models/wallet_test.go | 13 ++++++------ 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/coin/skycoin/models/util_test.go b/src/coin/skycoin/models/util_test.go index 902b5400..46c108dd 100644 --- a/src/coin/skycoin/models/util_test.go +++ b/src/coin/skycoin/models/util_test.go @@ -13,7 +13,7 @@ import ( "github.com/stretchr/testify/require" ) -func generateRandomKeyData(t *testing.T) (*KeyData, error) { +func generateRandomKeyData(t *testing.T) *KeyData { entropy, err := bip39.NewEntropy(128) require.NoError(t, err) mnemonic, err := bip39.NewMnemonic(entropy) @@ -30,50 +30,43 @@ func generateRandomKeyData(t *testing.T) (*KeyData, error) { SecKey: secKey, } - return kd, nil + return kd } -func makeUxBodyWithRandomSecret(t *testing.T) (coin.UxBody, *KeyData, error) { - keydata, err := generateRandomKeyData(t) - if err != nil { - return coin.UxBody{}, nil, err - } +func makeUxBodyWithRandomSecret(t *testing.T) (coin.UxBody, *KeyData) { + keydata := generateRandomKeyData(t) return coin.UxBody{ SrcTransaction: testutil.RandSHA256(t), Address: cipher.AddressFromPubKey(keydata.PubKey), Coins: 1e6, Hours: 100, - }, keydata, nil + }, keydata } -func makeUxWithRandomSecret(t *testing.T) (coin.UxOut, *KeyData, error) { - body, kd, err := makeUxBodyWithRandomSecret(t) - if err != nil { - return coin.UxOut{}, nil, err - } +func makeUxWithRandomSecret(t *testing.T) (coin.UxOut, *KeyData) { + body, kd := makeUxBodyWithRandomSecret(t) return coin.UxOut{ Head: coin.UxHead{ Time: 100, BkSeq: 2, }, Body: body, - }, kd, nil + }, kd } -func makeTransactionFromMultipleWallets(t *testing.T, n int) (coin.Transaction, []KeyData, []coin.UxOut, error) { +func makeTransactionFromMultipleWallets(t *testing.T, n int) (coin.Transaction, []KeyData, []coin.UxOut) { uxs := make([]coin.UxOut, n) keysdata := make([]KeyData, n) secs := make([]cipher.SecKey, n) for i := 0; i < n; i++ { - ux, kd, err := makeUxWithRandomSecret(t) - require.NoError(t, err) + ux, kd := makeUxWithRandomSecret(t) uxs[i] = ux secs[i] = kd.SecKey keysdata[i] = *kd } - return makeTransactionFromUxOuts(t, uxs, secs), keysdata, uxs, nil + return makeTransactionFromUxOuts(t, uxs, secs), keysdata, uxs } func makeSimpleWalletAddress(wallet core.Wallet, address core.Address) core.WalletAddress { diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index e88b7958..7c986848 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -991,11 +991,11 @@ func makeLocalWallet(t *testing.T) core.Wallet { return wallet } -func makeSkycoinBlockchain(t *testing.T) core.BlockchainTransactionAPI { +func makeSkycoinBlockchain() core.BlockchainTransactionAPI { return NewSkycoinBlockchain(0) } -func makeSkycoinSignService(t *testing.T) core.BlockchainSignService { +func makeSkycoinSignService() core.BlockchainSignService { return &SkycoinSignService{} } @@ -1303,7 +1303,7 @@ func TestSkycoinBlockchainSendFromAddress(t *testing.T) { mockSkyApiCreateTransaction(global_mock, &req1, ctxnR) mockSkyApiCreateTransaction(global_mock, &req2, ctxnR) - bc := makeSkycoinBlockchain(t) + bc := makeSkycoinBlockchain() wlt := &LocalWallet{} //Testing Hours selection to auto @@ -1440,7 +1440,7 @@ func TestSkycoinBlockchainSpend(t *testing.T) { mockSkyApiCreateTransaction(global_mock, &req1, crtTxn) mockSkyApiCreateTransaction(global_mock, &req2, crtTxn) - bc := makeSkycoinBlockchain(t) + bc := makeSkycoinBlockchain() to := []core.TransactionOutput{toAddr} //Testing Hours selection auto @@ -1465,8 +1465,7 @@ func TestSkycoinBlockchainSpend(t *testing.T) { func TestSkycoinSignServiceSign(t *testing.T) { CleanGlobalMock() - txn, keyData, uxOuts, err := makeTransactionFromMultipleWallets(t, 3) - require.NoError(t, err) + txn, keyData, uxOuts := makeTransactionFromMultipleWallets(t, 3) for _, ux := range uxOuts { mockSkyApiUxOut(global_mock, ux) } @@ -1483,7 +1482,7 @@ func TestSkycoinSignServiceSign(t *testing.T) { return "", nil } - signer := makeSkycoinSignService(t) + signer := makeSkycoinSignService() wallets := makeLocalWalletsFromKeyData(t, keyData) require.NotEqual(t, wallets[0], wallets[1]) From 68f0eb4ff2419f84d5e32a253c5b04b809753053 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Sat, 23 Nov 2019 01:15:41 -0500 Subject: [PATCH 40/69] [core] Change signature of core.BlockchainSignService::Sign method for receiv multiple PasswordReaders --- src/core/sign.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/sign.go b/src/core/sign.go index d510592c..f65b8c17 100644 --- a/src/core/sign.go +++ b/src/core/sign.go @@ -13,5 +13,5 @@ type InputSignDescriptor struct { // BlockchainSignService implement multi-wallet transaction signing for the blockchain type BlockchainSignService interface { // Sign creates a new transaction by (fully or partially) signing a given transaction - Sign(txn Transaction, signSpec []InputSignDescriptor, pwd PasswordReader) (Transaction, error) + Sign(txn Transaction, signSpec []InputSignDescriptor, pwds []PasswordReader) (Transaction, error) } From a53b1ed40c4f6fdfbefae540cb712684c162755c Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Sat, 23 Nov 2019 01:23:57 -0500 Subject: [PATCH 41/69] [core][skycoin] Change signature of methods related to sign txn spending outputs from multiple wallets --- src/coin/skycoin/models/sign.go | 2 +- src/core/sign.go | 2 +- src/util/sign.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coin/skycoin/models/sign.go b/src/coin/skycoin/models/sign.go index 3bd8ed69..2264843b 100644 --- a/src/coin/skycoin/models/sign.go +++ b/src/coin/skycoin/models/sign.go @@ -9,7 +9,7 @@ import ( type SkycoinSignService struct{} // Sign creates a new transaction by (fully or partially) signing a given transaction -func (sss *SkycoinSignService) Sign(txn core.Transaction, signSpec []core.InputSignDescriptor, pwd core.PasswordReader) (core.Transaction, error) { +func (sss *SkycoinSignService) Sign(txn core.Transaction, signSpec []core.InputSignDescriptor, pwds map[string]core.PasswordReader) (core.Transaction, error) { return util.GenericMultiWalletSign(txn, signSpec, pwd) } diff --git a/src/core/sign.go b/src/core/sign.go index f65b8c17..072bc9dd 100644 --- a/src/core/sign.go +++ b/src/core/sign.go @@ -13,5 +13,5 @@ type InputSignDescriptor struct { // BlockchainSignService implement multi-wallet transaction signing for the blockchain type BlockchainSignService interface { // Sign creates a new transaction by (fully or partially) signing a given transaction - Sign(txn Transaction, signSpec []InputSignDescriptor, pwds []PasswordReader) (Transaction, error) + Sign(txn Transaction, signSpec []InputSignDescriptor, pwds map[string]PasswordReader) (Transaction, error) } diff --git a/src/util/sign.go b/src/util/sign.go index 5740139d..1596d4d7 100644 --- a/src/util/sign.go +++ b/src/util/sign.go @@ -84,7 +84,7 @@ type signingKeyPair struct { } // MultiWalletSign generic strategy for using multiple wallets to sign a transaction -func GenericMultiWalletSign(txn core.Transaction, signSpec []core.InputSignDescriptor, pwd core.PasswordReader) (signedTxn core.Transaction, err error) { +func GenericMultiWalletSign(txn core.Transaction, signSpec []core.InputSignDescriptor, pwds map[string]core.PasswordReader) (signedTxn core.Transaction, err error) { groups := make(map[signingKeyPair][]string) // Aggregate inputs by wallet,signer combination for _, descriptor := range signSpec { From ec63327b5ff1e50e0857454003bbe9a59122dee3 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Sat, 23 Nov 2019 01:25:28 -0500 Subject: [PATCH 42/69] [core] Update util.GenerecMultiWalletSign to work with multiple passwordReaders --- src/util/sign.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/util/sign.go b/src/util/sign.go index 1596d4d7..95999111 100644 --- a/src/util/sign.go +++ b/src/util/sign.go @@ -107,6 +107,7 @@ func GenericMultiWalletSign(txn core.Transaction, signSpec []core.InputSignDescr logUtil.WithError(err).Errorf("Unknown signer %s specified for signing inputs %v of wallet %v", string(signPair.signer), indices, signPair.wallet) return nil, errors.ErrInvalidID } + pwd := pwds[signPair.wallet.GetId()] signedTxn, err = signPair.wallet.Sign(signedTxn, signer, pwd, indices) if err != nil { logUtil.WithError(err).Errorf("Error signing inputs %v of wallet %v with signer %s", indices, signPair.wallet, string(signPair.signer)) From da043854f3d4629c889f3f7cad34520f3366936e Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Sat, 23 Nov 2019 01:31:15 -0500 Subject: [PATCH 43/69] [models] Update WalletManager::signTxn method for work with multiple passwords --- src/coin/skycoin/models/sign.go | 2 +- src/models/walletsManager.go | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/coin/skycoin/models/sign.go b/src/coin/skycoin/models/sign.go index 2264843b..cf9a563a 100644 --- a/src/coin/skycoin/models/sign.go +++ b/src/coin/skycoin/models/sign.go @@ -10,7 +10,7 @@ type SkycoinSignService struct{} // Sign creates a new transaction by (fully or partially) signing a given transaction func (sss *SkycoinSignService) Sign(txn core.Transaction, signSpec []core.InputSignDescriptor, pwds map[string]core.PasswordReader) (core.Transaction, error) { - return util.GenericMultiWalletSign(txn, signSpec, pwd) + return util.GenericMultiWalletSign(txn, signSpec, pwds) } // Type assertions diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index fe835248..aa35f830 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -49,7 +49,7 @@ type WalletManager struct { _ func(id string, password string) int `slot:"decryptWallet"` _ func() []*QWallet `slot:"getWallets"` _ func(id string) []*QAddress `slot:"getAddresses"` - _ func(wltIds, addresses []string, source string, password string, index []int, qTxn *QTransaction) *QTransaction `slot:"signTxn"` + _ func(wltIds, addresses []string, source string, password []string, index []int, qTxn *QTransaction) *QTransaction `slot:"signTxn"` _ func(wltId string, destinationAddress string, amount string) *QTransaction `slot:"sendTo"` _ func(id, label string) *QWallet `slot:"editWallet"` _ func(wltId, address string) []*QOutput `slot:"getOutputs"` @@ -551,7 +551,7 @@ func (walletM *WalletManager) sendTo(wltId, destinationAddress, amount string) * } -func (walletM *WalletManager) signTxn(wltIds, address []string, source, password string, index []int, qTxn *QTransaction) *QTransaction { +func (walletM *WalletManager) signTxn(wltIds, address []string, source, password []string, index []int, qTxn *QTransaction) *QTransaction { logWalletManager.Info("Signig transaction") if len(wltIds) != len(address) { @@ -559,12 +559,20 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source, password return nil } + if len(wltIds) != len(password) { + logWalletManager.Error("Wallets and passwords provided are incorrect") + return nil + } + wltCache := make(map[string]core.Wallet) wltByAddr := make(map[string]core.Wallet) wlts := make([]core.Wallet, 0) - - pwd := func(message string) (string, error) { - return password, nil + passwords := make([]core.PasswordReader, 0) + for _, pass := range password { + pwd := func(message string) (string, error) { + return password, nil + } + passwords = append(passwords, pwd) } for i, wltId := range wltIds { @@ -594,14 +602,14 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source, password } signDescriptors = append(signDescriptors, sd) } - txn, err = walletM.signer.Sign(qTxn.txn, signDescriptors, pwd) + txn, err = walletM.signer.Sign(qTxn.txn, signDescriptors, passwords) } else { signer, err := util.LookupSignServiceForWallet(wlts[0], core.UID(source)) if err != nil { logWalletManager.WithError(err).Warn("No signer %s for wallet %v", source, wlts[0]) return nil } - txn, err = wlts[0].Sign(qTxn.txn, signer, pwd, nil) + txn, err = wlts[0].Sign(qTxn.txn, signer, passwords[0], nil) } if err != nil { From aea4d148e246b951bc6484eef444bf5169ae69b9 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Sat, 23 Nov 2019 03:15:12 -0500 Subject: [PATCH 44/69] [UI] Update walletIsEncrypted method of SubPageSendAdvanced/Simple components --- src/models/walletsManager.go | 12 ++-- .../Delegates/PasswordRequesterDelegate.qml | 34 +++++++++++ src/ui/MultiplePasswordRequester.qml | 56 +++++++++++++++++++ src/ui/PageSend.qml | 2 +- src/ui/SubPageSendAdvanced.qml | 7 ++- src/ui/SubPageSendSimple.qml | 4 +- 6 files changed, 106 insertions(+), 9 deletions(-) create mode 100644 src/ui/Delegates/PasswordRequesterDelegate.qml create mode 100644 src/ui/MultiplePasswordRequester.qml diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index aa35f830..359b267e 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -551,7 +551,7 @@ func (walletM *WalletManager) sendTo(wltId, destinationAddress, amount string) * } -func (walletM *WalletManager) signTxn(wltIds, address []string, source, password []string, index []int, qTxn *QTransaction) *QTransaction { +func (walletM *WalletManager) signTxn(wltIds, address []string, source string, password []string, index []int, qTxn *QTransaction) *QTransaction { logWalletManager.Info("Signig transaction") if len(wltIds) != len(address) { @@ -567,12 +567,12 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source, password wltCache := make(map[string]core.Wallet) wltByAddr := make(map[string]core.Wallet) wlts := make([]core.Wallet, 0) - passwords := make([]core.PasswordReader, 0) - for _, pass := range password { + passwords := make(map[string]core.PasswordReader, 0) + for i, pass := range password { pwd := func(message string) (string, error) { - return password, nil + return pass, nil } - passwords = append(passwords, pwd) + passwords[wltIds[i]] = pwd } for i, wltId := range wltIds { @@ -609,7 +609,7 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source, password logWalletManager.WithError(err).Warn("No signer %s for wallet %v", source, wlts[0]) return nil } - txn, err = wlts[0].Sign(qTxn.txn, signer, passwords[0], nil) + txn, err = wlts[0].Sign(qTxn.txn, signer, passwords[wlts[0].GetId()], nil) } if err != nil { diff --git a/src/ui/Delegates/PasswordRequesterDelegate.qml b/src/ui/Delegates/PasswordRequesterDelegate.qml new file mode 100644 index 00000000..91d09d72 --- /dev/null +++ b/src/ui/Delegates/PasswordRequesterDelegate.qml @@ -0,0 +1,34 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Controls.Material 2.12 +import QtQuick.Layouts 1.12 +import OutputsModels 1.0 + + +Item { + id: passwordRequesterDelegate + + TextField { + id: textFieldPassword + text: name + placeholderText: qsTr("Password") + selectByMouse: true + echoMode: TextField.Password + focus: true + Layout.alignment: Qt.AlignTop + Layout.fillWidth: true + } + + Button { + id: buttonForgot + text: qsTr("I forgot my password") + flat: true + highlighted: hovered + Layout.alignment: Qt.AlignHCenter | Qt.AlignTop + Layout.fillWidth: true + + onClicked: { + passwordForgotten() + } + } +} \ No newline at end of file diff --git a/src/ui/MultiplePasswordRequester.qml b/src/ui/MultiplePasswordRequester.qml new file mode 100644 index 00000000..bbace1d2 --- /dev/null +++ b/src/ui/MultiplePasswordRequester.qml @@ -0,0 +1,56 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Controls.Material 2.12 +import QtQuick.Layouts 1.12 + +// Resource imports +// import "qrc:/ui/src/ui/Controls" +import "Controls" // For quick UI development, switch back to resources when making a release + +Item { + id: root + + property alias text: textFieldPassword.text + property alias placeholderText: textFieldPassword.placeholderText + property alias allowPasswordRecovery: buttonForgot.visible + + signal passwordForgotten() + + function forceTextFocus() { + textFieldPassword.forceActiveFocus() + } + + function clear() { + textFieldPassword.clear() + } + + implicitHeight: textFieldPassword.implicitHeight + buttonForgot.implicitHeight + + ColumnLayout { + anchors.fill: parent + + TextField { + id: textFieldPassword + + placeholderText: qsTr("Password") + selectByMouse: true + echoMode: TextField.Password + focus: true + Layout.alignment: Qt.AlignTop + Layout.fillWidth: true + } + + Button { + id: buttonForgot + text: qsTr("I forgot my password") + flat: true + highlighted: hovered + Layout.alignment: Qt.AlignHCenter | Qt.AlignTop + Layout.fillWidth: true + + onClicked: { + passwordForgotten() + } + } + } +} diff --git a/src/ui/PageSend.qml b/src/ui/PageSend.qml index 2b4f7350..e7ad5582 100644 --- a/src/ui/PageSend.qml +++ b/src/ui/PageSend.qml @@ -54,7 +54,7 @@ Page { txn = walletManager.sendFromAddresses(addrs[1], addrs[0], destinationSummary[0], destinationSummary[1], destinationSummary[2], changeAddress, automaticCoinHours, burnFactor) } - isEncrypted = stackView.currentItem.advancedPage.walletIsEncrypted()[0] + isEncrypted = stackView.currentItem.advancedPage.walletIsEncrypted() } else{ walletSelected = stackView.currentItem.simplePage.getSelectedWallet() isEncrypted = stackView.currentItem.simplePage.walletIsEncrypted() diff --git a/src/ui/SubPageSendAdvanced.qml b/src/ui/SubPageSendAdvanced.qml index acc8ec9f..48f652a1 100644 --- a/src/ui/SubPageSendAdvanced.qml +++ b/src/ui/SubPageSendAdvanced.qml @@ -51,6 +51,7 @@ Page { minFeeAmount = valCH/10 } + function getSelectedAddressesWithWallets(){ var indexs = comboBoxWalletsAddressesSendFrom.getCheckedDelegates() var addresses = [] addresses.push([]) @@ -90,7 +91,11 @@ Page { var indexs = comboBoxWalletsSendFrom.getCheckedDelegates() var enc = [] for (var i = 0; i < indexs.length; i++){ - enc.push(comboBoxWalletsSendFrom.model.wallets[indexs[i]].encryptionEnabled) + walletEncrypted = [] + walletEncrypted.push(comboBoxWalletsSendFrom.model.wallets[indexs[i]].fileName) + walletEncrypted.push(comboBoxWalletsSendFrom.model.wallets[indexs[i]].name) + walletEncrypted.push(comboBoxWalletsSendFrom.model.wallets[indexs[i]].encryptionEnabled) + enc.push(walletEncrypted) } return enc } diff --git a/src/ui/SubPageSendSimple.qml b/src/ui/SubPageSendSimple.qml index 9eba2159..4dd974ff 100644 --- a/src/ui/SubPageSendSimple.qml +++ b/src/ui/SubPageSendSimple.qml @@ -11,6 +11,7 @@ import "Controls" // For quick UI development, switch back to resources when mak Page { id: root property string walletSelected + property string walletSelectedName property bool walletEncrypted: false property string amount property string destinationAddress @@ -24,7 +25,7 @@ Page { return destinationAddress } function walletIsEncrypted(){ - return walletEncrypted + return [walletSelected, walletSelectedName, walletEncrypted] } signal qrCodeRequested(var data) @@ -73,6 +74,7 @@ Page { onActivated: { root.walletSelected = comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].fileName + root.walletSelectedName = comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].name root.walletEncrypted = comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].encryptionEnabled } } // ComboBox From 09b6c0dadb1002c76c046fa16e14e359f7f4065e Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Sun, 24 Nov 2019 03:27:24 -0500 Subject: [PATCH 45/69] [models] Create QBridge model for connect calls in backend and frontend --- src/models/bridgeModel.go | 10 ++++++++++ src/models/models.go | 2 ++ src/ui/SubPageSendAdvanced.qml | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 src/models/bridgeModel.go diff --git a/src/models/bridgeModel.go b/src/models/bridgeModel.go new file mode 100644 index 00000000..e8b9e3bb --- /dev/null +++ b/src/models/bridgeModel.go @@ -0,0 +1,10 @@ +package models + +import ( + "github.com/therecipe/qt/core" +) + +type QBridge struct { + core.QObject + _ func(string) string `signal:"getPassword"` +} diff --git a/src/models/models.go b/src/models/models.go index 92b81b8a..9cbb09a7 100644 --- a/src/models/models.go +++ b/src/models/models.go @@ -15,4 +15,6 @@ func init() { ModelAddresses_QmlRegisterType2("OutputsModels", 1, 0, "QAddresses") ModelOutputs_QmlRegisterType2("OutputsModels", 1, 0, "QOutputs") QTransaction_QmlRegisterType2("Transactions", 1, 0, "QTransaction") + QBridge_QmlRegisterType2("Utils", 1, 1, "QBridge") + } diff --git a/src/ui/SubPageSendAdvanced.qml b/src/ui/SubPageSendAdvanced.qml index acc8ec9f..9c604771 100644 --- a/src/ui/SubPageSendAdvanced.qml +++ b/src/ui/SubPageSendAdvanced.qml @@ -50,7 +50,7 @@ Page { upperAltCointBound = valCH*9/10 minFeeAmount = valCH/10 } - + function geteAddressesWithWallets(){ var indexs = comboBoxWalletsAddressesSendFrom.getCheckedDelegates() var addresses = [] addresses.push([]) From 445e7c71e1699e6f4549b2346fc3fc54ef423148 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Sun, 24 Nov 2019 03:31:04 -0500 Subject: [PATCH 46/69] [models] Modify walletManager::signTxn to use a bridge for make de passwordReader --- src/models/walletsManager.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index fe835248..3d758e2c 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -49,7 +49,7 @@ type WalletManager struct { _ func(id string, password string) int `slot:"decryptWallet"` _ func() []*QWallet `slot:"getWallets"` _ func(id string) []*QAddress `slot:"getAddresses"` - _ func(wltIds, addresses []string, source string, password string, index []int, qTxn *QTransaction) *QTransaction `slot:"signTxn"` + _ func(wltIds, addresses []string, source string, bridgeForPassword *QBridge, index []int, qTxn *QTransaction) *QTransaction `slot:"signTxn"` _ func(wltId string, destinationAddress string, amount string) *QTransaction `slot:"sendTo"` _ func(id, label string) *QWallet `slot:"editWallet"` _ func(wltId, address string) []*QOutput `slot:"getOutputs"` @@ -551,7 +551,7 @@ func (walletM *WalletManager) sendTo(wltId, destinationAddress, amount string) * } -func (walletM *WalletManager) signTxn(wltIds, address []string, source, password string, index []int, qTxn *QTransaction) *QTransaction { +func (walletM *WalletManager) signTxn(wltIds, address []string, source, bridgeForPassword *QBridge, index []int, qTxn *QTransaction) *QTransaction { logWalletManager.Info("Signig transaction") if len(wltIds) != len(address) { @@ -564,7 +564,7 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source, password wlts := make([]core.Wallet, 0) pwd := func(message string) (string, error) { - return password, nil + return bridgeForPassword.GetPassword(message), nil } for i, wltId := range wltIds { From 99643c23ad8b8e4fbf8a9cdc3534c8849c843316 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Sun, 24 Nov 2019 03:52:20 -0500 Subject: [PATCH 47/69] [models] Add mutex function to QBridge and a property to return the value --- src/models/bridgeModel.go | 21 +++++- src/models/walletsManager.go | 126 ++++++++++++++++++----------------- src/ui/PageSend.qml | 36 +++++++++- 3 files changed, 119 insertions(+), 64 deletions(-) diff --git a/src/models/bridgeModel.go b/src/models/bridgeModel.go index e8b9e3bb..6718d35f 100644 --- a/src/models/bridgeModel.go +++ b/src/models/bridgeModel.go @@ -1,10 +1,29 @@ package models import ( + "sync" + "github.com/therecipe/qt/core" ) type QBridge struct { core.QObject - _ func(string) string `signal:"getPassword"` + _ func(message string) `signal:"getPassword"` + _ string `property:"returnGetPassword"` + _ func() `slot:"lock"` + _ func() `slot:"unlock"` + sem *sync.Mutex +} + +func (b *QBridge) init() { + b.ConnectLock(b.lock) + b.ConnectUnlock(b.unlock) +} + +func (b *QBridge) lock() { + b.sem.Lock() +} + +func (b *QBridge) unlock() { + b.sem.Unlock() } diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index 3d758e2c..2f81816b 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -551,69 +551,73 @@ func (walletM *WalletManager) sendTo(wltId, destinationAddress, amount string) * } -func (walletM *WalletManager) signTxn(wltIds, address []string, source, bridgeForPassword *QBridge, index []int, qTxn *QTransaction) *QTransaction { +func (walletM *WalletManager) signTxn(wltIds, address []string, source string, bridgeForPassword *QBridge, index []int, qTxn *QTransaction) *QTransaction { logWalletManager.Info("Signig transaction") - if len(wltIds) != len(address) { - logWalletManager.Error("Wallets and addresses provided are incorrect") - return nil - } - - wltCache := make(map[string]core.Wallet) - wltByAddr := make(map[string]core.Wallet) - wlts := make([]core.Wallet, 0) - - pwd := func(message string) (string, error) { - return bridgeForPassword.GetPassword(message), nil - } - - for i, wltId := range wltIds { - var wlt core.Wallet - wlt, exist := wltCache[wltId] - if !exist { - wlt = walletM.WalletEnv.GetWalletSet().GetWallet(wltId) - if wlt == nil { - logWalletManager.Warn("Couldn't load wallet to Sign transaction") - return nil - } - wltCache[wltId] = wlt - } - wltByAddr[address[i]] = wlt - wlts = append(wlts, wlt) - } - - var txn core.Transaction - var err error - if len(wltCache) > 1 { - signDescriptors := make([]core.InputSignDescriptor, 0) - for _, in := range qTxn.txn.GetInputs() { - sd := core.InputSignDescriptor{ - InputIndex: in.GetId(), - SignerID: core.UID(source), - Wallet: wltByAddr[in.GetSpentOutput().GetAddress().String()], - } - signDescriptors = append(signDescriptors, sd) - } - txn, err = walletM.signer.Sign(qTxn.txn, signDescriptors, pwd) - } else { - signer, err := util.LookupSignServiceForWallet(wlts[0], core.UID(source)) - if err != nil { - logWalletManager.WithError(err).Warn("No signer %s for wallet %v", source, wlts[0]) - return nil - } - txn, err = wlts[0].Sign(qTxn.txn, signer, pwd, nil) - } - - if err != nil { - logWalletManager.WithError(err).Warn("Error signing txn") - return nil - } - qTxn, err = NewQTransactionFromTransaction(txn) - if err != nil { - logWalletManager.WithError(err).Warn("Error converting transaction") - return nil - } - return qTxn + bridgeForPassword.GetPassword("GIVE ME THE PASSWORD") + fmt.Println("EL PASS ES ", pass) + // if len(wltIds) != len(address) { + // logWalletManager.Error("Wallets and addresses provided are incorrect") + // return nil + // } + + // wltCache := make(map[string]core.Wallet) + // wltByAddr := make(map[string]core.Wallet) + // wlts := make([]core.Wallet, 0) + + // pwd := func(message string) (string, error) { + // pass := bridgeForPassword.GetPassword(message) + // return pass, nil + // } + + // for i, wltId := range wltIds { + // var wlt core.Wallet + // wlt, exist := wltCache[wltId] + // if !exist { + // wlt = walletM.WalletEnv.GetWalletSet().GetWallet(wltId) + // if wlt == nil { + // logWalletManager.Warn("Couldn't load wallet to Sign transaction") + // return nil + // } + // wltCache[wltId] = wlt + // } + // wltByAddr[address[i]] = wlt + // wlts = append(wlts, wlt) + // } + + // var txn core.Transaction + // var err error + // if len(wltCache) > 1 { + // signDescriptors := make([]core.InputSignDescriptor, 0) + // for _, in := range qTxn.txn.GetInputs() { + // sd := core.InputSignDescriptor{ + // InputIndex: in.GetId(), + // SignerID: core.UID(source), + // Wallet: wltByAddr[in.GetSpentOutput().GetAddress().String()], + // } + // signDescriptors = append(signDescriptors, sd) + // } + // txn, err = walletM.signer.Sign(qTxn.txn, signDescriptors, pwd) + // } else { + // signer, err := util.LookupSignServiceForWallet(wlts[0], core.UID(source)) + // if err != nil { + // logWalletManager.WithError(err).Warn("No signer %s for wallet %v", source, wlts[0]) + // return nil + // } + // txn, err = wlts[0].Sign(qTxn.txn, signer, pwd, nil) + // } + + // if err != nil { + // logWalletManager.WithError(err).Warn("Error signing txn") + // return nil + // } + // qTxn, err = NewQTransactionFromTransaction(txn) + // if err != nil { + // logWalletManager.WithError(err).Warn("Error converting transaction") + // return nil + // } + // return qTxn + return nil } func (walletM *WalletManager) createEncryptedWallet(seed, label, password string, scanN int) *QWallet { diff --git a/src/ui/PageSend.qml b/src/ui/PageSend.qml index 2b4f7350..63d2a24e 100644 --- a/src/ui/PageSend.qml +++ b/src/ui/PageSend.qml @@ -3,6 +3,7 @@ import QtQuick.Controls 2.12 import QtQuick.Controls.Material 2.12 import QtQuick.Layouts 1.12 import Transactions 1.0 +import Utils 1.0 // Resource imports // import "qrc:/ui/src/ui/Dialogs" @@ -182,8 +183,39 @@ Page { modal: true focus: true onAccepted: { - var signedTxn = walletManager.signTxn(walletsAddresses[1], walletsAddresses[0],"", dialogSendTransaction.passwordText, [], txn) - var injected = walletManager.broadcastTxn(signedTxn) + var signedTxn = walletManager.signTxn(walletsAddresses[1], walletsAddresses[0],"", bridgeForPassword, [], txn) + //var injected = walletManager.broadcastTxn(signedTxn) } } + + DialogGetPassword{ + id: getPasswordDialog + anchors.centerIn: Overlay.overlay + property int nAddress + width: applicationWindow.width > 540 ? 540 - 120 : applicationWindow.width - 40 + height: applicationWindow.height > 570 ? 570 - 180 : applicationWindow.height - 40 + + focus: true + modal: true + onAccepted:{ + bridgeForPassword.waiting = false + } + } + + QBridge{ + id: bridgeForPassword + property bool waiting: false + onGetPassword:{ + waiting = true + getPasswordDialog.title = message + getPasswordDialog.password = "" + + getPasswordDialog.open() + while(waiting){ + + } + return getPasswordDialog.password + + } + } } From 7db22b5c3a9e5491bf9a041a83066fb92c3bb847 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Sun, 24 Nov 2019 07:21:12 -0500 Subject: [PATCH 48/69] [models] Fix QBridge and add necessary methods for sharing information --- src/models/bridgeModel.go | 25 +++++-- src/models/models.go | 2 +- src/models/walletsManager.go | 126 ++++++++++++++++----------------- src/ui/PageSend.qml | 18 ++--- src/ui/SubPageSendAdvanced.qml | 2 +- 5 files changed, 91 insertions(+), 82 deletions(-) diff --git a/src/models/bridgeModel.go b/src/models/bridgeModel.go index 6718d35f..523b8d3d 100644 --- a/src/models/bridgeModel.go +++ b/src/models/bridgeModel.go @@ -8,20 +8,35 @@ import ( type QBridge struct { core.QObject - _ func(message string) `signal:"getPassword"` - _ string `property:"returnGetPassword"` - _ func() `slot:"lock"` - _ func() `slot:"unlock"` - sem *sync.Mutex + _ func() `constructor:"init"` + _ func() `slot:"lock"` + _ func() `slot:"unlock"` + _ func(message string) `signal:"getPassword"` + _ func(string) `slot:"setResult"` + _ func() string `slot:"getResult"` + result string + sem sync.Mutex } func (b *QBridge) init() { + b.ConnectLock(b.lock) b.ConnectUnlock(b.unlock) + b.ConnectSetResult(b.setResult) + b.ConnectGetResult(b.getResult) } func (b *QBridge) lock() { b.sem.Lock() + +} + +func (b *QBridge) setResult(result string) { + b.result = result +} + +func (b *QBridge) getResult() string { + return b.result } func (b *QBridge) unlock() { diff --git a/src/models/models.go b/src/models/models.go index 9cbb09a7..3056ab3f 100644 --- a/src/models/models.go +++ b/src/models/models.go @@ -15,6 +15,6 @@ func init() { ModelAddresses_QmlRegisterType2("OutputsModels", 1, 0, "QAddresses") ModelOutputs_QmlRegisterType2("OutputsModels", 1, 0, "QOutputs") QTransaction_QmlRegisterType2("Transactions", 1, 0, "QTransaction") - QBridge_QmlRegisterType2("Utils", 1, 1, "QBridge") + QBridge_QmlRegisterType2("Utils", 1, 0, "QBridge") } diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index 2f81816b..5ace2b2e 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -554,70 +554,68 @@ func (walletM *WalletManager) sendTo(wltId, destinationAddress, amount string) * func (walletM *WalletManager) signTxn(wltIds, address []string, source string, bridgeForPassword *QBridge, index []int, qTxn *QTransaction) *QTransaction { logWalletManager.Info("Signig transaction") - bridgeForPassword.GetPassword("GIVE ME THE PASSWORD") - fmt.Println("EL PASS ES ", pass) - // if len(wltIds) != len(address) { - // logWalletManager.Error("Wallets and addresses provided are incorrect") - // return nil - // } - - // wltCache := make(map[string]core.Wallet) - // wltByAddr := make(map[string]core.Wallet) - // wlts := make([]core.Wallet, 0) - - // pwd := func(message string) (string, error) { - // pass := bridgeForPassword.GetPassword(message) - // return pass, nil - // } - - // for i, wltId := range wltIds { - // var wlt core.Wallet - // wlt, exist := wltCache[wltId] - // if !exist { - // wlt = walletM.WalletEnv.GetWalletSet().GetWallet(wltId) - // if wlt == nil { - // logWalletManager.Warn("Couldn't load wallet to Sign transaction") - // return nil - // } - // wltCache[wltId] = wlt - // } - // wltByAddr[address[i]] = wlt - // wlts = append(wlts, wlt) - // } - - // var txn core.Transaction - // var err error - // if len(wltCache) > 1 { - // signDescriptors := make([]core.InputSignDescriptor, 0) - // for _, in := range qTxn.txn.GetInputs() { - // sd := core.InputSignDescriptor{ - // InputIndex: in.GetId(), - // SignerID: core.UID(source), - // Wallet: wltByAddr[in.GetSpentOutput().GetAddress().String()], - // } - // signDescriptors = append(signDescriptors, sd) - // } - // txn, err = walletM.signer.Sign(qTxn.txn, signDescriptors, pwd) - // } else { - // signer, err := util.LookupSignServiceForWallet(wlts[0], core.UID(source)) - // if err != nil { - // logWalletManager.WithError(err).Warn("No signer %s for wallet %v", source, wlts[0]) - // return nil - // } - // txn, err = wlts[0].Sign(qTxn.txn, signer, pwd, nil) - // } - - // if err != nil { - // logWalletManager.WithError(err).Warn("Error signing txn") - // return nil - // } - // qTxn, err = NewQTransactionFromTransaction(txn) - // if err != nil { - // logWalletManager.WithError(err).Warn("Error converting transaction") - // return nil - // } - // return qTxn - return nil + if len(wltIds) != len(address) { + logWalletManager.Error("Wallets and addresses provided are incorrect") + return nil + } + + wltCache := make(map[string]core.Wallet) + wltByAddr := make(map[string]core.Wallet) + wlts := make([]core.Wallet, 0) + + pwd := func(message string) (string, error) { + pass := bridgeForPassword.GetPassword(message) + return pass, nil + } + + for i, wltId := range wltIds { + var wlt core.Wallet + wlt, exist := wltCache[wltId] + if !exist { + wlt = walletM.WalletEnv.GetWalletSet().GetWallet(wltId) + if wlt == nil { + logWalletManager.Warn("Couldn't load wallet to Sign transaction") + return nil + } + wltCache[wltId] = wlt + } + wltByAddr[address[i]] = wlt + wlts = append(wlts, wlt) + } + + var txn core.Transaction + var err error + if len(wltCache) > 1 { + signDescriptors := make([]core.InputSignDescriptor, 0) + for _, in := range qTxn.txn.GetInputs() { + sd := core.InputSignDescriptor{ + InputIndex: in.GetId(), + SignerID: core.UID(source), + Wallet: wltByAddr[in.GetSpentOutput().GetAddress().String()], + } + signDescriptors = append(signDescriptors, sd) + } + txn, err = walletM.signer.Sign(qTxn.txn, signDescriptors, pwd) + } else { + signer, err := util.LookupSignServiceForWallet(wlts[0], core.UID(source)) + if err != nil { + logWalletManager.WithError(err).Warn("No signer %s for wallet %v", source, wlts[0]) + return nil + } + txn, err = wlts[0].Sign(qTxn.txn, signer, pwd, nil) + } + + if err != nil { + logWalletManager.WithError(err).Warn("Error signing txn") + return nil + } + qTxn, err = NewQTransactionFromTransaction(txn) + if err != nil { + logWalletManager.WithError(err).Warn("Error converting transaction") + return nil + } + return qTxn + } func (walletM *WalletManager) createEncryptedWallet(seed, label, password string, scanN int) *QWallet { diff --git a/src/ui/PageSend.qml b/src/ui/PageSend.qml index 63d2a24e..f398fa2b 100644 --- a/src/ui/PageSend.qml +++ b/src/ui/PageSend.qml @@ -183,7 +183,7 @@ Page { modal: true focus: true onAccepted: { - var signedTxn = walletManager.signTxn(walletsAddresses[1], walletsAddresses[0],"", bridgeForPassword, [], txn) + var signedTxn = walletManager.signTxn(walletsAddresses[1], walletsAddresses[0],"", bridgeForPassword, [], txn) //var injected = walletManager.broadcastTxn(signedTxn) } } @@ -198,24 +198,20 @@ Page { focus: true modal: true onAccepted:{ - bridgeForPassword.waiting = false + + console.log("UNLOCKING FROM QML " + getPasswordDialog.password) + bridgeForPassword.setResult(getPasswordDialog.password) + bridgeForPassword.unlock() } } QBridge{ id: bridgeForPassword - property bool waiting: false + onGetPassword:{ - waiting = true getPasswordDialog.title = message - getPasswordDialog.password = "" - + getPasswordDialog.clear() getPasswordDialog.open() - while(waiting){ - - } - return getPasswordDialog.password - } } } diff --git a/src/ui/SubPageSendAdvanced.qml b/src/ui/SubPageSendAdvanced.qml index 9c604771..70538a1f 100644 --- a/src/ui/SubPageSendAdvanced.qml +++ b/src/ui/SubPageSendAdvanced.qml @@ -50,7 +50,7 @@ Page { upperAltCointBound = valCH*9/10 minFeeAmount = valCH/10 } - function geteAddressesWithWallets(){ + function getSelectedAddressesWithWallets(){ var indexs = comboBoxWalletsAddressesSendFrom.getCheckedDelegates() var addresses = [] addresses.push([]) From 3c6e47adbf9e3c2d80119622ba4bfbedf6668e46 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Sun, 24 Nov 2019 09:57:46 -0500 Subject: [PATCH 49/69] [models] Add method to walletManager for signing and broadcastin a txn async --- src/coin/skycoin/models/wallet.go | 4 ++-- src/models/walletsManager.go | 32 ++++++++++++++++++++++++------- src/ui/PageSend.qml | 3 ++- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index 6209ddf6..d93af849 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -361,7 +361,7 @@ func (wlt *RemoteWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordR logWallet.WithError(err).Warn(err) return nil, errors.ErrInvalidTxn } - password, err := pwd(fmt.Sprintf("Enter password to decrypt wallet '%s'", wlt.Id)) + password, err := pwd(fmt.Sprintf("Introduce the password of %s ", wlt.Label)) if err != nil { logWallet.WithError(err).Warn("Error getting password") return nil, err @@ -1070,7 +1070,7 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe originalInputs = cTxn.In if skyWlt.IsEncrypted() { - pass, err := pwd("Type your password") + pass, err := pwd(fmt.Sprintf("Introduce the password of %s", skyWlt.Label())) if err != nil { logWallet.WithError(err).Warn("Couldn't get password") return nil, err diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index 5ace2b2e..b441839a 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -49,7 +49,7 @@ type WalletManager struct { _ func(id string, password string) int `slot:"decryptWallet"` _ func() []*QWallet `slot:"getWallets"` _ func(id string) []*QAddress `slot:"getAddresses"` - _ func(wltIds, addresses []string, source string, bridgeForPassword *QBridge, index []int, qTxn *QTransaction) *QTransaction `slot:"signTxn"` + _ func(wltIds, addresses []string, source string, pwd core.PasswordReader, index []int, qTxn *QTransaction) *QTransaction `slot:"signTxn"` _ func(wltId string, destinationAddress string, amount string) *QTransaction `slot:"sendTo"` _ func(id, label string) *QWallet `slot:"editWallet"` _ func(wltId, address string) []*QOutput `slot:"getOutputs"` @@ -58,6 +58,7 @@ type WalletManager struct { _ func(wltIds, outs, addrTo, skyTo, coinHoursTo []string, change string, automaticCoinHours bool, burnFactor string) *QTransaction `slot:"sendFromOutputs"` _ func() []*QAddress `slot:"getAllAddresses"` _ func(wltId string) []*QOutput `slot:"getOutputsFromWallet"` + _ func(wltIds, addresses []string, source string, bridgeForPassword *QBridge, index []int, qTxn *QTransaction) `slot:"signAndBroadcastTxnAsync"` } func (walletM *WalletManager) init() { @@ -86,6 +87,7 @@ func (walletM *WalletManager) init() { walletM.ConnectUpdateWallets(walletM.updateWallets) walletM.ConnectUpdateAddresses(walletM.updateAddresses) walletM.ConnectUpdateOutputs(walletM.updateOutputs) + walletM.ConnectSignAndBroadcastTxnAsync(walletM.signAndBroadcastTxnAsync) walletM.addresseseByWallets = make(map[string][]*QAddress, 0) walletM.outputsByAddress = make(map[string][]*QOutput, 0) walletM.altManager = local.LoadAltcoinManager() @@ -551,7 +553,7 @@ func (walletM *WalletManager) sendTo(wltId, destinationAddress, amount string) * } -func (walletM *WalletManager) signTxn(wltIds, address []string, source string, bridgeForPassword *QBridge, index []int, qTxn *QTransaction) *QTransaction { +func (walletM *WalletManager) signTxn(wltIds, address []string, source string, pwd core.PasswordReader, index []int, qTxn *QTransaction) *QTransaction { logWalletManager.Info("Signig transaction") if len(wltIds) != len(address) { @@ -563,11 +565,6 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source string, b wltByAddr := make(map[string]core.Wallet) wlts := make([]core.Wallet, 0) - pwd := func(message string) (string, error) { - pass := bridgeForPassword.GetPassword(message) - return pass, nil - } - for i, wltId := range wltIds { var wlt core.Wallet wlt, exist := wltCache[wltId] @@ -618,6 +615,27 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source string, b } +func (walletM *WalletManager) signAndBroadcastTxnAsync(wltIds, addresses []string, source string, bridgeForPassword *QBridge, index []int, qTxn *QTransaction) { + channel := make(chan *QTransaction) + go func() { + pwd := func(message string) (string, error) { + bridgeForPassword.lock() + bridgeForPassword.GetPassword(message) + bridgeForPassword.lock() + pass := bridgeForPassword.getResult() + bridgeForPassword.unlock() + return pass, nil + } + + channel <- walletM.signTxn(wltIds, addresses, source, pwd, index, qTxn) + }() + + go func() { + txn := <-channel + walletM.broadcastTxn(txn) + }() +} + func (walletM *WalletManager) createEncryptedWallet(seed, label, password string, scanN int) *QWallet { logWalletManager.Info("Creating encrypted wallet") pwd := func(message string) (string, error) { diff --git a/src/ui/PageSend.qml b/src/ui/PageSend.qml index f398fa2b..9497f517 100644 --- a/src/ui/PageSend.qml +++ b/src/ui/PageSend.qml @@ -183,7 +183,8 @@ Page { modal: true focus: true onAccepted: { - var signedTxn = walletManager.signTxn(walletsAddresses[1], walletsAddresses[0],"", bridgeForPassword, [], txn) + walletManager.signAndBroadcastTxnAsync(walletsAddresses[1], walletsAddresses[0],"", bridgeForPassword, [], txn) + //var signedTxn = walletManager.signTxn(walletsAddresses[1], walletsAddresses[0],"", bridgeForPassword, [], txn) //var injected = walletManager.broadcastTxn(signedTxn) } } From 52f094d4891dd407e3e6b3c271f866d93b10c22e Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Sun, 24 Nov 2019 10:00:41 -0500 Subject: [PATCH 50/69] [UI] Modify UI for don't show password requested in txn details --- src/ui/PageSend.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/PageSend.qml b/src/ui/PageSend.qml index 9497f517..fe7b6f4b 100644 --- a/src/ui/PageSend.qml +++ b/src/ui/PageSend.qml @@ -67,7 +67,7 @@ Page { txn = walletManager.sendTo(walletSelected, stackView.currentItem.simplePage.getDestinationAddress(), stackView.currentItem.simplePage.getAmount()) } console.log("HT "+txn.hoursTraspassed) - dialogSendTransaction.showPasswordField = isEncrypted// get if the current wallet is encrypted + dialogSendTransaction.showPasswordField = false//isEncrypted// get if the current wallet is encrypted //dialogSendTransaction.previewDate = "2019-02-26 15:27" dialogSendTransaction.previewType = TransactionDetails.Type.Send dialogSendTransaction.previewAmount = txn.amount @@ -200,7 +200,7 @@ Page { modal: true onAccepted:{ - console.log("UNLOCKING FROM QML " + getPasswordDialog.password) + //console.log("UNLOCKING FROM QML " + getPasswordDialog.password) bridgeForPassword.setResult(getPasswordDialog.password) bridgeForPassword.unlock() } From bfb5b4203fdb0b2f4f892baa08ea74d2e2d3436b Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Mon, 25 Nov 2019 02:22:55 -0500 Subject: [PATCH 51/69] [ui] Move unlock mutex of bridgeForPassword when the dialog is closed --- src/ui/PageSend.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ui/PageSend.qml b/src/ui/PageSend.qml index fe7b6f4b..52a7485d 100644 --- a/src/ui/PageSend.qml +++ b/src/ui/PageSend.qml @@ -200,8 +200,10 @@ Page { modal: true onAccepted:{ - //console.log("UNLOCKING FROM QML " + getPasswordDialog.password) bridgeForPassword.setResult(getPasswordDialog.password) + } + + onClosed:{ bridgeForPassword.unlock() } } From 651b5208c017f1315a8a096bbd620ac5b8666d6b Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Mon, 25 Nov 2019 03:10:44 -0500 Subject: [PATCH 52/69] [model] Fix error in signTxn when an incorrect password was provided --- src/coin/skycoin/models/wallet.go | 12 ++++++++---- src/models/walletsManager.go | 22 ++++++++++++++++++---- src/ui/PageSend.qml | 6 +----- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index d93af849..363854bd 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -351,6 +351,7 @@ func (wlt *RemoteWallet) Sign(txn core.Transaction, signer core.TxnSigner, pwd c func (wlt *RemoteWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordReader, index []int) (core.Transaction, error) { client, err := NewSkycoinApiClient(PoolSection) + var password string = "" if err != nil { logWallet.WithError(err).Warn(err) return nil, err @@ -361,11 +362,14 @@ func (wlt *RemoteWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordR logWallet.WithError(err).Warn(err) return nil, errors.ErrInvalidTxn } - password, err := pwd(fmt.Sprintf("Introduce the password of %s ", wlt.Label)) - if err != nil { - logWallet.WithError(err).Warn("Error getting password") - return nil, err + if wlt.Encrypted { + password, err = pwd(fmt.Sprintf("Introduce the password of %s ", wlt.Label)) + if err != nil { + logWallet.WithError(err).Warn("Error getting password") + return nil, err + } } + txnBytes, err := skyTxn.EncodeSkycoinTransaction() if err != nil { logWallet.WithError(err).Warn("Couldn't get Transaction Encoded") diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index b441839a..7fbf642f 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -319,6 +319,15 @@ func (walletM *WalletManager) broadcastTxn(txn *QTransaction) bool { logWalletManager.WithError(err).Warn("Error loading PEX") return false } + isSigned, err := txn.txn.IsFullySigned() + if err != nil { + logWalletManager.WithError(err).Warn("Error checking if transaction if fully signed") + return false + } + if !isSigned { + logWalletManager.Warn("Transaction is not fully signed") + return false + } err = pex.BroadcastTxn(txn.txn) if err != nil { logWalletManager.WithError(err).Warn("Error broadcasting transaction") @@ -582,6 +591,7 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source string, p var txn core.Transaction var err error + if len(wltCache) > 1 { signDescriptors := make([]core.InputSignDescriptor, 0) for _, in := range qTxn.txn.GetInputs() { @@ -594,9 +604,9 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source string, p } txn, err = walletM.signer.Sign(qTxn.txn, signDescriptors, pwd) } else { - signer, err := util.LookupSignServiceForWallet(wlts[0], core.UID(source)) - if err != nil { - logWalletManager.WithError(err).Warn("No signer %s for wallet %v", source, wlts[0]) + signer, err2 := util.LookupSignServiceForWallet(wlts[0], core.UID(source)) + if err2 != nil { + logWalletManager.WithError(err).Warnf("No signer %s for wallet %v", source, wlts[0]) return nil } txn, err = wlts[0].Sign(qTxn.txn, signer, pwd, nil) @@ -606,6 +616,7 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source string, p logWalletManager.WithError(err).Warn("Error signing txn") return nil } + qTxn, err = NewQTransactionFromTransaction(txn) if err != nil { logWalletManager.WithError(err).Warn("Error converting transaction") @@ -632,7 +643,10 @@ func (walletM *WalletManager) signAndBroadcastTxnAsync(wltIds, addresses []strin go func() { txn := <-channel - walletM.broadcastTxn(txn) + if txn != nil { + walletM.broadcastTxn(txn) + } + }() } diff --git a/src/ui/PageSend.qml b/src/ui/PageSend.qml index 52a7485d..744e4531 100644 --- a/src/ui/PageSend.qml +++ b/src/ui/PageSend.qml @@ -198,12 +198,8 @@ Page { focus: true modal: true - onAccepted:{ - - bridgeForPassword.setResult(getPasswordDialog.password) - } - onClosed:{ + bridgeForPassword.setResult(getPasswordDialog.password) bridgeForPassword.unlock() } } From 203c678bd0087f5a03a44ddbd0218e77f63527c4 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Mon, 25 Nov 2019 03:12:58 -0500 Subject: [PATCH 53/69] [models] Remove debug code --- src/models/walletsManager.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index 7fbf642f..9ddf0ff5 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -4,8 +4,6 @@ import ( "fmt" "sync" - "github.com/davecgh/go-spew/spew" - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" "github.com/fibercrypto/FiberCryptoWallet/src/util" @@ -436,8 +434,7 @@ func (walletM *WalletManager) sendFromAddresses(wltIds []string, from, addrTo, s } wlts = append(wlts, wlt) } - spew.Dump(wltCache) - fmt.Println(wlts) + addrsFrom := make([]core.Address, 0) for _, addr := range from { From 8216dd9a044da429678f1c77189f1360227aa3c5 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Wed, 27 Nov 2019 20:48:27 -0500 Subject: [PATCH 54/69] [sky] [core] [models] [ui] refs #150 - Rename KeyValueStorage => KeyValueStore --- .travis/install-golangci-lint.sh | 2 +- qtquickcontrols2.conf | 2 +- resources/fonts/code-new-roman/license.txt | 2 +- resources/images/icons/backspace.svg | 2 +- resources/images/icons/backup.svg | 2 +- resources/images/icons/license.svg | 2 +- resources/images/icons/moon.svg | 2 +- resources/images/icons/qr.svg | 2 +- resources/images/icons/sun.svg | 2 +- .../translations/update_translation_files.sh | 2 +- src/coin/mocks/KeyValueStorage.go | 8 ++++---- src/coin/mocks/Wallet.go | 18 +++++++++--------- src/coin/skycoin/models/blockchain.go | 4 ++-- src/coin/skycoin/models/testdata/test.wlt | 2 +- src/coin/skycoin/models/wallet.go | 14 +++++++------- src/core/blockchain.go | 4 ++-- src/core/storage.go | 4 ++-- src/core/textutil.go | 4 ++-- src/core/wallet.go | 6 +++--- src/models/pending/Pending.go | 2 +- src/ui/Controls/TextArea.qml | 2 +- src/ui/Controls/TextField.qml | 2 +- src/ui/CustomMenuItem.qml | 2 +- .../Delegates/OutputsListAddressDelegate.qml | 2 +- src/ui/Delegates/PasswordRequesterDelegate.qml | 2 +- src/ui/Dialogs/DialogAddAddresses.qml | 2 +- src/ui/Dialogs/DialogAddLoadWallet.qml | 2 +- src/ui/Dialogs/DialogEditWallet.qml | 2 +- src/ui/Dialogs/DialogSelectAddressByWallet.qml | 2 +- src/ui/MenuThemeAccent.qml | 2 +- src/ui/Settings.qml | 2 +- src/ui/ToolButtonQR.qml | 2 +- src/ui/Utils/QRCode.qml | 2 +- src/ui/WalletSettings.qml | 2 +- src/util/storage.go | 2 +- 35 files changed, 58 insertions(+), 58 deletions(-) diff --git a/.travis/install-golangci-lint.sh b/.travis/install-golangci-lint.sh index ee94ad03..e10f1253 100755 --- a/.travis/install-golangci-lint.sh +++ b/.travis/install-golangci-lint.sh @@ -384,4 +384,4 @@ CHECKSUM=${PROJECT_NAME}-${VERSION}-checksums.txt CHECKSUM_URL=${GITHUB_DOWNLOAD}/${TAG}/${CHECKSUM} -execute \ No newline at end of file +execute diff --git a/qtquickcontrols2.conf b/qtquickcontrols2.conf index f399a31f..341c2f81 100644 --- a/qtquickcontrols2.conf +++ b/qtquickcontrols2.conf @@ -7,4 +7,4 @@ Style = Material [Material] Accent = Blue -Variant = Dense \ No newline at end of file +Variant = Dense diff --git a/resources/fonts/code-new-roman/license.txt b/resources/fonts/code-new-roman/license.txt index 14c043d6..e47e0f90 100644 --- a/resources/fonts/code-new-roman/license.txt +++ b/resources/fonts/code-new-roman/license.txt @@ -38,4 +38,4 @@ TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/resources/images/icons/backspace.svg b/resources/images/icons/backspace.svg index 27e5b8aa..af1122b3 100644 --- a/resources/images/icons/backspace.svg +++ b/resources/images/icons/backspace.svg @@ -37,4 +37,4 @@ - \ No newline at end of file + diff --git a/resources/images/icons/backup.svg b/resources/images/icons/backup.svg index e5c4951e..c573b2e8 100644 --- a/resources/images/icons/backup.svg +++ b/resources/images/icons/backup.svg @@ -86,4 +86,4 @@ - \ No newline at end of file + diff --git a/resources/images/icons/license.svg b/resources/images/icons/license.svg index 7ed4b446..0e086e63 100755 --- a/resources/images/icons/license.svg +++ b/resources/images/icons/license.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/images/icons/moon.svg b/resources/images/icons/moon.svg index a22bc972..bfe4d5c8 100644 --- a/resources/images/icons/moon.svg +++ b/resources/images/icons/moon.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/images/icons/qr.svg b/resources/images/icons/qr.svg index ebb8d1ec..8b5c0b3a 100644 --- a/resources/images/icons/qr.svg +++ b/resources/images/icons/qr.svg @@ -28,4 +28,4 @@ - \ No newline at end of file + diff --git a/resources/images/icons/sun.svg b/resources/images/icons/sun.svg index f31d7354..adae7a68 100644 --- a/resources/images/icons/sun.svg +++ b/resources/images/icons/sun.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/translations/update_translation_files.sh b/resources/translations/update_translation_files.sh index e10e3a58..302a1128 100644 --- a/resources/translations/update_translation_files.sh +++ b/resources/translations/update_translation_files.sh @@ -4,4 +4,4 @@ lupdate ../../src/ui/*.qml ../../src/ui/Controls/*.qml ../../src/ui/Delegates/*. lupdate ../../src/ui/*.qml ../../src/ui/Controls/*.qml ../../src/ui/Delegates/*.qml ../../src/ui/Dialogs/*.qml -source-language en_us -target-language es_es -ts FiberCryptoWallet_es.ts lupdate ../../src/ui/*.qml ../../src/ui/Controls/*.qml ../../src/ui/Delegates/*.qml ../../src/ui/Dialogs/*.qml -source-language en_us -target-language fr_fr -ts FiberCryptoWallet_fr.ts # echo '\033[1;37mSearching for strings to translate in Go sources...\033[0m' -# find ../../src -path *.go -type f -printf "%p " | lupdate -tr-function-alias translate+=Translate -source-language en_us -target-language en_us -ts FiberCryptoWallet_en.ts \ No newline at end of file +# find ../../src -path *.go -type f -printf "%p " | lupdate -tr-function-alias translate+=Translate -source-language en_us -target-language en_us -ts FiberCryptoWallet_en.ts diff --git a/src/coin/mocks/KeyValueStorage.go b/src/coin/mocks/KeyValueStorage.go index 277b6e1a..4dde59f7 100644 --- a/src/coin/mocks/KeyValueStorage.go +++ b/src/coin/mocks/KeyValueStorage.go @@ -4,13 +4,13 @@ package mocks import mock "github.com/stretchr/testify/mock" -// KeyValueStorage is an autogenerated mock type for the KeyValueStorage type -type KeyValueStorage struct { +// KeyValueStore is an autogenerated mock type for the KeyValueStore type +type KeyValueStore struct { mock.Mock } // GetValue provides a mock function with given fields: key -func (_m *KeyValueStorage) GetValue(key string) interface{} { +func (_m *KeyValueStore) GetValue(key string) interface{} { ret := _m.Called(key) var r0 interface{} @@ -26,6 +26,6 @@ func (_m *KeyValueStorage) GetValue(key string) interface{} { } // SetValue provides a mock function with given fields: key, value -func (_m *KeyValueStorage) SetValue(key string, value interface{}) { +func (_m *KeyValueStore) SetValue(key string, value interface{}) { _m.Called(key, value) } diff --git a/src/coin/mocks/Wallet.go b/src/coin/mocks/Wallet.go index 05390c18..41e75845 100644 --- a/src/coin/mocks/Wallet.go +++ b/src/coin/mocks/Wallet.go @@ -94,11 +94,11 @@ func (_m *Wallet) GetLoadedAddresses() (core.AddressIterator, error) { } // SendFromAddress provides a mock function with given fields: from, to, change, options -func (_m *Wallet) SendFromAddress(from []core.Address, to []core.TransactionOutput, change core.Address, options core.KeyValueStorage) (core.Transaction, error) { +func (_m *Wallet) SendFromAddress(from []core.Address, to []core.TransactionOutput, change core.Address, options core.KeyValueStore) (core.Transaction, error) { ret := _m.Called(from, to, change, options) var r0 core.Transaction - if rf, ok := ret.Get(0).(func([]core.Address, []core.TransactionOutput, core.Address, core.KeyValueStorage) core.Transaction); ok { + if rf, ok := ret.Get(0).(func([]core.Address, []core.TransactionOutput, core.Address, core.KeyValueStore) core.Transaction); ok { r0 = rf(from, to, change, options) } else { if ret.Get(0) != nil { @@ -107,7 +107,7 @@ func (_m *Wallet) SendFromAddress(from []core.Address, to []core.TransactionOutp } var r1 error - if rf, ok := ret.Get(1).(func([]core.Address, []core.TransactionOutput, core.Address, core.KeyValueStorage) error); ok { + if rf, ok := ret.Get(1).(func([]core.Address, []core.TransactionOutput, core.Address, core.KeyValueStore) error); ok { r1 = rf(from, to, change, options) } else { r1 = ret.Error(1) @@ -145,11 +145,11 @@ func (_m *Wallet) Sign(txn core.Transaction, signer core.TxnSigner, pwd core.Pas } // Spend provides a mock function with given fields: unspent, new, change, options -func (_m *Wallet) Spend(unspent []core.TransactionOutput, new []core.TransactionOutput, change core.Address, options core.KeyValueStorage) (core.Transaction, error) { +func (_m *Wallet) Spend(unspent []core.TransactionOutput, new []core.TransactionOutput, change core.Address, options core.KeyValueStore) (core.Transaction, error) { ret := _m.Called(unspent, new, change, options) var r0 core.Transaction - if rf, ok := ret.Get(0).(func([]core.TransactionOutput, []core.TransactionOutput, core.Address, core.KeyValueStorage) core.Transaction); ok { + if rf, ok := ret.Get(0).(func([]core.TransactionOutput, []core.TransactionOutput, core.Address, core.KeyValueStore) core.Transaction); ok { r0 = rf(unspent, new, change, options) } else { if ret.Get(0) != nil { @@ -158,7 +158,7 @@ func (_m *Wallet) Spend(unspent []core.TransactionOutput, new []core.Transaction } var r1 error - if rf, ok := ret.Get(1).(func([]core.TransactionOutput, []core.TransactionOutput, core.Address, core.KeyValueStorage) error); ok { + if rf, ok := ret.Get(1).(func([]core.TransactionOutput, []core.TransactionOutput, core.Address, core.KeyValueStore) error); ok { r1 = rf(unspent, new, change, options) } else { r1 = ret.Error(1) @@ -168,11 +168,11 @@ func (_m *Wallet) Spend(unspent []core.TransactionOutput, new []core.Transaction } // Transfer provides a mock function with given fields: to, options -func (_m *Wallet) Transfer(to core.TransactionOutput, options core.KeyValueStorage) (core.Transaction, error) { +func (_m *Wallet) Transfer(to core.TransactionOutput, options core.KeyValueStore) (core.Transaction, error) { ret := _m.Called(to, options) var r0 core.Transaction - if rf, ok := ret.Get(0).(func(core.TransactionOutput, core.KeyValueStorage) core.Transaction); ok { + if rf, ok := ret.Get(0).(func(core.TransactionOutput, core.KeyValueStore) core.Transaction); ok { r0 = rf(to, options) } else { if ret.Get(0) != nil { @@ -181,7 +181,7 @@ func (_m *Wallet) Transfer(to core.TransactionOutput, options core.KeyValueStora } var r1 error - if rf, ok := ret.Get(1).(func(core.TransactionOutput, core.KeyValueStorage) error); ok { + if rf, ok := ret.Get(1).(func(core.TransactionOutput, core.KeyValueStore) error); ok { r1 = rf(to, options) } else { r1 = ret.Error(1) diff --git a/src/coin/skycoin/models/blockchain.go b/src/coin/skycoin/models/blockchain.go index 6cc66b9d..0dece6ae 100644 --- a/src/coin/skycoin/models/blockchain.go +++ b/src/coin/skycoin/models/blockchain.go @@ -241,7 +241,7 @@ func (ss *SkycoinBlockchain) requestStatusInfo() error { // SendFromAddress instantiates a transaction to send funds from specific source addresses // to multiple destination addresses -func (ss *SkycoinBlockchain) SendFromAddress(from []core.WalletAddress, to []core.TransactionOutput, change core.Address, options core.KeyValueStorage) (core.Transaction, error) { +func (ss *SkycoinBlockchain) SendFromAddress(from []core.WalletAddress, to []core.TransactionOutput, change core.Address, options core.KeyValueStore) (core.Transaction, error) { logBlockchain.Info("Sending coins from addresses via blockchain API") addresses := make([]core.Address, len(from)) for i, wa := range from { @@ -252,7 +252,7 @@ func (ss *SkycoinBlockchain) SendFromAddress(from []core.WalletAddress, to []cor } // Spend instantiates a transaction that spends specific outputs to send to multiple destination addresses -func (ss *SkycoinBlockchain) Spend(unspent []core.WalletOutput, new []core.TransactionOutput, change core.Address, options core.KeyValueStorage) (core.Transaction, error) { +func (ss *SkycoinBlockchain) Spend(unspent []core.WalletOutput, new []core.TransactionOutput, change core.Address, options core.KeyValueStore) (core.Transaction, error) { logBlockchain.Info("Spending coins from outputs via blockchain API") uxouts := make([]core.TransactionOutput, len(unspent)) for i, wu := range unspent { diff --git a/src/coin/skycoin/models/testdata/test.wlt b/src/coin/skycoin/models/testdata/test.wlt index bb0512de..d782322c 100644 --- a/src/coin/skycoin/models/testdata/test.wlt +++ b/src/coin/skycoin/models/testdata/test.wlt @@ -36,4 +36,4 @@ "secret_key": "7418dd56fc6fef3943673c534bc4d21bfb00f18bf4ffacf8c6e06489299ca26a" } ] -} \ No newline at end of file +} diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index 363854bd..f3e23822 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -416,7 +416,7 @@ func (wlt *RemoteWallet) GetId() string { return wlt.Id } -func (wlt *RemoteWallet) Transfer(destination core.TransactionOutput, options core.KeyValueStorage) (core.Transaction, error) { +func (wlt *RemoteWallet) Transfer(destination core.TransactionOutput, options core.KeyValueStore) (core.Transaction, error) { logWallet.Info("Transfer from remote wallet") amount, err := destination.GetCoins(SkycoinTicker) if err != nil { @@ -460,7 +460,7 @@ func (wlt *RemoteWallet) Transfer(destination core.TransactionOutput, options co type createTxn func(*api.CreateTransactionRequest) (core.Transaction, error) -func createTransaction(from []core.Address, to, uxOut []core.TransactionOutput, change core.Address, options core.KeyValueStorage, createTxnFunc createTxn) (core.Transaction, error) { +func createTransaction(from []core.Address, to, uxOut []core.TransactionOutput, change core.Address, options core.KeyValueStore, createTxnFunc createTxn) (core.Transaction, error) { logWallet.Info("Creating transaction...") var req api.CreateTransactionRequest req.IgnoreUnconfirmed = false @@ -549,7 +549,7 @@ func createTransaction(from []core.Address, to, uxOut []core.TransactionOutput, } -func (wlt *RemoteWallet) SendFromAddress(from []core.Address, to []core.TransactionOutput, change core.Address, options core.KeyValueStorage) (core.Transaction, error) { +func (wlt *RemoteWallet) SendFromAddress(from []core.Address, to []core.TransactionOutput, change core.Address, options core.KeyValueStore) (core.Transaction, error) { logWallet.Info("Sending from address of remote wallets") createTxnFunc := func(txnR *api.CreateTransactionRequest) (core.Transaction, error) { logWallet.Info("Creating transaction for remote wallet") @@ -576,7 +576,7 @@ func (wlt *RemoteWallet) SendFromAddress(from []core.Address, to []core.Transact return createTransaction(from, to, nil, change, options, createTxnFunc) } -func (wlt *RemoteWallet) Spend(unspent, new []core.TransactionOutput, change core.Address, options core.KeyValueStorage) (core.Transaction, error) { +func (wlt *RemoteWallet) Spend(unspent, new []core.TransactionOutput, change core.Address, options core.KeyValueStore) (core.Transaction, error) { createTxnFunc := func(txnR *api.CreateTransactionRequest) (core.Transaction, error) { logWallet.Info("Spend using remote wallet") var req api.WalletCreateTransactionRequest @@ -1290,7 +1290,7 @@ func skyAPICreateTxn(txnReq *api.CreateTransactionRequest) (core.Transaction, er return fromTxnResponse(txnR), nil } -func (wlt *LocalWallet) Transfer(to core.TransactionOutput, options core.KeyValueStorage) (core.Transaction, error) { +func (wlt *LocalWallet) Transfer(to core.TransactionOutput, options core.KeyValueStore) (core.Transaction, error) { logWallet.Info("Sending form local wallet") quotient, err := util.AltcoinQuotient(Sky) if err != nil { @@ -1321,7 +1321,7 @@ func (wlt *LocalWallet) Transfer(to core.TransactionOutput, options core.KeyValu return createTransaction(addresses, []core.TransactionOutput{&txnOutput}, nil, nil, options, createTxnFunc) } -func (wlt LocalWallet) SendFromAddress(from []core.Address, to []core.TransactionOutput, change core.Address, options core.KeyValueStorage) (core.Transaction, error) { +func (wlt LocalWallet) SendFromAddress(from []core.Address, to []core.TransactionOutput, change core.Address, options core.KeyValueStore) (core.Transaction, error) { logWallet.Info("Sending from addresses in local wallet") createTxnFunc := func(txnReq *api.CreateTransactionRequest) (core.Transaction, error) { client, err := NewSkycoinApiClient(PoolSection) @@ -1342,7 +1342,7 @@ func (wlt LocalWallet) SendFromAddress(from []core.Address, to []core.Transactio return createTransaction(from, to, nil, change, options, createTxnFunc) } -func (wlt LocalWallet) Spend(unspent, new []core.TransactionOutput, change core.Address, options core.KeyValueStorage) (core.Transaction, error) { +func (wlt LocalWallet) Spend(unspent, new []core.TransactionOutput, change core.Address, options core.KeyValueStore) (core.Transaction, error) { logWallet.Info("Spending from local wallet") createTxnFunc := func(txnReq *api.CreateTransactionRequest) (core.Transaction, error) { client, err := NewSkycoinApiClient(PoolSection) diff --git a/src/core/blockchain.go b/src/core/blockchain.go index d30ff8a1..952e9ba7 100644 --- a/src/core/blockchain.go +++ b/src/core/blockchain.go @@ -25,7 +25,7 @@ type BlockchainStatus interface { type BlockchainTransactionAPI interface { // SendFromAddress instantiates a transaction to send funds from specific source addresses // to multiple destination addresses - SendFromAddress(from []WalletAddress, to []TransactionOutput, change Address, options KeyValueStorage) (Transaction, error) + SendFromAddress(from []WalletAddress, to []TransactionOutput, change Address, options KeyValueStore) (Transaction, error) // Spend instantiate a transaction that spends specific outputs to send to multiple destination addresses - Spend(unspent []WalletOutput, new []TransactionOutput, change Address, options KeyValueStorage) (Transaction, error) + Spend(unspent []WalletOutput, new []TransactionOutput, change Address, options KeyValueStore) (Transaction, error) } diff --git a/src/core/storage.go b/src/core/storage.go index 4e17ee30..b13db38f 100644 --- a/src/core/storage.go +++ b/src/core/storage.go @@ -1,7 +1,7 @@ package core -// KeyValueStorage provides read / write access to values given a key -type KeyValueStorage interface { +// KeyValueStore provides read / write access to values given a key +type KeyValueStore interface { // GetValue lookup value for key GetValue(key string) interface{} // SetValue bind value o known key diff --git a/src/core/textutil.go b/src/core/textutil.go index c75f6dc2..e8fcf21d 100644 --- a/src/core/textutil.go +++ b/src/core/textutil.go @@ -1,4 +1,4 @@ package core -// PasswordReadeer secure retrieval of passwords from users -type PasswordReader func(message string) (string, error) +// PasswordReader secure retrieval of passwords from users +type PasswordReader func(string) (string, error) diff --git a/src/core/wallet.go b/src/core/wallet.go index b28e82e0..f5a9d42d 100644 --- a/src/core/wallet.go +++ b/src/core/wallet.go @@ -49,12 +49,12 @@ type Wallet interface { // SetLabel establishes a label for this wallet SetLabel(wltName string) // Transfer instantiates unsigned transaction to send funds from any wallet address to single destination - Transfer(to TransactionOutput, options KeyValueStorage) (Transaction, error) + Transfer(to TransactionOutput, options KeyValueStore) (Transaction, error) // SendFromAddress instantiates unsigned transaction to send funds from specific source addresses // to multiple destination addresses - SendFromAddress(from []Address, to []TransactionOutput, change Address, options KeyValueStorage) (Transaction, error) + SendFromAddress(from []Address, to []TransactionOutput, change Address, options KeyValueStore) (Transaction, error) // Spend instantiate unsigned transaction spending specific outputs to send to multiple destination addresses - Spend(unspent, new []TransactionOutput, change Address, options KeyValueStorage) (Transaction, error) + Spend(unspent, new []TransactionOutput, change Address, options KeyValueStore) (Transaction, error) // GenAddresses discover new addresses based on default hierarchically deterministic derivation sequences // FIXME: Support account index to be fully compatible with BIP44 GenAddresses(addrType AddressType, startIndex, count uint32, pwd PasswordReader) AddressIterator diff --git a/src/models/pending/Pending.go b/src/models/pending/Pending.go index bbed6a03..abd1d6b6 100644 --- a/src/models/pending/Pending.go +++ b/src/models/pending/Pending.go @@ -3,4 +3,4 @@ package pending func init() { PendingTransactionList_QmlRegisterType2("PendingModels", 1, 0, "QPendingList") PendingTransaction_QmlRegisterType2("PendingModels", 1, 0, "QPendingTransaction") -} \ No newline at end of file +} diff --git a/src/ui/Controls/TextArea.qml b/src/ui/Controls/TextArea.qml index 2801b083..3caabe4c 100644 --- a/src/ui/Controls/TextArea.qml +++ b/src/ui/Controls/TextArea.qml @@ -29,4 +29,4 @@ TextArea { contextMenu.popup() } } -} \ No newline at end of file +} diff --git a/src/ui/Controls/TextField.qml b/src/ui/Controls/TextField.qml index d082156a..4294ebfa 100644 --- a/src/ui/Controls/TextField.qml +++ b/src/ui/Controls/TextField.qml @@ -29,4 +29,4 @@ TextField { contextMenu.popup() } } -} \ No newline at end of file +} diff --git a/src/ui/CustomMenuItem.qml b/src/ui/CustomMenuItem.qml index 0d3e48e2..9b4b207b 100644 --- a/src/ui/CustomMenuItem.qml +++ b/src/ui/CustomMenuItem.qml @@ -26,4 +26,4 @@ MenuItem { opacity: parent.highlighted ? 1.0 : 0.0 Behavior on opacity { NumberAnimation { duration: 500; easing.type: Easing.OutQuint } } } -} \ No newline at end of file +} diff --git a/src/ui/Delegates/OutputsListAddressDelegate.qml b/src/ui/Delegates/OutputsListAddressDelegate.qml index 6c1ed619..900d77b5 100644 --- a/src/ui/Delegates/OutputsListAddressDelegate.qml +++ b/src/ui/Delegates/OutputsListAddressDelegate.qml @@ -83,4 +83,4 @@ Item { } // ListView // Roles: outputID, addressSky, addressCoinHours -} \ No newline at end of file +} diff --git a/src/ui/Delegates/PasswordRequesterDelegate.qml b/src/ui/Delegates/PasswordRequesterDelegate.qml index 91d09d72..c2f2528a 100644 --- a/src/ui/Delegates/PasswordRequesterDelegate.qml +++ b/src/ui/Delegates/PasswordRequesterDelegate.qml @@ -31,4 +31,4 @@ Item { passwordForgotten() } } -} \ No newline at end of file +} diff --git a/src/ui/Dialogs/DialogAddAddresses.qml b/src/ui/Dialogs/DialogAddAddresses.qml index 611bd0e2..749619cd 100644 --- a/src/ui/Dialogs/DialogAddAddresses.qml +++ b/src/ui/Dialogs/DialogAddAddresses.qml @@ -33,4 +33,4 @@ Dialog { focus: true } } // ColumnLayout (root) -} \ No newline at end of file +} diff --git a/src/ui/Dialogs/DialogAddLoadWallet.qml b/src/ui/Dialogs/DialogAddLoadWallet.qml index e12d8e89..2f0b29df 100644 --- a/src/ui/Dialogs/DialogAddLoadWallet.qml +++ b/src/ui/Dialogs/DialogAddLoadWallet.qml @@ -204,4 +204,4 @@ Dialog { anchors.rightMargin: -dialogAddWallet.rightPadding + 1 } } // Flickable -} \ No newline at end of file +} diff --git a/src/ui/Dialogs/DialogEditWallet.qml b/src/ui/Dialogs/DialogEditWallet.qml index bd11c281..1a3de027 100644 --- a/src/ui/Dialogs/DialogEditWallet.qml +++ b/src/ui/Dialogs/DialogEditWallet.qml @@ -40,4 +40,4 @@ Dialog { standardButton(Dialog.Ok).enabled = text && text != originalWalletName } } -} \ No newline at end of file +} diff --git a/src/ui/Dialogs/DialogSelectAddressByWallet.qml b/src/ui/Dialogs/DialogSelectAddressByWallet.qml index 4d1ba3f4..8525fc44 100644 --- a/src/ui/Dialogs/DialogSelectAddressByWallet.qml +++ b/src/ui/Dialogs/DialogSelectAddressByWallet.qml @@ -90,4 +90,4 @@ Dialog { ScrollIndicator.vertical: ScrollIndicator { } } // ListView } // ColumnLayout -} \ No newline at end of file +} diff --git a/src/ui/MenuThemeAccent.qml b/src/ui/MenuThemeAccent.qml index 65f52c11..13594e93 100644 --- a/src/ui/MenuThemeAccent.qml +++ b/src/ui/MenuThemeAccent.qml @@ -125,4 +125,4 @@ Menu { } // Rectangle } // Repeater } // Grid -} \ No newline at end of file +} diff --git a/src/ui/Settings.qml b/src/ui/Settings.qml index fc193ce2..087abb7c 100644 --- a/src/ui/Settings.qml +++ b/src/ui/Settings.qml @@ -179,4 +179,4 @@ Page { } } } // Dialog -} \ No newline at end of file +} diff --git a/src/ui/ToolButtonQR.qml b/src/ui/ToolButtonQR.qml index db5fceec..d1761ead 100644 --- a/src/ui/ToolButtonQR.qml +++ b/src/ui/ToolButtonQR.qml @@ -13,4 +13,4 @@ ToolButton { ToolTip.text: qsTr("Show QR code") ToolTip.visible: hovered // TODO: pressed when mobile? ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval -} \ No newline at end of file +} diff --git a/src/ui/Utils/QRCode.qml b/src/ui/Utils/QRCode.qml index fd4d8d83..82f35494 100644 --- a/src/ui/Utils/QRCode.qml +++ b/src/ui/Utils/QRCode.qml @@ -48,4 +48,4 @@ Canvas { onValueChanged : { requestPaint() } -} \ No newline at end of file +} diff --git a/src/ui/WalletSettings.qml b/src/ui/WalletSettings.qml index 0eace3b3..208f014d 100644 --- a/src/ui/WalletSettings.qml +++ b/src/ui/WalletSettings.qml @@ -41,4 +41,4 @@ ColumnLayout { checked: false } } -} \ No newline at end of file +} diff --git a/src/util/storage.go b/src/util/storage.go index ed73b58a..1371ea78 100644 --- a/src/util/storage.go +++ b/src/util/storage.go @@ -26,5 +26,5 @@ func NewKeyValueMap() *KeyValueMap { // Type assertions var ( - _ core.KeyValueStorage = &KeyValueMap{} + _ core.KeyValueStore = &KeyValueMap{} ) From c3c0ade9ceca58794c3a6126605faa7cd2eb7f73 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Thu, 28 Nov 2019 12:58:05 -0500 Subject: [PATCH 55/69] [mocks] [sky] [core] [util] refs #150 - PasswordReader type receives KeyValueStore with context info - Coin mocks updated - New mocks for BlockchainSignService, BlockchainTransactionAPI, KeyValueStore, WalletAddress, WalletOutput - String constants for wallet signing ops - Type names for logging - Rename signingKeyPair.signer => signingKeyPair.signerID - Rename KeyValueStorage => KeyValueStore - Add NewMapWithSingleKey - Add KeyValuesWithDefaults --- src/coin/mocks/AltcoinPlugin.go | 46 ++++++++++ src/coin/mocks/BlockchainSignService.go | 34 ++++++++ src/coin/mocks/BlockchainTransactionAPI.go | 57 +++++++++++++ .../{KeyValueStorage.go => KeyValueStore.go} | 0 src/coin/mocks/WalletAddress.go | 43 ++++++++++ src/coin/mocks/WalletOutput.go | 43 ++++++++++ src/coin/skycoin/models/sign.go | 4 +- src/coin/skycoin/models/wallet.go | 77 +++++++++++++---- src/coin/skycoin/models/wallet_test.go | 15 ++-- src/core/sign.go | 2 +- src/core/storage.go | 84 +++++++++++++++++++ src/core/textutil.go | 2 +- src/util/sign.go | 26 +++--- src/util/storage.go | 44 ++++++++++ src/util/storage_test.go | 54 ++++++++++++ src/util/textutil.go | 6 +- 16 files changed, 498 insertions(+), 39 deletions(-) create mode 100644 src/coin/mocks/BlockchainSignService.go create mode 100644 src/coin/mocks/BlockchainTransactionAPI.go rename src/coin/mocks/{KeyValueStorage.go => KeyValueStore.go} (100%) create mode 100644 src/coin/mocks/WalletAddress.go create mode 100644 src/coin/mocks/WalletOutput.go create mode 100644 src/util/storage_test.go diff --git a/src/coin/mocks/AltcoinPlugin.go b/src/coin/mocks/AltcoinPlugin.go index fb220e46..0f46c62b 100644 --- a/src/coin/mocks/AltcoinPlugin.go +++ b/src/coin/mocks/AltcoinPlugin.go @@ -93,6 +93,52 @@ func (_m *AltcoinPlugin) LoadPEX(netType string) (core.PEX, error) { return r0, r1 } +// LoadSignService provides a mock function with given fields: +func (_m *AltcoinPlugin) LoadSignService() (core.BlockchainSignService, error) { + ret := _m.Called() + + var r0 core.BlockchainSignService + if rf, ok := ret.Get(0).(func() core.BlockchainSignService); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.BlockchainSignService) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LoadTransactionAPI provides a mock function with given fields: netType +func (_m *AltcoinPlugin) LoadTransactionAPI(netType string) (core.BlockchainTransactionAPI, error) { + ret := _m.Called(netType) + + var r0 core.BlockchainTransactionAPI + if rf, ok := ret.Get(0).(func(string) core.BlockchainTransactionAPI); ok { + r0 = rf(netType) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.BlockchainTransactionAPI) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(netType) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // LoadWalletEnvs provides a mock function with given fields: func (_m *AltcoinPlugin) LoadWalletEnvs() []core.WalletEnv { ret := _m.Called() diff --git a/src/coin/mocks/BlockchainSignService.go b/src/coin/mocks/BlockchainSignService.go new file mode 100644 index 00000000..fbb5ca9f --- /dev/null +++ b/src/coin/mocks/BlockchainSignService.go @@ -0,0 +1,34 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import mock "github.com/stretchr/testify/mock" + +// BlockchainSignService is an autogenerated mock type for the BlockchainSignService type +type BlockchainSignService struct { + mock.Mock +} + +// Sign provides a mock function with given fields: txn, signSpec, pwd +func (_m *BlockchainSignService) Sign(txn core.Transaction, signSpec []core.InputSignDescriptor, pwd core.PasswordReader) (core.Transaction, error) { + ret := _m.Called(txn, signSpec, pwd) + + var r0 core.Transaction + if rf, ok := ret.Get(0).(func(core.Transaction, []core.InputSignDescriptor, core.PasswordReader) core.Transaction); ok { + r0 = rf(txn, signSpec, pwd) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Transaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(core.Transaction, []core.InputSignDescriptor, core.PasswordReader) error); ok { + r1 = rf(txn, signSpec, pwd) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/src/coin/mocks/BlockchainTransactionAPI.go b/src/coin/mocks/BlockchainTransactionAPI.go new file mode 100644 index 00000000..2b6ed28f --- /dev/null +++ b/src/coin/mocks/BlockchainTransactionAPI.go @@ -0,0 +1,57 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import mock "github.com/stretchr/testify/mock" + +// BlockchainTransactionAPI is an autogenerated mock type for the BlockchainTransactionAPI type +type BlockchainTransactionAPI struct { + mock.Mock +} + +// SendFromAddress provides a mock function with given fields: from, to, change, options +func (_m *BlockchainTransactionAPI) SendFromAddress(from []core.WalletAddress, to []core.TransactionOutput, change core.Address, options core.KeyValueStore) (core.Transaction, error) { + ret := _m.Called(from, to, change, options) + + var r0 core.Transaction + if rf, ok := ret.Get(0).(func([]core.WalletAddress, []core.TransactionOutput, core.Address, core.KeyValueStore) core.Transaction); ok { + r0 = rf(from, to, change, options) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Transaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]core.WalletAddress, []core.TransactionOutput, core.Address, core.KeyValueStore) error); ok { + r1 = rf(from, to, change, options) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Spend provides a mock function with given fields: unspent, new, change, options +func (_m *BlockchainTransactionAPI) Spend(unspent []core.WalletOutput, new []core.TransactionOutput, change core.Address, options core.KeyValueStore) (core.Transaction, error) { + ret := _m.Called(unspent, new, change, options) + + var r0 core.Transaction + if rf, ok := ret.Get(0).(func([]core.WalletOutput, []core.TransactionOutput, core.Address, core.KeyValueStore) core.Transaction); ok { + r0 = rf(unspent, new, change, options) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Transaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]core.WalletOutput, []core.TransactionOutput, core.Address, core.KeyValueStore) error); ok { + r1 = rf(unspent, new, change, options) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/src/coin/mocks/KeyValueStorage.go b/src/coin/mocks/KeyValueStore.go similarity index 100% rename from src/coin/mocks/KeyValueStorage.go rename to src/coin/mocks/KeyValueStore.go diff --git a/src/coin/mocks/WalletAddress.go b/src/coin/mocks/WalletAddress.go new file mode 100644 index 00000000..043d5cca --- /dev/null +++ b/src/coin/mocks/WalletAddress.go @@ -0,0 +1,43 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import mock "github.com/stretchr/testify/mock" + +// WalletAddress is an autogenerated mock type for the WalletAddress type +type WalletAddress struct { + mock.Mock +} + +// GetAddress provides a mock function with given fields: +func (_m *WalletAddress) GetAddress() core.Address { + ret := _m.Called() + + var r0 core.Address + if rf, ok := ret.Get(0).(func() core.Address); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Address) + } + } + + return r0 +} + +// GetWallet provides a mock function with given fields: +func (_m *WalletAddress) GetWallet() core.Wallet { + ret := _m.Called() + + var r0 core.Wallet + if rf, ok := ret.Get(0).(func() core.Wallet); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Wallet) + } + } + + return r0 +} diff --git a/src/coin/mocks/WalletOutput.go b/src/coin/mocks/WalletOutput.go new file mode 100644 index 00000000..8e441262 --- /dev/null +++ b/src/coin/mocks/WalletOutput.go @@ -0,0 +1,43 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import mock "github.com/stretchr/testify/mock" + +// WalletOutput is an autogenerated mock type for the WalletOutput type +type WalletOutput struct { + mock.Mock +} + +// GetOutput provides a mock function with given fields: +func (_m *WalletOutput) GetOutput() core.TransactionOutput { + ret := _m.Called() + + var r0 core.TransactionOutput + if rf, ok := ret.Get(0).(func() core.TransactionOutput); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.TransactionOutput) + } + } + + return r0 +} + +// GetWallet provides a mock function with given fields: +func (_m *WalletOutput) GetWallet() core.Wallet { + ret := _m.Called() + + var r0 core.Wallet + if rf, ok := ret.Get(0).(func() core.Wallet); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Wallet) + } + } + + return r0 +} diff --git a/src/coin/skycoin/models/sign.go b/src/coin/skycoin/models/sign.go index cf9a563a..3bd8ed69 100644 --- a/src/coin/skycoin/models/sign.go +++ b/src/coin/skycoin/models/sign.go @@ -9,8 +9,8 @@ import ( type SkycoinSignService struct{} // Sign creates a new transaction by (fully or partially) signing a given transaction -func (sss *SkycoinSignService) Sign(txn core.Transaction, signSpec []core.InputSignDescriptor, pwds map[string]core.PasswordReader) (core.Transaction, error) { - return util.GenericMultiWalletSign(txn, signSpec, pwds) +func (sss *SkycoinSignService) Sign(txn core.Transaction, signSpec []core.InputSignDescriptor, pwd core.PasswordReader) (core.Transaction, error) { + return util.GenericMultiWalletSign(txn, signSpec, pwd) } // Type assertions diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index f3e23822..77af197c 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -27,14 +27,15 @@ import ( var logWallet = logging.MustGetLogger("Skycoin Wallet") const ( - Sky = params.SkycoinTicker - CoinHour = params.CoinHoursTicker - CalculatedHour = params.CalculatedHoursTicker + Sky = params.SkycoinTicker + CoinHour = params.CoinHoursTicker + CalculatedHour = params.CalculatedHoursTicker + WalletTypeDeterministic = "deterministic" WalletTypeCollection = "collection" WalletTypeBip44 = "bip44" + WalletTypeXPub = "xpub" - WalletTypeXPub = "xpub" walletExt = ".wlt" WalletTimestampFormat = "2006_01_02" @@ -42,7 +43,7 @@ const ( SignerIDRemoteWallet = "sky.remote" ) -//Implements WalletIterator interface +// SkycoinWalletIterator implements WalletIterator interface type SkycoinWalletIterator struct { current int wallets []core.Wallet @@ -108,7 +109,11 @@ func (wltSrv *SkycoinRemoteWallet) CreateWallet(label string, seed string, IsEnc } defer ReturnSkycoinClient(c) if IsEncrypted { - password, err := pwd("Enter your password") + pwdCtx := util.NewKeyValueMap() + pwdCtx.SetValue(core.StrTypeName, core.TypeNameWalletSet) + pwdCtx.SetValue(core.StrMethodName, "CreateWallet") + pwdCtx.SetValue(core.StrWalletLabel, label) + password, err := pwd("Enter password to encrypt wallet", pwdCtx) if err != nil { logWallet.WithError(err).Fatal("Something was wrong entering the password") return nil, err @@ -156,7 +161,11 @@ func (wltSrv *SkycoinRemoteWallet) Encrypt(walletName string, pwd core.PasswordR return } defer ReturnSkycoinClient(c) - password, err := pwd("Insert password") + pwdCtx := util.NewKeyValueMap() + pwdCtx.SetValue(core.StrTypeName, core.TypeNameWalletStorage) + pwdCtx.SetValue(core.StrMethodName, "Encrypt") + pwdCtx.SetValue(core.StrWalletName, walletName) + password, err := pwd("Enter password to encrypt wallet", pwdCtx) if err != nil { logWallet.WithError(err).Fatal("Something was wrong entering the password") return @@ -177,7 +186,11 @@ func (wltSrv *SkycoinRemoteWallet) Decrypt(walletName string, pwd core.PasswordR return } defer ReturnSkycoinClient(c) - password, err := pwd("Insert password") + pwdCtx := util.NewKeyValueMap() + pwdCtx.SetValue(core.StrTypeName, core.TypeNameWalletStorage) + pwdCtx.SetValue(core.StrMethodName, "Decrypt") + pwdCtx.SetValue(core.StrWalletName, walletName) + password, err := pwd("Enter password to decrypt wallet", pwdCtx) if err != nil { logWallet.WithError(err).Fatal("Something was wrong entering the password") return @@ -363,7 +376,11 @@ func (wlt *RemoteWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordR return nil, errors.ErrInvalidTxn } if wlt.Encrypted { - password, err = pwd(fmt.Sprintf("Introduce the password of %s ", wlt.Label)) + pwdCtx := util.NewKeyValueMap() + pwdCtx.SetValue(core.StrTypeName, core.TypeNameWallet) + pwdCtx.SetValue(core.StrMethodName, "Sign") + pwdCtx.SetValue(core.StrWalletName, wlt.Id) + password, err = pwd(fmt.Sprintf("Enter password for %s ", wlt.Label), pwdCtx) if err != nil { logWallet.WithError(err).Warn("Error getting password") return nil, err @@ -610,7 +627,11 @@ func (wlt *RemoteWallet) GenAddresses(addrType core.AddressType, startIndex, cou return nil } defer ReturnSkycoinClient(c) - password, err := pwd("Insert password") + pwdCtx := util.NewKeyValueMap() + pwdCtx.SetValue(core.StrTypeName, core.TypeNameWallet) + pwdCtx.SetValue(core.StrMethodName, "GenAddresses") + pwdCtx.SetValue(core.StrWalletName, wlt.Id) + password, err := pwd("Enter password", pwdCtx) if err != nil { logWallet.WithError(err).Fatal("Something was wrong entering the password") return nil @@ -843,7 +864,11 @@ func (wltSrv *SkycoinLocalWallet) GetWallet(id string) core.Wallet { func (wltSrv *SkycoinLocalWallet) CreateWallet(label string, seed string, IsEncrypted bool, pwd core.PasswordReader, scanAddressesN int) (core.Wallet, error) { logWallet.Info("Creating Skycoin local wallet") - password, err := pwd("Insert Password") + pwdCtx := util.NewKeyValueMap() + pwdCtx.SetValue(core.StrTypeName, core.TypeNameWalletSet) + pwdCtx.SetValue(core.StrMethodName, "CreateWallet") + pwdCtx.SetValue(core.StrWalletLabel, label) + password, err := pwd("Insert Password", pwdCtx) if err != nil { logWallet.WithError(err).Fatal("Something was wrong entering the password") @@ -917,7 +942,11 @@ func (wltSrv *SkycoinLocalWallet) Encrypt(walletName string, password core.Passw return } - pwd, err := password("Insert Password") + pwdCtx := util.NewKeyValueMap() + pwdCtx.SetValue(core.StrTypeName, core.TypeNameWalletStorage) + pwdCtx.SetValue(core.StrMethodName, "Encrypt") + pwdCtx.SetValue(core.StrWalletName, wltName) + pwd, err := password("Enter Password", pwdCtx) if err != nil { logWallet.WithError(err).Fatal("Something was wrong entering the password") return @@ -947,7 +976,11 @@ func (wltSrv *SkycoinLocalWallet) Decrypt(walletName string, password core.Passw if !wlt.IsEncrypted() { return } - pwd, err := password("Insert Password") + pwdCtx := util.NewKeyValueMap() + pwdCtx.SetValue(core.StrTypeName, core.TypeNameWalletStorage) + pwdCtx.SetValue(core.StrMethodName, "Decrypt") + pwdCtx.SetValue(core.StrWalletName, wltName) + pwd, err := password("Enter Password", pwdCtx) if err != nil { logWallet.WithError(err).Fatal("Something was wrong entering the password") return @@ -1074,7 +1107,11 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe originalInputs = cTxn.In if skyWlt.IsEncrypted() { - pass, err := pwd(fmt.Sprintf("Introduce the password of %s", skyWlt.Label())) + pwdCtx := util.NewKeyValueMap() + pwdCtx.SetValue(core.StrTypeName, core.TypeNameWallet) + pwdCtx.SetValue(core.StrMethodName, "Sign") + pwdCtx.SetValue(core.StrWalletName, wlt.Id) + pass, err := pwd(fmt.Sprintf("Enter password for %s", skyWlt.Label()), pwdCtx) if err != nil { logWallet.WithError(err).Warn("Couldn't get password") return nil, err @@ -1156,7 +1193,11 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe if skyWlt.IsEncrypted() { - pass, err := pwd("Type your password") + pwdCtx := util.NewKeyValueMap() + pwdCtx.SetValue(core.StrTypeName, core.TypeNameWallet) + pwdCtx.SetValue(core.StrMethodName, "Sign") + pwdCtx.SetValue(core.StrWalletName, wlt.Id) + pass, err := pwd("Enter password", pwdCtx) if err != nil { logWallet.WithError(err).Warn("Couldn't get password") return nil, err @@ -1379,7 +1420,11 @@ func (wlt *LocalWallet) GenAddresses(addrType core.AddressType, startIndex, coun if walletLoaded.IsEncrypted() { genAddressesInFile = func(w wallet.Wallet, n uint64) ([]cipher.Addresser, error) { - password, err := pwd("Insert Password") + pwdCtx := util.NewKeyValueMap() + pwdCtx.SetValue(core.StrTypeName, core.TypeNameWallet) + pwdCtx.SetValue(core.StrMethodName, "GenAddresses") + pwdCtx.SetValue(core.StrWalletName, wlt.Id) + password, err := pwd("Enter password", pwdCtx) if err != nil { logWallet.WithError(err).Error("Something was wrong entering the password") return nil, nil diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index 7c986848..01cc4fbb 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -111,7 +111,7 @@ func TestSkycoinRemoteWalletCreateWallet(t *testing.T) { mockSkyApiCreateWallet(global_mock, &wltOpt2, "walletNonEncrypted", false) wltSrv := &SkycoinRemoteWallet{poolSection: PoolSection} - pwdReader := func(message string) (string, error) { + pwdReader := func(message string, _ core.KeyValueStore) (string, error) { return "pwd", nil } @@ -131,7 +131,7 @@ func TestSkycoinRemoteWalletEncrypt(t *testing.T) { global_mock.On("EncryptWallet", "wallet", "pwd").Return(&api.WalletResponse{}, nil) wltSrv := &SkycoinRemoteWallet{poolSection: PoolSection} - pwdReader := func(message string) (string, error) { + pwdReader := func(message string, _ core.KeyValueStore) (string, error) { return "pwd", nil } @@ -143,7 +143,7 @@ func TestSkycoinRemoteWalletDecrypt(t *testing.T) { global_mock.On("DecryptWallet", "wallet", "pwd").Return(&api.WalletResponse{}, nil) wltSrv := &SkycoinRemoteWallet{poolSection: PoolSection} - pwdReader := func(message string) (string, error) { + pwdReader := func(message string, _ core.KeyValueStore) (string, error) { return "pwd", nil } @@ -234,9 +234,10 @@ func TestRemoteWalletSignSkycoinTxn(t *testing.T) { wlt := &RemoteWallet{ Id: "wallet", + Encrypted: true, poolSection: PoolSection, } - pwdReader := func(message string) (string, error) { + pwdReader := func(string, core.KeyValueStore) (string, error) { return "password", nil } ret, err := wlt.Sign(&unTxn, nil, pwdReader, nil) @@ -558,7 +559,7 @@ func TestRemoteWalletGenAddresses(t *testing.T) { Id: "wallet", poolSection: PoolSection, } - pwdReader := func(message string) (string, error) { + pwdReader := func(message string, _ core.KeyValueStore) (string, error) { return "pwd", nil } iter := wlt.GenAddresses(0, 0, 2, pwdReader) @@ -803,7 +804,7 @@ func makeLocalWalletsFromKeyData(t *testing.T, keysData []KeyData) []core.Wallet var err error if w, isFound = walletsCache[kd.Mnemonic]; !isFound { if w = walletSet.GetWallet(walletID); w == nil { - w, err = walletSet.CreateWallet(walletID, kd.Mnemonic, false, func(string) (string, error) { return "", nil }, 0) + w, err = walletSet.CreateWallet(walletID, kd.Mnemonic, false, func(string, core.KeyValueStore) (string, error) { return "", nil }, 0) require.NoError(t, err) } walletsCache[kd.Mnemonic] = w @@ -1478,7 +1479,7 @@ func TestSkycoinSignServiceSign(t *testing.T) { ins = append(ins, in) } - pwdReader := func(message string) (string, error) { + pwdReader := func(_ string, _ core.KeyValueStore) (string, error) { return "", nil } diff --git a/src/core/sign.go b/src/core/sign.go index 072bc9dd..d510592c 100644 --- a/src/core/sign.go +++ b/src/core/sign.go @@ -13,5 +13,5 @@ type InputSignDescriptor struct { // BlockchainSignService implement multi-wallet transaction signing for the blockchain type BlockchainSignService interface { // Sign creates a new transaction by (fully or partially) signing a given transaction - Sign(txn Transaction, signSpec []InputSignDescriptor, pwds map[string]PasswordReader) (Transaction, error) + Sign(txn Transaction, signSpec []InputSignDescriptor, pwd PasswordReader) (Transaction, error) } diff --git a/src/core/storage.go b/src/core/storage.go index b13db38f..b1d7317b 100644 --- a/src/core/storage.go +++ b/src/core/storage.go @@ -7,3 +7,87 @@ type KeyValueStore interface { // SetValue bind value o known key SetValue(key string, value interface{}) } + +const ( + // StrSignerID option key for storing signer ID + StrSignerID = "signer.id" + // StrMethodType option key for method type name + StrTypeName = "api.typename" + // StrMethodName option key for method name + StrMethodName = "api.method" + // StrWalletLabel option key for wallet label + StrWalletLabel = "wallet.label" + // StrWalletName option key for wallet name + StrWalletName = "wallet.id" + // StrCoinTicker option key for coin ticker ID + StrCoinTicker = "coin.ticker" + // StrSenderObject option key for object that triggered an action + StrSenderObject = "call.self" + + // TypeNameAddress Address type name + TypeNameAddress = "Address" + // TypeNameAddressIterator AddressIterator type name + TypeNameAddressIterator = "AddressIterator" + // TypeNameAltcoinManager AltcoinManager type name + TypeNameAltcoinManager = "AltcoinManager" + // TypeNameAltcoinPlugin AltcoinPlugin type name + TypeNameAltcoinPlugin = "AltcoinPlugin" + // TypeNameBlock Block type name + TypeNameBlock = "Block" + // TypeNameBlockchainSignService BlockchainSignService type name + TypeNameBlockchainSignService = "BlockchainSignService" + // TypeNameBlockchainStatus BlockchainStatus type name + TypeNameBlockchainStatus = "BlockchainStatus" + // TypeNameBlockchainTransactionAPI BlockchainTransactionAPI type name + TypeNameBlockchainTransactionAPI = "BlockchainTransactionAPI" + // TypeNameCryptoAccount CryptoAccount type name + TypeNameCryptoAccount = "CryptoAccount" + // TypeNameKeyValueStore KeyValueStore type name + TypeNameKeyValueStore = "KeyValueStore" + // TypeNameMultiPool MultiPool type name + TypeNameMultiPool = "MultiPool" + // TypeNameMultiPoolSection MultiPoolSection type name + TypeNameMultiPoolSection = "MultiPoolSection" + // TypeNamePEX PEX type name + TypeNamePEX = "PEX" + // TypeNamePexNode PexNode type name + TypeNamePexNode = "PexNode" + // TypeNamePexNodeIterator PexNodeIterator type name + TypeNamePexNodeIterator = "PexNodeIterator" + // TypeNamePexNodeSet PexNodeSet type name + TypeNamePexNodeSet = "PexNodeSet" + // TypeNamePooledObjectFactory PooledObjectFactory type name + TypeNamePooledObjectFactory = "PooledObjectFactory" + // TypeNameSeedGenerator SeedGenerator type name + TypeNameSeedGenerator = "SeedGenerator" + // TypeNameTransaction Transaction type name + TypeNameTransaction = "Transaction" + // TypeNameTransactionInput TransactionInput type name + TypeNameTransactionInput = "TransactionInput" + // TypeNameTransactionInputIterator TransactionInputIterator type name + TypeNameTransactionInputIterator = "TransactionInputIterator" + // TypeNameTransactionIterator TransactionIterator type name + TypeNameTransactionIterator = "TransactionIterator" + // TypeNameTransactionOutput TransactionOutput type name + TypeNameTransactionOutput = "TransactionOutput" + // TypeNameTransactionOutputIterator TransactionOutputIterator type name + TypeNameTransactionOutputIterator = "TransactionOutputIterator" + // TypeNameTxnSigner TxnSigner type name + TypeNameTxnSigner = "TxnSigner" + // TypeNameTxnSignerIterator TxnSignerIterator type name + TypeNameTxnSignerIterator = "TxnSignerIterator" + // TypeNameWallet Wallet type name + TypeNameWallet = "Wallet" + // TypeNameWalletAddress WalletAddress type name + TypeNameWalletAddress = "WalletAddress" + // TypeNameWalletEnv WalletEnv type name + TypeNameWalletEnv = "WalletEnv" + // TypeNameWalletIterator WalletIterator type name + TypeNameWalletIterator = "WalletIterator" + // TypeNameWalletOutput WalletOutput type name + TypeNameWalletOutput = "WalletOutput" + // TypeNameWalletSet WalletSet type name + TypeNameWalletSet = "WalletSet" + // TypeNameWalletStorage WalletStorage type name + TypeNameWalletStorage = "WalletStorage" +) diff --git a/src/core/textutil.go b/src/core/textutil.go index e8fcf21d..4e1ddd2d 100644 --- a/src/core/textutil.go +++ b/src/core/textutil.go @@ -1,4 +1,4 @@ package core // PasswordReader secure retrieval of passwords from users -type PasswordReader func(string) (string, error) +type PasswordReader func(string, KeyValueStore) (string, error) diff --git a/src/util/sign.go b/src/util/sign.go index 95999111..0ff9e4ab 100644 --- a/src/util/sign.go +++ b/src/util/sign.go @@ -50,7 +50,12 @@ func SignTransaction(signerID core.UID, txn core.Transaction, pwd core.PasswordR if signer == nil { return nil, errors.ErrInvalidID } - return signer.SignTransaction(txn, pwd, indices) + // Add signer ID in key value store context + pwdReader := func(msg string, ctx core.KeyValueStore) (string, error) { + newCtx := NewKeyValuesWithDefaults(NewMapWithSingleKey(core.StrSignerID, string(signerID)), ctx) + return pwd(msg, newCtx) + } + return signer.SignTransaction(txn, pwdReader, indices) } // GetSignerDescription human readable caption for signing strategy identified by UID @@ -79,18 +84,18 @@ func LookupSignServiceForWallet(wlt core.Wallet, signerID core.UID) (core.TxnSig } type signingKeyPair struct { - wallet core.Wallet - signer core.UID + wallet core.Wallet + signerID core.UID } -// MultiWalletSign generic strategy for using multiple wallets to sign a transaction -func GenericMultiWalletSign(txn core.Transaction, signSpec []core.InputSignDescriptor, pwds map[string]core.PasswordReader) (signedTxn core.Transaction, err error) { +// GenericMultiWalletSign generic strategy for using multiple wallets to sign a transaction +func GenericMultiWalletSign(txn core.Transaction, signSpec []core.InputSignDescriptor, pwd core.PasswordReader) (signedTxn core.Transaction, err error) { groups := make(map[signingKeyPair][]string) // Aggregate inputs by wallet,signer combination for _, descriptor := range signSpec { key := signingKeyPair{ - wallet: descriptor.Wallet, - signer: descriptor.SignerID, + wallet: descriptor.Wallet, + signerID: descriptor.SignerID, } inputs, isNotEmpty := groups[key] if !isNotEmpty { @@ -102,15 +107,14 @@ func GenericMultiWalletSign(txn core.Transaction, signSpec []core.InputSignDescr for signPair, indices := range groups { - signer, err := LookupSignServiceForWallet(signPair.wallet, signPair.signer) + signer, err := LookupSignServiceForWallet(signPair.wallet, signPair.signerID) if err != nil { - logUtil.WithError(err).Errorf("Unknown signer %s specified for signing inputs %v of wallet %v", string(signPair.signer), indices, signPair.wallet) + logUtil.WithError(err).Errorf("Unknown signer %s specified for signing inputs %v of wallet %v", string(signPair.signerID), indices, signPair.wallet) return nil, errors.ErrInvalidID } - pwd := pwds[signPair.wallet.GetId()] signedTxn, err = signPair.wallet.Sign(signedTxn, signer, pwd, indices) if err != nil { - logUtil.WithError(err).Errorf("Error signing inputs %v of wallet %v with signer %s", indices, signPair.wallet, string(signPair.signer)) + logUtil.WithError(err).Errorf("Error signing inputs %v of wallet %v with signer %s", indices, signPair.wallet, string(signPair.signerID)) return nil, err } diff --git a/src/util/storage.go b/src/util/storage.go index 1371ea78..7469cadd 100644 --- a/src/util/storage.go +++ b/src/util/storage.go @@ -9,14 +9,17 @@ type KeyValueMap struct { values map[string]interface{} } +// GetValue lookup value for key func (tOpt *KeyValueMap) GetValue(key string) interface{} { return tOpt.values[key] } +// SetValue bind value o known key func (tOpt *KeyValueMap) SetValue(key string, value interface{}) { tOpt.values[key] = value } +// NewKeyValueMap instantiate key value map storage func NewKeyValueMap() *KeyValueMap { tOptions := KeyValueMap{ values: make(map[string]interface{}), @@ -24,6 +27,47 @@ func NewKeyValueMap() *KeyValueMap { return &tOptions } +// NewKeyValueMap instantiate key value map storage +func NewMapWithSingleKey(k string, v interface{}) *KeyValueMap { + store := NewKeyValueMap() + store.values[k] = v + return store +} + +// KeyValuesWithDefaults retrieve and set values of another KeyValueStore with defaults for keys not found +type KeyValuesWithDefaults struct { + values, defaults core.KeyValueStore +} + +// GetValue lookup value for key +func (tOpt *KeyValuesWithDefaults) GetValue(key string) interface{} { + v := tOpt.values.GetValue(key) + if v != nil { + return v + } + return tOpt.defaults.GetValue(key) +} + +// SetValue bind value o known key +func (tOpt *KeyValuesWithDefaults) SetValue(key string, value interface{}) { + tOpt.values.SetValue(key, value) +} + +// NewKeyValuesWithDefaults instantiate key value map storage +func NewKeyValuesWithDefaults(values, defaults core.KeyValueStore) core.KeyValueStore { + if defaults == nil { + return values + } + if values == nil { + values = NewKeyValueMap() + } + tOptions := KeyValuesWithDefaults{ + values: values, + defaults: defaults, + } + return &tOptions +} + // Type assertions var ( _ core.KeyValueStore = &KeyValueMap{} diff --git a/src/util/storage_test.go b/src/util/storage_test.go new file mode 100644 index 00000000..ab6cf1b8 --- /dev/null +++ b/src/util/storage_test.go @@ -0,0 +1,54 @@ +package util + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestKeyValuesNoDefaults(t *testing.T) { + m := NewKeyValueMap() + require.Equal(t, m, NewKeyValuesWithDefaults(m, nil)) +} + +func TestKeyValueiWithDefaultsGetValue(t *testing.T) { + // Values override defaults + m1 := NewMapWithSingleKey("k1", "v1") + m2 := NewMapWithSingleKey("k1", "v2") + s := NewKeyValuesWithDefaults(m1, m2) + require.Equal(t, "v1", m1.GetValue("k1")) + require.Equal(t, "v2", m2.GetValue("k1")) + require.Equal(t, "v1", s.GetValue("k1")) + + // Not in values and not in defaults + require.Nil(t, m1.GetValue("z")) + require.Nil(t, m2.GetValue("z")) + require.Nil(t, s.GetValue("z")) + + // Defaults returned if no value found + m2.SetValue("k2", "v3") + require.Nil(t, m1.GetValue("k2")) + require.Equal(t, "v3", m2.GetValue("k2")) + require.Equal(t, "v1", m1.GetValue("k1")) + require.Equal(t, "v2", m2.GetValue("k1")) + require.Nil(t, m1.GetValue("z")) + require.Nil(t, m2.GetValue("z")) + require.Equal(t, "v3", s.GetValue("k2")) + require.Equal(t, "v1", s.GetValue("k1")) + require.Nil(t, s.GetValue("z")) + + // Values returned even if no defaults found + m1.SetValue("k3", "v4") + require.Equal(t, "v4", m1.GetValue("k3")) + require.Nil(t, m2.GetValue("k3")) + require.Nil(t, m1.GetValue("k2")) + require.Equal(t, "v3", m2.GetValue("k2")) + require.Equal(t, "v1", m1.GetValue("k1")) + require.Equal(t, "v2", m2.GetValue("k1")) + require.Nil(t, m1.GetValue("z")) + require.Nil(t, m2.GetValue("z")) + require.Equal(t, "v4", s.GetValue("k3")) + require.Equal(t, "v3", s.GetValue("k2")) + require.Equal(t, "v1", s.GetValue("k1")) + require.Nil(t, s.GetValue("z")) +} diff --git a/src/util/textutil.go b/src/util/textutil.go index aa8970b4..f92ac5bf 100644 --- a/src/util/textutil.go +++ b/src/util/textutil.go @@ -1,6 +1,10 @@ package util +import ( + "github.com/fibercrypto/FiberCryptoWallet/src/core" +) + // EmptyPassword read no password -func EmptyPassword(string) (string, error) { +func EmptyPassword(string, core.KeyValueStore) (string, error) { return "", nil } From 069885f5805c6e09c147f3d96d2a754bf6d8d02b Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Thu, 28 Nov 2019 17:19:47 -0500 Subject: [PATCH 56/69] [mocks] [sky] [core] [main] [models] [util] refs #150 - Lowercase names in import statements FiberCryptoWallet => fibercryptowallet --- src/coin/mocks/Address.go | 2 +- src/coin/mocks/AddressIterator.go | 2 +- src/coin/mocks/AltcoinManager.go | 2 +- src/coin/mocks/AltcoinPlugin.go | 2 +- src/coin/mocks/Block.go | 2 +- src/coin/mocks/BlockchainSignService.go | 2 +- src/coin/mocks/BlockchainStatus.go | 2 +- src/coin/mocks/BlockchainTransactionAPI.go | 2 +- src/coin/mocks/CryptoAccount.go | 2 +- src/coin/mocks/MultiPool.go | 2 +- src/coin/mocks/PEX.go | 2 +- src/coin/mocks/PexNodeIterator.go | 2 +- src/coin/mocks/PexNodeSet.go | 2 +- src/coin/mocks/Transaction.go | 2 +- src/coin/mocks/TransactionInput.go | 2 +- src/coin/mocks/TransactionInputIterator.go | 2 +- src/coin/mocks/TransactionIterator.go | 2 +- src/coin/mocks/TransactionOutput.go | 2 +- src/coin/mocks/TransactionOutputIterator.go | 2 +- src/coin/mocks/TxnSigner.go | 2 +- src/coin/mocks/TxnSignerIterator.go | 2 +- src/coin/mocks/Wallet.go | 2 +- src/coin/mocks/WalletAddress.go | 2 +- src/coin/mocks/WalletEnv.go | 2 +- src/coin/mocks/WalletIterator.go | 2 +- src/coin/mocks/WalletOutput.go | 2 +- src/coin/mocks/WalletSet.go | 2 +- src/coin/mocks/WalletStorage.go | 2 +- src/coin/skycoin/main.go | 8 ++++---- src/coin/skycoin/main_test.go | 4 ++-- src/coin/skycoin/models/account.go | 8 ++++---- src/coin/skycoin/models/account_test.go | 2 +- src/coin/skycoin/models/blockchain.go | 8 ++++---- src/coin/skycoin/models/blockchain_test.go | 2 +- src/coin/skycoin/models/cipher.go | 2 +- src/coin/skycoin/models/coin.go | 10 +++++----- src/coin/skycoin/models/coin_test.go | 2 +- src/coin/skycoin/models/main.go | 10 +++++----- src/coin/skycoin/models/main_test.go | 6 +++--- src/coin/skycoin/models/network.go | 8 ++++---- src/coin/skycoin/models/networking.go | 2 +- src/coin/skycoin/models/params.go | 2 +- src/coin/skycoin/models/sign.go | 4 ++-- src/coin/skycoin/models/sky_test.go | 2 +- src/coin/skycoin/models/util_test.go | 4 ++-- src/coin/skycoin/models/wallet.go | 12 ++++++------ src/coin/skycoin/models/wallet_test.go | 8 ++++---- src/coin/skycoin/testsuite/env.go | 2 +- src/core/network.go | 4 ++-- src/main/config.go | 4 ++-- src/main/plugin.go | 4 ++-- src/main/sign.go | 6 +++--- src/models/address/address.go | 2 +- src/models/addressesModel.go | 6 +++--- src/models/blockchainModels.go | 10 +++++----- src/models/config.go | 4 ++-- src/models/history/history.go | 2 +- src/models/history/historyManager.go | 18 +++++++++--------- src/models/modelWallets.go | 10 +++++----- src/models/networkingManager.go | 4 ++-- src/models/networkingModel.go | 2 +- src/models/pending/PendingModel.go | 10 +++++----- src/models/qtransaction.go | 8 ++++---- src/models/transactions/transactions.go | 2 +- src/models/walletsManager.go | 12 ++++++------ src/models/walletsModel.go | 2 +- src/util/cipher.go | 2 +- src/util/coin.go | 4 ++-- src/util/pluginutil.go | 4 ++-- src/util/sign.go | 6 +++--- src/util/sign_test.go | 6 +++--- src/util/signutil/sign.go | 2 +- src/util/storage.go | 2 +- src/util/textutil.go | 2 +- src/util/util.go | 2 +- src/util/wallet.go | 2 +- 76 files changed, 152 insertions(+), 152 deletions(-) diff --git a/src/coin/mocks/Address.go b/src/coin/mocks/Address.go index 58ce6e80..124e4378 100644 --- a/src/coin/mocks/Address.go +++ b/src/coin/mocks/Address.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // Address is an autogenerated mock type for the Address type diff --git a/src/coin/mocks/AddressIterator.go b/src/coin/mocks/AddressIterator.go index 923fa71d..25c9b98e 100644 --- a/src/coin/mocks/AddressIterator.go +++ b/src/coin/mocks/AddressIterator.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // AddressIterator is an autogenerated mock type for the AddressIterator type diff --git a/src/coin/mocks/AltcoinManager.go b/src/coin/mocks/AltcoinManager.go index 2877fa2a..de070fc3 100644 --- a/src/coin/mocks/AltcoinManager.go +++ b/src/coin/mocks/AltcoinManager.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // AltcoinManager is an autogenerated mock type for the AltcoinManager type diff --git a/src/coin/mocks/AltcoinPlugin.go b/src/coin/mocks/AltcoinPlugin.go index 0f46c62b..3c99d3d3 100644 --- a/src/coin/mocks/AltcoinPlugin.go +++ b/src/coin/mocks/AltcoinPlugin.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // AltcoinPlugin is an autogenerated mock type for the AltcoinPlugin type diff --git a/src/coin/mocks/Block.go b/src/coin/mocks/Block.go index 60703a37..01299560 100644 --- a/src/coin/mocks/Block.go +++ b/src/coin/mocks/Block.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // Block is an autogenerated mock type for the Block type diff --git a/src/coin/mocks/BlockchainSignService.go b/src/coin/mocks/BlockchainSignService.go index fbb5ca9f..2fda5274 100644 --- a/src/coin/mocks/BlockchainSignService.go +++ b/src/coin/mocks/BlockchainSignService.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // BlockchainSignService is an autogenerated mock type for the BlockchainSignService type diff --git a/src/coin/mocks/BlockchainStatus.go b/src/coin/mocks/BlockchainStatus.go index 46790882..e7081868 100644 --- a/src/coin/mocks/BlockchainStatus.go +++ b/src/coin/mocks/BlockchainStatus.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // BlockchainStatus is an autogenerated mock type for the BlockchainStatus type diff --git a/src/coin/mocks/BlockchainTransactionAPI.go b/src/coin/mocks/BlockchainTransactionAPI.go index 2b6ed28f..af133a91 100644 --- a/src/coin/mocks/BlockchainTransactionAPI.go +++ b/src/coin/mocks/BlockchainTransactionAPI.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // BlockchainTransactionAPI is an autogenerated mock type for the BlockchainTransactionAPI type diff --git a/src/coin/mocks/CryptoAccount.go b/src/coin/mocks/CryptoAccount.go index ad6052f2..eebf8290 100644 --- a/src/coin/mocks/CryptoAccount.go +++ b/src/coin/mocks/CryptoAccount.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // CryptoAccount is an autogenerated mock type for the CryptoAccount type diff --git a/src/coin/mocks/MultiPool.go b/src/coin/mocks/MultiPool.go index b816ecfb..61d1b531 100644 --- a/src/coin/mocks/MultiPool.go +++ b/src/coin/mocks/MultiPool.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // MultiPool is an autogenerated mock type for the MultiPool type diff --git a/src/coin/mocks/PEX.go b/src/coin/mocks/PEX.go index d56be901..1b8a5cd7 100644 --- a/src/coin/mocks/PEX.go +++ b/src/coin/mocks/PEX.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // PEX is an autogenerated mock type for the PEX type diff --git a/src/coin/mocks/PexNodeIterator.go b/src/coin/mocks/PexNodeIterator.go index 9362ab8c..80af2e0c 100644 --- a/src/coin/mocks/PexNodeIterator.go +++ b/src/coin/mocks/PexNodeIterator.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // PexNodeIterator is an autogenerated mock type for the PexNodeIterator type diff --git a/src/coin/mocks/PexNodeSet.go b/src/coin/mocks/PexNodeSet.go index cb7fb3f7..46a15cd3 100644 --- a/src/coin/mocks/PexNodeSet.go +++ b/src/coin/mocks/PexNodeSet.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // PexNodeSet is an autogenerated mock type for the PexNodeSet type diff --git a/src/coin/mocks/Transaction.go b/src/coin/mocks/Transaction.go index 8e0af949..8a847125 100644 --- a/src/coin/mocks/Transaction.go +++ b/src/coin/mocks/Transaction.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // Transaction is an autogenerated mock type for the Transaction type diff --git a/src/coin/mocks/TransactionInput.go b/src/coin/mocks/TransactionInput.go index 6c5e6d2c..1c92673d 100644 --- a/src/coin/mocks/TransactionInput.go +++ b/src/coin/mocks/TransactionInput.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // TransactionInput is an autogenerated mock type for the TransactionInput type diff --git a/src/coin/mocks/TransactionInputIterator.go b/src/coin/mocks/TransactionInputIterator.go index 7cd8b3b1..0f8edd84 100644 --- a/src/coin/mocks/TransactionInputIterator.go +++ b/src/coin/mocks/TransactionInputIterator.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // TransactionInputIterator is an autogenerated mock type for the TransactionInputIterator type diff --git a/src/coin/mocks/TransactionIterator.go b/src/coin/mocks/TransactionIterator.go index a64de43f..3fc64568 100644 --- a/src/coin/mocks/TransactionIterator.go +++ b/src/coin/mocks/TransactionIterator.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // TransactionIterator is an autogenerated mock type for the TransactionIterator type diff --git a/src/coin/mocks/TransactionOutput.go b/src/coin/mocks/TransactionOutput.go index e3bb0b82..cc048507 100644 --- a/src/coin/mocks/TransactionOutput.go +++ b/src/coin/mocks/TransactionOutput.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // TransactionOutput is an autogenerated mock type for the TransactionOutput type diff --git a/src/coin/mocks/TransactionOutputIterator.go b/src/coin/mocks/TransactionOutputIterator.go index b5597610..6ac35fb0 100644 --- a/src/coin/mocks/TransactionOutputIterator.go +++ b/src/coin/mocks/TransactionOutputIterator.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // TransactionOutputIterator is an autogenerated mock type for the TransactionOutputIterator type diff --git a/src/coin/mocks/TxnSigner.go b/src/coin/mocks/TxnSigner.go index bd630604..1a6b3f40 100644 --- a/src/coin/mocks/TxnSigner.go +++ b/src/coin/mocks/TxnSigner.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // TxnSigner is an autogenerated mock type for the TxnSigner type diff --git a/src/coin/mocks/TxnSignerIterator.go b/src/coin/mocks/TxnSignerIterator.go index c4743e2a..be49a8b4 100644 --- a/src/coin/mocks/TxnSignerIterator.go +++ b/src/coin/mocks/TxnSignerIterator.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // TxnSignerIterator is an autogenerated mock type for the TxnSignerIterator type diff --git a/src/coin/mocks/Wallet.go b/src/coin/mocks/Wallet.go index 41e75845..d35a0180 100644 --- a/src/coin/mocks/Wallet.go +++ b/src/coin/mocks/Wallet.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // Wallet is an autogenerated mock type for the Wallet type diff --git a/src/coin/mocks/WalletAddress.go b/src/coin/mocks/WalletAddress.go index 043d5cca..35a4fd3e 100644 --- a/src/coin/mocks/WalletAddress.go +++ b/src/coin/mocks/WalletAddress.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // WalletAddress is an autogenerated mock type for the WalletAddress type diff --git a/src/coin/mocks/WalletEnv.go b/src/coin/mocks/WalletEnv.go index 733f8f00..b3cc6724 100644 --- a/src/coin/mocks/WalletEnv.go +++ b/src/coin/mocks/WalletEnv.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // WalletEnv is an autogenerated mock type for the WalletEnv type diff --git a/src/coin/mocks/WalletIterator.go b/src/coin/mocks/WalletIterator.go index 8896eecb..2ca3f3e4 100644 --- a/src/coin/mocks/WalletIterator.go +++ b/src/coin/mocks/WalletIterator.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // WalletIterator is an autogenerated mock type for the WalletIterator type diff --git a/src/coin/mocks/WalletOutput.go b/src/coin/mocks/WalletOutput.go index 8e441262..58ac6516 100644 --- a/src/coin/mocks/WalletOutput.go +++ b/src/coin/mocks/WalletOutput.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // WalletOutput is an autogenerated mock type for the WalletOutput type diff --git a/src/coin/mocks/WalletSet.go b/src/coin/mocks/WalletSet.go index 3545c8d3..9fb40e99 100644 --- a/src/coin/mocks/WalletSet.go +++ b/src/coin/mocks/WalletSet.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // WalletSet is an autogenerated mock type for the WalletSet type diff --git a/src/coin/mocks/WalletStorage.go b/src/coin/mocks/WalletStorage.go index 1d3b7b4b..3802abb2 100644 --- a/src/coin/mocks/WalletStorage.go +++ b/src/coin/mocks/WalletStorage.go @@ -2,7 +2,7 @@ package mocks -import core "github.com/fibercrypto/FiberCryptoWallet/src/core" +import core "github.com/fibercrypto/fibercryptowallet/src/core" import mock "github.com/stretchr/testify/mock" // WalletStorage is an autogenerated mock type for the WalletStorage type diff --git a/src/coin/skycoin/main.go b/src/coin/skycoin/main.go index d8ac0c29..758175df 100644 --- a/src/coin/skycoin/main.go +++ b/src/coin/skycoin/main.go @@ -1,11 +1,11 @@ package skycoin //nolint goimports import ( - sky "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/models" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - local "github.com/fibercrypto/FiberCryptoWallet/src/main" + sky "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" + "github.com/fibercrypto/fibercryptowallet/src/core" + local "github.com/fibercrypto/fibercryptowallet/src/main" - util "github.com/fibercrypto/FiberCryptoWallet/src/util" + util "github.com/fibercrypto/fibercryptowallet/src/util" ) func init() { diff --git a/src/coin/skycoin/main_test.go b/src/coin/skycoin/main_test.go index a4784e9a..f74a8b6e 100644 --- a/src/coin/skycoin/main_test.go +++ b/src/coin/skycoin/main_test.go @@ -3,9 +3,9 @@ package skycoin //nolint goimports import ( "testing" - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/params" - util "github.com/fibercrypto/FiberCryptoWallet/src/util" + util "github.com/fibercrypto/fibercryptowallet/src/util" "github.com/stretchr/testify/require" ) diff --git a/src/coin/skycoin/models/account.go b/src/coin/skycoin/models/account.go index 79871b1a..30040384 100644 --- a/src/coin/skycoin/models/account.go +++ b/src/coin/skycoin/models/account.go @@ -4,10 +4,10 @@ import ( "path/filepath" "strconv" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/errors" - "github.com/fibercrypto/FiberCryptoWallet/src/util" - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/errors" + "github.com/fibercrypto/fibercryptowallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" "github.com/skycoin/skycoin/src/cli" "github.com/skycoin/skycoin/src/readable" "github.com/skycoin/skycoin/src/util/droplet" diff --git a/src/coin/skycoin/models/account_test.go b/src/coin/skycoin/models/account_test.go index 8747017c..f6046cb4 100644 --- a/src/coin/skycoin/models/account_test.go +++ b/src/coin/skycoin/models/account_test.go @@ -5,7 +5,7 @@ import ( "github.com/stretchr/testify/require" - "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/core" "github.com/skycoin/skycoin/src/api" "github.com/skycoin/skycoin/src/readable" ) diff --git a/src/coin/skycoin/models/blockchain.go b/src/coin/skycoin/models/blockchain.go index 0dece6ae..5cc9e71e 100644 --- a/src/coin/skycoin/models/blockchain.go +++ b/src/coin/skycoin/models/blockchain.go @@ -1,14 +1,14 @@ package skycoin import ( - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" "time" "github.com/skycoin/skycoin/src/readable" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/errors" - "github.com/fibercrypto/FiberCryptoWallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/errors" + "github.com/fibercrypto/fibercryptowallet/src/util" ) var logBlockchain = logging.MustGetLogger("Skycoin Blockchain") diff --git a/src/coin/skycoin/models/blockchain_test.go b/src/coin/skycoin/models/blockchain_test.go index c981b193..c03f5eef 100644 --- a/src/coin/skycoin/models/blockchain_test.go +++ b/src/coin/skycoin/models/blockchain_test.go @@ -5,7 +5,7 @@ import ( "github.com/stretchr/testify/require" - "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/core" "github.com/skycoin/skycoin/src/api" "github.com/skycoin/skycoin/src/readable" ) diff --git a/src/coin/skycoin/models/cipher.go b/src/coin/skycoin/models/cipher.go index 056924a0..f88a26a2 100644 --- a/src/coin/skycoin/models/cipher.go +++ b/src/coin/skycoin/models/cipher.go @@ -1,7 +1,7 @@ package skycoin import ( - "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/core" "github.com/skycoin/skycoin/src/cipher" ) diff --git a/src/coin/skycoin/models/coin.go b/src/coin/skycoin/models/coin.go index 1b54e35c..d548e597 100644 --- a/src/coin/skycoin/models/coin.go +++ b/src/coin/skycoin/models/coin.go @@ -5,11 +5,11 @@ import ( "strconv" "time" - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/skytypes" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/errors" - "github.com/fibercrypto/FiberCryptoWallet/src/util" - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/skytypes" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/errors" + "github.com/fibercrypto/fibercryptowallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" "github.com/skycoin/skycoin/src/api" "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/coin" diff --git a/src/coin/skycoin/models/coin_test.go b/src/coin/skycoin/models/coin_test.go index 28d010f3..4cc98b70 100644 --- a/src/coin/skycoin/models/coin_test.go +++ b/src/coin/skycoin/models/coin_test.go @@ -6,7 +6,7 @@ import ( "github.com/stretchr/testify/require" - "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/core" "github.com/skycoin/skycoin/src/api" "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/readable" diff --git a/src/coin/skycoin/models/main.go b/src/coin/skycoin/models/main.go index f34e1659..565a71e8 100644 --- a/src/coin/skycoin/models/main.go +++ b/src/coin/skycoin/models/main.go @@ -1,11 +1,11 @@ package skycoin import ( - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/errors" - local "github.com/fibercrypto/FiberCryptoWallet/src/main" - appParams "github.com/fibercrypto/FiberCryptoWallet/src/params" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/params" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/errors" + local "github.com/fibercrypto/fibercryptowallet/src/main" + appParams "github.com/fibercrypto/fibercryptowallet/src/params" ) // SkyFiberPlugin provide support for SkyFiber coins diff --git a/src/coin/skycoin/models/main_test.go b/src/coin/skycoin/models/main_test.go index f626661e..a57717d0 100644 --- a/src/coin/skycoin/models/main_test.go +++ b/src/coin/skycoin/models/main_test.go @@ -1,12 +1,12 @@ package skycoin import ( - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" "os" "testing" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - util "github.com/fibercrypto/FiberCryptoWallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/core" + util "github.com/fibercrypto/fibercryptowallet/src/util" "github.com/stretchr/testify/mock" ) diff --git a/src/coin/skycoin/models/network.go b/src/coin/skycoin/models/network.go index b24b7ce5..7dede8c5 100644 --- a/src/coin/skycoin/models/network.go +++ b/src/coin/skycoin/models/network.go @@ -3,10 +3,10 @@ package skycoin import ( "encoding/hex" - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/skytypes" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/errors" - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/skytypes" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/errors" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" "github.com/skycoin/skycoin/src/api" ) diff --git a/src/coin/skycoin/models/networking.go b/src/coin/skycoin/models/networking.go index cb43cc7a..75ec85b8 100644 --- a/src/coin/skycoin/models/networking.go +++ b/src/coin/skycoin/models/networking.go @@ -3,7 +3,7 @@ package skycoin import ( "strings" - "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/core" "github.com/skycoin/skycoin/src/api" "github.com/skycoin/skycoin/src/readable" ) diff --git a/src/coin/skycoin/models/params.go b/src/coin/skycoin/models/params.go index 88826d65..b6fc1886 100644 --- a/src/coin/skycoin/models/params.go +++ b/src/coin/skycoin/models/params.go @@ -1,7 +1,7 @@ package skycoin import ( - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/params" skyparams "github.com/skycoin/skycoin/src/params" ) diff --git a/src/coin/skycoin/models/sign.go b/src/coin/skycoin/models/sign.go index 3bd8ed69..986772e3 100644 --- a/src/coin/skycoin/models/sign.go +++ b/src/coin/skycoin/models/sign.go @@ -1,8 +1,8 @@ package skycoin import ( - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/util" ) // SkycoinSignService implements BlockchainSignService for multi-wallet transaction signing diff --git a/src/coin/skycoin/models/sky_test.go b/src/coin/skycoin/models/sky_test.go index 23b31e3a..f35a2989 100644 --- a/src/coin/skycoin/models/sky_test.go +++ b/src/coin/skycoin/models/sky_test.go @@ -12,7 +12,7 @@ import ( "path/filepath" "testing" - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/testsuite" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/testsuite" "github.com/skycoin/skycoin/src/cipher" skytestsuite "github.com/skycoin/skycoin/src/cipher/testsuite" "github.com/skycoin/skycoin/src/coin" diff --git a/src/coin/skycoin/models/util_test.go b/src/coin/skycoin/models/util_test.go index 46c108dd..4e6ab17d 100644 --- a/src/coin/skycoin/models/util_test.go +++ b/src/coin/skycoin/models/util_test.go @@ -5,8 +5,8 @@ import ( "github.com/skycoin/skycoin/src/cipher/bip39" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/util" "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/testutil" diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index 77af197c..4ad0d4dc 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -9,12 +9,12 @@ import ( "strings" "time" - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/skytypes" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/errors" - "github.com/fibercrypto/FiberCryptoWallet/src/util" - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/params" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/skytypes" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/errors" + "github.com/fibercrypto/fibercryptowallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" "github.com/skycoin/skycoin/src/api" "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/cipher/bip39" diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index 01cc4fbb..4465b9e9 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -10,10 +10,10 @@ import ( "github.com/skycoin/skycoin/src/visor" - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/testsuite" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/params" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/testsuite" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/util" "github.com/skycoin/skycoin/src/api" "github.com/skycoin/skycoin/src/cipher" diff --git a/src/coin/skycoin/testsuite/env.go b/src/coin/skycoin/testsuite/env.go index 1b7968ee..6e88c717 100644 --- a/src/coin/skycoin/testsuite/env.go +++ b/src/coin/skycoin/testsuite/env.go @@ -12,5 +12,5 @@ const ( ) func GetSkycoinCipherTestDataDir() string { - return path.Join(build.Default.GOPATH, ".", "src", "github.com", "fibercrypto", "FiberCryptoWallet", "vendor", "github.com", "skycoin", "skycoin", "src", "cipher", "testsuite", "testdata") + return path.Join(build.Default.GOPATH, ".", "src", "github.com", "fibercrypto", "fibercryptowallet", "vendor", "github.com", "skycoin", "skycoin", "src", "cipher", "testsuite", "testdata") } diff --git a/src/core/network.go b/src/core/network.go index 417784af..edf5b7c1 100644 --- a/src/core/network.go +++ b/src/core/network.go @@ -4,8 +4,8 @@ import ( "fmt" "sync" - "github.com/fibercrypto/FiberCryptoWallet/src/errors" - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + "github.com/fibercrypto/fibercryptowallet/src/errors" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" ) var logConnectionPool = logging.MustGetLogger("Connection Pool") diff --git a/src/main/config.go b/src/main/config.go index c310fb95..0546da62 100644 --- a/src/main/config.go +++ b/src/main/config.go @@ -7,8 +7,8 @@ import ( "path/filepath" "sync" - "github.com/fibercrypto/FiberCryptoWallet/src/errors" - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + "github.com/fibercrypto/fibercryptowallet/src/errors" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" ) var logConfigManager = logging.MustGetLogger("ConfigManager") diff --git a/src/main/plugin.go b/src/main/plugin.go index 0f6acf80..fc0c7ad0 100644 --- a/src/main/plugin.go +++ b/src/main/plugin.go @@ -1,8 +1,8 @@ package local import ( - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" ) var logMainPlugin = logging.MustGetLogger("Altcoin plugin entry point") diff --git a/src/main/sign.go b/src/main/sign.go index 459f542e..bbb5b68c 100644 --- a/src/main/sign.go +++ b/src/main/sign.go @@ -1,9 +1,9 @@ package local import ( - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/errors" - "github.com/fibercrypto/FiberCryptoWallet/src/util/signutil" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/errors" + "github.com/fibercrypto/fibercryptowallet/src/util/signutil" ) func (m *fibercryptoAltcoinManager) AttachSignService(signSrv core.TxnSigner) error { diff --git a/src/models/address/address.go b/src/models/address/address.go index 6332d6e5..45b7320e 100644 --- a/src/models/address/address.go +++ b/src/models/address/address.go @@ -1,7 +1,7 @@ package address import ( - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" "github.com/therecipe/qt/core" ) diff --git a/src/models/addressesModel.go b/src/models/addressesModel.go index 38b2b207..7c16b9cf 100644 --- a/src/models/addressesModel.go +++ b/src/models/addressesModel.go @@ -1,9 +1,9 @@ package models import ( - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" - "github.com/fibercrypto/FiberCryptoWallet/src/util" - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/params" + "github.com/fibercrypto/fibercryptowallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" "github.com/therecipe/qt/core" "github.com/therecipe/qt/qml" ) diff --git a/src/models/blockchainModels.go b/src/models/blockchainModels.go index 35ef50fe..c6f8754b 100644 --- a/src/models/blockchainModels.go +++ b/src/models/blockchainModels.go @@ -1,13 +1,13 @@ package models import ( - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" "strconv" - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/models" //callable as skycoin - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/params" - "github.com/fibercrypto/FiberCryptoWallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" //callable as skycoin + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/params" + "github.com/fibercrypto/fibercryptowallet/src/util" qtcore "github.com/therecipe/qt/core" ) diff --git a/src/models/config.go b/src/models/config.go index 9d171c7e..1370b546 100644 --- a/src/models/config.go +++ b/src/models/config.go @@ -1,8 +1,8 @@ package models import ( - local "github.com/fibercrypto/FiberCryptoWallet/src/main" - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + local "github.com/fibercrypto/fibercryptowallet/src/main" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" "github.com/therecipe/qt/qml" diff --git a/src/models/history/history.go b/src/models/history/history.go index 329535e2..bf3fd470 100644 --- a/src/models/history/history.go +++ b/src/models/history/history.go @@ -1,7 +1,7 @@ package history import ( - "github.com/fibercrypto/FiberCryptoWallet/src/models/transactions" + "github.com/fibercrypto/fibercryptowallet/src/models/transactions" "github.com/therecipe/qt/core" ) diff --git a/src/models/history/historyManager.go b/src/models/history/historyManager.go index b93ccf95..806f1385 100644 --- a/src/models/history/historyManager.go +++ b/src/models/history/historyManager.go @@ -5,15 +5,15 @@ import ( "strconv" "time" - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" - - coin "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/models" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - local "github.com/fibercrypto/FiberCryptoWallet/src/main" - "github.com/fibercrypto/FiberCryptoWallet/src/models/address" - "github.com/fibercrypto/FiberCryptoWallet/src/models/transactions" - "github.com/fibercrypto/FiberCryptoWallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/params" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" + + coin "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" + "github.com/fibercrypto/fibercryptowallet/src/core" + local "github.com/fibercrypto/fibercryptowallet/src/main" + "github.com/fibercrypto/fibercryptowallet/src/models/address" + "github.com/fibercrypto/fibercryptowallet/src/models/transactions" + "github.com/fibercrypto/fibercryptowallet/src/util" qtCore "github.com/therecipe/qt/core" ) diff --git a/src/models/modelWallets.go b/src/models/modelWallets.go index c1c8ebdc..7e5104bf 100644 --- a/src/models/modelWallets.go +++ b/src/models/modelWallets.go @@ -1,11 +1,11 @@ package models import ( - coin "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/models" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - local "github.com/fibercrypto/FiberCryptoWallet/src/main" - "github.com/fibercrypto/FiberCryptoWallet/src/util" - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + coin "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" + "github.com/fibercrypto/fibercryptowallet/src/core" + local "github.com/fibercrypto/fibercryptowallet/src/main" + "github.com/fibercrypto/fibercryptowallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" qtcore "github.com/therecipe/qt/core" ) diff --git a/src/models/networkingManager.go b/src/models/networkingManager.go index 54f04eec..27e26963 100644 --- a/src/models/networkingManager.go +++ b/src/models/networkingManager.go @@ -1,8 +1,8 @@ package models import ( - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/models" - "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" + "github.com/fibercrypto/fibercryptowallet/src/core" "github.com/skycoin/skycoin/src/util/logging" qtCore "github.com/therecipe/qt/core" ) diff --git a/src/models/networkingModel.go b/src/models/networkingModel.go index f8ea5da1..03ce8730 100644 --- a/src/models/networkingModel.go +++ b/src/models/networkingModel.go @@ -3,7 +3,7 @@ package models import ( "time" - coin "github.com/fibercrypto/FiberCryptoWallet/src/core" + coin "github.com/fibercrypto/fibercryptowallet/src/core" "github.com/therecipe/qt/core" ) diff --git a/src/models/pending/PendingModel.go b/src/models/pending/PendingModel.go index 1aee09bb..e7eaac9c 100644 --- a/src/models/pending/PendingModel.go +++ b/src/models/pending/PendingModel.go @@ -1,11 +1,11 @@ package pending import ( - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/models" //callable as skycoin - "github.com/fibercrypto/FiberCryptoWallet/src/core" - local "github.com/fibercrypto/FiberCryptoWallet/src/main" - "github.com/fibercrypto/FiberCryptoWallet/src/util" - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" //callable as skycoin + "github.com/fibercrypto/fibercryptowallet/src/core" + local "github.com/fibercrypto/fibercryptowallet/src/main" + "github.com/fibercrypto/fibercryptowallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" qtCore "github.com/therecipe/qt/core" ) diff --git a/src/models/qtransaction.go b/src/models/qtransaction.go index d20cf7c8..9135a294 100644 --- a/src/models/qtransaction.go +++ b/src/models/qtransaction.go @@ -1,10 +1,10 @@ package models import ( - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/models/address" - "github.com/fibercrypto/FiberCryptoWallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/params" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/models/address" + "github.com/fibercrypto/fibercryptowallet/src/util" qtcore "github.com/therecipe/qt/core" ) diff --git a/src/models/transactions/transactions.go b/src/models/transactions/transactions.go index d88ad962..d13cf90c 100644 --- a/src/models/transactions/transactions.go +++ b/src/models/transactions/transactions.go @@ -1,7 +1,7 @@ package transactions import ( - "github.com/fibercrypto/FiberCryptoWallet/src/models/address" + "github.com/fibercrypto/fibercryptowallet/src/models/address" qtcore "github.com/therecipe/qt/core" ) diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index 9b85d862..af68de5b 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -4,16 +4,16 @@ import ( "fmt" "sync" - "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/params" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/params" - "github.com/fibercrypto/FiberCryptoWallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/util" "github.com/therecipe/qt/qml" - sky "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/models" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - local "github.com/fibercrypto/FiberCryptoWallet/src/main" - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + sky "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" + "github.com/fibercrypto/fibercryptowallet/src/core" + local "github.com/fibercrypto/fibercryptowallet/src/main" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" qtCore "github.com/therecipe/qt/core" ) diff --git a/src/models/walletsModel.go b/src/models/walletsModel.go index 09ef2d0d..3985b688 100644 --- a/src/models/walletsModel.go +++ b/src/models/walletsModel.go @@ -1,7 +1,7 @@ package models import ( - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" "github.com/therecipe/qt/core" "github.com/therecipe/qt/qml" ) diff --git a/src/util/cipher.go b/src/util/cipher.go index 15719aae..0a031b5b 100644 --- a/src/util/cipher.go +++ b/src/util/cipher.go @@ -1,7 +1,7 @@ package util import ( - "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/core" ) func NewGenericAddress(addr string) GenericAddress { diff --git a/src/util/coin.go b/src/util/coin.go index c29baf12..bf3016d1 100644 --- a/src/util/coin.go +++ b/src/util/coin.go @@ -1,8 +1,8 @@ package util import ( - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/errors" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/errors" ) func NewGenericOutput(addr core.Address, id string) GenericOutput { diff --git a/src/util/pluginutil.go b/src/util/pluginutil.go index 643fe302..b08591e1 100644 --- a/src/util/pluginutil.go +++ b/src/util/pluginutil.go @@ -4,8 +4,8 @@ import ( "errors" "math" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - local "github.com/fibercrypto/FiberCryptoWallet/src/main" + "github.com/fibercrypto/fibercryptowallet/src/core" + local "github.com/fibercrypto/fibercryptowallet/src/main" ) func AltcoinCaption(ticker string) string { diff --git a/src/util/sign.go b/src/util/sign.go index 0ff9e4ab..2fecebe2 100644 --- a/src/util/sign.go +++ b/src/util/sign.go @@ -1,9 +1,9 @@ package util import ( - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/errors" - local "github.com/fibercrypto/FiberCryptoWallet/src/main" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/errors" + local "github.com/fibercrypto/fibercryptowallet/src/main" ) // AttachSignService registers a signing strategy for use by wallets diff --git a/src/util/sign_test.go b/src/util/sign_test.go index 60d1451e..0c7f68aa 100644 --- a/src/util/sign_test.go +++ b/src/util/sign_test.go @@ -3,9 +3,9 @@ package util import ( "testing" - "github.com/fibercrypto/FiberCryptoWallet/src/coin/mocks" - "github.com/fibercrypto/FiberCryptoWallet/src/core" - "github.com/fibercrypto/FiberCryptoWallet/src/errors" + "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/errors" "github.com/skycoin/skycoin/src/testutil" "github.com/stretchr/testify/require" ) diff --git a/src/util/signutil/sign.go b/src/util/signutil/sign.go index 6f108ac5..bc8d1490 100644 --- a/src/util/signutil/sign.go +++ b/src/util/signutil/sign.go @@ -1,7 +1,7 @@ package signutil import ( - "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/core" ) // NewTxnSignerIteratorFromMap allocate transaction signer iterator out of standard signers map diff --git a/src/util/storage.go b/src/util/storage.go index 7469cadd..110fd85d 100644 --- a/src/util/storage.go +++ b/src/util/storage.go @@ -1,7 +1,7 @@ package util import ( - "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/core" ) // KeyValueMap diff --git a/src/util/textutil.go b/src/util/textutil.go index f92ac5bf..e3831ecc 100644 --- a/src/util/textutil.go +++ b/src/util/textutil.go @@ -1,7 +1,7 @@ package util import ( - "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/core" ) // EmptyPassword read no password diff --git a/src/util/util.go b/src/util/util.go index 463c85d5..4f735a16 100644 --- a/src/util/util.go +++ b/src/util/util.go @@ -1,7 +1,7 @@ package util import ( - "github.com/fibercrypto/FiberCryptoWallet/src/util/logging" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" "strconv" ) diff --git a/src/util/wallet.go b/src/util/wallet.go index 02fb0dec..2504bef3 100644 --- a/src/util/wallet.go +++ b/src/util/wallet.go @@ -1,7 +1,7 @@ package util import ( - "github.com/fibercrypto/FiberCryptoWallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/core" ) // SimpleWalletOutput put together transacion output with originating wallet From 130cc6f68e789628cd97b6b3bf660c399e2f3230 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Thu, 28 Nov 2019 20:31:34 -0500 Subject: [PATCH 57/69] [ci] [models] refs #150 - Update password reader signatures in wallet manager QT models code --- .gitignore | 1 + Makefile | 16 +++++++------- main.go | 8 +++---- resources/images/icons/appIcon/appIcon.icns | Bin 687658 -> 687434 bytes resources/platform/darwin/Info.plist | 2 +- src/models/walletsManager.go | 22 ++++++++------------ 6 files changed, 23 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index ca9b6ae3..2154554b 100644 --- a/.gitignore +++ b/.gitignore @@ -79,5 +79,6 @@ rcc__* # Temporary build files rcc_cgo_*.go +darwin diff --git a/Makefile b/Makefile index c83bed23..d7815d3a 100644 --- a/Makefile +++ b/Makefile @@ -62,7 +62,7 @@ deps: ## Add dependencies # Targets run: build ## Run FiberCrypto Wallet. @echo "Running $(APP_NAME)..." - @./deploy/linux/FiberCryptoWallet + @./deploy/linux/fibercryptowallet install-deps-no-envs: ## Install therecipe/qt with -tags=no_env set go get -v -tags=no_env github.com/therecipe/qt/cmd/... @@ -136,7 +136,7 @@ build-icon-Linux: ## Build the application icon in Linux build-icon: build-icon-$(OS) ## Build the application icon (Windows_NT and Darwin systems) @echo "Builded $(OS) icon..." -build-Linux: ## Build FiberCryptoWallet in Windows +build-Linux: ## Build fibercryptowallet in Windows @echo "Building on Linux" build-Windows_NT: build-icon ## Build FiberCrypto Wallet in Windows @@ -185,18 +185,18 @@ clean: clean-test clean-build ## Remove temporary files gen-mocks: ## Generate mocks for interface types mockery -all -output src/coin/mocks -outpkg mocks -dir src/core - find src/coin/mocks/ -name '*.go' -type f -print0 | xargs -0 -I PATH sed -i '' -e 's/fibercryptowallet/FiberCryptoWallet/g' PATH + find src/coin/mocks/ -name '*.go' -type f -print0 | xargs -0 -I PATH sed -i '' -e 's/fibercryptowallet/fibercryptowallet/g' PATH test-sky: ## Run Skycoin plugin test suite - go test -cover -timeout 30s github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin - go test -coverprofile=$(COVERAGEFILE) -timeout 30s github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/models + go test -cover -timeout 30s github.com/fibercrypto/fibercryptowallet/src/coin/skycoin + go test -coverprofile=$(COVERAGEFILE) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models test-core: ## Run tests for API core and helpers - go test -cover -timeout 30s github.com/fibercrypto/FiberCryptoWallet/src/util + go test -cover -timeout 30s github.com/fibercrypto/fibercryptowallet/src/util test-sky-launch-html-cover: - go test -cover -timeout 30s github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin - go test -coverprofile=$(COVERAGEFILE) -timeout 30s github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin/models + go test -cover -timeout 30s github.com/fibercrypto/fibercryptowallet/src/coin/skycoin + go test -coverprofile=$(COVERAGEFILE) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models go tool cover -html=$(COVERAGEFILE) -o $(COVERAGEHTML) test-cover: clean-test test-sky-launch-html-cover ## Show more details of test coverage diff --git a/main.go b/main.go index 0bfb3420..5319b120 100644 --- a/main.go +++ b/main.go @@ -3,10 +3,10 @@ package main import ( "os" - _ "github.com/fibercrypto/FiberCryptoWallet/src/coin/skycoin" - _ "github.com/fibercrypto/FiberCryptoWallet/src/models" - _ "github.com/fibercrypto/FiberCryptoWallet/src/models/history" - _ "github.com/fibercrypto/FiberCryptoWallet/src/models/pending" + _ "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin" + _ "github.com/fibercrypto/fibercryptowallet/src/models" + _ "github.com/fibercrypto/fibercryptowallet/src/models/history" + _ "github.com/fibercrypto/fibercryptowallet/src/models/pending" "github.com/therecipe/qt/core" "github.com/therecipe/qt/gui" "github.com/therecipe/qt/qml" diff --git a/resources/images/icons/appIcon/appIcon.icns b/resources/images/icons/appIcon/appIcon.icns index 01bf7c5a3e5d1a6e5900a6674f63dbd004fc85ad..97df1073411db791ca5794e01c48bf47784a19c6 100644 GIT binary patch delta 641 zcmW-bOH30{6ozkyLMaiW=>myCV~8d!Fi|%eqA-s>W~K%-(XCN7)`f{7CNtBS_TB<5 zv}Fh=JCZ)84>~QhFzwLF0_(=aE?gSp#ucbxAsZ73$#`QnuR(GSLHMQS(J#bAS%l^lB-}!;8u9MNxlek4pxejqY zCpuB<{PEXT@&d?O*6FX$n+wnGUUnkTedX2TTLX3z?1X{S+%sE^rn&phK;V(tGMYwx zyWZOSPzT0t(=@A@>Emdb?>hYZ)z5*sg9>H@A#Nty-&=^>VqQmrBK4tx_rL z`lhaJ6!N)TQOj(U3b<+OFx#)?%PC7MWV2c>pUX$my(y3>=hER+Is;R-ypE-^*>t+F zkEMWfbwyPZ%gaeMjzItFQe0h(#}exDS{$e-ITW3Z!ti2ZA+Z3HZ>LYawsSTWkr%jQ4odK zKt!?tMY|w~K^05Mk|ap*zZ83)7vEV9`D`9H^guVkFkHlA_cG&d2GV`E8JcF?3{GkcQav>7nSe9{seYO! wY5ahqCIIQ75oyQIs5=ONdyurz6K1S^WWx}cE{q-1jp@NSFul9&BWGacAGp#cHvj+t delta 867 zcmWlXYfMvT7{?!MxzuLU0ln$=fj}}b`!f6>#vqg-v6`k zIzRp5Ozuo>O8b8v-cGDSE$@Le-e;ARODpn&U{^P@ z+i;3HQkmifVZN$RU07G3*BmVs&>-DPRv65e{@plxbLszyRDhbEx$Daux&Dym_?w?V z-X^MZYq6(SQGL4~a^BxxEG#})XE@%sAXsVRcz%E@s0;y|^K+i8SIO&_(NqSGd%3z0 zX)W_M*5uJ3%sBj`{J2gMwW0Z7fMG{`?q4?zf0B{Hc@B=tka z4w+ag5oL?SEC{nQC43N<=B4i}?qcACkoUpB?BLYsg^B5(jsrAwg!+bKozcEuXMY(# z?SaYZt8-Td`;9$AKaY=(U4W^{sfnqvGlTu3iFj=6BE%EpiP6MpG#VR;49715L=(}G zNMx`-93GA&&I5#Fmryqn9-{lUvE2Yaj0}8#wlhG|dvh}x5YlZJ{xR?cuq{*UgY@kZ zsT7^;0PrO;NtP$O7trTdHIi=1WJDq@l-cTVSj7=|qFXOXeo1z#y0L{AH9*QDuv@^}cSOAv4KtmIb8k9+c)6rnihTglx=l@zu-oAkr>CxkR%a4=4-CyL;BHf<( zeQo2<@Qr`wzpJ7FqA6V&r11SgF8@ zzbFL2l$b(WUS+7BoL|0$R1Rtef{XJT&v$T7?%YH!n-7+fPZ$4K8AC32SN^^>X$%Ed a*HaK%5Ih7Qk%~w|q$4tBSJwsgJ?{WIxn^zv diff --git a/resources/platform/darwin/Info.plist b/resources/platform/darwin/Info.plist index dda01797..facfa794 100644 --- a/resources/platform/darwin/Info.plist +++ b/resources/platform/darwin/Info.plist @@ -9,7 +9,7 @@ CFBundleIconFile appIcon.icns CFBundleIdentifier - com.simelo.FiberCryptoWallet + net.fibercrypto.wallet CFBundleName FiberCrypto Wallet CFBundlePackageType diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index af68de5b..a265ea79 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -567,11 +567,6 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source string, p return nil } - if len(wltIds) != len(password) { - logWalletManager.Error("Wallets and passwords provided are incorrect") - return nil - } - wltCache := make(map[string]core.Wallet) wltByAddr := make(map[string]core.Wallet) wlts := make([]core.Wallet, 0) @@ -604,14 +599,14 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source string, p } signDescriptors = append(signDescriptors, sd) } - txn, err = walletM.signer.Sign(qTxn.txn, signDescriptors, passwords) + txn, err = walletM.signer.Sign(qTxn.txn, signDescriptors, pwd) } else { signer, err2 := util.LookupSignServiceForWallet(wlts[0], core.UID(source)) if err2 != nil { logWalletManager.WithError(err).Warnf("No signer %s for wallet %v", source, wlts[0]) return nil } - txn, err = wlts[0].Sign(qTxn.txn, signer, passwords[wlts[0].GetId()], nil) + txn, err = wlts[0].Sign(qTxn.txn, signer, pwd, nil) } if err != nil { @@ -631,8 +626,9 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source string, p func (walletM *WalletManager) signAndBroadcastTxnAsync(wltIds, addresses []string, source string, bridgeForPassword *QBridge, index []int, qTxn *QTransaction) { channel := make(chan *QTransaction) go func() { - pwd := func(message string) (string, error) { + pwd := func(message string, ctx core.KeyValueStore) (string, error) { bridgeForPassword.lock() + // TODO: Get wallet label from context bridgeForPassword.GetPassword(message) bridgeForPassword.lock() pass := bridgeForPassword.getResult() @@ -654,7 +650,7 @@ func (walletM *WalletManager) signAndBroadcastTxnAsync(wltIds, addresses []strin func (walletM *WalletManager) createEncryptedWallet(seed, label, password string, scanN int) *QWallet { logWalletManager.Info("Creating encrypted wallet") - pwd := func(message string) (string, error) { + pwd := func(message string, _ core.KeyValueStore) (string, error) { return password, nil } wlt, err := walletM.WalletEnv.GetWalletSet().CreateWallet(label, seed, true, pwd, scanN) @@ -670,7 +666,7 @@ func (walletM *WalletManager) createEncryptedWallet(seed, label, password string func (walletM *WalletManager) createUnencryptedWallet(seed, label string, scanN int) *QWallet { logWalletManager.Info("Creating encrypted wallet") - pwd := func(message string) (string, error) { + pwd := func(message string, _ core.KeyValueStore) (string, error) { return "", nil } @@ -712,7 +708,7 @@ func (walletM *WalletManager) verifySeed(seed string) int { func (walletM *WalletManager) encryptWallet(id, password string) int { logWalletManager.Info("Encrypting wallet") - pwd := func(message string) (string, error) { + pwd := func(message string, _ core.KeyValueStore) (string, error) { return password, nil } walletM.WalletEnv.GetStorage().Encrypt(id, pwd) @@ -729,7 +725,7 @@ func (walletM *WalletManager) encryptWallet(id, password string) int { func (walletM *WalletManager) decryptWallet(id, password string) int { logWalletManager.Info("Decrypt wallet") - pwd := func(message string) (string, error) { + pwd := func(message string, _ core.KeyValueStore) (string, error) { return password, nil } walletM.WalletEnv.GetStorage().Decrypt(id, pwd) @@ -747,7 +743,7 @@ func (walletM *WalletManager) decryptWallet(id, password string) int { func (walletM *WalletManager) newWalletAddress(id string, n int, password string) { logWalletManager.Info("Creating new wallet addresses") wlt := walletM.WalletEnv.GetWalletSet().GetWallet(id) - pwd := func(message string) (string, error) { + pwd := func(message string, _ core.KeyValueStore) (string, error) { return password, nil } wltEntriesLen := 0 From e6e193a94444c010a579bb4b5e00e55cd31ef4fb Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Thu, 28 Nov 2019 21:33:01 -0500 Subject: [PATCH 58/69] [models] [sky] refs #150 - Retrieve wallet label from pwd reader context for use in QBridge --- src/coin/skycoin/models/wallet.go | 12 ++++++++++-- src/models/walletsManager.go | 13 +++++++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index 4ad0d4dc..99f74831 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -380,7 +380,8 @@ func (wlt *RemoteWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordR pwdCtx.SetValue(core.StrTypeName, core.TypeNameWallet) pwdCtx.SetValue(core.StrMethodName, "Sign") pwdCtx.SetValue(core.StrWalletName, wlt.Id) - password, err = pwd(fmt.Sprintf("Enter password for %s ", wlt.Label), pwdCtx) + pwdCtx.SetValue(core.StrWalletLabel, wlt.Label) + password, err = pwd("Enter password", pwdCtx) if err != nil { logWallet.WithError(err).Warn("Error getting password") return nil, err @@ -631,6 +632,7 @@ func (wlt *RemoteWallet) GenAddresses(addrType core.AddressType, startIndex, cou pwdCtx.SetValue(core.StrTypeName, core.TypeNameWallet) pwdCtx.SetValue(core.StrMethodName, "GenAddresses") pwdCtx.SetValue(core.StrWalletName, wlt.Id) + pwdCtx.SetValue(core.StrWalletLabel, wlt.Label) password, err := pwd("Enter password", pwdCtx) if err != nil { logWallet.WithError(err).Fatal("Something was wrong entering the password") @@ -938,6 +940,7 @@ func (wltSrv *SkycoinLocalWallet) Encrypt(walletName string, password core.Passw return } + wltLabel := wlt.Label() if wlt.IsEncrypted() { return } @@ -946,6 +949,7 @@ func (wltSrv *SkycoinLocalWallet) Encrypt(walletName string, password core.Passw pwdCtx.SetValue(core.StrTypeName, core.TypeNameWalletStorage) pwdCtx.SetValue(core.StrMethodName, "Encrypt") pwdCtx.SetValue(core.StrWalletName, wltName) + pwdCtx.SetValue(core.StrWalletLabel, wltLabel) pwd, err := password("Enter Password", pwdCtx) if err != nil { logWallet.WithError(err).Fatal("Something was wrong entering the password") @@ -976,10 +980,12 @@ func (wltSrv *SkycoinLocalWallet) Decrypt(walletName string, password core.Passw if !wlt.IsEncrypted() { return } + wltLabel := wlt.Label() pwdCtx := util.NewKeyValueMap() pwdCtx.SetValue(core.StrTypeName, core.TypeNameWalletStorage) pwdCtx.SetValue(core.StrMethodName, "Decrypt") pwdCtx.SetValue(core.StrWalletName, wltName) + pwdCtx.SetValue(core.StrWalletLabel, wltLabel) pwd, err := password("Enter Password", pwdCtx) if err != nil { logWallet.WithError(err).Fatal("Something was wrong entering the password") @@ -1111,7 +1117,8 @@ func (wlt *LocalWallet) signSkycoinTxn(txn core.Transaction, pwd core.PasswordRe pwdCtx.SetValue(core.StrTypeName, core.TypeNameWallet) pwdCtx.SetValue(core.StrMethodName, "Sign") pwdCtx.SetValue(core.StrWalletName, wlt.Id) - pass, err := pwd(fmt.Sprintf("Enter password for %s", skyWlt.Label()), pwdCtx) + pwdCtx.SetValue(core.StrWalletLabel, wlt.Label) + pass, err := pwd("Enter password", pwdCtx) if err != nil { logWallet.WithError(err).Warn("Couldn't get password") return nil, err @@ -1424,6 +1431,7 @@ func (wlt *LocalWallet) GenAddresses(addrType core.AddressType, startIndex, coun pwdCtx.SetValue(core.StrTypeName, core.TypeNameWallet) pwdCtx.SetValue(core.StrMethodName, "GenAddresses") pwdCtx.SetValue(core.StrWalletName, wlt.Id) + pwdCtx.SetValue(core.StrWalletLabel, wlt.Label) password, err := pwd("Enter password", pwdCtx) if err != nil { logWallet.WithError(err).Error("Something was wrong entering the password") diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index a265ea79..18856679 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -628,8 +628,17 @@ func (walletM *WalletManager) signAndBroadcastTxnAsync(wltIds, addresses []strin go func() { pwd := func(message string, ctx core.KeyValueStore) (string, error) { bridgeForPassword.lock() - // TODO: Get wallet label from context - bridgeForPassword.GetPassword(message) + suffix := "" + v := ctx.GetValue(core.StrWalletLabel) + if v == nil { + v = ctx.GetValue(core.StrWalletName) + } + if v != nil { + if str, isStr := v.(string); isStr { + suffix = " for " + str + } + } + bridgeForPassword.GetPassword(message + suffix) bridgeForPassword.lock() pass := bridgeForPassword.getResult() bridgeForPassword.unlock() From d37c4aa5ccf0322c5b8964fefd294ae84224bc3c Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Thu, 28 Nov 2019 22:12:22 -0500 Subject: [PATCH 59/69] [models] [util] refs #150 - ConstantPassword helper function. Use it in wallet manager models. - Clear plain passwords from memory to reduce the risk of undesired retrieval --- src/models/walletsManager.go | 28 +++++++++++++--------------- src/util/textutil.go | 7 +++++++ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index 18856679..f0d2f0cf 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -659,9 +659,9 @@ func (walletM *WalletManager) signAndBroadcastTxnAsync(wltIds, addresses []strin func (walletM *WalletManager) createEncryptedWallet(seed, label, password string, scanN int) *QWallet { logWalletManager.Info("Creating encrypted wallet") - pwd := func(message string, _ core.KeyValueStore) (string, error) { - return password, nil - } + pwd := util.ConstantPassword(password) + // NOTE: No easy way to get plain passwords in memory + password = "" wlt, err := walletM.WalletEnv.GetWalletSet().CreateWallet(label, seed, true, pwd, scanN) if err != nil { logWalletManager.WithError(err).Error("Couldn't create encrypted wallet") @@ -675,9 +675,7 @@ func (walletM *WalletManager) createEncryptedWallet(seed, label, password string func (walletM *WalletManager) createUnencryptedWallet(seed, label string, scanN int) *QWallet { logWalletManager.Info("Creating encrypted wallet") - pwd := func(message string, _ core.KeyValueStore) (string, error) { - return "", nil - } + pwd := util.EmptyPassword wlt, err := walletM.WalletEnv.GetWalletSet().CreateWallet(label, seed, false, pwd, scanN) if err != nil { @@ -717,9 +715,9 @@ func (walletM *WalletManager) verifySeed(seed string) int { func (walletM *WalletManager) encryptWallet(id, password string) int { logWalletManager.Info("Encrypting wallet") - pwd := func(message string, _ core.KeyValueStore) (string, error) { - return password, nil - } + pwd := util.ConstantPassword(password) + // NOTE: No easy way to get plain passwords in memory + password = "" walletM.WalletEnv.GetStorage().Encrypt(id, pwd) ret, err := walletM.WalletEnv.GetStorage().IsEncrypted(id) if err != nil { @@ -734,9 +732,9 @@ func (walletM *WalletManager) encryptWallet(id, password string) int { func (walletM *WalletManager) decryptWallet(id, password string) int { logWalletManager.Info("Decrypt wallet") - pwd := func(message string, _ core.KeyValueStore) (string, error) { - return password, nil - } + pwd := util.ConstantPassword(password) + // NOTE: No easy way to get plain passwords in memory + password = "" walletM.WalletEnv.GetStorage().Decrypt(id, pwd) ret, err := walletM.WalletEnv.GetStorage().IsEncrypted(id) if err != nil { @@ -752,9 +750,9 @@ func (walletM *WalletManager) decryptWallet(id, password string) int { func (walletM *WalletManager) newWalletAddress(id string, n int, password string) { logWalletManager.Info("Creating new wallet addresses") wlt := walletM.WalletEnv.GetWalletSet().GetWallet(id) - pwd := func(message string, _ core.KeyValueStore) (string, error) { - return password, nil - } + pwd := util.ConstantPassword(password) + // NOTE: No easy way to get plain passwords in memory + password = "" wltEntriesLen := 0 it, err := wlt.GetLoadedAddresses() if err != nil { diff --git a/src/util/textutil.go b/src/util/textutil.go index e3831ecc..50fac68f 100644 --- a/src/util/textutil.go +++ b/src/util/textutil.go @@ -8,3 +8,10 @@ import ( func EmptyPassword(string, core.KeyValueStore) (string, error) { return "", nil } + +// ConstantPassword always return same known password +func ConstantPassword(pwdText string) core.PasswordReader { + return func(string, core.KeyValueStore) (string, error) { + return pwdText, nil + } +} From a8996b42cd693bba1a832f527d8ad4fbc71bcce5 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Thu, 28 Nov 2019 22:39:31 -0500 Subject: [PATCH 60/69] [ci] refs #150 - Lower case project name in +go_import_path --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5f60ea86..da1e88a4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ go: - 1.12.6 services: - docker -go_import_path: github.com/fibercrypto/FiberCryptoWallet +go_import_path: github.com/fibercrypto/fibercryptowallet matrix: include: - stage: RPI From 7b5d050e9d60cd04bd8789f761b8bccf037bba52 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 29 Nov 2019 11:48:19 -0500 Subject: [PATCH 61/69] [ci] refs #150 - Do not convert project name to lowercase during make gen-mocks --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index d7815d3a..a2ea2ec0 100644 --- a/Makefile +++ b/Makefile @@ -185,7 +185,6 @@ clean: clean-test clean-build ## Remove temporary files gen-mocks: ## Generate mocks for interface types mockery -all -output src/coin/mocks -outpkg mocks -dir src/core - find src/coin/mocks/ -name '*.go' -type f -print0 | xargs -0 -I PATH sed -i '' -e 's/fibercryptowallet/fibercryptowallet/g' PATH test-sky: ## Run Skycoin plugin test suite go test -cover -timeout 30s github.com/fibercrypto/fibercryptowallet/src/coin/skycoin From 0522948bbea40a2230b5a94ffb7dc4fc525f58f7 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 29 Nov 2019 20:47:26 -0500 Subject: [PATCH 62/69] [ci] refs #150 - Travis Linux build does not run in Docker container --- .travis.yml | 135 ++++++++++++++++++++++++++-------------------------- 1 file changed, 68 insertions(+), 67 deletions(-) diff --git a/.travis.yml b/.travis.yml index da1e88a4..0eb43596 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,80 +1,81 @@ sudo: required language: go go: -- 1.12.6 + - 1.12.6 services: -- docker + - docker go_import_path: github.com/fibercrypto/fibercryptowallet matrix: include: - - stage: RPI - if: branch = release*$ - install: - - DEFAULT_ARCH=rpi1 make install-docker-deps - - DEFAULT_ARCH=rpi2 make install-docker-deps - - DEFAULT_ARCH=rpi3 make install-docker-deps - - make install-deps-no-envs - script: - - make clean - - DEFAULT_TARGET=rpi1 make build-docker - - DEFAULT_TARGET=rpi2 make build-docker - - DEFAULT_TARGET=rpi3 make build-docker - - make lint - - make test - - stage: Android - if: branch = release*$ - install: - - DEFAULT_ARCH=android make install-docker-deps - - make install-deps-no-envs - script: - - make clean - - DEFAULT_TARGET=android make build-docker - - DEFAULT_TARGET=android-emulator make build-docker - - make lint - - make test - - stage: Linux - install: - - make install-docker-deps - - make install-deps-no-envs - - make install-linters - script: - - make clean - - DEFAULT_TARGET=linux make build-docker - - make test - - make lint - - stage: Windows - os: windows - install: - - choco install make -y - - travis_wait make install-deps-Windows - - make install-linters - script: - - make build - - make test - - make build-icon - - make lint - - stage: MacOS - os: osx - osx_image: xcode10.2 - install: - - make install-deps - script: - - make clean - - make build - - make test - - make build-icon - - make lint + - stage: RPI + if: branch = release*$ + install: + - DEFAULT_ARCH=rpi1 make install-docker-deps + - DEFAULT_ARCH=rpi2 make install-docker-deps + - DEFAULT_ARCH=rpi3 make install-docker-deps + - make install-deps-no-envs + script: + - make clean + - DEFAULT_TARGET=rpi1 make build-docker + - DEFAULT_TARGET=rpi2 make build-docker + - DEFAULT_TARGET=rpi3 make build-docker + - make lint + - make test + - stage: Android + if: branch = release*$ + install: + - DEFAULT_ARCH=android make install-docker-deps + - make install-deps-no-envs + script: + - make clean + - DEFAULT_TARGET=android make build-docker + - DEFAULT_TARGET=android-emulator make build-docker + - make lint + - make test + - stage: Linux + install: + #- make install-docker-deps + - make install-deps-no-envs + - make install-linters + script: + - make clean + #- DEFAULT_TARGET=linux make build-docker + - make build + - make test + - make lint + - stage: Windows + os: windows + install: + - choco install make -y + - travis_wait make install-deps-Windows + - make install-linters + script: + - make build + - make test + - make build-icon + - make lint + - stage: MacOS + os: osx + osx_image: xcode10.2 + install: + - make install-deps + script: + - make clean + - make build + - make test + - make build-icon + - make lint notifications: email: false webhooks: https://fathomless-fjord-24024.herokuapp.com/notify before_deploy: - - export VERSION="$(git describe --tags --exact-match HEAD 2> /dev/null)" - - export ARCH="$(uname -m)" - - export OS="$(uname -s)" - - make prepare-release - - make build - - ( cd deploy && tar czf ../fibercryptowallet-${VERSION}-${OS}-${ARCH}.tar.gz ./* ) - - pwd && ls -l . + - export VERSION="$(git describe --tags --exact-match HEAD 2> /dev/null)" + - export ARCH="$(uname -m)" + - export OS="$(uname -s)" + - make prepare-release + - make build + - ( cd deploy && tar czf ../fibercryptowallet-${VERSION}-${OS}-${ARCH}.tar.gz ./* ) + - pwd && ls -l . deploy: provider: releases api_key: @@ -83,6 +84,6 @@ deploy: kip_cleanup: true draft: true overwrite: true - on: + on: repo: fibercrypto/FiberCryptoWallet tags: true From 1bdc643ed4281a35fe3c41a37cfcf3dd154782f3 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Fri, 29 Nov 2019 21:23:19 -0500 Subject: [PATCH 63/69] [ci] refs #150 - Install deps before building project on Travis Linux jobs --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0eb43596..36cb3e78 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,7 +35,8 @@ matrix: - stage: Linux install: #- make install-docker-deps - - make install-deps-no-envs + #- make install-deps-no-envs + - make install-deps - make install-linters script: - make clean From 532bfba7a34e49f439df19a3f0c2bf3d5bdbc33e Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Sat, 30 Nov 2019 00:09:11 -0500 Subject: [PATCH 64/69] [models] refs #150 - Generic type of password reader argument in signTxn ... aimed at fixing error reported in https://travis-ci.org/fibercrypto/fibercryptowallet/jobs/618818243#L768 --- src/models/walletsManager.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index f0d2f0cf..f49793dd 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -47,7 +47,7 @@ type WalletManager struct { _ func(id string, password string) int `slot:"decryptWallet"` _ func() []*QWallet `slot:"getWallets"` _ func(id string) []*QAddress `slot:"getAddresses"` - _ func(wltIds, addresses []string, source string, pwd core.PasswordReader, index []int, qTxn *QTransaction) *QTransaction `slot:"signTxn"` + _ func(wltIds, addresses []string, source string, pwd interface{}, index []int, qTxn *QTransaction) *QTransaction `slot:"signTxn"` _ func(wltId string, destinationAddress string, amount string) *QTransaction `slot:"sendTo"` _ func(id, label string) *QWallet `slot:"editWallet"` _ func(wltId, address string) []*QOutput `slot:"getOutputs"` @@ -559,7 +559,11 @@ func (walletM *WalletManager) sendTo(wltId, destinationAddress, amount string) * } -func (walletM *WalletManager) signTxn(wltIds, address []string, source string, pwd core.PasswordReader, index []int, qTxn *QTransaction) *QTransaction { +func (walletM *WalletManager) signTxn(wltIds, address []string, source string, tmpPwd interface{}, index []int, qTxn *QTransaction) *QTransaction { + pwd, isPwdReader := tmpPwd.(core.PasswordReader) + if !isPwdReader { + return nil + } logWalletManager.Info("Signig transaction") if len(wltIds) != len(address) { From b6089ea5daa6b6ec8f990d0495d90c0a0dff239f Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Sat, 30 Nov 2019 18:47:00 -0500 Subject: [PATCH 65/69] [ci] refs #150 - Restore Travis Linux builds inside #Docker container --- .travis.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 36cb3e78..998f50d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,14 +34,12 @@ matrix: - make test - stage: Linux install: - #- make install-docker-deps - #- make install-deps-no-envs - - make install-deps + - make install-docker-deps + - make install-deps-no-envs - make install-linters script: - make clean - #- DEFAULT_TARGET=linux make build-docker - - make build + - DEFAULT_TARGET=linux make build-docker - make test - make lint - stage: Windows From f1cc49a7e3ce5e87be19cabe15ddb6f008da0406 Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Mon, 2 Dec 2019 22:37:48 -0500 Subject: [PATCH 66/69] [sky] [ci] refs #150 - Pass util.EmptyPassword in to makeLocalWalletsFromKeyData --- src/coin/skycoin/models/wallet_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index 5df9fc16..49ece0b9 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -805,7 +805,7 @@ func makeLocalWalletsFromKeyData(t *testing.T, keysData []KeyData) []core.Wallet var err error if w, isFound = walletsCache[kd.Mnemonic]; !isFound { if w = walletSet.GetWallet(walletID); w == nil { - w, err = walletSet.CreateWallet(walletID, kd.Mnemonic, wallet.WalletTypeDeterministic, false, func(string) (string, error) { return "", nil }, 0) + w, err = walletSet.CreateWallet(walletID, kd.Mnemonic, wallet.WalletTypeDeterministic, false, util.EmptyPassword, 0) require.NoError(t, err) } walletsCache[kd.Mnemonic] = w From 5a6ab84fdc1e518d4c270c303428529e07c2186b Mon Sep 17 00:00:00 2001 From: Olemis Lang Date: Mon, 2 Dec 2019 23:01:43 -0500 Subject: [PATCH 67/69] [ci] refs #150 - Fix syntax error in Travis script after merge --- .travis.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index fcd71dd1..f4f4ee10 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ matrix: - DEFAULT_ARCH=rpi2 make install-docker-deps - DEFAULT_ARCH=rpi3 make install-docker-deps - make install-deps-no-envs - - make install-coveralls + - make install-coveralls script: - make clean - DEFAULT_TARGET=rpi1 make build-docker @@ -27,7 +27,7 @@ matrix: install: - DEFAULT_ARCH=android make install-docker-deps - make install-deps-no-envs - - make install-coveralls + - make install-coveralls script: - make clean - DEFAULT_TARGET=android make build-docker @@ -40,39 +40,39 @@ matrix: - make install-docker-deps - make install-deps-no-envs - make install-linters - - make install-coveralls + - make install-coveralls script: - make clean - DEFAULT_TARGET=linux make build-docker - make test - make lint - - make test-cover-travis + - make test-cover-travis - stage: Windows os: windows install: - choco install make -y - travis_wait make install-deps-Windows - make install-linters - - make install-coveralls + - make install-coveralls script: - make build - make test - make build-icon - make lint - - make test-cover-travis + - make test-cover-travis - stage: MacOS os: osx osx_image: xcode10.2 install: - make install-deps - - make install-coveralls + - make install-coveralls script: - make clean - make build - make test - make build-icon - make lint - - make test-cover-travis + - make test-cover-travis notifications: email: false webhooks: https://fathomless-fjord-24024.herokuapp.com/notify From 8ce421a01082e7d4cd1d808585e3bccee074966e Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Mon, 9 Dec 2019 04:30:28 -0500 Subject: [PATCH 68/69] [models] Add BeginUse and EndUse methods to QBridge --- src/models/bridgeModel.go | 9 +++++++++ src/models/walletsManager.go | 4 +++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/models/bridgeModel.go b/src/models/bridgeModel.go index 523b8d3d..3a2823df 100644 --- a/src/models/bridgeModel.go +++ b/src/models/bridgeModel.go @@ -16,6 +16,7 @@ type QBridge struct { _ func() string `slot:"getResult"` result string sem sync.Mutex + use sync.Mutex } func (b *QBridge) init() { @@ -26,6 +27,14 @@ func (b *QBridge) init() { b.ConnectGetResult(b.getResult) } +func (b *QBridge) BeginUse() { + b.use.Lock() +} + +func (b *QBridge) EndUse() { + b.use.Unlock() +} + func (b *QBridge) lock() { b.sem.Lock() diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index 5286690f..b78609a1 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -60,7 +60,7 @@ type WalletManager struct { _ func(wltId string) []*QOutput `slot:"getOutputsFromWallet"` _ func() string `slot:"getDefaultWalletType"` _ func(wltIds, addresses []string, source string, bridgeForPassword *QBridge, index []int, qTxn *QTransaction) `slot:"signAndBroadcastTxnAsync"` - _ func() []string `slot:"getAvailableWalletTypes"` + _ func() []string `slot:"getAvailableWalletTypes"` } func (walletM *WalletManager) init() { @@ -645,6 +645,8 @@ func (walletM *WalletManager) signAndBroadcastTxnAsync(wltIds, addresses []strin channel := make(chan *QTransaction) go func() { pwd := func(message string, ctx core.KeyValueStore) (string, error) { + bridgeForPassword.BeginUse() + defer bridgeForPassword.EndUse() bridgeForPassword.lock() suffix := "" v := ctx.GetValue(core.StrWalletLabel) From 4478b3d2d875f607310614c22326ea3d9d4e4845 Mon Sep 17 00:00:00 2001 From: Mauricio Perdomo Date: Mon, 9 Dec 2019 05:37:00 -0500 Subject: [PATCH 69/69] [models]Remove duplicated methods in walletManager --- src/models/walletsManager.go | 2 -- src/ui/SubPageSendAdvanced.qml | 5 +---- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index b78609a1..030952bd 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -40,8 +40,6 @@ type WalletManager struct { _ func() `constructor:"init"` _ func(seed string, label string, walletType string, password string, scanN int) *QWallet `slot:"createEncryptedWallet"` _ func(seed string, label string, walletType string, scanN int) *QWallet `slot:"createUnencryptedWallet"` - _ func(seed string, label string, password string, scanN int) *QWallet `slot:"createEncryptedWallet"` - _ func(seed string, label string, scanN int) *QWallet `slot:"createUnencryptedWallet"` _ func(entropy int) string `slot:"getNewSeed"` _ func(seed string) int `slot:"verifySeed"` _ func(id string, n int, password string) `slot:"newWalletAddress"` diff --git a/src/ui/SubPageSendAdvanced.qml b/src/ui/SubPageSendAdvanced.qml index 453d339b..6a32674a 100644 --- a/src/ui/SubPageSendAdvanced.qml +++ b/src/ui/SubPageSendAdvanced.qml @@ -50,10 +50,7 @@ Page { upperAltCointBound = valCH*9/10 minFeeAmount = valCH/10 } -<<<<<<< HEAD -======= ->>>>>>> 361d7f76c5f2348ed6ab09bde7934bc05aade9e4 function getSelectedAddressesWithWallets(){ var indexs = comboBoxWalletsAddressesSendFrom.getCheckedDelegates() var addresses = [] @@ -94,7 +91,7 @@ Page { var indexs = comboBoxWalletsSendFrom.getCheckedDelegates() var enc = [] for (var i = 0; i < indexs.length; i++){ - walletEncrypted = [] + var walletEncrypted = [] walletEncrypted.push(comboBoxWalletsSendFrom.model.wallets[indexs[i]].fileName) walletEncrypted.push(comboBoxWalletsSendFrom.model.wallets[indexs[i]].name) walletEncrypted.push(comboBoxWalletsSendFrom.model.wallets[indexs[i]].encryptionEnabled)