Repository: onflow/flow-cli
Pull request #254 (2021-05-17 11:43:22)

Version 0.21.0
## Features
- Decode keys reenabled #257 
- Config manage enable #261 

## Improvements
- Documentation fixes #248 #250 #258 
- Include and exclude flags #253 

## Bugfixes
- Fix import detections #256 

### Release Scheduled: 24.05.2021


Patch:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 332dee36..642d7fb3 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -242,6 +242,9 @@ Default command response should be to the stdout and not saved to a file. Anytim
 the output to be saved to a file we should explicitly specify so by using `--save filename.txt`
 flag and providing the path.
 
+Result output should include only information that is commonly used and relevant, 
+don't use too much of user screen drowning what’s truly important, 
+instead provide a way to include that data when the user requests by having include, exclude flags.
 
 ```
 Address  179b6b1cb6755e31
diff --git a/README.md b/README.md
index 24f9241d..a9357741 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
+![](./logo-cli.svg)
+
 # Flow CLI
 
 The Flow CLI is a command-line interface that provides useful utilities for building Flow applications.
diff --git a/cmd/flow/main.go b/cmd/flow/main.go
index 45af7a60..e6c80370 100644
--- a/cmd/flow/main.go
+++ b/cmd/flow/main.go
@@ -32,6 +32,7 @@ import (
 	"github.com/onflow/flow-cli/internal/events"
 	"github.com/onflow/flow-cli/internal/keys"
 	"github.com/onflow/flow-cli/internal/project"
+	"github.com/onflow/flow-cli/internal/quick"
 	"github.com/onflow/flow-cli/internal/scripts"
 	"github.com/onflow/flow-cli/internal/status"
 	"github.com/onflow/flow-cli/internal/transactions"
@@ -45,8 +46,8 @@ func main() {
 		TraverseChildren: true,
 	}
 
-	// hot commands
-	config.InitCommand.AddToParent(cmd)
+	// quick commands
+	quick.InitCommand.AddToParent(cmd)
 	status.Command.AddToParent(cmd)
 
 	// structured commands
@@ -61,6 +62,7 @@ func main() {
 	cmd.AddCommand(blocks.Cmd)
 	cmd.AddCommand(collections.Cmd)
 	cmd.AddCommand(project.Cmd)
+	cmd.AddCommand(config.Cmd)
 
 	command.InitFlags(cmd)
 
diff --git a/docs/build-transactions.md b/docs/build-transactions.md
index 7a50772c..2b2cca6e 100644
--- a/docs/build-transactions.md
+++ b/docs/build-transactions.md
@@ -124,7 +124,7 @@ The `Type` must be the same as type in the transaction source code for that argu
 
 ### Arguments JSON
 
-- Flag: `--argsJSON`
+- Flag: `--args-json`
 - Valid inputs: arguments in JSON-Cadence form.
 
 Arguments passed to the Cadence transaction in Cadence JSON format.
diff --git a/docs/create-accounts.md b/docs/create-accounts.md
index e2bc7711..a916d4e2 100644
--- a/docs/create-accounts.md
+++ b/docs/create-accounts.md
@@ -103,6 +103,13 @@ and pay the account creation fee.
 
 Specify one or more contracts to be deployed during account creation.
 
+### Include Fields
+
+- Flag: `--include`
+- Valid inputs: `contracts`
+
+Specify fields to include in the result output. Applies only to the text output.
+
 ### Host
 
 - Flag: `--host`
diff --git a/docs/decode-keys.md b/docs/decode-keys.md
new file mode 100644
index 00000000..a80a76f4
--- /dev/null
+++ b/docs/decode-keys.md
@@ -0,0 +1,49 @@
+---
+title: Decode Account Key with the Flow CLI
+sidebar_title: Decode Account Keys
+description: How to decode rlp encoded key pair from the command line
+---
+
+The Flow CLI provides a command to decode RLP encoded account key.
+
+```shell
+flow keys decode <rlp encoded account key>
+```
+
+## Example Usage
+
+```shell
+> flow keys decode f847b84084d716c14b051ad6b001624f738f5d302636e6b07cc75e4530af7776a4368a2b586dbefc0564ee28384c2696f178cbed52e62811bcc9ecb59568c996d342db2402038203e8
+
+Public Key 		 84d716c14b051ad6b001624f738f5d302636e6b07cc75e4530af7776a4368a2b586dbefc0564ee28384c2696f178cbed52e62811bcc9ecb59568c996d342db24 
+Signature algorithm 	 ECDSA_P256
+Hash algorithm 		 SHA3_256
+Weight 			 1000
+Revoked 		 false
+```
+
+## Flags
+
+### Filter
+
+- Flag: `--filter`
+- Short Flag: `-x`
+- Valid inputs: a case-sensitive name of the result property.
+
+Specify any property name from the result you want to return as the only value.
+
+### Output
+
+- Flag: `--output`
+- Short Flag: `-o`
+- Valid inputs: `json`, `inline`
+
+Specify the format of the command results.
+
+### Save
+
+- Flag: `--save`
+- Short Flag: `-s`
+- Valid inputs: a path in the current filesystem.
+
+Specify the filename where you want the result to be saved
diff --git a/docs/developer-updates/release-notes-v21.md b/docs/developer-updates/release-notes-v21.md
new file mode 100644
index 00000000..c407dc57
--- /dev/null
+++ b/docs/developer-updates/release-notes-v21.md
@@ -0,0 +1,72 @@
+## ⬆️ Install or Upgrade
+
+Follow the [Flow CLI installation guide](https://docs.onflow.org/flow-cli/install/) for instructions on how to install or upgrade the CLI.
+
+
+## 💥 Breaking Changes
+
+### Flow Go SDK Update
+Update Flow Go SDK version from v0.19.0 to v0.20.0. 
+Read more about new version in the [release notes](https://github.com/onflow/flow-go-sdk/releases/tag/v0.20.0).
+
+## ⭐ Features
+
+### New Command To Manage Configuration
+Add or remove resources from the configuration using the new `flow config` command. 
+Usage is possible via interactive prompt or by using flags. Command syntax is as follows:
+```js
+flow config <add|remove> <account|contract|deployment|network>
+```
+
+Example for adding an account to the config via interactive prompt:
+
+```bash
+Name: Foo
+Address: f8d6e0586b0a20c7
+✔ ECDSA_P256
+✔ SHA3_256
+Private key: 1286...01afc
+Key index (Default: 0): 0
+
+Account Foo added to the configuration
+```
+
+Example for adding an account to the config without interactive prompt:
+
+```bash
+./main config add account --address f8d6e0586b0a20c7 --name Foo --private-key 1286...01afc
+
+Account Foo added to the configuration
+```
+
+We recommend using manage command to do any changes in the configuration as it will also 
+validate input values for you and will abstract any changes in the configuration format.
+
+### Decode Keys
+Command for decoding public keys in the RLP encoded format.
+
+Example of using the command: 
+
+```bash
+> flow keys decode f847b84084d716c14b051ad6b001624f738f5d302636e6b07cc75e4530af7776a4368a2b586dbefc0564ee28384c2696f178cbed52e62811bcc9ecb59568c996d342db2402038203e8
+
+Public Key 		 84d716c14b051ad6b001624f738f5d302636e6b07cc75e4530af7776a4368a2b586dbefc0564ee28384c2696f178cbed52e62811bcc9ecb59568c996d342db24 
+Signature algorithm 	 ECDSA_P256
+Hash algorithm 		 SHA3_256
+Weight 			 1000
+Revoked 		 false
+```
+
+## 🎉 Improvements
+
+### Include And Exclude Flags
+Include and Exclude flags were added to the transaction and account resource thus 
+allowing you to further specify verbosity of the output.
+
+### Documentation Changes
+Multiple reported documentation fixes.
+
+## 🐞 Bug Fixes
+
+### Import Detection Fix
+Fix for a reported bug: An error occurs when executing a script that imports a built-in contract (Crypto contract) with Flow CLI command.
diff --git a/docs/execute-scripts.md b/docs/execute-scripts.md
index 0e27d26e..3000762e 100644
--- a/docs/execute-scripts.md
+++ b/docs/execute-scripts.md
@@ -42,7 +42,7 @@ The `Type` must be the same as type in the script source code for that argument.
 
 ### Arguments JSON
 
-- Flag: `--argsJSON`
+- Flag: `--args-json`
 - Valid inputs: arguments in JSON-Cadence form.
 
 Arguments passed to the Cadence script in `Type:Value` format.
diff --git a/docs/get-accounts.md b/docs/get-accounts.md
index 67c83ae1..9d99d725 100644
--- a/docs/get-accounts.md
+++ b/docs/get-accounts.md
@@ -49,11 +49,18 @@ Flow [account address](https://docs.onflow.org/concepts/accounts-and-keys/) (pre
 
 ## Flags
 
+### Include Fields
+
+- Flag: `--include`
+- Valid inputs: `contracts`
+
+Specify fields to include in the result output. Applies only to the text output.
+
 ### Contracts
 
 - Flag: `--contracts`
 
-Display contracts deployed to the account.
+⚠️  Deprecated: use include flag.
 
 ### Code 
 ⚠️  No longer supported: use contracts flag instead.
diff --git a/docs/get-transactions.md b/docs/get-transactions.md
index 7cd04c9a..8f4373f4 100644
--- a/docs/get-transactions.md
+++ b/docs/get-transactions.md
@@ -14,24 +14,50 @@ flow transactions get <tx_id>
 ## Example Usage
 
 ```shell
