If you're submitting code to MetaMask, there are some simple things we'd appreciate you doing to help us stay organized!
If you're submitting code to MetaMask, there are some simple things we'd appreciate you doing to help us stay organized!
## Submitting pull requests
### Finding the right project
Before taking the time to code and implement something, feel free to open an issue and discuss it! There may even be an issue already open, and together we may come up with a specific strategy before you take your precious time to write code.
Before taking the time to code and implement something, feel free to open an issue and discuss it! There may even be an issue already open, and together we may come up with a specific strategy before you take your precious time to write code.
### Tests
There are also plenty of open issues we'd love help with. Search the [`good first issue`](https://github.com/MetaMask/metamask-extension/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) label, or head to Gitcoin and earn ETH for completing projects we've posted bounties on.
For any new programmatic functionality, we like unit tests when possible, so if you can keep your code cleanly isolated, please do add a test file to the `tests` folder.
If you're picking up a bounty or an existing issue, feel free to ask clarifying questions on the issue as you go about your work.
### PR Format
### Submitting a pull request
When you're done with your project / bugfix / feature and ready to submit a PR, there are a couple guidelines we ask you to follow:
If this PR closes the issue, add the line `Fixes #$ISSUE_NUMBER`. Ex. For closing issue 418, include the line `Fixes #418`.
- [ ] **Test it**: For any new programmatic functionality, we like unit tests when possible, so if you can keep your code cleanly isolated, please do add a test file to the `tests` folder.
- [ ] **Add to the CHANGELOG**: Help us keep track of all the moving pieces by adding an entry to the [`CHANGELOG.md`](https://github.com/MetaMask/metamask-extension/blob/develop/CHANGELOG.md) with a link to your PR.
- [ ] **Meet the spec**: Make sure the PR adds functionality that matches the issue you're closing. This is especially important for bounties: sometimes design or implementation details are included in the conversation, so read carefully!
- [ ] **Close the issue**: If this PR closes an open issue, add the line `Fixes #$ISSUE_NUMBER`. Ex. For closing issue 418, include the line `Fixes #418`. If it doesn't close the issue but addresses it partially, just include a reference to the issue number, like `#418`.
- [ ] **Keep it simple**: Try not to include multiple features in a single PR, and don't make extraneous changes outside the scope of your contribution. All those touched files make things harder to review ;)
- [ ] **PR against `develop`**: Submit your PR against the `develop` branch. This is where we merge new features so they get some time to receive extra testing before being pushed to `master` for production. If your PR is a hot-fix that needs to be published urgently, you may submit a PR against the `master` branch, but this PR will receive tighter scrutiny before merging.
- [ ] **Get reviewed by a core contributor**: Make sure you get a `:thumbsup`, `:+1`, or `LGTM` from a user with a `Member` badge before merging.
If it doesn't close the issue but addresses it partially, just include a reference to the issue number, like `#418`.
And that's it! Thanks for helping out.
Submit your PR against the `develop` branch. This is where we merge new features so they get some time to receive extra testing before being pushed to `master` for production.
If your PR is a hot-fix that needs to be published urgently, you may submit a PR against the `master` branch, but this PR will receive tighter scrutiny before merging.
## Before Merging
Make sure you get a `:thumbsup`, `:+1`, or `LGTM` from another collaborator before merging.
## Before Closing Issues
Make sure the relevant code has been reviewed and merged.
@ -138,7 +138,7 @@ Notwithstanding the parties' decision to resolve all disputes through arbitratio
### 13.6 30-Day Right to Opt Out ###
### 13.6 30-Day Right to Opt Out ###
You have the right to opt-out and not be bound by the arbitration and class action waiver provisions set forth above by sending written notice of your decision to opt-out to the following address: MetaMask ℅ ConsenSys, 49 Bogart Street, Brooklyn NY 11206 and via email at legal-opt@metamask.io. The notice must be sent within 30 days of September 6, 2016 or your first use of the Service, whichever is later, otherwise you shall be bound to arbitrate disputes in accordance with the terms of those paragraphs. If you opt-out of these arbitration provisions, MetaMask also will not be bound by them.
You have the right to opt-out and not be bound by the arbitration and class action waiver provisions set forth above by sending written notice of your decision to opt-out to the following address: MetaMask ℅ ConsenSys, 49 Bogart Street, Brooklyn NY 11206 and via email at support@metamask.io. The notice must be sent within 30 days of September 6, 2016 or your first use of the Service, whichever is later, otherwise you shall be bound to arbitrate disputes in accordance with the terms of those paragraphs. If you opt-out of these arbitration provisions, MetaMask also will not be bound by them.
"message":"MetaMask is designed and built in California."
"message":"MetaMask is designed and built in California."
},
},
@ -89,6 +98,9 @@
"buyCoinbaseExplainer":{
"buyCoinbaseExplainer":{
"message":"Coinbase is the world’s most popular way to buy and sell bitcoin, ethereum, and litecoin."
"message":"Coinbase is the world’s most popular way to buy and sell bitcoin, ethereum, and litecoin."
},
},
"bytes":{
"message":"Bytes"
},
"ok":{
"ok":{
"message":"Ok"
"message":"Ok"
},
},
@ -104,6 +116,9 @@
"close":{
"close":{
"message":"Close"
"message":"Close"
},
},
"chromeRequiredForTrezor":{
"message":"You need to use Metamask on Google Chrome in order to connect to your TREZOR device."
},
"confirm":{
"confirm":{
"message":"Confirm"
"message":"Confirm"
},
},
@ -119,6 +134,24 @@
"confirmTransaction":{
"confirmTransaction":{
"message":"Confirm Transaction"
"message":"Confirm Transaction"
},
},
"connectHardwareWallet":{
"message":"Connect Hardware Wallet"
},
"connect":{
"message":"Connect"
},
"connecting":{
"message":"Connecting..."
},
"connectToTrezor":{
"message":"Connect to Trezor"
},
"connectToTrezorHelp":{
"message":"Metamask is able to access your TREZOR ethereum accounts. First make sure your device is connected and unlocked."
},
"connectToTrezorTrouble":{
"message":"If you are having trouble, please make sure you are using the latest version of the TREZOR firmware."
},
"continue":{
"continue":{
"message":"Continue"
"message":"Continue"
},
},
@ -149,6 +182,9 @@
"copyContractAddress":{
"copyContractAddress":{
"message":"Copy Contract Address"
"message":"Copy Contract Address"
},
},
"copyAddress":{
"message":"Copy address to clipboard"
},
"copyToClipboard":{
"copyToClipboard":{
"message":"Copy to clipboard"
"message":"Copy to clipboard"
},
},
@ -244,9 +280,15 @@
"done":{
"done":{
"message":"Done"
"message":"Done"
},
},
"downloadGoogleChrome":{
"message":"Download Google Chrome"
},
"downloadStateLogs":{
"downloadStateLogs":{
"message":"Download State Logs"
"message":"Download State Logs"
},
},
"dontHaveATrezorWallet":{
"message":"Don't have a TREZOR hardware wallet?"
},
"dropped":{
"dropped":{
"message":"Dropped"
"message":"Dropped"
},
},
@ -277,6 +319,9 @@
"enterPasswordContinue":{
"enterPasswordContinue":{
"message":"Enter password to continue"
"message":"Enter password to continue"
},
},
"parameters":{
"message":"Parameters"
},
"passwordNotLongEnough":{
"passwordNotLongEnough":{
"message":"Password not long enough"
"message":"Password not long enough"
},
},
@ -309,6 +354,9 @@
"followTwitter":{
"followTwitter":{
"message":"Follow us on Twitter"
"message":"Follow us on Twitter"
},
},
"forgetDevice":{
"message":"Forget this device"
},
"from":{
"from":{
"message":"From"
"message":"From"
},
},
@ -318,6 +366,9 @@
"fromShapeShift":{
"fromShapeShift":{
"message":"From ShapeShift"
"message":"From ShapeShift"
},
},
"functionType":{
"message":"Function Type"
},
"gas":{
"gas":{
"message":"Gas",
"message":"Gas",
"description":"Short indication of gas cost"
"description":"Short indication of gas cost"
@ -359,10 +410,28 @@
"message":"Get Ether from a faucet for the $1",
"message":"Get Ether from a faucet for the $1",
"description":"Displays network name for Ether faucet"
"description":"Displays network name for Ether faucet"
},
},
"getHelp":{
"message":"Get Help."
},
"greaterThanMin":{
"greaterThanMin":{
"message":"must be greater than or equal to $1.",
"message":"must be greater than or equal to $1.",
"description":"helper for inputting hex as decimal input"
"description":"helper for inputting hex as decimal input"
},
},
"hardware":{
"message":"hardware"
},
"hardwareWalletConnected":{
"message":"Hardware wallet connected"
},
"hardwareSupport":{
"message":"Hardware Support"
},
"hardwareSupportMsg":{
"message":"You can now view your Hardware accounts in MetaMask! Scroll down and read how it works."
},
"havingTroubleConnecting":{
"message":"Having trouble connecting?"
},
"here":{
"here":{
"message":"here",
"message":"here",
"description":"as in -click here- for more information (goes with troubleTokenBalances)"
"description":"as in -click here- for more information (goes with troubleTokenBalances)"
@ -370,6 +439,9 @@
"hereList":{
"hereList":{
"message":"Here's a list!!!!"
"message":"Here's a list!!!!"
},
},
"hexData":{
"message":"Hex Data"
},
"hide":{
"hide":{
"message":"Hide"
"message":"Hide"
},
},
@ -458,7 +530,7 @@
"message":"Max"
"message":"Max"
},
},
"learnMore":{
"learnMore":{
"message":"Learn more."
"message":"Learn more"
},
},
"lessThanMax":{
"lessThanMax":{
"message":"must be less than or equal to $1.",
"message":"must be less than or equal to $1.",
@ -497,6 +569,9 @@
"mainnet":{
"mainnet":{
"message":"Main Ethereum Network"
"message":"Main Ethereum Network"
},
},
"menu":{
"message":"Menu"
},
"message":{
"message":{
"message":"Message"
"message":"Message"
},
},
@ -563,12 +638,18 @@
"noDeposits":{
"noDeposits":{
"message":"No deposits received"
"message":"No deposits received"
},
},
"noConversionRateAvailable":{
"message":"No Conversion Rate Available"
},
"noTransactionHistory":{
"noTransactionHistory":{
"message":"No transaction history."
"message":"No transaction history."
},
},
"noTransactions":{
"noTransactions":{
"message":"No Transactions"
"message":"No Transactions"
},
},
"notFound":{
"message":"Not Found"
},
"notStarted":{
"notStarted":{
"message":"Not Started"
"message":"Not Started"
},
},
@ -578,10 +659,16 @@
"oldUIMessage":{
"oldUIMessage":{
"message":"You have returned to the old UI. You can switch back to the New UI through the option in the top right dropdown menu."
"message":"You have returned to the old UI. You can switch back to the New UI through the option in the top right dropdown menu."
},
},
"openInTab":{
"message":"Open in tab"
},
"or":{
"or":{
"message":"or",
"message":"or",
"description":"choice between creating or importing a new account"
"description":"choice between creating or importing a new account"
},
},
"origin":{
"message":"Origin"
},
"password":{
"password":{
"message":"Password"
"message":"Password"
},
},
@ -612,6 +699,9 @@
"popularTokens":{
"popularTokens":{
"message":"Popular Tokens"
"message":"Popular Tokens"
},
},
"prev":{
"message":"Prev"
},
"privacyMsg":{
"privacyMsg":{
"message":"Privacy Policy"
"message":"Privacy Policy"
},
},
@ -664,6 +754,9 @@
"restoreVault":{
"restoreVault":{
"message":"Restore Vault"
"message":"Restore Vault"
},
},
"restoreAccountWithSeed":{
"message":"Restore your Account with Seed Phrase"
},
"required":{
"required":{
"message":"Required"
"message":"Required"
},
},
@ -673,6 +766,9 @@
"walletSeed":{
"walletSeed":{
"message":"Wallet Seed"
"message":"Wallet Seed"
},
},
"restore":{
"message":"Restore"
},
"revealSeedWords":{
"revealSeedWords":{
"message":"Reveal Seed Words"
"message":"Reveal Seed Words"
},
},
@ -691,6 +787,18 @@
"revert":{
"revert":{
"message":"Revert"
"message":"Revert"
},
},
"remove":{
"message":"remove"
},
"removeAccount":{
"message":"Remove account"
},
"removeAccountDescription":{
"message":"This account will be removed from your wallet. Please make sure you have the original seed phrase or private key for this imported account before continuing. You can import or create accounts again from the account drop-down. "
},
"readyToConnect":{
"message":"Ready to Connect?"
},
"rinkeby":{
"rinkeby":{
"message":"Rinkeby Test Network"
"message":"Rinkeby Test Network"
},
},
@ -777,6 +885,9 @@
"sendTokens":{
"sendTokens":{
"message":"Send Tokens"
"message":"Send Tokens"
},
},
"separateEachWord":{
"message":"Separate each word with a single space"
},
"onlySendToEtherAddress":{
"onlySendToEtherAddress":{
"message":"Only send ETH to an Ethereum address."
"message":"Only send ETH to an Ethereum address."
},
},
@ -784,15 +895,45 @@
"message":"Only send $1 to an Ethereum account address.",
"message":"Only send $1 to an Ethereum account address.",
"description":"displays token symbol"
"description":"displays token symbol"
},
},
"orderOneHere":{
"message":"Order one here."
},
"searchTokens":{
"searchTokens":{
"message":"Search Tokens"
"message":"Search Tokens"
},
},
"selectAnAddress":{
"message":"Select an Address"
},
"selectAnAccount":{
"message":"Select an Account"
},
"selectAnAccountHelp":{
"message":"These are the accounts available in your hardware wallet. Select the one you’d like to use in MetaMask."
},
"sendTokensAnywhere":{
"sendTokensAnywhere":{
"message":"Send Tokens to anyone with an Ethereum account"
"message":"Send Tokens to anyone with an Ethereum account"
},
},
"settings":{
"settings":{
"message":"Settings"
"message":"Settings"
},
},
"step1HardwareWallet":{
"message":"1. Connect Hardware Wallet"
},
"step1HardwareWalletMsg":{
"message":"Connect your hardware wallet directly to your computer."
},
"step2HardwareWallet":{
"message":"2. Select an Account"
},
"step2HardwareWalletMsg":{
"message":"Select the account you want to view. You can only choose one at a time."
},
"step3HardwareWallet":{
"message":"3. Start using dApps and more!"
},
"step3HardwareWalletMsg":{
"message":"Use your hardware account like you would with any Ethereum account. Log in to dApps, send Eth, buy and store ERC20 tokens and Non-Fungible tokens like CryptoKitties."
},
"info":{
"info":{
"message":"Info"
"message":"Info"
},
},
@ -902,9 +1043,15 @@
"transactionNumber":{
"transactionNumber":{
"message":"Transaction Number"
"message":"Transaction Number"
},
},
"transfer":{
"message":"Transfer"
},
"transfers":{
"transfers":{
"message":"Transfers"
"message":"Transfers"
},
},
"trezorHardwareWallet":{
"message":"TREZOR Hardware Wallet"
},
"troubleTokenBalances":{
"troubleTokenBalances":{
"message":"We had trouble loading your token balances. You can view them ",
"message":"We had trouble loading your token balances. You can view them ",
"description":"Followed by a link (here) to view token balances"
"description":"Followed by a link (here) to view token balances"
@ -138,7 +138,7 @@ Notwithstanding the parties' decision to resolve all disputes through arbitratio
### 13.6 30-Day Right to Opt Out ###
### 13.6 30-Day Right to Opt Out ###
You have the right to opt-out and not be bound by the arbitration and class action waiver provisions set forth above by sending written notice of your decision to opt-out to the following address: MetaMask ℅ ConsenSys, 49 Bogart Street, Brooklyn NY 11206 and via email at legal-opt@metamask.io. The notice must be sent within 30 days of September 6, 2016 or your first use of the Service, whichever is later, otherwise you shall be bound to arbitrate disputes in accordance with the terms of those paragraphs. If you opt-out of these arbitration provisions, MetaMask also will not be bound by them.
You have the right to opt-out and not be bound by the arbitration and class action waiver provisions set forth above by sending written notice of your decision to opt-out to the following address: MetaMask ℅ ConsenSys, 49 Bogart Street, Brooklyn NY 11206 and via email at support@metamask.io. The notice must be sent within 30 days of September 6, 2016 or your first use of the Service, whichever is later, otherwise you shall be bound to arbitrate disputes in accordance with the terms of those paragraphs. If you opt-out of these arbitration provisions, MetaMask also will not be bound by them.
### 13.7 Changes to This Section ###
### 13.7 Changes to This Section ###
@ -177,4 +177,3 @@ Users with questions, complaints or claims with respect to the Service may conta