# Deploy ERC20 contract

**URL:** <https://forum.openzeppelin.com/t/deploy-erc20-contract/2302>\
**Category:** Contracts\
**Created:** [February 18, 2020, 5:34am UTC](https://forum.openzeppelin.com/t/deploy-erc20-contract/2302 "2020-02-18T05:34:40Z")\
**Posts on this page:** 1\
**Showing post:** 2

<div class="post-metadata">

**Author:** ![abcoathup](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.openzeppelin.com/abcoathup/32/415_2.png) [@abcoathup](https://forum.openzeppelin.com/u/abcoathup)\
**Post date:** [February 18, 2020, 9:02am UTC](https://forum.openzeppelin.com/t/deploy-erc20-contract/2302/2 "2020-02-18T09:02:38Z")

</div>

Hi @kypanz,

I’m sorry that you are having issues.

The OpenZeppelin CLI used to be only for creating upgradeable contracts. (OpenZeppelin CLI now in [2.8 Release Candidate](https://forum.openzeppelin.com/t/openzeppelin-cli-2-8-release-candidate/2297) supports deploying non-upgradeable contracts)

To create an upgradeable version of the SimpleToken we need to use an `initializer` rather than a constructor. (see [Writing Upgradeable Contracts](https://docs.openzeppelin.com/upgrades/2.7/writing-upgradeable))

I previously gave you an example of a non-upgradeable (regular) version of the SimpleToken.

In our project we link OpenZeppelin Contracts Ethereum Package and install `@openzeppelin/upgrades`

```auto
openzeppelin link @openzeppelin/contracts-ethereum-package
npm install @openzeppelin/upgrades

```

## SimpleToken.sol

Upgradeable SimpleToken

```auto
pragma solidity ^0.5.0;

import "@openzeppelin/upgrades/contracts/Initializable.sol";

import "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20Detailed.sol";

/**
 * @title SimpleToken
 * @dev Very simple ERC20 Token example, where all tokens are pre-assigned to the sender.
 * Note they can later distribute these tokens as they wish using `transfer` and other
 * `ERC20` functions.
 */
contract SimpleToken is Initializable, ERC20, ERC20Detailed {

    /**
     * @dev initialize that gives msg.sender all of existing tokens.
     */
    function initialize(address sender) public initializer {
        ERC20Detailed.initialize("Token", "TKN", 18);
        _mint(sender, 1000000 * (10 ** uint256(decimals())));
    }
}

```

## Create SimpleToken

Get an account to mint the tokens to.

```auto
$ oz accounts
? Pick a network development
Accounts for dev-1573097445291:
Default: 0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1
All:
- 0: 0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1

```

Create the contract, call `initialize` with the account to hold the tokens.

```auto
$ oz create
✓ Compiled contracts with solc 0.5.12 (commit.7709ece9)
? Pick a contract to instantiate SimpleToken
? Pick a network development
All contracts are up to date
? Do you want to call a function on the instance after creating it? Yes
? Select which function * initialize(sender: address)
? sender (address): 0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1
✓ Instance created at 0xCeeFD27e0542aFA926B87d23936c79c276A48277
0xCeeFD27e0542aFA926B87d23936c79c276A48277

```

## Interact

```auto
$ oz call
? Pick a network development
? Pick an instance SimpleToken at 0xCeeFD27e0542aFA926B87d23936c79c276A48277
? Select which function name()
✓ Method 'name()' returned: Token
Token

```

---

_[View the full topic](https://forum.openzeppelin.com/t/deploy-erc20-contract/2302)._