-> flow transactions get ff35821007322405608c0d3da79312617f8d16e118afe63e764b5e68edc96dd5 --host access.mainnet.nodes.onflow.org:9000
-
-ID	 ff35821007322405608c0d3da79312617f8d16e118afe63e764b5e68edc96dd5
-Status	 SEALED
-Payer	 12e354a23e4f791d
-Events	 
-	 Index	 0
-	 Type	 flow.AccountCreated
-	 Tx ID	 ff35821007322405608c0d3da79312617f8d16e118afe63e764b5e68edc96dd5
-	 Values
-		 address (Address)	18c4931b5f3c7151
-
-	 Index	 1
-	 Type	 flow.AccountKeyAdded
-	 Tx ID	 ff35821007322405608c0d3da79312617f8d16e118afe63e764b5e68edc96dd5
-	 Values
-		 address (Address)	18c4931b5f3c7151
-		 publicKey (Unknown)	f847b8404c296679364d2...7b168678cc762bc08f342d8d92e0a36e6ecfdcf15850721821823e8
+> flow transactions get 40bc4b100c1930c61381c22e0f4c10a7f5827975ee25715527c1061b8d71e5aa --network mainnet 
+
+Status		✅ SEALED
+ID		40bc4b100c1930c61381c22e0f4c10a7f5827975ee25715527c1061b8d71e5aa
+Payer		18eb4ee6b3c026d2
+Authorizers	[18eb4ee6b3c026d2]
+
+Proposal Key:	
+    Address	18eb4ee6b3c026d2
+    Index	11
+    Sequence	17930
+
+Payload Signature 0: 18eb4ee6b3c026d2
+Payload Signature 1: 18eb4ee6b3c026d2
+Envelope Signature 0: 18eb4ee6b3c026d2
+Signatures (minimized, use --include signatures)
+
+Events:		 
+    Index	0
+    Type	A.1654653399040a61.FlowToken.TokensWithdrawn
+    Tx ID	40bc4b100c1930c61381c22e0f4c10a7f5827975ee25715527c1061b8d71e5aa
+    Values
+		- amount (UFix64):	0.00100000
+		- from ({}?):			18eb4ee6b3c026d2
+
+    Index	1
+    Type	A.1654653399040a61.FlowToken.TokensDeposited
+    Tx ID	40bc4b100c1930c61381c22e0f4c10a7f5827975ee25715527c1061b8d71e5aa
+    Values
+		- amount (UFix64):	0.00100000
+		- to ({}?):			5068e27f275c546c
+
+    Index	2
+    Type	A.18eb4ee6b3c026d2.PrivateReceiverForwarder.PrivateDeposit
+    Tx ID	40bc4b100c1930c61381c22e0f4c10a7f5827975ee25715527c1061b8d71e5aa
+    Values
+		- amount (UFix64):	0.00100000
+		- to ({}?):			5068e27f275c546c
+
+
+
+Code (hidden, use --include code)
+
+Payload (hidden, use --include payload)
 ```
 
 ## Arguments
@@ -45,12 +71,18 @@ The first argument is the ID (hash) of the transaction.
 
 ## Flags
     
-### Display Transaction Code
+### Include Fields
+
+- Flag: `--include`
+- Valid inputs: `code`, `payload`, `signatures`
+
+Specify fields to include in the result output. Applies only to the text output.
+
+### Code
 
 - Flag: `--code`
-- Default: `false`
 
-Indicate whether to print the transaction Cadence code.
+⚠️  Deprecated: use include flag.
 
 ### Wait for Seal
 
@@ -60,6 +92,13 @@ Indicate whether to print the transaction Cadence code.
 Indicate whether to wait for the transaction to be sealed
 before displaying the result.
 
+### Exclude Fields
+
+- Flag: `--exclude`
+- Valid inputs: `events`
+
+Specify fields to exclude from the result output. Applies only to the text output.
+
 ### Host
 
 - Flag: `--host`
diff --git a/docs/send-signed-transactions.md b/docs/send-signed-transactions.md
index 7d62d9a8..7747c5da 100644
--- a/docs/send-signed-transactions.md
+++ b/docs/send-signed-transactions.md
@@ -22,47 +22,25 @@ flow transactions send-signed <signed transaction filename>
 > flow transactions send-signed ./signed.rlp
     
 Status		✅ SEALED
-ID		b6430b35ba23849a8acb4fa1a4a1d5cce3ed4589111ecbb3984de1b6bd1ba39e
-Payer		a2c4941b5f3c7151
-Authorizers	[a2c4941b5f3c7151]
+ID		528332aceb288cdfe4d11d6522aa27bed94fb3266b812cb350eb3526ed489d99
+Payer		f8d6e0586b0a20c7
+Authorizers	[f8d6e0586b0a20c7]
 
 Proposal Key:	
-    Address	a2c4941b5f3c7151
+    Address	f8d6e0586b0a20c7
     Index	0
-    Sequence	9
+    Sequence	0
 
 No Payload Signatures
 
-Envelope Signature 0:
-    Address	a2c4941b5f3c7151
-    Signature	5391a6fed0fe...2742048166f9d5c925a8dcb78a6d8c710921d67
-    Key Index	0
-
+Envelope Signature 0: f8d6e0586b0a20c7
+Signatures (minimized, use --include signatures)
 
 Events:	 None
 
+Code (hidden, use --include code)
 
-Arguments (1):
-    - Argument 0: {"type":"String","value":"Meow"}
-
-
-Code
-
-transaction(greeting: String) {
-  let guest: Address
-
-  prepare(authorizer: AuthAccount) {
-    self.guest = authorizer.address
-  }
-
-  execute {
-    log(greeting.concat(",").concat(self.guest.toString()))
-  }
-}
-
-
-Payload:
-f90184f90138...8a9462751237da2742048166f9d5c925a8dcb78a6d8c710921d67
+Payload (hidden, use --include payload)
 
 ```
 
@@ -78,6 +56,28 @@ transaction to be executed.
 
 ## Flags
 
+### Include Fields
+
+- Flag: `--include`
+- Valid inputs: `code`, `payload`
+
+Specify fields to include in the result output. Applies only to the text output.
+
+### Exclude Fields
+
+- Flag: `--exclude`
+- Valid inputs: `events`
+
+Specify fields to exclude from the result output. Applies only to the text output.
+
+### Filter
+
+- Flag: `--filter`
+- Short Flag: `-x`
+- Valid inputs: a case-sensitive name of the result property.
+
+Specify any property name from the result you want to return as the only value.
+
 ### Host
 
 - Flag: `--host`
@@ -97,14 +97,6 @@ any host defined by the `--network` flag.
 
 Specify which network you want the command to use for execution.
 
-### Filter
-
-- Flag: `--filter`
-- Short Flag: `-x`
-- Valid inputs: a case-sensitive name of the result property.
-
-Specify any property name from the result you want to return as the only value.
-
 ### Output
 
 - Flag: `--output`
diff --git a/docs/send-transactions.md b/docs/send-transactions.md
index 1e1ed71b..2d3509f0 100644
--- a/docs/send-transactions.md
+++ b/docs/send-transactions.md
@@ -14,52 +14,28 @@ flow transactions send <code filename>
 ## Example Usage
 
 ```shell
-> flow transactions send ./transaction.cdc \
-    --args-json '[{"type": "String","value": "Hello World"}]' \
-    --signer my-testnet-account
+> flow transactions send ./tx.cdc --arg String:Hello
     
 Status		✅ SEALED
-ID		b6430b35ba23849a8acb4fa1a4a1d5cce3ed4589111ecbb3984de1b6bd1ba39e
-Payer		a2c4941b5f3c7151
-Authorizers	[a2c4941b5f3c7151]
+ID		b04b6bcc3164f5ee6b77fa502c3a682e0db57fc47e5b8a8ef3b56aae50ad49c8
+Payer		f8d6e0586b0a20c7
+Authorizers	[f8d6e0586b0a20c7]
 
 Proposal Key:	
-    Address	a2c4941b5f3c7151
+    Address	f8d6e0586b0a20c7
     Index	0
-    Sequence	9
+    Sequence	0
 
 No Payload Signatures
 
-Envelope Signature 0:
-    Address	a2c4941b5f3c7151
-    Signature	5391a6fed0fe...2742048166f9d5c925a8dcb78a6d8c710921d67
-    Key Index	0
-
+Envelope Signature 0: f8d6e0586b0a20c7
+Signatures (minimized, use --include signatures)
 
 Events:	 None
 
+Code (hidden, use --include code)
 
-Arguments (1):
-    - Argument 0: {"type":"String","value":"Hello World"}
-
-
-Code
-
-transaction(greeting: String) {
-  let guest: Address
-
-  prepare(authorizer: AuthAccount) {
-    self.guest = authorizer.address
-  }
-
-  execute {
-    log(greeting.concat(",").concat(self.guest.toString()))
-  }
-}
-
-
-Payload:
-f90184f90138...8a9462751237da2742048166f9d5c925a8dcb78a6d8c710921d67
+Payload (hidden, use --include payload)
 
 ```
 
@@ -87,6 +63,13 @@ transaction to be executed.
 
 ## Flags
 
+### Include Fields
+
+- Flag: `--include`
+- Valid inputs: `code`, `payload`
+
+Specify fields to include in the result output. Applies only to the text output.
+
 ### Code
 
 - Flag: `--code`
@@ -99,6 +82,13 @@ transaction to be executed.
 
 ⚠️  No longer supported: all transactions will provide result.
 
