How to Add Your ERC-20 Token to MetaMask: Complete Guide
You deployed your ERC-20 token, the transaction confirmed on Etherscan, and the contract address is sitting in your clipboard. But you open MetaMask and — nothing. Your token doesn't appear anywhere. This is completely expected, and fixing it takes about sixty seconds. This guide walks you through the exact process on both desktop and mobile, covers how to share the import flow with your community, and explains what to do if the balance still reads zero after the import.
Why MetaMask Doesn't Show Your Token Automatically
MetaMask is a self-custodial wallet, which means it doesn't pull data from a central database that magically knows about every new token. When you deploy a new ERC-20 contract, MetaMask has no way of knowing that contract is relevant to you unless you tell it explicitly.
MetaMask does maintain a token detection list — a curated set of well-known tokens whose balances it checks automatically. Popular tokens like USDC, LINK, and UNI appear in your Assets tab without any action because they're on that list. But a freshly deployed custom token won't be on it. You have to import it manually using the token's contract address. This is a one-time step per device, and once you've done it the token appears in your wallet like any other asset.
The good news: if you used a tool like ERC-20 token creator to deploy your contract, you already have everything you need. The import process itself requires nothing from the blockchain — you're just telling MetaMask which contract to watch.
What You Need Before You Start
Before you begin the import process, confirm you have the following three things ready:
- Your token's contract address. This is the 42-character 0x address where your ERC-20 contract was deployed. It's different from your wallet address — it's the address of the contract itself on the Ethereum blockchain. You should have received this in your deployment confirmation, either from the deployer tool or from the Etherscan transaction receipt.
- MetaMask installed and unlocked. MetaMask must be set to the same network your token was deployed on. If you deployed to Ethereum mainnet, MetaMask must be on Ethereum mainnet. If you deployed to Sepolia testnet for testing, switch to Sepolia. Checking the wrong network is the single most common reason the import appears to work but shows a zero balance.
- Your wallet must hold some of the token. MetaMask can only display a non-zero balance if your address actually holds that token. When you deployed the contract, the full supply was minted to your deployer address. If you're importing from a different wallet, you'll need to transfer some tokens there first.
Step 1: Find Your Token's Contract Address
The contract address is the identifier you need for the import. There are two places to find it:
From your deployment tool: If you used create your own ERC-20 token on our platform, the contract address is displayed on the confirmation screen immediately after deployment. It's also visible in the MetaMask transaction confirmation popup under "Interact With Contract" — tap that section to expand the contract address.
From Etherscan: Go to etherscan.io and paste your wallet address into the search bar. Navigate to the "Token Transfers (ERC-20)" tab. Find your deployment transaction — it will show the token name and symbol you chose. The contract address is displayed in the "Token" column. Click it to go to the token's Etherscan page, where you can copy the full contract address from the top of the page.
From your deployment transaction: Every deployment transaction has a receipt that includes the contract address. On Etherscan, go to the specific transaction hash from your deployment. Scroll down to "To" — if this was a contract creation, you'll see "[Contract 0x... Created]" instead of a wallet address. That bracketed address is your token contract.
Step 2: Open MetaMask and Navigate to Import Tokens
With your contract address copied, open the MetaMask browser extension by clicking its icon in your browser toolbar. Make sure you're on the correct network — the network name is displayed at the top of the MetaMask popup. If you need to switch networks, click the network name to open the network selector, then choose the appropriate network.
- Click the MetaMask extension icon to open the popup.
- You'll land on the main account screen showing your ETH balance. Below that is a row of tabs: "Tokens" and "Activity."
- Make sure you're on the "Tokens" tab. Scroll to the bottom of your token list.
- Click the link that reads "Import tokens." It's positioned below your existing token list, styled as a text link rather than a button — it's easy to miss if you're not looking for it.
Alternatively, on newer versions of MetaMask, you may see a "+" button or a three-dot menu on the Tokens tab. Either path leads to the same import screen.
Step 3: Enter the Contract Address — Auto-Fill of Symbol and Decimals
The Import Tokens screen has two tabs: "Search" and "Custom token." For your newly deployed token, use "Custom token" — it won't appear in the search tab yet because it hasn't been indexed by MetaMask's token list.
- Click the "Custom token" tab.
- Paste your contract address into the "Token contract address" field. Use Ctrl+V (Windows/Linux) or Cmd+V (Mac).
- Wait one to two seconds. MetaMask will query the blockchain to read your token's name, symbol, and decimals directly from the contract. These fields will auto-fill below the address field.
- Confirm the auto-filled symbol matches what you chose when you deployed. The "Token decimal" field should show 18 (or whatever decimals you set at deployment).
If the auto-fill doesn't work after a few seconds, the most likely causes are: you're on the wrong network, the contract address has a typo, or the contract hasn't fully propagated yet (rare, but possible if you're importing within seconds of deployment). Wait a minute and try again.
You can manually enter the symbol and decimals if needed, but only do this if you're absolutely certain of the values from your deployment receipt. Entering the wrong decimal count will display an incorrect balance — the tokens are still there, just displayed with the wrong scale factor.
Step 4: Confirm the Import
- After the fields auto-fill, click "Next" (or "Add Custom Token" depending on your MetaMask version).
- MetaMask will show a confirmation screen summarizing what you're about to import: the token name, symbol, and the number of tokens your address currently holds.
- Review the details. If everything looks right — correct name, correct symbol, and the token balance matches your expected total supply — click "Import tokens."
- MetaMask will briefly show a confirmation animation, then return you to the main account screen.
The import is not an on-chain transaction. It doesn't cost any gas, doesn't create a transaction record, and doesn't appear on Etherscan. It's purely a local setting stored in MetaMask that tells it to watch that contract address and display your balance. This means the import is also device-specific — you'll need to repeat it on every browser or device where you use MetaMask.
Step 5: Verify Your Token Balance Shows Correctly
After the import, you should immediately see your token in the Tokens tab. The balance displayed should match the total supply you minted (minus any tokens you've already transferred out). A few things to verify:
- Balance matches expectations: If you minted 1,000,000 tokens to your address and haven't sent any, you should see 1,000,000. If the number looks off by a factor of 10, 100, or some power of 10, the decimal setting is wrong — remove the token and re-add it with the correct decimals.
- Token name and symbol display correctly: Confirm these match exactly what you set during deployment. If there's a typo, it's embedded in the contract permanently — but you can still use the token normally and the contract itself is fully functional.
- Network label: In the token detail view, confirm the network shown matches your deployment network. On Ethereum mainnet, no extra label appears. On testnets, MetaMask shows the network name.
You can cross-reference your balance by checking your address on Etherscan. Click your wallet address in MetaMask to copy it, then go to etherscan.io and paste it in the search bar. Under the "Token Holdings" section (or the ERC-20 transfers tab), you should see your token listed with the matching balance.
Adding Your Token on MetaMask Mobile (iOS/Android)
The mobile flow is slightly different from the desktop extension. MetaMask for iOS and Android has the same core functionality but a reorganized navigation structure. Here's the step-by-step for mobile:
- Open the MetaMask app on your phone. Unlock it with your password or biometrics.
- You'll land on the "Wallet" tab showing your account overview. Scroll down past your ETH balance to the token list area.
- Tap the "Import Tokens" text link at the bottom of the token list — or look for a "+" icon in the top-right corner of the Tokens section, depending on your app version.
- On the Import Tokens screen, tap "Custom Token."
- Tap the "Token Contract Address" field and paste your contract address. On mobile, long-press the field and choose "Paste" from the context menu.
- Wait for the auto-fill. The token symbol and decimals should populate within a second or two.
- Tap "Import" — the button label may say "Add Custom Token" on some versions.
- On the confirmation screen, review the details and tap "Import Tokens" to confirm.
Your token will now appear in the Wallet tab token list. On mobile, MetaMask also supports viewing individual token details by tapping a token — you can see the balance, send from here, and view the contract address from a dedicated token screen.
Sharing the Import Process With Your Community
After you create an ERC-20 token and import it yourself, the next challenge is getting your community to do the same. Most users won't know how to add a custom token, and a friction-heavy onboarding experience will kill engagement before it starts. The goal is to make the import process as close to a single click as possible.
Here's what works well for community token distribution:
- Write a clear one-page guide specific to your token. Include your contract address (in a clearly labeled, easily copyable format), your token name, symbol, and decimals. Include screenshots of each MetaMask step. Don't assume any blockchain familiarity — write it for someone who has MetaMask installed but has never imported a custom token before.
- Pin the guide everywhere. Discord announcement channels, Telegram groups, Twitter/X pinned posts, your project website's "How to get started" page. The more visible it is, the fewer support questions you'll field.
- Always display the contract address in full. Never shorten it with ellipsis in educational materials. The full 42-character address must be copy-pasteable in one action. Using a code block or monospace font helps users verify they've copied it correctly.
- Show the expected token symbol and balance. If community members know they should see "MYTKN" and "500" tokens after importing, they can immediately confirm the import worked correctly without having to ask.
How to Share a Token Import Link (EIP-747 Deep Links)
EIP-747 is an Ethereum Improvement Proposal that defines a standard for "watch asset" deep links — URLs that, when clicked, prompt MetaMask (or other compatible wallets) to import a specific token automatically. Instead of telling users to manually navigate to Import Tokens and paste an address, you give them a link they click once.
The EIP-747 deep link format looks like this:
ethereum:0xYourContractAddress?tokenSymbol=MYTKN&tokenDecimal=18
When a user with MetaMask clicks this link in a compatible browser, MetaMask opens automatically and shows the import confirmation screen — already pre-filled with your token details. The user just clicks "Add Token" and they're done. No manual steps, no copy-pasting, no confusion.
You can also trigger this programmatically using the MetaMask provider API. If your project has a website, adding a "Add Token to MetaMask" button that calls wallet_watchAsset is the cleanest possible UX:
// Add this to your project website's JavaScript
async function addTokenToMetaMask() {
try {
const wasAdded = await ethereum.request({
method: 'wallet_watchAsset',
params: {
type: 'ERC20',
options: {
address: '0xYourContractAddress',
symbol: 'MYTKN',
decimals: 18,
image: 'https://yourproject.com/token-logo.png',
},
},
});
if (wasAdded) {
console.log('Token added successfully!');
}
} catch (error) {
console.error('Error adding token:', error);
}
}
This is the same mechanism used by major DeFi protocols — Uniswap, Aave, and others use wallet_watchAsset to let users add governance tokens directly from their UI. Implementing it on your project website significantly reduces the friction between "discovering your token" and "holding your token."
image parameter in wallet_watchAsset lets you specify a URL for your token's logo. MetaMask displays this logo next to your token in the Assets list. A clean, square 200x200 PNG on a transparent background works best. This small detail makes your token look professional and distinguishes it from generic placeholder icons.
What to Do If the Balance Shows 0
You've imported the token and it appears in MetaMask, but the balance shows 0. This is one of the most common post-deployment questions, and it almost always has a straightforward cause. Work through this checklist in order:
1. Wrong network. This is the most common cause by far. If you deployed to Ethereum mainnet but MetaMask is currently set to Sepolia testnet (or vice versa), the contract address exists on the wrong chain and MetaMask will read a balance of zero because your address holds zero tokens on that network. Check the network selector at the top of MetaMask and confirm it matches your deployment network. Switch networks if needed, and re-import the token if it doesn't carry over automatically.
2. Wrong contract address. A typo in a single character of the contract address will point MetaMask at either a completely different contract (which might incidentally have a token standard but not your tokens) or no contract at all (returning zero for all balances). Remove the token from MetaMask, carefully re-copy the address from Etherscan, and import again.
3. Tokens were minted to the wrong address. During deployment, the initial token supply was minted to the deployer address — the wallet that signed the deployment transaction. If you're importing on a different wallet, that wallet's balance is genuinely zero. You'll need to send tokens from the deployer wallet to the address you want to display a balance on. Use MetaMask's Send function: select your token, enter the recipient address, and confirm the transfer. Note that sending tokens requires ETH for gas — make sure your deployer wallet has enough ETH to cover the Ethereum gas fees on the transfer transaction.
4. Wrong decimal count during manual entry. If you manually entered a decimal count that doesn't match the contract's stored value, MetaMask is misinterpreting the raw balance. The actual token balance is unchanged — MetaMask is just displaying it incorrectly. For example, if your contract stores 18 decimals but you entered 0 during import, a balance of 1,000,000 tokens would be displayed as 1,000,000,000,000,000,000 (the raw integer value). Remove the token and re-import, letting the auto-fill populate the decimal field from the contract.
5. Transaction not yet confirmed. If you're checking within seconds of deployment or a transfer, it's possible the transaction hasn't been included in a block yet. Ethereum block times average around 12 seconds on mainnet, but the transaction also needs to clear the mempool first. Check Etherscan for the transaction status — if it shows "Pending," wait for it to confirm before expecting the balance to update.
Adding Your Token to Other Wallets
MetaMask is the dominant Ethereum wallet for desktop users, but your community will include people on Trust Wallet, Coinbase Wallet, Rainbow, and others. The good news: all ERC-20 wallets follow the same basic custom token import flow, because the underlying contract standard is identical.
Trust Wallet (iOS/Android): Open Trust Wallet and tap the settings icon in the top-right corner of the main screen. Select "Manage Crypto" or "Token Management" (label varies by version). Tap the "+" button and then "Add Custom Token." Set the network to Ethereum. Paste your contract address — the name, symbol, and decimals will auto-fill from the chain. Tap "Save."
Coinbase Wallet (iOS/Android/Browser Extension): Open Coinbase Wallet and go to the "Assets" tab. Tap "Import" or the "+" icon. Choose "Custom token." Select the Ethereum network. Enter your contract address in the search field. Confirm the auto-filled details and tap "Import."
Rainbow Wallet (iOS/Android): Rainbow has particularly good token discovery. Go to your wallet's main screen, tap the search icon or "+" button. Enter your contract address. Rainbow typically auto-detects ERC-20 tokens and shows a preview before you confirm the addition.
Frame (Desktop): Frame is a popular desktop wallet for power users. Open the Frame interface, go to "Assets," click "Custom Tokens," and add your contract address. Frame pulls token metadata from the contract directly.
For all wallets, the critical inputs are always the same: network (Ethereum mainnet or your deployment network), contract address, symbol, and decimals. If the wallet's auto-fill fails, these three values from your deployment receipt will let you import manually.
The Next Step: Listing on Uniswap
Once your token is importable in MetaMask and your community can see their balances, the natural next question is: how do people actually buy and sell it? The answer for most ERC-20 projects is a decentralized exchange — specifically Uniswap, which is the largest and most liquid DEX on Ethereum.
Unlike centralized exchanges, Uniswap doesn't have a listing process, application, or fee. Any ERC-20 token can be traded on Uniswap the moment someone creates a liquidity pool for it. You provide equal value in your token and ETH (or another ERC-20), deposit it into a pool, and the automated market maker does the rest — calculating prices, executing trades, and distributing fees to liquidity providers.
The process involves listing your token on Uniswap by creating a pool on Uniswap V3, setting your initial price (which is just the ratio of tokens to ETH you deposit), and providing the initial liquidity. Once the pool is live, anyone with MetaMask can swap ETH for your token directly from app.uniswap.org — no import required on their end if they're using the swap interface, though they'll still need to import it to see it in their Assets tab.
Before listing, it's worth having your smart contract verified publicly. Verifying your contract on Etherscan publishes the source code so anyone can inspect it — a significant trust signal that serious token projects don't skip. Verified contracts display a green checkmark on Etherscan and allow users to interact directly with contract functions from the Etherscan interface.
If you haven't deployed your token yet, you can create an ERC-20 token online in minutes and have it ready for the MetaMask import and Uniswap listing process covered in these guides.
FAQ
Do I need to re-import my token every time I open MetaMask?
No. The import is a one-time action per browser profile. MetaMask stores your custom token list locally, and it persists across browser restarts and MetaMask unlocks. The only times you need to re-import are if you reset your MetaMask (using the seed phrase on a fresh installation), move to a different browser or computer, or clear your browser's local storage. The token data itself never changes — you're just telling MetaMask where to look for it.
Can other people see my token without importing it?
Yes — anyone can see your token on Etherscan, and any DEX interface (like Uniswap) can display your token once there's liquidity. The import is only needed for displaying the token in a wallet's Assets tab. When someone receives your token in their wallet, it won't automatically appear in their MetaMask Assets list until they import it — but the tokens are genuinely there in their address, visible on-chain.
I created my token online — where exactly do I find the contract address?
If you used our platform to ERC-20 token creator, the contract address is displayed on the deployment confirmation screen immediately after the transaction confirms. It's also accessible from the MetaMask "Activity" tab — find your deployment transaction, expand it, and look for "Contract address." Finally, you can search your deploying wallet address on Etherscan and find the "Contract Creation" transaction in the internal transactions tab.
What if my token's symbol conflicts with another token?
Token symbols are not globally unique on Ethereum — there's no registry that prevents two different contracts from having the symbol "MYTKN." MetaMask displays custom-imported tokens alongside any same-symbol tokens on its curated list. In your wallet, both will appear with the same symbol, but they'll have different contract addresses in the token detail view. To avoid this confusion for your community, always share the full contract address alongside the symbol so people can verify they've imported the correct contract.
Does importing a token cost any gas?
No. Adding a custom token to MetaMask is a purely local operation — it writes data to MetaMask's local storage in your browser, not to the blockchain. No transaction is broadcast, no gas is spent, and nothing appears on Etherscan. The only transactions that cost gas are actual on-chain actions: deploying the contract, transferring tokens, approving a DEX to spend your tokens, and adding liquidity. Simple wallet imports are free and instant.