This is an ERC20 token implementation using the Cairo language and Starknet smart contract platform.
src/token.cairo: ERC20 token contract implementationsrc/tests.cairo: Unit testssrc/lib.cairo: Module exportsScarb.toml: Project configuration file
This ERC20 token implementation includes the following features:
- Standard ERC20 interface:
transfer,approve,transferFrom,balanceOf,allowance - Extended functions:
increaseAllowance,decreaseAllowance - Events:
Transfer,Approval
curl --proto '=https' --tlsv1.2 -sSf https://sh.starkup.sh | sh
git clone https://github.com/Contract-examples/cairo-examplescarb buildRun unit tests:
scarb teststarknet-devnet --seed 0If using a local development network, you can fetch a predeployed account:
starkli account fetch 0x064b48806902a367c8598f4f95c305e8c1a1acba5f082d294a43793113115691 --output account.json --rpc http://127.0.0.1:5050
starkli signer keystore from-key keystore.json # Enter private key: 0x0000000000000000000000000000000071d7bb07b9a64f6f78ac4c816aff4da9Set environment variables:
export STARKNET_ACCOUNT=$(pwd)/account.json
export STARKNET_KEYSTORE=$(pwd)/keystore.jsonstarkli declare target/dev/token_ERC20Token.contract_class.json --rpc http://127.0.0.1:5050If using mainnet or testnet:
starkli declare target/dev/token_ERC20Token.contract_class.json --network sepoliaUse the returned Class Hash to deploy the contract:
starkli deploy <class_hash> <name> <symbol> <decimals> <initial_supply> <recipient> --rpc http://127.0.0.1:5050For example:
starkli deploy 0x0785c92bf4aa7a89fb62371802aef2f58e2333d8df7e2aadf938efa83735431c 'MyToken' 'MTK' 18 1000 0x064b48806902a367c8598f4f95c305e8c1a1acba5f082d294a43793113115691 --rpc http://127.0.0.1:5050# Query token name
starkli call <contract_address> name --rpc http://127.0.0.1:5050
# Query total supply
starkli call <contract_address> total_supply --rpc http://127.0.0.1:5050
# Query balance
starkli call <contract_address> balance_of <address> --rpc http://127.0.0.1:5050
# Query allowance
starkli call <contract_address> allowance <owner> <spender> --rpc http://127.0.0.1:5050# Transfer tokens
starkli invoke <contract_address> transfer <recipient> <amount> --rpc http://127.0.0.1:5050
# Approve spending
starkli invoke <contract_address> approve <spender> <amount> --rpc http://127.0.0.1:5050
# Transfer from
starkli invoke <contract_address> transfer_from <sender> <recipient> <amount> --rpc http://127.0.0.1:5050