+### Exclude Fields
+
+- Flag: `--exclude`
+- Valid inputs: `events`
+
+Specify fields to exclude from the result output. Applies only to the text output.
+
 ### Signer
 
 - Flag: `--signer`
diff --git a/internal/accounts/accounts.go b/internal/accounts/accounts.go
index ed4bb1ca..3f3d8c68 100644
--- a/internal/accounts/accounts.go
+++ b/internal/accounts/accounts.go
@@ -22,6 +22,8 @@ import (
 	"bytes"
 	"fmt"
 
+	"github.com/onflow/flow-cli/internal/command"
+
 	"github.com/onflow/cadence"
 	"github.com/onflow/flow-go-sdk"
 	"github.com/spf13/cobra"
@@ -48,6 +50,7 @@ func init() {
 type AccountResult struct {
 	*flow.Account
 	showCode bool
+	include  []string
 }
 
 // JSON convert result to JSON
@@ -97,24 +100,32 @@ func (r *AccountResult) String() string {
 		_, _ = fmt.Fprintf(writer, "\tSignature Algorithm\t %s\n", key.SigAlgo)
 		_, _ = fmt.Fprintf(writer, "\tHash Algorithm\t %s\n", key.HashAlgo)
 		_, _ = fmt.Fprintf(writer, "\tRevoked \t %t\n", key.Revoked)
-		fmt.Fprintf(writer, "\tSequence Number \t %d\n", key.SequenceNumber)
-		fmt.Fprintf(writer, "\tIndex \t %d\n", key.Index)
-		fmt.Fprintf(writer, "\n")
+		_, _ = fmt.Fprintf(writer, "\tSequence Number \t %d\n", key.SequenceNumber)
+		_, _ = fmt.Fprintf(writer, "\tIndex \t %d\n", key.Index)
+		_, _ = fmt.Fprintf(writer, "\n")
+
+		// only show up to 3 keys and then show label to expand more info
+		if i == 3 && !command.ContainsFlag(r.include, "keys") {
+			_, _ = fmt.Fprint(writer, "...keys minimized, use --include keys flag if you want to view all\n\n")
+			break
+		}
 	}
 
-	fmt.Fprintf(writer, "Contracts Deployed: %d\n", len(r.Contracts))
+	_, _ = fmt.Fprintf(writer, "Contracts Deployed: %d\n", len(r.Contracts))
 	for name := range r.Contracts {
-		fmt.Fprintf(writer, "Contract: '%s'\n", name)
+		_, _ = fmt.Fprintf(writer, "Contract: '%s'\n", name)
 	}
 
-	if r.showCode {
+	if r.showCode || command.ContainsFlag(r.include, "contracts") {
 		for name, code := range r.Contracts {
-			fmt.Fprintf(writer, "Contracts '%s':\n", name)
-			fmt.Fprintln(writer, string(code))
+			_, _ = fmt.Fprintf(writer, "Contracts '%s':\n", name)
+			_, _ = fmt.Fprintln(writer, string(code))
 		}
+	} else {
+		_, _ = fmt.Fprint(writer, "\n\nContracts (hidden, use --include contracts)")
 	}
 
-	writer.Flush()
+	_ = writer.Flush()
 
 	return b.String()
 }
diff --git a/internal/accounts/contract-add.go b/internal/accounts/contract-add.go
index 19643c5f..34f9006b 100644
--- a/internal/accounts/contract-add.go
+++ b/internal/accounts/contract-add.go
@@ -28,8 +28,9 @@ import (
 )
 
 type flagsAddContract struct {
-	Signer  string `default:"emulator-account" flag:"signer" info:"Account name from configuration used to sign the transaction"`
-	Results bool   `default:"false" flag:"results" info:"⚠️  Deprecated: results are provided by default"`
+	Signer  string   `default:"emulator-account" flag:"signer" info:"Account name from configuration used to sign the transaction"`
+	Results bool     `default:"false" flag:"results" info:"⚠️  Deprecated: results are provided by default"`
+	Include []string `default:"" flag:"include" info:"Fields to include in the output"`
 }
 
 var addContractFlags = flagsAddContract{}
@@ -66,6 +67,7 @@ var AddContractCommand = &command.Command{
 		return &AccountResult{
 			Account:  account,
 			showCode: false,
+			include:  addContractFlags.Include,
 		}, nil
 	},
 }
diff --git a/internal/accounts/contract-remove.go b/internal/accounts/contract-remove.go
index e41787c4..9cc16c54 100644
--- a/internal/accounts/contract-remove.go
+++ b/internal/accounts/contract-remove.go
@@ -28,8 +28,9 @@ import (
 )
 
 type flagsRemoveContract struct {
-	Signer  string `default:"emulator-account" flag:"signer" info:"Account name from configuration used to sign the transaction"`
-	Results bool   `default:"false" flag:"results" info:"⚠️  Deprecated: results are provided by default"`
+	Signer  string   `default:"emulator-account" flag:"signer" info:"Account name from configuration used to sign the transaction"`
+	Results bool     `default:"false" flag:"results" info:"⚠️  Deprecated: results are provided by default"`
+	Include []string `default:"" flag:"include" info:"Fields to include in the output"`
 }
 
 var flagsRemove = flagsRemoveContract{}
@@ -63,6 +64,7 @@ var RemoveCommand = &command.Command{
 		return &AccountResult{
 			Account:  account,
 			showCode: false,
+			include:  flagsRemove.Include,
 		}, nil
 	},
 }
diff --git a/internal/accounts/contract-update.go b/internal/accounts/contract-update.go
index a411ef95..9e23337f 100644
--- a/internal/accounts/contract-update.go
+++ b/internal/accounts/contract-update.go
@@ -28,8 +28,9 @@ import (
 )
 
 type flagsUpdateContract struct {
-	Signer  string `default:"emulator-account" flag:"signer" info:"Account name from configuration used to sign the transaction"`
-	Results bool   `default:"false" flag:"results" info:"⚠️  Deprecated: results are provided by default"`
+	Signer  string   `default:"emulator-account" flag:"signer" info:"Account name from configuration used to sign the transaction"`
+	Results bool     `default:"false" flag:"results" info:"⚠️  Deprecated: results are provided by default"`
+	Include []string `default:"" flag:"include" info:"Fields to include in the output"`
 }
 
 var updateFlags = flagsUpdateContract{}
@@ -65,6 +66,7 @@ var UpdateCommand = &command.Command{
 		return &AccountResult{
 			Account:  account,
 			showCode: false,
+			include:  updateFlags.Include,
 		}, nil
 	},
 }
diff --git a/internal/accounts/create.go b/internal/accounts/create.go
index feb5ecfb..27e5a3d7 100644
--- a/internal/accounts/create.go
+++ b/internal/accounts/create.go
@@ -35,6 +35,7 @@ type flagsCreate struct {
 	HashAlgo  string   `default:"SHA3_256" flag:"hash-algo" info:"Hash used for the digest"`
 	Contracts []string `flag:"contract" info:"Contract to be deployed during account creation. <name:filename>"`
 	Results   bool     `default:"false" flag:"results" info:"⚠️  Deprecated: results are provided by default"`
+	Include   []string `default:"" flag:"include" info:"Fields to include in the output"`
 }
 
 var createFlags = flagsCreate{}
@@ -71,6 +72,7 @@ var CreateCommand = &command.Command{
 
 		return &AccountResult{
 			Account: account,
+			include: createFlags.Include,
 		}, nil
 	},
 }
diff --git a/internal/accounts/get.go b/internal/accounts/get.go
index 26433c52..4c2cac4a 100644
--- a/internal/accounts/get.go
+++ b/internal/accounts/get.go
@@ -28,8 +28,9 @@ import (
 )
 
 type flagsGet struct {
-	Contracts bool `default:"false" flag:"contracts" info:"Display contracts deployed to the account"`
-	Code      bool `default:"false" flag:"code" info:"⚠️  Deprecated: use contracts flag instead"`
+	Contracts bool     `default:"false" flag:"contracts" info:"⚠️  Deprecated: use include flag instead"`
+	Code      bool     `default:"false" flag:"code" info:"⚠️  Deprecated: use contracts flag instead"`
+	Include   []string `default:"" flag:"include" info:"Fields to include in the output"`
 }
 
 var getFlags = flagsGet{}
@@ -52,6 +53,10 @@ var GetCommand = &command.Command{
 			fmt.Println("⚠️  DEPRECATION WARNING: use contracts flag instead")
 		}
 
+		if getFlags.Contracts {
+			fmt.Println("⚠️  DEPRECATION WARNING: use include contracts flag instead")
+		}
+
 		account, err := services.Accounts.Get(args[0]) // address
 		if err != nil {
 			return nil, err
@@ -60,6 +65,7 @@ var GetCommand = &command.Command{
 		return &AccountResult{
 			Account:  account,
 			showCode: getFlags.Contracts || getFlags.Code,
+			include:  getFlags.Include,
 		}, nil
 	},
 }
