# The design of Circle USDC
## Overview
- Deployed in 16 blockchains, https://www.circle.com/en/multi-chain-usdc
- Ethereum mainnet deployed on 2018-08-03, https://etherscan.io/token/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 (USDT 2017-11-28)
- EVM contract code: https://github.com/circlefin/stablecoin-evm
## Contracts
### USDC
USDC: 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
USDC is following [OpenZeppelin standards](https://docs.openzeppelin.com/contracts/2.x/):
- [Upgradeable](https://docs.openzeppelin.com/contracts/5.x/api/proxy): use `org.zeppelinos.proxy.implementation` Proxy
- [Ownable](https://docs.openzeppelin.com/contracts/2.x/api/ownership#Ownable)
- [Pausable](https://docs.openzeppelin.com/contracts/4.x/api/security#Pausable)
And USDC is also [Blacklistable](https://github.com/centrehq/centre-tokens/blob/master/contracts/v1/Blacklistable.sol), when an address was blacklisted, it can't do any asset related operations:
- `mint`: msg.sender, to
- `burn`: msg.sender
- `transfer{From}``: msg.sender, from, to
- `approve`: msg.sender, spender
#### Roles
- admin: swap between 0x807a96288A1A408dBC13DE2b1d087d10356395d2(EOA) and UpgradeContract
- upgrade contract
- owner: 0xfcb19e6a322b27c06842a71e8c725399f049ae3a(EOA)
- change blacklister
- change pauser
- change masterMinter
- pauser: 0x4914f61d25e5c567143774b76edbf4d5109a8566(EOA)
- pause/unpause
- blacklister: 0x10df6b6fe66dd319b1f82bab2d054cbb61cdad2e(EOA)
- blacklist/unblacklist
- masterMinter: 0xe982615d461dd5cd06575bbea87624fda4e3de17(Contract)
- addMinter/removeMinter
- configure minter minting allowance
### Upgrade
Upgraded(address) '0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b'
upgrade process:
1. [Circle Deployer](https://etherscan.io/address/0x95Ba4cF87D6723ad9C0Db21737D862bE80e93911) create a new Upgrader contract;
2. [USDC Admin](https://etherscan.io/address/0x807a96288A1A408dBC13DE2b1d087d10356395d2) call `changeAdmin` on USDC to change the admin from self to the new Upgrader contract;
3. [Circle Deployer](https://etherscan.io/address/0x95Ba4cF87D6723ad9C0Db21737D862bE80e93911) call `upgrade` on the Upgrader contract to upgrade the USDC contract, in the meanwhile, the admin of USDC will be changed back to the EOA address
eg:
1. 18921600 https://etherscan.io/tx/0x7f6268ff5bd05d1b61c19889a46eb9a38563accce441dcfcf0c7515b1733503e create the upgrade contract
2. 18963710 https://etherscan.io/tx/0x4441f5f0d30b59f9db3083034605e5cfb35e3606a30e12f075feef3b1df81a15 change admin to the upgrade contract
3. 18963716 https://etherscan.io/tx/0xae3ad89e569f27d47a8a02999a6d937c12aaa6bc50e66650e7cbd3244bde9951 upgrading
### USDC Master Minter
The Master Minter contract manages minters for a contract, It lets the owner designate certain addresses as controllers,
and these controllers then manage the minters by adding and removing minters, as well as modifying their minting allowance.
**A controller may manage exactly one minter, but the same minter address may be managed by multiple controllers.**
USDC Master Minter: 0xe982615d461dd5cd06575bbea87624fda4e3de17
- owner: 0xc1d9fe41d19dd52cb3ae5d1d3b0030b5d498c704(EOA)
- mintManager: 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48(USDC Token)
#### workflow
eg: increase minter's allowance
1. owner.register (controller + minter): `configureController(address _controller, address _worker) public onlyOwner`
2. controller.increase minter allowance: `incrementMinterAllowance(uint256 _allowanceIncrement) public onlyController`
2.1. get minter with controller's address
2.2. set `_newAllowance = _allowanceIncrement + minterManager.minterAllowance(minter)`
2.2. call `minterManager.configureMinter(_minter, _newAllowance)`
## Data
1. All USDC events(2018 -- 2024.10.24)
```sql
+-----------------------+-----------+---------------------+---------------------+
| event | count | min_blktime | max_blktime |
|-----------------------+-----------+---------------------+---------------------|
| Transfer | 103119655 | 2018-09-10 18:26:41 | 2024-10-24 07:38:47 |
| Approval | 10490124 | 2018-09-28 18:57:11 | 2024-10-24 07:38:47 |
| Burn | 300281 | 2018-09-25 13:12:07 | 2024-10-24 07:33:47 |
| Mint | 224608 | 2018-09-10 18:26:41 | 2024-10-24 07:38:23 |
| AuthorizationUsed | 8779 | 2020-09-27 07:22:27 | 2024-10-24 06:40:59 |
| MinterConfigured | 1098 | 2018-08-17 14:53:44 | 2024-10-21 14:34:35 |
| Blacklisted | 254 | 2020-06-16 04:39:08 | 2024-10-08 01:57:23 |
| AdminChanged | 8 | 2018-08-03 19:30:30 | 2024-01-08 17:16:35 |
| UnBlacklisted | 7 | 2021-12-23 23:35:00 | 2024-10-01 04:42:47 |
| MinterRemoved | 4 | 2018-09-06 19:18:06 | 2021-04-06 17:40:45 |
| Upgraded | 3 | 2020-08-27 15:32:54 | 2024-01-08 17:16:35 |
| PauserChanged | 3 | 2018-09-06 13:06:02 | 2023-08-21 20:36:35 |
| AuthorizationCanceled | 3 | 2021-04-02 02:08:09 | 2024-01-08 17:29:47 |
| MasterMinterChanged | 2 | 2018-09-06 13:43:40 | 2019-06-12 15:03:34 |
| BlacklisterChanged | 2 | 2019-06-27 19:42:27 | 2023-08-21 20:36:11 |
| OwnershipTransferred | 1 | 2018-09-06 14:00:31 | 2018-09-06 14:00:31 |
+-----------------------+-----------+---------------------+---------------------+
```
2. USDC Upgrade history
```csv
date,txhash,implementation
2024-01-08,0xae3ad89e569f27d47a8a02999a6d937c12aaa6bc50e66650e7cbd3244bde9951,0x43506849d7c04f9138d1a2050bbf3a0c054402dd
2021-04-26,0xe2e40640ffd5f76538cd23660cf56f00bfebd5fe925ebad6b8067c4cee18a2c3,0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf
2020-08-27,0xe6f0f754398d89583da8e4229c5d7aaa00739a3ae334ecfc2839ac396b4836e3,0xb7277a6e95992041568d9391d09d0122023778a2
```
Reference:
- https://github.com/bhemen/usdc/blob/main/README.md#v22-upgrade-january-2024
- https://github.com/bhemen/usdc/blob/main/README.md#v21-upgrade
- https://github.com/bhemen/usdc/blob/main/README.md#v2-upgrade-december-2020
3. USDC Minters
```csv
minter,is_contract,allowance
0x5b6122c109b78c6755486966148c1d70a50a47d7,false,2648313326
0xc4922d64a24675e16e1586e3e3aa56c06fabe907,true,27392554
0x19a932fc5a8320939c3575302a8705147a7f27d8,false,24198
0x55fe002aeff02f77364de339a1292923a15844b8,false,0
0x24bdd8771b08c2ea6fe0e898126e65bd49021be3,false,0
0x3005a4c0efe7e66f3f60ef8704983247a5c6ca61,false,0
0x8967a7ce20043f876e42f8ad696b06bb632f0ca7,false,0
0x895f07957b863f4ab6086035a6990d8366bc3266,false,0
```
4. USDC Master Minter Controllers
`event ControllerConfigured(address indexed _controller, address indexed _worker)`
'0xa56687ff5096e83f6e2c673cda0b677f56bbfcdf5fe0555d5830c407ede193cb'
```csv
minter,controller
0x5b6122c109b78c6755486966148c1d70a50a47d7,0x9d5c50ae9dc377b1fde6786bcfe8a70854fac5e4
0x5b6122c109b78c6755486966148c1d70a50a47d7,0x79e0946e1c186e745f1352d7c21ab04700c99f71
0xc4922d64a24675e16e1586e3e3aa56c06fabe907,0x0f493479be830657aca110199a70e826506a54d3
0x19a932fc5a8320939c3575302a8705147a7f27d8,0x4024071fe3fad805f922a9098630d09a2ec0f82c
0x19a932fc5a8320939c3575302a8705147a7f27d8,0xb0c9f95c1f0e686249ae0461e5e7657545379017
0xe7ab0dd2a069fa115c0d7878af6fd95ba0f9100a,0x33c1b799978d3f7830a24c6eddd169caa4b92b61
0xd4c1315948125cd20c11c5e9565a3632c1710055,0xfc48855a426c59d3cc9efd95ec3de1fcf6b2790e
0x8967a7ce20043f876e42f8ad696b06bb632f0ca7,0x14b1bc91cb99aad649b36341d5abeb50df775a3e
0x8967a7ce20043f876e42f8ad696b06bb632f0ca7,0xeb10024c7761e78cbbe78773ac6f6e98f3ed8314
0x895f07957b863f4ab6086035a6990d8366bc3266,0x08c71ca483e6c454a35d2ed56073a0297f0a2ec3
0x55fe002aeff02f77364de339a1292923a15844b8,0x14b1bc91cb99aad649b36341d5abeb50df775a3e
0x3005a4c0efe7e66f3f60ef8704983247a5c6ca61,0x08c71ca483e6c454a35d2ed56073a0297f0a2ec3
0x3005a4c0efe7e66f3f60ef8704983247a5c6ca61,0x7b3d54052df209679fce721516cc1b566ef1c6ab
0x24bdd8771b08c2ea6fe0e898126e65bd49021be3,0x39a372b4cc3fc91ba93238c9121cb4f98d057fb5
0x24bdd8771b08c2ea6fe0e898126e65bd49021be3,0x38d51f44b586b154159932f3681a30c54a6d25a9
```