# CW20-Legacy This version of the CW20 base contract is compatible with the legacy contract running on the Terra chain Columbus-4. > **NOTE** This contract is modified for the purpose of migration from a Columbus-4 CW20 token contract to Columbus-5. Using the official version of CW20 is strongly recommended for other usages. This is a basic implementation of a cw20 contract. It implements the [CW20 spec](../../packages/cw20/README.md) and is designed to be deployed as is, or imported into other contracts to easily build cw20-compatible tokens with custom logic. Implements: - [x] CW20 Base - [x] Mintable extension - [x] Allowances extension ## Running this contract You will need Rust 1.44.1+ with `wasm32-unknown-unknown` target installed. You can run unit tests on this via: `cargo test` Once you are happy with the content, you can compile it to wasm via: ``` RUSTFLAGS='-C link-arg=-s' cargo wasm cp ../../target/wasm32-unknown-unknown/release/cw20_base.wasm . ls -l cw20_base.wasm sha256sum cw20_base.wasm ``` Or for a production-ready (optimized) build, run a build command in the the repository root: https://github.com/CosmWasm/cosmwasm-plus#compiling. ## Importing this contract You can also import much of the logic of this contract to build another ERC20-contract, such as a bonding curve, overiding or extending what you need. Basically, you just need to write your handle function and import `cw20_base::contract::handle_transfer`, etc and dispatch to them. This allows you to use custom `ExecuteMsg` and `QueryMsg` with your additional calls, but then use the underlying implementation for the standard cw20 messages you want to support. The same with `QueryMsg`. You *could* reuse `instantiate` as it, but it is likely you will want to change it. And it is rather simple. Look at [`cw20-staking`](../cw20-staking/README.md) for an example of how to "inherit" all this token functionality and combine it with custom logic.