diff --git a/internal/blocks/blocks.go b/internal/blocks/blocks.go
index b86a88cc..d0e51733 100644
--- a/internal/blocks/blocks.go
+++ b/internal/blocks/blocks.go
@@ -22,6 +22,8 @@ import (
 	"bytes"
 	"fmt"
 
+	"github.com/onflow/flow-cli/internal/command"
+
 	"github.com/onflow/flow-go-sdk"
 	"github.com/onflow/flow-go-sdk/client"
 	"github.com/spf13/cobra"
@@ -46,6 +48,7 @@ type BlockResult struct {
 	events      []client.BlockEvents
 	collections []*flow.Collection
 	verbose     bool
+	included    []string
 }
 
 // JSON convert result to JSON
@@ -94,7 +97,7 @@ func (r *BlockResult) String() string {
 	for i, guarantee := range r.block.CollectionGuarantees {
 		_, _ = fmt.Fprintf(writer, "    Collection %d:\t%s\n", i, guarantee.CollectionID)
 
-		if r.verbose {
+		if r.verbose || command.ContainsFlag(r.included, "transactions") {
 			for x, tx := range r.collections[i].TransactionIDs {
 				_, _ = fmt.Fprintf(writer, "         Transaction %d: %s\n", x, tx)
 			}
@@ -108,7 +111,7 @@ func (r *BlockResult) String() string {
 		_, _ = fmt.Fprintf(writer, "%s", e.String())
 	}
 
-	writer.Flush()
+	_ = writer.Flush()
 	return b.String()
 }
 
diff --git a/internal/blocks/get.go b/internal/blocks/get.go
index f11e9957..2a58691c 100644
--- a/internal/blocks/get.go
+++ b/internal/blocks/get.go
@@ -28,11 +28,12 @@ import (
 )
 
 type flagsBlocks struct {
-	Events      string `default:"" flag:"events" info:"List events of this type for the block"`
-	Verbose     bool   `default:"false" flag:"verbose" info:"Display transactions in block"`
-	Latest      bool   `default:"false" flag:"latest" info:"⚠️  No longer supported: use command argument"`
-	BlockID     string `default:"" flag:"id" info:"⚠️  No longer supported: use command argument"`
-	BlockHeight uint64 `default:"0" flag:"height" info:"⚠️  No longer supported: use command argument"`
+	Events      string   `default:"" flag:"events" info:"List events of this type for the block"`
+	Include     []string `default:"" flag:"include" info:"Fields to include in the output"`
+	Verbose     bool     `default:"false" flag:"verbose" info:"⚠️  Deprecated: use include transactions flag instead"`
+	Latest      bool     `default:"false" flag:"latest" info:"⚠️  No longer supported: use command argument"`
+	BlockID     string   `default:"" flag:"id" info:"⚠️  No longer supported: use command argument"`
+	BlockHeight uint64   `default:"0" flag:"height" info:"⚠️  No longer supported: use command argument"`
 }
 
 var blockFlags = flagsBlocks{}
@@ -55,6 +56,10 @@ var GetCommand = &command.Command{
 			return nil, fmt.Errorf("⚠️  No longer supported: use command argument.")
 		}
 
+		if blockFlags.Verbose {
+			fmt.Println("⚠️  DEPRECATION WARNING: use include transactions flag instead")
+		}
+
 		block, events, collections, err := services.Blocks.GetBlock(
 			args[0], // block id
 			blockFlags.Events,
diff --git a/internal/command/command.go b/internal/command/command.go
index ea8ff954..e6d3b5b0 100644
--- a/internal/command/command.go
+++ b/internal/command/command.go
@@ -301,7 +301,7 @@ func outputResult(result string, saveFlag string, formatFlag string, filterFlag
 			Fs: afero.NewOsFs(),
 		}
 
-		fmt.Printf("💾 result saved to: %s \n", saveFlag)
+		fmt.Printf("%s result saved to: %s \n", output.SaveEmoji(), saveFlag)
 		return af.WriteFile(saveFlag, []byte(result), 0644)
 	}
 
@@ -331,7 +331,10 @@ func filterResultValue(result Result, filter string) (interface{}, error) {
 		possibleFilters = append(possibleFilters, key)
 	}
 
-	value := jsonResult[strings.ToLower(filter)]
+	value := jsonResult[filter]
+	if value == nil {
+		value = jsonResult[strings.ToLower(filter)]
+	}
 
 	if value == nil {
 		return nil, fmt.Errorf("value for filter: '%s' doesn't exists, possible values to filter by: %s", filter, possibleFilters)
@@ -350,32 +353,32 @@ func handleError(description string, err error) {
 	// handle rpc error
 	switch t := err.(type) {
 	case *client.RPCError:
-		_, _ = fmt.Fprintf(os.Stderr, "❌ Grpc Error: %s \n", t.GRPCStatus().Err().Error())
+		_, _ = fmt.Fprintf(os.Stderr, "%s Grpc Error: %s \n", output.ErrorEmoji(), t.GRPCStatus().Err().Error())
 	default:
 		if errors.Is(err, config.ErrOutdatedFormat) {
-			_, _ = fmt.Fprintf(os.Stderr, "❌ Config Error: %s \n", err.Error())
-			_, _ = fmt.Fprintf(os.Stderr, "🙏 Please reset configuration using: 'flow init --reset'. Read more about new configuration here: https://github.com/onflow/flow-cli/releases/tag/v0.17.0")
+			_, _ = fmt.Fprintf(os.Stderr, "%s Config Error: %s \n", output.ErrorEmoji(), err.Error())
+			_, _ = fmt.Fprintf(os.Stderr, "%s Please reset configuration using: 'flow init --reset'. Read more about new configuration here: https://github.com/onflow/flow-cli/releases/tag/v0.17.0", output.TryEmoji())
 		} else if strings.Contains(err.Error(), "transport:") {
-			_, _ = fmt.Fprintf(os.Stderr, "❌ %s \n", strings.Split(err.Error(), "transport:")[1])
-			_, _ = fmt.Fprintf(os.Stderr, "🙏 Make sure your emulator is running or connection address is correct.")
+			_, _ = fmt.Fprintf(os.Stderr, "%s %s \n", output.ErrorEmoji(), strings.Split(err.Error(), "transport:")[1])
+			_, _ = fmt.Fprintf(os.Stderr, "%s Make sure your emulator is running or connection address is correct.", output.TryEmoji())
 		} else if strings.Contains(err.Error(), "NotFound desc =") {
-			_, _ = fmt.Fprintf(os.Stderr, "❌ Not Found:%s \n", strings.Split(err.Error(), "NotFound desc =")[1])
+			_, _ = fmt.Fprintf(os.Stderr, "%s Not Found:%s \n", output.ErrorEmoji(), strings.Split(err.Error(), "NotFound desc =")[1])
 		} else if strings.Contains(err.Error(), "code = InvalidArgument desc = ") {
 			desc := strings.Split(err.Error(), "code = InvalidArgument desc = ")
-			_, _ = fmt.Fprintf(os.Stderr, "❌ Invalid argument: %s \n", desc[len(desc)-1])
+			_, _ = fmt.Fprintf(os.Stderr, "%s Invalid argument: %s \n", output.ErrorEmoji(), desc[len(desc)-1])
 			if strings.Contains(err.Error(), "is invalid for chain") {
-				_, _ = fmt.Fprintf(os.Stderr, "🙏 Check you are connecting to the correct network or account address you use is correct.")
+				_, _ = fmt.Fprintf(os.Stderr, "%s Check you are connecting to the correct network or account address you use is correct.", output.TryEmoji())
 			} else {
-				_, _ = fmt.Fprintf(os.Stderr, "🙏 Check your argument and flags value, you can use --help.")
+				_, _ = fmt.Fprintf(os.Stderr, "%s Check your argument and flags value, you can use --help.", output.TryEmoji())
 			}
 		} else if strings.Contains(err.Error(), "invalid signature:") {
-			_, _ = fmt.Fprintf(os.Stderr, "❌ Invalid signature: %s \n", strings.Split(err.Error(), "invalid signature:")[1])
-			_, _ = fmt.Fprintf(os.Stderr, "🙏 Check the signer private key is provided or is in the correct format. If running emulator, make sure it's using the same configuration as this command.")
+			_, _ = fmt.Fprintf(os.Stderr, "%s Invalid signature: %s \n", output.ErrorEmoji(), strings.Split(err.Error(), "invalid signature:")[1])
+			_, _ = fmt.Fprintf(os.Stderr, "%s Check the signer private key is provided or is in the correct format. If running emulator, make sure it's using the same configuration as this command.", output.TryEmoji())
 		} else if strings.Contains(err.Error(), "signature could not be verified using public key with") {
-			_, _ = fmt.Fprintf(os.Stderr, "❌ %s: %s \n", description, err)
-			_, _ = fmt.Fprintf(os.Stderr, "🙏 If you are running emulator locally make sure that the emulator was started with the same config as used in this command. \nTry restarting the emulator.")
+			_, _ = fmt.Fprintf(os.Stderr, "%s %s: %s \n", output.ErrorEmoji(), description, err)
+			_, _ = fmt.Fprintf(os.Stderr, "%s If you are running emulator locally make sure that the emulator was started with the same config as used in this command. \nTry restarting the emulator.", output.TryEmoji())
 		} else {
-			_, _ = fmt.Fprintf(os.Stderr, "❌ %s: %s", description, err)
+			_, _ = fmt.Fprintf(os.Stderr, "%s %s: %s", output.ErrorEmoji(), description, err)
 		}
 	}
 
@@ -394,10 +397,16 @@ func checkVersion(logger output.Logger) {
 	body, _ := ioutil.ReadAll(resp.Body)
 	latestVersion := strings.TrimSpace(string(body))
 
-	if latestVersion != build.Semver() {
+	currentVersion := build.Semver()
+	if currentVersion == "undefined" {
+		return // avoid warning in local development
+	}
+
+	if currentVersion != latestVersion {
 		logger.Info(fmt.Sprintf(
-			"\n⚠️  Version warning: a new version of Flow CLI is available (%s).\n"+
-				"Read the installation guide for upgrade instructions: https://docs.onflow.org/flow-cli/install",
+			"\n%s  Version warning: a new version of Flow CLI is available (%s).\n"+
+				"   Read the installation guide for upgrade instructions: https://docs.onflow.org/flow-cli/install\n",
+			output.WarningEmoji(),
 			strings.ReplaceAll(string(latestVersion), "\n", ""),
 		))
 	}
diff --git a/internal/command/result.go b/internal/command/result.go
index 994e7d46..13723dd4 100644
--- a/internal/command/result.go
+++ b/internal/command/result.go
@@ -18,8 +18,23 @@
 
 package command
 
+import (
+	"strings"
+)
+
 type Result interface {
 	String() string
 	Oneliner() string
 	JSON() interface{}
 }
+
+// ContainsFlag checks if output flag is present for the provided field
+func ContainsFlag(flags []string, field string) bool {
+	for _, n := range flags {
+		if strings.ToLower(n) == field {
+			return true
+		}
+	}
+
+	return false
+}
diff --git a/internal/config/config.go b/internal/config/config.go
index 97be054e..7f29371f 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -29,6 +29,7 @@ var Cmd = &cobra.Command{
 }
 
 func init() {
+	InitCommand.AddToParent(Cmd)
 	Cmd.AddCommand(AddCmd)
 	Cmd.AddCommand(RemoveCmd)
 }
diff --git a/internal/config/init.go b/internal/config/init.go
index 0937c055..990e1f24 100644
--- a/internal/config/init.go
+++ b/internal/config/init.go
@@ -22,6 +22,8 @@ import (
 	"bytes"
 	"fmt"
 
+	"github.com/onflow/flow-cli/pkg/flowcli/output"
+
 	"github.com/spf13/cobra"
 
 	"github.com/onflow/flow-cli/internal/command"
@@ -84,11 +86,11 @@ func (r *InitResult) String() string {
 	account, _ := r.Project.EmulatorServiceAccount()
 
 	_, _ = fmt.Fprintf(writer, "Configuration initialized\n")
-	_, _ = fmt.Fprintf(writer, "Service account: %s\n\n", util.Bold("0x"+account.Address().String()))
+	_, _ = fmt.Fprintf(writer, "Service account: %s\n\n", output.Bold("0x"+account.Address().String()))
 	_, _ = fmt.Fprintf(writer,
 		"Start emulator by running: %s \nReset configuration using: %s\n",
-		util.Bold("'flow emulator'"),
-		util.Bold("'flow init --reset'"),
+		output.Bold("'flow emulator'"),
+		output.Bold("'flow init --reset'"),
 	)
 
 	writer.Flush()
diff --git a/internal/keys/decode.go b/internal/keys/decode.go
index 3c1b07dd..cf6c34e8 100644
--- a/internal/keys/decode.go
+++ b/internal/keys/decode.go
@@ -31,10 +31,10 @@ var decodeFlags = flagsDecode{}
 
 var DecodeCommand = &command.Command{
 	Cmd: &cobra.Command{
-		Use:     "decode <public key>",
-		Short:   "Decode a public account key hex string",
+		Use:     "decode <rlp encoded account key>",
+		Short:   "Decode a rlp encoded account key",
 		Args:    cobra.ExactArgs(1),
-		Example: "flow keys decode 4a22246...31bce1e71a7b6d11",
+		Example: "flow keys decode f847b8408...2402038203e8",
 	},
 	Flags: &decodeFlags,
 	Run: func(
@@ -43,9 +43,9 @@ var DecodeCommand = &command.Command{
 		globalFlags command.GlobalFlags,
 		services *services.Services,
 	) (command.Result, error) {
-		accountKey, err := services.Keys.Decode(
-			args[0], // public key
-		)
+		rlpEncoded := args[0]
+
+		accountKey, err := services.Keys.Decode(rlpEncoded)
 		if err != nil {
 			return nil, err
 		}
diff --git a/internal/keys/keys.go b/internal/keys/keys.go
index 69b60288..7a779f23 100644
--- a/internal/keys/keys.go
+++ b/internal/keys/keys.go
@@ -23,6 +23,8 @@ import (
 	"encoding/hex"
 	"fmt"
 
+	"github.com/onflow/flow-cli/pkg/flowcli/output"
+
 	"github.com/onflow/flow-go-sdk"
 	"github.com/onflow/flow-go-sdk/crypto"
 	"github.com/spf13/cobra"
@@ -38,6 +40,7 @@ var Cmd = &cobra.Command{
 
 func init() {
 	GenerateCommand.AddToParent(Cmd)
+	DecodeCommand.AddToParent(Cmd)
 }
 
 // KeyResult represent result from all account commands
@@ -65,7 +68,7 @@ func (k *KeyResult) String() string {
 	writer := util.CreateTabWriter(&b)
 
 	if k.privateKey != nil {
-		_, _ = fmt.Fprintf(writer, "🔴️ Store private key safely and don't share with anyone! \n")
+		_, _ = fmt.Fprintf(writer, "%s Store private key safely and don't share with anyone! \n", output.StopEmoji())
 		_, _ = fmt.Fprintf(writer, "Private Key \t %x \n", k.privateKey.Encode())
 	}
 
diff --git a/internal/project/project.go b/internal/project/project.go
index 1d766474..ed25a840 100644
--- a/internal/project/project.go
+++ b/internal/project/project.go
@@ -29,7 +29,6 @@ var Cmd = &cobra.Command{
 }
 
 func init() {
-	InitCommand.AddToParent(Cmd)
 	DeployCommand.AddToParent(Cmd)
 	Cmd.AddCommand(EmulatorCommand)
 }
diff --git a/internal/project/init.go b/internal/quick/init.go
similarity index 92%
rename from internal/project/init.go
rename to internal/quick/init.go
index a25d1b1a..19b4fb90 100644
--- a/internal/project/init.go
+++ b/internal/quick/init.go
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package project
+package quick
 
 import (
 	"fmt"
@@ -28,6 +28,8 @@ import (
 	"github.com/onflow/flow-cli/pkg/flowcli/services"
 )
 
+// TODO(sideninja) workaround - init needed to be copied in order to work else there is flag duplicate error
+
 var initFlag = config.FlagsInit{}
 
 var InitCommand = &command.Command{
diff --git a/internal/status/status.go b/internal/status/status.go
index 5b1a33ea..ee1a4509 100644
--- a/internal/status/status.go
+++ b/internal/status/status.go
@@ -22,6 +22,8 @@ import (
 	"bytes"
 	"fmt"
 
+	"github.com/onflow/flow-cli/pkg/flowcli/output"
+
 	"github.com/spf13/cobra"
 
 	"github.com/onflow/flow-cli/internal/command"
@@ -62,39 +64,31 @@ type Result struct {
 	err        error
 }
 
-const (
-	OnlineIcon   = "🟢"
-	OnlineStatus = "ONLINE"
-
-	OfflineIcon   = "🔴"
-	OfflineStatus = "OFFLINE"
-)
-
 // getStatus returns string representation for Flow network status.
 func (r *Result) getStatus() string {
 	if r.err == nil {
-		return OnlineStatus
+		return "ONLINE"
 	}
 
-	return OfflineStatus
+	return "OFFLINE"
 }
 
 // getColoredStatus returns colored string representation for Flow network status.
 func (r *Result) getColoredStatus() string {
 	if r.err == nil {
-		return util.Green(OnlineStatus)
+		return output.Green(r.getStatus())
 	}
 
-	return util.Red(OfflineStatus)
+	return output.Red(output.Red(r.getStatus()))
 }
 
 // getIcon returns emoji icon representing Flow network status.
 func (r *Result) getIcon() string {
 	if r.err == nil {
-		return OnlineIcon
+		return output.GoEmoji()
 	}
 
-	return OfflineIcon
+	return output.StopEmoji()
 }
 
 // String converts result to a string.
diff --git a/internal/transactions/build.go b/internal/transactions/build.go
index 0eceefbc..4123e0d2 100644
--- a/internal/transactions/build.go
+++ b/internal/transactions/build.go
@@ -69,7 +69,8 @@ var BuildCommand = &command.Command{
 		}
 
 		return &TransactionResult{
-			tx: build.FlowTransaction(),
+			tx:      build.FlowTransaction(),
+			include: []string{"code", "payload", "signatures"},
 		}, nil
 	},
 }
diff --git a/internal/transactions/get.go b/internal/transactions/get.go
index 60dc5b4f..ad44855c 100644
--- a/internal/transactions/get.go
+++ b/internal/transactions/get.go
@@ -28,8 +28,10 @@ import (
 )
 
 type flagsGet struct {
-	Sealed bool `default:"true" flag:"sealed" info:"Wait for a sealed result"`
-	Code   bool `default:"false" flag:"code" info:"Display transaction code"`
+	Sealed  bool     `default:"true" flag:"sealed" info:"Wait for a sealed result"`
+	Code    bool     `default:"false" flag:"code" info:"⚠️  Deprecated: use include flag"`
+	Include []string `default:"" flag:"include" info:"Fields to include in the output"`
+	Exclude []string `default:"" flag:"exclude" info:"Fields to exclude from the output (events)"`
 }
 
 var getFlags = flagsGet{}
@@ -53,6 +55,10 @@ var GetCommand = &command.Command{
 			fmt.Println("⚠️  DEPRECATION WARNING: use \"flow transactions get\" instead")
 		}
 
+		if getFlags.Code {
+			fmt.Println("⚠️  DEPRECATION WARNING: use include flag instead")
+		}
+
 		tx, result, err := services.Transactions.GetStatus(
 			args[0], // transaction id
 			getFlags.Sealed,
@@ -62,9 +68,11 @@ var GetCommand = &command.Command{
 		}
 
 		return &TransactionResult{
-			result: result,
-			tx:     tx,
-			code:   getFlags.Code,
+			result:  result,
+			tx:      tx,
+			code:    getFlags.Code,
+			include: getFlags.Include,
+			exclude: getFlags.Exclude,
 		}, nil
 	},
 }
diff --git a/internal/transactions/send-signed.go b/internal/transactions/send-signed.go
index 0dbac74d..61de3e88 100644
--- a/internal/transactions/send-signed.go
+++ b/internal/transactions/send-signed.go
@@ -26,6 +26,8 @@ import (
 )
 
 type flagsSendSigned struct {
+	Include []string `default:"" flag:"include" info:"Fields to include in the output"`
+	Exclude []string `default:"" flag:"exclude" info:"Fields to exclude from the output (events)"`
 }
 
 var sendSignedFlags = flagsSendSigned{}
@@ -53,8 +55,10 @@ var SendSignedCommand = &command.Command{
 		}
 
 		return &TransactionResult{
-			result: result,
-			tx:     tx,
+			result:  result,
+			tx:      tx,
+			include: sendSignedFlags.Include,
+			exclude: sendSignedFlags.Exclude,
 		}, nil
 	},
 }
diff --git a/internal/transactions/send.go b/internal/transactions/send.go
index 5b861229..1dfc07be 100644
--- a/internal/transactions/send.go
+++ b/internal/transactions/send.go
@@ -32,6 +32,8 @@ type flagsSend struct {
 	Arg      []string `default:"" flag:"arg" info:"argument in Type:Value format"`
 	Signer   string   `default:"emulator-account" flag:"signer" info:"Account name from configuration used to sign the transaction"`
 	GasLimit uint64   `default:"1000" flag:"gas-limit" info:"transaction gas limit"`
+	Include  []string `default:"" flag:"include" info:"Fields to include in the output"`
+	Exclude  []string `default:"" flag:"exclude" info:"Fields to exclude from the output (events)"`
 	Code     string   `default:"" flag:"code" info:"⚠️  Deprecated: use filename argument"`
 	Results  bool     `default:"" flag:"results" info:"⚠️  Deprecated: all transactions will provide result"`
 	Args     string   `default:"" flag:"args" info:"⚠️  Deprecated: use arg or args-json flag"`
@@ -86,8 +88,10 @@ var SendCommand = &command.Command{
 		}
 
 		return &TransactionResult{
-			result: result,
-			tx:     tx,
+			result:  result,
+			tx:      tx,
+			include: sendFlags.Include,
+			exclude: sendFlags.Exclude,
 		}, nil
 	},
 }
diff --git a/internal/transactions/transactions.go b/internal/transactions/transactions.go
index d19575fc..e1d862b4 100644
--- a/internal/transactions/transactions.go
+++ b/internal/transactions/transactions.go
@@ -23,6 +23,10 @@ import (
 	"encoding/json"
 	"fmt"
 
+	"github.com/onflow/flow-cli/pkg/flowcli/output"
+
+	"github.com/onflow/flow-cli/internal/command"
+
 	jsoncdc "github.com/onflow/cadence/encoding/json"
 	"github.com/onflow/flow-go-sdk"
 	"github.com/spf13/cobra"
@@ -47,9 +51,11 @@ func init() {
 
 // TransactionResult represent result from all account commands
 type TransactionResult struct {
-	result *flow.TransactionResult
-	tx     *flow.Transaction
-	code   bool
+	result  *flow.TransactionResult
+	tx      *flow.Transaction
+	code    bool
+	include []string
+	exclude []string
 }
 
 // JSON convert result to JSON
@@ -90,12 +96,12 @@ func (r *TransactionResult) String() string {
 
 	if r.result != nil {
 		if r.result.Error != nil {
-			_, _ = fmt.Fprintf(writer, "❌ Transaction Error \n%s\n\n\n", r.result.Error.Error())
+			_, _ = fmt.Fprintf(writer, "%s Transaction Error \n%s\n\n\n", output.ErrorEmoji(), r.result.Error.Error())
 		}
 
 		statusBadge := ""
 		if r.result.Status == flow.TransactionStatusSealed {
-			statusBadge = "✅"
+			statusBadge = output.OkEmoji()
 		}
 		_, _ = fmt.Fprintf(writer, "Status\t%s %s\n", statusBadge, r.result.Status)
 	}
@@ -118,20 +124,32 @@ func (r *TransactionResult) String() string {
 	}
 
 	for i, e := range r.tx.PayloadSignatures {
-		_, _ = fmt.Fprintf(writer, "\nPayload Signature %v:\n", i)
-		_, _ = fmt.Fprintf(writer, "    Address\t%s\n", e.Address)
-		_, _ = fmt.Fprintf(writer, "    Signature\t%x\n", e.Signature)
-		_, _ = fmt.Fprintf(writer, "    Key Index\t%d\n", e.KeyIndex)
+		if command.ContainsFlag(r.include, "signatures") {
+			_, _ = fmt.Fprintf(writer, "\nPayload Signature %v:\n", i)
+			_, _ = fmt.Fprintf(writer, "    Address\t%s\n", e.Address)
+			_, _ = fmt.Fprintf(writer, "    Signature\t%x\n", e.Signature)
+			_, _ = fmt.Fprintf(writer, "    Key Index\t%d\n", e.KeyIndex)
+		} else {
+			_, _ = fmt.Fprintf(writer, "\nPayload Signature %v: %s", i, e.Address)
+		}
 	}
 
 	for i, e := range r.tx.EnvelopeSignatures {
-		_, _ = fmt.Fprintf(writer, "\nEnvelope Signature %v:\n", i)
-		_, _ = fmt.Fprintf(writer, "    Address\t%s\n", e.Address)
-		_, _ = fmt.Fprintf(writer, "    Signature\t%x\n", e.Signature)
-		_, _ = fmt.Fprintf(writer, "    Key Index\t%d\n", e.KeyIndex)
+		if command.ContainsFlag(r.include, "signatures") {
+			_, _ = fmt.Fprintf(writer, "\nEnvelope Signature %v:\n", i)
+			_, _ = fmt.Fprintf(writer, "    Address\t%s\n", e.Address)
+			_, _ = fmt.Fprintf(writer, "    Signature\t%x\n", e.Signature)
+			_, _ = fmt.Fprintf(writer, "    Key Index\t%d\n", e.KeyIndex)
+		} else {
+			_, _ = fmt.Fprintf(writer, "\nEnvelope Signature %v: %s", i, e.Address)
+		}
 	}
 
-	if r.result != nil {
+	if !command.ContainsFlag(r.include, "signatures") {
+		_, _ = fmt.Fprintf(writer, "\nSignatures (minimized, use --include signatures)")
+	}
+
+	if r.result != nil && !command.ContainsFlag(r.exclude, "events") {
 		e := events.EventResult{
 			Events: r.result.Events,
 		}
@@ -145,19 +163,27 @@ func (r *TransactionResult) String() string {
 	}
 
 	if r.tx.Script != nil {
-		if len(r.tx.Arguments) == 0 {
-			_, _ = fmt.Fprintf(writer, "\n\nArguments\tNo arguments\n")
-		} else {
-			_, _ = fmt.Fprintf(writer, "\n\nArguments (%d):\n", len(r.tx.Arguments))
-			for i, argument := range r.tx.Arguments {
-				_, _ = fmt.Fprintf(writer, "    - Argument %d: %s\n", i, argument)
+		if command.ContainsFlag(r.include, "code") || r.code {
+			if len(r.tx.Arguments) == 0 {
+				_, _ = fmt.Fprintf(writer, "\n\nArguments\tNo arguments\n")
+			} else {
+				_, _ = fmt.Fprintf(writer, "\n\nArguments (%d):\n", len(r.tx.Arguments))
+				for i, argument := range r.tx.Arguments {
+					_, _ = fmt.Fprintf(writer, "    - Argument %d: %s\n", i, argument)
+				}
 			}
-		}
 
-		_, _ = fmt.Fprintf(writer, "\nCode\n\n%s\n", r.tx.Script)
+			_, _ = fmt.Fprintf(writer, "\nCode\n\n%s\n", r.tx.Script)
+		} else {
+			_, _ = fmt.Fprint(writer, "\n\nCode (hidden, use --include code)")
+		}
 	}
 
-	_, _ = fmt.Fprintf(writer, "\n\nPayload:\n%x", r.tx.Encode())
+	if command.ContainsFlag(r.include, "payload") {
+		_, _ = fmt.Fprintf(writer, "\n\nPayload:\n%x", r.tx.Encode())
+	} else {
+		_, _ = fmt.Fprint(writer, "\n\nPayload (hidden, use --include payload)")
+	}
 
 	_ = writer.Flush()
 	return b.String()
diff --git a/logo-cli.svg b/logo-cli.svg
new file mode 100644
index 00000000..d1c389e1
--- /dev/null
+++ b/logo-cli.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="3126px" height="650px" viewBox="0 0 3126 650" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>Group 3</title>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="Group-3">
+            <rect id="Rectangle" fill="#FFFFFF" x="0" y="0" width="3126" height="650"></rect>
+            <g id="Group-2" transform="translate(0.000000, 113.000000)">
+                <path d="M211.692357,0.411243609 L1711.04045,0.411243609 C1740.02292,0.411243609 1767.57979,12.985352 1786.57334,34.8766507 L1922.99913,192.116266 C1932.78597,203.396242 1932.78597,220.157046 1922.99913,231.437022 L1786.57334,388.676637 C1767.57979,410.567936 1740.02292,423.142044 1711.04045,423.142044 L211.692357,423.142044 L211.692357,423.142044 L211.692357,0.411243609 Z" id="Path" fill="#16FF99"></path>
+                <text id="CLI" font-family="Helvetica-Light, Helvetica" font-size="240" font-weight="300" fill="#000000">
+                    <tspan x="1090" y="290">CLI</tspan>
+                </text>
+                <path d="M1679.12712,112.254243 L1766.78188,202.863661 C1767.53194,203.639002 1767.53194,204.869485 1766.78188,205.644826 L1679.12712,296.254243 L1679.12712,296.254243" id="Path-2" stroke="#FFFFFF" stroke-width="41"></path>
+                <path d="M644.298471,197.036798 L619.199309,197.036798 L619.199309,290 L584.122842,290 L584.122842,197.036798 L566,197.036798 L566,167.172369 L584.122842,167.172369 L584.122842,155.551969 C584.122842,125.455132 603.02516,110 631.787864,110 C636.235208,110.041954 640.664968,110.561432 645,111.549387 L645,146.410587 C641.202377,144.917924 637.157783,144.14287 633.074001,144.125242 C629.35582,143.843326 625.699135,145.189022 623.062344,147.809631 C620.425554,150.43024 619.071548,154.064483 619.355205,157.759845 L619.355205,167.017431 L644.454366,167.017431 L644.298471,197.036798 Z M697,291 L662,291 L662,113 L697,113 L697,291 Z" id="Shape" fill="#000000" fill-rule="nonzero"></path>
+                <path d="M775.885044,159.005111 C803.003765,158.957962 827.476247,175.263832 837.875924,200.309271 C848.275602,225.35471 842.551077,254.199355 823.375216,273.375216 C804.199355,292.551077 775.35471,298.275602 750.309271,287.875924 C725.263832,277.476247 708.957962,253.003765 709.005111,225.885044 C708.783779,208.080453 715.758942,190.94038 728.349661,178.349661 C740.94038,165.758942 758.080453,158.783779 775.885044,159.005111 L775.885044,159.005111 Z M775.734575,259 C793.907603,259 807,244.113028 807,226.403331 C807,208.693635 794.024849,194 775.734575,194 C758.033799,194.60417 744,208.976459 744,226.5 C744,244.023541 758.033799,258.39583 775.734575,259 L775.734575,259 Z" id="Shape" fill="#000000" fill-rule="nonzero"></path>
+                <polygon id="Path" fill="#000000" fill-rule="nonzero" points="878.664825 161.808219 901.340342 247.338989 924.054688 179.419782 917.881045 161.847097 952.826192 161.847097 982.762534 247.377867 1004.97212 161.847097 1041.31507 161.847097 1003.1472 290.493151 966.532455 290.493151 940.98367 219.969143 917.259798 290.493151 880.373254 290.493151 842.438356 161.847097"></polygon>
+                <g id="Group" fill-rule="nonzero">
+                    <circle id="Oval" fill="#00EF8B" cx="212" cy="212" r="212"></circle>
+                    <rect id="Rectangle" fill="#FFFFFF" x="245" y="178" width="60" height="60"></rect>
+                    <path d="M185.016314,261.456324 C185.033494,270.570548 179.554169,278.796089 171.136999,282.291893 C162.71983,285.787696 153.025383,283.8641 146.580642,277.419358 C140.1359,270.974617 138.212304,261.28017 141.708107,252.863001 C145.203911,244.445831 153.429452,238.966506 162.543676,238.983686 L185.016314,238.983686 L185.016314,179 L162.543676,179 C129.168303,178.982829 99.0705276,199.076715 86.2903872,229.908255 C73.5102467,260.739794 80.5657932,296.234295 104.165749,319.834251 C127.765705,343.434207 163.260206,350.489753 194.091745,337.709613 C224.923285,324.929472 245.017171,294.831697 245,261.456324 L245,238.983686 L185.016314,238.983686 L185.016314,261.456324 Z" id="Path" fill="#FFFFFF"></path>
+                    <path d="M268.502125,149.31932 L336,149.31932 L336,90 L268.502125,90 C222.956883,90.0463454 186.046857,126.553156 186,171.60085 L186,179 L246.017002,179 L246.017002,171.60085 C246.040295,159.321052 256.086764,149.36555 268.502125,149.31932 Z" id="Path" fill="#FFFFFF"></path>
+                    <polygon id="Path" fill="#16FF99" points="186 238 246 238 246 238 246 178 246 178 186 178"></polygon>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/pkg/flowcli/config/json/account.go b/pkg/flowcli/config/json/account.go
index 02b66205..dda32c33 100644
--- a/pkg/flowcli/config/json/account.go
+++ b/pkg/flowcli/config/json/account.go
@@ -139,6 +139,7 @@ func transformAccountsToJSON(accounts config.Accounts) jsonAccounts {
 	return jsonAccounts
 }
 
+// TODO(sideninja) refactor keys to use json.RawMessage and decide if unmarshal into simple or advance structure based on that field
 type jsonAccountSimple struct {
 	Address string `json:"address"`
 	Keys    string `json:"keys"`
diff --git a/pkg/flowcli/contracts/resolver.go b/pkg/flowcli/contracts/resolver.go
index 3963e611..42d74db4 100644
--- a/pkg/flowcli/contracts/resolver.go
+++ b/pkg/flowcli/contracts/resolver.go
@@ -112,8 +112,9 @@ func (r *Resolver) getFileImports() []string {
 	imports := make([]string, 0)
 
 	for _, importDeclaration := range r.program.ImportDeclarations() {
-		_, ok := importDeclaration.Location.(common.AddressLocation)
-		if !ok {
+		_, isFileImport := importDeclaration.Location.(common.StringLocation)
+
+		if isFileImport {
 			imports = append(imports, importDeclaration.Location.String())
 		}
 	}
diff --git a/pkg/flowcli/output/colors.go b/pkg/flowcli/output/colors.go
new file mode 100644
index 00000000..8eeffe4f
--- /dev/null
+++ b/pkg/flowcli/output/colors.go
@@ -0,0 +1,49 @@
+/*
+ * Flow CLI
+ *
+ * Copyright 2019-2021 Dapper Labs, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package output
+
+import (
+	"fmt"
+	"runtime"
+)
+
+var red = "\033[31m"
+var green = "\033[32m"
+var bold = "\033[1m"
+var reset = "\033[0m"
+
+func printColor(msg string, color string) string {
+	if runtime.GOOS == "windows" {
+		return msg
+	}
+
+	return fmt.Sprintf("%s%s%s", color, msg, reset)
+}
+
+func Red(msg string) string {
+	return printColor(msg, red)
+}
+
+func Green(msg string) string {
+	return printColor(msg, green)
+}
+
+func Bold(msg string) string {
+	return printColor(msg, bold)
+}
diff --git a/pkg/flowcli/output/emoji.go b/pkg/flowcli/output/emoji.go
new file mode 100644
index 00000000..5a760f8b
--- /dev/null
+++ b/pkg/flowcli/output/emoji.go
@@ -0,0 +1,61 @@
+/*
+ * Flow CLI
+ *
+ * Copyright 2019-2021 Dapper Labs, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package output
+
+import "runtime"
+
+func printEmoji(emoji string) string {
+	if runtime.GOOS == "windows" {
+		return ""
+	}
+
+	return emoji
+}
+
+func ErrorEmoji() string {
+	return printEmoji("❌")
+}
+
+func TryEmoji() string {
+	return printEmoji("🙏")
+}
+
+func WarningEmoji() string {
+	return printEmoji("⚠️")
+}
+
+func SaveEmoji() string {
+	return printEmoji("💾")
+}
+
+func StopEmoji() string {
+	return printEmoji("🔴️")
+}
+
+func GoEmoji() string {
+	return printEmoji("🟢")
+}
+
+func OkEmoji() string {
+	return printEmoji("✅")
+}
+
+func SuccessEmoji() string {
+	return printEmoji("✨")
+}
diff --git a/pkg/flowcli/output/logger.go b/pkg/flowcli/output/logger.go
index cba9a6c7..3cb71763 100644
--- a/pkg/flowcli/output/logger.go
+++ b/pkg/flowcli/output/logger.go
@@ -20,8 +20,6 @@ package output
 
 import (
 	"fmt"
-
-	"github.com/onflow/flow-cli/pkg/flowcli/util"
 )
 
 const (
@@ -69,7 +67,7 @@ func (s *StdoutLogger) Debug(msg string) {
 }
 
 func (s *StdoutLogger) Error(msg string) {
-	s.log(fmt.Sprintf("❌  %s", util.Red(msg)), ErrorLog)
+	s.log(fmt.Sprintf("%s %s", ErrorEmoji(), Red(msg)), ErrorLog)
 }
 
 func (s *StdoutLogger) StartProgress(msg string) {
diff --git a/pkg/flowcli/project/project.go b/pkg/flowcli/project/project.go
index e153974f..e89d4314 100644
--- a/pkg/flowcli/project/project.go
+++ b/pkg/flowcli/project/project.go
@@ -219,7 +219,7 @@ func (p *Project) AccountNamesForNetwork(network string) []string {
 
 	for _, account := range p.accounts {
 		if len(p.conf.Deployments.GetByAccountAndNetwork(account.name, network)) > 0 {
-			if !util.StringContains(names, account.name) {
+			if !util.ContainsString(names, account.name) {
 				names = append(names, account.name)
 			}
 		}
diff --git a/pkg/flowcli/services/accounts.go b/pkg/flowcli/services/accounts.go
index 52556a4d..15c5f6ae 100644
--- a/pkg/flowcli/services/accounts.go
+++ b/pkg/flowcli/services/accounts.go
@@ -343,15 +343,17 @@ func (a *Accounts) addContract(
 
 	if updateExisting {
 		a.logger.Info(fmt.Sprintf(
-			"Contract '%s' updated on the account '%s'.",
+			"Contract '%s' updated on the account '%s'.\nTransaction ID: %s.",
 			contractName,
 			account.Address(),
+			sentTx.ID().String(),
 		))
 	} else {
 		a.logger.Info(fmt.Sprintf(
-			"Contract '%s' deployed to the account '%s'.",
+			"Contract '%s' deployed to the account '%s'.\nTransaction ID: %s.",
 			contractName,
 			account.Address(),
+			sentTx.ID().String(),
 		))
 	}
 
@@ -398,7 +400,12 @@ func (a *Accounts) RemoveContract(
 	}
 
 	a.logger.StopProgress()
-	a.logger.Info(fmt.Sprintf("Contract %s removed from account %s\n", contractName, account.Address()))
+	a.logger.Info(fmt.Sprintf(
+		"Contract %s removed from account %s.\nTransaction ID: %s.",
+		contractName,
+		account.Address(),
+		sentTx.ID().String(),
+	))
 
 	return a.gateway.GetAccount(account.Address())
 }
diff --git a/pkg/flowcli/services/project.go b/pkg/flowcli/services/project.go
index 021df62d..37443440 100644
--- a/pkg/flowcli/services/project.go
+++ b/pkg/flowcli/services/project.go
@@ -221,7 +221,7 @@ func (p *Project) Deploy(network string, update bool) ([]*contracts.Contract, er
 		}
 
 		p.logger.StartProgress(
-			fmt.Sprintf("%s deploying...", util.Bold(contract.Name())),
+			fmt.Sprintf("%s deploying...", output.Bold(contract.Name())),
 		)
 
 		result, err := p.gateway.GetTransactionResult(sentTx, true)
@@ -232,7 +232,7 @@ func (p *Project) Deploy(network string, update bool) ([]*contracts.Contract, er
 
 		if result.Error == nil && !deployErr {
 			p.logger.StopProgress()
-			fmt.Printf("%s -> 0x%s\n", util.Green(contract.Name()), contract.Target())
+			fmt.Printf("%s -> 0x%s\n", output.Green(contract.Name()), contract.Target())
 		} else {
 			p.logger.StopProgress()
 			p.logger.Error(
@@ -242,7 +242,7 @@ func (p *Project) Deploy(network string, update bool) ([]*contracts.Contract, er
 	}
 
 	if !deployErr {
-		p.logger.Info("\n✨  All contracts deployed successfully")
+		p.logger.Info(fmt.Sprintf("\n%s All contracts deployed successfully", output.SuccessEmoji()))
 	} else {
 		err = fmt.Errorf("failed to deploy contracts")
 		p.logger.Error(err.Error())
diff --git a/pkg/flowcli/util/utilities.go b/pkg/flowcli/util/utilities.go
index 6831d5b4..f25d5709 100644
--- a/pkg/flowcli/util/utilities.go
+++ b/pkg/flowcli/util/utilities.go
@@ -24,16 +24,10 @@ import (
 	"io/ioutil"
 	"text/tabwriter"
 
-	"github.com/fatih/color"
-
 	"github.com/onflow/flow-go-sdk"
 	"github.com/onflow/flow-go-sdk/crypto"
 )
 
-var Green = color.New(color.FgGreen, color.Bold).SprintfFunc()
-var Red = color.New(color.FgRed, color.Bold).SprintfFunc()
-var Bold = color.New(color.FgCyan).SprintfFunc()
-
 // LoadFile loads a file by filename.
 func LoadFile(filename string) ([]byte, error) {
 	var code []byte
@@ -80,8 +74,8 @@ func ConvertSigAndHashAlgo(
 	return sigAlgo, hashAlgo, nil
 }
 
-// StringContains returns true if the slice contains the given string.
-func StringContains(s []string, e string) bool {
+// ContainsString returns true if the slice contains the given string.
+func ContainsString(s []string, e string) bool {
 	for _, a := range s {
 		if a == e {
 			return true
@@ -111,15 +105,6 @@ func CreateTabWriter(b *bytes.Buffer) *tabwriter.Writer {
 	return tabwriter.NewWriter(b, 0, 8, 1, '\t', tabwriter.AlignRight)
 }
 
-func ContainsString(s []string, e string) bool {
-	for _, a := range s {
-		if a == e {
-			return true
-		}
-	}
-	return false
-}
-
 func ParseAddress(value string) (flow.Address, bool) {
 	address := flow.HexToAddress(value)
 


Test patch:
diff --git a/pkg/flowcli/contracts/resolver_test.go b/pkg/flowcli/contracts/resolver_test.go
index d769d572..2cc67157 100644
--- a/pkg/flowcli/contracts/resolver_test.go
+++ b/pkg/flowcli/contracts/resolver_test.go
@@ -53,22 +53,28 @@ func TestResolver(t *testing.T) {
 		"./tests/foo.cdc",
 		"./scripts/bar/foo.cdc",
 		"./scripts/bar/foo.cdc",
+		"./tests/foo.cdc",
 	}
 
 	scripts := [][]byte{
 		[]byte(`
 			import Kibble from "./Kibble.cdc"
-      import FT from "./FT.cdc"
+			import FT from "./FT.cdc"
 			pub fun main() {}
     `), []byte(`
 			import Kibble from "../../tests/Kibble.cdc"
-      import FT from "../../tests/FT.cdc"
+			import FT from "../../tests/FT.cdc"
 			pub fun main() {}
     `), []byte(`
 			import Kibble from "../../tests/Kibble.cdc"
-      import NFT from "../../tests/NFT.cdc"
+			import NFT from "../../tests/NFT.cdc"
+			pub fun main() {}
+    `), []byte(`
+			import Kibble from "./Kibble.cdc"
+			import crypto
+			import Foo from 0x0000000000000001
 			pub fun main() {}
-    `),
+	`),
 	}
 
 	resolved := [][]byte{
@@ -84,38 +90,43 @@ func TestResolver(t *testing.T) {
 			import Kibble from 0x0000000000000001 
 			import NFT from 0x0000000000000004 
 			pub fun main() {}
-    `),
+    `), []byte(`
+			import Kibble from 0x0000000000000001
+			import crypto
+			import Foo from 0x0000000000000001
+			pub fun main() {}
+	`),
 	}
 
 	t.Run("Import exists", func(t *testing.T) {
 		resolver, err := NewResolver([]byte(`
-      import Kibble from "./Kibble.cdc"
-      pub fun main() {}
-    `))
+			  import Kibble from "./Kibble.cdc"
+			  pub fun main() {}
+		`))
 		assert.NoError(t, err)
 		assert.True(t, resolver.HasFileImports())
 	})
 
 	t.Run("Import doesn't exists", func(t *testing.T) {
 		resolver, err := NewResolver([]byte(`
-      pub fun main() {}
-    `))
+		  	pub fun main() {}
+		`))
 		assert.NoError(t, err)
 		assert.False(t, resolver.HasFileImports())
 
 		resolver, err = NewResolver([]byte(`
 			import Foo from 0xf8d6e0586b0a20c7
-      pub fun main() {}
-    `))
+		  	pub fun main() {}
+		`))
 		assert.NoError(t, err)
 		assert.False(t, resolver.HasFileImports())
 	})
 
 	t.Run("Parse imports", func(t *testing.T) {
-		resolver, err := NewResolver(scripts[0])
+		resolver, err := NewResolver(scripts[3])
 		assert.NoError(t, err)
 		assert.Equal(t, resolver.getFileImports(), []string{
-			"./Kibble.cdc", "./FT.cdc",
+			"./Kibble.cdc",
 		})
 	})
 
diff --git a/pkg/flowcli/services/keys_test.go b/pkg/flowcli/services/keys_test.go
index 372792b6..09edaead 100644
--- a/pkg/flowcli/services/keys_test.go
+++ b/pkg/flowcli/services/keys_test.go
@@ -62,4 +62,12 @@ func TestKeys(t *testing.T) {
 
 		assert.Equal(t, err.Error(), "invalid signature algorithm: JUSTNO")
 	})
+
+	t.Run("RLP decode keys", func(t *testing.T) {
+		dkey, err := keys.Decode("f847b84084d716c14b051ad6b001624f738f5d302636e6b07cc75e4530af7776a4368a2b586dbefc0564ee28384c2696f178cbed52e62811bcc9ecb59568c996d342db2402038203e8")
+
+		assert.NoError(t, err)
+		assert.Equal(t, dkey.PublicKey.String(), "0x84d716c14b051ad6b001624f738f5d302636e6b07cc75e4530af7776a4368a2b586dbefc0564ee28384c2696f178cbed52e62811bcc9ecb59568c996d342db24")
+		assert.Equal(t, dkey.SigAlgo.String(), "ECDSA_P256")
+	})
 }